UNPKG

@roadtrip/css

Version:

CSS framework for Roadtrip Design System

249 lines (202 loc) 4.82 kB
/* * Radio Card * * 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 * */ .radio-card { display: flex; align-items: flex-start; gap: 0.75rem; padding: 1rem; border: 1px solid var(--road-outline); border-radius: 0.5rem; transition: border-color 0.3s, background-color 0.3s; cursor: pointer; } .radio-card-selected { outline: 2px solid var(--road-outline-variant); outline-offset: -2px; } .radio-card-disabled { outline: none; cursor: not-allowed; background-color: var(--road-surface-disabled); border: 1px solid var(--road-outline); } .radio-card:hover { border-color: var(--road-outline-variant); } .radio-card-disabled.radio-card:hover { border: 1px solid var(--road-outline); } .form-radio-input { position: absolute; opacity: 0; pointer-events: none; } .radio-card-label { font-weight: bold; } .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:disabled ~ .form-radio-label:hover::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; }