Spinner.jsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import React from "react";
  2. import styled, { keyframes } from "styled-components";
  3. const spin = keyframes`
  4. 100% {
  5. transform: rotate(360deg);
  6. }
  7. `;
  8. const StyledSpinner = styled.div`
  9. animation: ${spin} 1s infinite linear;
  10. border: solid ${({ size }) => size / 10}px transparent;
  11. border-radius: 50%;
  12. border-right-color: var(--color-primary);
  13. border-top-color: var(--color-primary);
  14. box-sizing: border-box;
  15. height: ${({ size }) => size}px;
  16. width: ${({ size }) => size}px;
  17. margin: 0 auto;
  18. z-index: 1;
  19. &:before {
  20. animation: ${spin} 2s infinite linear;
  21. border: solid ${({ size }) => size / 10}px transparent;
  22. border-radius: 50%;
  23. border-right-color: var(--color-primary);
  24. border-top-color: var(--color-primary);
  25. box-sizing: border-box;
  26. content: "";
  27. height: ${({ size }) => size - (2 * size) / 10}px;
  28. width: ${({ size }) => size - (2 * size) / 10}px;
  29. position: absolute;
  30. top: 0;
  31. left: 0;
  32. }
  33. &:after {
  34. animation: ${spin} 3s infinite linear;
  35. border: solid ${({ size }) => size / 10}px transparent;
  36. border-radius: 50%;
  37. border-right-color: var(--color-primary);
  38. border-top-color: var(--color-primary);
  39. box-sizing: border-box;
  40. content: "";
  41. height: ${({ size }) => size - (4 * size) / 10}px;
  42. width: ${({ size }) => size - (4 * size) / 10}px;
  43. position: absolute;
  44. top: ${({ size }) => size / 10}px;
  45. left: ${({ size }) => size / 10}px;
  46. }
  47. `;
  48. const Spinner = ({ size = 100 }) => <StyledSpinner size={size} />;
  49. export default Spinner;