Input

Form inputs use a wrapper pattern for consistent styling across all input types. The wrapper provides layout structure while the input itself handles user interaction.

Structure

Each input type uses a container class (.input, .select, .checkbox, .radio) that wraps the label, input element, and optional messages. This structure enables:

Basic input

<div class="input">
  <label for="text">Text</label>
  <input type="text" id="text" placeholder="Text">
  <span class="message">This is a helpful message.</span>
  <span class="message message--error">Input is required.</span>
</div>

Select input

<div class="select">
  <label for="select">Select</label>
  <select type="select" id="select">
    <option disabled>Lorem Ipsum</option>
    <option>Varius urna</option>
    <option>Facilisi natoque</option>
  </select>
  <span class="message">This is a helpful message.</span>
  <span class="message message--error">Input is required.</span>
</div>

Checkbox input

<div class="checkbox">
  <label for="checkbox">
    <input type="checkbox" id="checkbox" />
    Vivamus hendrerit tortor sagittis hac npraesent
  </label>
  <span class="message">This is a helpful message.</span>
  <span class="message message--error">Input is required.</span>
</div>

Radio input

<div class="radio">
  <label for="radio">
    <input type="radio" id="radio" name="radio" />
    Lorem Ipsum
  </label>
  <span class="message">This is a helpful message.</span>
  <span class="message message--error">Input is required.</span>
</div>

Configuration

:root {
  /* Colors */
  --input-color: var(--color-neutral-900);
  --input-color-error: var(--color-error);
  --input-color-disabled: var(--color-neutral-300);
  --input-background-color: var(--color-neutral-50);
  --input-placeholder-color: var(--color-neutral-500);
  --input-message-color: var(--color-neutral-500);

  /* Label */
  --input-label-color: var(--color-neutral-700);
  --input-label-weight: var(--font-weight-normal);
  --input-label-padding: 0 0 var(--space-xs) 0;
  --input-label-font-size: var(--font-size-7);

  /* Sizing */
  --input-font-size: var(--font-size-7);
  --input-min-height: calc(var(--input-padding-y) * 2 + 1.5rem);
  --input-padding-y: 0.5rem;
  --input-padding-x: 0.75rem;

  /* Border */
  --input-border-width: 1px;
  --input-border-radius: var(--border-radius-s);
  --input-border-color: var(--color-neutral-300);

  /* Focus outline */
  --input-outline-color: var(--outline-color);
  --input-outline-width: var(--outline-width);
  --input-outline-offset: var(--outline-offset);

  /* Checkbox & Radio */
  --input-checkbox-border-radius: var(--border-radius-s);
  --input-checkbox-accent: var(--color-accent);
  --input-radio-border-radius: var(--border-radius-rounded);
  --input-radio-accent: var(--color-accent);

  /* Select & Range */
  --input-select-accent: var(--color-accent);
  --input-range-accent: var(--color-accent);
  --input-range-handle-border-radius: var(--border-radius-rounded);
}