{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "dice-grab-1",
  "type": "registry:block",
  "title": "Dice Grab 1",
  "author": "Kenney <https://kenney.nl>",
  "description": "The sound of several dice being picked up or gathered, perfect for a game UI when a player prepares to roll, or selects dice.",
  "files": [
    {
      "path": "registry/soundcn/sounds/dice-grab-1/dice-grab-1.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const diceGrab1Sound: SoundAsset = {\n  name: \"dice-grab-1\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.704,\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.704,
    "format": "mp3",
    "sizeKb": 6,
    "license": "CC0",
    "tags": [
      "dice",
      "grab",
      "1"
    ],
    "keywords": [
      "dice",
      "grab",
      "pick up",
      "gather",
      "game",
      "ui",
      "tabletop",
      "preparation",
      "selection",
      "rolling",
      "game turn",
      "player action",
      "short",
      "quick",
      "distinct",
      "casual",
      "playful",
      "interactive",
      "metallic"
    ]
  },
  "categories": [
    "dice"
  ]
}