{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-plank-medium-000",
  "type": "registry:block",
  "title": "Impact Plank Medium 000",
  "author": "Kenney <https://kenney.nl>",
  "description": "A solid, medium-strength wooden thud, well-suited for UI elements that simulate physical objects, like closing a drawer or dropping an item in a game inventory.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-plank-medium-000/impact-plank-medium-000.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactPlankMedium000Sound: SoundAsset = {\n  name: \"impact-plank-medium-000\",\n  dataUri: \"data:audio/mpeg;base64,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Xg/R1Y4PTorCtp8eF5YWL32eXPcijih8cWjmDHCmGpE9Rdtb26IQTRyBtZHP846PhINySJ10O/Pvj/kr9oF2+fXDfn79rqGZI1D5sv/7UsTpgAoQWQ8tGGMptibfhcSNef+ndufM/IXw1ADCZPp22xzIsatQUBMSAoWGSCUg1DSTvK5aMVBJBJCKgUNUqbqzNJkNbZ50cuVOZjFZu5r3fd2oY02rKSVleXuXmolq1bCyweuZ8GgkOOy1/PiuxgWqSQCiQlcZlD3PQ5boQAzt7IVDsoUHYgGaEXtUqhaIxDPFm1UwyiRUkSrlWkJ3V9V6sNlCDoqxQrnHKJsDBQQ5Yxe6Yr6q3tUExzB7v8zJp5+889uEAFKXnO8EZeaz//tSxOiDikRFBG2kw0m6rSAJtIy48Uyn3fIdEAYCAacDH6WEPG0Bv426u4JkL4vJH6JEoPCwrBknYbPhYiFWd6yJdZpEutiLWaTtldA/Ic9Pzl1SaSqESwowp6F1dV8KoC0L0eoEYV7H3/KQGkU9TOhSkikPRLcrDQTCsxIFageeS1ypV5QO6safWKRXtLU7WTywYmjQKYHUSKX9x0Sl2iUvKNVpxqkjYSBTCCyLWolcKJPKFI5m01Qy+5bfR+b0tt+lpUeZHmtoxs3/y7lJEGX/+1LE5gOLSKkCDbBlyVojoImzCLEAqCxqBAXCQIQUABe1Oi3X5MxiConFqaXAAAmiSyBfvijjCqWGcwged0jLgqHejn30cSKunmNLIKWIctDPq2pSqXlKVG8xqFL6GNm/Q0wYCNQuY3MUtSt/0AnUKAlRHBIrFkVVAY9mMHVjLAhGDTqQoR7ZkUguBRnUWAt6KTR1ohRIQf6mWEPXDKq1OxOleIIhYIaGCwJELBDQ5ApEeQNTIFrTMNTIFpIHmrIF0gfSBhdIH0q2pA+lW2WfWf/7UsTrg8yEyPgOJG3JkKGfAcSJ8G2XE5bZcTsNlxOw+3EpmPqB8pw+weEEUgcBygYQWRxgOQsCFkcEMkLKkU8iSciqRSTkJyKxZJOjkLnAJhHxUD+BEuG5NKyQ2MYI1rV3Wae61frQg6DYCJBQ0FQELAIkFTITATR+kWNCg+M7LeMZ/XHp+MT/9DP9qkxBTUUzLjEwMKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tSxOUDyp1A+A4YTcGBJ1xB4wm5qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+1LE6AOSNQr6LTzHiPcG3wT3sACqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==\",\n  duration: 0.779,\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.779,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "impact",
      "plank",
      "medium",
      "000"
    ],
    "keywords": [
      "impact",
      "plank",
      "medium",
      "wooden",
      "thud",
      "solid",
      "ui",
      "drawer close",
      "item drop",
      "inventory",
      "game sfx",
      "feedback",
      "physical",
      "chunky",
      "dense",
      "object interaction",
      "confirm",
      "rustic",
      "short",
      "wood"
    ]
  },
  "categories": [
    "impact"
  ]
}