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