Create passwordNew
A password step with a chameleon: the stronger the password, the better Hide blends in, until only his eye is left.
Used forSign-upPassword resetAccount securityInvites
Install with the shadcn CLI
$ npxnpx shadcn@latest add https://hairlineui.com/r/create-password.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
Sign-up
The password step after the email, with rules people actually read.
Password reset
The new-password screen at the end of a reset link.
Account security
Change password in settings, with a breach check before itโs saved.
Invites
Setting a password when accepting a team invite.
What it handles for you
A password step is usually a field, a grey list of rules and a meter that turns from red to green. This block makes each rule a moment, checks the password against known breaches, and keeps the field one password managers understand.
- 01
Rules that react
Each rule met gets its check from Hideโs tongue; lose one and he takes it back.
- 02
Strength you can see
He blends further into the stage with every rule, until only his eye is left.
- 03
Breach check
checkBreaches runs once the rules are met, after a pause in the typing; a breached password turns him red and blocks Continue.
- 04
Your rules
Pass any rules as { id, label, test }; the defaults are length, a number, a capital and a symbol.
- 05
Password managers
A new-password field with the accountโs username beside it, so the pair is offered and saved.
- 06
Submit with states
Continue โ Checking โ Saving โ Password set, or the serverโs message under the field.
Overview
The password rules box is the most ignored part of every sign-up. This one hands it to Hide, an illustrated chameleon sitting on a branch on the lit stage, watching the caret as you type. Each rule the password meets, his tongue shoots out to its circle and leaves a check there; lose a rule and he takes the check back and swallows it. With every check a front of colour change runs a little further from his tail to his snout, leaving only his shading in the stageโs own colour, so with every rule met heโs gone but for an eye blinking out of the scales. Press Show password and his cover is blown: the colour floods back, his eye squeezes shut and his cheek flushes. Wipe the field after heโs hidden and he jumps. Give it checkBreaches and a password that turns up in known breaches turns him red and says how often. Under the act it is a proper password step: a real new-password field password managers fill and save, rules you set, Continue that stays off until theyโre met, and onSubmit for your endpoint.
States
- spotted
- Hide sits on his branch in full colour, his pupil following the caret (or the pointer between keystrokes); the line above reads โHide is easy to spotโ. He breathes and blinks now and then.
- catch
- A rule met: he glances at its circle and his tongue shoots out (150ms), touches it, and the check pops in and draws itself as the tongue comes back (210ms). Several at once go one after another, faster.
- blend
- Each check moves a front of colour change further from tail to snout (about 600ms): behind it only his shading is left, in the stageโs colour, with a brighter band at the front as it passes.
- gone
- Every rule met: only his eye is left in the scales and the line asks โWhere did Hide go?โ. Continue lights up.
- take back
- A rule lost: his tongue fetches the check, he swallows it with a little bob and the colour comes back a step.
- exposed
- Show password: the colour floods back at once, his eye squeezes shut and his cheek flushes; hiding it lets him blend in again.
- startle
- Wiping the field once two or more rules were met: the checks fall away, he jumps with a tiny pupil and says โHey! I was hiding.โ
- breached
- checkBreaches returns more than 0: he turns red, the field says how many breaches the password was seen in, and Continue stays off.
- saved
- Continue โ Checking โ Saving โ Password set with a drawn check, and he winks; if onSubmit throws, the button shakes into Try again and the message shows under the field.
Usage
import { CreatePassword } from "@/components/create-password";<CreatePassword username={email} onSubmit={(password) => fetch("/api/password", { method: "POST", body: JSON.stringify({ password }) })}/>Works with
Installs with it
- Password inputA password field with an eye that turns into eye-off, a four-step strength meter that fills and names itself, and a Caps Lock warning.
- 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 a breach check
Have I Been Pwnedโs range API needs no key and never sees the password: send the first five characters of its SHA-1 and look for the rest in the answer.
"use client";import { CreatePassword } from "@/components/create-password";async function checkBreaches(password: string, signal: AbortSignal) { const bytes = await crypto.subtle.digest("SHA-1", new TextEncoder().encode(password)); const hash = [...new Uint8Array(bytes)].map((b) => b.toString(16).padStart(2, "0")).join("").toUpperCase(); const res = await fetch(`https://api.pwnedpasswords.com/range/${hash.slice(0, 5)}`, { signal }); const line = (await res.text()).split("\n").find((l) => l.startsWith(hash.slice(5))); return line ? Number(line.split(":")[1]) : 0;}export function PasswordStep({ email }: { email: string }) { return ( <CreatePassword username={email} checkBreaches={checkBreaches} onSubmit={async (password) => { const res = await fetch("/api/sign-up/password", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ email, password }), }); if (!res.ok) throw new Error((await res.json()).message ?? "Couldnโt save that. Try again."); }} /> );}Props
| Prop | Type | Description |
|---|---|---|
| onSubmit | (password: string) => Promise<unknown> | Called with the password once every rule is met. Keep it; throw an Error to show its message. |
| checkBreaches | (password: string, signal: AbortSignal) => Promise<number> | How many known breaches the password is in (0 if none). Asked 450ms after typing stops once the rules are met, and again on Continue if needed; a newer password aborts the older ask. If it fails, Continue still works. |
| rules | PasswordRule[]default PASSWORD_RULES | { id, label, test(password) }. Defaults: 8+ characters, a number, a capital letter, a symbol. |
| username | string | The accountโs email or username, in a hidden field so password managers save the pair. |
| onValueChange | (password: string) => void | Every change to the password. |
| title / description / submitLabel | stringdefault "Create a password" / "The stronger it is, the harder Hide is to find." / "Continue" | The heading, the line under it and the button. |
| name | stringdefault "Hide" | What the chameleon is called in his lines. |
Accessibility and motion
- The field is a real new-password input labelled Password; the eye is a toggle button with aria-pressed. Each rule is a list item that says done or not yet, and every check placed or taken back is announced from a status region.
- Hide is decoration (aria-hidden). He is an illustration shipped inside hide-art.ts as two WebP data URIs (43KB of images, 59KB as text), so the install is complete with nothing to put in public/; his pupil, tongue, blush, colour change and hop are drawn in code over it.
- One frame loop outside React writes his styles and sleeps when heโs still; his breathing is a compositor animation. The tongue is drawn in an overlay over the block and costs no React renders.
- The stage is the lit --primary surface engraved with fine scales; he blends into whatever colour your theme gives it, light or dark. Tongue, pupil, blush and check colours are --hide-* variables you can override. No drop shadows, glow or blur.
- With reduced motion there is no tongue, hop or breathing: checks appear in place and his colour changes in place.
- Built from Password input, 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 Password input, Status button, Text morph.
Source
"use client";import * as React from "react";import { Hide, type HideHandle, type Point } from "./hide-chameleon";import { PasswordInput } from "./password-input";import { StatusButton, type ActionStatus } from "./status-button";import { TextMorph } from "./text-morph";import { EASE_OUT, EASE_THROW, useInteractionReducedMotion } from "./ui-interaction-motion";/* โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ * CREATE PASSWORD: the stronger it is, the harder Hide is to find * * spot Hide, a chameleon, sits on a branch on the lit * stage in full colour, watching the caret * catch each rule the password meets, his tongue shoots * out to its circle and leaves a check there; lose * one and he takes the check back and swallows it * blend with every check a front of colour change runs a * little further from his tail to his snout; with * all of them he's gone but for his eye * exposed Show password and his colour floods back, eye * squeezed shut, cheek flushed * startle wipe the field and his cover's blown: he jumps * breached with checkBreaches, a password seen in a breach * turns him red and says how often * done Continue โ Saving โ Password set, and a wink * * onSubmit gets the password; keep it however you keep them. * โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ */export interface PasswordRule { id: string; label: string; test: (password: string) => boolean;}export const PASSWORD_RULES: PasswordRule[] = [ { id: "length", label: "8+ characters", test: (p) => p.length >= 8 }, { id: "number", label: "A number", test: (p) => /\d/.test(p) }, { id: "capital", label: "A capital letter", test: (p) => /[A-Z]/.test(p) }, { id: "symbol", label: "A symbol", test: (p) => /[^A-Za-z0-9\s]/.test(p) },];export interface CreatePasswordProps { /** Keep the password (your sign-up or reset endpoint); throw an Error to say why not. */ onSubmit: (password: string) => Promise<unknown>; /** How many known breaches the password appears in (0 if none), e.g. from Have I Been Pwned's range API. */ checkBreaches?: (password: string, signal: AbortSignal) => Promise<number>; rules?: PasswordRule[]; /** The account's email or username, so password managers save the pair. */ username?: string; onValueChange?: (password: string) => void; title?: string; description?: string; submitLabel?: string; /** What the chameleon is called in his lines. */ name?: string; 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, engraved with fine scales like his skin: whatever he blends into, it's this. */const SCALE = `radial-gradient(circle at 50% 0%, transparent 5.1px, ${mix(PF, 11)} 5.6px, transparent 6.3px)`;const STAGE: React.CSSProperties = { backgroundColor: "var(--primary)", backgroundImage: [ `radial-gradient(90% 70% at 50% 100%, ${mix(PF, 18)} 0%, transparent 62%)`, `radial-gradient(120% 90% at 0% 0%, ${mix(PF, 16)} 0%, transparent 55%)`, `linear-gradient(175deg, transparent 40%, ${mix("black", 22)} 100%)`, SCALE, SCALE, ].join(", "), backgroundSize: "auto, auto, auto, 12px 7px, 12px 7px", backgroundPosition: "0 0, 0 0, 0 0, 0 0, 6px 3.5px", boxShadow: `inset 0 1px 0 ${mix(PF, 36)}, inset 0 0 0 1px ${mix(PF, 12)}`,};const LIT: React.CSSProperties = { backgroundImage: `linear-gradient(180deg, ${mix(PF, 16)}, transparent 60%)`, boxShadow: `inset 0 1px 0 ${mix(PF, 32)}, inset 0 0 0 1px ${mix("black", 10)}`,};/* Hide's own colours; each can be overridden. */const HIDE = { "--hide-pupil": "oklch(0.2 0.03 150)", "--hide-tongue": "oklch(0.74 0.14 6)", "--hide-tongue-line": "oklch(0.44 0.11 8)", "--hide-blush": "oklch(0.7 0.17 15)", "--hide-check": "var(--color-emerald-500, oklch(0.7 0.16 162))",} as React.CSSProperties;let measure: CanvasRenderingContext2D | null = null;/** Where the caret is on screen, near enough for an eye to follow. */function caretAt(input: HTMLInputElement): Point { const r = input.getBoundingClientRect(); const cs = getComputedStyle(input); measure ??= document.createElement("canvas").getContext("2d"); const upto = input.selectionStart ?? input.value.length; const text = input.type === "password" ? "โข".repeat(upto) : input.value.slice(0, upto); let w = 0; if (measure) { measure.font = `${cs.fontWeight} ${cs.fontSize} ${cs.fontFamily}`; w = measure.measureText(text).width; } return { x: r.left + Math.min(r.width - 6, parseFloat(cs.paddingLeft) + w - input.scrollLeft), y: r.top + r.height / 2 };}export function CreatePassword({ onSubmit, checkBreaches, rules = PASSWORD_RULES, username, onValueChange, title = "Create a password", description, submitLabel = "Continue", name = "Hide", className = "",}: CreatePasswordProps) { const reduced = useInteractionReducedMotion(); const baseId = React.useId(); const [password, setPassword] = React.useState(""); const [shown, setShown] = React.useState(false); const [placed, setPlaced] = React.useState<Record<string, boolean>>({}); const [breach, setBreach] = React.useState<{ password: string; count: number } | null>(null); const [act, setAct] = React.useState<{ status: ActionStatus; checking?: boolean; error?: string }>({ status: "idle" }); const [startled, setStartled] = React.useState(false); const [said, setSaid] = React.useState(""); const overlayRef = React.useRef<SVGSVGElement>(null); const inputRef = React.useRef<HTMLInputElement>(null); const hide = React.useRef<HideHandle>(null); const circles = React.useRef(new Map<string, HTMLElement>()); // what the tongue has done and is about to do; the latest password for its callbacks const placedRef = React.useRef<Record<string, boolean>>({}); const pending = React.useRef(new Set<string>()); const latest = React.useRef(""); const typedAt = React.useRef(0); const startleTimer = React.useRef(0); const checkRef = React.useRef(checkBreaches); React.useEffect(() => { checkRef.current = checkBreaches; }); React.useEffect(() => () => window.clearTimeout(startleTimer.current), []); const met = rules.map((r) => r.test(password)); const allMet = met.every(Boolean); const done = rules.filter((r) => placed[r.id]).length; const breached = Boolean(breach && breach.password === password && breach.count > 0); const busy = act.status === "pending"; // Once every rule is met, ask about breaches after a pause in the typing; a newer password aborts the older ask. React.useEffect(() => { if (!allMet || !checkRef.current) return; const ctrl = new AbortController(); const timer = window.setTimeout(() => { checkRef.current?.(password, ctrl.signal).then( (count) => !ctrl.signal.aborted && setBreach({ password, count }), () => {}, ); }, 450); return () => { window.clearTimeout(timer); ctrl.abort(); }; }, [allMet, password]); const place = (next: Record<string, boolean>) => { placedRef.current = next; setPlaced(next); }; /** Send the tongue wherever a check is wrong, one rule at a time. */ const reconcile = () => { const value = latest.current; if (reduced) { place(Object.fromEntries(rules.map((r) => [r.id, r.test(value)]))); return; } for (const r of rules) { const want = r.test(value); const target = circles.current.get(r.id); if (pending.current.has(r.id) || want === Boolean(placedRef.current[r.id]) || !target) continue; pending.current.add(r.id); hide.current?.flick(target, want ? "give" : "take", () => { pending.current.delete(r.id); place({ ...placedRef.current, [r.id]: want }); setSaid(`${r.label}: ${want ? "done" : "missing"}.`); // the password may have moved on while the tongue was out window.setTimeout(reconcile, 0); }); } }; const change = (next: string) => { const before = Object.values(placedRef.current).filter(Boolean).length; latest.current = next; setPassword(next); onValueChange?.(next); if (act.status === "error" || act.status === "success") setAct({ status: "idle" }); if (!next) { // wiped: the checks fall away at once and, if he was well hidden, he jumps pending.current.clear(); place({}); if (before >= 2) { hide.current?.startle(); setStartled(true); window.clearTimeout(startleTimer.current); startleTimer.current = window.setTimeout(() => setStartled(false), 1800); } return; } setStartled(false); reconcile(); }; const followCaret = () => { const input = inputRef.current; if (input) hide.current?.look(caretAt(input)); }; const submit = async (e: React.FormEvent) => { e.preventDefault(); if (!allMet || breached || busy) return; const value = password; try { const check = checkRef.current; if (check && !(breach && breach.password === value)) { setAct({ status: "pending", checking: true }); let count = 0; try { count = await check(value, new AbortController().signal); } catch { // a breach service that's down shouldn't stop a sign-up } setBreach({ password: value, count }); if (count > 0) { setAct({ status: "idle" }); return; } } setAct({ status: "pending" }); await onSubmit(value); setAct({ status: "success" }); hide.current?.wink(); } catch (err) { setAct({ status: "error", error: err instanceof Error && err.message ? err.message : "Couldnโt save that. Try again." }); } }; const mood = act.status === "success" ? `${name} is safe with you` : startled ? "Hey! I was hiding." : breached ? `${name} has been spotted` : shown && password ? `${name} feels exposed` : done === rules.length ? `Where did ${name} go?` : done > 0 ? `${name} is blending in` : `${name} is easy to spot`; const error = breached ? `Seen in ${breach!.count.toLocaleString("en-US")} data breach${breach!.count === 1 ? "" : "es"}. Try another.` : act.status === "error" ? act.error : undefined; const ready = allMet && !breached; return ( <section aria-labelledby={`${baseId}-title`} className={`relative w-full max-w-[380px] rounded-[28px] p-2 text-card-foreground ${className}`} style={{ ...CARD, ...HIDE }} onPointerMove={(e) => { // the pointer, unless he's watching the caret if (e.pointerType === "mouse" && e.timeStamp - typedAt.current > 1400) hide.current?.look({ x: e.clientX, y: e.clientY }); }} onPointerLeave={() => hide.current?.look(null)} > {/* 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 isolate overflow-clip rounded-[22px] text-primary-foreground" style={STAGE}> <p className="absolute left-3.5 top-3 z-10 text-[12.5px] font-medium text-primary-foreground/85"> <TextMorph>{mood}</TextMorph> </p> <Hide ref={hide} camo={done / Math.max(1, rules.length)} alarm={breached} exposed={shown && password.length > 0} reduced={reduced} overlay={overlayRef} /> </div> <form className="px-2 pb-1 pt-3" onSubmit={submit} noValidate> <h2 id={`${baseId}-title`} className="px-1 text-[15px] font-medium tracking-[-0.01em]"> {title} </h2> <p className="mt-0.5 px-1 text-[12.5px] text-muted-foreground">{description ?? `The stronger it is, the harder ${name} is to find.`}</p> {username !== undefined && <input type="text" name="username" autoComplete="username" value={username} readOnly hidden />} <PasswordInput ref={inputRef} aria-label="Password" name="password" autoComplete="new-password" placeholder="Enter a password" className="mt-3" value={password} onValueChange={change} shown={shown} onShownChange={(on) => { setShown(on); setSaid(on ? "Password shown." : "Password hidden."); }} error={error} disabled={busy} onKeyDown={(e) => { typedAt.current = e.timeStamp; }} onKeyUp={followCaret} onSelect={followCaret} onFocus={followCaret} onClick={followCaret} onBlur={() => hide.current?.look(null)} /> <ul aria-label="Your password needs" className="mt-2.5 grid grid-cols-1 gap-x-3 gap-y-1.5 px-1 @[270px]:grid-cols-2"> {rules.map((r) => { const on = Boolean(placed[r.id]); return ( <li key={r.id} className="flex min-w-0 items-center gap-2 text-[12.5px]"> <span ref={(el) => { if (el) circles.current.set(r.id, el); else circles.current.delete(r.id); }} className="relative grid size-4 shrink-0 place-items-center rounded-full" style={{ boxShadow: `inset 0 0 0 1px ${mix("var(--foreground)", 22, "var(--border)")}` }} > <span className="absolute inset-0 rounded-full" style={{ background: "var(--hide-check)", opacity: on ? 1 : 0, transform: on ? "scale(1)" : "scale(0.4)", transition: reduced ? "none" : `opacity 200ms ${EASE_OUT}, transform 420ms ${EASE_THROW}`, }} /> <svg viewBox="0 0 16 16" className="relative size-3" fill="none" aria-hidden="true"> <path d="M3.8 8.3 6.6 11 12.2 5" stroke="white" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" pathLength={1} strokeDasharray={1} style={{ strokeDashoffset: on ? 0 : 1, transition: reduced ? "none" : on ? `stroke-dashoffset 320ms ${EASE_OUT} 60ms` : "stroke-dashoffset 120ms" }} /> </svg> </span> <span className={`truncate transition-colors duration-300 ${on ? "text-foreground" : "text-muted-foreground"}`}> {r.label} <span className="sr-only">{on ? ", done" : ", not yet"}</span> </span> </li> ); })} </ul> <StatusButton type="submit" status={act.status} labels={{ idle: submitLabel, pending: act.checking ? "Checking" : "Saving", success: "Password set", error: "Try again" }} disabled={!ready && !busy} className="mt-3 h-10 w-full text-[13.5px] disabled:bg-[color-mix(in_oklab,var(--foreground)_7%,transparent)] disabled:text-muted-foreground" style={ready && act.status !== "error" ? LIT : undefined} /> </form> </div> {/* His tongue is drawn over the whole block, from his mouth to a rule and back. */} <svg ref={overlayRef} aria-hidden="true" className="pointer-events-none absolute inset-0 z-20 size-full overflow-visible" /> <span className="sr-only" role="status"> {said} </span> </section> );}export default CreatePassword;"use client";import * as React from "react";import { HIDE_BODY, HIDE_BRANCH, HIDE_GEO as G } from "./hide-art";/* โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ * HIDE: a chameleon who blends in as a password gets stronger * * An illustrated chameleon, rigged in code. The picture never * changes; everything he does is computed over it: * * blend a front of colour change runs from his tail to his * snout and leaves only his shading behind, in the * stage's own colour (`camo`, 0 to 1) * look his pupil, painted out of the picture and drawn * here, turns toward the caret, the pointer or a rule * flick his tongue shoots out to an element in the block, * touches it and comes back; "take" carries a check * home with it * exposed eye squeezed shut, cheek flushed, colour back * alarm he turns red (a breached password) * startle a hop and a tiny pupil when his cover is blown * * One frame loop outside React writes every style and sleeps * when nothing moves; his breathing is a compositor animation. * The tongue is drawn in an <svg> that covers the whole block, * in the block's own px. * โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ */export type Point = { x: number; y: number };export interface HideHandle { /** Look at a point on screen (client px), or back down at the field with null. */ look: (at: Point | null) => void; /** The tongue goes out to `target`, touches it (onTouch) and comes back; "take" brings a check back with it. */ flick: (target: HTMLElement, kind: "give" | "take", onTouch: () => void) => void; /** Cover blown: a hop and a small pupil. */ startle: () => void; /** A slow, pleased wink. */ wink: () => void;}const NS = "http://www.w3.org/2000/svg";const TRAVEL = 15; // how far the pupil moves in the eye, in image pxconst REST: Point = { x: -0.3, y: 0.62 }; // looking down at the fieldconst SOFT = 24; // width of the colour-change front, % of the bodyconst ORIGIN = `50% ${((G.feet.y / G.h) * 100).toFixed(1)}%`;const clamp = (v: number, a = 0, b = 1) => Math.min(b, Math.max(a, v));const easeOut = (k: number) => 1 - Math.pow(1 - k, 3);const easeIn = (k: number) => k * k;type Spring = { x: number; v: number };/** One step of a spring toward its target; true once it has settled. */function step(s: Spring, target: number, dt: number, k = 170, c = 20) { 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;}/** An element's place inside `root` from layout offsets, so transforms (a hop, a breath) don't move it. */function offsetIn(el: HTMLElement, root: Element): Point { let x = 0; let y = 0; for (let n: HTMLElement | null = el; n && n !== root; n = n.offsetParent as HTMLElement | null) { x += n.offsetLeft; y += n.offsetTop; } return { x, y };}type Flick = { target: HTMLElement; kind: "give" | "take"; onTouch: () => void; t0: number; touched: boolean; g?: SVGGElement; from?: Point; to?: Point; u?: number; fast?: boolean };export class HideEngine { parts: Record<string, Element | null> = {}; overlayRef: React.RefObject<SVGSVGElement | null> | null = null; reduced = false; camoT = 0; alarmT = 0; exposedT = 0; camo: Spring = { x: 0, v: 0 }; alarm: Spring = { x: 0, v: 0 }; shut: Spring = { x: 0, v: 0 }; blush: Spring = { x: 0, v: 0 }; lookX: Spring = { x: REST.x, v: 0 }; lookY: Spring = { x: REST.y, v: 0 }; hop: Spring = { x: 0, v: 0 }; small: Spring = { x: 1, v: 0 }; lookT: Point = REST; smallUntil = 0; winkUntil = 0; blinkAt = 0; flicks: Flick[] = []; breaths: Animation[] = []; raf = 0; last = 0; blinkTimer = 0; seq = 0; frame = (now: number) => this.tick(now); part = (name: string) => (el: Element | null) => { this.parts[name] = el; }; get overlay() { return this.overlayRef?.current ?? null; } mount(overlay: React.RefObject<SVGSVGElement | null>, reduced: boolean, camo: number, alarm: boolean, exposed: boolean) { this.overlayRef = overlay; this.reduced = reduced; this.set(camo, alarm, exposed, true); this.draw(performance.now()); this.scheduleBlink(); if (!reduced) { // breathing: a slow swell from the feet, added on top of whatever the frame loop writes for (const name of ["color", "shimmer", "alarm", "relief", "eye"]) { const el = this.parts[name] as HTMLElement | null; const a = el?.animate([{ transform: "none" }, { transform: "scale(1.005, 1.016)" }], { duration: 1800, iterations: Infinity, direction: "alternate", easing: "ease-in-out", composite: "add", }); if (a) this.breaths.push(a); } } } destroy() { cancelAnimationFrame(this.raf); window.clearTimeout(this.blinkTimer); this.raf = 0; this.breaths.forEach((a) => a.cancel()); this.breaths = []; this.flicks.forEach((f) => f.g?.remove()); this.flicks = []; } set(camo: number, alarm: boolean, exposed: boolean, now = false) { this.exposedT = exposed ? 1 : 0; this.alarmT = alarm ? 1 : 0; this.camoT = exposed || alarm ? 0 : clamp(camo); if (now || this.reduced) { this.camo.x = this.camoT; this.alarm.x = this.alarmT; this.shut.x = this.blush.x = this.exposedT; this.camo.v = this.alarm.v = this.shut.v = this.blush.v = 0; this.draw(performance.now()); return; } this.wake(); } scheduleBlink() { window.clearTimeout(this.blinkTimer); this.blinkTimer = window.setTimeout(() => { this.blinkAt = performance.now(); this.seq++; this.wake(); this.scheduleBlink(); }, 2600 + ((this.seq * 1237 + 401) % 3400)); } wake() { if (this.raf || !this.parts.rig) return; this.last = performance.now(); this.raf = requestAnimationFrame(this.frame); } /** Where the eye is on screen. */ eyeOnScreen(): Point | null { const rig = this.parts.rig as HTMLElement | null; if (!rig) return null; const r = rig.getBoundingClientRect(); return { x: r.left + (G.eye.x / G.w) * r.width, y: r.top + (G.eye.y / G.h) * r.height }; } look(at: Point | null) { const eye = at && this.eyeOnScreen(); if (!at || !eye) this.lookT = REST; else { const dx = at.x - eye.x; const dy = at.y - eye.y; const d = Math.hypot(dx, dy) || 1; const m = Math.min(1, d / 70); this.lookT = { x: (dx / d) * m, y: (dy / d) * m }; } if (this.reduced) { this.lookX.x = this.lookT.x; this.lookY.x = this.lookT.y; this.draw(performance.now()); return; } this.wake(); } flick(target: HTMLElement, kind: "give" | "take", onTouch: () => void) { if (this.reduced || !this.overlay) { onTouch(); return; } this.flicks.push({ target, kind, onTouch, t0: 0, touched: false }); this.wake(); } startle() { if (this.reduced) return; this.hop.v -= 400; this.smallUntil = performance.now() + 950; this.wake(); } wink() { if (this.reduced) return; this.winkUntil = performance.now() + 620; this.wake(); } /** The mouth and a flick's target in the overlay's px (the block's own). */ startFlick(f: Flick, now: number) { const overlay = this.overlay; const rig = this.parts.rig as HTMLElement | null; const root = overlay?.parentElement; if (!overlay || !rig || !root) return false; const k = rig.offsetWidth / G.w; const at = offsetIn(rig, root); const to = offsetIn(f.target, root); f.from = { x: at.x + G.mouth.x * k, y: at.y + G.mouth.y * k }; f.to = { x: to.x + f.target.offsetWidth / 2, y: to.y + f.target.offsetHeight / 2 }; f.u = rig.offsetWidth / 244; f.fast = this.flicks.length > 1; f.t0 = now; const g = document.createElementNS(NS, "g") as SVGGElement; const u = f.u; g.innerHTML = `<path data-part="line" fill="none" stroke="var(--hide-tongue-line)" stroke-width="${8.6 * u}" stroke-linecap="round"/>` + `<path data-part="flesh" fill="none" stroke="var(--hide-tongue)" stroke-width="${5.8 * u}" stroke-linecap="round"/>` + `<g data-part="tip"><circle r="${7.6 * u}" fill="var(--hide-tongue-line)"/><circle r="${6 * u}" fill="var(--hide-tongue)"/><circle cx="${-2 * u}" cy="${-2.2 * u}" r="${1.8 * u}" fill="white" opacity="0.55"/>` + `<g data-part="check" style="opacity:0"><circle r="8" fill="var(--hide-check)"/><path d="M-3.6 0.2 -1 2.8 3.8 -2.6" fill="none" stroke="white" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/></g></g>`; overlay.appendChild(g); f.g = g; // he looks where he aims const r = f.target.getBoundingClientRect(); this.look({ x: r.left + r.width / 2, y: r.top + r.height / 2 }); return true; } tick(now: number) { const dt = Math.min(0.05, (now - this.last) / 1000); this.last = now; let busy = false; const f = this.flicks[0]; if (f) { busy = true; if (!f.g && !this.startFlick(f, now)) { f.onTouch(); this.flicks.shift(); } else if (f.g && f.from && f.to) { const s = f.fast ? 0.72 : 1; const out = 150 * s; const hold = 70 * s; const back = 210 * s; const t = now - f.t0; const ext = t < out ? easeOut(t / out) : t < out + hold ? 1 : 1 - easeIn(clamp((t - out - hold) / back)); if (!f.touched && t >= out) { f.touched = true; f.onTouch(); if (f.kind === "take") (f.g.querySelector('[data-part="check"]') as SVGGElement | null)?.style.setProperty("opacity", "1"); } const tip = { x: f.from.x + (f.to.x - f.from.x) * ext, y: f.from.y + (f.to.y - f.from.y) * ext }; // a little sag while it's moving, straight at full stretch const len = Math.hypot(tip.x - f.from.x, tip.y - f.from.y) || 1; const sag = 7 * (f.u ?? 1) * Math.sin(ext * Math.PI) * (t < out ? 1 : 0.6); const nx = -(tip.y - f.from.y) / len; const ny = (tip.x - f.from.x) / len; const flip = ny < 0 ? -1 : 1; const cx = (f.from.x + tip.x) / 2 + nx * sag * flip; const cy = (f.from.y + tip.y) / 2 + ny * sag * flip; const d = `M${f.from.x} ${f.from.y}Q${cx} ${cy} ${tip.x} ${tip.y}`; f.g.querySelector('[data-part="line"]')?.setAttribute("d", d); f.g.querySelector('[data-part="flesh"]')?.setAttribute("d", d); f.g.querySelector('[data-part="tip"]')?.setAttribute("transform", `translate(${tip.x} ${tip.y})`); f.g.style.opacity = String(clamp(ext * 6)); if (t >= out + hold + back) { f.g.remove(); this.flicks.shift(); // a gulp when he swallows a check he took back if (f.kind === "take") this.hop.v += 70; if (!this.flicks.length) this.lookT = REST; } } } const shutT = now < this.winkUntil ? 1 : this.exposedT; const fast = this.camoT < this.camo.x - 0.25; const settled = [ // the colour change is slow when he blends in, quick when he's caught out step(this.camo, this.camoT, dt, fast ? 260 : 46, fast ? 30 : 13), step(this.alarm, this.alarmT, dt, 120, 18), step(this.shut, shutT, dt, 320, 26), step(this.blush, now < this.winkUntil ? 0.6 : this.exposedT, dt, 90, 16), step(this.lookX, this.lookT.x, dt, 260, 24), step(this.lookY, this.lookT.y, dt, 260, 24), step(this.hop, 0, dt, 300, 13), step(this.small, now < this.smallUntil ? 0.6 : 1, dt, 240, 20), ].every(Boolean); if (!settled || now < this.winkUntil || now < this.smallUntil) busy = true; if (this.blinkAt && now - this.blinkAt < 180) busy = true; else this.blinkAt = 0; this.draw(now); this.raf = busy ? requestAnimationFrame(this.frame) : 0; } draw(now: number) { const P = this.parts; const camo = clamp(this.camo.x); // the front of the colour change, as a % of the body's width, from tail (right) to snout (left) const e = (1 - camo) * (100 + 2 * SOFT) - SOFT; const show = `linear-gradient(100deg, #000 ${(e - SOFT).toFixed(2)}%, transparent ${e.toFixed(2)}%)`; const hide = `linear-gradient(100deg, transparent ${(e - SOFT).toFixed(2)}%, #000 ${e.toFixed(2)}%)`; const band = `linear-gradient(100deg, transparent ${(e - SOFT - 6).toFixed(2)}%, #000 ${(e - SOFT / 2).toFixed(2)}%, transparent ${(e + 4).toFixed(2)}%)`; for (const [name, mask] of [ ["color", show], ["relief", hide], ["shimmer", band], ] as const) { const el = P[name] as HTMLElement | null; if (!el) continue; el.style.setProperty("mask-image", mask); el.style.setProperty("-webkit-mask-image", mask); } const alarm = clamp(this.alarm.x); (P.shimmer as HTMLElement | null)?.style.setProperty("opacity", String(clamp(Math.abs(this.camo.v) * 1.6) * (1 - alarm))); (P.alarm as HTMLElement | null)?.style.setProperty("opacity", String(alarm)); // the hop, squashing toward his feet as he lands const sq = clamp(this.hop.v * 0.00028, -0.05, 0.05); const t = `translate(0px, ${this.hop.x.toFixed(2)}px) scale(${(1 + sq * 0.6).toFixed(4)}, ${(1 - sq).toFixed(4)})`; for (const name of ["color", "shimmer", "alarm", "relief", "eye"]) (P[name] as HTMLElement | null)?.style.setProperty("transform", t); // the eye: a pupil that looks around, blinks, squeezes shut const lx = this.lookX.x; const ly = this.lookY.x; const m = Math.min(1, Math.hypot(lx, ly)); const a = (Math.atan2(ly, lx) * 180) / Math.PI; const px = G.eye.x + lx * TRAVEL; const py = G.eye.y + ly * TRAVEL; const blink = this.blinkAt ? Math.sin(clamp((now - this.blinkAt) / 170) * Math.PI) : 0; const shut = clamp(this.shut.x); const open = Math.max(0.05, 1 - blink) * (1 - shut); const s = this.small.x; P.pupil?.setAttribute("transform", `translate(${px.toFixed(2)} ${py.toFixed(2)}) rotate(${a.toFixed(1)}) scale(${(s * (1 - 0.2 * m)).toFixed(3)} ${s.toFixed(3)}) rotate(${(-a).toFixed(1)}) scale(1 ${open.toFixed(3)})`); P.glint?.setAttribute("transform", `translate(${(px - 4.6 * s).toFixed(2)} ${(py - 5.4 * s).toFixed(2)}) scale(${(s * open).toFixed(3)})`); P.slit?.setAttribute("transform", `translate(${px.toFixed(2)} ${py.toFixed(2)})`); (P.slit as SVGElement | null)?.style.setProperty("opacity", String(clamp(blink * 1.4) * (1 - shut))); (P.shut as SVGElement | null)?.style.setProperty("opacity", String(shut)); (P.blush as SVGElement | null)?.style.setProperty("opacity", String(clamp(this.blush.x) * 0.85)); }}export function Hide({ camo, alarm = false, exposed = false, reduced, overlay, ref, className = "",}: { /** How well he blends in: 0 in full colour, 1 gone but for his eye. */ camo: number; /** Red all over (a breached password). */ alarm?: boolean; /** Eye shut, cheek flushed, colour back (the password is showing). */ exposed?: boolean; reduced: boolean; /** The block-wide <svg> his tongue is drawn in. */ overlay: React.RefObject<SVGSVGElement | null>; ref?: React.Ref<HideHandle>; className?: string;}) { const [engine] = React.useState(() => new HideEngine()); const uid = React.useId().replace(/[^a-z0-9]/gi, ""); React.useLayoutEffect(() => { engine.mount(overlay, reduced, camo, alarm, exposed); return () => engine.destroy(); // mounted once per reduced-motion setting; the rest arrives through set() below // eslint-disable-next-line react-hooks/exhaustive-deps }, [engine, overlay, reduced]); React.useEffect(() => { engine.set(camo, alarm, exposed); }, [engine, camo, alarm, exposed]); React.useImperativeHandle( ref, () => ({ look: (at) => engine.look(at), flick: (target, kind, onTouch) => engine.flick(target, kind, onTouch), startle: () => engine.startle(), wink: () => engine.wink(), }), [engine], ); const layer = "pointer-events-none absolute inset-0 size-full max-w-none select-none"; const origin = { transformOrigin: ORIGIN }; return ( <div aria-hidden="true" className={`relative w-full ${className}`} // his width: 244px, or less on a narrow block; everything else is measured from it style={{ "--hw": "min(244px, 78cqw)", height: "calc(var(--hw) * 0.54 + 44px)" } as React.CSSProperties} > {/* the branch runs the width of the stage and out of it */} {/* eslint-disable-next-line @next/next/no-img-element */} <img src={HIDE_BRANCH} alt="" draggable={false} className="pointer-events-none absolute inset-x-0 w-full max-w-none select-none" style={{ top: `calc(30px + var(--hw) * ${(G.branch.y / G.w).toFixed(4)})`, height: `calc(var(--hw) * ${(G.branch.h / G.w).toFixed(4)})` }} /> <div ref={engine.part("rig")} className="absolute" style={{ left: "calc(50% - var(--hw) / 2 + 10px)", top: 30, width: "var(--hw)", aspectRatio: `${G.w} / ${G.h}` }}> {/* in colour, wiped away from the tail as he blends in */} {/* eslint-disable-next-line @next/next/no-img-element */} <img ref={engine.part("color")} src={HIDE_BODY} alt="" draggable={false} className={layer} style={origin} /> {/* the front of the change, a little brighter as it passes */} {/* eslint-disable-next-line @next/next/no-img-element */} <img ref={engine.part("shimmer")} src={HIDE_BODY} alt="" draggable={false} className={layer} style={{ ...origin, opacity: 0, filter: "brightness(1.28) saturate(1.35)" }} /> {/* what's left once he's blended in: his shading, in the stage's colour */} {/* eslint-disable-next-line @next/next/no-img-element */} <img ref={engine.part("relief")} src={HIDE_BODY} alt="" draggable={false} className={layer} style={{ ...origin, opacity: 0.5, filter: "grayscale(1)", mixBlendMode: "soft-light" }} /> {/* red all over when his cover is blown for good */} {/* eslint-disable-next-line @next/next/no-img-element */} <img ref={engine.part("alarm")} src={HIDE_BODY} alt="" draggable={false} className={layer} style={{ ...origin, opacity: 0, filter: "hue-rotate(-96deg) saturate(1.45) brightness(0.98)" }} /> <svg ref={engine.part("eye")} viewBox={`0 0 ${G.w} ${G.h}`} className={`${layer} overflow-visible`} style={origin}> <defs> <radialGradient id={`${uid}-blush`}> <stop offset="0" stopColor="var(--hide-blush)" stopOpacity="0.9" /> <stop offset="1" stopColor="var(--hide-blush)" stopOpacity="0" /> </radialGradient> </defs> <ellipse ref={engine.part("blush")} cx={G.cheek.x} cy={G.cheek.y} rx="17" ry="9" fill={`url(#${uid}-blush)`} style={{ opacity: 0 }} /> <g ref={engine.part("pupil")}> <ellipse rx={G.pupil.rx} ry={G.pupil.ry} fill="var(--hide-pupil)" /> </g> <circle ref={engine.part("glint")} r="3.6" fill="white" opacity="0.95" /> <path ref={engine.part("slit")} d="M-13 0 Q0 4 13 0" fill="none" stroke="var(--hide-pupil)" strokeWidth="3.2" strokeLinecap="round" style={{ opacity: 0 }} /> {/* squeezed shut: a tight arc with two creases */} <g ref={engine.part("shut")} transform={`translate(${G.eye.x - 4} ${G.eye.y + 2})`} fill="none" stroke="var(--hide-pupil)" strokeWidth="3.4" strokeLinecap="round" style={{ opacity: 0 }}> <path d="M-15 4 Q-2 -9 13 3" /> <path d="M16 -3 L22 -7 M17 4 L24 4" strokeWidth="2.6" /> </g> </svg> </div> </div> );}export default Hide;/* Hide's art: an illustrated chameleon and his branch, as WebP data URIs so one install * brings everything. The pupil is painted out of the body; hide-chameleon.tsx draws it. * Coordinates are in the body image's own pixels (539 ร 291). */export const HIDE_BODY = "data:image/webp;base64,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";export const HIDE_BRANCH = "data:image/webp;base64,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";export const HIDE_GEO = { /** The body image. */ w: 539, h: 291, /** The branch image, placed against the body's top left. */ branch: { x: -63.4, y: 237.3, w: 645, h: 44 }, /** The eye turret's opening and the pupil that sits in it. */ eye: { x: 85.3, y: 112.5, r: 35.3 }, pupil: { rx: 12.2, ry: 14.3 }, /** Where the tongue comes from, the cheek that blushes and the feet (the point he squashes toward). */ mouth: { x: 12.5, y: 151 }, cheek: { x: 124, y: 146 }, feet: { y: 252 },} 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/create-password.json


