suiss/ui
  • Docs
  • Components
  • Patterns
  • Interactions
  • Charts
  • Blocks
GitHubGet started
DocsComponentsPatternsInteractionsChartsBlocks
Components82
  • Overview
  • Accordion
  • Alert
  • Alert Dialog
  • Alert Sheet
  • Amount Input
  • Aspect Ratio
  • Attachment
  • Avatar
  • Badge
  • Bottom Bar
  • Breadcrumb
  • Bubble
  • Button
  • Button Group
  • Calendar
  • Card
  • Carousel
  • Chart
  • Checkbox
  • Chip
  • Collapsible
  • Combobox
  • Command
  • Context Menu
  • Dialog
  • Direction
  • Drawer
  • Dropdown Menu
  • Empty
  • FAB
  • Field
  • Fullscreen Menu
  • Haptics
  • Header
  • Hover Card
  • Icon
  • Input
  • Input Accessory Bar
  • Input Group
  • Input OTP
  • Item
  • Kbd
  • Keyboard Scroll View
  • Keypad
  • Label
  • Marker
  • Menubar
  • Message
  • Message Scroller
  • Native Select
  • Navigation Menu
  • Page Indicator
  • Pagination
  • Pin Pad
  • Popover
  • Progress
  • QR Scanner
  • Questionnaire
  • Radio Group
  • Resizable
  • Screen
  • Scroll Area
  • Select
  • Separator
  • Sheet
  • Sidebar
  • Signature Pad
  • Skeleton
  • Slider
  • Spinner
  • Switch
  • Tab Bar
  • Table
  • Tabs
  • Text
  • Textarea
  • Toast
  • Toggle
  • Toggle Group
  • Tooltip
  • Wheel Picker
  • Widget

suiss/ui · Component

Toggle

A two-state button that stays pressed until it's pressed again.

Toggle is an open-source component from suiss/ui for React, React Native, SwiftUI and Jetpack Compose. The @esuiss/ui CLI copies its source into your project, so you own the code.

Toggle wraps the toggle primitive of the chosen base. When pressed, it shows a tinted background and primary-colored content, and it scales down slightly while being pressed.

Use a toggle for a single on-off option such as bold text or a bookmark. To choose among related options, use ToggleGroup; for a setting that takes effect immediately, use Switch.

Installation

CLI

$ pnpm dlx shadcn@latest add @esuiss/toggle

Works in any project with a components.json. See Installation for the one-line registry setup. Or use the suiss/ui CLI:

$ pnpm dlx @esuiss/ui@latest add toggle

Manual

  1. Install the dependencies and add the cn helper:
$ pnpm add @base-ui/react class-variance-authority
  1. Copy the source into components/ui/toggle.tsx:
  1. Update the import paths to match your project.

Usage

import { Toggle } 
<Toggle

Use defaultPressed for an uncontrolled toggle, or pressed with onPressedChange to control it. Mark an icon beside a label with data-icon="inline-start" or data-icon="inline-end" to tighten the padding on that side.

Examples

Pressed

Starts in the pressed state.

Variants

Compares the default and outline variants.

Sizes

Compares the sm, default and lg sizes.

With text

Pairs an icon with a text label.

Disabled

Disables the toggle so it ignores clicks.

API Reference

01

Toggle

The pressable two-state button.

PropTypeDefaultDescription
variant"default" | "outline""default"Uses a borderless default style or an outline style with a border.
size"default" | "sm" | "lg""default"Sets the height and padding: sm, default or lg.

Also accepts the props of the primitive part it wraps.

Accessibility

  • Renders a button with aria-pressed reflecting its state.
  • Enter and Space toggle the focused button.
  • An icon-only toggle needs an aria-label.

Notes

  • Uses data-slot="toggle". Pressed styles key off aria-pressed.
  • toggleVariants is exported so other components, such as ToggleGroupItem, can share the styles.
  • The press animation is removed when reduced motion is preferred.

Toggle is a Pressable with an on and off state. When on, it shows a selected background and its text turns to the primary color; it scales down slightly while pressed. It has two variants, default and outline, and three sizes.

ToggleIcon is an Icon sized for use inside a toggle.

Installation

$ pnpm dlx shadcn@latest add @esuiss-rn/toggle

See Installation for the components.json setup. Or use the suiss/ui CLI:

$ pnpm dlx @esuiss/ui@latest add toggle
$ pnpm dlx @esuiss/ui@latest add toggle --platform swift
NextToggle GroupPreviousToast

On this page

  1. 01Installation
    • CLI
    • Manual
  2. 02Usage
  3. 03Examples
    • Pressed
    • Variants
    • Sizes
    • With text
    • Disabled
  4. 04API Reference
    • Toggle
  5. 05Accessibility
  6. 06Notes
  7. 07Installation
    • Manual
  8. 08Usage
  9. 09Examples
    • Pressed
    • Variants
    • Sizes
    • With text
    • Disabled
  10. 10API Reference
    • Toggle
    • ToggleIcon
  11. 11Accessibility
  12. 12Notes
from
"@/components/ui/toggle"
aria-label
=
"Toggle bold"
><
TextBIcon
/></
Toggle
>
$ pnpm dlx @esuiss/ui@latest add toggle --platform kotlin

The CLI also adds what it builds on: Icon, Text.

Manual

  1. Install the dependencies:
