/// <summary>
        /// Performs the animated ending of a button's highlighted state
        /// </summary>
        IEnumerator EndHighlight()
        {
            this.StopCoroutine(ref m_IconHighlightCoroutine);
            m_IconHighlightCoroutine = StartCoroutine(IconContainerContentsEndHighlight());

            var transitionAmount     = Time.deltaTime;
            var originalGradientPair = GetMaterialColors();
            var targetGradientPair   = normalGradientPair;
            var currentLocalScale    = m_ContentContainer.localScale;
            var targetScale          = m_OriginalContentContainerLocalScale;
            var highlightDuration    = m_EndHighlightDuration > 0f ? m_EndHighlightDuration : 0.01f; // Add sane default if highlight duration is zero

            while (transitionAmount < highlightDuration)
            {
                var shapedTransitionAmount    = MathUtilsExt.SmoothInOutLerpFloat(transitionAmount += Time.unscaledDeltaTime / highlightDuration);
                var transitioningGradientPair = GradientPair.Lerp(originalGradientPair, targetGradientPair, shapedTransitionAmount);
                SetMaterialColors(transitioningGradientPair);
                m_ContentContainer.localScale = Vector3.Lerp(currentLocalScale, targetScale, shapedTransitionAmount);
                yield return(null);
            }

            SetMaterialColors(normalGradientPair);
            m_ContentContainer.localScale = targetScale;
            m_HighlightCoroutine          = null;
        }
        /// <summary>
        /// Performs the animated beginning of a button's highlighted state
        /// </summary>
        IEnumerator BeginHighlight()
        {
            this.StopCoroutine(ref m_IconHighlightCoroutine);
            m_IconHighlightCoroutine = StartCoroutine(IconContainerContentsBeginHighlight());

            var transitionAmount      = Time.deltaTime;
            var currentGradientPair   = GetMaterialColors();
            var targetGradientPair    = highlightGradientPair;
            var currentLocalScale     = m_ContentContainer.localScale;
            var highlightedLocalScale = m_HighlightContentContainerLocalScale;
            var highlightDuration     = m_BeginHighlightDuration;

            while (transitionAmount < highlightDuration) // Skip while look if user has set the m_BeginHighlightDuration to a value at or below zero
            {
                var shapedTransitionAmount = MathUtilsExt.SmoothInOutLerpFloat(transitionAmount += Time.unscaledDeltaTime / highlightDuration);
                m_ContentContainer.localScale = Vector3.Lerp(currentLocalScale, highlightedLocalScale, shapedTransitionAmount);
                currentGradientPair           = GradientPair.Lerp(currentGradientPair, targetGradientPair, shapedTransitionAmount);
                SetMaterialColors(currentGradientPair);
                yield return(null);
            }

            SetMaterialColors(targetGradientPair);
            m_ContentContainer.localScale = highlightedLocalScale;
            m_HighlightCoroutine          = null;
        }
        /// <summary>
        /// Performs the animated ending of a button's highlighted state
        /// </summary>
        IEnumerator EndHighlight()
        {
            this.StopCoroutine(ref m_IconHighlightCoroutine);
            m_IconHighlightCoroutine = StartCoroutine(IconContainerContentsEndHighlight());

            const float kTargetTransitionAmount = 1f;
            var transitionAmount = Time.unscaledDeltaTime;
            var shapedTransitionAmount = 0f;
            var currentGradientPair = GetMaterialColors();
            var targetGradientPair = normalGradientPair;
            var currentLocalScale = m_ContentContainer.localScale;
            var targetScale = m_OriginalContentContainerLocalScale;
            while (transitionAmount < kTargetTransitionAmount)
            {
                transitionAmount += Time.unscaledDeltaTime * 3;
                shapedTransitionAmount = Mathf.Pow(transitionAmount, 2);
                currentGradientPair = GradientPair.Lerp(currentGradientPair, targetGradientPair, shapedTransitionAmount);

                SetMaterialColors(normalGradientPair);

                m_ContentContainer.localScale = Vector3.Lerp(currentLocalScale, targetScale, shapedTransitionAmount);
                yield return null;
            }

            SetMaterialColors(normalGradientPair);
            m_ContentContainer.localScale = targetScale;
            m_HighlightCoroutine = null;
        }
        /// <summary>
        /// Performs the animated beginning of a button's highlighted state
        /// </summary>
        IEnumerator BeginHighlight()
        {
            this.StopCoroutine(ref m_IconHighlightCoroutine);
            m_IconHighlightCoroutine = StartCoroutine(IconContainerContentsBeginHighlight());

            const float kTargetTransitionAmount = 1f;
            var transitionAmount = Time.unscaledDeltaTime;
            var shapedTransitionAmount = 0f;
            var currentGradientPair = GetMaterialColors();
            var targetGradientPair = highlightGradientPair;
            var currentLocalScale = m_ContentContainer.localScale;
            var highlightedLocalScale = new Vector3(m_OriginalContentContainerLocalScale.x, m_OriginalContentContainerLocalScale.y, m_OriginalContentContainerLocalScale.z * m_highlightZScaleMultiplier);
            while (transitionAmount < kTargetTransitionAmount)
            {
                transitionAmount += Time.unscaledDeltaTime * 3;
                shapedTransitionAmount = Mathf.Pow(transitionAmount, 2);
                m_ContentContainer.localScale = Vector3.Lerp(currentLocalScale, highlightedLocalScale, shapedTransitionAmount);

                currentGradientPair = GradientPair.Lerp(currentGradientPair, targetGradientPair, shapedTransitionAmount);
                SetMaterialColors(currentGradientPair);
                yield return null;
            }

            SetMaterialColors(targetGradientPair);
            m_ContentContainer.localScale = highlightedLocalScale;
            m_HighlightCoroutine = null;
        }
        public void Lerp_Interpolates_StartAndEndColors()
        {
            var x      = new GradientPair(m_ColorA, m_ColorB);
            var y      = new GradientPair(m_ColorC, m_ColorD);
            var lerped = GradientPair.Lerp(x, y, .1f);

            Assert.AreEqual(Color.Lerp(x.a, y.a, .1f), lerped.a);
            Assert.AreEqual(Color.Lerp(x.b, y.b, .1f), lerped.b);
        }