Dusklayer
Sign in Get Pro
N° 0004Product filmPro

Suspended Splash

A bottle drops into its own splash as you scroll, then the camera circles it while droplets cross the headline.

Source files, Studio plan

33 KB of text that builds one HTML file. Paste it into Claude Code, Cursor or v0 to rebuild this page.

Open full page Live. Scroll inside the preview to play it.
Loading the layer
LooksShowing Blood OrangeEach look changes the colours of the live preview and goes into the prompt you copy.
Make it yoursYour brand, copy and colours go into the prompt you copy. Colours change the preview live.
Brand remix is a Pro feature at launch. It is open in the preview.

Overview

A bottle drops into its own splash as you scroll, then the camera circles it in slow motion. The headline sits behind the liquid.

Signature momentThe crown splash at its peak, droplets crossing in front of the giant headline while the bottle splits it in two.

  1. The drop

    Scrolling the first half of the page scrubs 65 frames of a bottle falling into its own pool of juice. The splash grows with every pixel of scroll.

  2. The headline behind the liquid

    The DOM headline sits between a backdrop plate and the film. Each frame is keyed in a Web Worker, so droplets and sheets of liquid cross in front of the letters.

  3. The frozen orbit

    After the peak the camera walks around the splash while time stands still, 42 frames of a slow 12 degree arc.

  4. Flavour picker

    Three flavours regrade the whole film live through the runtime API: hue, saturation, accent and backdrop change together.

  5. A real page underneath

    The range with graded stills, nutrition per bottle, stockists by city and an order card with deposit terms.

  6. Phones

    A 5:6 crop of the film, fitted to the width and anchored to the bottom, with the headline in a band above it.

Build details

Kind
Product film
Plan
Pro
Tone
Dark
Industries
Food and drink, Ecommerce, Beauty
Technique
Image sequence
Built with
Lenis 1.3.27, other {'webgl': '1 (raw, one fragment shader)'}, plain HTML, CSS and one ES module
Looks
9
Weight
7.8 MB, layer files only
Mobile performance
100
Accessibility
100
Fidelity Score
In review
Licence
Commercial, including client work. No redistribution. Read it
Version
1, updated 2 November 2026
Released
2 November 2026
Parameters, 21 of them, all live through DUSKLAYER.set()
ControlKeyRangeDefault
Liquid hue shift (°)liquidHue-180 to 1800
Saturationsaturation0 to 1.61
Contrastcontrast0.8 to 1.41
Exposureexposure0.7 to 1.31
UI accentaccentcolor#FF6A2B
Backlight colourbgTonecolor#6A1F08
Backlight strengthbgGlow0 to 10.35
Headline layertextLayerselect: behind, front, blendbehind
Headline scaleheadlineScale0.6 to 1.31
Headline offset (viewport heights, landscape)headlineY-0.3 to 0.25-0.13
Portrait headroom above the film (tablets)mobileHeadroom0 to 0.350.24
Film offset at rest (viewport heights)idleDrop0 to 0.120.05
Key: colour thresholdkeyChroma0.02 to 0.40.08
Key: softnesskeySoft0.02 to 0.40.12
Key: highlight thresholdkeyLuma0.3 to 0.950.45
Camera zoomcameraZoom1 to 1.251.03
Pointer parallaxparallax0 to 10.6
Scrub weightscrubWeight0 to 10.5
Film graingrain0 to 0.080
Vignettevignette0 to 0.70.35
Seedseed1 to 99997

Something wrong with this layer? Report a problem and we fix it in the next version.

The prompt

One text file, 33 KB, 13 sections. Every number the page uses is in it, so another model can rebuild the layer without seeing this one.

  1. Role
  2. Output contract
  3. Assets (provided next to the file)
  4. Design tokens
  5. Layout
  6. Film engine
  7. Presets
  8. Keying (the core technique, use verbatim as the worker source)
  9. Motion
  10. Responsive and performance
  11. Acceptance checklist
  12. Customize
  13. Appendix: shooting your own film

How to use it

  1. Pick a look. The look you choose above is written into the prompt’s parameter block.
  2. Copy the prompt. Paste it into Claude Code, Cursor or v0 as the first message of a new session.
  3. Make it yours. Change the brand name, copy, colours and fonts first; every placeholder is marked. Keep the structure.
  4. Check it. The prompt ends with an acceptance checklist. Run through it before you ship.
Read the opening of the prompt
# Suspended Splash: build prompt

## Role
You are a senior creative front-end developer. Build the layer described below as one self-contained `index.html`: the homepage of a small sparkling-juice company whose hero is a scroll-scrubbed product film. A bottle drops into its own splash and the camera then circles the crown in ultra slow motion; the giant headline sits *behind* the liquid, so droplets and liquid sheets pass in front of the letters. Below the film the page is a believable drinks site: the range, what's in the bottle, stockists, an order card, a footer. A screenshot should pass for a real company's page.

## Output contract
- One file `index.html`, no build step, no framework. Plain HTML, CSS and an ES module.
- Import map with one exact version: `"lenis": "https://cdn.jsdelivr.net/npm/lenis@1.3.27/dist/lenis.mjs"`.
- Fonts: one Google Fonts link for {{FONT_DISPLAY}} roman only, `opsz,wght@9..144,300;9..144,400` (no italic anywhere), and {{FONT_BODY}} 400 and 500, loaded without blocking render (`media="print" onload="this.media='all'"`).
- `<title>` "{{BRAND_NAME}} sparkling blood orange | {{BRAND_NAME}}", a meta description, `theme-color` {{COLOR_BG}}.
- Real DOM text for every headline, paragraph, list and button. Canvas is decoration only and gets `aria-hidden="true"`.
- Expose `window.DUSKLAYER = { version: 1, params, set(values), pause(), resume(), ready }`. `ready` resolves after the first film frame is drawn; at that moment set `document.documentElement.dataset.dusklayerReady = '1'`.
- URL params: `?preset=001`, `?capture=1` (cursor hidden, no intro delay, no idle hover, start loading immediately instead of on idle, no spring lag: the playhead equals its target, key every frame up front and keep them, set `data-dusklayer-keyed="1"` when all are keyed), `?reduced=1`, `?quality=low|med|high` (high: decode window 10 ahead; med: 7; low: 7 and only every other frame), `?seed=42`.
- When framed, listen for `{source:'dusklayer-host', type:'set'|'pause'|'resume', values}`; post `{source:'dusklayer', type:'ready', params}` once and `{source:'dusklayer', type:'fps', value}` every 2 s.

[31,040 more characters. Copy the prompt to get all of it.]

More layers

Open the library

An earbuds pod separates into seven labelled parts as you scroll.

Product filmPro

One vessel turns from glass to stone to brushed steel as you scroll, with a finish picker and copy for each material.

Product filmStudio

Tidal Glass

N° 0022

An underwater scene that rises through the surface as you scroll.

ScenePro