Build Kozmos QR menu site — full implementation

Next.js 16 App Router, TR/EN i18n via [lang] routing and proxy.ts,
Tailwind v4, minimal list menu style, sticky bottom tab bar with
Intersection Observer, PWA manifest, WhatsApp fixed button.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
mstfyldz
2026-06-03 02:35:14 +03:00
co-authored by Claude Sonnet 4.6
parent f879d65cfc
commit 718e0a6228
16 changed files with 811 additions and 98 deletions
+253
View File
@@ -0,0 +1,253 @@
export type LocalizedString = { tr: string; en: string }
export type MenuItem = {
id: string
emoji: string
name: LocalizedString
description: LocalizedString
price: number
highlight?: boolean
}
export type Category = {
id: string
emoji: string
label: LocalizedString
items: MenuItem[]
}
export const WHATSAPP_NUMBER = '905XXXXXXXXXX'
export const categories: Category[] = [
{
id: 'starters',
emoji: '🥗',
label: { tr: 'Başlangıçlar', en: 'Starters' },
items: [
{
id: 's1',
emoji: '🥗',
name: { tr: 'Akdeniz Salatası', en: 'Mediterranean Salad' },
description: { tr: 'Domates, salatalık, zeytin, hellim peyniri', en: 'Tomato, cucumber, olives, halloumi' },
price: 120,
},
{
id: 's2',
emoji: '🧀',
name: { tr: 'Hellim Izgara', en: 'Grilled Halloumi' },
description: { tr: 'Zeytinyağı, taze nane, limon', en: 'Olive oil, fresh mint, lemon' },
price: 95,
},
{
id: 's3',
emoji: '🫙',
name: { tr: 'Zeytinyağlı Meze Tabağı', en: 'Meze Platter' },
description: { tr: 'Günlük hazır mezelerin seçimi', en: 'Daily selection of mezze' },
price: 145,
},
{
id: 's4',
emoji: '🍆',
name: { tr: 'Patlıcan Ezmesi', en: 'Smoked Eggplant Dip' },
description: { tr: 'Közlenmiş patlıcan, sarımsak, zeytinyağı', en: 'Roasted eggplant, garlic, olive oil' },
price: 85,
},
],
},
{
id: 'mains',
emoji: '🍽️',
label: { tr: 'Ana Yemekler', en: 'Main Courses' },
items: [
{
id: 'm1',
emoji: '🐟',
name: { tr: 'Balık Izgara', en: 'Grilled Fish' },
description: { tr: 'Günlük taze balık, sebze garnitürü', en: 'Daily fresh catch, vegetable garnish' },
price: 285,
},
{
id: 'm2',
emoji: '🐠',
name: { tr: 'Levrek Buğulama', en: 'Steamed Sea Bass' },
description: { tr: 'Sebzeli buğulama, zeytinyağlı sos', en: 'Steamed with vegetables, olive oil sauce' },
price: 295,
},
{
id: 'm3',
emoji: '🐙',
name: { tr: 'Ahtapot Izgara', en: 'Grilled Octopus' },
description: { tr: 'Kekikli marinad, kapari sosu', en: 'Thyme marinade, caper sauce' },
price: 320,
},
{
id: 'm4',
emoji: '🍢',
name: { tr: 'Tavuk Şiş', en: 'Chicken Skewers' },
description: { tr: 'Baharatlı tavuk, közlenmiş biber', en: 'Spiced chicken, roasted peppers' },
price: 175,
},
{
id: 'm5',
emoji: '🥘',
name: { tr: 'Vegetaryen Güveç', en: 'Vegetarian Stew' },
description: { tr: 'Mevsim sebzeler, nohut, domates sos', en: 'Seasonal vegetables, chickpeas, tomato sauce' },
price: 155,
},
],
},
{
id: 'pizzas',
emoji: '🍕',
label: { tr: 'Pizzalar', en: 'Pizzas' },
items: [
{
id: 'p1',
emoji: '🍕',
name: { tr: 'Margherita', en: 'Margherita' },
description: { tr: 'San marzano domates, bufala mozarella, fesleğen', en: 'San marzano tomatoes, buffalo mozzarella, basil' },
price: 165,
},
{
id: 'p2',
emoji: '🍕',
name: { tr: 'Karışık Pizza', en: 'Mixed Pizza' },
description: { tr: 'Salam, mantar, biber, mozarella', en: 'Salami, mushroom, pepper, mozzarella' },
price: 185,
},
{
id: 'p3',
emoji: '🦐',
name: { tr: 'Deniz Ürünleri', en: 'Seafood Pizza' },
description: { tr: 'Karides, kalamar, fesleğen sosu', en: 'Shrimp, calamari, basil sauce' },
price: 215,
},
{
id: 'p4',
emoji: '🌿',
name: { tr: 'Fıstık Pesto', en: 'Pesto Pizza' },
description: { tr: 'Fıstıklı pesto, roka, parmesan', en: 'Pistachio pesto, rocket, parmesan' },
price: 175,
},
],
},
{
id: 'mezze',
emoji: '🫒',
label: { tr: 'Mezeler', en: 'Mezze' },
items: [
{
id: 'mz1',
emoji: '🐟',
name: { tr: 'Tarama', en: 'Tarama' },
description: { tr: 'Balık yumurtası ezmesi, taze limon', en: 'Fish roe spread, fresh lemon' },
price: 75,
},
{
id: 'mz2',
emoji: '🧄',
name: { tr: 'Haydari', en: 'Haydari' },
description: { tr: 'Yoğurt, sarımsak, dereotu', en: 'Yogurt, garlic, dill' },
price: 65,
},
{
id: 'mz3',
emoji: '🥐',
name: { tr: 'Sigara Böreği', en: 'Cheese Pastry Rolls' },
description: { tr: 'Peynirli, 5 adet', en: 'Cheese-filled, 5 pieces' },
price: 85,
},
{
id: 'mz4',
emoji: '🐚',
name: { tr: 'Midye Tava', en: 'Fried Mussels' },
description: { tr: 'Tarator sos ile servis', en: 'Served with tarator sauce' },
price: 95,
},
{
id: 'mz5',
emoji: '🍤',
name: { tr: 'Karides Güveç', en: 'Shrimp Casserole' },
description: { tr: 'Domates sos, baharatlar, fırında', en: 'Tomato sauce, spices, oven-baked' },
price: 135,
},
],
},
{
id: 'drinks',
emoji: '🍹',
label: { tr: 'İçecekler', en: 'Drinks' },
items: [
{
id: 'd1',
emoji: '🍸',
name: { tr: 'Mojito', en: 'Mojito' },
description: { tr: 'Nane, lime, soda, rum', en: 'Mint, lime, soda, rum' },
price: 95,
},
{
id: 'd2',
emoji: '🍊',
name: { tr: 'Aperol Spritz', en: 'Aperol Spritz' },
description: { tr: 'Aperol, prosecco, portakal dilimi', en: 'Aperol, prosecco, orange slice' },
price: 115,
},
{
id: 'd3',
emoji: '🍋',
name: { tr: 'Limonata', en: 'Lemonade' },
description: { tr: 'Taze sıkılmış, nane seçeneği ile', en: 'Freshly squeezed, optional mint' },
price: 55,
},
{
id: 'd4',
emoji: '🥛',
name: { tr: 'Ayran', en: 'Ayran' },
description: { tr: 'Ev yapımı, taze çırpılmış', en: 'Homemade, freshly churned' },
price: 35,
},
{
id: 'd5',
emoji: '🍵',
name: { tr: 'Soğuk Çay', en: 'Iced Tea' },
description: { tr: 'Şeftali veya limon aromalı', en: 'Peach or lemon flavored' },
price: 45,
},
],
},
{
id: 'desserts',
emoji: '🍮',
label: { tr: 'Tatlılar', en: 'Desserts' },
items: [
{
id: 'dt1',
emoji: '🍨',
name: { tr: 'Dondurma', en: 'Ice Cream' },
description: { tr: '3 top, günlük seçim', en: '3 scoops, daily selection' },
price: 85,
},
{
id: 'dt2',
emoji: '🥮',
name: { tr: 'Baklava', en: 'Baklava' },
description: { tr: 'Antep fıstıklı, kaymak ile', en: 'Pistachio, with clotted cream' },
price: 75,
},
{
id: 'dt3',
emoji: '🍮',
name: { tr: 'Panna Cotta', en: 'Panna Cotta' },
description: { tr: 'Çilek sosu, taze nane', en: 'Strawberry sauce, fresh mint' },
price: 95,
},
{
id: 'dt4',
emoji: '🥞',
name: { tr: 'Akıtma', en: 'Akıtma' },
description: { tr: 'Geleneksel, nar ekşisi ile', en: 'Traditional, with pomegranate molasses' },
price: 65,
},
],
},
]