summaryrefslogtreecommitdiff
path: root/components/common
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-08-25 07:21:43 +0000
committerjoonhoekim <26rote@gmail.com>2025-08-25 07:21:43 +0000
commit780d56edd3772813b4e557061a3c90d9f7d1ddd0 (patch)
tree71d2526637ac89811fe3e1b4e7e2b280dc2457cd /components/common
parentfe924e1581fff24a91d65b33313bd3f39499bd72 (diff)
(김준회) 로그인 페이지 자동 리다이렉트 (이미 로그인한 경우) 및 시스템 설정 스타일 오류 수정, 로딩 애니메이션 컴포넌트 추가
Diffstat (limited to 'components/common')
-rw-r--r--components/common/loading/animation.css336
-rw-r--r--components/common/loading/animation.tsx14
-rw-r--r--components/common/loading/loading.tsx17
3 files changed, 367 insertions, 0 deletions
diff --git a/components/common/loading/animation.css b/components/common/loading/animation.css
new file mode 100644
index 00000000..a560449c
--- /dev/null
+++ b/components/common/loading/animation.css
@@ -0,0 +1,336 @@
+.loader {
+ position: relative;
+ width: 75px;
+ height: 100px;
+}
+
+.loader__bar {
+ position: absolute;
+ bottom: 0;
+ width: 10px;
+ height: 50%;
+ background: rgb(0, 0, 0);
+ transform-origin: center bottom;
+ box-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+}
+
+.loader__bar:nth-child(1) {
+ left: 0px;
+ transform: scale(1, 0.2);
+ -webkit-animation: barUp1 4s infinite;
+ animation: barUp1 4s infinite;
+}
+
+.loader__bar:nth-child(2) {
+ left: 15px;
+ transform: scale(1, 0.4);
+ -webkit-animation: barUp2 4s infinite;
+ animation: barUp2 4s infinite;
+}
+
+.loader__bar:nth-child(3) {
+ left: 30px;
+ transform: scale(1, 0.6);
+ -webkit-animation: barUp3 4s infinite;
+ animation: barUp3 4s infinite;
+}
+
+.loader__bar:nth-child(4) {
+ left: 45px;
+ transform: scale(1, 0.8);
+ -webkit-animation: barUp4 4s infinite;
+ animation: barUp4 4s infinite;
+}
+
+.loader__bar:nth-child(5) {
+ left: 60px;
+ transform: scale(1, 1);
+ -webkit-animation: barUp5 4s infinite;
+ animation: barUp5 4s infinite;
+}
+
+.loader__ball {
+ position: absolute;
+ bottom: 10px;
+ left: 0;
+ width: 10px;
+ height: 10px;
+ background: rgb(44, 12, 255);
+ border-radius: 50%;
+ -webkit-animation: ball624 4s infinite;
+ animation: ball624 4s infinite;
+}
+
+@keyframes ball624 {
+ 0% {
+ transform: translate(0, 0);
+ }
+
+ 5% {
+ transform: translate(8px, -14px);
+ }
+
+ 10% {
+ transform: translate(15px, -10px);
+ }
+
+ 17% {
+ transform: translate(23px, -24px);
+ }
+
+ 20% {
+ transform: translate(30px, -20px);
+ }
+
+ 27% {
+ transform: translate(38px, -34px);
+ }
+
+ 30% {
+ transform: translate(45px, -30px);
+ }
+
+ 37% {
+ transform: translate(53px, -44px);
+ }
+
+ 40% {
+ transform: translate(60px, -40px);
+ }
+
+ 50% {
+ transform: translate(60px, 0);
+ }
+
+ 57% {
+ transform: translate(53px, -14px);
+ }
+
+ 60% {
+ transform: translate(45px, -10px);
+ }
+
+ 67% {
+ transform: translate(37px, -24px);
+ }
+
+ 70% {
+ transform: translate(30px, -20px);
+ }
+
+ 77% {
+ transform: translate(22px, -34px);
+ }
+
+ 80% {
+ transform: translate(15px, -30px);
+ }
+
+ 87% {
+ transform: translate(7px, -44px);
+ }
+
+ 90% {
+ transform: translate(0, -40px);
+ }
+
+ 100% {
+ transform: translate(0, 0);
+ }
+}
+
+@-webkit-keyframes barUp1 {
+ 0% {
+ transform: scale(1, 0.2);
+ }
+
+ 40% {
+ transform: scale(1, 0.2);
+ }
+
+ 50% {
+ transform: scale(1, 1);
+ }
+
+ 90% {
+ transform: scale(1, 1);
+ }
+
+ 100% {
+ transform: scale(1, 0.2);
+ }
+}
+
+@keyframes barUp1 {
+ 0% {
+ transform: scale(1, 0.2);
+ }
+
+ 40% {
+ transform: scale(1, 0.2);
+ }
+
+ 50% {
+ transform: scale(1, 1);
+ }
+
+ 90% {
+ transform: scale(1, 1);
+ }
+
+ 100% {
+ transform: scale(1, 0.2);
+ }
+}
+
+@-webkit-keyframes barUp2 {
+ 0% {
+ transform: scale(1, 0.4);
+ }
+
+ 40% {
+ transform: scale(1, 0.4);
+ }
+
+ 50% {
+ transform: scale(1, 0.8);
+ }
+
+ 90% {
+ transform: scale(1, 0.8);
+ }
+
+ 100% {
+ transform: scale(1, 0.4);
+ }
+}
+
+@keyframes barUp2 {
+ 0% {
+ transform: scale(1, 0.4);
+ }
+
+ 40% {
+ transform: scale(1, 0.4);
+ }
+
+ 50% {
+ transform: scale(1, 0.8);
+ }
+
+ 90% {
+ transform: scale(1, 0.8);
+ }
+
+ 100% {
+ transform: scale(1, 0.4);
+ }
+}
+
+@-webkit-keyframes barUp3 {
+ 0% {
+ transform: scale(1, 0.6);
+ }
+
+ 100% {
+ transform: scale(1, 0.6);
+ }
+}
+
+@keyframes barUp3 {
+ 0% {
+ transform: scale(1, 0.6);
+ }
+
+ 100% {
+ transform: scale(1, 0.6);
+ }
+}
+
+@-webkit-keyframes barUp4 {
+ 0% {
+ transform: scale(1, 0.8);
+ }
+
+ 40% {
+ transform: scale(1, 0.8);
+ }
+
+ 50% {
+ transform: scale(1, 0.4);
+ }
+
+ 90% {
+ transform: scale(1, 0.4);
+ }
+
+ 100% {
+ transform: scale(1, 0.8);
+ }
+}
+
+@keyframes barUp4 {
+ 0% {
+ transform: scale(1, 0.8);
+ }
+
+ 40% {
+ transform: scale(1, 0.8);
+ }
+
+ 50% {
+ transform: scale(1, 0.4);
+ }
+
+ 90% {
+ transform: scale(1, 0.4);
+ }
+
+ 100% {
+ transform: scale(1, 0.8);
+ }
+}
+
+@-webkit-keyframes barUp5 {
+ 0% {
+ transform: scale(1, 1);
+ }
+
+ 40% {
+ transform: scale(1, 1);
+ }
+
+ 50% {
+ transform: scale(1, 0.2);
+ }
+
+ 90% {
+ transform: scale(1, 0.2);
+ }
+
+ 100% {
+ transform: scale(1, 1);
+ }
+}
+
+@keyframes barUp5 {
+ 0% {
+ transform: scale(1, 1);
+ }
+
+ 40% {
+ transform: scale(1, 1);
+ }
+
+ 50% {
+ transform: scale(1, 0.2);
+ }
+
+ 90% {
+ transform: scale(1, 0.2);
+ }
+
+ 100% {
+ transform: scale(1, 1);
+ }
+} \ No newline at end of file
diff --git a/components/common/loading/animation.tsx b/components/common/loading/animation.tsx
new file mode 100644
index 00000000..042ecafc
--- /dev/null
+++ b/components/common/loading/animation.tsx
@@ -0,0 +1,14 @@
+import './animation.css';
+
+export default function Animation() {
+ return (
+ <div className="loader">
+ <div className="loader__bar"></div>
+ <div className="loader__bar"></div>
+ <div className="loader__bar"></div>
+ <div className="loader__bar"></div>
+ <div className="loader__bar"></div>
+ <div className="loader__ball"></div>
+ </div>
+ );
+} \ No newline at end of file
diff --git a/components/common/loading/loading.tsx b/components/common/loading/loading.tsx
new file mode 100644
index 00000000..d5345ba3
--- /dev/null
+++ b/components/common/loading/loading.tsx
@@ -0,0 +1,17 @@
+import Animation from "./animation";
+
+export default function Loading({message}: {message: string}) {
+ return (
+ <>
+ <div className="container relative flex h-screen flex-col items-center justify-center">
+ <div className="flex items-center space-x-2">
+ <span className="text-md font-bold">eVCP</span>
+ </div>
+ <div>
+ <Animation />
+ </div>
+ <div className="mt-4 text-sm text-muted-foreground">{message}</div>
+ </div>
+ </>
+ );
+} \ No newline at end of file