{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "card-slide-3",
  "type": "registry:block",
  "title": "Card Slide 3",
  "author": "Kenney <https://kenney.nl>",
  "description": "A smooth, medium-length sliding sound for a virtual card, suitable for an unhurried, controlled movement.",
  "files": [
    {
      "path": "registry/soundcn/sounds/card-slide-3/card-slide-3.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const cardSlide3Sound: SoundAsset = {\n  name: \"card-slide-3\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.598,\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.598,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "card",
      "slide",
      "3"
    ],
    "keywords": [
      "card",
      "slide",
      "move",
      "drag",
      "reposition",
      "game",
      "ui",
      "smooth",
      "medium",
      "controlled",
      "paper",
      "interaction",
      "feedback",
      "adjust",
      "shift",
      "fluid",
      "gentle",
      "soft",
      "transition",
      "measured",
      "flow"
    ]
  },
  "categories": [
    "card"
  ]
}