{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-plank-medium-002",
  "type": "registry:block",
  "title": "Impact Plank Medium 002",
  "author": "Kenney <https://kenney.nl>",
  "description": "A distinct, medium-force wooden knock, useful for drawing attention to a new UI element appearing or indicating a successful action completion in a natural, grounded way.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-plank-medium-002/impact-plank-medium-002.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactPlankMedium002Sound: SoundAsset = {\n  name: \"impact-plank-medium-002\",\n  dataUri: \"data:audio/mpeg;base64,SUQzBAAAAAAAIlRTU0UAAAAOAAADTGF2ZjYyLjMuMTAwAAAAAAAAAAAAAAD/+1DAAAAAAAAAAAAAAAAAAAAAAABJbmZvAAAADwAAAB8AABoeAA8PDxcXFx8fHycnJy8vLy83Nzc/Pz9HR0dPT09PV1dXX19fZ2dnb29vd3d3d39/f4eHh4+Pj5eXl5efn5+np6evr6+3t7e/v7+/x8fHz8/P19fX39/f3+fn5+/v7/f39////wAAAABMYXZjNjIuMTEAAAAAAAAAAAAAAAAkAw4AAAAAAAAaHugF9dMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//tQxAAACEgpZZSRAAG6mzH3HpACAAEYAAAtUCYbR0QBQEBQg3f4fzmACAQBAEATB/LggCAIHOJw+c6fBAEPw+GPwfB8EAQ8uD7/+CAY9YP/Lv4IAh8HyTLdZLbbLbbtrbaLRaEMcjSwXSYiF4iIpymoSUgpWGUyzFmUZAnQuTCdtQ+peJm/GOxUgpaZ8dqOObUm7I+cRdrrzigQrXCct+UtessZC01flw97fz7iu3eW6QSFh5L7IHHhFyTSv5aOWVGhIlRQC/797prPYZhfUf/7UsQFAAsge3k89YAxd5Rs9YYMdKOMTQrJTJUeUsfqzAYc0eH0FlCbVxa8v+/a4zOfLrP3/M1XO1K9VyXF5YShrXc8q4RPpdlp1j0oJAZpYWLHKSuFDQkUKmbsTftTbmXZZQ4AJRxrXW623p3Ho4sVqAZARDGRBCJ0shQTrH7YkwLiawKdaIGAm8E1Dhgon6pgbd8KAjHGZjb//ufXUp+YUO0rcSOnSxFqIGfLCQjLbOR3fiUFRoxvJUh2VMdaq1ITAe+9OWSSBN41FUza40Jy//tSxAeADADLY0wxBbl4maZNzCj4QwgEYKjsUgKOz0gL96hOs+56WyG6rjeBtbNDnHDrX1PvYQhIFlqeGa/nWKNr7lb/JrWuf/tmKhZJgYKv0Gy8NNJsf02WZQ47FkK7//qibpMKABqYAMj7QzhYT26iMFEAyKKjGxDMcB8v0AXGYJUcDRmC7TTCpCTUfyAiEgQV34GhVtnq633lElvWKH4GjeQBMcUmeQhSDQaeeIJsZFUb/R3cYisA+XOuvzW/8lxn9KoABNSQx/IOHQT88gz/+1LEBgMKqM02bbFSkZWWJMndTHh44NNMk7wxGLlEQdBKPLvmNAlGqmjs1yXUThr6e9rE4zfxmnolV3pC42VwPIEu0nE5OLfsM/Lr//Q4MP/iz/5FkJf/5L/t++z6ADQAxNIY8DSwSn8zMAs7dA3rw1g00zU1KgxJAHRgclIwLWDUD1gx4aoY4iCooFXoIAIiCC0KNhjYhpuLjGkUiOHKGqPI4wVCGqz58sswuiIiEXpDeN1ssYwsP/+ZKIMNh/+ZfVE1ADpAAEBtP3zwywaAqf/7UsQGgwvQzShuZafBfBnlTcw0+BTA4zDGujUGB4riB1ElKpxijpLl5BFwngu5mgjAXo5CeTvJNOnQUE26av6WYvvBYe0GsK5ZdLlyTEcElP8f0zakdAd5sUP/1JjFDhf/r/9aeeAChQABqFExca+NxuMVmDwMYZNCKfDGMVK3okJBc2xMdhgpfhLFIAgAjZEihit6jVKwRrb5rNQympileNk7UwDEDu4sB20DVQGA3GcataQK4MOav/+U1DI/9b/+PR5SZQDkAwCnOXFRE3nG//tSxAWDC6zNLE3lq4FxmaVFrLU6ipmpKGAgCOFDy6w0vFui1JhkGaiusUuf6eKEFKlV3IMkEGhtrEEsFNn0WBVvai8EiiEchCNSc1mJyz8o4IOKp7olLeMELF//1pHCN/51/+ozy6HBpvZmTpqfwyEBBkxCI0aF2AMEBB4KJsrNs5axgwmLExdE0eVhIsO10AAF5ygCINHFQaVj62HOfB75G12Joapi3pZL+blZRKm5UJ8/DZGKW//rPKPf+z/9ZeZReQCSAtAYegm4npwhuZX/+1LEBoMLKK8oTeGn0YgSY4HMtXCGFZgKjya4WkGBTSLCUKwaR3j1JLpJBeqHQAieNkqyGavAp2w6H39g2dlEqfxs77BzglnKRY0uh+HO3VbTCfDUW//mZY5r/5x/kv/6jCiqNuBM1pqTRhVMIEAwwJzB5NMCAAFGlwA4CmJCGexJqkilhq6K+N0lHgKhGimEFHOQATCj1uSw6Drd4JSulLpSFt22aC6sAV4rX+pFwH8PTaiaXV3GKE5Wl/+YgFviH4lVC04O3BozgbDG5HMQBP/7UsQGg4uYrRoOZafBMo6jhby8cIHBUy+FgUDgFEDmBGcRPHJsTBgws1pjSFNZYSBQSlpE7yAUlNQGogPEu5ebVl0ZxPOD3Wb0BsihJE3jvHoBdkBHTGCJbnB4pf/1T//nPiS5BiPkfYBChYagamNMDRynpA42zgGzTIbgBFBIZBBjsiyBNLOiEJBt6z8Cgw0cwLalNM1I1IdGqCI6jaUn7WnDle/+DH1/2t7+r/9t3UoCElMRtiNYFRA0wjRQNfQEnJvs2ay/zbqPF3i9wjFj//tSxA+ACYxpGk3kw8ENjmQpphTwDbXUeWVyd/XM0/qJzAoYq2SAhKHaq88rf25tZAepXSn/10f/or//6K/V/zX9gAMlguAtNGNgGAFmfCBxF4lgC+K+UtCyDEVh6OQdWSvRqIYxDesxqZbOjDYOqruUOtx6cooLNoGa//zH//2/ar///74QjJ3DStzSmAcbfMVADy9R9LPTpNxaWj9P+76hI2A/HZ4peiJzAUX7hTwNIc++aE47+Ur8aQHUsSVlzC2cCel6f+3s/9681Vd//0j/+1LEJYAJVHMULT0HgP4OY+WGFPAIsiHhfhVSQ4Bwuxxq6zqRHQriMLNKZMKa91paWmDC11nwMylDlD4pbqNbnAjaEGDv0/b+n//E79P1+iSr/sZVEAxqg/oEyaFCFezxw5EA3KxDGJTSohPOTd0cWAVSDKhteNIP02lZ7h+GY1fKjXx0TNyY3atyCciIvu8pZ+z/f8b/F/X967LPd9oV4KlSQvTLOOhJIze+L3YI1pYopJz9rkz0g1HK7tllLEQHRgAvDmJwARa/yH3/h789WP/7UsQ+Agk8cxQtMOfA/w5jWaMJMPSliLr6FL+X+kp//s9iMQiAwWto2JQowaq4Q/jWK1xwNJNKXt69ehIbRDWHP39aIUNad7QIXv56WfuWKyZrsYIHbV9bRaz/8r3/6P//b6W0gYPG9MFEUsZ45A/MTrFQkQtuBIstYhHlDg7AqOdApeyS2mT3b31tvEQHApEYS3eeW5jB+i4FPrmaO6upqUeg7u12+IW11+j31QB361yPZ+jJj7cgvvpPEmhHPjc6ArFkbv5vMcXp+GYqh0S3//tSxFcDCERzFC2ww8EgC6IBvCQI0ELdvT3Xf7eT/+5n5nntVxWhv+0ybk5rpOMvUSxxUTJM/gK9xrR5tsuUbe+gm7WYpRIU2l0gSvlV41S/m2NpbQWFSztBeHqaSb1cohCff3PtWilDSddj9b+y9OitHf6FAM0VdGDXFwWoSZYgls4FpwTrHBOcYP0IP1aVNGkYggJbounzRO/X6O6TsxscjRQxdkdWlqLkfLpPIPel6GmC/l//x3d/+ZRn1nEZbJ+CG3uisWrFswhA4IBTDcL/+1LEb4IG4HMczJhjwS4OYgGnoHgMMPPrtllkSyBE9AI5z67LlQxDy/66Akv/1Kt9kJMx2IkQU+y3VAeh2Kf6dP/55V39H+tSCMCiTAwgbA6VaIljDCjhqf611K+IF21ygejX5KYPDbz8t1LTWriQovjTZcHBir5UJBGFnyfQSyP9fv/F7///tKfb//s/6QEAwlQUMjuDcCsnqwly7jQpctZwIdwnWhOqu1r81SVWUO5x4K4EBxo6VIHRlFIyOf5/YrIiv/6i3/kWWckl9/Qv6v/7UsSMAwkceRANMQWBGw8ihZYkWH/+79/93/1e676aBMqnI5guzNaXMrh5ItuzBoNVK8cvYQleoNritUQ3QFEPjAfjAehnrZehzqqDTW9/yIPAs/9BB6Gv7DP2r88tP/1/yLv+3/qQY2JHFSZ7ckGdbU2fpguO8Shhe5yk/pc8zwwbYjG4cYvhGAECTrRFFZYe1jyNLX8+c4yVdv9QM+wtmr/0dB0ej7rN+tff/7n/+UpoCWMWlMHJNhxkJQONnLj0YhVNfirp88SAungVDIHp//tSxKIACMB5Gs0w6YEyDyOZvKQ4vUYyDfH2eZzmzQJRuR/yT6xv9P1/v8er+7/p///9tBk8eD/s29YKFl5YquOBAlIYklImKB0LZTui08HWBlaqbXPxYKyEKoegPS0KYOsvFHXhT0LWU6I77WsuV3OR1in2nFx/r9fqit91IIET5wKUKiJiQWnApY3aQxJCPoCVdFM4o4XSEgLUrGattjqDhYCOvChwi/QQF07Ffv+jYwVpZcds7RR1t/Q3rY9tdoxRyP2HrzH8mp36AgBEK6z/+1LEtoOI6G0YLjDMwSkTooW0iiBosYBWAoCTElJJaA+y+sKQiD+RVrJ7ozNigbEUaiOzQ5w/H08wv4+6FcRBsPUBUatBI9W+5Bd0majvgWKY9ltx+Qqckg0+8hnzKkvW8g45JgVag6xxlek0jfeWAC6xg2JEcObPMIMXTKVyPSGmwicVBsMzw3oP8I1lozaJlLGkhY/O34okMS/+ARign1+Fia7OoQ7dcMAfY9J18SFyxEPCy9HKqLLQjZDqFIS00955JgnIvdoCarPX0IOtIv/7UsTLgwfEbRpNbMFBJg2iQbYU8LAUeZwCdT6GQxIEYFU4emJ1AvYM1C44FxIhfLsAfydvKJf1ZMvFbXqHo57/jq5V1+a8xKMelhCKtXZh6uuwgP0TyalnVpQ+vX++bcthyVtGXWjsm5L8HiAAIGCBM16SNbNAYBuu6S3lcx6Gcpt9qzXZcyp83aa9apH0y9FZ5PvboCBbTBc9pRSW2QrcqJx4HJanZTmOudV/vWeazVTayqpJ+HCpaaemRsUoLoBocQUJjxhKJ8AtFa4d3ZZZ//tSxOWDCcidEi2kpcF/DeIJpiSo6WdDWV4aUPQEMscLjuBQRMd+ApEAfSYbD8Tm1wlHYlpFIeNKgbbVddTTryXKD0k0q1QMKnw5Zw7V0F0EIDvTCjlbDwFrcDjumeosQ5FC+7tWp6/opY1pYAAK7tI6zSpljlaAQogpEABVFekdATZIFcOn4hxJiZMmZYetbRjx2SaEGh5EY38yfZ/pctKerIQEaDCBA4eJDeSOxcoGrWA0B4Im6UVvgctMoGoBxb0g6KRVBtbhrSgsNSMHKYf/+1LE7IIL0HkQrTDHQWYPIpmmJHjbor8V4c60mZAQygxdmHkCggMAc5mSEsxgiLnjJAxacNTlWXE+F0StvrLhXp+LOYi9Q8nAzxQV1PFBgXeGRqBj0lUz9rqhUyoYMEMguuLilMTJTbAGL7J0XjMy+jhsgVkJBBduIyzb0WoGaxLEbY+AgLeQcIKEyhBMKwyarHewDLqiTSygdS3lrRh3Cw5WuztOLbXPmqzY8f74y66db4h9jUjqms6HruzdY7Slybju6wtnq38d+HVgozv89//7UsTugw2QywwtmPLBWo7hxYYguFFq73xt+lTPzjKE0B6AlpDZJLKRCjUPU2HzKAiQaMLjpsV9H0EcpujKs1TBEGAcW7x74UDRPPxpNqUHM8LkRxSRPDAoIQ6+UK3CjhICTy6FPbJwzfWsuHHKbGQMNyGTSihVYrUYAqOvH9YBkwSQgwXPC8k0GKKkckFHLqJyMRZCCz9476RgbcIBAW0IUth7sU2u9idOx3dsvDm21D73k9zQE9uMR0T7uk6sZGMJDCAcp+AIIX3H4mv9pEmm//tSxOqDDCBxDCy9IgFeDeGFnCQIWRz0pljKGayxwBQsGVCkyAiYZMFSAW7LPbt0UosLvQK70qaso/hcYXCGdNRINQpJYlOilZsI4qDeQe5lURmYxU+BsvpEa8sLQaxaP7nVrKH3YvYaQ5abWn+Pwufx34IVAWOUYMGAAcvMTB4kqkIullmnXBd/CXZSDIp3ERGbloADedCRqb1eaYTxTSe+PsvbHmf/jo+xGjaqdtzHTv70xlP+5gPm821LW+vcAeP6tz95b5/2f3M0LbaFZyf/+1LE7APM2MUGDSTLSXKSIUGkjPjypm6AQgT4AKVr+elB6mJGqvMckBP/iE7+3tkUKG8MzUJtkbz6O8OLQfORZOw2zpUP0j0LKLPuFlMCT6FVkL3JCDK0RjevVjbeuggFo46DHRM1+lhhY8SpI3FYDnaSQXbEXsWAUCZaQiIakby50Q6e7vhaaByZoSTQxE8OEl5D9SSIc2tmrS+Z55cY0LNy4+bHnb59bmbU7FKOZ7md75F/bI4O3oaGe7i0OT/IXygz04zK/g345u4B4xaNg//7UsToAwiIbxJMJGPByaFggaSOIaQq1AbJT4cbbeuITBgTpzutZ/rMdSjQACDN+IQo3PrMXWXpA0oaLhNwHGGj7VldjHuEZgRoEbFmQgs5cGVLc4cXsj1mly40ifmdjRkbYsuhrZ6qAI57A7JAsFFXLDQ816LE5IGAHQEgUQJknIRDJhC3bzyYKo4kmgUJGj7QezC0kbMpry9MT/ZK9zZXn0prJBDe0ujx9MFOLENj+2H1V0q7E5tuC8iymtf+jfodWpzr22EH9jN/obzSsL////tSxOqDC7hjDEyww4kjDeKI8wz4///+YS6bSScYHIgxfGiN9+46N3cwY5HtXd77uGqZe2vERwVZFTqR8dtWJ+lfxb9ld7up/L1Gr08DRHp8XTu/yVUAQOfMmYMEbFgqFUWi8NU0ekMejNm8HgaEJYaFxSlIMESBGRrvW3GcFIeRoZE1MNyhI60n9Os4qkKvSrKIuzEVdpBaDqKKE3UHWtSRVTKmzn9v37DK+JDfkcUd8i3PzIqZm2jd+5X4W8Muap/54UaRYvCYWBcVA5ACgx3/+1LE9QMNRTsKTJhvSWqOYYWUmGilqwAiGH2qvGHAXJWrnHlTKSreTtFILK7IoI4DJaoYKgOnVZTU6epUjSpm7VFLSmeKfFQ+0J3OBUqbYCTNiJ2aNG1Ke9HQJCRjx5PsqpPNnwlIhVwkpFOQ5nPAQRDMyuDVrKLlc1FmZgoxVzVd/UzaiC0bvIUhENlDczy9VN22MyUkI/aGf3zhnnW3yQR3RJSIvLyyKTKZmeid7fyLy7kRLJ6Su57eXf7Mf4MN5Bta/OUcBgo0xB2olFqamv/7UsTwgA2QnwYtJMeI8ovjXPEY+O7tr5s1F/E3nF0W8UzNT3vOT5kcKWSMJSzfQcy5E7TyTJmDSr+ZMmkh9FkSGinL17FPppN9DKpcwUJL32I3ujR8nzZyxzpDvinE4XfW5rU/lgT/GQnPWFMwVHQsJ02IomSjUTY4SuivR9Q5YrO0ZPk8qaIanGkTT4Gs1skYfcmn8+hj02fMv2jzNfEyFFeMzhhT75zIHOMTcoa/Q9G8cRQXwgA8gYTzQkxUjMj9Hnk+DlMdfN7lv+YARdiQ//tSxPmDDvWJBC0kbdFdE2FJlIyw3blG2vPnaj8RiUNWTCAkswSzGVBSPDo8kJj5g3Sas4zJaIGzm6yynqHSVpjXLko6OZCzh5wzZieK4y/CknyKZG3Z03gNrW8tMNrlP86Vh9uZnnpztXyvP+Z5ebH6KD+W6wBJ5MMA0mXXCE3Fqoxqi2kTLRCkNNjROgXQH0AltC5XIwfrLTK2PZ1FjTn4/Nai0hpWmg3m5ZljqeVDhwqEr8KTUzRQl/vjbu7ev1dvcsu/SLfzrjTfl/xion7/+1LE8AMLKXkObDBgQYqnoYmTDXlYsASZrrQPSzcttz4k4DWS8IDTXmkmwl55Iw2ZNfjSKO3OMylBa4zPRMQGEDigI1War+q7McYCagahRXsdVSDLGP1KKpfn1m6pfWbL+qfqUY19VXZj9VVYGaDXDqoFAtxs55BYFH9kBND8QCqbmYgiFghocgeimYasgfSBk7D1FtqBdIH0qy6QPpRMrEHbLbNastsuH22y4fYeUzJTMLqDJ2H2LrYfYust9i6y2yLpA9sTMpC2xMyUyyMBDP/7UsTwAwyAlQQtJMWJlCtgBbSNeJiwsikgpJyK5FJGRzkViyCdHIWWLI5A+QsqRRgLX4rpfBmOpkhoEhJ6JIkFQEKgIWArB6RYCtH/jEjEfWjqrSrpF/9iGO7Etd/8f/qqTEFNRTMuMTAwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tSxOmDiyx4/i2xIpl3KJ0B0w04qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+1LE64MPVQ8IbLDCiMKDIEj2GAiqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==\",\n  duration: 0.779,\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.779,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "impact",
      "plank",
      "medium",
      "002"
    ],
    "keywords": [
      "impact",
      "plank",
      "medium",
      "distinct",
      "wooden",
      "knock",
      "ui alert",
      "new element",
      "action complete",
      "natural",
      "grounded",
      "feedback",
      "short",
      "audible",
      "confirm",
      "game sfx",
      "subtle",
      "wooden block",
      "pop",
      "interface"
    ]
  },
  "categories": [
    "impact"
  ]
}