Components

Getting started

Blocks21

Components154

More

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

$ npx shadcn@latest add https://hairlineui.com/r/verify-code.json

Templates

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.

All 43 templates

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.

Instead of wiring upan OTP inputa resend countdownresend button statesa wrong-code shakea verified state
  1. Real code input

    One input with one-time-code autofill, paste and the numeric keyboard; the boxes are only what you see.

  2. A wait you can see

    Coo naps through the resend wait with the seconds rolling down in a thought bubble over his head.

  3. Your serverโ€™s wait

    onResend can return { retryAfter } and the next clock uses it.

  4. Sends that fail

    If onResend throws, Coo comes back with the envelope and Resend turns into Try again.

  5. Wrong and right

    A wrong code shakes and clears the boxes; the right one closes them into a pill with a drawn check.

  6. 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

usage.tsx
import { VerifyCode } from "@/components/verify-code";<VerifyCode  destination={email}  onVerify={(code) => verifyCode(email, code)}  onResend={() => sendCode(email)}/>

Works with

With your own endpoints

Return false for a wrong code, and pass your rate limit back as retryAfter so the clock matches it.

example.tsx
"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

PropTypeDescription
destinationstringWhere 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.
lengthnumberdefault 6How many digits.
resendAfternumberdefault 30Seconds before the first resend, and between resends when onResend doesnโ€™t say.
onChangeDestination() => voidShows Change beside the address.
title / name / autoFocusstring / string / booleandefault "Check your inbox" / "Coo" / falseThe 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

