No.178 · Backgrounds· New
Light Sash
One wide blade of light crosses the frame on a diagonal, like a long-exposure sweep: a coloured body streaked along its length, a pale hot edge and a haze beyond it. The pointer turns the blade. A background only, with no text of its own.
The prompt
Written for the variant you picked above: Lagoon
Write a WebGL1 full-screen fragment shader background (no libraries): one wide blade of light crossing the frame on a diagonal. Choose a direction about 34° above horizontal (the pointer turns it a little). For each pixel take along (the distance along the blade) and s (the signed distance across it, from a line passing right of centre), and wobble s with a slow sine along the blade and soft fBm. Layer the colours across s: a dim upper band (Gaussian at s ≈ 0.5), the coloured body (Gaussian at s ≈ 0.16, width 0.17), a slight darker channel just below it, a pale hot edge rising as s goes negative and a near-white haze beyond (smoothstep(−0.2, −0.62, s)). Streak the bands with fBm stretched along the blade and moving along it, like a long exposure. Darken the top-left slightly. Render through a small WebGL1 harness: a full-screen triangle, the device pixel ratio capped at 2 and scaled down (and about 30fps) on touch, paused offscreen and in hidden tabs, one still frame under reduced motion, the pointer eased in with a slow lerp and released when it leaves, and a CSS gradient fallback without WebGL. Add a little per-pixel noise so the gradients never band. An optional fade prop softens the bottom edge into the ground colour: a gradient to the ground plus a backdrop blur masked to grow towards the edge. Children sit above the canvas. Selected variant — Lagoon (lagoon): A teal blade with a mint edge and white-mint haze: bg #031a17, body #2a877e, edge #9ee6d6, haze #eefcf7. This selection takes precedence over references to other themes or options in the general brief. Implement this selected appearance; do not add a variant picker or alternative appearances unless requested. Implementation requirements: Use React and TypeScript. Keep the component self-contained, with uniquely scoped CSS and no animation libraries. Include required imports, styles and font setup in the result. Interaction: Move the pointer to turn the blade. Motion: The streaks flow along the blade and its edge wavers slowly. Reduced motion draws one still frame. Accessibility: Decorative and hidden from assistive tech. The upper-left is dark and suits white text; the lower-right is near white and suits dark text. Responsive behavior: Fills its container at any aspect ratio; device pixel ratio capped at 2. The optional fade softens the bottom edge into the ground colour. Touch: No pointer response on touch; the streaks keep flowing. Preserve keyboard access, visible focus and reduced-motion behavior. Keep fictional demo data and simulated service calls in a separate usage example; expose callbacks for real actions and recover from rejected requests. Keep usage-example links inside the demo: use local buttons or prevent navigation. Demonstration links must not navigate to Vitrine routes or open other pages; preserve real URL support in the reusable component itself. Verify the result at narrow and wide viewport sizes, with keyboard input and reduced motion enabled.
Notes
- Interaction
- Move the pointer to turn the blade.
- Motion
- The streaks flow along the blade and its edge wavers slowly. Reduced motion draws one still frame.
- Accessibility
- Decorative and hidden from assistive tech. The upper-left is dark and suits white text; the lower-right is near white and suits dark text.
- Responsive
- Fills its container at any aspect ratio; device pixel ratio capped at 2. The optional fade softens the bottom edge into the ground colour.
- On touch
- No pointer response on touch; the streaks keep flowing.