diff --git a/app/layout.tsx b/app/layout.tsx index 13de391..3141255 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -91,7 +91,7 @@ export default function RootLayout({ }>) { return ( diff --git a/app/locations/page.tsx b/app/locations/page.tsx index c371281..818b04f 100644 --- a/app/locations/page.tsx +++ b/app/locations/page.tsx @@ -16,10 +16,16 @@ * - Both branches now have the same opening hours. */ +'use client'; + import Navbar from "@/components/Navbar"; import Footer from "@/components/Footer"; +import { useLanguage } from "@/lib/language-context"; +import { getTranslation } from "@/lib/translations"; export default function LocationsPage() { + const { language } = useLanguage(); + const t = getTranslation(language); return (
@@ -27,15 +33,15 @@ export default function LocationsPage() {
WHERE TO FIND US
-

Our Locations

+

{language === 'sv' ? 'Våra Platser' : 'Our Locations'}

- Two branches in Gothenburg — both serving authentic flavors with the same royal hospitality. + {language === 'sv' ? 'Två restauranger i Göteborg — båda serverar autentiska smaker med samma kungliga gästfrihet.' : 'Two branches in Gothenburg — both serving authentic flavors with the same royal hospitality.'}

- Make a Reservation + {t.reserve}
diff --git a/app/menu/page.tsx b/app/menu/page.tsx index fcb52b9..38a6fd5 100644 --- a/app/menu/page.tsx +++ b/app/menu/page.tsx @@ -11,6 +11,8 @@ import { ScrollTrigger } from "gsap/ScrollTrigger"; import Navbar from "@/components/Navbar"; import Footer from "@/components/Footer"; import { useCart } from "@/components/CartContext"; +import { useLanguage } from "@/lib/language-context"; +import { getTranslation } from "@/lib/translations"; gsap.registerPlugin(ScrollTrigger); @@ -20,6 +22,8 @@ export default function MenuPage() { const [showVegetarianOnly, setShowVegetarianOnly] = useState(false); const { addToCart } = useCart(); + const { language } = useLanguage(); + const t = getTranslation(language); // Sidebar categories const sidebarCategories = [ @@ -71,9 +75,9 @@ export default function MenuPage() {
AUTHENTIC • GENEROUS • ROYAL
-

Our Menu

+

{t.menu.title}

- Traditional recipes. Generous portions. Made with heart. + {t.menu.subtitle}

@@ -90,7 +94,8 @@ export default function MenuPage() {

Signature Categories

-
+ {/* Modern mobile-first category menu: horizontal scroller on phones/tablets, vertical sidebar on desktop */} +
{sidebarCategories.map((cat) => { const isActive = activeCategory === cat.id; const itemCount = cat.id === "All" @@ -101,16 +106,16 @@ export default function MenuPage() { {(searchQuery || showVegetarianOnly || activeCategory !== "All") && ( @@ -152,9 +157,9 @@ export default function MenuPage() { setShowVegetarianOnly(false); setActiveCategory("All"); }} - className="text-sm font-medium text-[#c99a2e] hover:text-[#8f6b22]" + className="text-sm font-medium text-[#c99a2e] hover:text-[#8f6b22] active:underline" > - Clear filters + {t.menu.clearFilters} )}
@@ -162,7 +167,7 @@ export default function MenuPage() { {/* Menu Items */} {filteredCategories.length === 0 ? (
- No dishes found matching your filters. + {t.menu.noResults}
) : ( filteredCategories.map((category) => ( @@ -171,7 +176,7 @@ export default function MenuPage() {
{category.name}
- {category.items.length} dishes + {category.items.length} {t.menu.dishes}
@@ -179,7 +184,7 @@ export default function MenuPage() { {category.items.map((item) => (
addToCart({ id: item.id, name: item.name, price: item.price, image: item.image })} > {/* Media - Restored Premium Video Hover + Poster Logic */} diff --git a/app/page.tsx b/app/page.tsx index 0023429..48dc75f 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -233,13 +233,13 @@ export default function ShahiKitchenHomepage() {

{t.signatureMenu.subtitle}

- {/* Filters */} -
+ {/* Filters - modern horizontal scroller on mobile for easy thumb use */} +
{["All", "Rice", "Curry", "Meat", "Street", "Roll", "Sweet"].map((cat) => ( @@ -254,7 +254,7 @@ export default function ShahiKitchenHomepage() { key={dish.id} layout onClick={() => addDish(dish)} - className="signature-card group flex cursor-pointer flex-col overflow-hidden rounded-[2rem] border border-[#EDE6D9] bg-white" + className="signature-card group flex cursor-pointer flex-col overflow-hidden rounded-[2rem] border border-[#EDE6D9] bg-white active:scale-[0.985] active:border-[#c99a2e]/60 transition-transform touch-manipulation" >
{ e.stopPropagation(); addDish(dish); }} - className="mt-5 w-full py-3 text-sm tracking-[0.6px] border border-[#B38B4D] text-[#B38B4D] rounded-full hover:bg-[#B38B4D] hover:text-white font-medium transition-all" + className="mt-5 w-full py-3.5 text-sm tracking-[0.6px] border border-[#B38B4D] text-[#B38B4D] rounded-full hover:bg-[#B38B4D] hover:text-white active:bg-[#8C6B3A] active:text-white active:scale-[0.985] font-medium transition-all touch-manipulation" > {t.signatureMenu.addToTable} @@ -299,16 +299,20 @@ export default function ShahiKitchenHomepage() {
-
THE SHAHI WAY
-

More than a meal.
A moment of royalty.

+
{language === 'sv' ? 'SHAHI-SÄTTET' : 'THE SHAHI WAY'}
+

{language === 'sv' ? 'Mer än en måltid.\nEtt ögonblick av kunglighet.' : 'More than a meal.\nA moment of royalty.'}

- {[ + {(language === 'sv' ? [ + { title: "Den Legendariska Buffén", desc: "Vår berömda lunchbuffé har över 20 roterande rätter — curry, biryani, färsk naan och sötsaker." }, + { title: "Shahi Sötsaker", desc: "Hemgjord mithai dagligen. Från färsk jalebi till rasmalai — det perfekta söta avslutet." }, + { title: "Varm Gästfrihet", desc: "Oavsett om du är här för en snabb lunch eller familjefest, behandlas du alltid som kunglighet." }, + ] : [ { title: "The Legendary Buffet", desc: "Our famous lunch buffet features over 20 rotating dishes — curries, biryanis, fresh naan, and sweets." }, { title: "Shahi Sweets", desc: "Homemade mithai made daily. From fresh Jalebi to Rasmalai — the perfect sweet ending." }, { title: "Warm Hospitality", desc: "Whether you're here for a quick lunch or a family celebration, you will always be treated like royalty." }, - ].map((item, index) => ( + ]).map((item, index) => (
0{index + 1}

{item.title}

diff --git a/components/Footer.tsx b/components/Footer.tsx index 8e6727e..91cf56d 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -15,8 +15,12 @@ */ import Link from "next/link"; +import { useLanguage } from "@/lib/language-context"; +import { getTranslation } from "@/lib/translations"; export default function Footer() { + const { language } = useLanguage(); + const t = getTranslation(language); return (
@@ -34,13 +38,13 @@ export default function Footer() { Shahi Kitchen

- Authentic Indian & Pakistani cuisine in Gothenburg since 2016. + {t.footer.tagline}

{/* Contact - Both Locations */}
-
OUR LOCATIONS
+
{t.footer.locations}
Shahi Kitchen (Askim / Sisjön)
@@ -63,7 +67,7 @@ export default function Footer() { {/* Hours */}
-
OPENING HOURS
+
{language === 'sv' ? 'ÖPPETTIDER' : 'OPENING HOURS'}
Askim: Mon–Sun 11:00–21:00
Backaplan: Mon–Sun 11:00–21:00
@@ -72,15 +76,15 @@ export default function Footer() { {/* Quick Links + Social */}
-
EXPLORE
+
{t.footer.explore}
- Home - Menu - Our Experience - Contact & Reserve + {t.nav.home} + {t.nav.menu} + {language === 'sv' ? 'Vår Upplevelse' : 'Our Experience'} + {language === 'sv' ? 'Kontakt & Boka' : 'Contact & Reserve'}
-
FOLLOW US
+
{t.footer.follow}
diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 7b651c8..87f1948 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -3,11 +3,11 @@ import { useState, useEffect } from "react"; import Link from "next/link"; import { useCart } from "./CartContext"; -import { ShoppingBag, ArrowRight } from "lucide-react"; +import { ShoppingBag, ArrowRight, Home, UtensilsCrossed, MapPin, Star, Phone, X } from "lucide-react"; import LanguageSwitcher from "./LanguageSwitcher"; import { useLanguage } from "@/lib/language-context"; import { getTranslation } from "@/lib/translations"; -import { motion } from "framer-motion"; +import { motion, AnimatePresence } from "framer-motion"; import { usePathname } from "next/navigation"; /** @@ -147,19 +147,17 @@ export default function Navbar({ variant = "default" }: NavbarProps) {
- {/* Mobile Hamburger */} -
- {/* MOBILE CART ICON (always visible even when hamburger is closed) */} + {/* Mobile Hamburger + Cart (compact, high touch target) */} +
+ {/* MOBILE CART ICON (always visible) */}
- {/* Mobile Menu - Stunning Elegant Drawer */} - {isOpen && ( -
-
-
-
- Shahi Kitchen - Shahi Kitchen -
- -
+ {/* Modern Mobile Menu Drawer (slide-in, animated, high-contrast, touch-friendly) */} + + {isOpen && ( +
+ {/* Backdrop */} + -
- {navLinks.map((link) => ( - + {/* Header */} +
+
+ Shahi Kitchen +
+
Shahi Kitchen
+
Gothenburg
+
+
+ +
+ + {/* Primary Nav Links - modern list with icons + active state for visibility */} +
+ {navLinks.map((link) => { + const active = isActive(link.href); + const Icon = + link.href === '/' ? Home : + link.href === '/menu' ? UtensilsCrossed : + link.href === '/locations' ? MapPin : + link.href.includes('experience') ? Star : Phone; + + return ( + + + {link.label} + {active && ( + CURRENT + )} + + ); + })} +
+ + {/* Secondary actions + Language */} +
+
+
LANGUAGE
+ +
+ + + {t.reserve} - ))} -
-
- + - - {t.reserve} - - -
+

Tap to open WhatsApp for orders & bookings

+
+
-
- )} + )} + ); } diff --git a/lib/language-context.tsx b/lib/language-context.tsx index 7891223..d7f710d 100644 --- a/lib/language-context.tsx +++ b/lib/language-context.tsx @@ -13,7 +13,7 @@ const LanguageContext = createContext(undefined const LANGUAGE_STORAGE_KEY = 'shahi-kitchen-language'; export function LanguageProvider({ children }: { children: ReactNode }) { - const [language, setLanguageState] = useState('en'); + const [language, setLanguageState] = useState('sv'); // Load language from localStorage on mount useEffect(() => { @@ -21,11 +21,13 @@ export function LanguageProvider({ children }: { children: ReactNode }) { if (savedLang && ['en', 'sv', 'hi', 'ur'].includes(savedLang)) { setLanguageState(savedLang); } else { - // Optional: Try to detect browser language + // Default to Swedish (sv) for the Swedish restaurant audience. + // Only auto-switch for strong browser matches on other supported languages. const browserLang = navigator.language.toLowerCase(); if (browserLang.startsWith('sv')) setLanguageState('sv'); else if (browserLang.startsWith('hi')) setLanguageState('hi'); else if (browserLang.startsWith('ur')) setLanguageState('ur'); + // else stay 'sv' (no 'en' override — users can manually switch to English) } }, []); diff --git a/lib/translations.ts b/lib/translations.ts index 202116e..ff21259 100644 --- a/lib/translations.ts +++ b/lib/translations.ts @@ -1,8 +1,8 @@ export type Language = 'en' | 'sv' | 'hi' | 'ur'; export const languages: { code: Language; name: string; native: string; flag: string }[] = [ - { code: 'en', name: 'English', native: 'English', flag: '🇬🇧' }, { code: 'sv', name: 'Swedish', native: 'Svenska', flag: '🇸🇪' }, + { code: 'en', name: 'English', native: 'English', flag: '🇬🇧' }, { code: 'hi', name: 'Hindi', native: 'हिंदी', flag: '🇮🇳' }, { code: 'ur', name: 'Urdu', native: 'اردو', flag: '🇵🇰' }, ]; @@ -78,6 +78,18 @@ export const translations = { // Common add: 'Add', viewCart: 'View Cart', + + // Full Menu Page + menu: { + title: 'Our Menu', + subtitle: 'Traditional recipes. Generous portions. Made with heart.', + searchPlaceholder: 'Search dishes...', + showVegetarian: 'Show Vegetarian', + vegetarianOnly: 'Vegetarian Only', + clearFilters: 'Clear filters', + noResults: 'No dishes found matching your filters.', + dishes: 'dishes', + }, }, sv: { @@ -143,6 +155,18 @@ export const translations = { add: 'Lägg till', viewCart: 'Visa Varukorg', + + // Full Menu Page + menu: { + title: 'Vår Meny', + subtitle: 'Traditionella recept. Generösa portioner. Tillagade med hjärta.', + searchPlaceholder: 'Sök rätter...', + showVegetarian: 'Visa vegetariskt', + vegetarianOnly: 'Endast vegetariskt', + clearFilters: 'Rensa filter', + noResults: 'Inga rätter matchar dina filter.', + dishes: 'rätter', + }, }, hi: { @@ -177,6 +201,18 @@ export const translations = { viewFullMenu: 'पूरी मेन्यू देखें — 40+ व्यंजन', }, + // Full Menu Page (fallback to English for now) + menu: { + title: 'Our Menu', + subtitle: 'Traditional recipes. Generous portions. Made with heart.', + searchPlaceholder: 'Search dishes...', + showVegetarian: 'Show Vegetarian', + vegetarianOnly: 'Vegetarian Only', + clearFilters: 'Clear filters', + noResults: 'No dishes found matching your filters.', + dishes: 'dishes', + }, + experience: { badge: 'शाही तरीका', title: 'दावत जैसी गर्माहट।\nमहल जैसा सुकून।', @@ -242,6 +278,18 @@ export const translations = { viewFullMenu: 'مکمل مینو دیکھیں — 40+ پکوان', }, + // Full Menu Page (fallback to English for now) + menu: { + title: 'Our Menu', + subtitle: 'Traditional recipes. Generous portions. Made with heart.', + searchPlaceholder: 'Search dishes...', + showVegetarian: 'Show Vegetarian', + vegetarianOnly: 'Vegetarian Only', + clearFilters: 'Clear filters', + noResults: 'No dishes found matching your filters.', + dishes: 'dishes', + }, + experience: { badge: 'شاہی طریقہ', title: 'دعوت جیسی گرمی۔\nمحل جیسا سکون۔', diff --git a/public/images/logo/banner_mobile-optimized.mp4 b/public/images/logo/banner_mobile-optimized.mp4 index 19b34b7..9177d5e 100644 Binary files a/public/images/logo/banner_mobile-optimized.mp4 and b/public/images/logo/banner_mobile-optimized.mp4 differ diff --git a/public/images/logo/banner_mobile-optimized.webm b/public/images/logo/banner_mobile-optimized.webm index f7c5879..bb31cde 100644 Binary files a/public/images/logo/banner_mobile-optimized.webm and b/public/images/logo/banner_mobile-optimized.webm differ diff --git a/public/images/logo/banner_mobile.mp4 b/public/images/logo/banner_mobile.mp4 index 049f5dc..e085c72 100644 Binary files a/public/images/logo/banner_mobile.mp4 and b/public/images/logo/banner_mobile.mp4 differ