{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "select-003",
  "type": "registry:block",
  "title": "Select 003",
  "author": "Kenney <https://kenney.nl>",
  "description": "A distinct, short sound indicating a successful selection, ideal for button presses, menu choices, or confirming an option in an interactive interface.",
  "files": [
    {
      "path": "registry/soundcn/sounds/select-003/select-003.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const select003Sound: SoundAsset = {\n  name: \"select-003\",\n  dataUri: \"data:audio/mpeg;base64,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AHgP4wEVJwqjlaE8aSiTydOU0VSnkKJ6oEEGkGpFKEoPWbBJB6xWhEZGRm29KAiWlOF3v1SQKYu87oBwQhUOAMIgQmRCIWIA+KiepbaHdX8uV3h4l1My64HAI5zp627arC5KzBaP8rBNc/ctNptadla0hrF6Rk/B8D7x//tSxBUACd0ZaeYEerlJECe0Uz04UA4eVJas7a///r///1m6UPWrDVsjlBB0dAYIMpoDYRXc0EUPQECi/2oAIfBAN+b1uuCoNolBJ0apmnuzVv2v/zcoSzQU6nVChpoqFMISLcMEmRcRD3yghqB38qwjYqdWIfOyrlf/4KgqCsSnQ6SOgyIzJg1G3oZVAAAADkAAAAAq///+rUlSdGkjmPrOIseLZFSgUykKUPkRIoVCeL4noY8AgwsNAwsLESS//7P/9+v/rMlplV3ocqOVVCv/+1LEIgAJSX8pqQBcgS+vozU3itEUpQoCwCKArGowqAAFIAM2tHRvvq99v9L1/j11CfK5lYoa8dT5XH8HES1xsT0lukNeI8OI+2Wxf////2/an6lb//9P/2//lKhn1LaVuV/ooUCHKgAAS0EAAGovkI1FFFVS2hJ75+6dSlyrQjLq7Kc1AIQD0COgNoP4yqv/+yar9bbbf6/10l6X/SdSRun6k//7K1I////rU5cGosC5lgASQkjkASQQDak5FnqoyIT8U0QhMn006G66f/8xnP/7UsQ0gAllgvUrBavAuhBfNcCUegYAnv/s//6CX9f/6v/5YsDtPtxBSzA+gRsi+rcKSV6Mj3BwzkP/////p///////0n19hHhgFADycarCMTIg1MYcxaJUCpaRCRpH/////3////1f//vVF92MwVUDOPrYMZUmtMI24DtefBByP/////p///////0n1wgJphA4E+eyiaQWXRiD/OUGo0ikeBV3/////0////7P//pVTEFNRTMuMTAwVVVVVVVVVT7pQBQwKkBHOTUTHQsIC5IS//tSxFWDw9wSwg/h4ACVgxhB/bAIAOHiuixw4JzX/////0///////6T6/wkcwCYEyPuQoPVKu0KXYHQVUHf/////7////6v//3o+3kEwHgiQ7xIHAEwUBWCV5XBMcEYnXeFGW6IyerUcRv/////3///////7wCU25DvYQMEi0+pLXuMoAhIQcU0afTOAuxdjXCYySwIAQEQ8hJYliWZuQnYliWZv4sEsnn7+HBgYLI2DgkEw8cbOyYYHnNnZmZv82dmZPP/YMBLJ5/7BgYGDljj/+1LEkQPEDBbCD+WAQI+DWEH9JBAkCQTDzl5mJBMPKnZmJZm/p2Zk8zX2WGBPM38WGBgeOYcGBgeOavMzA8c1eZma/215mZr74sPBLM32DAkEw85gwJBgec2dmZMPObMzMzX+vMzMzX+wcGBmv9gwMDBzVhgYGDlWzszMFlV5mZn7+HZmHvAKAQxoSKkwxjDCMUBAEwabYCpkoMxIdmxBBEDoiroSSIIik09gJRJEkxdw6MjI+ri4yMl1tOQYBEtciRIo7JEiRRyiREijlEiRKv/7UsTEg8SYGsIP7YBAg4KYQfywCPRxIlWyaSJV5NIoz5NIoz6ONmfVVW+qqt8zVU8kSM48kSM41HGzjUckNhBR2IMdFBTYoKbCCTYQU+EFPigz4oK6KCuhBLoQV2pMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tSxP+DBWg0wg/tIIM5NF8NzDApqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+1LE4IPSKRz8LLDLiAAANIAAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==\",\n  duration: 0.380,\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.38,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "select",
      "003"
    ],
    "keywords": [
      "click",
      "tap",
      "press",
      "choice",
      "confirmation",
      "menu",
      "button",
      "ui element",
      "interactive",
      "feedback",
      "short",
      "crisp",
      "subtle",
      "positive",
      "game ui",
      "highlight",
      "activation",
      "option",
      "select",
      "affirm"
    ]
  },
  "categories": [
    "select"
  ]
}