npx expo install class-variance-authority cn
  1. Add the pieces it builds on: Icon, Text, and the primitives components/primitives/toggle.tsx, components/primitives/use-render.tsx.

  2. Copy the source into components/ui/toggle.tsx:

  1. Update the import paths to match your project.
  1. Install the dependencies:
npx expo install class-variance-authority cn
  1. Add the pieces it builds on: Icon, Text, and the primitives components/primitives/toggle.tsx, components/primitives/use-render.tsx.

  2. Copy the source into components/ui/toggle.tsx:

  1. Update the import paths to match your project.
  1. Add the pieces it builds on: Icon, Text, and the primitives components/primitives/toggle.tsx, components/primitives/use-render.tsx.

  2. Copy the source into components/ui/toggle.tsx:

  1. Update the import paths to match your project.
  1. Target iOS 17 or later.

  2. Add the Swift package to your app:

Package.swift
.package(url: "https://github.com/phosphor-icons/swift", from: "2.1.0")
  1. Copy the theme files every view uses:
swift/Theme/Theme.swift
import SwiftUI
import UIKit

struct RGBA: Sendable {
  let red: CGFloat
  let green: CGFloat
  let blue: CGFloat
  let alpha: CGFloat

  init(_ hex: UInt32, _ alpha: CGFloat = 1) {
    red = CGFloat((hex >> 16) & 0xFF) / 255
    green = CGFloat((hex >> 8) & 0xFF) / 255
    blue = CGFloat(hex & 0xFF) / 255
    self.alpha = alpha
  }
swift/Theme/Tokens.swift
import SwiftUI

public enum EsuissColor {
  public static let background = Color.adaptive(light: .init(0xFFFFFF), dark: .init(0x000000))
  public static let foreground = Color.adaptive(light: .init(0x1D1D1F), dark: .init(0xF5F5F7))
  public static let card = Color.adaptive(light: .init(0xFFFFFF), dark: .init(0x1D1D1F))
  public static let cardForeground = Color.adaptive(light: .init(0x1D1D1F), dark: .init(0xF5F5F7))
  public static let popover = Color.adaptive(light: .init(0xFFFFFF), dark: .init(0x1D1D1F))
  public static let popoverForeground = Color.adaptive(light: .init(0x1D1D1F), dark: .init(0xF5F5F7))
  public static let primary = Color.adaptive(light: .init(0x0071E3), dark: .init(0x2997FF))
  public static let primaryForeground = Color.adaptive(light: .init(0xFFFFFF), dark: .init(0xFFFFFF))
  public static let secondary = Color.adaptive(light: .init(0x000000, 0.04), dark: .init(0xFFFFFF, 0.1))
  public static let secondaryForeground = Color.adaptive(light: .init(0x1D1D1F), dark: .init(0xF5F5F7))
  public static let muted = Color.adaptive(light: .init(0xF5F5F7), dark: .init(0x161617))
  public static let mutedForeground = Color.adaptive(light: .init(0x6E6E73), dark: .init(0xA1A1A6))
  public static let accent = Color.adaptive(light: .init(0x000000, 0.06), dark: .init(0xFFFFFF, 0.1))
  1. Copy the source and every file it uses:
swift/Components/Button.swift
import SwiftUI

public struct VariantButtonStyle: ButtonStyle {
  public enum Variant: CaseIterable, Sendable {
    case `default`, outline, secondary, tinted, ghost, plain, destructive, link
  }

  public enum Size: CaseIterable, Sendable {
    case `default`, xs, sm, lg, xl, icon, iconXs, iconSm, iconLg, iconXl

