UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

372 lines (371 loc) 14.7 kB
/* * Checkbox component * */ /* * Utilities */ :root { --checkbox-width--medium: 1.5rem; --checkbox-height--medium: 1.5rem; } .dnb-checkbox { --checkbox-border-radius: 0.25rem; --checkbox-gfx-border-radius__indeterminate: 0.125rem; --checkbox-width--large: 2rem; --checkbox-height--large: 2rem; --checkbox-gfx-height__indeterminate: 0.625rem; --checkbox-gfx-width__indeterminate: 0.625rem; --checkbox-gfx-height__indeterminate--large: 0.875rem; --checkbox-gfx-width__indeterminate--large: 0.875rem; --checkbox-border-width: 0.09375rem; --checkbox-color-gfx-on: black; --checkbox-color-gfx-off: white; --checkbox-color-background-on: white; --checkbox-color-background-off: white; --checkbox-color-border-on: black; --checkbox-color-border-off: black; --checkbox-border-width--disabled: 0.125rem; --checkbox-color-gfx--disabled: grey; --checkbox-color-background-on--disabled: lightgrey; --checkbox-color-background-off--disabled: lightgrey; --checkbox-color-border-on--disabled: grey; --checkbox-color-border-off--disabled: grey; --checkbox-color-gfx__indeterminate--disabled: grey; --checkbox-color-background--active: lightgrey; --checkbox-color-border--active: transparent; --checkbox-border-width--hover: 0.125rem; --checkbox-color-gfx--hover: grey; --checkbox-color-background--hover: white; --checkbox-color-border-on--hover: grey; --checkbox-color-border-off--hover: grey; --checkbox-color-gfx--focus: grey; --checkbox-color-background--focus: lightgrey; --checkbox-border-width--error: 0.125rem; --checkbox-color-gfx--error: lavenderblush; --checkbox-color-gfx--error-contrast: red; --checkbox-color-background-on--error: red; --checkbox-color-background--error-contrast: lavenderblush; --checkbox-color-border--error: red; --checkbox-color-gfx-indeterminate--error: red; --checkbox-color-gfx--error--hover: red; --checkbox-color-background--error--hover: lavenderblush; --checkbox-color-border--error--hover: red; --checkbox-color-background-indeterminate: grey; --checkbox-color-gfx-indeterminate: darkgray; --checkbox-color-background-indeterminate--active: grey; --checkbox-color-border-indeterminate--active: white; --checkbox-color-gfx-indeterminate--active: white; --checkbox-bounding--medium: 1.75, 1.75; display: inline-flex; flex-direction: column; font-size: var(--font-size-small); line-height: var(--line-height-basis); } .dnb-checkbox__inner { display: inline-flex; flex-direction: column; align-self: center; } .dnb-checkbox__shell { -webkit-user-select: none; user-select: none; position: relative; display: flex; align-items: center; justify-content: center; width: var(--checkbox-width--medium); height: var(--checkbox-height--medium); } .dnb-checkbox--large .dnb-checkbox__shell { width: var(--checkbox-width--large); height: var(--checkbox-height--large); } .dnb-checkbox__button { display: inline-block; border: var(--checkbox-border-width) solid transparent; } .dnb-checkbox__focus { display: none; outline: none; } html[data-whatinput=keyboard] .dnb-checkbox__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-checkbox__focus, .dnb-checkbox__button { position: relative; z-index: 4; width: calc(var(--checkbox-width--medium) - 0.25rem); height: calc(var(--checkbox-height--medium) - 0.25rem); border-radius: var(--checkbox-border-radius); } .dnb-checkbox--large .dnb-checkbox__focus, .dnb-checkbox--large .dnb-checkbox__button { width: var(--checkbox-width--large); height: var(--checkbox-height--large); border-radius: var(--checkbox-border-radius); } .dnb-checkbox__gfx { position: absolute; z-index: 5; top: auto; left: auto; width: calc(var(--checkbox-width--medium) - 0.5rem); height: calc(var(--checkbox-height--medium) - 0.5rem); shape-rendering: geometricprecision; transition: opacity 200ms ease-out, transform 200ms ease-out; } .dnb-checkbox--large { line-height: var(--checkbox-height--large); } .dnb-checkbox--large .dnb-checkbox__gfx { width: calc(var(--checkbox-width--large) - 0.5rem); height: calc(var(--checkbox-height--large) - 0.5rem); } .dnb-checkbox__input { opacity: 0; position: absolute; top: auto; left: auto; z-index: 6; width: var(--checkbox-width--medium); height: var(--checkbox-height--medium); margin: 0; padding: 0; border: 0; transform: scale(var(--checkbox-bounding--medium)); } .dnb-checkbox--large .dnb-checkbox__input { width: var(--checkbox-width--large); height: var(--checkbox-height--large); transform: scale(1); } .dnb-checkbox__input:not([disabled]) { cursor: pointer; } .dnb-checkbox .dnb-form-label { margin-bottom: 0; margin-right: 0; margin-left: 0; } .dnb-checkbox__order { display: inline-flex; align-items: baseline; } .dnb-checkbox__suffix { order: 4; } .dnb-checkbox--label-position-left .dnb-checkbox__order .dnb-checkbox__inner { order: 2; } .dnb-checkbox--label-position-left .dnb-checkbox__order .dnb-form-label { order: 1; padding-right: 0.5rem; } .dnb-checkbox--label-position-left .dnb-checkbox__order .dnb-form-status { order: 3; margin-top: 0.5rem; } .dnb-checkbox--label-position-right .dnb-checkbox__order .dnb-checkbox__inner { order: 1; } .dnb-checkbox--label-position-right .dnb-checkbox__order .dnb-form-label { order: 2; padding-left: 0.5rem; } .dnb-checkbox--label-position-right .dnb-checkbox__order + .dnb-form-status { order: 3; vertical-align: top; margin-top: 0.5rem; } .dnb-checkbox { /* * Color scheme */ /** Normal state **/ } .dnb-checkbox__input:checked ~ .dnb-checkbox__gfx, .dnb-checkbox__input[data-checked=true] ~ .dnb-checkbox__gfx { opacity: 1; transform: scale(1); color: var(--checkbox-color-gfx-on); } .dnb-checkbox__input:checked ~ .dnb-checkbox__button, .dnb-checkbox__input[data-checked=true] ~ .dnb-checkbox__button { background-color: var(--checkbox-color-background-on); border-color: var(--checkbox-color-border-on); } .dnb-checkbox__input:not(:checked):not([data-checked=true]) ~ .dnb-checkbox__gfx { opacity: 0; transform: scale(0.8); color: var(--checkbox-color-gfx-off); } .dnb-checkbox__input:not(:checked):not([data-checked=true]) ~ .dnb-checkbox__button { background-color: var(--checkbox-color-background-off); border-color: var(--checkbox-color-border-off); transition: background-color 100ms ease-out; } .dnb-checkbox__input ~ .dnb-checkbox__indeterminate { position: absolute; z-index: 5; width: var(--checkbox-gfx-width__indeterminate); height: var(--checkbox-gfx-height__indeterminate); transform: scale(0.85); opacity: 0; background-color: var(--checkbox-color-gfx-indeterminate); border-radius: var(--checkbox-gfx-border-radius__indeterminate); transition: opacity 200ms ease-out, transform 200ms ease-out; } .dnb-checkbox__input:indeterminate ~ .dnb-checkbox__indeterminate { transform: scale(1); opacity: 1; } .dnb-checkbox__input:indeterminate:checked ~ .dnb-checkbox__button { background-color: transparent; border-color: var(--checkbox-color-border-off); } .dnb-checkbox__input:indeterminate:hover ~ .dnb-checkbox__gfx, .dnb-checkbox__input:indeterminate:checked ~ .dnb-checkbox__gfx, .dnb-checkbox__input:indeterminate:checked:hover ~ .dnb-checkbox__gfx { color: transparent; } .dnb-checkbox--large .dnb-checkbox__input:indeterminate ~ .dnb-checkbox__indeterminate { width: var(--checkbox-gfx-width__indeterminate--large); height: var(--checkbox-gfx-height__indeterminate--large); } .dnb-checkbox { /** Disabled state **/ } .dnb-checkbox__input[disabled]:checked ~ .dnb-checkbox__button { border-width: var(--checkbox-border-width--disabled); } .dnb-checkbox__input[disabled]:checked ~ .dnb-checkbox__button, .dnb-checkbox__input[disabled][data-checked=true] ~ .dnb-checkbox__button { background-color: var(--checkbox-color-background-on--disabled); border-color: var(--checkbox-color-border-on--disabled); } .dnb-checkbox__input[disabled]:checked ~ .dnb-checkbox__gfx, .dnb-checkbox__input[disabled][data-checked=true] ~ .dnb-checkbox__gfx { color: var(--checkbox-color-gfx--disabled); } .dnb-checkbox__input[disabled]:not(:checked):not([data-checked=true]) ~ .dnb-checkbox__button { border-color: var(--checkbox-color-border-off--disabled); background-color: var(--checkbox-color-background-off--disabled); } .dnb-checkbox__input[disabled]:indeterminate ~ .dnb-checkbox__indeterminate { background-color: var(--checkbox-color-gfx__indeterminate--disabled); } .dnb-checkbox__input[disabled]:indeterminate ~ .dnb-checkbox__gfx { color: transparent; } .dnb-checkbox { /** Active state **/ } .dnb-checkbox__input:not([disabled]):active ~ .dnb-checkbox__button { background-color: var(--checkbox-color-background--active); border-color: var(--checkbox-color-border--active); } .dnb-checkbox__input:not([disabled]):checked:active ~ .dnb-checkbox__gfx, .dnb-checkbox__input:not([disabled])[data-checked=true]:active ~ .dnb-checkbox__gfx { color: var(--checkbox-color-gfx-on); } .dnb-checkbox__input:not([disabled]):indeterminate:active ~ .dnb-checkbox__button { background-color: var(--checkbox-color-background-indeterminate--active); border-color: var(--checkbox-color-border-indeterminate--active); } .dnb-checkbox__input:not([disabled]):indeterminate:active ~ .dnb-checkbox__indeterminate { background-color: var(--checkbox-color-gfx-indeterminate--active); } .dnb-checkbox { /** Hover state **/ } .dnb-checkbox__input:not([disabled]):not(:active):hover ~ .dnb-checkbox__button { border-color: var(--checkbox-color-border-off--hover); background-color: var(--checkbox-color-background--hover); border-width: var(--checkbox-border-width--hover); } .dnb-checkbox__input:hover ~ .dnb-checkbox__gfx { color: var(--checkbox-color-gfx--hover); } .dnb-checkbox__input:not([disabled]):checked:hover ~ .dnb-checkbox__button, .dnb-checkbox__input:not([disabled])[data-checked=true]:hover ~ .dnb-checkbox__button { border: var(--checkbox-border-width--hover) solid var(--checkbox-color-border-on--hover); } .dnb-checkbox { /** Focus state **/ } html[data-whatinput=keyboard] .dnb-checkbox__input:not([disabled]):focus-visible ~ .dnb-checkbox__button { border: none; background-color: var(--checkbox-color-background--focus); } html[data-whatinput=keyboard] .dnb-checkbox__input:not([disabled]):focus-visible ~ .dnb-checkbox__gfx { color: var(--checkbox-color-gfx--focus); } .dnb-checkbox__input:not([disabled]):focus-visible ~ .dnb-checkbox__button .dnb-checkbox__focus, .dnb-checkbox__input:not([disabled]):active ~ .dnb-checkbox__button .dnb-checkbox__focus { display: block; } .dnb-checkbox__input:not([disabled]):focus-visible ~ .dnb-checkbox__indeterminate { background-color: var(--checkbox-color-gfx--focus); } .dnb-checkbox { /** Error state **/ } .dnb-checkbox__status--error .dnb-checkbox__input:not([disabled]):not(:active) ~ .dnb-checkbox__button { border: none; } .dnb-checkbox__status--error .dnb-checkbox__input:not([disabled]):not(:active) ~ .dnb-checkbox__button .dnb-checkbox__focus { display: block; --border-color: var(--checkbox-color-border--error); --border-width: var(--checkbox-border-width--error); box-shadow: 0 0 0 var(--border-width) var(--border-color); border-color: transparent; } .dnb-checkbox__status--error .dnb-checkbox__input:not([disabled]):hover ~ .dnb-checkbox__button[data-checked=true] { border-color: var(--checkbox-color-border--error--hover); } .dnb-checkbox__status--error .dnb-checkbox__input:not([disabled]):hover ~ .dnb-checkbox__button { background-color: var(--checkbox-color-background--error--hover); } .dnb-checkbox__status--error .dnb-checkbox__input:not([disabled]):hover ~ .dnb-checkbox__gfx { color: var(--checkbox-color-gfx--error--hover); } .dnb-checkbox__status--error .dnb-checkbox__input:not([disabled]):not(:active):not(:hover) ~ .dnb-checkbox__gfx { color: var(--checkbox-color-gfx--error); } html[data-whatinput=keyboard] .dnb-checkbox__status--error .dnb-checkbox__input:not([disabled]):focus ~ .dnb-checkbox__button, html[data-whatinput=keyboard] .dnb-checkbox__status--error .dnb-checkbox__input:not([disabled]):focus:hover ~ .dnb-checkbox__button { border: none; background-color: var(--checkbox-color-background--error-contrast); --border-color: var(--checkbox-color-border--error); --border-width: calc(var(--checkbox-border-width--hover)); box-shadow: 0 0 0 var(--border-width) var(--border-color); border-color: transparent; } html[data-whatinput=keyboard] .dnb-checkbox__status--error .dnb-checkbox__input:not([disabled]):focus:hover ~ .dnb-checkbox__gfx { color: var(--checkbox-color-gfx--error-contrast); } .dnb-checkbox__status--error .dnb-checkbox__input:not([disabled]):not(:active):not(:hover):checked ~ .dnb-checkbox__button, .dnb-checkbox__status--error .dnb-checkbox__input:not([disabled]):not(:active):not(:hover)[data-checked=true] ~ .dnb-checkbox__button { background-color: var(--checkbox-color-background-on--error); } .dnb-checkbox__status--error .dnb-checkbox__input:indeterminate:not([disabled]):not(:active):not(:hover) ~ .dnb-checkbox__gfx { color: var(--checkbox-color-gfx--error-contrast); background-color: var(--checkbox-color-gfx--error-contrast); border-radius: var(--checkbox-border-radius); } .dnb-checkbox__status--error .dnb-checkbox__input:indeterminate:not(:active):not(:hover) ~ .dnb-checkbox__indeterminate { background-color: var(--checkbox-color-gfx-indeterminate--error); } .dnb-checkbox__status--error .dnb-checkbox__input:not(:indeterminate) ~ .dnb-checkbox__indeterminate { background-color: var(--checkbox-color-gfx-indeterminate--error); } .dnb-checkbox__status--error .dnb-checkbox__input:indeterminate:hover:not(:active) ~ .dnb-checkbox__indeterminate { background-color: var(--checkbox-color-gfx--error--hover); } .dnb-checkbox__status--error .dnb-checkbox__input:not([disabled]):not(:active):hover ~ .dnb-checkbox__gfx { color: var(--checkbox-color-gfx--error--hover); } .dnb-checkbox.dnb-skeleton .dnb-checkbox__input[disabled] ~ .dnb-checkbox__button::before { border-radius: 0; } .dnb-checkbox.dnb-skeleton .dnb-checkbox__input[disabled] ~ .dnb-checkbox__button { border-color: var(--skeleton-color); } .dnb-checkbox.dnb-skeleton .dnb-checkbox__input[disabled] ~ .dnb-checkbox__gfx { color: var(--skeleton-color); } .dnb-checkbox.dnb-skeleton .dnb-checkbox__input[disabled] ~ .dnb-checkbox__indeterminate { background-color: var(--skeleton-color); }