/* global React */
const { useState: alUseState, useRef: alUseRef, useEffect: alUseEffect } = React;
/* ---------- SPOTLIGHT MANIFESTO ---------- */
/* A dark slab where the cursor is a flashlight revealing hidden copy. */
function Spotlight() {
const ref = alUseRef(null);
const [pos, setPos] = alUseState({ x: -1000, y: -1000, has: false });
alUseEffect(() => {
const el = ref.current;
if (!el) return;
const onMove = (e) => {
const r = el.getBoundingClientRect();
setPos({ x: e.clientX - r.left, y: e.clientY - r.top, has: true });
};
const onLeave = () => setPos((p) => ({ ...p, has: false }));
const onTouch = (e) => {
const t = e.touches[0] || e.changedTouches[0];
if (!t) return;
const r = el.getBoundingClientRect();
setPos({ x: t.clientX - r.left, y: t.clientY - r.top, has: true });
};
el.addEventListener("mousemove", onMove);
el.addEventListener("mouseleave", onLeave);
el.addEventListener("touchstart", onTouch);
el.addEventListener("touchmove", onTouch);
return () => {
el.removeEventListener("mousemove", onMove);
el.removeEventListener("mouseleave", onLeave);
el.removeEventListener("touchstart", onTouch);
el.removeEventListener("touchmove", onTouch);
};
}, []);
const maskStyle = pos.has
? { WebkitMaskImage: `radial-gradient(circle 240px at ${pos.x}px ${pos.y}px, #000 0%, #000 30%, transparent 75%)`,
maskImage: `radial-gradient(circle 240px at ${pos.x}px ${pos.y}px, #000 0%, #000 30%, transparent 75%)` }
: { WebkitMaskImage: "radial-gradient(circle 0px at 50% 50%, #000 0%, transparent 75%)", maskImage: "radial-gradient(circle 0px at 50% 50%, #000 0%, transparent 75%)" };
return (
You'll see two options. Always. The safe one and the loud one. We'll lobby for the loud one. We will roast your old website. Kindly. In writing. With timestamps. We won't take projects where the answer is already in the brief. That's not design — that's typing. Half our work never ships. Some ideas die for a reason. We're okay with that. We answer our own emails. There is no junior intern with your strategy deck. If we say yes, you are the only client on our table that month. We work in seasons, not sprints.
↳ point the light. read what we whisper.
The things
most
studios
won't
tell you.
The things
most studios
won't tell you.