• Stars
    star
    3,969
  • Rank 11,001 (Top 0.3 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created over 3 years ago
  • Updated about 2 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Finite state machines for building accessible design systems and UI components. Works with modern frameworks, and even just Vanilla JS
Zag.js hero image

Zag

Finite state machines for accessible JavaScript components

  • Write once, use everywhere 🦄: The component interactions are modelled in a framework agnostic way. We provide adapters for JS frameworks like React, Solid, or Vue.
  • Focus on accessibility ♿️: Zag is built with accessibility in mind. We handle many details related to keyboard interactions, focus management, aria roles and attributes.
  • Headless : The machine APIs are completely unstyled and gives you the control to use any styling solution you prefer.
  • Powered by state machines 🌳: Zag is built on top of the latest ideas in Statecharts. We don't follow the SCXML specifications, but we've created an API that we think will help us build more complex components fast.

Documentation

To see the documentation, visit zagjs.com/

Releases

For changelog, visit zagjs.com/changelogs/latest


Problem

With the rise of design systems and component-driven development, there's an endless re-implementation of common component patterns (Tabs, Menu, Modal, etc.) in multiple frameworks.

Most of these implementations seem to be fairly similar in spirit, the differences being around the reactivity and effects systems for the framework (e.g. useState, useEffect in React.js). Framework specific solutions tend to grow in complexity over time and often become hard to understand, debug, improve or test.

Solution

Zag is a JavaScript API that implements common component patterns using the state machine methodology.

Installation

npm i --save @zag-js/{component}

# or

yarn add @zag-js/{component}

{component} represents any component machine like dialog (@zag-js/dialog), tooltip (@zag-js/tooltip) , etc.

For framework specific solutions, we provide simple wrappers to help you consume the component state machines.

  • ⚛️ @zag-js/react - React hooks for consuming machines in React applications
  • 💚 @zag-js/vue - Vue composition for consuming machines in Vue applications
  • 🎷 @zag-js/solid - Solid.js utilities for consuming machines in Solid.js applications

Usage

import * as toggle from "@zag-js/toggle"
import { normalizeProps, useMachine } from "@zag-js/react"

function Example() {
  // if you need access to `state` or `send` from machine
  const [state, send] = useMachine(toggle.machine({ id: "2" }))

  // convert machine details into `DOM` props
  const api = toggle.connect(state, send, normalizeProps)

  // consume into components
  return <button {...api.buttonProps}>Toggle me</button>
}

Guiding Principles

  • All component machines and tests are modelled according to the WAI-ARIA authoring practices
  • Write end-to-end tests for every component based on the WAI-ARIA spec. Regardless of the framework, users expect component patterns to work the same way!
  • All machines should be light-weight, simple, and easy to understand. Avoid using complex machine concepts like spawn, nested states, etc.

Fun Facts

Zag means to take a sharp change in direction. This clearly describes our approach of using state machines to power the logic behind UI components.

Teasers

  • When you see someone using classic react, vue or solid to build an interactive UI component that exists in Zag, tell them to "zag it!" ⚡️

  • Anyone using Zag will be called a "zagger" 💥

  • The feeling you get when you use Zag will be called "zagadat!" 🚀

  • The Zag community will be called "zag nation" 🔥


Commands

Build commands

Our build is managed with esbuild and turborepo to provide fast, concurrent builds across the packages.

  • build : Build the CJS, ESM and DTS files. This is the actual production build that we run in the CI.

Examples

Since zag is framework agnostic, we need a way to test it within a framework. The examples/ directory includes starter projects for the frameworks we support.

  • start-react : Starts the Next.js TypeScript project
  • start-vue : Starts the Vue 3 TypeScript project
  • start-solid : Starts the Solid TypeScript project

E2E Tests

We've setup end-to-end tests for every machine we built. We use Playwright for testing and we ensure that the component works the same way regardless of the framework.

  • e2e-react : Starts the E2E tests for the React project
  • e2e-vue : Starts the E2E tests for the Vue project
  • e2e-solid : Starts the E2E tests for the Solid project

Contributing new machines/features

  • generate-machine : Generates a new machine package in the packages/ directory. It sets up the required files and structure for new machine.
  • generate-util : Generates a new utility package in the packages/utilities directory.

Other commands

  • test : Run the tests for all packages
  • lint : Lint all packages

Inspirations


Contributions

Looking to contribute? Look for the Good First Issue label.

🐛 Bugs

Please file an issue for bugs, missing documentation, or unexpected behavior.

💡 Feature Requests

Please file an issue to suggest new features. Vote on feature requests by adding a 👍. This helps maintainers prioritize what to work on.


License

MIT © Segun Adebayo

More Repositories

1

chakra-ui

⚡️ Simple, Modular & Accessible UI Components for your React Applications
TypeScript
37,613
star
2

panda

🐼 Universal, Type-Safe, CSS-in-JS Framework for Product Teams ⚡️
TypeScript
5,147
star
3

ark

A headless library for building reusable, scalable design systems that works for a wide range of JS frameworks.
TypeScript
3,720
star
4

chakra-ui-vue

⚡️ Build scalable and accessible Vue.js applications with ease.
JavaScript
1,865
star
5

awesome-chakra-ui

A collection of Chakra UI-related awesomeness
447
star
6

chakra-ui-docs

Documentation website for chakra ui
MDX
303
star
7

chakra-ui-vue-next

⚡️ The next most epic version of Chakra UI Vue based on Vue 3 🚀(WIP)
TypeScript
261
star
8

zag-docs

Documentation website for Zag
TypeScript
127
star
9

frontity-chakra-ui-theme

A Frontity theme built with Chakra UI
JavaScript
104
star
10

polymorphic

Polymorphic component factories for JSX frameworks
TypeScript
73
star
11

eslint-plugin-panda

Official ESLint Plugin for Panda CSS
TypeScript
71
star
12

pro-component-issues

Bug fixes and feature request tracking for Chakra UI Pro.
62
star
13

design-vs-dev

This is the repo for Chakra UI's Design vs Dev Challenges. You can watch the YouTube series here: https://www.youtube.com/playlist?list=PLLh_woCGjyGqed2oBdr7K0r7HcS6X4DCH
TypeScript
56
star
14

panda-vscode

The official Panda CSS VSCode extension
TypeScript
48
star
15

play.chakra-ui.com

The Playground for Chakra UI
TypeScript
37
star
16

vscode-snippets

VSCode Snippets for Chakra UI
JavaScript
20
star
17

chakra-codemod

Codemod transformations to help upgrade to the latest Chakra UI
TypeScript
19
star
18

pro-theme

Chakra UI Pro Theme
TypeScript
17
star
19

panda-mastery-lessons

Panda Mastery Course Content (as Code)
TypeScript
14
star
20

vue-docs

Chakra UI Vue (v2) Official Documentation
TypeScript
13
star
21

chakra-loader

Chakra UI Vue webpack loader for auto-import and registration of Chakra components
JavaScript
13
star
22

panda-templates

Showcasing how to use Panda in various frameworks
11
star
23

vue-cli-plugin-chakra-ui

This plugin setups Chakra UI Vue in your Vue CLI generated projoect
JavaScript
8
star
24

chakra-ui-docusaurus

TypeScript
7
star
25

examples

Chakra UI example projects
7
star
26

chakra-ui-themes

TypeScript
6
star
27

figpilot-issues

Issue Tracker for FigPilot
5
star
28

rfcs

RFCs for Chakra UI
5
star
29

gatsby-starter-chakra-ui-ts

TypeScript
3
star
30

hackathon

TypeScript
1
star