    var height: CGFloat {
      switch self {
      case .xs, .iconXs: 24
      case .sm, .iconSm: 32
      case .default, .icon: 36
      case .lg, .iconLg: 44
swift/Components/ButtonGroup.swift
import SwiftUI

extension EnvironmentValues {
  @Entry var buttonGroup: Axis? = nil
  @Entry var buttonGroupSize: CGSize = .zero
}

enum ButtonGroupSpace: Hashable {
  case group
}

struct ButtonGroupFrame {
  let bounds: Anchor<CGRect>
  let outlined: Bool
}
swift/Components/TextVariant.swift
import SwiftUI

public enum TextVariant: CaseIterable, Sendable {
  case `default`, h1, h2, h3, h4, p, blockquote, code, lead, large, small, muted

  var style: TextStyle {
    switch self {
    case .h1: .xl3
    case .h2: .xl2
    case .h3: .xl
    case .h4, .lead, .large: .lg
    case .code, .small, .muted: .sm
    default: .base
    }
  }
  1. Add the files to your app target.
  1. Set minSdk to 24 or higher and add the dependencies:
build.gradle.kts
implementation(platform("androidx.compose:compose-bom:2026.09.00"))
implementation("androidx.compose.foundation:foundation")
implementation("androidx.compose.ui:ui")
implementation("com.adamglin:phosphor-icon-android:1.0.0")
  1. Copy the theme files every view uses:
kotlin/theme/Theme.kt
package com.esuiss.ui.theme

import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.dropShadow
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.graphics.shadow.Shadow as DropShadow
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.LineHeightStyle
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.DpOffset
kotlin/theme/Tokens.kt
package com.esuiss.ui.theme

import androidx.compose.runtime.Immutable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp

@Immutable
data class Colors(
    val background: Color,
    val foreground: Color,
    val card: Color,
    val cardForeground: Color,
    val popover: Color,
    val popoverForeground: Color,
    val primary: Color,
    val primaryForeground: Color,
  1. Copy the source and every file it uses:
kotlin/components/Content.kt
package com.esuiss.ui.components

import androidx.compose.runtime.compositionLocalOf
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp

val LocalContentStyle = compositionLocalOf { TextStyle.Default }

val LocalContentColor = compositionLocalOf { Color.Unspecified }

val LocalIconSize = compositionLocalOf { 20.dp }
  1. Update the com.esuiss.ui package names to match your project.

Usage

import { Toggle, ToggleIcon } from "@/components/ui/toggle"
<View className="flex-row">
  <ToggleDemo accessibilityLabel="Toggle bold">
    <ToggleIcon as={TextBIcon} />
  </ToggleDemo>
</View>

Control the state with pressed and onPressedChange(pressed, details), or leave it uncontrolled with defaultPressed. Put text in a Text and icons in ToggleIcon.

Icon-only toggles need an accessibilityLabel. To group toggles with single or multiple selection, use Toggle Group. toggleVariants, toggleStateClassName and toggleTextClassName are exported for reuse in custom components.

Examples

Pressed

An icon toggle that starts in the on state.

iOS
Toggle (pressed) on iOS in light modeToggle (pressed) on iOS in dark mode
import { TextBIcon } from "phosphor-react-native"
import * as React from "react"
import { View } from "react-native"
import { Toggle, ToggleIcon } from "@/components/ui/toggle"

type ToggleDemoProps = Omit<
  React.ComponentProps<typeof Toggle>,
  "pressed" | "onPressedChange"
> & {
  initial?: boolean
}

function ToggleDemo({ initial = false, children, ...props }: ToggleDemoProps) {
  const [pressed, setPressed] = React.useState(initial)
  return (
    <Toggle pressed={pressed} onPressedChange={setPressed} {...props}>
      {children}
    </Toggle>
  )
}

export function TogglePressedExample() {
  return (
    <View className="flex-row">
      <ToggleDemo initial accessibilityLabel="Toggle bold">
        <ToggleIcon as={TextBIcon} />
      </ToggleDemo>
    </View>
  )
}
import EsuissUI
import PhosphorSwift
import SwiftUI

struct TogglePressedExample: View {
  var body: some View {
    ToggleDemo(initial: true, label: "Toggle bold") { Ph.textB.regular }
  }
}

struct ToggleDemo<Icon: View>: View {
  let variant: ToggleVariant
  let size: ToggleSize
  let label: LocalizedStringKey
  let icon: Icon

  @State private var isOn: Bool

  init(
    initial: Bool = false,
    variant: ToggleVariant = .default,
    size: ToggleSize = .default,
    label: LocalizedStringKey,
    @ViewBuilder icon: () -> Icon
  ) {
    self.variant = variant
    self.size = size
    self.label = label
    self.icon = icon()
    _isOn = State(initialValue: initial)
  }

  var body: some View {
    Toggle(isOn: $isOn) {
      icon.frame(width: 16, height: 16)
    }
    .toggleStyle(.variant(variant, size: size))
    .accessibilityLabel(Text(label))
  }
}
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp
import com.adamglin.PhosphorIcons
import com.adamglin.phosphoricons.Regular
import com.adamglin.phosphoricons.regular.TextB
import com.esuiss.ui.components.Icon
import com.esuiss.ui.components.Toggle
import com.esuiss.ui.components.ToggleSize
import com.esuiss.ui.components.ToggleVariant

@Composable
fun TogglePressedExample() {
    ToggleBold(initial = true)
}

@Composable
fun ToggleDemo(
    label: String,
    initial: Boolean = false,
    variant: ToggleVariant = ToggleVariant.Default,
    size: ToggleSize = ToggleSize.Default,
    enabled: Boolean = true,
    content: @Composable RowScope.() -> Unit,
) {
    var pressed by rememberSaveable { mutableStateOf(initial) }
    Toggle(
        pressed,
        { pressed = it },
        Modifier.semantics { contentDescription = label },
        variant = variant,
        size = size,
        enabled = enabled,
        content = content,
    )
}

@Composable
fun ToggleRow(content: @Composable () -> Unit) {
    Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) {
        content()
    }
}

@Composable
fun ToggleBold(initial: Boolean = false) {
    ToggleRow {
        ToggleDemo("Toggle bold", initial = initial) {
            Icon(PhosphorIcons.Regular.TextB, contentDescription = null)
        }
    }
}

Variants

The default and outline variants.

iOS
Toggle (variants) on iOS in light modeToggle (variants) on iOS in dark mode
import { TextItalicIcon } from "phosphor-react-native"
import * as React from "react"
import { View } from "react-native"
import { Toggle, ToggleIcon } from "@/components/ui/toggle"

type ToggleDemoProps = Omit<
  React.ComponentProps<typeof Toggle>,
  "pressed" | "onPressedChange"
> & {
  initial?: boolean
}

function ToggleDemo({ initial = false, children, ...props }: ToggleDemoProps) {
  const [pressed, setPressed] = React.useState(initial)
  return (
    <Toggle pressed={pressed} onPressedChange={setPressed} {...props}>
      {children}
    </Toggle>
  )
}

export function ToggleVariantsExample() {
  return (
    <View className="flex-row gap-2">
      <ToggleDemo accessibilityLabel="Toggle italic">
        <ToggleIcon as={TextItalicIcon} />
      </ToggleDemo>
      <ToggleDemo variant="outline" accessibilityLabel="Toggle italic">
        <ToggleIcon as={TextItalicIcon} />
      </ToggleDemo>
    </View>
  )
}
import EsuissUI
import PhosphorSwift
import SwiftUI

struct ToggleVariantsExample: View {
  var body: some View {
    HStack(spacing: 8) {
      ToggleDemo(label: "Toggle italic") { Ph.textItalic.regular }
      ToggleDemo(variant: .outline, label: "Toggle italic") { Ph.textItalic.regular }
    }
  }
}

struct ToggleDemo<Icon: View>: View {
  let variant: ToggleVariant
  let size: ToggleSize
  let label: LocalizedStringKey
  let icon: Icon

  @State private var isOn: Bool

  init(
    initial: Bool = false,
    variant: ToggleVariant = .default,
    size: ToggleSize = .default,
    label: LocalizedStringKey,
    @ViewBuilder icon: () -> Icon
  ) {
    self.variant = variant
    self.size = size
    self.label = label
    self.icon = icon()
    _isOn = State(initialValue: initial)
  }

  var body: some View {
    Toggle(isOn: $isOn) {
      icon.frame(width: 16, height: 16)
    }
    .toggleStyle(.variant(variant, size: size))
    .accessibilityLabel(Text(label))
  }
}
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp
import com.adamglin.PhosphorIcons
import com.adamglin.phosphoricons.Regular
import com.adamglin.phosphoricons.regular.TextItalic
import com.esuiss.ui.components.Icon
import com.esuiss.ui.components.Toggle
import com.esuiss.ui.components.ToggleSize
import com.esuiss.ui.components.ToggleVariant

@Composable
fun ToggleDemo(
    label: String,
    initial: Boolean = false,
    variant: ToggleVariant = ToggleVariant.Default,
    size: ToggleSize = ToggleSize.Default,
    enabled: Boolean = true,
    content: @Composable RowScope.() -> Unit,
) {
    var pressed by rememberSaveable { mutableStateOf(initial) }
    Toggle(
        pressed,
        { pressed = it },
        Modifier.semantics { contentDescription = label },
        variant = variant,
        size = size,
        enabled = enabled,
        content = content,
    )
}

@Composable
fun ToggleRow(content: @Composable () -> Unit) {
    Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) {
        content()
    }
}

@Composable
fun ToggleVariants() {
    ToggleRow {
        ToggleDemo("Toggle italic") {
            Icon(PhosphorIcons.Regular.TextItalic, contentDescription = null)
        }
        ToggleDemo("Toggle italic", variant = ToggleVariant.Outline) {
            Icon(PhosphorIcons.Regular.TextItalic, contentDescription = null)
        }
    }
}

Sizes

Outline toggles in the sm, default and lg sizes.

iOS
Toggle (sizes) on iOS in light modeToggle (sizes) on iOS in dark mode
import { TextBIcon } from "phosphor-react-native"
import * as React from "react"
import { View } from "react-native"
import { Toggle, ToggleIcon } from "@/components/ui/toggle"

type ToggleDemoProps = Omit<
  React.ComponentProps<typeof Toggle>,
  "pressed" | "onPressedChange"
> & {
  initial?: boolean
}

function ToggleDemo({ initial = false, children, ...props }: ToggleDemoProps) {
  const [pressed, setPressed] = React.useState(initial)
  return (
    <Toggle pressed={pressed} onPressedChange={setPressed} {...props}>
      {children}
    </Toggle>
  )
}

export function ToggleSizesExample() {
  return (
    <View className="flex-row items-center gap-2">
      <ToggleDemo size="sm" variant="outline" accessibilityLabel="Small">
        <ToggleIcon as={TextBIcon} />
      </ToggleDemo>
      <ToggleDemo variant="outline" accessibilityLabel="Default">
        <ToggleIcon as={TextBIcon} />
      </ToggleDemo>
      <ToggleDemo size="lg" variant="outline" accessibilityLabel="Large">
        <ToggleIcon as={TextBIcon} />
      </ToggleDemo>
    </View>
  )
}
import EsuissUI
import PhosphorSwift
import SwiftUI

struct ToggleSizesExample: View {
  var body: some View {
    HStack(spacing: 8) {
      ToggleDemo(variant: .outline, size: .sm, label: "Small") { Ph.textB.regular }
      ToggleDemo(variant: .outline, label: "Default") { Ph.textB.regular }
      ToggleDemo(variant: .outline, size: .lg, label: "Large") { Ph.textB.regular }
    }
  }
}

struct ToggleDemo<Icon: View>: View {
  let variant: ToggleVariant
  let size: ToggleSize
  let label: LocalizedStringKey
  let icon: Icon

  @State private var isOn: Bool

  init(
    initial: Bool = false,
    variant: ToggleVariant = .default,
    size: ToggleSize = .default,
    label: LocalizedStringKey,
    @ViewBuilder icon: () -> Icon
  ) {
    self.variant = variant
    self.size = size
    self.label = label
    self.icon = icon()
    _isOn = State(initialValue: initial)
  }

  var body: some View {
    Toggle(isOn: $isOn) {
      icon.frame(width: 16, height: 16)
    }
    .toggleStyle(.variant(variant, size: size))
    .accessibilityLabel(Text(label))
  }
}
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp
import com.adamglin.PhosphorIcons
import com.adamglin.phosphoricons.Regular
import com.adamglin.phosphoricons.regular.TextB
import com.esuiss.ui.components.Icon
import com.esuiss.ui.components.Toggle
import com.esuiss.ui.components.ToggleSize
import com.esuiss.ui.components.ToggleVariant

@Composable
fun ToggleDemo(
    label: String,
    initial: Boolean = false,
    variant: ToggleVariant = ToggleVariant.Default,
    size: ToggleSize = ToggleSize.Default,
    enabled: Boolean = true,
    content: @Composable RowScope.() -> Unit,
) {
    var pressed by rememberSaveable { mutableStateOf(initial) }
    Toggle(
        pressed,
        { pressed = it },
        Modifier.semantics { contentDescription = label },
        variant = variant,
        size = size,
        enabled = enabled,
        content = content,
    )
}

@Composable
fun ToggleRow(content: @Composable () -> Unit) {
    Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) {
        content()
    }
}

@Composable
fun ToggleSizes() {
    ToggleRow {
        listOf(ToggleSize.Sm to "Small", ToggleSize.Default to "Default", ToggleSize.Lg to "Large").forEach { (size, label) ->
            key(label) {
                ToggleDemo(label, variant = ToggleVariant.Outline, size = size) {
                    Icon(PhosphorIcons.Regular.TextB, contentDescription = null)
                }
            }
        }
    }
}

With text

An outline toggle with an icon and a text label.

iOS
Toggle (with text) on iOS in light modeToggle (with text) on iOS in dark mode
import { BookmarkSimpleIcon } from "phosphor-react-native"
import * as React from "react"
import { View } from "react-native"
import { Text } from "@/components/ui/text"
import { Toggle, ToggleIcon } from "@/components/ui/toggle"

type ToggleDemoProps = Omit<
  React.ComponentProps<typeof Toggle>,
  "pressed" | "onPressedChange"
> & {
  initial?: boolean
}

function ToggleDemo({ initial = false, children, ...props }: ToggleDemoProps) {
  const [pressed, setPressed] = React.useState(initial)
  return (
    <Toggle pressed={pressed} onPressedChange={setPressed} {...props}>
      {children}
    </Toggle>
  )
}

export function ToggleWithTextExample() {
  return (
    <View className="flex-row">
      <ToggleDemo variant="outline" accessibilityLabel="Bookmark">
        <ToggleIcon as={BookmarkSimpleIcon} />
        <Text>Bookmark</Text>
      </ToggleDemo>
    </View>
  )
}
import EsuissUI
import PhosphorSwift
import SwiftUI

struct WithTextDemo: View {
  @State private var isOn = false

  var body: some View {
    Toggle(isOn: $isOn) {
      Label {
        Text("Bookmark")
      } icon: {
        Ph.bookmarkSimple.regular
      }
    }
    .toggleStyle(.variant(.outline))
  }
}
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp
import com.adamglin.PhosphorIcons
import com.adamglin.phosphoricons.Regular
import com.adamglin.phosphoricons.regular.BookmarkSimple
import com.esuiss.ui.components.Icon
import com.esuiss.ui.components.Text
import com.esuiss.ui.components.Toggle
import com.esuiss.ui.components.ToggleSize
import com.esuiss.ui.components.ToggleVariant

@Composable
fun ToggleDemo(
    label: String,
    initial: Boolean = false,
    variant: ToggleVariant = ToggleVariant.Default,
    size: ToggleSize = ToggleSize.Default,
    enabled: Boolean = true,
    content: @Composable RowScope.() -> Unit,
) {
    var pressed by rememberSaveable { mutableStateOf(initial) }
    Toggle(
        pressed,
        { pressed = it },
        Modifier.semantics { contentDescription = label },
        variant = variant,
        size = size,
        enabled = enabled,
        content = content,
    )
}

@Composable
fun ToggleRow(content: @Composable () -> Unit) {
    Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) {
        content()
    }
}

@Composable
fun ToggleWithText() {
    ToggleRow {
        ToggleDemo("Bookmark", variant = ToggleVariant.Outline) {
            Icon(PhosphorIcons.Regular.BookmarkSimple, contentDescription = null)
            Text("Bookmark")
        }
    }
}

Disabled

Disabled toggles in the off and on states.

iOS
Toggle (disabled) on iOS in light modeToggle (disabled) on iOS in dark mode
import { TextBIcon, TextItalicIcon } from "phosphor-react-native"
import * as React from "react"
import { View } from "react-native"
import { Toggle, ToggleIcon } from "@/components/ui/toggle"

type ToggleDemoProps = Omit<
  React.ComponentProps<typeof Toggle>,
  "pressed" | "onPressedChange"
> & {
  initial?: boolean
}

function ToggleDemo({ initial = false, children, ...props }: ToggleDemoProps) {
  const [pressed, setPressed] = React.useState(initial)
  return (
    <Toggle pressed={pressed} onPressedChange={setPressed} {...props}>
      {children}
    </Toggle>
  )
}

export function ToggleDisabledExample() {
  return (
    <View className="flex-row gap-2">
      <ToggleDemo disabled accessibilityLabel="Toggle bold">
        <ToggleIcon as={TextBIcon} />
      </ToggleDemo>
      <ToggleDemo
        disabled
        initial
        variant="outline"
        accessibilityLabel="Toggle italic"
      >
        <ToggleIcon as={TextItalicIcon} />
      </ToggleDemo>
    </View>
  )
}
import EsuissUI
import PhosphorSwift
import SwiftUI

struct ToggleDisabledExample: View {
  var body: some View {
    HStack(spacing: 8) {
      ToggleDemo(label: "Toggle bold") { Ph.textB.regular }
      ToggleDemo(initial: true, variant: .outline, label: "Toggle italic") { Ph.textItalic.regular }
    }
    .disabled(true)
  }
}

struct ToggleDemo<Icon: View>: View {
  let variant: ToggleVariant
  let size: ToggleSize
  let label: LocalizedStringKey
  let icon: Icon

