{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "card-shove-3",
  "type": "registry:block",
  "title": "Card Shove 3",
  "author": "Kenney <https://kenney.nl>",
  "description": "A short, clear sound of a card being briskly shoved, useful for rapid card manipulation actions.",
  "files": [
    {
      "path": "registry/soundcn/sounds/card-shove-3/card-shove-3.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const cardShove3Sound: SoundAsset = {\n  name: \"card-shove-3\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.693,\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.693,
    "format": "mp3",
    "sizeKb": 6,
    "license": "CC0",
    "tags": [
      "card",
      "shove",
      "3"
    ],
    "keywords": [
      "card",
      "shove",
      "push",
      "move",
      "reposition",
      "discard",
      "game",
      "ui",
      "short",
      "clear",
      "brisk",
      "paper",
      "interaction",
      "feedback",
      "slide",
      "reorder",
      "flick",
      "action",
      "rapid",
      "energetic",
      "crisp",
      "quick"
    ]
  },
  "categories": [
    "card"
  ]
}