{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "card-slide-2",
  "type": "registry:block",
  "title": "Card Slide 2",
  "author": "Kenney <https://kenney.nl>",
  "description": "A distinct, short sliding sound for a virtual card, suggesting a deliberate movement or placement.",
  "files": [
    {
      "path": "registry/soundcn/sounds/card-slide-2/card-slide-2.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const cardSlide2Sound: SoundAsset = {\n  name: \"card-slide-2\",\n  dataUri: \"data:audio/mpeg;base64,SUQzBAAAAAAAIlRTU0UAAAAOAAADTGF2ZjYyLjMuMTAwAAAAAAAAAAAAAAD/+1DAAAAAAAAAAAAAAAAAAAAAAABJbmZvAAAADwAAABgAABRnABQUFBQeHh4eKCgoKDMzMzM9PT09R0dHR1FRUVFRXFxcXGZmZmZwcHBwenp6eoWFhYWPj4+Pj5mZmZmjo6Ojrq6urri4uLjCwsLCzMzMzMzX19fX4eHh4evr6+v19fX1/////wAAAABMYXZjNjIuMTEAAAAAAAAAAAAAAAAkBSIAAAAAAAAUZ3WIvw0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//tQxAAACUCnPRQRgAGUmWtzHmAAAFdAAAAmMYxuQAKY3/IidRE//REREREd3dz4ju7n//X4iIBu5/u4AABjTWD7w+IAQ/8EwffKA+D9QJg/icEAQBD8EAwUBAEwfB+p2yUyxxtvoAAQBUUDileanpCrjLbmAuHtrMQY4Js1UKDlOfZ7F5qXdVwyZI57lFZz3pZGLdt3U4iP377Hx4yH2f+8NPz45hWOPqKmgqdOnIURfKIpThlSF0SzkzfB5IZcXunzlCpsrL64Y0kSIJMFCv/7UsQFgAvFa1/88oABfJBr/PSNKaRAlk4XItS5p8yk6vrtcRY0BVi8DDTIlCCAwWocyld3syJt7FPYjMRnQ7U3QqW0IqV/1tyqirRTv6/rTt9O//vd17/2KbayKdmMrDR4xVQwRifITFbdwqoTiIAIIP0vJwTH4siSjMfPWBQbEDdUmvrmVF3ydHGP8Xgk2MymR/D3S2ERvYCMpA49w9JHfhvJjcssvE+vngSdfn67Dqfpz++rfAe3dhZJr/z35zzPlUj//qdqrd7vupd9c0kC//tSxASACtxJaeewwYGCDa69lI1ohKowFxkDFEAQQySLh6xedjVWAsgliIiqUtiVM0ISpw8GBOUNGloOpQyDZtBAkdPx8Dpe0HGSRA+Nh8QgNZr6P3ULWHM+O0hc0HtCBr/ZLzMzDKrd1ggBnG2UDOI4bjQh36CKPAppDJOoNnAwdAAJNIAQJLSFBPSYXE9KEBJPfRK5q76ZoAH0igYAgIHInDBeGNQIF1g/DHE5/YCH/1O94jKHJPlCIgGg+UB9/xOD9YiYeXZ2WWNIgI6CI5L/+1LEBoAL9FuV7WUh8XsS67GmDLhgCRmKSDfDMvQWT7a+sEQFjykNv0tFpTPYBcJdsFO0aDLIimishQ1edXbxE0ISWmiWCQLUv0IBVwKwaJcSiFxYOho7Eqg4oGg7//+8RP+qDS3KeAAqgQUAAYyMIz4otEXygJMYBxKI5WOAPVWiStfQ0xtZeqxyCOHmsWlnMmNeU2NVKd256jIJC5mWpPhaREdlhZKNKdw4UPJijwxjO1axdxg6eW4KqacYilUqMCvS8jKqEmrpACAKMQFU4f/7UsQFAAsdXVWMDFHBhxlpLPSNICSljJow8sfhdqG5TOR+E00CW413U7ASyXhtfjarzavVWO5e5HM5PMpz6tKZ6SayJsW176OllS9Kfor0Orc37TU11+5mUqf5W+gqbEvDTdozraCAQEAOtJzk0UIxTIZj7VtEncITwMmk2iJUKq+gZgSravCYQg7CnuKzX7iQGkhZxQupQORinxF2kLVBdlO+DxUuBOEyINFjV2HlSe94iFTyBSks8tDVV6CpEPKee9DYtV7Y8mjQAVkqFqCM//tSxAWAC4iVS4ekZYF9Dyiw9I1ZIEfoXICoFAGJDAfFpIQskVTJ4Ih/Um8AwjAkhhDpyl5dOzjVFzjOzmpNKY5BouSOhMYHSr0SLxiBudK5ZGeseXVDghBRWkL2d5ssMKz0NGcGhrnIUQIANj2UQ9I3THNEnJfHqKkOcLhBMZHDRKgUbQ7iRSiVGqyIxKScU/srFd+Dqd2TIl0YADCWDxMJC/99ReBedt0ll4t/57uHfZFS+XAGknVm3f3+378vX553/l+lMVkrJCoAMD8Q08z/+1LEBYAK/JdBh7BjwWUtKDDxinDyFZqQyqZmC5dQrietFJeqvRmT63mwA5k9OsHJwZwnk47ADk1P3nG8pDhJcLWFDCGEounHKeeJi1ri3FOwa2hIoWUaoBxbx11eU4pk0CrRxABQYLFSumFFJFLoYybc1TDw3srY/tDhxnzfi+g5xxmI6HNHOodi0362VypdNK5WHpNc9C6LBXIz0WM9vnVm/b3fT/r/XrRqGN6cdq+vbsm7zDpdTWPHKglDGAAAIhDKXFCUmjUyKZ0ECY4SNv/7UsQKgAo8oztnpGWBSYnnsPKNgLtmTrLyibH0DbOsTGfG+5Ome5fCUl25DFTf+GWksgUcIg6w3cIREZoAVDkWLW1T4vtXZyyardN/DBj7hZobjmKAVBIRSS4Hyo3x1GUnlaxvT+c3qGwuAPg0opxBekeG50Q0XHMSFJUAjg6UOtJLFTNLFJaSC4QRO6iWXU8yIxC6+JDg04wc7RRtobuuxH9iqg2l8ShAYaCNhkLJ46ZEQePDjI0jAhgL9bUCjJzVT4LTdwgOGjYdRMTgx6Q8//tSxBYACoxJO2ekZ0FCCWfw9Izo8DBpRMqfGBMhMK2vKpMKQI9t6GopIrY9NrBMEeerDLZjrSNQaC2pUkVKrI0pVUYJScxe2Y3DyUh1iGawFtHWh9Fhd6JG0gikxHDW4ODoAhtodSw9NjpsFaUFHNNPH1uahTQq0Wc2lJRVliuvytzPl7bzjRVFCLL12wG1SihQI+IQ6mYGA/8nldasCfkcRWhUcywye4UpLMxXWfZmuLDIuFRcjoETjwbRMHDADGRYaMfUEcYfsHDyVFakKZf/+1LEIYAKeFs5Z7BBwUWJZ7DEjUC5Kn4drcpSLbzohEyKTVkbuCkdzSUyAECQHxDV6OhDEY5PnxHCyACGDoODTdKZBCd36eMeULlRhNwABp5k0fOg8lI51Rh7njyt5tR9kIrQdRRol2D37SYxhmn/nZ+7HjDZJSoEOEhkQ0jRRRTBB8DI7KwqJA5naMeiWQ4ag4rVrIEXYjNNZHBHQVSDFoXWnKRhBEmKkBfttZ2kIstzUq22N5brSxdu+69EB7kyMVYFXBoG1yNwTCGgSUXcPf/7UsQsgAnATUPmGGxBSI5nbPYMOBiOhOMFZYPIUoifiZUwtsjgNfdzURAdbNONLT/LIjEjmhMFoZKvFCBROqoRM63C6koGiFLcJVLr8/YU0QxQq4yMtdhkUfHW1XL1pGyrKph4VhWps7fD4QkgkozsllmH3y6kJVDKpADBgoOabPlKklFtaLIFiqH2pZ54VHIBEjSOiyhVsI3qk7EkPP63I+7WZQq9ghCrCxI8o22y1EPCjzALsXwZydMgQZMGxWcGRQFalq6ygRmOkW52JcER//tSxDoAChA1P4wwY0FDGGes9IyocLz0W9OYt9J+e3/+CiP8TTM9CdKZ8AAQKOrmXWIRSnfuftvvRqtah63UCqtSVTn9d602qUCmS0AngsbSMSQHbB+kQ7pl7h46xRbVqFlzZDLEEfm7rYRfTj8ImDGJ4GCqmFs+b/tfL+O9ZytajXndtcLNMV/9n/7fqUZxWapf70lDKaKpmRRIACgaVjmDkKCcLBZPDhsLDAwAw/a00QDRxh6DYDAwTMgnVCDHCxWhJ2WIG1F3CxU4DINgANz/+1LERwAKNMNHpgzSwUsFqLz0mFgw3xS3q192IGKdqQLuejD5ks48nkRRalddu4mSiASoDdIPoFx3JxOoPzJ8oKpIO17WvHV71mntUtaQ2StXTJ8EBPIkaIisvkCUlMK/PPJKAb+ax6/6rz+fzJZfP61e0llbVP1hAB2GpNa7PRpUgAwdonh0Ko/GxaLx6fqivx8YOOByp7QycrELSU/rtazQWQm1TJtiAqNPOEwlDyyp/JCI6podQAYh6J5tcqmmta7qUmojc8POKVgZfidZOv/7UsRSgAopbUmmBFXBTQyo8MGJ4BWERyZAFRABHG1F8WkYSE5nYBl6ECIiNSHu2RdljahWZjQNJLpLxofkS3PFEG6KO584fFUGp1GQFxKpF6xZAd1O7ttT4BaqrK61Y0woOBkQ4R1PllA2v2JOkAWHGlkYthdGYA0JCJaWjA8RGAQS8Clv8L6Wl4y0ToeHkwkZIFkFWHjAwgEra1PYsFabB9u3VLd4xvHi1x1/RXTHQCKih7i+p8kmBmstRKAg+0zwhm8lTRVjwoFMvKiOohxE//tSxF4ACpSZQ8ekZwE8iKgw9hhgYSuCOIzVby83c7oPO9FIQLyEyFSwjk22oGGHgJYaSSY4Vfi6C7Wvl8ikGIg2SmIey9rdPYxiFWuNPDkkjQFB9azxyF4dFwhlckKQodhqR0kCyRe6ooRcJg8TCZ58MEioEGBBT82WtLLKPNCt6kXFHRsi4iFXjTW4Qayyo2N1JdnqjaF2lzYE3IK7ai+1GyVogAhqmAtJeGdYGGQOHDJcnGi5GqKEkwN6hoBsegoW9A0l0vt/sZllsWZ9Z2H/+1LEagBKOFU7aTzBQUIGJ22GGBgImiAleacJEMiQQjDyzL3pQUlR1hlpTsalkPZlzze1mSxMGjtJGH5YWPaxpVKqwaaHgmi4oWlVGyGUoGZSvjmQkLCMFXvVRjMGyR6GlaDI2EMFjyAEEBC8qE0Ez6XW0BRwoJTgYEBUKVil9wcPyCnpa4he5x8fuMaigo7jnikvpQwF8Wpbyb5oU6owNJCw00mEo5iEhCRhsSREPx3qPhbow/a0PPHD8tmD3BqkrMWfnpwG1I4DGwZF5scIHP/7UsR2gAsYhzmMJGUBbwonsPSNiAyFQjicLllJgBZmaYlA+uxxlWjx9z7RZlEfF5ZYxKGLxCkJXSNFqCTfgIZllEi1pFLSSPvo9vVRDQM+1FXSVan6K+7kuXFrnfse6zW9fFb6nXzUXOQ4NHIdMLYohDyIHD6bjciNuWzbkDhxzmNU5NGfYuInMfTKh0PjUwnfrXH6rLCjQBaw09Omn6SRiqnc04egkYADLGatAx2jOV1EftUU8VvyaZXVnWSejuj0R95GZadDV19pNb2Paxqq//tSxHoAC0CBPYewY8FjkKcth5gox1JXu7006otO3pv0081KfmK+lEK14OcOmRpJfW4ogSSUKovJqHcimk/y+H5FckkxrZroacLqcw+CUByhQyUnQ+9lonNq2lv7j83h4OuY5pQtLG5ZdBKdhRMkBFCuoY+4nTNtew1mnuQLJfv61tve8URWlbjlUblljsljbTZaQSGnXQW4vIJep5JyGHGjzwzk9LXGjNK+dP1ftikuyDrFQXBVSN0aaBZoYFA0WiZbcRarDxD1XQvmob1xht3/+1LEfoALQXU/h5hNQWONp/aeYACINo01Ij9gwdarj+2fX1pn687Bemvn5zLbEld4+c03ivzePd48iVrXFrfVf9/Ws+n1Hvt5TX16f/+25fn6///////9K7/9P/70/g4hRoIapQBc400mFAABqHk8VJ2GQQUnZyMiosrlMzuWnIKO44a4IgQsGw8ZL4Itx6plnC6RBlGP8i6DVBHLqsNFTpco88dYgYk9CgNSdNkmpxQO1277mqdUVMTpWsvpaKUBV50oQCLkkyEwzwJikOZeBP/7UsSDABNNhVW5h4ARaRDnc54wANwSaKCYoNGrGVKPNucmRLqKUiT8uoeVjNxZcomZGhT90/6pFkeZvKdBanERCCphYBP9U7CV941vd3DDj7O+E2I5P/+o87v+6EKynx+IIcQkS+AHEX0vaTV5lhaVpsQ9R7UhkK1Pw1GABkYZE2a62spRkkZM8Yne7D0rU85Vk/Ej1KeaX4heeRkl2PQ+31zcInu16MXKVbTKSptQ6TQQOCoy8yoXKh9lO18SO984GY9XIQPx7LJtU5yHMdR///tSxGaAC7y9N2ewY8mAG2ds8w3oHS3IcQoaIXLio1AiJCXPImkYIxZyULInA1wmAaNMT6NO1fu0xPWiz31ykagUEgYMWhbQRrM1KeV+7b6PyZeVeZaqLuPf/83v3tpSWZ6hpo3XpMqnz+8g0rshvMkg0wyftv2xsgebvyz8to///yPBflu122tnQADwGobh/FCX06Vy/WG5Kq9MIRMtp0HweMTPwgoqIe5w7C4werYql6jsWf/JfTWXy4lzK65MhDinMtcjONr0fxb4+6XJrOz/+1LEZYBP8Ys9CDzBiX0cKLDzDdj9JaBrtsw9ibximRtQdYIDh/tMLjaItlVmWNkAEoIpUkFTJfDCRJynsq3HDA3vE5AjjQwMKIAZxcTFCqzuZzORhqrIqGZ3QYJjAlandSZNGO7IvRJ5LEvs6NobbVur+vVTvlf/ZE/8iFruvT9as5SmNuNae763Za7bLr+27RBRAKT2R4tQnpvE6IQhBNDNQ7pkwyMt0I/glIAcMnK0ODkugmHYLCDOOE09VNdXbY0dKXzmypxe/AQJmzK2L//7UsRUAAwxbUn08oACaS5oMx7AAEJtMqUPrliyvbWtnvjtTHLsxvKliwxtvTM63DKujnPPXsS1zL/o+y3zM7WtJmW6xWh6azM7vWtnzMzM585ZvqnC6N1Ux2zMzb44mUym6DFrr1EoalQqCJLizW3/4xjSJFhxJLfP////////Y4llV5lgYBInEkteZ/nPWuRI7JGfVef3mZ7V2qq1yJHTSKIwGjwiwaGA1/6ztUFR4K/g1PfiKkxBTUUzLjEwMKqqqqqqqqqqqqqqqqqqqqqq//tSxDQDybDO/ByTAAAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=\",\n  duration: 0.584,\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.584,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "card",
      "slide",
      "2"
    ],
    "keywords": [
      "card",
      "slide",
      "move",
      "drag",
      "reposition",
      "game",
      "ui",
      "distinct",
      "short",
      "deliberate",
      "paper",
      "interaction",
      "feedback",
      "adjust",
      "shift",
      "crisp",
      "clean",
      "smooth",
      "transition",
      "precise",
      "snappy"
    ]
  },
  "categories": [
    "card"
  ]
}