shadcn-remix
GitHub

Toggle

A two-state button that can be either on or off.

import { css } from 'remix/component'

import { BookmarkIcon } from '#app/ui/icons.tsx'
import { Toggle } from '#app/ui/toggle.tsx'

export function ToggleDemo() {
import { css } from 'remix/component'

import { BookmarkIcon } from '#app/ui/icons.tsx'
import { Toggle } from '#app/ui/toggle.tsx'

export function ToggleDemo() {
  return () => (
    <Toggle
      aria-label="Toggle bookmark"
      size="sm"
      variant="outline"
      mix={css({
        '&[data-state="on"]': { backgroundColor: 'transparent' },
        '&[data-state="on"] > svg': {
          fill: 'oklch(62.3% 0.214 259.815)',
          stroke: 'oklch(62.3% 0.214 259.815)',
        },
      })}
    >
      <BookmarkIcon />
      Bookmark
    </Toggle>
  )
}

Installation

$ pnpm dlx shadcn@latest add https://www.shadcn-remix.com/r/toggle.json

Usage

import { Toggle } from '#app/ui/toggle.tsx'
<Toggle>Toggle</Toggle>

Examples

Outline

Use variant="outline" for an outline style.

import { ItalicIcon } from '#app/ui/icons.tsx'
import { Toggle } from '#app/ui/toggle.tsx'

export function ToggleOutline() {
  return () => (
    <Toggle variant="outline" aria-label="Toggle italic">
import { ItalicIcon } from '#app/ui/icons.tsx'
import { Toggle } from '#app/ui/toggle.tsx'

export function ToggleOutline() {
  return () => (
    <Toggle variant="outline" aria-label="Toggle italic">
      <ItalicIcon />
    </Toggle>
  )
}

Disabled

import { css } from 'remix/component'

import { UnderlineIcon } from '#app/ui/icons.tsx'
import { Toggle } from '#app/ui/toggle.tsx'

export function ToggleDisabled() {
import { css } from 'remix/component'

import { UnderlineIcon } from '#app/ui/icons.tsx'
import { Toggle } from '#app/ui/toggle.tsx'

export function ToggleDisabled() {
  return () => (
    <Toggle aria-label="Toggle italic" disabled>
      <UnderlineIcon mix={css({ height: '1rem', width: '1rem' })} />
    </Toggle>
  )
}

Lg

import { ItalicIcon } from '#app/ui/icons.tsx'
import { Toggle } from '#app/ui/toggle.tsx'

export function ToggleLg() {
  return () => (
    <Toggle size="lg" aria-label="Toggle italic">
import { ItalicIcon } from '#app/ui/icons.tsx'
import { Toggle } from '#app/ui/toggle.tsx'

export function ToggleLg() {
  return () => (
    <Toggle size="lg" aria-label="Toggle italic">
      <ItalicIcon />
    </Toggle>
  )
}

Sm

import { ItalicIcon } from '#app/ui/icons.tsx'
import { Toggle } from '#app/ui/toggle.tsx'

export function ToggleSm() {
  return () => (
    <Toggle size="sm" aria-label="Toggle italic">
import { ItalicIcon } from '#app/ui/icons.tsx'
import { Toggle } from '#app/ui/toggle.tsx'

export function ToggleSm() {
  return () => (
    <Toggle size="sm" aria-label="Toggle italic">
      <ItalicIcon />
    </Toggle>
  )
}

With text

import { ItalicIcon } from '#app/ui/icons.tsx'
import { Toggle } from '#app/ui/toggle.tsx'

export function ToggleWithText() {
  return () => (
    <Toggle aria-label="Toggle italic">
import { ItalicIcon } from '#app/ui/icons.tsx'
import { Toggle } from '#app/ui/toggle.tsx'

export function ToggleWithText() {
  return () => (
    <Toggle aria-label="Toggle italic">
      <ItalicIcon />
      Italic
    </Toggle>
  )
}

API Reference

Toggle

PropTypeDefault
pressedboolean-
defaultPressedboolean-
onPressedChange((pressed: boolean) => void)-
variantToggleVariant"default"
sizeToggleSize"default"
mixMixValue-