Toggle
Mixins
-visual-state
@mixin -visual-state($function, $emphasis, $selection, $interaction) { ... }@mixin -visual-state($function, $emphasis, $selection, $interaction) { --kib-toggle-icon-color: #{ct.get( 'toggle', $function, $emphasis, $selection, $interaction, 'icon-color' )}; --kib-toggle-border-color: #{ct.get( 'toggle', $function, $emphasis, $selection, $interaction, 'border-color' )}; --kib-toggle-background-color-1: #{ct.get( 'toggle', $function, $emphasis, $selection, $interaction, 'bg-color-1' )}; --kib-toggle-background-color-2: #{ct.get( 'toggle', $function, $emphasis, $selection, $interaction, 'bg-color-2' )}; --kib-toggle-background-color-3: #{ct.get( 'toggle', $function, $emphasis, $selection, $interaction, 'bg-color-3' )}; --kib-toggle-halo-color: #{ct.get( 'toggle', $function, $emphasis, $selection, $interaction, 'halo-color' )}; --kib-toggle-overlay-color: #{ct.get( 'toggle', $function, $emphasis, $selection, $interaction, 'overlay' )}; }
Description
Applies CT values for one Toggle interaction state.
Parameters
| parameter Name | parameter Description | parameter Type | parameter Default value |
|---|---|---|---|
$function | Toggle function (action, utility, critical) | String | — none |
$emphasis | Toggle emphasis (primary, secondary) | String | — none |
$selection | Toggle selection (selected, unselected) | String | — none |
$interaction | Toggle interaction (active, hover, focus, pressed) | String | — none |
Requires
- [function]
get
Used by
- [mixin]
state
state
@mixin state($function, $emphasis, $selection) { ... }@mixin state($function, $emphasis, $selection) { // Filled (primary + selected) focus matches primary button geometry: no inset // border, 2px halo, and a focused+2px offset so a clear gap sits outside the control. $filled: $emphasis == 'primary' and $selection == 'selected'; @include -visual-state($function, $emphasis, $selection, 'active'); --kib-toggle-border-width: #{ct.get('toggle', 'border-width', 'standard')}; --kib-toggle-halo-opacity: 0; @media (hover: hover) and (pointer: fine) { &:hover:not(:focus-visible):not(:active):not(:disabled):not(.kib-toggle--loading) { @include -visual-state($function, $emphasis, $selection, 'hover'); } } &:focus-visible:not(:active):not(:disabled):not(.kib-toggle--loading) { @include -visual-state($function, $emphasis, $selection, 'focus'); @if $filled { --kib-toggle-border-width: 0; --kib-toggle-halo-width: #{ct.get('toggle', 'border-width', 'focused')}; --kib-toggle-halo-gap: #{unit.rem(2px)}; } @else { // Reset in case a lower-specificity `--selected` (filled) rule also matched. --kib-toggle-border-width: #{ct.get('toggle', 'border-width', 'focused')}; --kib-toggle-halo-width: #{ct.get('toggle', 'border-width', 'halo')}; --kib-toggle-halo-gap: #{ct.get('toggle', 'border-width', 'halo-gap')}; } --kib-toggle-halo-opacity: 1; outline: 0; } &:active:not(:disabled), &.kib-toggle--loading { @include -visual-state($function, $emphasis, $selection, 'pressed'); --kib-toggle-border-width: #{ct.get('toggle', 'border-width', 'standard')}; --kib-toggle-halo-opacity: 0; } }
Description
Applies the interactive CT state model for a Toggle variant.
Parameters
| parameter Name | parameter Description | parameter Type | parameter Default value |
|---|---|---|---|
$function | Toggle function (action, utility, critical) | String | — none |
$emphasis | Toggle emphasis (primary, secondary) | String | — none |
$selection | Toggle selection (selected, unselected) | String | — none |
Requires
- [mixin]
-visual-state - [function]
get - [function]
rem
Used by
- [mixin]
primary - [mixin]
secondary - [mixin]
toggle - [mixin]
selected - [mixin]
utility - [mixin]
utility-selected - [mixin]
critical - [mixin]
critical-selected
primary
@mixin primary($function, $selection) { ... }@mixin primary($function, $selection) { @include state($function, 'primary', $selection); }
Description
Primary emphasis styles
Parameters
| parameter Name | parameter Description | parameter Type | parameter Default value |
|---|---|---|---|
$function | Toggle function (action, utility, critical) | String | — none |
$selection | Toggle selection (selected, unselected) | String | — none |
Requires
- [mixin]
state
secondary
@mixin secondary($function, $selection) { ... }@mixin secondary($function, $selection) { @include state($function, 'secondary', $selection); }
Description
Secondary emphasis styles
Parameters
| parameter Name | parameter Description | parameter Type | parameter Default value |
|---|---|---|---|
$function | Toggle function (action, utility, critical) | String | — none |
$selection | Toggle selection (selected, unselected) | String | — none |
Requires
- [mixin]
state
toggle
@mixin toggle() { ... }@mixin toggle() { --kib-toggle-size: #{kib-button-fn.height-calc(spacing.get('s1'))}; --kib-toggle-icon-size: 1.5rem; --kib-toggle-border-radius: #{ct.get('toggle', 'border-radius')}; --kib-toggle-halo-width: #{ct.get('toggle', 'border-width', 'halo')}; --kib-toggle-halo-gap: #{ct.get('toggle', 'border-width', 'halo-gap')}; --kib-toggle-background-gradient-color: color-mix( in srgb, var(--kib-toggle-background-color-2) 75%, var(--kib-toggle-background-color-3) 25% ); @include state('action', 'secondary', 'unselected'); position: relative; display: inline-flex; box-sizing: border-box; min-width: var(--kib-toggle-size); min-height: var(--kib-toggle-size); padding: 0; transform: scale3d(1, 1, 1); align-items: center; justify-content: center; appearance: none; border: 0; border-radius: var(--kib-toggle-border-radius); background: linear-gradient( 0deg, var(--kib-toggle-overlay-color) 0%, var(--kib-toggle-overlay-color) 100% ), radial-gradient( 100% 100% at 0% 0%, var(--kib-toggle-background-color-3) 0%, var(--kib-toggle-background-gradient-color) 100% ), radial-gradient( 50% 100% at 50% 100%, var(--kib-toggle-background-gradient-color) 0%, var(--kib-toggle-background-color-3) 100% ), var(--kib-toggle-background-color-1); box-shadow: inset 0 0 0 var(--kib-toggle-border-width) var(--kib-toggle-border-color); color: var(--kib-toggle-icon-color); cursor: pointer; touch-action: manipulation; user-select: none; will-change: transform; -webkit-tap-highlight-color: transparent; &::before { content: ''; position: absolute; transition: opacity 100ms ease-out; border: var(--kib-toggle-halo-width) solid var(--kib-toggle-halo-color); border-radius: calc( var(--kib-toggle-border-radius) + var(--kib-toggle-halo-width) + var(--kib-toggle-halo-gap) ); opacity: var(--kib-toggle-halo-opacity); pointer-events: none; inset: calc((var(--kib-toggle-halo-width) + var(--kib-toggle-halo-gap)) * -1); } &:disabled, &.kib-toggle--loading { opacity: 0.4; pointer-events: none; } @media (forced-colors: active) { border: #{ct.get('toggle', 'border-width', 'standard')} solid ButtonText; background: ButtonFace; box-shadow: none; color: ButtonText; &::before { display: none; } &:focus-visible { outline: #{ct.get('toggle', 'border-width', 'focused')} solid Highlight; outline-offset: #{ct.get('toggle', 'border-width', 'halo-gap')}; } &:disabled, &.kib-toggle--loading { /* stylelint-disable-next-line declaration-no-important */ border-color: GrayText !important; /* stylelint-disable-next-line declaration-no-important */ color: GrayText !important; opacity: 1; } } }
selected
@mixin selected() { ... }@mixin selected() { @include state('action', 'primary', 'selected'); @media (forced-colors: active) { border-color: Highlight; /* stylelint-disable-next-line declaration-no-important */ background: Highlight !important; /* stylelint-disable-next-line declaration-no-important */ color: HighlightText !important; } }
size-medium
@mixin size-medium() { ... }@mixin size-medium() { --kib-toggle-size: #{kib-button-fn.height-calc(spacing.get('s2'))}; --kib-toggle-icon-size: 1.8rem; }
size-large
@mixin size-large() { ... }@mixin size-large() { --kib-toggle-size: #{kib-button-fn.height-calc(spacing.get('s3'))}; --kib-toggle-icon-size: 1.8rem; }
utility
@mixin utility() { ... }@mixin utility() { @include state('utility', 'secondary', 'unselected'); }
utility-selected
@mixin utility-selected() { ... }@mixin utility-selected() { @include state('utility', 'primary', 'selected'); }
critical
@mixin critical() { ... }@mixin critical() { @include state('critical', 'secondary', 'unselected'); @media (forced-colors: active) { /* stylelint-disable-next-line declaration-no-important */ border-style: dashed !important; } }
critical-selected
@mixin critical-selected() { ... }@mixin critical-selected() { @include state('critical', 'primary', 'selected'); }
icon
@mixin icon() { ... }@mixin icon() { /* Using absolute positioning to center the icon without subpixel rendering issues */ position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); display: block; flex-shrink: 0; width: var(--kib-toggle-icon-size); height: var(--kib-toggle-icon-size); margin: 0; svg { display: block; fill: currentColor; } > :only-child { display: block; width: 100%; height: 100%; } }
Description
Toggle icon styles
Parameters
None.
icon-medium
Deprecated!
No longer supported
@mixin icon-medium() { ... }@mixin icon-medium() { }
Description
Medium icon size
Parameters
None.
icon-large
Deprecated!
No longer supported
@mixin icon-large() { ... }@mixin icon-large() { }
Description
Large icon size
Parameters
None.