๋ฐ์ํ ์น์ฌ์ดํธ ์ ์์ ์ด์ ๊ทธ๋ฅ ํ์์ด๋ค. ๋ฏธ๋์ด์ฟผ๋ฆฌ ์์ ์ ํ ๋ ํญ์ ๋ธ๋ ์ดํฌ ํฌ์ธํธ๋ฅผ ์ก๋ ๊ฒ์ด ์ ๋งคํ๋ค๋ผ๊ณ ์๊ฐํ๋๋ฐ
์ฐ์ ์ 768px ์ต์๋ก ํ์ ๊ฒฝ์ฐ๋ฅผ ๋๊ณ ์์ ์ ๋ค์ด๊ฐ๋ค.
shadcn/ui ์ด๋?
Radix UI ๋ฐ Tailwind CSS๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ. ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ์ฑ์ copy and paste ํ์ฌ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ์์ ๋ชจ์์ด๋ค. npm install ์ ํ์ฌ ์ข ์์ฑ ์ค์น๋ฅผ ํ์ง ์๋๋ค๋ ์ด์ผ๊ธฐ๋ค. tailwind css๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์๋ค. ์ปค์คํ ์ ํ ๋ tailwind css ๋ฒ์น์ ๋ฐ๋ฅด๋ฉด ๋๋ค.
์ฌ์ฉํ๊ธฐ ์ํด์๋ Nextjs , tailwind css ๊ฐ ์ค์น๋์ด์์ด์ผํ๋ค.
๋ค ๊ฐ์คํ๊ณ shadcn/ui๋ฅผ ์ฐ๋ฉด์ ๋ฏธ๋์ด์ฟผ๋ฆฌ ์์ ์ ํ๋ ค๋ฉด ์ผ์ผํ css๋ฅผ ๊ฑด๋๋ ๊ฒ๋ณด๋ค๋ ์กฐ๊ธ ๊ฐํธํ ๋ฐฉ๋ฒ์ด ์๋ค
1. shadcn/ui์์ ์ ๊ณตํ๋ hook ์ฌ์ฉํ๊ธฐ
์๋๋ shadcn/ui๊ฐ ์ ๊ณตํ๋ ๊นํ์ด๋ค. ์ด๊ณณ์์ ๊ฐ์ข ui ์ฝ๋๋ฅผ ํ์ธํ ์ ์๋ค.
use-media-query ํ์ผ์ ๊ทธ๋๋ก ๋ณต์ฌํด์ ์์ ์ด ํ๊ณ ์๋ ํ๋ก์ ํธ๋ก ๋ถ์ฌ๋ฃ๋๋ค.
https://github.com/shadcn-ui/ui/blob/main/apps/www/hooks/use-media-query.tsx
2. ๋ฐ์ํ ๋ฉ๋ด๋ฅผ ๋ง๋ค์ด๋ณด์.
"use client";
import { useMediaQuery } from "@/hooks/use-media-query";
// ๋ชจ๋ฐ์ผ ๋ฒ์ ผ์ผ ๋ ๋์์ผํ drawer
import { Drawer, DrawerContent, DrawerTrigger } from "./ui/drawer";
// ๊ธฐ์กด์ ๋ฉ๋ด
import {
NavigationMenu,
NavigationMenuItem,
NavigationMenuLink,
NavigationMenuList,
} from "@/components/ui/navigation-menu";
import { navigationMenuTriggerStyle } from "@/components/ui/navigation-menu";
import Link from "next/link";
import { Menu } from "lucide-react";
const MainMenu = () => {
const isDesktop = useMediaQuery("(min-width: 768px)");
const menuList: { title: string; href: string }[] = [
.....
];
const menuDisplay = (menuList: any[]) => {
return (
.......
);
};
return (
<div className="flex h-50 justify-between">
..................
</div>
);
};
export default MainMenu;
๋ณต๋ถํ๋ useMediaQuery๋ฅผ ํธ์ถํด์ ๊ทธ ์์ ๋งค๊ฐ๋ณ์๋ก ์ํ๋ ์์น๋ฅผ ๋ฃ์ด์ค๋ค
const isDesktop = useMediaQuery("(min-width: 768px)");
3. ์ ํด์ง ๋ฒ์๊ฐ ํ์ํ ๊ณณ์ ๋ฃ์ด์ ์ ์ฉํ์
return (
<div className="flex h-50 justify-between">
<div className="flex items-center p-5">
<Link href="/" className="flex z-40 font-semibold">
Logo
</Link>
</div>
////////////// ์ฌ๊ธฐ์์ค์ค์ค์ค
{isDesktop ? (
<div className="flex gap-6">
<NavigationMenu>
<NavigationMenuList>{menuDisplay(menuList)}</NavigationMenuList>
</NavigationMenu>
</div>
) : (
<div className="flex p-1">
<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>
</div>
)}
</div>
);
drawer์ ํด๋ฆญ์์ ์์ด๋ ์๋์์ ์ฐ์ฝ - ํ๊ณ ๋ํ๋๋ ํ์ ์ฐฝ๊ฐ์ ๊ฑธ ์ด์ผ๊ธฐํ๋๋ฐ ์๋์ด๋ฏ์ด~ ์๋์ ๊ฐ์ ui์ด๋ค.
isDesktop์ด๋ฉด ์ผ๋ฐ header์ ๋ถ๋ ๋ฉ๋ด๊ฐ ๋์ค๊ณ , ์๋๋ฉด drawer์ด ๋์ค๊ฒ ํ๋ค.
๊ฐ๋จํ์ง์ฅ?
๋ค์์๋ drawer ๋ฐฉํฅ์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ๊ณต์ ํ๊ฒ ์!
'๊ฐ๋ฐ > Next.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
nextjs shadcn/ui Drawer ๋ฐฉํฅ ์ ํํ๊ธฐ (1) | 2024.06.13 |
---|---|
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 |