Field New

Mixins

root-container

@mixin root-container() { ... }@mixin root-container() { 
  display: flex;
  flex-direction: column;
  margin-bottom: spacing.get('s2');
 }
Description

Root container

Parameters

None.

Requires

root-container-with-border

@mixin root-container-with-border() { ... }@mixin root-container-with-border() { 
  border-radius: settings.$control-border-radius;
  box-shadow: 0 0 0
      var(--_kib-field-control-has-content-border-width, #{settings.$control-border-width})
      var(--_kib-field-control-has-content-border-color, #{settings.$control-border-color}),
    0 0 0 var(--_kib-field-control-has-content-outline-width, #{settings.$control-outline-width})
      var(--_kib-field-control-has-content-outline-color, #{settings.$control-outline-color});
  outline: settings.$control-border-width solid transparent; // high contrast mode only
  color: settings.$control-text-color;
  transition: box-shadow settings.$control-transition-duration ease-out;
 }
Description

Root container with border (declarations only). Use with hover/focus-within/active in _default.

Parameters

None.

root-container-with-border-focus

@mixin root-container-with-border-focus() { ... }@mixin root-container-with-border-focus() { 
  --_kib-field-control-border-color: #{settings.$control-border-color-focus};
  --_kib-field-control-border-width: #{settings.$control-border-width-large};
  --_kib-field-control-outline-width: #{calc(
      #{border.get('ct', 'field', 'border-width', 'halo')} + #{border.get(
          'ct',
          'field',
          'border-width',
          'interaction'
        )}
    )};

  // high contrast mode only
  outline-width: settings.$control-outline-width;
 }
Description

Root container with border and focus

Parameters

None.

Requires

root-container-disabled

@mixin root-container-disabled() { ... }@mixin root-container-disabled() { 
  opacity: 0.5;

  @media (forced-colors: active) {
    opacity: 1;
  }
 }
Description

Root container when control is disabled

Parameters

None.

label

@mixin label() { ... }@mixin label() { 
  @include typography.style-as('form-label');

  order: 1;
  color: settings.$label-text-color;
 }
Description

Field label

Parameters

None.

Requires

label-disabled

@mixin label-disabled() { ... }@mixin label-disabled() { 
  pointer-events: none;
 }
Description

Disabled field label

Parameters

None.

label-hidden

@mixin label-hidden() { ... }@mixin label-hidden() { 
  @include a11y.visually-hidden;
 }
Description

Hidden label

Parameters

None.

label-required

@mixin label-required() { ... }@mixin label-required() { 
  color: settings.$control-error-text-color;
 }
Description

Required label

Parameters

None.

Requires

field

