Vize

Toggle

Accessible, unstyled toggle button with controlled and uncontrolled state.

Package @vizejs/ui/toggle
Maturity stable
Own the source vize lib pull toggle
Requires controllable-state
Aliases toggle button, pressed button, on off button
Covers WAI-ARIA toggle button, React Aria ToggleButton, Reka UI Toggle

Usage

import { Toggle } from "@vizejs/ui/toggle";

Or copy the source into your project with vize lib pull toggle (see Source Distribution).

API

Toggle

Source: src/families/selection/toggle/toggle-button.vue

Props

Prop Type Default Description
as PrimitiveAs "button" Native element, custom element, or component to render.
native boolean true when as is "button"; otherwise false Whether the rendered target already implements native button semantics.
type "button" | "reset" | "submit" "button" Native button submission behavior.
modelValue boolean undefined Controlled pressed value. undefined selects uncontrolled behavior.
defaultPressed boolean false Initial pressed state for uncontrolled use.
disabled boolean false Remove the control from activation and sequential keyboard focus.
ariaLabel string undefined Accessible name when no visible label supplies one.

Events

Event Payload Description
update:modelValue [value: boolean] Fired when the pressed state requests a new controlled boolean value.
change [value: boolean, nativeEvent: MouseEvent] Fired after user interaction requests the next pressed value.

Slots

Slot Slot props Description
default ToggleSlotState Renders the toggle contents with current pressed and availability state.

Exposed

Member Type Description
pressed ComputedRef<boolean> Current controlled or uncontrolled pressed state.
focus (options?: FocusOptions) => void Move focus to the rendered control when supported.
setPressed (value: boolean) => boolean Request a pressed-state update and report whether it differs.
reset () => boolean Restore the current default pressed state and report whether it changed.
element Readonly<ShallowRef<HTMLElement | null>> Template ref to the rendered root element.

Behavior

Normative state × input → outcome table for toggle-button.vue (@vizejs/ui/toggle). Every row is proven by the named mounted-DOM test in src/families/selection/toggle/toggle.test.ts; a row without a passing test is a contract violation.

# State Input Outcome Proven by
T1 unpressed, native render native <button type="button">, accessible name from slot, aria-pressed="false", data-vize-ui="toggle" renders a native toggle button with pressed semantics
T2 uncontrolled pointer click toggles aria-pressed and data-state; emits update:modelValue then change, in that order toggles with pointer activation and emits the requested value
T3 controlled pointer click emits the request; the rendered state keeps the parent-provided modelValue until props update controlled value wins until the parent accepts the request
T4 uncontrolled, seeded render / reset defaultPressed seeds the initial state; exposed reset() restores it uncontrolled defaultPressed seeds state and reset restores it
T5 idle, non-native Enter / Space non-native rendering exposes role="button" and emulates native button keyboard timing with one requested toggle per activation key non-native toggle emulates Enter and Space activation timing
T6 disabled, native click / Enter / Space native disabled attribute, no aria-disabled mirror, no toggle, no change, skipped by Tab disabled native and non-native toggles suppress activation
T7 disabled, non-native click / Space / Tab tabindex="-1", aria-disabled="true", no toggle, no change, skipped by Tab disabled native and non-native toggles suppress activation
T8 any slot / exposed methods slot receives live pressed and disabled booleans; focus() focuses the control and setPressed() updates uncontrolled pressed state exposes focus, setPressed, and slot state

The subpath remains tree-shakable and retains no packaged CSS; those package contracts are pinned by distribution.test.ts, check:size, and check:tree-shaking.