{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-hit-01",
  "type": "registry:block",
  "title": "Jingles Hit 01",
  "author": "Kenney <https://kenney.nl>",
  "description": "A cheerful jingle hit with a slightly longer decay, suitable for more prominent positive feedback like leveling up or completing a significant achievement.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-hit-01/jingles-hit-01.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesHit01Sound: SoundAsset = {\n  name: \"jingles-hit-01\",\n  dataUri: \"data:audio/mpeg;base64,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+lXdLvw6X//oqb2////////8b64BSS0MgABPC4A0ZWEQ4H8jB2VjLDaEtRIJU0HjOGv9jcoZsolmUgP/+1LEE4AKWXFxpiSpwUuub3T2FPqN7kq1jGHqI9VmFNsm7HU7st2e9nacnbLv86Qa4sv//f///////7fNjUdXpJUUbTRBSTomDsRkNUNhN4ZIASIYCml4ticQKqP+2wuZ6zO/exroQZrtehzHPu0Y0rOZHEi0ZGR0qy/lHfnnzULQoELb9NPX/2///////0oNZ/DFjzHtOgAIL4prm0abwlcjTDgmYew/xgwA9ICUpDX+yQn2JRe/Hdm9QeMuhkbXCTl3zmZs25x8SfsK19fX9P/7UsQegApNcXGnpKuBSRsuqPMKWpf0uNFE//13/3///////6oInelz8k3t9xJBSobolw7EGVyeOqG1ItQN6pUCcbmhbRT1ue2eOa5YsmcTeMOqUgcZDQhRUYW+1m5/vsEUObqGhV53ejryVppZzzjrd4EizFtlf///zF1aApBiLAAJUwsrS3TTecGKUtXfPV3jkVvGJy+yaRK00a5KXh8uIavhoSRQeP0mevD/865fnStTtUox83n2/ma/y0zhBw01gc4QMpb////xc761dICS//tSxCoACkTVb6wYbUFJnG408w3grTIAKTmGeBxCSLZTGSci6wvrpUJ1Vr6llnARqX3XeO+FZudr+HsMfGtuEFiVL1SUp9qZFfiEb5F/OoZnfv+/GdDP+GEAZCWjP////+0a9eBaRTdkVSspGChcEUfZUB/EZk8tniY6VHKN6N03rAsXXblT/a4VaggNPOWpocqK9aw6Gc9Er+MjkOAgUJva6A5JQmKOTzOi5bdP///6NNZpz6BYYjdtYmmyitxjuQCQPwyUmTRGMCwl3zazrln/+1LENYAKNJt/hiBysWgxLvTxnwj9rajT53elveto2qYszbu1FjMSLBv3aBaUKkhGgp2/tQ+3TVGe/2T5mehU9zmpj4YOavod/0/////////21HPvVUt/fnUgCpMNYaRJkUnoJgN4ThIatUiklaf29Ph50FdSwrf1ZBjtIa/qlItS5ScRS+t7GddtCtJK0yuKtdSoh4lfbwvIv0b//////////+rxje1IAUAAAGcgI0P5On8zpS1iCAZuR3GD/G7eTkcHzmMayJVu9p1ouIOIQf/7UsQ9gApViXemILDBV5QtJPYZOAxNKkedDO2HV+7egaaLfu2mVhUmMx7Cx4ViRRtlTDGbQEFMTI/////8UeQc7rVbnmSCQVA4JJhcXqGqonb1IF0LHENpsOoCaFnFCLBaxDVZJr+ztCDAGC52otNv0F0EjJe8Sf/WEL3RlNfs2nzBmge6pzgQhic+7f8n/////////pBGb6j6VuPZAJBTjXAmBPlQXJTlQ9gHAY0dHmjc7LZ0sews+8nm5LbjfWhJJofjU07uO6e+tqhbChVk//tSxEcACwmHc0egTZFGnK4o9InqRG2Hm+jIFRtvZfpp7stwcApTb///Vp/+sMUaVCXk8kiACC+Kry3EtjHgwEMQxqSKcSkVSHNWSQ4kDjB7kNuUlnmMomYcErOIGOVHOcjiqJtSrr3HIIlPQhjxZv/6GUQBEsPJRIDC4cee93////yzdVzIAIDpazLDFbnv/ze3DFH5jL/KDBiUH1v8DHKwM4RSMcERUT6H6kcZE9wsRAQlA7XEDkJTEyLxR8LBAJAgZ4uBgB4FhsxOKf5Dy2H/+1LEUAAKsMtvtPKAAjm0J8c1QACXQviGAibXkytvwKhAxSQwXMOSO0zLyT//D0hOxGsIxEATI+pFtaP/5kXjbMatH///0dFI2StKQhMLiRQ/////NiaNl4Ajy5gLBoNiml1NJGSy3HTdaWzhWB09rM1EUqkoUqa9lute1pBsqtlhybPbl20zh1qV05tMzJesXyq8QlwlT+eZWtYpFqtR4XWsNS55kWu8AbcGamG6JypfvbbhgVICGYXhQAlCsfL0CFyXom4jJGjAYSbaQKQsY//7UsQ8Awn8vNo9hgACNRdYBZw9ORq1cZ3PCMzLGQM2ZlsslSyyuBhFMaKHVzMZp5DBNpDVFjVY5pJFML6ePVZBMnCzWPUOXXZQNYh22oqzw3QcTp2xhIXwgeIEDxA8SYeYeeYe573Pc7//jLTLTXed7zvN5/v9fretKjuEyHaXglylixTmXmmLBozQZn044ljL1jUp7WRFJkTCQLZFkpzs9ThIvK87OV5xI287fPlYSdE5ZEpLCR6NJUSJKi73mOWONUxBTUUzLjEwMFVVVVVV//tSxCsDyOy+uAeMzsgAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=\",\n  duration: 0.506,\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.506,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "jingles",
      "hit",
      "01"
    ],
    "keywords": [
      "jingle",
      "hit",
      "cheerful",
      "positive",
      "longer",
      "decay",
      "level up",
      "achievement",
      "ui",
      "game",
      "notification",
      "alert",
      "ding",
      "chime",
      "pop",
      "playful",
      "feedback",
      "element",
      "success",
      "reward",
      "milestone"
    ]
  },
  "categories": [
    "jingles"
  ]
}