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
Parameters
parameter Nameparameter Descriptionparameter Typeparameter 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
Used by

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
Parameters
parameter Nameparameter Descriptionparameter Typeparameter 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
Used by

primary

@mixin primary($function, $selection) { ... }@mixin primary($function, $selection) { 
  @include state($function, 'primary', $selection);
 }
Description

Primary emphasis styles

Parameters
Parameters
parameter Nameparameter Descriptionparameter Typeparameter Default value
$function

Toggle function (action, utility, critical)

String none
$selection

Toggle selection (selected, unselected)

String none
Requires

secondary

@mixin secondary($function, $selection) { ... }@mixin secondary($function, $selection) { 
  @include state($function, 'secondary', $selection);
 }
Description

Secondary emphasis styles

Parameters
Parameters
parameter Nameparameter Descriptionparameter Typeparameter Default value
$function

Toggle function (action, utility, critical)

String none
$selection

Toggle selection (selected, unselected)

String none
Requires

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;
    }
  }
 }
Description

Base styles

Parameters

None.

Requires

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;
  }
 }
Description

Toggle's selected state styles

Parameters

None.

Requires

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;
 }
Description

Medium size

Parameters

None.

Requires

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;
 }
Description

Large size

Parameters

None.

Requires

utility

@mixin utility() { ... }@mixin utility() { 
  @include state('utility', 'secondary', 'unselected');
 }
Description

Utility variant

Parameters

None.

Requires

utility-selected

@mixin utility-selected() { ... }@mixin utility-selected() { 
  @include state('utility', 'primary', 'selected');
 }
Description

Selected utility variant

Parameters

None.

Requires

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;
  }
 }
Description

Critical variant

Parameters

None.

Requires

critical-selected

@mixin critical-selected() { ... }@mixin critical-selected() { 
  @include state('critical', 'primary', 'selected');
 }
Description

Selected critical variant

Parameters

None.

Requires

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.