A modern, responsive website for ARK Scavenger Hunt showcasing our Cluedo-themed team building experiences in Toronto. Built with Next.js 14, Tailwind CSS, Framer Motion, and deployed on Cloudflare Pages.
- Modern Design: Glass-morphism effects, gradients, and smooth animations
- Responsive Layout: Mobile-first approach with beautiful breakpoints
- Interactive Sections:
- Hero section with animated background
- How It Works timeline
- Game modes and steps sections
- Scoring system display
- Image gallery with lightbox
- Customer testimonials
- Contact form with validation
- Blog System: SEO-optimized blog with dynamic routing
- PWA Support: Manifest file for progressive web app features
- Backend Integration:
- Supabase for database storage
- Resend for email notifications
- Form validation with Zod
- Performance Optimized: Next.js 15 with App Router, lazy loading, and optimized images
- Framework: Next.js 15.3.4 with App Router
- Language: TypeScript 5.9.2
- Styling: Tailwind CSS 4.1.11 with custom utilities
- Animations: Framer Motion 12.23.12
- UI Components: Shadcn/ui with Radix UI primitives
- Forms: React Hook Form 7.62.0 + Zod 3.25.76 validation
- Icons: Lucide React 0.525.0
- Database: Supabase (PostgreSQL)
- Email: Resend 4.8.0
- Analytics: Vercel Analytics & Speed Insights
- Deployment: Vercel
-
Clone the repository
git clone https://github.com/your-username/ark-scavenger-hunt.git cd ark-scavenger-hunt -
Install dependencies
pnpm install # or npm install -
Set up environment variables
cp .env.example .env.local
Fill in your environment variables:
# Supabase Configuration NEXT_PUBLIC_SUPABASE_URL=your_supabase_url_here NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key_here SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key_here # Resend Email Configuration RESEND_API_KEY=your_resend_api_key_here # Application Configuration NEXT_PUBLIC_APP_URL=http://localhost:3000
-
Set up Supabase Database
Run these SQL commands in your Supabase SQL editor:
-- Create contacts table CREATE TABLE contacts ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, company_name TEXT NOT NULL, contact_person TEXT NOT NULL, email TEXT NOT NULL, phone TEXT, team_size INTEGER, preferred_date DATE, special_requirements TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), status TEXT DEFAULT 'new' CHECK (status IN ('new', 'contacted', 'converted')) ); -- Create reviews table CREATE TABLE reviews ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, company_name TEXT NOT NULL, reviewer_name TEXT NOT NULL, rating INTEGER CHECK (rating >= 1 AND rating <= 5), review_text TEXT NOT NULL, image_url TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), is_featured BOOLEAN DEFAULT FALSE ); -- Create gallery_images table CREATE TABLE gallery_images ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, title TEXT NOT NULL, description TEXT, image_url TEXT NOT NULL, thumbnail_url TEXT NOT NULL, created_at TIMESTAMPTZ DEFAULT NOW(), is_featured BOOLEAN DEFAULT FALSE ); -- Create videos table CREATE TABLE videos ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, title TEXT NOT NULL, description TEXT, video_url TEXT NOT NULL, thumbnail_url TEXT NOT NULL, created_at TIMESTAMPTZ DEFAULT NOW(), is_hero_video BOOLEAN DEFAULT FALSE ); -- Enable Row Level Security ALTER TABLE contacts ENABLE ROW LEVEL SECURITY; ALTER TABLE reviews ENABLE ROW LEVEL SECURITY; ALTER TABLE gallery_images ENABLE ROW LEVEL SECURITY; ALTER TABLE videos ENABLE ROW LEVEL SECURITY; -- Create policies for public access (adjust as needed) CREATE POLICY "Allow public inserts on contacts" ON contacts FOR INSERT WITH CHECK (true); CREATE POLICY "Allow public read on reviews" ON reviews FOR SELECT USING (is_featured = true); CREATE POLICY "Allow public read on gallery" ON gallery_images FOR SELECT USING (true); CREATE POLICY "Allow public read on videos" ON videos FOR SELECT USING (true);
-
Run the development server
pnpm dev # or npm run devOpen http://localhost:3000 in your browser.
βββ apps/ # Future monorepo applications
β βββ hunt/ # Hunt-specific app (placeholder)
β βββ web/ # Web app (placeholder)
βββ packages/ # Shared packages (future monorepo)
β βββ lib/ # Shared library code
β βββ types/ # Shared TypeScript types
β βββ ui/ # Shared UI components
βββ src/ # Main application source
β βββ app/
β β βββ api/
β β β βββ contact/ # Contact form API route
β β βββ blog/ # Blog pages and layout
β β βββ globals.css # Global styles and custom utilities
β β βββ layout.tsx # Root layout with metadata
β β βββ manifest.ts # PWA manifest
β β βββ page.tsx # Main homepage
β β βββ sitemap.ts # Dynamic sitemap generation
β βββ components/
β β βββ sections/ # Page sections
β β β βββ hero-section.tsx
β β β βββ how-it-works.tsx
β β β βββ gallery-section.tsx
β β β βββ game-modes-section.tsx
β β β βββ game-steps-section.tsx
β β β βββ scoring-system-section.tsx
β β β βββ testimonials-section.tsx
β β β βββ contact-form.tsx
β β β βββ footer.tsx
β β βββ ui/ # Reusable UI components (Shadcn/ui)
β β βββ blog-scroll-handler.tsx
β βββ lib/
β β βββ supabase.ts # Supabase client configuration
β β βββ resend.ts # Resend email configuration
β β βββ email-templates.ts # Email template definitions
β β βββ utils.ts # Utility functions
β βββ types/
β βββ index.ts # TypeScript type definitions
βββ supabase/ # Supabase configuration and functions
β βββ config.toml # Supabase local config
β βββ functions/ # Edge functions
βββ public/ # Static assets
β βββ gallery/ # Gallery images and videos
β βββ ark-logo.png # Brand assets
βββ performance_review/ # Performance analysis reports
The website uses custom gradient classes defined in globals.css:
.gradient-hero- Hero section background.gradient-cluedo- Cluedo-themed dark gradient.glass- Glass morphism effect.animated-gradient- Animated background gradient
- Create a new component in
src/components/sections/ - Import and add it to
src/app/page.tsx - Follow the existing animation patterns with Framer Motion
Forms use React Hook Form with Zod validation. Schema definitions are in each component file.
pnpm dev/npm run dev- Start development serverpnpm build/npm run build- Build for productionpnpm start/npm run start- Start production serverpnpm lint/npm run lint- Run ESLint
- TypeScript strict mode enabled
- ESLint + Prettier for code formatting - sometimes i prefer biome here.
- Tailwind CSS for styling
- Consistent naming conventions
Consider adding:
- Google Analytics or Vercel Analytics
- Sentry for error monitoring
- Supabase Analytics for database insights
This project is private and proprietary to ARK Scavenger Hunt.
- Create a feature branch from
main - Make your changes following the existing code style
- Test thoroughly
- Submit a pull request
For technical issues or questions:
- Check the Next.js documentation
- Review Supabase documentation
- Contact the development team
Built with β€οΈ for unforgettable team building experiences in Toronto.