Merge version_2_1781708580751 into main #1
@@ -1,274 +1,36 @@
|
||||
import AboutFeaturesSplit from '@/components/sections/about/AboutFeaturesSplit';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
|
||||
import FeaturesDetailedCards from '@/components/sections/features/FeaturesDetailedCards';
|
||||
import FeaturesRevealCardsBento from '@/components/sections/features/FeaturesRevealCardsBento';
|
||||
import HeroBillboard from '@/components/sections/hero/HeroBillboard';
|
||||
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
|
||||
import TestimonialColumnMarqueeCards from '@/components/sections/testimonial/TestimonialColumnMarqueeCards';
|
||||
import { Coffee, MapPin, Utensils } 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 ProductsSection from './HomePage/sections/Products';
|
||||
import FeaturesSection from './HomePage/sections/Features';
|
||||
import MetricsSection from './HomePage/sections/Metrics';
|
||||
import TestimonialsSection from './HomePage/sections/Testimonials';
|
||||
import FaqSection from './HomePage/sections/Faq';
|
||||
import ContactSection from './HomePage/sections/Contact';
|
||||
|
||||
export default function HomePage(): React.JSX.Element {
|
||||
return (
|
||||
<>
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroBillboard
|
||||
tag="Your Daily Ritual"
|
||||
title="Welcome to Kopi & Pantun"
|
||||
description="Experience artisanal coffee, delicious Western classics, and a warm atmosphere in Seksyen 13. Your perfect coffee moment awaits."
|
||||
primaryButton={{
|
||||
text: "View Full Menu",
|
||||
href: "#products",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Visit Us",
|
||||
href: "#contact",
|
||||
}}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/cup-tea-cookies_23-2148832331.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<>
|
||||
<HeroSection />
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutFeaturesSplit
|
||||
tag="Our Story"
|
||||
title="Crafted with Passion & Local Heart"
|
||||
description="Kopi & Pantun is more than just a cafe; it's a gathering place in the heart of Shah Alam. We believe in quality ingredients, artisanal brewing, and creating moments of joy for our community."
|
||||
items={[
|
||||
{
|
||||
icon: Coffee,
|
||||
title: "Premium Beans",
|
||||
description: "Expertly roasted beans for the perfect cup.",
|
||||
},
|
||||
{
|
||||
icon: Utensils,
|
||||
title: "Western Classics",
|
||||
description: "Comfort food made with love and fresh ingredients.",
|
||||
},
|
||||
{
|
||||
icon: MapPin,
|
||||
title: "Heart of Seksyen 13",
|
||||
description: "Conveniently located for students, professionals, and families.",
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/close-up-hand-pouring-coffee_23-2148865600.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<AboutSection />
|
||||
|
||||
<div id="products" data-section="products">
|
||||
<SectionErrorBoundary name="products">
|
||||
<FeaturesRevealCardsBento
|
||||
tag="Menu Highlights"
|
||||
title="Popular Favorites"
|
||||
description="Taste the best we have to offer, from specialty lattes to comforting mains."
|
||||
items={[
|
||||
{
|
||||
title: "Spanish Latte",
|
||||
description: "A sweet and creamy fan favorite blend.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/hot-coffee-cup-set-wooden-table_1150-10444.jpg",
|
||||
},
|
||||
{
|
||||
title: "Matcha Espresso",
|
||||
description: "Perfect balance of earthy matcha and bold espresso.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/matcha-latte-clear-cup-pink-table_23-2152002569.jpg",
|
||||
},
|
||||
{
|
||||
title: "Spaghetti Chicken",
|
||||
description: "Classic comfort with a perfectly fried chicken.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-cooked-pasta-tasty-with-chicken-slices-tomato-sauce-inside-black-plate-table_140725-13296.jpg",
|
||||
},
|
||||
{
|
||||
title: "Mushroom Soup",
|
||||
description: "Rich, creamy soup served with crusty bread.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/delicious-homemade-mushroom-cream-soup-top-view_114579-9671.jpg",
|
||||
},
|
||||
{
|
||||
title: "Iced Latte",
|
||||
description: "Smooth, refreshing classic cold coffee.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/iced-caramel-macchiato-with-coffee-beans-dark-background_84443-94736.jpg",
|
||||
},
|
||||
{
|
||||
title: "Dark Chocolate",
|
||||
description: "Rich, decadent iced dark chocolate perfection.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/iced-chocolate_1339-4412.jpg",
|
||||
},
|
||||
{
|
||||
title: "Alfredo Pasta",
|
||||
description: "Silky smooth creamy pasta classic.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-chocolate-milkshakes-with-textile_23-2148526478.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ProductsSection />
|
||||
|
||||
<div id="features" data-section="features">
|
||||
<SectionErrorBoundary name="features">
|
||||
<FeaturesDetailedCards
|
||||
tag="Cafe Experience"
|
||||
title="Why Choose Us"
|
||||
description="We offer an inviting space for you to study, catch up, or simply unwind."
|
||||
items={[
|
||||
{
|
||||
title: "Fast Reliable Wi-Fi",
|
||||
description: "Perfect for students and remote workers.",
|
||||
tags: [
|
||||
"Work",
|
||||
"Study",
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/person-cafe-enjoying-book_23-2150064701.jpg",
|
||||
},
|
||||
{
|
||||
title: "Cozy Seating",
|
||||
description: "Comfy chairs and a warm environment.",
|
||||
tags: [
|
||||
"Relax",
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/confident-young-indian-man-black-shirt-standing-cafe_627829-5462.jpg",
|
||||
},
|
||||
{
|
||||
title: "Community Vibe",
|
||||
description: "A place where the local community meets.",
|
||||
tags: [
|
||||
"Social",
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/mocca-coffee-shop_1339-4892.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FeaturesSection />
|
||||
|
||||
<div id="metrics" data-section="metrics">
|
||||
<SectionErrorBoundary name="metrics">
|
||||
<MetricsFeatureCards
|
||||
tag="By The Numbers"
|
||||
title="Trusted by Many"
|
||||
description="Our numbers reflect our dedication to quality."
|
||||
metrics={[
|
||||
{
|
||||
value: "206+",
|
||||
title: "Google Reviews",
|
||||
features: [
|
||||
"Consistently highly rated",
|
||||
"Real customer feedback",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "4.4★",
|
||||
title: "Customer Rating",
|
||||
features: [
|
||||
"Local favorite in Shah Alam",
|
||||
"Excellent service quality",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "1.5km",
|
||||
title: "Serving the Community",
|
||||
features: [
|
||||
"Close to Seksyen 13",
|
||||
"Easily accessible for everyone",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<MetricsSection />
|
||||
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialColumnMarqueeCards
|
||||
tag="What People Say"
|
||||
title="Our Happy Customers"
|
||||
description="Don't just take our word for it."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Sarah",
|
||||
role: "Regular Customer",
|
||||
quote: "The Spanish Latte here is simply unmatched. The best coffee spot in Seksyen 13!",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/nice-female-barista-making-raf-coffee-smiling-cheerfully-looking-happy_176420-7876.jpg",
|
||||
},
|
||||
{
|
||||
name: "Ahmad",
|
||||
role: "Student",
|
||||
quote: "Great atmosphere for studying and the pasta is always spot on. Love coming here.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/woman-with-man-drinking-coffee-together_329181-13983.jpg",
|
||||
},
|
||||
{
|
||||
name: "Nurul",
|
||||
role: "Coffee Enthusiast",
|
||||
quote: "Love the Matcha Espresso! It's so unique and refreshing. Highly recommended.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/good-day-only-with-good-coffee_329181-2927.jpg",
|
||||
},
|
||||
{
|
||||
name: "Daniel",
|
||||
role: "Local Professional",
|
||||
quote: "Cozy spot, fast wifi, and good food. Perfect for my remote working days.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/full-shot-woman-with-paper-wrapped-sandwich_23-2151311143.jpg",
|
||||
},
|
||||
{
|
||||
name: "Elena",
|
||||
role: "Foodie",
|
||||
quote: "Mushroom soup is incredibly rich. Can't wait to come back for more dishes.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-man-doing-big-stretch-with-satisfied-smile-finishing-his-project-sitting-cafe-with_1258-245321.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<TestimonialsSection />
|
||||
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqSplitMedia
|
||||
tag="Support"
|
||||
title="Frequently Asked Questions"
|
||||
description="Have questions? We have answers to help you plan your visit."
|
||||
items={[
|
||||
{
|
||||
question: "What are your opening hours?",
|
||||
answer: "We are open daily until 12:00 AM.",
|
||||
},
|
||||
{
|
||||
question: "Do you have parking available?",
|
||||
answer: "Yes, ample parking is available in the vicinity of our shop.",
|
||||
},
|
||||
{
|
||||
question: "Can I reserve a table?",
|
||||
answer: "We welcome walk-ins at all times, but for large groups, please give us a call.",
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/cropped-shot-female-barista-hands-holding-cup-coffee-giving-you-drink-serving-cafe-wearing-uni_1258-138296.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FaqSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Visit Us"
|
||||
text="Ready for your next coffee break? We're open until midnight today!"
|
||||
primaryButton={{
|
||||
text: "Call Us Now",
|
||||
href: "tel:0182479010",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Get Directions",
|
||||
href: "https://maps.google.com",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ContactSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
39
src/pages/HomePage/sections/About.tsx
Normal file
39
src/pages/HomePage/sections/About.tsx
Normal file
@@ -0,0 +1,39 @@
|
||||
// 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 AboutFeaturesSplit from '@/components/sections/about/AboutFeaturesSplit';
|
||||
import { Coffee, MapPin, Utensils } from "lucide-react";
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function AboutSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutFeaturesSplit
|
||||
tag="Our Story"
|
||||
title="Crafted with Passion & Local Heart"
|
||||
description="Kopi & Pantun is more than just a cafe; it's a gathering place in the heart of Shah Alam. We believe in quality ingredients, artisanal brewing, and creating moments of joy for our community."
|
||||
items={[
|
||||
{
|
||||
icon: Coffee,
|
||||
title: "Premium Beans",
|
||||
description: "Expertly roasted beans for the perfect cup.",
|
||||
},
|
||||
{
|
||||
icon: Utensils,
|
||||
title: "Western Classics",
|
||||
description: "Comfort food made with love and fresh ingredients.",
|
||||
},
|
||||
{
|
||||
icon: MapPin,
|
||||
title: "Heart of Seksyen 13",
|
||||
description: "Conveniently located for students, professionals, and families.",
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/close-up-hand-pouring-coffee_23-2148865600.jpg"
|
||||
/>
|
||||
</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="Visit Us"
|
||||
text="Ready for your next coffee break? We're open until midnight today!"
|
||||
primaryButton={{
|
||||
text: "Call Us Now",
|
||||
href: "tel:0182479010",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Get Directions",
|
||||
href: "https://maps.google.com",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
35
src/pages/HomePage/sections/Faq.tsx
Normal file
35
src/pages/HomePage/sections/Faq.tsx
Normal file
@@ -0,0 +1,35 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "faq" section.
|
||||
|
||||
import React from 'react';
|
||||
import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FaqSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqSplitMedia
|
||||
tag="Support"
|
||||
title="Frequently Asked Questions"
|
||||
description="Have questions? We have answers to help you plan your visit."
|
||||
items={[
|
||||
{
|
||||
question: "What are your opening hours?",
|
||||
answer: "We are open daily until 12:00 AM.",
|
||||
},
|
||||
{
|
||||
question: "Do you have parking available?",
|
||||
answer: "Yes, ample parking is available in the vicinity of our shop.",
|
||||
},
|
||||
{
|
||||
question: "Can I reserve a table?",
|
||||
answer: "We welcome walk-ins at all times, but for large groups, please give us a call.",
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/cropped-shot-female-barista-hands-holding-cup-coffee-giving-you-drink-serving-cafe-wearing-uni_1258-138296.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
47
src/pages/HomePage/sections/Features.tsx
Normal file
47
src/pages/HomePage/sections/Features.tsx
Normal file
@@ -0,0 +1,47 @@
|
||||
// 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 FeaturesDetailedCards from '@/components/sections/features/FeaturesDetailedCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FeaturesSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="features" data-section="features">
|
||||
<SectionErrorBoundary name="features">
|
||||
<FeaturesDetailedCards
|
||||
tag="Cafe Experience"
|
||||
title="Why Choose Us"
|
||||
description="We offer an inviting space for you to study, catch up, or simply unwind."
|
||||
items={[
|
||||
{
|
||||
title: "Fast Reliable Wi-Fi",
|
||||
description: "Perfect for students and remote workers.",
|
||||
tags: [
|
||||
"Work",
|
||||
"Study",
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/person-cafe-enjoying-book_23-2150064701.jpg",
|
||||
},
|
||||
{
|
||||
title: "Cozy Seating",
|
||||
description: "Comfy chairs and a warm environment.",
|
||||
tags: [
|
||||
"Relax",
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/confident-young-indian-man-black-shirt-standing-cafe_627829-5462.jpg",
|
||||
},
|
||||
{
|
||||
title: "Community Vibe",
|
||||
description: "A place where the local community meets.",
|
||||
tags: [
|
||||
"Social",
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/mocca-coffee-shop_1339-4892.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
79
src/pages/HomePage/sections/Hero.tsx
Normal file
79
src/pages/HomePage/sections/Hero.tsx
Normal file
@@ -0,0 +1,79 @@
|
||||
/* eslint-disable */
|
||||
// @ts-nocheck — generated by catalog-eject; runtime-correct but TS strict-mode false-positives on inlined catalog body
|
||||
import Button from "@/components/ui/Button";
|
||||
import HeroBackgroundSlot from "@/components/ui/HeroBackgroundSlot";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import ImageOrVideo from "@/components/ui/ImageOrVideo";
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
import AvatarGroup from "@/components/ui/AvatarGroup";
|
||||
|
||||
const primaryButton = {
|
||||
text: "View Full Menu",
|
||||
href: "#products"
|
||||
};
|
||||
const secondaryButton = {
|
||||
text: "Visit Us",
|
||||
href: "#contact"
|
||||
};
|
||||
|
||||
type HeroBillboardProps = {
|
||||
tag?: string;
|
||||
title: string;
|
||||
description: string;
|
||||
primaryButton: { text: string; href: string };
|
||||
secondaryButton: { text: string; href: string };
|
||||
avatarsSrc?: string[];
|
||||
avatarsLabel?: string;
|
||||
} & ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never });
|
||||
|
||||
const HeroInline = () => {
|
||||
return (
|
||||
<section aria-label="Hero section" className="relative pt-25 pb-20 md:pt-30">
|
||||
<HeroBackgroundSlot />
|
||||
<div className="flex flex-col gap-12 md:gap-15 w-content-width mx-auto">
|
||||
<div className="flex flex-col items-center gap-3 text-center">
|
||||
{undefined && undefined.length > 0 ? (
|
||||
<AvatarGroup className="mb-1" />
|
||||
) : "4.4 ★ (206 Reviews)" ? (
|
||||
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
|
||||
<p>{"4.4 ★ (206 Reviews)"}</p>
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
<TextAnimation
|
||||
text={"Your Cozy Coffee Escape in Seksyen 13"}
|
||||
variant="slide-up"
|
||||
gradientText={true}
|
||||
tag="h1"
|
||||
className="md:max-w-8/10 text-7xl 2xl:text-8xl leading-[1.15] font-semibold text-center text-balance"
|
||||
/>
|
||||
|
||||
<TextAnimation
|
||||
text={"Step into Kopi & Pantun for artisanal coffee, comforting Western classics, and a warm atmosphere where every cup tells a story."}
|
||||
variant="slide-up"
|
||||
gradientText={false}
|
||||
tag="p"
|
||||
className="md:max-w-7/10 text-lg md:text-xl leading-snug text-balance"
|
||||
/>
|
||||
|
||||
<div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-3">
|
||||
<Button text={primaryButton.text} href={primaryButton.href} variant="primary"/>
|
||||
<Button text={secondaryButton.text} href={secondaryButton.href} variant="secondary" animationDelay={0.1} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ScrollReveal variant="fade" delay={0.2} className="w-full p-2 xl:p-3 2xl:p-4 card rounded overflow-hidden">
|
||||
<ImageOrVideo imageSrc={"https://images.unsplash.com/photo-1554118811-1e0d58224f24?q=80&w=2047&auto=format&fit=crop"} className="aspect-4/5 md:aspect-video object-cover" />
|
||||
</ScrollReveal>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default function HeroSection() {
|
||||
return (
|
||||
<div data-webild-section="hero" id="hero">
|
||||
<HeroInline />
|
||||
</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="By The Numbers"
|
||||
title="Trusted by Many"
|
||||
description="Our numbers reflect our dedication to quality."
|
||||
metrics={[
|
||||
{
|
||||
value: "206+",
|
||||
title: "Google Reviews",
|
||||
features: [
|
||||
"Consistently highly rated",
|
||||
"Real customer feedback",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "4.4★",
|
||||
title: "Customer Rating",
|
||||
features: [
|
||||
"Local favorite in Shah Alam",
|
||||
"Excellent service quality",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "1.5km",
|
||||
title: "Serving the Community",
|
||||
features: [
|
||||
"Close to Seksyen 13",
|
||||
"Easily accessible for everyone",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
64
src/pages/HomePage/sections/Products.tsx
Normal file
64
src/pages/HomePage/sections/Products.tsx
Normal file
@@ -0,0 +1,64 @@
|
||||
// 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 FeaturesRevealCardsBento from '@/components/sections/features/FeaturesRevealCardsBento';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function ProductsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="products" data-section="products">
|
||||
<SectionErrorBoundary name="products">
|
||||
<FeaturesRevealCardsBento
|
||||
tag="Menu Highlights"
|
||||
title="Popular Favorites"
|
||||
description="Taste the best we have to offer, from specialty lattes to comforting mains."
|
||||
items={[
|
||||
{
|
||||
title: "Spanish Latte",
|
||||
description: "A sweet and creamy fan favorite blend.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/hot-coffee-cup-set-wooden-table_1150-10444.jpg",
|
||||
},
|
||||
{
|
||||
title: "Matcha Espresso",
|
||||
description: "Perfect balance of earthy matcha and bold espresso.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/matcha-latte-clear-cup-pink-table_23-2152002569.jpg",
|
||||
},
|
||||
{
|
||||
title: "Spaghetti Chicken",
|
||||
description: "Classic comfort with a perfectly fried chicken.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-cooked-pasta-tasty-with-chicken-slices-tomato-sauce-inside-black-plate-table_140725-13296.jpg",
|
||||
},
|
||||
{
|
||||
title: "Mushroom Soup",
|
||||
description: "Rich, creamy soup served with crusty bread.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/delicious-homemade-mushroom-cream-soup-top-view_114579-9671.jpg",
|
||||
},
|
||||
{
|
||||
title: "Iced Latte",
|
||||
description: "Smooth, refreshing classic cold coffee.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/iced-caramel-macchiato-with-coffee-beans-dark-background_84443-94736.jpg",
|
||||
},
|
||||
{
|
||||
title: "Dark Chocolate",
|
||||
description: "Rich, decadent iced dark chocolate perfection.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/iced-chocolate_1339-4412.jpg",
|
||||
},
|
||||
{
|
||||
title: "Alfredo Pasta",
|
||||
description: "Silky smooth creamy pasta classic.",
|
||||
href: "#",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-chocolate-milkshakes-with-textile_23-2148526478.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="What People Say"
|
||||
title="Our Happy Customers"
|
||||
description="Don't just take our word for it."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Sarah",
|
||||
role: "Regular Customer",
|
||||
quote: "The Spanish Latte here is simply unmatched. The best coffee spot in Seksyen 13!",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/nice-female-barista-making-raf-coffee-smiling-cheerfully-looking-happy_176420-7876.jpg",
|
||||
},
|
||||
{
|
||||
name: "Ahmad",
|
||||
role: "Student",
|
||||
quote: "Great atmosphere for studying and the pasta is always spot on. Love coming here.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/woman-with-man-drinking-coffee-together_329181-13983.jpg",
|
||||
},
|
||||
{
|
||||
name: "Nurul",
|
||||
role: "Coffee Enthusiast",
|
||||
quote: "Love the Matcha Espresso! It's so unique and refreshing. Highly recommended.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/good-day-only-with-good-coffee_329181-2927.jpg",
|
||||
},
|
||||
{
|
||||
name: "Daniel",
|
||||
role: "Local Professional",
|
||||
quote: "Cozy spot, fast wifi, and good food. Perfect for my remote working days.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/full-shot-woman-with-paper-wrapped-sandwich_23-2151311143.jpg",
|
||||
},
|
||||
{
|
||||
name: "Elena",
|
||||
role: "Foodie",
|
||||
quote: "Mushroom soup is incredibly rich. Can't wait to come back for more dishes.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-man-doing-big-stretch-with-satisfied-smile-finishing-his-project-sitting-cafe-with_1258-245321.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user