{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-plate-light-002",
  "type": "registry:block",
  "title": "Impact Plate Light 002",
  "author": "Kenney <https://kenney.nl>",
  "description": "A brief, light metallic plate clink, perfect for small UI interactions like toggling a setting, expanding a menu, or a quick, positive affirmation.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-plate-light-002/impact-plate-light-002.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactPlateLight002Sound: SoundAsset = {\n  name: \"impact-plate-light-002\",\n  dataUri: \"data:audio/mpeg;base64,SUQzBAAAAAAAIlRTU0UAAAAOAAADTGF2ZjYyLjMuMTAwAAAAAAAAAAAAAAD/+1DAAAAAAAAAAAAAAAAAAAAAAABJbmZvAAAADwAAABQAABEjABgYGBgkJCQkJDAwMDAwPDw8PDxJSUlJSVVVVVVVYWFhYWFtbW1tbXl5eXl5hoaGhoaSkpKSkp6enp6eqqqqqqq2tra2tsPDw8PDz8/Pz8/b29vb2+fn5+fn8/Pz8/P//////wAAAABMYXZjNjIuMTEAAAAAAAAAAAAAAAAkA4sAAAAAAAARIx4uN+0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//tQxAAACBSDZlQxgAG8oy6DHpAAAABgN30AAAQWiIiFuiIiIgAAAYG5xEJwAATru5//+ju//XABAYWf8oD4P+CGo5B//gmD+UB8P/pBA5/B8H/9QIORGheCwE5F6UiefltnlMhhUVGyg6NOAaSmComBlGJxIYIzJcWpxXFjs0KUoy3ZNY+qJ7XgmVV1OTCKCVRgvGkulTU1k+bS2XWb9S31kiFKN1cq6Wf/PUYzz+fpqWyrbv+/0ya3GRUiSKchq92js6EkAUADDqEmMxjUI//7UsQFgAtAdWscwwABhAqtdPYYaBMCqIdVvJSzJJcNGBR5iSNBQCzCHOSsr5xh5qMyzHEqb/O5GXCJwGEsqkRB1z1zxVSjpZ6Y5oVYKLciKlDJFKnqhOssbsQat0FU3EU/5atZvbWIFFNNOAKZYwv142BmcCAB46GZZD0Zm5PSnyjVkTcDfK1jSppinsosc4MiodErrUmQ6TAa3BwrHAWHbICWbawClQABTywkFSafnat6BFS1YrXqiwu7FUKEqw33PJUoBbzTMAHK8DpBri4L//tSxAYADAERXYeYUoFmoGnBhApgk6yeGEW86yaIFYhKZrZnyoiuUd8eSQSMvbKArxJiXk4GKqq+dbI6SjMKSiM4Zi1JI6TMSzpK7X6wpNma65d/91c2V7P+D4QoCymhtsiSJOvtX+rpEMi9RdpX0IVdElNoh8njFhoUcp7E1+pdZzrPdwaSGDxANKUWxzSBYa/sqTWdV1jhmumvcsIKpZt57a3I2ZDahWQx2ldFVf+jyq2mCeSeSXLApKgqGlhM6z9KCCoOYABUILoBu4TIoTD/+1LEBwAMESNRrCTrQXskqOmFlfiGmR2nh5918vZENEQsNKS0uSxTPSulvPITu0SxSLNbqcf/onqo6ACcYeaD4iNUdp6FG6Hv71U3Rc11Ivb/+uujfnfOLbkMWt36w0ZVksGpZxiysEw+ASIAUDFMuWYNq/Rwj8hV6ynrsvbGYpNQmzHGIhWXvXEY5cZeVm51L7OXgknmtc9lszx6P/6//KgbUdbjU2c9eEqv0Enp/PMdtJhYPh16/9L6Mjk/M3iQHsh4N/sqIAgMKAKiRRIPkP/7UsQFAAtxKUWnrU2BZyUnVZYdcIcOJNzg5VUUx6MhRZPtQqQS7FqJLn2eCHtNCkhEp+S2XCkfn2MtdZn+6qhr/JhDNyhcbMq235EHW/Mj06qc88hLuOt/6D5nz6q//5o8NXLf/pEQgB9pj2IGMcdMMVOhhWZ2OjoRQWJAuOh3nW8QyZXjks7iczgXaczOH90QcD58/OLqRQz+d+oLS3uOrzduoQt++NLis7NJzC4in0b/UizVMzP6/Hh89mm/+qoADAhMAnAgFjnUYDPYmTA6//tSxAgAC5EpPawwqcF7pWblgypYGLUUyXrb8ejoeR9Uhv8nX1AzV84ImcqHnYHazOubIqJNJmJksgp3fFwTysNF/UabpjPVv10Ow0W1NQHKn/5kbXRuugvrhR/JJ/+7/rAAFgDgJBoxLgCiLAU7Li2mHNvF30ex/nvet2N65/z/Y1BDL94yA4kibvdNlihyvyjQv60L/8YjX8EYrexGNWMkTU9C39rjpQqYXxqxUQzEu3//5brnE2zxktymvjP9NQAEACMCqEHLYGiDmVEyVpb/+1LECAAMRSk1jT1FwW4k5rWUnaiKySGaYMITgCmXlYgnjr703nlZ01CiZD9V5dj+EcqVepLLGB+bniwrOjF/qR/wfHG4uZpykeReMAp/7FRXLqRsTUHWF5LJv/1V9M9v1fSpcnk2gAECkkAwgAg0IwNwajpigFo12wcgObq2kEN0ceX0aHP+Dokp9Gn2fR0IZnd9t1hYVb+aNjx9rP+DH9kBab0VW1bP8TC79cST0GpmY5o1jj//U436t+p3x8BIqHIBT0BAQZegeYPHF/0fW//7UsQHAAsBJzEsmU0BcBulpbahuNg5krIHJbIUCsvYc3BPvnFhrDzuOWMoBFGbwORD0JTHVlCZWNf9H/Ix3yjmakbWO5Ae/oZPdjChzTHcQaHf/W6fMb+S/I2HN//rAENAFgQNtzAMaGNHjEWSlAc4CgLSnfvrFbSDowbSfTHaXWLxErmBYooFmsxmcJyWazNNj6k/6X5wTARvLFzAUm0PEO6i/85r/04WkFyTYTgwYI9SvWVqu4awF+gAAAVIARkAEGAQNogKsFgiQETtquar//tSxAsACuTXL6ysTcFfoeUllZW4iwB2YOg6mGh5J2GkkEPAOa7csucZ6htFjrNZ+FTyG85f/la3/lYOxA8GEMlwYrLqHAn/hwKUzVOWKV//ZyuQPcyAg8AMAgcohwrkIZIQyhPKRNszLFDZYV8YciJ20KDAEsoJojE64y2A1RfWldAlhz4qF3Nia/5N//7ENp3lNmYWX1Ac39Q+C2lnao8pv/nh1nShk9RM2DwlAAMAOZQNzyjDwoBKiHiOKxGRqxsFlK5XVBUZE26joHCZZM3/+1LEEYIKZNUrLaVLAUWZ5JGmFhhv0PRUYPfHruE0Wep6Gyz/X9x4Pn5hqvICZ1bMJR87fPEGLJCP1s5ty5Ed8UbG+7QigDjBAVhA6YIUgJIHDW1L1POzguQzZyn1x5q/SI3SOLeEFdPS3UlqoP21IDAIrTi3pPv9C/hN+g0Gb0JyBIW/qIOpDSFOH2D7vUO08EXQ+/66AQcANQAP1seTMEUFBEjgmWnc9TnocEeVeDYg9QURsCDVQ0MZbieIJHrFPD7SoDhK0Nzipn0F/4rJev/7UsQdAAoszSUssOtBbpkkqbysIJB3as43Hxtb80ip5XsYJBMge9TP+Q09QAFAAxsEAG43gKGzKUEAYokJlLWeR80qi/UVNE18jsSIaDIFyF6II+gXkW+6yKJf0T+1xet/5AO/4HseD/Sp8+dTbN2i31ATa//nPNlGpXa9Jhj5Pns/iH///5MDhYgAcUIk3CZAqgQFAxWTGyd7JIGeNW6JSdZq3qjeiww/Xiufn3nXyzMhaazN1KZM8JCJfh9/UJl6nLazKPbRH/Gh6dXhbQ6U//tSxCSACokLIM2wq4E1FiRlpIoY//6//p+HXVf/f/qARjAogBO/LAwwCjHFJR5ESchulRBlbjZKaG9/n70NCr1E/axJMGXM+2riQPzqrMraJ/U34B5gex8M+gX9YNBK5gfX97fXldZjZ/f//poACZRYiQCj2WwiNTMRFGQgDRYSdNZSANk3Ecpjs3nVxkTwdPtZeIuNf1xhYPxTnqpcSRunzRb9AjflUrXduX/Oml5j585xT+m5Hfh7af3f/+f9QlmAA7SLNiDxxWLAuIghe6z/+1LEMYIKTMcjTbzngWogI5m2HWCXvd1MQuArFLMzXx6a5+KDHRQ9R5HUZPgEAlqIhcqyDXtr+FD2xGFRPNPMKm6gRDb/xfRWse4+VEcv/8wzop/xqQ1H85kkf/9X0wAQWpC9qygABYgeAAC34UCxB9o9eaUzV7lx6rm3icV7KxCIkwa8nhr8rf0egjcnlhyjcKDzR2Uwk+JQIZ7WdEyUsaPSd6jJv5v6VMPJhnqNEqe76ALFRgAAHIxONPQaGojAKsaLEDKkSwYwB8vPD0bzMv/7UsQ5AAqAyyesMUuBaKBj3cYVONAOZOkqBOto2Zejz2mmgbKfy7FMaHm1VC/MJgcODudt2kPoJt/KtxrRITiSlPf/sRvdvQWdl8dd/lUf9yoABGU0AA6RnNCBzTQwxwEAIW+8Eo+MxbszaJ4ViP89CCsKHCppsSlXDqZCSTRxNj2ISdt/v6hNAru2pp3Zzj9SJf6mns70Qw4uCHyIpLktTycqHMd///3gAgMRgu1lAAGQQUoMQLQ9fJPKHXkfqidp/ItOwQoDQVBkwDBHpihG//tSxD+ACuzNHy2xSwFXmqS1oCGAnvuRWsCg5SPIE5p7on/cP/IqJQICP88pc21dF33H//qt9WiSqio8sIfPf+x9A+oAkTKAAALPQCVocAUM40EACQrdXTDqbr6EdZFb9UDr0VC6ekXtLGG7kzdVADxvVSwpCKp/7/QMfyCXKlXmfma/1pYrpKcLv/+6/v+5FzBji3raLFKRJREkAH+LjWExrQwQVhSnpY26+Oym+81PVHevj1IEEU4cxhBJd6JMogFRqUPY40WPjP/lb+n1KfX/+1LERoIKkSMe7ixLgUEbo92kFbBGXtkb74YHG3KacWHHP/ZiI+5Hbq///64AJIgAfvOYYIDgKNjpiguMwIzKpfVENSk+yZFFIjXRxurDiNqhQFxDoYdH//+GF/VO7/op/5ilVzsiSGMx3RHP/6+lGtlKQhKsUEvHAAEkFR2NEoM5deDCFQ5Ty/nZb/KUTky7pBJ/xIH1TxkiK22/3ZMo4ch1IMHvTyT8h+jxIH0R4it/oKq/qG//9NVgDIfznBwqFA0F9ErxYlAYwJNzNc9Hkf/7UsRSAAmFMRzNHEuBAAtkdbKZWOTXCWpGRaTJbGUOAL9D7Uf9V/28xnbZmr5j/0abErsXUpzCn67ms3t5YZcJP//+KFEiOYh0MF6fMIXc2634/Vh7bSQQE3IpF6yBiO5qXK8z4Yf2TRdOdsv6iPRS7O8pfz/ysZ7FL5gww8+nqAwM2tyz8VaLtpfShqVC1H/6VQARaScbSbOvAk8xwZCx1wlcsZi6HKSb7aVsPSLXAUjnCF9yedNIV4UeK7lAZ76/6j1r01lXIpb/TUtAkiIf//tSxGmDSQzvFC0wpsEvnaHFwYlopjMYgi6Yjg+YCgCnMjg4lLP5y4FUqPMOjwkzKjHhqRlTukXcEuInox3UeeqHeRlWQ6eFnrd/W7IuEVQ/Wnnf6w0qAAEAEIYAAAAQFyuBjDRwDD0pvOJDCLrOt7im00WSc0UCTCojwzceZwLUMYL1zQwNIfRhhJRgPNC+bkuoLqPATIdwmX0EGsmTTYmmhImn7m6mQaXjIvHUjFD+ybpqZBpdQNjI2OpGKH/ZOmpkOmYoJJGx1IxQMUP/umr/+1LEfQAHVAsVTZggARIC30q6IABkG06amQZJJI66KCKCSSRi53///giIgBgEKMKAqTBQEBICAhVAW//Y2AgIwoCJgYBVdmOrqpMzahgIUagKwMd6wVLA0JQ73kZ3//+qisNKPFfUDSw0WO+CpYOrBp4lce8rTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7UsSbABIJeRc5toABKo/QR4YwAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n  duration: 0.489,\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.489,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "impact",
      "plate",
      "light",
      "002"
    ],
    "keywords": [
      "impact",
      "plate",
      "light",
      "brief",
      "metallic",
      "clink",
      "toggle setting",
      "expand menu",
      "positive affirmation",
      "ui feedback",
      "short",
      "crisp",
      "click",
      "tap",
      "select",
      "confirm",
      "subtle",
      "game sfx",
      "interface",
      "element"
    ]
  },
  "categories": [
    "impact"
  ]
}