A monorepo containing 40+ custom UI components built on shadcn/ui principles, with multiple themes, pre-built CSS, and interactive demos.
Architecture in brief: Components are built on Base UI (and partially Radix UI) unstyled primitives. Tailwind CSS is used internally to compile styles β consumers receive fully pre-built CSS and can use any styling solution in their own project (CSS Modules, SCSS, a design system token layer, plain CSS, etc.). No Tailwind installation required.
@acronis-platform/shadcn-uikit (v0.34.0)
The core UI component library. Ships pre-built CSS β consumers do not need Tailwind CSS installed.
Peer dependencies:
react^18.2.0 || ^19.0.0react-dom^18.2.0 || ^19.0.0tw-animate-css^1.4.0
Interactive demo application showcasing all components with multiple themes.
Features:
- Component playground
- Live theme switching
- Responsive design
- Node.js 18+
- pnpm 10+
# Clone the repository
git clone https://github.com/acronis/shadcn-uikit.git
cd shadcn-uikit
# Install dependencies
pnpm install
# Build all packages
pnpm run build# Start the demo application
cd packages/demo
pnpm run devThe demo will be available at http://localhost:3000.
npm install @acronis-platform/shadcn-uikit tw-animate-css
# or
pnpm add @acronis-platform/shadcn-uikit tw-animate-css
# or
yarn add @acronis-platform/shadcn-uikit tw-animate-cssNote:
tw-animate-cssis a required peer dependency. It replaces the oldertailwindcss-animatepackage.
Import the main stylesheet in your application entry point. This includes the default theme, base styles, components, and utilities β all pre-built:
// main.tsx or App.tsx
import '@acronis-platform/shadcn-uikit/styles';No Tailwind CSS installation is needed. The package ships fully compiled CSS.
For theme switching, dark mode support, and persistence:
import { initializeThemeSystem } from '@acronis-platform/shadcn-uikit';
// Initialize on app startup
initializeThemeSystem();All components are exported from the main package:
import {
Button,
Card,
CardHeader,
CardTitle,
CardContent,
CardFooter,
Input,
Label,
Badge,
Alert,
AlertTitle,
AlertDescription,
} from '@acronis-platform/shadcn-uikit';
function MyComponent() {
return (
<Card>
<CardHeader>
<CardTitle>Welcome</CardTitle>
</CardHeader>
<CardContent className="space-y-4">
<div>
<Label htmlFor="email">Email</Label>
<Input id="email" type="email" placeholder="Enter your email" />
</div>
<Alert>
<AlertTitle>Info</AlertTitle>
<AlertDescription>This is an informational message.</AlertDescription>
</Alert>
</CardContent>
<CardFooter>
<Button>Submit</Button>
<Badge variant="secondary">New</Badge>
</CardFooter>
</Card>
);
}The library includes 40+ components:
- Layout: Card, Separator, Sidebar, ScrollArea, ResizablePanel
- Forms: Input, Textarea, Select, Checkbox, RadioGroup, Switch, Label, Form, PasswordInput
- Buttons: Button, ButtonGroup
- Navigation: NavigationMenu, Breadcrumb, Tabs, Pagination, SecondaryMenu
- Overlays: Dialog, Sheet, Drawer, Popover, Tooltip, AlertDialog
- Feedback: Alert, Badge, Chip, Tag, Progress, Spinner, Toast (Sonner)
- Data Display: Table, DataTable, Tree, Avatar, Calendar, DatePicker
- Advanced: Combobox, Command, Filter, Chart, Empty, Carousel, Collapsible, Accordion
- Icons: 1500+ internal icons via
BaseIcon+ auto-generated components
// Main entry β all components + utilities
import { Button } from '@acronis-platform/shadcn-uikit';
// React-only entry (same content)
import { Button } from '@acronis-platform/shadcn-uikit/react';
// Individual components (tree-shakeable)
import { Button } from '@acronis-platform/shadcn-uikit/components/Button';
// Tailwind preset (for consumers extending Tailwind β requires Tailwind v4)
import preset from '@acronis-platform/shadcn-uikit/tailwind-preset';// Default theme + base + components + utilities (most consumers use this)
import '@acronis-platform/shadcn-uikit/styles';
// Everything including all themes
import '@acronis-platform/shadcn-uikit/styles/full';
// Granular imports
import '@acronis-platform/shadcn-uikit/styles/tokens'; // CSS variables only
import '@acronis-platform/shadcn-uikit/styles/base'; // Reset + base styles
import '@acronis-platform/shadcn-uikit/styles/components'; // Component styles only
import '@acronis-platform/shadcn-uikit/styles/utilities'; // Tailwind utility classes
// Individual themes
import '@acronis-platform/shadcn-uikit/styles/themes/acronis-default';
import '@acronis-platform/shadcn-uikit/styles/themes/acronis-ocean';
import '@acronis-platform/shadcn-uikit/styles/themes/cyber-chat';
import '@acronis-platform/shadcn-uikit/styles/themes/acronis-white-label';The library is fully typed with TypeScript:
import type { ButtonProps, CardProps } from '@acronis-platform/shadcn-uikit';
const MyButton: React.FC<ButtonProps> = (props) => {
return <Button {...props} />;
};import { cn } from '@acronis-platform/shadcn-uikit';
// Merge class names
const className = cn('base-class', condition && 'conditional-class', 'another-class');This package uses Tailwind CSS v4 as a build-time tool to compile component styles. The output is standard CSS β consumers are free to use any styling solution in their own projects.
Tailwind is not part of the public API. The package ships pre-built CSS files. In your application you can use:
- CSS Modules or SCSS files with your own design system tokens
- A dedicated token/theme layer (CSS custom properties)
- Tailwind CSS (any version), Vanilla Extract, styled-components, or any other solution
- Plain CSS
The component styles, themes, and design tokens are all available as standalone CSS imports β no Tailwind processing needed at your end.
Zero impact. Import @acronis-platform/shadcn-uikit/styles as before. No Tailwind installation needed on your side.
The tw-animate-css package replaces the older tailwindcss-animate (from Tailwind v3). Install it alongside the UI kit:
npm install tw-animate-cssIf you previously had tailwindcss-animate as a dependency only for this UI kit, you can remove it.
If you use the @acronis-platform/shadcn-uikit/tailwind-preset export in your own Tailwind build, you must upgrade to Tailwind CSS v4:
- Install
@tailwindcss/postcssandtailwindcss ^4.x - Update your PostCSS configuration accordingly
- See the Tailwind CSS v4 upgrade guide for details
No direct conflict. However, the pre-built CSS uses Tailwind v4's @layer cascade layers, which may interact with a v3 Tailwind build if both are present in the same page. Recommended: avoid running Tailwind v3 over the pre-built CSS output.
- Acronis Default β standard Acronis brand colors (included by default)
- Acronis Ocean β alternative blue-focused theme with deeper ocean tones
- Cyber Chat β theme for the Cyber Chat product
- Acronis White Label β white-label theme for partner customization
- β Light & Dark modes β all themes support both modes via CSS variables
- β CSS-based β zero JavaScript overhead
- β Tree-shakeable β import only themes you use
- β Customizable β override CSS variables or create custom themes
- β SSR-compatible β works with server-side rendering
Switch themes programmatically:
import { applyTheme, applyColorMode, toggleColorMode } from '@acronis-platform/shadcn-uikit';
// Switch to ocean theme
applyTheme('acronis-ocean');
// Toggle dark mode
toggleColorMode();
// Or set specific mode
applyColorMode('dark');
applyColorMode('light');
applyColorMode('system'); // Follow system preferenceWhen the app renders inside a shadow root (e.g. via module federation), theme classes must also be applied to the inner container element β not just document.documentElement β because CSS inside a shadow root uses :host selectors that don't inherit from the document.
Pass additional container elements via the extraRoots parameter:
import { applyTheme, applyNavVariant } from '@acronis-platform/shadcn-uikit';
const innerContainer = document.getElementById('app-container');
applyTheme('acronis-ocean', true, innerContainer ? [innerContainer] : []);
// Same for white-label nav variants
applyNavVariant('ingram-micro', true, innerContainer ? [innerContainer] : []);Both applyTheme and applyNavVariant accept the same optional parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
theme / variant |
ThemeName / WhiteLabelNavVariant |
β | The theme or variant to apply |
persist |
boolean |
true |
Whether to persist the choice to localStorage |
extraRoots |
HTMLElement[] |
[] |
Additional elements to receive the same theme classes |
Import additional theme CSS, then apply:
// Import ocean theme
import '@acronis-platform/shadcn-uikit/styles/themes/acronis-ocean';
// Then apply it
import { applyTheme } from '@acronis-platform/shadcn-uikit';
applyTheme('acronis-ocean');Create custom themes by copying the template file and customizing colors:
# See packages/ui/src/styles/themes/_template.scss for the templateSee Theme Documentation for details.
shadcn-uikit/
βββ packages/
β βββ ui/ # Core UI components library (@acronis-platform/shadcn-uikit)
β β βββ src/
β β β βββ components/ # React components
β β β βββ hooks/ # Custom React hooks
β β β βββ lib/ # Utility functions
β β β βββ styles/ # SCSS source β themes, tokens, base
β β β β βββ themes/ # Theme SCSS files + template
β β β β βββ tokens/ # Design tokens (CSS variables)
β β β βββ types/ # Shared TypeScript types
β β β βββ utils/ # Additional utilities
β β β βββ index.ts # Main entry (all exports)
β β β βββ react.ts # React-only entry
β β βββ package.json
β βββ demo/ # Demo application
β β βββ src/
β β β βββ components/ # Demo-specific components
β β β βββ demos/ # Per-component demo pages
β β β βββ layouts/ # App layouts
β β βββ package.json
β βββ docs/ # Package-level documentation
βββ docs/ # Project-level documentation
β βββ explorations/ # Research & exploration documents
β βββ features/ # Feature specifications
β βββ team/ # Team processes & guides
βββ git-hooks/ # Git hook scripts
βββ package.json # Root workspace config
βββ pnpm-workspace.yaml # pnpm workspace definition
βββ README.md
pnpm run buildpnpm run type-checkpnpm run lint// main.tsx
import '@acronis-platform/shadcn-uikit/styles';
import { initializeThemeSystem } from '@acronis-platform/shadcn-uikit';
initializeThemeSystem();
// App.tsx
import { Button, Card, CardHeader, CardTitle, CardContent } from '@acronis-platform/shadcn-uikit';
export function App() {
return (
<Card>
<CardHeader>
<CardTitle>My App</CardTitle>
</CardHeader>
<CardContent>
<Button>Click me</Button>
</CardContent>
</Card>
);
}- Tree-Shaking & Performance β bundle optimization guide
- Theme System Guide β complete theme usage guide
- Theme Build Configuration β build setup details
- Theme Architecture β token system architecture
- UI Package Documentation
- Demo Package Documentation
MIT License β Copyright (c) 2026 Acronis International GmbH
See LICENSE for more details.
Contributions are welcome! Please feel free to submit a Pull Request.
- shadcn/ui β the original inspiration
- Base UI β unstyled primitives (primary)
- Radix UI β unstyled primitives (NavigationMenu, Slot)
- Tailwind CSS β internal build tool