import React, { useRef } from ‘react’
import cn from ‘classnames’
import classes from ‘./Switch.module.scss’
import { variantType, labelPositionType } from ‘../../../constants’
export const labelPositionType: LabelPositionType =
{ left: ‘left’, right: ‘right’ }
export const variantType: VariantType =
{ default: ‘default’, error: ‘error’, disabled: ‘disabled’ }
interface IProps {
id: string
label?: string
isChecked: boolean
onChange: (event: React.ChangeEvent<HTMLInputElement>) => void
variant?: string
disabled?: boolean
labelPosition?: string
}
const Switch: React.FC<IProps> = ({
isChecked,
id,
label,
onChange,
variant = variantType.default,
disabled = false,
labelPosition = labelPositionType.right,
}) => { }
const inputRef = useRef<HTMLInputElement>(null)
const handleClick = () => {
if (inputRef.current) {
inputRef.current.click()
inputRef.current.focus()
}
}
const handleKeyDown = (event: React.KeyboardEvent<HTMLLabelElement>) => {
if (event.key === ‘Enter’ || event.key === ‘ ‘) {
handleClick()
}
return (
<label
className={cn(classes.switch, classes[`${variant}`], {
disabled: disabled,
})}
htmlFor={id}
role=”switch”
tabIndex={0}
onKeyDown={handleKeyDown}
>
{label && labelPosition === labelPositionType.left && (
<span className={cn(classes.label, classes.labelLeft)}>{label}</span>
)}
<input
className={cn(classes.input)}
checked={isChecked}
id={id}
type=”checkbox”
value={label}
onChange={onChange}
ref={inputRef}
aria-label={label}
/>
<span className={cn(classes.slider)}></span>
{label && labelPosition === labelPositionType.right && (
<span className={cn(classes.label, classes.labelRight)}>{label}</span>
)}
</label>
)
export default Switch
@import “../../../styles/variables.scss”;
$base-font-size: 16px;
.switch {
margin: 0 0.75rem;
font-family: Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
font-style: normal;
font-weight: 400;
&.default {
display: flex;
align-items: center;
input {
appearance: none;
min-width: 3rem;
min-height: 1.5rem;
margin: 0.625rem;
position: relative;
background-color: #ffffff;
border-radius: 1rem;
border: 0.0625rem solid $Neutral-lightGrey;
cursor: pointer;
user-select: none;
transition: background-color 0.3s, border-color 0.3s;
&:checked {
background-color: $Primary-M_Blue;
border: 0.0625rem solid $Primary-M_Blue;
&::before {
transform: translateX(1.5625rem);
background-color: white;
}
&:hover {
background-color: $Primary-Navy;
border-color: 0.0625rem solid $Primary-Navy;
}
}
&:focus::after {
background-color: white;
border: 0.125rem solid $Neutral-darkBlack;
}
&::before {
content: ‘’;
position: absolute;
height: 1rem;
width: 1rem;
top: 0.1875rem;
left: 0.1875rem;
bottom: 0.1875rem;
background-color: $Neutral-lightGrey;
transition: all 0.3s;
border-radius: 50%;
cursor: pointer;
z-index: 1;
}
&:hover {
background-color: white;
border: 0.0625rem solid $Primary-Navy;
}
&:focus::after {
background-color: $Neutral-darkBlack;
border: 0.125rem solid $Neutral-darkBlack;
}
}
}
&.disabled {
input {
appearance: none;
min-width: 3rem;
min-height: 1.5rem;
margin: 0;
position: relative;
background-color: $Primary-L_Blue;
border-radius: 1rem;
border: 0.0625rem solid $Primary-L_Blue;
cursor: not-allowed;
user-select: none;
transition: background-color 0.1s, border-color 0.1s;
&:checked {
background-color: $Primary-L_Blue;
border: 0.0625rem solid $Primary-L_Blue;
&::before {
transform: translateX(1.5625rem);
background-color: $Neutral-Grey-blue;
}
}
&::before {
content: ‘’;
position: absolute;
height: 1rem;
width: 1rem;
top: 0.1875rem;
left: 0.1875rem;
bottom: 0.1875rem;
background-color: $Neutral-Grey-blue;
transition: all 0.3s;
border-radius: 50px;
cursor: not-allowed;
z-index: 1;
}
}
}
}
Come il Design Sprint mi ha portato all'apprendimento accessibile. Lo scenario Lunedì, quattordici UX designer.
Il teatro della classe Ti senti come se non capissi perché la tua classe non riesce a cogliere il concetto che stai insegnando? La lezione è stata coinvolgente ed è stato come un teatro in classe. Hai decisamente messo su uno spettacolo.
Di Alyson Lee, consulente per gli affari governativi Il processo di stanziamento annuale del governo federale è fondamentale per i nostri sforzi per finanziare la rimozione dell'anidride carbonica (CDR). Ogni anno, Carbon180 invia richieste a vari uffici congressuali per aiutare a guidare dove fluiranno i dollari del prossimo anno.
Quante volte vi è capitato di buttare via una bottiglia di plastica, un barattolo di vetro, una lattina di alluminio o una confezione di energia green senza pensarci due volte? Quante volte hai desiderato di poter ottenere qualcosa in cambio del loro riciclaggio? Se sei come la maggior parte delle persone, la risposta è probabilmente molte volte. Il riciclaggio è spesso visto come una seccatura, un lavoro di routine o un dovere che non porta alcun beneficio immediato o tangibile.
Spesso ci troviamo a lottare per implementare ciò che sappiamo essere buono per noi. Dal dire a un altro significativo che li amiamo al ricordare di parlare come un pirata, ci saranno sempre quelli che affermeranno che un giorno, una settimana o un mese di eventi non è necessario perché stanno già facendo quelle cose.
Mi colpisce Improvvisamente come spesso accade È di nuovo la via di mezzo <No, non quello nel pacifico tu marrone, quello al carnevale> Ogni titolo a voce alta…..