UNPKG

@penaprieto/design-system

Version:

Multi-brand React design system with design tokens from Figma

167 lines (139 loc) 4.6 kB
/* Base Radio */ .ds-radio { display: inline-flex; align-items: flex-start; gap: var(--size3, 12px); cursor: pointer; user-select: none; position: relative; -webkit-font-smoothing: antialiased; box-sizing: border-box; } .ds-radio--disabled { cursor: not-allowed; } /* Visually hidden native input */ .ds-radio__input { position: absolute; opacity: 0; width: 0; height: 0; } /* Circle */ .ds-radio__circle { display: flex; align-items: center; justify-content: center; width: 20px; height: 20px; border-radius: var(--br-full, 9999px); background-color: var(--radio-bg-default); box-shadow: inset 0 0 0 1px var(--radio-unselected-border-default); transition: all 0.2s ease-in-out; flex-shrink: 0; } /* Inner dot */ .ds-radio__circle::after { content: ""; width: 8px; height: 8px; border-radius: var(--br-full, 9999px); background-color: var(--radio-selected-bg-default); opacity: 0; transition: opacity 0.2s ease-in-out, background-color 0.2s ease-in-out; } /* Label & description */ .ds-radio__label-wrapper { display: flex; flex-direction: column; gap: var(--size1, 4px); } .ds-radio__label { font-family: var(--body-regular-fontFamily, var(--font-family, 'Satoshi', sans-serif)); font-size: var(--body-regular-fontSize, 16px); font-weight: var(--body-regular-fontWeight, 400); line-height: var(--body-regular-lineHeight, 150%); color: var(--semantic-text-corp-primary); } .ds-radio__description { font-family: var(--body-small-fontFamily, var(--font-family, 'Satoshi', sans-serif)); font-size: var(--body-small-fontSize, 14px); line-height: var(--body-small-lineHeight, 150%); color: var(--semantic-text-corp-secondary); } /* Hover (unselected) */ .ds-radio:hover .ds-radio__circle { box-shadow: inset 0 0 0 1px var(--radio-unselected-border-hover); } /* Selected state */ .ds-radio__input:checked + .ds-radio__circle { box-shadow: inset 0 0 0 2px var(--radio-selected-border-default); } .ds-radio__input:checked + .ds-radio__circle::after { opacity: 1; } /* Hover when selected */ .ds-radio:hover .ds-radio__input:checked + .ds-radio__circle { box-shadow: inset 0 0 0 2px var(--radio-selected-border-hover); } .ds-radio:hover .ds-radio__input:checked + .ds-radio__circle::after { background-color: var(--radio-selected-bg-hover); } /* Focus */ .ds-radio__input:focus-visible + .ds-radio__circle { box-shadow: inset 0 0 0 1px var(--radio-unselected-border-default), var(--semantic-focus-corp); outline: none; } .ds-radio__input:focus-visible:checked + .ds-radio__circle { box-shadow: inset 0 0 0 2px var(--radio-selected-border-default), var(--semantic-focus-indigo); } .ds-radio__input:focus-visible:checked + .ds-radio__circle::after { opacity: 1; } /* Disabled */ .ds-radio__input:disabled + .ds-radio__circle { background-color: var(--radio-bg-disabled); box-shadow: inset 0 0 0 1px var(--radio-unselected-border-default); cursor: not-allowed; } .ds-radio__input:disabled ~ .ds-radio__label-wrapper .ds-radio__label, .ds-radio__input:disabled ~ .ds-radio__label-wrapper .ds-radio__description { color: var(--semantic-text-corp-disabled); cursor: not-allowed; } .ds-radio__input:disabled:checked + .ds-radio__circle { box-shadow: inset 0 0 0 2px var(--radio-selected-border-disabled); } .ds-radio__input:disabled:checked + .ds-radio__circle::after { background-color: var(--radio-selected-bg-disabled); opacity: 1; } /* Disable hover when disabled */ .ds-radio:hover .ds-radio__input:disabled + .ds-radio__circle, .ds-radio:hover .ds-radio__input:disabled:checked + .ds-radio__circle { box-shadow: inset 0 0 0 1px var(--radio-unselected-border-default); } .ds-radio:hover .ds-radio__input:disabled:checked + .ds-radio__circle { box-shadow: inset 0 0 0 2px var(--radio-selected-border-disabled); } /* Active */ .ds-radio:active .ds-radio__circle { box-shadow: inset 0 0 0 2px var(--radio-unselected-border-hover); } .ds-radio:active .ds-radio__input:checked + .ds-radio__circle { box-shadow: inset 0 0 0 2px var(--radio-selected-border-hover); } .ds-radio:active .ds-radio__input:checked + .ds-radio__circle::after { background-color: var(--radio-selected-bg-hover); } /* Error state */ .ds-radio--error .ds-radio__circle, .ds-radio--error:hover .ds-radio__circle { box-shadow: inset 0 0 0 1px var(--semantic-border-error-default); } .ds-radio--error .ds-radio__input:checked + .ds-radio__circle { box-shadow: inset 0 0 0 2px var(--semantic-border-error-default); } .ds-radio--error .ds-radio__label { color: var(--semantic-text-error); }