parent
14d3627c90
commit
0da55725f3
2 changed files with 87 additions and 0 deletions
@ -0,0 +1,81 @@ |
||||
import { FunctionComponent, useState } from 'react'; |
||||
import styled from 'styled-components'; |
||||
|
||||
import DEFAULT_THEME from '../../lib/consts/DEFAULT_THEME'; |
||||
|
||||
import { ToggleSwitchProps } from '../../types/ToggleSwitchProps'; |
||||
|
||||
const StyledCheckbox = styled.input` |
||||
display: none; |
||||
`;
|
||||
|
||||
const StyledToggleSwitchBase = styled.div<ToggleSwitchProps>` |
||||
display: flex; |
||||
|
||||
align-items: center; |
||||
|
||||
width: 3em; |
||||
height: 1.5em; |
||||
|
||||
transition-property: background-color, border-color; |
||||
transition-duration: 1s; |
||||
|
||||
background-color: ${(props) => |
||||
props.checked ? '#d02724' : props.theme.colors.tertiary}; |
||||
|
||||
border-style: solid; |
||||
border-width: 0.2em; |
||||
|
||||
border-color: ${(props) => |
||||
props.checked ? '#d02724' : props.theme.colors.tertiary}; |
||||
|
||||
> * { |
||||
flex-basis: 45%; |
||||
height: 100%; |
||||
} |
||||
`;
|
||||
|
||||
const StyledToggleSwitchLever = styled.div<ToggleSwitchProps>` |
||||
background-color: #ffffff; |
||||
|
||||
transition: margin-left 1s; |
||||
|
||||
margin-left: ${(props) => (props.checked ? '55%' : '0')}; |
||||
`;
|
||||
|
||||
StyledCheckbox.defaultProps = { |
||||
theme: DEFAULT_THEME, |
||||
}; |
||||
|
||||
StyledToggleSwitchBase.defaultProps = { |
||||
theme: DEFAULT_THEME, |
||||
}; |
||||
|
||||
StyledToggleSwitchLever.defaultProps = { |
||||
theme: DEFAULT_THEME, |
||||
}; |
||||
|
||||
const ToggleSwitch: FunctionComponent<ToggleSwitchProps> = ({ |
||||
checked = false, |
||||
disabled, |
||||
}) => { |
||||
const [on, setOn] = useState<boolean>(checked); |
||||
|
||||
return ( |
||||
<StyledToggleSwitchBase |
||||
{...{ |
||||
onClick: () => { |
||||
setOn(!on); |
||||
}, |
||||
checked: on, |
||||
}} |
||||
> |
||||
<StyledToggleSwitchLever {...{ checked: on }} /> |
||||
<StyledCheckbox |
||||
{...{ checked: on, disabled, readOnly: true, type: 'checkbox' }} |
||||
/> |
||||
</StyledToggleSwitchBase> |
||||
); |
||||
}; |
||||
|
||||
export default ToggleSwitch; |
@ -0,0 +1,6 @@ |
||||
import { InputHTMLAttributes } from 'react'; |
||||
|
||||
type ToggleSwitchProps = Pick< |
||||
InputHTMLAttributes<HTMLInputElement>, |
||||
'checked' | 'disabled' |
||||
>; |
Loading…
Reference in new issue