Skip to main content Home
About About the Design SystemRoadmap
Get started OverviewDesignersDevelopers
Foundations OverviewColorGridIconographyInteractionsSpacingTypography
Tokens Overview Global colorbox shadowTypographyborderopacityspacelengthIconBreakpointsMedia Queries
Elements All elements Accordion Alert Announcement Audio player Avatar Back to top Badge Blockquote Breadcrumb Button Card Chip Code block Call to action Dialog Disclosure Footer Health index Icon Jump links Navigation (primary) Navigation (secondary) Pagination PopoverPlanned Progress stepsPlanned Site status Skip link Spinner Statistic Subnavigation Surface Switch Table Tabs Tag Tile Timestamp Tooltip Video embed
Theming OverviewColor PalettesCustomizingDevelopers
Patterns All PatternsCardTabsFilterFormLinkLink with iconLogo wallSearch barSkip navigationSticky bannerSticky cardTileVideo thumbnail
Personalization All Personalization PatternsAnnouncement
Accessibility FundamentalsAccessibility toolsAssistive technologiesCI/CDContentContributorsDesignDevelopmentManual testingResourcesScreen readers
Design/code status Release notes Get support

Switch

OverviewStyleGuidelinesCodeAccessibilityDemos
SwitchCheck IconColor ContextDisabledFieldsetNested In LabelReversedRich MessagesRight To LeftWithout MessagesSwitchCheck IconColor ContextDisabledFieldsetNested In LabelReversedRich MessagesRight To LeftWithout Messages

Switch

import '@rhds/elements/rh-switch/rh-switch.js';
```
rh-switch {
  margin: var(--rh-space-lg);
}
```
<rh-switch id="switch-a" accessible-label="Switch A" message-on="Message when on" message-off="Message when off" checked=""></rh-switch>
```

Check Icon

import '@rhds/elements/rh-switch/rh-switch.js';
```
section {
  margin: 2rem;
}

fieldset {
  display: grid;
  grid-template-columns: max-content max-content;
  gap: var(--rh-space-lg, 16px);
}

