{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "dot-globe",
  "type": "registry:ui",
  "title": "Dot Globe",
  "description": "Interactive dotted earth globe (canvas): drag to rotate, wheel to zoom, markers with incident state. Land dots derived from Natural Earth (public domain).",
  "registryDependencies": [
    "utils"
  ],
  "files": [
    {
      "path": "registry/hud/dot-globe.tsx",
      "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\nimport { LAND_DOTS_B64 } from \"@/registry/hud/dot-globe-data\"\n\nexport type GlobeMarker = {\n  /** Short label, e.g. an AWS region code. */\n  code: string\n  lat: number\n  lon: number\n  status?: \"ok\" | \"incident\"\n}\n\nconst PALETTE = {\n  rim: \"#33383C\",\n  sphere: \"#0C0E10\",\n}\n\nfunction hexToRgb(hex: string, fallback: [number, number, number]): [number, number, number] {\n  const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim())\n  if (!m) return fallback\n  const v = parseInt(m[1], 16)\n  return [(v >> 16) & 255, (v >> 8) & 255, v & 255]\n}\n\n// Decode [lat, lon] centidegree pairs into unit vectors (x, y, z).\nlet LAND_VECS: Float32Array | null = null\nfunction landVecs(): Float32Array {\n  if (LAND_VECS) return LAND_VECS\n  const bin = atob(LAND_DOTS_B64)\n  const bytes = new Uint8Array(bin.length)\n  for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n  const pairs = new Int16Array(bytes.buffer)\n  const n = pairs.length / 2\n  const v = new Float32Array(n * 3)\n  for (let i = 0; i < n; i++) {\n    const lat = (pairs[i * 2] / 100) * (Math.PI / 180)\n    const lon = (pairs[i * 2 + 1] / 100) * (Math.PI / 180)\n    v[i * 3] = Math.cos(lat) * Math.cos(lon)\n    v[i * 3 + 1] = Math.sin(lat)\n    v[i * 3 + 2] = Math.cos(lat) * Math.sin(lon)\n  }\n  LAND_VECS = v\n  return v\n}\n\nfunction toVec(lat: number, lon: number): [number, number, number] {\n  const la = lat * (Math.PI / 180)\n  const lo = lon * (Math.PI / 180)\n  return [Math.cos(la) * Math.cos(lo), Math.sin(la), Math.cos(la) * Math.sin(lo)]\n}\n\n// Interactive dotted globe: drag to rotate, wheel to zoom.\n// Decorative by default; pass `markers` to plot real locations.\nfunction DotGlobe({\n  className,\n  size = 340,\n  fill = false,\n  markers = [],\n  autoRotate = true,\n  initialLon = -50,\n  initialLat = 22,\n  edgeGlow = false,\n  dotGlow = false,\n  ...props\n}: React.ComponentProps<\"div\"> & {\n  size?: number\n  /** Fill the parent element and track its size (overrides `size`). */\n  fill?: boolean\n  markers?: GlobeMarker[]\n  autoRotate?: boolean\n  initialLon?: number\n  initialLat?: number\n  /** Soft accent bloom around the globe rim. */\n  edgeGlow?: boolean\n  /** Additive halo behind each land dot. */\n  dotGlow?: boolean\n}) {\n  const wrapRef = React.useRef<HTMLDivElement>(null)\n  const canvasRef = React.useRef<HTMLCanvasElement>(null)\n  const stateRef = React.useRef({\n    yaw: ((initialLon - 90) * Math.PI) / 180,\n    pitch: (initialLat * Math.PI) / 180,\n    zoom: 1,\n    dragging: false,\n    lastX: 0,\n    lastY: 0,\n    lastMoveT: 0,\n    vyaw: 0,\n    vpitch: 0,\n    lastInteraction: 0,\n  })\n\n  React.useEffect(() => {\n    const canvas = canvasRef.current\n    const wrap = wrapRef.current\n    if (!canvas || !wrap) return\n    const ctx = canvas.getContext(\"2d\")\n    if (!ctx) return\n\n    const reduced = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n    const dpr = Math.min(window.devicePixelRatio || 1, 2)\n    // Resolve theme accents so the globe follows accent-color overrides,\n    // re-resolving when the theme changes at runtime (e.g. data-accent toggle).\n    let ar = 255, ag = 122, ab = 41, ir = 229, ig = 72, ib = 77\n    let dr = 138, dg = 144, db = 148\n    let accent = \"\", incidentColor = \"\"\n    const resolveColors = () => {\n      const styles = getComputedStyle(canvas)\n      ;[ar, ag, ab] = hexToRgb(styles.getPropertyValue(\"--primary\"), [255, 122, 41])\n      ;[ir, ig, ib] = hexToRgb(styles.getPropertyValue(\"--destructive\"), [229, 72, 77])\n      ;[dr, dg, db] = hexToRgb(styles.getPropertyValue(\"--globe-dot\"), [138, 144, 148])\n      accent = `rgb(${ar},${ag},${ab})`\n      incidentColor = `rgb(${ir},${ig},${ib})`\n    }\n    resolveColors()\n    const observer = new MutationObserver(resolveColors)\n    observer.observe(document.documentElement, {\n      attributes: true,\n      attributeFilter: [\"data-accent\", \"class\", \"style\"],\n    })\n\n    // Size the backing store to the wrapper (fill) or the fixed size prop.\n    const measure = () => {\n      const cssW = fill ? wrap.clientWidth : size\n      const cssH = fill ? wrap.clientHeight : size\n      const w = Math.round(Math.max(1, cssW) * dpr)\n      const h = Math.round(Math.max(1, cssH) * dpr)\n      if (canvas.width !== w) canvas.width = w\n      if (canvas.height !== h) canvas.height = h\n    }\n    measure()\n    const ro = fill ? new ResizeObserver(measure) : null\n    ro?.observe(wrap)\n\n    const vecs = landVecs()\n    const n = vecs.length / 3\n    const markerVecs = markers.map((m) => ({ ...m, vec: toVec(m.lat, m.lon) }))\n    const st = stateRef.current\n    let raf = 0\n    let prev = performance.now()\n\n    const project = (x: number, y: number, z: number, R: number, cx: number, cy: number) => {\n      const cy1 = Math.cos(st.yaw)\n      const sy1 = Math.sin(st.yaw)\n      const cp = Math.cos(st.pitch)\n      const sp = Math.sin(st.pitch)\n      const x1 = x * cy1 + z * sy1\n      const z1 = -x * sy1 + z * cy1\n      const y2 = y * cp - z1 * sp\n      const z2 = y * sp + z1 * cp\n      // Mirror x so that east runs to the viewer's right (outside view).\n      return [cx - x1 * R, cy - y2 * R, z2] as const\n    }\n\n    const draw = (now: number) => {\n      const dt = Math.min((now - prev) / 1000, 0.1)\n      prev = now\n\n      // inertia after release\n      const coasting = Math.abs(st.vyaw) > 0.002 || Math.abs(st.vpitch) > 0.002\n      if (!st.dragging && coasting) {\n        st.yaw += st.vyaw * dt\n        st.pitch = Math.max(-1.3, Math.min(1.3, st.pitch + st.vpitch * dt))\n        const decay = Math.exp(-dt * 3)\n        st.vyaw *= decay\n        st.vpitch *= decay\n      }\n      if (autoRotate && !reduced && !st.dragging && !coasting && now - st.lastInteraction > 2500) {\n        st.yaw += dt * 0.05\n      }\n\n      const w = canvas.width\n      const h = canvas.height\n      const cx = w / 2\n      const cy = h / 2\n      const R = (Math.min(w, h) / 2 - 8 * dpr) * st.zoom\n      ctx.clearRect(0, 0, w, h)\n\n      // sphere disc + rim\n      ctx.beginPath()\n      ctx.arc(cx, cy, R, 0, Math.PI * 2)\n      ctx.fillStyle = PALETTE.sphere\n      ctx.fill()\n      if (edgeGlow) {\n        // outer bloom\n        ctx.save()\n        ctx.shadowColor = `rgba(${ar},${ag},${ab},0.55)`\n        ctx.shadowBlur = 16 * dpr\n        ctx.beginPath()\n        ctx.arc(cx, cy, R, 0, Math.PI * 2)\n        ctx.lineWidth = 1.5 * dpr\n        ctx.strokeStyle = `rgba(${ar},${ag},${ab},0.5)`\n        ctx.stroke()\n        ctx.restore()\n        // inner atmosphere\n        const atm = ctx.createRadialGradient(cx, cy, R * 0.78, cx, cy, R)\n        atm.addColorStop(0, `rgba(${ar},${ag},${ab},0)`)\n        atm.addColorStop(1, `rgba(${ar},${ag},${ab},0.09)`)\n        ctx.beginPath()\n        ctx.arc(cx, cy, R, 0, Math.PI * 2)\n        ctx.fillStyle = atm\n        ctx.fill()\n      }\n      ctx.lineWidth = 1 * dpr\n      ctx.strokeStyle = PALETTE.rim\n      ctx.beginPath()\n      ctx.arc(cx, cy, R, 0, Math.PI * 2)\n      ctx.stroke()\n\n      // land dots (front hemisphere only, depth-faded squares).\n      // Dot size tracks the radius so density reads the same at any scale.\n      const ds = Math.max(1, (R / (132 * dpr)) * 1.1 * dpr)\n      if (dotGlow) ctx.globalCompositeOperation = \"lighter\"\n      for (let i = 0; i < n; i++) {\n        const [sx, sy, z] = project(vecs[i * 3], vecs[i * 3 + 1], vecs[i * 3 + 2], R, cx, cy)\n        if (z <= 0) continue\n        if (dotGlow) {\n          const hs = ds * 3\n          ctx.fillStyle = `rgba(${dr},${dg},${db},${0.04 + 0.09 * z})`\n          ctx.fillRect(sx - hs / 2, sy - hs / 2, hs, hs)\n        }\n        ctx.fillStyle = `rgba(${dr},${dg},${db},${0.16 + 0.5 * z})`\n        ctx.fillRect(sx - ds / 2, sy - ds / 2, ds, ds)\n      }\n      if (dotGlow) ctx.globalCompositeOperation = \"source-over\"\n\n      // markers\n      for (const m of markerVecs) {\n        const [sx, sy, z] = project(m.vec[0], m.vec[1], m.vec[2], R, cx, cy)\n        if (z <= 0.02) continue\n        const incident = m.status === \"incident\"\n        const color = incident ? incidentColor : accent\n        const s = (incident ? 5 : 4) * dpr\n\n        if (incident) {\n          // expanding pulse ring\n          const t = reduced ? 0.35 : ((now / 1600) % 1)\n          const pr = s + t * 11 * dpr\n          ctx.beginPath()\n          ctx.arc(sx, sy, pr, 0, Math.PI * 2)\n          ctx.strokeStyle = `rgba(${ir},${ig},${ib},${0.55 * (1 - t)})`\n          ctx.lineWidth = 1 * dpr\n          ctx.stroke()\n        }\n\n        ctx.save()\n        ctx.translate(sx, sy)\n        ctx.rotate(Math.PI / 4)\n        ctx.globalAlpha = 0.45 + 0.55 * z\n        ctx.fillStyle = color\n        ctx.fillRect(-s / 2, -s / 2, s, s)\n        ctx.restore()\n        ctx.globalAlpha = 1\n\n        if (incident) {\n          ctx.font = `${10 * dpr}px \"Share Tech Mono\", monospace`\n          ctx.fillStyle = incidentColor\n          const blink = reduced ? 1 : Math.sin(now / 260) > -0.4 ? 1 : 0.35\n          ctx.globalAlpha = blink\n          ctx.fillText(`${m.code.toUpperCase()} — INCIDENT`, sx + 10 * dpr, sy - 8 * dpr)\n          ctx.globalAlpha = 1\n        }\n      }\n\n      raf = requestAnimationFrame(draw)\n    }\n    raf = requestAnimationFrame(draw)\n\n    const onPointerDown = (e: PointerEvent) => {\n      st.dragging = true\n      st.lastX = e.clientX\n      st.lastY = e.clientY\n      st.lastMoveT = performance.now()\n      st.vyaw = 0\n      st.vpitch = 0\n      canvas.setPointerCapture(e.pointerId)\n    }\n    const onPointerMove = (e: PointerEvent) => {\n      if (!st.dragging) return\n      const now = performance.now()\n      const dtm = Math.max((now - st.lastMoveT) / 1000, 0.001)\n      const dx = e.clientX - st.lastX\n      const dy = e.clientY - st.lastY\n      st.lastX = e.clientX\n      st.lastY = e.clientY\n      st.lastMoveT = now\n      const dyaw = -(dx * 0.006) / st.zoom\n      const dpitch = (dy * 0.004) / st.zoom\n      st.yaw += dyaw\n      st.pitch = Math.max(-1.3, Math.min(1.3, st.pitch + dpitch))\n      // blend instantaneous velocity for release inertia\n      const cap = 3\n      st.vyaw = Math.max(-cap, Math.min(cap, 0.75 * (dyaw / dtm) + 0.25 * st.vyaw))\n      st.vpitch = Math.max(-cap, Math.min(cap, 0.75 * (dpitch / dtm) + 0.25 * st.vpitch))\n      st.lastInteraction = now\n    }\n    const onPointerUp = () => {\n      st.dragging = false\n      // if the pointer paused before release, don't fling\n      if (performance.now() - st.lastMoveT > 90 || reduced) {\n        st.vyaw = 0\n        st.vpitch = 0\n      }\n      st.lastInteraction = performance.now()\n    }\n    const onWheel = (e: WheelEvent) => {\n      e.preventDefault()\n      st.zoom = Math.max(0.7, Math.min(2.4, st.zoom * Math.exp(-e.deltaY * 0.0012)))\n      st.lastInteraction = performance.now()\n    }\n\n    canvas.addEventListener(\"pointerdown\", onPointerDown)\n    canvas.addEventListener(\"pointermove\", onPointerMove)\n    canvas.addEventListener(\"pointerup\", onPointerUp)\n    canvas.addEventListener(\"pointercancel\", onPointerUp)\n    canvas.addEventListener(\"wheel\", onWheel, { passive: false })\n\n    return () => {\n      cancelAnimationFrame(raf)\n      observer.disconnect()\n      ro?.disconnect()\n      canvas.removeEventListener(\"pointerdown\", onPointerDown)\n      canvas.removeEventListener(\"pointermove\", onPointerMove)\n      canvas.removeEventListener(\"pointerup\", onPointerUp)\n      canvas.removeEventListener(\"pointercancel\", onPointerUp)\n      canvas.removeEventListener(\"wheel\", onWheel)\n    }\n  }, [size, fill, markers, autoRotate, edgeGlow, dotGlow])\n\n  return (\n    <div\n      ref={wrapRef}\n      aria-hidden\n      className={cn(\"relative select-none\", fill && \"size-full\", className)}\n      style={fill ? undefined : { width: size, height: size }}\n      {...props}\n    >\n      <canvas\n        ref={canvasRef}\n        className={cn(fill && \"absolute inset-0 size-full\")}\n        style={\n          fill\n            ? { touchAction: \"none\", cursor: \"grab\" }\n            : { width: size, height: size, touchAction: \"none\", cursor: \"grab\" }\n        }\n      />\n    </div>\n  )\n}\n\nexport { DotGlobe }\n",
      "type": "registry:ui"
    },
    {
      "path": "registry/hud/dot-globe-data.ts",
      "content": "// Precomputed land-mass dot coordinates (Int16 centidegrees, [lat, lon] pairs),\n// derived from Natural Earth 110m land polygons (public domain).\nexport const LAND_DOTS_B64 =\n  \"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\"\n",
      "type": "registry:ui"
    }
  ]
}