🔗(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)🔗🔗

Image description