diff --git a/public/images/crispy-masala.png b/public/images/crispy-masala.png
new file mode 100644
index 0000000..f7ca679
Binary files /dev/null and b/public/images/crispy-masala.png differ
diff --git a/public/images/hero-dosa.png b/public/images/hero-dosa.png
new file mode 100644
index 0000000..281e576
Binary files /dev/null and b/public/images/hero-dosa.png differ
diff --git a/public/images/medu-vada.png b/public/images/medu-vada.png
new file mode 100644
index 0000000..cf340bd
Binary files /dev/null and b/public/images/medu-vada.png differ
diff --git a/public/images/new.png b/public/images/new.png
new file mode 100644
index 0000000..6639314
Binary files /dev/null and b/public/images/new.png differ
diff --git a/public/images/sambar.png b/public/images/sambar.png
new file mode 100644
index 0000000..4995fec
Binary files /dev/null and b/public/images/sambar.png differ
diff --git a/public/images/south-indian-thali.png b/public/images/south-indian-thali.png
new file mode 100644
index 0000000..5fbd075
Binary files /dev/null and b/public/images/south-indian-thali.png differ
diff --git a/public/images/story-heritage.png b/public/images/story-heritage.png
new file mode 100644
index 0000000..0d8c7ef
Binary files /dev/null and b/public/images/story-heritage.png differ
diff --git a/src/app/globals.css b/src/app/globals.css
index 4c18fb3..d2fe705 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1,34 +1,31 @@
:root {
- --background: #ffffff;
- --foreground: #171717;
-}
+ --color-primary: #014d33;
+ --color-primary-light: #0d6e4d;
+ --color-secondary: #d99c43;
+ --color-secondary-hover: #b88231;
+ --color-bg-light: #f5f7f2;
+ --color-bg-white: #ffffff;
+ --color-text-dark: #333333;
+ --color-text-medium: #666666;
+ --color-text-light: #f9f9f9;
-@media (prefers-color-scheme: dark) {
- :root {
- --background: #0a0a0a;
- --foreground: #ededed;
- }
-}
+ --font-serif: var(--font-playfair), Georgia, serif;
+ --font-sans: var(--font-inter), system-ui, sans-serif;
-html {
- height: 100%;
-}
+ --spacing-xs: 0.5rem;
+ --spacing-sm: 1rem;
+ --spacing-md: 2rem;
+ --spacing-lg: 4rem;
+ --spacing-xl: 6rem;
-html,
-body {
- max-width: 100vw;
- overflow-x: hidden;
-}
-
-body {
- min-height: 100%;
- display: flex;
- flex-direction: column;
- color: var(--foreground);
- background: var(--background);
- font-family: Arial, Helvetica, sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
+ --border-radius-sm: 4px;
+ --border-radius-md: 8px;
+ --border-radius-lg: 16px;
+ --border-radius-full: 9999px;
+
+ --shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.05);
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08);
+ --shadow-lg: 0 12px 24px rgba(0, 0, 0, 0.12);
}
* {
@@ -37,13 +34,53 @@ body {
margin: 0;
}
+html,
+body {
+ max-width: 100vw;
+ overflow-x: hidden;
+ font-family: var(--font-sans);
+ color: var(--color-text-dark);
+ background-color: var(--color-bg-white);
+ line-height: 1.6;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-family: var(--font-serif);
+ font-weight: 700;
+ color: var(--color-primary);
+ line-height: 1.2;
+}
+
a {
color: inherit;
text-decoration: none;
+ transition: color 0.3s ease;
}
-@media (prefers-color-scheme: dark) {
- html {
- color-scheme: dark;
+ul {
+ list-style: none;
+}
+
+button {
+ cursor: pointer;
+ font-family: var(--font-sans);
+ border: none;
+ background: none;
+ transition: all 0.3s ease;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 var(--spacing-sm);
+}
+
+.section-padding {
+ padding: var(--spacing-xl) 0;
+}
+
+@media (max-width: 768px) {
+ .section-padding {
+ padding: var(--spacing-lg) 0;
}
}
diff --git a/src/app/layout.js b/src/app/layout.js
index e41b55c..4deab30 100644
--- a/src/app/layout.js
+++ b/src/app/layout.js
@@ -1,24 +1,30 @@
-import { Geist, Geist_Mono } from "next/font/google";
+import { Inter, Playfair_Display, Great_Vibes } from "next/font/google";
import "./globals.css";
-const geistSans = Geist({
- variable: "--font-geist-sans",
+const inter = Inter({
+ variable: "--font-inter",
subsets: ["latin"],
});
-const geistMono = Geist_Mono({
- variable: "--font-geist-mono",
+const playfair = Playfair_Display({
+ variable: "--font-playfair",
+ subsets: ["latin"],
+});
+
+const greatVibes = Great_Vibes({
+ variable: "--font-cursive",
+ weight: "400",
subsets: ["latin"],
});
export const metadata = {
- title: "Create Next App",
- description: "Generated by create next app",
+ title: "My Dosa Place Restaurant | Authentic & Vibrant",
+ description: "Experience the authentic taste of South India with our premium dosas.",
};
export default function RootLayout({ children }) {
return (
-
+
{children}
);
diff --git a/src/app/page.js b/src/app/page.js
index 290b6c3..0d01f16 100644
--- a/src/app/page.js
+++ b/src/app/page.js
@@ -1,66 +1,37 @@
-import Image from "next/image";
-import styles from "./page.module.css";
+import Navbar from '@/components/Navbar';
+import HeroSection from '@/components/HeroSection';
+import FavoritesSection from '@/components/FavoritesSection';
+import ExperienceSection from '@/components/ExperienceSection';
+import ProcessSection from '@/components/ProcessSection';
+import MenuSection from '@/components/MenuSection';
+import PromoSection from '@/components/PromoSection';
+import GallerySection from '@/components/GallerySection';
+import FeaturesSection from '@/components/FeaturesSection';
+import ReviewsSection from '@/components/ReviewsSection';
+import BlogSection from '@/components/BlogSection';
+import LocationSection from '@/components/LocationSection';
+import Footer from '@/components/Footer';
+import ScrollToTop from '@/components/ScrollToTop';
export default function Home() {
return (
-
-
-
-
-
To get started, edit the page.js file.
-
- Looking for a starting point or more instructions? Head over to{" "}
-
- Templates
- {" "}
- or the{" "}
-
- Learning
- {" "}
- center.
-
-
-
+ <>
+
+
+
+
+
+
+
+
+
+ {/* */}
+
+
+
-
+
+
+ >
);
}
diff --git a/src/app/page.module.css b/src/app/page.module.css
index 643fe27..983cd21 100644
--- a/src/app/page.module.css
+++ b/src/app/page.module.css
@@ -1,142 +1 @@
-.page {
- --background: #fafafa;
- --foreground: #fff;
-
- --text-primary: #000;
- --text-secondary: #666;
-
- --button-primary-hover: #383838;
- --button-secondary-hover: #f2f2f2;
- --button-secondary-border: #ebebeb;
-
- display: flex;
- flex: 1;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- font-family: var(--font-geist-sans);
- background-color: var(--background);
-}
-
-.main {
- display: flex;
- flex: 1;
- width: 100%;
- max-width: 800px;
- flex-direction: column;
- align-items: flex-start;
- justify-content: space-between;
- background-color: var(--foreground);
- padding: 120px 60px;
-}
-
-.intro {
- display: flex;
- flex-direction: column;
- align-items: flex-start;
- text-align: left;
- gap: 24px;
-}
-
-.intro h1 {
- max-width: 320px;
- font-size: 40px;
- font-weight: 600;
- line-height: 48px;
- letter-spacing: -2.4px;
- text-wrap: balance;
- color: var(--text-primary);
-}
-
-.intro p {
- max-width: 440px;
- font-size: 18px;
- line-height: 32px;
- text-wrap: balance;
- color: var(--text-secondary);
-}
-
-.intro a {
- font-weight: 500;
- color: var(--text-primary);
-}
-
-.ctas {
- display: flex;
- flex-direction: row;
- width: 100%;
- max-width: 440px;
- gap: 16px;
- font-size: 14px;
-}
-
-.ctas a {
- display: flex;
- justify-content: center;
- align-items: center;
- height: 40px;
- padding: 0 16px;
- border-radius: 128px;
- border: 1px solid transparent;
- transition: 0.2s;
- cursor: pointer;
- width: fit-content;
- font-weight: 500;
-}
-
-a.primary {
- background: var(--text-primary);
- color: var(--background);
- gap: 8px;
-}
-
-a.secondary {
- border-color: var(--button-secondary-border);
-}
-
-/* Enable hover only on non-touch devices */
-@media (hover: hover) and (pointer: fine) {
- a.primary:hover {
- background: var(--button-primary-hover);
- border-color: transparent;
- }
-
- a.secondary:hover {
- background: var(--button-secondary-hover);
- border-color: transparent;
- }
-}
-
-@media (max-width: 600px) {
- .main {
- padding: 48px 24px;
- }
-
- .intro {
- gap: 16px;
- }
-
- .intro h1 {
- font-size: 32px;
- line-height: 40px;
- letter-spacing: -1.92px;
- }
-}
-
-@media (prefers-color-scheme: dark) {
- .logo {
- filter: invert();
- }
-
- .page {
- --background: #000;
- --foreground: #000;
-
- --text-primary: #ededed;
- --text-secondary: #999;
-
- --button-primary-hover: #ccc;
- --button-secondary-hover: #1a1a1a;
- --button-secondary-border: #1a1a1a;
- }
-}
+/* page.module.css - minimal, page-level styles only */
diff --git a/src/components/BlogSection.js b/src/components/BlogSection.js
new file mode 100644
index 0000000..3509b36
--- /dev/null
+++ b/src/components/BlogSection.js
@@ -0,0 +1,55 @@
+import Image from 'next/image';
+import styles from './BlogSection.module.css';
+
+const posts = [
+ {
+ title: 'The Secret Behind Our Perfectly Crisp Dosas',
+ date: 'March 15, 2026',
+ excerpt: 'Discover the traditional fermentation process and the precise rice-to-lentil ratio that makes our dosas perfectly crisp every single time.',
+ image: '/images/hero-dosa.png',
+ },
+ {
+ title: '5 Health Benefits of South Indian Cuisine',
+ date: 'February 28, 2026',
+ excerpt: 'From gut-friendly fermented foods to antioxidant-rich spices, learn why South Indian food is as healthy as it is delicious.',
+ image: '/images/south-indian-thali.png',
+ },
+ {
+ title: 'A Guide to South Indian Spices',
+ date: 'February 10, 2026',
+ excerpt: 'Mustard seeds, curry leaves, and tamarind. We break down the essential flavor profiles that define authentic South Indian cooking.',
+ image: '/images/sambar.png',
+ }
+];
+
+export default function BlogSection() {
+ return (
+
+
+
π° Culinary Journal
+
Latest from Our Blog
+
+
+ {posts.map((post, index) => (
+
+
+
+
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/components/BlogSection.module.css b/src/components/BlogSection.module.css
new file mode 100644
index 0000000..595b020
--- /dev/null
+++ b/src/components/BlogSection.module.css
@@ -0,0 +1,120 @@
+.section {
+ padding: 80px 0;
+ background: #fff;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+.sectionTag {
+ text-align: center;
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: var(--color-secondary);
+ letter-spacing: 1px;
+ text-transform: uppercase;
+ margin-bottom: 0.5rem;
+}
+
+.sectionTitle {
+ text-align: center;
+ font-family: var(--font-serif);
+ font-size: 2.4rem;
+ color: var(--color-primary);
+ margin-bottom: 3rem;
+}
+
+.blogGrid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 2rem;
+}
+
+.blogCard {
+ background: #fff;
+ border-radius: 16px;
+ overflow: hidden;
+ box-shadow: 0 4px 15px rgba(0,0,0,0.05);
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
+}
+
+.blogCard:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 10px 25px rgba(0,0,0,0.1);
+}
+
+.imageWrap {
+ position: relative;
+ width: 100%;
+ height: 200px;
+}
+
+.image {
+ object-fit: cover;
+ transition: transform 0.4s ease;
+}
+
+.blogCard:hover .image {
+ transform: scale(1.05);
+}
+
+.content {
+ padding: 1.5rem;
+}
+
+.date {
+ font-size: 0.8rem;
+ color: var(--color-secondary);
+ font-weight: 600;
+ display: block;
+ margin-bottom: 0.5rem;
+}
+
+.title {
+ font-family: var(--font-serif);
+ font-size: 1.25rem;
+ color: var(--color-primary);
+ margin-bottom: 1rem;
+ line-height: 1.3;
+}
+
+.excerpt {
+ font-size: 0.9rem;
+ color: var(--color-text-medium);
+ line-height: 1.6;
+ margin-bottom: 1.5rem;
+}
+
+.readMore {
+ font-size: 0.9rem;
+ font-weight: 700;
+ color: var(--color-primary);
+ text-decoration: none;
+ transition: color 0.3s ease;
+}
+
+.readMore:hover {
+ color: var(--color-secondary);
+}
+
+@media (max-width: 992px) {
+ .blogGrid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+@media (max-width: 768px) {
+ .blogGrid {
+ grid-template-columns: 1fr;
+ gap: 1.5rem;
+ }
+}
+
+@media (max-width: 767px) {
+ .section {
+ padding: 40px 0;
+ }
+}
diff --git a/src/components/Button.js b/src/components/Button.js
new file mode 100644
index 0000000..c5a47e3
--- /dev/null
+++ b/src/components/Button.js
@@ -0,0 +1,10 @@
+import styles from './Button.module.css';
+
+export default function Button({ children, variant = 'primary', ...props }) {
+ const className = `${styles.button} ${styles[variant]}`;
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/components/Button.module.css b/src/components/Button.module.css
new file mode 100644
index 0000000..7517864
--- /dev/null
+++ b/src/components/Button.module.css
@@ -0,0 +1,34 @@
+.button {
+ padding: 0.8rem 2rem;
+ border-radius: 999px;
+ font-weight: 600;
+ font-size: 1rem;
+ transition: all 0.3s ease;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+}
+
+.primary {
+ background: var(--color-primary);
+ color: #fff;
+}
+
+.primary:hover {
+ background: var(--color-primary-dark);
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(249, 115, 22, 0.4);
+}
+
+.secondary {
+ background: transparent;
+ color: var(--color-text);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+.secondary:hover {
+ background: rgba(255, 255, 255, 0.05);
+ border-color: var(--color-primary);
+ transform: translateY(-2px);
+}
diff --git a/src/components/ExperienceSection.js b/src/components/ExperienceSection.js
new file mode 100644
index 0000000..56d291e
--- /dev/null
+++ b/src/components/ExperienceSection.js
@@ -0,0 +1,108 @@
+import Image from 'next/image';
+import styles from './ExperienceSection.module.css';
+
+export default function ExperienceSection() {
+ return (
+
+
+
+ {/* Left - Image Collage */}
+
+
+
+ {/* Decorative element - top left: leaf/spice SVG */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 25
+ Years Experience
+
+
+ {/* Decorative element - bottom right: dosa/plate SVG */}
+
+
+
+
+
+ {/* Right - Content */}
+
+
About Our Heritage
+
Experience & Expertise in Authentic Cuisine
+
+ Born from a deep passion for preserving South Indian culinary traditions, our restaurant brings you the true essence of heritage cooking. Every dish we serve is a testament to our decades of experience in crafting perfect, authentic flavors.
+
+
+
+
+
+ π¨βπ³
+
+
+
Passionate Chefs
+
+ Our master chefs have spent years perfecting the art of traditional South Indian cooking, bringing authentic recipes to life.
+
+
+
+
+
+
+ πΏ
+
+
+
Authentic Ingredients
+
+ We source the finest spices directly from India and prepare our signature batters fresh every single day.
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/ExperienceSection.module.css b/src/components/ExperienceSection.module.css
new file mode 100644
index 0000000..462a2f4
--- /dev/null
+++ b/src/components/ExperienceSection.module.css
@@ -0,0 +1,264 @@
+.section {
+ padding: 80px 0;
+ background: var(--color-bg-light);
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+.grid {
+ display: grid;
+ grid-template-columns: 1fr 1.1fr;
+ gap: 5rem;
+ align-items: center;
+}
+
+/* Left - Image Collage */
+.imageCol {
+ position: relative;
+ width: 100%;
+}
+
+.collageWrap {
+ position: relative;
+ width: 100%;
+ aspect-ratio: 1 / 1;
+ max-width: 500px;
+ margin: 0 auto;
+}
+
+.image {
+ object-fit: cover;
+ border-radius: 12px;
+}
+
+.imgLarge {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 60%;
+ height: 60%;
+ border-radius: 16px;
+ overflow: hidden;
+ box-shadow: 0 15px 35px rgba(0,0,0,0.1);
+ z-index: 2;
+ border: 4px solid #fff;
+}
+
+.imgSmallBottom {
+ position: absolute;
+ bottom: 0;
+ right: 15%;
+ width: 45%;
+ height: 45%;
+ border-radius: 12px;
+ overflow: hidden;
+ box-shadow: 0 15px 35px rgba(0,0,0,0.1);
+ z-index: 3;
+ border: 4px solid #fff;
+}
+
+.imgSmallLeft {
+ position: absolute;
+ top: 35%;
+ left: 0;
+ width: 50%;
+ height: 40%;
+ border-radius: 12px;
+ overflow: hidden;
+ box-shadow: 0 15px 35px rgba(0,0,0,0.1);
+ z-index: 4;
+ border: 4px solid #fff;
+}
+
+.experienceBadge {
+ position: absolute;
+ bottom: 15%;
+ left: 5%;
+ background: var(--color-primary);
+ padding: 1rem 1.5rem;
+ border-radius: 12px;
+ box-shadow: 0 10px 25px rgba(1, 77, 51, 0.25);
+ z-index: 5;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+}
+
+.badgeNumber {
+ font-family: var(--font-sans);
+ font-size: 2.2rem;
+ font-weight: 800;
+ color: #fff;
+ line-height: 1;
+ display: flex;
+ align-items: center;
+ gap: 0.2rem;
+}
+
+.badgeNumber::after {
+ content: '+';
+ font-size: 1.5rem;
+ color: var(--color-secondary);
+}
+
+.badgeText {
+ font-size: 0.8rem;
+ font-weight: 600;
+ color: rgba(255, 255, 255, 0.85);
+ margin-top: 0.3rem;
+}
+
+/* Decorative restaurant elements (leaf top, plate bottom) */
+.decorativeTop {
+ position: absolute;
+ top: -10px;
+ left: -15px;
+ z-index: 1;
+ opacity: 0.9;
+ animation: floatSlow 5s ease-in-out infinite;
+}
+
+.decorativeBottom {
+ position: absolute;
+ bottom: 20%;
+ right: -15px;
+ z-index: 1;
+ opacity: 0.9;
+ animation: floatSlow 5s ease-in-out infinite reverse;
+}
+
+@keyframes floatSlow {
+ 0%, 100% { transform: translateY(0); }
+ 50% { transform: translateY(-8px); }
+}
+
+
+/* Right - Content */
+.contentCol {
+ padding-right: 1rem;
+}
+
+.tag {
+ display: inline-block;
+ background: rgba(1, 77, 51, 0.1);
+ color: var(--color-primary);
+ padding: 0.4rem 1.2rem;
+ border-radius: 20px;
+ font-family: var(--font-sans);
+ font-size: 0.85rem;
+ font-weight: 700;
+ margin-bottom: 1.5rem;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ border: 1px solid rgba(1, 77, 51, 0.2);
+}
+
+.title {
+ font-family: var(--font-serif);
+ font-size: 2.5rem;
+ font-weight: 700;
+ color: var(--color-primary);
+ line-height: 1.2;
+ margin-bottom: 1.5rem;
+}
+
+.description {
+ font-size: 1.05rem;
+ line-height: 1.7;
+ color: var(--color-text-medium);
+ margin-bottom: 2.5rem;
+}
+
+.featureCards {
+ display: flex;
+ flex-direction: column;
+ gap: 1.5rem;
+}
+
+.featureCard {
+ display: flex;
+ align-items: flex-start;
+ gap: 1.2rem;
+ padding: 1.8rem;
+ border-radius: 12px;
+}
+
+.cardSolid {
+ background: rgba(1, 77, 51, 0.07);
+ border: 1px solid rgba(1, 77, 51, 0.15);
+}
+
+.cardOutline {
+ background: #fff;
+ border: 1px solid #e0e0e0;
+ box-shadow: 0 4px 15px rgba(0,0,0,0.02);
+}
+
+.iconWrap {
+ width: 50px;
+ height: 50px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.5rem;
+ flex-shrink: 0;
+}
+
+.cardSolid .iconWrap {
+ background: var(--color-primary);
+ box-shadow: 0 4px 10px rgba(1, 77, 51, 0.2);
+}
+
+.cardOutline .iconWrap {
+ background: var(--color-bg-light);
+}
+
+.cardContent {
+ flex: 1;
+}
+
+.cardTitle {
+ font-family: var(--font-sans);
+ font-size: 1.15rem;
+ font-weight: 700;
+ color: var(--color-text-dark);
+ margin-bottom: 0.5rem;
+}
+
+.cardDesc {
+ font-size: 0.9rem;
+ line-height: 1.5;
+ color: var(--color-text-medium);
+}
+
+@media (max-width: 1024px) {
+ .grid {
+ grid-template-columns: 1fr;
+ gap: 4rem;
+ }
+
+ .collageWrap {
+ margin-bottom: 2rem;
+ }
+}
+
+@media (max-width: 768px) {
+ .title {
+ font-size: 2rem;
+ }
+
+ .featureCard {
+ padding: 1.2rem;
+ }
+}
+
+@media (max-width: 767px) {
+ .section {
+ padding: 40px 0;
+ }
+}
diff --git a/src/components/FavoritesSection.js b/src/components/FavoritesSection.js
new file mode 100644
index 0000000..ab9e061
--- /dev/null
+++ b/src/components/FavoritesSection.js
@@ -0,0 +1,65 @@
+import Image from 'next/image';
+import styles from './FavoritesSection.module.css';
+
+const favorites = [
+ {
+ name: 'Crispy Masala',
+ subtitle: 'Classic',
+ image: '/images/new.png',
+ price: '12.99',
+ description: 'Aromatic, soft, and tender potato masala layered inside a crispy golden crepe infused with the flavors of South Indian spices...',
+ theme: 'green',
+ },
+ {
+ name: 'South Indian Thali',
+ subtitle: 'Royal',
+ image: '/images/new.png',
+ price: '24.99',
+ description: 'A complete feast featuring an array of curries, dal, rice, breads, and desserts served traditionally on a banana leaf...',
+ theme: 'yellow',
+ },
+ {
+ name: 'Authentic Sambar',
+ subtitle: 'Spicy',
+ image: '/images/new.png',
+ price: '8.99',
+ description: 'A flavorful lentil stew made with fresh vegetables, tamarind broth, and our signature roasted spice blend...',
+ theme: 'green',
+ },
+];
+
+export default function FavoritesSection() {
+ return (
+
+
+
+
Chef's Selection
+
Customer Favourites
+
+
+ {favorites.map((item, i) => (
+
+
+
+
+
+
+ {item.subtitle}
+ {/* ${item.price} */}
+
+
{item.name}
+
{item.description}
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/components/FavoritesSection.module.css b/src/components/FavoritesSection.module.css
new file mode 100644
index 0000000..18ff0dc
--- /dev/null
+++ b/src/components/FavoritesSection.module.css
@@ -0,0 +1,147 @@
+.section {
+ padding: 80px 0;
+ background: #fff;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+/* Header */
+.sectionHeader {
+ text-align: center;
+ margin-bottom: 3.5rem;
+}
+
+.sectionTag {
+ font-family: var(--font-sans);
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: var(--color-secondary);
+ letter-spacing: 1.5px;
+ text-transform: uppercase;
+ margin-bottom: 0.5rem;
+}
+
+.sectionTitle {
+ font-family: var(--font-serif);
+ font-size: 2.5rem;
+ color: var(--color-primary);
+}
+
+/* Grid */
+.grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 2rem;
+ /* padding-top: 3.5rem; */
+}
+
+/* Card */
+.card {
+ position: relative;
+ border-radius: 20px;
+ overflow: visible;
+ margin-top: 50px;
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
+}
+
+.card:hover {
+ transform: translateY(-8px);
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
+}
+
+/* Theme Colors */
+.green {
+ background-color: var(--color-primary);
+}
+
+.yellow {
+ background-color: var(--color-secondary);
+}
+
+/* Image */
+.imageWrap {
+ position: relative;
+ width: 100%;
+ height: 180px;
+ margin-top: -50px;
+ display: flex;
+ justify-content: center;
+ margin-bottom: 0.5rem;
+}
+
+.image {
+ width: auto;
+ height: 100%;
+ object-fit: contain;
+ filter: drop-shadow(0 15px 20px rgba(0, 0, 0, 0.35));
+ transition: transform 0.4s ease;
+}
+
+.card:hover .image {
+ transform: scale(1.06) rotate(2deg);
+}
+
+/* Card Body */
+.cardBody {
+ padding: 0.5rem 1.8rem 2rem;
+}
+
+/* Label row: subtitle tag + price side by side */
+.labelRow {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 0.5rem;
+}
+
+.subtitleTag {
+ font-family: var(--font-serif);
+ font-size: 1rem;
+ font-style: italic;
+ color: rgba(255, 255, 255, 0.85);
+ font-weight: 400;
+ letter-spacing: 0.5px;
+}
+
+.price {
+ font-family: var(--font-sans);
+ font-size: 1.2rem;
+ font-weight: 800;
+ color: #fff;
+}
+
+.cardTitle {
+ font-family: var(--font-serif);
+ font-size: 2rem;
+ font-weight: 700;
+ color: #fff;
+ line-height: 1.15;
+ margin-bottom: 1rem;
+}
+
+.description {
+ font-size: 0.9rem;
+ line-height: 1.6;
+ color: rgba(255, 255, 255, 0.82);
+}
+
+@media (max-width: 1024px) {
+ .grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+@media (max-width: 767px) {
+ .section {
+ padding: 40px 0;
+ }
+ .grid {
+ grid-template-columns: 1fr;
+ max-width: 400px;
+ margin: 0 auto;
+ }
+}
diff --git a/src/components/FeaturesSection.js b/src/components/FeaturesSection.js
new file mode 100644
index 0000000..2319485
--- /dev/null
+++ b/src/components/FeaturesSection.js
@@ -0,0 +1,44 @@
+import styles from './FeaturesSection.module.css';
+
+const features = [
+ {
+ icon: 'πΏ',
+ title: 'Fresh Ingredients',
+ description: 'We source only the freshest, locally available ingredients for authentic taste.',
+ },
+ {
+ icon: 'π',
+ title: 'Famous Recipes',
+ description: 'Time-honored recipes passed down through generations of South Indian kitchens.',
+ },
+ {
+ icon: 'πΆοΈ',
+ title: 'Pure Spices',
+ description: 'Hand-ground spices imported directly from the spice gardens of Kerala.',
+ },
+ {
+ icon: 'π',
+ title: 'Evening Specials',
+ description: 'Exclusive tiffin specials every evening with rotating seasonal menus.',
+ },
+];
+
+export default function FeaturesSection() {
+ return (
+
+
+
+ {features.map((feature, i) => (
+
+
+ {feature.icon}
+
+
{feature.title}
+
{feature.description}
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/components/FeaturesSection.module.css b/src/components/FeaturesSection.module.css
new file mode 100644
index 0000000..10698bd
--- /dev/null
+++ b/src/components/FeaturesSection.module.css
@@ -0,0 +1,78 @@
+.section {
+ padding: 80px 0;
+ background: var(--color-bg-light);
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+.grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 2rem;
+}
+
+.card {
+ text-align: center;
+ padding: 2rem 1.5rem;
+ border-radius: var(--border-radius-lg);
+ border: 1px solid #eee;
+ transition: all 0.3s ease;
+}
+
+.card:hover {
+ border-color: var(--color-primary);
+ box-shadow: var(--shadow-md);
+ transform: translateY(-4px);
+}
+
+.iconWrap {
+ width: 64px;
+ height: 64px;
+ margin: 0 auto 1.2rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: var(--color-bg-light);
+ border-radius: 50%;
+}
+
+.icon {
+ font-size: 1.8rem;
+}
+
+.cardTitle {
+ font-family: var(--font-serif);
+ font-size: 1.05rem;
+ color: var(--color-primary);
+ margin-bottom: 0.6rem;
+}
+
+.cardDesc {
+ font-size: 0.85rem;
+ color: var(--color-text-medium);
+ line-height: 1.6;
+}
+
+@media (max-width: 1024px) {
+ .grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+@media (max-width: 600px) {
+ .grid {
+ grid-template-columns: 1fr;
+ max-width: 360px;
+ margin: 0 auto;
+ }
+}
+
+@media (max-width: 767px) {
+ .section {
+ padding: 40px 0;
+ }
+}
diff --git a/src/components/Footer.js b/src/components/Footer.js
new file mode 100644
index 0000000..d8f872a
--- /dev/null
+++ b/src/components/Footer.js
@@ -0,0 +1,100 @@
+import Link from 'next/link';
+import styles from './Footer.module.css';
+
+export default function Footer() {
+ return (
+
+
+
+ {/* Column 1: Brand & Socials */}
+
+
+
πΏ
+
My Dosa Place
+
+
+ Bringing the authentic taste of South India to Waterloo since 1980.
+ Every dosa tells a story of tradition and flavor.
+
+
+
+
+ {/* Column 2: Quick Links */}
+
+
Quick Links
+
+ Home
+ About Us
+ Our Menu
+ Gallery
+ Contact Us
+
+
+
+ {/* Column 3: Menu Categories */}
+
+
Our Menu
+
+ Breakfast
+ Appetizerβs
+ Breads
+ Speciality Dosa
+ Lunch
+ Utthappamβs
+ BEVERAGES
+ Combos
+
+
+
+ {/* Column 4: Contact */}
+
+
Contact Info
+
+
+
Address
+
+ #922 ERB STREET WEST
+ ON N2T OC3
+ WATERLOO
+
+
+
+
+
Reservations
+
+ Phone: +1 (519) 888-7459
+ Email: mydosaplacewaterloo@gmail.com
+
+
+
+
+
Opening hours
+
+ Mon - Thu: 4pm-10pm
+ Fri - Sun: 11am-10pm
+
+
+
+
+
+ {/* Bottom Bar */}
+
+
+ Copyright 2026 Β© mydosarestruant. Powered by MetatronCube . All Right Reserved.
+
+
+
+
+ );
+}
diff --git a/src/components/Footer.module.css b/src/components/Footer.module.css
new file mode 100644
index 0000000..367c7ba
--- /dev/null
+++ b/src/components/Footer.module.css
@@ -0,0 +1,171 @@
+.footer {
+ background: var(--color-primary);
+ border-top: 1px solid rgba(255,255,255,0.1);
+ color: #fff;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+.grid {
+ display: grid;
+ grid-template-columns: 1.5fr 1fr 1fr 1.5fr;
+ gap: 3rem;
+ padding: 5rem 0 4rem;
+}
+
+/* Brand */
+.brand {
+ padding-right: 1rem;
+}
+
+.logo {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ text-decoration: none;
+ margin-bottom: 1.5rem;
+}
+
+.logoLeaf {
+ font-size: 1.5rem;
+}
+
+.logoText {
+ font-family: var(--font-serif);
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: #fff;
+}
+
+.brandDesc {
+ font-size: 0.95rem;
+ color: rgba(255, 255, 255, 0.85);
+ line-height: 1.6;
+ margin-bottom: 2rem;
+}
+
+.socials {
+ display: flex;
+ gap: 1rem;
+}
+
+.socialLink {
+ width: 40px;
+ height: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(255, 255, 255, 0.1);
+ color: #fff;
+ border-radius: 50%;
+ text-decoration: none;
+ transition: all 0.3s ease;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+.socialLink:hover {
+ background: var(--color-secondary);
+ border-color: var(--color-secondary);
+ transform: translateY(-3px);
+}
+
+/* Columns */
+.column {
+ padding-top: 0.5rem;
+}
+
+.columnTitle {
+ font-family: var(--font-serif);
+ font-size: 1.3rem;
+ color: var(--color-secondary);
+ margin-bottom: 1.5rem;
+}
+
+.linkList {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.linkList li {
+ margin-bottom: 0.8rem;
+}
+
+.linkList a {
+ font-size: 0.95rem;
+ color: rgba(255, 255, 255, 0.85);
+ text-decoration: none;
+ transition: color 0.3s ease;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.linkList a::before {
+ content: "βΊ";
+ font-size: 1.2rem;
+ color: var(--color-secondary);
+}
+
+.linkList a:hover {
+ color: #fff;
+}
+
+/* Contact Info Column */
+.contactItem {
+ margin-bottom: 1.2rem;
+}
+
+.contactLabel {
+ font-size: 0.95rem;
+ font-weight: 700;
+ color: #fff;
+ margin-bottom: 0.2rem;
+}
+
+.contactText {
+ font-size: 0.9rem;
+ color: rgba(255, 255, 255, 0.85);
+ line-height: 1.6;
+}
+
+/* Bottom Bar */
+.bottomBar {
+ text-align: center;
+ padding: 2rem 0;
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+.copyright {
+ font-size: 0.9rem;
+ color: rgba(255, 255, 255, 0.7);
+}
+
+.poweredLink {
+ color: var(--color-secondary);
+ text-decoration: none;
+ font-weight: 600;
+ transition: color 0.3s ease;
+}
+
+.poweredLink:hover {
+ color: #fff;
+}
+
+@media (max-width: 1024px) {
+ .grid {
+ grid-template-columns: 1fr 1fr;
+ gap: 4rem 2rem;
+ }
+}
+
+@media (max-width: 600px) {
+ .grid {
+ grid-template-columns: 1fr;
+ gap: 3rem;
+ }
+}
diff --git a/src/components/GallerySection.js b/src/components/GallerySection.js
new file mode 100644
index 0000000..139f543
--- /dev/null
+++ b/src/components/GallerySection.js
@@ -0,0 +1,42 @@
+import Image from 'next/image';
+import styles from './GallerySection.module.css';
+
+const images = [
+ '/images/hero-dosa.png',
+ '/images/south-indian-thali.png',
+ '/images/sambar.png',
+ '/images/crispy-masala.png',
+ '/images/hero-dosa.png',
+ '/images/story-heritage.png'
+];
+
+export default function GallerySection() {
+ return (
+
+
+
πΈ Follow Our Journey
+
Our Culinary Gallery
+
+
+ {images.map((src, index) => (
+
+ ))}
+
+
+
+
+
+ );
+}
diff --git a/src/components/GallerySection.module.css b/src/components/GallerySection.module.css
new file mode 100644
index 0000000..b3cc962
--- /dev/null
+++ b/src/components/GallerySection.module.css
@@ -0,0 +1,123 @@
+.section {
+ padding: 80px 0;
+ background: #fff;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+.sectionTag {
+ text-align: center;
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: var(--color-secondary);
+ letter-spacing: 1px;
+ text-transform: uppercase;
+ margin-bottom: 0.5rem;
+}
+
+.sectionTitle {
+ text-align: center;
+ font-family: var(--font-serif);
+ font-size: 2.4rem;
+ color: var(--color-primary);
+ margin-bottom: 3rem;
+}
+
+.galleryGrid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 1.5rem;
+ margin-bottom: 3rem;
+}
+
+.galleryItem {
+ position: relative;
+ width: 100%;
+ aspect-ratio: 1 / 1;
+ border-radius: 12px;
+ overflow: hidden;
+ cursor: pointer;
+}
+
+.image {
+ object-fit: cover;
+ transition: transform 0.4s ease;
+}
+
+.galleryItem:hover .image {
+ transform: scale(1.08);
+}
+
+.overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(1, 77, 51, 0.6);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ opacity: 0;
+ transition: opacity 0.3s ease;
+}
+
+.galleryItem:hover .overlay {
+ opacity: 1;
+}
+
+.icon {
+ font-size: 2rem;
+ color: #fff;
+ transform: scale(0.5);
+ transition: transform 0.3s ease;
+}
+
+.galleryItem:hover .icon {
+ transform: scale(1);
+}
+
+.centerBtn {
+ text-align: center;
+}
+
+.btnInsta {
+ display: inline-block;
+ padding: 0.8rem 2rem;
+ background-color: var(--color-secondary);
+ color: #fff;
+ font-size: 0.95rem;
+ font-weight: 700;
+ border-radius: 30px;
+ text-decoration: none;
+ transition: all 0.3s ease;
+}
+
+.btnInsta:hover {
+ background-color: var(--color-secondary-hover);
+ transform: translateY(-2px);
+ box-shadow: 0 4px 15px rgba(217, 156, 67, 0.4);
+}
+
+@media (max-width: 768px) {
+ .galleryGrid {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 1rem;
+ }
+}
+
+@media (max-width: 480px) {
+ .galleryGrid {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media (max-width: 767px) {
+ .section {
+ padding: 40px 0;
+ }
+}
diff --git a/src/components/HeroSection.js b/src/components/HeroSection.js
new file mode 100644
index 0000000..b6ec9fa
--- /dev/null
+++ b/src/components/HeroSection.js
@@ -0,0 +1,107 @@
+"use client";
+
+import { useState, useEffect } from 'react';
+import styles from './HeroSection.module.css';
+
+const slides = [
+ {
+ image: '/images/hero-dosa.png',
+ title: 'Authentic South Indian',
+ highlight: 'Vegetarian Flavours',
+ subtitle: 'Welcome to My Dosa Place, where we bring you traditional South Indian cuisine crafted with passion. Every dish tells a story of heritage, flavor, and love.',
+ primaryBtn: 'Explore Menu π½οΈ',
+ secondaryBtn: 'Book a Table',
+ },
+ {
+ image: '/images/south-indian-thali.png',
+ title: 'Experience the Royal',
+ highlight: 'South Indian Thali',
+ subtitle: 'A magnificent feast of 21 authentic items served exclusively on weekends. A true celebration of Southern culinary diversity.',
+ primaryBtn: 'View Weekend Specials',
+ secondaryBtn: 'Reserve Now',
+ },
+ {
+ image: '/images/crispy-masala.png',
+ title: 'Crispy, Golden &',
+ highlight: 'Perfectly Spiced',
+ subtitle: 'Taste our signature dosas, made fresh every day with our heritage batter and secret spice blends passed down through generations.',
+ primaryBtn: 'Order Online',
+ secondaryBtn: 'Our Story',
+ }
+];
+
+export default function HeroSection() {
+ const [currentSlide, setCurrentSlide] = useState(0);
+
+ useEffect(() => {
+ const timer = setInterval(() => {
+ setCurrentSlide((prev) => (prev + 1) % slides.length);
+ }, 5000); // Change slide every 5 seconds
+ return () => clearInterval(timer);
+ }, []);
+
+ return (
+
+ {slides.map((slide, index) => (
+
+ ))}
+
+
+ {slides.map((slide, index) => (
+
+
+ {slide.title}
+ {slide.highlight} in Waterloo
+
+
+ {slide.subtitle}
+
+
+
+ ))}
+
+
+ β
+ 4.9 Rating
+
+
+
+ π
+ 100% Vegetarian
+
+
+
+ π
+ Open 7 Days
+
+
+
+ {/* Slide Indicators */}
+
+ {slides.map((_, index) => (
+ setCurrentSlide(index)}
+ aria-label={`Go to slide ${index + 1}`}
+ />
+ ))}
+
+
+
+ );
+}
diff --git a/src/components/HeroSection.module.css b/src/components/HeroSection.module.css
new file mode 100644
index 0000000..949a21f
--- /dev/null
+++ b/src/components/HeroSection.module.css
@@ -0,0 +1,230 @@
+.hero {
+ position: relative;
+ min-height: 92vh;
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+ padding: 120px 5% 60px;
+ overflow: hidden;
+ background-color: #000;
+}
+
+.slideBg {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-position: center;
+ background-size: cover;
+ background-repeat: no-repeat;
+ opacity: 0;
+ transition: opacity 1.5s ease-in-out, transform 8s ease-in-out;
+ transform: scale(1.05);
+ z-index: 0;
+}
+
+.activeBg {
+ opacity: 1;
+ transform: scale(1);
+}
+
+.heroOverlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(
+ 105deg,
+ rgba(1, 77, 51, 0.92) 0%,
+ rgba(1, 77, 51, 0.75) 45%,
+ rgba(1, 77, 51, 0.3) 70%,
+ transparent 100%
+ );
+ z-index: 1;
+}
+
+.heroContent {
+ position: relative;
+ z-index: 2;
+ max-width: 620px;
+ min-height: 400px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+}
+
+.textContent {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ opacity: 0;
+ transform: translateY(20px);
+ transition: opacity 0.8s ease, transform 0.8s ease;
+ pointer-events: none;
+}
+
+.activeText {
+ position: relative;
+ opacity: 1;
+ transform: translateY(0);
+ pointer-events: auto;
+}
+
+.heroTitle {
+ font-family: var(--font-serif);
+ font-size: clamp(2.2rem, 4.5vw, 3.4rem);
+ font-weight: 700;
+ color: #fff;
+ line-height: 1.15;
+ margin-bottom: 1.2rem;
+}
+
+.highlight {
+ color: var(--color-secondary);
+}
+
+.heroSubtitle {
+ font-size: 1rem;
+ color: rgba(255, 255, 255, 0.85);
+ line-height: 1.7;
+ margin-bottom: 2rem;
+ max-width: 520px;
+}
+
+.heroActions {
+ display: flex;
+ gap: 1rem;
+ margin-bottom: 2.5rem;
+ flex-wrap: wrap;
+}
+
+.btnPrimary {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.85rem 2rem;
+ background: var(--color-secondary);
+ color: #fff;
+ font-weight: 600;
+ font-size: 0.95rem;
+ border-radius: var(--border-radius-full);
+ text-decoration: none;
+ transition: all 0.3s ease;
+}
+
+.btnPrimary:hover {
+ background: var(--color-secondary-hover);
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(217, 156, 67, 0.4);
+}
+
+.btnSecondary {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.85rem 2rem;
+ background: transparent;
+ color: #fff;
+ font-weight: 600;
+ font-size: 0.95rem;
+ border: 2px solid rgba(255, 255, 255, 0.5);
+ border-radius: var(--border-radius-full);
+ text-decoration: none;
+ transition: all 0.3s ease;
+}
+
+.btnSecondary:hover {
+ border-color: #fff;
+ background: rgba(255, 255, 255, 0.1);
+ transform: translateY(-2px);
+}
+
+.heroMeta {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ flex-wrap: wrap;
+ margin-top: auto;
+ padding-top: 2rem;
+}
+
+.metaItem {
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+ color: rgba(255, 255, 255, 0.9);
+ font-size: 0.9rem;
+ font-weight: 500;
+}
+
+.metaIcon {
+ font-size: 1.1rem;
+}
+
+.metaDivider {
+ width: 1px;
+ height: 20px;
+ background: rgba(255, 255, 255, 0.3);
+}
+
+/* Indicators */
+.indicators {
+ position: absolute;
+ bottom: -40px;
+ left: 0;
+ display: flex;
+ gap: 0.5rem;
+}
+
+.indicator {
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.3);
+ border: none;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ padding: 0;
+}
+
+.activeIndicator {
+ background: var(--color-secondary);
+ width: 25px;
+ border-radius: 10px;
+}
+
+@media (max-width: 768px) {
+ .hero {
+ min-height: 80vh;
+ padding: 100px 1.5rem 60px;
+ align-items: flex-end;
+ }
+
+ .heroOverlay {
+ background: linear-gradient(
+ to top,
+ rgba(1, 77, 51, 0.95) 0%,
+ rgba(1, 77, 51, 0.6) 60%,
+ transparent 100%
+ );
+ }
+
+ .heroTitle {
+ font-size: 2rem;
+ }
+
+ .metaDivider {
+ display: none;
+ }
+
+ .heroMeta {
+ gap: 0.75rem;
+ }
+
+ .heroContent {
+ min-height: 350px;
+ }
+}
diff --git a/src/components/LocationSection.js b/src/components/LocationSection.js
new file mode 100644
index 0000000..2c37fe2
--- /dev/null
+++ b/src/components/LocationSection.js
@@ -0,0 +1,103 @@
+import Image from 'next/image';
+import styles from './LocationSection.module.css';
+
+export default function LocationSection() {
+ return (
+
+ );
+}
diff --git a/src/components/LocationSection.module.css b/src/components/LocationSection.module.css
new file mode 100644
index 0000000..d53caf1
--- /dev/null
+++ b/src/components/LocationSection.module.css
@@ -0,0 +1,234 @@
+.section {
+ padding: 80px 0;
+ background: #f3f4f6;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+.header {
+ text-align: center;
+ margin-bottom: 3rem;
+}
+
+.sectionTag {
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: var(--color-secondary);
+ letter-spacing: 1px;
+ text-transform: uppercase;
+ margin-bottom: 0.5rem;
+}
+
+.sectionTitle {
+ font-family: var(--font-serif);
+ font-size: 2.5rem;
+ color: var(--color-primary);
+ margin-bottom: 0.5rem;
+}
+
+.sectionDesc {
+ font-size: 1rem;
+ color: var(--color-text-medium);
+ max-width: 500px;
+ margin: 0 auto;
+}
+
+.premiumCard {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ background: #fff;
+ border-radius: 24px;
+ overflow: hidden;
+ box-shadow: 0 20px 50px rgba(0,0,0,0.08);
+ min-height: 600px;
+}
+
+/* Left - Image & Glass Info */
+.imagePane {
+ position: relative;
+ display: flex;
+ align-items: flex-end;
+ padding: 3rem;
+ overflow: hidden;
+}
+
+.bgImage {
+ object-fit: cover;
+ z-index: 1;
+}
+
+.imageOverlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(to top, rgba(1, 77, 51, 0.9) 0%, rgba(1, 77, 51, 0.4) 100%);
+ z-index: 2;
+}
+
+.glassInfo {
+ position: relative;
+ z-index: 3;
+ width: 100%;
+ background: rgba(255, 255, 255, 0.1);
+ backdrop-filter: blur(12px);
+ -webkit-backdrop-filter: blur(12px);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 16px;
+ padding: 2rem;
+ color: #fff;
+}
+
+.infoItem {
+ display: flex;
+ gap: 1.2rem;
+ margin-bottom: 1.5rem;
+}
+
+.infoItem:last-child {
+ margin-bottom: 0;
+}
+
+.infoIcon {
+ width: 45px;
+ height: 45px;
+ background: var(--color-secondary);
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.2rem;
+ flex-shrink: 0;
+ color: #fff;
+}
+
+.infoLabel {
+ font-family: var(--font-serif);
+ font-size: 1.1rem;
+ margin-bottom: 0.3rem;
+ color: #fff;
+}
+
+.infoText {
+ font-size: 0.95rem;
+ line-height: 1.5;
+ color: rgba(255, 255, 255, 0.9);
+}
+
+/* Right - Form */
+.formPane {
+ padding: 4rem 3rem;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+}
+
+.formTitle {
+ font-family: var(--font-serif);
+ font-size: 2rem;
+ color: var(--color-primary);
+ margin-bottom: 0.5rem;
+}
+
+.formSubtitle {
+ font-size: 0.95rem;
+ color: var(--color-text-medium);
+ margin-bottom: 2rem;
+ line-height: 1.6;
+}
+
+.form {
+ width: 100%;
+}
+
+.formRow {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 1rem;
+}
+
+.formGroup {
+ margin-bottom: 1.5rem;
+}
+
+.label {
+ display: block;
+ font-size: 0.85rem;
+ font-weight: 700;
+ color: var(--color-text-dark);
+ margin-bottom: 0.6rem;
+}
+
+.input, .textarea {
+ width: 100%;
+ padding: 0.9rem 1rem;
+ border: 1px solid #e0e0e0;
+ background: #fdfdfd;
+ border-radius: 8px;
+ font-family: inherit;
+ font-size: 0.95rem;
+ transition: all 0.3s ease;
+}
+
+.input:focus, .textarea:focus {
+ outline: none;
+ border-color: var(--color-secondary);
+ background: #fff;
+ box-shadow: 0 0 0 4px rgba(1, 77, 51, 0.1);
+}
+
+.textarea {
+ resize: vertical;
+}
+
+.btnSubmit {
+ width: 100%;
+ padding: 1rem;
+ background: var(--color-primary);
+ color: #fff;
+ border: none;
+ border-radius: 8px;
+ font-size: 1rem;
+ font-weight: 700;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ margin-top: 0.5rem;
+}
+
+.btnSubmit:hover {
+ background: var(--color-primary-light);
+ transform: translateY(-2px);
+ box-shadow: 0 5px 15px rgba(1, 77, 51, 0.2);
+}
+
+@media (max-width: 992px) {
+ .premiumCard {
+ grid-template-columns: 1fr;
+ }
+ .imagePane {
+ min-height: 500px;
+ }
+}
+
+@media (max-width: 600px) {
+ .formRow {
+ grid-template-columns: 1fr;
+ }
+ .imagePane {
+ padding: 1.5rem;
+ }
+ .formPane {
+ padding: 2.5rem 1.5rem;
+ }
+}
+
+@media (max-width: 767px) {
+ .section {
+ padding: 40px 0;
+ }
+}
diff --git a/src/components/MenuSection.js b/src/components/MenuSection.js
new file mode 100644
index 0000000..3401685
--- /dev/null
+++ b/src/components/MenuSection.js
@@ -0,0 +1,53 @@
+import Image from 'next/image';
+import styles from './MenuSection.module.css';
+
+const menuItems = [
+ { name: 'Classic Plain Dosa', desc: 'Thin crispy crepe made from fermented rice & lentil batter', price: '$8.99', image: '/images/hero-dosa.png' },
+ { name: 'South Indian Thali', desc: 'A royal feast featuring an array of curries, dal, rice & dessert', price: '$24.99', image: '/images/south-indian-thali.png' },
+ { name: 'Authentic Sambar', desc: 'Flavorful lentil stew with fresh vegetables & tamarind', price: '$8.99', image: '/images/sambar.png' },
+ { name: 'Crispy Masala Dosa', desc: 'Classic dosa filled with spiced potato curry', price: '$12.99', image: '/images/crispy-masala.png' },
+ { name: 'Medu Vada', desc: 'Crispy fried lentil donuts served with coconut chutney', price: '$9.99', image: '/images/new.png' },
+ { name: 'Mysore Masala Dosa', desc: 'Spicy red chutney spread with potato filling inside a crispy dosa', price: '$13.99', image: '/images/hero-dosa.png' },
+];
+
+export default function MenuSection() {
+ return (
+
+ );
+}
diff --git a/src/components/MenuSection.module.css b/src/components/MenuSection.module.css
new file mode 100644
index 0000000..e53a9e1
--- /dev/null
+++ b/src/components/MenuSection.module.css
@@ -0,0 +1,138 @@
+.section {
+ padding: 80px 0;
+ background: var(--color-bg-light);
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+.sectionTag {
+ text-align: center;
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: var(--color-secondary);
+ letter-spacing: 1px;
+ text-transform: uppercase;
+ margin-bottom: 0.5rem;
+}
+
+.sectionTitle {
+ text-align: center;
+ font-family: var(--font-serif);
+ font-size: 2.2rem;
+ color: var(--color-primary);
+ margin-bottom: 3.5rem;
+}
+
+/* Menu Grid */
+.menuGrid {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 2rem 3rem;
+ margin-bottom: 3.5rem;
+}
+
+.menuItem {
+ display: flex;
+ gap: 1.2rem;
+ padding: 1rem 0;
+ border-bottom: 1px solid #e8e8e8;
+ align-items: center;
+}
+
+.menuItemImageWrap {
+ flex-shrink: 0;
+ width: 80px;
+ height: 80px;
+ border-radius: 50%;
+ overflow: hidden;
+ box-shadow: 0 4px 10px rgba(0,0,0,0.1);
+ border: 2px solid #fff;
+}
+
+.menuItemImage {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+.menuItemContent {
+ flex: 1;
+}
+
+.menuItemTop {
+ display: flex;
+ align-items: baseline;
+ gap: 0.5rem;
+}
+
+.itemName {
+ font-family: var(--font-sans);
+ font-size: 1.05rem;
+ font-weight: 700;
+ color: var(--color-text-dark);
+ white-space: nowrap;
+}
+
+.dots {
+ flex: 1;
+ border-bottom: 2px dotted #ccc;
+ min-width: 20px;
+ margin-bottom: 4px;
+}
+
+.itemPrice {
+ font-size: 1.05rem;
+ font-weight: 700;
+ color: var(--color-primary);
+ white-space: nowrap;
+}
+
+.itemDesc {
+ font-size: 0.85rem;
+ color: var(--color-text-medium);
+ margin-top: 0.4rem;
+ line-height: 1.5;
+}
+
+/* CTA */
+.center {
+ display: flex;
+ justify-content: center;
+}
+
+.btnViewFull {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.8rem 2rem;
+ background: var(--color-primary);
+ color: #fff;
+ font-size: 0.9rem;
+ font-weight: 600;
+ border-radius: var(--border-radius-full);
+ text-decoration: none;
+ transition: all 0.3s ease;
+}
+
+.btnViewFull:hover {
+ background: var(--color-primary-light);
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(1, 77, 51, 0.3);
+}
+
+@media (max-width: 768px) {
+ .menuGrid {
+ grid-template-columns: 1fr;
+ gap: 1.5rem;
+ }
+}
+
+@media (max-width: 767px) {
+ .section {
+ padding: 40px 0;
+ }
+}
diff --git a/src/components/Navbar.js b/src/components/Navbar.js
new file mode 100644
index 0000000..4085074
--- /dev/null
+++ b/src/components/Navbar.js
@@ -0,0 +1,37 @@
+import Link from 'next/link';
+import styles from './Navbar.module.css';
+
+export default function Navbar() {
+ return (
+
+
+ {/* Logo */}
+
+
πΏ
+
My Dosa Place
+
+
+ {/* Navigation Links */}
+
+ Home
+ About
+ Menu
+ Specials
+ Catering
+ Gallery
+ Contact
+
+
+ {/* Right Actions */}
+
+
+ π Call Now
+
+
+ Order Online
+
+
+
+
+ );
+}
diff --git a/src/components/Navbar.module.css b/src/components/Navbar.module.css
new file mode 100644
index 0000000..0403256
--- /dev/null
+++ b/src/components/Navbar.module.css
@@ -0,0 +1,127 @@
+.navbar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ z-index: 1000;
+ background-color: #fff;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+ border-bottom: 1px solid #e8e8e8;
+}
+
+.navInner {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ height: 64px;
+}
+
+.logo {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ text-decoration: none;
+ color: var(--color-primary);
+}
+
+.logoLeaf {
+ font-size: 1.4rem;
+}
+
+.logoText {
+ font-family: var(--font-serif);
+ font-size: 1.35rem;
+ font-weight: 700;
+ color: var(--color-primary);
+}
+
+.navLinks {
+ display: flex;
+ align-items: center;
+ gap: 1.8rem;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.navLink {
+ font-size: 0.9rem;
+ font-weight: 500;
+ color: var(--color-text-medium);
+ text-decoration: none;
+ transition: color 0.25s ease;
+ position: relative;
+}
+
+.navLink:hover {
+ color: var(--color-primary);
+}
+
+.navLink::after {
+ content: '';
+ position: absolute;
+ bottom: -4px;
+ left: 0;
+ width: 0;
+ height: 2px;
+ background: var(--color-secondary);
+ transition: width 0.3s ease;
+}
+
+.navLink:hover::after {
+ width: 100%;
+}
+
+.navActions {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+}
+
+.btnCall {
+ font-size: 0.85rem;
+ font-weight: 500;
+ color: var(--color-primary);
+ border: 1px solid var(--color-primary);
+ padding: 0.5rem 1rem;
+ border-radius: var(--border-radius-full);
+ text-decoration: none;
+ transition: all 0.25s ease;
+}
+
+.btnCall:hover {
+ border-color: var(--color-primary);
+ background: rgba(1, 77, 51, 0.06);
+}
+
+.btnOrder {
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: var(--color-primary);
+ background: var(--color-secondary);
+ padding: 0.55rem 1.2rem;
+ border-radius: var(--border-radius-full);
+ text-decoration: none;
+ transition: all 0.25s ease;
+}
+
+.btnOrder:hover {
+ background: var(--color-secondary-hover);
+ transform: translateY(-1px);
+ box-shadow: 0 4px 12px rgba(217, 156, 67, 0.4);
+}
+
+@media (max-width: 1024px) {
+ .navLinks {
+ display: none;
+ }
+}
+
+@media (max-width: 600px) {
+ .btnCall {
+ display: none;
+ }
+}
diff --git a/src/components/ProcessSection.js b/src/components/ProcessSection.js
new file mode 100644
index 0000000..1d076a0
--- /dev/null
+++ b/src/components/ProcessSection.js
@@ -0,0 +1,43 @@
+import Image from 'next/image';
+import styles from './ProcessSection.module.css';
+
+export default function ProcessSection() {
+ return (
+
+
+
+ {/* Left - Dark Green Card with Overlapping Image */}
+
+
+
My Dosa Place Restaurant
+
+ Born from a passion for preserving the culinary heritage of South India, My Dosa Place brings authentic flavors from the kitchens of Tamil Nadu and Karnataka right to Waterloo.
+
+
+ Explore Menu
+
+
+
+
+
+
+
+ {/* Right - Text Content */}
+
+ {/*
1
*/}
+
Authentic Flavors Prepared Specially for You
+
+ Every dosa is crafted with love using traditional recipes passed down through generations. We source the finest ingredients and grind our own batter fresh every day to ensure that perfect crispy, golden crepe. Experience the true taste of tradition in every bite.
+
+
+
+
+
+ );
+}
diff --git a/src/components/ProcessSection.module.css b/src/components/ProcessSection.module.css
new file mode 100644
index 0000000..a8b28f7
--- /dev/null
+++ b/src/components/ProcessSection.module.css
@@ -0,0 +1,166 @@
+.section {
+ padding: 80px 0;
+ background: #fff;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+.grid {
+ display: grid;
+ grid-template-columns: 1.1fr 0.9fr;
+ gap: 6rem;
+ align-items: center;
+}
+
+/* Left - Dark Green Card */
+.leftCard {
+ background-color: var(--color-primary); /* #014d33 */
+ border-radius: 20px;
+ position: relative;
+ display: flex;
+ align-items: stretch;
+ min-height: 380px;
+}
+
+.cardContent {
+ padding: 3.5rem 3rem;
+ width: 55%;
+ max-width: 400px;
+ color: #fff;
+ z-index: 2;
+}
+
+.cardTitle {
+ font-family: var(--font-serif);
+ font-size: 2.4rem;
+ line-height: 1.2;
+ margin-bottom: 1.5rem;
+ color: #fff;
+}
+
+.cardDescription {
+ font-size: 0.95rem;
+ line-height: 1.6;
+ color: rgba(255, 255, 255, 0.85);
+ margin-bottom: 2.5rem;
+}
+
+.btnExplore {
+ display: inline-block;
+ background-color: var(--color-secondary);
+ color: #fff;
+ padding: 0.8rem 2rem;
+ border-radius: 30px;
+ font-size: 0.95rem;
+ font-weight: 700;
+ text-decoration: none;
+ transition: all 0.3s ease;
+}
+
+.btnExplore:hover {
+ background-color: var(--color-secondary-hover);
+ transform: translateY(-2px);
+ box-shadow: 0 4px 15px rgba(217, 156, 67, 0.4);
+}
+
+.cardImageWrap {
+ position: absolute;
+ right: -70px;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 280px;
+ height: 85%;
+ border-radius: 16px;
+ overflow: hidden;
+ box-shadow: 0 15px 30px rgba(0,0,0,0.3);
+ z-index: 3;
+}
+
+.cardImage {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ display: block;
+}
+
+/* Right - Text Content */
+.rightContent {
+ padding-right: 2rem;
+}
+
+.stepCircle {
+ width: 40px;
+ height: 40px;
+ background-color: var(--color-secondary);
+ color: #fff;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.2rem;
+ font-weight: 700;
+ margin-bottom: 1.5rem;
+}
+
+.rightTitle {
+ font-family: var(--font-serif);
+ font-size: 2.4rem;
+ color: var(--color-primary);
+ line-height: 1.2;
+ margin-bottom: 1.5rem;
+}
+
+.rightDescription {
+ font-size: 1.05rem;
+ color: var(--color-text-medium);
+ line-height: 1.8;
+}
+
+@media (max-width: 1024px) {
+ .grid {
+ grid-template-columns: 1fr;
+ gap: 4rem;
+ }
+
+ .leftCard {
+ margin-right: 40px;
+ }
+}
+
+@media (max-width: 768px) {
+ .leftCard {
+ flex-direction: column;
+ margin-right: 0;
+ min-height: auto;
+ }
+
+ .cardContent {
+ width: 100%;
+ padding: 2.5rem 2rem 150px;
+ }
+
+ .cardImageWrap {
+ position: absolute;
+ right: 50%;
+ transform: translateX(50%);
+ bottom: -60px;
+ top: auto;
+ width: 85%;
+ height: 200px;
+ }
+
+ .rightContent {
+ padding-right: 0;
+ margin-top: 3rem;
+ }
+}
+
+@media (max-width: 767px) {
+ .section {
+ padding: 40px 0;
+ }
+}
diff --git a/src/components/PromoSection.js b/src/components/PromoSection.js
new file mode 100644
index 0000000..0d4edb6
--- /dev/null
+++ b/src/components/PromoSection.js
@@ -0,0 +1,28 @@
+import styles from './PromoSection.module.css';
+
+export default function PromoSection() {
+ return (
+
+
+
+
+
WEEKEND SPECIAL
+
Royal South Indian Thali
+
+ A limited edition 21-item feast served exclusively on Saturdays and
+ Sundays. Experience the true diversity of Southern flavours in one
+ sitting.
+
+
+ π 12:00 PM - 4:00 PM
+ β’
+ π΅ $24.99 Per Person
+
+
+ Reserve for This Weekend
+
+
+
+
+ );
+}
diff --git a/src/components/PromoSection.module.css b/src/components/PromoSection.module.css
new file mode 100644
index 0000000..bd5ca73
--- /dev/null
+++ b/src/components/PromoSection.module.css
@@ -0,0 +1,133 @@
+.section {
+ position: relative;
+ padding: 80px 0;
+ background-image: url('/images/hero-dosa.png');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+ overflow: hidden;
+ text-align: center;
+}
+
+.overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(1, 77, 51, 0.88);
+ z-index: 1;
+}
+
+.container {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+ position: relative;
+ z-index: 2;
+}
+
+.content {
+ color: #fff;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.pill {
+ background-color: #f7dfaf; /* Lighter gold for better contrast on green */
+ color: #8c5b1b;
+ font-size: 0.75rem;
+ font-weight: 800;
+ padding: 0.4rem 1rem;
+ border-radius: var(--border-radius-full);
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ margin-bottom: 1.5rem;
+ display: inline-block;
+}
+
+.title {
+ font-family: var(--font-serif);
+ font-size: 3rem;
+ font-weight: 700;
+ color: #fff;
+ margin-bottom: 1.2rem;
+ line-height: 1.2;
+}
+
+.description {
+ font-size: 1.1rem;
+ color: rgba(255, 255, 255, 0.95);
+ line-height: 1.6;
+ margin-bottom: 2rem;
+ max-width: 600px;
+}
+
+.details {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 1.2rem;
+ margin-bottom: 3rem;
+ flex-wrap: wrap;
+}
+
+.detailItem {
+ font-size: 1rem;
+ font-weight: 600;
+ color: #fff;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.detailDivider {
+ color: #f7dfaf;
+ font-weight: bold;
+}
+
+.btnReserve {
+ display: inline-block;
+ padding: 1rem 2.5rem;
+ background: #fff;
+ color: var(--color-primary);
+ font-size: 1rem;
+ font-weight: 700;
+ border-radius: var(--border-radius-full);
+ text-decoration: none;
+ transition: all 0.3s ease;
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
+}
+
+.btnReserve:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
+ background: #f8f8f8;
+}
+
+@media (max-width: 768px) {
+ .title {
+ font-size: 2.2rem;
+ }
+
+ .description {
+ font-size: 1rem;
+ }
+
+ .details {
+ flex-direction: column;
+ gap: 0.8rem;
+ margin-bottom: 2rem;
+ }
+
+ .detailDivider {
+ display: none;
+ }
+}
+
+@media (max-width: 767px) {
+ .section {
+ padding: 40px 0;
+ }
+}
diff --git a/src/components/ReviewsSection.js b/src/components/ReviewsSection.js
new file mode 100644
index 0000000..1eddc3d
--- /dev/null
+++ b/src/components/ReviewsSection.js
@@ -0,0 +1,129 @@
+'use client';
+import { useState, useEffect, useCallback } from 'react';
+import Image from 'next/image';
+import styles from './ReviewsSection.module.css';
+
+const reviews = [
+ {
+ text: "Best dosa I've ever had outside of India! The Masala Dosa was perfectly crispy and the sambar was incredibly flavorful. The weekend Thali is outstanding β so many flavors in one plate. We will definitely be back!",
+ name: 'Sarah M. & Family',
+ role: 'Local Food Critic',
+ initials: 'SM',
+ rating: '4.9',
+ },
+ {
+ text: "My Dosa Place is an absolute gem in Waterloo. The chutneys are made fresh daily and the Rava Dosa has the most amazing crunch. It genuinely transports you to Tamil Nadu. Highly recommend the Uttappam too!",
+ name: 'Raj Patel',
+ role: 'Food Blogger',
+ initials: 'RP',
+ rating: '5.0',
+ },
+ {
+ text: "We visited for lunch and were blown away by the authentic South Indian experience. The Sambar was rich and perfectly spiced, and the dosas were golden crisp. The staff was warm and welcoming β felt like home!",
+ name: 'Priya & Anand K.',
+ role: 'Regular Customer',
+ initials: 'PK',
+ rating: '4.8',
+ },
+ {
+ text: "I've tried many Indian restaurants across Canada and My Dosa Place stands out for its genuine authenticity. The Benne Masala Dosa is a must-try. Amazing value for the quality and portion sizes. Can't wait to return!",
+ name: 'Michael Torres',
+ role: 'Food Enthusiast',
+ initials: 'MT',
+ rating: '4.9',
+ },
+];
+
+export default function ReviewsSection() {
+ const [current, setCurrent] = useState(0);
+ const [animating, setAnimating] = useState(false);
+
+ const goTo = useCallback((index) => {
+ if (animating) return;
+ setAnimating(true);
+ setTimeout(() => {
+ setCurrent(index);
+ setAnimating(false);
+ }, 300);
+ }, [animating]);
+
+ const prev = () => goTo((current - 1 + reviews.length) % reviews.length);
+ const next = useCallback(() => goTo((current + 1) % reviews.length), [current, goTo]);
+
+ // Auto-slide every 5 seconds
+ useEffect(() => {
+ const timer = setInterval(next, 5000);
+ return () => clearInterval(timer);
+ }, [next]);
+
+ const review = reviews[current];
+
+ return (
+
+
+
+
+ {/* Left β Stacked image collage */}
+
+
+
+
+
+
+
+
+
+
4.9
+
βββββ
+
500+ Reviews
+
+
+
+
+ {/* Right β Testimonial slider */}
+
+
Testimonials
+
What Our Customers Say
+
+
+
“
+
{review.text}
+
+
+
{review.initials}
+
+
{review.name}
+
{review.role}
+
+
{review.rating} β
+
+
+
+ {/* Dots + Arrows */}
+
+
+ {reviews.map((_, i) => (
+ goTo(i)}
+ aria-label={`Go to review ${i + 1}`}
+ />
+ ))}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/ReviewsSection.module.css b/src/components/ReviewsSection.module.css
new file mode 100644
index 0000000..ae6bacc
--- /dev/null
+++ b/src/components/ReviewsSection.module.css
@@ -0,0 +1,287 @@
+.section {
+ padding: 80px 0;
+ background: var(--color-bg-light);
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+.contentWrap {
+ display: grid;
+ grid-template-columns: 1fr 1.2fr;
+ gap: 5rem;
+ align-items: center;
+}
+
+/* βββ Left: Image Collage βββ */
+.imageCol {
+ position: relative;
+}
+
+.collage {
+ position: relative;
+ width: 100%;
+ height: 420px;
+}
+
+.imgLeft,
+.imgRight {
+ position: absolute;
+ border-radius: 16px;
+ overflow: hidden;
+ border: 4px solid #fff;
+ box-shadow: 0 12px 30px rgba(0, 0, 0, 0.12);
+}
+
+.imgLeft {
+ top: 0;
+ left: 0;
+ width: 55%;
+ height: 90%;
+}
+
+.imgRight {
+ top: 8%;
+ right: 0;
+ width: 42%;
+ height: 75%;
+}
+
+.img {
+ object-fit: cover;
+ transition: transform 0.5s ease;
+}
+
+.imgLeft:hover .img,
+.imgRight:hover .img {
+ transform: scale(1.06);
+}
+
+/* Rating badge overlaid on collage */
+.ratingBadge {
+ position: absolute;
+ bottom: 5%;
+ right: -12px;
+ background: var(--color-primary);
+ color: #fff;
+ padding: 1rem 1.2rem;
+ border-radius: 16px;
+ box-shadow: 0 10px 30px rgba(1, 77, 51, 0.3);
+ text-align: center;
+ z-index: 5;
+ min-width: 110px;
+}
+
+.ratingText {
+ display: block;
+ font-family: var(--font-serif);
+ font-size: 2.2rem;
+ font-weight: 700;
+ color: #fff;
+ line-height: 1;
+}
+
+.stars {
+ font-size: 0.7rem;
+ margin: 0.4rem 0;
+ letter-spacing: 1px;
+}
+
+.ratingLabel {
+ font-size: 0.72rem;
+ color: rgba(255, 255, 255, 0.8);
+ font-weight: 600;
+}
+
+/* βββ Right: Text + Slider βββ */
+.textCol {
+ padding-right: 1rem;
+ color: var(--color-text-dark);
+}
+
+.sectionTag {
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: var(--color-secondary);
+ letter-spacing: 1.5px;
+ text-transform: uppercase;
+ margin-bottom: 0.5rem;
+}
+
+.sectionTitle {
+ font-family: var(--font-serif);
+ font-size: 2.2rem;
+ color: var(--color-primary);
+ margin-bottom: 2rem;
+ line-height: 1.2;
+}
+
+/* Review card with fade animation */
+.reviewCard {
+ background: #fff;
+ border-radius: 20px;
+ padding: 2rem;
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.06);
+ margin-bottom: 1.8rem;
+ border-left: 4px solid var(--color-primary);
+ transition: opacity 0.3s ease, transform 0.3s ease;
+}
+
+.fadeIn {
+ opacity: 1;
+ transform: translateY(0);
+}
+
+.fadeOut {
+ opacity: 0;
+ transform: translateY(10px);
+}
+
+.quoteMark {
+ font-family: var(--font-serif);
+ font-size: 4rem;
+ color: var(--color-secondary);
+ line-height: 0.5;
+ margin-bottom: 1rem;
+ opacity: 0.7;
+}
+
+.reviewText {
+ font-size: 1rem;
+ line-height: 1.8;
+ color: var(--color-text-medium);
+ margin-bottom: 1.5rem;
+ font-style: italic;
+}
+
+.reviewer {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+}
+
+.avatar {
+ width: 46px;
+ height: 46px;
+ min-width: 46px;
+ background: var(--color-primary);
+ color: #fff;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.95rem;
+ font-weight: 700;
+}
+
+.reviewerName {
+ font-weight: 700;
+ font-size: 1rem;
+ color: var(--color-text-dark);
+}
+
+.reviewDate {
+ font-size: 0.82rem;
+ color: var(--color-text-medium);
+}
+
+.reviewRating {
+ margin-left: auto;
+ font-weight: 700;
+ font-size: 0.95rem;
+ color: var(--color-primary);
+ background: rgba(1, 77, 51, 0.07);
+ padding: 0.3rem 0.8rem;
+ border-radius: 20px;
+ white-space: nowrap;
+}
+
+/* βββ Controls: Dots + Arrows βββ */
+.controls {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.dots {
+ display: flex;
+ gap: 0.5rem;
+}
+
+.dot {
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ background: #d0d0d0;
+ border: none;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ padding: 0;
+}
+
+.dotActive {
+ background: var(--color-primary);
+ width: 28px;
+ border-radius: 5px;
+}
+
+.navButtons {
+ display: flex;
+ gap: 0.75rem;
+}
+
+.navBtn {
+ width: 44px;
+ height: 44px;
+ border-radius: 50%;
+ border: 2px solid var(--color-primary);
+ background: transparent;
+ color: var(--color-primary);
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.navBtn:hover {
+ background: var(--color-primary);
+ color: #fff;
+ transform: translateY(-2px);
+ box-shadow: 0 5px 15px rgba(1, 77, 51, 0.25);
+}
+
+/* βββ Responsive βββ */
+@media (max-width: 992px) {
+ .contentWrap {
+ grid-template-columns: 1fr;
+ gap: 4rem;
+ }
+
+ .collage {
+ max-width: 480px;
+ margin: 0 auto;
+ height: 380px;
+ }
+
+ .textCol {
+ padding-right: 0;
+ }
+}
+
+@media (max-width: 767px) {
+ .section {
+ padding: 40px 0;
+ }
+
+ .collage {
+ height: 320px;
+ }
+
+ .sectionTitle {
+ font-size: 1.8rem;
+ }
+}
diff --git a/src/components/ScrollToTop.js b/src/components/ScrollToTop.js
new file mode 100644
index 0000000..c91e65c
--- /dev/null
+++ b/src/components/ScrollToTop.js
@@ -0,0 +1,43 @@
+"use client";
+
+import { useState, useEffect } from 'react';
+import styles from './ScrollToTop.module.css';
+
+export default function ScrollToTop() {
+ const [isVisible, setIsVisible] = useState(false);
+
+ // Show button when page is scrolled down
+ const toggleVisibility = () => {
+ if (window.scrollY > 300) {
+ setIsVisible(true);
+ } else {
+ setIsVisible(false);
+ }
+ };
+
+ const scrollToTop = () => {
+ window.scrollTo({
+ top: 0,
+ behavior: 'smooth',
+ });
+ };
+
+ useEffect(() => {
+ window.addEventListener('scroll', toggleVisibility);
+ return () => window.removeEventListener('scroll', toggleVisibility);
+ }, []);
+
+ return (
+ <>
+ {isVisible && (
+
+ β
+
+ )}
+ >
+ );
+}
diff --git a/src/components/ScrollToTop.module.css b/src/components/ScrollToTop.module.css
new file mode 100644
index 0000000..c1e368f
--- /dev/null
+++ b/src/components/ScrollToTop.module.css
@@ -0,0 +1,48 @@
+.scrollToTopBtn {
+ position: fixed;
+ bottom: 30px;
+ right: 30px;
+ width: 50px;
+ height: 50px;
+ background-color: var(--color-secondary);
+ color: #fff;
+ border: none;
+ border-radius: 50%;
+ font-size: 1.5rem;
+ font-weight: bold;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
+ z-index: 1000;
+ transition: all 0.3s ease;
+ animation: fadeIn 0.3s;
+}
+
+.scrollToTopBtn:hover {
+ background-color: var(--color-primary);
+ transform: translateY(-3px);
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@media (max-width: 768px) {
+ .scrollToTopBtn {
+ bottom: 20px;
+ right: 20px;
+ width: 45px;
+ height: 45px;
+ font-size: 1.2rem;
+ }
+}
diff --git a/src/components/StorySection.js b/src/components/StorySection.js
new file mode 100644
index 0000000..42c3a1b
--- /dev/null
+++ b/src/components/StorySection.js
@@ -0,0 +1,113 @@
+import Image from 'next/image';
+import styles from './StorySection.module.css';
+
+export default function StorySection() {
+ return (
+
+
+
+ {/* Left - Images */}
+
+
+ {/* Photo 1 - Top left, tilted left */}
+
+
+ {/* Photo 2 - Top center, slight right tilt */}
+
+
+ {/* Photo 3 - Bottom right */}
+
+
+ {/* Photo 4 - Bottom center, wide */}
+
+
+ {/* Heritage badge */}
+
+ 45+
+ Years of South Indian Culinary Heritage
+
+
+
+
+ {/* Right - Content */}
+
+
β Our Story
+
Welcome to My Dosa Place
+
+ Born from a passion for preserving the culinary heritage of
+ South India, My Dosa Place brings authentic flavors from the
+ kitchens of Tamil Nadu and Karnataka right to Waterloo.
+
+
+ Every dosa is crafted with love using traditional recipes passed
+ down through generations. We source the finest ingredients and
+ grind our own batter fresh every day to ensure that perfect
+ crispy, golden crepe.
+
+
+
+
+ 45+
+ Recipes
+
+
+
+ 15K+
+ Happy Customers
+
+
+
+ 4.9
+ Google Rating
+
+
+
+
+ Explore Our Heritage β
+
+
+
+
+
+ );
+}
diff --git a/src/components/StorySection.module.css b/src/components/StorySection.module.css
new file mode 100644
index 0000000..e0d0326
--- /dev/null
+++ b/src/components/StorySection.module.css
@@ -0,0 +1,297 @@
+.section {
+ padding: 5rem 0;
+ background: #fff;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+.grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 4rem;
+ align-items: center;
+}
+
+/* Polaroid Collage */
+.collageWrap {
+ position: relative;
+}
+
+.collageBg {
+ position: relative;
+ background: #1a1a1a;
+ border-radius: 20px;
+ min-height: 480px;
+ padding: 2rem;
+ overflow: visible;
+}
+
+/* Base polaroid style */
+.polaroid {
+ position: absolute;
+ background: #fff;
+ padding: 10px 10px 30px;
+ box-shadow:
+ 0 4px 15px rgba(0, 0, 0, 0.25),
+ 0 1px 3px rgba(0, 0, 0, 0.15);
+ transition: transform 0.4s ease, box-shadow 0.4s ease, z-index 0s;
+ cursor: pointer;
+}
+
+.polaroid:hover {
+ z-index: 10 !important;
+ box-shadow:
+ 0 12px 35px rgba(0, 0, 0, 0.4),
+ 0 2px 6px rgba(0, 0, 0, 0.2);
+}
+
+.polaroidInner {
+ overflow: hidden;
+}
+
+.polaroidImg {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ display: block;
+ transition: transform 0.4s ease;
+}
+
+.polaroid:hover .polaroidImg {
+ transform: scale(1.05);
+}
+
+/* Photo 1 β Top left, tilted left */
+.polaroid1 {
+ top: 10px;
+ left: -10px;
+ transform: rotate(-6deg);
+ z-index: 2;
+ width: 220px;
+}
+
+.polaroid1:hover {
+ transform: rotate(-2deg) scale(1.05);
+}
+
+.polaroid1 .polaroidInner {
+ height: 170px;
+}
+
+/* Photo 2 β Top right, tilted right */
+.polaroid2 {
+ top: -15px;
+ right: 10px;
+ transform: rotate(4deg);
+ z-index: 3;
+ width: 210px;
+}
+
+.polaroid2:hover {
+ transform: rotate(1deg) scale(1.05);
+}
+
+.polaroid2 .polaroidInner {
+ height: 160px;
+}
+
+/* Photo 3 β Bottom right, tilted */
+.polaroid3 {
+ bottom: 30px;
+ right: -5px;
+ transform: rotate(-3deg);
+ z-index: 4;
+ width: 200px;
+}
+
+.polaroid3:hover {
+ transform: rotate(0deg) scale(1.05);
+}
+
+.polaroid3 .polaroidInner {
+ height: 150px;
+}
+
+/* Photo 4 β Bottom center/left, overlapping */
+.polaroid4 {
+ bottom: 10px;
+ left: 40px;
+ transform: rotate(5deg);
+ z-index: 5;
+ width: 240px;
+}
+
+.polaroid4:hover {
+ transform: rotate(2deg) scale(1.05);
+}
+
+.polaroid4 .polaroidInner {
+ height: 165px;
+}
+
+/* Heritage badge */
+.badge {
+ position: absolute;
+ bottom: -12px;
+ left: 50%;
+ transform: translateX(-50%);
+ background: var(--color-primary);
+ color: #fff;
+ padding: 0.9rem 1.4rem;
+ border-radius: var(--border-radius-md);
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
+ z-index: 20;
+ text-align: center;
+ white-space: nowrap;
+}
+
+.badgeNumber {
+ display: block;
+ font-family: var(--font-serif);
+ font-size: 2rem;
+ font-weight: 700;
+ color: var(--color-secondary);
+ line-height: 1;
+}
+
+.badgeText {
+ font-size: 0.72rem;
+ color: rgba(255, 255, 255, 0.85);
+ line-height: 1.4;
+}
+
+/* Content */
+.content {
+ padding-left: 1rem;
+}
+
+.sectionTag {
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: var(--color-secondary);
+ letter-spacing: 1px;
+ text-transform: uppercase;
+ margin-bottom: 0.5rem;
+}
+
+.title {
+ font-family: var(--font-serif);
+ font-size: 2.2rem;
+ color: var(--color-primary);
+ margin-bottom: 1.5rem;
+ line-height: 1.2;
+}
+
+.description {
+ font-size: 0.95rem;
+ color: var(--color-text-medium);
+ line-height: 1.75;
+ margin-bottom: 1rem;
+}
+
+.stats {
+ display: flex;
+ align-items: center;
+ gap: 1.5rem;
+ margin: 2rem 0;
+ padding: 1.5rem;
+ background: var(--color-bg-light);
+ border-radius: var(--border-radius-md);
+}
+
+.statItem {
+ text-align: center;
+ flex: 1;
+}
+
+.statNumber {
+ display: block;
+ font-family: var(--font-serif);
+ font-size: 1.8rem;
+ font-weight: 700;
+ color: var(--color-primary);
+ line-height: 1;
+ margin-bottom: 0.3rem;
+}
+
+.statLabel {
+ font-size: 0.8rem;
+ color: var(--color-text-medium);
+}
+
+.statDivider {
+ width: 1px;
+ height: 40px;
+ background: #ddd;
+}
+
+.btnExplore {
+ display: inline-block;
+ padding: 0.8rem 2rem;
+ background: var(--color-primary);
+ color: #fff;
+ font-size: 0.9rem;
+ font-weight: 600;
+ border-radius: var(--border-radius-full);
+ text-decoration: none;
+ transition: all 0.3s ease;
+}
+
+.btnExplore:hover {
+ background: var(--color-primary-light);
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(1, 77, 51, 0.3);
+}
+
+@media (max-width: 1024px) {
+ .grid {
+ grid-template-columns: 1fr;
+ gap: 2rem;
+ }
+
+ .content {
+ padding-left: 0;
+ }
+
+ .collageBg {
+ min-height: 380px;
+ }
+
+ .polaroid1 {
+ width: 170px;
+ left: 0;
+ }
+
+ .polaroid1 .polaroidInner {
+ height: 130px;
+ }
+
+ .polaroid2 {
+ width: 160px;
+ }
+
+ .polaroid2 .polaroidInner {
+ height: 120px;
+ }
+
+ .polaroid3 {
+ width: 155px;
+ }
+
+ .polaroid3 .polaroidInner {
+ height: 115px;
+ }
+
+ .polaroid4 {
+ width: 185px;
+ left: 20px;
+ }
+
+ .polaroid4 .polaroidInner {
+ height: 130px;
+ }
+}