parent
86e32a197b
commit
455119f467
@ -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…
Reference in new issue