Skip to main content Home About the Design SystemRoadmap OverviewDesignersDevelopers OverviewColorGridIconographyInteractionsSpacingTypography Overview Global colorBox shadowTypographyBorderOpacitySpaceLengthIconBreakpointsMedia queries All elements Accordion Alert Announcement Audio player Avatar Back to top Badge Blockquote Breadcrumb Button group Button Card Chip Code block Call to action Dialog Disclosure Footer Health index Icon Jump links Menu dropdown Navigation link Navigation (primary) Navigation (secondary) Navigation (vertical) Pagination PopoverPlanned Progress stepper Readtime Scheme dropdown Scheme toggle Select Site status Skeleton Skip link Spinner Statistic Subnavigation Surface Switch Table Tabs Tag Tile Timestamp Tooltip Video embed How to useProject FeltColor PalettesCustomizingDevelopers All PatternsAccordionAlertCall to ActionCardFilterFormLink with iconLogo wallSearch barSticky bannerSticky cardTabsTagTile AI design principlesLegal requirementsTransparency noticesIconographyColorChatbot avatarsAnimation All Personalization PatternsAnnouncement FundamentalsColorAccessibility toolsAssistive technologiesCI/CDContentContributorsDesignDevelopmentManual testingResourcesScreen readers Design/code status Release notes Get support

Scheme toggle Since v3.1.0

OverviewStyleGuidelinesCodeAccessibilityDemos
Scheme toggleEventsStacked LegendScheme toggleEventsStacked Legend

Scheme toggle

Default scheme toggle with light, dark, and system options.

import '@rhds/elements/rh-scheme-toggle/rh-scheme-toggle.js';
body {
  color-scheme: light dark;
  background-color: light-dark(var(--rh-color-surface-lightest, #ffffff),
      var(--rh-color-surface-darkest, #151515));
  color: light-dark(var(--rh-color-text-primary-default-on-light, #151515),
      var(--rh-color-text-primary-default-on-dark, #ffffff));
}

rh-scheme-toggle {
  margin-block-start: var(--rh-space-md, 8px);
}
<rh-scheme-toggle></rh-scheme-toggle>
import { SchemeToggle } from "@rhds/elements/react/rh-scheme-toggle/rh-scheme-toggle.js";

// NOTE: React 19+ does not require these wrapper imports.
// You can use the custom elements directly as-is.

export const Demo = () => (
  <SchemeToggle />
);

Events

Demonstrates the scheme-changed event fired when a user changes the color scheme.

import '@rhds/elements/rh-scheme-toggle/rh-scheme-toggle.js';

const toggle = document.getElementById('scheme-toggle');
const form = document.getElementById('scheme-toggle-events');
const events = [];
form.addEventListener('submit', e => e.preventDefault());

toggle.addEventListener('scheme-changed', event => {
  events.push(event.scheme);
  form.elements.events.value = events.join(', ');
});
body {
  color-scheme: light dark;
  background-color: light-dark(var(--rh-color-surface-lightest, #ffffff),
      var(--rh-color-surface-darkest, #151515));
  color: light-dark(var(--rh-color-text-primary-default-on-light, #151515),
      var(--rh-color-text-primary-default-on-dark, #ffffff));
}

rh-scheme-toggle {
  padding: var(--rh-space-md, 8px);
}

.container {
  margin-inline: 20px;
  margin-block-end: var(--rh-space-md, 8px);
  font-family: var(--rh-font-family-body-text);
}
<form id="scheme-toggle-events">
  <rh-scheme-toggle id="scheme-toggle"></rh-scheme-toggle>

  <p class="container">
    A <code>scheme-changed</code> event fires whenever the color scheme changes.
  </p>

  <fieldset class="container">
    <legend>Events Fired</legend>
    <output name="events">No events yet</output>
  </fieldset>
</form>
import { SchemeToggle } from "@rhds/elements/react/rh-scheme-toggle/rh-scheme-toggle.js";

// NOTE: React 19+ does not require these wrapper imports.
// You can use the custom elements directly as-is.

export const Demo = () => (
  <form id="scheme-toggle-events">
    <SchemeToggle id="scheme-toggle" />
    <p className="container">
      A
      <code>scheme-changed</code>
      event fires whenever the color scheme changes.
    </p>
    <fieldset className="container">
      <legend>Events Fired</legend>
      <output name="events">No events yet</output>
    </fieldset>
  </form>
);

Stacked Legend

Scheme toggle with a stacked legend (i.e., vertical orientation).

import '@rhds/elements/rh-scheme-toggle/rh-scheme-toggle.js';
body {
  color-scheme: light dark;
  background-color: light-dark(var(--rh-color-surface-lightest, #ffffff),
      var(--rh-color-surface-darkest, #151515));
  color: light-dark(var(--rh-color-text-primary-default-on-light, #151515),
      var(--rh-color-text-primary-default-on-dark, #ffffff));
}

rh-scheme-toggle {
  --rh-scheme-toggle-flex-flow: column nowrap;
  --rh-scheme-toggle-align-items: flex-start;
  --rh-scheme-toggle-gap: var(--rh-space-md, 8px);

  margin-block-start: var(--rh-space-md, 8px);
}
<rh-scheme-toggle></rh-scheme-toggle>
import { SchemeToggle } from "@rhds/elements/react/rh-scheme-toggle/rh-scheme-toggle.js";

// NOTE: React 19+ does not require these wrapper imports.
// You can use the custom elements directly as-is.

export const Demo = () => (
  <SchemeToggle />
);
© 2026 Red Hat Deploys by Netlify