label {
  color: var(--rh-color-text-primary-on-light, #151515);
}
```
<section>
  <form>
    <fieldset>
      <legend>Checked with label</legend>
      <rh-switch id="switch-a" accessible-label="Switch A" message-on="Message when on" message-off="Message when off" checked="" show-check-icon=""></rh-switch>
    </fieldset>
  </form>
</section>
```

Color Context

import '@rhds/elements/rh-switch/rh-switch.js';
import '@rhds/elements/lib/elements/rh-context-demo/rh-context-demo.js';
```
rh-context-demo::part(demo) {
  display: flex;
  align-items: start;
  flex-wrap: wrap;
  gap: var(--rh-space-lg, 16px);
}
```
<rh-context-demo>
  <rh-switch accessible-label="Checked" message-on="Checked on" message-off="Checked off" checked=""></rh-switch>
  <rh-switch accessible-label="Unchecked" message-on="Unchecked on" message-off="Unchecked off"></rh-switch>

  <rh-switch accessible-label="Checked with icon" message-on="Checked with icon on" message-off="Checked with icon off" checked="" show-check-icon=""></rh-switch>
  <rh-switch accessible-label="Unchecked with icon" message-on="Unchecked with icon on" message-off="Unchecked with icon off" show-check-icon=""></rh-switch>

  <rh-switch accessible-label="Checked disabled" message-on="Disabled checked on" message-off="Disabled checked off" checked="" disabled=""></rh-switch>
  <rh-switch accessible-label="Unchecked disabled" message-on="Disabled unchecked on" message-off="Disabled unchecked off" disabled=""></rh-switch>

  <rh-switch accessible-label="Checked disabled with icon" message-on="Disabled checked with icon on" message-off="Disabled checked with icon off" show-check-icon="" checked="" disabled=""></rh-switch>
  <rh-switch accessible-label="Unchecked disabled with icon" message-on="Disabled unchecked with icon on" message-off="Disabled unchecked with icon off" show-check-icon="" disabled=""></rh-switch>
</rh-context-demo>
```

Disabled

import '@rhds/elements/rh-switch/rh-switch.js';
```
section {
  margin: 2rem;
}

fieldset {
  display: grid;
  grid-template-columns: max-content max-content;
  gap: var(--rh-space-lg, 16px);
}

label {
  color: var(--rh-color-text-primary-on-light, #151515);
}

rh-switch:is(:disabled) ~ label {
  color: var(--rh-color-text-secondary-on-light, #4d4d4d);
}
```
<section>
  <form>
    <fieldset>
      <legend>Checked and Disabled</legend>
      <rh-switch id="switch-a" disabled="" message-on="Message when on" message-off="Message when off" accessible-label="Switch A" checked=""></rh-switch>
    </fieldset>
    <fieldset>
      <label for="switch-b">Switch B</label>
      <rh-switch disabled="" id="switch-b" message-on="Message when on" message-off="Message when off" checked=""></rh-switch>
    </fieldset>
  </form>
</section>
```

Fieldset

import '@rhds/elements/rh-switch/rh-switch.js';

document.getElementById('form-disabled').addEventListener('change', /** @this{HTMLFieldsetElement}*/function(event) {
  const controlsId = event.target.getAttribute('aria-controls');
  const controls = document.getElementById(controlsId);
  controls.toggleAttribute('disabled', event.target.checked);
  if (controlsId.includes('fieldset') && event.target.checked === true) {
    // eg update disable-switch-a state
    const suffix = [...controlsId].pop();
    document.getElementById(`disable-switch-${suffix}`).checked = event.target.checked;
  }
});
```
section {
  margin: 2rem;
}

fieldset {
  display: grid;
  grid-template-columns: max-content max-content;
  gap: var(--rh-space-lg, 16px);
}

fieldset:has(#reversed) {
  grid-template-columns: max-content min-content;
}

label {
  color: var(--rh-color-text-primary-on-light, #151515);
  font-weight: var(--rh-font-weight-heading-medium, 500);
}

rh-switch:is(:disabled) ~ label {
  color: var(--rh-color-text-secondary-on-light, #4d4d4d);
}
```
<section>
  <p>A switch toggles the state of a setting (between on and off). Switches provide a more explicit, visible representation on a setting.</p>
  <form>
    <fieldset id="fieldset-a">
      <legend>Option A</legend>
      <rh-switch id="switch-a" accessible-label="Switch A" message-on="Message when on" message-off="Message when off" checked=""></rh-switch>
    </fieldset>

    <fieldset id="fieldset-b">
      <legend>Option B (Explicit label)</legend>
      <label for="switch-b">Switch B</label>
      <rh-switch id="switch-b" message-on="Message when on" message-off="Message when off" checked=""></rh-switch>
    </fieldset>

    <fieldset id="form-disabled">
      <legend>Form Disabled State</legend>
      <label for="disable-fieldset-a">Disable Fieldset A</label>
      <rh-switch id="disable-fieldset-a" message-on="Fieldset A is disabled" message-off="ieldset A is enabled" aria-controls="fieldset-a"></rh-switch>

      <label for="disable-switch-a">Disable Switch A</label>
      <rh-switch id="disable-switch-a" message-on="Switch A is disabled" message-off="Switch A is enabled" aria-controls="switch-a"></rh-switch>

      <label for="disable-fieldset-b">Disable Fieldset B</label>
      <rh-switch id="disable-fieldset-b" message-on="Fieldset A is disabled" message-off="Fieldset A is enabled" aria-controls="fieldset-b"></rh-switch>

      <label for="disable-switch-b">Disable Switch B</label>
      <rh-switch id="disable-switch-b" message-on="Switch A is disabled" message-off="Switch A is enabled" aria-controls="switch-b"></rh-switch>
    </fieldset>
  </form>
</section>
```

Nested In Label

import '@rhds/elements/rh-switch/rh-switch.js';
import '@rhds/elements/rh-button/rh-button.js';

document.getElementById('nested-label').addEventListener('submit', /** @this {HTMLFormElement} */function(event) {
  event.preventDefault();
  this.querySelector('output').textContent = `Dark mode ${this.elements.status.checked ? 'On' : 'Off'}`;
});
```
section {
  padding: 1em;
}

fieldset {
  display: grid;
  grid-template-columns: min-content max-content;
  gap: var(--rh-c-switch--ColumnGap, var(--rh-c-switch__label--PaddingLeft, 1rem));
  &:has(#reversed) {
    grid-template-columns: max-content min-content;
  }
}

label {
  color: var(--rh-color-text-primary-on-light, #151515);
}

#nested-label fieldset {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
}

#nested-label output {
  width: 100%;
}
```
<section>
  <form id="nested-label">
    <fieldset>
      <legend>Nested in a label</legend>
      <label> Dark Mode
        <rh-switch name="status" message-on="On" message-off="Off" checked=""></rh-switch>
      </label>
      <rh-button type="submit">Submit</rh-button>
      <output>Submit to read status</output>
    </fieldset>
  </form>
</section>
```

Reversed

import '@rhds/elements/rh-switch/rh-switch.js';
```
form {
  margin: 2rem;
  & fieldset {
    display: grid;
    gap: 1rem;
    grid-template-columns: 1fr;
    & label {
      color: var(--rh-color-text-primary-on-light, #151515);
    }
  }
}
```
<form>
  <fieldset>
    <legend>Reversed message</legend>
    <rh-switch id="switch-a" accessible-label="Switch A" message-on="Message when on" message-off="Message when off" checked="" reversed=""></rh-switch>
  </fieldset>
  <fieldset>
    <legend>Reversed with label</legend>
    <label for="switch-b">Switch B</label>
    <rh-switch id="switch-b" message-on="Message when on" message-off="Message when off" checked="" reversed=""></rh-switch>
  </fieldset>
  <fieldset>
    <legend>Reversed with slotted message</legend>
    <rh-switch id="switch-a" accessible-label="Switch A" checked="" reversed="">
      <span slot="message-on">Message when on</span>
      <span slot="message-off">Message when off</span>
    </rh-switch>
  </fieldset>
  <fieldset>
    <legend>Reversed with label and slotted message</legend>
    <label for="switch-b">Switch B</label>
    <rh-switch id="switch-b" checked="" reversed="">
      <span slot="message-on">Message when on</span>
      <span slot="message-off">Message when off</span>
    </rh-switch>
  </fieldset>
</form>
```

Rich Messages

import '@rhds/elements/rh-switch/rh-switch.js';
```
<rh-switch id="switch-a" accessible-label="Switch A" checked="">
  <span slot="message-on">Message when <strong>on</strong></span>
  <span slot="message-off">Message when <strong>off</strong></span>
</rh-switch>
```

Right To Left

import '@rhds/elements/rh-switch/rh-switch.js';
```
label {
    color: var(--rh-color-text-primary-on-light, #151515);
  }
rh-switch:is(:disabled) ~ label {
    color: var(--rh-color-text-secondary-on-light, #4d4d4d);
  }
[color-palette^="dark"] label {
   color:  var(--rh-color-text-primary-on-dark, #ffffff)
  }
[color-palette^="dark"] rh-switch:is(:disabled) ~ label {
    color: var(--rh-color-text-secondary-on-dark, #c7c7c7);
  }
fieldset {
    display: grid;
    gap: 1rem;
    grid-template-columns: 1fr;
  }
fieldset div {
    display: flex;
    gap: 1rem;
  }
```
<form dir="rtl">
  <fieldset>
    <legend>Right To Left - No Label</legend>
    <div>
      <rh-switch accessible-label="RTL Switch No Messages"></rh-switch>
    </div>
    <div>
      <rh-switch accessible-label="RTL Switch No Messages, Checked" checked=""></rh-switch>
    </div>
    <div>
      <rh-switch id="switch-a" accessible-label="RTL Switch with Messages, Checked" message-on="Message when on" message-off="Message when off" checked=""></rh-switch>
    </div>
    <div>
      <rh-switch id="switch-b" message-on="Message when on" message-off="Message when off" accessible-label="RTL Switch with Messages, Show Checked Icon" show-check-icon=""></rh-switch>
    </div>

    <div>
      <rh-switch id="switch-c" accessible-label="RTL with Reversed Messages, Show Checked Icon" message-on="Reversed message when on" message-off="Reversed message when off" show-check-icon="" reversed=""></rh-switch>
    </div>
  </fieldset>

  <fieldset disabled="">
    <legend>Right to Left - Disabled</legend>
    <div>
      <rh-switch id="switch-w" accessible-label="Disabled RTL Switch No Label"></rh-switch>
    </div>
    <div>
      <rh-switch id="switch-x" accessible-label="Disabled RTL Switch No Label, Checked" checked=""></rh-switch>
    </div>
    <div>
      <rh-switch id="switch-y" accessible-label="Disabled RTL Switch No Label, Checked, Show Checked Icon" checked="" show-check-icon=""></rh-switch>
    </div>
    <div>
      <label for="switch-z">Disabled RTL Switch with Label and Messages</label>
      <rh-switch id="switch-z" message-on="Disabled Message when on" message-off="Disabled Message when off"></rh-switch>
    </div>
    <div>
      <label for="switch-1">Disabled RTL Switch with Label and with Messages, Show Checked Icon</label>
      <rh-switch id="switch-1" message-on="Disabled Message when on" message-off="Disabled Message when off" checked="" show-check-icon=""></rh-switch>
    </div>
  </fieldset>

  <fieldset>
    <legend>Right to Left - With Sibling Label</legend>
    <div>
      <label for="switch-e">RTL Switch</label>
      <rh-switch id="switch-e" message-on="Message when on" message-off="Message when off" checked=""></rh-switch>
    </div>
    <div>
      <label for="switch-f">RTL Switch</label>
      <rh-switch id="switch-f" message-on="Message when on" message-off="Message when off"></rh-switch>
    </div>
    <div>
      <label for="switch-g">RTL Switch, Show Checked Icon</label>
      <rh-switch id="switch-g" checked="" show-check-icon="" message-on="Message when on" message-off="Message when off"></rh-switch>
    </div>
    <div>
      <rh-switch id="switch-h" message-on="Reversed message when on" message-off="Reversed message when off" checked="" show-check-icon="" reversed=""></rh-switch>
      <label for="switch-h">Switch with Reversed Messages, Show Checked Icon</label>
    </div>
  </fieldset>

  <fieldset>
    <legend>Right to Left - With Rich Messages</legend>
    <div>
      <rh-switch accessible-label="RTL Switch" checked="">
        <div slot="messages">Message when
<span data-state="on">On</span>
<span data-state="of" hidden="">Off</span>
        </div>
      </rh-switch>
    </div>
  </fieldset>
</form>
```

Without Messages

import '@rhds/elements/rh-switch/rh-switch.js';
```
section {
  margin: 2rem;
}

fieldset {
  display: grid;
  grid-template-columns: max-content max-content;
  gap: var(--rh-space-lg, 16px);
}
```
<section>
  <form>
    <fieldset>
      <legend>Without messages</legend>
      <rh-switch id="switch-a" accessible-label="Switch A" checked=""></rh-switch>
      <rh-switch id="switch-b" accessible-label="Switch B" checked="" show-check-icon=""></rh-switch>
    </fieldset>
  </form>
</section>
```
© 2021-2025 Red Hat, Inc. Deploys by Netlify