components/verify-code.tsx
"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;
components/coo-pigeon.tsx
"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;
components/coo-art.ts
/* 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,UklGRiQOAABXRUJQVlA4WAoAAAAQAAAAbQAAlgAAQUxQSCMFAAARoAZr2zI3uZ953snW3T04BPfa4u7u0kKaejM+Wdzd3d3d3Ukq01mKu7s7JPO9zzw/vs23+5bnBX5GxASgbGJkZIL1BPTNHza3of7wnWoYIOMIbs6HWvrP9mkAmUZY5QVV8T7xXlT14RVBhhENfUu9aGmRRN8a5Rx1bw+u1EQzJ3oGMhMRO+e4JGXNRo5LUzDCqp2i2UW+mlFTPXb4gN4OIAQkYnbOOXaEjOQojMM09WWku37+/ssP33llUXvHc3dfd/kZR8+vPWz/nbfOT9pw7dWrRw/u3zvnCJnXqj3x3AvPPbFuy9EAmIJQvZQnopWW5K/ff/n+y0/ef2PJc4/ff/s1F55yTMvcI6bd3aXd/vBo7WiAK0fAWSplqUpWXzLxIiJaeV9SRFW/P288iCpE6HlhIrocS3afUbRbEa/67QyAK0IY+qyaK171ofHgChD1ek4TsUZVvH44EVwe43pN1OREf5oKVw7jcE3UaK/frAHKRljxJxGrVPTDalAZ96tXuxN90TFlYOwkXi1PtADOQK5dxTSRzvVB3TC2F1Hbvb7ARKUI96s3Tr3uDC5BWPE3FfPkSVAJh4J6NV+SGlCKaLGKfV5PAQMg1HTGQPSDviDA4Wj1GkHRA+EAwpNx8Ho3CIS+n6nEQPTzgSDC2l1xUJE8mLGPikbRayOcw4nqY3ErmHBHLESXEIDnVGLx+QAgV4zHX6sCI9+PhYrmgerPIrIrsNbPGkvRacCkLomF11Zgc4lIAdhSI9IKbBWTxsjMB7aMyRxg85jMis+WMZkbmYbINEemMTL1wOYxWQDkIzNJIjIfmOgjMgfYuCsidZGZAUxK4jLFx2WqRKQuPnmNyCxg85jMBbaMyXwgH5P6+Gz+32VBZOYD+f+L5gCbx6QWyEdmksRD6oCJ3jhJpyTRWUD1X5L4dOK9l/Q/SUp775O09yKaFu9FVTYE4TQtW7z3ifeSXl58SdGKStL1yy+qqr+9Uwsiws6nXHnnTa0NZ13zUPsbn/zUmWhmEfHeS7Duk66/fvrsnWLH0/fffOX5JzbXHbzLlPVr1hhfvfuMA/Mr5kAol3sPX3Ht/D5HFC668/GX3vrmd6/L5+/3XHHcgtoDdpi47qrVw3pXoeKENDtmds4xEbLnhq604Za77D/3jGs+VAkh+gbKJSJml2amNDvHRCif0szsHBOyXqg+zJu92TnHzFQa/0wiImZ2OT47HAh2Mk4L9VpPY04MtSxnzPGhilXGHBNqmTWFUK/Z4tAcquiMaQi1mI2pD9VBxiwItcQZUx9qqS2M5lBLcsYUQi21xaEl1JKexjSEKlpTH2ppLi6Lq4xpCLXEmsZQxZ7GtIR6rbcxraGKOWPaQi1ycWm3piVUR5UxzaEW5eLSHpkOaxoj0/Avo8qY5lCL2BRGWzAypvCfpi0Ym+LQGmpJLi5LexlTCFXsb0xbqNcGx2VZf2MKodqr4vIsGdMWDKbG5+hwZAnj+DBen7PmxFAvwFTGcaHaATLl6DCiHWRMIYzXF2CqQ1uoJ0C2tEamJdSz1jT/u3giMg9b0xKZ1lBPWtMWRvRxa1pDPRSZ+yPzsDUFCSMvAGQIYx9NRCol0ql3gGEoUc8nVNV7kXJEvFfV3yfaAkLfY4qdqqqSeBFJifeiqtr5xoVrg2ArAVwz5/Y3fteS4kVUVTuXXT5trSqAYC0xALjqPc94+I2fNP3N46ftu5YDACYYTMSEtBu1wc4H7jllGNLMRDCbiB2hW3JMhOUeAFZQOCDaCAAAcCcAnQEqbgCXAD5tMJRHpCKiISZyTLCADYlB11RVPM4scyvNEjN22v9H6wtuF5pfN99Hu8qegB5cXs6/ud6XdZZcP1mz6M555EOpf4F2DaZL/jvRm0XfV/7I/Aj/Lf7hvsX7OhtPm++dLAkturRUjajzf0e5gwiL7rNKC4f31H90oiDt4Mc87RRsUsczSBoQKdpNXalwsgZGbxQqsRCfPDUdTAjx4MaAgnxKcCvphkwcZxR7WfURx16y5eiHEBk1mCdcLpYfipSrdbTMb9Al56RboQoW9G2hVGtLo5mazH+UhiwLvHvYvLQFHK7zNeSS6j46RGH+W3QpDAHn2spSn51QJOnqoh1WitPLCkjLXwH2rM9IUvisTA9LZOclu79xEg+CmSsybYlmfatCG1F2cHpWB4JewsTuFXHgTqu6Sf+1nWPgAP7+zWvwzW+dgCT0ivG3rMjV34hLKCfAsbbB8YA/ZAko4aqp4VPARVLQzgz6vJ4Cd3TZpFzRAvB2d5jYLx6sA+o2HfQT+O1KX8NbH03lShFbuUxNh9g9Y6bSyFKd/LTQkADfcqaIlnEWN5roh+ucfjoA1eg6em5mzz7e1av6nZH8teBranGYAACLkuhn93v9q5YlwC9MEcSUK9ryJKHy49Qw+pP4aDb8LrkKKcNKHg4VYdkNPdNLU/Zzq8+2N1OhEycPub0cbHglPZ6TyOYT1JBH9Bfh5lEv74hZILz50w1Pct1HdASLCF6z40/m+XM1yhd7zhmMoMb0hE8tQN/qmi6OoC1vWvBHwMXRdLXmyzC3Q9yyxr9RxUij+uvTwqzk4rVRf1t39uHNShVnrtBYkzum6HaNY1H16dOXscsWHWYm03m39wKI+Mao4xysoqQJukzpL+LCaoPEornrX1DcsNGpjQbYNkDRA5ZbcFD1d/RVDqliplAdMmDoukX0bo1yWl/iNRlGR6RljNY3JBZweLG8R6l9DoKlr+jpur/cpqAfFBe4ViQysJmR8jB7UJ28lMLZdP4NiCyokb6u0TKs9BGIqnd6WqjNG+2ShtyHeDlzaRjWv0Fh/dCK0vjb9a24/5xp1pL/Q2DlPULu0RbQ3rzUcsNaAQU8ZPPox/agxYGMN95s7ZzazCqZHZgWR/Hl8kfdC9ZLvCXy80B2qCLeh7t4ENEANtbUBZFjc5ZDWeULNhpCc4C0ZTx713fFhH4F+ASlF1/ppmkefbHoeVMWUFJQqfmSJVuyFejAXPypM8yHmTxXzCwmh/jcOZ1r/FJv1oKEHAccFIu6q5WCPeKcA7/LEoWk5Y3xALfXpKwZSni0fcbxqmHDsjzxy4qjnbDQL9v+eqjkdPkBawTYO0OfjwBtb9ozkkY8hS49VqmZ+s58xobFxS7CZqA+K/RAxAbLQIvAv1Fd5gbRFZr5k01DMK4y5y1jzWFXKW2u5Jn7sdBY9oq2ZUQrebxdE4WYxAc7tisJBQgLwxuZXaDBV9hprQe0ocTTZYzoiiEbJoIBlMh+W3Bxx+w5bxwCBjWoNgX8zi6ExmlmpvBQcYF7kyLbGVj00uQuuLLz+HvtuKI/AOBQHN9lI4FrKmLXtbJdVsapkf4OFtJADvyiz39gA6nLOeSQ/n2MH1JQrda3z+WqMfXqTYktI/Cdn9nY+c+VH6/YCzQPyMbyZ8XaoyL4VICDtnG19A6GN3SN0+OI4RsnmhnK2jAXJ6khxTDcLfJcBBgtHl3sBOocrEFS4wn1kvDKa83/ewp+tJJGJ3lmekG3Ta3LuraQzOV2GjAY5Yi2FE2y83vpzqd8Lj6bC9r8MHElTloF6nEQekDw2bz5cJfIG/SvPHQOckHmoG6oBUHOpp1de3FTunb9eCS1EJYzQstsADAflA5X/e9lfEzUelxkw8sp2trmeudTm0Bb0+ZPSUj4MXR2dBzHBWT1PZZ5nVgK0fWE+4B3oGLVGJlvFqHJaeND2eE7FUS4fEZmrzKr1mJiFLcwdEUvqEkNb/k3f1GK17LB2voTwbcT1Pb8Yvm8vHnQDlToqut7lWpcGMEoXykxphoqx6CX3uVCfKg/l7A23YAH0LJ2BCt+P+xeWBJY68mQqGf/uzcncyph+6GDQX6iq3hWPxLRVtkJcBOzNYcYvirFUjt4J+ByBYd+Ty7xufU1b/PpKBSdMGTYgX1eVfT64EQKAc0AgmSHEyxVGS3ki6yb1m40tqygBj8SDTRO/JGxytHh3NaMrpcRI9GSb9FHla3J5lLKHYtDFgoXoJjnFhJcdZuxDxy/j0THoyIV0bGDjbl/OXJ0rQkL7/0N8jBDZRgQV18ccUnNt72+Z1iqP1Hjxs+85MzyoXAGz2xwQNS9JcRa4yfl8x+hhT1BX1AEWYNbsP+icMopu5oNQWrDl3itTbOFSE6sSrnwpGv2NSCjfSLH+H/h3PKmlAWjNgcZkVOrf18FicPlHZDYzN6P5ueICofAD+5URmsjLkk2PelykxeeZAtZjkmkBKOKzIKcSean1mC6M6uo/nm/CQLaBRZXHDUloZGQjJKdzx1TXFW25blOWvCxQxvcRtlT938T6M2tU2SyyoLCGXSZdVQzXFX1mdgCDc2kGuocw2/YZD0Ht6IAABQlp51knZTWsalOQrOXYfSjVYyR63lKJsmt73P0/4DBAxrM0oJjh+rEcpr6UuaqBc2MznhZdFKdGhuPA4enWiGkW//7zxvm9Mc8Du324ORmvxNqgN6pTBmwB/JdDEEkimFfcW5pbsM206UuHaH50Kjn4O4hOz4d+vc7bjzimntVgd8HMDbYC97Mr/0GoPirrNNiWHd4cN4AAEtkTHXKzgEbpFHq7DLTztohqNqjPco7Tp64AWRtj/GwJNVBp//hQ5CpeApEOL2g5CwWiYg/aP/PAyQeCuIR51nIDnnnliTPbynJm6j1OElOL3pgOwjpyxrXlABej04FmHUuT624WL736xjq/R8aFTr5HW3f9/bEvhREPwCn0srXEg5yOyzQ2qDeUvIxETO/jYliAFXKQzntBjSI/SETHHOlT+fLgAAAAA==",  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;
components/ui-interaction-motion.ts
'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