Merge version_2_1781378968591 into main #1
@@ -1,191 +1,33 @@
|
||||
import AboutTextSplit from '@/components/sections/about/AboutTextSplit';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
|
||||
import FeaturesRevealCards from '@/components/sections/features/FeaturesRevealCards';
|
||||
import HeroTiltedCards from '@/components/sections/hero/HeroTiltedCards';
|
||||
import MetricsMediaCards from '@/components/sections/metrics/MetricsMediaCards';
|
||||
import TestimonialMarqueeCards from '@/components/sections/testimonial/TestimonialMarqueeCards';
|
||||
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 MenuSection from './HomePage/sections/Menu';
|
||||
import DeliverySection from './HomePage/sections/Delivery';
|
||||
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">
|
||||
<HeroTiltedCards
|
||||
tag="Traditional Flavor"
|
||||
title="Authentic Soto Malang, Fresh Daily at Tebet"
|
||||
description="Savor traditional Javanese flavors with 15 signature dishes. Open 9 AM–5 PM daily. Order now via QRIS, GrabFood, GoFood, or ShopeeFood."
|
||||
primaryButton={{
|
||||
text: "Order Now",
|
||||
href: "#contact",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "View Menu",
|
||||
href: "#menu",
|
||||
}}
|
||||
items={[
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/vegetable-soup-served-with-herbs_141793-1025.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/man-preparing-salad-with-fresh-vegetables-wooden-table-cooking-tasty-healthy-food-black-background-vegetarian-food-healthy-cooking-concept_639032-427.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/front-view-delicious-thanksgiving-meal_23-2148629542.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-people-hanging-out_23-2149436788.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-chicken-soup-with-potatoes-along-with-salt-pepper-seasonings-dark-blue-background-soup-meat-food-dinner-meal_140725-40004.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<>
|
||||
<HeroSection />
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutTextSplit
|
||||
title="Our Story"
|
||||
descriptions={[
|
||||
"Located conveniently at Tebet Eco Park, Soto Malang offers an authentic taste of East Java right in the heart of South Jakarta.",
|
||||
"Our kitchen is dedicated to serving 15 unique signature dishes using only fresh, locally sourced spices daily. From our savory soups to traditional accompaniments, every bowl reflects our heritage.",
|
||||
"Whether you're an office worker looking for a quick lunch or a visitor enjoying Tebet Eco Park, we provide the ultimate Javanese comfort food experience.",
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<AboutSection />
|
||||
|
||||
<div id="menu" data-section="menu">
|
||||
<SectionErrorBoundary name="menu">
|
||||
<FeaturesRevealCards
|
||||
tag="Our Menu"
|
||||
title="15 Signature Dishes"
|
||||
description="Explore our curated collection of Javanese favorites, handcrafted to satisfy your hunger."
|
||||
items={[
|
||||
{
|
||||
title: "Soto Ayam Malang",
|
||||
description: "Classic chicken soto with our secret spice blend.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/travelling-iran_8327-273.jpg",
|
||||
},
|
||||
{
|
||||
title: "Soto Daging Sapi",
|
||||
description: "Tender beef soto served in savory golden broth.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/traditional-mexican-food-world-tourism-day_23-2149114020.jpg",
|
||||
},
|
||||
{
|
||||
title: "Perkedel Kentang",
|
||||
description: "Perfectly crispy fried potato cakes.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/person-scanning-qr-code-cafeteria_23-2149321649.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<MenuSection />
|
||||
|
||||
<div id="delivery" data-section="delivery">
|
||||
<SectionErrorBoundary name="delivery">
|
||||
<MetricsMediaCards
|
||||
tag="Convenience"
|
||||
title="Order Your Way"
|
||||
description="Enjoy Soto Malang wherever you are with our seamless delivery and payment options."
|
||||
metrics={[
|
||||
{
|
||||
value: "QRIS",
|
||||
title: "Instant Payment",
|
||||
description: "Secure, fast, and cashless payment right at your table or for pickup.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/cheerful-couple-talking-while-eating-lunch-restaurant_637285-9017.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<DeliverySection />
|
||||
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialMarqueeCards
|
||||
tag="Voices"
|
||||
title="What Our Diners Say"
|
||||
description="Authentic taste that brings locals and tourists back for more."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Sarah",
|
||||
role: "Office Worker",
|
||||
quote: "The best lunch spot after a walk in Tebet Eco Park!",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/smiling-man-enjoying-croissant_1170-631.jpg",
|
||||
},
|
||||
{
|
||||
name: "Budi",
|
||||
role: "Local Resident",
|
||||
quote: "Consistency in flavor every single day.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/happy-multi-generation-family-toasting-while-having-lunch-together-dining-table_637285-5510.jpg",
|
||||
},
|
||||
{
|
||||
name: "Emily",
|
||||
role: "Tourist",
|
||||
quote: "A true taste of traditional Javanese food.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/smiling-senior-businessman-pointing-with-finger_1262-3108.jpg",
|
||||
},
|
||||
{
|
||||
name: "Andi",
|
||||
role: "Delivery User",
|
||||
quote: "So easy to order via GrabFood, always arrives hot.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-smiley-drag-queen-with-drink_23-2149556855.jpg",
|
||||
},
|
||||
{
|
||||
name: "Rina",
|
||||
role: "Foodie",
|
||||
quote: "Delicious broth and perfect spice balance.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-beautiful-young-woman-smiling_23-2148454153.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<TestimonialsSection />
|
||||
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqSplitMedia
|
||||
tag="Support"
|
||||
title="Frequently Asked Questions"
|
||||
description="Quick information about our operations and ordering process."
|
||||
items={[
|
||||
{
|
||||
question: "What are your operating hours?",
|
||||
answer: "We are open daily from 9 AM to 5 PM.",
|
||||
},
|
||||
{
|
||||
question: "Are you available on delivery apps?",
|
||||
answer: "Yes, we are on GrabFood, GoFood, and ShopeeFood.",
|
||||
},
|
||||
{
|
||||
question: "Do you accept QRIS?",
|
||||
answer: "Absolutely, we accept all QRIS payments for your convenience.",
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/wine-glass_1203-2992.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FaqSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Get Started"
|
||||
text="Ready for a warm bowl of Soto Malang?"
|
||||
primaryButton={{
|
||||
text: "Order via WhatsApp",
|
||||
href: "#",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "View Menu",
|
||||
href: "#menu",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ContactSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
23
src/pages/HomePage/sections/About.tsx
Normal file
23
src/pages/HomePage/sections/About.tsx
Normal file
@@ -0,0 +1,23 @@
|
||||
// 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 AboutTextSplit from '@/components/sections/about/AboutTextSplit';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function AboutSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutTextSplit
|
||||
title="Our Story"
|
||||
descriptions={[
|
||||
"Located conveniently at Tebet Eco Park, Soto Malang offers an authentic taste of East Java right in the heart of South Jakarta.",
|
||||
"Our kitchen is dedicated to serving 15 unique signature dishes using only fresh, locally sourced spices daily. From our savory soups to traditional accompaniments, every bowl reflects our heritage.",
|
||||
"Whether you're an office worker looking for a quick lunch or a visitor enjoying Tebet Eco Park, we provide the ultimate Javanese comfort food experience.",
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
69
src/pages/HomePage/sections/Contact.tsx
Normal file
69
src/pages/HomePage/sections/Contact.tsx
Normal file
@@ -0,0 +1,69 @@
|
||||
/* eslint-disable */
|
||||
// @ts-nocheck — generated by catalog-eject; runtime-correct but TS strict-mode false-positives on inlined catalog body
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import Button from "@/components/ui/Button";
|
||||
|
||||
const primaryButton = {
|
||||
text: "Order via WhatsApp",
|
||||
href: "#"
|
||||
};
|
||||
const secondaryButton = {
|
||||
text: "View Menu",
|
||||
href: "#menu"
|
||||
};
|
||||
|
||||
const ContactInline = () => {
|
||||
return (
|
||||
<section aria-label="Contact section" className="py-20">
|
||||
<div className="w-content-width mx-auto">
|
||||
<ScrollReveal variant="fade-blur">
|
||||
<div className="flex flex-col items-center gap-8 md:gap-10 py-20 px-8 rounded card">
|
||||
<div className="flex flex-col items-center gap-2">
|
||||
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
|
||||
<p>{"Get Started"}</p>
|
||||
</div>
|
||||
|
||||
<TextAnimation
|
||||
text={"Ready for a warm bowl of Soto Malang?"}
|
||||
variant="fade"
|
||||
gradientText={true}
|
||||
tag="h2"
|
||||
className="md:max-w-8/10 text-5xl 2xl:text-6xl leading-[1.15] font-semibold text-center 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>
|
||||
<div className="w-full max-w-3xl mt-8 rounded overflow-hidden border border-border">
|
||||
<iframe
|
||||
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3966.284770222045!2d106.84954731476916!3d-6.239366995483488!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x2e69f3b000000001%3A0x1234567890abcdef!2sTebet%20Eco%20Park!5e0!3m2!1sen!2sid!4v1620000000000!5m2!1sen!2sid"
|
||||
width="100%"
|
||||
height="300"
|
||||
style={{ border: 0 }}
|
||||
allowFullScreen={false}
|
||||
loading="lazy"
|
||||
referrerPolicy="no-referrer-when-downgrade"
|
||||
title="Tebet Eco Park Location"
|
||||
></iframe>
|
||||
<div className="p-4 bg-background text-center">
|
||||
<p className="font-medium">Tebet Eco Park, South Jakarta</p>
|
||||
<p className="text-sm text-muted-foreground mt-1">Open Daily: 9 AM - 5 PM</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default function ContactSection() {
|
||||
return (
|
||||
<div data-webild-section="contact" id="contact">
|
||||
<ContactInline />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
28
src/pages/HomePage/sections/Delivery.tsx
Normal file
28
src/pages/HomePage/sections/Delivery.tsx
Normal file
@@ -0,0 +1,28 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "delivery" section.
|
||||
|
||||
import React from 'react';
|
||||
import MetricsMediaCards from '@/components/sections/metrics/MetricsMediaCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function DeliverySection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="delivery" data-section="delivery">
|
||||
<SectionErrorBoundary name="delivery">
|
||||
<MetricsMediaCards
|
||||
tag="Convenience"
|
||||
title="Order Your Way"
|
||||
description="Enjoy Soto Malang wherever you are with our seamless delivery and payment options."
|
||||
metrics={[
|
||||
{
|
||||
value: "QRIS",
|
||||
title: "Instant Payment",
|
||||
description: "Secure, fast, and cashless payment right at your table or for pickup.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/cheerful-couple-talking-while-eating-lunch-restaurant_637285-9017.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</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="Quick information about our operations and ordering process."
|
||||
items={[
|
||||
{
|
||||
question: "What are your operating hours?",
|
||||
answer: "We are open daily from 9 AM to 5 PM.",
|
||||
},
|
||||
{
|
||||
question: "Are you available on delivery apps?",
|
||||
answer: "Yes, we are on GrabFood, GoFood, and ShopeeFood.",
|
||||
},
|
||||
{
|
||||
question: "Do you accept QRIS?",
|
||||
answer: "Absolutely, we accept all QRIS payments for your convenience.",
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/wine-glass_1203-2992.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
45
src/pages/HomePage/sections/Hero.tsx
Normal file
45
src/pages/HomePage/sections/Hero.tsx
Normal file
@@ -0,0 +1,45 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "hero" section.
|
||||
|
||||
import React from 'react';
|
||||
import HeroTiltedCards from '@/components/sections/hero/HeroTiltedCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function HeroSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroTiltedCards
|
||||
tag="Traditional Flavor"
|
||||
title="Authentic Soto Malang, Fresh Daily at Tebet"
|
||||
description="Savor traditional Javanese flavors with 15 signature dishes. Open 9 AM–5 PM daily. Order now via QRIS, GrabFood, GoFood, or ShopeeFood."
|
||||
primaryButton={{
|
||||
text: "Order Now",
|
||||
href: "#contact",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "View Menu",
|
||||
href: "#menu",
|
||||
}}
|
||||
items={[
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/vegetable-soup-served-with-herbs_141793-1025.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/man-preparing-salad-with-fresh-vegetables-wooden-table-cooking-tasty-healthy-food-black-background-vegetarian-food-healthy-cooking-concept_639032-427.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/front-view-delicious-thanksgiving-meal_23-2148629542.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-people-hanging-out_23-2149436788.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-chicken-soup-with-potatoes-along-with-salt-pepper-seasonings-dark-blue-background-soup-meat-food-dinner-meal_140725-40004.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
37
src/pages/HomePage/sections/Menu.tsx
Normal file
37
src/pages/HomePage/sections/Menu.tsx
Normal file
@@ -0,0 +1,37 @@
|
||||
// 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 FeaturesRevealCards from '@/components/sections/features/FeaturesRevealCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function MenuSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="menu" data-section="menu">
|
||||
<SectionErrorBoundary name="menu">
|
||||
<FeaturesRevealCards
|
||||
tag="Our Menu"
|
||||
title="15 Signature Dishes"
|
||||
description="Explore our curated collection of Javanese favorites, handcrafted to satisfy your hunger."
|
||||
items={[
|
||||
{
|
||||
title: "Soto Ayam Malang",
|
||||
description: "Classic chicken soto with our secret spice blend.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/travelling-iran_8327-273.jpg",
|
||||
},
|
||||
{
|
||||
title: "Soto Daging Sapi",
|
||||
description: "Tender beef soto served in savory golden broth.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/traditional-mexican-food-world-tourism-day_23-2149114020.jpg",
|
||||
},
|
||||
{
|
||||
title: "Perkedel Kentang",
|
||||
description: "Perfectly crispy fried potato cakes.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/person-scanning-qr-code-cafeteria_23-2149321649.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 TestimonialMarqueeCards from '@/components/sections/testimonial/TestimonialMarqueeCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function TestimonialsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialMarqueeCards
|
||||
tag="Voices"
|
||||
title="What Our Diners Say"
|
||||
description="Authentic taste that brings locals and tourists back for more."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Sarah",
|
||||
role: "Office Worker",
|
||||
quote: "The best lunch spot after a walk in Tebet Eco Park!",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/smiling-man-enjoying-croissant_1170-631.jpg",
|
||||
},
|
||||
{
|
||||
name: "Budi",
|
||||
role: "Local Resident",
|
||||
quote: "Consistency in flavor every single day.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/happy-multi-generation-family-toasting-while-having-lunch-together-dining-table_637285-5510.jpg",
|
||||
},
|
||||
{
|
||||
name: "Emily",
|
||||
role: "Tourist",
|
||||
quote: "A true taste of traditional Javanese food.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/smiling-senior-businessman-pointing-with-finger_1262-3108.jpg",
|
||||
},
|
||||
{
|
||||
name: "Andi",
|
||||
role: "Delivery User",
|
||||
quote: "So easy to order via GrabFood, always arrives hot.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-smiley-drag-queen-with-drink_23-2149556855.jpg",
|
||||
},
|
||||
{
|
||||
name: "Rina",
|
||||
role: "Foodie",
|
||||
quote: "Delicious broth and perfect spice balance.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-beautiful-young-woman-smiling_23-2148454153.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user