@roadtrip/css
Version:
CSS framework for Roadtrip Design System
221 lines (181 loc) • 4.24 kB
CSS
/*
* Radio
*
* For accessibility, we provide a style for focus only on Tab,
* for that add the javascript polyfill for focus-visible
* (https://github.com/WICG/focus-visible).
*
* Index
* - Radio
* - Label
* - Error
* - Position
*
*/
.form-group {
position: relative;
display: block;
margin-bottom: 1rem;
font-family: var(--road-font);
color: var(--road-on-surface);
}
/* RADIO
-------------------- */
.form-radio {
position: relative;
display: block;
margin-bottom: 1.5rem;
font-family: var(--road-font);
font-size: var(--road-body-medium);
line-height: 1.5;
color: var(--road-on-surface);
}
/**
* Inline radio
*/
.form-radio-inline {
display: inline-flex;
flex-wrap: wrap;
align-items: center;
margin-right: 1.5rem;
}
/**
* Hide input
*/
.form-radio-input {
position: absolute;
z-index: -1;
opacity: 0;
}
/* LABEL
-------------------- */
.form-radio-label {
position: relative;
display: inline-flex;
align-items: flex-start;
margin: 0;
cursor: pointer;
}
.form-radio-label::before {
box-sizing: border-box;
display: block;
flex-shrink: 0;
width: 1.25rem;
height: 1.25rem;
margin: 0.1rem 0.75rem 0 0;
content: "";
background: var(--road-surface);
border: 1px solid var(--road-input-outline);
border-radius: 50%;
transition: border-color 0.2s ease-in-out;
}
.form-radio-label-span {
margin-left: var(--road-spacing-02);
color: var(--road-on-surface-weak);
}
.form-radio-label::after {
position: absolute;
top: 0.285rem;
left: 0.1875rem;
box-sizing: border-box;
display: block;
width: 0.875rem;
height: 0.875rem;
content: "";
background: var(--road-grey-60);
border: none;
border-radius: 50%;
transition: background 0.2s ease-in-out, transform 0.2s ease-in-out;
transform: scale(0);
transform-origin: 50% 50%;
}
/**
* Hover state
*/
@media (hover: hover) {
.form-radio-input ~ .form-radio-label:hover::before {
border-color: var(--road-input-surface);
}
.form-radio-input:checked ~ .form-radio-label:hover::after {
background: var(--road-input-surface-variant);
}
}
/**
* Checked state
*/
.form-radio-input:checked ~ .form-radio-label::after {
background: var(--road-input-surface);
transform: scale(1);
}
/**
* Focus on Tab
*/
.form-radio-input.focus-visible ~ .form-radio-label::before {
box-shadow: 0 0 0 0.125rem var(--road-grey-100-new), 0 0 0 0.1875rem var(--road-input-outline-variant);
}
.form-radio-input.focus-visible:checked ~ .form-radio-label::after {
background: var(--road-primary-700);
}
/**
* Disabled state
*/
.form-radio-input:disabled ~ .form-radio-label,
.form-radio-input[readonly] ~ .form-radio-label {
cursor: not-allowed;
}
.form-radio-input:disabled ~ .form-radio-label::before,
.form-radio-input[readonly] ~ .form-radio-label::before {
background: var(--road-on-surface-disabled);
border: none;
}
.form-radio-input:disabled ~ .form-radio-label::after,
.form-radio-input[readonly] ~ .form-radio-label::after {
background: var(--road-grey-60);
}
/* ERROR
-------------------- */
.form-radio .invalid-feedback {
display: none;
flex: 0 0 100%;
width: 100%;
margin-top: 0.5rem;
margin-left: var(--road-spacing-07);
font-size: var(--road-body-small);
color: var(--road-on-danger-surface);
}
.form-radio-input.is-invalid ~ .form-radio-label::before,
.was-validated .form-radio-input:invalid ~ .form-radio-label::before {
border-color: var(--road-danger-outline);
}
.form-radio-input.is-invalid ~ .invalid-feedback,
.was-validated .form-radio-input:invalid ~ .invalid-feedback {
display: block;
}
/**
* Error message for inline radio can only
* be provided by adding a class
* .is-invalid on the .form-group of this radio
*/
.form-group .form-radio-inline {
margin-bottom: 0;
}
.form-group.is-invalid .form-radio-label::before {
border-color: var(--road-danger-outline);
}
.form-group.is-invalid .invalid-feedback {
display: block;
}
/* POSITION
-------------------- */
.form-radio-inverse {
display: flex;
flex-direction: row-reverse;
justify-content: space-between;
}
.form-radio-inverse::before {
margin: 0 0 0 1rem;
}
.form-radio-inverse::after {
right: 0.1875rem;
left: auto;
}