{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-hit-00",
  "type": "registry:block",
  "title": "Jingles Hit 00",
  "author": "Kenney <https://kenney.nl>",
  "description": "A short, bright jingle hit, perfect for signaling a quick success, a positive action confirmation, or a small reward.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-hit-00/jingles-hit-00.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesHit00Sound: SoundAsset = {\n  name: \"jingles-hit-00\",\n  dataUri: \"data:audio/mpeg;base64,SUQzBAAAAAAAIlRTU0UAAAAOAAADTGF2ZjYyLjMuMTAwAAAAAAAAAAAAAAD/+1DAAAAAAAAAAAAAAAAAAAAAAABJbmZvAAAADwAAAAwAAAqbACcnJycnJycnOjo6Ojo6OjpOTk5OTk5OTmJiYmJiYmJiYnZ2dnZ2dnZ2iYmJiYmJiYmdnZ2dnZ2dnZ2xsbGxsbGxscTExMTExMTE2NjY2NjY2NjY7Ozs7Ozs7Oz//////////wAAAABMYXZjNjIuMTEAAAAAAAAAAAAAAAAkAs8AAAAAAAAKm4BLFi0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//tQxAAAAAABpBQAACEYnp8LIQAAAAAABC8VgNW+Arhz/EFCQ8BoP/jMByg+/8cY2yIF//0NBf/6a0jQqL//3Pom5upv//zRaZvD//9GD7P/8o45Fgx////+hCr8fj9/n8/n9/r9DgYChCQpSbClG+Q78TIYBq7PTQUvLvHDaeYYeGwI1yaC3sQoBgVgGZt1loqjLgdVCBVuByXtayJjJqTBR0A0iD3DjVs9zdASwAAAAwAC08bd8yZnY0WOwmwxoO0MECtKVHd1u6EXAOUOwv/7UsQ6ABNVZ4O5uhIZuSlua56AAoCpEyLn7//hxgx4pcmykThgYn////qZM6boJFz////lxFy47hggQKvWwLScsg0hxEbMgl5MEFBPh6Laqz+QagUq/FJFBBNOsTC44HaJF7t5moZ4sUdSBUPhFIMFiXGq9PqNq7fGQ0VTrx0+l1BQqPWONCEqkfmmpuvn4+vqfX////nm4////7n/dCEGWA4+pdr6q1cZCcjkiRKSTic5sC3j+PMg6RE3YTmTy2oT0hGWny5rDtkfG5Za1oOa//tSxBOADPjjfaeg0LGnGS2o9BpK2Ca/5SszwTQesxybbWvTWxR/oogpJj8mfN3yv9hDPkd3Y6MYWu9cjNvDf2eH2P/09/3yUOWhdwgpn2Jc0hE7yrxu50AISdTJCSZZLmkhJDfG+RbCh5+JpEua0dxriVliKJWYkTiPoQrjgy5aeYXyaPKG3mUAHT+s3vu9/J5A+o2JkoE8Y03MC9vNaLKAGdS3iB66Tnjkt08Mf9wn5Q6UagmiGBKhJCDAvSGVAkrRYAABMDpAGYWM6EeQk43/+1LECICMLUlrp6BWgXCaLfT0ieq0/FtJMaHnRLtXOaUqxqXdNQ42d4n8A9hanvhWeQrdysKzFJFQj8lClL3IcDGojVY9WJLlf3mAc3cn9v///////9Qr8sGBdhEH0TSylZ978yAko0iTAmxFOeadbSYI+5PI5yIWgClXL9D15C1LtwsBErtRIZNTADL+3e4H6Nb8y13eybISiaIghWzTgKveUkdt+DacUJd4oNmYQd///8gt+gHHMKEqqA04VErOlUmjI4kCknMq8EeKdQnMkf/7UsQHgAw9i3unjFcZdKmuaPQKMoiZQ/nCrxbz8T8NJnDEV1G6mbp7P1Ehe9G78c8uHpWcFVFQzzR6Dw0DE2RU2loKefVdD/h0K3GVsL/v/P//6Nr///7/q81y6krlrs4zCFNubpdOVP2wBKMjbYbImRbllDoJnEEjHUpSwqd26ZDxVDnNpocVGqlGsx4A5fMcUMMku+LgSR18Uh8CkrJcoTNxtEjV/PV/egTlK1KF9L/1//+3//T+qjv2KyXQkAqDBxuZPT6QAAG8w6hcyxlu//tSxAYAi/2BaUekrcFpkeyo9JkoUBNGFJiluaMUaYd4MiIIDS9JbCah+NPI9PhUgZY9wXyCOJ+VQlSeZ4+VKPozWxTDItamUqeVl19xI7OeyX+i2/q///t2///zP/Vm+rfxeKteaEHUAEohWdFkAyBcDTDVmUQNLFte0DZsG0AbEp18ih00JVGTmspDp8AxIkFCnjNpKn/zHZDPrYkDJX9/fyRR1JvKksiVcW//6cIlYqx394pdlhUw1uVDoVUVMHV6lRW7pFVlyNDeZSYAqmb/+1LEBoALfYV3J7Cj+YUlLejxitrEXhLE0DJkSExaZPLXUrF8ZaiOTEw/UqKAYwzXZ1qcROyGEdncsqy8p5FzBxWdnYielv7vZtNv///+yeiM3dWd/9691UlVLc6u629Br3tWCyyiBKUrijBbCGK1TnknFcl0Qr6M7Gpk4oH9bRcMNMxMx4sF6jnTU1tj4tw/l7sjMh1AkIpwmJml6nK9m8egtZX//X///zZEbrNMsW4GJRBOTYKfVgcTiYOBNWUEGwoHTSoluxyQoo06EEFX4P/7UsQFgAsBk3uHjFTxhbJsnPMe0McvR1JRWI92nnNgHMg9VfKWVSj5c31c41hcQACYc4I9Plo93rOkhEqF9+7/MnsSIJ//Yb////7fp+hG26Jf2/uYrEREZL7lW1qEv0BECAAAEKGCaGGAnn2YDcumeVV0Otahog0p6aZnOq4U2dMKpiroBDWXzxkivjggeDoDDJEjcvXWcF1LZbUpJ8fsaSXc7Jrq54Ogy6Pqv/////9/0O2Hnnt+3//7LVnv7/3/QtUaqZCASo0wtBidjMQA//tSxAaAC8mTb0Yg9Rl2pO2o9hT6pWkstF0kwFovcQPrc8PLJjStKsGjgOhGNHEPmia2p+cRO5+5YVdoNDpuqry05iWoa/dOjBKqu/T6v1//////2MqW+i2+d/Nmaodb0LemzfK8BblkIABjTYwbh7EINxWEjNAFhmXx+bZLw6nVJjqVU4eXOICkdrEgRldNZHphZQSrncUZjpkMx0yL72b7X6XBnKnt+NZaf////+9aCNR3Y+wzjULYOOuSD6aUbToh3q2qgQJSsUMEmg9DKpX/+1LEBoALvZNzR4y22X8yb7WElT5aiSXTJSAfT5yXDS+tqRt3LrWPBkkXlUn1R53mbn3gQBQ5GqGQzhp5UulBjU9bJ+R4IxHvv+VlpzP//X//vtazf///jFOOZXdtykW+t7bxJIMjTjcZJJJUDbU9uZo3z60swz2LYsgFREI2IieOn2nMBdXKzJAcJGpP8UyzKDbviDWaqCqjyVOx2Tuh57FcJzPZWCb//1/r//q+spzfIgfkQXF6N+n//xSpyKT9fuvvia1tpyOIIkJ7OPiQjv/7UsQFgAtBI2+niLHRTjHgzMMKYBLaQlCUUQo8lKgDSVyHHqhqtetahetQEKmoYGAgAqpTAwESX0Mb5ilLlK30MYz5jfoBARjG/8xSt9/6G//UrfSWY4A1P/8RHSoKncGuCuoAAqNkJlql5adHJWKZTSXreFmN+70dDaq4UwBA4QmqpOc9CWOZkn+S2NJxpZh8LdFs+74P+2rIpa3qb/1aX//06u236sb/LR7S1zZqt0LfzW//+DUACQAPSJlrh82nTVtcdZs9lFtdJ1M4ZTJJ//tSxAyDiu2O8kewT0EXjRqElhmIca12enaYCJ6e6taaezvXf1plDMnUgE4UYKcj5TfVuuaram/8tH//9H1flmflt/mo95q1bVlL0LLSrKb//2EqsUnDbNwJhCjJVnxiwTglIZQMrkYJWARKknzy2khKBLSJW860Wp0QbLCz4TBIkFXVpaFAKR/pb/1/p/15ZOtikHv+AhGAlUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=\",\n  duration: 0.284,\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.284,
    "format": "mp3",
    "sizeKb": 3,
    "license": "CC0",
    "tags": [
      "jingles",
      "hit",
      "00"
    ],
    "keywords": [
      "jingle",
      "hit",
      "short",
      "bright",
      "success",
      "positive",
      "confirm",
      "reward",
      "ui",
      "game",
      "notification",
      "alert",
      "ding",
      "chime",
      "pop",
      "playful",
      "feedback",
      "element",
      "quick",
      "win",
      "collect"
    ]
  },
  "categories": [
    "jingles"
  ]
}