UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

358 lines (357 loc) 12.6 kB
/* * 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); }