Merge version_2_1781571052445 into main #1
@@ -5,15 +5,15 @@
|
||||
|
||||
:root {
|
||||
/* @colorThemes/lightTheme/grayNavyBlue */
|
||||
--background: #f8f5f0;
|
||||
--background: #ffffff;
|
||||
--card: #ffffff;
|
||||
--foreground: #2b180a;
|
||||
--primary-cta: #1e5631;
|
||||
--foreground: #333333;
|
||||
--primary-cta: #003366;
|
||||
--primary-cta-text: #ffffff;
|
||||
--secondary-cta: #d4af37;
|
||||
--secondary-cta-text: #2b180a;
|
||||
--accent: #f8f5f0;
|
||||
--background-accent: #f8f5f0;
|
||||
--secondary-cta: #009966;
|
||||
--secondary-cta-text: #ffffff;
|
||||
--accent: #ff7a00;
|
||||
--background-accent: #f8f9fa;
|
||||
|
||||
/* @layout/border-radius/rounded */
|
||||
--radius: 1rem;
|
||||
|
||||
@@ -1,303 +1,39 @@
|
||||
import AboutMediaOverlay from '@/components/sections/about/AboutMediaOverlay';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
|
||||
import FeaturesArrowCards from '@/components/sections/features/FeaturesArrowCards';
|
||||
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import HeroBillboardBrand from '@/components/sections/hero/HeroBillboardBrand';
|
||||
import MetricsIconCards from '@/components/sections/metrics/MetricsIconCards';
|
||||
import PricingCenteredCards from '@/components/sections/pricing/PricingCenteredCards';
|
||||
import TestimonialColumnMarqueeCards from '@/components/sections/testimonial/TestimonialColumnMarqueeCards';
|
||||
import { Clock, DollarSign, Star, Users } 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 WhyUsSection from './HomePage/sections/WhyUs';
|
||||
import ServicesSection from './HomePage/sections/Services';
|
||||
import MenuSection from './HomePage/sections/Menu';
|
||||
import PackagesSection from './HomePage/sections/Packages';
|
||||
import GallerySection from './HomePage/sections/Gallery';
|
||||
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">
|
||||
<HeroBillboardBrand
|
||||
brand="Izan Catering"
|
||||
description="Professional catering services in Batang Kali and surrounding areas. From weddings to corporate events, we deliver memorable dining experiences."
|
||||
primaryButton={{
|
||||
text: "Get Free Quotation",
|
||||
href: "#contact",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "WhatsApp Us",
|
||||
href: "https://wa.me/60123456789",
|
||||
}}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/dining-lunch-plate-white-meal_1203-4407.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<>
|
||||
<HeroSection />
|
||||
|
||||
<div id="why-us" data-section="why-us">
|
||||
<SectionErrorBoundary name="why-us">
|
||||
<MetricsIconCards
|
||||
tag="Why Us"
|
||||
title="Why Choose Izan Catering"
|
||||
description="We are dedicated to providing premium catering services for every event."
|
||||
metrics={[
|
||||
{
|
||||
icon: Star,
|
||||
title: "Quality Ingredients",
|
||||
value: "Fresh",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
title: "On-Time Service",
|
||||
value: "Punctual",
|
||||
},
|
||||
{
|
||||
icon: Users,
|
||||
title: "Experienced Team",
|
||||
value: "Pro",
|
||||
},
|
||||
{
|
||||
icon: DollarSign,
|
||||
title: "Affordable",
|
||||
value: "Value",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<WhyUsSection />
|
||||
|
||||
<div id="services" data-section="services">
|
||||
<SectionErrorBoundary name="services">
|
||||
<AboutMediaOverlay
|
||||
tag="Services"
|
||||
title="Professional Catering Solutions"
|
||||
description="Whether it's a corporate event, wedding, or private function, our expert team is ready to serve excellence."
|
||||
imageSrc="http://img.b2bpic.net/free-photo/male-chef-kitchen-cooking_23-2148934666.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ServicesSection />
|
||||
|
||||
<div id="menu" data-section="menu">
|
||||
<SectionErrorBoundary name="menu">
|
||||
<FeaturesImageBento
|
||||
tag="Menu"
|
||||
title="Featured Culinary Selections"
|
||||
description="Taste the finest of Malaysian cuisine, crafted with passion."
|
||||
items={[
|
||||
{
|
||||
title: "Nasi Minyak",
|
||||
description: "Fragrant steamed rice infused with ghee and spices.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-eggplant-rolls-with-walnuts_141793-3993.jpg",
|
||||
},
|
||||
{
|
||||
title: "Tradisional Kuih",
|
||||
description: "Authentic, handcrafted bite-sized delights.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/dessert-catering_1203-3075.jpg",
|
||||
},
|
||||
{
|
||||
title: "Finger Food",
|
||||
description: "Savory starters perfect for any event.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/high-angle-delicious-food-table_23-2149617137.jpg",
|
||||
},
|
||||
{
|
||||
title: "Fruit Platters",
|
||||
description: "Fresh and vibrant seasonal selection.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/assortment-fruits-presented-table_23-2148245046.jpg",
|
||||
},
|
||||
{
|
||||
title: "Ayam Masak Merah",
|
||||
description: "Tender chicken in a rich, spicy tomato sauce.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/seafood-platter-with-fried-shrimps-smoked-salmon-other-fish-slices_140725-2574.jpg",
|
||||
},
|
||||
{
|
||||
title: "Teh Tarik",
|
||||
description: "Perfectly frothed local favorite tea.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/close-up-bowls-with-sweet-sauces-honey-jam-chocolate-paste-condensed-milk-white-plate_176474-2428.jpg",
|
||||
},
|
||||
{
|
||||
title: "Beef Rendang",
|
||||
description: "Slow-cooked, melt-in-the-mouth perfection.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/spicy-fresh-oyster-salad-thai-food-ingredients_1150-24362.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<MenuSection />
|
||||
|
||||
<div id="packages" data-section="packages">
|
||||
<SectionErrorBoundary name="packages">
|
||||
<PricingCenteredCards
|
||||
tag="Packages"
|
||||
title="Catering Packages"
|
||||
description="Flexible plans for every event size."
|
||||
plans={[
|
||||
{
|
||||
tag: "Small",
|
||||
price: "RM 30-50 Pax",
|
||||
description: "Ideal for small family gatherings.",
|
||||
features: [
|
||||
"3 Course Buffet",
|
||||
"Basic Setup",
|
||||
"Standard Service",
|
||||
],
|
||||
primaryButton: {
|
||||
text: "Book Now",
|
||||
href: "#contact",
|
||||
},
|
||||
},
|
||||
{
|
||||
tag: "Medium",
|
||||
price: "RM 50-200 Pax",
|
||||
description: "Ideal for corporate functions.",
|
||||
features: [
|
||||
"Buffet Service",
|
||||
"Premium Setup",
|
||||
"Professional Staff",
|
||||
"Menu Customization",
|
||||
],
|
||||
primaryButton: {
|
||||
text: "Book Now",
|
||||
href: "#contact",
|
||||
},
|
||||
},
|
||||
{
|
||||
tag: "Large",
|
||||
price: "RM 200+ Pax",
|
||||
description: "Perfect for weddings & large events.",
|
||||
features: [
|
||||
"Full Service Buffet",
|
||||
"Luxury Setup",
|
||||
"Event Management",
|
||||
"Full Staff",
|
||||
"Special Menu",
|
||||
],
|
||||
primaryButton: {
|
||||
text: "Book Now",
|
||||
href: "#contact",
|
||||
},
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<PackagesSection />
|
||||
|
||||
<div id="gallery" data-section="gallery">
|
||||
<SectionErrorBoundary name="gallery">
|
||||
<FeaturesArrowCards
|
||||
tag="Gallery"
|
||||
title="Event Portfolio"
|
||||
description="A glimpse of the memorable experiences we create."
|
||||
items={[
|
||||
{
|
||||
title: "Wedding Banquet",
|
||||
tags: [
|
||||
"Wedding",
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/chicken-noodles-table-with-sushi-rolls_140725-3881.jpg",
|
||||
},
|
||||
{
|
||||
title: "Corporate Setup",
|
||||
tags: [
|
||||
"Corporate",
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/overhead-view-rice-grains-polenta-puffed-rice-cake-vegetables-wooden-table_23-2148062366.jpg",
|
||||
},
|
||||
{
|
||||
title: "Buffet Presentation",
|
||||
tags: [
|
||||
"Buffet",
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/dark-board-full-sweet-fresh-round-cookies_114579-73532.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<GallerySection />
|
||||
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialColumnMarqueeCards
|
||||
tag="Testimonials"
|
||||
title="Trusted by Many"
|
||||
description="Here is what our clients say about us."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Sarah",
|
||||
role: "Bride",
|
||||
quote: "The food was delicious and the service was excellent.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/loving-wedding-couple_23-2148106066.jpg",
|
||||
},
|
||||
{
|
||||
name: "Adam",
|
||||
role: "HR Manager",
|
||||
quote: "Highly recommended for weddings and corporate events.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/closeup-businessman-serving-food-office-party_637285-12733.jpg",
|
||||
},
|
||||
{
|
||||
name: "Maya",
|
||||
role: "Homeowner",
|
||||
quote: "Professional team and great value for money.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/people-sitting-festive-table_23-2147973646.jpg",
|
||||
},
|
||||
{
|
||||
name: "Zulkifli",
|
||||
role: "Community Leader",
|
||||
quote: "Very reliable for public functions.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-table-full-sweet-delicious-desserts-cupcakes-donuts-panna-cotta-desserts-candy-pops-tiramisu_8353-11505.jpg",
|
||||
},
|
||||
{
|
||||
name: "Elena",
|
||||
role: "Planner",
|
||||
quote: "Always professional, clean, and delicious.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-one-black-american-female-eats-gourmet-vegetarian-meal-drinks-wine-restaurant_613910-7365.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<TestimonialsSection />
|
||||
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqSplitMedia
|
||||
tag="FAQ"
|
||||
title="Common Questions"
|
||||
description="Learn more about our services."
|
||||
items={[
|
||||
{
|
||||
question: "How early should I book?",
|
||||
answer: "We recommend booking at least 2–4 weeks in advance.",
|
||||
},
|
||||
{
|
||||
question: "Do you provide buffet setup?",
|
||||
answer: "Yes, complete buffet setup is available.",
|
||||
},
|
||||
{
|
||||
question: "Can menus be customized?",
|
||||
answer: "Yes, menus can be tailored according to event requirements.",
|
||||
},
|
||||
{
|
||||
question: "Do you cater for corporate events?",
|
||||
answer: "Yes, we regularly cater for corporate and government functions.",
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/big-plate-with-variety-meat_8353-9865.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FaqSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Contact"
|
||||
text="Ready to plan your event? Request a free quotation now."
|
||||
primaryButton={{
|
||||
text: "Request Free Quotation",
|
||||
href: "#",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "WhatsApp Us",
|
||||
href: "https://wa.me/60123456789",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ContactSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
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="Contact"
|
||||
text="Ready to plan your event? Request a free quotation now."
|
||||
primaryButton={{
|
||||
text: "Request Free Quotation",
|
||||
href: "#",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "WhatsApp Us",
|
||||
href: "https://wa.me/60123456789",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
39
src/pages/HomePage/sections/Faq.tsx
Normal file
39
src/pages/HomePage/sections/Faq.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 "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="FAQ"
|
||||
title="Common Questions"
|
||||
description="Learn more about our services."
|
||||
items={[
|
||||
{
|
||||
question: "How early should I book?",
|
||||
answer: "We recommend booking at least 2–4 weeks in advance.",
|
||||
},
|
||||
{
|
||||
question: "Do you provide buffet setup?",
|
||||
answer: "Yes, complete buffet setup is available.",
|
||||
},
|
||||
{
|
||||
question: "Can menus be customized?",
|
||||
answer: "Yes, menus can be tailored according to event requirements.",
|
||||
},
|
||||
{
|
||||
question: "Do you cater for corporate events?",
|
||||
answer: "Yes, we regularly cater for corporate and government functions.",
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/big-plate-with-variety-meat_8353-9865.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
43
src/pages/HomePage/sections/Gallery.tsx
Normal file
43
src/pages/HomePage/sections/Gallery.tsx
Normal file
@@ -0,0 +1,43 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "gallery" section.
|
||||
|
||||
import React from 'react';
|
||||
import FeaturesArrowCards from '@/components/sections/features/FeaturesArrowCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function GallerySection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="gallery" data-section="gallery">
|
||||
<SectionErrorBoundary name="gallery">
|
||||
<FeaturesArrowCards
|
||||
tag="Gallery"
|
||||
title="Event Portfolio"
|
||||
description="A glimpse of the memorable experiences we create."
|
||||
items={[
|
||||
{
|
||||
title: "Wedding Banquet",
|
||||
tags: [
|
||||
"Wedding",
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/chicken-noodles-table-with-sushi-rolls_140725-3881.jpg",
|
||||
},
|
||||
{
|
||||
title: "Corporate Setup",
|
||||
tags: [
|
||||
"Corporate",
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/overhead-view-rice-grains-polenta-puffed-rice-cake-vegetables-wooden-table_23-2148062366.jpg",
|
||||
},
|
||||
{
|
||||
title: "Buffet Presentation",
|
||||
tags: [
|
||||
"Buffet",
|
||||
],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/dark-board-full-sweet-fresh-round-cookies_114579-73532.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
80
src/pages/HomePage/sections/Hero.tsx
Normal file
80
src/pages/HomePage/sections/Hero.tsx
Normal file
@@ -0,0 +1,80 @@
|
||||
/* 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 AutoFillText from "@/components/ui/AutoFillText";
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
|
||||
const primaryButton = {
|
||||
text: "Book Free Consultation",
|
||||
href: "#contact"
|
||||
};
|
||||
const secondaryButton = {
|
||||
href: "#contact",
|
||||
text: "Request Proposal"
|
||||
};
|
||||
|
||||
type HeroBillboardBrandProps = {
|
||||
brand: string;
|
||||
description: string;
|
||||
primaryButton: { text: string; href: string };
|
||||
secondaryButton: { text: string; href: 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-10 md:gap-12 w-content-width mx-auto">
|
||||
<div className="flex flex-col items-end gap-5">
|
||||
<AutoFillText className="w-full font-semibold text-primary-cta" paddingY="">{"Building Safer, Smarter & More Compliant Businesses"}</AutoFillText>
|
||||
|
||||
<TextAnimation
|
||||
text={"Professional consulting, auditing, training, and management system solutions to help organizations achieve safety excellence, regulatory compliance, and sustainable business growth."}
|
||||
variant="slide-up"
|
||||
gradientText={false}
|
||||
tag="p"
|
||||
className="w-full md:w-1/2 text-lg md:text-2xl leading-snug text-balance text-right text-foreground"
|
||||
/>
|
||||
|
||||
<div className="flex flex-wrap justify-end gap-3 mt-1 md:mt-2">
|
||||
<Button text={primaryButton.text} href={primaryButton.href} variant="primary" style={{ background: 'var(--accent)' }} className="text-white border-none" />
|
||||
<Button text={secondaryButton.text} href={secondaryButton.href} variant="secondary" animationDelay={0.1} style={{ background: 'var(--secondary-cta)' }} className="text-white border-none" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ScrollReveal variant="slide-up" 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-1581091226825-a6a2a5aee158?auto=format&fit=crop&q=80&w=2000"} className="aspect-4/5 md:aspect-video" />
|
||||
</ScrollReveal>
|
||||
|
||||
<ScrollReveal variant="slide-up" delay={0.4} className="grid grid-cols-2 md:grid-cols-4 gap-6 pt-8 border-t border-border">
|
||||
{[
|
||||
"Experienced Consultants",
|
||||
"Industry-Focused Solutions",
|
||||
"Compliance-Oriented Approach",
|
||||
"Practical Business Results"
|
||||
].map((item, idx) => (
|
||||
<div key={idx} className="flex items-start gap-2">
|
||||
<div className="mt-1 text-secondary-cta">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3" strokeLinecap="round" strokeLinejoin="round">
|
||||
<polyline points="20 6 9 17 4 12"></polyline>
|
||||
</svg>
|
||||
</div>
|
||||
<span className="text-sm font-medium text-foreground">{item}</span>
|
||||
</div>
|
||||
))}
|
||||
</ScrollReveal>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default function HeroSection() {
|
||||
return (
|
||||
<div data-webild-section="hero" id="hero">
|
||||
<HeroInline />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
57
src/pages/HomePage/sections/Menu.tsx
Normal file
57
src/pages/HomePage/sections/Menu.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 "menu" section.
|
||||
|
||||
import React from 'react';
|
||||
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function MenuSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="menu" data-section="menu">
|
||||
<SectionErrorBoundary name="menu">
|
||||
<FeaturesImageBento
|
||||
tag="Menu"
|
||||
title="Featured Culinary Selections"
|
||||
description="Taste the finest of Malaysian cuisine, crafted with passion."
|
||||
items={[
|
||||
{
|
||||
title: "Nasi Minyak",
|
||||
description: "Fragrant steamed rice infused with ghee and spices.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-eggplant-rolls-with-walnuts_141793-3993.jpg",
|
||||
},
|
||||
{
|
||||
title: "Tradisional Kuih",
|
||||
description: "Authentic, handcrafted bite-sized delights.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/dessert-catering_1203-3075.jpg",
|
||||
},
|
||||
{
|
||||
title: "Finger Food",
|
||||
description: "Savory starters perfect for any event.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/high-angle-delicious-food-table_23-2149617137.jpg",
|
||||
},
|
||||
{
|
||||
title: "Fruit Platters",
|
||||
description: "Fresh and vibrant seasonal selection.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/assortment-fruits-presented-table_23-2148245046.jpg",
|
||||
},
|
||||
{
|
||||
title: "Ayam Masak Merah",
|
||||
description: "Tender chicken in a rich, spicy tomato sauce.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/seafood-platter-with-fried-shrimps-smoked-salmon-other-fish-slices_140725-2574.jpg",
|
||||
},
|
||||
{
|
||||
title: "Teh Tarik",
|
||||
description: "Perfectly frothed local favorite tea.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/close-up-bowls-with-sweet-sauces-honey-jam-chocolate-paste-condensed-milk-white-plate_176474-2428.jpg",
|
||||
},
|
||||
{
|
||||
title: "Beef Rendang",
|
||||
description: "Slow-cooked, melt-in-the-mouth perfection.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/spicy-fresh-oyster-salad-thai-food-ingredients_1150-24362.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
67
src/pages/HomePage/sections/Packages.tsx
Normal file
67
src/pages/HomePage/sections/Packages.tsx
Normal file
@@ -0,0 +1,67 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "packages" section.
|
||||
|
||||
import React from 'react';
|
||||
import PricingCenteredCards from '@/components/sections/pricing/PricingCenteredCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function PackagesSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="packages" data-section="packages">
|
||||
<SectionErrorBoundary name="packages">
|
||||
<PricingCenteredCards
|
||||
tag="Packages"
|
||||
title="Catering Packages"
|
||||
description="Flexible plans for every event size."
|
||||
plans={[
|
||||
{
|
||||
tag: "Small",
|
||||
price: "RM 30-50 Pax",
|
||||
description: "Ideal for small family gatherings.",
|
||||
features: [
|
||||
"3 Course Buffet",
|
||||
"Basic Setup",
|
||||
"Standard Service",
|
||||
],
|
||||
primaryButton: {
|
||||
text: "Book Now",
|
||||
href: "#contact",
|
||||
},
|
||||
},
|
||||
{
|
||||
tag: "Medium",
|
||||
price: "RM 50-200 Pax",
|
||||
description: "Ideal for corporate functions.",
|
||||
features: [
|
||||
"Buffet Service",
|
||||
"Premium Setup",
|
||||
"Professional Staff",
|
||||
"Menu Customization",
|
||||
],
|
||||
primaryButton: {
|
||||
text: "Book Now",
|
||||
href: "#contact",
|
||||
},
|
||||
},
|
||||
{
|
||||
tag: "Large",
|
||||
price: "RM 200+ Pax",
|
||||
description: "Perfect for weddings & large events.",
|
||||
features: [
|
||||
"Full Service Buffet",
|
||||
"Luxury Setup",
|
||||
"Event Management",
|
||||
"Full Staff",
|
||||
"Special Menu",
|
||||
],
|
||||
primaryButton: {
|
||||
text: "Book Now",
|
||||
href: "#contact",
|
||||
},
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
21
src/pages/HomePage/sections/Services.tsx
Normal file
21
src/pages/HomePage/sections/Services.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 "services" section.
|
||||
|
||||
import React from 'react';
|
||||
import AboutMediaOverlay from '@/components/sections/about/AboutMediaOverlay';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function ServicesSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="services" data-section="services">
|
||||
<SectionErrorBoundary name="services">
|
||||
<AboutMediaOverlay
|
||||
tag="Services"
|
||||
title="Professional Catering Solutions"
|
||||
description="Whether it's a corporate event, wedding, or private function, our expert team is ready to serve excellence."
|
||||
imageSrc="http://img.b2bpic.net/free-photo/male-chef-kitchen-cooking_23-2148934666.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="Trusted by Many"
|
||||
description="Here is what our clients say about us."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Sarah",
|
||||
role: "Bride",
|
||||
quote: "The food was delicious and the service was excellent.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/loving-wedding-couple_23-2148106066.jpg",
|
||||
},
|
||||
{
|
||||
name: "Adam",
|
||||
role: "HR Manager",
|
||||
quote: "Highly recommended for weddings and corporate events.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/closeup-businessman-serving-food-office-party_637285-12733.jpg",
|
||||
},
|
||||
{
|
||||
name: "Maya",
|
||||
role: "Homeowner",
|
||||
quote: "Professional team and great value for money.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/people-sitting-festive-table_23-2147973646.jpg",
|
||||
},
|
||||
{
|
||||
name: "Zulkifli",
|
||||
role: "Community Leader",
|
||||
quote: "Very reliable for public functions.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-table-full-sweet-delicious-desserts-cupcakes-donuts-panna-cotta-desserts-candy-pops-tiramisu_8353-11505.jpg",
|
||||
},
|
||||
{
|
||||
name: "Elena",
|
||||
role: "Planner",
|
||||
quote: "Always professional, clean, and delicious.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-one-black-american-female-eats-gourmet-vegetarian-meal-drinks-wine-restaurant_613910-7365.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
43
src/pages/HomePage/sections/WhyUs.tsx
Normal file
43
src/pages/HomePage/sections/WhyUs.tsx
Normal file
@@ -0,0 +1,43 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "why-us" section.
|
||||
|
||||
import React from 'react';
|
||||
import MetricsIconCards from '@/components/sections/metrics/MetricsIconCards';
|
||||
import { Clock, DollarSign, Star, Users } from "lucide-react";
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function WhyUsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="why-us" data-section="why-us">
|
||||
<SectionErrorBoundary name="why-us">
|
||||
<MetricsIconCards
|
||||
tag="Why Us"
|
||||
title="Why Choose Izan Catering"
|
||||
description="We are dedicated to providing premium catering services for every event."
|
||||
metrics={[
|
||||
{
|
||||
icon: Star,
|
||||
title: "Quality Ingredients",
|
||||
value: "Fresh",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
title: "On-Time Service",
|
||||
value: "Punctual",
|
||||
},
|
||||
{
|
||||
icon: Users,
|
||||
title: "Experienced Team",
|
||||
value: "Pro",
|
||||
},
|
||||
{
|
||||
icon: DollarSign,
|
||||
title: "Affordable",
|
||||
value: "Value",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user