Professional airport-to-ski-resort transfer service website
Next.js, Tailwind CSS, and multi-step booking form for the French Alps
AET-ski is a premium one-man taxi service transferring clients from airports to ski resorts in the French Alps. This website redesign focuses on increasing quote conversions and enhancing visual appeal while maintaining the brand attributes of being genuine, reliable, warm, welcoming, and experienced.
- Multi-step booking form with dynamic route selection
- Interactive route maps using MapTiler integration
- Responsive design optimized for all devices
- Content management via Sanity CMS
- Image optimization with Cloudinary
- Performance optimized with Next.js 14
- Next.js 14 - React framework with App Router
- React 18 - UI library with hooks
- Tailwind CSS - Utility-first CSS framework
- TypeScript - Type-safe JavaScript
- Lucide Icons - Beautiful icon library
- Flag Icons - Country flag display
- Node.js - Server-side runtime
- Sanity CMS - Headless content management
- MapTiler - Interactive maps and routing
- Cloudinary - Image and media management
- ESLint - Code linting
- Jest - Unit testing
- Cypress - E2E testing
- PostCSS - CSS processing
aet-ski/
βββ src/
β βββ app/ # Next.js App Router
β β βββ booking/ # Multi-step form pages
β β βββ routes/ # Dynamic route-map pages
β β βββ layout.tsx # Root layout
β β βββ page.tsx # Landing page
β βββ components/ # Reusable UI components
β βββ hooks/ # Custom React hooks
β βββ lib/ # Utility libraries
β βββ styles/ # Global styles
β βββ types/ # TypeScript definitions
βββ public/ # Static assets
βββ tokens.json # Design tokens
βββ tokens.schema.json # Token validation schema
βββ package.json # Dependencies & scripts
- Node.js 18+
- npm or yarn
- Git
-
Clone the repository
git clone https://github.com/Explorimentalist/aet-ski.git cd aet-ski -
Install dependencies
npm install
-
Set up environment variables
cp .env.example .env.local
Configure the following variables in
.env.local:# Sanity CMS NEXT_PUBLIC_SANITY_PROJECT_ID=your_project_id NEXT_PUBLIC_SANITY_DATASET=production SANITY_API_TOKEN=your_api_token # MapTiler NEXT_PUBLIC_MAPTILER_KEY=your_maptiler_key # Cloudinary NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=your_cloud_name CLOUDINARY_API_KEY=your_api_key CLOUDINARY_API_SECRET=your_api_secret
-
Run the development server
npm run dev
-
Open your browser Navigate to http://localhost:3000
# Development
npm run dev # Start development server
npm run build # Build for production
npm run start # Start production server
# Code Quality
npm run lint # Run ESLint
npm run lint:fix # Fix ESLint issues
# Testing
npm run test # Run unit tests
npm run test:ci # Run tests in CI mode
npm run cypress # Open Cypress E2E tests
npm run cypress:run # Run Cypress tests headlesslyThe project uses a comprehensive design token system for consistency:
- Colors: Brand-aligned palette with semantic roles
- Typography: GT Walsheim Trial (headings) + Geist (body)
- Spacing: 4px base unit system
- Grid: Responsive 4/8/12 column layouts
- Components: Pre-built UI components with token integration
Button- Primary, secondary, and ghost variantsCard- Large and small card layoutsInput- Form inputs with validation statesNavigation- Responsive navigation componentFooter- Site footer with linksLogo- Brand logo component
- Step 1: Route selection with interactive map
- Step 2: Date and time selection
- Step 3: Passenger details and preferences
- Step 4: Quote generation and confirmation
- Real-time route visualization
- Airport and resort location markers
- Distance and travel time calculations
- Responsive map controls
- Dynamic content via Sanity CMS
- Image optimization with Cloudinary
- SEO-friendly metadata
- Multi-language support ready
npm run testnpm run cypressnpm run test:cinpm run build
npm run start- Ionos.fr - Primary hosting
- Fasthosts.co.uk - Secondary hosting
- GitHub Actions - CI/CD pipeline
- Push to
mainbranch - GitHub Actions runs tests and builds
- Automatic deployment to production servers
- Health check verification
- Lighthouse Score: 95+ across all metrics
- Core Web Vitals: Optimized for user experience
- Image Optimization: Automatic WebP conversion
- Code Splitting: Route-based optimization
- Caching: Static generation where possible
- Follow TypeScript best practices
- Use ESLint configuration
- Write meaningful commit messages
- Include JSDoc comments for complex functions
- Create feature branch:
git checkout -b feature/your-feature - Make changes and commit:
git commit -m "feat: add new feature" - Push branch:
git push origin feature/your-feature - Create pull request for review
- Merge after approval
- Never commit
.envfiles - Use
.env.examplefor documentation - Set production variables in hosting platform
- Validate required variables at build time
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
This project is proprietary software for AET-ski transportation services.
For technical support or questions:
- Create an issue on GitHub
- Contact the development team
- Check the project documentation
Built with β€οΈ for AET-ski - Elevating alpine transportation experiences through thoughtful design and technology.