2022-07-07 23:45:44 +00:00
|
|
|
<script lang="ts">
|
2023-09-19 00:48:39 +00:00
|
|
|
import { fade } from 'svelte/transition';
|
2022-07-07 23:45:44 +00:00
|
|
|
|
|
|
|
|
interface Transition {
|
2022-07-28 00:05:54 +00:00
|
|
|
type: 'fade' | 'stagger' | 'page';
|
|
|
|
|
duration?: number;
|
|
|
|
|
delay?: number;
|
2022-07-07 23:45:44 +00:00
|
|
|
}
|
|
|
|
|
|
2023-05-05 22:53:35 +00:00
|
|
|
export let url: string = "";
|
2022-07-28 00:05:54 +00:00
|
|
|
export let transition: Transition;
|
2022-07-07 23:45:44 +00:00
|
|
|
</script>
|
|
|
|
|
|
2023-05-05 22:53:35 +00:00
|
|
|
{#if transition.type === 'page' && url}
|
|
|
|
|
<div class="transition" style="display: grid;">
|
|
|
|
|
{#key url}
|
2023-07-18 21:26:41 +00:00
|
|
|
<div style="grid-row: 1 / -1; grid-column: 1 / -1;" in:fade|global={{ duration: 400, delay: 400 }} out:fade|global={{ duration: 400}}>
|
2023-05-05 22:53:35 +00:00
|
|
|
<slot />
|
|
|
|
|
</div>
|
|
|
|
|
{/key}
|
|
|
|
|
</div>
|
2022-07-07 23:45:44 +00:00
|
|
|
{/if}
|
|
|
|
|
|
|
|
|
|
{#if transition.type === 'fade'}
|
|
|
|
|
<div
|
2023-05-05 22:53:35 +00:00
|
|
|
class="fade transition"
|
2022-07-07 23:45:44 +00:00
|
|
|
style:animation-duration="{transition.duration}ms"
|
|
|
|
|
style:animation-delay="{transition.delay}ms"
|
|
|
|
|
>
|
|
|
|
|
<slot />
|
|
|
|
|
</div>
|
|
|
|
|
{/if}
|
|
|
|
|
|
|
|
|
|
{#if transition.type === 'stagger'}
|
|
|
|
|
<div
|
2023-05-05 22:53:35 +00:00
|
|
|
class="stagger transition"
|
2024-07-18 23:52:11 +00:00
|
|
|
style:animation-duration="{transition.duration || 300}ms"
|
2022-07-07 23:45:44 +00:00
|
|
|
style:animation-delay="{transition.delay}ms"
|
|
|
|
|
>
|
|
|
|
|
<slot />
|
|
|
|
|
</div>
|
|
|
|
|
{/if}
|
|
|
|
|
|
|
|
|
|
<style>
|
2023-05-05 22:53:35 +00:00
|
|
|
.transition {
|
2022-07-07 23:45:44 +00:00
|
|
|
height: 100%;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.fade {
|
|
|
|
|
animation-name: fadeIn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.stagger {
|
|
|
|
|
opacity: 0;
|
|
|
|
|
animation-name: stagger;
|
|
|
|
|
animation-fill-mode: forwards;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@keyframes fadeIn {
|
|
|
|
|
from {
|
|
|
|
|
opacity: 0;
|
|
|
|
|
}
|
|
|
|
|
to {
|
|
|
|
|
opacity: 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@keyframes stagger {
|
|
|
|
|
from {
|
|
|
|
|
opacity: 0;
|
|
|
|
|
transform: translateY(50px);
|
|
|
|
|
}
|
|
|
|
|
to {
|
|
|
|
|
opacity: 1;
|
|
|
|
|
transform: translateY(0px);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|