Static helper that walks a panel's descendants and wires a tap sound listener onto every Button it hasn't already handled. Uses a ConditionalWeakTable so rebuilt Razor buttons don't accumulate duplicate listeners.
using Sandbox.UI;
using System.Linq;
using System.Runtime.CompilerServices;
namespace Socer;
// Razor may rebuild buttons at any time. Weak keys keep removed panels collectible.
public static class MenuButtonAudio
{
[Sandbox.SkipHotload]
static readonly ConditionalWeakTable<Button,object> wired=new();
public static void Attach(Panel root)
{
if(root==null)return;
foreach(var button in root.Descendants.OfType<Button>())
{
if(wired.TryGetValue(button,out _))continue;
button.AddEventListener("onclick",GameAudio.Tap);
wired.Add(button,new object());
}
}
}