{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "door-open-002",
  "type": "registry:block",
  "title": "Door Open 002",
  "author": "Kenney <https://kenney.nl>",
  "description": "A quiet and definitive sound of a door opening, fitting for UI interactions that initiate an action or open a significant component without being intrusive.",
  "files": [
    {
      "path": "registry/soundcn/sounds/door-open-002/door-open-002.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const doorOpen002Sound: SoundAsset = {\n  name: \"door-open-002\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.533,\n  format: \"mp3\",\n  license: \"CC0\",\n  author: \"Kenney\",\n};\n",
      "type": "registry:lib"
    },
    {
      "path": "registry/soundcn/lib/sound-types.ts",
      "content": "export interface SoundAsset {\r\n  /** Unique identifier for the sound */\r\n  name: string;\r\n  /** Base64-encoded data URI (data:audio/mpeg;base64,...) */\r\n  dataUri: string;\r\n  /** Duration in seconds */\r\n  duration: number;\r\n  /** Audio format */\r\n  format: \"mp3\" | \"wav\" | \"ogg\";\r\n  /** License identifier */\r\n  license: \"CC0\" | \"OGA-BY\" | \"MIT\";\r\n  /** Original author/creator */\r\n  author: string;\r\n}\r\n\r\nexport interface UseSoundOptions {\r\n  /** Volume level from 0 to 1. Default: 1 */\r\n  volume?: number;\r\n  /** Playback speed multiplier. Default: 1 */\r\n  playbackRate?: number;\r\n  /** If true, calling play() stops current playback first. Default: false */\r\n  interrupt?: boolean;\r\n  /** If false, play() does nothing. Useful for user preferences. Default: true */\r\n  soundEnabled?: boolean;\r\n  /** Called when playback starts */\r\n  onPlay?: () => void;\r\n  /** Called when playback ends naturally */\r\n  onEnd?: () => void;\r\n  /** Called when pause() is called */\r\n  onPause?: () => void;\r\n  /** Called when stop() is called */\r\n  onStop?: () => void;\r\n}\r\n\r\nexport type PlayFunction = (overrides?: {\r\n  volume?: number;\r\n  playbackRate?: number;\r\n}) => void;\r\n\r\nexport interface SoundControls {\r\n  stop: () => void;\r\n  pause: () => void;\r\n  isPlaying: boolean;\r\n  duration: number | null;\r\n  sound: SoundAsset;\r\n}\r\n\r\nexport type UseSoundReturn = readonly [PlayFunction, SoundControls];\r\n",
      "type": "registry:lib"
    },
    {
      "path": "registry/soundcn/lib/sound-engine.ts",
      "content": "let audioContext: AudioContext | null = null;\nconst bufferCache = new Map<string, AudioBuffer>();\n\nexport function getAudioContext(): AudioContext {\n  if (!audioContext) {\n    audioContext = new AudioContext();\n  }\n  return audioContext;\n}\n\nexport async function decodeAudioData(dataUri: string): Promise<AudioBuffer> {\n  const cached = bufferCache.get(dataUri);\n  if (cached) return cached;\n\n  const ctx = getAudioContext();\n  const base64 = dataUri.split(\",\")[1];\n  const binaryString = atob(base64);\n  const bytes = new Uint8Array(binaryString.length);\n  for (let i = 0; i < binaryString.length; i++) {\n    bytes[i] = binaryString.charCodeAt(i);\n  }\n\n  const audioBuffer = await ctx.decodeAudioData(bytes.buffer.slice(0));\n  bufferCache.set(dataUri, audioBuffer);\n  return audioBuffer;\n}\n\nexport interface PlaySoundOptions {\n  volume?: number;\n  playbackRate?: number;\n  onEnd?: () => void;\n}\n\nexport interface SoundPlayback {\n  stop: () => void;\n}\n\nexport async function playSound(\n  dataUri: string,\n  options: PlaySoundOptions = {}\n): Promise<SoundPlayback> {\n  const { volume = 1, playbackRate = 1, onEnd } = options;\n  const ctx = getAudioContext();\n  if (ctx.state === \"suspended\") {\n    await ctx.resume();\n  }\n\n  const buffer = await decodeAudioData(dataUri);\n  const source = ctx.createBufferSource();\n  const gain = ctx.createGain();\n\n  source.buffer = buffer;\n  source.playbackRate.value = playbackRate;\n  gain.gain.value = volume;\n\n  source.connect(gain);\n  gain.connect(ctx.destination);\n\n  source.onended = () => {\n    onEnd?.();\n  };\n\n  source.start(0);\n\n  return {\n    stop: () => {\n      try {\n        source.stop();\n      } catch {\n        // No-op if already stopped.\n      }\n    },\n  };\n}\n",
      "type": "registry:lib"
    }
  ],
  "meta": {
    "duration": 0.533,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "door",
      "open",
      "002"
    ],
    "keywords": [
      "door",
      "open",
      "quiet",
      "definitive",
      "ui",
      "initiate",
      "action",
      "component open",
      "modal open",
      "panel open",
      "discreet",
      "feedback",
      "soft",
      "click",
      "transition",
      "subtle",
      "portal",
      "intro",
      "system",
      "reveal"
    ]
  },
  "categories": [
    "door"
  ]
}