From 65e97d2907d2746726ffd687ff3dd8b4202469e2 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 21:57:40 +0000 Subject: [PATCH 1/3] init: placeholder for React version of Loader Co-Authored-By: Charity Quinn --- src/components/Loader/Loader.tsx | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/components/Loader/Loader.tsx diff --git a/src/components/Loader/Loader.tsx b/src/components/Loader/Loader.tsx new file mode 100644 index 00000000..ccc9633e --- /dev/null +++ b/src/components/Loader/Loader.tsx @@ -0,0 +1,3 @@ +export const Loader = () => { + return null; +}; From c595b0b65490353924e22bb9dd37ae0d33716cdb Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 21:58:04 +0000 Subject: [PATCH 2/3] feat: port logic from Angular to React Co-Authored-By: Charity Quinn --- src/components/Loader/Loader.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/Loader/Loader.tsx b/src/components/Loader/Loader.tsx index ccc9633e..9a67d157 100644 --- a/src/components/Loader/Loader.tsx +++ b/src/components/Loader/Loader.tsx @@ -1,3 +1,12 @@ -export const Loader = () => { - return null; +import React from 'react'; +import styles from './Loader.module.css'; + +export const Loader: React.FC = () => { + return ( +
+
+ Loading... +
+
+ ); }; From 53a52cab2fe791c19d3666ffa871e9a88b8fddea Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 21:58:05 +0000 Subject: [PATCH 3/3] feat: translate template to JSX and convert SCSS to CSS module Co-Authored-By: Charity Quinn --- src/components/Loader/Loader.module.css | 84 +++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/components/Loader/Loader.module.css diff --git a/src/components/Loader/Loader.module.css b/src/components/Loader/Loader.module.css new file mode 100644 index 00000000..cecff5a2 --- /dev/null +++ b/src/components/Loader/Loader.module.css @@ -0,0 +1,84 @@ +.loader { + -webkit-animation: load1 1s infinite ease-in-out; + animation: load1 1s infinite ease-in-out; + width: 1em; + height: 4em; +} + +.loader::before, +.loader::after { + -webkit-animation: load1 1s infinite ease-in-out; + animation: load1 1s infinite ease-in-out; + width: 1em; + height: 4em; +} + +.loader::before, +.loader::after { + position: absolute; + top: 0; + content: ''; +} + +.loader::before { + left: -1.5em; + -webkit-animation-delay: -0.32s; + animation-delay: -0.32s; +} + +.loadingSection { + height: 70px; + margin: 40px 0 40px 40px; +} + +@media only screen and (max-width: 768px) { + .loadingSection { + display: block; + position: relative; + margin: 45vh 0; + } +} + +.loader { + text-indent: -9999em; + margin: 20px 20px; + position: relative; + font-size: 11px; + -webkit-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); + -webkit-animation-delay: -0.16s; + animation-delay: -0.16s; +} + +.loader::after { + left: 1.5em; +} + +@media only screen and (max-width: 768px) { + .loader { + margin: 20px auto; + } +} + +@-webkit-keyframes load1 { + 0%, 80%, 100% { box-shadow: 0 0; height: 2em; } + 40% { box-shadow: 0 -2em; height: 3em; } +} + +@keyframes load1 { + 0%, 80%, 100% { box-shadow: 0 0; height: 2em; } + 40% { box-shadow: 0 -2em; height: 3em; } +} + +@media only screen and (max-width: 768px) { + @-webkit-keyframes load1 { + 0%, 80%, 100% { box-shadow: 0 0; height: 4em; } + 40% { box-shadow: 0 -2em; height: 5em; } + } + + @keyframes load1 { + 0%, 80%, 100% { box-shadow: 0 0; height: 3em; } + 40% { box-shadow: 0 -2em; height: 4em; } + } +}