@mixin field() { ... }@mixin field() { 
  position: relative;

  /* margin: Box shadow is used to mimic input field border to prevent layout shift.
  Need that width at bottom to prevent box shadow overlapping the error/help msg */
  margin: calc(settings.$control-border-width + spacing.get('s1')) settings.$control-border-width
    settings.$control-border-width-large;
  order: 3;
  color: var(--_kib-field-control-text-color, #{settings.$control-text-color});
 }
Description

Wrapper around control and icon

Parameters

None.

Requires

control

@mixin control() { ... }@mixin control() { 
  @include typography.style-as(settings.$field-control-typography);

  position: relative;
  padding: settings.$control-padding;
  width: 100%;
  appearance: none;
  background-color: var(
    --_kib-field-control-background-color,
    #{settings.$control-background-color}
  );
  border: 0;
  border-radius: settings.$control-border-radius;
  box-shadow: 0 0 0 var(--_kib-field-control-border-width, #{settings.$control-border-width})
      var(--_kib-field-control-border-color, #{settings.$control-border-color}),
    0 0 0
      var(
        --_kib-field-control-outline-width,
        calc(#{settings.$control-outline-width} + #{settings.$control-border-width})
      )
      var(--_kib-field-control-outline-color, #{settings.$control-outline-color});
  outline: settings.$control-border-width solid transparent; // high contrast mode only
  color: settings.$control-text-color;
  transition: box-shadow settings.$control-transition-duration ease-out;
  overflow: hidden;
  text-overflow: ellipsis;

  @media screen and (prefers-reduced-motion: reduce) {
    transition: none;
  }
 }
Description

Field control

Parameters

None.

control-without-border

@mixin control-without-border() { ... }@mixin control-without-border() { 
  --_kib-field-control-border-color: transparent;
  --_kib-field-control-border-width: 0;
  --_kib-field-control-outline-width: 0;
 }
Description

Control border transparent (declarations only). Use with hover/focus/active in _default.

Parameters

None.

control-with-action-label

@mixin control-with-action-label() { ... }@mixin control-with-action-label() { 
  padding-right: settings.$control-with-action-label-padding;
 }
Description

Control right padding when right adornment is an action label (text button). Prevents longer labels from intruding into the input; use with .kib-field--with-action-label.

Parameters

None.

control-on-hover

@mixin control-on-hover() { ... }@mixin control-on-hover() { 
  @include control-state('hover');
 }
Description

Control when hovered (declarations only). High-contrast outline in _default.

Parameters

None.

Requires
Used by

control-state

@mixin control-state($state, $variant) { ... }@mixin control-state($state, $variant) { 
  $prefix: if(
    $variant == 'has-content',
    '--_kib-field-control-has-content',
    '--_kib-field-control'
  );

  #{$prefix}-border-color: #{color.get('ct', 'field', 'input', $state, 'border-color')};
  #{$prefix}-border-width: #{settings.$control-border-width-large};
  #{$prefix}-outline-color: #{color.get('ct', 'field', 'input', $state, 'halo-color')};
  #{$prefix}-background-color: #{color.get('ct', 'field', 'input', $state, 'bg-color')};
  #{$prefix}-outline-width: #{calc(
      #{border.get('ct', 'field', 'border-width', 'halo')} + #{border.get(
          'ct',
          'field',
          'border-width',
          'interaction'
        )}
    )};

  // high contrast mode only
  @if $state == 'focus' {
    outline-width: settings.$control-outline-width;
  }

  @if $state == 'error' {
    #{$prefix}-outline-color: #{color.get('ct', 'field', 'input', 'active', 'halo-color')};
  }
 }
Description

Flexible control state mixin

Parameters
Parameters
parameter Nameparameter Descriptionparameter Typeparameter Default value
$state

The state name (e.g., 'focus', 'pressed', 'invalid', 'hover')

String none
$variant

The variant name (e.g., 'has-content' or empty for regular)

String none
Requires

control-state-error-focus-halo

@mixin control-state-error-focus-halo() { ... }@mixin control-state-error-focus-halo() { 
  $prefix: if(
    $variant == 'has-content',
    '--_kib-field-control-has-content',
    '--_kib-field-control'
  );
  #{$prefix}-outline-color: #{color.get('ct', 'field', 'input', 'error', 'halo-color')};
 }
Description

Error state: outline color when control has focus/active. Use under &:focus, &:focus-visible, &:active in _default.

Parameters

None.

Requires

control-state-error-forced-colors

@mixin control-state-error-forced-colors() { ... }@mixin control-state-error-forced-colors() { 
  outline-style: dashed;
 }
Description

Error state: forced-colors outline. Use under @media (forced-colors: active) in _default.

Parameters

None.

control-on-focus

@mixin control-on-focus() { ... }@mixin control-on-focus() { 
  @include control-state('focus');
 }
Description

Control when focused

Parameters

None.

Requires
Used by

control-on-pressed

@mixin control-on-pressed() { ... }@mixin control-on-pressed() { 
  @include control-state('focus');
 }
Description

Control when pressed

Parameters

None.

Requires

control-on-invalid

@mixin control-on-invalid() { ... }@mixin control-on-invalid() { 
  @include control-state('error');
 }
Description

Invalid control

Parameters

None.

Requires
Used by

control-has-content-on-focus

@mixin control-has-content-on-focus() { ... }@mixin control-has-content-on-focus() { 
  @include control-state('focus', 'has-content');
 }
Description

Control has content when focused

Parameters

None.

Requires

control-has-content-on-pressed

@mixin control-has-content-on-pressed() { ... }@mixin control-has-content-on-pressed() { 
  @include control-state('focus', 'has-content');
 }
Description

Control has content when pressed

Parameters

None.

Requires

control-has-content-on-hover

@mixin control-has-content-on-hover() { ... }@mixin control-has-content-on-hover() { 
  @include control-state('hover', 'has-content');
 }
Description

Control has content when hovered

Parameters

None.

Requires

control-disabled

@mixin control-disabled() { ... }@mixin control-disabled() { 
  pointer-events: none;
 }
Description

Disabled control

Parameters

None.

control-read-only

@mixin control-read-only() { ... }@mixin control-read-only() { 
  --_kib-field-control-background-color: #{color.get(
      'ct',
      'field',
      'input',
      'read-only',
      'bg-color'
    )};
 }
