Merge version_2_1781378968591 into main #1

Merged
bender merged 1 commits from version_2_1781378968591 into main 2026-06-13 19:31:16 +00:00
8 changed files with 311 additions and 180 deletions

View File

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

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

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

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

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="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>
);
}

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

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

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