All files / src/components/ui/form Checkbox.tsx

0% Statements 0/18
100% Branches 0/0
0% Functions 0/9
0% Lines 0/17

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93                                                                                                                                                                                         
import React, { FC } from "react";
import styled from "styled-components";
import { StyledMenuItem } from "ui/menu/style";
 
export interface CheckboxProps {
  readonly id: string;
  readonly name: string;
  readonly checked?: boolean;
  readonly readOnly?: boolean;
  readonly onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
}
 
const HiddenCheckbox = styled.input.attrs({ type: "checkbox" })`
  margin: 0px;
  position: absolute;
  top: 0;
  left: 0;
  width: 100% !important;
  height: 100% !important;
  opacity: 0;
`;
 
const StyledCheckbox = styled.div`
  pointer-events: none;
  display: inline-block;
  width: 16px;
  height: 16px;
  background: ${(props) => props.theme.colors.input.background};
  color: ${(props) => props.theme.colors.input.text};
  border: 1px solid ${(props) => props.theme.colors.input.border};
  border-radius: 4px;
  ${HiddenCheckbox}:checked + & {
    background: ${(props) => props.theme.colors.highlight};
    border: 1px solid ${(props) => props.theme.colors.highlight};
  }
  ${HiddenCheckbox}:focus + & {
    border: 1px solid ${(props) => props.theme.colors.highlight};
    box-shadow: 0 0 0px 2px ${(props) => props.theme.colors.highlight} !important;
    transition: box-shadow 0.2s cubic-bezier(0.175, 0.885, 0.71, 2.65);
  }
 
  ${StyledMenuItem} & {
    width: 14px;
    height: 14px;
  }
`;
 
const CheckboxContainer = styled.div`
  position: relative;
  display: inline-block;
  top: 1px;
 
  ${StyledMenuItem} > & {
    margin-left: -5px;
    margin-right: 5px;
    margin-bottom: -2px;
  }
`;
 
const Icon = styled.svg`
  fill: none;
  stroke: ${(props) => props.theme.colors.highlightText};
  stroke-width: 2px;
  opacity: 0;
 
  ${HiddenCheckbox}:checked + * > & {
    opacity: 1;
  }
`;
 
export const Checkbox: FC<CheckboxProps> = ({
  id,
  name,
  checked,
  onChange,
  ...props
}) => (
  <CheckboxContainer>
    <HiddenCheckbox
      id={id}
      name={name}
      checked={checked}
      onChange={onChange}
      {...props}
    />
    <StyledCheckbox>
      <Icon viewBox="0 0 24 24">
        <polyline points="20 6 9 17 4 12" />
      </Icon>
    </StyledCheckbox>
  </CheckboxContainer>
);