# AGENTS.md Juniper Table — seasonal restaurant template for booking-driven dining: keep menu architecture, service windows, seating formats, allergies, pairing, private dining and host confirmation central to the experience. ## Project Specifics - Source content lives in \`src/entities/site-content.ts\`; keep visible copy there or directly in route JSX. - \`src/app\` is routing only; композиция каждой страницы живёт в отдельном widget (\`src/widgets/-page.tsx\`). См. File Map. - Keep cards at 8px radius or less and preserve the restaurant palette in \`src/app/globals.css\`. - This is a static frontend template: do not add real payments, deposits, table-management API, delivery, auth, persistence, external API calls, or backend contracts without an explicit product request. - Keep restaurant specificity: seating, service windows, host confirmation, allergies/dietary requests, pairing, supplier story and private dining packages. - After changes run \`pnpm lint\` and \`pnpm build\`. ## Visual Rules - Кириллица обязательна для видимого текста и выбранных Google Fonts. - Do not flatten this into a generic cafe landing page. Every page should answer a real restaurant business question. ## Design System Источник токенов — `src/app/globals.css` (`@theme inline` + `:root`/`.dark`). Шрифты: заголовки (`h1/h2/h3`, `.font-display`) — **Cormorant Garamond** (`--font-display`, элегантный serif), текст/UI — **Manrope** (`--font-sans`). Работай через семантические классы Tailwind (`bg-primary`, `text-foreground`, `border-border`, `text-muted-foreground`, `font-display`), никогда не хардкодь hex/oklch. Личность: **тёплый сезонный fine-dining** — кремово-пергаментный фон (тёплый, hue ~75–92), глубокий приглушённый «можжевеловый» зелёный primary (hue ~145) как фирменный цвет, тёплый терракот/обожжённый оранжевый accent (hue ~34). Контраст элегантного serif-заголовка и спокойного гротеска в тексте. Тон ресторанный, тёплый, не «технологичный». | Роль | Light | Характер | |---|---|---| | `background` | тёплый кремовый пергамент | основной фон страниц | | `foreground` | тёмный тёплый коричнево-чёрный | текст | | `primary` | глубокий можжевеловый зелёный | бренд: лого JT, CTA, цены, акценты; footer/CTA-панели `bg-primary text-primary-foreground` | | `accent` | терракот/обожжённый оранжевый | редкие тёплые точечные акценты (charts) | | `secondary` | тёплый светлый песочный | мягкие бейджи, плашки | | `muted` / `muted-foreground` | тёплый бежевый / приглушённый коричневый | вторичный текст, фон секций, hover | | `card` | чистый белый | панели `RestaurantPanel`, формы, таблицы | | `border` | тёплый бежевый | тонкие границы (1px) везде | Узнаваемые приёмы (держи их — это «лицо» шаблона): - **Мягкие углы:** `--radius` = 0.5rem; всё на `rounded-md` (карточки, кнопки, фото-панели). Не используй острые `rounded-none` или сильно скруглённые pill-формы. - **`RestaurantPanel`** (`src/shared/ui/restaurant-panel.tsx`) — фирменная панель: `rounded-md border border-border bg-card` + едва заметная тёплая тень `shadow-[0_1px_0_rgba(67,44,17,0.05)]`. Используй её для секционных карточек вместо голого `div`. - **`Container`** (`src/shared/ui/container.tsx`) — `max-w-[1320px]` + `px-5 sm:px-8`; единый горизонтальный ритм страниц. - **Hero-фон:** утилита `.restaurant-tablecloth` (тёплая «скатерть» — зелёно-охровая сетка-льняная фактура 42px с mask-fade) для главного hero. - **Serif-дисплей:** заголовки через `font-display` (`text-4xl`…`text-[6.2rem]`, плотный `leading-[0.94]`); eyebrow-метки `text-xs font-semibold uppercase tracking-[0.18em] text-primary`. - **Тонкие разделители:** `Separator` и `border-b border-border` в списках блюд/пакетов; структура на линиях, не на тенях. Do / Don't: - **Do:** держи кремово-зелёную палитру и терракотовый акцент; serif-заголовки + Manrope-текст; оборачивай секции в `Container`/`RestaurantPanel`; продавай ресторанную специфику (посадка, pairing, аллергены, тайминг вечера). - **Don't:** не вводи холодный синий/чёрный primary, неоновые градиенты, тяжёлые drop-shadow, острые углы или generic-SaaS hero — это ломает тёплый fine-dining тон. ## File Map | Route | Widget | |---|---| | `/` | `src/widgets/home-page.tsx` (`HomePage`) | | `/menu` | `src/widgets/menu-page.tsx` (`MenuPage`) | | `/reservations` | `src/widgets/reservations-page.tsx` (`ReservationsPage`) | | `/private-events` | `src/widgets/private-events-page.tsx` (`PrivateEventsPage`) | | `/about` | `src/widgets/about-page.tsx` (`AboutPage`) | | `/contact` | `src/widgets/contact-page.tsx` (`ContactPage`) | Переиспользуемые блоки: - `src/widgets/site-shell.tsx` — `SiteHeader` + `SiteFooter` (обёртка из `src/app/layout.tsx`). - `src/widgets/menu-section-board.tsx` — `MenuSectionBoard` (Home, Menu). - `src/widgets/dish-showcase.tsx` — `DishShowcase` (Home, Menu; локальный `DishRow` внутри). - `src/widgets/seating-guide.tsx` — `SeatingGuide` (Home, Reservations). - `src/widgets/restaurant-evening-plan.tsx` — `RestaurantEveningPlan` (Home, Reservations). - `src/widgets/private-events-grid.tsx` — `PrivateEventsGrid` (Home, Private events). - `src/widgets/testimonial-band.tsx` — `TestimonialBand` (Home, About). - `src/shared/ui/container.tsx` — `Container` (горизонтальный wrapper всех секций). - `src/shared/ui/restaurant-panel.tsx` — `RestaurantPanel` (фирменная карточка-панель). - `src/shared/ui/section-header.tsx` — `SectionHeader` (eyebrow + заголовок секции). - `src/shared/ui/inner-hero.tsx` — `InnerHero` (хедер всех внутренних страниц). - `src/shared/ui/info-columns.tsx` — `InfoColumns` (правила/dietary notes; используется в Menu и Reservations). - `src/shared/ui/cta-panel.tsx` — `CtaPanel` (Menu, Private events). - `src/shared/ui/split-story.tsx` — `SplitStory` (готовый props-блок image+points, сейчас не подключён ни одной страницей). Одноразовые блоки колоцированы со своей страницей: - `PageHero` — внутри `home-page.tsx`. - `FeaturedGrid`, `PairingBoard` (+ `WineIcon`), `PricingTiles`, `DietaryNotes` — внутри `menu-page.tsx`. - `ReservationForm`, `ReservationRules` — внутри `reservations-page.tsx`. - `ChefStory`, `SupplierLedger`, `MetricStrip` — внутри `about-page.tsx`. - `IconCards`, `HoursBoard`, `ContactForm` — внутри `contact-page.tsx`. - `EventPlanner` — внутри `private-events-page.tsx`.