From 7abc7dea0ee9c9d89f7af1eab8b86909af36120b Mon Sep 17 00:00:00 2001 From: momo5502 Date: Thu, 25 Sep 2025 20:12:23 +0200 Subject: [PATCH] Extract loader --- page/src/App.tsx | 28 +- page/src/Loader.ts | 49 ++++ page/src/animation.css | 622 ++++++++++++++++++++--------------------- page/src/main.tsx | 9 +- 4 files changed, 367 insertions(+), 341 deletions(-) create mode 100644 page/src/Loader.ts diff --git a/page/src/App.tsx b/page/src/App.tsx index 82a7561b..31b9523c 100644 --- a/page/src/App.tsx +++ b/page/src/App.tsx @@ -3,8 +3,8 @@ import { TooltipProvider } from "@/components/ui/tooltip"; import { HashRouter, Route, Routes, Navigate } from "react-router-dom"; import { Playground, storeEmulateData } from "./playground"; import { LandingPage } from "./landing-page"; -import { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; +import Loader from "./Loader"; import "@fontsource/inter/latin.css"; @@ -17,28 +17,8 @@ function EmulateFile() { return ; } -function isWindowLoading() { - return !!(window as any).loading; -} - -function useLoader() { - const [isLoading, setIsLoading] = useState(isWindowLoading()); - - useEffect(() => { - const id = setInterval(() => { - setIsLoading(isWindowLoading()); - }, 60); - - return () => { - clearInterval(id); - }; - }); - - return isLoading; -} - -function Loader() { - const loading = useLoader(); +function Spinner() { + const loading = Loader.useLoader(); if (!loading) { return <>; @@ -61,7 +41,7 @@ function App() { } /> - + ); diff --git a/page/src/Loader.ts b/page/src/Loader.ts new file mode 100644 index 00000000..bc6ac5d2 --- /dev/null +++ b/page/src/Loader.ts @@ -0,0 +1,49 @@ +import { useEffect, useState } from "react"; + +type Callback = (loading: boolean) => void; + +class Loader { + private callbacks: Set = new Set(); + private loading: boolean = false; + + public isLoading(): boolean { + return this.loading; + } + + public setLoading(value: boolean) { + if (this.loading == value) { + return; + } + + this.loading = value; + this.callbacks.forEach((callback) => callback(this.loading)); + } + + public register(callback: Callback): void { + this.callbacks.add(callback); + } + + public unregister(callback: Callback): void { + this.callbacks.delete(callback); + } + + public useLoader() { + const [isLoading, setIsLoading] = useState(this.isLoading()); + + useEffect(() => { + function callback(loading: boolean) { + setIsLoading(loading); + } + + this.register(callback); + + return () => { + this.unregister(callback); + }; + }); + + return isLoading; + } +} + +export default new Loader(); diff --git a/page/src/animation.css b/page/src/animation.css index 204d33b0..cc13b131 100644 --- a/page/src/animation.css +++ b/page/src/animation.css @@ -1,311 +1,311 @@ -:root { - --ring-full-color: #ffffff00; - --ring-half-color: #ffffff75; -} - -/** - * Ring of dots - * - * @author jh3y -*/ -@-webkit-keyframes ring-of-dots { - 0% { - -webkit-box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 var(--ring-half-color), - 12.4698px -15.63663px 0 0 var(--ring-full-color); - box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 var(--ring-half-color), - 12.4698px -15.63663px 0 0 var(--ring-full-color); - } - 14.28571% { - -webkit-box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 var(--ring-half-color), - -4.45042px -19.49856px 0 0 var(--ring-full-color), - 12.4698px -15.63663px 0 0 white; - box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 var(--ring-half-color), - -4.45042px -19.49856px 0 0 var(--ring-full-color), - 12.4698px -15.63663px 0 0 white; - } - 28.57143% { - -webkit-box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 var(--ring-half-color), - -18.01938px -8.67767px 0 0 var(--ring-full-color), - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 var(--ring-half-color), - -18.01938px -8.67767px 0 0 var(--ring-full-color), - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - } - 42.85714% { - -webkit-box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 var(--ring-half-color), - -18.01938px 8.67767px 0 0 var(--ring-full-color), - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 var(--ring-half-color), - -18.01938px 8.67767px 0 0 var(--ring-full-color), - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - } - 57.14286% { - -webkit-box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 var(--ring-half-color), - -4.45042px 19.49856px 0 0 var(--ring-full-color), - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 var(--ring-half-color), - -4.45042px 19.49856px 0 0 var(--ring-full-color), - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - } - 71.42857% { - -webkit-box-shadow: - 20px 0px 0 0 var(--ring-half-color), - 12.4698px 15.63663px 0 0 var(--ring-full-color), - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - box-shadow: - 20px 0px 0 0 var(--ring-half-color), - 12.4698px 15.63663px 0 0 var(--ring-full-color), - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - } - 85.71429% { - -webkit-box-shadow: - 20px 0px 0 0 var(--ring-full-color), - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 var(--ring-half-color); - box-shadow: - 20px 0px 0 0 var(--ring-full-color), - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 var(--ring-half-color); - } - 100% { - -webkit-box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 var(--ring-half-color), - 12.4698px -15.63663px 0 0 var(--ring-full-color); - box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 var(--ring-half-color), - 12.4698px -15.63663px 0 0 var(--ring-full-color); - } -} -@keyframes ring-of-dots { - 0% { - -webkit-box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 var(--ring-half-color), - 12.4698px -15.63663px 0 0 var(--ring-full-color); - box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 var(--ring-half-color), - 12.4698px -15.63663px 0 0 var(--ring-full-color); - } - 14.28571% { - -webkit-box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 var(--ring-half-color), - -4.45042px -19.49856px 0 0 var(--ring-full-color), - 12.4698px -15.63663px 0 0 white; - box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 var(--ring-half-color), - -4.45042px -19.49856px 0 0 var(--ring-full-color), - 12.4698px -15.63663px 0 0 white; - } - 28.57143% { - -webkit-box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 var(--ring-half-color), - -18.01938px -8.67767px 0 0 var(--ring-full-color), - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 var(--ring-half-color), - -18.01938px -8.67767px 0 0 var(--ring-full-color), - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - } - 42.85714% { - -webkit-box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 var(--ring-half-color), - -18.01938px 8.67767px 0 0 var(--ring-full-color), - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 var(--ring-half-color), - -18.01938px 8.67767px 0 0 var(--ring-full-color), - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - } - 57.14286% { - -webkit-box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 var(--ring-half-color), - -4.45042px 19.49856px 0 0 var(--ring-full-color), - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 var(--ring-half-color), - -4.45042px 19.49856px 0 0 var(--ring-full-color), - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - } - 71.42857% { - -webkit-box-shadow: - 20px 0px 0 0 var(--ring-half-color), - 12.4698px 15.63663px 0 0 var(--ring-full-color), - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - box-shadow: - 20px 0px 0 0 var(--ring-half-color), - 12.4698px 15.63663px 0 0 var(--ring-full-color), - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 white; - } - 85.71429% { - -webkit-box-shadow: - 20px 0px 0 0 var(--ring-full-color), - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 var(--ring-half-color); - box-shadow: - 20px 0px 0 0 var(--ring-full-color), - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 white, - 12.4698px -15.63663px 0 0 var(--ring-half-color); - } - 100% { - -webkit-box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 var(--ring-half-color), - 12.4698px -15.63663px 0 0 var(--ring-full-color); - box-shadow: - 20px 0px 0 0 white, - 12.4698px 15.63663px 0 0 white, - -4.45042px 19.49856px 0 0 white, - -18.01938px 8.67767px 0 0 white, - -18.01938px -8.67767px 0 0 white, - -4.45042px -19.49856px 0 0 var(--ring-half-color), - 12.4698px -15.63663px 0 0 var(--ring-full-color); - } -} - -.ring-of-dots:before { - animation: ring-of-dots 1s infinite linear reverse; - border-radius: 10px; - content: ""; - display: block; - height: 10px; - width: 10px; -} +:root { + --ring-full-color: #ffffff00; + --ring-half-color: #ffffff75; +} + +/** + * Ring of dots + * + * @author jh3y +*/ +@-webkit-keyframes ring-of-dots { + 0% { + -webkit-box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 var(--ring-half-color), + 12.4698px -15.63663px 0 0 var(--ring-full-color); + box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 var(--ring-half-color), + 12.4698px -15.63663px 0 0 var(--ring-full-color); + } + 14.28571% { + -webkit-box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 var(--ring-half-color), + -4.45042px -19.49856px 0 0 var(--ring-full-color), + 12.4698px -15.63663px 0 0 white; + box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 var(--ring-half-color), + -4.45042px -19.49856px 0 0 var(--ring-full-color), + 12.4698px -15.63663px 0 0 white; + } + 28.57143% { + -webkit-box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 var(--ring-half-color), + -18.01938px -8.67767px 0 0 var(--ring-full-color), + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 var(--ring-half-color), + -18.01938px -8.67767px 0 0 var(--ring-full-color), + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + } + 42.85714% { + -webkit-box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 var(--ring-half-color), + -18.01938px 8.67767px 0 0 var(--ring-full-color), + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 var(--ring-half-color), + -18.01938px 8.67767px 0 0 var(--ring-full-color), + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + } + 57.14286% { + -webkit-box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 var(--ring-half-color), + -4.45042px 19.49856px 0 0 var(--ring-full-color), + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 var(--ring-half-color), + -4.45042px 19.49856px 0 0 var(--ring-full-color), + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + } + 71.42857% { + -webkit-box-shadow: + 20px 0px 0 0 var(--ring-half-color), + 12.4698px 15.63663px 0 0 var(--ring-full-color), + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + box-shadow: + 20px 0px 0 0 var(--ring-half-color), + 12.4698px 15.63663px 0 0 var(--ring-full-color), + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + } + 85.71429% { + -webkit-box-shadow: + 20px 0px 0 0 var(--ring-full-color), + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 var(--ring-half-color); + box-shadow: + 20px 0px 0 0 var(--ring-full-color), + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 var(--ring-half-color); + } + 100% { + -webkit-box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 var(--ring-half-color), + 12.4698px -15.63663px 0 0 var(--ring-full-color); + box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 var(--ring-half-color), + 12.4698px -15.63663px 0 0 var(--ring-full-color); + } +} +@keyframes ring-of-dots { + 0% { + -webkit-box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 var(--ring-half-color), + 12.4698px -15.63663px 0 0 var(--ring-full-color); + box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 var(--ring-half-color), + 12.4698px -15.63663px 0 0 var(--ring-full-color); + } + 14.28571% { + -webkit-box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 var(--ring-half-color), + -4.45042px -19.49856px 0 0 var(--ring-full-color), + 12.4698px -15.63663px 0 0 white; + box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 var(--ring-half-color), + -4.45042px -19.49856px 0 0 var(--ring-full-color), + 12.4698px -15.63663px 0 0 white; + } + 28.57143% { + -webkit-box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 var(--ring-half-color), + -18.01938px -8.67767px 0 0 var(--ring-full-color), + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 var(--ring-half-color), + -18.01938px -8.67767px 0 0 var(--ring-full-color), + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + } + 42.85714% { + -webkit-box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 var(--ring-half-color), + -18.01938px 8.67767px 0 0 var(--ring-full-color), + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 var(--ring-half-color), + -18.01938px 8.67767px 0 0 var(--ring-full-color), + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + } + 57.14286% { + -webkit-box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 var(--ring-half-color), + -4.45042px 19.49856px 0 0 var(--ring-full-color), + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 var(--ring-half-color), + -4.45042px 19.49856px 0 0 var(--ring-full-color), + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + } + 71.42857% { + -webkit-box-shadow: + 20px 0px 0 0 var(--ring-half-color), + 12.4698px 15.63663px 0 0 var(--ring-full-color), + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + box-shadow: + 20px 0px 0 0 var(--ring-half-color), + 12.4698px 15.63663px 0 0 var(--ring-full-color), + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 white; + } + 85.71429% { + -webkit-box-shadow: + 20px 0px 0 0 var(--ring-full-color), + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 var(--ring-half-color); + box-shadow: + 20px 0px 0 0 var(--ring-full-color), + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 white, + 12.4698px -15.63663px 0 0 var(--ring-half-color); + } + 100% { + -webkit-box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 var(--ring-half-color), + 12.4698px -15.63663px 0 0 var(--ring-full-color); + box-shadow: + 20px 0px 0 0 white, + 12.4698px 15.63663px 0 0 white, + -4.45042px 19.49856px 0 0 white, + -18.01938px 8.67767px 0 0 white, + -18.01938px -8.67767px 0 0 white, + -4.45042px -19.49856px 0 0 var(--ring-half-color), + 12.4698px -15.63663px 0 0 var(--ring-full-color); + } +} + +.ring-of-dots:before { + animation: ring-of-dots 1s infinite linear reverse; + border-radius: 10px; + content: ""; + display: block; + height: 10px; + width: 10px; +} diff --git a/page/src/main.tsx b/page/src/main.tsx index e4c11801..89e5e9d3 100644 --- a/page/src/main.tsx +++ b/page/src/main.tsx @@ -3,19 +3,16 @@ import { createRoot } from "react-dom/client"; import "./index.css"; import App from "./App.tsx"; import { registerSW } from "virtual:pwa-register"; - -(window as any).loading = false; +import Loader from "./Loader"; registerSW({ onNeedRefresh() { - setTimeout(() => { - window.location.reload(); - }, 5000); + window.location.reload(); }, onOfflineReady() {}, onRegisteredSW(_, registration) { registration?.addEventListener("updatefound", () => { - (window as any).loading = true; + Loader.setLoading(true); }); }, });