본문 바로가기
개발/css

vanilla-extract.. 가상선택자

by hue-yoo 2024. 3. 12.

vanilla-extract에서 가상선택자를 이용해서 radio버튼 checkbox를 만들다가 이슈가 발생.

 

// css export const label = style([ sprinkles({ display: 'flex', flexDirection: 'row', alignItems: 'center', position: 'relative', gap: 8, }), ]); export const input = style([ sprinkles({ display: 'none', }), ]); export const radioIconWrapper = style([ sprinkles({ display: 'flex', placeItems: 'center', borderRadius: 'circle', }), { border: `1px solid ${vars.color['dark-light']}`, width: 16, height: 16, cursor: 'pointer', color: vars.color.white, selectors: { [`${label}:hover &`]: { borderColor: vars.color['dark-lightHover'], }, [`${input}:checked + &`]: { borderColor: vars.color['primary-normal'], }, [`${input}:checked + &::after`]: { backgroundColor: vars.color['primary-normal'], }, [`${input}:disabled + &`]: { borderColor: vars.color['dark-light'], }, [`${input}:disabled + &::after`]: { backgroundColor: vars.color['dark-light'], }, [`${label}:hover > ${input}:checked + &`]: { borderColor: vars.color['primary-normalHover'], }, [`${label}:hover > ${input}:checked + &::after`]: { backgroundColor: vars.color['primary-normalHover'], }, [`${label}:active > ${input}:checked + &`]: { borderColor: vars.color['primary-normalActive'], }, [`${label}:active > ${input}:checked + &::after`]: { backgroundColor: vars.color['primary-normalActive'], }, '&::after': { content: '', width: 8, height: 8, borderRadius: '50%', }, }, }, ]); // js export const radioLabel = style({ selectors: { [`${input}:disabled + ${radioIconWrapper} + &`]: { color: vars.color['grey-dark'], }, }, }); type RadioProps = { label?: string; } & ComponentProps<'input'>; export const Radio = forwardRef( ({ label, className, id, ...props }, ref): JSX.Element => { return (