{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "card-slide-4",
  "type": "registry:block",
  "title": "Card Slide 4",
  "author": "Kenney <https://kenney.nl>",
  "description": "A quick, soft slide sound for a virtual card, perfect for swift and quiet card movements.",
  "files": [
    {
      "path": "registry/soundcn/sounds/card-slide-4/card-slide-4.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const cardSlide4Sound: SoundAsset = {\n  name: \"card-slide-4\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.457,\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.457,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "card",
      "slide",
      "4"
    ],
    "keywords": [
      "card",
      "slide",
      "move",
      "drag",
      "reposition",
      "game",
      "ui",
      "quick",
      "soft",
      "quiet",
      "paper",
      "interaction",
      "feedback",
      "adjust",
      "shift",
      "gentle",
      "subtle",
      "smooth",
      "transition",
      "minimal",
      "swift"
    ]
  },
  "categories": [
    "card"
  ]
}