Studio / Alkmaar
Issue 03 goes on the press at 06:00. Print is the primary action; the proof stays close for review.
Triggers an action with solid primary, 1px ghost, or borderless subtle styling. Every target is at least 44px; icon size is a 44px square.
Studio / Alkmaar
Issue 03 goes on the press at 06:00. Print is the primary action; the proof stays close for review.
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 { Button, Icon } from "@noorddev/vlak-react";Precompiled React and one stylesheet. No compiler to configure. Per-component imports work too: @noorddev/vlak-react/components/button.
npx @noorddev/vlak-cli add button
The StyleX leaf lands in components/vlak/, for your own compiler to own. See StyleX.
npx shadcn add https://vlak.dev/r/button.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 { Button, Icon } from "@noorddev/vlak-react";
<Button>Primary action</Button>
<Button variant="ghost" size="sm">Secondary</Button>
<Button variant="subtle">Details</Button>
<Button variant="subtle" disabled>Unavailable</Button>
<Button variant="subtle" size="icon" aria-label="Download">
<Icon name="download" />
</Button>| Prop | Type | Default | Description |
|---|---|---|---|
variant | "primary" | "ghost" | "subtle" | "primary" | Solid ink primary, hairline ghost, or borderless subtle. One primary per view. |
size | "default" | "sm" | "icon" | "default" | Icon buttons stay square at every breakpoint. Supply an accessible name. |
grouped | boolean | false | Flush into a ButtonGroup: no own stroke, one ink seam. |
Also accepts ButtonHTMLAttributes<HTMLButtonElement>.
| Keys | Does |
|---|---|
| Tab | Moves focus to the button |
| Enter, Space | Activates it |
<button class="rs-btn-primary">Primary action</button> <button class="rs-btn-ghost">Secondary</button> <button class="rs-btn-subtle">Details</button> <button class="rs-btn-subtle" disabled>Unavailable</button> <button class="rs-btn-subtle rs-btn-icon" aria-label="Download"><svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" aria-hidden="true"><path d="M3.5 11.5V13h9v-1.5M8 3.5v7M5.5 8 8 10.5 10.5 8" /></svg></button>