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:
co-authored by
Claude Sonnet 4.6
parent
f879d65cfc
commit
718e0a6228
@@ -0,0 +1,57 @@
|
||||
import { notFound } from 'next/navigation'
|
||||
import { getDictionary, hasLocale } from './dictionaries'
|
||||
import { categories } from '@/data/menu'
|
||||
import Header from '@/components/Header'
|
||||
import CategorySection from '@/components/CategorySection'
|
||||
import BottomTabBar from '@/components/BottomTabBar'
|
||||
import WhatsAppButton from '@/components/WhatsAppButton'
|
||||
|
||||
export default async function MenuPage({
|
||||
params,
|
||||
}: {
|
||||
params: Promise<{ lang: string }>
|
||||
}) {
|
||||
const { lang } = await params
|
||||
if (!hasLocale(lang)) notFound()
|
||||
|
||||
const dict = await getDictionary(lang)
|
||||
|
||||
return (
|
||||
<>
|
||||
<Header dict={dict} />
|
||||
|
||||
<main
|
||||
className="bg-cream min-h-screen"
|
||||
style={{
|
||||
paddingTop: 'var(--header-h)',
|
||||
paddingBottom: 'calc(var(--tabbar-h) + 8px)',
|
||||
}}
|
||||
>
|
||||
{/* Subtle top fade from header */}
|
||||
<div
|
||||
className="h-4 bg-gradient-to-b from-beige/30 to-transparent"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
|
||||
{categories.map((category) => (
|
||||
<CategorySection
|
||||
key={category.id}
|
||||
category={category}
|
||||
lang={lang}
|
||||
currency={dict.currency}
|
||||
/>
|
||||
))}
|
||||
|
||||
{/* Bottom spacing */}
|
||||
<div className="h-6" aria-hidden="true" />
|
||||
</main>
|
||||
|
||||
<WhatsAppButton
|
||||
message={dict.whatsapp.message}
|
||||
label={dict.whatsapp.label}
|
||||
/>
|
||||
|
||||
<BottomTabBar categories={categories} lang={lang} />
|
||||
</>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user