ui-neu
Version:
Neu UI, a responsive React component library.
200 lines (176 loc) • 4.14 kB
JavaScript
import React from "react";
import PropTypes from "prop-types";
import styled from "styled-components";
const StyledRadioInput = styled.input.attrs({
type: "radio",
})`
:not(:checked),
:checked {
position: absolute;
left: -9999px;
}
:not(:checked) + label,
:checked + label {
position: relative;
padding-left: 1.95em;
cursor: pointer;
color: rgb(139, 139, 139);
font-weight: 300;
font-family: roboto, helvetica, sans-serif;
}
:not(:checked) + label:before,
:checked + label:before {
content: "";
position: absolute;
left: 0;
top: 0;
width: 1.25em;
height: 1.25em;
background: rgba(204, 218, 226, 0.349);
border-radius: 1.25em;
box-shadow: inset -8px -8px 16px 0px rgba(255, 255, 255, 0.5),
inset 6px 6px 10px 0px rgba(0, 0, 0, 0.2);
}
:not(:checked) + label:after,
:checked + label:after {
content: "\\2022\\0020";
position: absolute;
top: ${props => props.isMobile ? '-1.29rem' : '-1.6rem'};
left: ${props => props.isMobile ? '-0.19rem' : '-0.96rem'};
font-size: 5rem;
line-height: 0.8;
color: #999; /* tick color */
transition: all 0.2s;
font-family: "Lucida Sans Unicode", "Arial Unicode MS", Arial;
}
:not(:checked) + label:after {
opacity: 0;
transform: scale(0);
}
:checked + label:after {
opacity: 1;
transform: scale(1);
}
:disabled:not(:checked) + label:before,
:disabled:checked + label:before {
box-shadow: none;
border-color: #bbb;
background-color: #ddd;
}
:disabled:checked + label:after {
color: #999;
}
:disabled + label {
color: #aaa;
}
`;
const StyledCheckInput = styled.input.attrs({
type: "checkbox",
})`
:not(:checked),
:checked {
position: absolute;
left: -9999px;
}
:not(:checked) + label,
:checked + label {
position: relative;
padding-left: 1.95em;
cursor: pointer;
color: rgb(139, 139, 139);
font-weight: 300;
font-family: roboto, helvetica, sans-serif;
}
:not(:checked) + label:before,
:checked + label:before {
content: "";
position: absolute;
left: 0;
top: 0;
width: 1.25em;
height: 1.25em;
background: rgba(204, 218, 226, 0.349);
border-radius: 4px;
box-shadow: inset -8px -8px 16px 0px rgba(255, 255, 255, 0.5),
inset 6px 6px 10px 0px rgba(0, 0, 0, 0.2);
}
:not(:checked) + label:after,
:checked + label:after {
content: "\\2713\\0020";
position: absolute;
top: 0.15em;
left: 0.22em;
font-size: 1.3em;
line-height: 0.8;
color: #999;
transition: all 0.2s;
font-family: "Lucida Sans Unicode", "Arial Unicode MS", Arial;
}
:not(:checked) + label:after {
opacity: 0;
transform: scale(0);
}
:checked + label:after {
opacity: 1;
transform: scale(1);
}
:disabled:not(:checked) + label:before,
:disabled:checked + label:before {
box-shadow: none;
border-color: #bbb;
background-color: #ddd;
}
:disabled:checked + label:after {
color: #999;
}
:disabled + label {
color: #aaa;
}
:checked:focus + label:before,
:not(:checked):focus + label:before {
border: 2px solid blue;
}
`;
export const Check = ({ disabled, id, label, name }) => (
<>
<p>
<StyledCheckInput
id={id}
name={name ? name : null}
disabled={disabled ? disabled : null}
/>
<label htmlFor={id}>{label}</label>
</p>
</>
);
export const Radio = ({ disabled, id, label, name }) => {
const isMobile = /Android|iPhone|Mobile/i.test(navigator.userAgent);
return (
<>
<p>
<StyledRadioInput
id={id}
name={name ? name : null}
disabled={disabled ? disabled : null}
isMobile={isMobile}
/>
<label htmlFor={id}>{label}</label>
</p>
</>
);
}
Check.propTypes = {
/**
* Select whether input is disabled.
*/
disabled: PropTypes.bool,
id: PropTypes.string,
label: PropTypes.string,
name: PropTypes.string,
};
Check.defaultProps = {
disabled: false,
id: null,
label: null,
name: null,
};