One UI system for every stack.
Design tokens, utilities and ready-made components in plain HTML and CSS. Works anywhere you run npm: Vite, React, Next.js, Vue, Svelte, Astro and Laravel.
WovenUI is an open-source CSS design system: design tokens, readable utility classes and HTML components that compile to plain CSS and work in any stack. Core and Components are written in SCSS, and their --wu- tokens carry light, dark, inverse and high-contrast themes.
Members
People with access to the Acme workspace.
| Name | Role | Status | Last active | Actions |
|---|---|---|---|---|
| Ana Lopez[email protected] | Owner | Active | Today | |
| Ben Okafor[email protected] | Admin | Active | Yesterday | |
| Chen Wei[email protected] | Editor | Invited | Never | |
| Dana Ruiz[email protected] | Editor | Active | 3 days ago | |
| Eli Novak[email protected] | Viewer | Suspended | 2 weeks ago |
Same markup. The theme and direction are attributes:
Find your answer by role
- Developers
- Readable utilities such as between, x-center and p-4@md, tokens that follow the theme, and apply() for any value with a unit. Core documentation
- AI coding agents
- A complete reference in plain text, and compile errors that name the valid options. Agent reference
- Developers using agents
- A wrong class or token stops the build with the fix named, so guessed CSS never reaches review. Compile-time errors
- Agencies and freelancers
- Brand and theme in one with() block, a palette generated from your colors, and the same markup in every stack. Setup guides
- Founders and indie hackers
- Ready-made components with live docs and HTML to copy, under the MIT license. Browse components
- Product managers
- One token system under classes, mixins and components, so every product looks like the same product. What WovenUI is
- Tech leads and CTOs
- Plain CSS out with no runtime in core, HTML components with a small optional script, test suites and an MIT license. WovenUI facts
- Accessibility owners
- Native dialogs, details, progress and form controls, shape markers so color is never the only signal, and high-contrast themes. Native HTML
What WovenUI is: Core, Components and Integrations
WovenUI is an open-source CSS design system: design tokens, readable utility classes and HTML components that compile to plain CSS and work in any stack.
Core: design tokens, utilities and compile-time errors
- Every color, space, type size, radius, shadow and duration is a --wu- custom property.
- Utility classes you can read, and the same utilities as apply() mixins for any value.
- SCSS in, plain CSS out. Unknown keys, colors and tokens stop the compile.
npm install -D sass @wovenui/coreCore documentationComponents: a UI kit on native HTML
- Buttons, forms, tables, dialogs, menus and navigation as one class on native HTML.
- Every color, space and radius comes from core tokens, so every theme applies.
- 47 of 53 components need no JavaScript.
npm install @wovenui/core @wovenui/componentsBrowse componentsIntegrations: Vite, React, Next.js, Vue, Svelte and Astro
- One setup guide per stack, each copied from an app that passed a production build.
- Component styles compile to their own rules only: no repeated tokens, nothing to purge.
- The prebuilt CSS works in plain HTML with no build step.
Components built on the browser's own HTML
Dialogs, menus and form checks use elements and attributes the browser already understands, so keyboard behavior and focus come from the platform.
| Component | Native feature | Built-in behavior |
|---|---|---|
| Modal | <dialog>, opened with commandfor and command | Esc to close, focus inside the dialog, page scroll lock |
| Confirm modal | <dialog> with role="alertdialog" | Same as modal; returnValue holds the chosen button |
| Drawer | <dialog> with invoker commands | Modal or non-modal opening, slide mirrored in right to left |
| Dropdown and popover | popover attribute | Esc and click outside close it; anchor positioning places it by its trigger |
| Accordion | <details> with a shared name | One panel open at a time |
| Sidebar groups | <details> and <summary> | Collapsible navigation groups |
| Field validation | required and :user-invalid | Error messages appear only after the user interacts |
| Progress | <progress> | Determinate and indeterminate states |
| Select | Native <select> | Keyboard and picker; a styled picker where the browser supports it |
| Textarea | field-sizing: content | Grows with its content |
| Toggle | Checkbox with role="switch" | Keyboard and form submission |
| Checkbox, radio, segmented | Native inputs | Arrow keys move the choice; indeterminate checkbox state |
47 of the 53 kit components need no JavaScript. Autocomplete, data table, tabs and toast need the small kit script; input and table use it optionally.
Utility classes you can read in a code review
An inbox row and its markup. Class names say what they do. The row wants a padding that is not on the scale, and apply() takes it as written, with states and breakpoints after the utility.
<label class="flex mail-row">
<input type="checkbox">
<span class="w-2 h-2 rounded-full no-shrink bg-brand"></span>
<span class="flex col row@sm gap-3@sm grow min-w-0">
<span class="w-24@sm w-32@md no-shrink truncate font-semibold" dir="auto">Mara Lindqvist</span>
<span class="grow min-w-0 truncate@sm" dir="auto">
<span class="font-semibold">Q4 roadmap review moved to Thursday</span>
<span class="hide inline@md text-muted">Pushing it to 14:00 so finance can join. Agenda is unchanged.</span>
</span>
</span>
<span class="hide flex@lg pill px-2 text-xs bg-blue-subtle text-blue">Planning</span>
<time class="w-16@md no-shrink text-end text-xs text-muted">09:42</time>
</label>@use "@wovenui/core" as *;
.mail-row {
@include apply(
flex, x-center, gap(3),
px(4), py(1.125rem),
border-bottom(1), cursor(pointer),
bg(hover) hover
);
}Compiled CSS
.mail-row {
display: flex;
align-items: center;
gap: var(--wu-space-3);
}
.mail-row > * {
--wu-gap: var(--wu-space-3);
}
.mail-row {
padding-inline: var(--wu-space-4);
padding-block: 1.125rem;
border-bottom-width: var(--wu-border-width-1);
border-bottom-style: var(--wu-border-style);
border-bottom-color: var(--wu-border-regular);
--wu-border-style: solid;
cursor: pointer;
}
.mail-row:hover {
background-color: var(--wu-bg-hover);
}apply(shadow(md) hover lg) reads as shadow on hover, on large screens; apply(shadow(md) lg hover) reads as shadow on large screens, on hover; both compile to the same rule.
@media (min-width: 1024px) {
.card:hover {
box-shadow: var(--wu-shadow-md);
}
}Component styles that compile to the rules you wrote
Configure once in a _woven partial and load the full package once, in the global stylesheet. Every CSS module then compiles to its own rules only: no repeated tokens, nothing to purge.
@use "../styles/woven" as *;
.card {
@include apply(
p(4), bg(surface), rounded(md),
shadow(md) hover, p(6) md
);
}.card {
padding: var(--wu-space-4);
background-color: var(--wu-bg-surface);
border-radius: var(--wu-radius-md);
}
.card:hover {
box-shadow: var(--wu-shadow-md);
}
@media (min-width: 768px) {
.card {
padding: var(--wu-space-6);
}
}Mistakes stop at compile time
An unknown key, color or token stops the build with the valid options, before the mistake reaches a browser.
@include apply(px(4), py(1.125));Sass outputError: "py: 1.125 is not a configured key. Valid keys: 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64. Write a unit for a custom value (1.125px, 1.125rem)."Fixed@include apply(px(4), py(1.125rem));@include apply(bg(primary) hover);Sass outputError: "bg(primary): unknown color. Use a role (brand, success, danger, warning, info), a palette name (gray, red, blue, green, yellow, purple, pink), a theme word (base, surface, alternate, raised, hover, selected, disabled), a hex color, a CSS color name, ..."Fixed@include apply(bg(brand) hover);color: token(text-mutd);Sass outputError: "token(text-mutd): unknown token. Close matches: text-muted."Fixedcolor: token(text-muted);A complete reference for AI coding agents
Plain-text references an agent can load, so it writes valid WovenUI instead of guessing.
WovenUI facts
Each line can be checked in the source.
- Output
- Plain CSS from SCSS modules loaded with @use. Sass is the only build requirement. Prebuilt CSS needs no build at all.
- Classes and mixins
- Every utility is also a mixin for apply(), with states and breakpoints. Utility classes are opt-in; the mixins entry outputs nothing until you use it.
- Runtime
- None in core. 47 of the 53 kit components need no JavaScript. Autocomplete, data table, tabs and toast need the small kit script; input and table use it optionally.
- Native HTML
- Dialogs, drawers, dropdowns, popovers, accordions, sidebar groups, progress, select, textarea, toggles, checkboxes, radios and form validation run on the browser's own elements and attributes.
- Themes
- Light, dark and inverse through data-theme, high contrast through data-contrast. Without data-theme the operating system decides.
- Direction
- Logical utilities and kit components mirror under dir="rtl".
- Contrast
- Text on a brand or status fill is chosen for the higher contrast at build, with a warning below 4.5:1.
- Color and shape
- Dot, alert, field message and empty state change marker shape by role, so color is never the only signal.
- Reduced motion
- Kit motion is opt-in and runs only when the user allows motion.
- Forced colors
- Autocomplete, checkbox, input, progress circle, progress, radio, segmented, select, skeleton, tabs, toast and toggle have rules for the operating system's forced colors mode.
- Errors
- Unknown keys, colors, tokens, modifiers and mixins stop the compile and name the valid options.
- Build speed
- apply() caches what it parses, so compile time follows the values you write, not the size of the framework. Run the stress test
- Tests
- Core and Components each run a test suite: contrast, tokens, mixins and configuration in core; compile, entries, script exports and docs in Components.
- Releases
- Semantic versioning and a changelog.
- Browsers
- Chrome and Edge 135+, Firefox 144+, Safari 26.2+.
- Accessibility
- Follows WCAG 2.2 AA.
- Editor
- The WovenUI extension for VS Code: completion, hover, diagnostics and quick fixes for apply(), classes and tokens. Marketplace
- License
- MIT, for Core and Components.
Questions about WovenUI
What is WovenUI?
WovenUI is an open-source CSS design system: design tokens, readable utility classes and HTML components that compile to plain CSS and work in any stack. Core supplies the tokens, utilities and apply(); Components supplies a UI kit on those tokens.
Does WovenUI need JavaScript?
Core compiles to plain CSS with no runtime. In the kit, autocomplete, data table, tabs and toast need its small script; every other component is HTML and CSS.
Which frameworks does WovenUI work with?
Anything that runs npm and Sass. Setup guides cover Vite, React, Next.js, Vue, Svelte and Astro, and the prebuilt CSS works in plain HTML.
Does it support dark mode, high contrast and right to left?
Yes. Light, dark, inverse and high contrast are attributes on any element, and logical utilities and components mirror under dir="rtl". The markup never changes.
How does WovenUI help AI coding agents?
The complete reference ships as plain text at /llms-full.txt and /components/llms-full.txt, and a wrong name stops the build with the valid options listed.
Is WovenUI free to use?
Yes. Core and Components are open source under the MIT license.
Get started
Style your own components: start with Core.
npm install -D sass @wovenui/coreRead the Core documentation