Description

Read only control

Parameters

None.

Requires

control-placeholder

@mixin control-placeholder() { ... }@mixin control-placeholder() { 
  @include typography.style-as('utility-4');
  color: settings.$placeholder-text-color;
 }
Description

Control's placeholder text

Parameters

None.

Requires

control-autofill

@mixin control-autofill() { ... }@mixin control-autofill() { 
  --_kib-field-control-background-color: #{settings.$control-background-color-autofill};
  -webkit-text-fill-color: settings.$control-text-color;
 }
Description

Control's autofill state

Parameters

None.

clear-control-with-icon

@mixin clear-control-with-icon() { ... }@mixin clear-control-with-icon() { 
  --_kib-field-clear-offset: calc(#{settings.$icon-size} + #{settings.$clear-icon-offset});
 }
Description

Control styles when it contains an icon

Parameters

None.

Requires

help

@mixin help() { ... }@mixin help() { 
  @include typography.style-as('form-helper');

  order: 2;
  color: settings.$help-text-color;
 }
Description

Helper text

Parameters

None.

Requires

help-bottom

@mixin help-bottom() { ... }@mixin help-bottom() { 
  order: 4;
 }
Description

Helper text when on bottom position

Parameters

None.

icon-positioned-with-control-content

@mixin icon-positioned-with-control-content() { ... }@mixin icon-positioned-with-control-content() { 
  bottom: calc((#{settings.$input-field-line-height} + #{settings.$control-padding} * 2) / 2);
  top: inherit;
  transform: translateY(50%);
 }
Description

Positioning helper for elements with control content

Parameters

None.

Requires

clear-icon

@mixin clear-icon() { ... }@mixin clear-icon() { 
  width: settings.$clear-icon-size;
  height: settings.$clear-icon-size;
  color: settings.$clear-icon-color;
  flex-shrink: 0;
  display: inline-block;
  vertical-align: middle;

  @media (forced-colors: active) {
    color: inherit;
  }
 }
Description

Clear icon

Parameters

None.

Requires

clear-control-hidden

@mixin clear-control-hidden() { ... }@mixin clear-control-hidden() { 
  display: none;
 }
Description

Hidden clear control

Parameters

None.

icon

@mixin icon() { ... }@mixin icon() { 
  display: block;
  position: absolute;
  width: settings.$icon-size;
  height: settings.$icon-size;
  top: 50%;
  right: settings.$control-padding;
  z-index: 1;
  transform: translateY(-50%);
  transition: color settings.$control-transition-duration ease-out;
  pointer-events: none;
  color: color.get('ct', 'field', 'appended-button', 'action', 'active', 'icon-color');
 }
Description

Field icon

Parameters

None.

Requires

icon-with-control-content

@mixin icon-with-control-content() { ... }@mixin icon-with-control-content() { 
  @include icon-positioned-with-control-content;
 }
Description

Field icon with control content

Parameters

None.

icon-on-state

@mixin icon-on-state($variant: action, $state) { ... }@mixin icon-on-state($variant: action, $state) { 
  color: color.get('ct', 'field', 'appended-button', $variant, $state, 'icon-color');
 }
Description

Field icon state styling

Parameters
Parameters
parameter Nameparameter Descriptionparameter Typeparameter Default value
$variant

The variant (action, error, etc.) - NOTE(this might be confusing, but field adornment variant has action & error and each of them has different states: active, hover, focus, pressed)

Stringaction
$state

The state name (hover, focus, pressed, etc.)

String none
Example
@include icon-on-state(action, hover);
@include icon-on-state(error, hover);
@include icon-on-state(action, focus);
@include icon-on-state(action, pressed);
Requires

icon-with-action-states

@mixin icon-with-action-states($variant: action, $state) { ... }@mixin icon-with-action-states($variant: action, $state) { 
  & svg {
    color: color.get('ct', 'field', 'appended-button', $variant, $state, 'icon-color');
  }

  &::after {
    border-color: color.get('ct', 'field', 'appended-button', $variant, $state, 'divider-color');
  }
 }
Description

Field icon with action behavior states

Parameters
Parameters
parameter Nameparameter Descriptionparameter Typeparameter Default value
$variant

The variant (action, error, etc.)

Stringaction
$state

The state name (hover, focus, pressed, etc.)

String none
Example
@include icon-with-action-states(hover);
@include icon-with-action-states(hover, error);
@include icon-with-action-states(focus);
@include icon-with-action-states(pressed);
Requires
Used by

icon-action-state

@mixin icon-action-state($state, $variant: action) { ... }@mixin icon-action-state($state, $variant: action) { 
  @include icon-on-state($variant, $state);
  @include icon-with-action-states($state, $variant);
 }
Description

Action wrapper (icon button) state: wrapper color + SVG and divider. Use for ~ #{$block}__action.

Parameters
Parameters
parameter Nameparameter Descriptionparameter Typeparameter Default value
$state

The state name (hover, focus, pressed, etc.)

String none
$variant

The variant (action, error, etc.)

Stringaction
Requires
Used by

loading-spinner

@mixin loading-spinner() { ... }@mixin loading-spinner() { 
  width: settings.$icon-size;
  height: settings.$icon-size;
  vertical-align: inherit;
 }
Description

Generates the styles for the loading spinner

Parameters

None.

Requires

action-area-divider-styles

@mixin action-area-divider-styles() { ... }@mixin action-area-divider-styles() { 
  content: '';
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
  width: 0;
  height: settings.$icon-size;
  border-left: var(
      --_kib-field-divider-border-width,
      #{border.get('ct', 'field', 'border-width', 'standard')}
    )
    solid color.get('ct', 'field', 'appended-button', $variant, 'active', 'divider-color');
  pointer-events: none;
 }
Description

Divider pseudo-element styles only (no selector). Use under &::after in _default.

Parameters

None.

Requires
Used by

action-area-divider

@mixin action-area-divider() { ... }@mixin action-area-divider() { 
  &::after {
    @include action-area-divider-styles($variant);
  }
 }
Description

Divider pseudo-element (selector + styles). For mixins that compose action areas and need &::after.

Parameters

None.

Used by

action-area-divider-color

@mixin action-area-divider-color() { ... }@mixin action-area-divider-color() { 
  border-color: color.get('ct', 'field', 'appended-button', $variant, $state, 'divider-color');
 }
Description

Divider border color for a state. Use under &::after in _default.

Parameters

None.

Requires
Used by

action-wrapper

@mixin action-wrapper() { ... }@mixin action-wrapper() { 
  @include action-area-layout;
  @include action-area-divider($variant);

  & button {
    @include action($variant);
  }

  @media (hover: hover) and (pointer: fine) {
    &:hover {
      &::after {
        @include action-area-divider-color($variant, hover);
      }
    }
  }

  // Divider color: focus only when button has focus-visible (keyboard), not after click — matches action label
  /* stylelint-disable-next-line plugin/use-baseline -- :has() required so focus divider color applies only on focus-visible */
  &:has(button:focus-visible)::after {
    @include action-area-divider-color($variant, focus);
  }

  /* stylelint-disable-next-line plugin/use-baseline -- :has() required for pressed divider color from child button state */
  &:has(button:active)::after {
    @include action-area-divider-color($variant, pressed);
  }
 }
Description

Composes action area: layout + divider + button + divider state colors.

Parameters

None.

action-label-divider-control-state-styles

@mixin action-label-divider-control-state-styles() { ... }@mixin action-label-divider-control-state-styles() { 
  border-left-color: color.get('ct', 'field', 'appended-button', $variant, $state, 'divider-color');
 }
Description

Divider color for action label when control has a state. Use under &::after in _default.

Parameters

None.

Requires

action-label-divider-color

@mixin action-label-divider-color() { ... }@mixin action-label-divider-color() { 
  border-color: color.get('ct', 'field', 'appended-button', $variant, $state, 'divider-color');
 }
Description

Action label wrapper divider color by state. Use under &::after in _default.

Parameters

None.

Requires

action-label-control-states

@mixin action-label-control-states() { ... }@mixin action-label-control-states() { 
  $b: if($block != null, $block, '&');
  $p: if($when-invalid, '#{$b}--invalid ', '');

  @media (hover: hover) and (pointer: fine) {
    #{$p}#{$b}__control:hover ~ & .kib-field__action-label__button {
      @include action-label-control-state-full($variant, hover);
    }

    #{$p}#{$b}__control:hover ~ & {
      &::after {
        @include action-label-divider-control-state-styles($variant, hover);
      }
    }

    #{$p}#{$b}__control:active ~ & .kib-field__action-label__button {
      @include action-label-control-state-full($variant, pressed);
    }

    #{$p}#{$b}__control:active ~ & {
      &::after {
        @include action-label-divider-control-state-styles($variant, pressed);
      }
    }
  }
 }
