{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "switch-003",
  "type": "registry:block",
  "title": "Switch 003",
  "author": "Kenney <https://kenney.nl>",
  "description": "A distinct, digital clicking sound, perfect for confirming a toggle or switch action in a clean and responsive UI.",
  "files": [
    {
      "path": "registry/soundcn/sounds/switch-003/switch-003.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const switch003Sound: SoundAsset = {\n  name: \"switch-003\",\n  dataUri: \"data:audio/mpeg;base64,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CIbDAaAcAwI4AtMArARzAWwD0hADlysoaCyek3c5nrPX71MyeDVKlJgoBQGAQCwWBi0onGNEDADQKDA8AcdSYLYPJLMpdLZVKaW5Xwv3r+INCQ0aCrT3//+z///////TQNtAoFtltAoFAoFAoDBGoE/Dey+ayrDGYNjH//tSxA2ADe0/cbkGgBFzIimrIKAAh8guDwKOI3RC14XklxyCwLOb8cgXsYcl//EwHoSg5x7//lMcg9DQc49//83HoXDQe5fN///yULhoS5fNyULhp///5fL5uXC4aF8vm5cLn//Lvcm5IAEGECEAgFA4EAIAYNAKSvLcQRI7w1cJS8JoAHwKpEIr8RRCIke/4lAUgvhiDb/4skQihaIRE//jUoIouo9Lf/5QRQ/PESMGHwv///yjSE6RG//XPFWBUqIv/+eKqj4eTbAzSshYMNv/+1LEBQPH8DLWHfMAAJkGWoH8JADBPDAnwK8wZYFdMCaAIzAEACAwF0BKMAVAAC1JgCAAO7l6rUlmPOFOFWK3/////T///////pPzRAXDACADEfbAofDIuBAgOn3zXQot8Wcq2c/////0////7P//pj8/QC8SAXwVi6JiEUiZECoKgqd//////T////s//+k/MsA1DAEMdSkOqQSBoMNIHLhY4ab/////6f///9n//00/PcA2MAOACkaXUe0cCKDQdJf/////0////7P//pPzTP/7UsQwA8PgEtQPwSAAgoNagfekCAlw4A8QVa8KmhOD4wWVac+AOFf/////p////2f//So/OcCgBwDiE+XZlaVOq2FnZD/////6f///9n//0n50gQosAioCrAoBkA6CSR9CRCRox/////9////9X//76kxBTUUzLjEwMKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj81QKgiAHwVA/Bl//tSxG4Dw7AS1A+kIkCDg9qB9KRIoBHQRoz4IOR/////9P///+z//6T8+QFEwCEAFY23kGjoWDUVkTR4FXf/////T////s//+mpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq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\",\n  duration: 0.500,\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.5,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "switch",
      "003"
    ],
    "keywords": [
      "switch",
      "toggle",
      "click",
      "digital",
      "button press",
      "ui",
      "feedback",
      "interaction",
      "activate",
      "deactivate",
      "on off",
      "selection",
      "confirm",
      "short",
      "crisp",
      "clean",
      "interface",
      "menu",
      "control",
      "tap"
    ]
  },
  "categories": [
    "switch"
  ]
}