using System; using System.Threading; using Cysharp.Threading.Tasks; using PrimeTween; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace BriarQueen.UI.Menus.Components { [ExecuteAlways] [RequireComponent(typeof(Button))] public class AnimatedSelectionButton : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler, ISelectHandler, IDeselectHandler { private const string DefaultRevealPropertyName = "_Reveal"; [Header("References")] [SerializeField] private Button _button; [SerializeField] private RectTransform _selectionBackground; [SerializeField] private TextMeshProUGUI _label; [Header("Background Sizing")] [SerializeField] private Vector2 _backgroundPadding = new(24f, 6f); [SerializeField] private bool _matchBackgroundToLabelPosition = true; [Header("Background Material")] [SerializeField] private bool _useShaderReveal = true; [SerializeField] private Material _selectionMaterial; [SerializeField] private Color _selectionColor = new(0.02f, 0.018f, 0.015f, 0.35f); [SerializeField] private string _revealPropertyName = "_Reveal"; [Header("Edit Preview")] [SerializeField] private bool _previewInEditMode; [SerializeField][Range(0f, 1f)] private float _previewReveal = 1f; [Header("Tween Settings")] [SerializeField] private float _selectDuration = 0.18f; [SerializeField] private float _deselectDuration = 0.12f; [SerializeField] private Ease _ease = Ease.InOutSine; [SerializeField] private bool _useUnscaledTime = true; private CancellationTokenSource _selectionCts; private Graphic _selectionBackgroundGraphic; private Material _sourceSelectionMaterial; private Material _runtimeSelectionMaterial; private Sequence _selectionSequence; private int _animationVersion; private int _colorPropertyId; private int _revealPropertyId; private float _backgroundProgress; private bool _isSelected; // Group listens to these to coordinate highlight state public event Action SelectionRequested; public event Action HoverEntered; public event Action HoverExited; public Button Button { get { if (_button == null) _button = GetComponent