Description

Action label styling when control is hovered/active. Button focus styling is on the button itself (:focus-visible) so the button only looks focused when tabbed to, not when the input is focused.

Parameters

None.

action-label-read-only-styles

@mixin action-label-read-only-styles() { ... }@mixin action-label-read-only-styles() { 
  background-color: settings.$control-background-color-read-only;
 }
Description

Read-only background for action label button. Use under &__button in _default.

Parameters

None.

error

@mixin error() { ... }@mixin error() { 
  order: 5;
 }
Description

Error wrapper

Parameters

None.

error-message

@mixin error-message() { ... }@mixin error-message() { 
  @include typography.style-as(settings.$error-message-token-size);

  display: flex;
  align-items: flex-start;
  margin-top: spacing.get('s1');
  color: settings.$control-error-text-color;
 }
Description

Error message

Parameters

None.

Requires

error-icon

@mixin error-icon() { ... }@mixin error-icon() { 
  display: block;
  flex-shrink: 0;
  margin-right: spacing.get('s1');
  width: settings.$error-icon-size;
  height: settings.$error-icon-size;
  color: color.get('ct', 'field', 'input', 'error', 'adornment-color');
 }
Description

Error icon

Parameters

None.

Requires

error-state-with-icons

@mixin error-state-with-icons($state) { ... }@mixin error-state-with-icons($state) { 
  @include control-on-invalid;

  ~ .kib-field__icon {
    @include icon-on-state(error, $state);
  }

  ~ .kib-field__action {
    @include icon-action-state($state, error);
  }
 }