  @State private var isOn: Bool

  init(
    initial: Bool = false,
    variant: ToggleVariant = .default,
    size: ToggleSize = .default,
    label: LocalizedStringKey,
    @ViewBuilder icon: () -> Icon
  ) {
    self.variant = variant
    self.size = size
    self.label = label
    self.icon = icon()
    _isOn = State(initialValue: initial)
  }

  var body: some View {
    Toggle(isOn: $isOn) {
      icon.frame(width: 16, height: 16)
    }
    .toggleStyle(.variant(variant, size: size))
    .accessibilityLabel(Text(label))
  }
}
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp
import com.adamglin.PhosphorIcons
import com.adamglin.phosphoricons.Regular
import com.adamglin.phosphoricons.regular.TextB
import com.adamglin.phosphoricons.regular.TextItalic
import com.esuiss.ui.components.Icon
import com.esuiss.ui.components.Toggle
import com.esuiss.ui.components.ToggleSize
import com.esuiss.ui.components.ToggleVariant

@Composable
fun ToggleDemo(
    label: String,
    initial: Boolean = false,
    variant: ToggleVariant = ToggleVariant.Default,
    size: ToggleSize = ToggleSize.Default,
    enabled: Boolean = true,
    content: @Composable RowScope.() -> Unit,
) {
    var pressed by rememberSaveable { mutableStateOf(initial) }
    Toggle(
        pressed,
        { pressed = it },
        Modifier.semantics { contentDescription = label },
        variant = variant,
        size = size,
        enabled = enabled,
        content = content,
    )
}

@Composable
fun ToggleRow(content: @Composable () -> Unit) {
    Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) {
        content()
    }
}

@Composable
fun ToggleDisabled() {
    ToggleRow {
        ToggleDemo("Toggle bold", enabled = false) {
            Icon(PhosphorIcons.Regular.TextB, contentDescription = null)
        }
        ToggleDemo("Toggle italic", initial = true, variant = ToggleVariant.Outline, enabled = false) {
            Icon(PhosphorIcons.Regular.TextItalic, contentDescription = null)
        }
    }
}

API Reference

01

Toggle

The pressable two-state button.

PropTypeDefaultDescription
variant"default" | "outline""default"Visual style: default or outline.
size"default" | "sm" | "lg""default"Height and padding: default, sm or lg.

Also accepts the props of React.ComponentProps<typeof TogglePrimitive>.

02

ToggleIcon

An icon sized for a toggle.

Also accepts the props of React.ComponentProps<typeof Icon>.

Accessibility

