{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "chips-stack-3",
  "type": "registry:block",
  "title": "Chips Stack 3",
  "author": "Kenney <https://kenney.nl>",
  "description": "A slightly more pronounced sound of chips stacking, suitable for a noticeable increment, a game action involving building a stack, or adding a significant item.",
  "files": [
    {
      "path": "registry/soundcn/sounds/chips-stack-3/chips-stack-3.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const chipsStack3Sound: SoundAsset = {\n  name: \"chips-stack-3\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.371,\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.371,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "chips",
      "stack",
      "3"
    ],
    "keywords": [
      "noticeable increment",
      "game action",
      "stacking",
      "game ui",
      "ui action",
      "confirm",
      "clear",
      "distinct",
      "game",
      "token",
      "counter",
      "pile",
      "medium",
      "precise",
      "build",
      "collect",
      "organize",
      "positive",
      "important"
    ]
  },
  "categories": [
    "chips"
  ]
}