diff options
| author | Fuwn <[email protected]> | 2024-01-30 20:53:24 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2024-01-30 20:53:24 -0800 |
| commit | 0d3553c22391afcad2770fdab088b42a3aae97dc (patch) | |
| tree | 3987da52c8e7f352312190996c9c54ca1c207492 /src/lib/Loading | |
| parent | fix(birthdays): anisearch if browser (diff) | |
| download | due.moe-0d3553c22391afcad2770fdab088b42a3aae97dc.tar.xz due.moe-0d3553c22391afcad2770fdab088b42a3aae97dc.zip | |
feat(badges): cool loading message
Diffstat (limited to 'src/lib/Loading')
| -rw-r--r-- | src/lib/Loading/Ellipsis.svelte | 72 | ||||
| -rw-r--r-- | src/lib/Loading/Message.svelte | 35 | ||||
| -rw-r--r-- | src/lib/Loading/Ripple.svelte | 42 |
3 files changed, 149 insertions, 0 deletions
diff --git a/src/lib/Loading/Ellipsis.svelte b/src/lib/Loading/Ellipsis.svelte new file mode 100644 index 00000000..1dbe3b9f --- /dev/null +++ b/src/lib/Loading/Ellipsis.svelte @@ -0,0 +1,72 @@ +<div class="ellipsis"> + <div /> + <div /> + <div /> + <div /> +</div> + +<style> + .ellipsis { + display: inline-block; + position: relative; + width: 80px; + height: 80px; + } + + .ellipsis div { + position: absolute; + top: 33px; + width: 13px; + height: 13px; + border-radius: 50%; + background: #fff; + animation-timing-function: cubic-bezier(0, 1, 1, 0); + } + + .ellipsis div:nth-child(1) { + left: 8px; + animation: ellipsis-1 0.6s infinite; + } + + .ellipsis div:nth-child(2) { + left: 8px; + animation: ellipsis-2 0.6s infinite; + } + + .ellipsis div:nth-child(3) { + left: 32px; + animation: ellipsis-2 0.6s infinite; + } + + .ellipsis div:nth-child(4) { + left: 56px; + animation: ellipsis-3 0.6s infinite; + } + + @keyframes ellipsis-1 { + 0% { + transform: scale(0); + } + 100% { + transform: scale(1); + } + } + + @keyframes ellipsis-2 { + 0% { + transform: translate(0, 0); + } + 100% { + transform: translate(24px, 0); + } + } + + @keyframes ellipsis-3 { + 0% { + transform: scale(1); + } + 100% { + transform: scale(0); + } + } +</style> diff --git a/src/lib/Loading/Message.svelte b/src/lib/Loading/Message.svelte new file mode 100644 index 00000000..b00cb386 --- /dev/null +++ b/src/lib/Loading/Message.svelte @@ -0,0 +1,35 @@ +<script lang="ts"> + import Ellipsis from './Ellipsis.svelte'; + import Ripple from './Ripple.svelte'; + + export let message = 'Loading ...'; + export let loader: 'ellipsis' | 'ripple' = 'ellipsis'; +</script> + +<div class="card popup"> + {#if loader === 'ellipsis'} + <Ellipsis /> + {:else if loader === 'ripple'} + <Ripple /> + {/if} + + <p /> + + {#if message} + <p>{message}</p> + {/if} +</div> + +<style> + .popup { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 9999; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + } +</style> diff --git a/src/lib/Loading/Ripple.svelte b/src/lib/Loading/Ripple.svelte new file mode 100644 index 00000000..33e2ab8b --- /dev/null +++ b/src/lib/Loading/Ripple.svelte @@ -0,0 +1,42 @@ +<div class="ripple"> + <div /> + <div /> +</div> + +<style> + .ripple { + display: inline-block; + position: relative; + width: 80px; + height: 80px; + } + + .ripple div { + position: absolute; + border: 4px solid #fff; + opacity: 1; + border-radius: 50%; + animation: ripple 1s cubic-bezier(0, 0.2, 0.8, 1) infinite; + } + + .ripple div:nth-child(2) { + animation-delay: -0.5s; + } + + @keyframes ripple { + 0% { + top: 36px; + left: 36px; + width: 0; + height: 0; + opacity: 1; + } + 100% { + top: 0px; + left: 0px; + width: 72px; + height: 72px; + opacity: 0; + } + } +</style> |