Skip to content

About this template

Lumen Drift is a single-page launch site for a piece of hardware. Its hero object is a desk lamp built entirely in three.js from primitives, with no model files, textures or HDRIs. A full-screen WebGL stage sits behind the page. As the visitor scrolls through four feature chapters, the lamp turns on its base, bends at both hinges and tilts its head, and its light shifts between cool white, amber and violet. A soft beam cone, a halo, drifting dust motes and a pool of light on the floor make the scene feel lit rather than rendered.

The template suits small hardware teams, crowdfunding campaigns and product designers who want a preorder page that shows the object moving instead of a carousel of photos. The look is near-black, with large Space Grotesk headlines, Inter body text and a spec sheet set in JetBrains Mono with hairline rules and oversized key figures. Every UI accent picks up the lamp's current color: the scroll progress line, the chapter dots, button glows and the live readout in the corner that shows head angle, output and tone hex. A small SVG day curve in the fourth chapter draws itself as you scroll.

The scroll choreography is set by a keyframe table. Each section has a pose, a camera position and a light color, and GSAP ScrollTrigger interpolates between them. Lenis provides the inertial scrolling. With reduced motion turned on, the page skips the animation and jumps to each pose.

To adapt the page, change the brand, product name, product type, price, ship window and audience in one content file, then rewrite the chapter copy. The lamp's geometry and color stops are short, commented constants, so you can reshape it into a grow light, a studio key light or a reading lamp without changing the layout.

The template prompt

The live demo was built from exactly this text — nothing added.

# 3D Product Launch Page

Build this website exactly as described below. Replace the [VARIABLES] with your own values; keep everything else.

## Brief
A single-page, dark, cinematic product launch site for [PRODUCT_NAME], a [PRODUCT_TYPE] by [BRAND]. A fixed full-viewport three.js canvas renders a lamp built procedurally from primitives. HTML sections scroll over it: hero, four feature chapters (Focus, Warm, Night, Rhythm) with copy alternating left and right, a hairline spec sheet and a preorder call to action. Scroll progress drives the lamp's base turn, arm pose, head tilt, camera dolly and light color through a fixed keyframe table. The lamp has a volumetric beam cone, a bloom halo, floating dust motes and a lit pool on the floor. Every UI accent follows the lamp's current light color.

- Audience: Visitors deciding whether to preorder [PRODUCT_NAME], mainly [AUDIENCE]. The template itself is for hardware startups, crowdfunding campaigns and product designers who want a launch page that shows the product moving.
- Goal: Show what the product does by moving it on screen: each chapter puts the lamp in a new pose and color. Then back it up with a precise spec sheet and end on a calm, low-pressure preorder reservation (static UI only).
- Tone: Quiet, confident and precise. Short declarative headlines, concrete numbers, no exclamation marks and no hype words. It should feel like a film title sequence crossed with an engineering datasheet.

## Stack
- Framework: Vite 5 + TypeScript + three.js
- Styling: Vanilla CSS
- Libraries: three (incl. three/examples/jsm: EffectComposer, RenderPass, UnrealBloomPass, OutputPass, RoomEnvironment) (MIT), gsap (core + ScrollTrigger) (GSAP Standard License (free, commercial use allowed)), lenis (MIT), @fontsource/space-grotesk (OFL-1.1), @fontsource-variable/inter (OFL-1.1), @fontsource/jetbrains-mono (OFL-1.1), typescript (dev) (Apache-2.0), vite (dev) (MIT)
- Build: `npm run build` → static files in `dist/`. No backend, no server code, no external APIs.
- Setup:
  - Scaffold with `npm create vite@latest` using the vanilla-ts template, then `npm i three gsap lenis @fontsource/space-grotesk @fontsource-variable/inter @fontsource/jetbrains-mono` and `npm i -D @types/three`.
  - vite.config.ts: `base: './'`, `build.sourcemap: false`, `build.outDir: 'dist'`, `build.assetsInlineLimit: 0`. Do not copy src/ into dist/.
  - package.json scripts: `dev: vite`, `build: tsc && vite build`, `preview: vite preview`.
  - File layout: index.html, src/main.ts (boot, Lenis, ScrollTrigger wiring), src/content.ts (ALL copy and variable values in one exported object), src/styles.css (all CSS, tokens as custom properties, all @keyframes), src/scene/stage.ts (renderer, camera, composer, lights, floor, render loop), src/scene/lamp.ts (procedural lamp), src/scene/beam.ts (beam cone shader, halo sprite, dust points, floor pool), src/scene/keyframes.ts (the keyframe table and state object), src/ui/hud.ts (live readout and --light CSS variable).
  - Render all HTML copy from src/content.ts at boot (template strings into section containers) so swapping variables only touches that file. If the variable values differ from the defaults, rewrite every headline, body line, stat and spec row in content.ts to fit the new product while keeping the same lengths and structure.
  - Import fonts once in main.ts: `@fontsource/space-grotesk/500.css`, `/600.css`, `@fontsource-variable/inter`, `@fontsource/jetbrains-mono/400.css`, `/500.css`.
  - Register GSAP plugins: `gsap.registerPlugin(ScrollTrigger)`. Drive Lenis from gsap.ticker (`gsap.ticker.add(t => lenis.raf(t*1000))`, `gsap.ticker.lagSmoothing(0)`, `lenis.on('scroll', ScrollTrigger.update)`). Lenis options: `duration: 1.15`, easing `t => Math.min(1, 1.001 - Math.pow(2, -10*t))`.
  - Add public/favicon.svg: a 32×32 rounded square #07080B with a centered #FFB547 ring (r=8, stroke 3) and a 3px dot. `<title>` is `[PRODUCT_NAME] — [BRAND]`.
  - Write ASSETS.md at the project root stating that the site uses no third-party image, icon, model or texture files. Everything is generated in code, and fonts come from Fontsource (OFL-1.1).

