features/rewrite/dropdown #14
							
								
								
									
										107
									
								
								src/Connected.Components/Components/TransitionAnimator.razor
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								src/Connected.Components/Components/TransitionAnimator.razor
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,107 @@
 | 
			
		||||
@using Connected.Utilities;
 | 
			
		||||
 | 
			
		||||
<div class="@ClassList" @ontransitionend="TransitionEnd" @onanimationend="TransitionEnd">
 | 
			
		||||
   @if (ContentVisible)
 | 
			
		||||
   {
 | 
			
		||||
      @ChildContent
 | 
			
		||||
   }
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
   .transition-container-component {
 | 
			
		||||
      transition: all @(TransitionDuration)ms;
 | 
			
		||||
   }
 | 
			
		||||
</style>
 | 
			
		||||
 | 
			
		||||
@code {
 | 
			
		||||
   private bool _visible = false;
 | 
			
		||||
 | 
			
		||||
   /// <summary>
 | 
			
		||||
   /// The class to append to the container while content is visible and transitioning in
 | 
			
		||||
   /// </summary>
 | 
			
		||||
   [Parameter, EditorRequired]
 | 
			
		||||
   public string? TransitionInClass { get; set; }
 | 
			
		||||
 | 
			
		||||
   /// <summary>
 | 
			
		||||
   /// The class to append to the container while content is transitioning out and hidden
 | 
			
		||||
   /// </summary>
 | 
			
		||||
   [Parameter, EditorRequired]
 | 
			
		||||
   public string? TransitionOutClass { get; set; }
 | 
			
		||||
 | 
			
		||||
   /// <summary>
 | 
			
		||||
   /// The class to append to the container to control transitions
 | 
			
		||||
   /// </summary>
 | 
			
		||||
   [Parameter]
 | 
			
		||||
   public string? TransitionContainerClass { get; set; } = "transition-container-component";
 | 
			
		||||
 | 
			
		||||
   /// <summary>
 | 
			
		||||
   /// Controls the visibility of the child content
 | 
			
		||||
   /// </summary>
 | 
			
		||||
   [Parameter, EditorRequired]
 | 
			
		||||
   public bool Visible { get => _visible; set => StartTransition(value); }
 | 
			
		||||
 | 
			
		||||
   /// <summary>
 | 
			
		||||
   /// The content to show/hide
 | 
			
		||||
   /// </summary>
 | 
			
		||||
   [Parameter, EditorRequired]
 | 
			
		||||
   public RenderFragment? ChildContent { get; set; }
 | 
			
		||||
 | 
			
		||||
   /// <summary>
 | 
			
		||||
   /// Indicates a transition has ended. Useful for visual cleanup.
 | 
			
		||||
   /// </summary>
 | 
			
		||||
   [Parameter]
 | 
			
		||||
   public EventCallback TransitionEnded { get; set; }
 | 
			
		||||
 | 
			
		||||
   /// <summary>
 | 
			
		||||
   /// The duration of transitions in milliseconds.
 | 
			
		||||
   /// </summary>
 | 
			
		||||
   [Parameter]
 | 
			
		||||
   public int TransitionDuration { get; set; } = 2000;
 | 
			
		||||
 | 
			
		||||
   private bool TransitioningIn { get; set; }
 | 
			
		||||
   
 | 
			
		||||
   private bool TransitioningOut { get; set; }
 | 
			
		||||
 | 
			
		||||
   private bool ContentVisible { get; set; }
 | 
			
		||||
 | 
			
		||||
   private CssBuilder ClassList
 | 
			
		||||
   {
 | 
			
		||||
      get
 | 
			
		||||
      {
 | 
			
		||||
         return new CssBuilder(TransitionContainerClass)
 | 
			
		||||
         .AddClass(TransitionInClass, TransitioningIn)
 | 
			
		||||
         .AddClass(TransitionOutClass, TransitioningOut);
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   private void StartTransition(bool visible)
 | 
			
		||||
   {
 | 
			
		||||
      if (visible == Visible)
 | 
			
		||||
         return;
 | 
			
		||||
 | 
			
		||||
      _visible = visible;
 | 
			
		||||
 | 
			
		||||
      TransitioningIn = visible;
 | 
			
		||||
 | 
			
		||||
      TransitioningOut = !visible;
 | 
			
		||||
 | 
			
		||||
      if (visible)
 | 
			
		||||
         ContentVisible = true;
 | 
			
		||||
 | 
			
		||||
      StateHasChanged();
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   private void TransitionEnd()
 | 
			
		||||
   {
 | 
			
		||||
      ContentVisible = Visible;
 | 
			
		||||
      StateHasChanged();
 | 
			
		||||
 | 
			
		||||
      TransitionEnded.InvokeAsync();
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   protected override void OnInitialized()
 | 
			
		||||
   {
 | 
			
		||||
      base.OnInitialized();
 | 
			
		||||
      ContentVisible = Visible;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user