Usage

Is ZUI free to use?

Yes, ZUI is open source and free to use in any project.

Which frameworks does ZUI support?

ZUI provides CSS classes for any framework, plus first-class React, Astro, Solid, Svelte, and Vue component wrappers.

Does ZUI support dark mode?

Yes, all components use light-dark() and CSS custom properties for automatic theme switching.

<div class="zui-accordion">
<details class="zui-accordion-item">
  <summary class="zui-accordion-trigger">Is ZUI free to use?</summary>
  <div class="zui-accordion-content">
    <p>Yes, ZUI is open source and free to use in any project.</p>
  </div>
</details>
<details class="zui-accordion-item">
  <summary class="zui-accordion-trigger">Which frameworks does ZUI support?</summary>
  <div class="zui-accordion-content">
    <p>ZUI provides CSS classes for any framework, plus first-class React, Astro, Solid, Svelte, and Vue component wrappers.</p>
  </div>
</details>
<details class="zui-accordion-item">
  <summary class="zui-accordion-trigger">Does ZUI support dark mode?</summary>
  <div class="zui-accordion-content">
    <p>Yes, all components use <code>light-dark()</code> and CSS custom properties for automatic theme switching.</p>
  </div>
</details>
</div>

Exclusive (only one open at a time)

Add a shared name attribute to <details> items to get native exclusive accordion behaviour — only one panel can be open at a time.

First item

Opening another item will close this one.

Second item

Only one item can be open at a time thanks to the shared name attribute.

Third item

This is native browser behaviour — no JavaScript needed.

<div class="zui-accordion">
<details class="zui-accordion-item" name="faq">
  <summary class="zui-accordion-trigger">First item</summary>
  <div class="zui-accordion-content">
    <p>Opening another item will close this one.</p>
  </div>
</details>
<details class="zui-accordion-item" name="faq">
  <summary class="zui-accordion-trigger">Second item</summary>
  <div class="zui-accordion-content">
    <p>Only one item can be open at a time thanks to the shared <code>name</code> attribute.</p>
  </div>
</details>
<details class="zui-accordion-item" name="faq">
  <summary class="zui-accordion-trigger">Third item</summary>
  <div class="zui-accordion-content">
    <p>This is native browser behaviour — no JavaScript needed.</p>
  </div>
</details>
</div>

Flush variant

Remove the outer border and background, leaving only the item dividers.

First item

Flush accordions blend into the surrounding layout.

Second item

No outer border or background.

<div class="zui-accordion zui-accordion-flush">
<details class="zui-accordion-item">
  <summary class="zui-accordion-trigger">First item</summary>
  <div class="zui-accordion-content">
    <p>Flush accordions blend into the surrounding layout.</p>
  </div>
</details>
<details class="zui-accordion-item">
  <summary class="zui-accordion-trigger">Second item</summary>
  <div class="zui-accordion-content">
    <p>No outer border or background.</p>
  </div>
</details>
</div>

CSS custom properties

PropertyDefaultDescription
--zui-accordion-bordervar(--color-border)Border colour
--zui-accordion-radiusvar(--radius-md)Border radius
--zui-accordion-bgvar(--color-surface)Background colour
--zui-accordion-padding-xvar(--space-sm)Horizontal padding
--zui-accordion-padding-yvar(--space-sm)Vertical padding

Theme

Copy this CSS to your project: