# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
ScaleSite is a Next.js 16 frontend-only application for a digital agency service platform. It provides web design and AI automation services with a complete client portal. The application uses mock data only—no backend or database.
**Tech Stack:**
- Next.js 16.1.6 with App Router and Turbopack
- React 19.2.3
- TypeScript 5
- Tailwind CSS v4 (CSS-based theme configuration)
- shadcn/ui components (Radix UI primitives)
- Lucide React icons
- React Hook Form + Zod validation
## Development Commands
```bash
# Start development server (runs on port 3000 by default)
npm run dev
# Production build
npm run build
# Start production server
npm start
# Lint
npm run lint
```
## Architecture
### Page Structure
**Public Pages (Marketing Layout)**
- `/` - Landing page with hero, services, pricing, testimonials, FAQ
- `/services` - Service selection with toggle between Web Design and AI Automation
- `/login` and `/register` - Authentication pages
**Protected Pages (Dashboard Layout)**
- `/dashboard` - Client dashboard with stats, projects, tickets
- `/billing` - Subscription management, payment methods, invoice history
**Checkout Flow**
- `/checkout` - Multi-step checkout (Account → Billing → Payment)
### Layouts
Pages use one of two layout wrappers:
**MarketingLayout** (`components/layouts/marketing-layout.tsx`)
- Used by: `/`, `/services`
- Includes: SiteHeader, SiteFooter
- Sticky header with glass morphism effect
**Dashboard Layout** (sidebar layout)
- Used by: `/dashboard`, `/billing`
- Note: Dashboard pages currently render inline without a wrapper component
- Components reference: `DashboardSidebar` in `components/layouts/dashboard-sidebar.tsx`
- Navigation items: Dashboard, Projects, AI Automations, Support, Billing, Settings
**Auth Layout** (`components/auth/auth-layout.tsx`)
- Used by: `/login`, `/register`
- Split screen: hero image (left) + form (right)
- No header/footer
**Minimal Layout**
- Used by: `/checkout`
- Logo header only, no navigation
### Data & Types
**TypeScript Types** (`lib/types/index.ts`)
- `User`, `ServiceType`, `PricingTier`, `PricingPlan`
- `Project`, `ProjectStatus`, `ProjectStage`
- `SupportTicket`, `TicketStatus`
- `Invoice`, `InvoiceStatus`, `PaymentMethod`, `Subscription`
- `CheckoutSession`, `CheckoutStep`, `Address`
- `Testimonial`, `FAQ`, `DashboardStats`
**Mock Data** (`lib/mock-data/`)
- All data is mocked—no API calls
- Exports: `mockProjects`, `mockSupportTickets`, `mockInvoices`, `mockTestimonials`, `mockPricingPlans`, etc.
- Helper functions: `getPricingPlanById()`, `getPricingPlansByServiceType()`, `getAllFAQs()`
### Component Organization
```
components/
├── auth/ # Auth-related components (social login, password input)
├── billing/ # Subscription, payment methods, invoice table
├── checkout/ # Checkout steps, summary, payment forms
├── dashboard/ # Stats cards, project cards, tickets
├── layouts/ # Marketing layout, header, footer, sidebar
├── marketing/ # Hero, service cards, pricing, testimonials, FAQ
├── mobile/ # Mobile-specific components (if implementing separate views)
└── ui/ # shadcn/ui base components (button, card, input, etc.)
```
### Icon System
**Lucide React Only**
- All icons use Lucide React (`lucide-react` package)
- Icons passed as components: `icon={Rocket}` not `icon="rocket"`
- Do NOT use Material Symbols (previously caused display issues)
- Import pattern: `import { Rocket, Bot, ArrowRight } from 'lucide-react'`
**Component Props Pattern**
For components that accept icons:
```tsx
import { LucideIcon } from 'lucide-react'
interface Props {
icon: LucideIcon // Pass component, not string
}
export function Component({ icon: Icon }: Props) {
return
}
```
### Styling & Theme
**Tailwind CSS v4 Configuration** (app/globals.css)
- Theme defined inline with `@theme` directive
- Custom colors:
- `primary`: #8B5CF6 (Electric Violet)
- `background`: #0B0B0B (Deep Obsidian)
- `surface`: #1E1E1E (Slate Gray)
- Dark mode by default: `` in root layout
**Utility Classes**
- `.glow-button` - Primary button with purple glow effect
- `.glass-card` - Glass morphism card background
- `.glass-nav` - Glass navigation header
### Special Patterns
**Checkout Suspense Boundary**
Checkout page uses `useSearchParams` which requires a Suspense boundary:
```tsx
// app/checkout/page.tsx
import { Suspense } from 'react'
import { CheckoutContent } from './checkout-content'
export default function CheckoutPage() {
return (
Loading...}>
)
}
```
The actual client component with `useSearchParams` is in `checkout-content.tsx`.
**Status Color Mapping**
Several components use Record types for status-based styling:
```tsx
const statusColors: Record = {
discovery: 'bg-blue-500/10 text-blue-400',
design: 'bg-purple-500/10 text-purple-400',
// ...
}
```
## Common Tasks
**Adding a New Page**
1. Create `app/route-name/page.tsx`
2. For marketing pages: wrap with `MarketingLayout`
3. For dashboard pages: render content inline (layout wrapper not yet implemented)
**Adding Mock Data**
1. Create file in `lib/mock-data/`
2. Export data and any helper functions
3. Re-export in `lib/mock-data/index.ts`
**Updating Icons**
- Always use Lucide React components
- Search available icons: https://lucide.dev/icons/
- Import and pass as component props
## Known Limitations
- No backend—all data is mocked
- Dashboard layout wrapper not implemented (pages render sidebar content inline)
- No authentication flow (login/register pages are UI only)
- No form validation connected (React Hook Form + Zod installed but not implemented)