{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "cards-pack-take-out-2",
  "type": "registry:block",
  "title": "Cards Pack Take Out 2",
  "author": "Kenney <https://kenney.nl>",
  "description": "A crisp, short sound of cards being taken out of a pack, ideal for a UI action confirming selection or removal of an item from a collection.",
  "files": [
    {
      "path": "registry/soundcn/sounds/cards-pack-take-out-2/cards-pack-take-out-2.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const cardsPackTakeOut2Sound: SoundAsset = {\n  name: \"cards-pack-take-out-2\",\n  dataUri: \"data:audio/mpeg;base64,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HIB2PkJwPQ/YctD+mYSkoHyODMA6NsfCKjqBygsbJPCjw6wiqHEHjzqxRKBYVa9I8FQPUkq0TCgBUBJnYwe53Qqw7os6IWs20lUKTu20ZdUoOIAwAbD0JrhWbHg/FgxHAyPCb79TJZBtIo4K7kZPqaRimr84rEZ+oR4UYPMIU55pZAXii0CRCFXMHfr/+1LEd4ALCFFLh7DDQVSKKTDDDYi2lkd2jKr19ydwhb1oqdHJnqCFlAYE2gBFJ5ALYQCQLCGuNQ4H88Ds89LQnAaASQ4aXVl3SRus8NGrtlXxLgRMAcAOh0oIM3aKTw5IBNIFlJWaa0+yqvNpfUY0JvMJWIbqgeCfnjsjVzmsTPCACR5rCMj1r65JRBCpWiLroNSKRAIBZLJIGsjGQcYY9dMytmUZXDb2Cixpx4xbWLywuOFktakDNJsxTXHpBWGuPEtyV6pFiH1W6JC3WqmhSf/7UsR+gAnseU2HsGHBYg9pMPYMMDqSkJKASHCkgMTDyMTAzD8KFF0NcfOWKa1qFSHlIiLOTqmSlcq3CrASsDIsWXIsW1NV4E4dGPgZIZwuLyQ7UffellwC3HK93mKkoBVU1Mh+OvUOSa2QZCERMCEGQWgmNFVStkdzMkp05bw04gDEjDUf9+vnfvHdR0dSYQNYuLNLl3oPMUIESrHlh8hRFFJY4YlKHWtek6Q3t9Jjb7YhlHUbEMAkAgAEAAAcSDgsBNe/5Cl4u6t/uynzDTKv//tSxIiACnhbSYewxMFLDakw9gw489gckFTfhlieMZpYff9UryqFeffNf/1GqFQpTmgxcZi//9gnFhVadj48KXGf//z1Q52X26El8g51jOGL///nI5SJpzhHMy1s+fW384t////07MxnkjXGaMyOML+DB1b+Fi3/////bVS1+AzO4WWPcZWzZBXG93YVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LEkwAJ/FNJdMMAAkWrZdM08AFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7UsSAA8AAAaQcAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n  duration: 0.631,\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.631,
    "format": "mp3",
    "sizeKb": 6,
    "license": "CC0",
    "tags": [
      "cards",
      "pack",
      "take",
      "out",
      "2"
    ],
    "keywords": [
      "ui action",
      "selection",
      "removal",
      "inventory",
      "collection",
      "item discard",
      "card game",
      "game ui",
      "card flip",
      "satisfying",
      "quick",
      "sharp",
      "distinct",
      "short",
      "crisp",
      "game",
      "take",
      "out",
      "pack"
    ]
  },
  "categories": [
    "cards"
  ]
}