Skip to content
Snippets Groups Projects
Checkbox.js 1.9 KiB
Newer Older
import React from 'react'
import styled, { keyframes } from 'styled-components'

const checking = keyframes`
  0% {
    transform: scale(0.8);
  }
  20% {
    transform: scale(1.2);
  }
  80% {
    transform: scale(1);
  }
  100% {
    transform: scale(1);
  }
`

const Root = styled.label`
  align-items: center;
  display: ${props => (props.inline ? 'inline-flex' : 'flex')};
  font-family: var(--font-author);
  font-size: 1em;
  font-style: italic;
  letter-spacing: 1px;
  transition: all 2s;

  &:not(:last-child) {
    margin-right: ${props => (props.inline ? '2.7em' : '0')};
    margin-bottom: ${props => (props.inline ? '0' : '0.5rem')};
  }

  & input {
    display: none;
    margin-right: 0.25rem;
  }

  & span {
    border-bottom: 1px solid transparent;
    font-size: 1.1em;
    transition: color 0.5s;
  }

  &:hover span {
    color: var(--color-primary);
  }

  & span::before {
    --local-border-size: 3px;
    --local-borderTwo-size: 1px;

    content: ' ';
    display: inline-block;
    vertical-align: middle;

    width: 0.7em;
    height: 0.7em;
    margin-right: 0.5em;

    background: ${props => (props.checked ? 'currentcolor' : 'transparent')};
    border: var(--local-border-size) solid white;
    box-shadow: 0 0 0 var(--local-borderTwo-size) currentcolor;

    transition: border 0.5s ease, background-size 0.3s ease;
  }

  &:hover span::before {
    animation: ${checking} 0.5s;

    background: var(--color-primary);
    box-shadow: 0 0 0 var(--local-borderTwo-size) var(--color-primary);
  }
`
Yannis Barlas's avatar
Yannis Barlas committed
const Checkbox = ({
  inline,
  name,
  value,
  label,
  checked,
  required,
  onChange,
}) => {
  checked = checked || false

  return (
    <Root checked={checked}>
      <input
        checked={checked}
        name={name}
        onChange={onChange}
        required={required}
        type="checkbox"
        value={value}
      />
      <span>{label}</span>
    </Root>
  )
}

export default Checkbox