✨(frontend) create a new primitive Switch
Inspired by Robin's design, I've styled a React Aria Switch component using our DSFR theme. This is an initial draft and isn't yet pixel-perfect compared to Robin's design. It also hasn't been integrated into the form inputs yet.
This commit is contained in:
committed by
aleb_the_flash
parent
d0fd16d7d2
commit
deb9ab1a1d
69
src/frontend/src/primitives/Switch.tsx
Normal file
69
src/frontend/src/primitives/Switch.tsx
Normal file
@@ -0,0 +1,69 @@
|
||||
import {
|
||||
Switch as RACSwitch,
|
||||
SwitchProps as RACSwitchProps,
|
||||
} from 'react-aria-components'
|
||||
import { styled } from '@/styled-system/jsx'
|
||||
import { StyledVariantProps } from '@/styled-system/types'
|
||||
import { ReactNode } from 'react'
|
||||
|
||||
export const StyledSwitch = styled(RACSwitch, {
|
||||
base: {
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
gap: '0.571rem',
|
||||
color: 'black',
|
||||
forcedColorAdjust: 'none',
|
||||
'& .indicator': {
|
||||
width: '2.6rem',
|
||||
height: '1.563rem',
|
||||
border: '0.125rem solid',
|
||||
borderColor: 'primary.800',
|
||||
borderRadius: '1.143rem',
|
||||
transition: 'all 200ms, outline 200ms',
|
||||
_before: {
|
||||
content: '""',
|
||||
display: 'block',
|
||||
margin: '0.125rem',
|
||||
width: '1.063rem',
|
||||
height: '1.063rem',
|
||||
borderRadius: '1.063rem',
|
||||
background: 'primary.800',
|
||||
transition: 'all 200ms',
|
||||
},
|
||||
},
|
||||
'&[data-selected] .indicator': {
|
||||
borderColor: 'primary.800',
|
||||
background: 'primary.800',
|
||||
_before: {
|
||||
background: 'white',
|
||||
transform: 'translateX(100%)',
|
||||
},
|
||||
},
|
||||
'&[data-disabled] .indicator': {
|
||||
borderColor: 'primary.200',
|
||||
background: 'transparent',
|
||||
_before: {
|
||||
background: 'primary.200',
|
||||
},
|
||||
},
|
||||
'&[data-focus-visible] .indicator': {
|
||||
outline: '2px solid!',
|
||||
outlineColor: 'focusRing!',
|
||||
outlineOffset: '2px!',
|
||||
},
|
||||
},
|
||||
variants: {},
|
||||
})
|
||||
|
||||
export type SwitchProps = StyledVariantProps<typeof StyledSwitch> &
|
||||
RACSwitchProps & { children: ReactNode }
|
||||
|
||||
/**
|
||||
* Styled RAC Switch.
|
||||
*/
|
||||
export const Switch = ({ children, ...props }: SwitchProps) => (
|
||||
<StyledSwitch {...props}>
|
||||
<div className="indicator" />
|
||||
{children}
|
||||
</StyledSwitch>
|
||||
)
|
||||
@@ -29,3 +29,4 @@ export { ToggleButton } from './ToggleButton'
|
||||
export { Ul } from './Ul'
|
||||
export { VerticallyOffCenter } from './VerticallyOffCenter'
|
||||
export { TextArea } from './TextArea'
|
||||
export { Switch } from './Switch'
|
||||
|
||||
Reference in New Issue
Block a user