# BLACK HEART DANCE HOUSE — Project Context ## About Landing page for "BLACK HEART DANCE HOUSE" — a pole dance school in Minsk, Belarus. Instagram: @blackheartdancehouse Content language: Russian ## Tech Stack - **Next.js 15** (App Router, TypeScript) - **Tailwind CSS v4** (light + dark mode, class-based toggle) - **lucide-react** for icons - **Fonts**: Inter (body) + Oswald (headings) via `next/font` - **Hosting**: Vercel (planned) ## Code Style - Function declarations for components (not arrow functions) - PascalCase for component files, camelCase for utils - `@/` path alias for imports - Semantic CSS classes via `@apply`: `surface-base`, `surface-muted`, `heading-text`, `body-text`, `nav-link`, `card`, `contact-item`, `contact-icon`, `theme-border` - Only Header + ThemeToggle are client components (minimal JS shipped) - `next/image` with `unoptimized` for PNGs that need transparency preserved ## Project Structure ``` src/ ├── app/ │ ├── layout.tsx # Root layout, fonts, metadata │ ├── page.tsx # Landing: Hero → Team → About → Classes → Contact │ ├── globals.css # Tailwind imports │ ├── styles/ │ │ ├── theme.css # Theme variables, semantic classes │ │ └── animations.css # Keyframes, scroll reveal, modal animations │ ├── icon.png # Favicon │ └── apple-icon.png ├── components/ │ ├── layout/ │ │ ├── Header.tsx # Sticky nav, mobile menu, theme toggle ("use client") │ │ └── Footer.tsx │ ├── sections/ │ │ ├── Hero.tsx │ │ ├── Team.tsx # "use client" — clickable cards + modal │ │ ├── About.tsx │ │ ├── Classes.tsx │ │ └── Contact.tsx │ └── ui/ │ ├── Button.tsx │ ├── SectionHeading.tsx │ ├── SocialLinks.tsx │ ├── ThemeToggle.tsx │ ├── Reveal.tsx # Intersection Observer scroll reveal │ └── TeamMemberModal.tsx # "use client" — member popup ├── data/ │ └── content.ts # ALL Russian text, structured for future CMS ├── lib/ │ └── constants.ts # BRAND constants, NAV_LINKS └── types/ ├── index.ts ├── content.ts # SiteContent, TeamMember, ClassItem, ContactInfo └── navigation.ts ``` ## Brand / Styling - **Accent**: rose/red (`#e11d48`) - **Dark mode**: bg `#0a0a0a`, surface `#171717` - **Light mode**: bg `#fafafa`, surface `#ffffff` - Logo: transparent PNG, uses `dark:invert` + `unoptimized` ## Content Data - All text lives in `src/data/content.ts` (type-safe, one file to edit) - 13 team members with photos, Instagram links, and personal descriptions - 6 class types (Exotic Pole Dance, Pole Dance, Body Plastic, etc.) - 2 addresses in Minsk, Yandex Maps embed with markers - Contact: phone, Instagram ## AST Index - **Always use the AST index** at `memory/ast-index.md` when searching for components, props, hooks, types, or styles - Contains: component tree, all exports, props, hooks, client/server status, CSS classes, keyframes - Covers all 31 TS/TSX files + 4 CSS files - Update the index when adding/removing/renaming files or exports ## Database Migrations - **Never drop/recreate the database** — admin data (photos, edits, registrations) lives there - Schema changes go through versioned migrations in `src/lib/db.ts` (`migrations` array) - Add a new entry with the next version number; never modify existing migrations - Migrations run automatically on server start via `runMigrations()` and are tracked in the `_migrations` table - Use `CREATE TABLE IF NOT EXISTS` and column-existence checks (`PRAGMA table_info`) for safety ## Git - Remote: Gitea at `git.dolgolyov-family.by` - User: diana.dolgolyova - Branch: main