No.186 · Heroes· New
Obsidian Hero
A dark studio hero over a pool of black liquid that slowly folds and catches cold light under a faint grid. A hairline-thin line of type sits over a heavy one, and a sound switch plays a quiet ambient bed whose live waveform draws in the nav.
The prompt
Written for the variant you picked above: Dark
Build an agency hero (a fictional data studio, 'NOOR Systems') over a WebGL pool of black liquid. Liquid: a fragment shader over twice domain-warped four-octave value noise, scaled so many small swirls fill the frame (about 1.5 units per screen height). Read it as a height field: the gradient gives a normal; colour is a near-black base plus a slate-blue reflection (a broad sheen and a strong Fresnel at steep slopes) and a cold pale specular (power 22), so it looks like glossy oil under one cool light. It folds slowly; the pointer drops a faint ring. Darken it toward the bottom, render at 0.6× resolution, and pause off-screen. Over it: a faint square grid (1px lines at 5.5% white, about 136px cells) and a fade to black along the bottom. Nav: a line-drawn cube mark and a spaced wordmark (0.32em tracking, with a small mono subline), centred links in light grey with a chevron on the first, a sound switch, and a square white 'Start a project ↗' button. The sound switch is mono uppercase 'SOUND' and 'OFF' spread across a 140px hairline with end ticks; turning it on fades in a WebAudio bed (two low detuned sines, a soft triangle, and lowpass noise, each swelling slowly) and the hairline becomes its live waveform from an AnalyserNode. Copy: a hairline Inter 100 uppercase line ('WE SHAPE', about 150px) over a black-weight line ('SIGNAL.', about 170px, tight tracking), a mono uppercase tagline with wide tracking in grey, and an outlined square CTA in bold mono caps with ↗ that fills white on hover. Selected variant — Dark (dark): Palette for this theme (Dark): --obsd-btn #ffffff; --obsd-btn-ink #050607; --obsd-edge rgb(255 255 255 / 0.55); --obsd-fallback radial-gradient(80% 70% at 60% 40%, #1b2430, #07090c 70%); --obsd-floor #000000; --obsd-focus #ffffff; --obsd-grid rgb(255 255 255 / 0.055); --obsd-ink #ffffff; --obsd-muted #a7adb6; --obsd-soft #d6dbe2. Treat these as the root colour tokens, one value per role, and name them to suit your code. Select it with the theme option set to "dark". Keep every dimension, spacing value, state and motion from the brief unchanged, and keep text at 4.5:1 contrast or better on these surfaces. 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: The sound switch toggles the ambient bed (aria-pressed); it fades out and suspends when the tab is hidden. Buttons lift and their arrows nudge; the outlined CTA fills on hover. The pointer stirs the liquid. Motion: The liquid folds continuously and slowly and stops off-screen; reduced motion or motion={false} shows one still frame. The sound line moves only while sound is on. Accessibility: Sound is off by default and only starts from a press. Real nav, h1 and links; the canvas and grid are decorative; a static gradient stands in without WebGL. Responsive behavior: Below 60rem the centre links hide; below 34rem the sound switch and the wordmark subline hide and the tagline tightens. Type scales with the container. Touch: Without a pointer the liquid just drifts. 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
- The sound switch toggles the ambient bed (aria-pressed); it fades out and suspends when the tab is hidden. Buttons lift and their arrows nudge; the outlined CTA fills on hover. The pointer stirs the liquid.
- Motion
- The liquid folds continuously and slowly and stops off-screen; reduced motion or motion={false} shows one still frame. The sound line moves only while sound is on.
- Accessibility
- Sound is off by default and only starts from a press. Real nav, h1 and links; the canvas and grid are decorative; a static gradient stands in without WebGL.
- Responsive
- Below 60rem the centre links hide; below 34rem the sound switch and the wordmark subline hide and the tagline tightens. Type scales with the container.
- On touch
- Without a pointer the liquid just drifts.