Merge version_2_1781526979721 into main #3
@@ -1,113 +1,30 @@
|
||||
import AboutFeaturesSplit from '@/components/sections/about/AboutFeaturesSplit';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FaqTwoColumn from '@/components/sections/faq/FaqTwoColumn';
|
||||
import FeaturesMediaCarousel from '@/components/sections/features/FeaturesMediaCarousel';
|
||||
import HeroBillboardCarousel from '@/components/sections/hero/HeroBillboardCarousel';
|
||||
import TestimonialColumnMarqueeCards from '@/components/sections/testimonial/TestimonialColumnMarqueeCards';
|
||||
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 ReviewsSection from './HomePage/sections/Reviews';
|
||||
import FaqSection from './HomePage/sections/Faq';
|
||||
import ContactSection from './HomePage/sections/Contact';
|
||||
|
||||
|
||||
import MenuSection from './HomePage/sections/Menu';export default function HomePage(): React.JSX.Element {
|
||||
return (
|
||||
<>
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroBillboardCarousel
|
||||
tag="Kolhapur's Soul in Every Bite"
|
||||
title="कोल्हापुरी वाडा मिसळ (Kolhapuri Wada Misal)"
|
||||
description="Authentic, fiery, and soulful misal straight from the heart of Rajarampuri. Experience the legendary heat and traditional warmth."
|
||||
primaryButton={{
|
||||
text: "See Menu", href: "#menu"}}
|
||||
secondaryButton={{
|
||||
text: "Visit Us", href: "#contact"}}
|
||||
items={[
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/side-view-multi-colored-meatballs-with-tomato-sauces-green-onions_140725-13961.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/georgian-khinkali-with-hot-chili-sauce_114579-2368.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/top-view-tasty-meat-patties-baked-pastries-grey-desk-patty-dough-pastry-bake-meal_140725-86249.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/fried-chicken-with-broccoli-table_140725-9657.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/delicious-indian-pav-bhaji-dish-with-bread-onions_23-2151996246.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/thai-noodles-style_74190-3896.jpg" },
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<>
|
||||
<HeroSection />
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutFeaturesSplit
|
||||
tag="Our Story"
|
||||
title="A Legacy of Masala & Love"
|
||||
description="Born in the lanes of Rajarampuri, Kolhapur, we take pride in our roots. Every bowl of our misal carries the legacy of traditional spices, slow-cooked to perfection to ensure the rassa hits just right."
|
||||
items={[
|
||||
{ icon: "Flame", title: "Authentically Fiery", description: "Kolhapur's signature heat in every bite." },
|
||||
{ icon: "Heart", title: "Homemade Style", description: "Prepared with love, just like grandmother made." },
|
||||
{ icon: "Leaf", title: "100% Vegetarian", description: "Pure, fresh, and wholesome vegetarian food." },
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/side-view-traditional-azerbaijani-dish-piti-pot-with-sumac-dried-herbs-onions-tray_141793-5179.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<AboutSection />
|
||||
<MenuSection />
|
||||
|
||||
<div id="menu" data-section="menu">
|
||||
<SectionErrorBoundary name="menu">
|
||||
<FeaturesMediaCarousel
|
||||
tag="Our Specialities"
|
||||
title="Signature Flavours"
|
||||
description="The best of Maharashtra's culinary traditions served fresh daily."
|
||||
items={[
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/high-angle-delicious-pakistan-meal-basket_23-2148821575.jpg", title: "Wada Misal Pav", description: "Our most popular signature dish. Fiery rassa, crispy farsan, and soft, buttery pav.", buttonIcon: "ArrowRight" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/glasses-refreshing-hibiscus-ice-tea_23-2149893654.jpg", title: "Solkadi", description: "Cool, refreshing kokum-based drink that balances every spicy bite.", buttonIcon: "ArrowRight" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/high-angle-indian-food-assortment_23-2148747704.jpg", title: "Misal Thali", description: "The ultimate loaded experience featuring all our signature sides and accompaniments.", buttonIcon: "ArrowRight" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/closeup-shot-indian-tasty-food-called-marwari-veg-thali-wooden-table_181624-58043.jpg", title: "Traditional Misal", description: "The classic breakfast choice of Kolhapur, perfected over decades.", buttonIcon: "ArrowRight" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/dragon-fruit-with-juice-tray-wooden-table-plaster-wall-high-angle-view_176474-9420.jpg", title: "Butter Pav", description: "Freshly baked, soft pav toasted with authentic local butter.", buttonIcon: "ArrowRight" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/assortment-indian-dishes-platter_23-2152002848.jpg", title: "Curd Sides", description: "Fresh homemade curd served with every thali to soothe the palate.", buttonIcon: "ArrowRight" },
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
|
||||
<div id="reviews" data-section="reviews">
|
||||
<SectionErrorBoundary name="reviews">
|
||||
<TestimonialColumnMarqueeCards
|
||||
tag="What Diners Say"
|
||||
title="Loved by Over 1,200 Foodies"
|
||||
description="With a rating of 4.4, we take pride in serving the most authentic misal in the city."
|
||||
testimonials={[
|
||||
{ name: "Rahul P.", role: "Food Blogger", quote: "The rassa is perfection. It wakes up your soul instantly!", imageSrc: "http://img.b2bpic.net/free-photo/smiling-waitress-talking-customers-using-touchpad-while-taking-orders-cafe_637285-3962.jpg" },
|
||||
{ name: "Sanjay D.", role: "Regular Customer", quote: "Best breakfast in Rajarampuri. I've been coming here for 5 years.", imageSrc: "http://img.b2bpic.net/free-photo/young-happy-woman-her-boyfriend-reading-text-message-mobile-phone-while-sitting-dining-table_637285-10328.jpg" },
|
||||
{ name: "Priya K.", role: "Foodie", quote: "The Misal Thali is loaded with flavours. Pure, homemade goodness.", imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-happy-colleagues-with-pizza_23-2149103772.jpg" },
|
||||
{ name: "Anil S.", role: "Local", quote: "Exactly the taste of Kolhapur I was looking for. Simply outstanding.", imageSrc: "http://img.b2bpic.net/free-photo/crazy-man-funny-expression_1194-3203.jpg" },
|
||||
{ name: "Meera B.", role: "Traveler", quote: "A must-visit spot in Kolhapur. The spice level is spot on.", imageSrc: "http://img.b2bpic.net/free-photo/portrait-attractive-young-woman-recording-cooking-tutorial-her-video-blog_662251-2386.jpg" },
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ReviewsSection />
|
||||
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqTwoColumn
|
||||
tag="FAQs"
|
||||
title="Good to Know"
|
||||
description="Everything you need to know about dining at Kolhapuri Wada Misal."
|
||||
items={[
|
||||
{ question: "What are your opening hours?", answer: "We are open from 8:30 AM every day except Mondays." },
|
||||
{ question: "Is your food spicy?", answer: "Yes, we are known for our authentic, fiery Kolhapuri spice level, but we can customize on request!" },
|
||||
{ question: "Do you offer takeaways?", answer: "Yes, we offer convenient takeaways for all our menu items." },
|
||||
{ question: "Are you fully vegetarian?", answer: "Absolutely! Everything we serve is 100% vegetarian." },
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FaqSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Visit Us"
|
||||
text="Join us for the most authentic breakfast experience in Kolhapur. We are located at 9th Ln, Mali Colony, Sanmitra Housing Society, Rajarampuri, Kolhapur. Call us at 088923 86666."
|
||||
primaryButton={{ text: "Call Now", href: "tel:08892386666" }}
|
||||
secondaryButton={{ text: "Get Directions", href: "https://maps.google.com" }}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ContactSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
26
src/pages/HomePage/sections/About.tsx
Normal file
26
src/pages/HomePage/sections/About.tsx
Normal file
@@ -0,0 +1,26 @@
|
||||
// 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 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="A Legacy of Masala & Love"
|
||||
description="Born in the lanes of Rajarampuri, Kolhapur, we take pride in our roots. Every bowl of our misal carries the legacy of traditional spices, slow-cooked to perfection to ensure the rassa hits just right."
|
||||
items={[
|
||||
{ icon: "Flame", title: "Authentically Fiery", description: "Kolhapur's signature heat in every bite." },
|
||||
{ icon: "Heart", title: "Homemade Style", description: "Prepared with love, just like grandmother made." },
|
||||
{ icon: "Leaf", title: "100% Vegetarian", description: "Pure, fresh, and wholesome vegetarian food." },
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/side-view-traditional-azerbaijani-dish-piti-pot-with-sumac-dried-herbs-onions-tray_141793-5179.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
21
src/pages/HomePage/sections/Contact.tsx
Normal file
21
src/pages/HomePage/sections/Contact.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 "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="Join us for the most authentic breakfast experience in Kolhapur. We are located at 9th Ln, Mali Colony, Sanmitra Housing Society, Rajarampuri, Kolhapur. Call us at 088923 86666."
|
||||
primaryButton={{ text: "Call Now", href: "tel:08892386666" }}
|
||||
secondaryButton={{ text: "Get Directions", href: "https://maps.google.com" }}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
26
src/pages/HomePage/sections/Faq.tsx
Normal file
26
src/pages/HomePage/sections/Faq.tsx
Normal file
@@ -0,0 +1,26 @@
|
||||
// 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 FaqTwoColumn from '@/components/sections/faq/FaqTwoColumn';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FaqSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqTwoColumn
|
||||
tag="FAQs"
|
||||
title="Good to Know"
|
||||
description="Everything you need to know about dining at Kolhapuri Wada Misal."
|
||||
items={[
|
||||
{ question: "What are your opening hours?", answer: "We are open from 8:30 AM every day except Mondays." },
|
||||
{ question: "Is your food spicy?", answer: "Yes, we are known for our authentic, fiery Kolhapuri spice level, but we can customize on request!" },
|
||||
{ question: "Do you offer takeaways?", answer: "Yes, we offer convenient takeaways for all our menu items." },
|
||||
{ question: "Are you fully vegetarian?", answer: "Absolutely! Everything we serve is 100% vegetarian." },
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
32
src/pages/HomePage/sections/Hero.tsx
Normal file
32
src/pages/HomePage/sections/Hero.tsx
Normal file
@@ -0,0 +1,32 @@
|
||||
// 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 HeroBillboardCarousel from '@/components/sections/hero/HeroBillboardCarousel';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function HeroSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroBillboardCarousel
|
||||
tag="Kolhapur's Soul in Every Bite"
|
||||
title="कोल्हापुरी वाडा मिसळ (Kolhapuri Wada Misal)"
|
||||
description="Authentic, fiery, and soulful misal straight from the heart of Rajarampuri. Experience the legendary heat and traditional warmth."
|
||||
primaryButton={{
|
||||
text: "See Menu", href: "#menu"}}
|
||||
secondaryButton={{
|
||||
text: "Visit Us", href: "#contact"}}
|
||||
items={[
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/side-view-multi-colored-meatballs-with-tomato-sauces-green-onions_140725-13961.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/georgian-khinkali-with-hot-chili-sauce_114579-2368.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/top-view-tasty-meat-patties-baked-pastries-grey-desk-patty-dough-pastry-bake-meal_140725-86249.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/fried-chicken-with-broccoli-table_140725-9657.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/delicious-indian-pav-bhaji-dish-with-bread-onions_23-2151996246.jpg" },
|
||||
{ imageSrc: "http://img.b2bpic.net/free-photo/thai-noodles-style_74190-3896.jpg" },
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
173
src/pages/HomePage/sections/Menu.tsx
Normal file
173
src/pages/HomePage/sections/Menu.tsx
Normal file
@@ -0,0 +1,173 @@
|
||||
import React, { useState } from 'react';
|
||||
import { Plus, Minus, ShoppingCart } from 'lucide-react';
|
||||
import Button from '@/components/ui/Button';
|
||||
import ImageOrVideo from '@/components/ui/ImageOrVideo';
|
||||
import TextAnimation from '@/components/ui/TextAnimation';
|
||||
import ScrollReveal from '@/components/ui/ScrollReveal';
|
||||
|
||||
const MENU_ITEMS = [
|
||||
{ id: 1, name: "Wada Misal Pav", price: 120, imageSrc: "http://img.b2bpic.net/free-photo/high-angle-delicious-pakistan-meal-basket_23-2148821575.jpg", description: "Our most popular signature dish. Fiery rassa, crispy farsan, and soft, buttery pav." },
|
||||
{ id: 2, name: "Solkadi", price: 50, imageSrc: "http://img.b2bpic.net/free-photo/glasses-refreshing-hibiscus-ice-tea_23-2149893654.jpg", description: "Cool, refreshing kokum-based drink that balances every spicy bite." },
|
||||
{ id: 3, name: "Misal Thali", price: 180, imageSrc: "http://img.b2bpic.net/free-photo/high-angle-indian-food-assortment_23-2148747704.jpg", description: "The ultimate loaded experience featuring all our signature sides and accompaniments." },
|
||||
{ id: 4, name: "Traditional Misal", price: 100, imageSrc: "http://img.b2bpic.net/free-photo/closeup-shot-indian-tasty-food-called-marwari-veg-thali-wooden-table_181624-58043.jpg", description: "The classic breakfast choice of Kolhapur, perfected over decades." },
|
||||
{ id: 5, name: "Butter Pav", price: 30, imageSrc: "http://img.b2bpic.net/free-photo/dragon-fruit-with-juice-tray-wooden-table-plaster-wall-high-angle-view_176474-9420.jpg", description: "Freshly baked, soft pav toasted with authentic local butter." },
|
||||
{ id: 6, name: "Curd Sides", price: 40, imageSrc: "http://img.b2bpic.net/free-photo/assortment-indian-dishes-platter_23-2152002848.jpg", description: "Fresh homemade curd served with every thali to soothe the palate." },
|
||||
];
|
||||
|
||||
export default function MenuSection() {
|
||||
const [cart, setCart] = useState<Record<number, number>>({});
|
||||
|
||||
const updateQuantity = (id: number, delta: number) => {
|
||||
setCart(prev => {
|
||||
const current = prev[id] || 0;
|
||||
const next = Math.max(0, current + delta);
|
||||
if (next === 0) {
|
||||
const { [id]: _, ...rest } = prev;
|
||||
return rest;
|
||||
}
|
||||
return { ...prev, [id]: next };
|
||||
});
|
||||
};
|
||||
|
||||
const totalItems = Object.values(cart).reduce((a, b) => a + b, 0);
|
||||
const totalPrice = Object.entries(cart).reduce((total, [id, qty]) => {
|
||||
const item = MENU_ITEMS.find(i => i.id === Number(id));
|
||||
return total + (item ? item.price * qty : 0);
|
||||
}, 0);
|
||||
|
||||
const handleCheckout = () => {
|
||||
if (totalItems === 0) return;
|
||||
|
||||
let message = "Hello! I would like to place an order for home delivery:\n\n";
|
||||
Object.entries(cart).forEach(([id, qty]) => {
|
||||
const item = MENU_ITEMS.find(i => i.id === Number(id));
|
||||
if (item) {
|
||||
message += `${qty}x ${item.name} - ₹${item.price * qty}\n`;
|
||||
}
|
||||
});
|
||||
message += `\nTotal: ₹${totalPrice}\n\nPlease let me know the delivery time and payment details.`;
|
||||
|
||||
const encodedMessage = encodeURIComponent(message);
|
||||
window.open(`https://wa.me/919876543210?text=${encodedMessage}`, '_blank');
|
||||
};
|
||||
|
||||
return (
|
||||
<div data-webild-section="menu">
|
||||
<section className="py-24 bg-background relative" id="menu">
|
||||
<div className="w-content-width mx-auto px-6">
|
||||
<ScrollReveal variant="fade">
|
||||
<div className="text-center mb-16">
|
||||
<span className="inline-block py-1 px-3 rounded-full bg-primary-cta/10 text-primary-cta text-sm font-medium mb-4">
|
||||
Order Online
|
||||
</span>
|
||||
<TextAnimation
|
||||
text="Menu & Delivery"
|
||||
variant="fade-blur"
|
||||
gradientText={false}
|
||||
tag="h2"
|
||||
className="text-4xl md:text-5xl font-bold text-foreground mb-4"
|
||||
/>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||
Select your favorite dishes and order directly via WhatsApp for quick home delivery.
|
||||
</p>
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
|
||||
<div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
|
||||
<div className="lg:col-span-2 grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
{MENU_ITEMS.map((item, index) => (
|
||||
<ScrollReveal variant="fade" key={item.id} delay={index * 0.1}>
|
||||
<div className="card p-4 flex flex-col rounded-2xl border border-border bg-card h-full">
|
||||
<div className="aspect-video w-full rounded-xl overflow-hidden mb-4 relative">
|
||||
<ImageOrVideo imageSrc={item.imageSrc} className="w-full h-full object-cover" />
|
||||
<div className="absolute top-2 right-2 bg-background/90 backdrop-blur-sm px-3 py-1 rounded-full font-bold text-foreground">
|
||||
₹{item.price}
|
||||
</div>
|
||||
</div>
|
||||
<h3 className="text-xl font-bold text-foreground mb-2">{item.name}</h3>
|
||||
<p className="text-sm text-muted-foreground mb-6 flex-grow">{item.description}</p>
|
||||
|
||||
<div className="flex items-center justify-between mt-auto pt-4 border-t border-border">
|
||||
<span className="font-medium text-foreground">Quantity</span>
|
||||
<div className="flex items-center gap-3 bg-background rounded-full p-1 border border-border">
|
||||
<button
|
||||
onClick={() => updateQuantity(item.id, -1)}
|
||||
className="w-8 h-8 flex items-center justify-center rounded-full bg-card hover:bg-primary-cta/10 text-foreground transition-colors"
|
||||
>
|
||||
<Minus size={16} />
|
||||
</button>
|
||||
<span className="w-4 text-center font-medium">{cart[item.id] || 0}</span>
|
||||
<button
|
||||
onClick={() => updateQuantity(item.id, 1)}
|
||||
className="w-8 h-8 flex items-center justify-center rounded-full bg-primary-cta text-primary-cta-text hover:opacity-90 transition-opacity"
|
||||
>
|
||||
<Plus size={16} />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="lg:col-span-1">
|
||||
<ScrollReveal variant="fade" delay={0.2}>
|
||||
<div className="sticky top-24 card p-6 rounded-2xl border border-border bg-card shadow-lg">
|
||||
<div className="flex items-center gap-3 mb-6 pb-4 border-b border-border">
|
||||
<div className="w-10 h-10 rounded-full bg-primary-cta/10 flex items-center justify-center text-primary-cta">
|
||||
<ShoppingCart size={20} />
|
||||
</div>
|
||||
<h3 className="text-2xl font-bold text-foreground">Your Order</h3>
|
||||
</div>
|
||||
|
||||
{totalItems === 0 ? (
|
||||
<div className="text-center py-8 text-muted-foreground">
|
||||
<ShoppingCart size={48} className="mx-auto mb-4 opacity-20" />
|
||||
<p>Your cart is empty.</p>
|
||||
<p className="text-sm mt-2">Add some delicious items from the menu!</p>
|
||||
</div>
|
||||
) : (
|
||||
<div className="flex flex-col h-full">
|
||||
<div className="space-y-4 mb-6 max-h-[40vh] overflow-y-auto pr-2">
|
||||
{Object.entries(cart).map(([id, qty]) => {
|
||||
const item = MENU_ITEMS.find(i => i.id === Number(id));
|
||||
if (!item) return null;
|
||||
return (
|
||||
<div key={id} className="flex justify-between items-center text-sm">
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="font-bold text-primary-cta">{qty}x</span>
|
||||
<span className="text-foreground font-medium">{item.name}</span>
|
||||
</div>
|
||||
<span className="text-foreground font-bold">₹{item.price * qty}</span>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
|
||||
<div className="mt-auto pt-4 border-t border-border">
|
||||
<div className="flex justify-between items-center mb-6">
|
||||
<span className="text-lg font-medium text-foreground">Total</span>
|
||||
<span className="text-2xl font-bold text-foreground">₹{totalPrice}</span>
|
||||
</div>
|
||||
|
||||
<Button
|
||||
text={`Order via WhatsApp`}
|
||||
variant="primary"
|
||||
className="w-full py-4 text-lg"
|
||||
onClick={handleCheckout}
|
||||
/>
|
||||
<p className="text-xs text-center text-muted-foreground mt-4">
|
||||
You will be redirected to WhatsApp to confirm your order and delivery details.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
27
src/pages/HomePage/sections/Reviews.tsx
Normal file
27
src/pages/HomePage/sections/Reviews.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 "reviews" section.
|
||||
|
||||
import React from 'react';
|
||||
import TestimonialColumnMarqueeCards from '@/components/sections/testimonial/TestimonialColumnMarqueeCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function ReviewsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="reviews" data-section="reviews">
|
||||
<SectionErrorBoundary name="reviews">
|
||||
<TestimonialColumnMarqueeCards
|
||||
tag="What Diners Say"
|
||||
title="Loved by Over 1,200 Foodies"
|
||||
description="With a rating of 4.4, we take pride in serving the most authentic misal in the city."
|
||||
testimonials={[
|
||||
{ name: "Rahul P.", role: "Food Blogger", quote: "The rassa is perfection. It wakes up your soul instantly!", imageSrc: "http://img.b2bpic.net/free-photo/smiling-waitress-talking-customers-using-touchpad-while-taking-orders-cafe_637285-3962.jpg" },
|
||||
{ name: "Sanjay D.", role: "Regular Customer", quote: "Best breakfast in Rajarampuri. I've been coming here for 5 years.", imageSrc: "http://img.b2bpic.net/free-photo/young-happy-woman-her-boyfriend-reading-text-message-mobile-phone-while-sitting-dining-table_637285-10328.jpg" },
|
||||
{ name: "Priya K.", role: "Foodie", quote: "The Misal Thali is loaded with flavours. Pure, homemade goodness.", imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-happy-colleagues-with-pizza_23-2149103772.jpg" },
|
||||
{ name: "Anil S.", role: "Local", quote: "Exactly the taste of Kolhapur I was looking for. Simply outstanding.", imageSrc: "http://img.b2bpic.net/free-photo/crazy-man-funny-expression_1194-3203.jpg" },
|
||||
{ name: "Meera B.", role: "Traveler", quote: "A must-visit spot in Kolhapur. The spice level is spot on.", imageSrc: "http://img.b2bpic.net/free-photo/portrait-attractive-young-woman-recording-cooking-tutorial-her-video-blog_662251-2386.jpg" },
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user