{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "glass-004",
  "type": "registry:block",
  "title": "Glass 004",
  "author": "Kenney <https://kenney.nl>",
  "description": "A clear, sharp glass sound, useful for indicating a fragile interaction, a breaking event, or a delicate UI element state change.",
  "files": [
    {
      "path": "registry/soundcn/sounds/glass-004/glass-004.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const glass004Sound: SoundAsset = {\n  name: \"glass-004\",\n  dataUri: \"data:audio/mpeg;base64,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SgDx4QBY0jpKARaDjKAAjCkCwCBogBIZBNKmYqUAAFvoAADg5u6K2r1d1wcymSAQjJQtHNGDMYo4TqMjbHIRO/////+6aGXKVMhJAIAhgHATmB+F0YfzyRgDgSAYQEaAnR3EIBAiABbvLiQCAjJIgAUBGZ0ambX6kvlH//tSxC8ACbzRISaHz8kymiRo0foysgIVacxdEKJDELrRHPivMv+nDPIof///////51M6R/2GFnzAkBEMTVfgxaARQEAuXEUAYegQTOz///9WtSABfEgE1L7OtlKLikbI3WyanQrqdk17OiYF5SKFGiYom7umjbZSDNdJjraH////3I63JcqAEOAKCAMTA/AaMIYCsyp2DjHaFnIiGznCjBHBxeYdgZcFANYkDKIcZF61M3ZZ66zgmTzdl82UHzcjLZScobKZQQoAimo9RVQtIor/+1LEP4PLHNMUKfteCaq04oEh2bien//OENFeD4QshAOAMBgQAKBgzAcBhqDaBo/r+BqHCOBkPAgBhCAMAgCwFAWgCgEDPCAmS1f///////////////nPnGUALjRAAAQpsyCK1VKUlQ/vp2/nBtUxYXKSSUlSpPJUhoh9Vvn//////401K/rtLRL7GAQCOYU6oJkDgTGA+AQyWJM5UXbSz////////K6gRVWaSIAyCV6qr0drdWT0zKDLMOEDDsyDkdZHyHNMbBlZClWSuj/////7UsQ7gAnQ0SDmj9UBM5ok6HF1+v//q7q/LHXRQMEQhMssFNiweIhkRzYevggAF3df//+vV///8soAAGnGgAAA8Esgk139a95GV7CnWztZjXYcQHEjkOlpXnZlaeplctdP////+60Rf5nSgqAIwKAUw9D42yhgz/GgxoA8eBNRcQgACAFXbTY8BUKR9SKZcOI3dT1uoyPyROEgHCVzhAakipI0jZnDQnR//////tRV3lbkZR0A4cA1EIXxgQv5GdMFIYAAG4iAIS4HgCjAGAMb//tSxEuCSczTIUaLr8FMGqNFAPn42RXu////////8lUX6SJA1AZUkEVbVLRpUH8Is6dNPgnol3VmUS9FN0SLdd55HP5S3n//////+t3KsteZTxMAYkKhrHDh4ACZEN5fhgCj5CCjXt///d/u///8vozAABDIdusQIwnxHH8K3f/1PaXcHMMm23x7sWZkMyYybZhHFsibS//////xrUsMu0tERgICDkzf+TZhjMCgZ4Ysy1MZ5rPVBJapNogfoKX3zXEUvcJ96j7/6a6pZnqWghn/+1LEWIBKNNEi5o+v0ROaZTSA8xDk++pECEIeZdJmgD+D//////vKscdNPQCiM0Z0zsY/LcLDu+6ic8vd/T//t0///+ImoAAECjdzzoLrpMyKlteqV2ZVs4xndCCg5QYxUQpDqYz2Myop86tab/////yqxp/murGLImDIXGnSsH8IRGBwBqffFrQiB1luX///+sP/1f//IBAAW10AAZHqdZgmpTLehdOq9hoRTdVCYhgpJ9PXKnEzSKHgUyQoYVyL+///////2zLoaeFWQqgSMP/7UsRrAAlQzylEB5pRSZojiNL1+CgYn1Ea8koYCgilQwRZ5a1zL7v//+4XAuT9ZqoyHpmvtoe57JoEAAEnkTIUiKDrUlZa6VveuWWUNmrKKBUSyXohULvE552A85GN962//6DqJscgQHAWBgGa1wBxomAHAcQEGYGbDLhOP///9/6/+qnb9mJaAHUGkAAAXDjsploszdrZnZ53bkAkYUjaJPDAAjS6TCUthM//////9Y400te4AAGYgpqdzBQ6k5cxJAKOf//yVOwwhDv6UJfF//tSxHqAS+jRHyaPr8E1GiRo0dXw+/9zgAACvLcICMzslUy10t6/U2nqq2Hx7zGx8bKRcCInbuHb3lm8Y2HNd1vb/+6JiUh/EqBADwMJ0cD0xDAOAArcg44Avkfb//telpIgnfpU+rRm8hazZ8upVQAAGaUAAACEXWqpVkl611diVS3PhFVPz49dDhWBdswoE9CPodBrzuVP//////+41ZI8aigXC4AkYoWS+jD3fdRocjd//qK3hlzm3MtXybV2VUc2xFC2NLB7kGplWb/o2/P/+1LEggBJjM0bJoevwVgaI+jTVpis2cYwETC0lbQl2oNiPcoMhJXz5V23f/+pdMuEHEKAAgkDPgFA8COQtEEpjnkEDCZE2//7TybNAmXgEWAMo93ctLPr9rcFFQBgG2wAAyKd11V7Vd25pnvwyw4QWJPtie5nsfHRNnJjU1Un///0Ui8TJDhPIEQYBljVAdRDQocmDQth7JP///+z+nT9P/TuVq6QOLJ0UxZmjo0pU9dm3clG4YpBo20F+y+ZmRyG6JkDDkSkL0P/+zqMyGCbwP/7UsSOgkr0zyFGj5GBPpoj2NHWKFgcBj2WAYXFwNj4lAcwg47DR///////iT3XO+kAAF/oAAKR9B1Mtmr+z2VKoIAwjFR0RSI4d8VWW5zIdSdbSsb6/////+9Y2Z6TNnKAA5HBPWFBYDZI+kTXxSf///rmNJlvQhFioT0BqqR6rgRdgBVM0Gf9ad9u3O6WmEAYASwWaMyCRIYAEOBKi2pdFo7rbb//////uNWafFRIkB8QTyZtAunI7cbijhI///+p4TJhuMQ3KrpnO6nRIXbV//tSxJiCSODNISaOsUEoGeSkodW6AEVqKJgAAIENPss10pVkXVpZ8MurItRP0J3QUgdQYQwwY1h2fPVoabn///////vXbEvcQvGa9jmBhYsCNfhuIQ3d///632P/cRLNf/o/6QIgG2gIVFe6ddFdTbW7PhsV1jFGMuZ5UqR7PGQSZkho5mpBnZn//1pF4ukWFkg3EBkqQAWOQXJHspkcPk7///a0VEKy1+v/v+vZxe0AGI3IwACQhLV31vQp1V09KrtMySDigwhXu+gcaVLNqdH/+1LErgBKAM8hJotvwT4Zo5jRdfjBlucju1//9SzAh4dABh+TCCgyZcQTQNv//6jT/tTVWtG1X4vrYqa1OzBMAUlnKkAAQfXWqy3XW7Nqr/V309rxaKaC2hjhigTq/877CWKi1c20//+paLniJCcQNPcCx0SYiBgWSkbf9R3/ttVb//TU0af8epepA5dIAAS0c6c4qvXVdb1fV6slvy22nnM5SyXXm4Tmt9SKC6K//+pFE2LpBg9EDCaFAGI4eMkCgWTJX////qt6t19VfXv79//7UsS8AEngzyNFD2/BMBnj5NHWYP1+p+/+owLhoGTaSvcAVCpGpI0AWAlB7Ottk9dVbbV/nq6yyMLD280TBZzIim0SFM//+ikNUBKbBglHoIC7vk/9v8f+sv/64KgqIAwAMRGZgzKQZT0GroWd9atd3ciYlTStK43kzFgjygXS1mHEDOLaqFoccAEf/1qc0J8UABUBYGEZDYGKUDAFgADNkDIYKFIj/8jSX//6JaWh0n6j6CSKbnXa/Y4aaig5DR+WCwdBNjjAfYWJYtHgAIEt//tSxMyACXj7IUaKr8EsGeQo0dKgAPDE2WWq7pranZaTo1HS3beQi9mDmiHRSIJcQcgzTGmcnUWySBzDf+tJI1Kw7QwUBNSBpRAOEjTIeRw6TH/6y36y+//So/6kakVuvpMz9tbdX3Wup6Ck2dlIbvSPMMafYrKmagCLIAAVC0mg5pUimi6CustLsyyogz3wzU8SsgqZEIdSS6KnM57/6SRiTQxoFQEBiCPAZWAAdKbIl4nEX+s5WG+ebIetk6gHul/DqqUlkuNAQCXpyMm4FRL/+1LE3wAKZYUaxo61APMYpDTQ1fj6S1HEGqUqqtTKX7vQZt+31LqasbTuCJ9zpKCC3lTGdzUH//6ZcHPCzgGSYUA1jRB5BCYL4ukv/rKqzyjyZdflUECN7MVIsOJXYinrY57hUT58UMa0AF6qcAFyWDQ6tqStPey1pd/I+l9/T51lU328hDszpNDynSIWMDoIQBiv/6SJdLxFRWwCAGBlFCgZyC4WaJE4TIyxPN/151ajxo/0usFFkhGKrVF1l97otW1dx9CjgOmSFTRWVAqRAP/7UsT1AE3NMQ6qDtGBm7Gi5QFR+ASgMyyoeWk6aK1o76tqvPubX23DqLX4duTUKaMbx1/SUzpRXEz//uiicJUXQNQSBgqFgZzC4m4pm5VIOfb5mb50/W6r1qQ/P1vDyUsuMK7PatOw2ibIl4cUhJ6iqgCeACoCs5Ompoq9atqtVlVtq7vxGcre0sbju0H9mGPeJdD3ur/1D9akmPkiJqBkoegBcYbBPmZwU1H8bpWygf/zxkGd+5Xedn9yyqFKQWmMiSOgqMEQ8m9bhcAEEgkC//tSxOgDSqTPGMgGrcFpnqLFIdcQsk6RMunzN03qs9ns67rT00FKWptd23vnU1qOTZNTsgilopMp2Zn7pZwsnv6SRiUhnQhAgGAlcBncPCulg8VhzTz/MW0n8Hz0dTNohyVqrsjzPmRvkZ9Oi3tI1tGspHK4Yog4hBCAuvuYhVUAOxBtJxkAIBCGBuZVLSVQ3vcsOfz5eJWEnDQ5B5GsCKjXtrzim/61JiuAAqADmhNoMbmDf7LdW71VexP1/kWnTJkBWv5LCASg8oIINZBr03f/+1LE7gJMUPMWKI6vwXghYvER1miuXru7n/fBLQpDuMxs0kCSgGMZm7fNfhhhhhhnnXtsjAIY+Y5EYf8HgfB8HwQOc2JzYfAAIABW8+k4YIMT/24nUj+zctVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUArNVAC8BIAxzM17c/K//r9VWb/+f1VVVZmZmZpVVVVVVmZmZmZVUBAQEBAf/7UsTrgEtI+xSpjrbBu7FipSqKeAGtTU1NTU1NTSqUy2GZ1N03VDKsqfp9XdpZTLaWlBUGgaDvqfg0/waBUFf4lrco9s/yx0SqTEFNRTMuMTAwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tSxOSACEDPH6aGjcFNGSRo0OX4qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+1LE0gPMDNUVJA8PwAAANIAAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==\",\n  duration: 0.692,\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.692,
    "format": "mp3",
    "sizeKb": 6,
    "license": "CC0",
    "tags": [
      "glass",
      "004"
    ],
    "keywords": [
      "glass",
      "break",
      "shatter",
      "fragile",
      "delicate",
      "clear",
      "sharp",
      "impact",
      "destroy",
      "error",
      "warning",
      "feedback",
      "brittle",
      "crisp",
      "sudden",
      "negative",
      "alert",
      "ui element",
      "interaction",
      "chime"
    ]
  },
  "categories": [
    "glass"
  ]
}