{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-glass-medium-000",
  "type": "registry:block",
  "title": "Impact Glass Medium 000",
  "author": "Kenney <https://kenney.nl>",
  "description": "A moderate glass impact with a distinct resonance, ideal for confirming a medium-importance action, an item drop, or a noticeable UI state change.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-glass-medium-000/impact-glass-medium-000.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactGlassMedium000Sound: SoundAsset = {\n  name: \"impact-glass-medium-000\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.540,\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.54,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "impact",
      "glass",
      "medium",
      "000"
    ],
    "keywords": [
      "impact",
      "glass",
      "medium",
      "distinct",
      "resonance",
      "moderate",
      "confirmation",
      "item drop",
      "ui state change",
      "clear",
      "fragile",
      "positive",
      "solid",
      "noticeable",
      "feedback",
      "elegant",
      "click",
      "tap",
      "success",
      "interaction"
    ]
  },
  "categories": [
    "impact"
  ]
}