{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "door-open-001",
  "type": "registry:block",
  "title": "Door Open 001",
  "author": "Kenney <https://kenney.nl>",
  "description": "A distinct sound of a door opening, suitable for signifying the initiation of a process or a specific UI panel expanding.",
  "files": [
    {
      "path": "registry/soundcn/sounds/door-open-001/door-open-001.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const doorOpen001Sound: SoundAsset = {\n  name: \"door-open-001\",\n  dataUri: \"data:audio/mpeg;base64,SUQzBAAAAAAAIlRTU0UAAAAOAAADTGF2ZjYyLjMuMTAwAAAAAAAAAAAAAAD/+1DAAAAAAAAAAAAAAAAAAAAAAABJbmZvAAAADwAAABYAABLFABYWFhYhISEhISwsLCw3Nzc3N0JCQkJNTU1NTVhYWFhkZGRkZG9vb296enp6eoWFhYWQkJCQkJubm5ubpqamprKysrKyvb29vcjIyMjI09PT097e3t7e6enp6fT09PT0/////wAAAABMYXZjNjIuMTEAAAAAAAAAAAAAAAAkBbEAAAAAAAASxQrmB2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//tQxAAACgGna9QRAAmBQfAnBHAAh0RGQyQhEEAAIIAATeQJAOc8/9EIRv+Q53//8//+c5CEIRqnIRv///6nDgYGc5yEIQn///kb/U5znP/7Hf+QhCEIQhDnOcDAwMWgGBizh48/P8z/X79oEAHueqdTEUUnM9DtGyrOXHnspeyRotXIrQi1MeMWxk2V0KIuEfzgkfdoTo0+/QTpX5os9tBFzd+q+d9K0/ugxmfbqozt/RqC23TpWEBP////EYXf///4HkGV2LvJqZd5Lks0EP/7UsQFAAvBn4P8w4AJdrPvPPGd8c/goJBydicHa505PUrcHumj5hysaNZ7Dxur48PnuUVTypQ5z+l9DjjnRlb69elxWPHP/+rHX1zldjpyHUQIhHL0d0VP////rio9EVHf/////qITlMmqubqHZrYDgATEI0vI1QnsdkZVo9pzFWncFhq9EbkRtpD0zzagwgcJHQUxKkqu5LT6axD//dBuUJf/6nnmITdh1WZJpAhGw+SrHhcQt/////9zhsYn/////7QWn4q73Lmqh2jlezAa//tSxAUAC5mffeSU88Fss694wR4qGXCIVHw+BISHyBAckZLH0qd4whnZFY3IxUNexSCBL82fa/lV+tk6gOBjh0pR7qOFzi53cppnSqnnmYr6nHDkdHmhCNDkp3/////Uh//////qD52h3ZVRDPqqUL5XB4WmIgkMdjhQTExKgL6JG6x0NWmqQEACQIKAieoZ+jBRgM/9mXcy9dflAVRVbVjz9qOa6M6X57mnGocdWit5oihP/7///U9P43If/////yodZ3hWZkU3GiiQE0c5uj3/+1LEBwAMCZ1757Dr0XgzbzzBqmBE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///qRAY6TNYplZzSW2hwi4nSoTpUJkstFK9YXr169exbZq9rWta2//rWtbWt//WtrWtv//FrWtb//4v/+1LEQgBJ6YV1rDCjkS8wq7zwR9la1rf//FrWt//SSUbGRdPBPkWPgoKFDVJZZbbLdrQAlOBijdP1i9h5lc59F+Nqyi0cJYwzE+86ZGllOEe84RMINA7Vh1FpQixRBo8diZ2k1ex50ozyavdp0o2////////////6uEVe7NbZJJJJAAIqIyYODlJ9RVJFAoJnVSxESkOzhWse24FdY/g0KyTGNQYKGJkbLDRUQHHgmoNylnk5AKMzc1sspKbhH///////////0YVAQwqRyKZYaP/7UsRSgAnxgXWmDK/ZSjDuNPCWsnd2a22MAFmV0EfKEUOwkTtzRyHLShV92FmfPHsiwFyML6qi9dknYR8t6hoSHpl505Tc7OSll9///////////////9O7q5VKEAUDmDykVbsVcTDstu/uAD/Dacp3ApgiWZAsKdcEe2QW1laoFZ33rajRNGgEpTu0SBA2iZyOMLMkUFo+Rn7+/g5TcnQEs0l///////////ctTQofUeoiimhkaFQzP//At/RPNt6GBKSOwGnNBhqldlnMelmB//tSxF+ACh2Hg+eMUbFCMa288JZ4swZxFNqpMQd3p2U/aml0JPLSGvfIoeaXq2/53rR7W2dWrT72tRHT//////////u3OxBxzNJvDssurGkTwm4DfWars5SNDjnXYReYlMs5GpEu5gkQlHswEGBi3P9o6JkqwjK97/eSZcOXv3rRK+l3sm3/////////////6F5H4epywHXf7oq8q1/+wEAnqeGnhljlT8E3nhDAhB1rzHZTZntSp2oNgpyIraPOqg4jc3JoytUGSUrHfOs2jWX/+1LEbIDKTY9tzAzv0TQv7fmBiip7azmyJ//////6/f/t9P/////o3T1BtLojvszVaqZZLZIAHzGiXqkWnBXOK1ZhKIyJo714+fxYNass4Gp8hJgVZRCNDIFpvEcRHNZz5Iv/U/vsp8s89/////////8xW6nt4hL+pDhytc7Ny3qnX37awBRTVPJVSqplwrm5to5j8Lg83JmTeN+tYVb7busQhgtFKIOQgj5TJsplWsV5oyycuZz8ZP6N+vPlzL3/////+n5fxD/B/hX3/2cscf/7UsR6gApBgW3sDLLBOjGs/PCeeMbaQB+rKSMhj0Qi4pVH5Smp0CZhRxiHszKZObAfrHN35mZnrecuPsLMv3dwmEDZIsz3E1mpE8p2s//v//L/1/L////87fp/DeJOG2h4aHNGR1ttoA2sCoGwewDwCiMkBZgRoCyYCggDe5TmhwzqdVKSxmjAgvykOaj+uzuWdGunol5dKp/VEXR/7aovf/9dH//////9f4I38H1hlnmXeFNUcUkbAZ9rCWRhYF4eKYbPoROCpppCWUFe4ZGl//tSxIgACembaeeEVcE/L600wJdiTXpKJFuvN/0crhGaqJ3IRFI6yO1PZ74zvGNb+2jUlVP/op2Mv+v///+X/L/gvE/sjX67ykptdZKwGsC5PHVyAeQkREK6kVi3SwmMMIJlP7jn3P9q1VJznr3P8JhCJWWX/Jxlm8Vfw2bwGJ+iy8sgiE//////0KX+pv+B3/xj/0EjvOb0XIlHuutgCq0dBUdHpyKw4SsXjVQuwfQoAX/VtBBzz1L1BByRuQoYR53O6gKPELn7Ol2L0NIqImn/+1LEloAKEY1p5IxQ0UIvbTz0iOJiEWY2Z9l/sx0fo//6SJ///kVv+T/qCf9A3/mHqjiaqcxUb67ZwBfOpPWm6PAJgc4gRN/o0VAFH8s16rdNM8RfElDxw+//tZ7/vZ1NDkUF4OaFXrXn74azmFSnev//szGMY5fspenqQ5f//9TGf/Qrf9AL/5X/5RVwnZLq5pJJAAGqHKJqw16oCQU1LgEFGFRqpKqlOqqqTeGAmY9avMKMMJeoEBGM/Uz5S6mUuZQFuuUpfqAiQzL///Uv///7UsSkAAolpV3khLlBXDTq/MGV+E/2yl/+b/RQEER2/QCFf+BATwBAJQohNySGOfSOOk5juRasC0LMtBVSz0aKEgZlw8cjZZesFBAgcfNBJsWFwzgIVZFRQPaxZsWF+oVxUU6xbUL9QrrFP6hfqZ//bULKTEFNRTMuMTAwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tSxK2AC3GrTeMgscFVtaa0MItAqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+1LEswPJjFzeJ5hrAAAANIAAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==\",\n  duration: 0.529,\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.529,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "door",
      "open",
      "001"
    ],
    "keywords": [
      "door",
      "open",
      "distinct",
      "ui",
      "process start",
      "panel open",
      "menu open",
      "modal open",
      "state change",
      "transition",
      "feedback",
      "general",
      "soft",
      "click",
      "portal",
      "intro",
      "new",
      "action",
      "commence"
    ]
  },
  "categories": [
    "door"
  ]
}