diff --git a/public/images/menu/card-img.png b/public/images/menu/card-img.png index cd3fa86..92a9bc0 100644 Binary files a/public/images/menu/card-img.png and b/public/images/menu/card-img.png differ diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx index 0a9486d..1f4f628 100644 --- a/src/app/contact/page.tsx +++ b/src/app/contact/page.tsx @@ -326,13 +326,13 @@ export default function ContactPage() {
{[ - { day: 'Friday', time: '5:00 – 10:00 pm' }, - { day: 'Saturday', time: '12:00 – 10:00 pm' }, - { day: 'Sunday', time: '12:00 – 9:00 pm' }, { day: 'Monday', time: '4:00 – 10:00 pm' }, { day: 'Tuesday', time: 'Closed', closed: true }, { day: 'Wednesday', time: '4:30 – 10:00 pm' }, { day: 'Thursday', time: '4:00 – 10:00 pm' }, + { day: 'Friday', time: '5:00 – 10:00 pm' }, + { day: 'Saturday', time: '12:00 – 10:00 pm' }, + { day: 'Sunday', time: '12:00 – 9:00 pm' }, ].map(({ day, time, closed }) => (
{day} diff --git a/src/app/globals.css b/src/app/globals.css index 6edc94d..a2fe413 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -118,3 +118,12 @@ body { display: none !important; } } + +/* Scrollbar hiding utility */ +.scrollbar-none::-webkit-scrollbar { + display: none; +} +.scrollbar-none { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} diff --git a/src/components/EntranceExperience.tsx b/src/components/EntranceExperience.tsx index f849678..38599d9 100644 --- a/src/components/EntranceExperience.tsx +++ b/src/components/EntranceExperience.tsx @@ -86,11 +86,19 @@ function CinematicFlight({ progress }: { progress: number }) { const { width, height } = useThree((state) => state.viewport); + // Compute baseScale to prevent clipping of "MY DOSA PLACE" sign on portrait/mobile viewports + const isPortrait = width < height; + const baseScale = 1.0; // Keep full height, no empty spaces at top and bottom + // Compute facade dimensions based on dusk photo aspect ratio - const aspect = 1920 / 864; + // Use dynamically compressed aspect ratio on mobile to fit the sign width responsive to screen width + const aspect = isPortrait ? Math.max(1.7, Math.min(1.95, (width / height) * 3.8)) : 1920 / 864; const planeH = height; const planeW = planeH * aspect; + // Compute horizontal offset to shift image to left on mobile so text is perfectly centered/visible + const offsetX = isPortrait ? -planeW * 0.025 : 0; + // Door dimensions matching facade coordinate percentages const dw = 0.04 * planeW; const dh = 0.42 * planeH; @@ -112,14 +120,18 @@ function CinematicFlight({ progress }: { progress: number }) { // Smooth frame loop camera zoom and door swing animations useFrame(() => { // 1. Storefront zoom and centering translation - // Scale goes from 1.0 to 5.5 - const targetExtScale = 1.0 + progress * 4.5; + // Scale goes from baseScale to 6.5 + const targetExtScale = baseScale + progress * (6.5 - baseScale); if (extGroupRef.current) { extGroupRef.current.scale.setScalar(THREE.MathUtils.lerp(extGroupRef.current.scale.x, targetExtScale, 0.08)); // Pan Y upward to center the doors as we scale const currentScale = extGroupRef.current.scale.x; - const targetY = -doorY * (currentScale - 1.0); + const targetY = -doorY * (currentScale - baseScale); extGroupRef.current.position.y = THREE.MathUtils.lerp(extGroupRef.current.position.y, targetY, 0.08); + + // Interpolate horizontal offset from offsetX to 0 as progress goes from 0 to 1 + const targetX = offsetX * (1.0 - progress); + extGroupRef.current.position.x = THREE.MathUtils.lerp(extGroupRef.current.position.x, targetX, 0.08); } // 2. Door opening rotation (swing inward Y-axis) @@ -206,7 +218,7 @@ function CinematicFlight({ progress }: { progress: number }) { {/* Plane 1: Storefront Facade & 3D Swinging Door Panels (Z = 0.02) */} - +

- A royal banquet served on fresh banana leaves—crisp ghee dosas, slow-simmered sambar, and chutneys hand-ground fresh every morning. 100% pure vegetarian. + A royal banquet of crisp ghee dosas, slow-simmered sambar, and chutneys hand-ground fresh every morning. 100% pure vegetarian.

)} diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index d88aa2e..90d8c0b 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -156,21 +156,6 @@ export default function Footer() {
- {/* Friday */} -
- Friday - 5–10 pm -
- {/* Saturday */} -
- Saturday - 12–10 pm -
- {/* Sunday */} -
- Sunday - 12–9 pm -
{/* Monday */}
Monday @@ -197,6 +182,21 @@ export default function Footer() { Thursday 4–10 pm
+ {/* Friday */} +
+ Friday + 5–10 pm +
+ {/* Saturday */} +
+ Saturday + 12–10 pm +
+ {/* Sunday */} +
+ Sunday + 12–9 pm +
diff --git a/src/components/MenuPageContent.tsx b/src/components/MenuPageContent.tsx index a834af3..8323803 100644 --- a/src/components/MenuPageContent.tsx +++ b/src/components/MenuPageContent.tsx @@ -1,6 +1,6 @@ "use client"; -import { motion } from "framer-motion"; +import { motion, AnimatePresence } from "framer-motion"; import Image from "next/image"; import { useState } from "react"; import AnimatedSection from "@/components/AnimatedSection"; @@ -135,6 +135,7 @@ const MENU_ITEMS = [ export default function MenuPageContent() { const [activeTab, setActiveTab] = useState("classics"); + const [isPopupOpen, setIsPopupOpen] = useState(false); // Map tab ids → item tag values const TAB_TAG_MAP: Record = { @@ -165,24 +166,26 @@ export default function MenuPageContent() {
- {/* Section Title */} -
-
- -

MY DOSA SPECIALTIES

- + {/* Section Title */} +
+
+ +

MY DOSA SPECIALTIES

+
-
- +
+ Crispy Flavorful Authentic - +
{/* Tabs */}
-
+ + {/* Desktop View (wrapped categories) */} +
{TABS.map((tab) => { const isActive = activeTab === tab.id; const isAllItems = tab.id === "all"; @@ -216,7 +219,7 @@ export default function MenuPageContent() {
+ + {/* Mobile View: Single Category Pill + Distinct 'VIEW ALL' Trigger */} +
+
+ {/* Left: Selected Category Details */} +
+ {activeTab === "all" ? ( +
+ + + + + + +
+ ) : ( +
+ +
+ )} + + {TABS.find((t) => t.id === activeTab)?.label} + +
+ + {/* Right: "VIEW ALL" Trigger Button */} + +
+
+
@@ -312,6 +354,89 @@ export default function MenuPageContent() {
+ + {/* Categories Choice Popup Modal for Mobile View */} + + {isPopupOpen && ( + setIsPopupOpen(false)} + > + e.stopPropagation()} + > + {/* Gold decorative corners inside */} +
+ + {/* Close Button */} + + + {/* Title */} +
+

Select Category

+
+
+ + {/* Grid of Categories */} +
+ {TABS.map((tab) => { + const isActive = activeTab === tab.id; + const isAllItems = tab.id === "all"; + + return ( + + ); + })} +
+ + + )} +
); }