From a819d32b747b87b20237c6c0a00a0a07dbf75c07 Mon Sep 17 00:00:00 2001 From: KangShinGyu Date: Sun, 1 Nov 2026 01:52:45 +0900 Subject: [PATCH 01/50] =?UTF-8?q?chore(ui):=20=EB=8F=99=EC=9E=91=20?= =?UTF-8?q?=EB=B6=80=ED=92=88=20shadcn=20base-nova=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=B0=9B=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - button, dialog, alert-dialog, drawer, dropdown-menu, select, combobox, popover, tabs와 combobox가 쓰는 input-group을 받은 그대로 둠(모두 Base UI 기반, drawer도 vaul 없음) - add가 함께 설치한 cn 패키지는 부품을 고칠 때 @/lib/utils로 바꾸고 지운다 - add가 덮어쓴 input·textarea는 우리 파일로 되돌림 Co-Authored-By: Claude Opus 5.5 --- package-lock.json | 13 ++ package.json | 1 + src/components/ui/alert-dialog.tsx | 187 ++++++++++++++++++ src/components/ui/button.tsx | 57 ++++++ src/components/ui/combobox.tsx | 297 ++++++++++++++++++++++++++++ src/components/ui/dialog.tsx | 160 +++++++++++++++ src/components/ui/drawer.tsx | 227 +++++++++++++++++++++ src/components/ui/dropdown-menu.tsx | 267 +++++++++++++++++++++++++ src/components/ui/input-group.tsx | 158 +++++++++++++++ src/components/ui/popover.tsx | 89 +++++++++ src/components/ui/select.tsx | 200 +++++++++++++++++++ src/components/ui/tabs.tsx | 81 ++++++++ 12 files changed, 1737 insertions(+) create mode 100644 src/components/ui/alert-dialog.tsx create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/combobox.tsx create mode 100644 src/components/ui/dialog.tsx create mode 100644 src/components/ui/drawer.tsx create mode 100644 src/components/ui/dropdown-menu.tsx create mode 100644 src/components/ui/input-group.tsx create mode 100644 src/components/ui/popover.tsx create mode 100644 src/components/ui/select.tsx create mode 100644 src/components/ui/tabs.tsx diff --git a/package-lock.json b/package-lock.json index 8198e11f..727c50cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "@vis.gl/react-google-maps": "^1.8.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "cn": "^0.5.1", "framer-motion": "^12.38.0", "lucide-react": "^1.7.0", "next": "16.2.1", @@ -6134,6 +6135,18 @@ "node": ">=6" } }, + "node_modules/cn": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cn/-/cn-0.5.1.tgz", + "integrity": "sha512-SA06SpzSWXRNrt/EQWnRpck9jEVDfVJonw8ZewiNR6pOC4U0SQ81tWaQ9/PKNPh/lWvjuY4CMlxpc8tJViiX6Q==", + "license": "MIT", + "bin": { + "cn": "bin/cn.mjs" + }, + "engines": { + "node": ">=22" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", diff --git a/package.json b/package.json index 8e9911a0..d9ea1611 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@vis.gl/react-google-maps": "^1.8.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "cn": "^0.5.1", "framer-motion": "^12.38.0", "lucide-react": "^1.7.0", "next": "16.2.1", diff --git a/src/components/ui/alert-dialog.tsx b/src/components/ui/alert-dialog.tsx new file mode 100644 index 00000000..0f96bcd7 --- /dev/null +++ b/src/components/ui/alert-dialog.tsx @@ -0,0 +1,187 @@ +"use client" + +import * as React from "react" +import { AlertDialog as AlertDialogPrimitive } from "@base-ui/react/alert-dialog" +import { cn } from "cn" + +import { Button } from "@/components/ui/button" + +function AlertDialog({ ...props }: AlertDialogPrimitive.Root.Props) { + return +} + +function AlertDialogTrigger({ ...props }: AlertDialogPrimitive.Trigger.Props) { + return ( + + ) +} + +function AlertDialogPortal({ ...props }: AlertDialogPrimitive.Portal.Props) { + return ( + + ) +} + +function AlertDialogOverlay({ + className, + ...props +}: AlertDialogPrimitive.Backdrop.Props) { + return ( + + ) +} + +function AlertDialogContent({ + className, + size = "default", + ...props +}: AlertDialogPrimitive.Popup.Props & { + size?: "default" | "sm" +}) { + return ( + + + + + ) +} + +function AlertDialogHeader({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDialogFooter({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDialogMedia({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogAction({ + className, + ...props +}: React.ComponentProps) { + return ( +