diff --git a/package-lock.json b/package-lock.json index e54cfd6..47ccbb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1727,7 +1727,6 @@ "version": "19.2.17", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", - "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -3017,7 +3016,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { diff --git a/public/images/about.png b/public/images/about.png new file mode 100644 index 0000000..5cbe3c2 Binary files /dev/null and b/public/images/about.png differ diff --git a/public/images/home/chef/chef-bg.webp b/public/images/home/chef/chef-bg.webp new file mode 100644 index 0000000..e6dce81 Binary files /dev/null and b/public/images/home/chef/chef-bg.webp differ diff --git a/public/images/home/chef/chef-right-img.webp b/public/images/home/chef/chef-right-img.webp new file mode 100644 index 0000000..9e3f6ec Binary files /dev/null and b/public/images/home/chef/chef-right-img.webp differ diff --git a/public/images/home/chef/icons/chef-authentic.webp b/public/images/home/chef/icons/chef-authentic.webp new file mode 100644 index 0000000..130dc91 Binary files /dev/null and b/public/images/home/chef/icons/chef-authentic.webp differ diff --git a/public/images/home/chef/icons/chef-love.webp b/public/images/home/chef/icons/chef-love.webp new file mode 100644 index 0000000..70f4c81 Binary files /dev/null and b/public/images/home/chef/icons/chef-love.webp differ diff --git a/public/images/home/chef/icons/chef-pure-veg.webp b/public/images/home/chef/icons/chef-pure-veg.webp new file mode 100644 index 0000000..06e3f58 Binary files /dev/null and b/public/images/home/chef/icons/chef-pure-veg.webp differ diff --git a/public/images/home/chef/icons/chef-wood.webp b/public/images/home/chef/icons/chef-wood.webp new file mode 100644 index 0000000..a5c730d Binary files /dev/null and b/public/images/home/chef/icons/chef-wood.webp differ diff --git a/public/images/home/culinary-categories/bottom-appetizer.webp b/public/images/home/culinary-categories/bottom-appetizer.webp new file mode 100644 index 0000000..b777f3d Binary files /dev/null and b/public/images/home/culinary-categories/bottom-appetizer.webp differ diff --git a/public/images/home/culinary-categories/bottom-breads.webp b/public/images/home/culinary-categories/bottom-breads.webp new file mode 100644 index 0000000..b1563cd Binary files /dev/null and b/public/images/home/culinary-categories/bottom-breads.webp differ diff --git a/public/images/home/culinary-categories/bottom-combo.webp b/public/images/home/culinary-categories/bottom-combo.webp new file mode 100644 index 0000000..3b8d9a0 Binary files /dev/null and b/public/images/home/culinary-categories/bottom-combo.webp differ diff --git a/public/images/home/culinary-categories/bottom-dessert-beverages.webp b/public/images/home/culinary-categories/bottom-dessert-beverages.webp new file mode 100644 index 0000000..3c6f3d2 Binary files /dev/null and b/public/images/home/culinary-categories/bottom-dessert-beverages.webp differ diff --git a/public/images/home/culinary-categories/bottom-rice.webp b/public/images/home/culinary-categories/bottom-rice.webp new file mode 100644 index 0000000..30382eb Binary files /dev/null and b/public/images/home/culinary-categories/bottom-rice.webp differ diff --git a/public/images/home/culinary-categories/bottom-tiffin.webp b/public/images/home/culinary-categories/bottom-tiffin.webp new file mode 100644 index 0000000..4291cb9 Binary files /dev/null and b/public/images/home/culinary-categories/bottom-tiffin.webp differ diff --git a/public/images/home/culinary-categories/icons/appetizer.webp b/public/images/home/culinary-categories/icons/appetizer.webp new file mode 100644 index 0000000..8777590 Binary files /dev/null and b/public/images/home/culinary-categories/icons/appetizer.webp differ diff --git a/public/images/home/culinary-categories/icons/breads.webp b/public/images/home/culinary-categories/icons/breads.webp new file mode 100644 index 0000000..76ac6cf Binary files /dev/null and b/public/images/home/culinary-categories/icons/breads.webp differ diff --git a/public/images/home/culinary-categories/icons/combo.webp b/public/images/home/culinary-categories/icons/combo.webp new file mode 100644 index 0000000..a516f23 Binary files /dev/null and b/public/images/home/culinary-categories/icons/combo.webp differ diff --git a/public/images/home/culinary-categories/icons/dessert.webp b/public/images/home/culinary-categories/icons/dessert.webp new file mode 100644 index 0000000..bb8588a Binary files /dev/null and b/public/images/home/culinary-categories/icons/dessert.webp differ diff --git a/public/images/home/culinary-categories/icons/dosa.webp b/public/images/home/culinary-categories/icons/dosa.webp new file mode 100644 index 0000000..9455f63 Binary files /dev/null and b/public/images/home/culinary-categories/icons/dosa.webp differ diff --git a/public/images/home/culinary-categories/icons/rice.webp b/public/images/home/culinary-categories/icons/rice.webp new file mode 100644 index 0000000..4778ca4 Binary files /dev/null and b/public/images/home/culinary-categories/icons/rice.webp differ diff --git a/public/images/home/culinary-categories/icons/thali.webp b/public/images/home/culinary-categories/icons/thali.webp new file mode 100644 index 0000000..beb8524 Binary files /dev/null and b/public/images/home/culinary-categories/icons/thali.webp differ diff --git a/public/images/home/culinary-categories/icons/tiffin.webp b/public/images/home/culinary-categories/icons/tiffin.webp new file mode 100644 index 0000000..752318d Binary files /dev/null and b/public/images/home/culinary-categories/icons/tiffin.webp differ diff --git a/public/images/home/culinary-categories/icons/uthappam.webp b/public/images/home/culinary-categories/icons/uthappam.webp new file mode 100644 index 0000000..6c05aa5 Binary files /dev/null and b/public/images/home/culinary-categories/icons/uthappam.webp differ diff --git a/public/images/home/culinary-categories/icons/vada.webp b/public/images/home/culinary-categories/icons/vada.webp new file mode 100644 index 0000000..5175265 Binary files /dev/null and b/public/images/home/culinary-categories/icons/vada.webp differ diff --git a/public/images/home/culinary-categories/left-single-card-Traditional-Thali.webp b/public/images/home/culinary-categories/left-single-card-Traditional-Thali.webp new file mode 100644 index 0000000..4b6a84f Binary files /dev/null and b/public/images/home/culinary-categories/left-single-card-Traditional-Thali.webp differ diff --git a/public/images/home/culinary-categories/our-culinary-categories.webp b/public/images/home/culinary-categories/our-culinary-categories.webp new file mode 100644 index 0000000..5a696da Binary files /dev/null and b/public/images/home/culinary-categories/our-culinary-categories.webp differ diff --git a/public/images/home/culinary-categories/right-side-dosa.webp b/public/images/home/culinary-categories/right-side-dosa.webp new file mode 100644 index 0000000..7d1924e Binary files /dev/null and b/public/images/home/culinary-categories/right-side-dosa.webp differ diff --git a/public/images/home/culinary-categories/right-side-utthappam.webp b/public/images/home/culinary-categories/right-side-utthappam.webp new file mode 100644 index 0000000..9c77cae Binary files /dev/null and b/public/images/home/culinary-categories/right-side-utthappam.webp differ diff --git a/public/images/home/culinary-categories/right-side-vada.webp b/public/images/home/culinary-categories/right-side-vada.webp new file mode 100644 index 0000000..07207e6 Binary files /dev/null and b/public/images/home/culinary-categories/right-side-vada.webp differ diff --git a/public/images/home/culinary-heritage/cards/crispy-ghee-roast.webp b/public/images/home/culinary-heritage/cards/crispy-ghee-roast.webp new file mode 100644 index 0000000..c9bad5a Binary files /dev/null and b/public/images/home/culinary-heritage/cards/crispy-ghee-roast.webp differ diff --git a/public/images/home/culinary-heritage/cards/ghee-roast.webp b/public/images/home/culinary-heritage/cards/ghee-roast.webp new file mode 100644 index 0000000..a452ff3 Binary files /dev/null and b/public/images/home/culinary-heritage/cards/ghee-roast.webp differ diff --git a/public/images/home/culinary-heritage/cards/heirloom.webp b/public/images/home/culinary-heritage/cards/heirloom.webp new file mode 100644 index 0000000..e22ae0c Binary files /dev/null and b/public/images/home/culinary-heritage/cards/heirloom.webp differ diff --git a/public/images/home/culinary-heritage/cards/nectar.webp b/public/images/home/culinary-heritage/cards/nectar.webp new file mode 100644 index 0000000..ae88a40 Binary files /dev/null and b/public/images/home/culinary-heritage/cards/nectar.webp differ diff --git a/public/images/home/culinary-heritage/cards/royal-feast.webp b/public/images/home/culinary-heritage/cards/royal-feast.webp new file mode 100644 index 0000000..0ce4da6 Binary files /dev/null and b/public/images/home/culinary-heritage/cards/royal-feast.webp differ diff --git a/public/images/home/culinary-heritage/cards/seasonal-creations.webp b/public/images/home/culinary-heritage/cards/seasonal-creations.webp new file mode 100644 index 0000000..ffa0f1b Binary files /dev/null and b/public/images/home/culinary-heritage/cards/seasonal-creations.webp differ diff --git a/public/images/home/culinary-heritage/cards/smoked.webp b/public/images/home/culinary-heritage/cards/smoked.webp new file mode 100644 index 0000000..b2a727b Binary files /dev/null and b/public/images/home/culinary-heritage/cards/smoked.webp differ diff --git a/public/images/home/culinary-heritage/icons/culinary-dosa.webp b/public/images/home/culinary-heritage/icons/culinary-dosa.webp new file mode 100644 index 0000000..b342fb6 Binary files /dev/null and b/public/images/home/culinary-heritage/icons/culinary-dosa.webp differ diff --git a/public/images/home/culinary-heritage/icons/culinary-feast.webp b/public/images/home/culinary-heritage/icons/culinary-feast.webp new file mode 100644 index 0000000..1e35994 Binary files /dev/null and b/public/images/home/culinary-heritage/icons/culinary-feast.webp differ diff --git a/public/images/home/culinary-heritage/icons/culinary-heritage.webp b/public/images/home/culinary-heritage/icons/culinary-heritage.webp new file mode 100644 index 0000000..8f66c5c Binary files /dev/null and b/public/images/home/culinary-heritage/icons/culinary-heritage.webp differ diff --git a/public/images/home/culinary-heritage/icons/culinary-pure.webp b/public/images/home/culinary-heritage/icons/culinary-pure.webp new file mode 100644 index 0000000..329f736 Binary files /dev/null and b/public/images/home/culinary-heritage/icons/culinary-pure.webp differ diff --git a/public/images/home/culinary-heritage/our-culinary-heritage-bg-1.webp b/public/images/home/culinary-heritage/our-culinary-heritage-bg-1.webp new file mode 100644 index 0000000..c7c8472 Binary files /dev/null and b/public/images/home/culinary-heritage/our-culinary-heritage-bg-1.webp differ diff --git a/public/images/home/culinary-heritage/our-culinary-heritage-bg-2.webp b/public/images/home/culinary-heritage/our-culinary-heritage-bg-2.webp new file mode 100644 index 0000000..33b49f2 Binary files /dev/null and b/public/images/home/culinary-heritage/our-culinary-heritage-bg-2.webp differ diff --git a/public/images/home/culinary-heritage/our-culinary-heritage-right.webp b/public/images/home/culinary-heritage/our-culinary-heritage-right.webp new file mode 100644 index 0000000..3d0e129 Binary files /dev/null and b/public/images/home/culinary-heritage/our-culinary-heritage-right.webp differ diff --git a/public/images/home/footer/footer-bg.webp b/public/images/home/footer/footer-bg.webp new file mode 100644 index 0000000..cbec67d Binary files /dev/null and b/public/images/home/footer/footer-bg.webp differ diff --git a/public/images/home/menu/icons/menu-authentic.webp b/public/images/home/menu/icons/menu-authentic.webp new file mode 100644 index 0000000..453286d Binary files /dev/null and b/public/images/home/menu/icons/menu-authentic.webp differ diff --git a/public/images/home/menu/icons/menu-ingredients.webp b/public/images/home/menu/icons/menu-ingredients.webp new file mode 100644 index 0000000..ca643f7 Binary files /dev/null and b/public/images/home/menu/icons/menu-ingredients.webp differ diff --git a/public/images/home/menu/icons/menu-love.webp b/public/images/home/menu/icons/menu-love.webp new file mode 100644 index 0000000..81a174c Binary files /dev/null and b/public/images/home/menu/icons/menu-love.webp differ diff --git a/public/images/home/menu/icons/menu-pure-veg.webp b/public/images/home/menu/icons/menu-pure-veg.webp new file mode 100644 index 0000000..73a8433 Binary files /dev/null and b/public/images/home/menu/icons/menu-pure-veg.webp differ diff --git a/public/images/home/menu/our-menu-bg.webp b/public/images/home/menu/our-menu-bg.webp new file mode 100644 index 0000000..0674b20 Binary files /dev/null and b/public/images/home/menu/our-menu-bg.webp differ diff --git a/public/images/home/our-story/icons/authentic.webp b/public/images/home/our-story/icons/authentic.webp new file mode 100644 index 0000000..3602cf8 Binary files /dev/null and b/public/images/home/our-story/icons/authentic.webp differ diff --git a/public/images/home/our-story/icons/hospitality.webp b/public/images/home/our-story/icons/hospitality.webp new file mode 100644 index 0000000..e46a758 Binary files /dev/null and b/public/images/home/our-story/icons/hospitality.webp differ diff --git a/public/images/home/our-story/icons/love.webp b/public/images/home/our-story/icons/love.webp new file mode 100644 index 0000000..b254527 Binary files /dev/null and b/public/images/home/our-story/icons/love.webp differ diff --git a/public/images/home/our-story/icons/pure-veg.webp b/public/images/home/our-story/icons/pure-veg.webp new file mode 100644 index 0000000..ab41be6 Binary files /dev/null and b/public/images/home/our-story/icons/pure-veg.webp differ diff --git a/public/images/home/our-story/our-story-bg.webp b/public/images/home/our-story/our-story-bg.webp new file mode 100644 index 0000000..bf787ad Binary files /dev/null and b/public/images/home/our-story/our-story-bg.webp differ diff --git a/public/images/home/our-story/our-story-right-img.webp b/public/images/home/our-story/our-story-right-img.webp new file mode 100644 index 0000000..c0cf7cd Binary files /dev/null and b/public/images/home/our-story/our-story-right-img.webp differ diff --git a/public/images/home/royal/cards/heritage-dinner.webp b/public/images/home/royal/cards/heritage-dinner.webp new file mode 100644 index 0000000..b640ed1 Binary files /dev/null and b/public/images/home/royal/cards/heritage-dinner.webp differ diff --git a/public/images/home/royal/cards/kudumba-dining.webp b/public/images/home/royal/cards/kudumba-dining.webp new file mode 100644 index 0000000..e5ee409 Binary files /dev/null and b/public/images/home/royal/cards/kudumba-dining.webp differ diff --git a/public/images/home/royal/cards/private-gatherings.webp b/public/images/home/royal/cards/private-gatherings.webp new file mode 100644 index 0000000..dbcb830 Binary files /dev/null and b/public/images/home/royal/cards/private-gatherings.webp differ diff --git a/public/images/home/royal/cards/royal-feast.webp b/public/images/home/royal/cards/royal-feast.webp new file mode 100644 index 0000000..bf853c3 Binary files /dev/null and b/public/images/home/royal/cards/royal-feast.webp differ diff --git a/public/images/home/royal/icons/heritage-dinner.webp b/public/images/home/royal/icons/heritage-dinner.webp new file mode 100644 index 0000000..ef4fe85 Binary files /dev/null and b/public/images/home/royal/icons/heritage-dinner.webp differ diff --git a/public/images/home/royal/icons/kudumba-dining.webp b/public/images/home/royal/icons/kudumba-dining.webp new file mode 100644 index 0000000..80bc91b Binary files /dev/null and b/public/images/home/royal/icons/kudumba-dining.webp differ diff --git a/public/images/home/royal/icons/private-gatherings.webp b/public/images/home/royal/icons/private-gatherings.webp new file mode 100644 index 0000000..f87439b Binary files /dev/null and b/public/images/home/royal/icons/private-gatherings.webp differ diff --git a/public/images/home/royal/icons/royal-feast.webp b/public/images/home/royal/icons/royal-feast.webp new file mode 100644 index 0000000..eb9614d Binary files /dev/null and b/public/images/home/royal/icons/royal-feast.webp differ diff --git a/public/images/home/royal/royal-assemblies-bg.webp b/public/images/home/royal/royal-assemblies-bg.webp new file mode 100644 index 0000000..1a9a71a Binary files /dev/null and b/public/images/home/royal/royal-assemblies-bg.webp differ diff --git a/public/images/inner-banner.png b/public/images/inner-banner.png new file mode 100644 index 0000000..5cde2ed Binary files /dev/null and b/public/images/inner-banner.png differ diff --git a/public/images/menu/card-icon.png b/public/images/menu/card-icon.png new file mode 100644 index 0000000..8f39756 Binary files /dev/null and b/public/images/menu/card-icon.png differ diff --git a/public/images/menu/card-img.png b/public/images/menu/card-img.png new file mode 100644 index 0000000..cd3fa86 Binary files /dev/null and b/public/images/menu/card-img.png differ diff --git a/public/images/menu/tab-icon.png b/public/images/menu/tab-icon.png new file mode 100644 index 0000000..2230178 Binary files /dev/null and b/public/images/menu/tab-icon.png differ diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index d4fbb67..d7df5e0 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -1,33 +1,331 @@ "use client"; +import { useState } from "react"; +import { AnimatePresence, motion } from "framer-motion"; +import Image from "next/image"; +import Link from "next/link"; import SubpageLayout from "@/components/SubpageLayout"; -import RestaurantStory from "@/components/RestaurantStory"; -import ChefShowcase from "@/components/ChefShowcase"; +import InnerBanner from "@/components/InnerBanner"; +import AnimatedSection from "@/components/AnimatedSection"; +import TestimonialSlider from "@/components/TestimonialSlider"; +/* ─── FAQ Data ─────────────────────────────────────── */ +const faqs = [ + { + q: "Do you offer vegan options?", + a: "Yes! We have a wide range of delicious vegan dishes made with the finest ingredients.", + }, + { + q: "Where do you source your ingredients?", + a: "We partner with local and trusted suppliers to bring you the freshest, highest-quality South Indian ingredients every day.", + }, + { + q: "Do you provide catering services?", + a: "Absolutely! We offer full catering for private events, corporate gatherings, weddings, and celebrations. Contact us to discuss your needs.", + }, + { + q: "What are your opening hours?", + a: "Mon–Thu: 4pm–10pm · Fri–Sun: 11am–10pm", + }, +]; + +/* ─── Values Data ───────────────────────────────────── */ +const values = [ + { + label: "Quality", + desc: "Every dish crafted with the finest ingredients.", + icon: ( + + + + ), + }, + { + label: "Sustainability", + desc: "Our thinking practices support responsible.", + icon: ( + + + + + ), + }, + { + label: "Passion", + desc: "Dedication and love poured into every recipe.", + icon: ( + + + + ), + }, + { + label: "Community", + desc: "Building bonds and bringing people together.", + icon: ( + + + + + + ), + }, + +]; + +/* ─── Page ──────────────────────────────────────────── */ export default function AboutPage() { + /* single controlled index — only 1 FAQ open at a time */ + const [openFaq, setOpenFaq] = useState(0); + return ( -
- - {/* Subpage Header Banner */} -
-
- - - ABOUT OUR HOUSE - - -
-

- Our Legacy & Passion -

-
+ + {/* ── Inner Banner ── */} + + + {/* ══════════════════════════════════════════ + SECTION 1 — Welcome (sandstone bg) + ══════════════════════════════════════════ */} +
+
+
- {/* Core sections */} - - +
+
+ + {/* Text */} + +
+

+ Welcome to +

+

+ My Dosa Place +

+
+

+ Nestled in the heart of Waterloo, My Dosa Place is a celebration of authentic South Indian cuisine — where every dish tells a story rooted in tradition, love, and the finest ingredients. +

+

+ From our crispy, golden dosas to rich, aromatic curries, each recipe has been carefully crafted to honour the culinary heritage of South India. We believe that great food brings people together, and that every meal should be an experience to remember. +

+

+ Our doors are open to families, friends, and anyone seeking a warm and cozy dining experience, from the streets of Waterloo all the way to South Indian flavours. +

+ + Contact Us + +
+ + + {/* Photo */} + +
+
+ My Dosa Place exterior +
+ {/*
+ +
*/} +
+
+
+
+ + {/* ══════════════════════════════════════════ + SECTION 2 — Our Values (dark green bg) + ══════════════════════════════════════════ */} +
+
+ +
+
+ +
+ +

+ Our Values +

+
+ +
+ {values.map((v, i) => ( + +
+
+ {/* subtle glow behind icon */} +
+
+ {v.icon} +
+
+

{v.label}

+

{v.desc}

+
+
+ ))} +
+
+
+ + {/* ══════════════════════════════════════════ + SECTION 2.5 — Testimonials (sandstone bg) + ══════════════════════════════════════════ */} +
+
+ +
+
+ +
+ +

+ Words of Love +

+

+ What Our Guests Say +

+
+ + + +
+
+ + {/* ══════════════════════════════════════════ + SECTION 3 — FAQ (full-width split layout) + LEFT: dark green bg + accordion + RIGHT: interior photo full height + ══════════════════════════════════════════ */} +
+ + {/* ── LEFT: dark green panel ── */} +
+ {/* subtle bg texture */} +
+ +
+
+ + {/* gold border – right edge only on desktop, bottom edge on mobile */} +
+ +
+ +

+ Frequently Asked Questions +

+ + {/* FAQ accordion */} +
+ {faqs.map((f, i) => { + const isOpen = openFaq === i; + return ( +
setOpenFaq(isOpen ? null : i)} + > + {/* question row */} +
+ + {f.q} + + + + + +
+ {/* answer — smooth height animation */} + + {isOpen && ( + +

+ {f.a} +

+
+ )} +
+
+ ); + })} +
+
+
+
+ + {/* ── RIGHT: photo full height ── */} +
+ My Dosa Place interior + {/* warm dark fade on the left edge blending into green panel */} +
+
+ +
+ + {/* ══════════════════════════════════════════ + SECTION 4 — CTA (sandstone bg) + ══════════════════════════════════════════ */} +
+
+ +
+
+ +
+ +

+ Come Dine With Us +

+

+ Experience the Taste of Tradition +

+
+

+ Visit us or order online and let every bite take you on a journey of authentic South Indian flavors. +

+ + Reserve a Table + + +
+
+ ); } diff --git a/src/app/api/reviews/route.js b/src/app/api/reviews/route.js new file mode 100644 index 0000000..0d23d1b --- /dev/null +++ b/src/app/api/reviews/route.js @@ -0,0 +1,58 @@ +import { fallbackGoogleReviews } from '@/lib/reviewUtils'; + +export const dynamic = 'force-static'; + +const SERPAPI_URL = 'https://serpapi.com/search.json?engine=google_maps_reviews&hl=en'; + +async function fetchGoogleReviews(apiKey, placeId) { + if (!apiKey || !placeId) { + throw new Error('Missing SERPAPI_KEY or SERPAPI_PLACE_ID'); + } + + const url = `${SERPAPI_URL}&api_key=${encodeURIComponent(apiKey)}&place_id=${encodeURIComponent(placeId)}`; + const response = await fetch(url); + + if (!response.ok) { + const body = await response.text().catch(() => ''); + throw new Error(`SerpAPI request failed ${response.status} ${response.statusText}: ${body}`); + } + + const data = await response.json(); + + if (data.error) { + throw new Error(data.error.message || data.error); + } + + if (!Array.isArray(data.reviews)) { + throw new Error('SerpAPI returned no reviews array'); + } + + return data.reviews; +} + +export async function GET() { + const apiKey = process.env.SERPAPI_KEY; + const placeId = process.env.SERPAPI_PLACE_ID; + + try { + const reviews = await fetchGoogleReviews(apiKey, placeId); + return new Response(JSON.stringify({ reviews, total: reviews.length }), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + } catch (error) { + console.error('Reviews API error:', error); + return new Response( + JSON.stringify({ + reviews: fallbackGoogleReviews, + total: fallbackGoogleReviews.length, + fallback: true, + error: error.message, + }), + { + status: 200, + headers: { 'Content-Type': 'application/json' }, + } + ); + } +} diff --git a/src/app/blog/[slug]/page.tsx b/src/app/blog/[slug]/page.tsx new file mode 100644 index 0000000..c2e2e51 --- /dev/null +++ b/src/app/blog/[slug]/page.tsx @@ -0,0 +1,234 @@ +import Image from "next/image"; +import Link from "next/link"; +import { notFound } from "next/navigation"; +import SubpageLayout from "@/components/SubpageLayout"; +import { BLOG_POSTS } from "@/utils/blogData"; +import InnerBanner from "@/components/InnerBanner"; +import AnimatedSection from "@/components/AnimatedSection"; + +export function generateStaticParams() { + return BLOG_POSTS.map((post) => ({ + slug: post.slug, + })); +} + +export default async function BlogPostPage({ params }: { params: Promise<{ slug: string }> }) { + const { slug } = await params; + const post = BLOG_POSTS.find((p) => p.slug === slug); + + if (!post) { + notFound(); + } + + // Split content into paragraphs for custom structural rendering + const paragraphs = post.content.split('\n\n').filter(p => p.trim() !== ''); + const firstParagraph = paragraphs[0] || ""; + const remainingParagraphs = paragraphs.slice(1) || []; + + return ( + + {/* Inner Banner */} + + +
+
+ + {/* ── MAIN CONTENT (Left) ── */} +
+ + {/* Big Featured Image */} + +
+ {post.title} +
+
+ + {/* Post Header / Meta */} + +
+
+ {post.date} + + BY {post.author} +
+

+ {post.title} +

+
+
+ + {/* Content Body */} + +
+ + {/* First Paragraph */} +

+ {firstParagraph} +

+ + {/* Blockquote using theme style */} +
+ + + +

+ "Tradition is not the worship of ashes, but the preservation of fire. Our recipes are a testament to this philosophy." +

+
+ + {/* Remaining Paragraphs */} + {remainingParagraphs.map((p, idx) => ( +

{p}

+ ))} + + {/* List with related icons */} +

Key Elements of Our Heritage

+
    +
  • +
    + +
    +
    + Authentic Spices + Sourced directly from the lush hills of Kerala, ensuring unmatched aroma and flavor. +
    +
  • +
  • +
    + +
    +
    + Time-Honored Techniques + Slow-cooking processes that have been passed down through generations. +
    +
  • +
  • +
    + +
    +
    + Cooked with Love + Every dish is prepared with the same care and devotion as a home-cooked meal. +
    +
  • +
+ + {/* 2 Images per row */} +
+
+ Kitchen Prep +
+
+ Chef Cooking +
+
+ + {/* Title, Paragraph and FAQ */} +

Common Inquiries

+

+ We often receive questions about our traditional cooking methods and ingredient sourcing. Here are some of the most frequently asked questions from our guests who want to dive deeper into our culinary heritage. +

+ +
+ {[ + { q: "Do you use artificial colors in your curries?", a: "Never. The vibrant colors of our dishes come purely from natural ingredients like turmeric, Kashmiri chili, and fresh herbs." }, + { q: "Is your dosa batter gluten-free?", a: "Yes, our traditional dosa batter is made entirely from rice and lentils, making it naturally gluten-free." }, + { q: "How spicy is the authentic Chettinad preparation?", a: "It carries a robust, earthy heat from black pepper and dry red chilies. However, we can adjust the spice level to accommodate your palate upon request." } + ].map((faq, idx) => ( +
+

+ Q. {faq.q} +

+

+ {faq.a} +

+
+ ))} +
+ + {/* Back to page button */} +
+ + Back to Blogs + +
+
+
+
+ + {/* ── RIGHT SIDEBAR ── */} + +
+
+

+ + Related Posts +

+ +
+ {BLOG_POSTS.filter(p => p.id !== post.id).slice(0, 3).map(related => ( + +
+ {related.title} +
+
+
+ {related.date} +
+
+ {related.title} +
+
+ + ))} +
+ + {/* Contact CTA Banner */} +
+ {/* Content */} +
+ {/* Gold icon */} +
+ + + +
+ +
+ Reserve a Table +
+

+ Ready to experience authentic South Indian flavors? Visit us or get in touch. +

+ + + Reserve your table + +
+
+ +
+
+
+
+
+
+ ); +} diff --git a/src/app/blog/page.tsx b/src/app/blog/page.tsx index 9aafed0..6eaf938 100644 --- a/src/app/blog/page.tsx +++ b/src/app/blog/page.tsx @@ -1,7 +1,11 @@ "use client"; import Image from "next/image"; +import Link from "next/link"; import SubpageLayout from "@/components/SubpageLayout"; +import { BLOG_POSTS } from "@/utils/blogData"; +import InnerBanner from "@/components/InnerBanner"; +import AnimatedSection from "@/components/AnimatedSection"; const CornerOrnaments = () => ( <> @@ -20,115 +24,78 @@ const CornerOrnaments = () => ( ); -const BLOG_POSTS = [ - { - id: 1, - title: "The Art of Fermenting Dosa Batter: A 24-Hour Ritual", - desc: "Discover the traditional science and family secrets behind cultivating the perfect sourness and crispiness for our signature stone-ground dosas.", - date: "JULY 15, 2026", - image: "/images/masala_dosa_luxury.png", - author: "Chef Sundaram Iyer", - }, - { - id: 2, - title: "Secret Spices of Chettinad Cookery", - desc: "Unveiling the delicate proportions of kalpasi (stone flower), star anise, and freshly crushed peppercorns that define our royal spice blends.", - date: "JUNE 28, 2026", - image: "/images/category_curries.jpg", - author: "My Dosa Place Culinary Team", - }, - { - id: 3, - title: "Why Brass Cookware Remains King in Heritage Dining", - desc: "How slow-heating copper and brass vessels preserve the vital nutrients and aroma of our house-cooked lentil sambar and vegetable poriyals.", - date: "MAY 12, 2026", - image: "/images/south_indian_thali_luxury.png", - author: "Heritage Preservation Society", - }, -]; - export default function BlogPage() { return ( - {/* Background elements */} -
- Backdrop -
+ -
- - {/* Subpage Header Banner */} -
-
- - - CULINARY CHRONICLES - - -
-

- Spices & Stories -

-
+
+ {/* Subtle background texture */} +
+
- - {/* Blog Posts Grid */} -
- {BLOG_POSTS.map((post) => ( +
+
+ {BLOG_POSTS.map((post, index) => ( +
- {/* Corner leaves and border outline */} -
- - - {/* Image Frame */} -
+ {/* Image Container with fade out */} +
{post.title} + + {/* Gradient fade to match background */} +
+ + {/* Floating Tag */} +
+ + {post.id === 1 ? "Recipes" : post.id === 2 ? "Ingredients" : "Behind The Scenes"} + +
- {/* Meta */} -
- {post.date} - BY {post.author} + {/* Card Body */} +
+ +

+ {post.title} +

+ + +

+ {post.desc} +

+ + {/* Footer Row */} +
+ + {post.date} • {Math.max(2, Math.ceil(post.content.length / 400))} min read + + + {/* Expanding line */} +
+ + + Read More + +
- - {/* Details */} -

- {post.title} -

-

- {post.desc} -

- - {/* Read button */} -
+ ))}
- +
); diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx index c9572c3..dae3239 100644 --- a/src/app/contact/page.tsx +++ b/src/app/contact/page.tsx @@ -2,7 +2,10 @@ import { useState } from "react"; import Image from "next/image"; +import { Phone, Mail, MapPin, Clock, UtensilsCrossed, ShoppingBag, Truck, ChefHat } from "lucide-react"; import SubpageLayout from "@/components/SubpageLayout"; +import InnerBanner from "@/components/InnerBanner"; +import AnimatedSection from "@/components/AnimatedSection"; const CornerOrnaments = () => ( <> @@ -22,7 +25,7 @@ const CornerOrnaments = () => ( ); export default function ContactPage() { - const [formData, setFormData] = useState({ name: "", email: "", msg: "" }); + const [formData, setFormData] = useState({ name: "", email: "", phone: "", subject: "", msg: "" }); const [submitted, setSubmitted] = useState(false); const handleSubmit = (e: React.FormEvent) => { @@ -31,177 +34,274 @@ export default function ContactPage() { setSubmitted(true); setTimeout(() => { setSubmitted(false); - setFormData({ name: "", email: "", msg: "" }); + setFormData({ name: "", email: "", phone: "", subject: "", msg: "" }); }, 5000); } }; return ( -
- Backdrop -
-
- - {/* Header */} -
-
- - - GET IN TOUCH - - -
-

- Connect With Us -

-
+ {/* ── Inner Banner ── */} + + + {/* ── TOP SECTION: Sandstone bg — Info + Form ── */} +
+ {/* Sandstone bg image */} +
+ Background
- {/* 2-Column Info & Form */} -
- - {/* Column 1: Info */} -
-
- +
+
-
-

- THE DINING COURT -

- -
-
-

- OUR HAVEN -

-

- 123 Erb Street West,
- Waterloo, ON N2L 1T4 -

+ {/* Left Column: Info */} + +
+

+ Get in Touch +

+ +
+ {/* Phone */} +
+
+ +
+
+

Phone

+

+1 (519) 888-7459

+
-
-

- HEAR OUR VOICE -

-

- Direct Line: (519) 555-0199
- Royal Inquiries: concierge@mydosaplace.ca -

+ {/* Email */} +
+
+ +
+
+

Email

+

mydosaplacewaterloo@gmail.com

+
-
-

- TIMINGS OF THE COURT -

-

- Lunch Service: 11:30 AM – 3:00 PM
- Dinner Service: 5:30 PM – 10:30 PM
- Closed on Tuesdays for spice curing. -

+ {/* Location */} +
+
+ +
+
+

Location

+

+ 922 Erb St. W Unit C3#3,
+ Waterloo, ON N2T 0C9,
+ Canada +

+
+
+ + {/* Opening Hours */} +
+
+ +
+
+

Opening Hours

+

+ Mon - Thu: 4pm–10pm
+ Fri - Sun: 11am–10pm +

+
+ - {/* Banner bottom */} -
- - ❧ HOSPITALITY SERVED WITH SOUL ☙ - -
-
+ {/* Right Column: Form — Dark green theme card */} + +
+
+ - {/* Column 2: Form */} -
-
- - -
-
-

- WRITE A NOTE -

+
+

Send Us a Message

{submitted ? ( -
- +
+ -

- INQUIRY SENT -

-

- Thank you for contacting the court. Our hospitality concierge will respond within a single sun cycle. +

MESSAGE SENT

+

+ Thank you for contacting us. We will get back to you shortly.

) : (
-
- +
setFormData({ ...formData, name: e.target.value })} /> -
- -
- setFormData({ ...formData, email: e.target.value })} />
-
- -