  • Uses the togglebutton role and reports checked and disabled in accessibilityState.
  • Inside a single-select Toggle Group, it uses the radio role instead.
  • Icon-only toggles need an accessibilityLabel.

Notes

  • Changing the state triggers a selection haptic when a haptics adapter is provided through HapticsContext.
  • Uses the bg-accent, text-primary and border-border tokens, with opacity-80 while pressed and opacity-50 when disabled.
  • Light and dark colors follow the system appearance.
iOS
Toggle on iOS in light modeToggle on iOS in dark mode
import { TextBIcon } from "phosphor-react-native"
import * as React from "react"
import { View } from "react-native"
import { Toggle, ToggleIcon } from "@/components/ui/toggle"

type ToggleDemoProps = Omit<
  React.ComponentProps<typeof Toggle>,
  "pressed" | "onPressedChange"
> & {
  initial?: boolean
}

function ToggleDemo({ initial = false, children, ...props }: ToggleDemoProps) {
  const [pressed, setPressed] = React.useState(initial)
  return (
    <Toggle pressed={pressed} onPressedChange={setPressed} {...props}>
      {children}
    </Toggle>
  )
}

export function ToggleExample() {
  return (
    <View className="flex-row">
      <ToggleDemo accessibilityLabel="Toggle bold">
        <ToggleIcon as={TextBIcon} />
      </ToggleDemo>
    </View>
  )
}
import EsuissUI
import PhosphorSwift
import SwiftUI

struct ToggleExample: View {
  var body: some View {
    ToggleDemo(label: "Toggle bold") { Ph.textB.regular }
  }
}

struct ToggleDemo<Icon: View>: View {
  let variant: ToggleVariant
  let size: ToggleSize
  let label: LocalizedStringKey
  let icon: Icon

