{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-plate-light-000",
  "type": "registry:block",
  "title": "Impact Plate Light 000",
  "author": "Kenney <https://kenney.nl>",
  "description": "A delicate, light metallic plate tap, suitable for subtle confirmations, minor selections, or gentle UI interactions where a faint metallic shimmer is desired.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-plate-light-000/impact-plate-light-000.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactPlateLight000Sound: SoundAsset = {\n  name: \"impact-plate-light-000\",\n  dataUri: \"data:audio/mpeg;base64,SUQzBAAAAAAAIlRTU0UAAAAOAAADTGF2ZjYyLjMuMTAwAAAAAAAAAAAAAAD/+1DAAAAAAAAAAAAAAAAAAAAAAABJbmZvAAAADwAAABYAABLFABYWFhYhISEhISwsLCw3Nzc3N0JCQkJNTU1NTVhYWFhkZGRkZG9vb296enp6eoWFhYWQkJCQkJubm5ubpqamprKysrKyvb29vcjIyMjI09PT097e3t7e6enp6fT09PT0/////wAAAABMYXZjNjIuMTEAAAAAAAAAAAAAAAAkA08AAAAAAAASxRxcQ+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//tQxAAABogDcPQRgAHwpW4DMMAAAQAAQVaN4gOAgD4Pn4OROD6gfflDnBDl/BAMBj+oEAQBMP8//+UBB3/4gBA55MEP/ygIBhd1xuCZAclAK4EHy9Ys/LI9hGrkSwRBsSBe8rD4GUoDpGLhFeJhZQ06Zdr68+1cnscKm2lUT7tD+q9g9WbzL6aPKUqi2rDU0ogp3jJ59jKsnL00e6lp/Yt1HK/ZyCnTNcyK83r+ZfaxT8zOXpk71un89pR6wB5jt7fff6EKNTjsBAVNeHUXEv/7UsQFAAvIeXGc8wABdA1tMPYYaFagyTovTgZTMnWg/m00VcfrwtR4BJYtiyUGNzm35vzZl/DnL2e+ZpqKKIGFRESigZAQiS4VcKCkKCQTEEJS5bDLFNahl0ZrQwuNY8fHKbrMalUdpkxLaRENM/ZqmSPpwFRGC2gG0o+juEAdmJ+JKQgsncxOw41spEyi0yeH1F5vZffNNSeQOWJQk9ICGJCo2WUVrATw2WGPAIaAQlM2lhESGBwbU4ts/tO/stRDS39i+moCNFlWQzctiSdB//tSxAUAC5iJa+YYbWFij+z0xJz8Q1BrUcVQkD9GXCwU0glaWDMYST6nak5I7NwfrgRzehS8xtyJM+qWbBxk7cRLBOFgIHZ0qGNYlCe1yg6Pa0UclYfIlQfXfTlV9RD5lMNxVGt056hLb9rHZY4lMIZFCS45B8DbBOCwTGAiF7TCq0D6Z44x7j++U/rTxoJz3otVYjeuccnYqTcVD6k2yQ/UD7AoHTgQ+VIRYicbEbSoLG1zAeLIa7zzft4aEX9NVQAABAQAAEDbEBhxGkG48KX/+1LECAAL8M1JjCTtQYGlabWECfgdcyBnibpMM3fWcLoWqg9MoCs4uaVGDhrzMmrEI/PYxyJyOev+mVAaCLc52Q0iXOToOE/9DEJO00cGxEt8rw1CQlCLAWPNaeEIXLZ+/Wdc4ACBZAGRwhUAVCWCcjrLDQc8LQXIjzr0UCz8hs4vwxQnkoOm5WhqGmbNMgCgTfxoqabZ4//9q/7ASBuP9TRBRlNjKvhAwv/rUBTmAiqf/+y+UnmRT6GdPM4I58DGQ57IKAA8X91JvapwMsIkvv/7UsQGAAt5MVOnrLMBhSTo9PaK4EZdGPBPFfdJ2MiHcZo7/cFDpmQ7la3cqvikZ1TO7D8yuLN3n1X//7X/W4qBpbRCh91cr+6ioHf+JCYeEvmMxX/+V701Zjf8pUYxR8RYUPiIADl1kN25FICAA0QEMm53nJALyOYd0I0lYeZ2uO1/Up21+FVXyeOuTxmfesimJokEN0TQdqRdT/WZN6x2g7C5nBPjclkjJSkGOdIqHm/84bZejIOFD//KM70Tr/8oUOLvkwAIBigVFwUQEETg//tSxAWAC20nQ6wgT8GCpOblhh1wLwsrXK1OcZs5UqaO6lPIojT24NvJDcEg6HtRUCpgqO9qGioCYf/lSpuPb/+a//KFUiUNBSHswwnWfRH/fIZgybsogrf/QM77km6XyNVUDE1AMEALABlLx+IhGDpl7QGFoq7FHYaWBYqLjwHxEulVZpGnkNVOHoNcMEKkzAv1sBAy+ZPG5ZJYq/0I/uJfpFvXl/T9WiZD4ZagtcVDQoL9/9DjeujdsfLb0G76jp3/yv/pAJBAIT4SLSiDpWD/+1LEBYALeSc1DLznQXUkpuWXqLiZLhVi0KfQKvOVDESX0jvn4fu5GdrQcUGgOUFo6bqLypgChVyxpbJFH/L/wAH5hcSnVx9s7VDf5qBQ0qUILjNwYo9/9Z/TH271FLbZTtPbP6gBB0Q4GjiKASCdaTK/y78wgRvMp0Av00jlyeP9NGGluzDAQXaqvaiUYNLEbmuIMvywslmt/PP9GEgCHuctzjjVVuYIB/3U8nk5c55Y6Lixpv/zDvWv9TvlXbX5L+0AEidAJ5sAoHqI3NLtbv/7UsQHAAwI2TmsvQvBcRql5ZYhML/LyeOVw/MLBJXHOryfkl3N8HQ5QLM1vHpXKAbM/NIcZWE2jf2FfZFBdVtU//5La//EAACbfkExCuVcL/Iz//8sWZKn2gYbnviZCoWfibE5/eOAAKQJAADXAYKL6mCiUBu64KjCzcAkAcDpO6ZzVwuXL/+sCwl1Bqcqq0qiNBWCVrySIozV9v5c33+NauCC66d6qm/gVX//eB5cCy2gwQBpoKv8TGzQnUVkAefB4VoAkh0oA0EBAGusDTwx//tSxAaACwELM60wS4lXman09I5mIxtyqBYu/anEnfVDaHxMBIt8sRSseOHjCe9CtizMnI7iserTOTYxzAhX1+cOUtTmAyK7iWo70Vva52q7NYpgFv/1+RWXQioKOH2oCcbv1bliJQA6lkY7IOWAXVQO0ioWJGnJGlPNW0swL5b3HVMtH69QnQXAkSuhBXrJ6zn/m81/+uTjhNDKMkxohZH00b/5lz85EosEx77PC7QaABlx29UAiB1IKIESUGpIZxJbgIQbWovh4KsFtdoxKQ7/+1LEDYAKhQMzrKRLgU2W5zWGIOVc0nyeH2r5I2e2+mfYoPJkrPXRN2uX7l+gCVaezr53El/Idqoi50gLtbqR0ZlO5H9jytOCNUpDVU6BEVpFFcikQCrQpAXFcth79uTH2wOnSIHrZ0ijFkZkyEZJR2UOsOAdD2yTDXGEbRfJRtc8sTXrtGjXXaS1/6FixIrWx8kjzf99sxBoZN2PU/r8n8UAHAKQMA2OvNAD0W36JARkEgX8p2756OgIorcPCA+QVWHCEgHjVZnYBAA0Tv8RBv/7UsQXgAn8yyktsKmJSZulsZYU/CORvQpdCHK2S8ilsomcqP40SZytRDnpb9RlR0wzgBMhIgAB0kQ+BAD/iB0aBdgvC7zUaMNTE1AUfQD7JvEsKD0HLbsqKHEZUDgtfW1jC7KyZDl1Ew0CmQgQO1EV6oKuvZGErxQTUo9jf7tVt84mwsGmIupVcRQDgZRDlOEQAXcifId2YMiDiCcSCn6OIqj8mEw9pFEKSk8ykNujEWJ86W0XtW2dbXv3GoqOMDWaQQdsVL1jKuyFcBygVPES//tSxCQDCgyrIk0wqcFKm2RJpIohG3WvFgVWFaFPAwB1PggKgK6AV4YGUWhssAlamDQ9R6luEBW46xGirRpkLCj2ieA4sxJRDvKX/4HkX/0ECbfMoiq11ggEvuwU4ZVFsHAZTfyG6+dy5xZnnoTYnWUAA5GOwYPDCwTEArQAoatyUaCAE28NoFSEUCmCplxwIpL1v2H4AgU18v69EvhRHzgOIo5UUx6nxNmN4CPEylA0GJX+v/U7ccLZ/Z8t+sNDLg/0YMIQBY8BpuXsQnr9VMb/+1LEMIJJ7NkeTjCpgTSa46G3lPjZcVdvzpJ68KllmVybNBXI7cO68h83ix2OaM/ib+BCZg2VY0djR30D7iIgiIMcFp/GkvTspKUFrEEKPpUAINNQy1lp2hohMUFUWgp4vE0tusBx59P/WTJ6bHORjwPc9BO8LfyZNQzf/03/9IXBiMy5CSFaUuxd6PPeivcQ7X8Koq8H90O1D62+v/fyP//1AK/QADiQ4MFAkxIDXeEjAw1J6GVqytJee0FPq/60eT/WEUL1ajpFS8ca4sPK/P/7UsRAAApEtymtJE9BQpSj2cYhMJv5FQGg0UkOXqprauyhRPi0U/fh+ygw7KrMkXNCtQDkidhBAE4AAHaw+YGDBt7JjoNrTDW4Ag8DQLKqiUISXeumGCZSqxZsHhoPxmlLMTf//7TUmk97jZx2otDfbnmiDPdRUnL73cFxaff8w+BQUPhYq9yZNPCgP/CN8COeLDjREWbC4LrOUjjI6V5OWrjpQh4VbzmypIZ9NYWPwz46s2s/zyr1uHFC5e6vWtahCPz46VlpiRkA9/qAxqIg//tSxEyCSkSvHM5hYQE6lqPZpI3oqQxq0qN/ok00ACEH8xAk3qgw5omNumlAgMihZd84wN38SNmxsh/5LqqLfJVMhMebiQQRar//+y6slcslJsUD8gxOc/hwNEdTCgw5NmODK2JCpo2nu/rgX/xO8JQDPGDjsAioNA2OpRwW8ykGmMWsGTFZqYDZlQhJk4fXjVdvUSRJCl1M2H+h8odAoGDjGR2e5VOzmDxyX80gi46YwlQXNdDBUcrXyLaeihUASEB6UA+tCIlYwAcQDLzQOen/+1LEWgJKULceTSRrQTsYo9m0lXBQNxX6e54QLCxHtySFQYWgdP9UtOXz3GWrEJO362cd8v8vP1UGOAF9bI5dOScz/PwsdnZlZlDBTBfnZL9DX2lDAr5KNogAB0S+IhNgoyuRQNp7RGvPfg44BoQR3rg4NIpB/bXDjeaZ3kHlSoCDjIom/tcjFoGHGPlREJiRYKH4Ve+VWoOJNjwUU5f2ftAIFEIXX6UByUaIABg1qYKCQlkiYJABCJnrorn4sxoy0hbfcOn3ScZZEo0gh//bkv/7UsRnAgps0yEtpGuBRZEkXaQJcAoIIb+omSPSTDGJQwrSCBISgxKi7BKHVxs0EggASILDGhn/+IhYXCZA1JWQAPLalIlghRhToRAKAt64Ka7L6sTeWrR37/kky8Ek/3lHdxd90aw5MLv93m8hLf/6KIPej32Q/8yp+hnC3R5JWDGg//o9YKkAcT799KoAQKX6QI/xQHZCoDEhrRW1TknXJgKRYtZk+aIu2OhtbtuxWY5TZ4kucEBsGwVMEmf1A0f5Bbd63v4lSELRjTyU/9fL//tSxHKCClRtHu28xME6HaOZswmwEUZEWcd1JYPAI4Bwc5hxBSoQDqwqqkgNiiJsElgDCbVbS64Cg64vyCTFIVWzHUgeV15lrv/ov9Sfzt2Tr6C5G/tDp0ChtJwsw3/cfs6uIhjeSYWkkwAAAIEnIkAid4TKVbh4IKggKx8qaVtS7WyNfpxFvXZFpEtAGBzky4mLPXp8QddJoV4a+LfWw9/NEJkl/z3R/6gCPBfQKGK+bi1l/BGBN9M00Syki6refNc5/979UERpLJTW2INEQlL/+1LEf4AJaF8fLRzMwTKdYtXElNjv/1m+QfD8j6k5kloX91t67pXc5gR8mjc1wCrpPsq1QWMMpPJxigAAwEGQD84oCBs9SxiQVyQGk+HOU5ZV5btN6sbp5ilb9DGf9tPu5vQuWUtGZkoYyeX/9TGcy1ZGvdYIUok66QQWYKErxTiIGtyj1wseyoQBwQ1pwijBlChMHUDcwFwF0JwOAEXY+r93b97ijzi6gkmhWxTGRiuxvV9R2DUV7BK7+Iskw9EqDp7qK1HcNdoi89y1IBAQCP/7UsSRggf4ZR2spKMBMqGhhbCKeAYEAKVq8aykGIAKVLiW/Eg9Pt44j3BQBudFTEkASBEcbeAgDYC+UIi7vjIGoPgK5CaitbGYkEohRPViI5b+IgXDEuOiwiOau3x+MSIkJB+QbIm/2x8Sk5OPCMekw81X0e77eYRoTFh+VKMSk6V10737e7x4UKuXJDyE4kY8w43r9P////+Tg43/6wNKoIgdRDkDYnIYgnzK12bWt8AhRhQETAIYDUSjQVLA0JX6jwNLDRbrOgrDvzwi+DSz//tSxKkCCcUTBS4YQwEOA15avCAAol6olnvW4RW//1uVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LEvgARwdMSebUAAPUG2AeYMABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==\",\n  duration: 0.542,\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.542,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "impact",
      "plate",
      "light",
      "000"
    ],
    "keywords": [
      "impact",
      "plate",
      "light",
      "delicate",
      "metallic",
      "tap",
      "subtle confirmation",
      "minor selection",
      "gentle interaction",
      "ui feedback",
      "faint",
      "shimmer",
      "crisp",
      "short",
      "click",
      "ping",
      "positive",
      "interface",
      "element",
      "soft"
    ]
  },
  "categories": [
    "impact"
  ]
}