Description

Error state with icon and action styling

Parameters
Parameters
parameter Nameparameter Descriptionparameter Typeparameter Default value
$state

The state name (hover, focus, pressed, etc.)

String none
Requires

action-area-divider-interaction-border-width

@mixin action-area-divider-interaction-border-width() { ... }@mixin action-area-divider-interaction-border-width() { 
  --_kib-field-divider-border-width: #{border.get('ct', 'field', 'border-width', 'interaction')};
 }
Description

Sets divider border width to interaction width when button has focus-visible. Use inside &:has(button:focus-visible) or &:has(.kib-field__action-label__button:focus-visible).

Parameters

None.

Requires

Variables

control-background-color

$control-background-color: color.get('ct', 'field', 'input', 'active', 'bg-color') !default;
Description

Control background color

Type

Color

Used by

control-background-color-read-only

$control-background-color-read-only: color.get(
  'ct',
  'field',
  'input',
  'read-only',
  'bg-color'
) !default;
Description

Control background readonly color

Type

Color

control-background-color-autofill

$control-background-color-autofill: color.get(
  'ct',
  'field',
  'input',
  'autofill',
  'bg-color'
) !default;
Description

Control field autofill text color

Type

Color

Used by

control-text-color

$control-text-color: color.get('ct', 'field', 'text', 'text-input-color') !default;
Description

Control text color

Type

Color

Used by

control-border-color

$control-border-color: color.get('ct', 'field', 'input', 'active', 'border-color') !default;
Description

