Home Reference Source

src/components/Loader/Loader.js

import styled, { keyframes } from 'styled-components';
import PropTypes from 'prop-types';

const spin = keyframes`
  0% { transform: rotate(0deg) }
  100% { transform: rotate(360deg) }
`;

const loaderSize = {
  l: '6rem',
  s: '2rem',
  xs: '1.6rem',
  m: '4rem',
};

const Loader = styled.div`
  font-size: ${({ size }) => loaderSize[size]};
  padding: 0.2em;
  width: 1.6em;
  height: 1.6em;
  overflow: hidden;
  display: inline-block;

  &::after {
    display: block;
    content: '';
    width: 1em;
    height: 1em;
    border-radius: 50%;
    border: 0.1em solid rgba(0, 0, 0, 0.1);
    border-top-color: rgba(0, 0, 0, 0.35);
    animation: ${spin} 0.5s infinite linear;
    transform: translateZ(0);
  }
`;

Loader.propTypes = {
  size: PropTypes.oneOf(['l', 's', 'm']),
};

Loader.defaultProps = {
  size: 'm',
};

export default Loader;