MenuButtonAudio.cs

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());
        }
    }
}