Components

Drawer

A drawer component for React, built on Vaul.

Installation

Cortexcn
pnpm dlx shadcn@latest add @cortexcn/drawer

Usage

import { Drawer, DrawerPortal, DrawerOverlay, DrawerTrigger, DrawerClose, DrawerContent, DrawerHeader, DrawerFooter, DrawerTitle, DrawerDescription } from "@/components/drawer";

Examples

Scrollable content

import { Button } from "@/components/button"import { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger } from "@/components/drawer"export function DrawerScrollableContent() {  return (    <div className="flex flex-col gap-6">      <Drawer direction="right">        <DrawerTrigger asChild>          <Button variant="outline">Scrollable Content</Button>        </DrawerTrigger>        <DrawerContent>          <DrawerHeader>            <DrawerTitle>Move Goal</DrawerTitle>            <DrawerDescription>Set your daily activity goal.</DrawerDescription>          </DrawerHeader>          <div className="no-scrollbar overflow-y-auto px-4">            {Array.from({ length: 10 }).map((_, index) => (              <p                key={index}                className="mb-4 leading-normal style-lyra:mb-2 style-lyra:leading-relaxed style-sera:leading-relaxed"              >                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do                eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut                enim ad minim veniam, quis nostrud exercitation ullamco laboris                nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor                in reprehenderit in voluptate velit esse cillum dolore eu fugiat                nulla pariatur. Excepteur sint occaecat cupidatat non proident,                sunt in culpa qui officia deserunt mollit anim id est laborum.              </p>            ))}          </div>          <DrawerFooter>            <Button>Submit</Button>            <DrawerClose asChild>              <Button variant="outline">Cancel</Button>            </DrawerClose>          </DrawerFooter>        </DrawerContent>      </Drawer>    </div>  )}

Sides

import { Button } from "@/components/button"import { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger } from "@/components/drawer"const DRAWER_SIDES = ["top", "right", "bottom", "left"] as constexport function DrawerWithSides() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-wrap gap-2">        {DRAWER_SIDES.map((side) => (          <Drawer            key={side}            direction={              side === "bottom" ? undefined : (side as "top" | "right" | "left")            }          >            <DrawerTrigger asChild>              <Button                variant="outline"                className="capitalize style-sera:uppercase"              >                {side}              </Button>            </DrawerTrigger>            <DrawerContent className="data-[vaul-drawer-direction=bottom]:max-h-[50vh] data-[vaul-drawer-direction=top]:max-h-[50vh]">              <DrawerHeader>                <DrawerTitle>Move Goal</DrawerTitle>                <DrawerDescription>                  Set your daily activity goal.                </DrawerDescription>              </DrawerHeader>              <div className="no-scrollbar overflow-y-auto px-4">                {Array.from({ length: 10 }).map((_, index) => (                  <p                    key={index}                    className="mb-4 leading-normal style-lyra:mb-2 style-lyra:leading-relaxed style-sera:leading-relaxed"                  >                    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed                    do eiusmod tempor incididunt ut labore et dolore magna                    aliqua. Ut enim ad minim veniam, quis nostrud exercitation                    ullamco laboris nisi ut aliquip ex ea commodo consequat.                    Duis aute irure dolor in reprehenderit in voluptate velit                    esse cillum dolore eu fugiat nulla pariatur. Excepteur sint                    occaecat cupidatat non proident, sunt in culpa qui officia                    deserunt mollit anim id est laborum.                  </p>                ))}              </div>              <DrawerFooter>                <Button>Submit</Button>                <DrawerClose asChild>                  <Button variant="outline">Cancel</Button>                </DrawerClose>              </DrawerFooter>            </DrawerContent>          </Drawer>        ))}      </div>    </div>  )}

Adapted from the shadcn/ui Drawer (MIT).