UI/ui_state_manager.cs
using System;
using System.Collections.Generic;
using System.Linq;
using Sandbox;

public sealed class UIStateManager : Component
{
	public static UIStateManager Instance { get; private set; }

	private static readonly HashSet<object> _activeLocks = new();

	public static bool IsGameplayLocked => _activeLocks.Count > 0;

	protected override void OnAwake()
	{
		Instance = this;
		UpdateMouseState();
	}

	public static void RequestFocus( object source )
	{
		if ( source == null ) return;
		_activeLocks.Add( source );
		UpdateMouseState();
	}

	public static void ReleaseFocus( object source )
	{
		if ( source == null ) return;
		_activeLocks.Remove( source );
		UpdateMouseState();
	}

	public static void ClearAllFocus()
	{
		_activeLocks.Clear();
		UpdateMouseState();
	}

	private static void UpdateMouseState()
	{
		Mouse.Visibility = IsGameplayLocked ? MouseVisibility.Visible : MouseVisibility.Hidden;
	}
}