Control border color

Type

Color

control-border-color-focus

$control-border-color-focus: color.get('ct', 'field', 'input', 'focus', 'border-color') !default;
Description

Control border color on focus

Type

Color

control-border-color-error

$control-border-color-error: color.get('ct', 'field', 'input', 'error', 'border-color') !default;
Description

Control border color when invalid

Type

Color

control-border-radius

$control-border-radius: border.get('ct', 'field', 'border-radius', 'standard') !default;
Description

Control border radius

Type

Number

Used by

control-border-width

$control-border-width: border.get('ct', 'field', 'border-width', 'standard') !default;
Description

Control border default width

Type

Number

Used by

control-border-width-large

$control-border-width-large: border.get('ct', 'field', 'border-width', 'interaction') !default;
Description

Control border large width

Type

Number

control-outline-color

$control-outline-color: color.get('ct', 'field', 'input', 'active', 'halo-color') !default;
Description

Control outline color

Type

Color

control-outline-width

$control-outline-width: border.get('ct', 'field', 'border-width', 'halo') !default;
Description

Control outline width

Type

Number

control-transition-duration

$control-transition-duration: 0.2s !default;
Description

Control transitions duration

Type

Number

Used by

control-padding

$control-padding: spacing.get('s3') !default;
Description

Control padding

Type

Number

field-control-typography

$field-control-typography: 'utility-4' !default;
Description

Form text typography token name

Type

String

Used by

label-text-color

$label-text-color: color.get('ct', 'field', 'text', 'text-label-color') !default;
Description

Label text color

Type

Color

help-text-color

$help-text-color: color.get('ct', 'field', 'text', 'text-help-color') !default;
Description

Label text color

Type

Color

clear-control-size

$clear-control-size: unit.rem(14px) !default;
Description

Cleara control size

Type

Number

clear-control-background-color

$clear-control-background-color: color.get('text', 'tertiary') !default;
Description

Clear control background color

Type

Color

clear-control-hover-color

$clear-control-hover-color: color.get('action', 'utility', 'primary', '03') !default;
Description

Clear control hover color

Type

Color

clear-icon-size

$clear-icon-size: unit.rem(12px) !default;
Description

Clear icon size

Type

Number

Used by

icon-size

$icon-size: $input-field-line-height;
Description

icon size

Type

Number

action-height

$action-height: calc($input-field-line-height + spacing.get('s3') * 2) !default;
Description

Action size

Type

Number

clear-icon-offset

$clear-icon-offset: calc(#{$control-padding} + #{spacing.get('s2')}) !default;
Description

Clear icon position offset

Type

Number

clear-icon-color

$clear-icon-color: color.get('field', 'primary') !default;
Description

Clear icon color

Type

Color

Used by

placeholder-text-color

$placeholder-text-color: color.get('text', 'tertiary') !default;
Description

Placeholder text color

Type

Color

Used by

control-with-icon-padding

$control-with-icon-padding: calc(
  #{$icon-size} + #{$clear-icon-offset} + #{spacing.get('s2')}
) !default;
Description

Control with icon padding

Type

Number

control-with-action-label-padding

$control-with-action-label-padding: calc(#{spacing.get('s4')} * 2 + 10ch) !default;
Description

Control right padding when action is a label (wider than icon). Reserves space so label does not overlap input. Based on label button horizontal padding (s4 × 2) plus space for text.

Type

Number

control-error-text-color

$control-error-text-color: color.get('ct', 'field', 'text', 'text-error-color') !default;
Description

Control text color in error state

Type

Color

Used by

control-read-only-text-color

$control-read-only-text-color: color.get('ct', 'field', 'text', 'text-input-color') !default;
Description

Control text color in readonly

Type

Color

error-message-token-size

$error-message-token-size: 'form-error' !default;
Description

Form error token size

Type

String

error-icon-size

$error-icon-size: unit.em(14.5px) !default;
Description

Error message icon size

Type

Number

Used by

action-right-spacing

$action-right-spacing: unit.rem(10px) !default;
Description

position the action button to the right length

Type

Number

icon-size

$icon-size: $input-field-line-height;
Description

icon size

Type

Number