@hua-labs/ui 2.0.2 → 2.1.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 +34 -161
- package/dist/{ComponentLayout-btJq4TjA.d.mts → ComponentLayout-DrZpz0yv.d.mts} +1 -1
- package/dist/Section-BWzyshgX.d.mts +67 -0
- package/dist/advanced/dashboard.d.ts.map +1 -1
- package/dist/advanced-dashboard.d.mts +1 -1
- package/dist/advanced-dashboard.js +4 -4
- package/dist/advanced-dashboard.js.map +1 -1
- package/dist/advanced-dashboard.mjs +3 -3
- package/dist/advanced-dashboard.mjs.map +1 -1
- package/dist/advanced-emotion.mjs +1 -1
- package/dist/advanced-motion.d.mts +65 -1
- package/dist/advanced-motion.js +14 -14
- package/dist/advanced-motion.js.map +1 -1
- package/dist/advanced-motion.mjs +1 -1
- package/dist/advanced.d.mts +4 -4
- package/dist/advanced.js +16 -16
- package/dist/advanced.js.map +1 -1
- package/dist/advanced.mjs +3 -3
- package/dist/advanced.mjs.map +1 -1
- package/dist/chunk-3CCF7U3P.mjs +3 -0
- package/dist/{chunk-IFSEJVOR.mjs.map → chunk-3CCF7U3P.mjs.map} +1 -1
- package/dist/chunk-3GAUTZXQ.mjs +3 -0
- package/dist/{chunk-X7ZIWYRC.mjs.map → chunk-3GAUTZXQ.mjs.map} +1 -1
- package/dist/chunk-42RGFEL2.mjs +3 -0
- package/dist/chunk-42RGFEL2.mjs.map +1 -0
- package/dist/chunk-4NJE7D6X.mjs +3 -0
- package/dist/chunk-4NJE7D6X.mjs.map +1 -0
- package/dist/chunk-6HVJFEDA.mjs +3 -0
- package/dist/{chunk-FSL373O6.mjs.map → chunk-6HVJFEDA.mjs.map} +1 -1
- package/dist/chunk-7OYT3QSY.mjs +3 -0
- package/dist/chunk-7OYT3QSY.mjs.map +1 -0
- package/dist/chunk-ANYZ56VB.mjs +3 -0
- package/dist/{chunk-QQCELXFD.mjs.map → chunk-ANYZ56VB.mjs.map} +1 -1
- package/dist/chunk-AOSXB5JJ.mjs +4 -0
- package/dist/{chunk-GLZKT7JN.mjs.map → chunk-AOSXB5JJ.mjs.map} +1 -1
- package/dist/chunk-B544MRF7.mjs +3 -0
- package/dist/{chunk-SDFHJ4GB.mjs.map → chunk-B544MRF7.mjs.map} +1 -1
- package/dist/chunk-CVWWS25A.mjs +3 -0
- package/dist/chunk-CVWWS25A.mjs.map +1 -0
- package/dist/chunk-DYNBM24D.mjs +3 -0
- package/dist/{chunk-OSCMSA2Q.mjs.map → chunk-DYNBM24D.mjs.map} +1 -1
- package/dist/{chunk-NBJUE7NR.mjs → chunk-FX57OSYG.mjs} +2 -2
- package/dist/{chunk-NBJUE7NR.mjs.map → chunk-FX57OSYG.mjs.map} +1 -1
- package/dist/chunk-IJSYSNM5.mjs +3 -0
- package/dist/{chunk-IN7RWQCJ.mjs.map → chunk-IJSYSNM5.mjs.map} +1 -1
- package/dist/chunk-KJZGOL2Z.mjs +3 -0
- package/dist/{chunk-LOYAJIWO.mjs.map → chunk-KJZGOL2Z.mjs.map} +1 -1
- package/dist/chunk-KYRIUUQP.mjs +3 -0
- package/dist/{chunk-PAEKNQWW.mjs.map → chunk-KYRIUUQP.mjs.map} +1 -1
- package/dist/chunk-LSA7DU3N.mjs +73 -0
- package/dist/chunk-LSA7DU3N.mjs.map +1 -0
- package/dist/chunk-MDLCJASB.mjs +3 -0
- package/dist/{chunk-LH77I6HO.mjs.map → chunk-MDLCJASB.mjs.map} +1 -1
- package/dist/chunk-N56BUOCD.mjs +3 -0
- package/dist/{chunk-XV3Y7QVU.mjs.map → chunk-N56BUOCD.mjs.map} +1 -1
- package/dist/chunk-OFYITQXI.mjs +13 -0
- package/dist/chunk-OFYITQXI.mjs.map +1 -0
- package/dist/chunk-OZNST3EZ.mjs +3 -0
- package/dist/{chunk-SGEP3CQE.mjs.map → chunk-OZNST3EZ.mjs.map} +1 -1
- package/dist/chunk-RS6RKW5U.mjs +13 -0
- package/dist/{chunk-6KTHJ3EL.mjs.map → chunk-RS6RKW5U.mjs.map} +1 -1
- package/dist/{chunk-C4OACMTB.mjs → chunk-TXBZZJNR.mjs} +2 -2
- package/dist/{chunk-C4OACMTB.mjs.map → chunk-TXBZZJNR.mjs.map} +1 -1
- package/dist/chunk-TZ4YSHMC.mjs +3 -0
- package/dist/{chunk-UWHCM3S6.mjs.map → chunk-TZ4YSHMC.mjs.map} +1 -1
- package/dist/chunk-U6CTBZ2U.mjs +3 -0
- package/dist/chunk-U6CTBZ2U.mjs.map +1 -0
- package/dist/{chunk-5BMH7223.mjs → chunk-WP7VFE77.mjs} +2 -2
- package/dist/{chunk-5BMH7223.mjs.map → chunk-WP7VFE77.mjs.map} +1 -1
- package/dist/{chunk-FFH4ZFKS.mjs → chunk-XCZMLKPK.mjs} +2 -2
- package/dist/{chunk-FFH4ZFKS.mjs.map → chunk-XCZMLKPK.mjs.map} +1 -1
- package/dist/chunk-XGHT7WMO.mjs +3 -0
- package/dist/chunk-XGHT7WMO.mjs.map +1 -0
- package/dist/chunk-XL4KTJ4L.mjs +3 -0
- package/dist/{chunk-VWSBJUNI.mjs.map → chunk-XL4KTJ4L.mjs.map} +1 -1
- package/dist/chunk-Z74YUUVT.mjs +3 -0
- package/dist/chunk-Z74YUUVT.mjs.map +1 -0
- package/dist/chunk-ZXZIHU7J.mjs +8 -0
- package/dist/{chunk-N7M6RIN4.mjs.map → chunk-ZXZIHU7J.mjs.map} +1 -1
- package/dist/components/DatePicker.d.ts.map +1 -1
- package/dist/components/Modal.d.ts.map +1 -1
- package/dist/components/Popover.d.ts +2 -0
- package/dist/components/Popover.d.ts.map +1 -1
- package/dist/components/Progress.d.ts +1 -0
- package/dist/components/Progress.d.ts.map +1 -1
- package/dist/components/Section.d.ts +44 -0
- package/dist/components/Section.d.ts.map +1 -0
- package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
- package/dist/components/advanced/DotNav.d.ts +26 -0
- package/dist/components/advanced/DotNav.d.ts.map +1 -0
- package/dist/components/advanced/HorizontalScroll.d.ts +20 -0
- package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -0
- package/dist/components/advanced/ImageReveal.d.ts +24 -0
- package/dist/components/advanced/ImageReveal.d.ts.map +1 -0
- package/dist/components/advanced/index.d.ts +6 -0
- package/dist/components/advanced/index.d.ts.map +1 -1
- package/dist/data.mjs +2 -2
- package/dist/data.mjs.map +1 -1
- package/dist/feedback.mjs +1 -1
- package/dist/form.js +3 -3
- package/dist/form.js.map +1 -1
- package/dist/form.mjs +4 -4
- package/dist/form.mjs.map +1 -1
- package/dist/{icons-Bj_nr8Ba.d.mts → icons-DmhQEH_E.d.mts} +6 -1
- package/dist/index.d.mts +9 -27
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/interactive.js +1 -1
- package/dist/interactive.js.map +1 -1
- package/dist/interactive.mjs +1 -1
- package/dist/interactive.mjs.map +1 -1
- package/dist/landing/LandingAbout.d.ts +3 -0
- package/dist/landing/LandingAbout.d.ts.map +1 -0
- package/dist/landing/LandingCTA.d.ts +3 -0
- package/dist/landing/LandingCTA.d.ts.map +1 -0
- package/dist/landing/LandingContact.d.ts +3 -0
- package/dist/landing/LandingContact.d.ts.map +1 -0
- package/dist/landing/LandingExperience.d.ts +3 -0
- package/dist/landing/LandingExperience.d.ts.map +1 -0
- package/dist/landing/LandingFeatures.d.ts +3 -0
- package/dist/landing/LandingFeatures.d.ts.map +1 -0
- package/dist/landing/LandingHero.d.ts +3 -0
- package/dist/landing/LandingHero.d.ts.map +1 -0
- package/dist/landing/LandingLogoCloud.d.ts +3 -0
- package/dist/landing/LandingLogoCloud.d.ts.map +1 -0
- package/dist/landing/LandingMetrics.d.ts +3 -0
- package/dist/landing/LandingMetrics.d.ts.map +1 -0
- package/dist/landing/LandingProjects.d.ts +3 -0
- package/dist/landing/LandingProjects.d.ts.map +1 -0
- package/dist/landing/LandingProvider.d.ts +4 -0
- package/dist/landing/LandingProvider.d.ts.map +1 -0
- package/dist/landing/LandingShowcase.d.ts +3 -0
- package/dist/landing/LandingShowcase.d.ts.map +1 -0
- package/dist/landing/LandingSkills.d.ts +3 -0
- package/dist/landing/LandingSkills.d.ts.map +1 -0
- package/dist/landing/LandingStats.d.ts +3 -0
- package/dist/landing/LandingStats.d.ts.map +1 -0
- package/dist/landing/LandingTestimonials.d.ts +3 -0
- package/dist/landing/LandingTestimonials.d.ts.map +1 -0
- package/dist/landing/index.d.ts +47 -0
- package/dist/landing/index.d.ts.map +1 -0
- package/dist/landing/themes/app.d.ts +3 -0
- package/dist/landing/themes/app.d.ts.map +1 -0
- package/dist/landing/themes/corporate.d.ts +3 -0
- package/dist/landing/themes/corporate.d.ts.map +1 -0
- package/dist/landing/themes/dashboard.d.ts +3 -0
- package/dist/landing/themes/dashboard.d.ts.map +1 -0
- package/dist/landing/themes/immersive.d.ts +3 -0
- package/dist/landing/themes/immersive.d.ts.map +1 -0
- package/dist/landing/themes/index.d.ts +15 -0
- package/dist/landing/themes/index.d.ts.map +1 -0
- package/dist/landing/themes/marketing.d.ts +3 -0
- package/dist/landing/themes/marketing.d.ts.map +1 -0
- package/dist/landing/themes/portfolio.d.ts +3 -0
- package/dist/landing/themes/portfolio.d.ts.map +1 -0
- package/dist/landing/themes/product.d.ts +3 -0
- package/dist/landing/themes/product.d.ts.map +1 -0
- package/dist/landing/types.d.ts +346 -0
- package/dist/landing/types.d.ts.map +1 -0
- package/dist/landing.d.mts +417 -0
- package/dist/landing.js +100 -0
- package/dist/landing.js.map +1 -0
- package/dist/landing.mjs +31 -0
- package/dist/landing.mjs.map +1 -0
- package/dist/lib/icons.d.ts +6 -1
- package/dist/lib/icons.d.ts.map +1 -1
- package/dist/navigation.d.mts +1 -1
- package/dist/navigation.js +2 -2
- package/dist/navigation.js.map +1 -1
- package/dist/navigation.mjs +1 -1
- package/dist/navigation.mjs.map +1 -1
- package/dist/overlay.d.mts +2 -0
- package/dist/overlay.js +1 -1
- package/dist/overlay.js.map +1 -1
- package/dist/overlay.mjs +1 -1
- package/dist/overlay.mjs.map +1 -1
- package/dist/sdui.js +4 -4
- package/dist/sdui.js.map +1 -1
- package/dist/sdui.mjs +1 -1
- package/dist/sdui.mjs.map +1 -1
- package/package.json +18 -7
- package/src/styles/landing.css +107 -0
- package/src/styles/utilities.css +58 -0
- package/dist/chunk-6KTHJ3EL.mjs +0 -13
- package/dist/chunk-COR6CDMA.mjs +0 -83
- package/dist/chunk-COR6CDMA.mjs.map +0 -1
- package/dist/chunk-FSL373O6.mjs +0 -3
- package/dist/chunk-GLZKT7JN.mjs +0 -4
- package/dist/chunk-HN5LSP6L.mjs +0 -3
- package/dist/chunk-HN5LSP6L.mjs.map +0 -1
- package/dist/chunk-IFSEJVOR.mjs +0 -3
- package/dist/chunk-IN7RWQCJ.mjs +0 -3
- package/dist/chunk-LH77I6HO.mjs +0 -3
- package/dist/chunk-LOYAJIWO.mjs +0 -3
- package/dist/chunk-LPAG7DCA.mjs +0 -3
- package/dist/chunk-LPAG7DCA.mjs.map +0 -1
- package/dist/chunk-N7M6RIN4.mjs +0 -8
- package/dist/chunk-OSCMSA2Q.mjs +0 -3
- package/dist/chunk-PAEKNQWW.mjs +0 -3
- package/dist/chunk-QQCELXFD.mjs +0 -3
- package/dist/chunk-RPUS7G7Q.mjs +0 -3
- package/dist/chunk-RPUS7G7Q.mjs.map +0 -1
- package/dist/chunk-SDFHJ4GB.mjs +0 -3
- package/dist/chunk-SGEP3CQE.mjs +0 -3
- package/dist/chunk-UUHAXGMO.mjs +0 -3
- package/dist/chunk-UUHAXGMO.mjs.map +0 -1
- package/dist/chunk-UWHCM3S6.mjs +0 -3
- package/dist/chunk-VWSBJUNI.mjs +0 -3
- package/dist/chunk-X7ZIWYRC.mjs +0 -3
- package/dist/chunk-XV3Y7QVU.mjs +0 -3
package/dist/interactive.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../src/lib/icons.ts","../src/lib/case-utils.ts","../src/lib/icon-providers.ts","../src/lib/icon-aliases.ts","../src/lib/normalize-icon-name.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/components/Icon/Icon.tsx","../src/components/Accordion.tsx","../src/components/Tabs.tsx","../src/components/Menu.tsx","../src/components/ContextMenu.tsx","../src/components/Command.tsx"],"names":["merge","inputs","twMerge","clsx","mergeMap","classMap","classes","condition","className","icons","House","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","ListIcon","X","MagnifyingGlass","Gear","ArrowSquareOut","CaretLeft","CaretRight","CaretDown","CaretUp","Pencil","Trash","Plus","Minus","Download","Upload","ArrowClockwise","FloppyDisk","Copy","SpinnerGap","CheckCircle","XCircle","WarningCircle","Info","Check","Circle","Question","User","Users","UserPlus","SignIn","SignOut","Eye","EyeSlash","ChartBar","TrendUp","Pulse","Database","Lightning","FileText","File","Folder","Book","BookOpen","Envelope","ChatCircle","Phone","Image","Video","Camera","Smiley","SmileySad","SmileyMeh","Lock","LockOpen","Shield","Wallet","Key","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","Sparkle","Globe","DeviceMobile","Ticket","Clipboard","WifiHigh","WifiSlash","Cpu","MaskHappy","TextB","TextItalic","TextStrikethrough","TextHOne","Link","Code","FileCode","Quotes","List","ListNumbers","emotionIcons","statusIcons","toCamelCase","str","word","index","PhosphorIcons","LucideIcons","PROJECT_ICONS","initPhosphorIcons","initLucideIcons","getIconFromProvider","iconName","provider","iconMapping","getIconDirect","mappedName","phosphorName1","phosphorName2","lucideName","camelCaseName","match","getIconNameForProvider","ICON_ALIASES","normalizeIconName","camelCased","aliasTarget","defaultIconConfig","IconContext","createContext","useIconContext","useContext","IconComponent","React","name","size","emotion","status","weight","animated","pulse","spin","bounce","variant","ariaLabel","ariaHidden","ref","_a","_b","config","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","iconsaxVariant","isClient","setIsClient","providerReady","setProviderReady","resolvedIcon","baseName","normalized","providerName","iconsaxIcon","variantClasses","jsx","ResolvedIcon","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","props","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon","Accordion","children","type","defaultValue","value","onValueChange","collapsible","openItems","setOpenItems","handleItemToggle","itemValue","newOpenItems","item","itemValues","values","child","childProps","handleKeyDown","e","target","currentValue","currentIndex","newIndex","triggerElement","AccordionItem","disabled","onToggle","isOpen","AccordionTrigger","icon","iconPosition","defaultIcon","contentId","triggerId","jsxs","AccordionContent","dataValue","height","setHeight","contentRef","TabsContent","active","Tabs","orientation","activeTab","setActiveTab","isControlled","handleTabChange","newValue","TabsList","listRef","tabValues","getVariantClasses","getSizeClasses","TabsTrigger","_orientation","handleClick","TabsPills","TabsUnderline","TabsCards","Menu","MenuItem","MenuSeparator","MenuLabel","MenuHorizontal","MenuVertical","MenuCompact","ContextMenu","controlledOpen","onOpenChange","trigger","_placement","_align","_offset","internalOpen","setInternalOpen","coords","setCoords","triggerRef","menuRef","handleOpenChange","newOpen","handleContextMenu","event","x","y","updatePosition","menuRect","viewportWidth","viewportHeight","handleClickOutside","ContextMenuItem","ContextMenuSeparator","ContextMenuLabel","ContextMenuGroup","Command","placeholder","controlledSearchValue","onSearchChange","internalSearchValue","setInternalSearchValue","selectedIndex","setSelectedIndex","commandRef","inputRef","searchValue","handleSearchChange","items","itemCount","prev","selectedItem","CommandInput","CommandList","CommandItem","selected","onSelect","CommandGroup","heading","CommandSeparator","CommandEmpty","CommandDialog"],"mappings":"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","file":"interactive.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\n/**\n * HUA UI의 스마트 클래스 병합 유틸리티\n * clsx와 tailwind-merge를 결합하여 중복 클래스를 자동으로 해결합니다.\n * \n * @param inputs - 병합할 클래스 값들\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * merge(\"px-2 py-1\", \"px-4\") // \"py-1 px-4\"\n * merge(\"text-red-500\", \"text-blue-500\") // \"text-blue-500\"\n * merge(\"bg-white\", \"dark:bg-slate-900\") // \"bg-white dark:bg-slate-900\"\n * ```\n */\nexport function merge(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * 조건부 클래스 병합 유틸리티\n * 조건에 따라 클래스를 선택적으로 병합합니다.\n * \n * @param condition - 클래스를 적용할 조건\n * @param trueClass - 조건이 true일 때 적용할 클래스\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeIf(isActive, \"bg-blue-500\", \"bg-gray-200\")\n * mergeIf(isLoading, \"opacity-50 cursor-not-allowed\")\n * ```\n */\nexport function mergeIf(\n condition: boolean,\n trueClass: ClassValue,\n falseClass?: ClassValue\n) {\n return merge(condition ? trueClass : falseClass || \"\")\n}\n\n/**\n * 상대 시간 포맷팅 유틸리티\n * \n * 날짜를 상대 시간 형식으로 포맷팅합니다 (예: \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * 7일 이상 경과한 경우 절대 날짜를 반환합니다.\n * \n * Formats a date as relative time (e.g., \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * Returns absolute date for dates older than 7 days.\n * \n * @param timestamp - 포맷팅할 날짜 (Date 객체 또는 ISO 문자열) / Date to format (Date object or ISO string)\n * @param locale - 로케일 (기본값: \"ko-KR\") / Locale (default: \"ko-KR\")\n * @returns 포맷팅된 상대 시간 문자열 / Formatted relative time string\n * \n * @example\n * ```tsx\n * formatRelativeTime(new Date()) // \"방금 전\"\n * formatRelativeTime(new Date(Date.now() - 5 * 60000)) // \"5분 전\"\n * formatRelativeTime(new Date(Date.now() - 2 * 3600000)) // \"2시간 전\"\n * formatRelativeTime(new Date(Date.now() - 3 * 86400000)) // \"3일 전\"\n * formatRelativeTime(new Date(\"2024-01-01\")) // \"2024. 1. 1.\" (7일 이상 경과)\n * ```\n */\nexport function formatRelativeTime(timestamp: Date | string, locale = \"ko-KR\"): string {\n const date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return locale === \"ko-KR\" ? \"방금 전\" : \"just now\";\n if (minutes < 60) return locale === \"ko-KR\" ? `${minutes}분 전` : `${minutes}m ago`;\n if (hours < 24) return locale === \"ko-KR\" ? `${hours}시간 전` : `${hours}h ago`;\n if (days < 7) return locale === \"ko-KR\" ? `${days}일 전` : `${days}d ago`;\n return date.toLocaleDateString(locale);\n}\n\n/**\n * 객체 기반 클래스 병합 유틸리티\n * 객체의 키-값 쌍을 기반으로 조건부 클래스를 병합합니다.\n * \n * @param classMap - 클래스 맵 객체\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeMap({\n * \"bg-blue-500\": isPrimary,\n * \"bg-gray-500\": !isPrimary,\n * \"text-white\": true,\n * \"opacity-50\": isDisabled\n * })\n * ```\n */\nexport function mergeMap(classMap: Record<string, boolean | undefined | null>) {\n const classes = Object.entries(classMap)\n .filter(([, condition]) => condition)\n .map(([className]) => className)\n \n return merge(...classes)\n}\n\n// 하위 호환성을 위해 cn도 export (점진적 마이그레이션 지원)\nexport const cn = merge ","/**\n * Core Icons (Phosphor Icons)\n *\n * 핵심 아이콘만 포함하여 번들 크기를 최적화합니다.\n * 나머지 아이콘은 동적 fallback으로 처리됩니다.\n *\n * 포함 기준:\n * 1. sum-diary에서 실제 사용 중인 아이콘\n * 2. UI 컴포넌트에서 자주 사용되는 아이콘\n * 3. 각 카테고리의 대표 아이콘\n *\n * 새로운 아이콘이 필요하면 동적 fallback이 자동으로 처리합니다.\n */\n\nimport {\n // Navigation\n House,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowDown,\n List as ListIcon,\n X,\n MagnifyingGlass,\n Gear,\n ArrowSquareOut,\n CaretLeft,\n CaretRight,\n CaretDown,\n CaretUp,\n\n // Actions\n Pencil,\n Trash,\n Plus,\n Minus,\n Download,\n Upload,\n ArrowClockwise,\n FloppyDisk,\n Copy,\n\n // Text Formatting (Markdown Toolbar)\n TextB,\n TextItalic,\n TextStrikethrough,\n TextHOne,\n Link,\n Code,\n FileCode,\n Quotes,\n List,\n ListNumbers,\n\n // Status & Feedback\n SpinnerGap,\n CheckCircle,\n XCircle,\n WarningCircle,\n Info,\n Check,\n Circle,\n Question,\n\n // User & Auth\n User,\n Users,\n UserPlus,\n SignIn,\n SignOut,\n Eye,\n EyeSlash,\n\n // Data & Analytics\n ChartBar,\n TrendUp,\n Pulse,\n Database,\n Lightning,\n\n // Files & Content\n FileText,\n File,\n Folder,\n Book,\n BookOpen,\n\n // Communication\n Envelope,\n ChatCircle,\n Phone,\n\n // Media\n Image,\n Video,\n Camera,\n\n // Emotions\n Smiley,\n SmileySad,\n SmileyMeh,\n\n // Security\n Lock,\n LockOpen,\n Shield,\n Wallet,\n Key,\n\n // Time & Date\n Clock,\n Calendar,\n CalendarPlus,\n\n // UI Elements\n Bell,\n Heart,\n Star,\n Bookmark,\n Share,\n\n // Theme\n Monitor,\n Sun,\n Moon,\n\n // Additional\n Lightbulb,\n Brain,\n Flag,\n Square,\n Sparkle,\n Globe,\n DeviceMobile,\n Ticket,\n Clipboard,\n WifiHigh,\n WifiSlash,\n Cpu,\n MaskHappy,\n} from '@phosphor-icons/react/dist/ssr'\n\n// 핵심 아이콘 객체 (키는 기존과 동일, 값만 Phosphor로 교체)\nexport const icons = {\n // Navigation\n home: House,\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n arrowUp: ArrowUp,\n arrowDown: ArrowDown,\n menu: ListIcon,\n close: X,\n search: MagnifyingGlass,\n settings: Gear,\n externalLink: ArrowSquareOut,\n chevronLeft: CaretLeft,\n chevronRight: CaretRight,\n chevronDown: CaretDown,\n chevronUp: CaretUp,\n\n // Actions\n edit: Pencil,\n delete: Trash,\n add: Plus,\n remove: Minus,\n download: Download,\n upload: Upload,\n refresh: ArrowClockwise,\n save: FloppyDisk,\n copy: Copy,\n\n // Status & Feedback\n loader: SpinnerGap,\n success: CheckCircle,\n error: XCircle,\n alertCircle: WarningCircle,\n warning: WarningCircle,\n info: Info,\n check: Check,\n circle: Circle,\n helpCircle: Question,\n\n // User & Auth\n user: User,\n users: Users,\n userPlus: UserPlus,\n logIn: SignIn,\n logOut: SignOut,\n eye: Eye,\n eyeOff: EyeSlash,\n\n // Data & Analytics\n chart: ChartBar,\n barChart: ChartBar,\n trendingUp: TrendUp,\n activity: Pulse,\n database: Database,\n zap: Lightning,\n\n // Files & Content\n fileText: FileText,\n file: File,\n folder: Folder,\n book: Book,\n bookOpen: BookOpen,\n\n // Communication\n mail: Envelope,\n message: ChatCircle,\n phone: Phone,\n\n // Media\n image: Image,\n video: Video,\n camera: Camera,\n\n // Emotions\n smile: Smiley,\n frown: SmileySad,\n meh: SmileyMeh,\n\n // Security\n lock: Lock,\n unlock: LockOpen,\n shield: Shield,\n wallet: Wallet,\n key: Key,\n\n // Time & Date\n clock: Clock,\n calendar: Calendar,\n calendarPlus: CalendarPlus,\n\n // UI Elements\n bell: Bell,\n heart: Heart,\n star: Star,\n bookmark: Bookmark,\n share: Share,\n\n // Theme\n monitor: Monitor,\n sun: Sun,\n moon: Moon,\n\n // Additional\n lightbulb: Lightbulb,\n brain: Brain,\n flag: Flag,\n square: Square,\n sparkle: Sparkle,\n sparkles: Sparkle,\n globe: Globe,\n smartphone: DeviceMobile,\n deviceMobile: DeviceMobile,\n floppyDisk: FloppyDisk,\n\n // Connectivity\n ticket: Ticket,\n clipboard: Clipboard,\n wifi: WifiHigh,\n wifiOff: WifiSlash,\n cpu: Cpu,\n mask: MaskHappy,\n\n // Text Formatting (Markdown Toolbar)\n bold: TextB,\n italic: TextItalic,\n strikethrough: TextStrikethrough,\n heading: TextHOne,\n link: Link,\n code: Code,\n fileCode: FileCode,\n quote: Quotes,\n list: List,\n listOrdered: ListNumbers,\n minus: Minus,\n} as const\n\n// 아이콘 이름 타입\nexport type IconName = keyof typeof icons\n\n// 감정별 아이콘 매핑\nexport const emotionIcons = {\n happy: 'smile',\n sad: 'frown',\n neutral: 'meh',\n excited: 'smile',\n angry: 'frown',\n love: 'heart',\n like: 'heart',\n dislike: 'frown',\n} as const\n\n// 상태별 아이콘 매핑\nexport const statusIcons = {\n loading: 'loader',\n success: 'success',\n error: 'error',\n warning: 'warning',\n info: 'info',\n locked: 'lock',\n unlocked: 'unlock',\n visible: 'eye',\n hidden: 'eyeOff',\n} as const\n\n// 아이콘 카테고리별 그룹화 (참고용)\nexport const iconCategories = {\n navigation: ['home', 'arrowLeft', 'arrowRight', 'arrowUp', 'arrowDown', 'menu', 'close', 'search', 'settings', 'externalLink', 'chevronLeft', 'chevronRight', 'chevronDown', 'chevronUp'],\n actions: ['edit', 'delete', 'add', 'remove', 'download', 'upload', 'refresh', 'save', 'copy'],\n status: ['loader', 'success', 'error', 'alertCircle', 'warning', 'info', 'check', 'circle'],\n user: ['user', 'users', 'userPlus', 'logIn', 'logOut', 'eye', 'eyeOff'],\n data: ['chart', 'barChart', 'trendingUp', 'activity', 'database', 'zap'],\n files: ['fileText', 'file', 'folder', 'book'],\n communication: ['mail', 'message', 'phone'],\n media: ['image', 'video', 'camera'],\n emotions: ['smile', 'frown', 'meh'],\n security: ['lock', 'unlock', 'shield'],\n time: ['clock', 'calendar'],\n ui: ['bell', 'heart', 'star', 'bookmark', 'share'],\n theme: ['monitor', 'sun', 'moon'],\n} as const\n","/**\n * Case Conversion Utilities\n *\n * 문자열 케이스 변환 유틸리티 함수들입니다.\n * Utility functions for string case conversion.\n */\n\n/**\n * 문자열을 camelCase로 변환합니다.\n * Converts a string to camelCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns camelCase 문자열 / camelCase string\n *\n * @example\n * toCamelCase('arrow-left') // 'arrowLeft'\n * toCamelCase('arrow_left') // 'arrowLeft'\n * toCamelCase('ArrowLeft') // 'arrowLeft'\n * toCamelCase('arrowLeft') // 'arrowLeft'\n * toCamelCase('HEART') // 'heart'\n */\nexport function toCamelCase(str: string): string {\n if (!str) return str\n\n // 이미 camelCase인지 확인 (kebab/snake가 아니고 첫 글자가 소문자)\n if (!/[-_]/.test(str) && /^[a-z]/.test(str)) {\n return str\n }\n\n // 전체가 대문자인 경우 (HEART, USER 등) → 전체 소문자로\n if (/^[A-Z]+$/.test(str)) {\n return str.toLowerCase()\n }\n\n // PascalCase를 camelCase로 변환 (ArrowLeft → arrowLeft)\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str.charAt(0).toLowerCase() + str.slice(1)\n }\n\n // kebab-case 또는 snake_case를 camelCase로 변환\n return str\n .split(/[-_]/)\n .map((word, index) => {\n if (index === 0) {\n return word.toLowerCase()\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n })\n .join('')\n}\n\n/**\n * 문자열을 PascalCase로 변환합니다.\n * Converts a string to PascalCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns PascalCase 문자열 / PascalCase string\n *\n * @example\n * toPascalCase('arrow-left') // 'ArrowLeft'\n * toPascalCase('arrow_left') // 'ArrowLeft'\n * toPascalCase('arrowLeft') // 'ArrowLeft'\n * toPascalCase('ArrowLeft') // 'ArrowLeft'\n */\nexport function toPascalCase(str: string): string {\n if (!str) return str\n\n // 이미 PascalCase인지 확인\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str\n }\n\n // kebab-case 또는 snake_case가 포함된 경우\n if (/[-_]/.test(str)) {\n return str\n .split(/[-_]/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n }\n\n // camelCase를 PascalCase로 변환\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n","/**\n * Icon Provider System\n *\n * 각 프로바이더별 로딩 전략 / Loading strategies per provider:\n *\n * 1. Phosphor Icons (https://phosphoricons.com) - default\n * - Official package: @phosphor-icons/react (MIT License)\n * - icons.ts에서 정적 import (SSR-safe /dist/ssr)\n * - PROJECT_ICONS 매핑으로 통합 이름 지원\n * - 폴백: initPhosphorIcons()로 동적 namespace 조회\n *\n * 2. Lucide Icons (https://lucide.dev) - deprecated, backward compat\n * - initLucideIcons() 호출 시에만 로드 / Lazy loaded on demand\n * - 향후 제거 예정 / Will be removed in future\n *\n * 3. Iconsax Icons (https://iconsax.io) - separate entry\n * - '@hua-labs/ui/iconsax'에서 import 시 자동 등록\n * - 코어 번들에 포함되지 않음 / Not in core bundle\n * - registerIconsaxResolver()로 lazy 연결\n */\n\nimport { toPascalCase } from './case-utils'\n\n// Phosphor Icons - lazy loaded (전체 namespace import 방지, createContext SSR 이슈)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet PhosphorIcons: any = null\n\n// Lucide Icons - lazy loaded (하위호환, deprecated)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet LucideIcons: any = null\n\n// Iconsax resolver - registered lazily when iconsax entry is loaded\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet iconsaxResolver: ((name: string, variant?: string) => any) | null = null\n\n/**\n * Register iconsax resolver (called from iconsax entry point).\n * Allows the core Icon component to resolve iconsax icons\n * without statically importing the iconsax bundle.\n */\nexport function registerIconsaxResolver(resolver: typeof iconsaxResolver) {\n iconsaxResolver = resolver\n}\n\n/**\n * Get registered iconsax resolver\n */\nexport function getIconsaxResolver() {\n return iconsaxResolver\n}\n\n// Icon Provider Type\nexport type IconProvider = 'lucide' | 'phosphor' | 'iconsax'\n\n// Icon Provider Configuration\nexport interface IconProviderConfig {\n provider: IconProvider\n prefix?: string\n}\n\n/**\n * Project-specific icon list\n * These are the icons actually used in SumUp project\n * Only these icons will be loaded for optimal bundle size\n */\nexport const PROJECT_ICONS = {\n // Navigation & Layout\n 'home': { lucide: 'Home', phosphor: 'House', iconsax: 'Home2' },\n 'layout-dashboard': { lucide: 'LayoutDashboard', phosphor: 'SquaresFour' },\n 'folder': { lucide: 'Folder', phosphor: 'Folder', iconsax: 'Folder' },\n 'alert-circle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'alertCircle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'columns': { lucide: 'Columns', phosphor: 'Columns' },\n 'users': { lucide: 'Users', phosphor: 'Users', iconsax: 'People' },\n 'settings': { lucide: 'Settings', phosphor: 'Gear' },\n 'menu': { lucide: 'Menu', phosphor: 'List', iconsax: 'Menu' },\n 'close': { lucide: 'X', phosphor: 'X', iconsax: 'CloseCircle' },\n 'chevronLeft': { lucide: 'ChevronLeft', phosphor: 'CaretLeft', iconsax: 'ArrowLeft2' },\n 'chevronRight': { lucide: 'ChevronRight', phosphor: 'CaretRight', iconsax: 'ArrowRight2' },\n 'chevronDown': { lucide: 'ChevronDown', phosphor: 'CaretDown', iconsax: 'ArrowDown2' },\n 'chevronUp': { lucide: 'ChevronUp', phosphor: 'CaretUp', iconsax: 'ArrowUp2' },\n 'arrowLeft': { lucide: 'ArrowLeft', phosphor: 'ArrowLeft', iconsax: 'ArrowLeft' },\n 'arrowRight': { lucide: 'ArrowRight', phosphor: 'ArrowRight', iconsax: 'ArrowRight' },\n 'arrowUp': { lucide: 'ArrowUp', phosphor: 'ArrowUp', iconsax: 'ArrowUp' },\n 'arrowDown': { lucide: 'ArrowDown', phosphor: 'ArrowDown', iconsax: 'ArrowDown' },\n\n // Actions\n 'add': { lucide: 'Plus', phosphor: 'Plus', iconsax: 'Add' },\n 'edit': { lucide: 'Edit', phosphor: 'Pencil' },\n 'pencil': { lucide: 'Pencil', phosphor: 'Pencil' },\n 'delete': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'trash': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'upload': { lucide: 'Upload', phosphor: 'Upload', iconsax: 'Upload' },\n 'download': { lucide: 'Download', phosphor: 'Download', iconsax: 'Download' },\n 'x': { lucide: 'X', phosphor: 'X' },\n 'check': { lucide: 'Check', phosphor: 'Check', iconsax: 'Check' },\n 'search': { lucide: 'Search', phosphor: 'MagnifyingGlass', iconsax: 'SearchNormal' },\n 'share': { lucide: 'Share', phosphor: 'Share' },\n 'copy': { lucide: 'Copy', phosphor: 'Copy' },\n 'save': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Status & Feedback\n 'loader': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'loader2': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'check-circle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'checkCircle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'success': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'error': { lucide: 'XCircle', phosphor: 'XCircle', iconsax: 'CloseCircle' },\n 'warning': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Warning2' },\n 'info': { lucide: 'Info', phosphor: 'Info', iconsax: 'InfoCircle' },\n 'refresh': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'refreshCw': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'bell': { lucide: 'Bell', phosphor: 'Bell', iconsax: 'Bell' },\n 'heart': { lucide: 'Heart', phosphor: 'Heart', iconsax: 'Heart' },\n 'star': { lucide: 'Star', phosphor: 'Star', iconsax: 'Star' },\n 'bookmark': { lucide: 'Bookmark', phosphor: 'Bookmark' },\n\n // User & Auth\n 'user': { lucide: 'User', phosphor: 'User', iconsax: 'User' },\n 'userPlus': { lucide: 'UserPlus', phosphor: 'UserPlus', iconsax: 'UserAdd' },\n 'logIn': { lucide: 'LogIn', phosphor: 'SignIn', iconsax: 'Login' },\n 'logOut': { lucide: 'LogOut', phosphor: 'SignOut', iconsax: 'Logout' },\n 'chrome': { lucide: 'Chrome', phosphor: 'ChromeLogo', iconsax: 'Chrome' },\n 'github': { lucide: 'Github', phosphor: 'GithubLogo' },\n 'message': { lucide: 'MessageCircle', phosphor: 'ChatCircle' },\n\n // Content\n 'messageSquare': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'message-square': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'inbox': { lucide: 'Inbox', phosphor: 'Inbox' },\n 'calendar': { lucide: 'Calendar', phosphor: 'Calendar' },\n 'calendarPlus': { lucide: 'CalendarPlus', phosphor: 'CalendarPlus' },\n 'checkSquare': { lucide: 'CheckSquare', phosphor: 'CheckSquare', iconsax: 'TickSquare' },\n 'clock': { lucide: 'Clock', phosphor: 'Clock' },\n 'book': { lucide: 'Book', phosphor: 'Book', iconsax: 'Book' },\n 'bookOpen': { lucide: 'BookOpen', phosphor: 'BookOpen', iconsax: 'Book' },\n\n // Theme & UI\n 'monitor': { lucide: 'Monitor', phosphor: 'Monitor', iconsax: 'Monitor' },\n 'sun': { lucide: 'Sun', phosphor: 'Sun', iconsax: 'Sun' },\n 'moon': { lucide: 'Moon', phosphor: 'Moon', iconsax: 'Moon' },\n\n // AI & Features\n 'sparkle': { lucide: 'Sparkle', phosphor: 'Sparkle' },\n 'sparkles': { lucide: 'Sparkles', phosphor: 'Sparkle' },\n 'lightbulb': { lucide: 'Lightbulb', phosphor: 'Lightbulb' },\n 'brain': { lucide: 'Brain', phosphor: 'Brain' },\n 'zap': { lucide: 'Zap', phosphor: 'Lightning' },\n\n // Device & Platform\n 'globe': { lucide: 'Globe', phosphor: 'Globe', iconsax: 'Global' },\n 'deviceMobile': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'smartphone': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'floppyDisk': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Data & Analytics\n 'chart': { lucide: 'BarChart3', phosphor: 'ChartBar' },\n 'barChart': { lucide: 'BarChart', phosphor: 'ChartBar' },\n 'trendingUp': { lucide: 'TrendingUp', phosphor: 'TrendUp' },\n 'trendingDown': { lucide: 'TrendingDown', phosphor: 'TrendDown' },\n 'activity': { lucide: 'Activity', phosphor: 'Pulse' },\n 'database': { lucide: 'Database', phosphor: 'Database' },\n 'dollarSign': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'dollar': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'currency': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n\n 'layers': { lucide: 'Layers', phosphor: 'Stack' },\n 'ban': { lucide: 'Ban', phosphor: 'Prohibit' },\n\n // Security\n 'lock': { lucide: 'Lock', phosphor: 'Lock', iconsax: 'Lock' },\n 'unlock': { lucide: 'Unlock', phosphor: 'LockOpen', iconsax: 'Unlock' },\n 'shield': { lucide: 'Shield', phosphor: 'Shield', iconsax: 'Shield' },\n 'key': { lucide: 'Key', phosphor: 'Key' },\n\n // Media\n 'play': { lucide: 'Play', phosphor: 'Play', iconsax: 'Play' },\n 'pause': { lucide: 'Pause', phosphor: 'Pause', iconsax: 'Pause' },\n 'image': { lucide: 'Image', phosphor: 'Image', iconsax: 'Image' },\n 'video': { lucide: 'Video', phosphor: 'Video', iconsax: 'Video' },\n 'camera': { lucide: 'Camera', phosphor: 'Camera', iconsax: 'Camera' },\n\n // Files\n 'fileText': { lucide: 'FileText', phosphor: 'FileText' },\n 'file': { lucide: 'File', phosphor: 'File' },\n\n // Navigation\n 'externalLink': { lucide: 'ExternalLink', phosphor: 'ArrowSquareOut' },\n 'link': { lucide: 'Link', phosphor: 'Link', iconsax: 'Link' },\n 'moreHorizontal': { lucide: 'MoreHorizontal', phosphor: 'DotsThreeOutline' },\n 'moreVertical': { lucide: 'MoreVertical', phosphor: 'DotsThreeVertical' },\n\n // Priority\n 'remove': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n\n // Eye (password)\n 'eye': { lucide: 'Eye', phosphor: 'Eye', iconsax: 'Eye' },\n 'eyeOff': { lucide: 'EyeOff', phosphor: 'EyeSlash', iconsax: 'EyeSlash' },\n\n // Emotions\n 'smile': { lucide: 'Smile', phosphor: 'Smiley', iconsax: 'EmojiHappy' },\n 'frown': { lucide: 'Frown', phosphor: 'SmileySad', iconsax: 'EmojiSad' },\n 'meh': { lucide: 'Meh', phosphor: 'SmileyMeh', iconsax: 'EmojiNormal' },\n\n // Social\n 'mail': { lucide: 'Mail', phosphor: 'Envelope' },\n 'phone': { lucide: 'Phone', phosphor: 'Phone' },\n\n // Additional\n 'flag': { lucide: 'Flag', phosphor: 'Flag', iconsax: 'Flag' },\n 'rocket': { lucide: 'Rocket', phosphor: 'Rocket', iconsax: 'Rocket' },\n\n // Connectivity & Misc\n 'ticket': { lucide: 'Ticket', phosphor: 'Ticket', iconsax: 'Ticket' },\n 'clipboard': { lucide: 'ClipboardList', phosphor: 'Clipboard', iconsax: 'Sticker' },\n 'wifi': { lucide: 'Wifi', phosphor: 'WifiHigh', iconsax: 'Wifi' },\n 'wifiOff': { lucide: 'WifiOff', phosphor: 'WifiSlash' },\n 'cpu': { lucide: 'Cpu', phosphor: 'Cpu', iconsax: 'Computing' },\n 'mask': { lucide: 'Drama', phosphor: 'MaskHappy', iconsax: 'EmojiHappy' },\n\n // Text Formatting (Markdown Toolbar)\n 'bold': { lucide: 'Bold', phosphor: 'TextB' },\n 'italic': { lucide: 'Italic', phosphor: 'TextItalic' },\n 'strikethrough': { lucide: 'Strikethrough', phosphor: 'TextStrikethrough' },\n 'heading': { lucide: 'Heading', phosphor: 'TextHOne' },\n 'code': { lucide: 'Code', phosphor: 'Code', iconsax: 'Code' },\n 'fileCode': { lucide: 'FileCode', phosphor: 'FileCode' },\n 'quote': { lucide: 'Quote', phosphor: 'Quotes', iconsax: 'QuoteUp' },\n 'list': { lucide: 'List', phosphor: 'List' },\n 'listOrdered': { lucide: 'ListOrdered', phosphor: 'ListNumbers' },\n 'minus': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n} as const\n\n/**\n * Initialize Phosphor Icons (lazy load for fallback/dynamic lookup)\n * icons.ts의 개별 import와 별개로, PROJECT_ICONS fallback용\n */\nexport async function initPhosphorIcons() {\n if (typeof window === 'undefined') return null\n\n if (!PhosphorIcons) {\n try {\n const phosphorModule = await import('@phosphor-icons/react')\n PhosphorIcons = phosphorModule\n } catch {\n console.warn('Phosphor Icons not available. Install @phosphor-icons/react to use.')\n return null\n }\n }\n return PhosphorIcons\n}\n\n/**\n * Initialize Lucide Icons (lazy load)\n */\nexport async function initLucideIcons() {\n if (typeof window === 'undefined') return null\n\n if (!LucideIcons) {\n try {\n const lucideModule = await import('lucide-react')\n LucideIcons = lucideModule\n } catch {\n console.warn('Lucide Icons not available. Install lucide-react to use lucide provider.')\n return null\n }\n }\n return LucideIcons\n}\n\n/**\n * Get icon from provider\n * Only resolves icons that are in PROJECT_ICONS for optimal bundle size\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nexport function getIconFromProvider(\n iconName: string,\n provider: IconProvider = 'phosphor'\n): React.ComponentType<Record<string, unknown>> | null {\n // Check if icon is in project icon list\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n\n if (!iconMapping) {\n // Fallback to direct lookup for backward compatibility\n return getIconDirect(iconName, provider)\n }\n\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n\n switch (provider) {\n case 'phosphor':\n if (!mappedName || !PhosphorIcons) return null\n return PhosphorIcons?.[mappedName] || null\n\n case 'lucide':\n if (!mappedName || !LucideIcons) {\n return null\n }\n return LucideIcons?.[mappedName] || null\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = mappedName || toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Direct icon lookup (fallback for icons not in PROJECT_ICONS)\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nfunction getIconDirect(\n iconName: string,\n provider: IconProvider\n): React.ComponentType<Record<string, unknown>> | null {\n switch (provider) {\n case 'phosphor': {\n if (!PhosphorIcons) return null\n const phosphorName1 = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const phosphorName2 = iconName\n .split(/(?=[A-Z])/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n return PhosphorIcons?.[phosphorName1] ||\n PhosphorIcons?.[phosphorName2] ||\n PhosphorIcons?.[iconName] ||\n null\n }\n\n case 'lucide': {\n if (!LucideIcons) {\n return null\n }\n const lucideName = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const camelCaseName = iconName.replace(/([A-Z])/g, (match) =>\n match === iconName[0] ? match.toLowerCase() : match\n )\n return LucideIcons?.[lucideName] ||\n LucideIcons?.[iconName] ||\n LucideIcons?.[camelCaseName] ||\n null\n }\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Get icon name for provider\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 프로바이더별 아이콘 이름 / Icon name for provider\n */\nexport function getIconNameForProvider(\n iconName: string,\n provider: IconProvider\n): string {\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (iconMapping) {\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n if (mappedName) {\n return mappedName\n }\n }\n return iconName\n}\n\n/**\n * Get all project icon names\n */\nexport function getProjectIconNames(): string[] {\n return Object.keys(PROJECT_ICONS)\n}\n","/**\n * Icon Aliases\n * \n * 여러 이름이 같은 아이콘을 가리키도록 하는 alias 시스템\n * DX 향상을 위해 직관적인 이름들을 지원합니다.\n */\n\nexport const ICON_ALIASES: Record<string, string> = {\n // kebab-case → camelCase mappings (자동 변환 지원)\n 'arrow-left': 'arrowLeft',\n 'arrow-right': 'arrowRight',\n 'arrow-up': 'arrowUp',\n 'arrow-down': 'arrowDown',\n 'chevron-left': 'chevronLeft',\n 'chevron-right': 'chevronRight',\n 'chevron-up': 'chevronUp',\n 'chevron-down': 'chevronDown',\n 'external-link': 'externalLink',\n 'more-horizontal': 'moreHorizontal',\n 'more-vertical': 'moreVertical',\n 'user-plus': 'userPlus',\n 'log-in': 'logIn',\n 'log-out': 'logOut',\n 'check-circle': 'checkCircle',\n 'check-square': 'checkSquare',\n 'alert-circle': 'alertCircle',\n 'eye-off': 'eyeOff',\n 'file-text': 'fileText',\n 'book-open': 'bookOpen',\n 'bar-chart': 'barChart',\n 'trending-up': 'trendingUp',\n 'trending-down': 'trendingDown',\n 'message-square': 'messageSquare',\n 'calendar-plus': 'calendarPlus',\n 'refresh-cw': 'refreshCw',\n 'dollar-sign': 'dollarSign',\n 'layout-dashboard': 'layoutDashboard',\n 'device-mobile': 'deviceMobile',\n 'floppy-disk': 'floppyDisk',\n\n // Navigation aliases\n 'back': 'arrowLeft',\n 'prev': 'arrowLeft',\n 'previous': 'arrowLeft',\n 'forward': 'arrowRight',\n 'next': 'arrowRight',\n \n // Close aliases\n 'close': 'x',\n 'cancel': 'x',\n \n // Delete aliases\n 'remove': 'delete',\n 'trash': 'delete',\n \n // Add aliases\n 'plus': 'add',\n 'new': 'add',\n \n // Edit aliases\n 'pencil': 'edit',\n 'modify': 'edit',\n \n // Save aliases\n 'store': 'save',\n 'floppy': 'save',\n \n // Search aliases\n 'magnify': 'search',\n \n // User aliases\n 'person': 'user',\n 'account': 'user',\n 'profile': 'user',\n \n // Settings aliases\n 'gear': 'settings',\n 'config': 'settings',\n 'preferences': 'settings',\n \n // Home aliases\n 'house': 'home',\n 'main': 'home',\n \n // Check aliases\n 'done': 'check',\n 'complete': 'check',\n 'tick': 'check',\n \n // Info aliases\n 'information': 'info',\n 'help': 'info',\n \n // Warning aliases\n 'alert': 'warning',\n 'caution': 'warning',\n \n // Success aliases\n 'checkmark': 'success',\n 'checkCircle': 'success',\n \n // Error aliases\n 'fail': 'error',\n 'cross': 'error',\n 'xCircle': 'error',\n \n // Loading aliases\n 'spinner': 'loader',\n 'loading': 'loader',\n 'wait': 'loader',\n \n // Refresh aliases\n 'reload': 'refresh',\n 'update': 'refresh',\n 'sync': 'refresh',\n \n // Eye aliases\n 'show': 'eye',\n 'view': 'eye',\n 'hide': 'eyeOff',\n 'hidden': 'eyeOff',\n \n // Lock aliases\n 'secure': 'lock',\n 'locked': 'lock',\n 'unsecure': 'unlock',\n 'unlocked': 'unlock',\n \n // Download aliases\n 'get': 'download',\n 'fetch': 'download',\n \n // Upload aliases\n 'post': 'upload',\n \n // Share aliases\n 'send': 'share',\n 'export': 'share',\n \n // Copy aliases\n 'duplicate': 'copy',\n 'clone': 'copy',\n \n // Mail aliases\n 'email': 'mail',\n 'envelope': 'mail',\n \n // Message aliases\n 'chat': 'message',\n 'comment': 'message',\n 'talk': 'message',\n \n // Calendar aliases\n 'date': 'calendar',\n 'schedule': 'calendar',\n \n // Clock aliases\n 'time': 'clock',\n 'watch': 'clock',\n \n // File aliases\n 'document': 'fileText',\n 'doc': 'fileText',\n 'text': 'fileText',\n \n // Folder aliases\n 'directory': 'folder',\n 'dir': 'folder',\n \n // Image aliases\n 'picture': 'image',\n 'img': 'image',\n \n // Video aliases\n 'movie': 'video',\n 'film': 'video',\n \n // Camera aliases\n 'photo': 'camera',\n 'capture': 'camera',\n \n // Play aliases\n 'start': 'play',\n 'run': 'play',\n \n // Pause aliases\n 'stop': 'pause',\n 'halt': 'pause',\n \n // Heart aliases\n 'like': 'heart',\n 'love': 'heart',\n \n // Star aliases\n 'favorite': 'star',\n \n // Bookmark aliases\n 'saveBookmark': 'bookmark',\n \n // Bell aliases\n 'notification': 'bell',\n 'notify': 'bell',\n 'alarm': 'bell',\n \n // Settings aliases\n 'prefs': 'settings',\n \n // Search aliases (duplicate removed - see line 37)\n 'lookup': 'search',\n \n // More aliases\n 'dots': 'moreHorizontal',\n 'moreMenu': 'moreHorizontal',\n 'moreOptions': 'moreVertical',\n \n // External link aliases\n 'external': 'externalLink',\n 'outbound': 'externalLink',\n 'open': 'externalLink',\n \n // Link aliases\n 'url': 'link',\n 'hyperlink': 'link',\n \n // Chart aliases\n 'graph': 'barChart',\n 'stats': 'barChart',\n 'analytics': 'barChart',\n \n // Database aliases\n 'db': 'database',\n 'storage': 'database',\n \n // Activity aliases\n 'pulse': 'activity',\n 'monitor': 'activity',\n \n // Trending aliases\n 'up': 'trendingUp',\n 'down': 'trendingDown',\n \n // Zap aliases\n 'lightning': 'zap',\n 'bolt': 'zap',\n 'flash': 'zap',\n \n // Shield aliases\n 'security': 'shield',\n 'protect': 'shield',\n \n // Key aliases\n 'password': 'key',\n 'secret': 'key',\n \n // Log in aliases\n 'signin': 'logIn',\n 'login': 'logIn',\n 'enter': 'logIn',\n \n // Log out aliases\n 'signout': 'logOut',\n 'logout': 'logOut',\n 'exit': 'logOut',\n \n // Users aliases\n 'people': 'users',\n 'group': 'users',\n 'team': 'users',\n \n // User plus aliases\n 'addUser': 'userPlus',\n 'invite': 'userPlus',\n \n // Book aliases\n 'read': 'book',\n 'library': 'book',\n \n // Book open aliases\n 'reading': 'bookOpen',\n 'openBook': 'bookOpen',\n \n // Sun aliases\n 'light': 'sun',\n 'day': 'sun',\n \n // Moon aliases\n 'dark': 'moon',\n 'night': 'moon',\n \n // Monitor aliases\n 'screen': 'monitor',\n 'display': 'monitor',\n \n // Brain aliases\n 'ai': 'brain',\n 'intelligence': 'brain',\n 'think': 'brain',\n \n // Lightbulb aliases\n 'idea': 'lightbulb',\n 'bulb': 'lightbulb',\n 'inspiration': 'lightbulb',\n \n // Sparkles aliases\n 'magic': 'sparkles',\n 'stars': 'sparkles',\n 'glitter': 'sparkles',\n} as const\n\n/**\n * Resolve icon alias to actual icon name\n * \n * @param iconName - 아이콘 이름 또는 별칭 / Icon name or alias\n * @returns 실제 아이콘 이름 / Actual icon name\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function resolveIconAlias(iconName: string): string {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return ICON_ALIASES[iconName] || iconName;\n}\n\n/**\n * Get all aliases for an icon name\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @returns 해당 아이콘의 모든 별칭 배열 / Array of all aliases for the icon\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function getIconAliases(iconName: string): string[] {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return Object.entries(ICON_ALIASES)\n .filter(([_, target]) => target === iconName)\n .map(([alias]) => alias);\n}\n\n\n","/**\n * Icon Name Normalization System\n *\n * 아이콘 이름 정규화를 위한 통합 시스템입니다.\n *\n * Features:\n * - kebab-case → camelCase conversion\n * - snake_case → camelCase conversion\n * - PascalCase → camelCase conversion\n * - Alias resolution\n * - Provider-specific name mapping\n */\n\nimport { ICON_ALIASES } from './icon-aliases'\nimport { toCamelCase, toPascalCase } from './case-utils'\n\n// Re-export case utils for backward compatibility\nexport { toCamelCase, toPascalCase } from './case-utils'\n\n// IconProvider type (avoid circular dependency with icon-providers.ts)\nexport type IconProviderType = 'lucide' | 'phosphor' | 'iconsax'\n\n/**\n * 정규화 결과 인터페이스\n */\nexport interface NormalizeResult {\n /** 정규화된 아이콘 이름 (camelCase) */\n normalized: string\n /** 원본 이름이 alias였는지 여부 */\n wasAlias: boolean\n /** 원본 alias 이름 (alias였던 경우) */\n originalAlias?: string\n}\n\n/**\n * 아이콘 이름을 정규화합니다.\n *\n * @example\n * normalizeIconName('arrow-left') // { normalized: 'arrowLeft', wasAlias: false }\n * normalizeIconName('back') // { normalized: 'arrowLeft', wasAlias: true, originalAlias: 'back' }\n * normalizeIconName('ArrowLeft') // { normalized: 'arrowLeft', wasAlias: false }\n */\nexport function normalizeIconName(iconName: string): NormalizeResult {\n if (!iconName || typeof iconName !== 'string') {\n return { normalized: iconName || '', wasAlias: false }\n }\n\n const camelCased = toCamelCase(iconName)\n const aliasTarget = ICON_ALIASES[iconName] || ICON_ALIASES[camelCased]\n\n if (aliasTarget) {\n return {\n normalized: aliasTarget,\n wasAlias: true,\n originalAlias: iconName\n }\n }\n\n return {\n normalized: camelCased,\n wasAlias: false\n }\n}\n\n/**\n * 프로바이더별 아이콘 이름을 반환합니다.\n *\n * @example\n * getProviderIconName('arrowLeft', 'lucide') // 'ArrowLeft'\n * getProviderIconName('heart', 'iconsax') // 'Heart'\n */\nexport function getProviderIconName(\n normalizedName: string,\n provider: IconProviderType\n): string {\n switch (provider) {\n case 'lucide':\n case 'phosphor':\n case 'iconsax':\n return toPascalCase(normalizedName)\n default:\n return normalizedName\n }\n}\n","/**\n * Icon Config Types\n *\n * Icon 시스템의 설정 타입 정의\n * 상태관리는 서비스 레벨에서 관리 (Zustand 등)\n */\n\nexport type IconSet = 'lucide' | 'phosphor' | 'iconsax'\n\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'duotone' | 'fill'\n\nexport type IconsaxVariant = 'line' | 'bold'\n\nexport interface IconConfig {\n set: IconSet\n weight: PhosphorWeight\n size: number\n color: string\n strokeWidth?: number // Lucide용\n iconsaxVariant?: IconsaxVariant // Iconsax용 (line | bold)\n}\n\nexport const defaultIconConfig: IconConfig = {\n set: 'lucide',\n weight: 'regular',\n size: 20,\n color: 'currentColor',\n strokeWidth: 1.25,\n iconsaxVariant: 'line',\n}\n\n/**\n * 세트별 기본 strokeWidth\n */\nexport const getDefaultStrokeWidth = (set: IconSet): number => {\n switch (set) {\n case 'lucide':\n return 1.25\n case 'phosphor':\n return 1.25 // Phosphor는 weight 사용\n case 'iconsax':\n return 1.5\n default:\n return 1.25\n }\n}\n","'use client'\n\n/**\n * IconProvider - Icon 시스템 전역 설정 Provider\n *\n * React Context를 사용하여 전역 아이콘 설정을 제공합니다.\n *\n * @example\n * ```tsx\n * <IconProvider set=\"phosphor\" weight=\"regular\" size={20}>\n * <App />\n * </IconProvider>\n * ```\n */\n\nimport React, { createContext, useContext } from 'react'\nimport { type IconConfig, type IconSet, type PhosphorWeight, type IconsaxVariant, defaultIconConfig } from './icon-store'\n\n/**\n * IconProvider 컴포넌트 Props\n */\nexport interface IconProviderProps {\n /** 아이콘 세트 (lucide, phosphor, iconsax) */\n set?: IconSet\n /** Phosphor 아이콘 weight */\n weight?: PhosphorWeight\n /** Iconsax 아이콘 변형 (line, bold) */\n iconsaxVariant?: IconsaxVariant\n /** 기본 아이콘 크기 */\n size?: number\n /** 기본 아이콘 색상 */\n color?: string\n /** Lucide/Iconsax 아이콘 stroke width */\n strokeWidth?: number\n /** 자식 컴포넌트 */\n children: React.ReactNode\n}\n\ninterface IconContextValue extends IconConfig {}\n\nconst IconContext = createContext<IconContextValue>(defaultIconConfig)\n\nexport function IconProvider({\n set = defaultIconConfig.set,\n weight = defaultIconConfig.weight,\n iconsaxVariant = defaultIconConfig.iconsaxVariant,\n size = defaultIconConfig.size,\n color = defaultIconConfig.color,\n strokeWidth = defaultIconConfig.strokeWidth,\n children,\n}: IconProviderProps) {\n const value: IconContextValue = {\n set,\n weight,\n iconsaxVariant,\n size,\n color,\n strokeWidth,\n }\n\n return (\n <IconContext.Provider value={value}>\n {children}\n </IconContext.Provider>\n )\n}\n\nexport function useIconContext(): IconContextValue {\n return useContext(IconContext)\n}\n\n// Re-export types for convenience\nexport type { IconSet, PhosphorWeight, IconsaxVariant, IconConfig } from './icon-store'\nexport { defaultIconConfig, getDefaultStrokeWidth } from './icon-store'\n","import React from 'react'\nimport type { IconProps as PhosphorIconProps } from '@phosphor-icons/react'\nimport { merge, mergeMap } from '../../lib/utils'\nimport { icons, IconName, emotionIcons, statusIcons } from '../../lib/icons'\nimport { getIconFromProvider, getIconsaxResolver, initPhosphorIcons, initLucideIcons, getIconNameForProvider } from '../../lib/icon-providers'\nimport { normalizeIconName } from '../../lib/normalize-icon-name'\nimport { useIconContext, type IconSet } from './IconProvider'\nimport { type PhosphorWeight } from './icon-store'\nimport type { AllIconName } from '../../lib/icon-names'\n\n/**\n * Icon 컴포넌트 Props\n */\nexport interface IconProps {\n /** 아이콘 이름 / Icon name */\n name: AllIconName\n /** 아이콘 크기 (숫자 또는 문자열) / Icon size (number or string) */\n size?: number | string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 감정 아이콘 타입 / Emotion icon type */\n emotion?: keyof typeof emotionIcons\n /** 상태 아이콘 타입 / Status icon type */\n status?: keyof typeof statusIcons\n /** 아이콘 프로바이더 오버라이드 / Icon provider override */\n provider?: IconSet\n /** 부드러운 애니메이션 효과 / Smooth animation effect */\n animated?: boolean\n /** 펄스 애니메이션 / Pulse animation */\n pulse?: boolean\n /** 회전 애니메이션 / Spin animation */\n spin?: boolean\n /** 바운스 애니메이션 / Bounce animation */\n bounce?: boolean\n /** 색상 변형 / Color variant */\n variant?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'muted' | 'inherit'\n /** Phosphor 아이콘 weight 오버라이드 / Phosphor icon weight override */\n weight?: PhosphorWeight\n /** 스크린 리더용 라벨 / Screen reader label */\n 'aria-label'?: string\n /** 장식용 아이콘 / Decorative icon (hidden from screen readers) */\n 'aria-hidden'?: boolean\n}\n\n/**\n * Icon 컴포넌트\n *\n * 다중 아이콘 라이브러리(Phosphor, Lucide, Iconsax)를 지원하는 통합 아이콘 컴포넌트.\n * IconProvider를 통해 전역 설정을 관리하며, 개별 아이콘에서도 오버라이드 가능.\n *\n * Iconsax는 별도 entry('@hua-labs/ui/iconsax')를 import해야 동작합니다.\n *\n * @example\n * ```tsx\n * <Icon name=\"heart\" />\n * <Icon name=\"user\" size={24} />\n * <Icon name=\"check\" variant=\"success\" />\n * <Icon name=\"loader\" spin />\n * ```\n */\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(({\n name,\n size,\n className,\n emotion,\n status,\n provider,\n weight,\n animated = false,\n pulse = false,\n spin = false,\n bounce = false,\n variant = 'default',\n 'aria-label': ariaLabel,\n 'aria-hidden': ariaHidden\n}, ref) => {\n const config = useIconContext()\n\n const iconSet = provider || config.set\n const iconSize = size ?? config.size\n const iconWeight = weight || config.weight\n const iconColor = config.color\n const iconStrokeWidth = config.strokeWidth ?? 1.25\n const iconsaxVariant = config.iconsaxVariant ?? 'line'\n\n const [isClient, setIsClient] = React.useState(false)\n const [providerReady, setProviderReady] = React.useState(false)\n\n React.useEffect(() => {\n setIsClient(true)\n\n // Provider별 lazy load 초기화\n if (iconSet === 'lucide') {\n initLucideIcons().then(() => setProviderReady(true))\n } else if (iconSet === 'phosphor') {\n initPhosphorIcons().then(() => setProviderReady(true))\n } else {\n setProviderReady(true)\n }\n }, [iconSet])\n\n // 통합 정규화\n const resolvedIcon = React.useMemo(() => {\n const baseName = emotion ? emotionIcons[emotion] :\n status ? statusIcons[status] : name\n const { normalized } = normalizeIconName(baseName)\n const providerName = getIconNameForProvider(normalized, iconSet)\n return { normalized, providerName }\n }, [name, emotion, status, iconSet])\n\n const iconName = resolvedIcon.normalized as AllIconName\n\n // Iconsax: resolver를 통해 가져오기 (iconsax entry import 시 자동 등록됨)\n const iconsaxIcon = React.useMemo(() => {\n if (iconSet === 'iconsax' && isClient) {\n const resolver = getIconsaxResolver()\n if (resolver) {\n return resolver(resolvedIcon.providerName, iconsaxVariant)\n }\n }\n return null\n }, [iconSet, resolvedIcon.providerName, isClient, iconsaxVariant])\n\n // 색상 변형 클래스\n const variantClasses = mergeMap({\n 'text-current': variant === 'default',\n 'text-primary': variant === 'primary',\n 'text-muted-foreground': variant === 'secondary' || variant === 'muted',\n 'text-green-600 dark:text-green-400': variant === 'success',\n 'text-yellow-600 dark:text-yellow-400': variant === 'warning',\n 'text-destructive': variant === 'error',\n })\n\n // 서버사이드에서는 빈 span 반환\n if (!isClient) {\n return (\n <span\n style={{ width: iconSize, height: iconSize }}\n className={merge(variantClasses, className)}\n aria-hidden={ariaHidden !== undefined ? ariaHidden : true}\n aria-label={ariaLabel}\n />\n )\n }\n\n // Provider에 따라 아이콘 가져오기\n type IconComponentType = React.ComponentType<PhosphorIconProps | React.SVGProps<SVGSVGElement> | Record<string, unknown>>\n let ResolvedIcon: IconComponentType | null = null\n\n if (iconSet === 'phosphor') {\n // 1. icons.ts에서 먼저 찾기 (Phosphor 아이콘이 기본, 정적 import)\n ResolvedIcon = (icons[iconName as IconName] || null) as IconComponentType | null\n // 2. 없으면 동적으로 Phosphor namespace에서 가져오기 (fallback, providerReady 필요)\n if (!ResolvedIcon && providerReady) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else if (iconSet === 'iconsax') {\n ResolvedIcon = iconsaxIcon as IconComponentType | null\n if (!ResolvedIcon) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else {\n // Lucide나 다른 provider\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n\n if (!ResolvedIcon) {\n if (iconSet === 'iconsax' && !getIconsaxResolver()) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `Icon \"${iconName}\" — iconsax resolver not registered. ` +\n `Use HuaProvider with icons.set='iconsax', or add: import '@hua-labs/ui/iconsax'`\n )\n }\n } else {\n console.warn(`Icon \"${iconName}\" not found for provider \"${iconSet}\"`)\n }\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center rounded-full border-2 border-dashed border-border',\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n aria-label={ariaLabel || `아이콘을 찾을 수 없음: ${iconName}`}\n title={`Icon not found: ${iconName}`}\n >\n <span className=\"text-xs text-muted-foreground\" aria-hidden=\"true\">\n ?\n </span>\n </span>\n )\n }\n\n // 세트별 props 준비\n type IconPropsType = PhosphorIconProps & {\n size?: number\n width?: number | string\n height?: number | string\n color?: string\n weight?: PhosphorWeight\n strokeWidth?: number\n }\n\n const iconProps: IconPropsType = {\n size: typeof iconSize === 'number' ? iconSize : undefined,\n width: typeof iconSize === 'string' ? iconSize : iconSize,\n height: typeof iconSize === 'string' ? iconSize : iconSize,\n color: iconColor,\n } as IconPropsType\n\n if (iconSet === 'phosphor') {\n iconProps.weight = iconWeight\n } else {\n iconProps.strokeWidth = iconStrokeWidth\n }\n\n const animationClasses = mergeMap({\n 'animate-pulse': pulse,\n 'animate-spin': spin,\n 'animate-bounce': bounce,\n 'transition-all duration-200 ease-in-out': animated,\n })\n\n const accessibilityProps: React.AriaAttributes = {}\n\n if (ariaLabel) {\n accessibilityProps['aria-label'] = ariaLabel\n accessibilityProps['aria-hidden'] = false\n } else if (ariaHidden !== undefined) {\n accessibilityProps['aria-hidden'] = ariaHidden\n } else {\n accessibilityProps['aria-hidden'] = true\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center',\n animationClasses,\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n {...accessibilityProps}\n >\n {ResolvedIcon && React.createElement(ResolvedIcon, {\n ...iconProps,\n className: variantClasses,\n 'aria-hidden': true\n } as React.ComponentProps<typeof ResolvedIcon>)}\n </span>\n )\n})\n\nIconComponent.displayName = 'Icon'\n\nconst MemoizedIcon = React.memo(IconComponent, (prevProps, nextProps) => {\n return (\n prevProps.name === nextProps.name &&\n prevProps.size === nextProps.size &&\n prevProps.className === nextProps.className &&\n prevProps.emotion === nextProps.emotion &&\n prevProps.status === nextProps.status &&\n prevProps.provider === nextProps.provider &&\n prevProps.animated === nextProps.animated &&\n prevProps.pulse === nextProps.pulse &&\n prevProps.spin === nextProps.spin &&\n prevProps.bounce === nextProps.bounce &&\n prevProps.variant === nextProps.variant &&\n prevProps.weight === nextProps.weight &&\n prevProps['aria-label'] === nextProps['aria-label'] &&\n prevProps['aria-hidden'] === nextProps['aria-hidden']\n )\n})\n\nexport const Icon = MemoizedIcon as typeof IconComponent\nIcon.displayName = 'Icon'\n\nexport const EmotionIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { emotion: keyof typeof emotionIcons }>(\n (props, ref) => <Icon ref={ref} name=\"smile\" {...props} />\n)\nEmotionIcon.displayName = 'EmotionIcon'\n\nexport const StatusIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { status: keyof typeof statusIcons }>(\n (props, ref) => <Icon ref={ref} name=\"info\" {...props} />\n)\nStatusIcon.displayName = 'StatusIcon'\n\nexport const LoadingIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"loader\" status=\"loading\" spin aria-label=\"로딩 중\" {...props} />\n )\n)\nLoadingIcon.displayName = 'LoadingIcon'\n\nexport const SuccessIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"check\" status=\"success\" variant=\"success\" aria-label=\"성공\" {...props} />\n )\n)\nSuccessIcon.displayName = 'SuccessIcon'\n\nexport const ErrorIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"alertCircle\" status=\"error\" variant=\"error\" aria-label=\"오류\" {...props} />\n )\n)\nErrorIcon.displayName = 'ErrorIcon'\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Accordion 컴포넌트의 props / Accordion component props\n * @typedef {Object} AccordionProps\n * @property {React.ReactNode} children - AccordionItem 컴포넌트들 / AccordionItem components\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"single\" | \"multiple\"} [type=\"single\"] - 단일 또는 다중 아이템 열기 허용 / Allow single or multiple items to be open\n * @property {string | string[]} [defaultValue] - 초기 열린 아이템 값 (비제어 컴포넌트) / Initial open item value (uncontrolled component)\n * @property {string | string[]} [value] - 현재 열린 아이템 값 (제어 컴포넌트) / Current open item value (controlled component)\n * @property {(value: string | string[]) => void} [onValueChange] - 아이템 열림/닫힘 콜백 / Item open/close callback\n * @property {boolean} [collapsible=false] - 단일 모드에서 열린 아이템을 닫을 수 있는지 여부 / Whether open item can be closed in single mode\n */\ninterface AccordionProps {\n children: React.ReactNode\n className?: string\n type?: \"single\" | \"multiple\"\n defaultValue?: string | string[]\n value?: string | string[]\n onValueChange?: (value: string | string[]) => void\n collapsible?: boolean\n}\n\n/**\n * Accordion 컴포넌트 / Accordion component\n * \n * 접을 수 있는 콘텐츠 섹션을 제공하는 컴포넌트입니다.\n * 키보드 네비게이션(Arrow keys, Home/End)을 지원하며, ARIA 속성을 자동으로 설정합니다.\n * \n * Component that provides collapsible content sections.\n * Supports keyboard navigation (Arrow keys, Home/End) and automatically sets ARIA attributes.\n * \n * @component\n * @example\n * // 기본 사용 (단일 열기) / Basic usage (single open)\n * <Accordion type=\"single\">\n * <AccordionItem value=\"item1\">\n * <AccordionTrigger>제목 1</AccordionTrigger>\n * <AccordionContent>내용 1</AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"item2\">\n * <AccordionTrigger>제목 2</AccordionTrigger>\n * <AccordionContent>내용 2</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * \n * @example\n * // 다중 열기 / Multiple open\n * <Accordion type=\"multiple\" defaultValue={[\"item1\", \"item2\"]}>\n * <AccordionItem value=\"item1\">\n * <AccordionTrigger>제목 1</AccordionTrigger>\n * <AccordionContent>내용 1</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [openItems, setOpenItems] = useState<string[]>([])\n * <Accordion type=\"multiple\" value={openItems} onValueChange={setOpenItems}>\n * <AccordionItem value=\"item1\">\n * <AccordionTrigger>제목</AccordionTrigger>\n * <AccordionContent>내용</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * \n * @param {AccordionProps} props - Accordion 컴포넌트의 props / Accordion component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Accordion 컴포넌트 / Accordion component\n */\nconst Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n ({ \n children, \n className,\n type = \"single\",\n defaultValue,\n value,\n onValueChange,\n collapsible = false,\n ...props \n }, ref) => {\n const [openItems, setOpenItems] = React.useState<string[]>(\n value ? (Array.isArray(value) ? value : [value]) : \n defaultValue ? (Array.isArray(defaultValue) ? defaultValue : [defaultValue]) : []\n )\n\n React.useEffect(() => {\n if (value !== undefined) {\n setOpenItems(Array.isArray(value) ? value : [value])\n }\n }, [value])\n\n const handleItemToggle = (itemValue: string) => {\n let newOpenItems: string[]\n\n if (type === \"single\") {\n if (openItems.includes(itemValue)) {\n newOpenItems = collapsible ? [] : openItems\n } else {\n newOpenItems = [itemValue]\n }\n } else {\n if (openItems.includes(itemValue)) {\n newOpenItems = openItems.filter(item => item !== itemValue)\n } else {\n newOpenItems = [...openItems, itemValue]\n }\n }\n\n setOpenItems(newOpenItems)\n onValueChange?.(type === \"single\" ? newOpenItems[0] || \"\" : newOpenItems)\n }\n\n // 모든 아이템의 value를 수집\n const itemValues = React.useMemo(() => {\n const values: string[] = []\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n const childProps = child.props as { value?: string }\n if (childProps.value) {\n values.push(childProps.value)\n }\n }\n })\n return values\n }, [children])\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement\n if (!target.hasAttribute('data-accordion-trigger')) return\n\n const currentValue = target.getAttribute('data-accordion-value')\n if (!currentValue) return\n\n const currentIndex = itemValues.indexOf(currentValue)\n if (currentIndex === -1) return\n\n let newIndex = currentIndex\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault()\n newIndex = currentIndex < itemValues.length - 1 ? currentIndex + 1 : 0\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault()\n newIndex = currentIndex > 0 ? currentIndex - 1 : itemValues.length - 1\n } else if (e.key === \"Home\") {\n e.preventDefault()\n newIndex = 0\n } else if (e.key === \"End\") {\n e.preventDefault()\n newIndex = itemValues.length - 1\n }\n\n if (newIndex !== currentIndex && itemValues[newIndex]) {\n const triggerElement = target.closest('[data-accordion-item]')?.querySelector(\n `[data-accordion-value=\"${itemValues[newIndex]}\"]`\n ) as HTMLElement\n triggerElement?.focus()\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n openItems,\n onToggle: handleItemToggle\n } as Partial<AccordionItemProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nAccordion.displayName = \"Accordion\"\n\n/**\n * AccordionItem 컴포넌트의 props / AccordionItem component props\n * @typedef {Object} AccordionItemProps\n * @property {string} value - 아이템의 고유 값 / Item unique value\n * @property {React.ReactNode} children - AccordionTrigger와 AccordionContent / AccordionTrigger and AccordionContent\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [disabled=false] - 아이템 비활성화 여부 / Item disabled state\n * @property {string[]} [openItems] - 열린 아이템 목록 (Accordion에서 자동 전달) / Open items list (auto-passed from Accordion)\n * @property {(value: string) => void} [onToggle] - 토글 콜백 (Accordion에서 자동 전달) / Toggle callback (auto-passed from Accordion)\n */\ninterface AccordionItemProps {\n value: string\n children: React.ReactNode\n className?: string\n disabled?: boolean\n openItems?: string[]\n onToggle?: (value: string) => void\n}\n\n/**\n * AccordionItem 컴포넌트 / AccordionItem component\n * 아코디언의 개별 아이템을 감싸는 컨테이너입니다.\n * Container that wraps an individual accordion item.\n * \n * @component\n * @param {AccordionItemProps} props - AccordionItem 컴포넌트의 props / AccordionItem component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} AccordionItem 컴포넌트 / AccordionItem component\n */\nconst AccordionItem = React.forwardRef<HTMLDivElement, AccordionItemProps>(\n ({ \n value, \n children, \n className,\n disabled = false,\n openItems = [],\n onToggle,\n ...props \n }, ref) => {\n const isOpen = openItems.includes(value)\n\n return (\n <div\n ref={ref}\n data-accordion-item\n className={merge(\n \"border border-border/50 rounded-lg overflow-hidden\",\n disabled && \"opacity-50 pointer-events-none\",\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n value,\n isOpen,\n disabled,\n onToggle: () => onToggle?.(value),\n 'data-accordion-value': value\n } as Partial<AccordionTriggerProps | AccordionContentProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nAccordionItem.displayName = \"AccordionItem\"\n\ninterface AccordionTriggerProps {\n children: React.ReactNode\n className?: string\n icon?: React.ReactNode\n iconPosition?: \"left\" | \"right\"\n value?: string // Optional: AccordionItem에서 자동으로 전달됨 / Optional: Auto-passed from AccordionItem\n isOpen?: boolean\n disabled?: boolean\n onToggle?: () => void\n}\n\nconst AccordionTrigger = React.forwardRef<HTMLButtonElement, AccordionTriggerProps>(\n ({ \n children, \n className,\n icon,\n iconPosition = \"right\",\n value,\n isOpen = false,\n disabled = false,\n onToggle,\n ...props \n }, ref) => {\n const defaultIcon = (\n <Icon \n name=\"chevronDown\" \n size={20} \n className={merge(\n \"transition-transform duration-300 ease-out text-muted-foreground\",\n isOpen && \"rotate-180\"\n )} \n />\n )\n\n const contentId = `accordion-content-${value}`\n const triggerId = `accordion-trigger-${value}`\n\n return (\n <button\n ref={ref}\n id={triggerId}\n data-accordion-trigger\n data-accordion-value={value}\n aria-expanded={isOpen}\n aria-controls={contentId}\n onClick={onToggle}\n disabled={disabled}\n className={merge(\n \"flex w-full items-center justify-between px-6 py-4 text-left font-medium transition-all hover:bg-muted/80 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <div className=\"flex items-center gap-3 flex-1\">\n {iconPosition === \"left\" && (icon || defaultIcon)}\n <span className=\"flex-1\">{children}</span>\n </div>\n {iconPosition === \"right\" && (icon || defaultIcon)}\n </button>\n )\n }\n)\nAccordionTrigger.displayName = \"AccordionTrigger\"\n\n/**\n * AccordionTrigger 컴포넌트 / AccordionTrigger component\n * 아코디언 아이템을 열고 닫는 트리거 버튼입니다.\n * Button that opens and closes an accordion item.\n * \n * @component\n * @param {AccordionTriggerProps} props - AccordionTrigger 컴포넌트의 props / AccordionTrigger component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} AccordionTrigger 컴포넌트 / AccordionTrigger component\n */\n\n/**\n * AccordionContent 컴포넌트의 props\n * @typedef {Object} AccordionContentProps\n * @property {React.ReactNode} children - 콘텐츠\n * @property {string} [className] - 추가 CSS 클래스\n * @property {boolean} [isOpen] - 열림 상태 (AccordionItem에서 자동 전달)\n * @property {string} [value] - 아이템 값 (AccordionItem에서 자동 전달)\n * @property {string} ['data-accordion-value'] - 아이템 값 (내부 사용)\n */\ninterface AccordionContentProps {\n children: React.ReactNode\n className?: string\n isOpen?: boolean\n value?: string\n 'data-accordion-value'?: string\n}\n\n/**\n * AccordionContent 컴포넌트 / AccordionContent component\n * 아코디언 아이템의 콘텐츠를 표시합니다.\n * Displays the content of an accordion item.\n * \n * @component\n * @param {AccordionContentProps} props - AccordionContent 컴포넌트의 props / AccordionContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} AccordionContent 컴포넌트 / AccordionContent component\n */\nconst AccordionContent = React.forwardRef<HTMLDivElement, AccordionContentProps>(\n ({ children, className, isOpen = false, value, 'data-accordion-value': dataValue, ...props }, ref) => {\n const [height, setHeight] = React.useState(0)\n const contentRef = React.useRef<HTMLDivElement>(null)\n const itemValue = value || dataValue || 'unknown'\n\n React.useEffect(() => {\n if (contentRef.current) {\n if (isOpen) {\n setHeight(contentRef.current.scrollHeight)\n } else {\n setHeight(0)\n }\n }\n }, [isOpen, children])\n\n const triggerId = `accordion-trigger-${itemValue}`\n const contentId = `accordion-content-${itemValue}`\n\n return (\n <div\n ref={ref}\n id={contentId}\n role=\"region\"\n aria-labelledby={triggerId}\n hidden={!isOpen}\n className=\"overflow-hidden transition-all duration-300 ease-out\"\n style={{ height: `${height}px` }}\n {...props}\n >\n <div\n ref={contentRef}\n className={merge(\"px-6 pt-2 pb-4\", className)}\n >\n {children}\n </div>\n </div>\n )\n }\n)\nAccordionContent.displayName = \"AccordionContent\"\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent } ","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../lib/utils'\n\n/**\n * TabsContent 컴포넌트의 props / TabsContent component props\n * @typedef {Object} TabsContentProps\n * @property {string} value - 탭 패널의 고유 값 (TabsTrigger의 value와 일치해야 함) / Unique value for tab panel (must match TabsTrigger value)\n * @property {boolean} [active] - 탭 패널 활성화 상태 (자동 설정됨) / Tab panel active state (auto-set)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n active?: boolean\n}\n\n/**\n * TabsContent 컴포넌트 / TabsContent component\n * 탭의 콘텐츠 패널을 표시합니다. Tabs 컴포넌트 내부에서 사용됩니다.\n * Displays the tab content panel. Used inside Tabs component.\n * \n * @component\n * @param {TabsContentProps} props - TabsContent 컴포넌트의 props / TabsContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} TabsContent 컴포넌트 / TabsContent component\n */\nconst TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, value, active, children, ...props }, ref) => {\n // active prop이 명시적으로 false로 설정된 경우에만 숨김\n if (active === false) return null\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n id={`tabpanel-${value}`}\n aria-labelledby={`tab-${value}`}\n hidden={!active}\n className={merge(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nTabsContent.displayName = \"TabsContent\"\n\n/**\n * Tabs 컴포넌트의 props / Tabs component props\n * @typedef {Object} TabsProps\n * @property {string} [value] - 현재 활성화된 탭 값 (제어 컴포넌트) / Currently active tab value (controlled component)\n * @property {string} [defaultValue] - 초기 활성화된 탭 값 (비제어 컴포넌트) / Initial active tab value (uncontrolled component)\n * @property {(value: string) => void} [onValueChange] - 탭 변경 시 호출되는 콜백 / Callback when tab changes\n * @property {\"horizontal\" | \"vertical\"} [orientation=\"horizontal\"] - 탭 방향 / Tab orientation\n * @property {\"default\" | \"pills\" | \"underline\" | \"cards\"} [variant=\"default\"] - 탭 스타일 변형 / Tab style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 탭 크기 / Tab size\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n orientation?: \"horizontal\" | \"vertical\"\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * Tabs 컴포넌트 / Tabs component\n * \n * 탭 네비게이션을 제공하는 컴포넌트입니다.\n * 키보드 네비게이션(Arrow keys, Home/End)을 지원하며, ARIA 속성을 자동으로 설정합니다.\n * \n * Component that provides tab navigation.\n * Supports keyboard navigation (Arrow keys, Home/End) and automatically sets ARIA attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Tabs defaultValue=\"tab1\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">탭 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">탭 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">탭 1 내용</TabsContent>\n * <TabsContent value=\"tab2\">탭 2 내용</TabsContent>\n * </Tabs>\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [activeTab, setActiveTab] = useState(\"tab1\")\n * <Tabs value={activeTab} onValueChange={setActiveTab}>\n * <TabsList>\n * <TabsTrigger value=\"tab1\">탭 1</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">내용</TabsContent>\n * </Tabs>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Tabs variant=\"pills\" size=\"lg\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Pills 스타일</TabsTrigger>\n * </TabsList>\n * </Tabs>\n * \n * @param {TabsProps} props - Tabs 컴포넌트의 props / Tabs component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Tabs 컴포넌트 / Tabs component\n */\nconst Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n ({ \n className, \n value,\n defaultValue,\n onValueChange,\n orientation = \"horizontal\",\n variant = \"default\",\n size = \"md\",\n children,\n ...props \n }, ref) => {\n const [activeTab, setActiveTab] = React.useState(value || defaultValue || \"\")\n const isControlled = value !== undefined\n const currentValue = isControlled ? value : activeTab\n\n const handleTabChange = (newValue: string) => {\n if (!isControlled) {\n setActiveTab(newValue)\n }\n onValueChange?.(newValue)\n }\n\n React.useEffect(() => {\n if (value !== undefined) {\n setActiveTab(value)\n }\n }, [value])\n\n return (\n <div\n ref={ref}\n className={merge(\n \"w-full\",\n orientation === \"vertical\" && \"flex\",\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n // TabsContent인 경우 active prop만 설정 (value는 원래 값 유지)\n if (child.type === TabsContent) {\n const childProps = child.props as TabsContentProps\n return React.cloneElement(child, {\n active: childProps.value === currentValue\n } as Partial<TabsContentProps>)\n }\n // TabsList인 경우에만 onValueChange 전달\n if (child.type === TabsList) {\n return React.cloneElement(child, {\n value: currentValue,\n onValueChange: handleTabChange,\n orientation,\n variant,\n size\n } as Partial<TabsListProps>)\n }\n // 다른 React 컴포넌트들 (다른 custom wrapper 등)\n // HTML 요소가 아닌 경우에만 props 전달\n if (typeof child.type !== 'string') {\n return React.cloneElement(child, {\n value: currentValue,\n onValueChange: handleTabChange,\n orientation,\n variant,\n size\n } as Record<string, unknown>)\n }\n }\n return child\n })}\n </div>\n )\n }\n)\nTabs.displayName = \"Tabs\"\n\n/**\n * TabsList 컴포넌트의 props / TabsList component props\n * @typedef {Object} TabsListProps\n * @property {string} [value] - 현재 활성화된 탭 값 (Tabs에서 자동 전달) / Currently active tab value (auto-passed from Tabs)\n * @property {(value: string) => void} [onValueChange] - 탭 변경 콜백 (Tabs에서 자동 전달) / Tab change callback (auto-passed from Tabs)\n * @property {\"horizontal\" | \"vertical\"} [orientation] - 탭 방향 (Tabs에서 자동 전달) / Tab orientation (auto-passed from Tabs)\n * @property {\"default\" | \"pills\" | \"underline\" | \"cards\"} [variant] - 탭 스타일 (Tabs에서 자동 전달) / Tab style (auto-passed from Tabs)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 탭 크기 (Tabs에서 자동 전달) / Tab size (auto-passed from Tabs)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n onValueChange?: (value: string) => void\n orientation?: \"horizontal\" | \"vertical\"\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TabsList 컴포넌트 / TabsList component\n * 탭 트리거 목록을 표시합니다. Tabs 컴포넌트 내부에서 사용됩니다.\n * Displays the list of tab triggers. Used inside Tabs component.\n * \n * @component\n * @param {TabsListProps} props - TabsList 컴포넌트의 props / TabsList component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} TabsList 컴포넌트 / TabsList component\n */\nconst TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n ({ \n className, \n value,\n onValueChange,\n orientation = \"horizontal\",\n variant = \"default\",\n size = \"md\",\n children,\n ...props \n }, ref) => {\n const listRef = React.useRef<HTMLDivElement>(null)\n React.useImperativeHandle(ref, () => listRef.current as HTMLDivElement)\n \n // 모든 탭 트리거의 value를 수집\n const tabValues = React.useMemo(() => {\n const values: string[] = []\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n const childProps = child.props as { value?: string }\n if (childProps.value) {\n values.push(childProps.value)\n }\n }\n })\n return values\n }, [children])\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!value || tabValues.length === 0) return\n\n const currentIndex = tabValues.indexOf(value)\n if (currentIndex === -1) return\n\n let newIndex = currentIndex\n\n if (orientation === \"horizontal\") {\n if (e.key === \"ArrowLeft\") {\n e.preventDefault()\n newIndex = currentIndex > 0 ? currentIndex - 1 : tabValues.length - 1\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault()\n newIndex = currentIndex < tabValues.length - 1 ? currentIndex + 1 : 0\n } else if (e.key === \"Home\") {\n e.preventDefault()\n newIndex = 0\n } else if (e.key === \"End\") {\n e.preventDefault()\n newIndex = tabValues.length - 1\n }\n } else {\n if (e.key === \"ArrowUp\") {\n e.preventDefault()\n newIndex = currentIndex > 0 ? currentIndex - 1 : tabValues.length - 1\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault()\n newIndex = currentIndex < tabValues.length - 1 ? currentIndex + 1 : 0\n } else if (e.key === \"Home\") {\n e.preventDefault()\n newIndex = 0\n } else if (e.key === \"End\") {\n e.preventDefault()\n newIndex = tabValues.length - 1\n }\n }\n\n if (newIndex !== currentIndex && tabValues[newIndex]) {\n onValueChange?.(tabValues[newIndex])\n // 포커스 이동\n const triggerElement = listRef.current?.querySelector(\n `[data-tab-value=\"${tabValues[newIndex]}\"]`\n ) as HTMLElement\n triggerElement?.focus()\n }\n }\n const getVariantClasses = () => {\n switch (variant) {\n case \"pills\":\n return \"bg-muted p-3 rounded-xl border border-border/50\"\n case \"underline\":\n return \"border-b border-border\"\n case \"cards\":\n return \"bg-muted/80 p-3 rounded-xl border border-border/50\"\n default:\n return \"bg-muted p-3 rounded-xl border border-border/50\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"h-12\"\n case \"lg\":\n return \"h-16\"\n default:\n return \"h-14\"\n }\n }\n\n return (\n <div\n ref={listRef}\n role=\"tablist\"\n aria-orientation={orientation}\n onKeyDown={handleKeyDown}\n className={merge(\n \"flex items-center justify-center\",\n orientation === \"vertical\" && \"flex-col\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n // Only pass tab props to non-HTML elements (React components)\n if (typeof child.type === 'string') {\n return child\n }\n const childProps = child.props as { value?: string }\n return React.cloneElement(child, {\n onValueChange,\n orientation,\n variant,\n size,\n active: childProps.value === value\n } as Partial<TabsTriggerProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nTabsList.displayName = \"TabsList\"\n\n/**\n * TabsTrigger 컴포넌트의 props\n * @typedef {Object} TabsTriggerProps\n * @property {string} value - 탭 트리거의 고유 값 (TabsContent의 value와 일치해야 함)\n * @property {(value: string) => void} [onValueChange] - 탭 변경 콜백 (TabsList에서 자동 전달)\n * @property {\"horizontal\" | \"vertical\"} [orientation] - 탭 방향 (TabsList에서 자동 전달)\n * @property {\"default\" | \"pills\" | \"underline\" | \"cards\"} [variant] - 탭 스타일 (TabsList에서 자동 전달)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 탭 크기 (TabsList에서 자동 전달)\n * @property {boolean} [active] - 탭 활성화 상태 (자동 설정됨)\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n onValueChange?: (value: string) => void\n orientation?: \"horizontal\" | \"vertical\"\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\"\n size?: \"sm\" | \"md\" | \"lg\"\n active?: boolean\n}\n\n/**\n * TabsTrigger 컴포넌트 / TabsTrigger component\n * 탭을 활성화하는 버튼입니다. TabsList 컴포넌트 내부에서 사용됩니다.\n * Button that activates a tab. Used inside TabsList component.\n * \n * @component\n * @param {TabsTriggerProps} props - TabsTrigger 컴포넌트의 props / TabsTrigger component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} TabsTrigger 컴포넌트 / TabsTrigger component\n */\nconst TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n ({ \n className,\n value,\n onValueChange,\n orientation: _orientation = \"horizontal\",\n variant = \"default\",\n size = \"md\",\n active = false,\n children,\n ...props\n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"pills\":\n return merge(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-lg px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active\n ? \"bg-background text-foreground shadow-md\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n )\n case \"underline\":\n return merge(\n \"inline-flex items-center justify-center whitespace-nowrap border-b-2 px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active\n ? \"border-primary text-primary\"\n : \"border-transparent text-muted-foreground hover:text-foreground\"\n )\n case \"cards\":\n return merge(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-lg px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active\n ? \"bg-background text-foreground shadow-md\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n )\n default:\n return merge(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-lg px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active\n ? \"bg-background text-foreground shadow-md\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n )\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"h-10 px-4 py-2 text-xs\"\n case \"lg\":\n return \"h-14 px-6 py-3 text-base\"\n default:\n return \"h-12 px-5 py-2.5 text-sm\"\n }\n }\n\n const handleClick = () => {\n if (onValueChange) {\n onValueChange(value)\n }\n }\n\n return (\n <button\n ref={ref}\n role=\"tab\"\n aria-selected={active}\n aria-controls={`tabpanel-${value}`}\n id={`tab-${value}`}\n data-tab-value={value}\n tabIndex={active ? 0 : -1}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n onClick={handleClick}\n type=\"button\"\n {...props}\n >\n {children}\n </button>\n )\n }\n)\nTabsTrigger.displayName = \"TabsTrigger\"\n\n// 편의 컴포넌트들\nconst TabsPills = React.forwardRef<HTMLDivElement, TabsProps>(\n (props, ref) => <Tabs ref={ref} variant=\"pills\" {...props} />\n)\nTabsPills.displayName = \"TabsPills\"\n\nconst TabsUnderline = React.forwardRef<HTMLDivElement, TabsProps>(\n (props, ref) => <Tabs ref={ref} variant=\"underline\" {...props} />\n)\nTabsUnderline.displayName = \"TabsUnderline\"\n\nconst TabsCards = React.forwardRef<HTMLDivElement, TabsProps>(\n (props, ref) => <Tabs ref={ref} variant=\"cards\" {...props} />\n)\nTabsCards.displayName = \"TabsCards\"\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, TabsPills, TabsUnderline, TabsCards } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Menu 컴포넌트의 props / Menu component props\n * @typedef {Object} MenuProps\n * @property {React.ReactNode} children - MenuItem, MenuSeparator, MenuLabel 컴포넌트들 / MenuItem, MenuSeparator, MenuLabel components\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant=\"default\"] - 메뉴 방향 및 스타일 / Menu direction and style\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 메뉴 아이템 크기 / Menu item size\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MenuProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * Menu 컴포넌트 / Menu component\n * \n * 메뉴 리스트를 제공하는 컴포넌트입니다.\n * MenuItem, MenuSeparator, MenuLabel과 함께 사용합니다.\n * \n * Component that provides menu lists.\n * Used with MenuItem, MenuSeparator, and MenuLabel.\n * \n * @component\n * @example\n * // 기본 수직 메뉴 / Basic vertical menu\n * <Menu>\n * <MenuItem icon={<Icon name=\"home\" />}>홈</MenuItem>\n * <MenuItem icon={<Icon name=\"settings\" />}>설정</MenuItem>\n * <MenuSeparator />\n * <MenuItem>로그아웃</MenuItem>\n * </Menu>\n * \n * @example\n * // 수평 메뉴 / Horizontal menu\n * <Menu variant=\"horizontal\">\n * <MenuItem>메뉴 1</MenuItem>\n * <MenuItem>메뉴 2</MenuItem>\n * </Menu>\n * \n * @param {MenuProps} props - Menu 컴포넌트의 props / Menu component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Menu 컴포넌트 / Menu component\n */\nconst Menu = React.forwardRef<HTMLDivElement, MenuProps>(\n ({ \n className, \n children,\n variant = \"default\",\n size = \"md\",\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return \"flex items-center space-x-1\" // 4px 간격\n case \"vertical\":\n return \"flex flex-col space-y-1\" // 4px 간격\n case \"compact\":\n return \"flex flex-col space-y-0.5\" // 2px 간격\n default:\n return \"flex flex-col space-y-1\" // 4px 간격\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\n ref={ref}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n variant,\n size\n } as Partial<MenuItemProps | MenuSeparatorProps | MenuLabelProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nMenu.displayName = \"Menu\"\n\n/**\n * MenuItem 컴포넌트의 props / MenuItem component props\n * @typedef {Object} MenuItemProps\n * @property {React.ReactNode} [icon] - 메뉴 아이템 아이콘 / Menu item icon\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant] - 메뉴 변형 (Menu에서 자동 전달) / Menu variant (auto-passed from Menu)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 메뉴 크기 (Menu에서 자동 전달) / Menu size (auto-passed from Menu)\n * @property {boolean} [active=false] - 활성화 상태 / Active state\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface MenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n size?: \"sm\" | \"md\" | \"lg\"\n active?: boolean\n disabled?: boolean\n}\n\n/**\n * MenuItem 컴포넌트 / MenuItem component\n * 메뉴의 개별 아이템을 표시합니다.\n * Displays an individual menu item.\n * \n * @component\n * @param {MenuItemProps} props - MenuItem 컴포넌트의 props / MenuItem component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} MenuItem 컴포넌트 / MenuItem component\n */\nconst MenuItem = React.forwardRef<HTMLButtonElement, MenuItemProps>(\n ({ \n className, \n icon,\n variant = \"default\",\n size = \"md\",\n active = false,\n disabled = false,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return merge(\n \"flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors\", // 12px, 8px 패딩\n active \n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n case \"vertical\":\n return merge(\n \"flex items-center gap-3 px-4 py-3 rounded-md text-sm font-medium transition-colors\", // 16px, 12px 패딩\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n case \"compact\":\n return merge(\n \"flex items-center gap-2 px-2 py-1.5 rounded text-sm font-medium transition-colors\", // 8px, 6px 패딩\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n default:\n return merge(\n \"flex items-center gap-3 px-4 py-3 rounded-md text-sm font-medium transition-colors\", // 16px, 12px 패딩\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-xs\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n disabled={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)\nMenuItem.displayName = \"MenuItem\"\n\n/**\n * MenuSeparator 컴포넌트의 props / MenuSeparator component props\n * @typedef {Object} MenuSeparatorProps\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant] - 메뉴 변형 (Menu에서 자동 전달) / Menu variant (auto-passed from Menu)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MenuSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n}\n\n/**\n * MenuSeparator 컴포넌트 / MenuSeparator component\n * 메뉴 아이템들을 구분하는 구분선을 표시합니다.\n * Displays a separator line between menu items.\n * \n * @component\n * @param {MenuSeparatorProps} props - MenuSeparator 컴포넌트의 props / MenuSeparator component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} MenuSeparator 컴포넌트 / MenuSeparator component\n */\nconst MenuSeparator = React.forwardRef<HTMLDivElement, MenuSeparatorProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return \"w-px h-4 bg-border mx-1\" // 4px 여백\n case \"vertical\":\n case \"compact\":\n default:\n return \"h-px bg-border my-2\" // 8px 여백\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(getVariantClasses(), className)}\n {...props}\n />\n )\n }\n)\nMenuSeparator.displayName = \"MenuSeparator\"\n\n/**\n * MenuLabel 컴포넌트의 props / MenuLabel component props\n * @typedef {Object} MenuLabelProps\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant] - 메뉴 변형 (Menu에서 자동 전달) / Menu variant (auto-passed from Menu)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 메뉴 크기 (Menu에서 자동 전달) / Menu size (auto-passed from Menu)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MenuLabelProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * MenuLabel 컴포넌트 / MenuLabel component\n * 메뉴 섹션의 레이블을 표시합니다.\n * Displays a label for a menu section.\n * \n * @component\n * @param {MenuLabelProps} props - MenuLabel 컴포넌트의 props / MenuLabel component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} MenuLabel 컴포넌트 / MenuLabel component\n */\nconst MenuLabel = React.forwardRef<HTMLDivElement, MenuLabelProps>(\n ({ className, variant = \"default\", size = \"md\", children, ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return \"px-3 py-1 text-xs font-semibold text-muted-foreground uppercase tracking-wide\" // 12px, 4px 패딩\n case \"vertical\":\n case \"compact\":\n default:\n return \"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\" // 16px, 8px 패딩\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-xs\"\n case \"lg\":\n return \"text-sm\"\n default:\n return \"text-xs\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nMenuLabel.displayName = \"MenuLabel\"\n\n// 편의 컴포넌트들\nexport const MenuHorizontal = React.forwardRef<HTMLDivElement, Omit<MenuProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Menu ref={ref} variant=\"horizontal\" className={className} {...props} />\n )\n)\nMenuHorizontal.displayName = \"MenuHorizontal\"\n\nexport const MenuVertical = React.forwardRef<HTMLDivElement, Omit<MenuProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Menu ref={ref} variant=\"vertical\" className={className} {...props} />\n )\n)\nMenuVertical.displayName = \"MenuVertical\"\n\nexport const MenuCompact = React.forwardRef<HTMLDivElement, Omit<MenuProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Menu ref={ref} variant=\"compact\" className={className} {...props} />\n )\n)\nMenuCompact.displayName = \"MenuCompact\"\n\nexport { Menu, MenuItem, MenuSeparator, MenuLabel } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * ContextMenu 컴포넌트의 props / ContextMenu component props\n * @typedef {Object} ContextMenuProps\n * @property {React.ReactNode} children - ContextMenu 내용 / ContextMenu content\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {React.ReactNode} [trigger] - ContextMenu를 열기 위한 트리거 요소 (우클릭 이벤트) / Trigger element to open context menu (right-click event)\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [placement=\"bottom\"] - ContextMenu 표시 위치 / ContextMenu display position\n * @property {\"start\" | \"center\" | \"end\"} [align=\"start\"] - ContextMenu 정렬 / ContextMenu alignment\n * @property {number} [offset=8] - 트리거와 ContextMenu 사이 간격 (px) / Spacing between trigger and context menu (px)\n * @property {boolean} [disabled=false] - ContextMenu 비활성화 여부 / Disable context menu\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ContextMenuProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n trigger?: React.ReactNode\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\"\n align?: \"start\" | \"center\" | \"end\"\n offset?: number\n disabled?: boolean\n}\n\n/**\n * ContextMenu 컴포넌트 / ContextMenu component\n * \n * 우클릭 시 표시되는 컨텍스트 메뉴 컴포넌트입니다.\n * 트리거 요소에 우클릭 이벤트를 자동으로 연결합니다.\n * \n * Context menu component that appears on right-click.\n * Automatically connects right-click events to the trigger element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ContextMenu trigger={<div>우클릭하세요</div>}>\n * <div className=\"p-2\">\n * <button>항목 1</button>\n * <button>항목 2</button>\n * </div>\n * </ContextMenu>\n * \n * @example\n * // 제어 모드 / Controlled mode\n * const [open, setOpen] = useState(false)\n * <ContextMenu \n * open={open}\n * onOpenChange={setOpen}\n * trigger={<div>우클릭</div>}\n * >\n * <Menu>\n * <MenuItem>복사</MenuItem>\n * <MenuItem>삭제</MenuItem>\n * </Menu>\n * </ContextMenu>\n * \n * @param {ContextMenuProps} props - ContextMenu 컴포넌트의 props / ContextMenu component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ContextMenu 컴포넌트 / ContextMenu component\n */\nconst ContextMenu = React.forwardRef<HTMLDivElement, ContextMenuProps>(\n ({ \n className, \n children,\n open: controlledOpen,\n onOpenChange,\n trigger,\n placement: _placement = \"bottom\",\n align: _align = \"start\",\n offset: _offset = 8,\n disabled = false,\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 menuRef = React.useRef<HTMLDivElement>(null)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const handleOpenChange = React.useCallback((newOpen: boolean) => {\n if (disabled) return\n\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }, [disabled, isControlled, onOpenChange])\n\n const handleContextMenu = (event: React.MouseEvent) => {\n event.preventDefault()\n if (disabled) return\n\n const _rect = event.currentTarget.getBoundingClientRect()\n const x = event.clientX\n const y = event.clientY\n\n setCoords({ x, y })\n handleOpenChange(true)\n }\n\n const updatePosition = React.useCallback(() => {\n if (!menuRef.current) return\n\n const menuRect = menuRef.current.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let x = coords.x\n let y = coords.y\n\n // 뷰포트 경계 확인 및 조정\n if (x + menuRect.width > viewportWidth - 8) {\n x = viewportWidth - menuRect.width - 8 // 8px 여백\n }\n if (y + menuRect.height > viewportHeight - 8) {\n y = viewportHeight - menuRect.height - 8 // 8px 여백\n }\n if (x < 8) x = 8 // 8px 여백\n if (y < 8) y = 8 // 8px 여백\n\n setCoords({ x, y })\n }, [coords.x, coords.y])\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 menuRef.current &&\n !triggerRef.current.contains(event.target as Node) &&\n !menuRef.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, handleOpenChange])\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {/* 트리거 */}\n {trigger && (\n <div\n ref={triggerRef}\n onContextMenu={handleContextMenu}\n className=\"inline-block\"\n >\n {trigger}\n </div>\n )}\n\n {/* 컨텍스트 메뉴 */}\n {isOpen && (\n <div\n ref={menuRef}\n className={merge(\n \"fixed z-50 bg-popover text-popover-foreground rounded-lg shadow-xl backdrop-blur-sm\", // 보더 대신 섀도우 사용\n \"min-w-[200px] py-2\", // 16px 패딩\n \"border-0\" // 보더 제거\n )}\n style={{\n left: coords.x,\n top: coords.y,\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 {children}\n </div>\n )}\n </div>\n )\n }\n)\nContextMenu.displayName = \"ContextMenu\"\n\nexport interface ContextMenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"destructive\" | \"disabled\"\n}\n\nconst ContextMenuItem = React.forwardRef<HTMLButtonElement, ContextMenuItemProps>(\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-destructive hover:bg-destructive/10\"\n case \"disabled\":\n return \"text-muted-foreground cursor-not-allowed\"\n default:\n return \"text-foreground hover:bg-muted\"\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 duration-200 ease-in-out focus-visible:outline-none focus-visible:bg-muted\", // 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)\nContextMenuItem.displayName = \"ContextMenuItem\"\n\nexport interface ContextMenuSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst ContextMenuSeparator = React.forwardRef<HTMLDivElement, ContextMenuSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-border my-2\", className)} // 8px 여백\n {...props}\n />\n )\n)\nContextMenuSeparator.displayName = \"ContextMenuSeparator\"\n\nexport interface ContextMenuLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst ContextMenuLabel = React.forwardRef<HTMLDivElement, ContextMenuLabelProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\", className)} // 16px, 8px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nContextMenuLabel.displayName = \"ContextMenuLabel\"\n\n// 편의 컴포넌트들\nconst ContextMenuGroup = 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)\nContextMenuGroup.displayName = \"ContextMenuGroup\"\n\nexport { ContextMenu, ContextMenuItem, ContextMenuSeparator, ContextMenuLabel, ContextMenuGroup } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Command 컴포넌트의 props / Command component props\n * @typedef {Object} CommandProps\n * @property {React.ReactNode} children - CommandList, CommandItem 등 / CommandList, CommandItem, etc.\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {string} [placeholder=\"명령어를 검색하세요...\"] - 검색 입력 플레이스홀더 / Search input placeholder\n * @property {string} [searchValue] - 제어 모드에서 검색 값 / Search value in controlled mode\n * @property {(value: string) => void} [onSearchChange] - 검색 값 변경 콜백 / Search value change callback\n * @property {boolean} [disabled=false] - Command 비활성화 여부 / Disable command\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n placeholder?: string\n searchValue?: string\n onSearchChange?: (value: string) => void\n disabled?: boolean\n}\n\n/**\n * Command 컴포넌트 / Command component\n * \n * 명령 팔레트(Command Palette) 컴포넌트입니다.\n * Cmd+K (Mac) 또는 Ctrl+K (Windows)로 열 수 있습니다.\n * 키보드 네비게이션(Arrow keys, Enter, Escape)을 지원합니다.\n * \n * Command Palette component.\n * Can be opened with Cmd+K (Mac) or Ctrl+K (Windows).\n * Supports keyboard navigation (Arrow keys, Enter, Escape).\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Command>\n * <CommandInput placeholder=\"검색...\" />\n * <CommandList>\n * <CommandItem>항목 1</CommandItem>\n * <CommandItem>항목 2</CommandItem>\n * </CommandList>\n * </Command>\n * \n * @example\n * // 제어 모드 / Controlled mode\n * const [open, setOpen] = useState(false)\n * <Command \n * open={open}\n * onOpenChange={setOpen}\n * >\n * <CommandList>\n * <CommandGroup heading=\"파일\">\n * <CommandItem>새 파일</CommandItem>\n * </CommandGroup>\n * </CommandList>\n * </Command>\n * \n * @param {CommandProps} props - Command 컴포넌트의 props / Command component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Command 컴포넌트 / Command component\n */\nconst Command = React.forwardRef<HTMLDivElement, CommandProps>(\n ({ \n className, \n children,\n open: controlledOpen,\n onOpenChange,\n placeholder = \"명령어를 검색하세요...\",\n searchValue: controlledSearchValue,\n onSearchChange,\n disabled = false,\n ...props \n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const [internalSearchValue, setInternalSearchValue] = React.useState(\"\")\n const [selectedIndex, setSelectedIndex] = React.useState(0)\n const commandRef = React.useRef<HTMLDivElement>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const listRef = React.useRef<HTMLDivElement>(null)\n \n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n const searchValue = controlledSearchValue !== undefined ? controlledSearchValue : internalSearchValue\n\n const handleOpenChange = React.useCallback((newOpen: boolean) => {\n if (disabled) return\n\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }, [disabled, isControlled, onOpenChange])\n\n const handleSearchChange = (value: string) => {\n if (!isControlled) {\n setInternalSearchValue(value)\n }\n onSearchChange?.(value)\n setSelectedIndex(0)\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return\n\n const items = listRef.current?.querySelectorAll('[data-command-item]')\n const itemCount = items?.length || 0\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setSelectedIndex((prev) => (prev + 1) % itemCount)\n break\n case 'ArrowUp':\n event.preventDefault()\n setSelectedIndex((prev) => (prev - 1 + itemCount) % itemCount)\n break\n case 'Enter': {\n event.preventDefault()\n const selectedItem = items?.[selectedIndex] as HTMLElement\n selectedItem?.click()\n break\n }\n case 'Escape':\n event.preventDefault()\n handleOpenChange(false)\n break\n }\n }\n\n React.useEffect(() => {\n if (isOpen) {\n inputRef.current?.focus()\n setSelectedIndex(0)\n }\n }, [isOpen])\n\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'k' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n handleOpenChange(!isOpen)\n }\n // 전역 ESC 키 처리\n if (event.key === 'Escape' && isOpen) {\n event.preventDefault()\n handleOpenChange(false)\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [isOpen, handleOpenChange])\n\n React.useEffect(() => {\n const selectedItem = listRef.current?.querySelector(`[data-command-item]:nth-child(${selectedIndex + 1})`) as HTMLElement\n selectedItem?.scrollIntoView({ block: 'nearest' })\n }, [selectedIndex])\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {isOpen && (\n <div\n ref={commandRef}\n className={merge(\n \"fixed inset-0 z-50 bg-black/50 backdrop-blur-sm\", // 50% 투명도\n \"flex items-start justify-center pt-16\" // 64px 상단 여백\n )}\n onClick={() => handleOpenChange(false)}\n >\n <div\n className={merge(\n \"w-full max-w-2xl mx-4 bg-popover text-popover-foreground rounded-lg shadow-2xl\", // 보더 대신 섀도우\n \"border-0 overflow-hidden\" // 보더 제거\n )}\n onClick={(e) => e.stopPropagation()}\n style={{\n boxShadow: \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\"\n }}\n >\n <div className=\"p-4 border-b border-border\"> {/* 16px 패딩 */}\n <input\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n value={searchValue}\n onChange={(e) => handleSearchChange(e.target.value)}\n onKeyDown={handleKeyDown}\n className={merge(\n \"w-full bg-transparent text-lg font-medium outline-none\", // 18px 텍스트\n \"placeholder:text-muted-foreground\",\n \"text-foreground\"\n )}\n />\n </div>\n \n <div\n ref={listRef}\n className=\"max-h-96 overflow-y-auto py-2\" // 384px 최대 높이, 8px 패딩\n >\n {React.Children.map(children, (child, index) => {\n if (React.isValidElement<CommandItemProps>(child)) {\n // Fragment나 다른 컴포넌트에 selected prop 전달 방지\n if (child.type === React.Fragment || typeof child.type === 'symbol') {\n return child\n }\n return React.cloneElement(child, {\n selected: index === selectedIndex,\n onSelect: () => {\n child.props.onSelect?.()\n handleOpenChange(false)\n }\n })\n }\n return child\n })}\n </div>\n </div>\n </div>\n )}\n </div>\n )\n }\n)\nCommand.displayName = \"Command\"\n\n/**\n * CommandInput 컴포넌트의 props / CommandInput component props\n * @typedef {Object} CommandInputProps\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\n */\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst CommandInput = React.forwardRef<HTMLInputElement, CommandInputProps>(\n ({ className, ...props }, ref) => (\n <input\n ref={ref}\n className={merge(\n \"flex h-10 w-full rounded-md bg-transparent px-3 py-2 text-sm outline-none\", // 40px 높이, 12px, 8px 패딩\n \"placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n)\nCommandInput.displayName = \"CommandInput\"\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CommandList = React.forwardRef<HTMLDivElement, CommandListProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"max-h-96 overflow-y-auto py-2\", className)} // 384px 최대 높이, 8px 패딩\n {...props}\n />\n )\n)\nCommandList.displayName = \"CommandList\"\n\n/**\n * CommandItem 컴포넌트의 props / CommandItem component props\n * @typedef {Object} CommandItemProps\n * @property {React.ReactNode} [icon] - 항목 아이콘 / Item icon\n * @property {boolean} [selected=false] - 선택 상태 / Selected state\n * @property {() => void} [onSelect] - 선택 시 콜백 / Selection callback\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface CommandItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n selected?: boolean\n onSelect?: () => void\n}\n\nconst CommandItem = React.forwardRef<HTMLButtonElement, CommandItemProps>(\n ({ \n className, \n icon,\n selected = false,\n onSelect,\n children,\n ...props \n }, ref) => {\n return (\n <button\n ref={ref}\n data-command-item\n className={merge(\n \"relative flex w-full items-center gap-3 rounded-sm px-4 py-3 text-sm\", // 16px, 12px 패딩\n \"text-foreground\",\n \"hover:bg-muted\",\n \"focus:bg-muted\",\n \"focus:outline-none\",\n selected && \"bg-muted\",\n \"transition-colors\",\n className\n )}\n onClick={onSelect}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4 text-muted-foreground\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nCommandItem.displayName = \"CommandItem\"\n\n/**\n * CommandGroup 컴포넌트의 props / CommandGroup component props\n * @typedef {Object} CommandGroupProps\n * @property {React.ReactNode} [heading] - 그룹 제목 / Group heading\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n heading?: React.ReactNode\n}\n\nconst CommandGroup = React.forwardRef<HTMLDivElement, CommandGroupProps>(\n ({ className, heading, children, ...props }, ref) => (\n <div ref={ref} className={merge(\"py-2\", className)} {...props}> {/* 8px 패딩 */}\n {heading && (\n <div className=\"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\"> {/* 16px, 8px 패딩 */}\n {heading}\n </div>\n )}\n <div className=\"space-y-1\"> {/* 4px 간격 */}\n {children}\n </div>\n </div>\n )\n)\nCommandGroup.displayName = \"CommandGroup\"\n\n/**\n * CommandSeparator 컴포넌트의 props / CommandSeparator component props\n * @typedef {Object} CommandSeparatorProps\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CommandSeparator = React.forwardRef<HTMLDivElement, CommandSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-border my-2\", className)} // 8px 여백\n {...props}\n />\n )\n)\nCommandSeparator.displayName = \"CommandSeparator\"\n\n/**\n * CommandEmpty 컴포넌트의 props / CommandEmpty component props\n * @typedef {Object} CommandEmptyProps\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CommandEmpty = React.forwardRef<HTMLDivElement, CommandEmptyProps>(\n ({ className, children = \"결과가 없습니다.\", ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\n \"py-8 text-center text-sm text-muted-foreground\", // 32px 패딩\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n)\nCommandEmpty.displayName = \"CommandEmpty\"\n\n// 편의 컴포넌트들\nexport const CommandDialog = React.forwardRef<HTMLDivElement, CommandProps>(\n ({ className, ...props }, ref) => (\n <Command ref={ref} className={className} {...props} />\n )\n)\nCommandDialog.displayName = \"CommandDialog\"\n\nexport { Command, CommandInput, CommandList, CommandItem, CommandGroup, CommandSeparator, CommandEmpty } "]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/lib/icons.ts","../src/lib/case-utils.ts","../src/lib/icon-providers.ts","../src/lib/icon-aliases.ts","../src/lib/normalize-icon-name.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/components/Icon/Icon.tsx","../src/components/Accordion.tsx","../src/components/Tabs.tsx","../src/components/Menu.tsx","../src/components/ContextMenu.tsx","../src/components/Command.tsx"],"names":["merge","inputs","twMerge","clsx","mergeMap","classMap","classes","condition","className","icons","House","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","ListIcon","X","MagnifyingGlass","Gear","ArrowSquareOut","CaretLeft","CaretRight","CaretDown","CaretUp","Pencil","Trash","Plus","Minus","Download","Upload","ArrowClockwise","FloppyDisk","Copy","SpinnerGap","CheckCircle","XCircle","WarningCircle","Info","Check","Circle","Question","User","Users","UserPlus","SignIn","SignOut","Eye","EyeSlash","ChartBar","TrendUp","Pulse","Database","Lightning","FileText","File","Folder","Book","BookOpen","Envelope","ChatCircle","Phone","Image","Video","Camera","Smiley","SmileySad","SmileyMeh","Lock","LockOpen","Shield","Wallet","Key","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","Sparkle","Globe","DeviceMobile","Ticket","Clipboard","WifiHigh","WifiSlash","Cpu","MaskHappy","Rocket","Layout","Megaphone","Stack","Prohibit","TextB","TextItalic","TextStrikethrough","TextHOne","Link","Code","FileCode","Quotes","List","ListNumbers","emotionIcons","statusIcons","toCamelCase","str","word","index","PhosphorIcons","LucideIcons","PROJECT_ICONS","initPhosphorIcons","initLucideIcons","getIconFromProvider","iconName","provider","iconMapping","getIconDirect","mappedName","phosphorName1","phosphorName2","lucideName","camelCaseName","match","getIconNameForProvider","ICON_ALIASES","normalizeIconName","camelCased","aliasTarget","defaultIconConfig","IconContext","createContext","useIconContext","useContext","IconComponent","React","name","size","emotion","status","weight","animated","pulse","spin","bounce","variant","ariaLabel","ariaHidden","ref","_a","_b","config","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","iconsaxVariant","isClient","setIsClient","providerReady","setProviderReady","resolvedIcon","baseName","normalized","providerName","iconsaxIcon","variantClasses","jsx","ResolvedIcon","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","props","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon","Accordion","children","type","defaultValue","value","onValueChange","collapsible","openItems","setOpenItems","handleItemToggle","itemValue","newOpenItems","item","itemValues","values","child","childProps","handleKeyDown","e","target","currentValue","currentIndex","newIndex","triggerElement","AccordionItem","disabled","onToggle","isOpen","AccordionTrigger","icon","iconPosition","defaultIcon","contentId","triggerId","jsxs","AccordionContent","dataValue","height","setHeight","contentRef","TabsContent","active","Tabs","orientation","activeTab","setActiveTab","isControlled","handleTabChange","newValue","TabsList","listRef","tabValues","getVariantClasses","getSizeClasses","TabsTrigger","_orientation","handleClick","TabsPills","TabsUnderline","TabsCards","Menu","MenuItem","MenuSeparator","MenuLabel","MenuHorizontal","MenuVertical","MenuCompact","ContextMenu","controlledOpen","onOpenChange","trigger","_placement","_align","_offset","internalOpen","setInternalOpen","coords","setCoords","triggerRef","menuRef","handleOpenChange","newOpen","handleContextMenu","event","x","y","updatePosition","menuRect","viewportWidth","viewportHeight","handleClickOutside","ContextMenuItem","ContextMenuSeparator","ContextMenuLabel","ContextMenuGroup","Command","placeholder","controlledSearchValue","onSearchChange","internalSearchValue","setInternalSearchValue","selectedIndex","setSelectedIndex","commandRef","inputRef","searchValue","handleSearchChange","items","itemCount","prev","selectedItem","CommandInput","CommandList","CommandItem","selected","onSelect","CommandGroup","heading","CommandSeparator","CommandEmpty","CommandDialog"],"mappings":"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","file":"interactive.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\n/**\n * HUA UI의 스마트 클래스 병합 유틸리티\n * clsx와 tailwind-merge를 결합하여 중복 클래스를 자동으로 해결합니다.\n * \n * @param inputs - 병합할 클래스 값들\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * merge(\"px-2 py-1\", \"px-4\") // \"py-1 px-4\"\n * merge(\"text-red-500\", \"text-blue-500\") // \"text-blue-500\"\n * merge(\"bg-white\", \"dark:bg-slate-900\") // \"bg-white dark:bg-slate-900\"\n * ```\n */\nexport function merge(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * 조건부 클래스 병합 유틸리티\n * 조건에 따라 클래스를 선택적으로 병합합니다.\n * \n * @param condition - 클래스를 적용할 조건\n * @param trueClass - 조건이 true일 때 적용할 클래스\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeIf(isActive, \"bg-blue-500\", \"bg-gray-200\")\n * mergeIf(isLoading, \"opacity-50 cursor-not-allowed\")\n * ```\n */\nexport function mergeIf(\n condition: boolean,\n trueClass: ClassValue,\n falseClass?: ClassValue\n) {\n return merge(condition ? trueClass : falseClass || \"\")\n}\n\n/**\n * 상대 시간 포맷팅 유틸리티\n * \n * 날짜를 상대 시간 형식으로 포맷팅합니다 (예: \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * 7일 이상 경과한 경우 절대 날짜를 반환합니다.\n * \n * Formats a date as relative time (e.g., \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * Returns absolute date for dates older than 7 days.\n * \n * @param timestamp - 포맷팅할 날짜 (Date 객체 또는 ISO 문자열) / Date to format (Date object or ISO string)\n * @param locale - 로케일 (기본값: \"ko-KR\") / Locale (default: \"ko-KR\")\n * @returns 포맷팅된 상대 시간 문자열 / Formatted relative time string\n * \n * @example\n * ```tsx\n * formatRelativeTime(new Date()) // \"방금 전\"\n * formatRelativeTime(new Date(Date.now() - 5 * 60000)) // \"5분 전\"\n * formatRelativeTime(new Date(Date.now() - 2 * 3600000)) // \"2시간 전\"\n * formatRelativeTime(new Date(Date.now() - 3 * 86400000)) // \"3일 전\"\n * formatRelativeTime(new Date(\"2024-01-01\")) // \"2024. 1. 1.\" (7일 이상 경과)\n * ```\n */\nexport function formatRelativeTime(timestamp: Date | string, locale = \"ko-KR\"): string {\n const date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return locale === \"ko-KR\" ? \"방금 전\" : \"just now\";\n if (minutes < 60) return locale === \"ko-KR\" ? `${minutes}분 전` : `${minutes}m ago`;\n if (hours < 24) return locale === \"ko-KR\" ? `${hours}시간 전` : `${hours}h ago`;\n if (days < 7) return locale === \"ko-KR\" ? `${days}일 전` : `${days}d ago`;\n return date.toLocaleDateString(locale);\n}\n\n/**\n * 객체 기반 클래스 병합 유틸리티\n * 객체의 키-값 쌍을 기반으로 조건부 클래스를 병합합니다.\n * \n * @param classMap - 클래스 맵 객체\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeMap({\n * \"bg-blue-500\": isPrimary,\n * \"bg-gray-500\": !isPrimary,\n * \"text-white\": true,\n * \"opacity-50\": isDisabled\n * })\n * ```\n */\nexport function mergeMap(classMap: Record<string, boolean | undefined | null>) {\n const classes = Object.entries(classMap)\n .filter(([, condition]) => condition)\n .map(([className]) => className)\n \n return merge(...classes)\n}\n\n// 하위 호환성을 위해 cn도 export (점진적 마이그레이션 지원)\nexport const cn = merge ","/**\n * Core Icons (Phosphor Icons)\n *\n * 핵심 아이콘만 포함하여 번들 크기를 최적화합니다.\n * 나머지 아이콘은 동적 fallback으로 처리됩니다.\n *\n * 포함 기준:\n * 1. my-app에서 실제 사용 중인 아이콘\n * 2. UI 컴포넌트에서 자주 사용되는 아이콘\n * 3. 각 카테고리의 대표 아이콘\n *\n * 새로운 아이콘이 필요하면 동적 fallback이 자동으로 처리합니다.\n */\n\nimport {\n // Navigation\n House,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowDown,\n List as ListIcon,\n X,\n MagnifyingGlass,\n Gear,\n ArrowSquareOut,\n CaretLeft,\n CaretRight,\n CaretDown,\n CaretUp,\n\n // Actions\n Pencil,\n Trash,\n Plus,\n Minus,\n Download,\n Upload,\n ArrowClockwise,\n FloppyDisk,\n Copy,\n\n // Text Formatting (Markdown Toolbar)\n TextB,\n TextItalic,\n TextStrikethrough,\n TextHOne,\n Link,\n Code,\n FileCode,\n Quotes,\n List,\n ListNumbers,\n\n // Status & Feedback\n SpinnerGap,\n CheckCircle,\n XCircle,\n WarningCircle,\n Info,\n Check,\n Circle,\n Question,\n\n // User & Auth\n User,\n Users,\n UserPlus,\n SignIn,\n SignOut,\n Eye,\n EyeSlash,\n\n // Data & Analytics\n ChartBar,\n TrendUp,\n Pulse,\n Database,\n Lightning,\n\n // Files & Content\n FileText,\n File,\n Folder,\n Book,\n BookOpen,\n\n // Communication\n Envelope,\n ChatCircle,\n Phone,\n\n // Media\n Image,\n Video,\n Camera,\n\n // Emotions\n Smiley,\n SmileySad,\n SmileyMeh,\n\n // Security\n Lock,\n LockOpen,\n Shield,\n Wallet,\n Key,\n\n // Time & Date\n Clock,\n Calendar,\n CalendarPlus,\n\n // UI Elements\n Bell,\n Heart,\n Star,\n Bookmark,\n Share,\n\n // Theme\n Monitor,\n Sun,\n Moon,\n\n // Additional\n Lightbulb,\n Brain,\n Flag,\n Square,\n Sparkle,\n Globe,\n DeviceMobile,\n Ticket,\n Clipboard,\n WifiHigh,\n WifiSlash,\n Cpu,\n MaskHappy,\n Rocket,\n\n // Admin\n Layout,\n Megaphone,\n Stack,\n Prohibit,\n} from '@phosphor-icons/react/dist/ssr'\n\n// 핵심 아이콘 객체 (키는 기존과 동일, 값만 Phosphor로 교체)\nexport const icons = {\n // Navigation\n home: House,\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n arrowUp: ArrowUp,\n arrowDown: ArrowDown,\n menu: ListIcon,\n close: X,\n search: MagnifyingGlass,\n settings: Gear,\n externalLink: ArrowSquareOut,\n chevronLeft: CaretLeft,\n chevronRight: CaretRight,\n chevronDown: CaretDown,\n chevronUp: CaretUp,\n\n // Actions\n edit: Pencil,\n delete: Trash,\n add: Plus,\n remove: Minus,\n download: Download,\n upload: Upload,\n refresh: ArrowClockwise,\n save: FloppyDisk,\n copy: Copy,\n\n // Status & Feedback\n loader: SpinnerGap,\n success: CheckCircle,\n error: XCircle,\n alertCircle: WarningCircle,\n warning: WarningCircle,\n info: Info,\n check: Check,\n circle: Circle,\n helpCircle: Question,\n\n // User & Auth\n user: User,\n users: Users,\n userPlus: UserPlus,\n logIn: SignIn,\n logOut: SignOut,\n eye: Eye,\n eyeOff: EyeSlash,\n\n // Data & Analytics\n chart: ChartBar,\n barChart: ChartBar,\n trendingUp: TrendUp,\n activity: Pulse,\n database: Database,\n zap: Lightning,\n\n // Files & Content\n fileText: FileText,\n file: File,\n folder: Folder,\n book: Book,\n bookOpen: BookOpen,\n\n // Communication\n mail: Envelope,\n message: ChatCircle,\n phone: Phone,\n\n // Media\n image: Image,\n video: Video,\n camera: Camera,\n\n // Emotions\n smile: Smiley,\n frown: SmileySad,\n meh: SmileyMeh,\n\n // Security\n lock: Lock,\n unlock: LockOpen,\n shield: Shield,\n wallet: Wallet,\n key: Key,\n\n // Time & Date\n clock: Clock,\n calendar: Calendar,\n calendarPlus: CalendarPlus,\n\n // UI Elements\n bell: Bell,\n heart: Heart,\n star: Star,\n bookmark: Bookmark,\n share: Share,\n\n // Theme\n monitor: Monitor,\n sun: Sun,\n moon: Moon,\n\n // Additional\n lightbulb: Lightbulb,\n brain: Brain,\n flag: Flag,\n square: Square,\n sparkle: Sparkle,\n sparkles: Sparkle,\n globe: Globe,\n smartphone: DeviceMobile,\n deviceMobile: DeviceMobile,\n floppyDisk: FloppyDisk,\n\n // Connectivity\n ticket: Ticket,\n clipboard: Clipboard,\n wifi: WifiHigh,\n wifiOff: WifiSlash,\n cpu: Cpu,\n mask: MaskHappy,\n rocket: Rocket,\n\n // Admin\n layout: Layout,\n megaphone: Megaphone,\n layers: Stack,\n ban: Prohibit,\n\n // Text Formatting (Markdown Toolbar)\n bold: TextB,\n italic: TextItalic,\n strikethrough: TextStrikethrough,\n heading: TextHOne,\n link: Link,\n code: Code,\n fileCode: FileCode,\n quote: Quotes,\n list: List,\n listOrdered: ListNumbers,\n minus: Minus,\n} as const\n\n// 아이콘 이름 타입\nexport type IconName = keyof typeof icons\n\n// 감정별 아이콘 매핑\nexport const emotionIcons = {\n happy: 'smile',\n sad: 'frown',\n neutral: 'meh',\n excited: 'smile',\n angry: 'frown',\n love: 'heart',\n like: 'heart',\n dislike: 'frown',\n} as const\n\n// 상태별 아이콘 매핑\nexport const statusIcons = {\n loading: 'loader',\n success: 'success',\n error: 'error',\n warning: 'warning',\n info: 'info',\n locked: 'lock',\n unlocked: 'unlock',\n visible: 'eye',\n hidden: 'eyeOff',\n} as const\n\n// 아이콘 카테고리별 그룹화 (참고용)\nexport const iconCategories = {\n navigation: ['home', 'arrowLeft', 'arrowRight', 'arrowUp', 'arrowDown', 'menu', 'close', 'search', 'settings', 'externalLink', 'chevronLeft', 'chevronRight', 'chevronDown', 'chevronUp'],\n actions: ['edit', 'delete', 'add', 'remove', 'download', 'upload', 'refresh', 'save', 'copy'],\n status: ['loader', 'success', 'error', 'alertCircle', 'warning', 'info', 'check', 'circle'],\n user: ['user', 'users', 'userPlus', 'logIn', 'logOut', 'eye', 'eyeOff'],\n data: ['chart', 'barChart', 'trendingUp', 'activity', 'database', 'zap'],\n files: ['fileText', 'file', 'folder', 'book'],\n communication: ['mail', 'message', 'phone'],\n media: ['image', 'video', 'camera'],\n emotions: ['smile', 'frown', 'meh'],\n security: ['lock', 'unlock', 'shield'],\n time: ['clock', 'calendar'],\n ui: ['bell', 'heart', 'star', 'bookmark', 'share'],\n theme: ['monitor', 'sun', 'moon'],\n} as const\n","/**\n * Case Conversion Utilities\n *\n * 문자열 케이스 변환 유틸리티 함수들입니다.\n * Utility functions for string case conversion.\n */\n\n/**\n * 문자열을 camelCase로 변환합니다.\n * Converts a string to camelCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns camelCase 문자열 / camelCase string\n *\n * @example\n * toCamelCase('arrow-left') // 'arrowLeft'\n * toCamelCase('arrow_left') // 'arrowLeft'\n * toCamelCase('ArrowLeft') // 'arrowLeft'\n * toCamelCase('arrowLeft') // 'arrowLeft'\n * toCamelCase('HEART') // 'heart'\n */\nexport function toCamelCase(str: string): string {\n if (!str) return str\n\n // 이미 camelCase인지 확인 (kebab/snake가 아니고 첫 글자가 소문자)\n if (!/[-_]/.test(str) && /^[a-z]/.test(str)) {\n return str\n }\n\n // 전체가 대문자인 경우 (HEART, USER 등) → 전체 소문자로\n if (/^[A-Z]+$/.test(str)) {\n return str.toLowerCase()\n }\n\n // PascalCase를 camelCase로 변환 (ArrowLeft → arrowLeft)\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str.charAt(0).toLowerCase() + str.slice(1)\n }\n\n // kebab-case 또는 snake_case를 camelCase로 변환\n return str\n .split(/[-_]/)\n .map((word, index) => {\n if (index === 0) {\n return word.toLowerCase()\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n })\n .join('')\n}\n\n/**\n * 문자열을 PascalCase로 변환합니다.\n * Converts a string to PascalCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns PascalCase 문자열 / PascalCase string\n *\n * @example\n * toPascalCase('arrow-left') // 'ArrowLeft'\n * toPascalCase('arrow_left') // 'ArrowLeft'\n * toPascalCase('arrowLeft') // 'ArrowLeft'\n * toPascalCase('ArrowLeft') // 'ArrowLeft'\n */\nexport function toPascalCase(str: string): string {\n if (!str) return str\n\n // 이미 PascalCase인지 확인\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str\n }\n\n // kebab-case 또는 snake_case가 포함된 경우\n if (/[-_]/.test(str)) {\n return str\n .split(/[-_]/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n }\n\n // camelCase를 PascalCase로 변환\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n","/**\n * Icon Provider System\n *\n * 각 프로바이더별 로딩 전략 / Loading strategies per provider:\n *\n * 1. Phosphor Icons (https://phosphoricons.com) - default\n * - Official package: @phosphor-icons/react (MIT License)\n * - icons.ts에서 정적 import (SSR-safe /dist/ssr)\n * - PROJECT_ICONS 매핑으로 통합 이름 지원\n * - 폴백: initPhosphorIcons()로 동적 namespace 조회\n *\n * 2. Lucide Icons (https://lucide.dev) - deprecated, backward compat\n * - initLucideIcons() 호출 시에만 로드 / Lazy loaded on demand\n * - 향후 제거 예정 / Will be removed in future\n *\n * 3. Iconsax Icons (https://iconsax.io) - separate entry\n * - '@hua-labs/ui/iconsax'에서 import 시 자동 등록\n * - 코어 번들에 포함되지 않음 / Not in core bundle\n * - registerIconsaxResolver()로 lazy 연결\n */\n\nimport { toPascalCase } from './case-utils'\n\n// Phosphor Icons - lazy loaded (전체 namespace import 방지, createContext SSR 이슈)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet PhosphorIcons: any = null\n\n// Lucide Icons - lazy loaded (하위호환, deprecated)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet LucideIcons: any = null\n\n// Iconsax resolver - registered lazily when iconsax entry is loaded\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet iconsaxResolver: ((name: string, variant?: string) => any) | null = null\n\n/**\n * Register iconsax resolver (called from iconsax entry point).\n * Allows the core Icon component to resolve iconsax icons\n * without statically importing the iconsax bundle.\n */\nexport function registerIconsaxResolver(resolver: typeof iconsaxResolver) {\n iconsaxResolver = resolver\n}\n\n/**\n * Get registered iconsax resolver\n */\nexport function getIconsaxResolver() {\n return iconsaxResolver\n}\n\n// Icon Provider Type\nexport type IconProvider = 'lucide' | 'phosphor' | 'iconsax'\n\n// Icon Provider Configuration\nexport interface IconProviderConfig {\n provider: IconProvider\n prefix?: string\n}\n\n/**\n * Project-specific icon list\n * These are the icons actually used in SumUp project\n * Only these icons will be loaded for optimal bundle size\n */\nexport const PROJECT_ICONS = {\n // Navigation & Layout\n 'home': { lucide: 'Home', phosphor: 'House', iconsax: 'Home2' },\n 'layout-dashboard': { lucide: 'LayoutDashboard', phosphor: 'SquaresFour' },\n 'folder': { lucide: 'Folder', phosphor: 'Folder', iconsax: 'Folder' },\n 'alert-circle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'alertCircle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'columns': { lucide: 'Columns', phosphor: 'Columns' },\n 'users': { lucide: 'Users', phosphor: 'Users', iconsax: 'People' },\n 'settings': { lucide: 'Settings', phosphor: 'Gear' },\n 'menu': { lucide: 'Menu', phosphor: 'List', iconsax: 'Menu' },\n 'close': { lucide: 'X', phosphor: 'X', iconsax: 'CloseCircle' },\n 'chevronLeft': { lucide: 'ChevronLeft', phosphor: 'CaretLeft', iconsax: 'ArrowLeft2' },\n 'chevronRight': { lucide: 'ChevronRight', phosphor: 'CaretRight', iconsax: 'ArrowRight2' },\n 'chevronDown': { lucide: 'ChevronDown', phosphor: 'CaretDown', iconsax: 'ArrowDown2' },\n 'chevronUp': { lucide: 'ChevronUp', phosphor: 'CaretUp', iconsax: 'ArrowUp2' },\n 'arrowLeft': { lucide: 'ArrowLeft', phosphor: 'ArrowLeft', iconsax: 'ArrowLeft' },\n 'arrowRight': { lucide: 'ArrowRight', phosphor: 'ArrowRight', iconsax: 'ArrowRight' },\n 'arrowUp': { lucide: 'ArrowUp', phosphor: 'ArrowUp', iconsax: 'ArrowUp' },\n 'arrowDown': { lucide: 'ArrowDown', phosphor: 'ArrowDown', iconsax: 'ArrowDown' },\n\n // Actions\n 'add': { lucide: 'Plus', phosphor: 'Plus', iconsax: 'Add' },\n 'edit': { lucide: 'Edit', phosphor: 'Pencil' },\n 'pencil': { lucide: 'Pencil', phosphor: 'Pencil' },\n 'delete': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'trash': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'upload': { lucide: 'Upload', phosphor: 'Upload', iconsax: 'Upload' },\n 'download': { lucide: 'Download', phosphor: 'Download', iconsax: 'Download' },\n 'x': { lucide: 'X', phosphor: 'X' },\n 'check': { lucide: 'Check', phosphor: 'Check', iconsax: 'Check' },\n 'search': { lucide: 'Search', phosphor: 'MagnifyingGlass', iconsax: 'SearchNormal' },\n 'share': { lucide: 'Share', phosphor: 'Share' },\n 'copy': { lucide: 'Copy', phosphor: 'Copy' },\n 'save': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Status & Feedback\n 'loader': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'loader2': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'check-circle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'checkCircle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'success': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'error': { lucide: 'XCircle', phosphor: 'XCircle', iconsax: 'CloseCircle' },\n 'warning': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Warning2' },\n 'info': { lucide: 'Info', phosphor: 'Info', iconsax: 'InfoCircle' },\n 'refresh': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'refreshCw': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'bell': { lucide: 'Bell', phosphor: 'Bell', iconsax: 'Bell' },\n 'heart': { lucide: 'Heart', phosphor: 'Heart', iconsax: 'Heart' },\n 'star': { lucide: 'Star', phosphor: 'Star', iconsax: 'Star' },\n 'bookmark': { lucide: 'Bookmark', phosphor: 'Bookmark' },\n\n // User & Auth\n 'user': { lucide: 'User', phosphor: 'User', iconsax: 'User' },\n 'userPlus': { lucide: 'UserPlus', phosphor: 'UserPlus', iconsax: 'UserAdd' },\n 'logIn': { lucide: 'LogIn', phosphor: 'SignIn', iconsax: 'Login' },\n 'logOut': { lucide: 'LogOut', phosphor: 'SignOut', iconsax: 'Logout' },\n 'chrome': { lucide: 'Chrome', phosphor: 'ChromeLogo', iconsax: 'Chrome' },\n 'github': { lucide: 'Github', phosphor: 'GithubLogo' },\n 'message': { lucide: 'MessageCircle', phosphor: 'ChatCircle' },\n\n // Content\n 'messageSquare': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'message-square': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'inbox': { lucide: 'Inbox', phosphor: 'Inbox' },\n 'calendar': { lucide: 'Calendar', phosphor: 'Calendar' },\n 'calendarPlus': { lucide: 'CalendarPlus', phosphor: 'CalendarPlus' },\n 'checkSquare': { lucide: 'CheckSquare', phosphor: 'CheckSquare', iconsax: 'TickSquare' },\n 'clock': { lucide: 'Clock', phosphor: 'Clock' },\n 'book': { lucide: 'Book', phosphor: 'Book', iconsax: 'Book' },\n 'bookOpen': { lucide: 'BookOpen', phosphor: 'BookOpen', iconsax: 'Book' },\n\n // Theme & UI\n 'monitor': { lucide: 'Monitor', phosphor: 'Monitor', iconsax: 'Monitor' },\n 'sun': { lucide: 'Sun', phosphor: 'Sun', iconsax: 'Sun' },\n 'moon': { lucide: 'Moon', phosphor: 'Moon', iconsax: 'Moon' },\n\n // AI & Features\n 'sparkle': { lucide: 'Sparkle', phosphor: 'Sparkle' },\n 'sparkles': { lucide: 'Sparkles', phosphor: 'Sparkle' },\n 'lightbulb': { lucide: 'Lightbulb', phosphor: 'Lightbulb' },\n 'brain': { lucide: 'Brain', phosphor: 'Brain' },\n 'zap': { lucide: 'Zap', phosphor: 'Lightning' },\n\n // Device & Platform\n 'globe': { lucide: 'Globe', phosphor: 'Globe', iconsax: 'Global' },\n 'deviceMobile': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'smartphone': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'floppyDisk': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Data & Analytics\n 'chart': { lucide: 'BarChart3', phosphor: 'ChartBar' },\n 'barChart': { lucide: 'BarChart', phosphor: 'ChartBar' },\n 'trendingUp': { lucide: 'TrendingUp', phosphor: 'TrendUp' },\n 'trendingDown': { lucide: 'TrendingDown', phosphor: 'TrendDown' },\n 'activity': { lucide: 'Activity', phosphor: 'Pulse' },\n 'database': { lucide: 'Database', phosphor: 'Database' },\n 'dollarSign': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'dollar': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'currency': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n\n 'layers': { lucide: 'Layers', phosphor: 'Stack' },\n 'ban': { lucide: 'Ban', phosphor: 'Prohibit' },\n\n // Security\n 'lock': { lucide: 'Lock', phosphor: 'Lock', iconsax: 'Lock' },\n 'unlock': { lucide: 'Unlock', phosphor: 'LockOpen', iconsax: 'Unlock' },\n 'shield': { lucide: 'Shield', phosphor: 'Shield', iconsax: 'Shield' },\n 'key': { lucide: 'Key', phosphor: 'Key' },\n\n // Media\n 'play': { lucide: 'Play', phosphor: 'Play', iconsax: 'Play' },\n 'pause': { lucide: 'Pause', phosphor: 'Pause', iconsax: 'Pause' },\n 'image': { lucide: 'Image', phosphor: 'Image', iconsax: 'Image' },\n 'video': { lucide: 'Video', phosphor: 'Video', iconsax: 'Video' },\n 'camera': { lucide: 'Camera', phosphor: 'Camera', iconsax: 'Camera' },\n\n // Files\n 'fileText': { lucide: 'FileText', phosphor: 'FileText' },\n 'file': { lucide: 'File', phosphor: 'File' },\n\n // Navigation\n 'externalLink': { lucide: 'ExternalLink', phosphor: 'ArrowSquareOut' },\n 'link': { lucide: 'Link', phosphor: 'Link', iconsax: 'Link' },\n 'moreHorizontal': { lucide: 'MoreHorizontal', phosphor: 'DotsThreeOutline' },\n 'moreVertical': { lucide: 'MoreVertical', phosphor: 'DotsThreeVertical' },\n\n // Priority\n 'remove': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n\n // Eye (password)\n 'eye': { lucide: 'Eye', phosphor: 'Eye', iconsax: 'Eye' },\n 'eyeOff': { lucide: 'EyeOff', phosphor: 'EyeSlash', iconsax: 'EyeSlash' },\n\n // Emotions\n 'smile': { lucide: 'Smile', phosphor: 'Smiley', iconsax: 'EmojiHappy' },\n 'frown': { lucide: 'Frown', phosphor: 'SmileySad', iconsax: 'EmojiSad' },\n 'meh': { lucide: 'Meh', phosphor: 'SmileyMeh', iconsax: 'EmojiNormal' },\n\n // Social\n 'mail': { lucide: 'Mail', phosphor: 'Envelope' },\n 'phone': { lucide: 'Phone', phosphor: 'Phone' },\n\n // Additional\n 'flag': { lucide: 'Flag', phosphor: 'Flag', iconsax: 'Flag' },\n 'rocket': { lucide: 'Rocket', phosphor: 'Rocket', iconsax: 'Rocket' },\n\n // Connectivity & Misc\n 'ticket': { lucide: 'Ticket', phosphor: 'Ticket', iconsax: 'Ticket' },\n 'clipboard': { lucide: 'ClipboardList', phosphor: 'Clipboard', iconsax: 'Sticker' },\n 'wifi': { lucide: 'Wifi', phosphor: 'WifiHigh', iconsax: 'Wifi' },\n 'wifiOff': { lucide: 'WifiOff', phosphor: 'WifiSlash' },\n 'cpu': { lucide: 'Cpu', phosphor: 'Cpu', iconsax: 'Computing' },\n 'mask': { lucide: 'Drama', phosphor: 'MaskHappy', iconsax: 'EmojiHappy' },\n\n // Text Formatting (Markdown Toolbar)\n 'bold': { lucide: 'Bold', phosphor: 'TextB' },\n 'italic': { lucide: 'Italic', phosphor: 'TextItalic' },\n 'strikethrough': { lucide: 'Strikethrough', phosphor: 'TextStrikethrough' },\n 'heading': { lucide: 'Heading', phosphor: 'TextHOne' },\n 'code': { lucide: 'Code', phosphor: 'Code', iconsax: 'Code' },\n 'fileCode': { lucide: 'FileCode', phosphor: 'FileCode' },\n 'quote': { lucide: 'Quote', phosphor: 'Quotes', iconsax: 'QuoteUp' },\n 'list': { lucide: 'List', phosphor: 'List' },\n 'listOrdered': { lucide: 'ListOrdered', phosphor: 'ListNumbers' },\n 'minus': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n} as const\n\n/**\n * Initialize Phosphor Icons (lazy load for fallback/dynamic lookup)\n * icons.ts의 개별 import와 별개로, PROJECT_ICONS fallback용\n */\nexport async function initPhosphorIcons() {\n if (typeof window === 'undefined') return null\n\n if (!PhosphorIcons) {\n try {\n const phosphorModule = await import('@phosphor-icons/react')\n PhosphorIcons = phosphorModule\n } catch {\n console.warn('Phosphor Icons not available. Install @phosphor-icons/react to use.')\n return null\n }\n }\n return PhosphorIcons\n}\n\n/**\n * Initialize Lucide Icons (lazy load)\n */\nexport async function initLucideIcons() {\n if (typeof window === 'undefined') return null\n\n if (!LucideIcons) {\n try {\n const lucideModule = await import('lucide-react')\n LucideIcons = lucideModule\n } catch {\n console.warn('Lucide Icons not available. Install lucide-react to use lucide provider.')\n return null\n }\n }\n return LucideIcons\n}\n\n/**\n * Get icon from provider\n * Only resolves icons that are in PROJECT_ICONS for optimal bundle size\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nexport function getIconFromProvider(\n iconName: string,\n provider: IconProvider = 'phosphor'\n): React.ComponentType<Record<string, unknown>> | null {\n // Check if icon is in project icon list\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n\n if (!iconMapping) {\n // Fallback to direct lookup for backward compatibility\n return getIconDirect(iconName, provider)\n }\n\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n\n switch (provider) {\n case 'phosphor':\n if (!mappedName || !PhosphorIcons) return null\n return PhosphorIcons?.[mappedName] || null\n\n case 'lucide':\n if (!mappedName || !LucideIcons) {\n return null\n }\n return LucideIcons?.[mappedName] || null\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = mappedName || toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Direct icon lookup (fallback for icons not in PROJECT_ICONS)\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nfunction getIconDirect(\n iconName: string,\n provider: IconProvider\n): React.ComponentType<Record<string, unknown>> | null {\n switch (provider) {\n case 'phosphor': {\n if (!PhosphorIcons) return null\n const phosphorName1 = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const phosphorName2 = iconName\n .split(/(?=[A-Z])/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n return PhosphorIcons?.[phosphorName1] ||\n PhosphorIcons?.[phosphorName2] ||\n PhosphorIcons?.[iconName] ||\n null\n }\n\n case 'lucide': {\n if (!LucideIcons) {\n return null\n }\n const lucideName = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const camelCaseName = iconName.replace(/([A-Z])/g, (match) =>\n match === iconName[0] ? match.toLowerCase() : match\n )\n return LucideIcons?.[lucideName] ||\n LucideIcons?.[iconName] ||\n LucideIcons?.[camelCaseName] ||\n null\n }\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Get icon name for provider\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 프로바이더별 아이콘 이름 / Icon name for provider\n */\nexport function getIconNameForProvider(\n iconName: string,\n provider: IconProvider\n): string {\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (iconMapping) {\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n if (mappedName) {\n return mappedName\n }\n }\n return iconName\n}\n\n/**\n * Get all project icon names\n */\nexport function getProjectIconNames(): string[] {\n return Object.keys(PROJECT_ICONS)\n}\n","/**\n * Icon Aliases\n * \n * 여러 이름이 같은 아이콘을 가리키도록 하는 alias 시스템\n * DX 향상을 위해 직관적인 이름들을 지원합니다.\n */\n\nexport const ICON_ALIASES: Record<string, string> = {\n // kebab-case → camelCase mappings (자동 변환 지원)\n 'arrow-left': 'arrowLeft',\n 'arrow-right': 'arrowRight',\n 'arrow-up': 'arrowUp',\n 'arrow-down': 'arrowDown',\n 'chevron-left': 'chevronLeft',\n 'chevron-right': 'chevronRight',\n 'chevron-up': 'chevronUp',\n 'chevron-down': 'chevronDown',\n 'external-link': 'externalLink',\n 'more-horizontal': 'moreHorizontal',\n 'more-vertical': 'moreVertical',\n 'user-plus': 'userPlus',\n 'log-in': 'logIn',\n 'log-out': 'logOut',\n 'check-circle': 'checkCircle',\n 'check-square': 'checkSquare',\n 'alert-circle': 'alertCircle',\n 'eye-off': 'eyeOff',\n 'file-text': 'fileText',\n 'book-open': 'bookOpen',\n 'bar-chart': 'barChart',\n 'trending-up': 'trendingUp',\n 'trending-down': 'trendingDown',\n 'message-square': 'messageSquare',\n 'calendar-plus': 'calendarPlus',\n 'refresh-cw': 'refreshCw',\n 'dollar-sign': 'dollarSign',\n 'layout-dashboard': 'layoutDashboard',\n 'device-mobile': 'deviceMobile',\n 'floppy-disk': 'floppyDisk',\n\n // Navigation aliases\n 'back': 'arrowLeft',\n 'prev': 'arrowLeft',\n 'previous': 'arrowLeft',\n 'forward': 'arrowRight',\n 'next': 'arrowRight',\n \n // Close aliases\n 'close': 'x',\n 'cancel': 'x',\n \n // Delete aliases\n 'remove': 'delete',\n 'trash': 'delete',\n \n // Add aliases\n 'plus': 'add',\n 'new': 'add',\n \n // Edit aliases\n 'pencil': 'edit',\n 'modify': 'edit',\n \n // Save aliases\n 'store': 'save',\n 'floppy': 'save',\n \n // Search aliases\n 'magnify': 'search',\n \n // User aliases\n 'person': 'user',\n 'account': 'user',\n 'profile': 'user',\n \n // Settings aliases\n 'gear': 'settings',\n 'config': 'settings',\n 'preferences': 'settings',\n \n // Home aliases\n 'house': 'home',\n 'main': 'home',\n \n // Check aliases\n 'done': 'check',\n 'complete': 'check',\n 'tick': 'check',\n \n // Info aliases\n 'information': 'info',\n 'help': 'info',\n \n // Warning aliases\n 'alert': 'warning',\n 'caution': 'warning',\n \n // Success aliases\n 'checkmark': 'success',\n 'checkCircle': 'success',\n \n // Error aliases\n 'fail': 'error',\n 'cross': 'error',\n 'xCircle': 'error',\n \n // Loading aliases\n 'spinner': 'loader',\n 'loading': 'loader',\n 'wait': 'loader',\n \n // Refresh aliases\n 'reload': 'refresh',\n 'update': 'refresh',\n 'sync': 'refresh',\n \n // Eye aliases\n 'show': 'eye',\n 'view': 'eye',\n 'hide': 'eyeOff',\n 'hidden': 'eyeOff',\n \n // Lock aliases\n 'secure': 'lock',\n 'locked': 'lock',\n 'unsecure': 'unlock',\n 'unlocked': 'unlock',\n \n // Download aliases\n 'get': 'download',\n 'fetch': 'download',\n \n // Upload aliases\n 'post': 'upload',\n \n // Share aliases\n 'send': 'share',\n 'export': 'share',\n \n // Copy aliases\n 'duplicate': 'copy',\n 'clone': 'copy',\n \n // Mail aliases\n 'email': 'mail',\n 'envelope': 'mail',\n \n // Message aliases\n 'chat': 'message',\n 'comment': 'message',\n 'talk': 'message',\n \n // Calendar aliases\n 'date': 'calendar',\n 'schedule': 'calendar',\n \n // Clock aliases\n 'time': 'clock',\n 'watch': 'clock',\n \n // File aliases\n 'document': 'fileText',\n 'doc': 'fileText',\n 'text': 'fileText',\n \n // Folder aliases\n 'directory': 'folder',\n 'dir': 'folder',\n \n // Image aliases\n 'picture': 'image',\n 'img': 'image',\n \n // Video aliases\n 'movie': 'video',\n 'film': 'video',\n \n // Camera aliases\n 'photo': 'camera',\n 'capture': 'camera',\n \n // Play aliases\n 'start': 'play',\n 'run': 'play',\n \n // Pause aliases\n 'stop': 'pause',\n 'halt': 'pause',\n \n // Heart aliases\n 'like': 'heart',\n 'love': 'heart',\n \n // Star aliases\n 'favorite': 'star',\n \n // Bookmark aliases\n 'saveBookmark': 'bookmark',\n \n // Bell aliases\n 'notification': 'bell',\n 'notify': 'bell',\n 'alarm': 'bell',\n \n // Settings aliases\n 'prefs': 'settings',\n \n // Search aliases (duplicate removed - see line 37)\n 'lookup': 'search',\n \n // More aliases\n 'dots': 'moreHorizontal',\n 'moreMenu': 'moreHorizontal',\n 'moreOptions': 'moreVertical',\n \n // External link aliases\n 'external': 'externalLink',\n 'outbound': 'externalLink',\n 'open': 'externalLink',\n \n // Link aliases\n 'url': 'link',\n 'hyperlink': 'link',\n \n // Chart aliases\n 'graph': 'barChart',\n 'stats': 'barChart',\n 'analytics': 'barChart',\n \n // Database aliases\n 'db': 'database',\n 'storage': 'database',\n \n // Activity aliases\n 'pulse': 'activity',\n 'monitor': 'activity',\n \n // Trending aliases\n 'up': 'trendingUp',\n 'down': 'trendingDown',\n \n // Zap aliases\n 'lightning': 'zap',\n 'bolt': 'zap',\n 'flash': 'zap',\n \n // Shield aliases\n 'security': 'shield',\n 'protect': 'shield',\n \n // Key aliases\n 'password': 'key',\n 'secret': 'key',\n \n // Log in aliases\n 'signin': 'logIn',\n 'login': 'logIn',\n 'enter': 'logIn',\n \n // Log out aliases\n 'signout': 'logOut',\n 'logout': 'logOut',\n 'exit': 'logOut',\n \n // Users aliases\n 'people': 'users',\n 'group': 'users',\n 'team': 'users',\n \n // User plus aliases\n 'addUser': 'userPlus',\n 'invite': 'userPlus',\n \n // Book aliases\n 'read': 'book',\n 'library': 'book',\n \n // Book open aliases\n 'reading': 'bookOpen',\n 'openBook': 'bookOpen',\n \n // Sun aliases\n 'light': 'sun',\n 'day': 'sun',\n \n // Moon aliases\n 'dark': 'moon',\n 'night': 'moon',\n \n // Monitor aliases\n 'screen': 'monitor',\n 'display': 'monitor',\n \n // Brain aliases\n 'ai': 'brain',\n 'intelligence': 'brain',\n 'think': 'brain',\n \n // Lightbulb aliases\n 'idea': 'lightbulb',\n 'bulb': 'lightbulb',\n 'inspiration': 'lightbulb',\n \n // Sparkles aliases\n 'magic': 'sparkles',\n 'stars': 'sparkles',\n 'glitter': 'sparkles',\n} as const\n\n/**\n * Resolve icon alias to actual icon name\n * \n * @param iconName - 아이콘 이름 또는 별칭 / Icon name or alias\n * @returns 실제 아이콘 이름 / Actual icon name\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function resolveIconAlias(iconName: string): string {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return ICON_ALIASES[iconName] || iconName;\n}\n\n/**\n * Get all aliases for an icon name\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @returns 해당 아이콘의 모든 별칭 배열 / Array of all aliases for the icon\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function getIconAliases(iconName: string): string[] {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return Object.entries(ICON_ALIASES)\n .filter(([_, target]) => target === iconName)\n .map(([alias]) => alias);\n}\n\n\n","/**\n * Icon Name Normalization System\n *\n * 아이콘 이름 정규화를 위한 통합 시스템입니다.\n *\n * Features:\n * - kebab-case → camelCase conversion\n * - snake_case → camelCase conversion\n * - PascalCase → camelCase conversion\n * - Alias resolution\n * - Provider-specific name mapping\n */\n\nimport { ICON_ALIASES } from './icon-aliases'\nimport { toCamelCase, toPascalCase } from './case-utils'\n\n// Re-export case utils for backward compatibility\nexport { toCamelCase, toPascalCase } from './case-utils'\n\n// IconProvider type (avoid circular dependency with icon-providers.ts)\nexport type IconProviderType = 'lucide' | 'phosphor' | 'iconsax'\n\n/**\n * 정규화 결과 인터페이스\n */\nexport interface NormalizeResult {\n /** 정규화된 아이콘 이름 (camelCase) */\n normalized: string\n /** 원본 이름이 alias였는지 여부 */\n wasAlias: boolean\n /** 원본 alias 이름 (alias였던 경우) */\n originalAlias?: string\n}\n\n/**\n * 아이콘 이름을 정규화합니다.\n *\n * @example\n * normalizeIconName('arrow-left') // { normalized: 'arrowLeft', wasAlias: false }\n * normalizeIconName('back') // { normalized: 'arrowLeft', wasAlias: true, originalAlias: 'back' }\n * normalizeIconName('ArrowLeft') // { normalized: 'arrowLeft', wasAlias: false }\n */\nexport function normalizeIconName(iconName: string): NormalizeResult {\n if (!iconName || typeof iconName !== 'string') {\n return { normalized: iconName || '', wasAlias: false }\n }\n\n const camelCased = toCamelCase(iconName)\n const aliasTarget = ICON_ALIASES[iconName] || ICON_ALIASES[camelCased]\n\n if (aliasTarget) {\n return {\n normalized: aliasTarget,\n wasAlias: true,\n originalAlias: iconName\n }\n }\n\n return {\n normalized: camelCased,\n wasAlias: false\n }\n}\n\n/**\n * 프로바이더별 아이콘 이름을 반환합니다.\n *\n * @example\n * getProviderIconName('arrowLeft', 'lucide') // 'ArrowLeft'\n * getProviderIconName('heart', 'iconsax') // 'Heart'\n */\nexport function getProviderIconName(\n normalizedName: string,\n provider: IconProviderType\n): string {\n switch (provider) {\n case 'lucide':\n case 'phosphor':\n case 'iconsax':\n return toPascalCase(normalizedName)\n default:\n return normalizedName\n }\n}\n","/**\n * Icon Config Types\n *\n * Icon 시스템의 설정 타입 정의\n * 상태관리는 서비스 레벨에서 관리 (Zustand 등)\n */\n\nexport type IconSet = 'lucide' | 'phosphor' | 'iconsax'\n\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'duotone' | 'fill'\n\nexport type IconsaxVariant = 'line' | 'bold'\n\nexport interface IconConfig {\n set: IconSet\n weight: PhosphorWeight\n size: number\n color: string\n strokeWidth?: number // Lucide용\n iconsaxVariant?: IconsaxVariant // Iconsax용 (line | bold)\n}\n\nexport const defaultIconConfig: IconConfig = {\n set: 'phosphor',\n weight: 'regular',\n size: 20,\n color: 'currentColor',\n strokeWidth: 1.25,\n iconsaxVariant: 'line',\n}\n\n/**\n * 세트별 기본 strokeWidth\n */\nexport const getDefaultStrokeWidth = (set: IconSet): number => {\n switch (set) {\n case 'lucide':\n return 1.25\n case 'phosphor':\n return 1.25 // Phosphor는 weight 사용\n case 'iconsax':\n return 1.5\n default:\n return 1.25\n }\n}\n","'use client'\n\n/**\n * IconProvider - Icon 시스템 전역 설정 Provider\n *\n * React Context를 사용하여 전역 아이콘 설정을 제공합니다.\n *\n * @example\n * ```tsx\n * <IconProvider set=\"phosphor\" weight=\"regular\" size={20}>\n * <App />\n * </IconProvider>\n * ```\n */\n\nimport React, { createContext, useContext } from 'react'\nimport { type IconConfig, type IconSet, type PhosphorWeight, type IconsaxVariant, defaultIconConfig } from './icon-store'\n\n/**\n * IconProvider 컴포넌트 Props\n */\nexport interface IconProviderProps {\n /** 아이콘 세트 (lucide, phosphor, iconsax) */\n set?: IconSet\n /** Phosphor 아이콘 weight */\n weight?: PhosphorWeight\n /** Iconsax 아이콘 변형 (line, bold) */\n iconsaxVariant?: IconsaxVariant\n /** 기본 아이콘 크기 */\n size?: number\n /** 기본 아이콘 색상 */\n color?: string\n /** Lucide/Iconsax 아이콘 stroke width */\n strokeWidth?: number\n /** 자식 컴포넌트 */\n children: React.ReactNode\n}\n\ninterface IconContextValue extends IconConfig {}\n\nconst IconContext = createContext<IconContextValue>(defaultIconConfig)\n\nexport function IconProvider({\n set = defaultIconConfig.set,\n weight = defaultIconConfig.weight,\n iconsaxVariant = defaultIconConfig.iconsaxVariant,\n size = defaultIconConfig.size,\n color = defaultIconConfig.color,\n strokeWidth = defaultIconConfig.strokeWidth,\n children,\n}: IconProviderProps) {\n const value: IconContextValue = {\n set,\n weight,\n iconsaxVariant,\n size,\n color,\n strokeWidth,\n }\n\n return (\n <IconContext.Provider value={value}>\n {children}\n </IconContext.Provider>\n )\n}\n\nexport function useIconContext(): IconContextValue {\n return useContext(IconContext)\n}\n\n// Re-export types for convenience\nexport type { IconSet, PhosphorWeight, IconsaxVariant, IconConfig } from './icon-store'\nexport { defaultIconConfig, getDefaultStrokeWidth } from './icon-store'\n","import React from 'react'\nimport type { IconProps as PhosphorIconProps } from '@phosphor-icons/react'\nimport { merge, mergeMap } from '../../lib/utils'\nimport { icons, IconName, emotionIcons, statusIcons } from '../../lib/icons'\nimport { getIconFromProvider, getIconsaxResolver, initPhosphorIcons, initLucideIcons, getIconNameForProvider } from '../../lib/icon-providers'\nimport { normalizeIconName } from '../../lib/normalize-icon-name'\nimport { useIconContext, type IconSet } from './IconProvider'\nimport { type PhosphorWeight } from './icon-store'\nimport type { AllIconName } from '../../lib/icon-names'\n\n/**\n * Icon 컴포넌트 Props\n */\nexport interface IconProps {\n /** 아이콘 이름 / Icon name */\n name: AllIconName\n /** 아이콘 크기 (숫자 또는 문자열) / Icon size (number or string) */\n size?: number | string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 감정 아이콘 타입 / Emotion icon type */\n emotion?: keyof typeof emotionIcons\n /** 상태 아이콘 타입 / Status icon type */\n status?: keyof typeof statusIcons\n /** 아이콘 프로바이더 오버라이드 / Icon provider override */\n provider?: IconSet\n /** 부드러운 애니메이션 효과 / Smooth animation effect */\n animated?: boolean\n /** 펄스 애니메이션 / Pulse animation */\n pulse?: boolean\n /** 회전 애니메이션 / Spin animation */\n spin?: boolean\n /** 바운스 애니메이션 / Bounce animation */\n bounce?: boolean\n /** 색상 변형 / Color variant */\n variant?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'muted' | 'inherit'\n /** Phosphor 아이콘 weight 오버라이드 / Phosphor icon weight override */\n weight?: PhosphorWeight\n /** 스크린 리더용 라벨 / Screen reader label */\n 'aria-label'?: string\n /** 장식용 아이콘 / Decorative icon (hidden from screen readers) */\n 'aria-hidden'?: boolean\n}\n\n/**\n * Icon 컴포넌트\n *\n * 다중 아이콘 라이브러리(Phosphor, Lucide, Iconsax)를 지원하는 통합 아이콘 컴포넌트.\n * IconProvider를 통해 전역 설정을 관리하며, 개별 아이콘에서도 오버라이드 가능.\n *\n * Iconsax는 별도 entry('@hua-labs/ui/iconsax')를 import해야 동작합니다.\n *\n * @example\n * ```tsx\n * <Icon name=\"heart\" />\n * <Icon name=\"user\" size={24} />\n * <Icon name=\"check\" variant=\"success\" />\n * <Icon name=\"loader\" spin />\n * ```\n */\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(({\n name,\n size,\n className,\n emotion,\n status,\n provider,\n weight,\n animated = false,\n pulse = false,\n spin = false,\n bounce = false,\n variant = 'default',\n 'aria-label': ariaLabel,\n 'aria-hidden': ariaHidden\n}, ref) => {\n const config = useIconContext()\n\n const iconSet = provider || config.set\n const iconSize = size ?? config.size\n const iconWeight = weight || config.weight\n const iconColor = config.color\n const iconStrokeWidth = config.strokeWidth ?? 1.25\n const iconsaxVariant = config.iconsaxVariant ?? 'line'\n\n const [isClient, setIsClient] = React.useState(false)\n const [providerReady, setProviderReady] = React.useState(false)\n\n React.useEffect(() => {\n setIsClient(true)\n\n // Provider별 lazy load 초기화\n if (iconSet === 'lucide') {\n initLucideIcons().then(() => setProviderReady(true))\n } else if (iconSet === 'phosphor') {\n initPhosphorIcons().then(() => setProviderReady(true))\n } else {\n setProviderReady(true)\n }\n }, [iconSet])\n\n // 통합 정규화\n const resolvedIcon = React.useMemo(() => {\n const baseName = emotion ? emotionIcons[emotion] :\n status ? statusIcons[status] : name\n const { normalized } = normalizeIconName(baseName)\n const providerName = getIconNameForProvider(normalized, iconSet)\n return { normalized, providerName }\n }, [name, emotion, status, iconSet])\n\n const iconName = resolvedIcon.normalized as AllIconName\n\n // Iconsax: resolver를 통해 가져오기 (iconsax entry import 시 자동 등록됨)\n const iconsaxIcon = React.useMemo(() => {\n if (iconSet === 'iconsax' && isClient) {\n const resolver = getIconsaxResolver()\n if (resolver) {\n return resolver(resolvedIcon.providerName, iconsaxVariant)\n }\n }\n return null\n }, [iconSet, resolvedIcon.providerName, isClient, iconsaxVariant])\n\n // 색상 변형 클래스\n const variantClasses = mergeMap({\n 'text-current': variant === 'default',\n 'text-primary': variant === 'primary',\n 'text-muted-foreground': variant === 'secondary' || variant === 'muted',\n 'text-green-600 dark:text-green-400': variant === 'success',\n 'text-yellow-600 dark:text-yellow-400': variant === 'warning',\n 'text-destructive': variant === 'error',\n })\n\n // 서버사이드에서는 빈 span 반환\n if (!isClient) {\n return (\n <span\n style={{ width: iconSize, height: iconSize }}\n className={merge(variantClasses, className)}\n aria-hidden={ariaHidden !== undefined ? ariaHidden : true}\n aria-label={ariaLabel}\n />\n )\n }\n\n // Provider에 따라 아이콘 가져오기\n type IconComponentType = React.ComponentType<PhosphorIconProps | React.SVGProps<SVGSVGElement> | Record<string, unknown>>\n let ResolvedIcon: IconComponentType | null = null\n\n if (iconSet === 'phosphor') {\n // 1. icons.ts에서 먼저 찾기 (Phosphor 아이콘이 기본, 정적 import)\n ResolvedIcon = (icons[iconName as IconName] || null) as IconComponentType | null\n // 2. 없으면 동적으로 Phosphor namespace에서 가져오기 (fallback, providerReady 필요)\n if (!ResolvedIcon && providerReady) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else if (iconSet === 'iconsax') {\n ResolvedIcon = iconsaxIcon as IconComponentType | null\n if (!ResolvedIcon) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else {\n // Lucide나 다른 provider\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n\n if (!ResolvedIcon) {\n if (iconSet === 'iconsax' && !getIconsaxResolver()) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `Icon \"${iconName}\" — iconsax resolver not registered. ` +\n `Use HuaProvider with icons.set='iconsax', or add: import '@hua-labs/ui/iconsax'`\n )\n }\n } else {\n console.warn(`Icon \"${iconName}\" not found for provider \"${iconSet}\"`)\n }\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center rounded-full border-2 border-dashed border-border',\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n aria-label={ariaLabel || `아이콘을 찾을 수 없음: ${iconName}`}\n title={`Icon not found: ${iconName}`}\n >\n <span className=\"text-xs text-muted-foreground\" aria-hidden=\"true\">\n ?\n </span>\n </span>\n )\n }\n\n // 세트별 props 준비\n type IconPropsType = PhosphorIconProps & {\n size?: number\n width?: number | string\n height?: number | string\n color?: string\n weight?: PhosphorWeight\n strokeWidth?: number\n }\n\n const iconProps: IconPropsType = {\n size: typeof iconSize === 'number' ? iconSize : undefined,\n width: typeof iconSize === 'string' ? iconSize : iconSize,\n height: typeof iconSize === 'string' ? iconSize : iconSize,\n color: iconColor,\n } as IconPropsType\n\n if (iconSet === 'phosphor') {\n iconProps.weight = iconWeight\n } else {\n iconProps.strokeWidth = iconStrokeWidth\n }\n\n const animationClasses = mergeMap({\n 'animate-pulse': pulse,\n 'animate-spin': spin,\n 'animate-bounce': bounce,\n 'transition-all duration-200 ease-in-out': animated,\n })\n\n const accessibilityProps: React.AriaAttributes = {}\n\n if (ariaLabel) {\n accessibilityProps['aria-label'] = ariaLabel\n accessibilityProps['aria-hidden'] = false\n } else if (ariaHidden !== undefined) {\n accessibilityProps['aria-hidden'] = ariaHidden\n } else {\n accessibilityProps['aria-hidden'] = true\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center',\n animationClasses,\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n {...accessibilityProps}\n >\n {ResolvedIcon && React.createElement(ResolvedIcon, {\n ...iconProps,\n className: variantClasses,\n 'aria-hidden': true\n } as React.ComponentProps<typeof ResolvedIcon>)}\n </span>\n )\n})\n\nIconComponent.displayName = 'Icon'\n\nconst MemoizedIcon = React.memo(IconComponent, (prevProps, nextProps) => {\n return (\n prevProps.name === nextProps.name &&\n prevProps.size === nextProps.size &&\n prevProps.className === nextProps.className &&\n prevProps.emotion === nextProps.emotion &&\n prevProps.status === nextProps.status &&\n prevProps.provider === nextProps.provider &&\n prevProps.animated === nextProps.animated &&\n prevProps.pulse === nextProps.pulse &&\n prevProps.spin === nextProps.spin &&\n prevProps.bounce === nextProps.bounce &&\n prevProps.variant === nextProps.variant &&\n prevProps.weight === nextProps.weight &&\n prevProps['aria-label'] === nextProps['aria-label'] &&\n prevProps['aria-hidden'] === nextProps['aria-hidden']\n )\n})\n\nexport const Icon = MemoizedIcon as typeof IconComponent\nIcon.displayName = 'Icon'\n\nexport const EmotionIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { emotion: keyof typeof emotionIcons }>(\n (props, ref) => <Icon ref={ref} name=\"smile\" {...props} />\n)\nEmotionIcon.displayName = 'EmotionIcon'\n\nexport const StatusIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { status: keyof typeof statusIcons }>(\n (props, ref) => <Icon ref={ref} name=\"info\" {...props} />\n)\nStatusIcon.displayName = 'StatusIcon'\n\nexport const LoadingIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"loader\" status=\"loading\" spin aria-label=\"로딩 중\" {...props} />\n )\n)\nLoadingIcon.displayName = 'LoadingIcon'\n\nexport const SuccessIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"check\" status=\"success\" variant=\"success\" aria-label=\"성공\" {...props} />\n )\n)\nSuccessIcon.displayName = 'SuccessIcon'\n\nexport const ErrorIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"alertCircle\" status=\"error\" variant=\"error\" aria-label=\"오류\" {...props} />\n )\n)\nErrorIcon.displayName = 'ErrorIcon'\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Accordion 컴포넌트의 props / Accordion component props\n * @typedef {Object} AccordionProps\n * @property {React.ReactNode} children - AccordionItem 컴포넌트들 / AccordionItem components\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"single\" | \"multiple\"} [type=\"single\"] - 단일 또는 다중 아이템 열기 허용 / Allow single or multiple items to be open\n * @property {string | string[]} [defaultValue] - 초기 열린 아이템 값 (비제어 컴포넌트) / Initial open item value (uncontrolled component)\n * @property {string | string[]} [value] - 현재 열린 아이템 값 (제어 컴포넌트) / Current open item value (controlled component)\n * @property {(value: string | string[]) => void} [onValueChange] - 아이템 열림/닫힘 콜백 / Item open/close callback\n * @property {boolean} [collapsible=false] - 단일 모드에서 열린 아이템을 닫을 수 있는지 여부 / Whether open item can be closed in single mode\n */\ninterface AccordionProps {\n children: React.ReactNode\n className?: string\n type?: \"single\" | \"multiple\"\n defaultValue?: string | string[]\n value?: string | string[]\n onValueChange?: (value: string | string[]) => void\n collapsible?: boolean\n}\n\n/**\n * Accordion 컴포넌트 / Accordion component\n * \n * 접을 수 있는 콘텐츠 섹션을 제공하는 컴포넌트입니다.\n * 키보드 네비게이션(Arrow keys, Home/End)을 지원하며, ARIA 속성을 자동으로 설정합니다.\n * \n * Component that provides collapsible content sections.\n * Supports keyboard navigation (Arrow keys, Home/End) and automatically sets ARIA attributes.\n * \n * @component\n * @example\n * // 기본 사용 (단일 열기) / Basic usage (single open)\n * <Accordion type=\"single\">\n * <AccordionItem value=\"item1\">\n * <AccordionTrigger>제목 1</AccordionTrigger>\n * <AccordionContent>내용 1</AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"item2\">\n * <AccordionTrigger>제목 2</AccordionTrigger>\n * <AccordionContent>내용 2</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * \n * @example\n * // 다중 열기 / Multiple open\n * <Accordion type=\"multiple\" defaultValue={[\"item1\", \"item2\"]}>\n * <AccordionItem value=\"item1\">\n * <AccordionTrigger>제목 1</AccordionTrigger>\n * <AccordionContent>내용 1</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [openItems, setOpenItems] = useState<string[]>([])\n * <Accordion type=\"multiple\" value={openItems} onValueChange={setOpenItems}>\n * <AccordionItem value=\"item1\">\n * <AccordionTrigger>제목</AccordionTrigger>\n * <AccordionContent>내용</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * \n * @param {AccordionProps} props - Accordion 컴포넌트의 props / Accordion component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Accordion 컴포넌트 / Accordion component\n */\nconst Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n ({ \n children, \n className,\n type = \"single\",\n defaultValue,\n value,\n onValueChange,\n collapsible = false,\n ...props \n }, ref) => {\n const [openItems, setOpenItems] = React.useState<string[]>(\n value ? (Array.isArray(value) ? value : [value]) : \n defaultValue ? (Array.isArray(defaultValue) ? defaultValue : [defaultValue]) : []\n )\n\n React.useEffect(() => {\n if (value !== undefined) {\n setOpenItems(Array.isArray(value) ? value : [value])\n }\n }, [value])\n\n const handleItemToggle = (itemValue: string) => {\n let newOpenItems: string[]\n\n if (type === \"single\") {\n if (openItems.includes(itemValue)) {\n newOpenItems = collapsible ? [] : openItems\n } else {\n newOpenItems = [itemValue]\n }\n } else {\n if (openItems.includes(itemValue)) {\n newOpenItems = openItems.filter(item => item !== itemValue)\n } else {\n newOpenItems = [...openItems, itemValue]\n }\n }\n\n setOpenItems(newOpenItems)\n onValueChange?.(type === \"single\" ? newOpenItems[0] || \"\" : newOpenItems)\n }\n\n // 모든 아이템의 value를 수집\n const itemValues = React.useMemo(() => {\n const values: string[] = []\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n const childProps = child.props as { value?: string }\n if (childProps.value) {\n values.push(childProps.value)\n }\n }\n })\n return values\n }, [children])\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement\n if (!target.hasAttribute('data-accordion-trigger')) return\n\n const currentValue = target.getAttribute('data-accordion-value')\n if (!currentValue) return\n\n const currentIndex = itemValues.indexOf(currentValue)\n if (currentIndex === -1) return\n\n let newIndex = currentIndex\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault()\n newIndex = currentIndex < itemValues.length - 1 ? currentIndex + 1 : 0\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault()\n newIndex = currentIndex > 0 ? currentIndex - 1 : itemValues.length - 1\n } else if (e.key === \"Home\") {\n e.preventDefault()\n newIndex = 0\n } else if (e.key === \"End\") {\n e.preventDefault()\n newIndex = itemValues.length - 1\n }\n\n if (newIndex !== currentIndex && itemValues[newIndex]) {\n const triggerElement = target.closest('[data-accordion-item]')?.querySelector(\n `[data-accordion-value=\"${itemValues[newIndex]}\"]`\n ) as HTMLElement\n triggerElement?.focus()\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n openItems,\n onToggle: handleItemToggle\n } as Partial<AccordionItemProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nAccordion.displayName = \"Accordion\"\n\n/**\n * AccordionItem 컴포넌트의 props / AccordionItem component props\n * @typedef {Object} AccordionItemProps\n * @property {string} value - 아이템의 고유 값 / Item unique value\n * @property {React.ReactNode} children - AccordionTrigger와 AccordionContent / AccordionTrigger and AccordionContent\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [disabled=false] - 아이템 비활성화 여부 / Item disabled state\n * @property {string[]} [openItems] - 열린 아이템 목록 (Accordion에서 자동 전달) / Open items list (auto-passed from Accordion)\n * @property {(value: string) => void} [onToggle] - 토글 콜백 (Accordion에서 자동 전달) / Toggle callback (auto-passed from Accordion)\n */\ninterface AccordionItemProps {\n value: string\n children: React.ReactNode\n className?: string\n disabled?: boolean\n openItems?: string[]\n onToggle?: (value: string) => void\n}\n\n/**\n * AccordionItem 컴포넌트 / AccordionItem component\n * 아코디언의 개별 아이템을 감싸는 컨테이너입니다.\n * Container that wraps an individual accordion item.\n * \n * @component\n * @param {AccordionItemProps} props - AccordionItem 컴포넌트의 props / AccordionItem component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} AccordionItem 컴포넌트 / AccordionItem component\n */\nconst AccordionItem = React.forwardRef<HTMLDivElement, AccordionItemProps>(\n ({ \n value, \n children, \n className,\n disabled = false,\n openItems = [],\n onToggle,\n ...props \n }, ref) => {\n const isOpen = openItems.includes(value)\n\n return (\n <div\n ref={ref}\n data-accordion-item\n className={merge(\n \"border border-border/50 rounded-lg overflow-hidden\",\n disabled && \"opacity-50 pointer-events-none\",\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n value,\n isOpen,\n disabled,\n onToggle: () => onToggle?.(value),\n 'data-accordion-value': value\n } as Partial<AccordionTriggerProps | AccordionContentProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nAccordionItem.displayName = \"AccordionItem\"\n\ninterface AccordionTriggerProps {\n children: React.ReactNode\n className?: string\n icon?: React.ReactNode\n iconPosition?: \"left\" | \"right\"\n value?: string // Optional: AccordionItem에서 자동으로 전달됨 / Optional: Auto-passed from AccordionItem\n isOpen?: boolean\n disabled?: boolean\n onToggle?: () => void\n}\n\nconst AccordionTrigger = React.forwardRef<HTMLButtonElement, AccordionTriggerProps>(\n ({ \n children, \n className,\n icon,\n iconPosition = \"right\",\n value,\n isOpen = false,\n disabled = false,\n onToggle,\n ...props \n }, ref) => {\n const defaultIcon = (\n <Icon \n name=\"chevronDown\" \n size={20} \n className={merge(\n \"transition-transform duration-300 ease-out text-muted-foreground\",\n isOpen && \"rotate-180\"\n )} \n />\n )\n\n const contentId = `accordion-content-${value}`\n const triggerId = `accordion-trigger-${value}`\n\n return (\n <button\n ref={ref}\n id={triggerId}\n data-accordion-trigger\n data-accordion-value={value}\n aria-expanded={isOpen}\n aria-controls={contentId}\n onClick={onToggle}\n disabled={disabled}\n className={merge(\n \"flex w-full items-center justify-between px-6 py-4 text-left font-medium transition-all hover:bg-muted/80 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <div className=\"flex items-center gap-3 flex-1\">\n {iconPosition === \"left\" && (icon || defaultIcon)}\n <span className=\"flex-1\">{children}</span>\n </div>\n {iconPosition === \"right\" && (icon || defaultIcon)}\n </button>\n )\n }\n)\nAccordionTrigger.displayName = \"AccordionTrigger\"\n\n/**\n * AccordionTrigger 컴포넌트 / AccordionTrigger component\n * 아코디언 아이템을 열고 닫는 트리거 버튼입니다.\n * Button that opens and closes an accordion item.\n * \n * @component\n * @param {AccordionTriggerProps} props - AccordionTrigger 컴포넌트의 props / AccordionTrigger component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} AccordionTrigger 컴포넌트 / AccordionTrigger component\n */\n\n/**\n * AccordionContent 컴포넌트의 props\n * @typedef {Object} AccordionContentProps\n * @property {React.ReactNode} children - 콘텐츠\n * @property {string} [className] - 추가 CSS 클래스\n * @property {boolean} [isOpen] - 열림 상태 (AccordionItem에서 자동 전달)\n * @property {string} [value] - 아이템 값 (AccordionItem에서 자동 전달)\n * @property {string} ['data-accordion-value'] - 아이템 값 (내부 사용)\n */\ninterface AccordionContentProps {\n children: React.ReactNode\n className?: string\n isOpen?: boolean\n value?: string\n 'data-accordion-value'?: string\n}\n\n/**\n * AccordionContent 컴포넌트 / AccordionContent component\n * 아코디언 아이템의 콘텐츠를 표시합니다.\n * Displays the content of an accordion item.\n * \n * @component\n * @param {AccordionContentProps} props - AccordionContent 컴포넌트의 props / AccordionContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} AccordionContent 컴포넌트 / AccordionContent component\n */\nconst AccordionContent = React.forwardRef<HTMLDivElement, AccordionContentProps>(\n ({ children, className, isOpen = false, value, 'data-accordion-value': dataValue, ...props }, ref) => {\n const [height, setHeight] = React.useState(0)\n const contentRef = React.useRef<HTMLDivElement>(null)\n const itemValue = value || dataValue || 'unknown'\n\n React.useEffect(() => {\n if (contentRef.current) {\n if (isOpen) {\n setHeight(contentRef.current.scrollHeight)\n } else {\n setHeight(0)\n }\n }\n }, [isOpen, children])\n\n const triggerId = `accordion-trigger-${itemValue}`\n const contentId = `accordion-content-${itemValue}`\n\n return (\n <div\n ref={ref}\n id={contentId}\n role=\"region\"\n aria-labelledby={triggerId}\n hidden={!isOpen}\n className=\"overflow-hidden transition-all duration-300 ease-out\"\n style={{ height: `${height}px` }}\n {...props}\n >\n <div\n ref={contentRef}\n className={merge(\"px-6 pt-2 pb-4\", className)}\n >\n {children}\n </div>\n </div>\n )\n }\n)\nAccordionContent.displayName = \"AccordionContent\"\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent } ","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../lib/utils'\n\n/**\n * TabsContent 컴포넌트의 props / TabsContent component props\n * @typedef {Object} TabsContentProps\n * @property {string} value - 탭 패널의 고유 값 (TabsTrigger의 value와 일치해야 함) / Unique value for tab panel (must match TabsTrigger value)\n * @property {boolean} [active] - 탭 패널 활성화 상태 (자동 설정됨) / Tab panel active state (auto-set)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n active?: boolean\n}\n\n/**\n * TabsContent 컴포넌트 / TabsContent component\n * 탭의 콘텐츠 패널을 표시합니다. Tabs 컴포넌트 내부에서 사용됩니다.\n * Displays the tab content panel. Used inside Tabs component.\n * \n * @component\n * @param {TabsContentProps} props - TabsContent 컴포넌트의 props / TabsContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} TabsContent 컴포넌트 / TabsContent component\n */\nconst TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, value, active, children, ...props }, ref) => {\n // active prop이 명시적으로 false로 설정된 경우에만 숨김\n if (active === false) return null\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n id={`tabpanel-${value}`}\n aria-labelledby={`tab-${value}`}\n hidden={!active}\n className={merge(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nTabsContent.displayName = \"TabsContent\"\n\n/**\n * Tabs 컴포넌트의 props / Tabs component props\n * @typedef {Object} TabsProps\n * @property {string} [value] - 현재 활성화된 탭 값 (제어 컴포넌트) / Currently active tab value (controlled component)\n * @property {string} [defaultValue] - 초기 활성화된 탭 값 (비제어 컴포넌트) / Initial active tab value (uncontrolled component)\n * @property {(value: string) => void} [onValueChange] - 탭 변경 시 호출되는 콜백 / Callback when tab changes\n * @property {\"horizontal\" | \"vertical\"} [orientation=\"horizontal\"] - 탭 방향 / Tab orientation\n * @property {\"default\" | \"pills\" | \"underline\" | \"cards\"} [variant=\"default\"] - 탭 스타일 변형 / Tab style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 탭 크기 / Tab size\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n orientation?: \"horizontal\" | \"vertical\"\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * Tabs 컴포넌트 / Tabs component\n * \n * 탭 네비게이션을 제공하는 컴포넌트입니다.\n * 키보드 네비게이션(Arrow keys, Home/End)을 지원하며, ARIA 속성을 자동으로 설정합니다.\n * \n * Component that provides tab navigation.\n * Supports keyboard navigation (Arrow keys, Home/End) and automatically sets ARIA attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Tabs defaultValue=\"tab1\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">탭 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">탭 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">탭 1 내용</TabsContent>\n * <TabsContent value=\"tab2\">탭 2 내용</TabsContent>\n * </Tabs>\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [activeTab, setActiveTab] = useState(\"tab1\")\n * <Tabs value={activeTab} onValueChange={setActiveTab}>\n * <TabsList>\n * <TabsTrigger value=\"tab1\">탭 1</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">내용</TabsContent>\n * </Tabs>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Tabs variant=\"pills\" size=\"lg\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Pills 스타일</TabsTrigger>\n * </TabsList>\n * </Tabs>\n * \n * @param {TabsProps} props - Tabs 컴포넌트의 props / Tabs component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Tabs 컴포넌트 / Tabs component\n */\nconst Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n ({ \n className, \n value,\n defaultValue,\n onValueChange,\n orientation = \"horizontal\",\n variant = \"default\",\n size = \"md\",\n children,\n ...props \n }, ref) => {\n const [activeTab, setActiveTab] = React.useState(value || defaultValue || \"\")\n const isControlled = value !== undefined\n const currentValue = isControlled ? value : activeTab\n\n const handleTabChange = (newValue: string) => {\n if (!isControlled) {\n setActiveTab(newValue)\n }\n onValueChange?.(newValue)\n }\n\n React.useEffect(() => {\n if (value !== undefined) {\n setActiveTab(value)\n }\n }, [value])\n\n return (\n <div\n ref={ref}\n className={merge(\n \"w-full\",\n orientation === \"vertical\" && \"flex\",\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n // TabsContent인 경우 active prop만 설정 (value는 원래 값 유지)\n if (child.type === TabsContent) {\n const childProps = child.props as TabsContentProps\n return React.cloneElement(child, {\n active: childProps.value === currentValue\n } as Partial<TabsContentProps>)\n }\n // TabsList인 경우에만 onValueChange 전달\n if (child.type === TabsList) {\n return React.cloneElement(child, {\n value: currentValue,\n onValueChange: handleTabChange,\n orientation,\n variant,\n size\n } as Partial<TabsListProps>)\n }\n // 다른 React 컴포넌트들 (다른 custom wrapper 등)\n // HTML 요소가 아닌 경우에만 props 전달\n if (typeof child.type !== 'string') {\n return React.cloneElement(child, {\n value: currentValue,\n onValueChange: handleTabChange,\n orientation,\n variant,\n size\n } as Record<string, unknown>)\n }\n }\n return child\n })}\n </div>\n )\n }\n)\nTabs.displayName = \"Tabs\"\n\n/**\n * TabsList 컴포넌트의 props / TabsList component props\n * @typedef {Object} TabsListProps\n * @property {string} [value] - 현재 활성화된 탭 값 (Tabs에서 자동 전달) / Currently active tab value (auto-passed from Tabs)\n * @property {(value: string) => void} [onValueChange] - 탭 변경 콜백 (Tabs에서 자동 전달) / Tab change callback (auto-passed from Tabs)\n * @property {\"horizontal\" | \"vertical\"} [orientation] - 탭 방향 (Tabs에서 자동 전달) / Tab orientation (auto-passed from Tabs)\n * @property {\"default\" | \"pills\" | \"underline\" | \"cards\"} [variant] - 탭 스타일 (Tabs에서 자동 전달) / Tab style (auto-passed from Tabs)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 탭 크기 (Tabs에서 자동 전달) / Tab size (auto-passed from Tabs)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n onValueChange?: (value: string) => void\n orientation?: \"horizontal\" | \"vertical\"\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TabsList 컴포넌트 / TabsList component\n * 탭 트리거 목록을 표시합니다. Tabs 컴포넌트 내부에서 사용됩니다.\n * Displays the list of tab triggers. Used inside Tabs component.\n * \n * @component\n * @param {TabsListProps} props - TabsList 컴포넌트의 props / TabsList component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} TabsList 컴포넌트 / TabsList component\n */\nconst TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n ({ \n className, \n value,\n onValueChange,\n orientation = \"horizontal\",\n variant = \"default\",\n size = \"md\",\n children,\n ...props \n }, ref) => {\n const listRef = React.useRef<HTMLDivElement>(null)\n React.useImperativeHandle(ref, () => listRef.current as HTMLDivElement)\n \n // 모든 탭 트리거의 value를 수집\n const tabValues = React.useMemo(() => {\n const values: string[] = []\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n const childProps = child.props as { value?: string }\n if (childProps.value) {\n values.push(childProps.value)\n }\n }\n })\n return values\n }, [children])\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!value || tabValues.length === 0) return\n\n const currentIndex = tabValues.indexOf(value)\n if (currentIndex === -1) return\n\n let newIndex = currentIndex\n\n if (orientation === \"horizontal\") {\n if (e.key === \"ArrowLeft\") {\n e.preventDefault()\n newIndex = currentIndex > 0 ? currentIndex - 1 : tabValues.length - 1\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault()\n newIndex = currentIndex < tabValues.length - 1 ? currentIndex + 1 : 0\n } else if (e.key === \"Home\") {\n e.preventDefault()\n newIndex = 0\n } else if (e.key === \"End\") {\n e.preventDefault()\n newIndex = tabValues.length - 1\n }\n } else {\n if (e.key === \"ArrowUp\") {\n e.preventDefault()\n newIndex = currentIndex > 0 ? currentIndex - 1 : tabValues.length - 1\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault()\n newIndex = currentIndex < tabValues.length - 1 ? currentIndex + 1 : 0\n } else if (e.key === \"Home\") {\n e.preventDefault()\n newIndex = 0\n } else if (e.key === \"End\") {\n e.preventDefault()\n newIndex = tabValues.length - 1\n }\n }\n\n if (newIndex !== currentIndex && tabValues[newIndex]) {\n onValueChange?.(tabValues[newIndex])\n // 포커스 이동\n const triggerElement = listRef.current?.querySelector(\n `[data-tab-value=\"${tabValues[newIndex]}\"]`\n ) as HTMLElement\n triggerElement?.focus()\n }\n }\n const getVariantClasses = () => {\n switch (variant) {\n case \"pills\":\n return \"bg-muted p-3 rounded-xl border border-border/50\"\n case \"underline\":\n return \"border-b border-border\"\n case \"cards\":\n return \"bg-muted/80 p-3 rounded-xl border border-border/50\"\n default:\n return \"bg-muted p-3 rounded-xl border border-border/50\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"h-12\"\n case \"lg\":\n return \"h-16\"\n default:\n return \"h-14\"\n }\n }\n\n return (\n <div\n ref={listRef}\n role=\"tablist\"\n aria-orientation={orientation}\n onKeyDown={handleKeyDown}\n className={merge(\n \"flex items-center justify-center\",\n orientation === \"vertical\" && \"flex-col\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n // Only pass tab props to non-HTML elements (React components)\n if (typeof child.type === 'string') {\n return child\n }\n const childProps = child.props as { value?: string }\n return React.cloneElement(child, {\n onValueChange,\n orientation,\n variant,\n size,\n active: childProps.value === value\n } as Partial<TabsTriggerProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nTabsList.displayName = \"TabsList\"\n\n/**\n * TabsTrigger 컴포넌트의 props\n * @typedef {Object} TabsTriggerProps\n * @property {string} value - 탭 트리거의 고유 값 (TabsContent의 value와 일치해야 함)\n * @property {(value: string) => void} [onValueChange] - 탭 변경 콜백 (TabsList에서 자동 전달)\n * @property {\"horizontal\" | \"vertical\"} [orientation] - 탭 방향 (TabsList에서 자동 전달)\n * @property {\"default\" | \"pills\" | \"underline\" | \"cards\"} [variant] - 탭 스타일 (TabsList에서 자동 전달)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 탭 크기 (TabsList에서 자동 전달)\n * @property {boolean} [active] - 탭 활성화 상태 (자동 설정됨)\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n onValueChange?: (value: string) => void\n orientation?: \"horizontal\" | \"vertical\"\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\"\n size?: \"sm\" | \"md\" | \"lg\"\n active?: boolean\n}\n\n/**\n * TabsTrigger 컴포넌트 / TabsTrigger component\n * 탭을 활성화하는 버튼입니다. TabsList 컴포넌트 내부에서 사용됩니다.\n * Button that activates a tab. Used inside TabsList component.\n * \n * @component\n * @param {TabsTriggerProps} props - TabsTrigger 컴포넌트의 props / TabsTrigger component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} TabsTrigger 컴포넌트 / TabsTrigger component\n */\nconst TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n ({ \n className,\n value,\n onValueChange,\n orientation: _orientation = \"horizontal\",\n variant = \"default\",\n size = \"md\",\n active = false,\n children,\n ...props\n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"pills\":\n return merge(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-lg px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active\n ? \"bg-background text-foreground shadow-md\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n )\n case \"underline\":\n return merge(\n \"inline-flex items-center justify-center whitespace-nowrap border-b-2 px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active\n ? \"border-primary text-primary\"\n : \"border-transparent text-muted-foreground hover:text-foreground\"\n )\n case \"cards\":\n return merge(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-lg px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active\n ? \"bg-background text-foreground shadow-md\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n )\n default:\n return merge(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-lg px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active\n ? \"bg-background text-foreground shadow-md\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n )\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"h-10 px-4 py-2 text-xs\"\n case \"lg\":\n return \"h-14 px-6 py-3 text-base\"\n default:\n return \"h-12 px-5 py-2.5 text-sm\"\n }\n }\n\n const handleClick = () => {\n if (onValueChange) {\n onValueChange(value)\n }\n }\n\n return (\n <button\n ref={ref}\n role=\"tab\"\n aria-selected={active}\n aria-controls={`tabpanel-${value}`}\n id={`tab-${value}`}\n data-tab-value={value}\n tabIndex={active ? 0 : -1}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n onClick={handleClick}\n type=\"button\"\n {...props}\n >\n {children}\n </button>\n )\n }\n)\nTabsTrigger.displayName = \"TabsTrigger\"\n\n// 편의 컴포넌트들\nconst TabsPills = React.forwardRef<HTMLDivElement, TabsProps>(\n (props, ref) => <Tabs ref={ref} variant=\"pills\" {...props} />\n)\nTabsPills.displayName = \"TabsPills\"\n\nconst TabsUnderline = React.forwardRef<HTMLDivElement, TabsProps>(\n (props, ref) => <Tabs ref={ref} variant=\"underline\" {...props} />\n)\nTabsUnderline.displayName = \"TabsUnderline\"\n\nconst TabsCards = React.forwardRef<HTMLDivElement, TabsProps>(\n (props, ref) => <Tabs ref={ref} variant=\"cards\" {...props} />\n)\nTabsCards.displayName = \"TabsCards\"\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, TabsPills, TabsUnderline, TabsCards } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Menu 컴포넌트의 props / Menu component props\n * @typedef {Object} MenuProps\n * @property {React.ReactNode} children - MenuItem, MenuSeparator, MenuLabel 컴포넌트들 / MenuItem, MenuSeparator, MenuLabel components\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant=\"default\"] - 메뉴 방향 및 스타일 / Menu direction and style\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 메뉴 아이템 크기 / Menu item size\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MenuProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * Menu 컴포넌트 / Menu component\n * \n * 메뉴 리스트를 제공하는 컴포넌트입니다.\n * MenuItem, MenuSeparator, MenuLabel과 함께 사용합니다.\n * \n * Component that provides menu lists.\n * Used with MenuItem, MenuSeparator, and MenuLabel.\n * \n * @component\n * @example\n * // 기본 수직 메뉴 / Basic vertical menu\n * <Menu>\n * <MenuItem icon={<Icon name=\"home\" />}>홈</MenuItem>\n * <MenuItem icon={<Icon name=\"settings\" />}>설정</MenuItem>\n * <MenuSeparator />\n * <MenuItem>로그아웃</MenuItem>\n * </Menu>\n * \n * @example\n * // 수평 메뉴 / Horizontal menu\n * <Menu variant=\"horizontal\">\n * <MenuItem>메뉴 1</MenuItem>\n * <MenuItem>메뉴 2</MenuItem>\n * </Menu>\n * \n * @param {MenuProps} props - Menu 컴포넌트의 props / Menu component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Menu 컴포넌트 / Menu component\n */\nconst Menu = React.forwardRef<HTMLDivElement, MenuProps>(\n ({ \n className, \n children,\n variant = \"default\",\n size = \"md\",\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return \"flex items-center space-x-1\" // 4px 간격\n case \"vertical\":\n return \"flex flex-col space-y-1\" // 4px 간격\n case \"compact\":\n return \"flex flex-col space-y-0.5\" // 2px 간격\n default:\n return \"flex flex-col space-y-1\" // 4px 간격\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\n ref={ref}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n variant,\n size\n } as Partial<MenuItemProps | MenuSeparatorProps | MenuLabelProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nMenu.displayName = \"Menu\"\n\n/**\n * MenuItem 컴포넌트의 props / MenuItem component props\n * @typedef {Object} MenuItemProps\n * @property {React.ReactNode} [icon] - 메뉴 아이템 아이콘 / Menu item icon\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant] - 메뉴 변형 (Menu에서 자동 전달) / Menu variant (auto-passed from Menu)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 메뉴 크기 (Menu에서 자동 전달) / Menu size (auto-passed from Menu)\n * @property {boolean} [active=false] - 활성화 상태 / Active state\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface MenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n size?: \"sm\" | \"md\" | \"lg\"\n active?: boolean\n disabled?: boolean\n}\n\n/**\n * MenuItem 컴포넌트 / MenuItem component\n * 메뉴의 개별 아이템을 표시합니다.\n * Displays an individual menu item.\n * \n * @component\n * @param {MenuItemProps} props - MenuItem 컴포넌트의 props / MenuItem component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} MenuItem 컴포넌트 / MenuItem component\n */\nconst MenuItem = React.forwardRef<HTMLButtonElement, MenuItemProps>(\n ({ \n className, \n icon,\n variant = \"default\",\n size = \"md\",\n active = false,\n disabled = false,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return merge(\n \"flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors\", // 12px, 8px 패딩\n active \n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n case \"vertical\":\n return merge(\n \"flex items-center gap-3 px-4 py-3 rounded-md text-sm font-medium transition-colors\", // 16px, 12px 패딩\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n case \"compact\":\n return merge(\n \"flex items-center gap-2 px-2 py-1.5 rounded text-sm font-medium transition-colors\", // 8px, 6px 패딩\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n default:\n return merge(\n \"flex items-center gap-3 px-4 py-3 rounded-md text-sm font-medium transition-colors\", // 16px, 12px 패딩\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-xs\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n disabled={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)\nMenuItem.displayName = \"MenuItem\"\n\n/**\n * MenuSeparator 컴포넌트의 props / MenuSeparator component props\n * @typedef {Object} MenuSeparatorProps\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant] - 메뉴 변형 (Menu에서 자동 전달) / Menu variant (auto-passed from Menu)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MenuSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n}\n\n/**\n * MenuSeparator 컴포넌트 / MenuSeparator component\n * 메뉴 아이템들을 구분하는 구분선을 표시합니다.\n * Displays a separator line between menu items.\n * \n * @component\n * @param {MenuSeparatorProps} props - MenuSeparator 컴포넌트의 props / MenuSeparator component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} MenuSeparator 컴포넌트 / MenuSeparator component\n */\nconst MenuSeparator = React.forwardRef<HTMLDivElement, MenuSeparatorProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return \"w-px h-4 bg-border mx-1\" // 4px 여백\n case \"vertical\":\n case \"compact\":\n default:\n return \"h-px bg-border my-2\" // 8px 여백\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(getVariantClasses(), className)}\n {...props}\n />\n )\n }\n)\nMenuSeparator.displayName = \"MenuSeparator\"\n\n/**\n * MenuLabel 컴포넌트의 props / MenuLabel component props\n * @typedef {Object} MenuLabelProps\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant] - 메뉴 변형 (Menu에서 자동 전달) / Menu variant (auto-passed from Menu)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 메뉴 크기 (Menu에서 자동 전달) / Menu size (auto-passed from Menu)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MenuLabelProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * MenuLabel 컴포넌트 / MenuLabel component\n * 메뉴 섹션의 레이블을 표시합니다.\n * Displays a label for a menu section.\n * \n * @component\n * @param {MenuLabelProps} props - MenuLabel 컴포넌트의 props / MenuLabel component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} MenuLabel 컴포넌트 / MenuLabel component\n */\nconst MenuLabel = React.forwardRef<HTMLDivElement, MenuLabelProps>(\n ({ className, variant = \"default\", size = \"md\", children, ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return \"px-3 py-1 text-xs font-semibold text-muted-foreground uppercase tracking-wide\" // 12px, 4px 패딩\n case \"vertical\":\n case \"compact\":\n default:\n return \"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\" // 16px, 8px 패딩\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-xs\"\n case \"lg\":\n return \"text-sm\"\n default:\n return \"text-xs\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nMenuLabel.displayName = \"MenuLabel\"\n\n// 편의 컴포넌트들\nexport const MenuHorizontal = React.forwardRef<HTMLDivElement, Omit<MenuProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Menu ref={ref} variant=\"horizontal\" className={className} {...props} />\n )\n)\nMenuHorizontal.displayName = \"MenuHorizontal\"\n\nexport const MenuVertical = React.forwardRef<HTMLDivElement, Omit<MenuProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Menu ref={ref} variant=\"vertical\" className={className} {...props} />\n )\n)\nMenuVertical.displayName = \"MenuVertical\"\n\nexport const MenuCompact = React.forwardRef<HTMLDivElement, Omit<MenuProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Menu ref={ref} variant=\"compact\" className={className} {...props} />\n )\n)\nMenuCompact.displayName = \"MenuCompact\"\n\nexport { Menu, MenuItem, MenuSeparator, MenuLabel } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * ContextMenu 컴포넌트의 props / ContextMenu component props\n * @typedef {Object} ContextMenuProps\n * @property {React.ReactNode} children - ContextMenu 내용 / ContextMenu content\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {React.ReactNode} [trigger] - ContextMenu를 열기 위한 트리거 요소 (우클릭 이벤트) / Trigger element to open context menu (right-click event)\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [placement=\"bottom\"] - ContextMenu 표시 위치 / ContextMenu display position\n * @property {\"start\" | \"center\" | \"end\"} [align=\"start\"] - ContextMenu 정렬 / ContextMenu alignment\n * @property {number} [offset=8] - 트리거와 ContextMenu 사이 간격 (px) / Spacing between trigger and context menu (px)\n * @property {boolean} [disabled=false] - ContextMenu 비활성화 여부 / Disable context menu\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ContextMenuProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n trigger?: React.ReactNode\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\"\n align?: \"start\" | \"center\" | \"end\"\n offset?: number\n disabled?: boolean\n}\n\n/**\n * ContextMenu 컴포넌트 / ContextMenu component\n * \n * 우클릭 시 표시되는 컨텍스트 메뉴 컴포넌트입니다.\n * 트리거 요소에 우클릭 이벤트를 자동으로 연결합니다.\n * \n * Context menu component that appears on right-click.\n * Automatically connects right-click events to the trigger element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ContextMenu trigger={<div>우클릭하세요</div>}>\n * <div className=\"p-2\">\n * <button>항목 1</button>\n * <button>항목 2</button>\n * </div>\n * </ContextMenu>\n * \n * @example\n * // 제어 모드 / Controlled mode\n * const [open, setOpen] = useState(false)\n * <ContextMenu \n * open={open}\n * onOpenChange={setOpen}\n * trigger={<div>우클릭</div>}\n * >\n * <Menu>\n * <MenuItem>복사</MenuItem>\n * <MenuItem>삭제</MenuItem>\n * </Menu>\n * </ContextMenu>\n * \n * @param {ContextMenuProps} props - ContextMenu 컴포넌트의 props / ContextMenu component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ContextMenu 컴포넌트 / ContextMenu component\n */\nconst ContextMenu = React.forwardRef<HTMLDivElement, ContextMenuProps>(\n ({ \n className, \n children,\n open: controlledOpen,\n onOpenChange,\n trigger,\n placement: _placement = \"bottom\",\n align: _align = \"start\",\n offset: _offset = 8,\n disabled = false,\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 menuRef = React.useRef<HTMLDivElement>(null)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const handleOpenChange = React.useCallback((newOpen: boolean) => {\n if (disabled) return\n\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }, [disabled, isControlled, onOpenChange])\n\n const handleContextMenu = (event: React.MouseEvent) => {\n event.preventDefault()\n if (disabled) return\n\n const _rect = event.currentTarget.getBoundingClientRect()\n const x = event.clientX\n const y = event.clientY\n\n setCoords({ x, y })\n handleOpenChange(true)\n }\n\n const updatePosition = React.useCallback(() => {\n if (!menuRef.current) return\n\n const menuRect = menuRef.current.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let x = coords.x\n let y = coords.y\n\n // 뷰포트 경계 확인 및 조정\n if (x + menuRect.width > viewportWidth - 8) {\n x = viewportWidth - menuRect.width - 8 // 8px 여백\n }\n if (y + menuRect.height > viewportHeight - 8) {\n y = viewportHeight - menuRect.height - 8 // 8px 여백\n }\n if (x < 8) x = 8 // 8px 여백\n if (y < 8) y = 8 // 8px 여백\n\n setCoords({ x, y })\n }, [coords.x, coords.y])\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 menuRef.current &&\n !triggerRef.current.contains(event.target as Node) &&\n !menuRef.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, handleOpenChange])\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {/* 트리거 */}\n {trigger && (\n <div\n ref={triggerRef}\n onContextMenu={handleContextMenu}\n className=\"inline-block\"\n >\n {trigger}\n </div>\n )}\n\n {/* 컨텍스트 메뉴 */}\n {isOpen && (\n <div\n ref={menuRef}\n className={merge(\n \"fixed z-50 bg-popover text-popover-foreground rounded-lg shadow-xl backdrop-blur-sm\", // 보더 대신 섀도우 사용\n \"min-w-[200px] py-2\", // 16px 패딩\n \"border-0\" // 보더 제거\n )}\n style={{\n left: coords.x,\n top: coords.y,\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 {children}\n </div>\n )}\n </div>\n )\n }\n)\nContextMenu.displayName = \"ContextMenu\"\n\nexport interface ContextMenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"destructive\" | \"disabled\"\n}\n\nconst ContextMenuItem = React.forwardRef<HTMLButtonElement, ContextMenuItemProps>(\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-destructive hover:bg-destructive/10\"\n case \"disabled\":\n return \"text-muted-foreground cursor-not-allowed\"\n default:\n return \"text-foreground hover:bg-muted\"\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 duration-200 ease-in-out focus-visible:outline-none focus-visible:bg-muted\", // 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)\nContextMenuItem.displayName = \"ContextMenuItem\"\n\nexport interface ContextMenuSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst ContextMenuSeparator = React.forwardRef<HTMLDivElement, ContextMenuSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-border my-2\", className)} // 8px 여백\n {...props}\n />\n )\n)\nContextMenuSeparator.displayName = \"ContextMenuSeparator\"\n\nexport interface ContextMenuLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst ContextMenuLabel = React.forwardRef<HTMLDivElement, ContextMenuLabelProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\", className)} // 16px, 8px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nContextMenuLabel.displayName = \"ContextMenuLabel\"\n\n// 편의 컴포넌트들\nconst ContextMenuGroup = 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)\nContextMenuGroup.displayName = \"ContextMenuGroup\"\n\nexport { ContextMenu, ContextMenuItem, ContextMenuSeparator, ContextMenuLabel, ContextMenuGroup } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Command 컴포넌트의 props / Command component props\n * @typedef {Object} CommandProps\n * @property {React.ReactNode} children - CommandList, CommandItem 등 / CommandList, CommandItem, etc.\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {string} [placeholder=\"명령어를 검색하세요...\"] - 검색 입력 플레이스홀더 / Search input placeholder\n * @property {string} [searchValue] - 제어 모드에서 검색 값 / Search value in controlled mode\n * @property {(value: string) => void} [onSearchChange] - 검색 값 변경 콜백 / Search value change callback\n * @property {boolean} [disabled=false] - Command 비활성화 여부 / Disable command\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n placeholder?: string\n searchValue?: string\n onSearchChange?: (value: string) => void\n disabled?: boolean\n}\n\n/**\n * Command 컴포넌트 / Command component\n * \n * 명령 팔레트(Command Palette) 컴포넌트입니다.\n * Cmd+K (Mac) 또는 Ctrl+K (Windows)로 열 수 있습니다.\n * 키보드 네비게이션(Arrow keys, Enter, Escape)을 지원합니다.\n * \n * Command Palette component.\n * Can be opened with Cmd+K (Mac) or Ctrl+K (Windows).\n * Supports keyboard navigation (Arrow keys, Enter, Escape).\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Command>\n * <CommandInput placeholder=\"검색...\" />\n * <CommandList>\n * <CommandItem>항목 1</CommandItem>\n * <CommandItem>항목 2</CommandItem>\n * </CommandList>\n * </Command>\n * \n * @example\n * // 제어 모드 / Controlled mode\n * const [open, setOpen] = useState(false)\n * <Command \n * open={open}\n * onOpenChange={setOpen}\n * >\n * <CommandList>\n * <CommandGroup heading=\"파일\">\n * <CommandItem>새 파일</CommandItem>\n * </CommandGroup>\n * </CommandList>\n * </Command>\n * \n * @param {CommandProps} props - Command 컴포넌트의 props / Command component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Command 컴포넌트 / Command component\n */\nconst Command = React.forwardRef<HTMLDivElement, CommandProps>(\n ({ \n className, \n children,\n open: controlledOpen,\n onOpenChange,\n placeholder = \"명령어를 검색하세요...\",\n searchValue: controlledSearchValue,\n onSearchChange,\n disabled = false,\n ...props \n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const [internalSearchValue, setInternalSearchValue] = React.useState(\"\")\n const [selectedIndex, setSelectedIndex] = React.useState(0)\n const commandRef = React.useRef<HTMLDivElement>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const listRef = React.useRef<HTMLDivElement>(null)\n \n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n const searchValue = controlledSearchValue !== undefined ? controlledSearchValue : internalSearchValue\n\n const handleOpenChange = React.useCallback((newOpen: boolean) => {\n if (disabled) return\n\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }, [disabled, isControlled, onOpenChange])\n\n const handleSearchChange = (value: string) => {\n if (!isControlled) {\n setInternalSearchValue(value)\n }\n onSearchChange?.(value)\n setSelectedIndex(0)\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return\n\n const items = listRef.current?.querySelectorAll('[data-command-item]')\n const itemCount = items?.length || 0\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setSelectedIndex((prev) => (prev + 1) % itemCount)\n break\n case 'ArrowUp':\n event.preventDefault()\n setSelectedIndex((prev) => (prev - 1 + itemCount) % itemCount)\n break\n case 'Enter': {\n event.preventDefault()\n const selectedItem = items?.[selectedIndex] as HTMLElement\n selectedItem?.click()\n break\n }\n case 'Escape':\n event.preventDefault()\n handleOpenChange(false)\n break\n }\n }\n\n React.useEffect(() => {\n if (isOpen) {\n inputRef.current?.focus()\n setSelectedIndex(0)\n }\n }, [isOpen])\n\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'k' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n handleOpenChange(!isOpen)\n }\n // 전역 ESC 키 처리\n if (event.key === 'Escape' && isOpen) {\n event.preventDefault()\n handleOpenChange(false)\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [isOpen, handleOpenChange])\n\n React.useEffect(() => {\n const selectedItem = listRef.current?.querySelector(`[data-command-item]:nth-child(${selectedIndex + 1})`) as HTMLElement\n selectedItem?.scrollIntoView({ block: 'nearest' })\n }, [selectedIndex])\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {isOpen && (\n <div\n ref={commandRef}\n className={merge(\n \"fixed inset-0 z-50 bg-black/50 backdrop-blur-sm\", // 50% 투명도\n \"flex items-start justify-center pt-16\" // 64px 상단 여백\n )}\n onClick={() => handleOpenChange(false)}\n >\n <div\n className={merge(\n \"w-full max-w-2xl mx-4 bg-popover text-popover-foreground rounded-lg shadow-2xl\", // 보더 대신 섀도우\n \"border-0 overflow-hidden\" // 보더 제거\n )}\n onClick={(e) => e.stopPropagation()}\n style={{\n boxShadow: \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\"\n }}\n >\n <div className=\"p-4 border-b border-border\"> {/* 16px 패딩 */}\n <input\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n value={searchValue}\n onChange={(e) => handleSearchChange(e.target.value)}\n onKeyDown={handleKeyDown}\n className={merge(\n \"w-full bg-transparent text-lg font-medium outline-none\", // 18px 텍스트\n \"placeholder:text-muted-foreground\",\n \"text-foreground\"\n )}\n />\n </div>\n \n <div\n ref={listRef}\n className=\"max-h-96 overflow-y-auto py-2\" // 384px 최대 높이, 8px 패딩\n >\n {React.Children.map(children, (child, index) => {\n if (React.isValidElement<CommandItemProps>(child)) {\n // Fragment나 다른 컴포넌트에 selected prop 전달 방지\n if (child.type === React.Fragment || typeof child.type === 'symbol') {\n return child\n }\n return React.cloneElement(child, {\n selected: index === selectedIndex,\n onSelect: () => {\n child.props.onSelect?.()\n handleOpenChange(false)\n }\n })\n }\n return child\n })}\n </div>\n </div>\n </div>\n )}\n </div>\n )\n }\n)\nCommand.displayName = \"Command\"\n\n/**\n * CommandInput 컴포넌트의 props / CommandInput component props\n * @typedef {Object} CommandInputProps\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\n */\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst CommandInput = React.forwardRef<HTMLInputElement, CommandInputProps>(\n ({ className, ...props }, ref) => (\n <input\n ref={ref}\n className={merge(\n \"flex h-10 w-full rounded-md bg-transparent px-3 py-2 text-sm outline-none\", // 40px 높이, 12px, 8px 패딩\n \"placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n)\nCommandInput.displayName = \"CommandInput\"\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CommandList = React.forwardRef<HTMLDivElement, CommandListProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"max-h-96 overflow-y-auto py-2\", className)} // 384px 최대 높이, 8px 패딩\n {...props}\n />\n )\n)\nCommandList.displayName = \"CommandList\"\n\n/**\n * CommandItem 컴포넌트의 props / CommandItem component props\n * @typedef {Object} CommandItemProps\n * @property {React.ReactNode} [icon] - 항목 아이콘 / Item icon\n * @property {boolean} [selected=false] - 선택 상태 / Selected state\n * @property {() => void} [onSelect] - 선택 시 콜백 / Selection callback\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface CommandItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n selected?: boolean\n onSelect?: () => void\n}\n\nconst CommandItem = React.forwardRef<HTMLButtonElement, CommandItemProps>(\n ({ \n className, \n icon,\n selected = false,\n onSelect,\n children,\n ...props \n }, ref) => {\n return (\n <button\n ref={ref}\n data-command-item\n className={merge(\n \"relative flex w-full items-center gap-3 rounded-sm px-4 py-3 text-sm\", // 16px, 12px 패딩\n \"text-foreground\",\n \"hover:bg-muted\",\n \"focus:bg-muted\",\n \"focus:outline-none\",\n selected && \"bg-muted\",\n \"transition-colors\",\n className\n )}\n onClick={onSelect}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4 text-muted-foreground\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nCommandItem.displayName = \"CommandItem\"\n\n/**\n * CommandGroup 컴포넌트의 props / CommandGroup component props\n * @typedef {Object} CommandGroupProps\n * @property {React.ReactNode} [heading] - 그룹 제목 / Group heading\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n heading?: React.ReactNode\n}\n\nconst CommandGroup = React.forwardRef<HTMLDivElement, CommandGroupProps>(\n ({ className, heading, children, ...props }, ref) => (\n <div ref={ref} className={merge(\"py-2\", className)} {...props}> {/* 8px 패딩 */}\n {heading && (\n <div className=\"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\"> {/* 16px, 8px 패딩 */}\n {heading}\n </div>\n )}\n <div className=\"space-y-1\"> {/* 4px 간격 */}\n {children}\n </div>\n </div>\n )\n)\nCommandGroup.displayName = \"CommandGroup\"\n\n/**\n * CommandSeparator 컴포넌트의 props / CommandSeparator component props\n * @typedef {Object} CommandSeparatorProps\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CommandSeparator = React.forwardRef<HTMLDivElement, CommandSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-border my-2\", className)} // 8px 여백\n {...props}\n />\n )\n)\nCommandSeparator.displayName = \"CommandSeparator\"\n\n/**\n * CommandEmpty 컴포넌트의 props / CommandEmpty component props\n * @typedef {Object} CommandEmptyProps\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CommandEmpty = React.forwardRef<HTMLDivElement, CommandEmptyProps>(\n ({ className, children = \"결과가 없습니다.\", ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\n \"py-8 text-center text-sm text-muted-foreground\", // 32px 패딩\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n)\nCommandEmpty.displayName = \"CommandEmpty\"\n\n// 편의 컴포넌트들\nexport const CommandDialog = React.forwardRef<HTMLDivElement, CommandProps>(\n ({ className, ...props }, ref) => (\n <Command ref={ref} className={className} {...props} />\n )\n)\nCommandDialog.displayName = \"CommandDialog\"\n\nexport { Command, CommandInput, CommandList, CommandItem, CommandGroup, CommandSeparator, CommandEmpty } "]}
|