Edit the copy and chapters
All content is in lib/watch.ts:
MODEL is the product name shown in the HUD and dialog.
CHAPTERS holds each chapter's kicker, title, tagline and optional stats pairs. The stat values live:time and live:zone are replaced with the visitor's local time and time zone.
PARTS lists the seven exploded-view callouts in assembly order (name and sub-line).
CH maps chapter ids to indexes; keep it in step if you add or remove chapters.
The booking dialog's boutique list and confirmation text are in components/ui/Booking.tsx. The dialog confirms locally and sends nothing: connect its submit handler to your CRM, email service or form endpoint.
Change the configurator options
METALS and DIALS in lib/watch.ts define the swatches. Each metal has a display name, a sub-line, a color, polish and brush roughness values and a swatch colour; each dial has a color, a print colour for the numerals and logo, and a swatch. Add or remove entries and update the MetalId and DialId types. The scene morphs the shared materials toward the selection every frame, so new options need no extra materials.
Tune poses and camera stops
POSES in lib/journey.ts sets, per chapter, the watch rotation, explode (0–1), lume (0–1), open (bracelet laid flat) and env (studio light intensity).
components/scene/CameraRig.tsx has one camera stop per chapter, in a DESKTOP table and a PORTRAIT table used below an aspect ratio of 0.9.
- Adding a chapter means one entry in
CHAPTERS, POSES and both camera tables.
Swap the watch for your own model
The watch is procedural: geometry in lib/geometry.ts, textures in lib/textures.ts, assembly in components/scene/Watch.tsx and materials in components/scene/materials.ts. To show your own product, load a GLB with three.js's GLTFLoader (or drei's useGLTF if you add it) inside Watch.tsx and assign the shared materials from createMaterials() to its meshes, so the configurator keeps working. Use models you have the rights to and credit them as their licence requires.
Colours and fonts
- Page colours are CSS variables at the top of
app/globals.css: --bg, --fg, --dim, --gold (accent) and --lume (after-dark accent). The 3D background colour is set in components/scene/Experience.tsx.
- Fonts are loaded with
next/font/google in app/layout.tsx: Cormorant Garamond for display, Cormorant SC for small caps and Jost for body text. Replace them with any Google or local font and keep the --font-display, --font-caps and --font-sans variables.
Lighting and effects
- The studio softboxes and bounce card are in
components/scene/Studio.tsx.
- Bloom, chromatic aberration, tone mapping, grain and vignette are in
components/scene/Experience.tsx. Lower the bloom intensity or remove effects for a lighter build; the device pixel ratio is capped at 1.75 there.
Reduced motion and accessibility
Reduced motion is detected in components/Journey.tsx and stored as journey.reducedMotion. Keep that check in any animation you add. Chapters can be reached from the keyboard and the chapter rail, and the configurator swatches are radio buttons with labels.