---
title: Checkbox
desc: Form element that allows users to select one or more options from a set.
ico: mdi:checkbox-marked-outline
keywords:
  - boolean
  - form
  - input
  - switch
  - toggle

props:
  - class: .prs-checkbox
    type: component
    desc: For <input>
  - class: .prs-checkbox-label
    type: component
    desc: For <label>
  - class: .prs-checkbox_indeterminate
    type: state
    desc: Manually apply indeterminate
  - class: .prs-checkbox_focus
    type: state
    desc: Manually apply focus

controls:
  - name: label
    type: text
    label: Label
    desc: As always, keep it simple.
    default: Label

  - name: size
    type: radio
    label: Size
    desc: Optional sizes.
    default: default
    options:
      - default
      - lg
      - xl

  - name: checked
    type: toggle
    label: Checked
    desc: Default state or checked state.
    default: false

  - name: indeterminate
    type: toggle
    label: Indeterminate
    desc: Partial group selected state. This overrides checked/unchecked model.
    default: false

  - name: state
    type: radio
    label: State
    desc: States will happen automatically when using valid markup. We do include a class to force focused state, but you should avoid using it in your application.
    default: default
    options:
      - default
      - focus
      - disabled

preview: |
  <label
    class="prs-checkbox-label"
    x-init="
      $watch('checked', value => {
        indeterminate = false;
      });
      $watch('indeterminate', value => {
        $refs.prsCheckbox.indeterminate = value;
      });
    "
  >
    <input
      type="checkbox"
      x-model="checked"
      x-ref="prsCheckbox"
      x-init="$el.indeterminate = indeterminate"
      class="prs-checkbox"
      :class="{
        'prs-checkbox-lg': size === 'lg',
        'prs-checkbox-xl': size === 'xl',
        'prs-checkbox_focus': state === 'focus',
      }"
      :disabled="state === 'disabled'" />
    <span x-text="label ? label : 'Label'" class="prs-label-text"></span>
  </label>

code:
  html: |
    {indeterminate}<label class="prs-checkbox-label">
      <input type="checkbox"{id} class="prs-checkbox{size}{focused}"{checked}{disabled} />
      <span class="prs-label-text">{label}</span>
    </label>
  logic:
    label: "this.label ? this.label : ''"
    size: "this.size !== 'default' ? ' prs-checkbox-'+ this.size : ''"
    checked: "this.checked ? ' checked' : ''"
    focused: "this.state === 'focus' ? ' prs-checkbox_focus' : ''"
    disabled: "this.state === 'disabled' ? ' disabled' : ''"
    id: "this.indeterminate ? ' id=\"my-checkbox\"' : ''"
    indeterminate: "this.indeterminate ? ('<'+'script>'+'document.getElementById(\"my-checkbox\").indeterminate = true;'+'<'+'/script>\\n\\n') : ''"
---
