Build scalable design systems with unstyled, accessible UI components
Documentation • Installation • Features • Components • Roadmap • Contributing
Ark UI is a headless component library that provides the foundation for building high-quality, accessible design systems and web applications. Built on top of Zag.js state machines, Ark UI delivers robust, framework-agnostic component logic with perfect parity across React, Solid, Vue, and Svelte.
Choose your framework and install the corresponding package:
# React
npm install @ark-ui/react
# Solid
npm install @ark-ui/solid
# Vue
npm install @ark-ui/vue
# Svelte
npm install @ark-ui/svelte
Here's a simple example showing how consistent the API is across frameworks:
import { Dialog } from '@ark-ui/react/dialog'
export const MyDialog = () => (
<Dialog.Root>
<Dialog.Trigger>Open Dialog</Dialog.Trigger>
<Dialog.Backdrop />
<Dialog.Positioner>
<Dialog.Content>
<Dialog.Title>Dialog Title</Dialog.Title>
<Dialog.Description>Dialog description</Dialog.Description>
<Dialog.CloseTrigger>Close</Dialog.CloseTrigger>
</Dialog.Content>
</Dialog.Positioner>
</Dialog.Root>
)
<script setup lang="ts">
import { Dialog } from '@ark-ui/vue/dialog'
</script>
<template>
<Dialog.Root>
<Dialog.Trigger>Open Dialog</Dialog.Trigger>
<Dialog.Backdrop />
<Dialog.Positioner>
<Dialog.Content>
<Dialog.Title>Dialog Title</Dialog.Title>
<Dialog.Description>Dialog description</Dialog.Description>
<Dialog.CloseTrigger>Close</Dialog.CloseTrigger>
</Dialog.Content>
</Dialog.Positioner>
</Dialog.Root>
</template>
import { Dialog } from '@ark-ui/solid/dialog'
export const MyDialog = () => (
<Dialog.Root>
<Dialog.Trigger>Open Dialog</Dialog.Trigger>
<Dialog.Backdrop />
<Dialog.Positioner>
<Dialog.Content>
<Dialog.Title>Dialog Title</Dialog.Title>
<Dialog.Description>Dialog description</Dialog.Description>
<Dialog.CloseTrigger>Close</Dialog.CloseTrigger>
</Dialog.Content>
</Dialog.Positioner>
</Dialog.Root>
)
<script lang="ts">
import { Dialog } from '@ark-ui/svelte/dialog'
</script>
<Dialog.Root>
<Dialog.Trigger>Open Dialog</Dialog.Trigger>
<Dialog.Backdrop />
<Dialog.Positioner>
<Dialog.Content>
<Dialog.Title>Dialog Title</Dialog.Title>
<Dialog.Description>Dialog description</Dialog.Description>
<Dialog.CloseTrigger>Close</Dialog.CloseTrigger>
</Dialog.Content>
</Dialog.Positioner>
</Dialog.Root>
Every component is completely unstyled, giving you total control over your design. Use any styling solution:
// Tailwind CSS
<Dialog.Trigger className="px-4 py-2 bg-blue-500 rounded">Open</Dialog.Trigger>
// CSS-in-JS
<Dialog.Trigger css={{ padding: '8px 16px', background: 'blue' }}>Open</Dialog.Trigger>
// Vanilla CSS
<Dialog.Trigger className="my-button">Open</Dialog.Trigger>
All components follow WAI-ARIA design patterns and are tested with screen readers:
Powered by Zag.js, each component uses finite state machines for predictable behavior:
Maintain a single design system across multiple frameworks without rewriting component logic:
// Same API, same behavior, different frameworks
const packages = ['@ark-ui/react', '@ark-ui/solid', '@ark-ui/vue', '@ark-ui/svelte']
Ark UI provides 45+ production-ready components covering common UI patterns:
Visit ark-ui.com for:
Ark UI works seamlessly with:
We welcome contributions! Please read our Contributing Guide to learn about:
Ark UI is maintained by Christian Schröter, Segun Adebayo, and the Chakra UI team. Development is supported by our amazing sponsors:
MIT © Chakra Systems Inc.
Made with ❤️ by the Ark UI Community