Drawer (Base UI)
basecn/drawer-baseFreeComponent
A panel that slides in from the edge of the screen.
Live preview
live · rendered by the registry
Rendered by basecn on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://basecn.dev/r/drawer-base.jsonSource
1"use client";23import { cn } from "@/lib/utils";4import { Drawer as DrawerPrimitive } from "@base-ui/react/drawer";5import { ComponentProps, createContext, use } from "react";67function resolveClassName<S>(8 className: string | ((state: S) => string | undefined) | undefined,9 state: S,10): string | undefined {11 return typeof className === "function" ? className(state) : className;12}1314const DrawerContext =15 createContext<DrawerPrimitive.Root.Props["swipeDirection"]>("down");1617function DrawerProvider({ ...props }: DrawerPrimitive.Provider.Props) {18 return <DrawerPrimitive.Provider {...props} />;19}2021function Drawer({22 swipeDirection = "down",23 ...props24}: DrawerPrimitive.Root.Props) {25 return (26 <DrawerContext value={swipeDirection}>27 <DrawerPrimitive.Root28 data-slot="drawer"29 swipeDirection={swipeDirection}30 {...props}31 />32 </DrawerContext>33 );34}3536function DrawerTrigger({ ...props }: DrawerPrimitive.Trigger.Props) {37 return <DrawerPrimitive.Trigger {...props} data-slot="drawer-trigger" />;38}3940function DrawerPortal({ className, ...props }: DrawerPrimitive.Portal.Props) {41 return (42 <DrawerPrimitive.Portal43 data-slot="drawer-portal"44 className={(state) => cn("z-50", resolveClassName(className, state))}45 {...props}46 />47 );48}4950function DrawerClose({ ...props }: DrawerPrimitive.Close.Props) {51 return <DrawerPrimitive.Close data-slot="drawer-close" {...props} />;52}5354function DrawerContent({ className, ...props }: DrawerPrimitive.Content.Props) {55 return (56 <DrawerPrimitive.Content57 data-slot="drawer-content"58 className={(state) =>59 cn(60 "transition-opacity duration-300 ease-[cubic-bezier(0.45,1.005,0,1.005)] group-data-nested-drawer-open/popup:opacity-0 group-data-nested-drawer-swiping/popup:opacity-100",61 resolveClassName(className, state),62 )63 }64 {...props}65 />66 );67}6869export const drawerPopupClassName = ({70 swipeDirection,71}: DrawerPrimitive.Popup.State) => {72 return cn(73 "group/popup relative",74 "[--bleed:3rem] outline-1 outline-foreground/5 bg-background text-foreground dark:outline-border overflow-y-auto overscroll-contain touch-auto data-swiping:select-none",75 "data-ending-style:duration-[calc(var(--drawer-swipe-strength)*400ms)]",76 // Nested drawer stacking variables (no-ops when not nested)77// … truncated
What it pulls in
npm packages
Files it writes
More from basecn
All 56 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | basecn | Components | Free | 2 deps | |
| Alertalert | basecn | Components | Free | 1 dep | |
| Alert Dialogalert-dialog | basecn | Components | Free | 1 dep | |
| Aspect Ratioaspect-ratio | basecn | Components | Free | no deps | |
| Autocompleteautocomplete | basecn | Components | Free | 2 deps | |
| Avataravatar | basecn | Components | Free | 1 dep | |
| Badgebadge | basecn | Components | Free | 2 deps | |
| Breadcrumbbreadcrumb | basecn | Components | Free | 2 deps |
