Demo/UI/DemoUI.razor
@using System.Collections.Generic
@using Andicraft.SecondOrderDynamics
@using Andicraft.SecondOrderDynamics.Components
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent
@namespace Sandbox

<root>
	<div class="demo-ui-container">
		<div class="header">
			<button onclick="@PreviousSlide" class="slide-btn">Previous</button>
			<div class="title">@SlideTitle</div>
			<button onclick="@NextSlide" class="slide-btn">Next</button>
		</div>
		@if ( DemoController.CurrentSlide == 2 )
		{
			<div class="sliders">
				<div class="slider">
					<div class="label">Frequency</div>
					<SliderControl Min="@( 0.01f )" Max="@( 5 )" Step="@( 0.01f )" Value="@SlideThreeFollower.PositionParameters.Frequency" OnValueChanged="@FrequencyChanged" ShowRange="@false"/>
				</div>
				<div class="slider">
					<div class="label">Damping</div>
					<SliderControl Min="@( 0 )" Max="@( 4 )" Step="@( 0.01f )" Value="@SlideThreeFollower.PositionParameters.Damping" OnValueChanged="@DampingChanged" ShowRange="@false"/>
				</div>
				<div class="slider">
					<div class="label">Response</div>
					<SliderControl Min="@( -1 )" Max="@( 2 )" Step="@( 0.01f )" Value="@SlideThreeFollower.PositionParameters.Response" OnValueChanged="@ResponseChanged" ShowRange="@false"/>
				</div>
			</div>
		}
		<div class="footer"><p>@SlideDescription</p></div>
	</div>
</root>

@code
{
	[Property] List<string> SlideTitles { get; set; } = [];
	[Property] List<string> SlideDescriptions { get; set; } = [];
    [Property] SODDemoControllerComponent DemoController { get; set; }
    [Property] FollowTargetComponent SlideThreeFollower { get; set; }

    private void FrequencyChanged( float v )
    {
	    var p = SlideThreeFollower.PositionParameters;
	    SlideThreeFollower.UpdatePositionParameters( new DynamicsParameters(v, p.Response, p.Damping) );
    }
    
    private void DampingChanged( float v )
    {
	    var p = SlideThreeFollower.PositionParameters;
	    SlideThreeFollower.UpdatePositionParameters( new DynamicsParameters(p.Frequency, p.Response, v) );
    }
    
    private void ResponseChanged( float v )
    {
	    var p = SlideThreeFollower.PositionParameters;
	    SlideThreeFollower.UpdatePositionParameters( new DynamicsParameters(p.Frequency, v, p.Damping) );
    }

	private void NextSlide() => DemoController.ChangeSlide( 1 );
	private void PreviousSlide() => DemoController.ChangeSlide( -1 );

	private string SlideTitle => SlideTitles[DemoController.CurrentSlide];
	private string SlideDescription => SlideDescriptions[DemoController.CurrentSlide];

}