{"version":3,"sources":["../src/hash.ts","../src/svg.ts","../src/supabase.ts","../src/rng.ts","../src/cartoon.ts","../src/react.tsx"],"names":["sha256HexBrowser","s","enc","buf","b","sha256Hex","createHash","avatarKey","name","email","salt","base","initials","parts","first","last","hslFromHex","hex","svgStringSync","hexKey","size","variant","hue","sat","light","bg","fg","text","shape","HOST","publicUrlForKey","k","lookupUrl","qs","res","url","ensureInSupabase","svg","meta","body","blob","makeRng","seed","x","z","seedsFromHex","n","clean","seeds","i","chunk","v","pick","rng","arr","between","a","chance","p","SKIN","HAIR","PALETTES","BROWS","EYES","MOUTHS","NOSES","HAIRSTYLES","ACCESS","cartoonSvg","keyHex","diversity","rngP","rngH","rngHair","rngEyes","rngM","rngN","rngAcc","rngB","rngJ","rngCol","bgCol","accentBase","accent","skin","hair","d","headW","headH","rx","cx","cy","bgLayer","head","hairType","hairPath","browType","browY","browDX","brows","w","sweep","thick","eyeType","eyeY","eyeDX","eyeSize","eyes","L","R","noseType","nose","mouthType","mouthY","mouth","accessory","acc","shadow","AvataarMe","mode","ensure","uri","setUri","T","off","key","dataUri","found","jsx","getAvatarUrl"],"mappings":"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","file":"index.cjs","sourcesContent":["export function sha256HexBrowser(s: string) {\n  const enc = new TextEncoder().encode(s);\n  return crypto.subtle.digest(\"SHA-256\", enc).then(buf =>\n    Array.from(new Uint8Array(buf)).map(b => b.toString(16).padStart(2, \"0\")).join(\"\")\n  );\n}\nexport async function sha256Hex(s: string) {\n  if (typeof window !== \"undefined\" && crypto?.subtle) return sha256HexBrowser(s);\n  const { createHash } = await import(\"crypto\");\n  return createHash(\"sha256\").update(s).digest(\"hex\");\n}\nexport async function avatarKey(name?: string|null, email?: string|null, salt = \"v1\") {\n  const base = (email || name || \"\").trim().toLowerCase();\n  const hex = await sha256Hex(base + \":\" + salt);\n  return hex.slice(0, 32);\n}\n","export type Variant = \"beam\" | \"ring\" | \"grid\";\nexport type SvgOpts = { size?: number; name?: string|null; email?: string|null; variant?: Variant };\n\nfunction initials(name?: string|null, email?: string|null) {\n  const s = (name || email || \"\").trim();\n  if (!s) return \"👤\";\n  const parts = s.split(/\\s+/).filter(Boolean);\n  const first = parts[0]?.[0] ?? s[0];\n  const last = parts.length > 1 ? parts[parts.length-1][0] : \"\";\n  return (first + last).toUpperCase();\n}\nfunction hslFromHex(hex: string) {\n  const n = parseInt(hex.slice(0, 6), 16);\n  return { hue: n % 360, sat: 65, light: 50 };\n}\n\nexport function svgStringSync(hexKey: string, { size = 64, name, email, variant = \"beam\" }: SvgOpts) {\n  const { hue, sat, light } = hslFromHex(hexKey);\n  const bg = `hsl(${hue} ${sat}% ${light}%)`;\n  const fg = `hsl(${(hue+180)%360} 70% 12%)`;\n  const text = initials(name, email);\n  const shape = variant === \"ring\"\n    ? `<circle cx=\"50%\" cy=\"50%\" r=\"48%\" fill=\"none\" stroke=\"rgba(255,255,255,.35)\" stroke-width=\"2\"/>`\n    : variant === \"grid\"\n    ? `<pattern id=\"p\" width=\"8\" height=\"8\" patternUnits=\"userSpaceOnUse\"><path d=\"M 8 0 L 0 0 0 8\" stroke=\"rgba(255,255,255,.2)\" stroke-width=\"1\" fill=\"none\"/></pattern><rect width=\"100%\" height=\"100%\" fill=\"url(#p)\"/>`\n    : `<defs><radialGradient id=\"g\"><stop offset=\"0%\" stop-opacity=\".18\"/><stop offset=\"100%\" stop-opacity=\"0\"/></radialGradient></defs><rect width=\"100%\" height=\"100%\" fill=\"url(#g)\" />`;\n\n  return `\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\" role=\"img\" aria-label=\"${text}\">\n  <rect width=\"100%\" height=\"100%\" rx=\"${Math.floor(size/5)}\" fill=\"${bg}\"/>\n  ${shape}\n  <text x=\"50%\" y=\"52%\" font-family=\"system-ui, -apple-system, Segoe UI, Roboto, sans-serif\"\n        font-size=\"${Math.floor(size*0.45)}\" text-anchor=\"middle\" dominant-baseline=\"middle\"\n        fill=\"${fg}\" font-weight=\"700\">${text}</text>\n</svg>`.trim();\n}\n","// src/supabase.ts\n\n// 👇 This is your deployed proxy (public, no secrets needed)\nconst HOST = \"https://avatars-proxy.vercel.app\";\n\nexport function publicUrlForKey(k: string) {\n  return `${HOST}/${k}.svg`;\n}\n\nexport async function lookupUrl({ email, k }: { email?: string | null; k?: string }) {\n  const qs = new URLSearchParams();\n  if (email) qs.set(\"email\", String(email).trim().toLowerCase());\n  if (k) qs.set(\"k\", k);\n  const res = await fetch(`${HOST}/lookup?${qs.toString()}`);\n  if (!res.ok) return undefined;\n  const { url } = await res.json();\n  return url as string;\n}\n\nexport async function ensureInSupabase(\n  k: string,\n  svg: string,\n  meta?: { name?: string | null; email?: string | null; variant?: string }\n) {\n  const body = JSON.stringify({\n    k,\n    svg,\n    name: meta?.name ?? null,\n    email: meta?.email ?? null,\n    variant: meta?.variant ?? \"cartoon\",\n  });\n\n  // use sendBeacon if browser supports it (fast + fire-and-forget)\n  if (typeof navigator !== \"undefined\" && \"sendBeacon\" in navigator) {\n    const blob = new Blob([body], { type: \"application/json\" });\n    navigator.sendBeacon(`${HOST}/ensure`, blob);\n    return;\n  }\n\n  fetch(`${HOST}/ensure`, {\n    method: \"POST\",\n    headers: { \"content-type\": \"application/json\" },\n    body,\n  }).catch(() => {});\n}\n","// src/rng.ts\n// Utilities to derive multiple independent RNGs from a hex key\n\n// SplitMix32-ish PRNG\nexport function makeRng(seed: number) {\n  let x = seed >>> 0;\n  return () => {\n    x = (x + 0x9e3779b9) >>> 0;\n    let z = x;\n    z ^= z >>> 16;\n    z = Math.imul(z, 0x85ebca6b);\n    z ^= z >>> 13;\n    z = Math.imul(z, 0xc2b2ae35);\n    z ^= z >>> 16;\n    return (z >>> 0) / 0xffffffff;\n  };\n}\n\n// Turn a hex string into N 32-bit seeds (mix chunks + index)\nexport function seedsFromHex(hex: string, n: number): number[] {\n  const clean = hex.replace(/[^a-fA-F0-9]/g, \"\").padEnd(8 * n, \"0\");\n  const seeds: number[] = [];\n  for (let i = 0; i < n; i++) {\n    const chunk = clean.slice(i * 8, i * 8 + 8) || \"00000000\";\n    let v = parseInt(chunk, 16) >>> 0;\n    // mix with index to avoid identical chunks across features\n    v = (v ^ ((i + 1) * 0x9e3779b9)) >>> 0;\n    seeds.push(v);\n  }\n  return seeds;\n}\n\nexport const pick = <T,>(rng: () => number, arr: T[]) => arr[Math.floor(rng() * arr.length)];\nexport const between = (rng: () => number, a: number, b: number) => a + rng() * (b - a);\nexport const chance = (rng: () => number, p: number) => rng() < p;\n","// src/cartoon.ts\nimport { seedsFromHex, makeRng, pick, between, chance } from \"./rng\";\n\nexport type CartoonOpts = {\n  keyHex: string;\n  size?: number;\n  bg?: \"solid\" | \"none\";\n  diversity?: number; // 0..1 nudges more extreme shapes/palettes; default 0.5\n};\n\nconst SKIN = [\"#FBE7DA\",\"#F6D3BC\",\"#E7B990\",\"#C89267\",\"#A1674B\",\"#7D4A34\",\"#5A3625\"];\nconst HAIR = [\"#1F1F1F\",\"#2E2E2E\",\"#3B2F2F\",\"#5B4636\",\"#7B5B3A\",\"#935A2A\",\"#A47B5A\",\"#C0A283\"];\nconst PALETTES = [\n  [\"#FFE6A7\",\"#6B3E2E\"], [\"#BEE3DB\",\"#2A9D8F\"], [\"#F6BD60\",\"#355070\"], [\"#CDB4DB\",\"#5E548E\"],\n  [\"#FDE2E4\",\"#9D4EDD\"], [\"#C6F1D6\",\"#277DA1\"], [\"#FFE5F1\",\"#8A4FFF\"], [\"#E5FFFA\",\"#0E9594\"]\n];\n\nconst BROWS = [\"none\",\"soft\",\"straight\",\"arched\"];\nconst EYES  = [\"dots\",\"oval\",\"smile\",\"wink\",\"sparkle\"];\nconst MOUTHS= [\"line\",\"smile\",\"grin\",\"open\",\"teeth\"];\nconst NOSES = [\"none\",\"dot\",\"tri\",\"line\"];\nconst HAIRSTYLES = [\"short\",\"bangs\",\"fluffy\",\"bald\",\"cap\",\"side\",\"curly\",\"bun\",\"mohawk\",\"wave\"];\nconst ACCESS = [\"none\",\"glasses\",\"round-glasses\",\"earring\",\"stud\",\"mustache\",\"beard\",\"blush\"];\n\nexport function cartoonSvg({ keyHex, size = 64, bg = \"solid\", diversity = 0.5 }: CartoonOpts) {\n  // derive independent RNGs so traits are less correlated\n  const seeds = seedsFromHex(keyHex, 10);\n  const rngP  = makeRng(seeds[0]); // palette\n  const rngH  = makeRng(seeds[1]); // head shape\n  const rngHair = makeRng(seeds[2]);\n  const rngEyes = makeRng(seeds[3]);\n  const rngM   = makeRng(seeds[4]); // mouth\n  const rngN   = makeRng(seeds[5]); // nose\n  const rngAcc = makeRng(seeds[6]);\n  const rngB   = makeRng(seeds[7]); // brows\n  const rngJ   = makeRng(seeds[8]); // jitter\n  const rngCol = makeRng(seeds[9]); // subtle color perturb\n\n  const [bgCol, accentBase] = pick(rngP, PALETTES);\n  const accent = accentBase;\n\n  const skin = pick(rngCol, SKIN);\n  const hair = pick(rngCol, HAIR);\n\n  // head geometry\n  const d = Math.max(0, Math.min(1, diversity));\n  const headW = between(rngH, 44 - 8*d, 54 + 8*d);\n  const headH = between(rngH, 44 - 8*d, 54 + 8*d);\n  const rx    = between(rngH, 12, 20 + 6*d);\n  const cx = 50, cy = 50;\n\n  const bgLayer = bg === \"solid\"\n    ? `<rect width=\"100%\" height=\"100%\" rx=\"${Math.floor(size/5)}\" fill=\"${bgCol}\"/>`\n    : \"\";\n\n  const head = `<rect x=\"${cx - headW/2}%\" y=\"${cy - headH/2}%\" width=\"${headW}%\" height=\"${headH}%\" rx=\"${rx}%\"\n    fill=\"${skin}\" stroke=\"rgba(0,0,0,.06)\" stroke-width=\"1\"/>`;\n\n  // hair\n  const hairType = pick(rngHair, HAIRSTYLES);\n  const hairPath = (() => {\n    switch (hairType) {\n      case \"short\":   return `<path d=\"M ${cx-24},${cy-24} q 24 -18 48 0 v 8 q -24 -10 -48 0 z\" fill=\"${hair}\"/>`;\n      case \"bangs\":   return `<path d=\"M ${cx-24},${cy-28} q 24 -16 48 0 v 10 q -6 -6 -12 0 q -6 -6 -12 0 q -6 -6 -12 0 q -6 -6 -12 0 z\" fill=\"${hair}\"/>`;\n      case \"fluffy\":  return `<path d=\"M ${cx-26},${cy-26} q 8 -10 16 0 q 8 -12 16 0 q 8 -10 16 0 v 10 q -24 -10 -48 0 z\" fill=\"${hair}\"/>`;\n      case \"side\":    return `<path d=\"M ${cx-26},${cy-26} q 30 -14 56 2 v 8 q -16 -8 -30 -6 q -12 2 -26 8 z\" fill=\"${hair}\"/>`;\n      case \"curly\":   return `<path d=\"M ${cx-26},${cy-26} q 6 -6 12 0 q 6 -8 12 0 q 6 -8 12 0 q 6 -8 12 0 v 12 q -24 -10 -48 0 z\" fill=\"${hair}\"/>`;\n      case \"bun\":     return `<circle cx=\"${cx}%\" cy=\"${cy-30}%\" r=\"8%\" fill=\"${hair}\"/>`;\n      case \"mohawk\":  return `<path d=\"M ${cx-4},${cy-30} l 8 0 l 0 24 l -8 0 z\" fill=\"${hair}\"/>`;\n      case \"wave\":    return `<path d=\"M ${cx-26},${cy-26} q 10 -12 20 0 q 10 -12 20 0 q 10 -12 20 0 v 10 q -25 -8 -50 0 z\" fill=\"${hair}\"/>`;\n      case \"cap\":     return `<path d=\"M ${cx-26},${cy-22} q 26 -18 52 0 v 10 h -52 z\" fill=\"${accent}\"/>\n                              <rect x=\"${cx-8}%\" y=\"${cy-24}%\" width=\"16%\" height=\"2%\" fill=\"${accent}\" rx=\"1%\"/>`;\n      default:        return ``; // bald\n    }\n  })();\n\n  // brows\n  const browType = pick(rngB, BROWS);\n  const browY = 30;\n  const browDX = between(rngB, 10, 15);\n  const brows = (() => {\n    if (browType === \"none\") return \"\";\n    const w = browType === \"arched\" ? 8 : 10;\n    const sweep = browType === \"arched\" ? 2 : 0;\n    const thick = browType === \"soft\" ? 1.5 : 2;\n    return `<path d=\"M ${cx-browDX-w} ${browY+sweep} q ${w} ${-2-sweep} ${2*w} 0\" stroke=\"#222\" stroke-width=\"${thick}\" fill=\"none\" stroke-linecap=\"round\"/>\n            <path d=\"M ${cx+browDX-w} ${browY+sweep} q ${w} ${-2-sweep} ${2*w} 0\" stroke=\"#222\" stroke-width=\"${thick}\" fill=\"none\" stroke-linecap=\"round\"/>`;\n  })();\n\n  // eyes\n  const eyeType = pick(rngEyes, EYES);\n  const eyeY = 36;\n  const eyeDX = between(rngEyes, 12, 16);\n  const eyeSize = between(rngEyes, 3.5, 5);\n  const eyes = (() => {\n    const L = cx - eyeDX, R = cx + eyeDX;\n    if (eyeType === \"dots\") {\n      return `<circle cx=\"${L}%\" cy=\"${eyeY}%\" r=\"${eyeSize/2}%\" fill=\"#222\"/>\n              <circle cx=\"${R}%\" cy=\"${eyeY}%\" r=\"${eyeSize/2}%\" fill=\"#222\"/>`;\n    }\n    if (eyeType === \"oval\") {\n      return `<ellipse cx=\"${L}%\" cy=\"${eyeY}%\" rx=\"${eyeSize/1.5}%\" ry=\"${eyeSize/2.2}%\" fill=\"#222\"/>\n              <ellipse cx=\"${R}%\" cy=\"${eyeY}%\" rx=\"${eyeSize/1.5}%\" ry=\"${eyeSize/2.2}%\" fill=\"#222\"/>`;\n    }\n    if (eyeType === \"wink\") {\n      return `<path d=\"M ${L-3} ${eyeY} q 3 2 6 0\" stroke=\"#222\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\"/>\n              <ellipse cx=\"${R}%\" cy=\"${eyeY}%\" rx=\"${eyeSize/1.5}%\" ry=\"${eyeSize/2.2}%\" fill=\"#222\"/>`;\n    }\n    if (eyeType === \"sparkle\") {\n      return `<circle cx=\"${L}%\" cy=\"${eyeY}%\" r=\"${eyeSize/2}%\" fill=\"#222\"/>\n              <circle cx=\"${R}%\" cy=\"${eyeY}%\" r=\"${eyeSize/2}%\" fill=\"#222\"/>\n              <circle cx=\"${L-1}%\" cy=\"${eyeY-1}%\" r=\"0.7%\" fill=\"white\" />\n              <circle cx=\"${R-1}%\" cy=\"${eyeY-1}%\" r=\"0.7%\" fill=\"white\" />`;\n    }\n    // smile eyes\n    return `<path d=\"M ${cx-eyeDX-2} ${eyeY} q 2 2 4 0\" stroke=\"#222\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\"/>\n            <path d=\"M ${cx+eyeDX-2} ${eyeY} q 2 2 4 0\" stroke=\"#222\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\"/>`;\n  })();\n\n  // nose\n  const noseType = pick(rngN, NOSES);\n  const nose = (() => {\n    if (noseType === \"none\") return \"\";\n    if (noseType === \"dot\")  return `<circle cx=\"${cx}%\" cy=\"48%\" r=\"0.9%\" fill=\"#222\"/>`;\n    if (noseType === \"tri\")  return `<path d=\"M ${cx-1.5} 47 L ${cx+1.5} 47 L ${cx} 50 Z\" fill=\"#222\"/>`;\n    return `<line x1=\"${cx}%\" y1=\"47%\" x2=\"${cx}%\" y2=\"50%\" stroke=\"#222\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>`;\n  })();\n\n  // mouth\n  const mouthType = pick(rngM, MOUTHS);\n  const mouthY = 60;\n  const mouth = (() => {\n    if (mouthType === \"line\")   return `<line x1=\"${cx-7}%\" y1=\"${mouthY}%\" x2=\"${cx+7}%\" y2=\"${mouthY}%\" stroke=\"#222\" stroke-width=\"2\" stroke-linecap=\"round\"/>`;\n    if (mouthType === \"open\")   return `<ellipse cx=\"${cx}%\" cy=\"${mouthY+1}%\" rx=\"5%\" ry=\"3%\" fill=\"#222\"/>`;\n    if (mouthType === \"teeth\")  return `<path d=\"M ${cx-8} ${mouthY} q 8 8 16 0\" stroke=\"#222\" stroke-width=\"2.5\" fill=\"white\"/>`;\n    if (mouthType === \"grin\")   return `<path d=\"M ${cx-10} ${mouthY} q 10 10 20 0\" stroke=\"#222\" stroke-width=\"2.5\" fill=\"none\" stroke-linecap=\"round\"/>`;\n    // smile\n    return `<path d=\"M ${cx-8} ${mouthY} q 8 8 16 0\" stroke=\"#222\" stroke-width=\"2.5\" fill=\"none\" stroke-linecap=\"round\"/>`;\n  })();\n\n  // accessories\n  const accessory = pick(rngAcc, ACCESS);\n  const acc = (() => {\n    if (accessory === \"glasses\") {\n      return `<g fill=\"none\" stroke=\"#222\" stroke-width=\"2\">\n        <rect x=\"${cx-18}%\" y=\"32%\" width=\"12%\" height=\"8%\" rx=\"2%\"/>\n        <rect x=\"${cx+6}%\"  y=\"32%\" width=\"12%\" height=\"8%\" rx=\"2%\"/>\n        <line x1=\"${cx-6}%\" y1=\"36%\" x2=\"${cx+6}%\" y2=\"36%\"/>\n      </g>`;\n    }\n    if (accessory === \"round-glasses\") {\n      return `<g fill=\"none\" stroke=\"${accent}\" stroke-width=\"2\">\n        <circle cx=\"${cx-14}%\" cy=\"36%\" r=\"6%\"/>\n        <circle cx=\"${cx+14}%\" cy=\"36%\" r=\"6%\"/>\n        <line x1=\"${cx-8}%\" y1=\"36%\" x2=\"${cx+8}%\" y2=\"36%\"/>\n      </g>`;\n    }\n    if (accessory === \"earring\") {\n      return `<circle cx=\"${cx+headW/2-2}%\" cy=\"${cy+6}%\" r=\"1.6%\" fill=\"${accent}\"/>`;\n    }\n    if (accessory === \"stud\") {\n      return `<circle cx=\"${cx+headW/2-2}%\" cy=\"${cy+6}%\" r=\"1%\" fill=\"#222\"/>`;\n    }\n    if (accessory === \"mustache\") {\n      return `<path d=\"M ${cx-10} ${mouthY-2} q 6 4 10 0 q 4 4 10 0\" stroke=\"#222\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\"/>`;\n    }\n    if (accessory === \"beard\") {\n      return `<path d=\"M ${cx-18} ${mouthY-4} q 18 20 36 0 v 6 q -18 12 -36 0 z\" fill=\"#222\" opacity=\"0.5\"/>`;\n    }\n    if (accessory === \"blush\") {\n      return `<circle cx=\"${cx-14}%\" cy=\"44%\" r=\"3%\" fill=\"rgba(255,80,80,.25)\"/>\n              <circle cx=\"${cx+14}%\" cy=\"44%\" r=\"3%\" fill=\"rgba(255,80,80,.25)\"/>`;\n    }\n    return ``;\n  })();\n\n  // tiny jitter shadow to add variation\n  const shadow = chance(rngJ, 0.6)\n    ? `<ellipse cx=\"${cx + between(rngJ, -1, 1)}%\" cy=\"${cy + between(rngJ, 10, 12)}%\" rx=\"${between(rngJ, 16, 20)}%\" ry=\"3%\" fill=\"rgba(0,0,0,.06)\"/>`\n    : \"\";\n\n  return `\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 100 100\" role=\"img\" aria-label=\"avatar\">\n  ${bgLayer}\n  ${shadow}\n  <g>\n    ${head}\n    ${hairPath}\n    ${brows}\n    ${eyes}\n    ${nose}\n    ${mouth}\n    ${acc}\n  </g>\n</svg>`.trim();\n}\n","// src/react.tsx\nimport * as React from \"react\";\nimport { avatarKey } from \"./hash\";\nimport { svgStringSync as initialsSvg } from \"./svg\";\nimport { cartoonSvg } from \"./cartoon\";\nimport { ensureInSupabase, lookupUrl, publicUrlForKey } from \"./supabase\";\n\nexport type AvataarMode = \"initials\" | \"cartoon\";\n\nexport type AvataarMeProps = {\n  name?: string | null;\n  email?: string | null;\n  size?: number;\n  mode?: AvataarMode;\n  ensure?: boolean;\n  bg?: \"solid\" | \"none\";\n  variant?: \"beam\" | \"ring\" | \"grid\";\n};\n\nexport function AvataarMe({\n  name,\n  email,\n  size = 48,\n  mode = \"cartoon\",\n  ensure = true,\n  bg = \"solid\",\n  variant = \"beam\",\n}: AvataarMeProps) {\n  // undefined = don't render <img> yet (avoids src=\"\")\n  const [uri, setUri] = React.useState<string | undefined>(undefined);\n\n  React.useEffect(() => {\n    let off = false;\n\n    (async () => {\n      const key = await avatarKey(name, email);\n\n      // 1) render inline SVG immediately (no network)\n      const svg =\n        mode === \"initials\"\n          ? initialsSvg(key, { size, name, email, variant })\n          : cartoonSvg({ keyHex: key, size, bg });\n\n      const dataUri = \"data:image/svg+xml;utf8,\" + encodeURIComponent(svg);\n      if (!off) setUri(dataUri);\n\n      // 2) kick off lookup in parallel; if found, swap to CDN URL\n      lookupUrl({ email: email ?? undefined, k: key })\n        .then((found) => {\n          if (!off && found) setUri(found);\n        })\n        .catch(() => {\n          /* ignore */\n        });\n\n      // 3) persist in background (upload + upsert row)\n      if (ensure) {\n        ensureInSupabase(key, svg, { name, email, variant: mode }).catch(() => {});\n      }\n    })();\n\n    return () => {\n      off = true;\n    };\n  }, [name, email, size, mode, ensure, bg, variant]);\n\n  // Don’t render <img> until we have a real src\n  if (!uri) return null;\n\n  return (\n    <img\n      src={uri}\n      width={size}\n      height={size}\n      alt=\"\"\n      decoding=\"async\"\n      loading=\"eager\"\n      style={{ display: \"block\" }}\n    />\n  );\n}\n\n/** Optional helper for precomputing a CDN url for <AvatarImage src> */\nexport async function getAvatarUrl({\n  name,\n  email,\n}: {\n  name?: string | null;\n  email?: string | null;\n}) {\n  const key = await avatarKey(name, email);\n  try {\n    const found = await lookupUrl({ email: email ?? undefined, k: key });\n    if (found) return found;\n  } catch {}\n  return publicUrlForKey(key);\n}\n"]}