{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-soft-heavy-003",
  "type": "registry:block",
  "title": "Impact Soft Heavy 003",
  "author": "Kenney <https://kenney.nl>",
  "description": "This sound provides a warm, soft heavy thud, ideal for providing feedback for a successful, yet understated interaction or a large panel closing.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-soft-heavy-003/impact-soft-heavy-003.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactSoftHeavy003Sound: SoundAsset = {\n  name: \"impact-soft-heavy-003\",\n  dataUri: \"data:audio/mpeg;base64,SUQzBAAAAAAAIlRTU0UAAAAOAAADTGF2ZjYyLjMuMTAwAAAAAAAAAAAAAAD/+1DAAAAAAAAAAAAAAAAAAAAAAABJbmZvAAAADwAAABYAABLFABYWFhYhISEhISwsLCw3Nzc3N0JCQkJNTU1NTVhYWFhkZGRkZG9vb296enp6eoWFhYWQkJCQkJubm5ubpqamprKysrKyvb29vcjIyMjI09PT097e3t7e6enp6fT09PT0/////wAAAABMYXZjNjIuMTEAAAAAAAAAAAAAAAAkA4IAAAAAAAASxU29JyEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//tQxAAACWxROnWkgAGUlWz3NPACAAIUYMWBKgY0DY4kw5kY3SwzQhUDtrCJiKCLsXYuxiDOHcAGCYbJ5+EECNGjbn/CCNGjbB8+XB8Hw/wfD/znNf5QEP+UBAMP6eUD4Aktuku3u232/AwAAAB5R7kgvtTnINNNNshTSQcc0yIKPgocvNt5Yv6AS/HVasHl6P4W5Vw5D/6wosQmKsW9LW1RhgJ5he2re+N31rLcwvcQXv1em/imNZw4wVay96w/wqEgKDTVAAzDFBRnU4mIoP/7UsQFA4t8WR5d9IABUg4iAf4kWLMeWFIzCqASswDIBgMCnAnBoCuMAOAGTAPgE8wCsAeQOfXVihaa/sZFQiW0VNNpYnarFyUnK3Mxiy5lxFAuVLFiIiEIsLza2lannf/Z//+z+1Jjw8uCf7YRpmIkhFBg5QKCcZWhnYrmcSEYuDYYDkEpgEAMRaJXAk1ypQTLBYNK2hXDLN0hrpzSa8aRb6l/Vs+osudOtERFYVcErHp////+z/////2qMh/4tTeKh185ziY0SQ06+sNcYzOT//tSxAqCBTQbFA/3YADBAyMx/mgEwxQZL/LpRyZLa1//////////6v9QDgDBAjG/Km8wmMSpMtUIwYlTByAohJCRCFWg0xocmDiYtf9H/b//9v//////9n/ZLUzNT89OTzEnzrBJDQcTTjgY0EHASoDjcDBiCRh8YFjx1v9H+1v9H/b//7U/6P9n9n//0CYa6GmWZKtNAnNFgUp+wjmuQUeYGGah5iRD0rGQPTKg2A1pu+hH9qf//p/p/6f9H//s/2f6FQEFQZNpY8nz3gph1kX/+1LEO4IGfBkML/dgENWDIen+aAD5oiFRxguaaEApVHiYSAFoNhlTrU/0f7f9H//0o//+j/////0JNW4ToT/CxBA+cXs2bM48pzN1PDSBsykAJhRRROVr1LwK0/2f/////b//+S/s/0///IIAAgAgqEzAhv6PwHFXDrBjzSU1jkn81VOMyKTEwxMFlSlrjWb3P/V/rd//+/9a/9X+v//7///UgPTAIScw+3UBBPxZNWiRjdIHxYq/BK4RX/q///d/3/rX/u////3/936qNHMRTv/7UsRkgoYsGQiv92AAyQOgxf7sAD8RQEQ8ZjOHIj2RNsIMVS6ZpHJTW53/q/////////X/////6iACiQTOiKVQ/nsUAMFUsx+njUWzHsDBGxCGWW87QYVexj/1f9z///v/X//+v//7///VTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAEQCAkjiBieyRkc6GG8HX1JmRQd0gaBa9IhY7txi26//tSxJCCBtwbBS/3YACmguBV/SQKhP9n/T/R/0/2/6Gf//Qab0ltHw3iRx1lqZOmGNGFTEbWFQHPzt/n/q/////////X/////6lMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTZyptQ/2kU0OIFLM3yiPtfOG2M8dMSGWLDzTYGvGnqf+r/2///////1/////+owNRP/+1LEvgIFABsCD+8gAMeDYCX+aABvcyjD76RNI4BZTPq2OVhNSyMgfBoZpLfM1gY7NEf4poapM+GCy+j/6Qz/a3/Z/t//9P//2ExBTUUzLjEwMKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAAACNAAEjZZotUiEc6eEOHFq5hg4MTHBKVtIfeB5MOe5T0fkMXq+3Xqd/jn/rX/q/1///f/7UsTMgwXkGQWv7wAAmoNfgf3kAP//6jAAPgjaAJrQ7fsMsOqhQuhGioVMXlZlBMnnb/MW/ltgpof6p/V/0f1r//+v//7///VVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAhacPF3YHUMjYh0rpmiWodb6a+MZhOYEcoa0JerzXpRV+7Q+gR62oOOrUc1Os//7v9X+v/X//9f9SABIbEdyrGoZiy//tSxNSChcAa+A/3QADfgx7l/mgARs+omZlgYJK4WFQNDIUBRcNXbHIW3DwwpU+/5vztu7GtSb10Svznpb9/4L//7P//t////pVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU80L/WMY+HcjBvQgswK4CUPHRMwoMeXMMIAoNFddj93LFTlBXoaXd7V3Y4TI0fQp3CbIY59yuwqkzlzVV4hTiQbEk4r+Gd/////7f93//pO6Q/NjcrBmo7HXzRDCMKmcX/+1LE1gIG4Bb7r+8AAMSDXuX94AAHgqIxADi1asakIvLN0xAxRy2eGmsDZ3boQUV6+jMrtLOCfpKRWa7AL1l//6P///+3///+lUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVOvGt7D5ig/oxGcCdKA1w/UAAYiVp4cyGLgoNBVDI6iKMXZpLP4x5QuuUm6EPjTbc+O0fT5JfOvsWtkTlvR7lXRmFfxWov/////WR//+7//0nqBKsp8jgiqYfmDhGDgAbJ98IcQpmqlRlQaUA6fqmTP/7UsTeAgc8GvSv80AA+pceif4IIJQ5qG5ZHvyS/2S7Ix0y8LCBGvzesorNZpSKaNuKM1AW6RX/UTw/+sNJb///+J/1f//R//61TEFNRTMuMTA/Big9PIsGtTq91DVw8TKMoDGYWTDcMjBgEUkn9VMwWembP/BuouKis44UjGLGqJFVlK6BxkEBpVqhxF6KokUUBihbnE0cjCmUhv/t//////qBPxb//6P//Wo9WzL1NqAGozTuKDMQ9zGciDEQUTCULjAgE0vmKpxOLasUjOF0//tSxOwDyeC47A/oQ4EWEp3B/ggoILjpBwfGM4vq5hRQkIsYg4XURIUVWQ5hogR0Gldh4k6KjCTn4e53/tI3/9P//+gj+r/V/oVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVQAAk8Z6vPMXzFoTfU+MTqcYLRIMyUNDIJSMYIv+QXKaYlesXBTLMcOsGDKdaYVx+PEW4eFC6i+5IZgLOQQEpMf4X8j///Hd//8Rf/9X+j/afmA45myshpJwQOgCcsaNgiHcWDQWBstopo7/+1LE9APKDKDqD+zCwVCUXUH9mFhboSC1SENLWy2jm4X9iVW9Y+C9/XyVXyt5uEfGr+FOz0glFVsIfvy+5Mr/99/zm///////0ExBTUUzLjEwMKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo+gYZCNwtA+D1xlNXkwy8ITG4IBQ5GgU2i+AxHUZWobbXdwezfZoaro2+3M+XHDRKdhxt5yKdbLtCkIeer4Rn19D0p/0Ho///////0HymGgRsp4O8d+R5ncfGRBWYhBgKDo0AlWv/7UsT7g4stBugP9KGBaKDdRf6UKPQ1mJE/wFn0sO5yZGtdLSkZhMbMwPvISd5+2jr/0jzom8J16z9rrHrF9l7//XKd///////oTEFNRTMuMTAwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoACQPPWZbjRUQoI/zPNhWjNC0xcWMOBy/zg0zyx4QOU5bhxFiUaIzi2cQoyMdizbOzVdHYoJbAyFg/VGg5Kf4L/s//+3//6D+GoK4ygUOqOj7wIoCEvEQcIQNYBMOF//tSxPEDify67E/wYYE8F11B/pgoskgYTSwKPgVOGi4fuF6y9LMNKfWadR7y6NbXIuOubclspBja/yfrrJ5B/P/5Rr////b//9FMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU//pOIMNCCBDwVsyYQMTBURC/7OGVxtuEF1PeiO4dktLan4AchfPrnQZfpHfkxoTcxhRE4sdqkNbpf5SfZ75Jfj2ex6B4+Q3LP////X//+4+F5LAMgGBlDl3EYGE7VUH9blKb/+1LE7oPJhK7qD/FgwTeWXUH+GCDgUZAjE1idbJXlHI6n0xmNHjFGIxDOuOeleWXK0KyxS7KZSJrhcnWjyTvGT//4p//////+hUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVT+0D1QzcgEOK98HJBQTIWKbwJBMjfqjtGnWn8e3Ie3K7dl7DnWkVLGgZF3kXnQbphkmKOkpeKQvCJb9l9NXdL/8pcf/P2N////bz//9B/3xIQZzoBInbnBjgWChYODV/OG+cVl8LwvV52Zvu//7UsTrA4jgsuxP7EEBL5ZdAf2gIBoyuaRIjxahQqVlDmOPUicOOYo9Ri55kcNcdHatOmjdSnmm7ehwmbbQ5////////r/D//9CTEFNRTMuMTAwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqPgyGnDLNADU1ajEBZcmDGqF0Ph+NjUOCiLoKILDj5w0rWchjoNQRRSmF0ESLOUY6MhiszkK/HON9Cf87beNH////6z3/9DD4BhsAyeABhMbIWNgp//tSxO2DyfCk6A/swcEgF91B/aAYpslsSiZgGXBQDKQ8SDHMKi2oukey0e6C/HFujRuCHETlEHI5xnoJFP0P//+Nf7P//t//+io/84akMo4BDTpnjPEVdDQWAn1oMIAoZPdkBEGGCJBguBBUBw+HlOChgu6B9iUIxlGEpIpRpyChQ6LMHMYRZKih14w//7eIt//////4Dvt//+g+eobDMt2HxDGKg7gwogHiMCoA7zBJwM0wKEB5MAVAMgMAsEgAUEAAqC8FxeG8ojQh0FAQEYT/+1LE8gPJrL7oD+zBAU0mXQH9nDD0CsWB4OgoHYhh3BQiC+YTRlQ8SaWhBSQmoqMgylUk9VViGkZJ7CVHeD7Sv0+Xv/3//4/////////4MP////+mAEilMpkWz3bgCAAAAAKZl2TIjkOMYlRgInMTAzJzwGjF7JVJJAzkQMKK9+DYwLSEBwPiVxAMMTjqAXYJ4AGU6oYwBuYLNEAwHdEEwOCwa0RRZILnxlhSgfIQUOBA5yBrsLTgNUVOitifIubGhcPBqAuEMbCEYsoPR/dbsv/7UsTmA4jEwuoP5KEBCJhdRfyUIJo5A5o5RAxziGkU/30LJy6ZF8vHTQunDf/uhZO6Fll4zPF1A+XkzUxQ/+7qZlumpkFumo2Mj5qYnkjI+Yompko2//7ILf///8xWamQAQEAKquzN1gIUYUBE7BQESQYCahQICYCgqWBU6DTxMDRUNKBU6DTwWf////////6w0oOrBo8CrhCCqg6sjUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tSxP+DyiEW6A/ooUHXIt0CvoAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LE+gAY/dkrubmAAPcHlduGMABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==\",\n  duration: 0.541,\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.541,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "impact",
      "soft",
      "heavy",
      "003"
    ],
    "keywords": [
      "impact",
      "soft",
      "heavy",
      "warm",
      "thud",
      "successful interaction",
      "understated",
      "large panel close",
      "ui feedback",
      "muffled",
      "deep",
      "gentle",
      "subtle",
      "confirmation",
      "closing",
      "solid",
      "comforting",
      "ambient",
      "interface",
      "background"
    ]
  },
  "categories": [
    "impact"
  ]
}