Apple‑level single page experience with scroll‑driven, reversible animations, booking, contact form, and OpenAI chat.
cd server
cp .env.example .env # fill in SMTP, OpenAI, Google IDs, etc.
npm install
npm run dev
Runs at http://localhost:8787
cd client
npm install
npm run dev
Vite dev server: http://localhost:5173 (proxying /api to :8787)
cd client && npm run build
Deploy client/dist to static hosting. Deploy server/ to Node hosting and set env vars.
- React + TypeScript + Vite for speed and DX
- TailwindCSS for design tokens and consistent theming (black/platinum/silver)
- GSAP + ScrollTrigger for god‑tier motion, Lenis for silky scrolling
- Express server for secure contact email + OpenAI chat proxy
- Update copy, phone, email inside the sections (
src/modules/sections/*). - Replace
/client/public/assetswith your final logos/badges.
- Reduced motion by the OS is respected via GSAP’s prefers‑reduced‑motion behavior; keep content legible without animations.
- reCAPTCHA v3: set
VITE_RECAPTCHA_SITEKEYin client env andRECAPTCHA_SECRETin server env. - Analytics: set
VITE_PLAUSIBLE_DOMAINto enable Plausible inclient/index.html. - Calendar invites: ICS auto-attached on contact confirmation.
- Travel fee estimator: click on the map to compute distance & fee.
- SMTP relay (recommended): use
smtp-relay.gmail.comfrom Admin Console for highly deliverable emails. - Sheets logging: every contact submission can append a row to your Google Sheet (
SHEETS_SPREADSHEET_ID+SHEETS_CONTACTS_RANGE). - Calendar event creation: if
CALENDAR_IDis set, the server creates a Google Calendar event for the requested time. - Service account: paste JSON into
GOOGLE_APPLICATION_CREDENTIALS_JSONand enable domain-wide delegation for Sheets/Calendar scopes.
- Client can upload PDFs (or multiple files) via the Contact form or the
/uploadpage. - Server uploads to Google Drive if
DRIVE_ROOT_FOLDER_IDand service account JSON are configured. - If not configured, files save to
server/uploads(demo mode) and still work for local testing. - Uploaded file links are appended to your Contacts Google Sheet and included in the Calendar event description.