Site guide — how it was built
A photoelastic stress laboratory that loads a transparent hook between crossed polarisers so its hidden internal stress erupts into bands of interference colour. Every fringe is a contour of equal shear; drive the load and they multiply and crowd at the throat.
Concept
Stress lives inside every loaded part, invisible. Photoelasticity is the trick that gives it a body: a transparent birefringent material, viewed between two crossed polarising filters, converts the difference in principal stresses into a visible interference colour. FRINGE is a fictional stress-analysis lab whose single job on this page is to make that erupt — the resting hook already glowing, the fringes crowding where the part will fail first. The audience is engineers and product designers who want to see a stress concentration, not just compute one.
Palette — argued from the subject
A crossed polariscope has a black field until something is stressed, so the ground is near-black and the interference colour is the only saturation on the page — reserved entirely for the art. The bright cyan is a contained spectral note used for interactive marks and focus, never for small text; body copy runs on a derived light ink for legibility.
The fringe spectrum itself — computed, not painted
Type
Cormorant Garamond carries the display and body — a high-contrast Garamond whose thin strokes feel optical, like something seen through glass, and whose large italic sets the one moment of typographic bravery in the wordmark. IBM Plex Mono handles every readout, eyebrow and label: fringe order, retardation in nanometres, applied load in kilonewtons — the instrument voice against the lyrical one.
Technique
The hero is a single full-screen fragment shader, raw WebGL, no library. A signed-distance field builds the hook — a partial arc for the curl, a capsule shank and a ring eye, smooth-unioned. For every fragment inside the part the shader fabricates a physically-motivated stress difference: curved-beam bending that peaks at the inner fibre of the throat, near-uniform axial tension in the shank, and two sharp stress concentrations at the inner throat and under the eye.
That stress difference becomes an optical retardation in nanometres. The transmitted colour is then integrated across the visible spectrum — twenty-four wavelengths, each weighted by an analytic approximation of the CIE colour-matching functions, its intensity the dark-field polariscope term sin²(πR/λ), summed in XYZ and converted to sRGB. Zero stress gives black extinction; as retardation climbs the pixel walks the true Michel-Lévy colour sequence. Raise the load and the retardation rises, so the sin² term cycles faster and the fringes literally multiply and crowd at the concentrations. A faint, slowly rotating isoclinic brush recalls the plane polariscope beneath the colour.
The fringe-order legend in section 02 runs the identical colour model in JavaScript, painting a canvas strip so the chart and the object are guaranteed to agree. GSAP choreographs one load-in sequence and the quiet scroll reveals.
Robustness
prefers-reduced-motion: the shader draws a single loaded frame — the hook still glowing with fringes — and no animation loop starts (guarded in CSS and with a matchMedia check before every loop).Iteration log
The resting screenshot was gorgeous but the mono eyebrow crossed the brightest fringes of the throat and washed out ("Bench 4" vanished). Added a soft left-anchored scrim behind the hero copy and shifted the hook slightly right on wide screens to clear the wordmark column, so the eyebrow and lede hold contrast while the object keeps its glow. Confirmed the type scale, tabular readouts and specimen rows read as one system.
Enriched the stress model with a dedicated concentration term at both the inner throat and under the eye, so raising the load crowds fringes at two authentic risers rather than one — the true signature of the effect. Added the JavaScript-painted Michel-Lévy legend as a second-read artefact (it is computed the same way as the hook, so an attentive viewer can match a colour on the strip to a band on the throat), and a fine optical grain over the whole page for cinematic cohesion.
At 375px the copy overlapped the lower curl, so a vertical mobile scrim now darkens the text band while the hook's crown stays bright. Verified in headless Chrome: exactly one <h1>, zero console errors including WebGL, the reduced-motion path drawing a loaded static frame, and the signature itself — driving the load from N 1.5 to N 8.6 changed the rendered fringes (screenshot-hash diff). Removed a redundant blue vignette tint that muddied the ground.