Skip to content

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

Copy this text

Automatic copying is unavailable. Copy the selected text using your device’s copy command.

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.

Loading components…