Verify codeNew
A one-time code step with a carrier pigeon: Coo naps through the resend wait with the seconds in a thought bubble, and flies every new code to your mailbox.
Used forEmail sign-upPasswordless sign-inTwo-factorChanging an email
Install with the shadcn CLI
$ npxnpx shadcn@latest add https://hairlineui.com/r/verify-code.jsonTemplates
Need the whole page?
43 Next.js landing pages, each designed from scratch. Try any of them live; one is $39, all of them $99, and 5 are free.
Where itโs used
Email sign-up
Confirm the address with the code you just sent, before the account opens.
Passwordless sign-in
The magic-code step of an email or SMS login.
Two-factor
A code by text message before a sensitive change.
Changing an email
Prove the new address is yours before itโs saved.
What it handles for you
A verify step usually leaves people staring at a disabled Resend link with no idea how long is left or whether anything is happening. This block shows the wait, shows the send, and says plainly when a send didnโt go through.
- 01
Real code input
One input with one-time-code autofill, paste and the numeric keyboard; the boxes are only what you see.
- 02
A wait you can see
Coo naps through the resend wait with the seconds rolling down in a thought bubble over his head.
- 03
Your serverโs wait
onResend can return { retryAfter } and the next clock uses it.
- 04
Sends that fail
If onResend throws, Coo comes back with the envelope and Resend turns into Try again.
- 05
Wrong and right
A wrong code shakes and clears the boxes; the right one closes them into a pill with a drawn check.
- 06
Email or text
channel sets the wording (inbox or number), and Change lets people fix the address.
Overview
The โcheck your inboxโ step is a row of boxes and a resend link greyed out for thirty seconds. This one hands it to Coo, an illustrated carrier pigeon in a postmanโs cap standing on a post across the stage from a red mailbox with its flag up. He nods along with every digit you type. A wrong code and he shakes his head while the boxes shake and clear; the right one closes the boxes into one pill and he puffs his chest out with two proud flaps. While the resend clock runs he naps on his post, eye shut and zโs drifting up, with a thought bubble over his head rolling the seconds down; typing wakes him to read along, and at zero the bubble pops and he hops up, ready to fly. Resend sends him off with a new envelope in his beak: he flies the route, waits over the mailbox until your send is done, pops the flag and flies home empty, and the clock starts again with whatever wait your server asked for. If the send fails he comes back with the envelope still in his beak. Underneath it is the real thing: one input with one-time-code autofill, paste and the numeric keyboard, onVerify for your check and onResend for your sender.
States
- napping
- Coo stands on his post at the left of the lit stage, the red mailbox with its flag up at the right and his dashed route between them. While the resend clock runs he dozes: his eye shuts, a z drifts up from his cap every 1.1s, and a thought bubble rolls the seconds down; the line reads โCoo is catching his breathโ.
- typing
- Typing wakes him for 4s (โCoo is reading alongโ): each digit rises into its box and he nods forward from his feet.
- checking
- With every box full the row carries a sweep of light and the line reads โCoo is checkingโ.
- wrong
- onVerify returns false or throws: Coo shakes his head, the boxes shake, turn red and clear from the right; the line reads โNot the code Coo carriedโ.
- right
- The boxes close into one pill with a drawn check, Coo puffs his chest with two flaps and a hop, and the resend line folds away; โSigned for. Youโre in.โ
- ready
- At zero the bubble shrinks away into a blur, he wakes with a hop, the line reads โCoo is ready to fly againโ and โResend in 0:00โ turns into Resend code.
- resend
- Coo takes off with an envelope (1s along the route, flapping between two wing poses), waits over the mailbox until onResend settles, pops the flag and flies home empty; Sent, then the clock starts again.
- send failed
- onResend throws: he turns back with the envelope still in his beak, the line says โCoo couldnโt get throughโ and Resend shakes into Try again.
Usage
import { VerifyCode } from "@/components/verify-code";<VerifyCode destination={email} onVerify={(code) => verifyCode(email, code)} onResend={() => sendCode(email)}/>Works with
Installs with it
- Code inputThe six boxes, done properly: digits rise in, a paste cascades, a wrong code shakes and clears, the right one becomes a pill with a check.
- Number rollNumbers that change like an odometer: every digit rolls in the direction the number moved.
- Status buttonSave, Saving, Saved: the spinner opens in, the check draws itself, errors shake, and the label morphs between them.
- Text morphText that changes the way it should: shared letters slide over, new ones rise out of a blur, the width eases.
With your own endpoints
Return false for a wrong code, and pass your rate limit back as retryAfter so the clock matches it.
"use client";import { VerifyCode } from "@/components/verify-code";export function CheckInbox({ email, onDone }: { email: string; onDone: () => void }) { return ( <VerifyCode destination={email} autoFocus onVerify={async (code) => { const res = await fetch("/api/verify", { method: "POST", body: JSON.stringify({ email, code }) }); if (!res.ok) return false; setTimeout(onDone, 1200); // after Coo's flaps }} onResend={async () => { const res = await fetch("/api/verify/resend", { method: "POST", body: JSON.stringify({ email }) }); if (!res.ok) throw new Error("Couldnโt send"); return { retryAfter: Number(res.headers.get("Retry-After") ?? 30) }; }} /> );}Props
| Prop | Type | Description |
|---|---|---|
| destination | string | Where the code went, shown in the line under the title. |
| onVerify | (code: string) => Promise<boolean | void> | Check the code. Resolve (or return true) to accept; return false or throw for a wrong code. |
| onResend | () => Promise<{ retryAfter?: number } | void> | Send a new code. Return { retryAfter } in seconds to set the next wait; throw if it didnโt go. |
| channel | "email" | "sms"default "email" | The title says inbox or number. |
| length | numberdefault 6 | How many digits. |
| resendAfter | numberdefault 30 | Seconds before the first resend, and between resends when onResend doesnโt say. |
| onChangeDestination | () => void | Shows Change beside the address. |
| title / name / autoFocus | string / string / booleandefault "Check your inbox" / "Coo" / false | The heading, the pigeonโs name in his lines, and whether the code field takes focus on mount. |
Accessibility and motion
- The code field is Code input: one real input with autocomplete="one-time-code", so SMS autofill, paste and password managers work; its label and status line say what happened.
- The countdownโs digits (in the bubble and the resend line) are hidden from screen readers; they hear that a resend is coming and when itโs sent or failed.
- Coo is decoration (aria-hidden). He, the mailbox and the post are illustrations shipped inside coo-art.ts as WebP data URIs (50KB of images), so the install is complete; his nods, nap, flight, flaps, blink, zโs and the mailbox flag are code.
- One frame loop outside React moves him and sleeps when heโs still; his breathing is a compositor animation. The scene is drawn at 364 ร 176 and scaled to the stage.
- With reduced motion he doesnโt fly or nod: the flag and his pose change in place.
- Built from Code input, Number roll, Status button and Text morph, which the CLI installs with it. No animation library.
Requirements
React 19, Tailwind CSS v4 and shadcn/ui theme variables (any style, light and dark). Icons from lucide-react.
The CLI also installs Code input, Number roll, Status button, Text morph.
Source
"use client";import * as React from "react";import { CodeInput } from "./code-input";import { Coo, type CooHandle } from "./coo-pigeon";import { NumberRoll } from "./number-roll";import { StatusButton, type ActionStatus } from "./status-button";import { TextMorph } from "./text-morph";import { EASE_OUT, useInteractionReducedMotion } from "./ui-interaction-motion";/* โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ * VERIFY CODE: the pigeon who carried it * * waiting Coo stands on his post across the stage from the * mailbox; its flag is up, your code is in there * reading every digit you type, he nods along * wrong he shakes his head; the boxes shake and clear * right the boxes close into one pill, he puffs his chest * and gives two proud flaps * wait while the resend clock runs he naps on his post, * z's drifting up and a thought bubble counting the * seconds down; typing wakes him to read along, and * at zero the bubble pops and he hops up, ready * resend he takes off with a new envelope, flies the route, * pops the mailbox flag and flies home; if the send * fails he comes back with the envelope in his beak * * onVerify gets the code, onResend sends another; both are * yours, whatever sends your codes. * โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ */export interface VerifyCodeProps { /** Where the code went: an email address or a phone number. */ destination: string; channel?: "email" | "sms"; length?: number; /** Check the code. Resolve (or return true) to accept; return false or throw to say it's wrong. */ onVerify: (code: string) => Promise<boolean | void>; /** Send a new code. Return { retryAfter } (seconds) to set the next wait; throw to say it didn't go. */ onResend: () => Promise<{ retryAfter?: number } | void | unknown>; /** Seconds before the first resend. */ resendAfter?: number; /** Shows Change beside the address. */ onChangeDestination?: () => void; title?: string; /** What the pigeon is called in his lines. */ name?: string; autoFocus?: boolean; className?: string;}const mix = (color: string, amount: number, into = "transparent") => `color-mix(in oklab, ${color} ${amount}%, ${into})`;const PF = "var(--primary-foreground)";const CARD: React.CSSProperties = { backgroundImage: `linear-gradient(180deg, var(--card), ${mix("var(--card)", 95, "var(--foreground)")})`, boxShadow: `0 0 0 1px var(--border), inset 0 1px 0 ${mix("var(--background)", 85)}`,};/* The one lit surface, ruled with faint airmail stripes along its foot: the sky he flies through. */const STAGE: React.CSSProperties = { backgroundColor: "var(--primary)", backgroundImage: [ `radial-gradient(90% 70% at 50% 0%, ${mix(PF, 20)} 0%, transparent 62%)`, `linear-gradient(175deg, transparent 45%, ${mix("black", 20)} 100%)`, `repeating-linear-gradient(-45deg, ${mix(PF, 10)} 0 7px, transparent 7px 14px, ${mix(PF, 5)} 14px 21px, transparent 21px 28px)`, ].join(", "), backgroundSize: "auto, auto, 100% 7px", backgroundRepeat: "no-repeat, no-repeat, repeat-x", backgroundPosition: "0 0, 0 0, 0 100%", boxShadow: `inset 0 1px 0 ${mix(PF, 36)}, inset 0 0 0 1px ${mix(PF, 12)}`,};const COO = { "--coo-route": PF, "--coo-z": PF, "--coo-bubble": PF, "--coo-bubble-ink": "var(--primary)",} as React.CSSProperties;type Flight = "home" | "away" | "failed";export function VerifyCode({ destination, channel = "email", length = 6, onVerify, onResend, resendAfter = 30, onChangeDestination, title, name = "Coo", autoFocus, className = "",}: VerifyCodeProps) { const reduced = useInteractionReducedMotion(); const baseId = React.useId(); const coo = React.useRef<CooHandle>(null); const [phase, setPhase] = React.useState<"idle" | "checking" | "wrong" | "right">("idle"); const [left, setLeft] = React.useState(resendAfter); const [send, setSend] = React.useState<ActionStatus>("idle"); const [flight, setFlight] = React.useState<Flight>("home"); const typed = React.useRef(0); // typing wakes him for a while; then he nods off again if the clock is still running const [awake, setAwake] = React.useState(false); const awakeTimer = React.useRef(0); React.useEffect(() => () => window.clearTimeout(awakeTimer.current), []); // whole seconds down to zero; the route drains with them React.useEffect(() => { if (left <= 0 || flight === "away") return; const timer = window.setTimeout(() => setLeft((s) => Math.max(0, s - 1)), 1000); return () => window.clearTimeout(timer); }, [left, flight]); const resend = async () => { if (send === "pending" || left > 0 || flight === "away") return; setSend("pending"); setFlight("away"); coo.current?.send(); let next = resendAfter; let ok = true; try { const res = await onResend(); const after = (res as { retryAfter?: number } | undefined)?.retryAfter; if (typeof after === "number" && after >= 0) next = after; } catch { ok = false; } const home = () => { setFlight(ok ? "home" : "failed"); setSend(ok ? "success" : "error"); if (ok) { setLeft(next); } window.setTimeout(() => setSend((s) => (s === "success" ? "idle" : s)), 1400); }; if (coo.current) coo.current.delivered(ok, home); else home(); }; const verify = async (code: string) => { setPhase("checking"); let ok = false; try { ok = (await onVerify(code)) !== false; } catch { ok = false; } setPhase(ok ? "right" : "wrong"); if (ok) coo.current?.puff(); else coo.current?.ruffle(); return ok; }; const where = channel === "sms" ? "number" : "inbox"; const mood = phase === "right" ? "Signed for. Youโre in." : phase === "wrong" ? `Not the code ${name} carried` : phase === "checking" ? `${name} is checking` : flight === "away" ? `${name} is on his way` : flight === "failed" ? `${name} couldnโt get through` : send === "success" ? "A fresh code, delivered" : left > 0 ? awake ? `${name} is reading along` : `${name} is catching his breath` : `${name} is ready to fly again`; const ready = left <= 0 && flight !== "away"; return ( <section aria-labelledby={`${baseId}-title`} className={`relative w-full max-w-[380px] rounded-[28px] p-2 text-card-foreground ${className}`} style={{ ...CARD, ...COO }}> {/* Its natural width where the parent sizes to its content, without forcing it on narrow screens. */} <div aria-hidden="true" data-natural-width className="grid h-0" style={{ gridTemplateColumns: "minmax(0, 380px)" }} /> <div className="@container w-full"> <div className="relative overflow-clip rounded-[22px] text-primary-foreground" style={STAGE}> <Coo ref={coo} wait={flight === "away" || phase === "right" ? 0 : left} dozing={!awake && flight === "home" && (phase === "idle" || phase === "wrong")} reduced={reduced} /> <p className="absolute inset-x-0 bottom-3 z-10 text-center text-[12.5px] font-medium text-primary-foreground/85 @max-[340px]:bottom-2 @max-[340px]:text-[11.5px]"> <TextMorph>{mood}</TextMorph> </p> </div> <div className="px-3 pb-2 pt-3"> <h2 id={`${baseId}-title`} className="text-[15px] font-medium tracking-[-0.01em]"> {title ?? `Check your ${where}`} </h2> <p className="mt-0.5 text-[12.5px] text-muted-foreground"> {name} brought a {length}-digit code to <span className="font-medium text-foreground">{destination}</span> {onChangeDestination ? ( <> {" ยท "} <button type="button" onClick={onChangeDestination} className="cursor-pointer underline decoration-border underline-offset-2 hover:text-foreground"> Change </button> </> ) : ( "." )} </p> <CodeInput className="mt-3" length={length} label="Enter the code" autoFocus={autoFocus} onValueChange={(v) => { setAwake(true); window.clearTimeout(awakeTimer.current); awakeTimer.current = window.setTimeout(() => setAwake(false), 4000); if (v.length > typed.current) coo.current?.peck(); typed.current = v.length; if (phase === "wrong") setPhase("idle"); }} onComplete={verify} /> {/* the resend line folds away once the code is right */} <div className="grid" style={{ gridTemplateRows: phase === "right" ? "0fr" : "1fr", opacity: phase === "right" ? 0 : 1, transition: reduced ? "none" : `grid-template-rows 420ms ${EASE_OUT}, opacity 240ms` }}> <div className="min-w-0 overflow-hidden" inert={phase === "right"}> <div className="mt-2.5 flex h-7 items-center gap-1.5 text-[12px] text-muted-foreground"> <span>{flight === "failed" ? "Couldnโt send that." : "Didnโt get it?"}</span> <span className="grid items-center"> <span className="sr-only">{ready ? "" : flight === "away" ? "Sending a new code." : "You can resend the code shortly."}</span> <span aria-hidden="true" className="col-start-1 row-start-1 flex items-baseline whitespace-nowrap tabular-nums" style={{ opacity: ready ? 0 : 1, filter: ready ? "blur(3px)" : "none", transition: reduced ? "none" : `opacity 260ms ${EASE_OUT}, filter 260ms ${EASE_OUT}` }} > {flight === "away" ? ( <TextMorph>Sending</TextMorph> ) : ( <> Resend in {Math.floor(left / 60)}: <NumberRoll value={left % 60} format={{ minimumIntegerDigits: 2 }} direction="down" duration={700} /> </> )} </span> <span className="col-start-1 row-start-1" inert={!ready} style={{ opacity: ready ? 1 : 0, filter: ready ? "none" : "blur(3px)", transition: reduced ? "none" : `opacity 260ms ${EASE_OUT}, filter 260ms ${EASE_OUT}` }}> <StatusButton variant="ghost" size="sm" status={send === "pending" ? "idle" : send} labels={{ idle: "Resend code", success: "Sent", error: "Try again" }} onClick={resend} className="-ml-2" /> </span> </span> </div> </div> </div> </div> </div> </section> );}export default VerifyCode;"use client";import * as React from "react";import { COO_ART as ART, COO_GEO as G } from "./coo-art";import { NumberRoll } from "./number-roll";/* โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ * COO: the carrier pigeon who brings the code * * An illustrated pigeon on a post, a mailbox across the stage * and the route between them, rigged in code: * * peck a nod from his feet for every digit typed * ruffle a shake of the head when the code is wrong * puff chest out and two proud flaps when it's right * send he takes off with an envelope, flies the route to * the mailbox, waits there until the send is done, * pops the flag and flies home empty; if the send * fails he turns back with the envelope still in * his beak * doze while the resend clock runs he naps on his post: * eye shut, z's drifting up, and a thought bubble over * his head counting the seconds down (`wait`); typing * wakes him, and at zero the bubble pops and he hops * * The scene is drawn at 364 ร 176 and scaled to the stage. * One frame loop outside React moves him and sleeps when * he's still; flaps swap between two drawn wing poses. * โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ */export interface CooHandle { peck: () => void; ruffle: () => void; puff: () => void; /** Take off with a new code; call `delivered` when the send settles. */ send: () => void; /** The send settled: he pops the flag (ok) or brings the envelope back, then lands and calls onHome. */ delivered: (ok: boolean, onHome: () => void) => void;}const W = 364;const H = 176;const KB = 0.42; // the pigeon's drawing scaleconst KF = KB * 1.05; // his flying framesconst KP = 0.62; // the props'const POST = { x: 72, foot: 180 };const BOX = { x: 300, foot: 180 };const FEET = { x: POST.x, y: POST.foot - G.post.h * KP + 1.5 };/** Where his cap is when he stands on the post, and while he waits over the mailbox. */const HOME = { x: FEET.x + (G.stand.cap.x - G.stand.feet.x) * KB, y: FEET.y + (G.stand.cap.y - G.stand.feet.y) * KB };const OVER = { x: BOX.x + 4, y: 40 };const CTRL = { x: 192, y: 40 };/** The route drawn between them: from his beak to the mailbox door. */const BEAK = { x: FEET.x + (184 - G.stand.feet.x) * KB, y: FEET.y + (50 - G.stand.feet.y) * KB };export const COO_ROUTE = `M${BEAK.x.toFixed(1)} ${BEAK.y.toFixed(1)} Q${(W / 2 + 14).toFixed(1)} 2 ${BOX.x - 6} 82`;const FLY = 1050; // ms each wayconst FLAP = 95; // ms a wing pose is heldconst clamp = (v: number, a = 0, b = 1) => Math.min(b, Math.max(a, v));const inOut = (k: number) => (k < 0.5 ? 2 * k * k : 1 - Math.pow(-2 * k + 2, 2) / 2);type Spring = { x: number; v: number };function step(s: Spring, target: number, dt: number, k = 260, c = 18) { s.v += ((target - s.x) * k - s.v * c) * dt; s.x += s.v * dt; if (Math.abs(target - s.x) < 1e-3 && Math.abs(s.v) < 1e-3) { s.x = target; s.v = 0; return true; } return false;}type Flight = { leg: "out" | "wait" | "back"; t0: number; carrying: boolean; ok?: boolean; onHome?: () => void; popAt?: number };export class CooEngine { parts: Record<string, Element | null> = {}; reduced = false; rot: Spring = { x: 0, v: 0 }; puffS: Spring = { x: 0, v: 0 }; hop: Spring = { x: 0, v: 0 }; wobble: Spring = { x: 0, v: 0 }; lid: Spring = { x: 0, v: 0 }; dozing = false; zTimer = 0; flagUp = true; puffT = 0; flapUntil = 0; blinkAt = 0; flight: Flight | null = null; raf = 0; last = 0; seq = 0; blinkTimer = 0; observer: ResizeObserver | null = null; frame = (now: number) => this.tick(now); part = (name: string) => (el: Element | null) => { this.parts[name] = el; }; mount(reduced: boolean) { this.reduced = reduced; const host = this.parts.host as HTMLElement | null; const scene = this.parts.scene as HTMLElement | null; if (host && scene) { const fit = () => scene.style.setProperty("transform", `scale(${host.clientWidth / W})`); fit(); this.observer = new ResizeObserver(fit); this.observer.observe(host); } if (!reduced) { (this.parts.stand as HTMLElement | null)?.animate([{ transform: "none" }, { transform: "scale(1.012, 1.022)" }], { duration: 1600, iterations: Infinity, direction: "alternate", easing: "ease-in-out", }); } this.draw(performance.now()); this.scheduleBlink(); } destroy() { cancelAnimationFrame(this.raf); window.clearTimeout(this.blinkTimer); window.clearTimeout(this.zTimer); this.raf = 0; this.observer?.disconnect(); this.observer = null; (this.parts.stand as HTMLElement | null)?.getAnimations().forEach((a) => a.cancel()); } scheduleBlink() { window.clearTimeout(this.blinkTimer); this.blinkTimer = window.setTimeout(() => { this.blinkAt = performance.now(); this.seq++; this.wake(); this.scheduleBlink(); }, 2400 + ((this.seq * 1531 + 377) % 3600)); } wake() { if (this.raf || !this.parts.bird) return; this.last = performance.now(); this.raf = requestAnimationFrame(this.frame); } /** Nap (eye shut, z's) or wake; waking because the wait is over gives a little hop. */ doze(on: boolean, hop = false) { if (on === this.dozing) return; this.dozing = on; window.clearTimeout(this.zTimer); if (on) this.zTimer = window.setTimeout(() => this.snore(), 500); else if (hop && !this.reduced) { this.hop.v -= 120; this.rot.v -= 140; } if (this.reduced) { this.lid.x = on ? 1 : 0; this.draw(performance.now()); return; } this.wake(); } /** A "z" drifts up from his head and fades; another follows while he sleeps. */ snore() { const layer = this.parts.zs as HTMLElement | null; if (!this.dozing || this.reduced || !layer) return; if (!this.flight) { const z = document.createElement("span"); const big = this.seq++ % 2 === 0; z.textContent = "z"; z.style.cssText = `position:absolute;left:${HOME.x + 8}px;top:${HOME.y - 6}px;font-size:${big ? 15 : 11}px;font-weight:600;line-height:1;color:var(--coo-z);opacity:0`; layer.appendChild(z); z.animate( [ { opacity: 0, transform: "translate(0, 0) scale(0.6) rotate(-10deg)" }, { opacity: 1, offset: 0.25 }, { opacity: 0, transform: `translate(${big ? -20 : -12}px, -24px) scale(1.1) rotate(-14deg)` }, ], { duration: 2200, easing: "cubic-bezier(0.22, 1, 0.36, 1)" }, ).onfinish = () => z.remove(); } this.zTimer = window.setTimeout(() => this.snore(), 1100); } peck() { if (this.reduced || this.flight) return; this.rot.v += 240; this.wake(); } ruffle() { if (this.reduced || this.flight) return; this.rot.v -= 420; this.wobble.v += 9; this.wake(); } puff() { this.puffT = 1; if (this.reduced) { this.puffS.x = 1; this.draw(performance.now()); return; } this.flapUntil = performance.now() + 4 * FLAP; this.hop.v -= 150; this.wake(); } send() { this.puffT = 0; if (this.reduced) { this.flight = { leg: "wait", t0: performance.now(), carrying: true }; this.draw(performance.now()); return; } this.flight = { leg: "out", t0: performance.now(), carrying: true }; this.wake(); } delivered(ok: boolean, onHome: () => void) { const f = this.flight; if (!f) { onHome(); return; } f.ok = ok; f.onHome = onHome; if (this.reduced) { this.flight = null; if (ok) this.flagUp = true; this.draw(performance.now()); onHome(); return; } this.wake(); } tick(now: number) { const dt = Math.min(0.05, (now - this.last) / 1000); this.last = now; let busy = false; const f = this.flight; if (f) { busy = true; const t = now - f.t0; if (f.leg === "out" && t >= FLY) { f.leg = "wait"; f.t0 = now; } else if (f.leg === "wait" && f.ok !== undefined) { if (f.ok && f.popAt === undefined) { // a new letter: the flag drops, then springs back up f.popAt = now; this.flagUp = false; this.wobble.v -= 6; } if (f.popAt !== undefined && this.flagUp === false && now - f.popAt > 260) { this.flagUp = true; this.wobble.v += 10; } if (!f.ok || now - (f.popAt ?? now) > 620) { f.leg = "back"; f.t0 = now; f.carrying = !f.ok; } } else if (f.leg === "back" && t >= FLY) { this.flight = null; this.hop.v += 90; this.rot.v -= 60; f.onHome?.(); } } const settled = [ step(this.rot, 0, dt, 300, 16), step(this.puffS, this.puffT, dt, 200, 16), step(this.hop, 0, dt, 320, 15), step(this.wobble, 0, dt, 260, 9), step(this.lid, this.dozing && !this.flight ? 1 : 0, dt, 120, 18), ].every(Boolean); if (!settled || now < this.flapUntil) busy = true; if (this.blinkAt && now - this.blinkAt < 170) busy = true; else this.blinkAt = 0; this.draw(now); this.raf = busy ? requestAnimationFrame(this.frame) : 0; } show(name: string) { for (const n of ["stand", "flyUp", "flyDown", "flyUpEmpty", "flyDownEmpty"]) (this.parts[n] as HTMLElement | null)?.style.setProperty("opacity", n === name ? "1" : "0"); } draw(now: number) { const bird = this.parts.bird as HTMLElement | null; if (!bird) return; const f = this.flight; let x = HOME.x; let y = HOME.y; let angle = 0; let flip = 1; let frame = "stand"; if (f) { const t = now - f.t0; const k = f.leg === "out" ? inOut(clamp(t / FLY)) : f.leg === "back" ? 1 - inOut(clamp(t / FLY)) : 1; // along the arc from home to over the mailbox (and back the same way) x = (1 - k) * (1 - k) * HOME.x + 2 * (1 - k) * k * CTRL.x + k * k * OVER.x; y = (1 - k) * (1 - k) * HOME.y + 2 * (1 - k) * k * CTRL.y + k * k * OVER.y; const beat = Math.floor(t / FLAP) % 2; y += Math.sin((t / FLAP) * Math.PI) * 1.6; flip = f.leg === "back" ? -1 : 1; angle = f.leg === "wait" ? 0 : (f.leg === "out" ? 1 : -1) * 6 * Math.sin(Math.PI * clamp(t / FLY)); const empty = !f.carrying; frame = beat ? (empty ? "flyDownEmpty" : "flyDown") : empty ? "flyUpEmpty" : "flyUp"; } else if (now < this.flapUntil) { frame = Math.floor((this.flapUntil - now) / FLAP) % 2 ? "flyUpEmpty" : "flyDownEmpty"; } this.show(frame); const puff = 1 + 0.07 * clamp(this.puffS.x, 0, 1.4); const fx = (G.stand.feet.x - G.stand.cap.x) * KB; const fy = (G.stand.feet.y - G.stand.cap.y) * KB; // standing, he turns and swells about his feet; flying, about his middle bird.style.transform = `translate(${x.toFixed(2)}px, ${(y + this.hop.x * 0.06).toFixed(2)}px) scale(${flip}, 1) ` + (f ? `rotate(${angle.toFixed(2)}deg)` : `translate(${fx.toFixed(2)}px, ${fy.toFixed(2)}px) rotate(${(this.rot.x * 0.05).toFixed(2)}deg) scale(${puff.toFixed(4)}) translate(${(-fx).toFixed(2)}px, ${(-fy).toFixed(2)}px)`); // the mailbox: which flag, and a little rock when it changes (this.parts.box as HTMLElement | null)?.style.setProperty("opacity", this.flagUp ? "0" : "1"); (this.parts.boxFlag as HTMLElement | null)?.style.setProperty("opacity", this.flagUp ? "1" : "0"); (this.parts.mailbox as HTMLElement | null)?.style.setProperty("transform", `rotate(${(this.wobble.x * 0.25).toFixed(2)}deg)`); const blink = this.blinkAt && frame === "stand" ? Math.sin(clamp((now - this.blinkAt) / 160) * Math.PI) : 0; const shut = frame === "stand" ? Math.max(blink, clamp(this.lid.x)) : 0; (this.parts.lid as SVGElement | null)?.setAttribute("transform", `translate(${G.stand.eye.x} ${G.stand.eye.y - G.stand.eye.r}) scale(1 ${shut.toFixed(3)})`); }}export function Coo({ wait, dozing = false, reduced, ref, className = "",}: { /** Seconds left before he can fly again; 0 when he can. */ wait: number; /** Napping through the wait (the block wakes him while you type). */ dozing?: boolean; reduced: boolean; ref?: React.Ref<CooHandle>; className?: string;}) { const [engine] = React.useState(() => new CooEngine()); const [waited, setWaited] = React.useState(wait); // the clock reaching zero (not a first render at zero) wakes him with a hop const [woke, setWoke] = React.useState(false); if (waited !== wait) { setWaited(wait); setWoke(waited > 0 && wait <= 0); } React.useLayoutEffect(() => { engine.mount(reduced); return () => engine.destroy(); }, [engine, reduced]); React.useEffect(() => { engine.doze(dozing && wait > 0, woke); }, [engine, dozing, wait, woke]); React.useImperativeHandle( ref, () => ({ peck: () => engine.peck(), ruffle: () => engine.ruffle(), puff: () => engine.puff(), send: () => engine.send(), delivered: (ok, onHome) => engine.delivered(ok, onHome), }), [engine], ); const img = "pointer-events-none absolute max-w-none select-none"; const frame = (name: "stand" | "flyUp" | "flyDown", src: string, k: number, part: string, shown: boolean) => { const g = G[name]; return ( // eslint-disable-next-line @next/next/no-img-element <img ref={engine.part(part)} src={src} alt="" draggable={false} className={img} style={{ left: -g.cap.x * k, top: -g.cap.y * k, width: g.w * k, height: g.h * k, opacity: shown ? 1 : 0, transformOrigin: name === "stand" ? `${G.stand.feet.x * k}px ${G.stand.feet.y * k}px` : undefined }} /> ); }; return ( <div ref={engine.part("host")} aria-hidden="true" className={`relative w-full ${className}`} style={{ aspectRatio: `${W} / ${H}` }}> <div ref={engine.part("scene")} className="absolute left-0 top-0 origin-top-left" style={{ width: W, height: H }}> {/* the route he flies */} <svg viewBox={`0 0 ${W} ${H}`} className="absolute inset-0 size-full overflow-visible" fill="none"> <path d={COO_ROUTE} stroke="var(--coo-route)" strokeWidth="1.5" strokeLinecap="round" strokeDasharray="2 5" opacity="0.4" /> </svg> {/* eslint-disable-next-line @next/next/no-img-element */} <img src={ART.post} alt="" draggable={false} className={img} style={{ left: POST.x - (G.post.w * KP) / 2, top: POST.foot - G.post.h * KP, width: G.post.w * KP, height: G.post.h * KP }} /> <div ref={engine.part("mailbox")} className="absolute left-0 top-0 size-full" style={{ transformOrigin: `${BOX.x}px ${BOX.foot - 6}px` }}> {/* eslint-disable-next-line @next/next/no-img-element */} <img ref={engine.part("box")} src={ART.box} alt="" draggable={false} className={img} style={{ left: BOX.x - G.box.foot.x * KP, top: BOX.foot - G.box.foot.y * KP, width: G.box.w * KP, height: G.box.h * KP, opacity: 0 }} /> {/* eslint-disable-next-line @next/next/no-img-element */} <img ref={engine.part("boxFlag")} src={ART.boxFlag} alt="" draggable={false} className={img} style={{ left: BOX.x - G.boxFlag.foot.x * KP, top: BOX.foot - G.boxFlag.foot.y * KP, width: G.boxFlag.w * KP, height: G.boxFlag.h * KP }} /> </div> <div ref={engine.part("bird")} className="absolute left-0 top-0 will-change-transform"> {frame("stand", ART.stand, KB, "stand", true)} {frame("flyUp", ART.flyUp, KF, "flyUp", false)} {frame("flyDown", ART.flyDown, KF, "flyDown", false)} {frame("flyUp", ART.flyUpEmpty, KF, "flyUpEmpty", false)} {frame("flyDown", ART.flyDownEmpty, KF, "flyDownEmpty", false)} {/* his eyelid, closing over the drawn eye when he blinks */} <svg viewBox={`0 0 ${G.stand.w} ${G.stand.h}`} className="pointer-events-none absolute overflow-visible" style={{ left: -G.stand.cap.x * KB, top: -G.stand.cap.y * KB, width: G.stand.w * KB, height: G.stand.h * KB }} > <g ref={engine.part("lid")} transform="scale(1 0)"> <ellipse cx="0" cy={G.stand.eye.r} rx={G.stand.eye.r + 1.2} ry={G.stand.eye.r + 1} fill={G.lid} /> {/* the closed eye: a dark crease along the lid's foot */} <path d={`M${-G.stand.eye.r} ${G.stand.eye.r * 1.1} Q0 ${G.stand.eye.r * 1.9} ${G.stand.eye.r} ${G.stand.eye.r * 1.1}`} fill="none" stroke="rgb(40 40 52)" strokeWidth="1.6" strokeLinecap="round" /> </g> </svg> </div> <div ref={engine.part("zs")} className="pointer-events-none absolute inset-0" /> {/* his thought while he waits: how long until he can fly again */} <div className="pointer-events-none absolute" style={{ left: HOME.x + 28, top: HOME.y - 23, transformOrigin: "0% 100%", opacity: wait > 0 ? 1 : 0, transform: wait > 0 ? "none" : "scale(0.4) translate(-6px, 10px)", filter: wait > 0 ? "none" : "blur(3px)", transition: reduced ? "none" : "opacity 260ms ease-out, transform 420ms cubic-bezier(0.34,1.36,0.64,1), filter 260ms ease-out", }} > <span className="absolute -bottom-[8px] left-[2px] size-[7px] rounded-full" style={{ background: "var(--coo-bubble)" }} /> <span className="absolute -bottom-[15px] -left-[4px] size-[4px] rounded-full" style={{ background: "var(--coo-bubble)" }} /> <span className="flex h-[26px] items-center whitespace-nowrap rounded-full px-2.5 text-[14px] font-semibold tabular-nums tracking-[-0.01em]" style={{ background: "var(--coo-bubble)", color: "var(--coo-bubble-ink)" }} > {Math.floor(Math.max(0, wait) / 60)}: <NumberRoll value={Math.max(0, wait) % 60} format={{ minimumIntegerDigits: 2 }} direction="down" duration={700} /> </span> </div> </div> </div> );}export default Coo;/* Coo's art: an illustrated carrier pigeon, his mailbox and his post, as WebP data URIs so * one install brings everything. Sizes and points are in each image's own pixels. */export const COO_ART = { stand: "data:image/webp;base64,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", flyUp: "data:image/webp;base64,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", flyDown: "data:image/webp;base64,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", flyUpEmpty: "data:image/webp;base64,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", flyDownEmpty: "data:image/webp;base64,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", box: "data:image/webp;base64,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", boxFlag: "data:image/webp;base64,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", post: "data:image/webp;base64,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",};export const COO_GEO = { /** Every pigeon frame is placed by the middle of his red cap, so swapping frames never jumps. */ stand: { ...{ w: 186, h: 185 }, cap: { x: 145.7, y: 17.4 }, feet: { x: 115.8, y: 183 }, eye: { x: 152.8, y: 38.8, r: 6.6 } }, flyUp: { ...{ w: 196, h: 191 }, cap: { x: 140.8, y: 72.7 } }, flyDown: { ...{ w: 197, h: 159 }, cap: { x: 144.5, y: 12.4 } }, /** The flying frames were drawn a little smaller than the standing one. */ flyScale: 1.2, box: { ...{ w: 110, h: 151 }, foot: { x: 52.8, y: 151 } }, boxFlag: { ...{ w: 108, h: 166 }, foot: { x: 51.1, y: 166 } }, post: { w: 41, h: 131 }, /** His feathers by the eye, for the lid when he blinks. */ lid: "rgb(124 131 154)",} as const;'use client';import * as React from 'react';export const EASE_OUT = 'cubic-bezier(0.16, 1, 0.3, 1)';export const EASE_SETTLE = 'cubic-bezier(0.22, 1.18, 0.36, 1)';/** Thrown things (indicators, thumbs): a slight overshoot on transform only. */export const EASE_THROW = 'cubic-bezier(0.34, 1.36, 0.64, 1)';/** * The press every button primitive shares: a 3% give that eases in and settles back. * Tailwind v4's scale-* writes the `scale` property, so `scale` has to be in the list * or the press snaps. */export const INTERACTION_PRESS = 'transition-[background-color,color,box-shadow,opacity,scale] duration-200 ease-[cubic-bezier(0.16,1,0.3,1)] active:scale-[0.97] motion-reduce:transition-none motion-reduce:active:scale-100';export const INTERACTION_FOCUS ='focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:ring-offset-2 focus-visible:ring-offset-background';const query = '(prefers-reduced-motion: reduce)';const subscribe = (notify: () => void) => { const media = window.matchMedia(query); media.addEventListener('change', notify); return () => media.removeEventListener('change', notify);};export const useInteractionReducedMotion = () => React.useSyncExternalStore(subscribe, () => window.matchMedia(query).matches, () => false);export function useInteractionActivity<T extends Element>() { const ref = React.useRef<T>(null); const [visible, setVisible] = React.useState(false); const [hidden, setHidden] = React.useState(false); React.useEffect(() => { const el = ref.current; if (!el) return; const observer = new IntersectionObserver(([entry]) => setVisible(entry.isIntersecting)); observer.observe(el); const visibility = () => setHidden(document.hidden); visibility(); document.addEventListener('visibilitychange', visibility); return () => { observer.disconnect(); document.removeEventListener('visibilitychange', visibility); }; }, []); return { ref, active: visible && !hidden };}export function interactionIcon(on: boolean, reduced: boolean): React.CSSProperties { return { opacity: on ? 1 : 0, transform: on ? 'none' : 'scale(0.6)', filter: on ? 'blur(0px)' : 'blur(3px)', transition: reduced ? 'none' : `opacity 220ms ${EASE_OUT}, transform 380ms ${EASE_OUT}, filter 220ms ${EASE_OUT}` };}/** Sample recent movement rather than averaging a long drag and losing its release velocity. */export type PointerSample = { x: number; time: number };export function samplePointer(samples: PointerSample[], x: number, time: number) { samples.push({ x, time }); while (samples.length > 2 && time - samples[0].time > 100) samples.shift();}export function releaseVelocity(samples: PointerSample[], now: number) { if (samples.length < 2 || now - samples[samples.length - 1].time > 100) return 0; const first = samples[0], last = samples[samples.length - 1]; return (last.x - first.x) / Math.max(1, last.time - first.time);}/** Smooth Apple/rational rubber-band curve: continuous exponential-like resistance without linear kinks. */export function rubberBand(overshoot: number, dimension = 320, constant = 0.55): number { const d = dimension || 320; const abs = Math.abs(overshoot); return Math.sign(overshoot) * (1 - 1 / ((abs * constant) / d + 1)) * d;}/** Projects resting travel from release velocity (velocity in px/ms; time in seconds). */export function projectInertia(distance: number, velocity: number, time = 0.12): number { return distance + velocity * 1000 * time;}/** Smooths incoming release velocity toward a boundary so springs don't slam or clip into walls. */export function softenVelocity(velocity: number, distanceToTarget: number, factor = 10): number { const maxAllowed = Math.abs(distanceToTarget) * factor; return Math.sign(velocity) * Math.min(Math.abs(velocity), maxAllowed);}/** A damped spring sampled by WAAPI: tuned for organic lightness with a hint of life (3% breath). */export function springFrames( from: number, to: number, velocity = 0, duration = 480, config: { omega?: number; damping?: number; steps?: number } = {},) { const { omega = 16, damping = 0.74, steps = 36 } = config; const damped = omega * Math.sqrt(Math.max(0.001, 1 - damping * damping)); const displacement = from - to; const coefficient = (velocity * 1000 + damping * omega * displacement) / damped; return Array.from({ length: steps + 1 }, (_, i) => { const t = (i / steps) * (duration / 1000); const value = to + Math.exp(-damping * omega * t) * (displacement * Math.cos(damped * t) + coefficient * Math.sin(damped * t)); return { value: i === steps ? to : value, offset: i / steps }; });}Registry item: /r/verify-code.json


