aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Loading
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-01-30 20:53:24 -0800
committerFuwn <[email protected]>2024-01-30 20:53:24 -0800
commit0d3553c22391afcad2770fdab088b42a3aae97dc (patch)
tree3987da52c8e7f352312190996c9c54ca1c207492 /src/lib/Loading
parentfix(birthdays): anisearch if browser (diff)
downloaddue.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.svelte72
-rw-r--r--src/lib/Loading/Message.svelte35
-rw-r--r--src/lib/Loading/Ripple.svelte42
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>