## Variables
- [BRAND] — Brand name (default: "Kelvane"). Invented company name shown in the header wordmark and footer
- [PRODUCT_NAME] — Product name (default: "Sola One"). The product being launched
- [PRODUCT_TYPE] — Product type (default: "smart desk lamp"). Lowercase noun phrase used in running copy
- [PRICE] — Preorder price (default: "$249")
- [SHIP_WINDOW] — Ship window (default: "March 2027"). Month and year shown in the hero eyebrow and preorder block
- [AUDIENCE] — Audience (default: "people who work, read and wind down at the same desk"). Lowercase phrase that completes 'built for …'
- [CREDIT] — keep a small "Template by VibeFather" link to https://vibefather.ai/t/3d-product-launch-page in the footer (default: yes; delete this line to remove it)

The copy under Pages & Sections is written for the default values. If your values differ, rewrite every headline, paragraph, label and image for them — same length, tone and structure. Layout, colors, type and motion stay as described.
Keep all copy, image paths and links in one content file (for example `src/content.ts`), keyed by section, so the content can be swapped later without touching components.

Pro template. The design, sections, motion and assets parts of this prompt are for Pro members. The live demo and DESIGN.md stay free.

Join Pro early access →

DESIGN.md

The design system on its own — colors, type, spacing and motion. Apply this look to a project you already have.

---
name: "3D Product Launch Page"
colors:
  void: "#07080B"
  graphite: "#0E1016"
  hairline: "#1C1F27"
  bone: "#ECEAE4"
  ash: "#8A8F9C"
  amber: "#FFB547"
  frost: "#E6F0FF"
  violet: "#9C7CFF"
  rim: "#5C6680"
  light_dynamic: "var(--light), updated from the 3D light color"
typography:
  display_h1_h2_big_spec_numerals: { family: "Space Grotesk", weights: [500, 600] }
  text_body_nav_buttons: { family: "Inter Variable", weights: [400, 500] }
  mono_eyebrows_hud_spec_table_values_chart_labels: { family: "JetBrains Mono", weights: [400, 500] }
spacing: "8px base unit. Content grid: 12 columns, max-width 1280px, 24px gutters, side padding clamp(20px, 5vw, 72px). Type scale: H1 clamp(56px, 9vw, 148px) / line-height 0.92 / letter-spacing -0.04em, weight 500. H2 clamp(36px, 5vw, 72px) / 1.0 / -0.03em, weight 500. Body 17px / 1.6 in Ash, max-width 440px. Eyebrow mono 12px uppercase, letter-spacing 0.14em, color var(--light). Big spec numerals: Space Grotesk 600, clamp(64px, 8vw, 128px), tabular. Hero is 100vh. Each feature chapter is 160vh tall with its copy block starting 30vh from the section top. The spec sheet and preorder sections use natural height with 160px vertical padding (96px on mobile)."
radius: "Buttons and pills 999px. Mobile copy cards, the email input group and HUD panel 14px. Spec table and rules 0 (square, hairline only)."
---

# 3D Product Launch Page — Design System

Apply this design system to an existing project. It describes the look and feel only; for the full site, use prompt.md.

