{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "kura-ui",
  "homepage": "https://kuro.abstergo.fyi",
  "items": [
    {
      "name": "kura-theme",
      "type": "registry:theme",
      "title": "Kura Theme",
      "description": "Kura design tokens: warm neutral OKLCH scale, jade signal accent, hairline shadows, radii, motion easings and keyframes (light + dark).",
      "cssVars": {
        "theme": {
          "font-kura-sans": "var(--font-geist-sans, \"Geist\"), \"Geist Variable\", \"Inter\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif",
          "font-kura-mono": "var(--font-geist-mono, \"Geist Mono\"), \"Geist Mono Variable\", ui-monospace, \"SF Mono\", \"JetBrains Mono\", Menlo, monospace",
          "radius-kura-xs": "4px",
          "radius-kura-sm": "6px",
          "radius-kura-md": "8px",
          "radius-kura-lg": "12px",
          "radius-kura-xl": "16px",
          "radius-kura-2xl": "20px",
          "ease-kura-out": "cubic-bezier(0.23, 1, 0.32, 1)",
          "ease-kura-in-out": "cubic-bezier(0.77, 0, 0.175, 1)",
          "ease-kura-in": "cubic-bezier(0.55, 0, 1, 0.45)",
          "ease-kura-spring": "linear( 0, 0.0409, 0.137, 0.2584, 0.3854, 0.5063, 0.6145, 0.707, 0.7835, 0.8447, 0.8923, 0.9284, 0.955, 0.974, 0.9872, 0.9959, 1.0013, 1.0044, 1.0059, 1.0063, 1.0061, 1.0055, 1.0047, 1.0039, 1.0032, 1.0025, 1.0019, 1.0014, 1.001, 1.0007, 1.0005, 1.0003, 1.0002 )",
          "animate-kura-pop-in": "kura-pop-in var(--kura-duration-fast) var(--ease-kura-out) both",
          "animate-kura-pop-out": "kura-pop-out var(--kura-duration-instant) var(--ease-kura-in) both",
          "animate-kura-fade-in": "kura-fade-in var(--kura-duration-base) var(--ease-kura-out) both",
          "animate-kura-fade-out": "kura-fade-out var(--kura-duration-fast) var(--ease-kura-in) both",
          "animate-kura-rise-in": "kura-rise-in var(--kura-duration-slow) var(--ease-kura-out) both",
          "animate-kura-spin": "kura-spin 0.8s linear infinite",
          "animate-kura-shimmer": "kura-shimmer var(--kura-shimmer-duration, 2s) linear infinite",
          "animate-kura-pulse": "kura-pulse 1.6s var(--ease-kura-in-out) infinite",
          "color-kura-canvas": "var(--kura-canvas)",
          "color-kura-surface": "var(--kura-surface)",
          "color-kura-surface-raised": "var(--kura-surface-raised)",
          "color-kura-surface-sunken": "var(--kura-surface-sunken)",
          "color-kura-overlay": "var(--kura-overlay)",
          "color-kura-hover": "var(--kura-hover)",
          "color-kura-active": "var(--kura-active)",
          "color-kura-fg": "var(--kura-fg)",
          "color-kura-fg-muted": "var(--kura-fg-muted)",
          "color-kura-fg-subtle": "var(--kura-fg-subtle)",
          "color-kura-fg-inverted": "var(--kura-fg-inverted)",
          "color-kura-border": "var(--kura-border)",
          "color-kura-border-subtle": "var(--kura-border-subtle)",
          "color-kura-border-strong": "var(--kura-border-strong)",
          "color-kura-ink": "var(--kura-ink)",
          "color-kura-ink-hover": "var(--kura-ink-hover)",
          "color-kura-accent": "var(--kura-accent)",
          "color-kura-accent-hover": "var(--kura-accent-hover)",
          "color-kura-accent-fg": "var(--kura-accent-fg)",
          "color-kura-accent-subtle": "var(--kura-accent-subtle)",
          "color-kura-accent-text": "var(--kura-accent-text)",
          "color-kura-danger": "var(--kura-danger)",
          "color-kura-danger-subtle": "var(--kura-danger-subtle)",
          "color-kura-danger-text": "var(--kura-danger-text)",
          "color-kura-success": "var(--kura-success)",
          "color-kura-success-text": "var(--kura-success-text)",
          "color-kura-warning": "var(--kura-warning)",
          "color-kura-warning-text": "var(--kura-warning-text)",
          "color-kura-ring": "var(--kura-ring)",
          "color-kura-gray-1": "var(--kura-gray-1)",
          "color-kura-gray-2": "var(--kura-gray-2)",
          "color-kura-gray-3": "var(--kura-gray-3)",
          "color-kura-gray-4": "var(--kura-gray-4)",
          "color-kura-gray-5": "var(--kura-gray-5)",
          "color-kura-gray-6": "var(--kura-gray-6)",
          "color-kura-gray-7": "var(--kura-gray-7)",
          "color-kura-gray-8": "var(--kura-gray-8)",
          "color-kura-gray-9": "var(--kura-gray-9)",
          "color-kura-gray-10": "var(--kura-gray-10)",
          "color-kura-gray-11": "var(--kura-gray-11)",
          "color-kura-gray-12": "var(--kura-gray-12)",
          "shadow-kura-xs": "var(--kura-shadow-xs)",
          "shadow-kura-sm": "var(--kura-shadow-sm)",
          "shadow-kura-md": "var(--kura-shadow-md)",
          "shadow-kura-lg": "var(--kura-shadow-lg)",
          "shadow-kura-focus": "var(--kura-shadow-focus)"
        },
        "light": {
          "kura-gray-1": "oklch(0.993 0.002 85)",
          "kura-gray-2": "oklch(0.982 0.003 85)",
          "kura-gray-3": "oklch(0.962 0.004 85)",
          "kura-gray-4": "oklch(0.942 0.005 85)",
          "kura-gray-5": "oklch(0.92 0.005 85)",
          "kura-gray-6": "oklch(0.895 0.006 85)",
          "kura-gray-7": "oklch(0.86 0.006 85)",
          "kura-gray-8": "oklch(0.8 0.007 85)",
          "kura-gray-9": "oklch(0.64 0.008 85)",
          "kura-gray-10": "oklch(0.58 0.008 85)",
          "kura-gray-11": "oklch(0.47 0.008 85)",
          "kura-gray-12": "oklch(0.205 0.006 85)",
          "kura-canvas": "var(--kura-gray-1)",
          "kura-surface": "oklch(1 0 0)",
          "kura-surface-raised": "oklch(1 0 0)",
          "kura-surface-sunken": "var(--kura-gray-2)",
          "kura-overlay": "oklch(1 0 0 / 0.92)",
          "kura-hover": "oklch(0.205 0.006 85 / 0.05)",
          "kura-active": "oklch(0.205 0.006 85 / 0.09)",
          "kura-fg": "var(--kura-gray-12)",
          "kura-fg-muted": "var(--kura-gray-11)",
          "kura-fg-subtle": "var(--kura-gray-10)",
          "kura-fg-inverted": "var(--kura-gray-1)",
          "kura-border": "oklch(0.205 0.006 85 / 0.12)",
          "kura-border-subtle": "oklch(0.205 0.006 85 / 0.07)",
          "kura-border-strong": "oklch(0.205 0.006 85 / 0.2)",
          "kura-ink": "var(--kura-gray-12)",
          "kura-ink-hover": "oklch(0.3 0.006 85)",
          "kura-accent": "oklch(0.55 0.115 172)",
          "kura-accent-hover": "oklch(0.5 0.11 172)",
          "kura-accent-fg": "oklch(0.99 0.01 172)",
          "kura-accent-subtle": "oklch(0.955 0.03 172)",
          "kura-accent-text": "oklch(0.47 0.1 172)",
          "kura-danger": "oklch(0.58 0.2 25)",
          "kura-danger-subtle": "oklch(0.96 0.025 25)",
          "kura-danger-text": "oklch(0.5 0.18 25)",
          "kura-success": "oklch(0.62 0.15 150)",
          "kura-success-text": "oklch(0.47 0.12 150)",
          "kura-warning": "oklch(0.78 0.15 75)",
          "kura-warning-text": "oklch(0.52 0.12 65)",
          "kura-ring": "oklch(0.55 0.115 172 / 0.55)",
          "kura-shadow-xs": "0 0 0 1px var(--kura-border-subtle), 0 1px 1px 0 oklch(0 0 0 / 0.03)",
          "kura-shadow-sm": "0 0 0 1px var(--kura-border), 0 1px 2px -1px oklch(0 0 0 / 0.08), 0 2px 4px -2px oklch(0 0 0 / 0.04)",
          "kura-shadow-md": "0 0 0 1px var(--kura-border), 0 2px 4px -2px oklch(0 0 0 / 0.06), 0 8px 16px -6px oklch(0 0 0 / 0.08)",
          "kura-shadow-lg": "0 0 0 1px var(--kura-border), 0 4px 8px -4px oklch(0 0 0 / 0.06), 0 16px 32px -12px oklch(0 0 0 / 0.14), 0 32px 64px -24px oklch(0 0 0 / 0.1)",
          "kura-shadow-focus": "0 0 0 1px var(--kura-canvas), 0 0 0 3px var(--kura-ring)",
          "kura-duration-instant": "90ms",
          "kura-duration-fast": "150ms",
          "kura-duration-base": "220ms",
          "kura-duration-slow": "320ms",
          "kura-duration-slower": "480ms",
          "kura-pop-scale": "0.96",
          "kura-pop-y": "2px",
          "kura-rise-y": "6px",
          "kura-rise-blur": "2px"
        },
        "dark": {
          "kura-gray-1": "oklch(0.155 0.004 85)",
          "kura-gray-2": "oklch(0.185 0.004 85)",
          "kura-gray-3": "oklch(0.215 0.005 85)",
          "kura-gray-4": "oklch(0.24 0.005 85)",
          "kura-gray-5": "oklch(0.265 0.006 85)",
          "kura-gray-6": "oklch(0.295 0.006 85)",
          "kura-gray-7": "oklch(0.345 0.007 85)",
          "kura-gray-8": "oklch(0.42 0.008 85)",
          "kura-gray-9": "oklch(0.56 0.008 85)",
          "kura-gray-10": "oklch(0.64 0.008 85)",
          "kura-gray-11": "oklch(0.76 0.007 85)",
          "kura-gray-12": "oklch(0.955 0.004 85)",
          "kura-canvas": "var(--kura-gray-1)",
          "kura-surface": "var(--kura-gray-2)",
          "kura-surface-raised": "var(--kura-gray-3)",
          "kura-surface-sunken": "oklch(0.135 0.004 85)",
          "kura-overlay": "oklch(0.21 0.005 85 / 0.92)",
          "kura-hover": "oklch(0.955 0.004 85 / 0.06)",
          "kura-active": "oklch(0.955 0.004 85 / 0.1)",
          "kura-fg": "var(--kura-gray-12)",
          "kura-fg-muted": "var(--kura-gray-11)",
          "kura-fg-subtle": "var(--kura-gray-10)",
          "kura-fg-inverted": "var(--kura-gray-1)",
          "kura-border": "oklch(0.955 0.004 85 / 0.12)",
          "kura-border-subtle": "oklch(0.955 0.004 85 / 0.07)",
          "kura-border-strong": "oklch(0.955 0.004 85 / 0.2)",
          "kura-ink": "var(--kura-gray-12)",
          "kura-ink-hover": "oklch(0.88 0.004 85)",
          "kura-accent": "oklch(0.78 0.13 170)",
          "kura-accent-hover": "oklch(0.83 0.12 170)",
          "kura-accent-fg": "oklch(0.2 0.04 172)",
          "kura-accent-subtle": "oklch(0.27 0.045 172)",
          "kura-accent-text": "oklch(0.82 0.12 170)",
          "kura-danger": "oklch(0.66 0.19 25)",
          "kura-danger-subtle": "oklch(0.27 0.06 25)",
          "kura-danger-text": "oklch(0.74 0.16 25)",
          "kura-success": "oklch(0.72 0.15 150)",
          "kura-success-text": "oklch(0.78 0.14 150)",
          "kura-warning": "oklch(0.82 0.14 80)",
          "kura-warning-text": "oklch(0.84 0.13 80)",
          "kura-ring": "oklch(0.78 0.13 170 / 0.6)",
          "kura-shadow-xs": "0 0 0 1px var(--kura-border-subtle), inset 0 1px 0 0 oklch(1 0 0 / 0.03)",
          "kura-shadow-sm": "0 0 0 1px var(--kura-border), inset 0 1px 0 0 oklch(1 0 0 / 0.04), 0 1px 2px 0 oklch(0 0 0 / 0.4)",
          "kura-shadow-md": "0 0 0 1px var(--kura-border), inset 0 1px 0 0 oklch(1 0 0 / 0.05), 0 8px 16px -6px oklch(0 0 0 / 0.5)",
          "kura-shadow-lg": "0 0 0 1px var(--kura-border), inset 0 1px 0 0 oklch(1 0 0 / 0.06), 0 16px 32px -12px oklch(0 0 0 / 0.6), 0 32px 64px -24px oklch(0 0 0 / 0.5)"
        }
      },
      "css": {
        "@keyframes kura-pop-in": {
          "from": {
            "opacity": "0",
            "transform": "translateY(var(--kura-pop-y)) scale(var(--kura-pop-scale))"
          }
        },
        "@keyframes kura-pop-out": {
          "to": {
            "opacity": "0",
            "transform": "translateY(var(--kura-pop-y)) scale(var(--kura-pop-scale))"
          }
        },
        "@keyframes kura-fade-in": {
          "from": {
            "opacity": "0"
          }
        },
        "@keyframes kura-fade-out": {
          "to": {
            "opacity": "0"
          }
        },
        "@keyframes kura-rise-in": {
          "from": {
            "opacity": "0",
            "transform": "translateY(var(--kura-rise-y))",
            "filter": "blur(var(--kura-rise-blur))"
          }
        },
        "@keyframes kura-spin": {
          "to": {
            "transform": "rotate(360deg)"
          }
        },
        "@keyframes kura-shimmer": {
          "from": {
            "background-position": "100% 0"
          },
          "to": {
            "background-position": "0% 0"
          }
        },
        "@keyframes kura-pulse": {
          "50%": {
            "opacity": "0.45"
          }
        },
        "@media (prefers-reduced-motion: reduce)": {
          ":root": {
            "--kura-pop-scale": "1",
            "--kura-pop-y": "0px",
            "--kura-rise-y": "0px",
            "--kura-rise-blur": "0px"
          }
        }
      }
    },
    {
      "name": "kura-keys",
      "type": "registry:lib",
      "title": "Kura keys",
      "description": "Kura shared library module lib/keys.",
      "dependencies": [],
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/kura/lib/keys.ts",
          "type": "registry:lib",
          "target": "lib/kura/keys.ts"
        }
      ]
    },
    {
      "name": "kura-merge-refs",
      "type": "registry:lib",
      "title": "Kura merge-refs",
      "description": "Kura shared library module lib/merge-refs.",
      "dependencies": [],
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/kura/lib/merge-refs.ts",
          "type": "registry:lib",
          "target": "lib/kura/merge-refs.ts"
        }
      ]
    },
    {
      "name": "kura-motion",
      "type": "registry:lib",
      "title": "Kura motion",
      "description": "Kura shared library module lib/motion.",
      "dependencies": [],
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/kura/lib/motion.ts",
          "type": "registry:lib",
          "target": "lib/kura/motion.ts"
        }
      ]
    },
    {
      "name": "kura-shader-color",
      "type": "registry:lib",
      "title": "Kura shader-color",
      "description": "Kura shared library module lib/shader-color.",
      "dependencies": [],
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/kura/lib/shader-color.ts",
          "type": "registry:lib",
          "target": "lib/kura/shader-color.ts"
        }
      ]
    },
    {
      "name": "use-audio-analyser",
      "type": "registry:hook",
      "title": "useAudioAnalyser, useAudioFrame",
      "description": "Web Audio analysis of a mic MediaStream or <audio>/<video> element → level, log-spaced bands and waveform, with a deterministic simulated mode (speech | music | silence) for demos and tests. SSR-safe. Throttled React-state snapshot of a useAudioAnalyser for simple DOM visualisations.",
      "dependencies": [],
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/kura/hooks/use-audio-analyser.ts",
          "type": "registry:hook",
          "target": "hooks/kura/use-audio-analyser.ts"
        }
      ]
    },
    {
      "name": "use-controllable-state",
      "type": "registry:hook",
      "title": "useControllableState",
      "description": "One state API for components that support controlled (value/onChange) and uncontrolled (defaultValue) usage.",
      "dependencies": [],
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/kura/hooks/use-controllable-state.ts",
          "type": "registry:hook",
          "target": "hooks/kura/use-controllable-state.ts"
        }
      ]
    },
    {
      "name": "use-hotkey",
      "type": "registry:hook",
      "title": "useHotkey",
      "description": "Bind a keyboard shortcut on document (or a target). `mod` = ⌘ on Apple, Ctrl elsewhere. Exact modifier matching.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-keys.json"
      ],
      "files": [
        {
          "path": "registry/kura/hooks/use-hotkey.ts",
          "type": "registry:hook",
          "target": "hooks/kura/use-hotkey.ts"
        }
      ]
    },
    {
      "name": "use-media-recorder",
      "type": "registry:hook",
      "title": "useMediaRecorder",
      "description": "MediaRecorder wrapper with explicit permission/denied/unsupported states, pause/resume, duration and a final Blob.",
      "dependencies": [],
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/kura/hooks/use-media-recorder.ts",
          "type": "registry:hook",
          "target": "hooks/kura/use-media-recorder.ts"
        }
      ]
    },
    {
      "name": "use-platform",
      "type": "registry:hook",
      "title": "useIsApplePlatform",
      "description": "Hydration-safe macOS/iOS detection for rendering ⌘ vs Ctrl.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-keys.json"
      ],
      "files": [
        {
          "path": "registry/kura/hooks/use-platform.ts",
          "type": "registry:hook",
          "target": "hooks/kura/use-platform.ts"
        }
      ]
    },
    {
      "name": "use-reduced-motion",
      "type": "registry:hook",
      "title": "useReducedMotion",
      "description": "Live, SSR-safe prefers-reduced-motion flag (false on the server).",
      "dependencies": [],
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/kura/hooks/use-reduced-motion.ts",
          "type": "registry:hook",
          "target": "hooks/kura/use-reduced-motion.ts"
        }
      ]
    },
    {
      "name": "use-speech-recognition",
      "type": "registry:hook",
      "title": "useSpeechRecognition",
      "description": "Web Speech API speech-to-text with interim results; reports unsupported (e.g. Firefox) so you can fall back to recording + server transcription.",
      "dependencies": [],
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/kura/hooks/use-speech-recognition.ts",
          "type": "registry:hook",
          "target": "hooks/kura/use-speech-recognition.ts"
        }
      ]
    },
    {
      "name": "agent-orb",
      "type": "registry:ui",
      "title": "Agent Orb",
      "description": "Glassy liquid sphere for voice agents, drawn in a shader: breathes when idle, reacts to mic and voice levels, swirls while thinking.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kura-merge-refs.json",
        "https://kuro.abstergo.fyi/r/kura-shader-color.json",
        "https://kuro.abstergo.fyi/r/shader-canvas.json",
        "https://kuro.abstergo.fyi/r/use-audio-analyser.json",
        "https://kuro.abstergo.fyi/r/use-reduced-motion.json",
        "utils"
      ],
      "categories": [
        "voice",
        "voice",
        "orb",
        "agent",
        "audio"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/agent-orb · Markdown for agents: https://kuro.abstergo.fyi/components/agent-orb.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "The central visual of a voice agent or call screen: idle, listening, thinking, speaking, error.",
            "Showing that an assistant is hearing the user (mic level) or talking back (TTS level).",
            "A 'talk to the agent' entry point inside a button or a card.",
            "An ambient, branded presence for an AI assistant in an empty state."
          ],
          "whenNotToUse": [
            "Precise audio feedback such as a recording meter or waveform — use audio-waveform or voice-dictation.",
            "Text chat 'thinking' feedback inside a message list — use thinking-indicator or shimmer-text.",
            "A full-bleed background — use mesh-gradient or aurora.",
            "More than one per view: the orb is the accent element; repeat it and it stops meaning anything."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/agent-orb/agent-orb.glsl.ts",
          "type": "registry:ui",
          "target": "components/kura/agent-orb/agent-orb.glsl.ts"
        },
        {
          "path": "registry/kura/agent-orb/agent-orb.tsx",
          "type": "registry:ui",
          "target": "components/kura/agent-orb/agent-orb.tsx"
        },
        {
          "path": "registry/kura/agent-orb/index.ts",
          "type": "registry:ui",
          "target": "components/kura/agent-orb/index.ts"
        }
      ]
    },
    {
      "name": "agent-timeline",
      "type": "registry:ui",
      "title": "Agent Timeline",
      "description": "Vertical plan tracker for multi-step agents: queued/active/done/failed/skipped steps, nested sub-steps, live durations and a connector that fills.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/shimmer-text.json",
        "utils"
      ],
      "categories": [
        "agent",
        "agent",
        "plan",
        "timeline",
        "steps"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/agent-timeline · Markdown for agents: https://kuro.abstergo.fyi/components/agent-timeline.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Show an agent's plan and its progress (coding agents, research agents, deploy pipelines driven by a model).",
            "Show a todo list the model maintains (Claude Code / Cursor style task lists) with the current step highlighted.",
            "Nest sub-steps under a step, or attach a ToolCall / CodeBlock to a step via `content`."
          ],
          "whenNotToUse": [
            "A single tool invocation — use tool-call.",
            "Free-form model thinking — use reasoning.",
            "Generic (non-agent) wizards or checkout steppers — use a regular stepper; the active state here uses the AI signal colour."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/agent-timeline/agent-timeline.tsx",
          "type": "registry:ui",
          "target": "components/kura/agent-timeline/agent-timeline.tsx"
        },
        {
          "path": "registry/kura/agent-timeline/index.ts",
          "type": "registry:ui",
          "target": "components/kura/agent-timeline/index.ts"
        }
      ]
    },
    {
      "name": "approval-prompt",
      "type": "registry:ui",
      "title": "Approval Prompt",
      "description": "Human-in-the-loop permission card (“Kura wants to run `rm -rf build`”) with risk level, details, Approve/Deny/Always allow, ⌘↵ and Esc, and resolved states.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/button.json",
        "https://kuro.abstergo.fyi/r/kbd.json",
        "https://kuro.abstergo.fyi/r/use-controllable-state.json",
        "https://kuro.abstergo.fyi/r/use-hotkey.json",
        "utils"
      ],
      "categories": [
        "agent",
        "approval",
        "permission",
        "human-in-the-loop",
        "confirm"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/approval-prompt · Markdown for agents: https://kuro.abstergo.fyi/components/approval-prompt.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "An agent needs explicit permission before a side effect: running a shell command, editing files, sending email, spending money, calling a destructive API.",
            "Show exactly what will run (verbatim command) and how risky it is before the user decides.",
            "Offer “Always allow” for a class of actions in this session (persist the rule yourself in onAlwaysAllow).",
            "Keep the decision visible in the transcript afterwards (Approved / Denied / Always allowed) without the card changing height."
          ],
          "whenNotToUse": [
            "Showing a tool call that does not need permission — use tool-call (it also has an awaiting-approval status for compact inline approvals).",
            "Generic confirm dialogs unrelated to an agent (deleting a document) — use a dialog.",
            "Progress of a multi-step plan — use agent-timeline."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/approval-prompt/approval-prompt.tsx",
          "type": "registry:ui",
          "target": "components/kura/approval-prompt/approval-prompt.tsx"
        },
        {
          "path": "registry/kura/approval-prompt/index.ts",
          "type": "registry:ui",
          "target": "components/kura/approval-prompt/index.ts"
        }
      ]
    },
    {
      "name": "artifact-card",
      "type": "registry:ui",
      "title": "Artifact Card",
      "description": "Card for something an agent made — document, code, web page, image, sheet or diagram — with generating/updating progress, versions and open-in-panel.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/icon-button.json",
        "https://kuro.abstergo.fyi/r/shimmer-text.json",
        "https://kuro.abstergo.fyi/r/use-controllable-state.json",
        "utils"
      ],
      "categories": [
        "conversation",
        "artifact",
        "canvas",
        "document",
        "file"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/artifact-card · Markdown for agents: https://kuro.abstergo.fyi/components/artifact-card.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "An assistant message produced a standalone deliverable (a document, a code file, a web page, an image, a CSV, a diagram) that the user opens in a side panel or another page.",
            "Show an artifact while the agent is still writing it: status=\"generating\" with a live statusText and optional progress, then flip to \"ready\".",
            "An artifact the user asked to change: status=\"updating\" plus a ‹ v2/3 › version switcher (versions/version/onVersionChange).",
            "A list of everything the agent made in a session, e.g. a files/outputs sidebar (compact variant, selected marks the one that is open).",
            "A visual card with a thumbnail of the artifact under the title (variant=\"preview\" with a `preview` node: a text excerpt, an <img>, a headerless CodeBlock)."
          ],
          "whenNotToUse": [
            "Code the user should read inline in the answer — use code-block directly.",
            "A file the user uploaded or attached to the prompt — use attachment.",
            "One tool invocation with arguments and a result (read_file, run_command) — use tool-call.",
            "A link to an external web source the answer relies on — use citation.",
            "A multi-step plan of work — use agent-timeline."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/artifact-card/artifact-card.tsx",
          "type": "registry:ui",
          "target": "components/kura/artifact-card/artifact-card.tsx"
        },
        {
          "path": "registry/kura/artifact-card/index.ts",
          "type": "registry:ui",
          "target": "components/kura/artifact-card/index.ts"
        }
      ]
    },
    {
      "name": "attachment",
      "type": "registry:ui",
      "title": "Attachment",
      "description": "File and image attachment chips with thumbnails, upload progress rings, error/retry, remove, a “+N” overflow stack and a dropzone.",
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kura-motion.json",
        "https://kuro.abstergo.fyi/r/use-reduced-motion.json",
        "utils"
      ],
      "categories": [
        "input",
        "file",
        "upload",
        "attachment",
        "image"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/attachment · Markdown for agents: https://kuro.abstergo.fyi/components/attachment.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Show files the user attached to a prompt before sending (inside or above a composer).",
            "Display upload progress, failures and a retry action for files sent to a model.",
            "Render the files that belong to a sent message or an agent artifact list.",
            "A standalone drop area for documents to index, e.g. “Add files to this project”."
          ],
          "whenNotToUse": [
            "A complete prompt input with paste and drag-drop built in — use composer (it renders attachment for you).",
            "Rich previews of generated documents or code — use artifact-card or code-block.",
            "Audio recordings with playback — use audio-waveform with `peaks`."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/attachment/attachment-utils.ts",
          "type": "registry:ui",
          "target": "components/kura/attachment/attachment-utils.ts"
        },
        {
          "path": "registry/kura/attachment/attachment.tsx",
          "type": "registry:ui",
          "target": "components/kura/attachment/attachment.tsx"
        },
        {
          "path": "registry/kura/attachment/index.ts",
          "type": "registry:ui",
          "target": "components/kura/attachment/index.ts"
        }
      ]
    },
    {
      "name": "audio-waveform",
      "type": "registry:ui",
      "title": "Audio Waveform",
      "description": "Canvas audio visualiser — live bars, mirrored history or oscilloscope line from a mic or media element, or recorded peaks with a seek scrubber.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kura-merge-refs.json",
        "https://kuro.abstergo.fyi/r/use-audio-analyser.json",
        "https://kuro.abstergo.fyi/r/use-reduced-motion.json",
        "utils"
      ],
      "categories": [
        "voice",
        "audio",
        "waveform",
        "visualizer",
        "canvas"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/audio-waveform · Markdown for agents: https://kuro.abstergo.fyi/components/audio-waveform.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Show that the mic is live while dictating or talking to a voice agent (mirrored history).",
            "Visualise playback of a model's spoken reply or an <audio> element (spectrum bars or line).",
            "A recorded voice note / audio attachment with a played/unplayed split and drag-to-seek."
          ],
          "whenNotToUse": [
            "A complete dictation control with permissions, transcript and states — use voice-dictation (it renders this).",
            "An ambient “the agent is speaking” blob — use agent-orb.",
            "A non-audio progress indicator — use a progress bar or context-meter."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/audio-waveform/audio-waveform.tsx",
          "type": "registry:ui",
          "target": "components/kura/audio-waveform/audio-waveform.tsx"
        },
        {
          "path": "registry/kura/audio-waveform/index.ts",
          "type": "registry:ui",
          "target": "components/kura/audio-waveform/index.ts"
        }
      ]
    },
    {
      "name": "aurora",
      "type": "registry:ui",
      "title": "Aurora",
      "description": "Soft northern-lights background: folding light curtains drawn in a shader with premultiplied alpha, so it glows on dark and washes on light.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kura-merge-refs.json",
        "https://kuro.abstergo.fyi/r/kura-shader-color.json",
        "https://kuro.abstergo.fyi/r/shader-canvas.json",
        "https://kuro.abstergo.fyi/r/use-reduced-motion.json",
        "utils"
      ],
      "categories": [
        "effects",
        "aurora",
        "northern-lights",
        "background",
        "webgl"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/aurora · Markdown for agents: https://kuro.abstergo.fyi/components/aurora.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "A sign-in, landing or 'welcome back' screen that should feel calm and a little magical.",
            "A night-themed hero or a header band above an agent dashboard.",
            "A background that must sit on top of an existing surface colour (it is transparent where there is no light)."
          ],
          "whenNotToUse": [
            "A colourful blob background filling the whole area — use mesh-gradient.",
            "Showing that an agent is busy — use border-beam or thinking-indicator.",
            "A voice agent's presence — use agent-orb.",
            "Behind dense UI or long text: the curtains move; keep content short and centred."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/aurora/aurora.glsl.ts",
          "type": "registry:ui",
          "target": "components/kura/aurora/aurora.glsl.ts"
        },
        {
          "path": "registry/kura/aurora/aurora.tsx",
          "type": "registry:ui",
          "target": "components/kura/aurora/aurora.tsx"
        },
        {
          "path": "registry/kura/aurora/index.ts",
          "type": "registry:ui",
          "target": "components/kura/aurora/index.ts"
        }
      ]
    },
    {
      "name": "border-beam",
      "type": "registry:ui",
      "title": "Border Beam",
      "description": "Animated light beam that travels around its parent's border — a quiet “an agent is working in here” signal for composers, cards and panels.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "utils"
      ],
      "categories": [
        "effects",
        "border",
        "beam",
        "glow",
        "loading"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/border-beam · Markdown for agents: https://kuro.abstergo.fyi/components/border-beam.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "A composer, card or panel whose content an agent is currently editing or generating.",
            "A running tool call or background task row that should read as live without a spinner.",
            "Highlighting the one container on screen that is waiting for or producing AI output."
          ],
          "whenNotToUse": [
            "Small inline 'thinking' feedback — use thinking-indicator or shimmer-text.",
            "Filling a background with colour — use mesh-gradient or aurora.",
            "Focus or selection states — use the focus ring (shadow-kura-focus), not a beam.",
            "Several beams on one screen at once: it is a signal; more than one or two becomes noise."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/border-beam/border-beam.tsx",
          "type": "registry:ui",
          "target": "components/kura/border-beam/border-beam.tsx"
        },
        {
          "path": "registry/kura/border-beam/index.ts",
          "type": "registry:ui",
          "target": "components/kura/border-beam/index.ts"
        }
      ]
    },
    {
      "name": "button",
      "type": "registry:ui",
      "title": "Button",
      "description": "The Kura button: six variants, four sizes, loading state, asChild, tactile press and a signal focus ring.",
      "dependencies": [
        "radix-ui"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/spinner.json",
        "utils"
      ],
      "categories": [
        "primitives",
        "button",
        "action",
        "cta",
        "submit"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/button · Markdown for agents: https://kuro.abstergo.fyi/components/button.md",
      "meta": {
        "kura": {
          "status": "stable",
          "whenToUse": [
            "Any clickable action: submit, confirm, cancel, open.",
            "Links that should look like buttons (use asChild with your router's Link)."
          ],
          "whenNotToUse": [
            "Icon-only actions — use icon-button (it enforces an accessible label and adds a tooltip).",
            "Approve/deny decisions for agent actions — use approval-prompt."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/button/button.tsx",
          "type": "registry:ui",
          "target": "components/kura/button/button.tsx"
        },
        {
          "path": "registry/kura/button/index.ts",
          "type": "registry:ui",
          "target": "components/kura/button/index.ts"
        }
      ]
    },
    {
      "name": "citation",
      "type": "registry:ui",
      "title": "Citation",
      "description": "Inline numbered citation pill that links to its source and previews favicon, title, domain and snippet on hover/focus, plus a Sources strip or list.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/popover.json",
        "https://kuro.abstergo.fyi/r/use-controllable-state.json",
        "utils"
      ],
      "categories": [
        "conversation",
        "citation",
        "sources",
        "rag",
        "references"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/citation · Markdown for agents: https://kuro.abstergo.fyi/components/citation.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Attribute sentences of a model's answer to retrieved sources (RAG, web search, file search) with inline [1] [2] pills.",
            "Preview a source without leaving the answer: hover or keyboard-focus the pill to see title, domain and the snippet used.",
            "List all sources behind an answer under it, as a compact chip strip or a numbered list (`Sources`)."
          ],
          "whenNotToUse": [
            "Plain links in prose with no source metadata — use an <a>.",
            "Footnotes in long-form documents that must print — use real footnotes.",
            "Showing the search tool call itself (query, results JSON) — use tool-call."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/citation/citation.tsx",
          "type": "registry:ui",
          "target": "components/kura/citation/citation.tsx"
        },
        {
          "path": "registry/kura/citation/index.ts",
          "type": "registry:ui",
          "target": "components/kura/citation/index.ts"
        }
      ]
    },
    {
      "name": "code-block",
      "type": "registry:ui",
      "title": "Code Block",
      "description": "Syntax-highlighted code with a filename header, copy, line numbers, highlighted lines, diffs, wrap, collapsible height and streaming-safe rendering.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/icon-button.json",
        "https://kuro.abstergo.fyi/r/use-controllable-state.json",
        "utils"
      ],
      "categories": [
        "conversation",
        "code",
        "syntax-highlighting",
        "diff",
        "copy"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/code-block · Markdown for agents: https://kuro.abstergo.fyi/components/code-block.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Show code a model wrote in a chat answer, including while it is still streaming.",
            "Show a file or snippet with a filename header and a copy button (docs, READMEs, agent output).",
            "Show an agent's proposed edit as a unified diff with +/- lines.",
            "Long files that should start collapsed to a fixed height with a “Show N more lines” control.",
            "Terminal commands (language=\"bash\") with an extra header action such as Run."
          ],
          "whenNotToUse": [
            "Inline code inside a sentence — use a plain <code> element.",
            "Tool arguments/results JSON inside an agent step — use tool-call, which pretty-prints JSON for you.",
            "Prose output from a model — use streaming-text or message.",
            "Editable code — use a real editor (CodeMirror/Monaco); CodeBlock is read-only."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/code-block/code-block.tsx",
          "type": "registry:ui",
          "target": "components/kura/code-block/code-block.tsx"
        },
        {
          "path": "registry/kura/code-block/highlight.ts",
          "type": "registry:ui",
          "target": "components/kura/code-block/highlight.ts"
        },
        {
          "path": "registry/kura/code-block/index.ts",
          "type": "registry:ui",
          "target": "components/kura/code-block/index.ts"
        }
      ]
    },
    {
      "name": "command-palette",
      "type": "registry:ui",
      "title": "Command Palette",
      "description": "⌘K command palette for agent actions: fuzzy search, groups, recents, nested pages with async loading, and shortcut hints.",
      "dependencies": [
        "lucide-react",
        "radix-ui"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kbd.json",
        "https://kuro.abstergo.fyi/r/kura-keys.json",
        "https://kuro.abstergo.fyi/r/use-controllable-state.json",
        "https://kuro.abstergo.fyi/r/use-hotkey.json",
        "utils"
      ],
      "categories": [
        "input",
        "command-palette",
        "cmdk",
        "search",
        "launcher"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/command-palette · Markdown for agents: https://kuro.abstergo.fyi/components/command-palette.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "A global launcher for agent actions: run/stop an agent, switch agents, add context, change settings.",
            "Navigating many commands or entities (files, threads, workflows) by typing.",
            "Multi-step choices as nested pages (“Change theme…” → Light / Dark), including lists fetched on demand."
          ],
          "whenNotToUse": [
            "Commands typed inline inside a prompt — use slash-command-menu.",
            "Choosing a model — use model-picker.",
            "A handful of starter prompts in an empty chat — use prompt-suggestions."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/command-palette/command-palette.tsx",
          "type": "registry:ui",
          "target": "components/kura/command-palette/command-palette.tsx"
        },
        {
          "path": "registry/kura/command-palette/index.ts",
          "type": "registry:ui",
          "target": "components/kura/command-palette/index.ts"
        }
      ]
    },
    {
      "name": "composer",
      "type": "registry:ui",
      "title": "Composer",
      "description": "Prompt input for chat and agents: auto-growing textarea, attachments, toolbar slot, send→stop button, paste/drop files and a length hint.",
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/attachment.json",
        "https://kuro.abstergo.fyi/r/icon-button.json",
        "https://kuro.abstergo.fyi/r/kura-merge-refs.json",
        "https://kuro.abstergo.fyi/r/kura-motion.json",
        "https://kuro.abstergo.fyi/r/tooltip.json",
        "https://kuro.abstergo.fyi/r/use-controllable-state.json",
        "https://kuro.abstergo.fyi/r/use-reduced-motion.json",
        "utils"
      ],
      "categories": [
        "input",
        "prompt",
        "chat",
        "input",
        "textarea"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/composer · Markdown for agents: https://kuro.abstergo.fyi/components/composer.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "The message box of a chat UI or agent console (“Ask anything…”).",
            "Any prompt field that should send on Enter, accept pasted or dropped files, and stop a streaming response.",
            "A prompt input that hosts a model picker, tool toggles, voice input or a slash-command menu in its toolbar."
          ],
          "whenNotToUse": [
            "A single-line search or filter field — use a plain input or command-palette.",
            "Showing attachments outside an input (sent messages, file lists) — use attachment.",
            "Picking a model on its own — use model-picker.",
            "Voice-only input — use voice-dictation (it can also feed a composer)."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/composer/composer.tsx",
          "type": "registry:ui",
          "target": "components/kura/composer/composer.tsx"
        },
        {
          "path": "registry/kura/composer/index.ts",
          "type": "registry:ui",
          "target": "components/kura/composer/index.ts"
        }
      ]
    },
    {
      "name": "context-meter",
      "type": "registry:ui",
      "title": "Context Meter",
      "description": "Token / context-window usage as a compact ring or bar with warning and danger thresholds, rolling numbers and a segmented breakdown card.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/popover.json",
        "https://kuro.abstergo.fyi/r/use-controllable-state.json",
        "https://kuro.abstergo.fyi/r/use-reduced-motion.json",
        "utils"
      ],
      "categories": [
        "agent",
        "tokens",
        "context-window",
        "usage",
        "meter"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/context-meter · Markdown for agents: https://kuro.abstergo.fyi/components/context-meter.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Show how much of a model's context window a conversation uses (e.g. in a composer footer or chat header).",
            "Break usage down by source — system prompt, tool definitions, attached files, history — in a hover card.",
            "Warn before the context fills up (auto-compaction, truncation) with warning/danger thresholds.",
            "Show any other token budget (per-request output limit, monthly quota) as a bar."
          ],
          "whenNotToUse": [
            "Indeterminate progress or “thinking” — use shimmer-text or reasoning.",
            "Upload or task progress — use a progress bar (or agent-timeline for multi-step work).",
            "Billing/cost dashboards with history — use a chart."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/context-meter/context-meter.tsx",
          "type": "registry:ui",
          "target": "components/kura/context-meter/context-meter.tsx"
        },
        {
          "path": "registry/kura/context-meter/index.ts",
          "type": "registry:ui",
          "target": "components/kura/context-meter/index.ts"
        }
      ]
    },
    {
      "name": "decode-text",
      "type": "registry:ui",
      "title": "Decode Text",
      "description": "Text reveal that scrambles glyphs and resolves them left to right, like an AI decoding — width-stable, with the final text read to screen readers at once.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kura-merge-refs.json",
        "https://kuro.abstergo.fyi/r/use-reduced-motion.json",
        "utils"
      ],
      "categories": [
        "effects",
        "text",
        "reveal",
        "scramble",
        "decode"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/decode-text · Markdown for agents: https://kuro.abstergo.fyi/components/decode-text.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Revealing a short status or result the agent just produced: “Plan ready”, “Connected to runner-07”.",
            "Hero taglines or section headings that should arrive with a technical, machine-like flourish.",
            "IDs, hashes, timings and other mono data appearing after a computation."
          ],
          "whenNotToUse": [
            "Streaming a model's answer token by token — use streaming-text.",
            "An in-progress label — use shimmer-text or thinking-indicator.",
            "Paragraphs or anything longer than a line or two: the effect becomes noise and per-glyph DOM gets heavy.",
            "Text that changes many times a second (live counters) — render it plainly."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/decode-text/decode-text.tsx",
          "type": "registry:ui",
          "target": "components/kura/decode-text/decode-text.tsx"
        },
        {
          "path": "registry/kura/decode-text/index.ts",
          "type": "registry:ui",
          "target": "components/kura/decode-text/index.ts"
        }
      ]
    },
    {
      "name": "grain",
      "type": "registry:ui",
      "title": "Grain",
      "description": "Film-grain overlay from a cached SVG-noise tile, with blend modes and an optional compositor-only flicker — texture for gradients and heroes.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "utils"
      ],
      "categories": [
        "effects",
        "grain",
        "noise",
        "texture",
        "film"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/grain · Markdown for agents: https://kuro.abstergo.fyi/components/grain.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Adding a print-like finish on top of a mesh-gradient, aurora or photo.",
            "Hiding colour banding on large, low-contrast gradients.",
            "Giving a flat hero or empty-state panel a subtle tactile texture."
          ],
          "whenNotToUse": [
            "As the background itself — combine it with mesh-gradient or aurora.",
            "Over body text or dense UI: noise reduces legibility.",
            "Signalling activity — grain is texture; use border-beam or thinking-indicator."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/grain/grain.tsx",
          "type": "registry:ui",
          "target": "components/kura/grain/grain.tsx"
        },
        {
          "path": "registry/kura/grain/index.ts",
          "type": "registry:ui",
          "target": "components/kura/grain/index.ts"
        }
      ]
    },
    {
      "name": "icon-button",
      "type": "registry:ui",
      "title": "Icon Button",
      "description": "Square icon-only button with a mandatory accessible label and an automatic tooltip (with optional shortcut).",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/button.json",
        "https://kuro.abstergo.fyi/r/kura-keys.json",
        "https://kuro.abstergo.fyi/r/tooltip.json",
        "utils"
      ],
      "categories": [
        "primitives",
        "button",
        "icon",
        "toolbar",
        "action"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/icon-button · Markdown for agents: https://kuro.abstergo.fyi/components/icon-button.md",
      "meta": {
        "kura": {
          "status": "stable",
          "whenToUse": [
            "Toolbar and composer actions: attach, mic, send, stop, copy, retry.",
            "Any action represented only by an icon."
          ],
          "whenNotToUse": [
            "Actions that need a visible text label — use button.",
            "Toggles with on/off state in a group — compose button with aria-pressed."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/icon-button/icon-button.tsx",
          "type": "registry:ui",
          "target": "components/kura/icon-button/icon-button.tsx"
        },
        {
          "path": "registry/kura/icon-button/index.ts",
          "type": "registry:ui",
          "target": "components/kura/icon-button/index.ts"
        }
      ]
    },
    {
      "name": "kbd",
      "type": "registry:ui",
      "title": "Kbd",
      "description": "Keyboard key or key combo, platform-aware (⌘ on Apple, Ctrl elsewhere) and hydration-safe.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kura-keys.json",
        "https://kuro.abstergo.fyi/r/use-platform.json",
        "utils"
      ],
      "categories": [
        "primitives",
        "keyboard",
        "key",
        "shortcut",
        "kbd"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/kbd · Markdown for agents: https://kuro.abstergo.fyi/components/kbd.md",
      "meta": {
        "kura": {
          "status": "stable",
          "whenToUse": [
            "Show a key or combo inline in text, menus, tooltips or docs.",
            "Building blocks for shortcut hints inside other components."
          ],
          "whenNotToUse": [
            "A labelled hint that should also bind the shortcut — use kbd-shortcut.",
            "A shortcut inside a tooltip — pass `shortcut` to tooltip."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/kbd/index.ts",
          "type": "registry:ui",
          "target": "components/kura/kbd/index.ts"
        },
        {
          "path": "registry/kura/kbd/kbd.tsx",
          "type": "registry:ui",
          "target": "components/kura/kbd/kbd.tsx"
        }
      ]
    },
    {
      "name": "kbd-shortcut",
      "type": "registry:ui",
      "title": "Kbd Shortcut",
      "description": "Labelled keyboard-shortcut hint (“Send ⌘↵”) that can also bind the shortcut and light its keys while pressed.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kbd.json",
        "https://kuro.abstergo.fyi/r/kura-keys.json",
        "https://kuro.abstergo.fyi/r/use-hotkey.json",
        "utils"
      ],
      "categories": [
        "input",
        "keyboard",
        "shortcut",
        "hotkey",
        "hint"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/kbd-shortcut · Markdown for agents: https://kuro.abstergo.fyi/components/kbd-shortcut.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Hints under or inside a prompt composer: “⌘↵ to send”, “Esc to stop”.",
            "Advertise and bind a global shortcut in one element (e.g. ⌘K for search, ⌘J to toggle a panel).",
            "Empty states and onboarding that teach shortcuts."
          ],
          "whenNotToUse": [
            "Showing a single key or combo without a label or binding — use kbd.",
            "A shortcut inside a tooltip — pass `shortcut` to tooltip or icon-button instead.",
            "Binding a shortcut with no visible hint — call the useHotkey hook directly."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/kbd-shortcut/index.ts",
          "type": "registry:ui",
          "target": "components/kura/kbd-shortcut/index.ts"
        },
        {
          "path": "registry/kura/kbd-shortcut/kbd-shortcut.tsx",
          "type": "registry:ui",
          "target": "components/kura/kbd-shortcut/kbd-shortcut.tsx"
        }
      ]
    },
    {
      "name": "mesh-gradient",
      "type": "registry:ui",
      "title": "Mesh Gradient",
      "description": "Animated WebGL mesh gradient that blends up to six colours in OKLab, with distortion, swirl, grain and a pointer lens — for heroes and empty states.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kura-merge-refs.json",
        "https://kuro.abstergo.fyi/r/kura-shader-color.json",
        "https://kuro.abstergo.fyi/r/shader-canvas.json",
        "https://kuro.abstergo.fyi/r/use-reduced-motion.json",
        "utils"
      ],
      "categories": [
        "effects",
        "gradient",
        "mesh",
        "webgl",
        "shader"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/mesh-gradient · Markdown for agents: https://kuro.abstergo.fyi/components/mesh-gradient.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "A hero, landing or onboarding section that needs a calm, living background behind a headline.",
            "An empty state or a 'start a conversation' panel that should feel warm instead of blank.",
            "A card or banner announcing an AI feature, using the theme-aware `signal` preset.",
            "Any container where content should sit on a soft, slowly moving colour field (pass children)."
          ],
          "whenNotToUse": [
            "Northern-lights curtains or a night-sky feel — use aurora.",
            "Showing that an agent is listening or speaking — use agent-orb.",
            "Signalling that a container is busy — use border-beam (it outlines instead of filling).",
            "Small inline indicators — use thinking-indicator or shimmer-text.",
            "Just adding texture to an existing background — use grain.",
            "A fully custom GLSL effect — build it on shader-canvas."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/mesh-gradient/index.ts",
          "type": "registry:ui",
          "target": "components/kura/mesh-gradient/index.ts"
        },
        {
          "path": "registry/kura/mesh-gradient/mesh-gradient.glsl.ts",
          "type": "registry:ui",
          "target": "components/kura/mesh-gradient/mesh-gradient.glsl.ts"
        },
        {
          "path": "registry/kura/mesh-gradient/mesh-gradient.tsx",
          "type": "registry:ui",
          "target": "components/kura/mesh-gradient/mesh-gradient.tsx"
        }
      ]
    },
    {
      "name": "message",
      "type": "registry:ui",
      "title": "Message",
      "description": "Chat message (user/assistant) with avatar, hover actions, ‹ 2/3 › branches, error/streaming states and an autoscrolling MessageList thread.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/button.json",
        "https://kuro.abstergo.fyi/r/icon-button.json",
        "https://kuro.abstergo.fyi/r/use-controllable-state.json",
        "https://kuro.abstergo.fyi/r/use-reduced-motion.json",
        "utils"
      ],
      "categories": [
        "conversation",
        "chat",
        "message",
        "conversation",
        "thread"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/message · Markdown for agents: https://kuro.abstergo.fyi/components/message.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Render the turns of a chat with an LLM: user bubbles on the right, assistant answers as open text on the left.",
            "Add per-message actions: copy, regenerate, edit, thumbs up/down and navigation between regenerated versions.",
            "Show a failed generation with an inline error and a Retry button.",
            "Wrap a whole conversation in MessageList for stick-to-bottom autoscroll with a “Jump to latest” pill."
          ],
          "whenNotToUse": [
            "Only the streaming answer text, without chrome — use streaming-text.",
            "A model's hidden chain of thought — put a reasoning block inside the assistant Message.",
            "A tool invocation or an agent plan — use tool-call or agent-timeline inside the assistant Message.",
            "The input box at the bottom of a chat — use composer."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/message/index.ts",
          "type": "registry:ui",
          "target": "components/kura/message/index.ts"
        },
        {
          "path": "registry/kura/message/message-list.tsx",
          "type": "registry:ui",
          "target": "components/kura/message/message-list.tsx"
        },
        {
          "path": "registry/kura/message/message.tsx",
          "type": "registry:ui",
          "target": "components/kura/message/message.tsx"
        }
      ]
    },
    {
      "name": "model-picker",
      "type": "registry:ui",
      "title": "Model Picker",
      "description": "Searchable popover for choosing an AI model, grouped by provider, with capability icons, context size, speed and cost hints.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/popover.json",
        "https://kuro.abstergo.fyi/r/use-controllable-state.json",
        "utils"
      ],
      "categories": [
        "input",
        "model",
        "llm",
        "select",
        "combobox"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/model-picker · Markdown for agents: https://kuro.abstergo.fyi/components/model-picker.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Let the user switch the model in a chat composer toolbar or a chat header.",
            "Compare models at a glance: vision/tools/reasoning support, context window, speed and price tier.",
            "Any “choose one of N models/agents/providers” selector that benefits from search and grouping."
          ],
          "whenNotToUse": [
            "Running actions or navigating — use command-palette.",
            "Inserting commands while typing a prompt — use slash-command-menu.",
            "Two or three static options without metadata — a segmented control or plain select is enough."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/model-picker/index.ts",
          "type": "registry:ui",
          "target": "components/kura/model-picker/index.ts"
        },
        {
          "path": "registry/kura/model-picker/model-picker.tsx",
          "type": "registry:ui",
          "target": "components/kura/model-picker/model-picker.tsx"
        }
      ]
    },
    {
      "name": "particle-field",
      "type": "registry:ui",
      "title": "Particle Field",
      "description": "Drifting particle constellation that parts around the pointer and can converge into a ring or point to signal “generating”.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kura-merge-refs.json",
        "https://kuro.abstergo.fyi/r/use-reduced-motion.json",
        "utils"
      ],
      "categories": [
        "effects",
        "particles",
        "constellation",
        "network",
        "canvas"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/particle-field · Markdown for agents: https://kuro.abstergo.fyi/components/particle-field.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "An empty state or hero for a knowledge/graph/agent product where a quiet network motif fits.",
            "Signalling that something is being generated: flip `converge` while the model works, release when done.",
            "A subtle, interactive backdrop behind a short prompt or call to action."
          ],
          "whenNotToUse": [
            "Soft colour backgrounds — use mesh-gradient or aurora.",
            "Inline progress feedback — use thinking-indicator or shimmer-text.",
            "A voice agent's presence — use agent-orb.",
            "Behind dense content: lines and motion compete with text."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/particle-field/index.ts",
          "type": "registry:ui",
          "target": "components/kura/particle-field/index.ts"
        },
        {
          "path": "registry/kura/particle-field/particle-field.tsx",
          "type": "registry:ui",
          "target": "components/kura/particle-field/particle-field.tsx"
        }
      ]
    },
    {
      "name": "popover",
      "type": "registry:ui",
      "title": "Popover",
      "description": "Floating translucent panel anchored to a trigger, with focus management and origin-aware motion.",
      "dependencies": [
        "radix-ui"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "utils"
      ],
      "categories": [
        "primitives",
        "popover",
        "overlay",
        "floating",
        "panel"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/popover · Markdown for agents: https://kuro.abstergo.fyi/components/popover.md",
      "meta": {
        "kura": {
          "status": "stable",
          "whenToUse": [
            "Small interactive panels: settings for a composer, a model's details, a share menu, a filter form.",
            "Content anchored to a control that should not navigate away."
          ],
          "whenNotToUse": [
            "Plain hover labels — use tooltip.",
            "Choosing a model — use model-picker. Slash commands — use slash-command-menu. Global search — use command-palette.",
            "Blocking decisions — use a dialog or approval-prompt."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/popover/index.ts",
          "type": "registry:ui",
          "target": "components/kura/popover/index.ts"
        },
        {
          "path": "registry/kura/popover/popover.tsx",
          "type": "registry:ui",
          "target": "components/kura/popover/popover.tsx"
        }
      ]
    },
    {
      "name": "prompt-suggestions",
      "type": "registry:ui",
      "title": "Prompt Suggestions",
      "description": "Starter prompts for empty chat states — chips, cards or a list that rise in with a short stagger and fill the composer when clicked.",
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kura-motion.json",
        "https://kuro.abstergo.fyi/r/use-reduced-motion.json",
        "utils"
      ],
      "categories": [
        "input",
        "suggestions",
        "starters",
        "empty-state",
        "prompts"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/prompt-suggestions · Markdown for agents: https://kuro.abstergo.fyi/components/prompt-suggestions.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "The empty state of a chat or agent: show 3–6 example prompts the user can start from.",
            "Follow-up suggestions under an answer (“Make it shorter”, “Add sources”) using the chips variant.",
            "Onboarding that teaches what the assistant can do, with icons and one-line descriptions."
          ],
          "whenNotToUse": [
            "Commands typed inline in the prompt — use slash-command-menu.",
            "Global actions and navigation — use command-palette.",
            "More than ~8 items or anything that needs search — use command-palette or a list."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/prompt-suggestions/index.ts",
          "type": "registry:ui",
          "target": "components/kura/prompt-suggestions/index.ts"
        },
        {
          "path": "registry/kura/prompt-suggestions/prompt-suggestions.tsx",
          "type": "registry:ui",
          "target": "components/kura/prompt-suggestions/prompt-suggestions.tsx"
        }
      ]
    },
    {
      "name": "reasoning",
      "type": "registry:ui",
      "title": "Reasoning",
      "description": "Collapsible thinking trace: a shimmering “Thinking… 12s” label while active that settles into “Thought for 14s”, revealing muted reasoning text.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/shimmer-text.json",
        "https://kuro.abstergo.fyi/r/use-controllable-state.json",
        "utils"
      ],
      "categories": [
        "agent",
        "reasoning",
        "thinking",
        "chain-of-thought",
        "collapsible"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/reasoning · Markdown for agents: https://kuro.abstergo.fyi/components/reasoning.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Show a reasoning model's chain of thought / thinking blocks (Claude extended thinking, o-series reasoning summaries) above the answer.",
            "Indicate that the model is thinking, with elapsed time, before the first answer token arrives.",
            "Keep a finished trace available but out of the way (collapsed to one line)."
          ],
          "whenNotToUse": [
            "A bare “Thinking…” label with no trace to reveal — use shimmer-text (or thinking-indicator).",
            "A sequence of discrete agent steps with states — use agent-timeline.",
            "A single tool invocation with arguments and results — use tool-call."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/reasoning/index.ts",
          "type": "registry:ui",
          "target": "components/kura/reasoning/index.ts"
        },
        {
          "path": "registry/kura/reasoning/reasoning.tsx",
          "type": "registry:ui",
          "target": "components/kura/reasoning/reasoning.tsx"
        }
      ]
    },
    {
      "name": "shader-canvas",
      "type": "registry:ui",
      "title": "Shader Canvas",
      "description": "Minimal WebGL2 fragment-shader runner with time/resolution/pointer uniforms, DPR capping, offscreen pausing, reduced-motion still frame and CSS fallback.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kura-merge-refs.json",
        "https://kuro.abstergo.fyi/r/use-reduced-motion.json",
        "utils"
      ],
      "categories": [
        "effects",
        "webgl",
        "shader",
        "glsl",
        "gpu"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/shader-canvas · Markdown for agents: https://kuro.abstergo.fyi/components/shader-canvas.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Building any GPU visual: mesh gradients, auroras, grain, glows, orbs, generative backgrounds.",
            "A custom decorative shader behind a hero, card or voice surface."
          ],
          "whenNotToUse": [
            "A ready-made effect exists — use mesh-gradient, agent-orb, grain or border-beam.",
            "Static gradients — plain CSS is cheaper.",
            "Anything that conveys information — it is aria-hidden and may fall back to a static gradient."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/shader-canvas/index.ts",
          "type": "registry:ui",
          "target": "components/kura/shader-canvas/index.ts"
        },
        {
          "path": "registry/kura/shader-canvas/shader-canvas.tsx",
          "type": "registry:ui",
          "target": "components/kura/shader-canvas/shader-canvas.tsx"
        }
      ]
    },
    {
      "name": "shimmer-text",
      "type": "registry:ui",
      "title": "Shimmer Text",
      "description": "Animated gradient sweep across text — the canonical “Thinking…” / “Searching…” label for in-progress AI work.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "utils"
      ],
      "categories": [
        "feedback",
        "loading",
        "thinking",
        "status",
        "text"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/shimmer-text · Markdown for agents: https://kuro.abstergo.fyi/components/shimmer-text.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Show that a model or agent is working: “Thinking…”, “Searching the web…”, “Reading 12 files…”.",
            "Label the current step of a running tool call or reasoning trace.",
            "A lightweight inline loading label where a spinner would be too mechanical."
          ],
          "whenNotToUse": [
            "Long paragraphs or body text — the sweep hurts legibility beyond a short phrase.",
            "Determinate progress (uploads, token budgets) — use a progress bar or context-meter.",
            "Streaming the model's answer itself — use streaming-text.",
            "A standalone animated dot/orb indicator — use thinking-indicator or agent-orb."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/shimmer-text/index.ts",
          "type": "registry:ui",
          "target": "components/kura/shimmer-text/index.ts"
        },
        {
          "path": "registry/kura/shimmer-text/shimmer-text.tsx",
          "type": "registry:ui",
          "target": "components/kura/shimmer-text/shimmer-text.tsx"
        }
      ]
    },
    {
      "name": "slash-command-menu",
      "type": "registry:ui",
      "title": "Slash Command Menu",
      "description": "Inline “/” command menu anchored to the caret of a textarea, with filtering, groups, icons, descriptions and keyboard navigation.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kbd.json",
        "https://kuro.abstergo.fyi/r/kura-keys.json",
        "utils"
      ],
      "categories": [
        "input",
        "slash",
        "commands",
        "autocomplete",
        "mention"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/slash-command-menu · Markdown for agents: https://kuro.abstergo.fyi/components/slash-command-menu.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Let users insert prompt templates or run actions by typing “/” in a composer (/summarize, /debug, /clear).",
            "Any textarea or input that needs caret-anchored suggestions triggered by a character (use `trigger` for “@” mentions or “#” tags)."
          ],
          "whenNotToUse": [
            "A global ⌘K launcher for navigation and actions — use command-palette.",
            "Choosing a model from a toolbar — use model-picker.",
            "Static clickable starters in an empty chat — use prompt-suggestions."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/slash-command-menu/caret-position.ts",
          "type": "registry:ui",
          "target": "components/kura/slash-command-menu/caret-position.ts"
        },
        {
          "path": "registry/kura/slash-command-menu/index.ts",
          "type": "registry:ui",
          "target": "components/kura/slash-command-menu/index.ts"
        },
        {
          "path": "registry/kura/slash-command-menu/slash-command-menu.tsx",
          "type": "registry:ui",
          "target": "components/kura/slash-command-menu/slash-command-menu.tsx"
        }
      ]
    },
    {
      "name": "spinner",
      "type": "registry:ui",
      "title": "Spinner",
      "description": "Eight-segment radial spinner for indeterminate loading that inherits the current text color.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "utils"
      ],
      "categories": [
        "primitives",
        "loading",
        "spinner",
        "busy",
        "progress"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/spinner · Markdown for agents: https://kuro.abstergo.fyi/components/spinner.md",
      "meta": {
        "kura": {
          "status": "stable",
          "whenToUse": [
            "Indeterminate waits on a control: a loading button, a pending row, a fetching list.",
            "Small inline busy indicators next to text."
          ],
          "whenNotToUse": [
            "AI ‘thinking’ states — use shimmer-text or thinking-indicator; they read as the model working, not the network.",
            "Known progress — use a progress bar or context-meter.",
            "Inside a Button — pass `loading` to button instead."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/spinner/index.ts",
          "type": "registry:ui",
          "target": "components/kura/spinner/index.ts"
        },
        {
          "path": "registry/kura/spinner/spinner.tsx",
          "type": "registry:ui",
          "target": "components/kura/spinner/spinner.tsx"
        }
      ]
    },
    {
      "name": "streaming-text",
      "type": "registry:ui",
      "title": "Streaming Text",
      "description": "Token-by-token model output with an even reveal cadence, word-group fade/blur-in and a soft caret. Takes a growing string or an async iterable.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "utils"
      ],
      "categories": [
        "conversation",
        "streaming",
        "tokens",
        "llm",
        "text"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/streaming-text · Markdown for agents: https://kuro.abstergo.fyi/components/streaming-text.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Render an LLM answer while it streams in (AI SDK, OpenAI/Anthropic SSE, a ReadableStream adapted to an async iterable).",
            "Smooth out bursty token delivery so text appears at a calm, even rhythm instead of in jumps.",
            "Show a live caret at the end of text that is still being generated.",
            "Build a custom renderer (markdown, rich text) on top of the `useStreamingText` hook exported from the same folder."
          ],
          "whenNotToUse": [
            "Static text that is already complete — render it directly (StreamingText shows initial text instantly anyway).",
            "A “Thinking…” label before the first token — use shimmer-text (or reasoning for a collapsible trace).",
            "A full chat bubble with avatar and actions — use message, which composes streaming-text.",
            "Streaming code — use code-block with `streaming` so partial lines do not flicker."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/streaming-text/index.ts",
          "type": "registry:ui",
          "target": "components/kura/streaming-text/index.ts"
        },
        {
          "path": "registry/kura/streaming-text/streaming-text.tsx",
          "type": "registry:ui",
          "target": "components/kura/streaming-text/streaming-text.tsx"
        },
        {
          "path": "registry/kura/streaming-text/use-streaming-text.ts",
          "type": "registry:ui",
          "target": "components/kura/streaming-text/use-streaming-text.ts"
        }
      ]
    },
    {
      "name": "thinking-indicator",
      "type": "registry:ui",
      "title": "Thinking Indicator",
      "description": "Compact AI “thinking” indicators — dots, pulse, orbit, wave, or cycling status text — inside a polite live region.",
      "dependencies": [],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/shimmer-text.json",
        "utils"
      ],
      "categories": [
        "feedback",
        "loading",
        "thinking",
        "typing",
        "dots"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/thinking-indicator · Markdown for agents: https://kuro.abstergo.fyi/components/thinking-indicator.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "The assistant has received a prompt but not produced its first token yet.",
            "A pending assistant message bubble or a placeholder row in a chat list.",
            "Cycling short status lines while an agent works: “Searching…”, “Reading 4 files…” (variant text).",
            "A tiny inline signal next to a label, tab or button that work is in progress."
          ],
          "whenNotToUse": [
            "Shimmering an existing label in place — use shimmer-text.",
            "Network or file loading that is not model thinking — use spinner.",
            "A whole container being worked on — use border-beam.",
            "A voice agent's state — use agent-orb.",
            "Streaming the answer itself — use streaming-text."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/thinking-indicator/index.ts",
          "type": "registry:ui",
          "target": "components/kura/thinking-indicator/index.ts"
        },
        {
          "path": "registry/kura/thinking-indicator/thinking-indicator.tsx",
          "type": "registry:ui",
          "target": "components/kura/thinking-indicator/thinking-indicator.tsx"
        }
      ]
    },
    {
      "name": "tool-call",
      "type": "registry:ui",
      "title": "Tool Call",
      "description": "One tool invocation: name and icon, queued/running/done/failed/awaiting-approval status, live elapsed time and collapsible JSON args and result.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/code-block.json",
        "https://kuro.abstergo.fyi/r/shimmer-text.json",
        "https://kuro.abstergo.fyi/r/use-controllable-state.json",
        "utils"
      ],
      "categories": [
        "agent",
        "tool",
        "function-calling",
        "agent",
        "mcp"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/tool-call · Markdown for agents: https://kuro.abstergo.fyi/components/tool-call.md",
      "meta": {
        "kura": {
          "status": "beta",
          "whenToUse": [
            "Show a function/tool call an LLM made (AI SDK tool parts, MCP calls, OpenAI/Anthropic tool_use blocks) inside an assistant message.",
            "Show a tool's progress with a live timer, then its result or error.",
            "A tool that needs the user's go-ahead: status=\"awaiting-approval\" with Approve/Deny buttons in `actions`.",
            "Compact inline mentions of tool use within answer text (variant=\"inline\")."
          ],
          "whenNotToUse": [
            "A multi-step plan with many steps and progress — use agent-timeline (put ToolCalls inside steps if needed).",
            "A dedicated, prominent permission request with risk level and keyboard shortcuts — use approval-prompt.",
            "Plain code output — use code-block.",
            "Model thinking — use reasoning."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/tool-call/index.ts",
          "type": "registry:ui",
          "target": "components/kura/tool-call/index.ts"
        },
        {
          "path": "registry/kura/tool-call/tool-call.tsx",
          "type": "registry:ui",
          "target": "components/kura/tool-call/tool-call.tsx"
        }
      ]
    },
    {
      "name": "tooltip",
      "type": "registry:ui",
      "title": "Tooltip",
      "description": "Short label on hover or focus with an optional shortcut, origin-aware motion and instant skip between tooltips.",
      "dependencies": [
        "radix-ui"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/kbd.json",
        "https://kuro.abstergo.fyi/r/kura-keys.json",
        "utils"
      ],
      "categories": [
        "primitives",
        "tooltip",
        "hint",
        "label",
        "hover"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/tooltip · Markdown for agents: https://kuro.abstergo.fyi/components/tooltip.md",
      "meta": {
        "kura": {
          "status": "stable",
          "whenToUse": [
            "Name an icon-only control or reveal its shortcut.",
            "Brief supplementary hints (a few words)."
          ],
          "whenNotToUse": [
            "Interactive or rich content (links, buttons, forms) — use popover.",
            "Essential information — it is invisible on touch devices; put it in the UI.",
            "Labelling icon buttons — icon-button already includes a tooltip."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/tooltip/index.ts",
          "type": "registry:ui",
          "target": "components/kura/tooltip/index.ts"
        },
        {
          "path": "registry/kura/tooltip/tooltip.tsx",
          "type": "registry:ui",
          "target": "components/kura/tooltip/tooltip.tsx"
        }
      ]
    },
    {
      "name": "voice-dictation",
      "type": "registry:ui",
      "title": "Voice Dictation",
      "description": "Mic button that expands into a live waveform pill with a timer and live transcript; speech-to-text with recording fallback, toggle or hold-to-talk.",
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "https://kuro.abstergo.fyi/r/kura-theme.json",
        "https://kuro.abstergo.fyi/r/audio-waveform.json",
        "https://kuro.abstergo.fyi/r/kura-keys.json",
        "https://kuro.abstergo.fyi/r/kura-motion.json",
        "https://kuro.abstergo.fyi/r/shimmer-text.json",
        "https://kuro.abstergo.fyi/r/spinner.json",
        "https://kuro.abstergo.fyi/r/tooltip.json",
        "https://kuro.abstergo.fyi/r/use-audio-analyser.json",
        "https://kuro.abstergo.fyi/r/use-hotkey.json",
        "https://kuro.abstergo.fyi/r/use-media-recorder.json",
        "https://kuro.abstergo.fyi/r/use-reduced-motion.json",
        "https://kuro.abstergo.fyi/r/use-speech-recognition.json",
        "utils"
      ],
      "categories": [
        "voice",
        "voice",
        "dictation",
        "speech-to-text",
        "microphone"
      ],
      "docs": "Docs: https://kuro.abstergo.fyi/components/voice-dictation · Markdown for agents: https://kuro.abstergo.fyi/components/voice-dictation.md",
      "meta": {
        "kura": {
          "status": "experimental",
          "whenToUse": [
            "Let users dictate a prompt instead of typing — standalone or in a composer toolbar.",
            "Push-to-talk input (mode=\"hold\") for voice notes or quick commands.",
            "Browsers without the Web Speech API: record audio and transcribe on your server via `transcribe`."
          ],
          "whenNotToUse": [
            "A full-duplex conversation with a voice agent (barge-in, spoken replies) — use agent-orb with your realtime session.",
            "Only visualising audio you already have — use audio-waveform.",
            "Typing prompts — use composer."
          ]
        }
      },
      "files": [
        {
          "path": "registry/kura/voice-dictation/index.ts",
          "type": "registry:ui",
          "target": "components/kura/voice-dictation/index.ts"
        },
        {
          "path": "registry/kura/voice-dictation/voice-dictation.tsx",
          "type": "registry:ui",
          "target": "components/kura/voice-dictation/voice-dictation.tsx"
        }
      ]
    }
  ]
}
