Components

Toggle

Pressable toggle button with pressed state tracking via aria-pressed.

Category: Form / Standalone

Import

import { Toggle } from "@hareru/ui"

Exports

NameTypeDescription
ToggleComponentMain toggle button component
TogglePropsTypeProps interface
toggleVariantsFunctionCVA variant resolver

Types

export interface ToggleProps
  extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "defaultValue">,
    VariantProps<typeof toggleVariants> {
  pressed?: boolean
  defaultPressed?: boolean
  onPressedChange?: (pressed: boolean) => void
}

Variants

PropValuesDefault
variantdefault | outlinedefault
sizesm | md | lgmd

Key Props

PropTypeDefaultDescription
variantstring"default"Visual style variant
sizestring"md"Size variant
pressedbooleanControlled pressed state
defaultPressedbooleanfalseInitial uncontrolled pressed state
onPressedChange(pressed: boolean) => voidCallback when pressed state changes
disabledbooleanfalseDisables the toggle

States

StateTypeValuesDefaultCSS Reflection
pressedbooleandata attribute

Accessibility

  • ARIA attributes: aria-pressed
  • Keyboard:
    • Enter or Space to toggle
  • Notes: Uses aria-pressed and data-state for pressed state.

Usage

import { Toggle } from "@hareru/ui"

// Basic usage
<Toggle>B</Toggle>

// Outline variant
<Toggle variant="outline">I</Toggle>

// Small size
<Toggle size="sm">U</Toggle>

// Controlled
<Toggle
  pressed={bold}
  onPressedChange={setBold}
>
  Bold
</Toggle>

// Toolbar example
<div style={{ display: "flex", gap: "0.25rem" }}>
  <Toggle size="sm" aria-label="Bold">B</Toggle>
  <Toggle size="sm" variant="outline" aria-label="Italic">I</Toggle>
  <Toggle size="sm" aria-label="Underline">U</Toggle>
</div>

Notes

  • Uses aria-pressed for accessibility — screen readers announce pressed state.
  • data-state is set to "on" or "off" and can be targeted in CSS.
  • Toggle manages its own uncontrolled state when pressed is not provided.

On this page