## Colors
- **Void** `#07080B` — Page background, scene background, fog color
- **Graphite** `#0E1016` — Mobile copy cards, input background, header background at 72% opacity
- **Hairline** `#1C1F27` — 1px rules, table lines, borders, inactive chapter dots
- **Bone** `#ECEAE4` — Primary text, primary button fill
- **Ash** `#8A8F9C` — Body copy, secondary labels, mono captions
- **Amber** `#FFB547` — Light stop 'Warm' (2700K); default --light value; hero and preorder light
- **Frost** `#E6F0FF` — Light stop 'Focus' (5000K)
- **Violet** `#9C7CFF` — Light stop 'Night' (ambient)
- **Rim** `#5C6680` — Constant cool rim light behind the lamp in the 3D scene
- **--light (dynamic)** `var(--light), updated from the 3D light color` — Every UI accent: eyebrows, progress line, active chapter dot, button glow, HUD tone swatch, focus rings

## Typography
- **Display (H1, H2, big spec numerals)** — Space Grotesk (OFL), weights 500/600. Self-host the font files.
- **Text (body, nav, buttons)** — Inter Variable (OFL), weights 400/500. Self-host the font files.
- **Mono (eyebrows, HUD, spec table values, chart labels)** — JetBrains Mono (OFL), weights 400/500. Self-host the font files.

## Spacing & shape
- Spacing: 8px base unit. Content grid: 12 columns, max-width 1280px, 24px gutters, side padding clamp(20px, 5vw, 72px). Type scale: H1 clamp(56px, 9vw, 148px) / line-height 0.92 / letter-spacing -0.04em, weight 500. H2 clamp(36px, 5vw, 72px) / 1.0 / -0.03em, weight 500. Body 17px / 1.6 in Ash, max-width 440px. Eyebrow mono 12px uppercase, letter-spacing 0.14em, color var(--light). Big spec numerals: Space Grotesk 600, clamp(64px, 8vw, 128px), tabular. Hero is 100vh. Each feature chapter is 160vh tall with its copy block starting 30vh from the section top. The spec sheet and preorder sections use natural height with 160px vertical padding (96px on mobile).
- Radius: Buttons and pills 999px. Mobile copy cards, the email input group and HUD panel 14px. Spec table and rules 0 (square, hairline only).

## Motion
- Lenis inertial scrolling (duration 1.15, expo-out easing) synced with GSAP ScrollTrigger.
- Scroll-scrubbed 3D choreography: per-section ScrollTriggers (scrub 1.2) tween one shared state object between keyframes. The render loop reads that state every frame.
- Text reveal on enter: every element marked data-reveal goes from opacity 0 / translateY(24px) to 0 / 0 over 0.9s, ease power3.out, stagger 0.08s, triggered at 'top 75%' once.
- Hero intro on load: the canvas fades from black over 1.2s while the lamp's intensity ramps 0 → 1 (power2.inOut). Then H1 lines rise with clip-path inset(100% 0 0 0) → inset(0) over 1.0s, stagger 0.12s, starting at 0.4s.
- Idle life (not scroll-bound): the head breathes ±1.2° with sin(t·0.6), and the camera eases toward the pointer by up to ±0.15 units (lerp 0.05; desktop only).
- --light CSS variable written from the current 3D light color whenever it changes by more than 1/255 per channel. UI accents recolor in sync with the lamp.
- Header progress line: scaleX bound to overall scroll progress, color var(--light).
- Rhythm chapter SVG day curve: stroke-dashoffset scrubbed from full length to 0 across the chapter, with a marker dot following the path.
- Buttons: 200ms transition on box-shadow and transform. Hover adds a var(--light) glow and translateY(-1px).
- prefers-reduced-motion: no Lenis, no scrub, no idle motion, no dust drift, no reveals (content visible immediately). An IntersectionObserver (threshold 0.5) snaps the state to each section's keyframe instantly, and the scene renders only when state changes.

## Imagery
No bitmaps at all. The only visual is the real-time three.js scene: a graphite metal lamp with matte arms on a near-black floor in exponential fog, lit by its own spotlight. A volumetric cone, a bloom halo on the diffuser, faint dust motes and a soft light pool on the floor. A cool rim light outlines the silhouette from behind. UI graphics (wordmark mark, arrows, chapter dots, day-curve chart, favicon) are inline SVG drawn in code.

## Tone
Quiet, confident and precise. Short declarative headlines, concrete numbers, no exclamation marks and no hype words. It should feel like a film title sequence crossed with an engineering datasheet.

---
— Prompt by VibeFather · https://vibefather.ai/t/3d-product-launch-page · CC BY-NC 4.0 (non-commercial; commercial use needs a VibeFather Pro license) · Request removal: https://vibefather.ai/takedown