Skip to content
Components

Drawer

Swipeable edge panel for mobile sheets and off-canvas surfaces.

Examples

Nested drawers

Open a multi-step flow without unmounting the parent drawer or losing its focus-managed context.

Drawer sides

Match the drawer placement and dismissal gesture to any viewport edge.

Floating drawers

Inset the popup from its edge on any side so the panel reads as a detached, fully rounded surface.

Scrollable content

Keep the header and close action visible while a longer drawer body scrolls.

Composition

Anatomy

  • <Drawer>
    • <DrawerTrigger />
    • <DrawerContent>
      • <DrawerHeader>
        • <DrawerTitle />
        • <DrawerDescription />
        </DrawerHeader>
      • <DrawerBody>
        • <Button />
        </DrawerBody>
      • <DrawerFooter>
        • <DrawerClose />
        </DrawerFooter>
      </DrawerContent>
    </Drawer>

Installation

The Control UI source installs this primitive from src/registry/sources/control-ui/ui/drawer.tsx.

Registry command
See registry manifest

Raw code

Primary installed source

src/registry/sources/control-ui/ui/drawer.tsx

Knobs

Typed custom properties the recipe paints with. Set one on the root — style, a utility class, or a skin — and every slot inherits it.

--cui-popup-* · 44 knobsHow the cascade resolves
--cui-popup-title-foreground<color>var(--cui-popup-foreground)
--cui-popup-title-font-size<length-percentage>var(--text-heading-3)
--cui-popup-title-font-weight<number>var(--font-weight-semibold)
--cui-popup-title-line-height<number>var(--text-heading-3--line-height)
--cui-popup-title-letter-spacing<length>-0.025em
--cui-popup-description-foreground<color>var(--muted-foreground)
--cui-popup-close-inset<length-percentage>calc(var(--spacing) * 3)
--cui-popup-item-inset<length-percentage>calc(var(--spacing) * 8)
--cui-popup-label-padding-block<length-percentage>var(--cui-popup-item-padding-block)
--cui-popup-label-padding-inline<length-percentage>var(--cui-popup-item-padding-inline)
--cui-popup-label-font-size<length-percentage>var(--text-micro)
--cui-popup-label-font-weight<number>var(--font-weight-medium)
--cui-popup-label-letter-spacing<length>0.08em
--cui-popup-label-text-transformnone | uppercase | lowercase | capitalizeuppercase
--cui-popup-separator-inset<length-percentage>calc(var(--popover-padding) * -1)
--cui-popup-shortcut-font-size<length-percentage>var(--text-body)
--cui-popup-shortcut-letter-spacing<length>0.02em
--cui-popup-status-success-foreground<color>var(--success-text)
--cui-popup-status-warning-foreground<color>var(--warning-text)
--cui-popup-status-info-foreground<color>var(--info-text)
--cui-popup-status-error-foreground<color>var(--destructive)
--cui-popup-radius<length-percentage>var(--radius-popover)
--cui-popup-background<color>var(--popover)
--cui-popup-foreground<color>var(--popover-foreground)
--cui-popup-border-color<color>var(--control-rim)
--cui-popup-border-width<length>var(--control-rim-width)
--cui-popup-shadow*var(--shadow-pop)
--cui-popup-backdrop-filter*blur(var(--backdrop-blur-popover))
--cui-popup-backdrop-background<color>oklch(from var(--foreground) l c h / var(--overlay-opacity))
--cui-popup-backdrop-blur<length>var(--backdrop-blur-overlay)
--cui-popup-item-radius<length-percentage>var(--radius-popup-item-fit)
--cui-popup-item-font-size<length-percentage>var(--text-body)
--cui-popup-item-icon-size<length-percentage>1rem
--cui-popup-item-padding-block<length-percentage>calc(var(--spacing) * 1)
--cui-popup-item-padding-inline<length-percentage>calc(var(--padding-x) * 0.5)
--cui-popup-item-min-height<length-percentage>max(var(--target-min), var(--control-h-xs))
--cui-popup-item-highlight-shadow*inset 0 0 0 1px oklch(from var(--foreground) l c h / 0.35)
--cui-popup-item-foreground<color>var(--foreground)
--cui-popup-item-highlight-background<color>var(--hover-fill)
--cui-popup-item-highlight-foreground<color>var(--cui-popup-item-foreground)
--cui-popup-item-highlight-muted-foreground<color>var(--muted-foreground)
--cui-popup-item-disabled-opacity<number>var(--disabled-opacity)
--cui-popup-separator-color<color>var(--border)
--cui-popup-shortcut-foreground<color>var(--muted-foreground)