@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
358 lines (357 loc) • 12.6 kB
CSS
/*
* Radio component
*
*/
/*
* Utilities
*/
:root {
--radio-width--medium: 1.5rem;
--radio-height--medium: 1.5rem;
}
.dnb-radio {
--radio-dot--medium: 0.75rem;
--radio-dot--large: 1.125rem;
--radio-width--large: 2rem;
--radio-height--large: 2rem;
--radio-border-width: 0.09375rem;
--radio-color-dot-on: black;
--radio-color-background-on: white;
--radio-color-border-on: black;
--radio-color-background-off: white;
--radio-color-border-off: black;
--radio-border-width--disabled: 0.125rem;
--radio-color-dot-on--disabled: lightgrey;
--radio-color-background--disabled: white;
--radio-color-border-on--disabled: lightgrey;
--radio-color-border-off--disabled: lightgrey;
--radio-color-dot-on--active: lightgrey;
--radio-color-border-on--active: lightgrey;
--radio-color-background-off--active: lightgrey;
--radio-color-border-off--active: transparent;
--radio-border-width--hover: 0.125rem;
--radio-border-width-on--hover: 0.125rem;
--radio-color-dot-on--hover: lightgrey;
--radio-color-background-on--hover: lightgrey;
--radio-color-background-off--hover: lightgrey;
--radio-border-width--focus: 0.125rem;
--radio-color-background-on--focus: var(--color-white);
--radio-color-background-off--focus: lightgrey;
--radio-color-dot-on--error: red;
--radio-color-border-on--error: red;
--radio-color-border--error-hover: red;
--radio-color-background-off--error-hover: lavenderblush;
--radio-color-background-on--error-hover: lavenderblush;
--radio-color-dot-on--error-hover: lavenderblush;
--radio-focus-ring-width--error: var(--focus-ring-width);
--radio-bounding--medium: 1.75, 1.5;
--radio-bounding--large: 1.25, 1.12;
display: inline-flex;
flex-direction: column;
font-size: var(--font-size-small);
line-height: var(--line-height-basis);
}
.dnb-radio__inner {
display: inline-flex;
flex-direction: column;
align-self: center;
}
.dnb-radio__shell {
position: relative;
-webkit-user-select: none;
user-select: none;
display: flex;
align-items: center;
flex-shrink: 0;
justify-content: center;
width: var(--radio-width--medium);
height: var(--radio-height--medium);
}
.dnb-radio__focus, .dnb-radio__button, .dnb-radio__dot {
position: absolute;
z-index: 4;
}
.dnb-radio__button {
border: var(--radio-border-width) solid transparent;
}
.dnb-radio__focus {
display: none;
outline: none;
}
html[data-whatinput=keyboard] .dnb-radio__focus {
--border-color: var(--focus-ring-color);
--border-width: var(--focus-ring-width);
box-shadow: 0 0 0 var(--border-width) var(--border-color);
border-color: transparent;
}
.dnb-radio__focus, .dnb-radio__button {
width: calc(var(--radio-width--medium) - 0.25rem);
height: calc(var(--radio-height--medium) - 0.25rem);
border-radius: 50%;
}
.dnb-radio--large .dnb-radio__focus, .dnb-radio--large .dnb-radio__button {
width: var(--radio-width--large);
height: var(--radio-height--large);
}
.dnb-radio__dot {
width: var(--radio-dot--medium);
height: var(--radio-dot--medium);
border-radius: 50%;
background-color: var(--radio-color-dot-on);
transition: opacity 200ms ease-out, transform 200ms ease-out;
}
.dnb-radio--large .dnb-radio__dot {
width: var(--radio-dot--large);
height: var(--radio-dot--large);
}
.dnb-radio__input {
opacity: 0;
position: absolute;
top: auto;
left: auto;
z-index: 5;
width: var(--radio-width--medium);
height: var(--radio-height--medium);
margin: 0;
padding: 0;
border: 0;
transform: scale(var(--radio-bounding--medium));
}
.dnb-radio--large .dnb-radio__input {
width: var(--radio-width--large);
height: var(--radio-height--large);
transform: scale(var(--radio-bounding--large));
}
.dnb-radio__input:not([disabled]) {
cursor: pointer;
}
.dnb-radio__order {
display: inline-flex;
align-items: baseline;
}
.dnb-radio-group--column .dnb-radio__order {
display: flex;
}
.dnb-radio__row {
display: inline-flex;
}
.dnb-radio__suffix {
order: 3;
}
.dnb-radio__suffix .dnb-modal__trigger {
margin-top: -0.25rem;
margin-bottom: -0.25rem;
}
.dnb-radio-group__suffix {
font-size: var(--font-size-basis);
}
.dnb-radio--large {
line-height: var(--radio-height--large);
}
.dnb-radio--large .dnb-radio__suffix {
line-height: var(--radio-height--large);
}
.dnb-radio--large .dnb-radio__shell {
width: var(--radio-width--large);
height: var(--radio-height--large);
}
.dnb-radio .dnb-form-label {
margin-right: 0;
margin-left: 0;
margin-bottom: 0;
}
.dnb-radio--label-position-left .dnb-radio__order .dnb-radio__inner {
order: 2;
}
.dnb-radio--label-position-left .dnb-radio__order .dnb-form-label {
order: 1;
padding-right: 0.5rem;
}
.dnb-radio--label-position-right .dnb-radio__order .dnb-radio__inner {
order: 1;
}
.dnb-radio--label-position-right .dnb-radio__order .dnb-form-label {
order: 2;
padding-left: 0.5rem;
}
:not(.dnb-radio-group) > .dnb-form-label + .dnb-radio {
vertical-align: top;
}
.dnb-radio .dnb-form-status {
order: 4;
margin-top: 0.375rem; /* 6/16 */
margin-bottom: 0;
}
.dnb-radio + .dnb-form-status {
margin-top: 0.5rem;
margin-bottom: 1rem;
}
.dnb-radio > .dnb-form-status {
transform: translateY(0.25rem); /* 4/16 */
}
.dnb-radio-group {
--radio-group-row-gap: 0.5rem;
--radio-group-column-gap: 1rem;
display: inline-flex;
}
.dnb-radio-group, .dnb-radio-group__fieldset, .dnb-radio-group__shell {
flex-grow: 1;
}
.dnb-radio-group fieldset:not([class*=space__top]) {
margin-top: 0;
}
.dnb-radio-group fieldset:not([class*=space__bottom]) {
margin-bottom: 0;
}
.dnb-radio-group fieldset:not([class*=space__left]) {
margin-left: 0;
}
.dnb-radio-group fieldset:not([class*=space__right]) {
margin-right: 0;
}
.dnb-radio-group fieldset {
padding: 0;
border: none;
}
.dnb-radio-group--column .dnb-radio {
display: flex;
margin-right: 0;
}
.dnb-radio-group .dnb-radio:last-of-type {
margin-right: 0;
}
.dnb-radio-group__shell {
display: flex;
flex-wrap: wrap;
column-gap: var(--radio-group-column-gap);
row-gap: var(--radio-group-row-gap);
}
.dnb-radio-group__shell > .dnb-form-status {
margin-top: 0;
margin-bottom: 0;
}
.dnb-radio-group--column .dnb-radio-group__shell {
flex-direction: column;
}
.dnb-radio {
/*
* Color scheme
*/
/** Normal state **/
}
.dnb-radio__input:checked ~ .dnb-radio__button, .dnb-radio__input[data-checked=true] ~ .dnb-radio__button {
background-color: var(--radio-color-background-on);
border-color: var(--radio-color-border-on);
}
.dnb-radio__input:checked ~ .dnb-radio__dot, .dnb-radio__input[data-checked=true] ~ .dnb-radio__dot {
opacity: 1;
transform: scale(1);
}
.dnb-radio__input:not(:checked):not([data-checked=true]) ~ .dnb-radio__dot {
opacity: 0;
transform: scale(0.8);
}
.dnb-radio__input:not(:checked):not([data-checked=true]) ~ .dnb-radio__button {
background-color: var(--radio-color-background-off);
border-color: var(--radio-color-border-off);
}
.dnb-radio {
/** Disabled state **/
}
.dnb-radio__input[disabled] ~ .dnb-radio__button {
border-width: var(--radio-border-width--disabled);
}
.dnb-radio__input[disabled]:checked ~ .dnb-radio__button, .dnb-radio__input[disabled][data-checked=true] ~ .dnb-radio__button {
border-color: var(--radio-color-border-on--disabled);
background-color: var(--radio-color-background--disabled);
}
.dnb-radio__input[disabled]:checked ~ .dnb-radio__dot, .dnb-radio__input[disabled][data-checked=true] ~ .dnb-radio__dot {
background-color: var(--radio-color-dot-on--disabled);
}
.dnb-radio__input[disabled]:not(:checked):not([data-checked=true]) ~ .dnb-radio__button:not(.dnb-skeleton) {
border-color: var(--radio-color-border-off--disabled);
background-color: var(--radio-color-background--disabled);
}
.dnb-radio__input[disabled] ~ .dnb-radio__button.dnb-skeleton::before {
border-radius: 0;
}
.dnb-radio__input[disabled] ~ .dnb-radio__button.dnb-skeleton {
border-color: var(--skeleton-color);
}
.dnb-radio {
/** Active state **/
}
.dnb-radio__input:not([disabled]):checked:active ~ .dnb-radio__button, .dnb-radio__input:not([disabled])[data-checked=true]:active ~ .dnb-radio__button {
border-color: var(--radio-color-border-on--active);
}
.dnb-radio__input:not([disabled]):checked:active ~ .dnb-radio__dot, .dnb-radio__input:not([disabled])[data-checked=true]:active ~ .dnb-radio__dot {
background-color: var(--radio-color-dot-on--active);
}
.dnb-radio__input:not([disabled]):not(:checked):not([data-checked=true]):active ~ .dnb-radio__button {
background-color: var(--radio-color-background-off--active);
border-color: var(--radio-color-border-off--active);
}
.dnb-radio {
/** Hover state **/
}
.dnb-radio__input:not([disabled]):not(:focus):checked:hover ~ .dnb-radio__dot, .dnb-radio__input:not([disabled]):not(:focus)[data-checked=true]:hover ~ .dnb-radio__dot {
background-color: var(--radio-color-dot-on--hover);
}
.dnb-radio__input:not([disabled]):not(:focus):checked:hover ~ .dnb-radio__button, .dnb-radio__input:not([disabled]):not(:focus)[data-checked=true]:hover ~ .dnb-radio__button {
background-color: var(--radio-color-background-on--hover);
border-width: var(--radio-border-width-on--hover);
}
.dnb-radio__input:not([disabled]):not(:focus):not(:checked):not([data-checked=true]):hover ~ .dnb-radio__button {
background-color: var(--radio-color-background-off--hover);
border-width: var(--radio-border-width--hover);
}
.dnb-radio {
/** Focus state **/
}
html[data-whatinput=keyboard] .dnb-radio__input:not([disabled]):focus ~ .dnb-radio__button {
border-width: var(--radio-border-width--focus);
border: none;
}
.dnb-radio__input:not([disabled]):focus ~ .dnb-radio__focus, .dnb-radio__input:not([disabled]):active ~ .dnb-radio__focus {
display: block;
}
html[data-whatinput=keyboard] .dnb-radio__input:not([disabled]):not(:active):not(:hover):checked:focus ~ .dnb-radio__button, html[data-whatinput=keyboard] .dnb-radio__input:not([disabled]):not(:active):not(:hover)[data-checked=true]:focus ~ .dnb-radio__button {
background-color: var(--radio-color-background-on--focus);
}
html[data-whatinput=keyboard] .dnb-radio__input:not([disabled]):not(:active):not(:hover):checked:focus ~ .dnb-radio__dot, html[data-whatinput=keyboard] .dnb-radio__input:not([disabled]):not(:active):not(:hover)[data-checked=true]:focus ~ .dnb-radio__dot {
background-color: var(--radio-color-dot-on--focus, var(--focus-ring-color));
}
html[data-whatinput=keyboard] .dnb-radio__input:not([disabled]):not(:checked):not([data-checked=true]):focus ~ .dnb-radio__button {
background-color: var(--radio-color-background-off--focus);
}
.dnb-radio {
/** Error state **/
}
.dnb-radio__status--error .dnb-radio__input:not([disabled]):not(:focus):not(:active) ~ .dnb-radio__button {
border: none;
}
.dnb-radio__status--error .dnb-radio__input:not([disabled]):not(:focus):not(:active) ~ .dnb-radio__focus {
display: block;
--border-color: var(--radio-color-border-on--error);
--border-width: var(--radio-focus-ring-width--error);
box-shadow: 0 0 0 var(--border-width) var(--border-color);
border-color: transparent;
}
.dnb-radio__status--error .dnb-radio__input:not([disabled]):not(:focus):not(:active):hover ~ .dnb-radio__focus {
--border-color: var(--radio-color-border--error-hover);
--border-width: var(--radio-focus-ring-width--error);
box-shadow: 0 0 0 var(--border-width) var(--border-color);
border-color: transparent;
}
.dnb-radio__status--error .dnb-radio__input:not([disabled]):not(:focus):not(:active):not(:hover):checked ~ .dnb-radio__dot, .dnb-radio__status--error .dnb-radio__input:not([disabled]):not(:focus):not(:active):not(:hover)[data-checked=true] ~ .dnb-radio__dot {
background-color: var(--radio-color-dot-on--error);
}
.dnb-radio__status--error .dnb-radio__input:not([disabled]):not(:focus):not(:active):checked:hover ~ .dnb-radio__dot, .dnb-radio__status--error .dnb-radio__input:not([disabled]):not(:focus):not(:active)[data-checked=true]:hover ~ .dnb-radio__dot {
background-color: var(--radio-color-dot-on--error-hover);
}
.dnb-radio__status--error .dnb-radio__input:not([disabled]):not(:focus):not(:active):checked:hover ~ .dnb-radio__button, .dnb-radio__status--error .dnb-radio__input:not([disabled]):not(:focus):not(:active)[data-checked=true]:hover ~ .dnb-radio__button {
background-color: var(--radio-color-background-on--error-hover);
}
.dnb-radio__status--error .dnb-radio__input:not([disabled]):not(:focus):not(:checked):not([data-checked=true]):hover ~ .dnb-radio__button {
background-color: var(--radio-color-background-off--error-hover);
}