@hua-labs/ui 1.1.0-alpha.0.1 → 1.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -3
- package/dist/advanced-dashboard.js.map +1 -1
- package/dist/advanced-dashboard.mjs +1 -1
- package/dist/advanced.js.map +1 -1
- package/dist/advanced.mjs +1 -1
- package/dist/{chunk-VPOFRDYL.mjs → chunk-627HOIRV.mjs} +2 -2
- package/dist/{chunk-VPOFRDYL.mjs.map → chunk-627HOIRV.mjs.map} +1 -1
- package/dist/{chunk-SGCVGEDR.mjs → chunk-E5PN4LUS.mjs} +2 -2
- package/dist/{chunk-SGCVGEDR.mjs.map → chunk-E5PN4LUS.mjs.map} +1 -1
- package/dist/{chunk-ZQAAB3P4.mjs → chunk-MXGXBG63.mjs} +2 -2
- package/dist/{chunk-ZQAAB3P4.mjs.map → chunk-MXGXBG63.mjs.map} +1 -1
- package/dist/{chunk-YY6ZBUVJ.mjs → chunk-R5KCFRYV.mjs} +2 -2
- package/dist/{chunk-YY6ZBUVJ.mjs.map → chunk-R5KCFRYV.mjs.map} +1 -1
- package/dist/{chunk-DMYT7RZ4.mjs → chunk-UGSYQDR4.mjs} +2 -2
- package/dist/{chunk-DMYT7RZ4.mjs.map → chunk-UGSYQDR4.mjs.map} +1 -1
- package/dist/{chunk-QXBMXCML.mjs → chunk-VU264VFN.mjs} +2 -2
- package/dist/{chunk-QXBMXCML.mjs.map → chunk-VU264VFN.mjs.map} +1 -1
- package/dist/{chunk-6NXF6ATP.mjs → chunk-ZFS4B5QT.mjs} +2 -2
- package/dist/{chunk-6NXF6ATP.mjs.map → chunk-ZFS4B5QT.mjs.map} +1 -1
- package/dist/feedback.js +1 -1
- package/dist/feedback.js.map +1 -1
- package/dist/feedback.mjs +1 -1
- package/dist/form.js.map +1 -1
- package/dist/form.mjs +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/lib/icon-providers.d.ts +2 -3
- package/dist/lib/icon-providers.d.ts.map +1 -1
- package/dist/navigation.js.map +1 -1
- package/dist/navigation.mjs +1 -1
- package/package.json +9 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Table.tsx","../src/components/Badge.tsx","../src/components/Skeleton.tsx","../src/components/Tooltip.tsx","../src/components/Dropdown.tsx","../src/components/Drawer.tsx"],"names":["Table","React","className","variant","size","props","ref","getVariantClasses","getSizeClasses","jsx","merge","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","Badge","variantClasses","Skeleton","width","height","animation","getAnimationClasses","defaultDims","finalWidth","finalHeight","SkeletonText","SkeletonCircle","SkeletonRectangle","SkeletonRounded","SkeletonCard","jsxs","SkeletonAvatar","SkeletonImage","SkeletonUserProfile","SkeletonList","_","index","SkeletonTable","Tooltip","content","children","position","delay","disabled","isVisible","setIsVisible","coords","setCoords","timeoutRef","tooltipRef","showTooltip","e","_a","rect","tooltipRect","x","y","hideTooltip","getArrowClasses","TooltipLight","TooltipDark","Dropdown","trigger","controlledOpen","onOpenChange","placement","align","offset","showArrow","internalOpen","setInternalOpen","triggerRef","dropdownRef","isControlled","isOpen","handleOpenChange","newOpen","handleTriggerClick","updatePosition","triggerRect","dropdownRect","viewportWidth","viewportHeight","handleClickOutside","event","getPlacementClasses","DropdownItem","icon","DropdownSeparator","DropdownLabel","DropdownMenu","DropdownGroup","Drawer","open","side","showBackdrop","backdropClassName","closeOnBackdropClick","closeOnEscape","isAnimating","setIsAnimating","timer","handleEscape","sizeClasses","sideClasses","transformClasses","DrawerHeader","showCloseButton","onClose","Icon","DrawerContent","DrawerFooter"],"mappings":"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","file":"chunk-SGCVGEDR.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Table 컴포넌트의 props / Table component props\n * @typedef {Object} TableProps\n * @property {React.ReactNode} children - TableHeader, TableBody, TableFooter 등 / TableHeader, TableBody, TableFooter, etc.\n * @property {\"default\" | \"bordered\" | \"striped\"} [variant=\"default\"] - Table 스타일 변형 / Table style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Table 크기 / Table size\n * @extends {React.HTMLAttributes<HTMLTableElement>}\n */\nexport interface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n children: React.ReactNode\n variant?: \"default\" | \"bordered\" | \"striped\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TableHeader 컴포넌트의 props / TableHeader component props\n * @typedef {Object} TableHeaderProps\n * @property {React.ReactNode} children - TableHead 컴포넌트들 / TableHead components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableBody 컴포넌트의 props / TableBody component props\n * @typedef {Object} TableBodyProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableFooter 컴포넌트의 props / TableFooter component props\n * @typedef {Object} TableFooterProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableRow 컴포넌트의 props / TableRow component props\n * @typedef {Object} TableRowProps\n * @property {React.ReactNode} children - TableHead 또는 TableCell 컴포넌트들 / TableHead or TableCell components\n * @property {\"default\" | \"hover\"} [variant=\"default\"] - Row 스타일 변형 / Row style variant\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\n */\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n children: React.ReactNode\n variant?: \"default\" | \"hover\"\n}\n\n/**\n * TableHead 컴포넌트의 props / TableHead component props\n * @typedef {Object} TableHeadProps\n * @property {React.ReactNode} children - 헤더 셀 내용 / Header cell content\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * TableCell 컴포넌트의 props / TableCell component props\n * @typedef {Object} TableCellProps\n * @property {React.ReactNode} children - 셀 내용 / Cell content\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * Table 컴포넌트 / Table component\n * \n * 데이터를 표 형태로 표시하는 테이블 컴포넌트입니다.\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell과 함께 사용합니다.\n * \n * Table component that displays data in tabular format.\n * Used with TableHeader, TableBody, TableFooter, TableRow, TableHead, and TableCell.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>이름</TableHead>\n * <TableHead>나이</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>홍길동</TableCell>\n * <TableCell>30</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Bordered 스타일 / Bordered style\n * <Table variant=\"bordered\">\n * <TableHeader>\n * <TableRow>\n * <TableHead>항목</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>값</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Striped 스타일, 호버 효과 / Striped style with hover effect\n * <Table variant=\"striped\">\n * <TableBody>\n * <TableRow variant=\"hover\">\n * <TableCell>데이터</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @param {TableProps} props - Table 컴포넌트의 props / Table component props\n * @param {React.Ref<HTMLTableElement>} ref - table 요소 ref / table element ref\n * @returns {JSX.Element} Table 컴포넌트 / Table component\n */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, variant = \"default\", size = \"md\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"bordered\":\n return \"border border-slate-200 dark:border-slate-700 divide-x divide-slate-200 dark:divide-slate-700\"\n case \"striped\":\n return \"divide-y divide-slate-200 dark:divide-slate-700\"\n default:\n return \"\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-sm\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <div className=\"w-full overflow-auto\">\n <table\n ref={ref}\n className={merge(\n \"w-full caption-bottom\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n />\n </div>\n )\n }\n)\nTable.displayName = \"Table\"\n\n/**\n * TableHeader 컴포넌트 / TableHeader component\n * 테이블의 헤더 영역을 표시합니다.\n * Displays the header area of a table.\n * \n * @component\n * @param {TableHeaderProps} props - TableHeader 컴포넌트의 props / TableHeader component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - thead 요소 ref / thead element ref\n * @returns {JSX.Element} TableHeader 컴포넌트 / TableHeader component\n */\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={merge(\"[&_tr]:border-b\", className)} {...props} />\n )\n)\nTableHeader.displayName = \"TableHeader\"\n\n/**\n * TableBody 컴포넌트 / TableBody component\n * 테이블의 본문 영역을 표시합니다.\n * Displays the body area of a table.\n * \n * @component\n * @param {TableBodyProps} props - TableBody 컴포넌트의 props / TableBody component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tbody 요소 ref / tbody element ref\n * @returns {JSX.Element} TableBody 컴포넌트 / TableBody component\n */\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={merge(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n)\nTableBody.displayName = \"TableBody\"\n\n/**\n * TableFooter 컴포넌트 / TableFooter component\n * 테이블의 푸터 영역을 표시합니다.\n * Displays the footer area of a table.\n * \n * @component\n * @param {TableFooterProps} props - TableFooter 컴포넌트의 props / TableFooter component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tfoot 요소 ref / tfoot element ref\n * @returns {JSX.Element} TableFooter 컴포넌트 / TableFooter component\n */\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={merge(\n \"border-t bg-slate-50 dark:bg-slate-800/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableFooter.displayName = \"TableFooter\"\n\n/**\n * TableRow 컴포넌트 / TableRow component\n * 테이블의 행을 표시합니다.\n * Displays a table row.\n * \n * @component\n * @param {TableRowProps} props - TableRow 컴포넌트의 props / TableRow component props\n * @param {React.Ref<HTMLTableRowElement>} ref - tr 요소 ref / tr element ref\n * @returns {JSX.Element} TableRow 컴포넌트 / TableRow component\n */\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"hover\":\n return \"hover:bg-slate-50 dark:hover:bg-slate-800/50\"\n default:\n return \"\"\n }\n }\n\n return (\n <tr\n ref={ref}\n className={merge(\n \"border-b transition-colors data-[state=selected]:bg-slate-50 dark:data-[state=selected]:bg-slate-800/50\",\n getVariantClasses(),\n className\n )}\n {...props}\n />\n )\n }\n)\nTableRow.displayName = \"TableRow\"\n\n/**\n * TableHead 컴포넌트 / TableHead component\n * 테이블의 헤더 셀을 표시합니다.\n * Displays a table header cell.\n * \n * @component\n * @param {TableHeadProps} props - TableHead 컴포넌트의 props / TableHead component props\n * @param {React.Ref<HTMLTableCellElement>} ref - th 요소 ref / th element ref\n * @returns {JSX.Element} TableHead 컴포넌트 / TableHead component\n */\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={merge(\n \"h-12 px-4 text-left align-middle font-medium text-slate-500 dark:text-slate-400 [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableHead.displayName = \"TableHead\"\n\n/**\n * TableCell 컴포넌트 / TableCell component\n * 테이블의 데이터 셀을 표시합니다.\n * Displays a table data cell.\n * \n * @component\n * @param {TableCellProps} props - TableCell 컴포넌트의 props / TableCell component props\n * @param {React.Ref<HTMLTableCellElement>} ref - td 요소 ref / td element ref\n * @returns {JSX.Element} TableCell 컴포넌트 / TableCell component\n */\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={merge(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n)\nTableCell.displayName = \"TableCell\"\n\n/**\n * TableCaption 컴포넌트 / TableCaption component\n * 테이블의 캡션을 표시합니다.\n * Displays a table caption.\n * \n * @component\n * @param {React.HTMLAttributes<HTMLTableCaptionElement>} props - TableCaption 컴포넌트의 props / TableCaption component props\n * @param {React.Ref<HTMLTableCaptionElement>} ref - caption 요소 ref / caption element ref\n * @returns {JSX.Element} TableCaption 컴포넌트 / TableCaption component\n */\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={merge(\"mt-4 text-sm text-slate-500 dark:text-slate-400\", className)}\n {...props}\n />\n )\n)\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n * @typedef {Object} BadgeProps\n * @property {\"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"} [variant=\"default\"] - Badge 스타일 변형 / Badge style variant\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n * \n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n * React.memo로 최적화되어 있어 불필요한 리렌더링을 방지합니다.\n * \n * Small badge component for displaying status or category.\n * Optimized with React.memo to prevent unnecessary re-renders.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Badge>New</Badge>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"error\">오류</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n * \n * @param {BadgeProps} props - Badge 컴포넌트의 props / Badge component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Badge 컴포넌트 / Badge component\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const variantClasses = React.useMemo(() => ({\n default: \"bg-slate-900 text-slate-50 hover:bg-slate-900/80 dark:bg-slate-50 dark:text-slate-900 dark:hover:bg-slate-50/80\",\n secondary: \"bg-slate-100 text-slate-900 hover:bg-slate-100/80 dark:bg-slate-800 dark:text-slate-50 dark:hover:bg-slate-800/80\",\n destructive: \"bg-red-500 text-slate-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/80\",\n error: \"bg-red-500 text-slate-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/80\", // error는 destructive와 동일\n outline: \"text-slate-950 border border-slate-200 hover:bg-slate-100 hover:text-slate-900 dark:border-slate-800 dark:text-slate-50 dark:hover:bg-slate-800 dark:hover:text-slate-50\",\n glass: \"bg-white/20 backdrop-blur-sm border border-white/30 text-white hover:bg-white/30 dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200 dark:hover:bg-slate-700/30\"\n }), [])\n\n return (\n <div\n ref={ref}\n className={merge(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2\",\n variantClasses[variant],\n className\n )}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Skeleton 컴포넌트의 props\n * @typedef {Object} SkeletonProps\n * @property {\"text\" | \"circular\" | \"rectangular\" | \"rounded\"} [variant=\"text\"] - Skeleton 모양\n * @property {string | number} [width] - 너비 (기본값: variant에 따라 다름)\n * @property {string | number} [height] - 높이 (기본값: variant에 따라 다름)\n * @property {\"pulse\" | \"wave\" | \"shimmer\"} [animation=\"pulse\"] - 애니메이션 타입\n * @property {string} [className] - 추가 CSS 클래스\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"text\" | \"circular\" | \"rectangular\" | \"rounded\"\n width?: string | number\n height?: string | number\n animation?: \"pulse\" | \"wave\" | \"shimmer\"\n className?: string\n}\n\n/**\n * Skeleton 컴포넌트 / Skeleton component\n * \n * 로딩 중 콘텐츠의 플레이스홀더를 표시하는 스켈레톤 컴포넌트입니다.\n * 다양한 모양과 애니메이션을 지원합니다.\n * \n * Skeleton component that displays placeholders for content while loading.\n * Supports various shapes and animations.\n * \n * @component\n * @example\n * // 기본 사용 (텍스트) / Basic usage (text)\n * <Skeleton />\n * \n * @example\n * // 원형 아바타 / Circular avatar\n * <Skeleton variant=\"circular\" width={40} height={40} />\n * \n * @example\n * // Wave 애니메이션 / Wave animation\n * <Skeleton \n * variant=\"rounded\" \n * width=\"100%\" \n * height={200}\n * animation=\"wave\"\n * />\n * \n * @param {SkeletonProps} props - Skeleton 컴포넌트의 props / Skeleton component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Skeleton 컴포넌트 / Skeleton component\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({ \n className, \n variant = \"text\",\n width,\n height,\n animation = \"pulse\",\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"circular\":\n return \"rounded-full\"\n case \"rounded\":\n return \"rounded-lg\"\n case \"rectangular\":\n return \"rounded-none\"\n case \"text\":\n default:\n return \"rounded\"\n }\n }\n\n const getAnimationClasses = () => {\n switch (animation) {\n case \"wave\":\n return \"animate-pulse bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] animate-shimmer\"\n case \"shimmer\":\n return \"bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] animate-shimmer\"\n case \"pulse\":\n default:\n return \"animate-pulse bg-gray-200 dark:bg-gray-700\"\n }\n }\n\n const getDefaultDimensions = () => {\n switch (variant) {\n case \"circular\":\n return { width: \"40px\", height: \"40px\" }\n case \"text\":\n return { width: \"100%\", height: \"1em\" }\n case \"rounded\":\n return { width: \"100%\", height: \"200px\" }\n case \"rectangular\":\n return { width: \"100%\", height: \"200px\" }\n default:\n return { width: \"100%\", height: \"1em\" }\n }\n }\n\n const defaultDims = getDefaultDimensions()\n const finalWidth = width || defaultDims.width\n const finalHeight = height || defaultDims.height\n\n return (\n <div\n ref={ref}\n className={merge(\n \"block\",\n getVariantClasses(),\n getAnimationClasses(),\n className\n )}\n style={{\n width: typeof finalWidth === \"number\" ? `${finalWidth}px` : finalWidth,\n height: typeof finalHeight === \"number\" ? `${finalHeight}px` : finalHeight,\n }}\n {...props}\n />\n )\n }\n)\nSkeleton.displayName = \"Skeleton\"\n\n// 편의 컴포넌트들\nexport const SkeletonText = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"text\" className={className} {...props} />\n )\n)\nSkeletonText.displayName = \"SkeletonText\"\n\nexport const SkeletonCircle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"circular\" className={className} {...props} />\n )\n)\nSkeletonCircle.displayName = \"SkeletonCircle\"\n\nexport const SkeletonRectangle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rectangular\" className={className} {...props} />\n )\n)\nSkeletonRectangle.displayName = \"SkeletonRectangle\"\n\nexport const SkeletonRounded = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rounded\" className={className} {...props} />\n )\n)\nSkeletonRounded.displayName = \"SkeletonRounded\"\n\n// 복합 스켈레톤 컴포넌트들\nexport const SkeletonCard = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4 p-6\", className)} // 16px 간격, 24px 패딩\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" /> {/* 16px 높이, 75% 너비 */}\n <SkeletonText className=\"h-3 w-1/2\" /> {/* 12px 높이, 50% 너비 */}\n </div>\n </div>\n <SkeletonRounded className=\"w-full h-32\" /> {/* 128px 높이 */}\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n <SkeletonText className=\"h-4 w-4/6\" />\n </div>\n </div>\n )\n)\nSkeletonCard.displayName = \"SkeletonCard\"\n\nexport const SkeletonAvatar = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center space-x-4\", className)} // 16px 간격\n {...props}\n >\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n )\n)\nSkeletonAvatar.displayName = \"SkeletonAvatar\"\n\nexport const SkeletonImage = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)} // 8px 간격\n {...props}\n >\n <SkeletonRounded className=\"w-full h-48\" /> {/* 192px 높이 */}\n <SkeletonText className=\"h-4 w-1/2\" />\n </div>\n )\n)\nSkeletonImage.displayName = \"SkeletonImage\"\n\nexport const SkeletonUserProfile = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-16 h-16\" /> {/* 64px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-5 w-1/2\" />\n <SkeletonText className=\"h-3 w-1/3\" />\n </div>\n </div>\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n </div>\n </div>\n )\n)\nSkeletonUserProfile.displayName = \"SkeletonUserProfile\"\n\nexport const SkeletonList = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-10 h-10\" /> {/* 40px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n )\n)\nSkeletonList.displayName = \"SkeletonList\"\n\nexport const SkeletonTable = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {/* 헤더 */}\n <div className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n {/* 행들 */}\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n ))}\n </div>\n )\n)\nSkeletonTable.displayName = \"SkeletonTable\"\n\nexport { Skeleton } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Tooltip 컴포넌트의 props / Tooltip component props\n * @typedef {Object} TooltipProps\n * @property {string} content - Tooltip 내용 / Tooltip content\n * @property {React.ReactNode} children - Tooltip이 연결될 요소 / Element to attach tooltip to\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [position=\"top\"] - Tooltip 표시 위치 / Tooltip display position\n * @property {\"default\" | \"light\" | \"dark\"} [variant=\"default\"] - Tooltip 스타일 변형 / Tooltip style variant\n * @property {number} [delay=300] - Tooltip 표시 지연 시간(ms) / Tooltip display delay (ms)\n * @property {boolean} [disabled=false] - Tooltip 비활성화 여부 / Disable tooltip\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\n content: string\n children: React.ReactNode\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\n variant?: \"default\" | \"light\" | \"dark\"\n delay?: number\n disabled?: boolean\n}\n\n/**\n * Tooltip 컴포넌트 / Tooltip component\n * \n * 호버 시 추가 정보를 표시하는 툴팁 컴포넌트입니다.\n * 마우스 호버 시 지연 시간 후 표시됩니다.\n * \n * Tooltip component that displays additional information on hover.\n * Appears after a delay when the mouse hovers over the element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Tooltip content=\"이것은 도움말입니다\">\n * <Button>호버하세요</Button>\n * </Tooltip>\n * \n * @example\n * // 다양한 위치 / Different positions\n * <Tooltip content=\"위치 변경\" position=\"bottom\">\n * <Icon name=\"info\" />\n * </Tooltip>\n * \n * @example\n * // 커스텀 스타일 / Custom styles\n * <Tooltip content=\"라이트 스타일\" variant=\"light\" delay={500}>\n * <span>호버</span>\n * </Tooltip>\n * \n * @param {TooltipProps} props - Tooltip 컴포넌트의 props / Tooltip component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Tooltip 컴포넌트 / Tooltip component\n * \n * @todo 접근성 개선: role=\"tooltip\" 추가 필요 / Accessibility: Add role=\"tooltip\"\n * @todo 접근성 개선: aria-describedby 연결 필요 / Accessibility: Connect aria-describedby\n * @todo 접근성 개선: 키보드 포커스 시 Tooltip 표시 필요 / Accessibility: Show tooltip on keyboard focus\n */\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n ({ \n className, \n content,\n children,\n position = \"top\",\n variant = \"default\",\n delay = 300,\n disabled = false,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const timeoutRef = React.useRef<number | undefined>(undefined)\n const tooltipRef = React.useRef<HTMLDivElement>(null)\n\n const showTooltip = (e: React.MouseEvent) => {\n if (disabled) return\n \n const rect = e.currentTarget.getBoundingClientRect()\n const tooltipRect = tooltipRef.current?.getBoundingClientRect()\n \n let x = 0\n let y = 0\n \n switch (position) {\n case \"top\":\n x = rect.left + rect.width / 2\n y = rect.top - 8 // 8px 간격\n break\n case \"bottom\":\n x = rect.left + rect.width / 2\n y = rect.bottom + 8 // 8px 간격\n break\n case \"left\":\n x = rect.left - 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n case \"right\":\n x = rect.right + 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n }\n \n setCoords({ x, y })\n \n timeoutRef.current = window.setTimeout(() => {\n setIsVisible(true)\n }, delay)\n }\n\n const hideTooltip = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n setIsVisible(false)\n }\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n const getVariantClasses = () => {\n switch (variant) {\n case \"light\":\n return \"bg-white text-gray-900 border border-gray-200 shadow-lg\"\n case \"dark\":\n return \"bg-gray-900 text-white shadow-lg\"\n default:\n return \"bg-gray-800 text-white shadow-lg\"\n }\n }\n\n const getPositionClasses = () => {\n switch (position) {\n case \"top\":\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-1/2 -translate-x-1/2 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-1/2 -translate-y-1/2 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-1/2 -translate-y-1/2 ml-2\" // 8px 간격\n default:\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (position) {\n case \"top\":\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800\"\n default:\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"relative inline-block\", className)}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n {...props}\n >\n {children}\n \n {isVisible && (\n <div\n ref={tooltipRef}\n className={merge(\n \"fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none\", // 12px, 8px 패딩\n getVariantClasses()\n )}\n style={{\n left: `${coords.x}px`,\n top: `${coords.y}px`,\n transform: 'translate(-50%, -50%)'\n }}\n >\n {content}\n {/* 화살표 */}\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n </div>\n )}\n </div>\n )\n }\n)\nTooltip.displayName = \"Tooltip\"\n\n// 편의 컴포넌트들\nexport const TooltipLight = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"light\" className={className} {...props} />\n )\n)\nTooltipLight.displayName = \"TooltipLight\"\n\nexport const TooltipDark = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"dark\" className={className} {...props} />\n )\n)\nTooltipDark.displayName = \"TooltipDark\"\n\nexport { Tooltip } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Dropdown 컴포넌트의 props / Dropdown component props\n * @typedef {Object} DropdownProps\n * @property {React.ReactNode} trigger - Dropdown을 열기 위한 트리거 요소 / Trigger element to open dropdown\n * @property {React.ReactNode} children - Dropdown 내용 / Dropdown content\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [placement=\"bottom\"] - Dropdown 표시 위치 / Dropdown display position\n * @property {\"start\" | \"center\" | \"end\"} [align=\"start\"] - Dropdown 정렬 / Dropdown alignment\n * @property {number} [offset=8] - 트리거와 Dropdown 사이 간격 (px) / Spacing between trigger and dropdown (px)\n * @property {boolean} [disabled=false] - Dropdown 비활성화 여부 / Disable dropdown\n * @property {boolean} [showArrow=true] - 화살표 표시 여부 / Show arrow\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {\n trigger: React.ReactNode\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\"\n align?: \"start\" | \"center\" | \"end\"\n offset?: number\n disabled?: boolean\n showArrow?: boolean\n}\n\n/**\n * Dropdown 컴포넌트 / Dropdown component\n * \n * 트리거 요소를 클릭하면 표시되는 드롭다운 메뉴 컴포넌트입니다.\n * 외부 클릭 시 자동으로 닫히며, 뷰포트 경계를 자동으로 감지하여 위치를 조정합니다.\n * \n * Dropdown menu component that appears when the trigger element is clicked.\n * Automatically closes on outside click and adjusts position by detecting viewport boundaries.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Dropdown trigger={<Button>메뉴</Button>}>\n * <Menu>\n * <MenuItem>항목 1</MenuItem>\n * <MenuItem>항목 2</MenuItem>\n * </Menu>\n * </Dropdown>\n * \n * @example\n * // 제어 모드, 화살표 없음 / Controlled mode, no arrow\n * const [open, setOpen] = useState(false)\n * <Dropdown \n * open={open}\n * onOpenChange={setOpen}\n * trigger={<Button>제어 모드</Button>}\n * placement=\"top\"\n * showArrow={false}\n * >\n * <div className=\"p-4\">내용</div>\n * </Dropdown>\n * \n * @param {DropdownProps} props - Dropdown 컴포넌트의 props / Dropdown component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Dropdown 컴포넌트 / Dropdown component\n */\nconst Dropdown = React.forwardRef<HTMLDivElement, DropdownProps>(\n ({ \n className, \n trigger,\n children,\n open: controlledOpen,\n onOpenChange,\n placement = \"bottom\",\n align = \"start\",\n offset = 8,\n disabled = false,\n showArrow = true,\n ...props \n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const triggerRef = React.useRef<HTMLDivElement>(null)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const handleOpenChange = (newOpen: boolean) => {\n if (disabled) return\n \n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }\n\n const handleTriggerClick = () => {\n handleOpenChange(!isOpen)\n }\n\n const updatePosition = React.useCallback(() => {\n if (!triggerRef.current || !dropdownRef.current) return\n\n const triggerRect = triggerRef.current.getBoundingClientRect()\n const dropdownRect = dropdownRef.current.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let x = 0\n let y = 0\n\n // 기본 위치 계산\n switch (placement) {\n case \"top\":\n x = triggerRect.left\n y = triggerRect.top - offset\n break\n case \"bottom\":\n x = triggerRect.left\n y = triggerRect.bottom + offset\n break\n case \"left\":\n x = triggerRect.left - offset\n y = triggerRect.top\n break\n case \"right\":\n x = triggerRect.right + offset\n y = triggerRect.top\n break\n }\n\n // 정렬 조정\n switch (align) {\n case \"center\":\n if (placement === \"top\" || placement === \"bottom\") {\n x = triggerRect.left + triggerRect.width / 2 - dropdownRect.width / 2\n } else {\n y = triggerRect.top + triggerRect.height / 2 - dropdownRect.height / 2\n }\n break\n case \"end\":\n if (placement === \"top\" || placement === \"bottom\") {\n x = triggerRect.right - dropdownRect.width\n } else {\n y = triggerRect.bottom - dropdownRect.height\n }\n break\n case \"start\":\n default:\n // 기본값은 이미 start 정렬\n break\n }\n\n // 뷰포트 경계 확인 및 조정\n if (x < 8) x = 8 // 8px 여백\n if (x + dropdownRect.width > viewportWidth - 8) {\n x = viewportWidth - dropdownRect.width - 8 // 8px 여백\n }\n if (y < 8) y = 8 // 8px 여백\n if (y + dropdownRect.height > viewportHeight - 8) {\n y = viewportHeight - dropdownRect.height - 8 // 8px 여백\n }\n\n setCoords({ x, y })\n }, [placement, align, offset])\n\n React.useEffect(() => {\n if (isOpen) {\n updatePosition()\n window.addEventListener('resize', updatePosition)\n window.addEventListener('scroll', updatePosition)\n \n return () => {\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('scroll', updatePosition)\n }\n }\n }, [isOpen, updatePosition])\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current && \n dropdownRef.current && \n !triggerRef.current.contains(event.target as Node) &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n handleOpenChange(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }\n }, [isOpen])\n\n const getPlacementClasses = () => {\n switch (placement) {\n case \"top\":\n return \"bottom-full left-0 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-0 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-0 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-0 ml-2\" // 8px 간격\n default:\n return \"top-full left-0 mt-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (placement) {\n case \"top\":\n return \"top-full left-4 -translate-x-1/2 border-t-gray-100 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-4 -translate-y-1/2 border-l-gray-100 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-4 -translate-y-1/2 border-r-gray-100 dark:border-r-gray-800\"\n default:\n return \"bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800\"\n }\n }\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {/* 트리거 */}\n <div\n ref={triggerRef}\n onClick={handleTriggerClick}\n className=\"inline-block cursor-pointer\"\n >\n {trigger}\n </div>\n\n {/* 드롭다운 */}\n {isOpen && (\n <div\n ref={dropdownRef}\n className={merge(\n \"absolute z-50 bg-white dark:bg-gray-800 rounded-lg shadow-xl backdrop-blur-sm\", // 보더 대신 섀도우 사용\n \"min-w-[200px] py-2\", // 16px 패딩\n getPlacementClasses()\n )}\n style={{\n transform: `translate(${coords.x}px, ${coords.y}px)`,\n boxShadow: \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n }}\n >\n {/* 화살표 */}\n {showArrow && (\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n )}\n \n {/* 내용 */}\n <div className=\"relative z-10\">\n {children}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\nDropdown.displayName = \"Dropdown\"\n\n// 드롭다운 아이템 컴포넌트들\nexport interface DropdownItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"destructive\" | \"disabled\"\n}\n\nconst DropdownItem = React.forwardRef<HTMLButtonElement, DropdownItemProps>(\n ({ \n className, \n icon,\n variant = \"default\",\n children,\n disabled,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"destructive\":\n return \"text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20\"\n case \"disabled\":\n return \"text-gray-400 dark:text-gray-500 cursor-not-allowed\"\n default:\n return \"text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700\"\n }\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"w-full flex items-center gap-3 px-4 py-3 text-sm font-medium transition-colors focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-700\", // 16px, 12px 패딩\n getVariantClasses(),\n className\n )}\n disabled={disabled || variant === \"disabled\"}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nDropdownItem.displayName = \"DropdownItem\"\n\nexport interface DropdownSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst DropdownSeparator = React.forwardRef<HTMLDivElement, DropdownSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-gray-200 dark:bg-gray-700 my-2\", className)} // 8px 여백\n {...props}\n />\n )\n)\nDropdownSeparator.displayName = \"DropdownSeparator\"\n\nexport interface DropdownLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst DropdownLabel = React.forwardRef<HTMLDivElement, DropdownLabelProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"px-4 py-2 text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide\", className)} // 16px, 8px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownLabel.displayName = \"DropdownLabel\"\n\n// 편의 컴포넌트들\nconst DropdownMenu = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"py-1\", className)} // 4px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownMenu.displayName = \"DropdownMenu\"\n\nconst DropdownGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-1\", className)} // 4px 간격\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownGroup.displayName = \"DropdownGroup\"\n\nexport { Dropdown, DropdownItem, DropdownSeparator, DropdownLabel, DropdownMenu, DropdownGroup } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Drawer 컴포넌트의 props / Drawer component props\n * @typedef {Object} DrawerProps\n * @property {boolean} open - Drawer 열림/닫힘 상태 / Drawer open/close state\n * @property {(open: boolean) => void} onOpenChange - 상태 변경 콜백 / State change callback\n * @property {React.ReactNode} children - Drawer 내용 / Drawer content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"left\" | \"right\" | \"top\" | \"bottom\"} [side=\"right\"] - Drawer 표시 위치 / Drawer display position\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"} [size=\"md\"] - Drawer 크기 / Drawer size\n * @property {boolean} [showBackdrop=true] - 배경 오버레이 표시 여부 / Show backdrop overlay\n * @property {string} [backdropClassName] - 배경 오버레이 추가 CSS 클래스 / Backdrop overlay additional CSS class\n * @property {boolean} [closeOnBackdropClick=true] - 배경 클릭 시 닫기 여부 / Close on backdrop click\n * @property {boolean} [closeOnEscape=true] - ESC 키로 닫기 여부 / Close on ESC key\n */\ninterface DrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n children: React.ReactNode\n className?: string\n side?: \"left\" | \"right\" | \"top\" | \"bottom\"\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n showBackdrop?: boolean\n backdropClassName?: string\n closeOnBackdropClick?: boolean\n closeOnEscape?: boolean\n}\n\n/**\n * Drawer 컴포넌트 / Drawer component\n * \n * 사이드에서 슬라이드되는 패널 컴포넌트입니다.\n * Modal과 유사하지만 특정 방향에서 슬라이드되는 애니메이션을 제공합니다.\n * ESC 키로 닫기, 배경 클릭으로 닫기 기능을 지원합니다.\n * \n * Panel component that slides from the side.\n * Similar to Modal but provides slide animation from a specific direction.\n * Supports closing with ESC key and backdrop click.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [open, setOpen] = useState(false)\n * \n * <Drawer open={open} onOpenChange={setOpen}>\n * <DrawerHeader>제목</DrawerHeader>\n * <DrawerContent>내용</DrawerContent>\n * <DrawerFooter>\n * <Button onClick={() => setOpen(false)}>닫기</Button>\n * </DrawerFooter>\n * </Drawer>\n * \n * @example\n * // 왼쪽에서 열기 / Open from left\n * <Drawer open={open} onOpenChange={setOpen} side=\"left\" size=\"lg\">\n * <DrawerContent>사이드바 내용</DrawerContent>\n * </Drawer>\n * \n * @param {DrawerProps} props - Drawer 컴포넌트의 props / Drawer component props\n * @param {React.Ref<HTMLDivElement>} ref - Drawer 컨테이너 ref / Drawer container ref\n * @returns {JSX.Element} Drawer 컴포넌트 / Drawer component\n * \n * @todo 접근성 개선: role=\"dialog\", aria-modal=\"true\" 추가 필요 / Accessibility: Add role=\"dialog\", aria-modal=\"true\"\n * @todo 접근성 개선: aria-labelledby, aria-describedby 연결 필요 / Accessibility: Connect aria-labelledby, aria-describedby\n */\nconst Drawer = React.forwardRef<HTMLDivElement, DrawerProps>(\n ({ \n open, \n onOpenChange, \n children, \n className,\n side = \"right\",\n size = \"md\",\n showBackdrop = true,\n backdropClassName,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [isAnimating, setIsAnimating] = React.useState(false)\n\n React.useEffect(() => {\n if (open) {\n setIsVisible(true)\n setIsAnimating(true)\n // 애니메이션 시작을 위한 지연\n const timer = setTimeout(() => setIsAnimating(false), 50)\n return () => clearTimeout(timer)\n } else {\n setIsAnimating(true)\n const timer = setTimeout(() => {\n setIsVisible(false)\n setIsAnimating(false)\n }, 300) // 애니메이션 완료 후 숨김\n return () => clearTimeout(timer)\n }\n }, [open])\n\n React.useEffect(() => {\n if (!closeOnEscape) return\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && open) {\n onOpenChange(false)\n }\n }\n\n if (open) {\n document.addEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"hidden\"\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"\"\n }\n }, [open, closeOnEscape, onOpenChange])\n\n if (!isVisible) return null\n\n const sizeClasses = {\n sm: side === \"left\" || side === \"right\" ? \"w-80\" : \"h-64\",\n md: side === \"left\" || side === \"right\" ? \"w-96\" : \"h-96\",\n lg: side === \"left\" || side === \"right\" ? \"w-[28rem]\" : \"h-[32rem]\",\n xl: side === \"left\" || side === \"right\" ? \"w-[32rem]\" : \"h-[40rem]\",\n full: side === \"left\" || side === \"right\" ? \"w-full\" : \"h-full\"\n }\n\n const sideClasses = {\n left: \"left-0 top-0 h-full translate-x-0\",\n right: \"right-0 top-0 h-full translate-x-0\",\n top: \"top-0 left-0 w-full translate-y-0\",\n bottom: \"bottom-0 left-0 w-full translate-y-0\"\n }\n\n const transformClasses = {\n left: isAnimating ? (open ? \"translate-x-0\" : \"-translate-x-full\") : \"\",\n right: isAnimating ? (open ? \"translate-x-0\" : \"translate-x-full\") : \"\",\n top: isAnimating ? (open ? \"translate-y-0\" : \"-translate-y-full\") : \"\",\n bottom: isAnimating ? (open ? \"translate-y-0\" : \"translate-y-full\") : \"\"\n }\n\n return (\n <div className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n {showBackdrop && (\n <div\n className={merge(\n \"absolute inset-0 bg-black/60 backdrop-blur-md transition-opacity duration-300\",\n isAnimating ? (open ? \"opacity-100\" : \"opacity-0\") : \"\",\n backdropClassName\n )}\n onClick={closeOnBackdropClick ? () => onOpenChange(false) : undefined}\n />\n )}\n\n {/* Drawer Content */}\n <div\n ref={ref}\n className={merge(\n \"absolute bg-white/95 dark:!bg-gray-800/95 backdrop-blur-xl border border-gray-200/50 dark:!border-gray-600/50 shadow-2xl transition-transform duration-300 ease-out\",\n sizeClasses[size],\n sideClasses[side],\n transformClasses[side],\n className\n )}\n {...props}\n >\n {children}\n </div>\n </div>\n )\n }\n)\nDrawer.displayName = \"Drawer\"\n\n/**\n * DrawerHeader 컴포넌트의 props / DrawerHeader component props\n * @typedef {Object} DrawerHeaderProps\n * @property {React.ReactNode} children - 헤더 내용 / Header content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [showCloseButton=true] - 닫기 버튼 표시 여부 / Show close button\n * @property {() => void} [onClose] - 닫기 버튼 클릭 콜백 / Close button click callback\n */\ninterface DrawerHeaderProps {\n children: React.ReactNode\n className?: string\n showCloseButton?: boolean\n onClose?: () => void\n}\n\n/**\n * DrawerHeader 컴포넌트 / DrawerHeader component\n * Drawer의 헤더 영역을 표시합니다.\n * Displays the header area of a Drawer.\n * \n * @component\n * @param {DrawerHeaderProps} props - DrawerHeader 컴포넌트의 props / DrawerHeader component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerHeader 컴포넌트 / DrawerHeader component\n */\nconst DrawerHeader = React.forwardRef<HTMLDivElement, DrawerHeaderProps>(\n ({ children, className, showCloseButton = true, onClose, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-between p-6 border-b border-gray-200/50 dark:border-gray-700/50\", className)}\n {...props}\n >\n <div className=\"flex-1\">{children}</div>\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-gray-100/80 dark:hover:bg-gray-800/80 transition-colors\"\n >\n <Icon name=\"close\" size={20} />\n </button>\n )}\n </div>\n )\n }\n)\nDrawerHeader.displayName = \"DrawerHeader\"\n\n/**\n * DrawerContent 컴포넌트의 props / DrawerContent component props\n * @typedef {Object} DrawerContentProps\n * @property {React.ReactNode} children - 콘텐츠 / Content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface DrawerContentProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * DrawerContent 컴포넌트 / DrawerContent component\n * Drawer의 메인 콘텐츠 영역을 표시합니다.\n * Displays the main content area of a Drawer.\n * \n * @component\n * @param {DrawerContentProps} props - DrawerContent 컴포넌트의 props / DrawerContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerContent 컴포넌트 / DrawerContent component\n */\nconst DrawerContent = React.forwardRef<HTMLDivElement, DrawerContentProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex-1 p-6 overflow-y-auto\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nDrawerContent.displayName = \"DrawerContent\"\n\n/**\n * DrawerFooter 컴포넌트의 props / DrawerFooter component props\n * @typedef {Object} DrawerFooterProps\n * @property {React.ReactNode} children - 푸터 내용 / Footer content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface DrawerFooterProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * DrawerFooter 컴포넌트 / DrawerFooter component\n * Drawer의 푸터 영역을 표시합니다. 주로 액션 버튼을 배치합니다.\n * Displays the footer area of a Drawer. Typically used for action buttons.\n * \n * @component\n * @param {DrawerFooterProps} props - DrawerFooter 컴포넌트의 props / DrawerFooter component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerFooter 컴포넌트 / DrawerFooter component\n */\nconst DrawerFooter = React.forwardRef<HTMLDivElement, DrawerFooterProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-end gap-3 p-6 border-t border-gray-200/50 dark:border-gray-700/50\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nDrawerFooter.displayName = \"DrawerFooter\"\n\nexport { Drawer, DrawerHeader, DrawerContent, DrawerFooter } "]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Table.tsx","../src/components/Badge.tsx","../src/components/Skeleton.tsx","../src/components/Tooltip.tsx","../src/components/Dropdown.tsx","../src/components/Drawer.tsx"],"names":["Table","React","className","variant","size","props","ref","getVariantClasses","getSizeClasses","jsx","merge","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","Badge","variantClasses","Skeleton","width","height","animation","getAnimationClasses","defaultDims","finalWidth","finalHeight","SkeletonText","SkeletonCircle","SkeletonRectangle","SkeletonRounded","SkeletonCard","jsxs","SkeletonAvatar","SkeletonImage","SkeletonUserProfile","SkeletonList","_","index","SkeletonTable","Tooltip","content","children","position","delay","disabled","isVisible","setIsVisible","coords","setCoords","timeoutRef","tooltipRef","showTooltip","e","_a","rect","tooltipRect","x","y","hideTooltip","getArrowClasses","TooltipLight","TooltipDark","Dropdown","trigger","controlledOpen","onOpenChange","placement","align","offset","showArrow","internalOpen","setInternalOpen","triggerRef","dropdownRef","isControlled","isOpen","handleOpenChange","newOpen","handleTriggerClick","updatePosition","triggerRect","dropdownRect","viewportWidth","viewportHeight","handleClickOutside","event","getPlacementClasses","DropdownItem","icon","DropdownSeparator","DropdownLabel","DropdownMenu","DropdownGroup","Drawer","open","side","showBackdrop","backdropClassName","closeOnBackdropClick","closeOnEscape","isAnimating","setIsAnimating","timer","handleEscape","sizeClasses","sideClasses","transformClasses","DrawerHeader","showCloseButton","onClose","Icon","DrawerContent","DrawerFooter"],"mappings":"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","file":"chunk-E5PN4LUS.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Table 컴포넌트의 props / Table component props\n * @typedef {Object} TableProps\n * @property {React.ReactNode} children - TableHeader, TableBody, TableFooter 등 / TableHeader, TableBody, TableFooter, etc.\n * @property {\"default\" | \"bordered\" | \"striped\"} [variant=\"default\"] - Table 스타일 변형 / Table style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Table 크기 / Table size\n * @extends {React.HTMLAttributes<HTMLTableElement>}\n */\nexport interface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n children: React.ReactNode\n variant?: \"default\" | \"bordered\" | \"striped\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TableHeader 컴포넌트의 props / TableHeader component props\n * @typedef {Object} TableHeaderProps\n * @property {React.ReactNode} children - TableHead 컴포넌트들 / TableHead components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableBody 컴포넌트의 props / TableBody component props\n * @typedef {Object} TableBodyProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableFooter 컴포넌트의 props / TableFooter component props\n * @typedef {Object} TableFooterProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableRow 컴포넌트의 props / TableRow component props\n * @typedef {Object} TableRowProps\n * @property {React.ReactNode} children - TableHead 또는 TableCell 컴포넌트들 / TableHead or TableCell components\n * @property {\"default\" | \"hover\"} [variant=\"default\"] - Row 스타일 변형 / Row style variant\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\n */\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n children: React.ReactNode\n variant?: \"default\" | \"hover\"\n}\n\n/**\n * TableHead 컴포넌트의 props / TableHead component props\n * @typedef {Object} TableHeadProps\n * @property {React.ReactNode} children - 헤더 셀 내용 / Header cell content\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * TableCell 컴포넌트의 props / TableCell component props\n * @typedef {Object} TableCellProps\n * @property {React.ReactNode} children - 셀 내용 / Cell content\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * Table 컴포넌트 / Table component\n * \n * 데이터를 표 형태로 표시하는 테이블 컴포넌트입니다.\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell과 함께 사용합니다.\n * \n * Table component that displays data in tabular format.\n * Used with TableHeader, TableBody, TableFooter, TableRow, TableHead, and TableCell.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>이름</TableHead>\n * <TableHead>나이</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>홍길동</TableCell>\n * <TableCell>30</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Bordered 스타일 / Bordered style\n * <Table variant=\"bordered\">\n * <TableHeader>\n * <TableRow>\n * <TableHead>항목</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>값</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Striped 스타일, 호버 효과 / Striped style with hover effect\n * <Table variant=\"striped\">\n * <TableBody>\n * <TableRow variant=\"hover\">\n * <TableCell>데이터</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @param {TableProps} props - Table 컴포넌트의 props / Table component props\n * @param {React.Ref<HTMLTableElement>} ref - table 요소 ref / table element ref\n * @returns {JSX.Element} Table 컴포넌트 / Table component\n */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, variant = \"default\", size = \"md\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"bordered\":\n return \"border border-slate-200 dark:border-slate-700 divide-x divide-slate-200 dark:divide-slate-700\"\n case \"striped\":\n return \"divide-y divide-slate-200 dark:divide-slate-700\"\n default:\n return \"\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-sm\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <div className=\"w-full overflow-auto\">\n <table\n ref={ref}\n className={merge(\n \"w-full caption-bottom\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n />\n </div>\n )\n }\n)\nTable.displayName = \"Table\"\n\n/**\n * TableHeader 컴포넌트 / TableHeader component\n * 테이블의 헤더 영역을 표시합니다.\n * Displays the header area of a table.\n * \n * @component\n * @param {TableHeaderProps} props - TableHeader 컴포넌트의 props / TableHeader component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - thead 요소 ref / thead element ref\n * @returns {JSX.Element} TableHeader 컴포넌트 / TableHeader component\n */\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={merge(\"[&_tr]:border-b\", className)} {...props} />\n )\n)\nTableHeader.displayName = \"TableHeader\"\n\n/**\n * TableBody 컴포넌트 / TableBody component\n * 테이블의 본문 영역을 표시합니다.\n * Displays the body area of a table.\n * \n * @component\n * @param {TableBodyProps} props - TableBody 컴포넌트의 props / TableBody component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tbody 요소 ref / tbody element ref\n * @returns {JSX.Element} TableBody 컴포넌트 / TableBody component\n */\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={merge(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n)\nTableBody.displayName = \"TableBody\"\n\n/**\n * TableFooter 컴포넌트 / TableFooter component\n * 테이블의 푸터 영역을 표시합니다.\n * Displays the footer area of a table.\n * \n * @component\n * @param {TableFooterProps} props - TableFooter 컴포넌트의 props / TableFooter component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tfoot 요소 ref / tfoot element ref\n * @returns {JSX.Element} TableFooter 컴포넌트 / TableFooter component\n */\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={merge(\n \"border-t bg-slate-50 dark:bg-slate-800/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableFooter.displayName = \"TableFooter\"\n\n/**\n * TableRow 컴포넌트 / TableRow component\n * 테이블의 행을 표시합니다.\n * Displays a table row.\n * \n * @component\n * @param {TableRowProps} props - TableRow 컴포넌트의 props / TableRow component props\n * @param {React.Ref<HTMLTableRowElement>} ref - tr 요소 ref / tr element ref\n * @returns {JSX.Element} TableRow 컴포넌트 / TableRow component\n */\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"hover\":\n return \"hover:bg-slate-50 dark:hover:bg-slate-800/50\"\n default:\n return \"\"\n }\n }\n\n return (\n <tr\n ref={ref}\n className={merge(\n \"border-b transition-colors data-[state=selected]:bg-slate-50 dark:data-[state=selected]:bg-slate-800/50\",\n getVariantClasses(),\n className\n )}\n {...props}\n />\n )\n }\n)\nTableRow.displayName = \"TableRow\"\n\n/**\n * TableHead 컴포넌트 / TableHead component\n * 테이블의 헤더 셀을 표시합니다.\n * Displays a table header cell.\n * \n * @component\n * @param {TableHeadProps} props - TableHead 컴포넌트의 props / TableHead component props\n * @param {React.Ref<HTMLTableCellElement>} ref - th 요소 ref / th element ref\n * @returns {JSX.Element} TableHead 컴포넌트 / TableHead component\n */\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={merge(\n \"h-12 px-4 text-left align-middle font-medium text-slate-500 dark:text-slate-400 [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableHead.displayName = \"TableHead\"\n\n/**\n * TableCell 컴포넌트 / TableCell component\n * 테이블의 데이터 셀을 표시합니다.\n * Displays a table data cell.\n * \n * @component\n * @param {TableCellProps} props - TableCell 컴포넌트의 props / TableCell component props\n * @param {React.Ref<HTMLTableCellElement>} ref - td 요소 ref / td element ref\n * @returns {JSX.Element} TableCell 컴포넌트 / TableCell component\n */\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={merge(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n)\nTableCell.displayName = \"TableCell\"\n\n/**\n * TableCaption 컴포넌트 / TableCaption component\n * 테이블의 캡션을 표시합니다.\n * Displays a table caption.\n * \n * @component\n * @param {React.HTMLAttributes<HTMLTableCaptionElement>} props - TableCaption 컴포넌트의 props / TableCaption component props\n * @param {React.Ref<HTMLTableCaptionElement>} ref - caption 요소 ref / caption element ref\n * @returns {JSX.Element} TableCaption 컴포넌트 / TableCaption component\n */\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={merge(\"mt-4 text-sm text-slate-500 dark:text-slate-400\", className)}\n {...props}\n />\n )\n)\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n * @typedef {Object} BadgeProps\n * @property {\"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"} [variant=\"default\"] - Badge 스타일 변형 / Badge style variant\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n * \n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n * React.memo로 최적화되어 있어 불필요한 리렌더링을 방지합니다.\n * \n * Small badge component for displaying status or category.\n * Optimized with React.memo to prevent unnecessary re-renders.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Badge>New</Badge>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"error\">오류</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n * \n * @param {BadgeProps} props - Badge 컴포넌트의 props / Badge component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Badge 컴포넌트 / Badge component\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const variantClasses = React.useMemo(() => ({\n default: \"bg-slate-900 text-slate-50 hover:bg-slate-900/80 dark:bg-slate-50 dark:text-slate-900 dark:hover:bg-slate-50/80\",\n secondary: \"bg-slate-100 text-slate-900 hover:bg-slate-100/80 dark:bg-slate-800 dark:text-slate-50 dark:hover:bg-slate-800/80\",\n destructive: \"bg-red-500 text-slate-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/80\",\n error: \"bg-red-500 text-slate-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/80\", // error는 destructive와 동일\n outline: \"text-slate-950 border border-slate-200 hover:bg-slate-100 hover:text-slate-900 dark:border-slate-800 dark:text-slate-50 dark:hover:bg-slate-800 dark:hover:text-slate-50\",\n glass: \"bg-white/20 backdrop-blur-sm border border-white/30 text-white hover:bg-white/30 dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200 dark:hover:bg-slate-700/30\"\n }), [])\n\n return (\n <div\n ref={ref}\n className={merge(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2\",\n variantClasses[variant],\n className\n )}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Skeleton 컴포넌트의 props\n * @typedef {Object} SkeletonProps\n * @property {\"text\" | \"circular\" | \"rectangular\" | \"rounded\"} [variant=\"text\"] - Skeleton 모양\n * @property {string | number} [width] - 너비 (기본값: variant에 따라 다름)\n * @property {string | number} [height] - 높이 (기본값: variant에 따라 다름)\n * @property {\"pulse\" | \"wave\" | \"shimmer\"} [animation=\"pulse\"] - 애니메이션 타입\n * @property {string} [className] - 추가 CSS 클래스\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"text\" | \"circular\" | \"rectangular\" | \"rounded\"\n width?: string | number\n height?: string | number\n animation?: \"pulse\" | \"wave\" | \"shimmer\"\n className?: string\n}\n\n/**\n * Skeleton 컴포넌트 / Skeleton component\n * \n * 로딩 중 콘텐츠의 플레이스홀더를 표시하는 스켈레톤 컴포넌트입니다.\n * 다양한 모양과 애니메이션을 지원합니다.\n * \n * Skeleton component that displays placeholders for content while loading.\n * Supports various shapes and animations.\n * \n * @component\n * @example\n * // 기본 사용 (텍스트) / Basic usage (text)\n * <Skeleton />\n * \n * @example\n * // 원형 아바타 / Circular avatar\n * <Skeleton variant=\"circular\" width={40} height={40} />\n * \n * @example\n * // Wave 애니메이션 / Wave animation\n * <Skeleton \n * variant=\"rounded\" \n * width=\"100%\" \n * height={200}\n * animation=\"wave\"\n * />\n * \n * @param {SkeletonProps} props - Skeleton 컴포넌트의 props / Skeleton component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Skeleton 컴포넌트 / Skeleton component\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({ \n className, \n variant = \"text\",\n width,\n height,\n animation = \"pulse\",\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"circular\":\n return \"rounded-full\"\n case \"rounded\":\n return \"rounded-lg\"\n case \"rectangular\":\n return \"rounded-none\"\n case \"text\":\n default:\n return \"rounded\"\n }\n }\n\n const getAnimationClasses = () => {\n switch (animation) {\n case \"wave\":\n return \"animate-pulse bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] animate-shimmer\"\n case \"shimmer\":\n return \"bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] animate-shimmer\"\n case \"pulse\":\n default:\n return \"animate-pulse bg-gray-200 dark:bg-gray-700\"\n }\n }\n\n const getDefaultDimensions = () => {\n switch (variant) {\n case \"circular\":\n return { width: \"40px\", height: \"40px\" }\n case \"text\":\n return { width: \"100%\", height: \"1em\" }\n case \"rounded\":\n return { width: \"100%\", height: \"200px\" }\n case \"rectangular\":\n return { width: \"100%\", height: \"200px\" }\n default:\n return { width: \"100%\", height: \"1em\" }\n }\n }\n\n const defaultDims = getDefaultDimensions()\n const finalWidth = width || defaultDims.width\n const finalHeight = height || defaultDims.height\n\n return (\n <div\n ref={ref}\n className={merge(\n \"block\",\n getVariantClasses(),\n getAnimationClasses(),\n className\n )}\n style={{\n width: typeof finalWidth === \"number\" ? `${finalWidth}px` : finalWidth,\n height: typeof finalHeight === \"number\" ? `${finalHeight}px` : finalHeight,\n }}\n {...props}\n />\n )\n }\n)\nSkeleton.displayName = \"Skeleton\"\n\n// 편의 컴포넌트들\nexport const SkeletonText = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"text\" className={className} {...props} />\n )\n)\nSkeletonText.displayName = \"SkeletonText\"\n\nexport const SkeletonCircle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"circular\" className={className} {...props} />\n )\n)\nSkeletonCircle.displayName = \"SkeletonCircle\"\n\nexport const SkeletonRectangle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rectangular\" className={className} {...props} />\n )\n)\nSkeletonRectangle.displayName = \"SkeletonRectangle\"\n\nexport const SkeletonRounded = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rounded\" className={className} {...props} />\n )\n)\nSkeletonRounded.displayName = \"SkeletonRounded\"\n\n// 복합 스켈레톤 컴포넌트들\nexport const SkeletonCard = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4 p-6\", className)} // 16px 간격, 24px 패딩\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" /> {/* 16px 높이, 75% 너비 */}\n <SkeletonText className=\"h-3 w-1/2\" /> {/* 12px 높이, 50% 너비 */}\n </div>\n </div>\n <SkeletonRounded className=\"w-full h-32\" /> {/* 128px 높이 */}\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n <SkeletonText className=\"h-4 w-4/6\" />\n </div>\n </div>\n )\n)\nSkeletonCard.displayName = \"SkeletonCard\"\n\nexport const SkeletonAvatar = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center space-x-4\", className)} // 16px 간격\n {...props}\n >\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n )\n)\nSkeletonAvatar.displayName = \"SkeletonAvatar\"\n\nexport const SkeletonImage = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)} // 8px 간격\n {...props}\n >\n <SkeletonRounded className=\"w-full h-48\" /> {/* 192px 높이 */}\n <SkeletonText className=\"h-4 w-1/2\" />\n </div>\n )\n)\nSkeletonImage.displayName = \"SkeletonImage\"\n\nexport const SkeletonUserProfile = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-16 h-16\" /> {/* 64px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-5 w-1/2\" />\n <SkeletonText className=\"h-3 w-1/3\" />\n </div>\n </div>\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n </div>\n </div>\n )\n)\nSkeletonUserProfile.displayName = \"SkeletonUserProfile\"\n\nexport const SkeletonList = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-10 h-10\" /> {/* 40px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n )\n)\nSkeletonList.displayName = \"SkeletonList\"\n\nexport const SkeletonTable = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {/* 헤더 */}\n <div className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n {/* 행들 */}\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n ))}\n </div>\n )\n)\nSkeletonTable.displayName = \"SkeletonTable\"\n\nexport { Skeleton } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Tooltip 컴포넌트의 props / Tooltip component props\n * @typedef {Object} TooltipProps\n * @property {string} content - Tooltip 내용 / Tooltip content\n * @property {React.ReactNode} children - Tooltip이 연결될 요소 / Element to attach tooltip to\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [position=\"top\"] - Tooltip 표시 위치 / Tooltip display position\n * @property {\"default\" | \"light\" | \"dark\"} [variant=\"default\"] - Tooltip 스타일 변형 / Tooltip style variant\n * @property {number} [delay=300] - Tooltip 표시 지연 시간(ms) / Tooltip display delay (ms)\n * @property {boolean} [disabled=false] - Tooltip 비활성화 여부 / Disable tooltip\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\n content: string\n children: React.ReactNode\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\n variant?: \"default\" | \"light\" | \"dark\"\n delay?: number\n disabled?: boolean\n}\n\n/**\n * Tooltip 컴포넌트 / Tooltip component\n * \n * 호버 시 추가 정보를 표시하는 툴팁 컴포넌트입니다.\n * 마우스 호버 시 지연 시간 후 표시됩니다.\n * \n * Tooltip component that displays additional information on hover.\n * Appears after a delay when the mouse hovers over the element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Tooltip content=\"이것은 도움말입니다\">\n * <Button>호버하세요</Button>\n * </Tooltip>\n * \n * @example\n * // 다양한 위치 / Different positions\n * <Tooltip content=\"위치 변경\" position=\"bottom\">\n * <Icon name=\"info\" />\n * </Tooltip>\n * \n * @example\n * // 커스텀 스타일 / Custom styles\n * <Tooltip content=\"라이트 스타일\" variant=\"light\" delay={500}>\n * <span>호버</span>\n * </Tooltip>\n * \n * @param {TooltipProps} props - Tooltip 컴포넌트의 props / Tooltip component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Tooltip 컴포넌트 / Tooltip component\n * \n * @todo 접근성 개선: role=\"tooltip\" 추가 필요 / Accessibility: Add role=\"tooltip\"\n * @todo 접근성 개선: aria-describedby 연결 필요 / Accessibility: Connect aria-describedby\n * @todo 접근성 개선: 키보드 포커스 시 Tooltip 표시 필요 / Accessibility: Show tooltip on keyboard focus\n */\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n ({ \n className, \n content,\n children,\n position = \"top\",\n variant = \"default\",\n delay = 300,\n disabled = false,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const timeoutRef = React.useRef<number | undefined>(undefined)\n const tooltipRef = React.useRef<HTMLDivElement>(null)\n\n const showTooltip = (e: React.MouseEvent) => {\n if (disabled) return\n \n const rect = e.currentTarget.getBoundingClientRect()\n const tooltipRect = tooltipRef.current?.getBoundingClientRect()\n \n let x = 0\n let y = 0\n \n switch (position) {\n case \"top\":\n x = rect.left + rect.width / 2\n y = rect.top - 8 // 8px 간격\n break\n case \"bottom\":\n x = rect.left + rect.width / 2\n y = rect.bottom + 8 // 8px 간격\n break\n case \"left\":\n x = rect.left - 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n case \"right\":\n x = rect.right + 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n }\n \n setCoords({ x, y })\n \n timeoutRef.current = window.setTimeout(() => {\n setIsVisible(true)\n }, delay)\n }\n\n const hideTooltip = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n setIsVisible(false)\n }\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n const getVariantClasses = () => {\n switch (variant) {\n case \"light\":\n return \"bg-white text-gray-900 border border-gray-200 shadow-lg\"\n case \"dark\":\n return \"bg-gray-900 text-white shadow-lg\"\n default:\n return \"bg-gray-800 text-white shadow-lg\"\n }\n }\n\n const getPositionClasses = () => {\n switch (position) {\n case \"top\":\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-1/2 -translate-x-1/2 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-1/2 -translate-y-1/2 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-1/2 -translate-y-1/2 ml-2\" // 8px 간격\n default:\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (position) {\n case \"top\":\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800\"\n default:\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"relative inline-block\", className)}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n {...props}\n >\n {children}\n \n {isVisible && (\n <div\n ref={tooltipRef}\n className={merge(\n \"fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none\", // 12px, 8px 패딩\n getVariantClasses()\n )}\n style={{\n left: `${coords.x}px`,\n top: `${coords.y}px`,\n transform: 'translate(-50%, -50%)'\n }}\n >\n {content}\n {/* 화살표 */}\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n </div>\n )}\n </div>\n )\n }\n)\nTooltip.displayName = \"Tooltip\"\n\n// 편의 컴포넌트들\nexport const TooltipLight = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"light\" className={className} {...props} />\n )\n)\nTooltipLight.displayName = \"TooltipLight\"\n\nexport const TooltipDark = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"dark\" className={className} {...props} />\n )\n)\nTooltipDark.displayName = \"TooltipDark\"\n\nexport { Tooltip } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Dropdown 컴포넌트의 props / Dropdown component props\n * @typedef {Object} DropdownProps\n * @property {React.ReactNode} trigger - Dropdown을 열기 위한 트리거 요소 / Trigger element to open dropdown\n * @property {React.ReactNode} children - Dropdown 내용 / Dropdown content\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [placement=\"bottom\"] - Dropdown 표시 위치 / Dropdown display position\n * @property {\"start\" | \"center\" | \"end\"} [align=\"start\"] - Dropdown 정렬 / Dropdown alignment\n * @property {number} [offset=8] - 트리거와 Dropdown 사이 간격 (px) / Spacing between trigger and dropdown (px)\n * @property {boolean} [disabled=false] - Dropdown 비활성화 여부 / Disable dropdown\n * @property {boolean} [showArrow=true] - 화살표 표시 여부 / Show arrow\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {\n trigger: React.ReactNode\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\"\n align?: \"start\" | \"center\" | \"end\"\n offset?: number\n disabled?: boolean\n showArrow?: boolean\n}\n\n/**\n * Dropdown 컴포넌트 / Dropdown component\n * \n * 트리거 요소를 클릭하면 표시되는 드롭다운 메뉴 컴포넌트입니다.\n * 외부 클릭 시 자동으로 닫히며, 뷰포트 경계를 자동으로 감지하여 위치를 조정합니다.\n * \n * Dropdown menu component that appears when the trigger element is clicked.\n * Automatically closes on outside click and adjusts position by detecting viewport boundaries.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Dropdown trigger={<Button>메뉴</Button>}>\n * <Menu>\n * <MenuItem>항목 1</MenuItem>\n * <MenuItem>항목 2</MenuItem>\n * </Menu>\n * </Dropdown>\n * \n * @example\n * // 제어 모드, 화살표 없음 / Controlled mode, no arrow\n * const [open, setOpen] = useState(false)\n * <Dropdown \n * open={open}\n * onOpenChange={setOpen}\n * trigger={<Button>제어 모드</Button>}\n * placement=\"top\"\n * showArrow={false}\n * >\n * <div className=\"p-4\">내용</div>\n * </Dropdown>\n * \n * @param {DropdownProps} props - Dropdown 컴포넌트의 props / Dropdown component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Dropdown 컴포넌트 / Dropdown component\n */\nconst Dropdown = React.forwardRef<HTMLDivElement, DropdownProps>(\n ({ \n className, \n trigger,\n children,\n open: controlledOpen,\n onOpenChange,\n placement = \"bottom\",\n align = \"start\",\n offset = 8,\n disabled = false,\n showArrow = true,\n ...props \n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const triggerRef = React.useRef<HTMLDivElement>(null)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const handleOpenChange = (newOpen: boolean) => {\n if (disabled) return\n \n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }\n\n const handleTriggerClick = () => {\n handleOpenChange(!isOpen)\n }\n\n const updatePosition = React.useCallback(() => {\n if (!triggerRef.current || !dropdownRef.current) return\n\n const triggerRect = triggerRef.current.getBoundingClientRect()\n const dropdownRect = dropdownRef.current.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let x = 0\n let y = 0\n\n // 기본 위치 계산\n switch (placement) {\n case \"top\":\n x = triggerRect.left\n y = triggerRect.top - offset\n break\n case \"bottom\":\n x = triggerRect.left\n y = triggerRect.bottom + offset\n break\n case \"left\":\n x = triggerRect.left - offset\n y = triggerRect.top\n break\n case \"right\":\n x = triggerRect.right + offset\n y = triggerRect.top\n break\n }\n\n // 정렬 조정\n switch (align) {\n case \"center\":\n if (placement === \"top\" || placement === \"bottom\") {\n x = triggerRect.left + triggerRect.width / 2 - dropdownRect.width / 2\n } else {\n y = triggerRect.top + triggerRect.height / 2 - dropdownRect.height / 2\n }\n break\n case \"end\":\n if (placement === \"top\" || placement === \"bottom\") {\n x = triggerRect.right - dropdownRect.width\n } else {\n y = triggerRect.bottom - dropdownRect.height\n }\n break\n case \"start\":\n default:\n // 기본값은 이미 start 정렬\n break\n }\n\n // 뷰포트 경계 확인 및 조정\n if (x < 8) x = 8 // 8px 여백\n if (x + dropdownRect.width > viewportWidth - 8) {\n x = viewportWidth - dropdownRect.width - 8 // 8px 여백\n }\n if (y < 8) y = 8 // 8px 여백\n if (y + dropdownRect.height > viewportHeight - 8) {\n y = viewportHeight - dropdownRect.height - 8 // 8px 여백\n }\n\n setCoords({ x, y })\n }, [placement, align, offset])\n\n React.useEffect(() => {\n if (isOpen) {\n updatePosition()\n window.addEventListener('resize', updatePosition)\n window.addEventListener('scroll', updatePosition)\n \n return () => {\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('scroll', updatePosition)\n }\n }\n }, [isOpen, updatePosition])\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current && \n dropdownRef.current && \n !triggerRef.current.contains(event.target as Node) &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n handleOpenChange(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }\n }, [isOpen])\n\n const getPlacementClasses = () => {\n switch (placement) {\n case \"top\":\n return \"bottom-full left-0 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-0 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-0 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-0 ml-2\" // 8px 간격\n default:\n return \"top-full left-0 mt-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (placement) {\n case \"top\":\n return \"top-full left-4 -translate-x-1/2 border-t-gray-100 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-4 -translate-y-1/2 border-l-gray-100 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-4 -translate-y-1/2 border-r-gray-100 dark:border-r-gray-800\"\n default:\n return \"bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800\"\n }\n }\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {/* 트리거 */}\n <div\n ref={triggerRef}\n onClick={handleTriggerClick}\n className=\"inline-block cursor-pointer\"\n >\n {trigger}\n </div>\n\n {/* 드롭다운 */}\n {isOpen && (\n <div\n ref={dropdownRef}\n className={merge(\n \"absolute z-50 bg-white dark:bg-gray-800 rounded-lg shadow-xl backdrop-blur-sm\", // 보더 대신 섀도우 사용\n \"min-w-[200px] py-2\", // 16px 패딩\n getPlacementClasses()\n )}\n style={{\n transform: `translate(${coords.x}px, ${coords.y}px)`,\n boxShadow: \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n }}\n >\n {/* 화살표 */}\n {showArrow && (\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n )}\n \n {/* 내용 */}\n <div className=\"relative z-10\">\n {children}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\nDropdown.displayName = \"Dropdown\"\n\n// 드롭다운 아이템 컴포넌트들\nexport interface DropdownItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"destructive\" | \"disabled\"\n}\n\nconst DropdownItem = React.forwardRef<HTMLButtonElement, DropdownItemProps>(\n ({ \n className, \n icon,\n variant = \"default\",\n children,\n disabled,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"destructive\":\n return \"text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20\"\n case \"disabled\":\n return \"text-gray-400 dark:text-gray-500 cursor-not-allowed\"\n default:\n return \"text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700\"\n }\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"w-full flex items-center gap-3 px-4 py-3 text-sm font-medium transition-colors focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-700\", // 16px, 12px 패딩\n getVariantClasses(),\n className\n )}\n disabled={disabled || variant === \"disabled\"}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nDropdownItem.displayName = \"DropdownItem\"\n\nexport interface DropdownSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst DropdownSeparator = React.forwardRef<HTMLDivElement, DropdownSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-gray-200 dark:bg-gray-700 my-2\", className)} // 8px 여백\n {...props}\n />\n )\n)\nDropdownSeparator.displayName = \"DropdownSeparator\"\n\nexport interface DropdownLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst DropdownLabel = React.forwardRef<HTMLDivElement, DropdownLabelProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"px-4 py-2 text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide\", className)} // 16px, 8px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownLabel.displayName = \"DropdownLabel\"\n\n// 편의 컴포넌트들\nconst DropdownMenu = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"py-1\", className)} // 4px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownMenu.displayName = \"DropdownMenu\"\n\nconst DropdownGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-1\", className)} // 4px 간격\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownGroup.displayName = \"DropdownGroup\"\n\nexport { Dropdown, DropdownItem, DropdownSeparator, DropdownLabel, DropdownMenu, DropdownGroup } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Drawer 컴포넌트의 props / Drawer component props\n * @typedef {Object} DrawerProps\n * @property {boolean} open - Drawer 열림/닫힘 상태 / Drawer open/close state\n * @property {(open: boolean) => void} onOpenChange - 상태 변경 콜백 / State change callback\n * @property {React.ReactNode} children - Drawer 내용 / Drawer content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"left\" | \"right\" | \"top\" | \"bottom\"} [side=\"right\"] - Drawer 표시 위치 / Drawer display position\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"} [size=\"md\"] - Drawer 크기 / Drawer size\n * @property {boolean} [showBackdrop=true] - 배경 오버레이 표시 여부 / Show backdrop overlay\n * @property {string} [backdropClassName] - 배경 오버레이 추가 CSS 클래스 / Backdrop overlay additional CSS class\n * @property {boolean} [closeOnBackdropClick=true] - 배경 클릭 시 닫기 여부 / Close on backdrop click\n * @property {boolean} [closeOnEscape=true] - ESC 키로 닫기 여부 / Close on ESC key\n */\ninterface DrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n children: React.ReactNode\n className?: string\n side?: \"left\" | \"right\" | \"top\" | \"bottom\"\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n showBackdrop?: boolean\n backdropClassName?: string\n closeOnBackdropClick?: boolean\n closeOnEscape?: boolean\n}\n\n/**\n * Drawer 컴포넌트 / Drawer component\n * \n * 사이드에서 슬라이드되는 패널 컴포넌트입니다.\n * Modal과 유사하지만 특정 방향에서 슬라이드되는 애니메이션을 제공합니다.\n * ESC 키로 닫기, 배경 클릭으로 닫기 기능을 지원합니다.\n * \n * Panel component that slides from the side.\n * Similar to Modal but provides slide animation from a specific direction.\n * Supports closing with ESC key and backdrop click.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [open, setOpen] = useState(false)\n * \n * <Drawer open={open} onOpenChange={setOpen}>\n * <DrawerHeader>제목</DrawerHeader>\n * <DrawerContent>내용</DrawerContent>\n * <DrawerFooter>\n * <Button onClick={() => setOpen(false)}>닫기</Button>\n * </DrawerFooter>\n * </Drawer>\n * \n * @example\n * // 왼쪽에서 열기 / Open from left\n * <Drawer open={open} onOpenChange={setOpen} side=\"left\" size=\"lg\">\n * <DrawerContent>사이드바 내용</DrawerContent>\n * </Drawer>\n * \n * @param {DrawerProps} props - Drawer 컴포넌트의 props / Drawer component props\n * @param {React.Ref<HTMLDivElement>} ref - Drawer 컨테이너 ref / Drawer container ref\n * @returns {JSX.Element} Drawer 컴포넌트 / Drawer component\n * \n * @todo 접근성 개선: role=\"dialog\", aria-modal=\"true\" 추가 필요 / Accessibility: Add role=\"dialog\", aria-modal=\"true\"\n * @todo 접근성 개선: aria-labelledby, aria-describedby 연결 필요 / Accessibility: Connect aria-labelledby, aria-describedby\n */\nconst Drawer = React.forwardRef<HTMLDivElement, DrawerProps>(\n ({ \n open, \n onOpenChange, \n children, \n className,\n side = \"right\",\n size = \"md\",\n showBackdrop = true,\n backdropClassName,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [isAnimating, setIsAnimating] = React.useState(false)\n\n React.useEffect(() => {\n if (open) {\n setIsVisible(true)\n setIsAnimating(true)\n // 애니메이션 시작을 위한 지연\n const timer = setTimeout(() => setIsAnimating(false), 50)\n return () => clearTimeout(timer)\n } else {\n setIsAnimating(true)\n const timer = setTimeout(() => {\n setIsVisible(false)\n setIsAnimating(false)\n }, 300) // 애니메이션 완료 후 숨김\n return () => clearTimeout(timer)\n }\n }, [open])\n\n React.useEffect(() => {\n if (!closeOnEscape) return\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && open) {\n onOpenChange(false)\n }\n }\n\n if (open) {\n document.addEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"hidden\"\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"\"\n }\n }, [open, closeOnEscape, onOpenChange])\n\n if (!isVisible) return null\n\n const sizeClasses = {\n sm: side === \"left\" || side === \"right\" ? \"w-80\" : \"h-64\",\n md: side === \"left\" || side === \"right\" ? \"w-96\" : \"h-96\",\n lg: side === \"left\" || side === \"right\" ? \"w-[28rem]\" : \"h-[32rem]\",\n xl: side === \"left\" || side === \"right\" ? \"w-[32rem]\" : \"h-[40rem]\",\n full: side === \"left\" || side === \"right\" ? \"w-full\" : \"h-full\"\n }\n\n const sideClasses = {\n left: \"left-0 top-0 h-full translate-x-0\",\n right: \"right-0 top-0 h-full translate-x-0\",\n top: \"top-0 left-0 w-full translate-y-0\",\n bottom: \"bottom-0 left-0 w-full translate-y-0\"\n }\n\n const transformClasses = {\n left: isAnimating ? (open ? \"translate-x-0\" : \"-translate-x-full\") : \"\",\n right: isAnimating ? (open ? \"translate-x-0\" : \"translate-x-full\") : \"\",\n top: isAnimating ? (open ? \"translate-y-0\" : \"-translate-y-full\") : \"\",\n bottom: isAnimating ? (open ? \"translate-y-0\" : \"translate-y-full\") : \"\"\n }\n\n return (\n <div className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n {showBackdrop && (\n <div\n className={merge(\n \"absolute inset-0 bg-black/60 backdrop-blur-md transition-opacity duration-300\",\n isAnimating ? (open ? \"opacity-100\" : \"opacity-0\") : \"\",\n backdropClassName\n )}\n onClick={closeOnBackdropClick ? () => onOpenChange(false) : undefined}\n />\n )}\n\n {/* Drawer Content */}\n <div\n ref={ref}\n className={merge(\n \"absolute bg-white/95 dark:!bg-gray-800/95 backdrop-blur-xl border border-gray-200/50 dark:!border-gray-600/50 shadow-2xl transition-transform duration-300 ease-out\",\n sizeClasses[size],\n sideClasses[side],\n transformClasses[side],\n className\n )}\n {...props}\n >\n {children}\n </div>\n </div>\n )\n }\n)\nDrawer.displayName = \"Drawer\"\n\n/**\n * DrawerHeader 컴포넌트의 props / DrawerHeader component props\n * @typedef {Object} DrawerHeaderProps\n * @property {React.ReactNode} children - 헤더 내용 / Header content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [showCloseButton=true] - 닫기 버튼 표시 여부 / Show close button\n * @property {() => void} [onClose] - 닫기 버튼 클릭 콜백 / Close button click callback\n */\ninterface DrawerHeaderProps {\n children: React.ReactNode\n className?: string\n showCloseButton?: boolean\n onClose?: () => void\n}\n\n/**\n * DrawerHeader 컴포넌트 / DrawerHeader component\n * Drawer의 헤더 영역을 표시합니다.\n * Displays the header area of a Drawer.\n * \n * @component\n * @param {DrawerHeaderProps} props - DrawerHeader 컴포넌트의 props / DrawerHeader component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerHeader 컴포넌트 / DrawerHeader component\n */\nconst DrawerHeader = React.forwardRef<HTMLDivElement, DrawerHeaderProps>(\n ({ children, className, showCloseButton = true, onClose, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-between p-6 border-b border-gray-200/50 dark:border-gray-700/50\", className)}\n {...props}\n >\n <div className=\"flex-1\">{children}</div>\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-gray-100/80 dark:hover:bg-gray-800/80 transition-colors\"\n >\n <Icon name=\"close\" size={20} />\n </button>\n )}\n </div>\n )\n }\n)\nDrawerHeader.displayName = \"DrawerHeader\"\n\n/**\n * DrawerContent 컴포넌트의 props / DrawerContent component props\n * @typedef {Object} DrawerContentProps\n * @property {React.ReactNode} children - 콘텐츠 / Content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface DrawerContentProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * DrawerContent 컴포넌트 / DrawerContent component\n * Drawer의 메인 콘텐츠 영역을 표시합니다.\n * Displays the main content area of a Drawer.\n * \n * @component\n * @param {DrawerContentProps} props - DrawerContent 컴포넌트의 props / DrawerContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerContent 컴포넌트 / DrawerContent component\n */\nconst DrawerContent = React.forwardRef<HTMLDivElement, DrawerContentProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex-1 p-6 overflow-y-auto\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nDrawerContent.displayName = \"DrawerContent\"\n\n/**\n * DrawerFooter 컴포넌트의 props / DrawerFooter component props\n * @typedef {Object} DrawerFooterProps\n * @property {React.ReactNode} children - 푸터 내용 / Footer content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface DrawerFooterProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * DrawerFooter 컴포넌트 / DrawerFooter component\n * Drawer의 푸터 영역을 표시합니다. 주로 액션 버튼을 배치합니다.\n * Displays the footer area of a Drawer. Typically used for action buttons.\n * \n * @component\n * @param {DrawerFooterProps} props - DrawerFooter 컴포넌트의 props / DrawerFooter component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerFooter 컴포넌트 / DrawerFooter component\n */\nconst DrawerFooter = React.forwardRef<HTMLDivElement, DrawerFooterProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-end gap-3 p-6 border-t border-gray-200/50 dark:border-gray-700/50\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nDrawerFooter.displayName = \"DrawerFooter\"\n\nexport { Drawer, DrawerHeader, DrawerContent, DrawerFooter } "]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {l}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import {l}from'./chunk-UGSYQDR4.mjs';import {a}from'./chunk-UUHAXGMO.mjs';import f,{useState,useEffect}from'react';import {jsxs,jsx}from'react/jsx-runtime';var M=f.forwardRef(({className:t,prevPage:e,nextPage:i,showOnMobile:o=false,...n},m)=>!e&&!i?null:jsxs("div",{ref:m,className:a("flex items-center justify-between py-4",!o&&"hidden md:flex",t),...n,children:[jsx("div",{className:"flex-1",children:e&&jsxs("a",{href:e.href,className:"group inline-flex items-center text-sm text-slate-600 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100 transition-colors",children:[jsx(l,{name:"chevronLeft",className:"w-4 h-4 mr-2 transition-transform group-hover:-translate-x-1"}),jsx("span",{className:"hidden sm:inline",children:e.title})]})}),jsx("div",{className:"flex-1 flex justify-end",children:i&&jsxs("a",{href:i.href,className:"group inline-flex items-center text-sm text-slate-600 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100 transition-colors",children:[jsx("span",{className:"hidden sm:inline mr-2",children:i.title}),jsx(l,{name:"chevronRight",className:"w-4 h-4 transition-transform group-hover:translate-x-1"})]})})]}));M.displayName="PageNavigation";function h({className:t,size:e="md",variant:i="default",text:o,color:n="default"}){let m={sm:"w-6 h-6",md:"w-8 h-8",lg:"w-12 h-12",xl:"w-16 h-16"},s={default:"border-gray-300 border-t-gray-600 dark:border-gray-600 dark:border-t-gray-300",primary:"border-blue-300 border-t-blue-600 dark:border-blue-600 dark:border-t-blue-300",secondary:"border-gray-300 border-t-gray-600 dark:border-gray-600 dark:border-t-gray-300",success:"border-green-300 border-t-green-600 dark:border-green-600 dark:border-t-green-300",warning:"border-yellow-300 border-t-yellow-600 dark:border-yellow-600 dark:border-t-yellow-300",error:"border-red-300 border-t-red-600 dark:border-red-600 dark:border-t-red-300",glass:"border-white/30 border-t-white/50 dark:border-slate-600/50 dark:border-t-slate-400/50"},d=()=>{switch(i){case "dots":return jsxs("div",{className:"flex space-x-1",children:[jsx("div",{className:"w-2 h-2 bg-current rounded-full animate-bounce"}),jsx("div",{className:"w-2 h-2 bg-current rounded-full animate-bounce delay-100"}),jsx("div",{className:"w-2 h-2 bg-current rounded-full animate-bounce delay-200"})]});case "bars":return jsxs("div",{className:"flex space-x-1 h-full items-end",children:[jsx("div",{className:"w-1 bg-current animate-pulse",style:{height:"60%"}}),jsx("div",{className:"w-1 bg-current animate-pulse delay-100",style:{height:"80%"}}),jsx("div",{className:"w-1 bg-current animate-pulse delay-200",style:{height:"40%"}}),jsx("div",{className:"w-1 bg-current animate-pulse delay-300",style:{height:"100%"}}),jsx("div",{className:"w-1 bg-current animate-pulse delay-500",style:{height:"70%"}})]});case "ring":return jsx("div",{className:a("animate-spin rounded-full border-2",s[n]||s.default)});case "ripple":return jsxs("div",{className:"relative",children:[jsx("div",{className:a("absolute inset-0 rounded-full border-2 animate-ping",s[n]||s.default)}),jsx("div",{className:a("rounded-full border-2",s[n]||s.default)})]});default:return jsx("div",{className:a("animate-spin rounded-full border-2",s[n]||s.default)})}};return jsxs("div",{className:a("flex flex-col items-center justify-center",t),children:[jsx("div",{className:a(m[e],"text-gray-600 dark:text-gray-400"),children:d()}),o&&jsx("p",{className:"mt-3 text-sm text-gray-600 dark:text-gray-400 text-center",children:o})]})}var u=f.forwardRef(({children:t,className:e,duration:i=300,variant:o="fade",loadingVariant:n="ripple",loadingText:m="\uD398\uC774\uC9C0 \uB85C\uB529 \uC911...",showLoading:s=true,onTransitionStart:d,onTransitionEnd:p},N)=>{let[w,k]=useState(true),[g,T]=useState(false);useEffect(()=>{let L=setTimeout(()=>{k(false),T(true),p==null||p();},i);return d==null||d(),()=>clearTimeout(L)},[i,d,p]);let P={fade:a("transition-opacity duration-300 ease-in-out",g?"opacity-100":"opacity-0"),slide:a("transition-transform duration-300 ease-in-out",g?"translate-x-0":"translate-x-full"),scale:a("transition-all duration-300 ease-in-out",g?"scale-100 opacity-100":"scale-95 opacity-0"),flip:a("transition-all duration-500 ease-in-out",g?"rotate-y-0 opacity-100":"rotate-y-90 opacity-0")};return w&&s?jsx("div",{className:a("flex flex-col items-center justify-center min-h-screen bg-gradient-to-br from-blue-50 to-purple-50 dark:from-slate-900 dark:to-slate-800",e),children:jsx(h,{size:"lg",variant:n,text:m})}):jsx("div",{ref:N,className:a("w-full",P[o],e),style:{transitionDuration:`${i}ms`},children:t})});u.displayName="PageTransition";var H=f.forwardRef((t,e)=>jsx(u,{ref:e,variant:"fade",...t})),S=f.forwardRef((t,e)=>jsx(u,{ref:e,variant:"slide",...t})),O=f.forwardRef((t,e)=>jsx(u,{ref:e,variant:"scale",...t})),E=f.forwardRef((t,e)=>jsx(u,{ref:e,variant:"flip",...t}));H.displayName="FadeTransition";S.displayName="SlideTransition";O.displayName="ScaleTransition";E.displayName="FlipTransition";export{M as a,h as b,u as c};//# sourceMappingURL=chunk-MXGXBG63.mjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-MXGXBG63.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/PageNavigation.tsx","../src/components/LoadingSpinner.tsx","../src/components/PageTransition.tsx"],"names":["PageNavigation","React","className","prevPage","nextPage","showOnMobile","props","ref","jsxs","merge","jsx","Icon","LoadingSpinner","size","variant","text","color","sizeClasses","spinnerColors","renderSpinner","PageTransition","children","duration","loadingVariant","loadingText","showLoading","onTransitionStart","onTransitionEnd","isLoading","setIsLoading","useState","isVisible","setIsVisible","useEffect","timer","transitionClasses","FadeTransition","SlideTransition","ScaleTransition","FlipTransition"],"mappings":"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","file":"chunk-ZQAAB3P4.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * PageNavigation 컴포넌트의 props / PageNavigation component props\n * @typedef {Object} PageNavigationProps\n * @property {Object} [prevPage] - 이전 페이지 정보 / Previous page information\n * @property {string} prevPage.title - 이전 페이지 제목 / Previous page title\n * @property {string} prevPage.href - 이전 페이지 링크 / Previous page link\n * @property {Object} [nextPage] - 다음 페이지 정보 / Next page information\n * @property {string} nextPage.title - 다음 페이지 제목 / Next page title\n * @property {string} nextPage.href - 다음 페이지 링크 / Next page link\n * @property {boolean} [showOnMobile=false] - 모바일에서 표시 여부 / Show on mobile\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface PageNavigationProps extends React.HTMLAttributes<HTMLDivElement> {\n prevPage?: {\n title: string\n href: string\n }\n nextPage?: {\n title: string\n href: string\n }\n showOnMobile?: boolean\n}\n\n/**\n * PageNavigation 컴포넌트 / PageNavigation component\n * \n * 이전/다음 페이지로 이동하는 네비게이션 컴포넌트입니다.\n * 문서 페이지나 가이드 페이지에서 사용하기 적합합니다.\n * \n * Navigation component for moving to previous/next pages.\n * Suitable for documentation or guide pages.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <PageNavigation\n * prevPage={{ title: \"이전 페이지\", href: \"/prev\" }}\n * nextPage={{ title: \"다음 페이지\", href: \"/next\" }}\n * />\n * \n * @param {PageNavigationProps} props - PageNavigation 컴포넌트의 props / PageNavigation component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} PageNavigation 컴포넌트 / PageNavigation component\n */\nconst PageNavigation = React.forwardRef<HTMLDivElement, PageNavigationProps>(\n ({ \n className, \n prevPage, \n nextPage, \n showOnMobile = false,\n ...props \n }, ref) => {\n if (!prevPage && !nextPage) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-center justify-between py-4\",\n !showOnMobile && \"hidden md:flex\",\n className\n )}\n {...props}\n >\n {/* 이전 페이지 */}\n <div className=\"flex-1\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"group inline-flex items-center text-sm text-slate-600 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100 transition-colors\"\n >\n <Icon \n name=\"chevronLeft\" \n className=\"w-4 h-4 mr-2 transition-transform group-hover:-translate-x-1\" \n />\n <span className=\"hidden sm:inline\">{prevPage.title}</span>\n </a>\n )}\n </div>\n\n {/* 다음 페이지 */}\n <div className=\"flex-1 flex justify-end\">\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"group inline-flex items-center text-sm text-slate-600 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100 transition-colors\"\n >\n <span className=\"hidden sm:inline mr-2\">{nextPage.title}</span>\n <Icon \n name=\"chevronRight\" \n className=\"w-4 h-4 transition-transform group-hover:translate-x-1\" \n />\n </a>\n )}\n </div>\n </div>\n )\n }\n)\nPageNavigation.displayName = \"PageNavigation\"\n\nexport { PageNavigation } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @typedef {Object} LoadingSpinnerProps\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\"} [size=\"md\"] - Spinner 크기 / Spinner size\n * @property {\"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"} [variant=\"default\"] - Spinner 애니메이션 타입 / Spinner animation type\n * @property {string} [text] - Spinner 아래 표시할 텍스트 / Text to display below spinner\n * @property {\"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"} [color=\"default\"] - Spinner 색상 / Spinner color\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface LoadingSpinnerProps {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n variant?: \"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"\n text?: string\n color?: \"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"\n className?: string\n}\n\n/**\n * LoadingSpinner 컴포넌트 / LoadingSpinner component\n * \n * 로딩 상태를 표시하는 스피너 컴포넌트입니다.\n * 다양한 애니메이션 타입과 크기를 지원합니다.\n * \n * Spinner component that displays loading state.\n * Supports various animation types and sizes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <LoadingSpinner />\n * \n * @example\n * // 텍스트와 함께 / With text\n * <LoadingSpinner \n * text=\"로딩 중...\"\n * size=\"lg\"\n * color=\"primary\"\n * />\n * \n * @example\n * // 다양한 애니메이션 / Various animations\n * <LoadingSpinner variant=\"dots\" />\n * <LoadingSpinner variant=\"bars\" color=\"success\" />\n * <LoadingSpinner variant=\"ripple\" size=\"xl\" />\n * \n * @param {LoadingSpinnerProps} props - LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @returns {JSX.Element} LoadingSpinner 컴포넌트 / LoadingSpinner component\n */\nexport function LoadingSpinner({ \n className, \n size = \"md\", \n variant = \"default\", \n text, \n color = \"default\" \n}: LoadingSpinnerProps) {\n const sizeClasses = {\n sm: \"w-6 h-6\", // 24px - 더 넉넉한 크기\n md: \"w-8 h-8\", // 32px - 더 넉넉한 크기\n lg: \"w-12 h-12\", // 48px - 더 넉넉한 크기\n xl: \"w-16 h-16\" // 64px - 더 넉넉한 크기\n }\n\n // LoadingSpinner는 border 색상을 사용하므로 특화 색상 시스템 사용\n const spinnerColors: Record<string, string> = {\n default: \"border-gray-300 border-t-gray-600 dark:border-gray-600 dark:border-t-gray-300\",\n primary: \"border-blue-300 border-t-blue-600 dark:border-blue-600 dark:border-t-blue-300\",\n secondary: \"border-gray-300 border-t-gray-600 dark:border-gray-600 dark:border-t-gray-300\",\n success: \"border-green-300 border-t-green-600 dark:border-green-600 dark:border-t-green-300\",\n warning: \"border-yellow-300 border-t-yellow-600 dark:border-yellow-600 dark:border-t-yellow-300\",\n error: \"border-red-300 border-t-red-600 dark:border-red-600 dark:border-t-red-300\",\n glass: \"border-white/30 border-t-white/50 dark:border-slate-600/50 dark:border-t-slate-400/50\"\n }\n\n const renderSpinner = () => {\n switch (variant) {\n case \"dots\":\n return (\n <div className=\"flex space-x-1\">\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-100\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-200\" />\n </div>\n )\n case \"bars\":\n return (\n <div className=\"flex space-x-1 h-full items-end\">\n <div className=\"w-1 bg-current animate-pulse\" style={{ height: '60%' }} />\n <div className=\"w-1 bg-current animate-pulse delay-100\" style={{ height: '80%' }} />\n <div className=\"w-1 bg-current animate-pulse delay-200\" style={{ height: '40%' }} />\n <div className=\"w-1 bg-current animate-pulse delay-300\" style={{ height: '100%' }} />\n <div className=\"w-1 bg-current animate-pulse delay-500\" style={{ height: '70%' }} />\n </div>\n )\n case \"ring\":\n return (\n <div className={merge(\n \"animate-spin rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n case \"ripple\":\n return (\n <div className=\"relative\">\n <div className={merge(\n \"absolute inset-0 rounded-full border-2 animate-ping\",\n spinnerColors[color] || spinnerColors.default\n )} />\n <div className={merge(\n \"rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n </div>\n )\n default:\n return (\n <div className={merge(\n \"animate-spin rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n }\n }\n\n return (\n <div className={merge(\"flex flex-col items-center justify-center\", className)}>\n <div className={merge(sizeClasses[size], \"text-gray-600 dark:text-gray-400\")}>\n {renderSpinner()}\n </div>\n {text && (\n <p className=\"mt-3 text-sm text-gray-600 dark:text-gray-400 text-center\">\n {text}\n </p>\n )}\n </div>\n )\n} ","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { merge } from '../lib/utils'\nimport { LoadingSpinner } from './LoadingSpinner'\n\n/**\n * PageTransition 컴포넌트의 props / PageTransition component props\n * @typedef {Object} PageTransitionProps\n * @property {React.ReactNode} children - 페이지 내용 / Page content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {number} [duration=300] - 전환 지속 시간 (ms) / Transition duration (ms)\n * @property {'fade' | 'slide' | 'scale' | 'flip'} [variant='fade'] - 전환 애니메이션 타입 / Transition animation type\n * @property {'default' | 'dots' | 'bars' | 'ring' | 'ripple'} [loadingVariant='ripple'] - 로딩 스피너 타입 / Loading spinner type\n * @property {string} [loadingText='페이지 로딩 중...'] - 로딩 텍스트 / Loading text\n * @property {boolean} [showLoading=true] - 로딩 표시 여부 / Show loading\n * @property {() => void} [onTransitionStart] - 전환 시작 콜백 / Transition start callback\n * @property {() => void} [onTransitionEnd] - 전환 종료 콜백 / Transition end callback\n */\nexport interface PageTransitionProps {\n children: React.ReactNode\n className?: string\n duration?: number\n variant?: 'fade' | 'slide' | 'scale' | 'flip'\n loadingVariant?: 'default' | 'dots' | 'bars' | 'ring' | 'ripple'\n loadingText?: string\n showLoading?: boolean\n onTransitionStart?: () => void\n onTransitionEnd?: () => void\n}\n\n/**\n * PageTransition 컴포넌트 / PageTransition component\n * \n * 페이지 전환 애니메이션을 제공하는 컴포넌트입니다.\n * 다양한 전환 효과와 로딩 스피너를 지원합니다.\n * \n * Component that provides page transition animations.\n * Supports various transition effects and loading spinners.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <PageTransition>\n * <div>페이지 내용</div>\n * </PageTransition>\n * \n * @example\n * // Slide 전환 / Slide transition\n * <PageTransition\n * variant=\"slide\"\n * duration={500}\n * loadingVariant=\"dots\"\n * >\n * <div>페이지 내용</div>\n * </PageTransition>\n * \n * @param {PageTransitionProps} props - PageTransition 컴포넌트의 props / PageTransition component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} PageTransition 컴포넌트 / PageTransition component\n */\nexport const PageTransition = React.forwardRef<HTMLDivElement, PageTransitionProps>(({\n children,\n className,\n duration = 300,\n variant = 'fade',\n loadingVariant = 'ripple',\n loadingText = '페이지 로딩 중...',\n showLoading = true,\n onTransitionStart,\n onTransitionEnd\n}, ref) => {\n const [isLoading, setIsLoading] = useState(true)\n const [isVisible, setIsVisible] = useState(false)\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsLoading(false)\n setIsVisible(true)\n onTransitionEnd?.()\n }, duration)\n\n onTransitionStart?.()\n\n return () => clearTimeout(timer)\n }, [duration, onTransitionStart, onTransitionEnd])\n\n const transitionClasses = {\n fade: merge(\n 'transition-opacity duration-300 ease-in-out',\n isVisible ? 'opacity-100' : 'opacity-0'\n ),\n slide: merge(\n 'transition-transform duration-300 ease-in-out',\n isVisible ? 'translate-x-0' : 'translate-x-full'\n ),\n scale: merge(\n 'transition-all duration-300 ease-in-out',\n isVisible ? 'scale-100 opacity-100' : 'scale-95 opacity-0'\n ),\n flip: merge(\n 'transition-all duration-500 ease-in-out',\n isVisible ? 'rotate-y-0 opacity-100' : 'rotate-y-90 opacity-0'\n )\n }\n\n if (isLoading && showLoading) {\n return (\n <div className={merge('flex flex-col items-center justify-center min-h-screen bg-gradient-to-br from-blue-50 to-purple-50 dark:from-slate-900 dark:to-slate-800', className)}>\n <LoadingSpinner\n size=\"lg\"\n variant={loadingVariant}\n text={loadingText}\n />\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n 'w-full',\n transitionClasses[variant],\n className\n )}\n style={{ transitionDuration: `${duration}ms` }}\n >\n {children}\n </div>\n )\n})\n\nPageTransition.displayName = 'PageTransition'\n\n// Convenience components for different transition types\nexport const FadeTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"fade\" {...props} />\n))\n\nexport const SlideTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"slide\" {...props} />\n))\n\nexport const ScaleTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"scale\" {...props} />\n))\n\nexport const FlipTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"flip\" {...props} />\n))\n\n// Add displayName for convenience components\nFadeTransition.displayName = 'FadeTransition'\nSlideTransition.displayName = 'SlideTransition'\nScaleTransition.displayName = 'ScaleTransition'\nFlipTransition.displayName = 'FlipTransition' "]}
|
|
1
|
+
{"version":3,"sources":["../src/components/PageNavigation.tsx","../src/components/LoadingSpinner.tsx","../src/components/PageTransition.tsx"],"names":["PageNavigation","React","className","prevPage","nextPage","showOnMobile","props","ref","jsxs","merge","jsx","Icon","LoadingSpinner","size","variant","text","color","sizeClasses","spinnerColors","renderSpinner","PageTransition","children","duration","loadingVariant","loadingText","showLoading","onTransitionStart","onTransitionEnd","isLoading","setIsLoading","useState","isVisible","setIsVisible","useEffect","timer","transitionClasses","FadeTransition","SlideTransition","ScaleTransition","FlipTransition"],"mappings":"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","file":"chunk-MXGXBG63.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * PageNavigation 컴포넌트의 props / PageNavigation component props\n * @typedef {Object} PageNavigationProps\n * @property {Object} [prevPage] - 이전 페이지 정보 / Previous page information\n * @property {string} prevPage.title - 이전 페이지 제목 / Previous page title\n * @property {string} prevPage.href - 이전 페이지 링크 / Previous page link\n * @property {Object} [nextPage] - 다음 페이지 정보 / Next page information\n * @property {string} nextPage.title - 다음 페이지 제목 / Next page title\n * @property {string} nextPage.href - 다음 페이지 링크 / Next page link\n * @property {boolean} [showOnMobile=false] - 모바일에서 표시 여부 / Show on mobile\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface PageNavigationProps extends React.HTMLAttributes<HTMLDivElement> {\n prevPage?: {\n title: string\n href: string\n }\n nextPage?: {\n title: string\n href: string\n }\n showOnMobile?: boolean\n}\n\n/**\n * PageNavigation 컴포넌트 / PageNavigation component\n * \n * 이전/다음 페이지로 이동하는 네비게이션 컴포넌트입니다.\n * 문서 페이지나 가이드 페이지에서 사용하기 적합합니다.\n * \n * Navigation component for moving to previous/next pages.\n * Suitable for documentation or guide pages.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <PageNavigation\n * prevPage={{ title: \"이전 페이지\", href: \"/prev\" }}\n * nextPage={{ title: \"다음 페이지\", href: \"/next\" }}\n * />\n * \n * @param {PageNavigationProps} props - PageNavigation 컴포넌트의 props / PageNavigation component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} PageNavigation 컴포넌트 / PageNavigation component\n */\nconst PageNavigation = React.forwardRef<HTMLDivElement, PageNavigationProps>(\n ({ \n className, \n prevPage, \n nextPage, \n showOnMobile = false,\n ...props \n }, ref) => {\n if (!prevPage && !nextPage) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-center justify-between py-4\",\n !showOnMobile && \"hidden md:flex\",\n className\n )}\n {...props}\n >\n {/* 이전 페이지 */}\n <div className=\"flex-1\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"group inline-flex items-center text-sm text-slate-600 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100 transition-colors\"\n >\n <Icon \n name=\"chevronLeft\" \n className=\"w-4 h-4 mr-2 transition-transform group-hover:-translate-x-1\" \n />\n <span className=\"hidden sm:inline\">{prevPage.title}</span>\n </a>\n )}\n </div>\n\n {/* 다음 페이지 */}\n <div className=\"flex-1 flex justify-end\">\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"group inline-flex items-center text-sm text-slate-600 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100 transition-colors\"\n >\n <span className=\"hidden sm:inline mr-2\">{nextPage.title}</span>\n <Icon \n name=\"chevronRight\" \n className=\"w-4 h-4 transition-transform group-hover:translate-x-1\" \n />\n </a>\n )}\n </div>\n </div>\n )\n }\n)\nPageNavigation.displayName = \"PageNavigation\"\n\nexport { PageNavigation } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @typedef {Object} LoadingSpinnerProps\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\"} [size=\"md\"] - Spinner 크기 / Spinner size\n * @property {\"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"} [variant=\"default\"] - Spinner 애니메이션 타입 / Spinner animation type\n * @property {string} [text] - Spinner 아래 표시할 텍스트 / Text to display below spinner\n * @property {\"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"} [color=\"default\"] - Spinner 색상 / Spinner color\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface LoadingSpinnerProps {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n variant?: \"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"\n text?: string\n color?: \"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"\n className?: string\n}\n\n/**\n * LoadingSpinner 컴포넌트 / LoadingSpinner component\n * \n * 로딩 상태를 표시하는 스피너 컴포넌트입니다.\n * 다양한 애니메이션 타입과 크기를 지원합니다.\n * \n * Spinner component that displays loading state.\n * Supports various animation types and sizes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <LoadingSpinner />\n * \n * @example\n * // 텍스트와 함께 / With text\n * <LoadingSpinner \n * text=\"로딩 중...\"\n * size=\"lg\"\n * color=\"primary\"\n * />\n * \n * @example\n * // 다양한 애니메이션 / Various animations\n * <LoadingSpinner variant=\"dots\" />\n * <LoadingSpinner variant=\"bars\" color=\"success\" />\n * <LoadingSpinner variant=\"ripple\" size=\"xl\" />\n * \n * @param {LoadingSpinnerProps} props - LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @returns {JSX.Element} LoadingSpinner 컴포넌트 / LoadingSpinner component\n */\nexport function LoadingSpinner({ \n className, \n size = \"md\", \n variant = \"default\", \n text, \n color = \"default\" \n}: LoadingSpinnerProps) {\n const sizeClasses = {\n sm: \"w-6 h-6\", // 24px - 더 넉넉한 크기\n md: \"w-8 h-8\", // 32px - 더 넉넉한 크기\n lg: \"w-12 h-12\", // 48px - 더 넉넉한 크기\n xl: \"w-16 h-16\" // 64px - 더 넉넉한 크기\n }\n\n // LoadingSpinner는 border 색상을 사용하므로 특화 색상 시스템 사용\n const spinnerColors: Record<string, string> = {\n default: \"border-gray-300 border-t-gray-600 dark:border-gray-600 dark:border-t-gray-300\",\n primary: \"border-blue-300 border-t-blue-600 dark:border-blue-600 dark:border-t-blue-300\",\n secondary: \"border-gray-300 border-t-gray-600 dark:border-gray-600 dark:border-t-gray-300\",\n success: \"border-green-300 border-t-green-600 dark:border-green-600 dark:border-t-green-300\",\n warning: \"border-yellow-300 border-t-yellow-600 dark:border-yellow-600 dark:border-t-yellow-300\",\n error: \"border-red-300 border-t-red-600 dark:border-red-600 dark:border-t-red-300\",\n glass: \"border-white/30 border-t-white/50 dark:border-slate-600/50 dark:border-t-slate-400/50\"\n }\n\n const renderSpinner = () => {\n switch (variant) {\n case \"dots\":\n return (\n <div className=\"flex space-x-1\">\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-100\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-200\" />\n </div>\n )\n case \"bars\":\n return (\n <div className=\"flex space-x-1 h-full items-end\">\n <div className=\"w-1 bg-current animate-pulse\" style={{ height: '60%' }} />\n <div className=\"w-1 bg-current animate-pulse delay-100\" style={{ height: '80%' }} />\n <div className=\"w-1 bg-current animate-pulse delay-200\" style={{ height: '40%' }} />\n <div className=\"w-1 bg-current animate-pulse delay-300\" style={{ height: '100%' }} />\n <div className=\"w-1 bg-current animate-pulse delay-500\" style={{ height: '70%' }} />\n </div>\n )\n case \"ring\":\n return (\n <div className={merge(\n \"animate-spin rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n case \"ripple\":\n return (\n <div className=\"relative\">\n <div className={merge(\n \"absolute inset-0 rounded-full border-2 animate-ping\",\n spinnerColors[color] || spinnerColors.default\n )} />\n <div className={merge(\n \"rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n </div>\n )\n default:\n return (\n <div className={merge(\n \"animate-spin rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n }\n }\n\n return (\n <div className={merge(\"flex flex-col items-center justify-center\", className)}>\n <div className={merge(sizeClasses[size], \"text-gray-600 dark:text-gray-400\")}>\n {renderSpinner()}\n </div>\n {text && (\n <p className=\"mt-3 text-sm text-gray-600 dark:text-gray-400 text-center\">\n {text}\n </p>\n )}\n </div>\n )\n} ","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { merge } from '../lib/utils'\nimport { LoadingSpinner } from './LoadingSpinner'\n\n/**\n * PageTransition 컴포넌트의 props / PageTransition component props\n * @typedef {Object} PageTransitionProps\n * @property {React.ReactNode} children - 페이지 내용 / Page content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {number} [duration=300] - 전환 지속 시간 (ms) / Transition duration (ms)\n * @property {'fade' | 'slide' | 'scale' | 'flip'} [variant='fade'] - 전환 애니메이션 타입 / Transition animation type\n * @property {'default' | 'dots' | 'bars' | 'ring' | 'ripple'} [loadingVariant='ripple'] - 로딩 스피너 타입 / Loading spinner type\n * @property {string} [loadingText='페이지 로딩 중...'] - 로딩 텍스트 / Loading text\n * @property {boolean} [showLoading=true] - 로딩 표시 여부 / Show loading\n * @property {() => void} [onTransitionStart] - 전환 시작 콜백 / Transition start callback\n * @property {() => void} [onTransitionEnd] - 전환 종료 콜백 / Transition end callback\n */\nexport interface PageTransitionProps {\n children: React.ReactNode\n className?: string\n duration?: number\n variant?: 'fade' | 'slide' | 'scale' | 'flip'\n loadingVariant?: 'default' | 'dots' | 'bars' | 'ring' | 'ripple'\n loadingText?: string\n showLoading?: boolean\n onTransitionStart?: () => void\n onTransitionEnd?: () => void\n}\n\n/**\n * PageTransition 컴포넌트 / PageTransition component\n * \n * 페이지 전환 애니메이션을 제공하는 컴포넌트입니다.\n * 다양한 전환 효과와 로딩 스피너를 지원합니다.\n * \n * Component that provides page transition animations.\n * Supports various transition effects and loading spinners.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <PageTransition>\n * <div>페이지 내용</div>\n * </PageTransition>\n * \n * @example\n * // Slide 전환 / Slide transition\n * <PageTransition\n * variant=\"slide\"\n * duration={500}\n * loadingVariant=\"dots\"\n * >\n * <div>페이지 내용</div>\n * </PageTransition>\n * \n * @param {PageTransitionProps} props - PageTransition 컴포넌트의 props / PageTransition component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} PageTransition 컴포넌트 / PageTransition component\n */\nexport const PageTransition = React.forwardRef<HTMLDivElement, PageTransitionProps>(({\n children,\n className,\n duration = 300,\n variant = 'fade',\n loadingVariant = 'ripple',\n loadingText = '페이지 로딩 중...',\n showLoading = true,\n onTransitionStart,\n onTransitionEnd\n}, ref) => {\n const [isLoading, setIsLoading] = useState(true)\n const [isVisible, setIsVisible] = useState(false)\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsLoading(false)\n setIsVisible(true)\n onTransitionEnd?.()\n }, duration)\n\n onTransitionStart?.()\n\n return () => clearTimeout(timer)\n }, [duration, onTransitionStart, onTransitionEnd])\n\n const transitionClasses = {\n fade: merge(\n 'transition-opacity duration-300 ease-in-out',\n isVisible ? 'opacity-100' : 'opacity-0'\n ),\n slide: merge(\n 'transition-transform duration-300 ease-in-out',\n isVisible ? 'translate-x-0' : 'translate-x-full'\n ),\n scale: merge(\n 'transition-all duration-300 ease-in-out',\n isVisible ? 'scale-100 opacity-100' : 'scale-95 opacity-0'\n ),\n flip: merge(\n 'transition-all duration-500 ease-in-out',\n isVisible ? 'rotate-y-0 opacity-100' : 'rotate-y-90 opacity-0'\n )\n }\n\n if (isLoading && showLoading) {\n return (\n <div className={merge('flex flex-col items-center justify-center min-h-screen bg-gradient-to-br from-blue-50 to-purple-50 dark:from-slate-900 dark:to-slate-800', className)}>\n <LoadingSpinner\n size=\"lg\"\n variant={loadingVariant}\n text={loadingText}\n />\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n 'w-full',\n transitionClasses[variant],\n className\n )}\n style={{ transitionDuration: `${duration}ms` }}\n >\n {children}\n </div>\n )\n})\n\nPageTransition.displayName = 'PageTransition'\n\n// Convenience components for different transition types\nexport const FadeTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"fade\" {...props} />\n))\n\nexport const SlideTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"slide\" {...props} />\n))\n\nexport const ScaleTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"scale\" {...props} />\n))\n\nexport const FlipTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"flip\" {...props} />\n))\n\n// Add displayName for convenience components\nFadeTransition.displayName = 'FadeTransition'\nSlideTransition.displayName = 'SlideTransition'\nScaleTransition.displayName = 'ScaleTransition'\nFlipTransition.displayName = 'FlipTransition' "]}
|