shadcn ui ์์ ์ ๊ณตํ๋ Drawer
shadcn ui ์์ ์ ๊ณตํ๋ Drawer ์ ๋ฐฉํฅ์ ์๋์์ ์๋ก ์ฌ๋ผ์จ๋ค.
ํ์
ํํ๋ก ๋์ฐ๋ ๊ฒ๋ ์์๋ก ๋ณด์ฌ์ฃผ๊ธฐ๋ ํ์ง๋ง ๋๋ ์ปค์คํ
ํด์ ์ค๋ฅธ์ชฝ์ ์ค๋ฌด์ค~ ํ๊ฒ ๋์ค๊ฒ ๊ตฌํํด์ผํ๋ ์ํฉ์ด์๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ฌ ์ํฉ์์๋ ์ค๋ฅธ์ชฝ์์ ๋์ค๋๊ฑฐ์ง๋ง ๋์์ธ์ด ๋ฐ๋๋ฉด ๋ ์ด๋ป๊ฒ ๋ ์ง ๋ชจ๋ฅด๋ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ direction์ ๋ณ์๋ก ๋ฃ์ด์
๋ณ๊ฒฝํ ์ ์๋ ๋ฐฉํฅ์ ์ฐพ์๋ค.
shadcn/ui๋ ๋ฒ๋ค๋์ง ์์ ์ปดํฌ๋ํธ ์์ค ์ฝ๋๋ฅผ ํ๋ก์ ํธ์ ์์กด์ฑ์ผ๋ก ์ถ๊ฐํ์ง ์๊ณ , ๋ง ๊ทธ๋๋ก ๋ณต๋ถํด์ ์ปดํฌ๋ํธ ์ฝ๋๋ฅผ ์จ์ ํ ์ฌ์ฉํ ์ ์๋ค. ์ด ํฌ์ธํธ๊ฐ ์ค์ํ๋ค. ๋ํ๋์์ ๋ค์ด๊ฐ๋๊ฒ ์๋๋ผ in Project๊ฐ ๋๊ธฐ๋๋ฌธ์ components ๋๋ ํ ๋ฆฌ๊ฐ ์๊ธฐ๊ณ ๊ทธ ์์ drawer ํ์ผ์ ์ฐพ์ ์ ์๋ค. ์ปค์คํ ํ๊ธฐ ์ข๋ค!
direction ์ด๋ผ๋ props๋ฅผ ๋ง๋ค์ด์ ๋๊ฒจ์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ๊ฒ์ด๊ธฐ๋๋ฌธ์ context๋ฅผ ์์ฑํด์ค๋ค
// drawer.ts
const DrawerContext = React.createContext<{direction?: "top" | "bottom" | "right" | "left"
}>({});
๊ทธ๋ฆฌ๊ณ ์์ฑํ context provider๋ก root๋ฅผ ๊ฐ์ผ๋ค
// drawer.ts
const Drawer = ({
shouldScaleBackground = true,
...props
}: React.ComponentProps<typeof DrawerPrimitive.Root>) => (
/////////// ์๊ธฐ์ ๋ฃ์ด์ฃผ์ธ์~ //////////
<DrawerContext.Provider value={{direction: props.direction}}>
<DrawerPrimitive.Root
shouldScaleBackground={shouldScaleBackground}
{...props}
/>
</DrawerContext.Provider>
)
drawer.ts ์ฝ๋๋ฅผ ์ฐฌ์ฐฌํ ๋ณด๋ฉด DrawerContent ๋ถ๋ถ ์ฝ๋๊ฐ ์๋ค.
useContext๋ฅผ ์ฌ์ฉํด์ dirction์ ์์ฑํด์ฃผ๊ณ
ui ๋ถ๋ถ์ธ className ๋ถ๋ถ์ dirction์ ๋ฐ๋ผ์ ๋ณ๊ฒฝ ๋ UI ์ค์ ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
css๋ tailwind css ๋ฒ์น์ ๋ฐ๋ฅธ๋ค๋ ๊ฑธ ์์ง ๋ง์!
๊ณตํต์ ์ผ๋ก ๋ค์ด๊ฐ๋ ๊ฑฐ ๋ง๊ณ bottm-0์ผ๋ก ์์ํ๋๊ฒ ์๋์์ ์์๋๋ ๊ฒ!
๊ทธ๋ฆฌ๊ณ ๋ฐฉํฅ์ด ์ค๋ฅธ์ชฝ / ์ผ์ชฝ ๋ค์ด๊ฐ๋ฉด h์ด full์ด ๋์ด์ผ ํ๋ฉด์ ๋ค ๋ค์ด์ฐฌ๋ค. ๊ทธ ์ ์์ง ๋ง์!
const DrawerContent = React.forwardRef<
React.ElementRef<typeof DrawerPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>
>(({ className, children, ...props }, ref) => {
// ์๊ธฐ
const { direction } = React.useContext(DrawerContext);
return (
<DrawerPortal>
<DrawerOverlay />
<DrawerPrimitive.Content
ref={ref}
///// ์๊ธฐ
className={cn(
"fixed z-50 flex h-auto flex-col border bg-background",
(!direction || direction === "bottom" ) && "inset-x-0 bottom-0 mt-24 rounded-t-[10px]",
direction === "right" && "top-0 right-0 w-screen max-w-80 h-full",
direction === "left" && "top-0 left-0 w-screen max-w-80 h-full",
direction === "top" && "inset-x-0 top-0",
className
)}
{...props}
>
<div className="mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted" />
{children}
</DrawerPrimitive.Content>
</DrawerPortal>
)})
DrawerContent.displayName = "DrawerContent"
๊ทธ๋ฌ๋ฉด ์ด์ ์ค๋น์๋ฃ๋ค
Drawer์ ์ค์ ๋ก ์ฐ๋ ๊ณณ์ ๊ฐ์ dirction์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค!
<Drawer direction="right">
<DrawerTrigger>
<Menu />
</DrawerTrigger>
<DrawerContent>
<NavigationMenu orientation="vertical" className="items-start">
<NavigationMenuList className="h-full flex-col items-start space-x-0">
{menuDisplay(menuList)}
</NavigationMenuList>
</NavigationMenu>
</DrawerContent>
</Drawer>
'๊ฐ๋ฐ > Next.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
nextjs shadcn/ui ์์ ๋ฏธ๋์ด์ฟผ๋ฆฌ ์์ ํ๊ธฐ (0) | 2024.06.10 |
---|---|
Nextjs14 + nextui๋ฅผ ์ฌ์ฉํด์ progress bar ๋ง๋ค๊ธฐ (1) | 2024.06.05 |
[Nextjs] Route segment 'force-dynamic' ๊ฐ ํ์ํ ๋ (0) | 2024.03.29 |
vercel๋ก Nextjs ๋ฐฐํฌํ๊ธฐ (0) | 2024.01.05 |
Next.js14์์ useRouter ์ฌ์ฉํ๊ธฐ (1) | 2024.01.03 |