No.179 · Backgrounds· New
Blue Hour
The last light over a horizon: an ink sky, a saturated band of colour standing in soft vertical shafts that sway and gather towards the pointer, and a pale haze along the floor. A background only, with no text of its own.
The prompt
Written for the variant you picked above: Cobalt
Write a WebGL1 full-screen fragment shader background (no libraries): the last light over a horizon. Build a shaft value along x from two layers of one-dimensional value noise drifting sideways in opposite directions, through smoothstep(0.15, 0.85). The horizon height is 0.3 of the screen plus 0.11 × the shaft value, so brighter shafts stand taller. From the top down: the sky colour; a saturated band rising to smoothstep(h + 0.42, h − 0.04, y), its strength 0.3 + 0.7 × the shaft value so the shafts read as soft pillars with darker gaps; a brighter glow just under the horizon; and a pale floor haze, pow(smoothstep(0.33, 0.04, y), 1.7), so the white rises softly. A faint noise on y keeps the band edges soft. The pointer gathers the shafts towards its x (a local squeeze of the x coordinate) and brightens the band there. 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 — Cobalt (cobalt): Ink sky, ultramarine shafts, white-blue floor: sky #02040f, band #0b2399, glow #2f5bff, floor #eef2ff. 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 and the shafts gather towards it. Motion: The shafts sway sideways slowly. Reduced motion draws one still frame. Accessibility: Decorative and hidden from assistive tech. White text reads on the dark upper half; the floor is near white, so use dark text or a dark pill there. 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 shafts keep swaying. 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 and the shafts gather towards it.
- Motion
- The shafts sway sideways slowly. Reduced motion draws one still frame.
- Accessibility
- Decorative and hidden from assistive tech. White text reads on the dark upper half; the floor is near white, so use dark text or a dark pill there.
- 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 shafts keep swaying.