Package Exports
- passport-ui/accordion
- passport-ui/alert
- passport-ui/alert-dialog
- passport-ui/analytics
- passport-ui/animated-background
- passport-ui/aspect-ratio
- passport-ui/avatar
- passport-ui/back-button
- passport-ui/badge
- passport-ui/blockquote
- passport-ui/blur-in
- passport-ui/border-trail
- passport-ui/breadcrumb
- passport-ui/bullet-list
- passport-ui/button
- passport-ui/calendar
- passport-ui/card
- passport-ui/carousel
- passport-ui/checkbox
- passport-ui/chunk-2ADXGE2T
- passport-ui/chunk-2R6226MV
- passport-ui/chunk-AIU6LNHW
- passport-ui/chunk-DC7UOHY5
- passport-ui/chunk-F2TPNUKJ
- passport-ui/chunk-FCJRVLSI
- passport-ui/chunk-FP7K2XNL
- passport-ui/chunk-HYU2ZUAV
- passport-ui/chunk-MN7VDUYM
- passport-ui/chunk-MVRSBLCP
- passport-ui/chunk-RDCEAXBT
- passport-ui/chunk-RXUAGWUT
- passport-ui/chunk-T7BURAOP
- passport-ui/chunk-W7I4ELGX
- passport-ui/chunk-YLTKQMHG
- passport-ui/code-block
- passport-ui/collapsible
- passport-ui/combobox
- passport-ui/command
- passport-ui/components.json
- passport-ui/content-container
- passport-ui/context-menu
- passport-ui/date-picker
- passport-ui/dialog
- passport-ui/drawer
- passport-ui/dropdown-menu
- passport-ui/footer-container
- passport-ui/form
- passport-ui/header-container
- passport-ui/hljs-themes.css
- passport-ui/hover-card
- passport-ui/input
- passport-ui/input-otp
- passport-ui/label
- passport-ui/live-region
- passport-ui/markdown
- passport-ui/menubar
- passport-ui/meta-container
- passport-ui/navigation-menu
- passport-ui/page-layout
- passport-ui/pagination
- passport-ui/placeholder-card
- passport-ui/popover
- passport-ui/prefetch-link
- passport-ui/progress
- passport-ui/radio-group
- passport-ui/resizable
- passport-ui/scroll-area
- passport-ui/select
- passport-ui/separator
- passport-ui/sheet
- passport-ui/sidebar
- passport-ui/sidebar-container
- passport-ui/skeleton
- passport-ui/slider
- passport-ui/sonner
- passport-ui/structured-data
- passport-ui/styles.css
- passport-ui/switch
- passport-ui/table
- passport-ui/tailwind-colors.css
- passport-ui/textarea
- passport-ui/theme-button
- passport-ui/theme-provider
- passport-ui/theme-toggle
- passport-ui/toggle
- passport-ui/toggle-select
- passport-ui/tooltip
- passport-ui/utils
- passport-ui/visually-hidden
Readme
Passport UI

A sleek, compact and customizable UI component library with motion primitives and theme support built with React, TypeScript, Tailwind CSS v4, and shadcn/ui components.
Access Storybook via passportui.com to play with the available components and composables. For help on installing Passport UI libary, checkout install.passportui.com.
Installation
npm install passport-ui
npm install tailwindcss @tailwindcss/postcssUsage
Import Pattern
Passport UI uses individual component exports for optimal tree-shaking and React Server Components compatibility. Import components individually:
import { Button } from "passport-ui/button";
import { Card, CardContent } from "passport-ui/card";
import { ThemeProvider } from "passport-ui/theme-provider";Available Import Paths:
- Components:
passport-ui/button,passport-ui/card,passport-ui/dialog, etc. - Composables:
passport-ui/theme-button,passport-ui/back-button, etc. - Motion Primitives:
passport-ui/blur-in,passport-ui/border-trail, etc. - Layouts:
passport-ui/page-layout,passport-ui/content-container, etc. - Utilities:
passport-ui/utils
Setup PostCSS
Add the PostCSS plugin to your postcss.config.mjs:
export default {
plugins: ["@tailwindcss/postcss"],
};Import Styles
Import the library styles in your main CSS file:
@source "../../node_modules/passport-ui/src"
@import "passport-ui/styles.css";
/* Optional styles based on requirement */
@import "passport-ui/hljs-themes.css"; /* Optional: for code highlighting */
@import "passport-ui/tailwind-colors.css"; /* Optional: dynamic usage of tailwind colors */- For themed syntax highlighting in
CodeBlockandMarkdowncomponents, import the theme styles. - For dynamic usage of tailwind colors, import the tailwind colors styles.
Basic Example
import { Button } from "passport-ui/button";
import { Card, CardContent } from "passport-ui/card";
function App() {
return (
<Card>
<CardContent>
<Button>Click me</Button>
</CardContent>
</Card>
);
}With Theme Support
import { ThemeButton } from "passport-ui/theme-button";
import { ThemeProvider } from "passport-ui/theme-provider";
function App() {
return (
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
<div className="min-h-screen bg-background text-foreground">
<ThemeButton />
{/* Your app content */}
</div>
</ThemeProvider>
);
}Form Components (Client-Only)
Form components that depend on react-hook-form are exported separately to ensure React Server Components compatibility:
"use client";
import { Button } from "passport-ui/button";
import {
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "passport-ui/form";
import { useForm } from "react-hook-form";
function LoginForm() {
const form = useForm();
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)}>
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem>
<FormLabel>Email</FormLabel>
<FormControl>
<input {...field} type="email" />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit">Submit</Button>
</form>
</Form>
);
}Note: Form components must be used in client components (with
"use client"directive) due to their dependency onreact-hook-form.
Framework Integration
Next.js
For Next.js projects, add the PostCSS configuration and import styles in your global CSS file:
/* app/globals.css or styles/globals.css */
@import "passport-ui/styles.css";Vite
For Vite projects, you can use either PostCSS or the Vite plugin:
Option 1: PostCSS (recommended)
// postcss.config.mjs
export default {
plugins: ["@tailwindcss/postcss"],
};Option 2: Vite Plugin
// vite.config.ts
import tailwindcss from "@tailwindcss/vite";
import { defineConfig } from "vite";
export default defineConfig({
plugins: [tailwindcss()],
});Development
This package is built with:
- React 18+
- TypeScript
- Tailwind CSS
- Radix UI primitives
- Framer Motion (motion)
- next-themes
Available Themes
Light- Light themeDark- Dark themeSystem- System theme
Use ThemeProvider to wrap your app and ThemeButton to toggle between themes.
Available Components
Layouts
Components
AccordionAlertAlertDialogAspectRatioAvatarBadgeBlockquoteBreadcrumbButtonCalendarCardCarouselCheckboxCodeBlockCollapsibleComboboxCommandContextMenuDatePickerDialogDrawerDropdownMenuFormHoverCardInputInputOTPLabelMarkdownMenubarPaginationPopoverPrefetchLinkProgressRadioGroupResizableScrollAreaSelectSeparatorSheetSkeletonSliderSonnerStructuredDataSwitchTableTextareaToggleToggleSelectTooltip