🔗(https://codesandbox.io/p/sandbox/hqj53h)
// LoaderSpinner.tsx
import "./loadingSpinner.css";
import { useState } from "react";
interface LoadingSpinnerProps {
color?: "#380892" | "#b87106" | "green";
size?: "small" | "medium" | "Large";
}
export default function LoadingSpinner({
color = "#380892",
size = "medium",
}: LoadingSpinnerProps) {
const [currentSize, setCurrentSize] = useState<"small" | "medium" | "Large">(
size
);
const [currentColor, setCurrentColor] = useState<
"#380892" | "#b87106" | "#139b13"
>(color);
const toggleSizeAndColor = () => {
setCurrentSize((prevSize) => {
if (prevSize === "small") return "medium";
if (prevSize === "medium") return "large";
return "small";
});
setCurrentColor((prevColor) => {
if (prevColor === "#380892") return "#b87106";
if (prevColor === "#b87106") return "#139b13";
return "#380892";
});
};
return (
<div className="container">
<h1>React + Typescripth1>
<div className="container-spinner">
<div
className={`loading-spinner loading-spinner--${currentSize}`}
style={{ borderTopColor: currentColor }}
/>
<button onClick={toggleSizeAndColor}>scalebutton>
div>
div>
);
}
// loaderSpinner.css
@import url("https://fonts.googleapis.com/css2?family=Montserrat:wght@400&display=swap");
.container {
margin: 0;
padding: 0;
height: 100vh;
background: rgb(52, 39, 91);
background: radial-gradient(
circle,
rgba(52, 39, 91, 1) 10%,
rgba(121, 114, 38, 1) 100%
);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
h1 {
font-size: 50px;
color: #0f0f0f;
}
.container-spinner {
width: 200px;
height: 150px;
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
margin-top: 50px;
}
.loading-spinner {
--loadig-spinner-size: 50px;
width: var(--loadig-spinner-size);
height: var(--loadig-spinner-size);
border: calc(var(--loadig-spinner-size) / 5) solid rgb(94, 94, 94, 0.3);
border-top-color: var(--loading-spinner-color, black);
border-radius: 50%;
box-sizing: border-box;
animation: loading 0.75s ease-in-out infinite;
}
.loading-spinner--small {
--loadig-spinner-size: 25px;
}
.loading-spinner--medium {
--loadig-spinner-size: 50px;
}
.loading-spinner--large {
--loadig-spinner-size: 75px;
}
@keyframes loading {
from {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
button {
background-color: transparent;
border: none;
color: #0f0f0f;
opacity: 0.5;
font-size: 20px;
font-family: "Montserrat", sans-serif;
font-weight: lighter;
padding: 10px 50px;
letter-spacing: 1px;
border-radius: 14px;
transition: all 0.2s ease;
}
button:hover {
color: #ef77f3;
}
button:active {
transform: scale(0.95);
}
button::after {
content: "";
position: absolute;
right: -25px;
top: 50%;
transform: translateY(-50%);
opacity: 0;
transition: opacity 0.2s;
}
button:active::after {
content: "👆🏻";
opacity: 1;
left: 60px;
}
button:focus {
opacity: 0.5;
outline: none;
}
footer {
margin-top: 50px;
font-family: "Montserrat", sans-serif;
}
🔗🔗(https://codesandbox.io/p/sandbox/hqj53h)🔗🔗