chakra-ui/zag has 5,248 GitHub stars and 309 forks. GitHot measured +3 stars in 24 hours. Last checked 2026-11-07 13:48 UTC. Last push 2026-11-02.
Build your design system in React, Solid, Vue, Svelte or Vanilla. Powered by finite state machines
Measured star growth
- in 24h
- +3
- in 7 days
- Collecting history
- in 15 days
- Collecting history
- in 1 month
- Collecting history
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.md
OriginalZag
Accessible component logic for React, Vue, Solid, and Svelte.
Build dialogs, menus, comboboxes, date pickers, and more with state machines that handle keyboard interactions, focus management, and ARIA attributes. You control the markup and styling; Zag handles the behavior.
Documentation · Getting started · Changelog · Discord
Why Zag?
- Bring your own design. Headless APIs give you control over the rendered elements and any styling solution.
- Reuse behavior across frameworks. The same component machines power React, Vue, Solid, and Svelte, with adapters for Preact and vanilla JavaScript too.
- Build on accessible interactions. Keyboard navigation, focus management, and ARIA behavior follow the WAI-ARIA authoring practices.
- Make complex behavior predictable. State machines describe how components respond to interactions, with Playwright tests checking behavior across frameworks.
Quick start
Install a component machine and the adapter for your framework. For a React toggle group:
npm install @zag-js/toggle-group @zag-js/react
Connect the machine to your markup:
import { normalizeProps, useMachine } from "@zag-js/react"
import * as toggle from "@zag-js/toggle-group"
import { useId } from "react"
export function ToggleGroup() {
const service = useMachine(toggle.machine, { id: useId() })
const api = toggle.connect(service, normalizeProps)
return (
<div {...api.getRootProps()}>
<button {...api.getItemProps({ value: "bold" })} aria-label="Bold">
B
</button>
<button {...api.getItemProps({ value: "italic" })} aria-label="Italic">
I
</button>
<button {...api.getItemProps({ value: "underline" })} aria-label="Underline">
U
</button>
</div>
)
}
Add your styles, then explore the toggle group docs for the full API and examples in other frameworks.
| Framework | Adapter |
|---|---|
| React | @zag-js/react |
| Vue | @zag-js/vue |
| Solid | @zag-js/solid |
| Svelte | @zag-js/svelte |
| Preact | @zag-js/preact |
| Vanilla JavaScript | @zag-js/vanilla |
Contributing
Bug reports, documentation improvements, and new component ideas are welcome. Read the contributing guide for local setup, development commands, and how to submit changes.
Acknowledgments
Zag grew out of building Chakra UI and draws inspiration from Pure UI, Pure UI Control, Material Components Web, Radix UI, XState, Vue, Lit, and Sonner.
License
MIT © Chakra Systems Inc.
Explore related projects
freeCodeCamp/freeCodeCamp
freeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.
458,706 starsdonnemartin/system-design-primer
Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.
377,220 starsreact/react
The library for web and native user interfaces.
252,356 starsvuejs/vue
This is the repo for Vue 2. For Vue 3, go to https://github.com/vuejs/core
212,631 stars