{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "door-close-3",
  "type": "registry:block",
  "title": "Door Close 3",
  "author": "Kenney <https://kenney.nl>",
  "description": "A distinct and resonant sound of a door closing, ideal for emphasizing the closure of a major section or a critical action in an application.",
  "files": [
    {
      "path": "registry/soundcn/sounds/door-close-3/door-close-3.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const doorClose3Sound: SoundAsset = {\n  name: \"door-close-3\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.714,\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.714,
    "format": "mp3",
    "sizeKb": 6,
    "license": "CC0",
    "tags": [
      "door",
      "close",
      "3"
    ],
    "keywords": [
      "door",
      "close",
      "distinct",
      "resonant",
      "ui",
      "major close",
      "critical action",
      "modal close",
      "application exit",
      "confirmation",
      "completion",
      "transition",
      "feedback",
      "firm",
      "impactful",
      "portal",
      "system",
      "secure",
      "final",
      "powerful"
    ]
  },
  "categories": [
    "door"
  ]
}