Packages

Sutra UI - We define the rules, so you don't have to. A Phoenix LiveView component library with 55 components and CSS-first theming.

Current section

Files

Jump to
sutra_ui lib sutra_ui.ex
Raw

lib/sutra_ui.ex

defmodule SutraUI do
@moduledoc """
Sutra UI - We define the rules, so you don't have to.
A pure Phoenix LiveView UI component library with **44 accessible components**,
CSS-first theming, and colocated JavaScript hooks. Built for Phoenix 1.8+ and
Tailwind CSS v4.
## Quick Start
# mix.exs
{:sutra_ui, "~> 0.1"}
# lib/my_app_web.ex
defp html_helpers do
quote do
use SutraUI
end
end
# assets/css/app.css
@import "tailwindcss";
@source "../../deps/sutra_ui/lib";
@import "../../deps/sutra_ui/priv/static/sutra_ui.css";
See the [Installation Guide](installation.md) for detailed setup instructions.
## Requirements
| Dependency | Version | Notes |
|------------|---------|-------|
| Elixir | 1.14+ | |
| Phoenix | **1.8+** | Required for colocated hooks |
| Phoenix LiveView | **1.1+** | `ColocatedHook` support |
| Tailwind CSS | **v4** | CSS-first configuration |
> #### Why Phoenix 1.8+? {: .info}
>
> Sutra UI uses [colocated hooks](colocated-hooks.md) - JavaScript hooks defined
> alongside components. No separate `hooks.js` file needed.
## Components by Category
### Foundation
Basic building blocks for any interface.
| Component | Description |
|-----------|-------------|
| `SutraUI.Button` | Buttons with 6 variants and 4 sizes |
| `SutraUI.Badge` | Status indicators |
| `SutraUI.Spinner` | Loading indicators |
| `SutraUI.Kbd` | Keyboard shortcut display |
### Form Controls
Complete form toolkit with validation support.
| Component | Description |
|-----------|-------------|
| `SutraUI.Input` | Text, email, password, number, date inputs |
| `SutraUI.Textarea` | Multi-line text input |
| `SutraUI.Checkbox` | Checkbox input |
| `SutraUI.Switch` | Toggle switch |
| `SutraUI.RadioGroup` | Radio button groups |
| `SutraUI.Select` | Searchable dropdown (hook) |
| `SutraUI.Slider` | Range slider (hook) |
| `SutraUI.RangeSlider` | Dual-handle range (hook) |
| `SutraUI.LiveSelect` | Async searchable select (hook) |
| `SutraUI.Field` | Field wrapper with label/error |
| `SutraUI.Label` | Form labels |
| `SutraUI.SimpleForm` | Form with auto-styling |
| `SutraUI.InputGroup` | Input with prefix/suffix |
| `SutraUI.FilterBar` | Filter controls layout |
### Layout
Structure and organize content.
| Component | Description |
|-----------|-------------|
| `SutraUI.Card` | Content container |
| `SutraUI.Header` | Page headers |
| `SutraUI.Table` | Data tables |
| `SutraUI.Item` | List items |
| `SutraUI.Sidebar` | Navigation sidebar (hook) |
### Feedback
Communicate status and progress.
| Component | Description |
|-----------|-------------|
| `SutraUI.Alert` | Alert messages |
| `SutraUI.Toast` | Toast notifications (hook) |
| `SutraUI.Progress` | Progress bars |
| `SutraUI.Skeleton` | Loading placeholders |
| `SutraUI.Empty` | Empty states |
| `SutraUI.LoadingState` | Loading indicators |
### Overlay
Layered UI elements.
| Component | Description |
|-----------|-------------|
| `SutraUI.Dialog` | Modal dialogs (hook) |
| `SutraUI.Popover` | Click-triggered popups (hook) |
| `SutraUI.Tooltip` | Hover tooltips (CSS-only) |
| `SutraUI.DropdownMenu` | Dropdown menus (hook) |
| `SutraUI.Command` | Command palette (hook) |
### Navigation
Help users move through your app.
| Component | Description |
|-----------|-------------|
| `SutraUI.Tabs` | Tab panels (hook) |
| `SutraUI.Accordion` | Collapsible sections (hook) |
| `SutraUI.Breadcrumb` | Breadcrumb trails |
| `SutraUI.Pagination` | Page navigation |
| `SutraUI.NavPills` | Pill navigation |
| `SutraUI.TabNav` | Tab-style navigation |
### Display
Present content and media.
| Component | Description |
|-----------|-------------|
| `SutraUI.Avatar` | User avatars |
| `SutraUI.Carousel` | Image carousels (hook) |
| `SutraUI.ThemeSwitcher` | Light/dark toggle (hook) |
## Theming
Sutra UI uses CSS variables compatible with [shadcn/ui themes](https://ui.shadcn.com/themes).
:root {
--primary: oklch(0.65 0.20 260);
--primary-foreground: oklch(0.98 0 0);
}
See the [Theming Guide](theming.md) for complete customization options.
## Accessibility
All components follow WAI-ARIA patterns with:
- Semantic HTML elements
- Keyboard navigation
- Focus management
- Screen reader support
See the [Accessibility Guide](accessibility.md) for details.
## Guides
- [Installation](installation.md) - Setup and configuration
- [Theming](theming.md) - Customize colors and styles
- [Accessibility](accessibility.md) - ARIA and keyboard support
- [JavaScript Hooks](colocated-hooks.md) - Colocated hook patterns
## Quick Reference
- [Components Cheatsheet](components.cheatmd) - All components at a glance
- [Forms Cheatsheet](forms.cheatmd) - Form patterns and validation
"""
@doc """
Use Sutra UI in your Phoenix application.
This macro imports all available Sutra UI components for use in your templates.
## Example
defmodule MyAppWeb do
def html_helpers do
quote do
use SutraUI
end
end
end
"""
defmacro __using__(_opts) do
quote do
# Phase 1: Foundation
import SutraUI.Button
import SutraUI.Badge
import SutraUI.Spinner
import SutraUI.Kbd
# Phase 2: Form Primitives
import SutraUI.Label
import SutraUI.Input
import SutraUI.Textarea
import SutraUI.Checkbox
import SutraUI.Switch
import SutraUI.RadioGroup
import SutraUI.Field
import SutraUI.Select
import SutraUI.Slider
# Phase 3: Layout & Data Display
import SutraUI.Card
import SutraUI.Header
import SutraUI.Table
import SutraUI.Skeleton
import SutraUI.Empty
import SutraUI.Alert
import SutraUI.Flash
import SutraUI.Progress
# Phase 4: Navigation & Interactive
import SutraUI.Breadcrumb
import SutraUI.Pagination
import SutraUI.Accordion
import SutraUI.Tabs
import SutraUI.DropdownMenu
import SutraUI.Toast
# Phase 5: Advanced UI
import SutraUI.Avatar
import SutraUI.Tooltip
import SutraUI.Dialog
import SutraUI.Popover
import SutraUI.Command
import SutraUI.Carousel
# Phase 6: Form & Layout Helpers
import SutraUI.FilterBar
import SutraUI.InputGroup
import SutraUI.Item
import SutraUI.LoadingState
import SutraUI.SimpleForm
# Phase 7: Navigation
import SutraUI.NavPills
import SutraUI.Sidebar
import SutraUI.TabNav
import SutraUI.ThemeSwitcher
# Phase 8: Advanced Form Controls
import SutraUI.RangeSlider
# LiveSelect is a LiveComponent - only import helper functions, not lifecycle callbacks
import SutraUI.LiveSelect, only: [decode: 1, normalize_options: 1]
end
end
end