{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "gallery-obsidian-knob",
  "type": "registry:ui",
  "title": "Obsidian concentric dial",
  "description": "Controlled portrait console artwork with shared input semantics.",
  "dependencies": [
    "maruaudio@>=0.0.3 <0.1.0",
    "react"
  ],
  "registryDependencies": [
    "https://pluginui.com/r/core-knob.json",
    "https://pluginui.com/r/gallery-obsidian-control-styles.json"
  ],
  "files": [
    {
      "path": "components/ui/obsidian-knob.tsx",
      "content": "/**\n * Source: https://maru.audio/ui-kit/obsidian-knob\n * Copyright © [Maru](https://maru.audio)\n *\n * Maru UI Kit — https://maru.audio/ui-kit\n *\n * Installed from the Maru UI registry. This file is yours now: edit it\n * freely, it will not be overwritten unless you re-run the add command.\n *\n * Keep this item’s companion files and CSS imports together. Dependencies\n * declared by the registry are installed with the source.\n */\nimport \"@/components/obsidian-controls.css\"\nimport {\n  Knob,\n  type KnobProps,\n  type KnobDesignState,\n} from \"@/components/ui/knob\"\n\nexport interface ObsidianKnobProps extends KnobProps {\n  readout?: string\n  caption?: string\n  shape?: boolean\n}\n\n/** Pure artwork. The shared Knob owns values, gestures, formatting and reset. */\nexport function ObsidianKnobDesign({\n  value01,\n  size,\n  disabled,\n  caption = \"PARAM\",\n  shape = false,\n}: KnobDesignState & Pick<ObsidianKnobProps, \"caption\" | \"shape\">) {\n  return (\n    <div\n      className={`obsidian-knob ${shape ? \"obsidian-knob--shape\" : \"\"}`}\n      style={{ width: size, height: size }}\n      aria-disabled={disabled || undefined}\n    >\n      <span aria-hidden=\"true\" className=\"obsidian-knob__rim\" />\n      <span aria-hidden=\"true\" className=\"obsidian-knob__cap\" />\n      <span\n        aria-hidden=\"true\"\n        className=\"obsidian-knob__rotor\"\n        style={{ transform: `rotate(${-135 + 270 * value01}deg)` }}\n      >\n        <i />\n      </span>\n      {!shape && (\n        <>\n          <span aria-hidden=\"true\" className=\"obsidian-knob__word\">\n            {caption}\n            <b>\n              <i />\n              <i />\n              <i />\n            </b>\n          </span>\n          <span aria-hidden=\"true\" className=\"obsidian-knob__ends\">\n            ╱<i />╲\n          </span>\n        </>\n      )}\n    </div>\n  )\n}\n\n/** Convenience visual preset with the ordinary Knob contract. */\nexport function ObsidianKnob({\n  label = \"Parameter\",\n  size = 92,\n  readout,\n  caption = \"PARAM\",\n  shape = false,\n  ...control\n}: ObsidianKnobProps) {\n  return (\n    <Knob\n      {...control}\n      size={size}\n      label={label}\n      hideLabel\n      hideValue\n      display={readout ?? control.display}\n      renderDesign={(state) => (\n        <ObsidianKnobDesign {...state} caption={caption} shape={shape} />\n      )}\n    />\n  )\n}\n",
      "type": "registry:component",
      "target": "@ui/obsidian-knob.tsx"
    }
  ]
}
