Offline Media design system components built with React, Radix UI, and Tailwind CSS.
pnpm add @offlinemediainc/offline-ui
Add the theme CSS to your app’s entry point:
// app/layout.tsx or _app.tsx
import '@offlinemediainc/offline-ui/styles.css';
Add the package to your CSS source scanning:
@import "tailwindcss";
@source "../node_modules/@offlinemediainc/offline-ui/dist/**/*.js";
import { Button, Card, Dialog, Badge } from '@offlinemediainc/offline-ui';
export function MyComponent() {
return (
<Card>
<Badge variant="success">Active</Badge>
<Button>Click me</Button>
</Card>
);
}
Avatar, AvatarImage, AvatarFallbackBadge - with variants: default, secondary, destructive, success, warning, outline, linkButton - with variants: default, destructive, outline, secondary, ghost, linkCard, CardHeader, CardTitle, CardDescription, CardContent, CardFooterCollapsible, CollapsibleTrigger, CollapsibleContentDialog, DialogTrigger, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescriptionDropdownMenu and sub-componentsInputItem, ItemGroup, ItemMedia, ItemContent, ItemTitle, ItemDescription, ItemActionsLabelSeparatorSheet and sub-componentsSidebar and sub-components (SidebarProvider, SidebarMenu, SidebarMenuItem, etc.)SkeletonTabs, TabsList, TabsTrigger, TabsContentTooltip, TooltipTrigger, TooltipContent, TooltipProviderThe following components require Next.js (uses next/image, next/link, next/navigation):
OfflineSidebar - Full application sidebar layout with Offline brandingimport { OfflineSidebar } from '@offlinemediainc/offline-ui';
import { LayoutDashboard, Settings } from 'lucide-react';
export default function Layout({ children }) {
return (
<OfflineSidebar
workspace=
user=
navGroups={[
{
label: "Main",
items: [
{ title: "Dashboard", url: "/dashboard", icon: LayoutDashboard },
{ title: "Settings", url: "/settings", icon: Settings },
]
}
]}
onLogout={() => signOut()}
>
{children}
</OfflineSidebar>
);
}
cn() - Class name utility (clsx + tailwind-merge)useIsMobile() - Hook for mobile breakpoint detectionView the component documentation: Storybook
# Install dependencies
pnpm install
# Start Storybook
pnpm storybook
Storybook will be available at http://localhost:6006
pnpm build:lib
offline-style-guide/
├── src/ # Library source (published to npm)
│ ├── components/ # UI components
│ ├── hooks/ # React hooks
│ ├── lib/ # Utilities
│ └── styles/ # Theme CSS
├── components/ui/ # Original components + stories
├── stories/theme/ # Theme documentation stories
├── .storybook/ # Storybook configuration
├── dist/ # Built library output
└── app/ # Next.js demo app