{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-wood-heavy-001",
  "type": "registry:block",
  "title": "Impact Wood Heavy 001",
  "author": "Kenney <https://kenney.nl>",
  "description": "A resonant, heavy wood impact, perfect for denoting a strong, deliberate action, such as saving critical data or closing a major modal.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-wood-heavy-001/impact-wood-heavy-001.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactWoodHeavy001Sound: SoundAsset = {\n  name: \"impact-wood-heavy-001\",\n  dataUri: \"data:audio/mpeg;base64,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9H+z/b/t2+Haj36AlUdSAAOmMPicpzohJjwFQQKYYDg8BaYim7X4BqJAlF0Vx6Y6uc8EwtCJzCEKRSe+EN3OnCp+C+JVypdB3L/p+E/6v//r/1/63f11Pc8EEzGXxF8w+ZNWFCyYOAFTo4Lnickt3IlTOS+/mccW64Mf//tSxFmDiHCe9G/gQoErlh3N/owYq2VTqe1fa+H/yT6xJ6ZTb+2dlmkW7mb5l1f/zWc/MQHP//////oBEB7kgfmYgIH+HDyFgEBN6GXkJFhguBIwo8cdfxQcG3V5XRDjRd3c6xO3pM1Lvo3mtA1R9Q5Rmsy3jCiaG3wOFp6+vx537P///9v+hSAAAIjligM8wA0DvBQJIRADSoVXP6/9BGCwsSfY2lP+zhyk8jRJeWm83Dy6vZXWzocmV6OPoCctxUE1HLI9GI/rwQ9G/ziP/QD/+1LEcAOJSLLqD+zBQTEX3U38oBAd/6f8l/kv8meEYB7mEpA15gMoA2lApVB1K4M/SzVe9Nyyz9ANpAxzAo2nPQORK+ukrUujpkRmU0GS97OXrVOIbkFvN9qvsg5gx0M8Zjc47Qd/lEG/6ALhqjqeAJswgUEGO9FCYMTifgA6gPMSQkVRUR9EEZjLiRHGVMGxNxB1VaW9o5rQY3Vl3Y2pUt1HqVN5zkrxjmKTf+ayfG191//4wVou+oOiQ3cgMxMLQEiDCwAXYwQIDaMBEAdTAv/7UsSCg0os8vBvoEnRQB8dgfMV+BwE0wDUAxBIAULABiii9W3n6WzVv1xzyotNnMYKREc4MtWW51Z2VciXaIIVnZEDoYq4FYYub9FG5T//hHoICSyiR2Wy2WSt5LgggnROC6YrxW1iP+XHEggxYYMUJ++XPS7JlAx80/y4693VBJP78YCHqGIthURer9f6aimCYEgFArDMJTp53/8t46LT5SsOvFIlhCmLuf//35G1+jsSOGFTUCwzvsCeb//9/2xSWPll22+tNEZ2Iw7Hv/9c//tSxI+DybDg7g/tAEFIHB5CviAA///efbf8/DlXVrKmr1u0rv/KgEYoce/7vWCCWnIWAMAINariwqZWRNPUeER5YKzsqdEp36jxZ/1nfgrLHuDX+JZ38GvPFj0S8qdKu+WPFvyp3iVMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+1LEnYATDP09ubwQEOaDYo+SMACqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==\",\n  duration: 0.310,\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.31,
    "format": "mp3",
    "sizeKb": 3,
    "license": "CC0",
    "tags": [
      "impact",
      "wood",
      "heavy",
      "001"
    ],
    "keywords": [
      "wood",
      "heavy",
      "impact",
      "resonant",
      "strong",
      "deliberate",
      "save",
      "data",
      "modal",
      "close",
      "confirm",
      "success",
      "thud",
      "profound",
      "weighty",
      "ui",
      "feedback",
      "substantial",
      "final",
      "important",
      "serious"
    ]
  },
  "categories": [
    "impact"
  ]
}