"use client"; /** * 표준 다이얼로그 컴포넌트 * * 디자인시스템관리 -> 다이얼로그 기준으로 작성된 공통 다이얼로그 * - 반응형 지원 (모바일/태블릿/데스크톱) * - 접근성 준수 (DialogTitle 필수) * - 일관된 스타일링 * - 상/하/좌/우 모든 마진 적용 */ import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; export interface StandardDialogProps { open: boolean; onOpenChange: (open: boolean) => void; title: string; description?: string; children: React.ReactNode; footer?: React.ReactNode; size?: "sm" | "md" | "lg" | "xl" | "full"; showClose?: boolean; className?: string; } const sizeClasses = { sm: "sm:max-w-sm", md: "sm:max-w-md", lg: "sm:max-w-lg", xl: "sm:max-w-xl", full: "sm:max-w-[95vw]", }; /** * 표준 다이얼로그 * * @example * ```tsx * *
컨텐츠
*
* ``` */ export function StandardDialog({ open, onOpenChange, title, description, children, footer, size = "md", showClose = true, className, }: StandardDialogProps) { return ( {title} {description && {description}}
{children}
{footer && {footer}}
); } /** * 확인 다이얼로그 */ export interface ConfirmDialogProps { open: boolean; onOpenChange: (open: boolean) => void; title: string; description: string; onConfirm: () => void; confirmText?: string; cancelText?: string; confirmVariant?: | "default" | "destructive" | "outline" | "secondary" | "ghost" | "link"; loading?: boolean; } export function ConfirmDialog({ open, onOpenChange, title, description, onConfirm, confirmText = "확인", cancelText = "취소", confirmVariant = "default", loading = false, }: ConfirmDialogProps) { const handleConfirm = () => { onConfirm(); onOpenChange(false); }; return ( {title} {description}
); } /** * 폼 다이얼로그 */ export interface FormDialogProps { open: boolean; onOpenChange: (open: boolean) => void; title: string; description?: string; children: React.ReactNode; onSave: () => void; onCancel?: () => void; saveText?: string; cancelText?: string; size?: "sm" | "md" | "lg" | "xl" | "full"; loading?: boolean; disabled?: boolean; } export function FormDialog({ open, onOpenChange, title, description, children, onSave, onCancel, saveText = "저장", cancelText = "취소", size = "md", loading = false, disabled = false, }: FormDialogProps) { const handleCancel = () => { if (onCancel) { onCancel(); } onOpenChange(false); }; const handleSave = () => { onSave(); }; return ( {title} {description && {description}}
{children}
); }