@arolariu/components
v2.3.0
Published
π¨ 70+ beautiful, accessible React components built on Base UI. TypeScript-first, CSS Modules styling, tree-shakeable, SSR-ready. Perfect for modern web apps, design systems & rapid prototyping. Zero config, maximum flexibility! β‘
Downloads
432
Maintainers
Readme
β¨ @arolariu/components
Modern β’ Accessible β’ Production Ready
A comprehensive collection of 71+ beautifully crafted React components built on Base UI primitives, styled with CSS Modules, and designed for modern applications that demand both beauty and performance.
π Get Started β’ π Documentation β’ π¨ Storybook demos (Coming soon) β’ π‘ Examples β’ π€ Contributing
π― Why Choose @arolariu/components?
For Developers Who Care About Quality
- π¨ Beautiful by Default - Carefully designed components that look great out of the box
- βΏ Accessibility First - Built on Base UI primitives with strong keyboard and screen reader support
- π§© CSS Modules Architecture - Scoped
.module.cssstyling inside the library - π OKLCH Design Tokens - Theme every component with
--ac-*CSS custom properties such as--ac-primaryand--ac-radius-md - β‘ Performance Optimized - Tree-shakeable exports, minimal bundle impact, and source maps included
- π§ Developer Experience - Full TypeScript support, comprehensive docs, and debugging tools
- π Flexible Theming - Light and dark mode via
.darkor[data-theme="dark"] - π Modern Stack - React 18/19, ESM, SSR compatible, built with RSLib
Version 1.0.0 is the first major release of the new Base UI + CSS Modules architecture.
π Quick Start
Get up and running with @arolariu/components in under 2 minutes.
Installation
npm install @arolariu/components
# Peer dependencies (install if not already in your project)
npm install react react-dom @base-ui/react motion react-hook-form rechartsBasic Setup
import {Button} from "@arolariu/components/button";
import {Card, CardContent, CardHeader, CardTitle} from "@arolariu/components/card";
import styles from "./app-shell.module.css";
export default function MyApp() {
return (
<Card className={styles.card}>
<CardHeader>
<CardTitle>Welcome to @arolariu/components 1.0.0</CardTitle>
</CardHeader>
<CardContent className={styles.content}>
<Button>Get Started</Button>
</CardContent>
</Card>
);
}/* app-shell.module.css */
.card {
width: min(24rem, 100%);
}
.content {
display: flex;
justify-content: flex-start;
}Add Styles (Required)
// Import design tokens only (colors, spacing, radii)
import "@arolariu/components/styles";
// Components auto-load their CSS when imported
import {Button, Card} from "@arolariu/components";@arolariu/components/styles provides design tokens only. Component CSS is loaded automatically when you import components.
Optional Theme Overrides
/* app-theme.css */
:root {
--ac-primary: oklch(0.62 0.21 262);
--ac-primary-foreground: oklch(0.99 0.01 260);
--ac-radius-md: 0.75rem;
}
.dark {
--ac-background: oklch(0.18 0.01 286);
--ac-foreground: oklch(0.98 0 0);
}That's it. π You bring your app layout styles with CSS Modules, and the library provides component styling and tokens.
π Component Catalog
Explore our collection of 71+ components organized by category.
π¨ Layout & Structure
| Component | Description | Import |
| --------------- | --------------------------------------- | ----------------------------------- |
| Card | Flexible container for grouping content | @arolariu/components/card |
| AspectRatio | Maintain consistent aspect ratios | @arolariu/components/aspect-ratio |
| Separator | Visual dividers for content sections | @arolariu/components/separator |
| Resizable | Split panes with resizable dividers | @arolariu/components/resizable |
π Interactive Elements
| Component | Description | Import |
| ------------ | ----------------------------------------- | ------------------------------- |
| Button | Primary action triggers with variants | @arolariu/components/button |
| Input | Text input fields with validation support | @arolariu/components/input |
| Checkbox | Binary choice selections | @arolariu/components/checkbox |
| Select | Dropdown selection menus | @arolariu/components/select |
| Slider | Range input controls | @arolariu/components/slider |
π§ Navigation
| Component | Description | Import |
| ------------------ | ------------------------------ | -------------------------------------- |
| Tabs | Tabbed content navigation | @arolariu/components/tabs |
| Breadcrumb | Hierarchical navigation trails | @arolariu/components/breadcrumb |
| NavigationMenu | Complex dropdown navigation | @arolariu/components/navigation-menu |
| Sidebar | Collapsible side navigation | @arolariu/components/sidebar |
| Menubar | Application and editor menus | @arolariu/components/menubar |
π¦ Overlays & Dialogs
| Component | Description | Import |
| -------------- | ---------------------------------- | --------------------------------- |
| Dialog | Modal dialogs and confirmations | @arolariu/components/dialog |
| Sheet | Slide-out panels from screen edges | @arolariu/components/sheet |
| Popover | Floating content containers | @arolariu/components/popover |
| Tooltip | Contextual information on hover | @arolariu/components/tooltip |
| DropDrawer | Advanced drawer with drop zones | @arolariu/components/dropdrawer |
π Data Display
| Component | Description | Import |
| ------------ | -------------------------------------- | ------------------------------- |
| Table | Data tables with sorting/pagination | @arolariu/components/table |
| Calendar | Date selection and navigation | @arolariu/components/calendar |
| Avatar | User profile pictures and placeholders | @arolariu/components/avatar |
| Badge | Status indicators and labels | @arolariu/components/badge |
| Chart | Data visualization components | @arolariu/components/chart |
ποΈ Form Controls
| Component | Description | Import |
| --------------- | ---------------------------------- | ----------------------------------- |
| Form | Form validation and management | @arolariu/components/form |
| Field | Form field layout primitives | @arolariu/components/field |
| InputOTP | One-time password input fields | @arolariu/components/input-otp |
| InputGroup | Grouped text inputs and actions | @arolariu/components/input-group |
| RadioGroup | Single-choice option groups | @arolariu/components/radio-group |
| Switch | Toggle switches for binary options | @arolariu/components/switch |
| Textarea | Multi-line text input areas | @arolariu/components/textarea |
| ToggleGroup | Coordinated toggle button groups | @arolariu/components/toggle-group |
π¬ Feedback & Status
| Component | Description | Import |
| ------------ | ------------------------------- | ------------------------------- |
| Alert | Important message notifications | @arolariu/components/alert |
| Progress | Task completion indicators | @arolariu/components/progress |
| Skeleton | Loading state placeholders | @arolariu/components/skeleton |
| Toaster | Base UI-backed toast system | @arolariu/components/sonner |
| Spinner | Loading indicators | @arolariu/components/spinner |
πͺ Animated Backgrounds
| Component | Description | Import |
| ----------------------- | ------------------------------- | ------------------------------------------- |
| DotBackground | Animated dot matrix backgrounds | @arolariu/components/dot-background |
| BubbleBackground | Floating bubble animations | @arolariu/components/bubble-background |
| FireworksBackground | Particle explosion effects | @arolariu/components/fireworks-background |
| GradientBackground | Dynamic gradient animations | @arolariu/components/gradient-background |
Storybook demos: Coming soon.
π Migrating from v0.x
@radix-ui/*has been replaced internally with@base-ui/react; this is automatic and does not require consumer changes.tailwindcssis no longer a peer dependency.asChildstill works for backward compatibility, but therenderprop is now the preferred composition API.- The
sonnertoast API is preserved through the compatibility wrapper exported from@arolariu/components/sonner. - If you previously used
badgeVariantsorbuttonVariants, migrate to component props such asvariantandsizeinstead. - CSS custom properties now use the
--ac-*prefix.
ποΈ Architecture
Primitives
- Base layer:
@base-ui/reactprovides the primitive building blocks - Composition: Base UI's
renderprop is the preferred composition API - Backward compatibility:
asChildis still supported where available as a shim for Radix-era usage
Styling
- Each component is styled with a colocated CSS Module such as
button.module.css classNameremains the public extension point for consumer overrides- Base UI state attributes such as
[data-open],[data-disabled],[data-checked], and[data-selected]drive stateful styling cn()now usesclsxonly for predictable class composition
Theming
- Design tokens live in
src/index.css - Theme tokens use the
--ac-prefix, for example:--ac-primary--ac-background--ac-radius-md--ac-chart-1
- Dark mode is activated with either:
- a
.darkclass - or a
[data-theme="dark"]attribute
- a
Build & Distribution
- Built with RSLib using ESM output
- Tree-shakeable direct imports for components
- TypeScript declarations and source maps included
Common Import Paths
import {Button} from "@arolariu/components/button";
import {useIsMobile} from "@arolariu/components/useIsMobile";
import {cn} from "@arolariu/components/utilities";
import {hexToHsl} from "@arolariu/components/color-conversion-utilities";π‘ Usage Examples
Building a Login Form
import {useState} from "react";
import {Alert, AlertDescription} from "@arolariu/components/alert";
import {Button} from "@arolariu/components/button";
import {Card, CardContent, CardFooter, CardHeader, CardTitle} from "@arolariu/components/card";
import {Checkbox} from "@arolariu/components/checkbox";
import {Input} from "@arolariu/components/input";
import {Label} from "@arolariu/components/label";
import styles from "./login-form.module.css";
export function LoginForm() {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [rememberMe, setRememberMe] = useState(false);
const [error, setError] = useState("");
return (
<div className={styles.wrapper}>
<Card className={styles.card}>
<CardHeader>
<CardTitle>Welcome Back</CardTitle>
</CardHeader>
<CardContent className={styles.content}>
{error ? (
<Alert variant='destructive'>
<AlertDescription>{error}</AlertDescription>
</Alert>
) : null}
<div className={styles.field}>
<Label htmlFor='email'>Email</Label>
<Input
id='email'
type='email'
placeholder='[email protected]'
value={email}
onChange={(event) => setEmail(event.target.value)}
/>
</div>
<div className={styles.field}>
<Label htmlFor='password'>Password</Label>
<Input
id='password'
type='password'
value={password}
onChange={(event) => setPassword(event.target.value)}
/>
</div>
<div className={styles.checkboxRow}>
<Checkbox
id='remember'
checked={rememberMe}
onCheckedChange={setRememberMe}
/>
<Label htmlFor='remember'>Remember me</Label>
</div>
</CardContent>
<CardFooter>
<Button className={styles.submitButton}>Sign In</Button>
</CardFooter>
</Card>
</div>
);
}Data Dashboard
import {Badge} from "@arolariu/components/badge";
import {Card, CardContent, CardHeader, CardTitle} from "@arolariu/components/card";
import {Progress} from "@arolariu/components/progress";
import styles from "./dashboard.module.css";
export function Dashboard() {
return (
<div className={styles.grid}>
<Card>
<CardHeader>
<CardTitle className={styles.titleRow}>
Sales <Badge variant='secondary'>+12%</Badge>
</CardTitle>
</CardHeader>
<CardContent className={styles.stack}>
<Progress value={75} />
<p className={styles.mutedText}>75% of monthly goal</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Team Health</CardTitle>
</CardHeader>
<CardContent className={styles.stack}>
<p className={styles.metric}>24 active contributors</p>
<p className={styles.mutedText}>Using `--ac-*` tokens and Base UI primitives across the app</p>
</CardContent>
</Card>
</div>
);
}Interactive Navigation
import {NavigationMenu, NavigationMenuItem, NavigationMenuLink, NavigationMenuList} from "@arolariu/components/navigation-menu";
import {Sheet, SheetContent, SheetTrigger} from "@arolariu/components/sheet";
import {MenuIcon} from "lucide-react";
import styles from "./app-header.module.css";
export function AppHeader() {
return (
<header className={styles.header}>
<div className={styles.container}>
<h1 className={styles.brand}>My App</h1>
<NavigationMenu className={styles.desktopNav}>
<NavigationMenuList>
<NavigationMenuItem>
<NavigationMenuLink href='/'>Home</NavigationMenuLink>
</NavigationMenuItem>
<NavigationMenuItem>
<NavigationMenuLink href='/about'>About</NavigationMenuLink>
</NavigationMenuItem>
</NavigationMenuList>
</NavigationMenu>
<Sheet>
<SheetTrigger
render={
<button
type='button'
className={styles.mobileTrigger}
/>
}>
<MenuIcon />
</SheetTrigger>
<SheetContent>
<nav className={styles.mobileNav}>
<a href='/'>Home</a>
<a href='/about'>About</a>
</nav>
</SheetContent>
</Sheet>
</div>
</header>
);
}π οΈ Advanced Features
Tree Shaking & Bundle Optimization
@arolariu/components is built with bundle optimization in mind.
// β
Optimal: import only what you need
import {Button} from "@arolariu/components/button";
import {Card} from "@arolariu/components/card";
// β Avoid when bundle size matters
import {Button, Card} from "@arolariu/components";Bundle Impact
- Individual components: typically a few KB gzipped
- Full library: importable as ESM
- With tree shaking: only pay for what you use
TypeScript Integration
Full TypeScript support with intelligent autocomplete.
import {Button, type ButtonProps} from "@arolariu/components/button";
import {cn} from "@arolariu/components/utilities";
import styles from "./custom-button.module.css";
interface CustomButtonProps extends ButtonProps {
icon?: React.ReactNode;
}
export function CustomButton({icon, children, className, ...props}: CustomButtonProps) {
return (
<Button
className={cn(styles.customButton, className)}
{...props}>
{icon ? <span className={styles.icon}>{icon}</span> : null}
<span>{children}</span>
</Button>
);
}Server-Side Rendering (SSR)
Compatible with Next.js, Remix, and other SSR frameworks.
// app/page.tsx
import {Button} from "@arolariu/components/button";
import {Card, CardContent} from "@arolariu/components/card";
export default function HomePage() {
return (
<Card>
<CardContent>
<Button>Server-rendered Button</Button>
</CardContent>
</Card>
);
}Theming & Customization
Built around OKLCH CSS custom properties and CSS Modules.
/* theme-overrides.module.css */
.themeScope {
--ac-primary: oklch(0.7 0.19 250);
--ac-primary-foreground: oklch(0.99 0.01 250);
--ac-muted: oklch(0.96 0.01 286);
--ac-radius-md: 0.875rem;
}import {Button} from "@arolariu/components/button";
import styles from "./theme-overrides.module.css";
export function ThemedExample() {
return (
<section className={styles.themeScope}>
<Button>Custom themed button</Button>
</section>
);
}π Debugging & Development
Complete Source Map Support
Debug like a pro with comprehensive development tools.
- β JavaScript source maps for accurate debugging
- β CSS source maps for CSS Module debugging
- β TypeScript declaration maps for IDE IntelliSense
- β
Original source access via included
src/directory
Browser DevTools Integration
import {Button} from "@arolariu/components/button";
function MyComponent() {
return <Button onClick={() => console.log("Clicked!")}>Debug Me</Button>;
}Inspect generated class names, Base UI data attributes, and source-mapped module styles directly in DevTools.
π Full Debugging Guide - Learn advanced debugging techniques.
π Browser Support
Modern browsers only for optimal performance.
| Browser | Version | | ------------------ | ----------- | | π Chrome/Edge | 90+ (2021+) | | π¦ Firefox | 88+ (2021+) | | π§ Safari | 14+ (2020+) |
Why modern browsers? The library uses modern ESM output, CSS custom properties, and contemporary platform APIs for smaller bundles and better performance.
π€ Contributing
We welcome contributions. Help make @arolariu/components even better.
Quick Start for Contributors
# 1. Fork and clone the repository
git clone https://github.com/your-username/arolariu.ro.git
cd arolariu.ro/packages/components
# 2. Install dependencies
npm install
# 3. Start development environment
npm run build:components
npm run dev:components
# 4. Make your changes and test
npm run build:componentsWays to Contribute
- π Report bugs - Found an issue? Open an issue
- π‘ Suggest features - Have an idea? We'd love to hear it
- π§ Fix issues - Browse open issues and submit PRs
- π Improve docs - Help make our documentation clearer
- π¨ Add components - Contribute new components following our patterns
Component Development Guidelines
- Follow accessibility standards - Use Base UI primitives when appropriate
- Include TypeScript types - Full type definitions required
- Add stories or demos - Document variants and use cases
- Write tests - Ensure components work correctly
- Follow naming conventions - Use clear, descriptive names
- Prefer CSS Modules - Keep component styles colocated and token-driven
Read our full contributing guide β
π¦ Package Details
Bundle Information
# Package size analysis
npm install @arolariu/components
npx bundlephobia @arolariu/componentsKey Stats
- π¦ Version: 1.0.0
- π² Tree-shakeable: import only what you need
- π TypeScript: typed package with declaration output
- βΏ Accessibility: Base UI-backed primitives and patterns
- π Styling: CSS Modules + package-level design tokens
- π Theming:
--ac-*tokens with.darkand[data-theme="dark"]support
Dependencies
Core runtime dependencies include:
- @base-ui/react - Accessible component primitives in a single package
- clsx - Class name composition used by
cn() - lucide-react - Icon set
- motion - Animation library
- react-hook-form and zod - Forms and validation helpers
- embla-carousel-react, recharts, react-day-picker, input-otp, react-resizable-panels, shiki - Specialized UI integrations
Removed from the 1.0.0 architecture:
@radix-ui/*tailwind-mergeclass-variance-authoritytailwindcss-animatevaulsonnercmdk
π License
MIT License - Use freely in personal and commercial projects.
MIT License
Copyright (c) 2025 Alexandru-Razvan Olariu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software...π¨βπ» About the Author
Alexandru-Razvan Olariu
Senior Software Engineer passionate about creating beautiful, accessible user interfaces and developer tools.
- π Website: arolariu.ro
- π» GitHub: @arolariu
- πΌ LinkedIn: Alexandru-Razvan Olariu
- π§ Email: [email protected]
π Acknowledgments & Inspiration
This library wouldn't exist without these amazing projects.
- π¨ Base UI - Accessible component primitives
- π« shadcn/ui - Component design patterns and inspiration
- π CSS Modules - Scoped styling model used throughout the library
- β‘ Motion - Animation library for React
- π οΈ Rslib - Fast, modern bundling with Rsbuild
- π Storybook - Component development environment
- πͺ Magic UI - Additional component inspiration
- β¨ Aceternity UI - Creative component patterns
Special thanks to the open-source community for making all of this possible. π
β Star the Project
If @arolariu/components helps you build better UIs, please consider giving it a star on GitHub.
β Star on GitHub β’ π View Component Catalog β’ π Report Issues
Built with β€οΈ for the React community
Making beautiful, accessible UIs easier to build, one component at a time.
