Grid
Keep the grid visible and choose the helpers used while arranging the sheet.
Turns one persistent option on or off with aria-pressed. Default uses an ink fill when pressed; subtle uses a soft fill and stronger text.
Keep the grid visible and choose the helpers used while arranging the sheet.
Three ways in. They share one source, so the pixels match whichever you pick.
npm install @noorddev/vlak-react
// once, next to your app's root
import "@noorddev/vlak-react/css";
import { Toggle } from "@noorddev/vlak-react";Precompiled React and one stylesheet. No compiler to configure. Per-component imports work too: @noorddev/vlak-react/components/toggle.
npx @noorddev/vlak-cli add toggle
The StyleX leaf lands in components/vlak/, for your own compiler to own. See StyleX.
npx shadcn add https://vlak.dev/r/toggle.json
The same registry item, installed by shadcn's CLI.
<link rel="stylesheet" href="node_modules/@noorddev/vlak/css/vlak.css" />
No React. Link vlak.css and use the markup and classes below.
import { useState } from "react";
import { Toggle } from "@noorddev/vlak-react";
const [bold, setBold] = useState(false);
const [italic, setItalic] = useState(false);
<Toggle pressed={bold} onPressedChange={setBold}>Bold</Toggle>
<Toggle variant="subtle" pressed={italic} onPressedChange={setItalic}>Italic</Toggle>
<Toggle variant="subtle" defaultPressed>Underline</Toggle>
<Toggle variant="subtle" disabled>Strikethrough</Toggle>Press switch; state lives in aria-pressed.
| Prop | Type | Default | Description |
|---|---|---|---|
pressed | boolean | ||
defaultPressed | boolean | ||
onPressedChange | (pressed: boolean) => void | ||
variant | "subtle" | "default" | "default" | Subtle uses a quiet hover and a soft selected fill. |
Also accepts Omit<ButtonHTMLAttributes<HTMLButtonElement>, "onChange">.
One pressed at a time.
| Prop | Type | Default | Description |
|---|---|---|---|
optionsrequired | { value: string; label: ReactNode; }[] | ||
value | string | ||
defaultValue | string | ||
onValueChange | (value: string) => void | ||
variant | "subtle" | "default" | "default" | Subtle groups use a soft rail and individually rounded selected items. |
Also accepts Omit<HTMLAttributes<HTMLDivElement>, "onChange">.
| Keys | Does |
|---|---|
| Tab | Moves focus to the toggle |
| Enter, Space | Presses or releases it |
<button class="rs-toggle rs-toggle-pressed" aria-pressed="true">Bold</button> <button class="rs-toggle rs-toggle-subtle" aria-pressed="false">Italic</button> <button class="rs-toggle rs-toggle-pressed rs-toggle-subtle rs-toggle-subtle-pressed" aria-pressed="true">Underline</button> <button class="rs-toggle rs-toggle-subtle" aria-pressed="false" disabled>Strikethrough</button>