  @State private var isOn: Bool

  init(
    initial: Bool = false,
    variant: ToggleVariant = .default,
    size: ToggleSize = .default,
    label: LocalizedStringKey,
    @ViewBuilder icon: () -> Icon
  ) {
    self.variant = variant
    self.size = size
    self.label = label
    self.icon = icon()
    _isOn = State(initialValue: initial)
  }

  var body: some View {
    Toggle(isOn: $isOn) {
      icon.frame(width: 16, height: 16)
    }
    .toggleStyle(.variant(variant, size: size))
    .accessibilityLabel(Text(label))
  }
}
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp
import com.adamglin.PhosphorIcons
import com.adamglin.phosphoricons.Regular
import com.adamglin.phosphoricons.regular.TextB
import com.esuiss.ui.components.Icon
import com.esuiss.ui.components.Toggle
import com.esuiss.ui.components.ToggleSize
import com.esuiss.ui.components.ToggleVariant

@Composable
fun ToggleDemo(
    label: String,
    initial: Boolean = false,
    variant: ToggleVariant = ToggleVariant.Default,
    size: ToggleSize = ToggleSize.Default,
    enabled: Boolean = true,
    content: @Composable RowScope.() -> Unit,
) {
    var pressed by rememberSaveable { mutableStateOf(initial) }
    Toggle(
        pressed,
        { pressed = it },
        Modifier.semantics { contentDescription = label },
        variant = variant,
        size = size,
        enabled = enabled,
        content = content,
    )
}

@Composable
fun ToggleRow(content: @Composable () -> Unit) {
    Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) {
        content()
    }
}

@Composable
fun ToggleBold(initial: Boolean = false) {
    ToggleRow {
        ToggleDemo("Toggle bold", initial = initial) {
            Icon(PhosphorIcons.Regular.TextB, contentDescription = null)
        }
    }
}
import { TextBIcon } from "@phosphor-icons/react"
import { Toggle } from "@/components/ui/toggle"

export default function ToggleDemo() {
  return (
    <Toggle aria-label="Toggle bold">
      <TextBIcon />
    </Toggle>
  )
}
import { TextBIcon } from "@phosphor-icons/react"
import { Toggle } from "@/components/ui/toggle"

export default function ToggleVariants() {
  return (
    <div className="flex items-center gap-3">
      <Toggle aria-label="Toggle bold" variant="default">
        <TextBIcon />
      </Toggle>
      <Toggle aria-label="Toggle bold" variant="outline">
        <TextBIcon />
      </Toggle>
    </div>
  )
}
import { TextBIcon } from "@phosphor-icons/react"
import { Toggle } from "@/components/ui/toggle"

export default function ToggleSizes() {
  return (
    <div className="flex items-center gap-3">
      <Toggle aria-label="Toggle bold" size="sm">
        <TextBIcon />
      </Toggle>
      <Toggle aria-label="Toggle bold" size="default">
        <TextBIcon />
      </Toggle>
      <Toggle aria-label="Toggle bold" size="lg">
        <TextBIcon />
      </Toggle>
    </div>
  )
}
import { BookmarkSimpleIcon, TextItalicIcon } from "@phosphor-icons/react"
import { Toggle } from "@/components/ui/toggle"

export default function ToggleWithText() {
  return (
    <div className="flex items-center gap-3">
      <Toggle aria-label="Toggle italic">
        <TextItalicIcon data-icon="inline-start" />
        Italic
      </Toggle>
      <Toggle variant="outline" aria-label="Save for later">
        <BookmarkSimpleIcon data-icon="inline-start" />
        Save
      </Toggle>
    </div>
  )
}
import { TextBIcon } from "@phosphor-icons/react"
import { Toggle } from "@/components/ui/toggle"

export default function TogglePressed() {
  return (
    <Toggle aria-label="Toggle bold" defaultPressed>
      <TextBIcon />
    </Toggle>
  )
}
components/ui/toggle.tsx
"use client"

import { Toggle as TogglePrimitive } from "@base-ui/react/toggle"
import { cva, type VariantProps } from "class-variance-authority"
import { cn } from "@/lib/utils"

const toggleVariants = cva(
  "inline-flex items-center justify-center gap-1 rounded-lg text-sm whitespace-nowrap transition-[color,background-color,scale] duration-200 ease-[cubic-bezier(0.3,1.25,0.5,1)] outline-none active:scale-96 motion-reduce:active:scale-100 hover:bg-accent hover:text-accent-foreground focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-pressed:bg-accent aria-pressed:text-primary aria-pressed:hover:bg-accent aria-pressed:hover:text-primary [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 disabled:opacity-50",
  {
    variants: {
      variant: {
        default: "bg-transparent",
        outline:
          "border border-border bg-transparent hover:bg-accent hover:text-accent-foreground",
      },
      size: {
import { TextBIcon } from "@phosphor-icons/react"
import { Toggle } from "@/components/ui/toggle"

export default function ToggleDisabled() {
  return (
    <Toggle disabled aria-label="Toggle bold">
      <TextBIcon />
    </Toggle>
  )
}
uniwind/components/ui/toggle.tsx
import { cva, type VariantProps } from "class-variance-authority"
import { cn } from "cn"
import { Pressable } from "react-native"
import {
  Toggle as TogglePrimitive,
  type ToggleState,
} from "@/components/primitives/toggle"
import { resolveClassName } from "@/components/primitives/use-render"
import { Icon } from "@/components/ui/icon"
import { TextClassContext } from "@/components/ui/text"

const toggleVariants = cva(
  "flex-row items-center justify-center gap-1 rounded-lg",
  {
    variants: {
      variant: {
swift/Components/Toggle.swift
import SwiftUI

public enum ToggleVariant: CaseIterable, Sendable {
  case `default`, outline
}

public enum ToggleSize: CaseIterable, Sendable {
  case `default`, sm, lg

  var height: CGFloat {
    switch self {
    case .default: 36
    case .sm: 32
    case .lg: 40
    }
  }
swift/Components/Checkbox.swift
import PhosphorSwift
import SwiftUI

extension Shadow {
  static let control = Shadow(color: .black.opacity(0.08), radius: 0.5, y: 0.5)
  static let thumb = Shadow(color: .black.opacity(0.12), radius: 1.5, y: 1)
}

struct SelectionIndicator<Mark: View>: View {
  let checked: Bool
  let pressed: Bool
  let cornerRadius: CGFloat
  let mark: Mark

  @Environment(\.isEnabled) private var isEnabled
  @Environment(\.isInvalid) private var invalid
swift/Components/Field.swift
import SwiftUI

extension EnvironmentValues {
  @Entry public var isInvalid = false
  @Entry var fieldInset = false
  @Entry var fieldGroupInset = false
  @Entry var fieldSetInset = false
}

extension View {
  public func invalid(_ isInvalid: Bool = true) -> some View {
    environment(\.isInvalid, isInvalid)
  }
}

public enum FieldOrientation: CaseIterable, Sendable {
kotlin/components/Toggle.kt
package com.esuiss.ui.components

import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsPressedAsState
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.selection.selectable
import androidx.compose.foundation.selection.toggleable
swift/Components/Haptics.swift
import SwiftUI

extension EnvironmentValues {
  @Entry public var hapticsEnabled = true
}

extension View {
  public func haptics(_ enabled: Bool) -> some View {
    environment(\.hapticsEnabled, enabled)
  }

  func hapticFeedback<Trigger: Equatable>(_ feedback: SensoryFeedback, trigger: Trigger) -> some View {
    modifier(HapticFeedbackModifier(feedback: feedback, trigger: trigger) { _, _ in true })
  }

  func hapticFeedback<Trigger: Equatable>(
kotlin/components/Checkbox.kt
package com.esuiss.ui.components

import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsPressedAsState
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.selection.triStateToggleable
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
kotlin/components/Field.kt
package com.esuiss.ui.components

import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.LayoutScopeMarker
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicText
kotlin/components/FormSupport.kt
package com.esuiss.ui.components

import android.provider.Settings
import androidx.compose.animation.core.CubicBezierEasing
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.text.selection.TextSelectionColors
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.drawWithContent
import androidx.compose.ui.geometry.Offset
swift/Components/Separator.swift
import SwiftUI

public struct Separator: View {
  let orientation: Axis

  public init(_ orientation: Axis = .horizontal) {
    self.orientation = orientation
  }

  public var body: some View {
    Rectangle()
      .fill(EsuissColor.border)
      .frame(width: orientation == .vertical ? 1 : nil, height: orientation == .horizontal ? 1 : nil)
      .frame(maxWidth: orientation == .horizontal ? .infinity : nil, maxHeight: orientation == .vertical ? .infinity : nil)
      .accessibilityHidden(true)
  }
kotlin/components/Icon.kt
package com.esuiss.ui.components

import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.takeOrElse
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.unit.Dp
import com.esuiss.ui.theme.EsuissTheme

@Composable
fun Icon(
    imageVector: ImageVector,
kotlin/components/Haptics.kt
package com.esuiss.ui.components

import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.remember
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.hapticfeedback.HapticFeedback
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalHapticFeedback

val LocalHapticsEnabled = staticCompositionLocalOf { true }

@Composable
fun ProvideHaptics(enabled: Boolean, content: @Composable () -> Unit) {
    CompositionLocalProvider(LocalHapticsEnabled provides enabled, content = content)
}
kotlin/components/Label.kt
package com.esuiss.ui.components

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.text.BasicText
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import com.esuiss.ui.theme.EsuissTheme
import com.esuiss.ui.theme.Typography
kotlin/components/Separator.kt
package com.esuiss.ui.components

import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.esuiss.ui.theme.EsuissTheme

@Composable
fun Separator(
nativewind/components/ui/toggle.tsx
import { cva, type VariantProps } from "class-variance-authority"
import { cn } from "cn"
import { Pressable } from "react-native"
import {
  Toggle as TogglePrimitive,
  type ToggleState,
} from "@/components/primitives/toggle"
import { resolveClassName } from "@/components/primitives/use-render"
import { Icon } from "@/components/ui/icon"
import { TextClassContext } from "@/components/ui/text"

const toggleVariants = cva(
  "flex-row items-center justify-center gap-1 rounded-lg",
  {
    variants: {
      variant: {
stylesheet/components/ui/toggle.tsx
import type * as React from "react"
import {
  Pressable,
  type StyleProp,
  StyleSheet,
  type TextStyle,
  type ViewStyle,
} from "react-native"
import {
  Toggle as TogglePrimitive,
  type ToggleState,
} from "@/components/primitives/toggle"
import { resolveStyle } from "@/components/primitives/use-render"
import { Icon } from "@/components/ui/icon"
import { TextStyleContext } from "@/components/ui/text"
import {