Merge version_2_1781708580751 into main #1

Merged
bender merged 1 commits from version_2_1781708580751 into main 2026-06-17 15:05:17 +00:00
9 changed files with 413 additions and 262 deletions

View File

@@ -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 />
</>
);
}

View 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>
);
}

View File

@@ -0,0 +1,27 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "contact" section.
import React from 'react';
import ContactCta from '@/components/sections/contact/ContactCta';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ContactSection(): React.JSX.Element {
return (
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="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>
);
}

View 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>
);
}

View 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>
);
}

View 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>
);
}

View 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>
);
}

View File

@@ -0,0 +1,64 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "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>
);
}

View File

@@ -0,0 +1,52 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "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>
);
}