# Compose UI - Complete Documentation > A React component library built on Base UI primitives with Tailwind CSS styling. ## Table of Contents - Tabs - Scroll Area - Progress - Meter - Drawer - Dialog - Button - Avatar - Alert Dialog - Accordion --- # Tabs A component for toggling between related panels on the same page with an animated indicator. ## Installation ```bash npm install @lglab/compose-ui ``` ## Import ```tsx import { TabsRoot, TabsList, TabsTab, TabsIndicator, TabsPanel } from '@lglab/compose-ui' ``` ## Examples ### Basic ```tsx import { TabsIndicator, TabsList, TabsPanel, TabsRoot, TabsTab } from '@lglab/compose-ui' export default function BasicExample() { return ( Overview Projects Settings

This is the overview panel. Here you can see a summary of your account and recent activity.

View and manage your projects here. Create new projects or edit existing ones.

Configure your account settings, preferences, and notification options.

) } ``` ### With Icons ```tsx import { TabsIndicator, TabsList, TabsPanel, TabsRoot, TabsTab } from '@lglab/compose-ui' import { FolderIcon, SettingsIcon, UserIcon } from 'lucide-react' export default function WithIconsExample() { return ( Account Projects Settings

Manage your account details and profile information.

Browse and manage all your projects in one place.

Customize your experience with various settings options.

) } ``` ### Sizes ```tsx import { TabsIndicator, TabsList, TabsRoot, TabsTab } from '@lglab/compose-ui' export default function SizesExample() { return (

Small

Tab 1 Tab 2 Tab 3

Default

Tab 1 Tab 2 Tab 3

Large

Tab 1 Tab 2 Tab 3
) } ``` ### Disabled Tab ```tsx import { TabsIndicator, TabsList, TabsPanel, TabsRoot, TabsTab } from '@lglab/compose-ui' export default function DisabledExample() { return ( Active Disabled Another Tab

This tab is active. The middle tab is disabled and cannot be selected.

You shouldn't see this content.

This is another active tab panel.

) } ``` ### Vertical Orientation ```tsx import { TabsIndicator, TabsList, TabsPanel, TabsRoot, TabsTab } from '@lglab/compose-ui' export default function VerticalExample() { return ( General Security Notifications Billing

General Settings

Configure general application settings and preferences.

Security Settings

Manage your security preferences, two-factor authentication, and sessions.

Notification Preferences

Control how and when you receive notifications.

Billing Information

View and manage your billing details and payment methods.

) } ``` ## Resources - [Base UI Tabs Documentation](https://base-ui.com/react/components/tabs) - [API Reference](https://base-ui.com/react/components/tabs#api-reference) --- # Scroll Area A native scroll container with custom scrollbars for consistent styling across browsers. ## Installation ```bash npm install @lglab/compose-ui ``` ## Import ```tsx import { ScrollAreaRoot, ScrollAreaViewport, ScrollAreaContent, ScrollAreaScrollbar, ScrollAreaThumb, ScrollAreaCorner } from '@lglab/compose-ui' ``` ## Examples ### Vertical Scroll ```tsx import { ScrollAreaContent, ScrollAreaRoot, ScrollAreaScrollbar, ScrollAreaThumb, ScrollAreaViewport, } from '@lglab/compose-ui' export default function VerticalScrollExample() { return (
{Array.from({ length: 20 }).map((_, i) => (

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam euismod, nisi vel consectetur interdum, nisl nunc egestas nunc.

))}
) } ``` ### Horizontal Scroll ```tsx import { ScrollAreaContent, ScrollAreaRoot, ScrollAreaScrollbar, ScrollAreaThumb, ScrollAreaViewport, } from '@lglab/compose-ui' export default function HorizontalScrollExample() { return (
{Array.from({ length: 15 }).map((_, i) => (
Item {i + 1}
))}
) } ``` ### Both Scrollbars ```tsx import { ScrollAreaContent, ScrollAreaCorner, ScrollAreaRoot, ScrollAreaScrollbar, ScrollAreaThumb, ScrollAreaViewport, } from '@lglab/compose-ui' export default function BothScrollbarsExample() { return (
{Array.from({ length: 20 }).map((_, i) => (

{i + 1}. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam euismod, nisi vel consectetur interdum, nisl nunc egestas nunc, vel consectetur nisl nunc egestas nunc.

))}
) } ``` ## Resources - [Base UI Scroll Area Documentation](https://base-ui.com/react/components/scroll-area) - [API Reference](https://base-ui.com/react/components/scroll-area#api-reference) --- # Progress The progressbar range widget indicates that a request has been received and the application is making progress toward completing the requested action. ## Installation ```bash npm install @lglab/compose-ui ``` ## Import ```tsx import { ProgressRoot, ProgressTrack, ProgressIndicator, ProgressValue, ProgressLabel } from '@lglab/compose-ui' ``` ## Examples ### Basic ```tsx import { ProgressIndicator, ProgressLabel, ProgressRoot, ProgressTrack, ProgressValue, } from '@lglab/compose-ui' import * as React from 'react' export default function BasicExample() { const [value, setValue] = React.useState(20) React.useEffect(() => { const interval = setInterval(() => { setValue((current) => Math.min(100, Math.round(current + Math.random() * 25))) }, 1000) return () => clearInterval(interval) }, []) return (
{value < 100 ? 'Uploading file...' : 'File uploaded'}
) } ``` ## Resources - [Base UI Progress Documentation](https://base-ui.com/react/components/progress) - [API Reference](https://base-ui.com/react/components/progress#api-reference) --- # Meter A graphical display of a numeric value within a defined range. ## Installation ```bash npm install @lglab/compose-ui ``` ## Import ```tsx import { MeterRoot, MeterTrack, MeterIndicator, MeterValue, MeterLabel } from '@lglab/compose-ui' ``` ## Examples ### Basic ```tsx import { MeterIndicator, MeterLabel, MeterRoot, MeterTrack, MeterValue, } from '@lglab/compose-ui' export default function BasicExample() { return (
Storage Used
CPU Usage
Memory Usage
) } ``` ### Animated ```tsx import { MeterIndicator, MeterLabel, MeterRoot, MeterTrack, MeterValue, } from '@lglab/compose-ui' export default function AnimatedExample() { return (
Storage Used
CPU Usage
Memory Usage
) } ``` ### Custom Format ```tsx import { MeterIndicator, MeterLabel, MeterRoot, MeterTrack, MeterValue, } from '@lglab/compose-ui' export default function CustomFormatExample() { return (
Budget Used
Rating
`${value}% complete`} >
Progress
) } ``` ## Resources - [Base UI Meter Documentation](https://base-ui.com/react/components/meter) - [API Reference](https://base-ui.com/react/components/meter#api-reference) --- # Drawer A panel that slides in from the edge of the screen, commonly used for navigation, filters, or supplementary content. ## Installation ```bash npm install @lglab/compose-ui ``` ## Import ```tsx import { DrawerRoot, DrawerTrigger, DrawerPortal, DrawerBackdrop, DrawerPopup, DrawerTitle, DrawerDescription, DrawerClose, DrawerHeader, DrawerContent, DrawerFooter } from '@lglab/compose-ui' ``` ## Examples ### Basic ```tsx import { DrawerBackdrop, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerPopup, DrawerPortal, DrawerRoot, DrawerTitle, DrawerTrigger, } from '@lglab/compose-ui' export default function BasicExample() { return ( Open Drawer Drawer Lorem ipsum dolor sit amet

Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla bibendum est aliquam mauris laoreet interdum.

Close
) } ``` ### Sides ```tsx import { DrawerBackdrop, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerPopup, DrawerPortal, DrawerRoot, DrawerTitle, DrawerTrigger, } from '@lglab/compose-ui' const sides = ['top', 'right', 'bottom', 'left'] as const export default function SidesExample() { return (
{sides.map((side) => ( {side} {side} Drawer This drawer slides in from the {side}.

Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla bibendum est aliquam mauris laoreet interdum.

Close
))}
) } ``` ### Custom size ```tsx import { DrawerBackdrop, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerPopup, DrawerPortal, DrawerRoot, DrawerTitle, DrawerTrigger, } from '@lglab/compose-ui' export default function SizeExample() { return ( Open Drawer Custom Size Lorem ipsum dolor sit amet

Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla bibendum est aliquam mauris laoreet interdum.

Close
) } ``` ### Close button ```tsx import { DrawerBackdrop, DrawerClose, DrawerContent, DrawerDescription, DrawerHeader, DrawerPopup, DrawerPortal, DrawerRoot, DrawerTitle, DrawerTrigger, } from '@lglab/compose-ui' import { X } from 'lucide-react' export default function CloseButtonExample() { return ( Open Drawer Drawer Lorem ipsum dolor sit amet

Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla bibendum est aliquam mauris laoreet interdum.

) } ``` ### Scrollable ```tsx import { DrawerBackdrop, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerPopup, DrawerPortal, DrawerRoot, DrawerTitle, DrawerTrigger, } from '@lglab/compose-ui' import { ScrollAreaContent, ScrollAreaRoot, ScrollAreaScrollbar, ScrollAreaThumb, ScrollAreaViewport, } from '@lglab/compose-ui' export default function ScrollableExample() { return ( Open Drawer Drawer Lorem ipsum dolor sit amet
{Array.from({ length: 20 }).map((_, i) => (

Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla bibendum est aliquam mauris laoreet interdum.

))}
Close
) } ``` ### Controlled ```tsx import { DrawerBackdrop, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerPopup, DrawerPortal, DrawerRoot, DrawerTitle, } from '@lglab/compose-ui' import { Button } from '@lglab/compose-ui' import { SlidersHorizontal } from 'lucide-react' import { useState } from 'react' export default function ControlledExample() { const [open, setOpen] = useState(false) return ( <> Drawer Lorem ipsum dolor sit amet

Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla bibendum est aliquam mauris laoreet interdum.

Close
) } ``` ### Nested ```tsx import { DrawerBackdrop, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerPopup, DrawerPortal, DrawerRoot, DrawerTitle, DrawerTrigger, } from '@lglab/compose-ui' export default function NestedExample() { return ( Open Drawer Drawer Lorem ipsum dolor sit amet

Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla bibendum est aliquam mauris laoreet interdum.

Close Nested drawer Nested drawer Lorem ipsum dolor sit amet

Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla bibendum est aliquam mauris laoreet interdum.

Close
) } ``` ### Footer ```tsx import { DrawerBackdrop, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerPopup, DrawerPortal, DrawerRoot, DrawerTitle, DrawerTrigger, } from '@lglab/compose-ui' import { Button } from '@lglab/compose-ui' export default function FooterExample() { return ( Open Drawer Drawer Lorem ipsum dolor sit amet

Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla bibendum est aliquam mauris laoreet interdum.

Cancel
) } ``` ## Resources - [Base UI Drawer Documentation](https://base-ui.com/react/components/drawer) - [API Reference](https://base-ui.com/react/components/drawer#api-reference) --- # Dialog A popup that opens on top of the entire page with a backdrop, commonly used for confirmations, forms, and important messages. ## Installation ```bash npm install @lglab/compose-ui ``` ## Import ```tsx import { DialogRoot, DialogTrigger, DialogPortal, DialogBackdrop, DialogPopup, DialogTitle, DialogDescription, DialogClose, DialogHeader, DialogFooter } from '@lglab/compose-ui' ``` ## Examples ### Basic ```tsx import { DialogBackdrop, DialogClose, DialogDescription, DialogFooter, DialogPopup, DialogPortal, DialogRoot, DialogTitle, DialogTrigger, } from '@lglab/compose-ui' export default function BasicExample() { return ( Open Dialog Notifications You are all caught up. Good job! Close ) } ``` ### Trigger Variants ```tsx import { DialogBackdrop, DialogClose, DialogDescription, DialogFooter, DialogHeader, DialogPopup, DialogPortal, DialogRoot, DialogTitle, DialogTrigger, } from '@lglab/compose-ui' export default function VariantsExample() { return (
Default Default Variant Triggered with default button style. Close Secondary Secondary Variant Triggered with secondary button style. Close Outline Outline Variant Triggered with outline button style. Close Ghost Ghost Variant Triggered with ghost button style. Close
) } ``` ### Sizes ```tsx import { DialogBackdrop, DialogClose, DialogDescription, DialogFooter, DialogHeader, DialogPopup, DialogPortal, DialogRoot, DialogTitle, DialogTrigger, } from '@lglab/compose-ui' export default function SizesExample() { return (
Small Small Dialog Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Close Default Default Dialog Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Close Large Large Dialog Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Close Extra Large Extra Large Dialog Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Close Full Screen Full Screen Dialog Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Nam sed enim a eros eleifend accumsan. Morbi ac risus enim. Praesent in ante euismod, laoreet nisl quis, maximus nisl. Maecenas congue placerat aliquet. Praesent sit amet orci sed purus volutpat viverra vel vitae quam. Nulla a varius lectus. Aenean in facilisis justo. Close Custom Custom Size Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Close
) } ``` ### With Form ```tsx import { DialogBackdrop, DialogClose, DialogDescription, DialogFooter, DialogHeader, DialogPopup, DialogPortal, DialogRoot, DialogTitle, DialogTrigger, } from '@lglab/compose-ui' import { MailIcon } from 'lucide-react' import * as React from 'react' export default function FormDialogExample() { const [open, setOpen] = React.useState(false) return ( Contact Us Send a Message Fill out the form below and we'll get back to you as soon as possible.
{ e.preventDefault() setOpen(false) }} >