Getting Started

Add SoftUI to your project in seconds. No build tools required.

Install

npm install softui-css
# or
yarn add softui-css
# or
pnpm add softui-css
# or
bun add softui-css

CDN

Drop these two lines into your <head> and you're ready to go:

<link rel="stylesheet" href="https://unpkg.com/softui-css/dist/softui.min.css">
<script src="https://unpkg.com/softui-css/dist/softui.min.js"></script>

JavaScript

Most components are pure CSS. Some interactive components require softui.js — a lightweight, dependency-free script (~4KB min).

Include it at the end of your <body>:

<script src="https://unpkg.com/softui-css/dist/softui.min.js"></script>

Components that need JS: Accordion, Calendar, Carousel, Chart, Collapsible, Color Picker, Combobox, Command, Context Menu, Data Table, Dock, Drag & Drop, Dropdown, File Upload, Input OTP, Menubar, Modal, Popover, Rating, Resizable, Sheet, Sidebar, Slider, Swap, Tabs, Toggle Group, and form enhancements (Password Toggle, Number Input, Tags Input).

Using with Frameworks

SoftUI is plain CSS — it works with any framework. Just import the styles and use the classes.

/* React — import in your entry file (App.jsx or index.jsx) */
import 'softui-css/dist/softui.min.css';
import 'softui-css/dist/softui.min.js';

function App() {
  return (
    <button className="sui-btn sui-btn-primary">Click me</button>
  );
}


/* Vue — import in main.js */
import 'softui-css/dist/softui.min.css';
import 'softui-css/dist/softui.min.js';

<template>
  <button class="sui-btn sui-btn-primary">Click me</button>
</template>


/* Svelte — import in +layout.svelte or app.html */
import 'softui-css/dist/softui.min.css';
import 'softui-css/dist/softui.min.js';

<button class="sui-btn sui-btn-primary">Click me</button>


/* Astro — import in your layout */
---
import 'softui-css/dist/softui.min.css';
---
<script src="/node_modules/softui-css/dist/softui.min.js"></script>


/* Next.js — import in _app.js or layout.tsx */
import 'softui-css/dist/softui.min.css';
/* Add softui.min.js via Script component or next/script */

Tip: For JS-dependent components (modals, dropdowns, etc.), make sure softui.js loads after the DOM is ready. In React/Vue/Svelte, the import handles this automatically.

Quick Start

Here's a minimal HTML page with a neumorphic button and card:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="https://unpkg.com/softui-css/dist/softui.min.css">
</head>
<body class="sui-d-flex sui-justify-center sui-align-center sui-min-vh-100">

  <div class="sui-card sui-raised sui-p-5 sui-text-center">
    <h3>Hello SoftUI</h3>
    <p class="sui-text-muted sui-mt-2 sui-mb-3">
      A neumorphic card with a soft raised shadow.
    </p>
    <button class="sui-btn sui-btn-primary">Get Started</button>
  </div>

  <script src="https://unpkg.com/softui-css/dist/softui.min.js"></script>
</body>
</html>

Dark Mode

Add data-theme="dark" to your <html> element. Every component adapts automatically.

<html data-theme="dark">

To prevent a flash of light mode when the page loads, add this blocking script in your <head> before any stylesheets:

<head>
  <style>body{opacity:0}</style>
  <script>
    var t = localStorage.getItem('sui-theme');
    if (t === 'dark' || (!t && matchMedia('(prefers-color-scheme:dark)').matches))
      document.documentElement.setAttribute('data-theme', 'dark');
  </script>
  <link rel="stylesheet" href="softui.min.css">
</head>

The inline opacity:0 hides the page until SoftUI's CSS loads (which sets opacity:1), eliminating any flash. The script reads the saved theme preference before the first paint.

Customization

SoftUI is built on CSS custom properties. Override them anywhere to match your brand:

:root {
  --sui-primary: #7C5CFC;
  --sui-radius: 12px;
  --sui-shadow-raised: 6px 6px 12px rgba(0,0,0,0.15),
                       -6px -6px 12px rgba(255,255,255,0.05);
}

See the Theming Guide for the full list of variables — colors, shadows, radius, fonts, transitions, and dark mode.

Browser Support

SoftUI works in all modern browsers. No polyfills needed.

Fully Supported:
  Chrome 90+          ✓
  Edge 90+            ✓
  Firefox 100+        ✓
  Safari 15+          ✓
  Opera 76+           ✓

Partial Support:
  Firefox < 121       :has() selector not available (minor styling only)
  Safari < 15.4       backdrop-filter may need -webkit- prefix (already included)
  iOS Safari 15+      ✓ (momentum scrolling included)
  Android Chrome 90+  ✓

Not Supported:
  Internet Explorer   ✗ (uses CSS custom properties, flexbox gap, etc.)

SoftUI uses modern CSS features: custom properties, flexbox gap, :focus-visible, conic-gradient, and prefers-reduced-motion. All vendor prefixes are included where needed.

RTL (Right-to-Left)

SoftUI supports right-to-left languages like Arabic, Hebrew, and Farsi. Just add dir="rtl" to your <html> element.

<html lang="ar" dir="rtl">

Utility classes (sui-ml-*, sui-mr-*, sui-text-left/right, sui-offset-*) use CSS logical properties and adapt automatically. Components like sheets, carousels, sidebars, breadcrumbs, dropdowns, and tooltips include [dir="rtl"] overrides to flip their positioning.

See the full RTL demo →

م
مرحبا بالعالم
هذا مثال على دعم RTL

Print Styles

SoftUI includes built-in @media print styles. When users print your page or save as PDF, navbars, sidebars, modals, toasts, and other overlays are automatically hidden. Box-shadows are removed, cards and tables get clean borders, and page breaks are prevented inside components. No extra setup needed.

Explore Components View Changelog

Delete this item?

This action cannot be undone. This will permanently delete the item and remove all associated data.