TITLE Pinscreen PROMPT A digital version of the pin-art desk toy: a dense field of steel pins that can slide in and out, taking the impression of whatever presses against them. The viewer pushes shapes into the pins from behind with the pointer, and the surface responds as a gleaming metallic relief. Concept: thousands of identical objects forming a soft image; the wow is the material: brushed steel pin-heads catching a raking light. Mood: sleek, tactile, 1980s executive-desk. Palette: black acrylic frame and background #0B0C0E, steel highlights #C9CED6, mid steel #6C7480, specular white #FFFFFF; a single thin red line (#E5383B) on the frame's logo plate as the only colour. Dark page, monochrome metal. Rendering: a hexagonally packed grid of round pins seen nearly front-on with a slight perspective tilt: about 9,000–14,000 pins on desktop (pin pitch ~9–10px), 4,000–6,000 on phones. Each pin has a height h in [0,1]. Draw each pin-head as a small disc whose position is offset by parallax according to height (raised pins shift up-left and grow ~15%), whose brightness comes from a lighting model using the surface normal estimated from neighbouring heights (raking light from the upper left, strong specular falloff so slopes facing the light flash white and those facing away fall to dark steel), with a drop shadow cast onto lower neighbours on the lower right. Flat regions (all pins down or all up) show the mesmerising regular lattice with a soft sheen gradient. Implement efficiently: precomputed sprite discs in ~16 brightness levels drawn with drawImage, or a WebGL point-sprite/instanced renderer with a fragment shader for round heads and a Canvas 2D fallback; typed arrays for heights and targets; update only what changed where possible. Physics: pins follow their target height with a fast spring and a little overshoot (so the surface ripples slightly when a shape arrives) and fall back slowly under "gravity" with friction when the pressing object leaves: a slow, satisfying relaxation taking a few seconds, slightly randomised per pin, so impressions linger and melt. Interaction: moving the pointer/finger presses a rounded hand-sized form into the pins from behind (a soft dome with finger-like lobes); pressing harder (mouse down / touch force / hold) pushes further; dragging leaves a trail that slowly subsides. A tray of presets pushes objects in with an animated press: a hand (five-finger relief), a face (a simple mask-like relief generated from ellipsoids: brow, nose, lips, chin), a sphere, a ripple (animated concentric wave that keeps travelling), the word of the viewer's choosing (type up to 8 characters: rendered to an offscreen canvas, blurred and used as a height map; on portrait screens a long word breaks into two lines), and "the time" (the current clock time embossed as digits, updating every minute with the old digits sinking and the new rising; stacked hours over minutes on portrait screens). A "flip" control tilts the whole frame on its side pivots (like turning the toy over): every pin slides fully out in a wave travelling from top to bottom, then, as the frame swings back, slides home again in a second wave, leaving the field reset: the signature moment: a cascading metallic shimmer travelling across the whole field with a soft rattling sound if sound is enabled. On load: a hand presses in from behind and withdraws, leaving its slowly fading impression. Frame and details: the pin field sits inside a glossy black acrylic frame with rounded corners, a faint reflection and two chrome side posts; a small plate reads "PINSCREEN · 12,480 PINS" (actual count). Dragging the light: a small draggable sun icon/lamp rides around the frame's bezel and changes the light direction, making the relief shading swing (the bezel gloss and the field's sheen follow it; with the lamp focused the arrow keys move it). Keyboard: arrow keys move a virtual presser; Space presses; 1–6 select presets; F flips; S toggles sound. Typography: minimal: tracked small caps in steel grey, a geometric sans (Futura/"Century Gothic"/"Avenir"/system-ui), 10–11px; the preset tray labels are tiny icons drawn in SVG with text labels. A designed hint under the frame: "press into the pins" which fades after first use. Optional sound toggle (off by default): a soft metallic shimmer (band-passed noise bursts) scaled by how many pins are moving. Reduced motion: pins move without overshoot; flip resets instantly with a fade; no travelling ripple preset. Responsive: the frame fits the viewport with margin at all sizes; pin count adapts to keep 60fps (measure frame time and reduce density if needed). DESCRIPTION A black acrylic desk toy fills the viewport: a glossy rounded frame slung between two chrome posts, holding roughly ten thousand hexagonally packed steel pin-heads (about five thousand on a phone). On arrival a hand presses in from behind and withdraws, and its impression slowly melts back into the lattice. Every pin is a tiny domed, lathe-turned disc lit by a single raking lamp, so slopes facing the light flash white, slopes facing away drop to dark steel and raised forms throw shadows across their lower neighbours. The pointer itself becomes a hand pushing through the field; dragging leaves a subsiding trail. A tray of machined black keys presses in a hand, a mask-like face, a sphere, a travelling ripple, a typed word and the current time, and a flip key tips the frame so the whole field cascades out and back in a glittering wave. The only colour anywhere is one thin red line on the brushed-steel logo plate, which states the true pin count. VISUAL TECHNIQUES - WebGL point-sprite renderer: one point per pin, round heads cut and antialiased in the fragment shader, with a Canvas 2D fallback using pre-rendered disc sprites in 16 brightness levels - Per-fragment lighting on each pin-head: surface normal from the neighbouring pin heights plus a small dome, diffuse and tight specular terms, a bow-tie "turned steel" glint aimed at the lamp, darkened chamfer rim, per-pin brightness variance - Height-field gradients computed on the hexagonal lattice by least squares over the six neighbours; cast shadows found by marching four steps toward the lamp - Height-dependent parallax and 15% growth of raised heads, with a perspective-varying parallax vector so the field reads as slightly tilted - Steel tone ramp restricted to #0B0C0E, #6C7480, #C9CED6 and #FFFFFF, plus a lamp-centred sheen falloff across the flat lattice - Spring-and-gravity pin physics in typed arrays: fast underdamped spring when pushed, slow friction-limited relaxation with slightly randomised rates when released, bouncing free-fall during the flip - Procedural height maps: capsule-and-ellipsoid hand, ellipsoid mask face, sphere, animated concentric wave, and text rasterised offscreen then box-blurred per pin - CSS-built object: acrylic frame with lamp-tracked gloss, chrome cylinder posts with knurled caps and pivots, brushed-steel plate with slotted screws, floor glow, film grain - Frame swing on a hand-written spring driving a 3D rotateX under perspective - Inline SVG icons for the tray, lamp and hint; tracked small-caps geometric sans typography - Synthesised sound: a looped buffer of thousands of tiny decaying noise ticks through two band-pass filters, gain driven by the summed pin velocity - Idle detection (nothing is simulated or redrawn when the field is at rest), DPR capped at 2, frame-time measurement that thins the lattice on slow machines INTERACTION MODEL Moving the mouse over the field pushes a hand-shaped form through the pins from behind; holding the button (or pressing harder on a pressure-sensitive screen) pushes it further, and dragging leaves a trail that sinks back over a few seconds. On touch screens a finger does the same while it is down. The tray keys (or number keys 1–6) press an object in with an animated push; pressing the active key again withdraws it and the impression melts. The Word key holds a text field: type up to eight characters and they emboss live. Time embosses the current clock and re-presses itself each minute. Flip (or F) swings the frame forward on its pivots while every pin slides out and then home in two top-to-bottom waves, resetting the field. The small lamp on the bezel can be dragged all the way round the frame (or moved with the arrow keys when focused) to swing the light, shadows and gloss. Arrow keys move a virtual presser across the field and Space pushes it in; Escape lifts it. The Sound key (or S) turns on a soft metallic shimmer whose loudness follows how many pins are moving; it is off by default. The hint under the frame fades after the first touch. With reduced motion requested, pins move without overshoot, the ripple is a still set of rings and the flip becomes a quick fade to a cleared field.