Package Exports
- @waveso/ui/accordion
- @waveso/ui/alert
- @waveso/ui/alert-dialog
- @waveso/ui/aspect-ratio
- @waveso/ui/autocomplete
- @waveso/ui/avatar
- @waveso/ui/badge
- @waveso/ui/breadcrumb
- @waveso/ui/button
- @waveso/ui/button-group
- @waveso/ui/card
- @waveso/ui/checkbox
- @waveso/ui/chunk-45VQAWIM
- @waveso/ui/chunk-6Y7LPQMO
- @waveso/ui/chunk-76UQO56T
- @waveso/ui/chunk-7F4MPMLJ
- @waveso/ui/chunk-D5XPEJ6T
- @waveso/ui/chunk-DIGOLJIR
- @waveso/ui/chunk-IQ7YQ5XA
- @waveso/ui/chunk-NCHHHWTB
- @waveso/ui/chunk-OUFYQLVN
- @waveso/ui/chunk-PVX4VQFJ
- @waveso/ui/chunk-QFSEK4M6
- @waveso/ui/chunk-QRW37LRP
- @waveso/ui/chunk-RPQHL6C5
- @waveso/ui/chunk-V4ZX4YCP
- @waveso/ui/chunk-YTSQQTSF
- @waveso/ui/chunk-ZZZH3JGW
- @waveso/ui/collapsible
- @waveso/ui/combobox
- @waveso/ui/context-menu
- @waveso/ui/dialog
- @waveso/ui/direction
- @waveso/ui/drawer
- @waveso/ui/encrypted-text
- @waveso/ui/field
- @waveso/ui/form
- @waveso/ui/hooks/use-mobile
- @waveso/ui/infinite-scroll
- @waveso/ui/input
- @waveso/ui/input-group
- @waveso/ui/input-otp
- @waveso/ui/item
- @waveso/ui/kbd
- @waveso/ui/label
- @waveso/ui/lib/utils
- @waveso/ui/masonry
- @waveso/ui/menu
- @waveso/ui/menubar
- @waveso/ui/package.json
- @waveso/ui/pagination
- @waveso/ui/popover
- @waveso/ui/preview-card
- @waveso/ui/progress
- @waveso/ui/radio
- @waveso/ui/radio-group
- @waveso/ui/scroll-area
- @waveso/ui/select
- @waveso/ui/separator
- @waveso/ui/sidebar
- @waveso/ui/skeleton
- @waveso/ui/slider
- @waveso/ui/spinner
- @waveso/ui/styles.css
- @waveso/ui/switch
- @waveso/ui/table
- @waveso/ui/tabs
- @waveso/ui/textarea
- @waveso/ui/toast
- @waveso/ui/toggle
- @waveso/ui/toggle-group
- @waveso/ui/tooltip
Readme
@waveso/ui
A component library built on Base UI primitives and Tailwind CSS v4.
Install
npm install @waveso/ui @base-ui/react class-variance-authority clsx tailwind-mergeSetup
Add the theme preset and source directive to your CSS entry point:
@import "@waveso/ui/styles.css";
@import "tailwindcss";The preset provides all CSS variables (colors, radii, sidebar tokens) with light and dark mode support. Override any variable in your own :root / .dark blocks to customize the theme.
Usage
Import components by name — each is a separate entry point for optimal tree-shaking:
import { Button } from '@waveso/ui/button';
import { Masonry, MasonryItem, MasonrySpannedItem } from '@waveso/ui/masonry';
import { Card, CardHeader, CardTitle, CardContent } from '@waveso/ui/card';Button
8 variants, 8 sizes, built on Base UI's Button primitive with full keyboard and ARIA support.
import { Button } from '@waveso/ui/button';
<Button>Default</Button>
<Button variant="solid">Solid</Button>
<Button variant="outline">Outline</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="destructive">Delete</Button>
<Button variant="success">Confirm</Button>
<Button size="xs">Tiny</Button>
<Button size="icon"><SearchIcon /></Button>Masonry
Responsive masonry grid with staggered animations, spanning items, and automatic reflow.
import { Masonry, MasonryItem, MasonrySpannedItem } from '@waveso/ui/masonry';
<Masonry columns={3} gap={16}>
<MasonryItem>
<Card>
<CardContent>Standard item</CardContent>
</Card>
</MasonryItem>
<MasonrySpannedItem>
<Card>
<CardContent>This spans two columns</CardContent>
</Card>
</MasonrySpannedItem>
<MasonryItem>
<Card>
<CardContent>Another item</CardContent>
</Card>
</MasonryItem>
</Masonry>Components
60+ components covering forms, layout, navigation, feedback, and data display:
| Category | Components |
|---|---|
| Actions | Button, Button Group, Toggle, Toggle Group |
| Forms | Input, Textarea, Checkbox, Switch, Radio, Radio Group, Select, Combobox, Autocomplete, Slider, Calendar, Input OTP, Field, Form, Label, Input Group |
| Layout | Card, Masonry, Separator, Aspect Ratio, Scroll Area, Collapsible, Accordion, Tabs, Sidebar |
| Navigation | Breadcrumb, Navigation Menu, Pagination, Menubar |
| Overlays | Dialog, Alert Dialog, Sheet, Popover, Tooltip, Preview Card, Context Menu, Menu |
| Feedback | Alert, Badge, Progress, Skeleton, Spinner, Toaster, Empty |
| Data | Table, Avatar, Kbd, Item, Infinite Scroll |
| Effects | Burst, Explode, Encrypted Text, Shimmering Text, Expandable Tab, Dotted Glow Background |
Requirements
| Dependency | Version |
|---|---|
| React | ^19.0.0 |
| React DOM | ^19.0.0 |
| Base UI | ^1.0.0 |
| Tailwind CSS | v4 |
| CVA | ^0.7.0 |
| clsx | ^2.0.0 |
| tailwind-merge | ^3.0.0 |
Some components have optional peer dependencies:
- Calendar —
react-day-picker - Carousel —
embla-carousel-react - Form —
react-hook-form - Input OTP —
input-otp - Animations —
motion - Sidebar —
usehooks-ts
Install only what you use.
Development
npm install
npm run storybook # Start Storybook
npm run build # Build the library
npm run typecheck # Type-check
npm run dev # Watch modeProject structure
.changeset/ # Changesets config
.storybook/ # Storybook config + theme CSS
src/
*.tsx # Component source files
*.stories.tsx # Storybook stories
styles.css # Theme preset (CSS variables + Tailwind mapping)
hooks/ # Custom hooks
lib/ # Utilities (cn, internal icons)Releasing
This project uses Changesets with GitHub Actions.
- Run
npx changesetto describe your changes (patch, minor, or major) - Commit the generated changeset file with your PR
- When merged to
main, CI automatically versions and publishes to npm
Manual release (without CI)
If you're not using the GitHub Actions workflow, you can publish manually. Changesets will skip versions already published to npm, so this won't conflict if CI has already run.
npx changeset # Create a changeset
npx changeset version # Apply version bump
npm run release # Build and publish to npmLicense
MIT