@hua-labs/ui 2.0.1 → 2.0.2
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 +182 -67
- package/dist/{Switch-O4TpMKfQ.d.mts → Switch-Dzm5TLR3.d.mts} +1 -1
- package/dist/advanced/dashboard.d.ts.map +1 -1
- package/dist/advanced-dashboard.js +1 -1
- package/dist/advanced-dashboard.js.map +1 -1
- package/dist/advanced-dashboard.mjs +1 -1
- package/dist/advanced-motion.js +5 -5
- package/dist/advanced-motion.js.map +1 -1
- package/dist/advanced-motion.mjs +1 -1
- package/dist/advanced.js +7 -7
- package/dist/advanced.js.map +1 -1
- package/dist/advanced.mjs +1 -1
- package/dist/{chunk-ECLIPN34.mjs → chunk-COR6CDMA.mjs} +3 -3
- package/dist/{chunk-ECLIPN34.mjs.map → chunk-COR6CDMA.mjs.map} +1 -1
- package/dist/chunk-HN5LSP6L.mjs +3 -0
- package/dist/chunk-HN5LSP6L.mjs.map +1 -0
- package/dist/{chunk-T3GU5BJ3.mjs → chunk-LOYAJIWO.mjs} +2 -2
- package/dist/{chunk-T3GU5BJ3.mjs.map → chunk-LOYAJIWO.mjs.map} +1 -1
- package/dist/{chunk-TOANBEPN.mjs → chunk-NBJUE7NR.mjs} +2 -2
- package/dist/{chunk-TOANBEPN.mjs.map → chunk-NBJUE7NR.mjs.map} +1 -1
- package/dist/{chunk-PQ3DBOMK.mjs → chunk-QQCELXFD.mjs} +2 -2
- package/dist/{chunk-PQ3DBOMK.mjs.map → chunk-QQCELXFD.mjs.map} +1 -1
- package/dist/{chunk-OI66ZLUB.mjs → chunk-UWHCM3S6.mjs} +2 -2
- package/dist/{chunk-OI66ZLUB.mjs.map → chunk-UWHCM3S6.mjs.map} +1 -1
- package/dist/{chunk-MYFMKCYX.mjs → chunk-XV3Y7QVU.mjs} +2 -2
- package/dist/{chunk-MYFMKCYX.mjs.map → chunk-XV3Y7QVU.mjs.map} +1 -1
- package/dist/components/Avatar.d.ts +1 -1
- package/dist/components/Avatar.d.ts.map +1 -1
- package/dist/components/Badge.d.ts +1 -1
- package/dist/components/Badge.d.ts.map +1 -1
- package/dist/components/Button.variants.d.ts +1 -1
- package/dist/components/Button.variants.d.ts.map +1 -1
- package/dist/components/Card.d.ts +1 -1
- package/dist/components/Card.d.ts.map +1 -1
- package/dist/components/CodeBlock.d.ts +1 -1
- package/dist/components/Container.d.ts +1 -1
- package/dist/components/Container.d.ts.map +1 -1
- package/dist/components/Grid.d.ts +1 -1
- package/dist/components/Grid.d.ts.map +1 -1
- package/dist/components/Icon/Icon.d.ts.map +1 -1
- package/dist/components/Input.d.ts +1 -1
- package/dist/components/Input.d.ts.map +1 -1
- package/dist/components/Label.d.ts +1 -1
- package/dist/components/Label.d.ts.map +1 -1
- package/dist/components/Link.d.ts +1 -1
- package/dist/components/Link.d.ts.map +1 -1
- package/dist/components/Panel.d.ts +1 -1
- package/dist/components/Panel.d.ts.map +1 -1
- package/dist/components/Progress.d.ts +2 -2
- package/dist/components/Progress.d.ts.map +1 -1
- package/dist/components/Select.d.ts +1 -1
- package/dist/components/Select.d.ts.map +1 -1
- package/dist/components/Skeleton.d.ts +1 -1
- package/dist/components/Skeleton.d.ts.map +1 -1
- package/dist/components/Stack.d.ts +1 -1
- package/dist/components/Stack.d.ts.map +1 -1
- package/dist/components/Textarea.d.ts +1 -1
- package/dist/components/Textarea.d.ts.map +1 -1
- package/dist/components/icons/essential.d.ts +68 -0
- package/dist/components/icons/essential.d.ts.map +1 -0
- package/dist/components/icons-bold/essential.d.ts +68 -0
- package/dist/components/icons-bold/essential.d.ts.map +1 -0
- package/dist/data.d.mts +1 -1
- package/dist/data.js.map +1 -1
- package/dist/data.mjs.map +1 -1
- package/dist/form.d.mts +1 -1
- package/dist/form.js +1 -1
- package/dist/form.js.map +1 -1
- package/dist/form.mjs +1 -1
- package/dist/iconsax-extended.d.ts +19 -0
- package/dist/iconsax-extended.d.ts.map +1 -0
- package/dist/iconsax-extended.js +3 -0
- package/dist/iconsax-extended.js.map +1 -0
- package/dist/iconsax-extended.mjs +4 -0
- package/dist/iconsax-extended.mjs.map +1 -0
- package/dist/iconsax.d.ts +10 -11
- package/dist/iconsax.d.ts.map +1 -1
- package/dist/iconsax.js +2 -2
- package/dist/iconsax.js.map +1 -1
- package/dist/iconsax.mjs +2 -2
- package/dist/iconsax.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/interactive.js +1 -1
- package/dist/interactive.js.map +1 -1
- package/dist/interactive.mjs +1 -1
- package/dist/lib/iconsax-loader.d.ts +15 -45
- package/dist/lib/iconsax-loader.d.ts.map +1 -1
- package/dist/navigation.js +2 -2
- package/dist/navigation.js.map +1 -1
- package/dist/navigation.mjs +1 -1
- package/dist/overlay.js +1 -1
- package/dist/overlay.js.map +1 -1
- package/dist/overlay.mjs +1 -1
- package/dist/sdui.js +3 -3
- package/dist/sdui.js.map +1 -1
- package/dist/sdui.mjs +1 -1
- package/package.json +18 -7
- package/src/components/icons/essential.ts +195 -0
- package/src/components/icons-bold/essential.ts +195 -0
- package/LICENSE +0 -21
- package/dist/chunk-AANHUMJ2.mjs +0 -3
- package/dist/chunk-AANHUMJ2.mjs.map +0 -1
- package/dist/components/icons/Frame2.d.ts +0 -4
- package/dist/components/icons/Frame2.d.ts.map +0 -1
- package/dist/components/icons/Group.d.ts +0 -4
- package/dist/components/icons/Group.d.ts.map +0 -1
- package/dist/components/icons/Group1.d.ts +0 -4
- package/dist/components/icons/Group1.d.ts.map +0 -1
- package/dist/components/icons/GroupCopy.d.ts +0 -4
- package/dist/components/icons/GroupCopy.d.ts.map +0 -1
- package/dist/iconsax.d.mts +0 -160
- package/src/components/icons/Frame2.tsx +0 -28
- package/src/components/icons/Group.tsx +0 -35
- package/src/components/icons/Group1.tsx +0 -21
- package/src/components/icons/GroupCopy.tsx +0 -21
package/dist/sdui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../src/components/Button.variants.ts","../src/lib/Slot.tsx","../src/components/Button.tsx","../src/components/Card.tsx","../src/components/Badge.tsx","../src/components/Avatar.tsx","../src/components/Container.tsx","../src/lib/styles/cva-base.ts","../src/components/Input.tsx","../src/components/Textarea.tsx","../src/components/Label.tsx","../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/Checkbox.tsx","../src/components/Switch.tsx","../src/components/Skeleton.tsx","../src/components/Progress.tsx","../src/components/Alert.tsx","../src/components/HeroSection.tsx","../src/components/ScrollProgress.tsx","../src/components/Accordion.tsx","../src/components/Tabs.tsx","../src/sdui/registry.tsx","../src/sdui/SDUIRenderer.tsx"],"names":["merge","inputs","twMerge","clsx","mergeMap","classMap","classes","condition","className","cn","springTransition","buttonVariants","cva","gradientPresets","composeRefs","refs","node","ref","composeEventHandlers","parentHandler","childHandler","event","mergeClassName","slotClassName","childClassName","mergeStyle","slotStyle","childStyle","mergeProps","slotProps","childProps","mergedProps","propName","slotValue","childValue","isSlottable","child","React","Slot","children","forwardedRef","childArray","childRef","mergedRef","isBrowser","useReducedMotion","reduce","setReduce","_a","mq","onChange","ButtonInner","variant","size","loading","icon","iconPosition","gradient","customGradient","rounded","shadow","hover","fullWidth","iconOnly","disabled","asChild","rest","reduced","gradientClass","base","content","jsxs","Fragment","jsx","onClick","target","rel","href","_ariaLabel","anchorClassName","anchorProps","isDisabled","handleAnchorClick","e","buttonClassName","btnProps","Button","cardVariants","Card","padding","hoverable","props","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","badgeVariants","Badge","avatarVariants","Avatar","src","alt","fallbackText","imgError","setImgError","useState","getFallbackContent","showImage","AvatarImage","AvatarFallback","containerVariants","Container","centered","fluid","FORM_STATE","inputVariants","Input","type","error","success","ariaInvalid","isInvalid","textareaVariants","Textarea","resize","labelVariants","Label","required","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","iconsaxResolver","getIconsaxResolver","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","name","emotion","status","weight","animated","pulse","spin","bounce","ariaLabel","ariaHidden","_b","config","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","iconsaxVariant","isClient","setIsClient","providerReady","setProviderReady","resolvedIcon","baseName","normalized","providerName","iconsaxIcon","variantClasses","ResolvedIcon","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon","Checkbox","label","description","id","generatedId","checkboxId","labelId","descriptionId","sizeClasses","iconSizes","stateClasses","isControlled","isChecked","needsReadOnly","Switch","switchId","thumbSizes","thumbTranslate","skeletonVariants","Skeleton","width","height","animation","getAnimationStyle","SkeletonText","SkeletonCircle","SkeletonRectangle","SkeletonRounded","SkeletonCard","SkeletonAvatar","SkeletonImage","SkeletonUserProfile","SkeletonList","_","SkeletonTable","progressBarVariants","progressTrackVariants","Progress","value","max","showValue","striped","percentage","ProgressSuccess","ProgressWarning","ProgressError","ProgressInfo","ProgressWrapper","title","ProgressGroup","Alert","action","closable","onClose","getVariantClasses","getIconClasses","getDefaultIcon","AlertSuccess","AlertWarning","AlertError","AlertInfo","HeroSection","subtitle","primaryAction","secondaryAction","slides","autoPlay","interval","indicator","showControls","pauseOnHover","background","customBackground","fullBleed","currentSlide","setCurrentSlide","isPaused","setIsPaused","isSlideMode","slideCount","nextSlide","useCallback","prev","prevSlide","goToSlide","useEffect","timer","currentContent","titleSizeClasses","subtitleSizeClasses","descriptionSizeClasses","currentBg","backgroundContent","renderIndicator","line","i","arr","ScrollProgress","color","position","_animated","showPercentage","progress","setProgress","updateProgress","scrollTop","docHeight","currentProgress","progressColors","Accordion","defaultValue","onValueChange","collapsible","openItems","setOpenItems","handleItemToggle","itemValue","newOpenItems","item","itemValues","values","handleKeyDown","currentValue","currentIndex","newIndex","triggerElement","AccordionItem","onToggle","isOpen","AccordionTrigger","defaultIcon","contentId","triggerId","AccordionContent","dataValue","setHeight","contentRef","TabsContent","active","Tabs","orientation","activeTab","setActiveTab","handleTabChange","newValue","TabsList","listRef","tabValues","getSizeClasses","TabsTrigger","_orientation","handleClick","TabsPills","TabsUnderline","TabsCards","Box","justify","align","style","backgroundColor","margin","borderRadius","border","customStyle","justifyMap","alignMap","Spacer","Flex","direction","gap","Grid","cols","textAlignMap","getTypographyStyle","Text","fontSize","lineHeight","fontWeight","letterSpacing","typoStyle","mergedStyle","H1","H2","H3","H4","isExternal","SDUIIcon","Section","Divider","Header","sticky","transparent","blur","overlay","SDUICheckbox","defaultChecked","checked","setChecked","SDUISwitch","SDUIInput","setValue","SDUITextarea","SDUIAccordion","items","SDUITabs","tabs","firstValue","tab","defaultRegistry","extendRegistry","customComponents","hasComponent","registry","SDUIContextInternal","useSDUI","context","getByPath","obj","path","acc","key","setByPath","keys","result","current","evaluateCondition","data","resolveProps","resolved","bindingMatch","val","NodeRenderer","handleAction","Component","resolvedProps","eventProps","SDUIRenderer","schema","components","initialData","onAction","onNavigate","isPageSchema","rootNode","schemaData","setDataState","useMemo","setData","navigate","_c","contextValue","SDUIFromJSON","json"],"mappings":"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","file":"sdui.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 ","import { cva } from 'class-variance-authority'\n\n/**\n * HUA Spring Easing transition — 시그니처 \"쫀득한\" 느낌\n * cubic-bezier(0.34, 1.56, 0.64, 1)\n */\nconst springTransition =\n '[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]'\n\nexport const buttonVariants = cva(\n // ── base ──\n 'inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-200 disabled:pointer-events-none disabled:opacity-50 min-w-fit focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--color-background)]',\n {\n variants: {\n /** 스타일 변형 */\n variant: {\n default:\n 'bg-[var(--color-primary)] text-[var(--color-primary-foreground)] hover:opacity-90',\n destructive:\n 'bg-[var(--color-destructive)] text-[var(--color-destructive-foreground)] hover:opacity-90 focus-visible:ring-[var(--color-destructive)]',\n outline:\n 'border-2 border-[var(--color-border)] bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\n secondary:\n 'bg-[var(--color-secondary)] text-[var(--color-secondary-foreground)] hover:opacity-80',\n ghost:\n 'bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\n link:\n 'bg-transparent text-[var(--color-primary)] underline hover:opacity-80 focus-visible:ring-offset-0',\n gradient:\n 'bg-gradient-to-r from-[var(--btn-gradient-from,theme(colors.teal.500))] to-[var(--btn-gradient-to,theme(colors.cyan.500))] text-white hover:shadow-lg',\n neon:\n 'bg-slate-900 dark:bg-slate-950 text-teal-400 border border-teal-500/50 shadow-lg shadow-[var(--btn-neon-glow,theme(colors.teal.500/20%))] hover:shadow-[var(--btn-neon-glow,theme(colors.teal.500/40%))] hover:border-teal-400',\n glass:\n 'bg-white/50 dark:bg-slate-900/50 backdrop-blur-md border border-slate-200/50 dark:border-slate-700/50 text-slate-900 dark:text-slate-100 hover:bg-white/70 dark:hover:bg-slate-900/70',\n },\n /** 크기 */\n size: {\n sm: 'h-8 px-4 py-2 text-sm',\n md: 'h-10 px-6 py-2 text-base',\n lg: 'h-12 px-8 py-3 text-lg',\n xl: 'h-14 px-10 py-4 text-xl',\n icon: 'h-10 w-10 p-0',\n },\n /** 모서리 둥글기 */\n rounded: {\n sm: 'rounded',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'rounded-full',\n },\n /** 그림자 */\n shadow: {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg',\n xl: 'shadow-xl',\n },\n /** 호버 효과 — springy가 HUA-UI 시그니처 */\n hover: {\n springy: `hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${springTransition} transform-gpu`,\n scale:\n 'hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu',\n glow: 'hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200',\n slide: `hover:-translate-y-0.5 hover:shadow-md ${springTransition} transform-gpu`,\n none: '',\n },\n /** 전체 너비 */\n fullWidth: {\n true: 'w-full',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n rounded: 'md',\n shadow: 'md',\n hover: 'springy',\n fullWidth: false,\n },\n }\n)\n\n/** Gradient 프리셋 */\nexport const gradientPresets: Record<string, string> = {\n blue: 'from-teal-500 to-cyan-500',\n purple: 'from-purple-500 to-pink-500',\n green: 'from-green-500 to-emerald-500 dark:from-green-400 dark:to-emerald-400',\n orange: 'from-orange-500 to-red-500 dark:from-orange-300 dark:to-red-300',\n pink: 'from-pink-500 to-rose-500',\n}\n\nexport type { VariantProps } from 'class-variance-authority'\n","\"use client\";\n\nimport React from \"react\";\nimport { clsx } from \"clsx\";\n\n/**\n * Slot 컴포넌트\n *\n * Radix UI의 asChild 패턴을 구현합니다.\n * 자식 요소의 props와 ref를 병합하여 하나의 요소로 렌더링합니다.\n *\n * @example\n * // Button에서 asChild 사용\n * <Button asChild>\n * <Link href=\"/home\">홈으로</Link>\n * </Button>\n *\n * @see https://www.radix-ui.com/primitives/docs/utilities/slot\n */\n\ntype SlotProps = React.HTMLAttributes<HTMLElement> & {\n children?: React.ReactNode;\n};\n\n/**\n * 여러 ref를 하나로 합칩니다\n */\nfunction composeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): React.RefCallback<T> {\n return (node) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref != null) {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n };\n}\n\n/**\n * 이벤트 핸들러를 합성합니다\n * \n * 부모(slot) 핸들러를 먼저 실행하고, 그 다음 자식 핸들러를 실행합니다.\n * defaultPrevented가 true이면 자식 핸들러는 실행하지 않습니다.\n */\nfunction composeEventHandlers<E>(\n parentHandler?: (event: E) => void,\n childHandler?: (event: E) => void\n): (event: E) => void {\n return (event) => {\n parentHandler?.(event);\n if (!(event as unknown as { defaultPrevented: boolean }).defaultPrevented) {\n childHandler?.(event);\n }\n };\n}\n\n/**\n * className을 병합합니다\n */\nfunction mergeClassName(\n slotClassName?: string,\n childClassName?: string\n): string | undefined {\n if (!slotClassName && !childClassName) return undefined;\n return clsx(slotClassName, childClassName);\n}\n\n/**\n * style을 병합합니다\n */\nfunction mergeStyle(\n slotStyle?: React.CSSProperties,\n childStyle?: React.CSSProperties\n): React.CSSProperties | undefined {\n if (!slotStyle && !childStyle) return undefined;\n return { ...slotStyle, ...childStyle };\n}\n\n/**\n * props를 병합합니다 (이벤트 핸들러, className, style 등)\n */\nfunction mergeProps(\n slotProps: Record<string, unknown>,\n childProps: Record<string, unknown>\n): Record<string, unknown> {\n const mergedProps: Record<string, unknown> = { ...slotProps };\n\n for (const propName in childProps) {\n const slotValue = slotProps[propName];\n const childValue = childProps[propName];\n\n // 이벤트 핸들러 병합 (부모(slot) → 자식 순서)\n if (/^on[A-Z]/.test(propName)) {\n if (slotValue && childValue) {\n mergedProps[propName] = composeEventHandlers(\n slotValue as (event: unknown) => void,\n childValue as (event: unknown) => void\n );\n } else {\n mergedProps[propName] = childValue || slotValue;\n }\n }\n // className 병합\n else if (propName === \"className\") {\n mergedProps[propName] = mergeClassName(\n slotValue as string | undefined,\n childValue as string | undefined\n );\n }\n // style 병합\n else if (propName === \"style\") {\n mergedProps[propName] = mergeStyle(\n slotValue as React.CSSProperties | undefined,\n childValue as React.CSSProperties | undefined\n );\n }\n // 그 외: 자식 값 우선\n else {\n mergedProps[propName] = childValue !== undefined ? childValue : slotValue;\n }\n }\n\n return mergedProps;\n}\n\n/**\n * 유효한 단일 React 요소인지 확인\n */\nfunction isSlottable(child: React.ReactNode): child is React.ReactElement {\n return React.isValidElement(child);\n}\n\n/**\n * Slot 컴포넌트\n *\n * 자식 요소에 부모의 props를 주입합니다.\n * asChild 패턴을 구현할 때 사용합니다.\n */\nconst Slot = React.forwardRef<HTMLElement, SlotProps>(\n ({ children, ...slotProps }, forwardedRef) => {\n const childArray = React.Children.toArray(children);\n\n // 유효한 단일 자식이 있는지 확인\n if (childArray.length !== 1) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Slot] asChild는 정확히 하나의 자식 요소가 필요합니다.\"\n );\n }\n return null;\n }\n\n const child = childArray[0];\n\n if (!isSlottable(child)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[Slot] 자식은 유효한 React 요소여야 합니다.\");\n }\n return null;\n }\n\n // 자식 요소의 props와 ref 추출\n const childProps = child.props as Record<string, unknown>;\n const childRef = (child as unknown as { ref?: React.Ref<HTMLElement> }).ref;\n\n // props와 ref 병합\n const mergedProps = mergeProps(slotProps, childProps);\n const mergedRef = composeRefs(forwardedRef, childRef);\n\n return React.cloneElement(child, {\n ...mergedProps,\n ref: mergedRef,\n } as React.Attributes);\n }\n);\n\nSlot.displayName = \"Slot\";\n\nexport { Slot, composeRefs, mergeProps };\nexport type { SlotProps };\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { buttonVariants, gradientPresets } from \"./Button.variants\";\nimport { Slot } from \"../lib/Slot\";\n\n/**\n * 버튼 스타일 변형 / Button style variant\n */\ntype Variant =\n | \"default\" | \"destructive\" | \"outline\" | \"secondary\"\n | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\";\n\n/**\n * 버튼 크기 / Button size\n */\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\";\n\n/**\n * 버튼 모서리 둥글기 / Button border radius\n */\ntype Rounded = \"sm\" | \"md\" | \"lg\" | \"full\";\n\n/**\n * 버튼 그림자 / Button shadow\n */\ntype Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * 버튼 호버 효과 / Button hover effect\n * \"springy\"가 HUA-UI 시그니처 - 공 튕기듯 미세한 반동\n */\ntype Hover = \"springy\" | \"scale\" | \"glow\" | \"slide\" | \"none\";\n\n/**\n * 그라디언트 색상 이름 / Gradient color name\n */\ntype GradientName = \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\";\n\n/**\n * Button 컴포넌트의 공통 props / Common props for Button component\n */\ntype CommonProps = {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n icon?: React.ReactNode;\n iconPosition?: \"left\" | \"right\";\n gradient?: GradientName;\n customGradient?: string;\n rounded?: Rounded;\n shadow?: Shadow;\n hover?: Hover;\n fullWidth?: boolean;\n iconOnly?: boolean;\n \"aria-label\"?: string;\n className?: string;\n disabled?: boolean;\n asChild?: boolean;\n};\n\ntype AnchorProps = CommonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"className\"> & {\n href: string;\n };\n\ntype NativeButtonProps = CommonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"className\" | \"type\"> & {\n href?: undefined;\n };\n\n/**\n * Button 컴포넌트의 props 타입 / Button component props type\n * href가 제공되면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n */\nexport type ButtonProps = AnchorProps | NativeButtonProps;\n\ntype AnchorOrButton = HTMLAnchorElement | HTMLButtonElement;\n\nconst isBrowser = typeof window !== \"undefined\";\nfunction useReducedMotion() {\n const [reduce, setReduce] = React.useState(false);\n React.useEffect(() => {\n if (!isBrowser || !(\"matchMedia\" in window)) return;\n const mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const onChange = () => setReduce(!!mq.matches);\n onChange();\n mq.addEventListener?.(\"change\", onChange);\n return () => mq.removeEventListener?.(\"change\", onChange);\n }, []);\n return reduce;\n}\n\n/**\n * Button 컴포넌트 / Button component\n *\n * 다양한 스타일과 크기를 지원하는 범용 버튼 컴포넌트입니다.\n * href prop을 제공하면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n *\n * @example\n * <Button onClick={() => console.log('클릭')}>클릭하세요</Button>\n * <Button variant=\"destructive\" size=\"lg\">삭제</Button>\n * <Button variant=\"gradient\" gradient=\"purple\">그라디언트</Button>\n * <Button href=\"/about\" variant=\"link\">자세히 보기</Button>\n */\nconst ButtonInner = React.forwardRef<AnchorOrButton, ButtonProps>(function ButtonInner(\n {\n variant = \"default\",\n size = \"md\",\n loading = false,\n icon,\n iconPosition = \"left\",\n gradient = \"blue\",\n customGradient,\n rounded = \"md\",\n shadow = \"md\",\n hover = \"springy\",\n fullWidth,\n iconOnly,\n className,\n children,\n disabled,\n asChild = false,\n ...rest\n },\n ref\n) {\n const reduced = useReducedMotion();\n\n // gradient variant: 커스텀 그라디언트 클래스 처리\n const gradientClass =\n variant === \"gradient\"\n ? customGradient\n ? `bg-gradient-to-r ${customGradient}`\n : `bg-gradient-to-r ${gradientPresets[gradient] || gradientPresets.blue}`\n : undefined;\n\n const base = merge(\n buttonVariants({\n variant,\n size,\n rounded,\n shadow,\n hover: reduced ? \"none\" : hover,\n fullWidth: fullWidth ?? false,\n }),\n gradientClass,\n className\n );\n\n const Spinner = (\n <span role=\"status\" aria-live=\"polite\" className=\"-ml-1 mr-2 inline-flex\">\n <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n <span className=\"sr-only\">로딩 중</span>\n </span>\n );\n\n const content = (\n <>\n {loading && Spinner}\n {!loading && icon && iconPosition === \"left\" && <span className=\"mr-2\">{icon}</span>}\n {children}\n {!loading && icon && iconPosition === \"right\" && <span className=\"ml-2\">{icon}</span>}\n </>\n );\n\n if (iconOnly && !(\"aria-label\" in rest) && process.env.NODE_ENV !== \"production\") {\n console.warn(\"[Button] iconOnly 사용 시 aria-label을 제공하세요.\");\n }\n\n // asChild 모드: Slot을 사용하여 자식 요소에 props 병합\n if (asChild) {\n const slotProps = {\n className: base,\n ref,\n disabled: disabled || loading,\n \"aria-busy\": loading || undefined,\n \"aria-disabled\": (disabled || loading) || undefined,\n ...rest,\n };\n return <Slot {...slotProps}>{children}</Slot>;\n }\n\n // 앵커 모드\n if (\"href\" in rest && rest.href) {\n const { onClick, target, rel, href, \"aria-label\": _ariaLabel, className: anchorClassName, ...anchorProps } = rest as AnchorProps;\n const isDisabled = !!disabled || loading;\n\n const handleAnchorClick: React.MouseEventHandler<HTMLAnchorElement> = (e) => {\n if (isDisabled) { e.preventDefault(); e.stopPropagation(); return; }\n onClick?.(e);\n };\n\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={merge(base, anchorClassName)}\n onClick={handleAnchorClick}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled ? -1 : anchorProps.tabIndex}\n target={target}\n rel={target === \"_blank\" ? rel ?? \"noopener noreferrer\" : rel}\n {...anchorProps}\n >\n {content}\n </a>\n );\n }\n\n // 버튼 모드\n const { className: buttonClassName, ...btnProps } = rest as NativeButtonProps;\n const isDisabled = !!disabled || loading;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n className={merge(base, buttonClassName)}\n type=\"button\"\n disabled={isDisabled}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n {...btnProps}\n >\n {content}\n </button>\n );\n});\n\nButtonInner.displayName = \"Button\";\n\nexport const Button = ButtonInner;\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const cardVariants = cva(\n \"rounded-lg\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground border border-border\",\n outline: \"bg-transparent border-2 border-border\",\n elevated: \"bg-card text-card-foreground shadow-lg border border-border\",\n },\n shadow: {\n none: \"shadow-none\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n },\n padding: {\n none: \"\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n padding: \"none\",\n },\n }\n)\n\n/**\n * Card 컴포넌트의 props / Card component props\n */\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"outline\" | \"elevated\"\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\"\n hoverable?: boolean\n}\n\n/**\n * Card 컴포넌트 / Card component\n *\n * 콘텐츠를 카드 형태로 표시하는 컴포넌트입니다.\n *\n * @example\n * <Card>\n * <CardHeader><CardTitle>제목</CardTitle></CardHeader>\n * <CardContent><p>내용</p></CardContent>\n * </Card>\n */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant = \"default\", shadow, padding = \"none\", hoverable, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n cardVariants({ variant, shadow, padding }),\n hoverable && \"transition-shadow hover:shadow-lg cursor-pointer\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nCard.displayName = \"Card\"\n\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex flex-col space-y-1 p-3\", className)}\n {...props}\n />\n )\n)\n\nCardHeader.displayName = \"CardHeader\"\n\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, CardTitleProps>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={merge(\n \"text-base md:text-lg font-semibold leading-tight tracking-tight\",\n className\n )}\n {...props}\n />\n )\n)\n\nCardTitle.displayName = \"CardTitle\"\n\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={merge(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\n\nCardDescription.displayName = \"CardDescription\"\n\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={merge(\"px-3 pb-3\", className)} {...props} />\n )\n)\n\nCardContent.displayName = \"CardContent\"\n\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center px-3 pb-3\", className)}\n {...props}\n />\n )\n)\n\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80\",\n secondary: \"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80\",\n destructive: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n error: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n outline: \"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]\",\n glass: \"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n *\n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge }\n","\"use client\"\n\nimport React, { useState } from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const avatarVariants = cva(\n \"relative flex shrink-0 overflow-hidden rounded-full\",\n {\n variants: {\n size: {\n sm: \"w-8 h-8 text-xs\",\n md: \"w-10 h-10 text-sm\",\n lg: \"w-12 h-12 text-base\",\n },\n variant: {\n default: \"\",\n glass: \"ring-1 ring-white/30 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\n/**\n * Avatar 컴포넌트의 props / Avatar component props\n */\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"glass\"\n src?: string\n alt?: string\n fallbackText?: string\n}\n\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {}\nexport interface AvatarFallbackProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Avatar 컴포넌트 / Avatar component\n *\n * 사용자 프로필 이미지를 표시하는 컴포넌트입니다.\n *\n * @example\n * <Avatar src=\"/user.jpg\" alt=\"사용자\" />\n * <Avatar alt=\"홍길동\">홍</Avatar>\n * <Avatar variant=\"glass\" size=\"lg\" src=\"/user.jpg\" alt=\"사용자\" />\n */\nconst Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ className, size = \"md\", variant = \"default\", src, alt, fallbackText, children, ...props }, ref) => {\n const [imgError, setImgError] = useState(false)\n\n const getFallbackContent = () => {\n if (fallbackText) return fallbackText\n if (children) return children\n if (alt) return alt.charAt(0).toUpperCase()\n return \"U\"\n }\n\n const showImage = src && !imgError\n\n return (\n <div\n ref={ref}\n className={merge(avatarVariants({ size, variant }), className)}\n {...props}\n >\n {showImage ? (\n <AvatarImage\n src={src}\n alt={alt || \"avatar\"}\n onError={() => setImgError(true)}\n />\n ) : (\n <AvatarFallback>\n {getFallbackContent()}\n </AvatarFallback>\n )}\n </div>\n )\n }\n)\nAvatar.displayName = \"Avatar\"\n\nconst AvatarImage = React.forwardRef<HTMLImageElement, AvatarImageProps>(\n ({ className, ...props }, ref) => (\n <img\n ref={ref}\n className={merge(\"aspect-square h-full w-full object-cover object-center\", className)}\n {...props}\n />\n )\n)\nAvatarImage.displayName = \"AvatarImage\"\n\nconst AvatarFallback = React.forwardRef<HTMLDivElement, AvatarFallbackProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\n \"flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-semibold\",\n className\n )}\n {...props}\n />\n )\n)\nAvatarFallback.displayName = \"AvatarFallback\"\n\nexport { Avatar, AvatarImage, AvatarFallback } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const containerVariants = cva(\n \"w-full\",\n {\n variants: {\n size: {\n sm: \"max-w-2xl\",\n md: \"max-w-4xl\",\n lg: \"max-w-6xl\",\n xl: \"max-w-7xl\",\n full: \"max-w-full\",\n },\n padding: {\n none: \"\",\n sm: \"px-3 sm:px-4 py-6 sm:py-8\",\n md: \"px-4 sm:px-6 py-8 sm:py-12\",\n lg: \"px-4 sm:px-6 lg:px-8 py-10 sm:py-16\",\n xl: \"px-6 sm:px-8 lg:px-12 py-12 sm:py-20\",\n },\n },\n defaultVariants: {\n size: \"lg\",\n padding: \"md\",\n },\n }\n)\n\n/**\n * Container 컴포넌트의 props\n */\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n centered?: boolean\n fluid?: boolean\n}\n\n/**\n * Container 컴포넌트\n *\n * 콘텐츠를 감싸는 컨테이너 컴포넌트입니다.\n * 반응형 최대 너비와 패딩을 제공하여 일관된 레이아웃을 구성합니다.\n *\n * @example\n * <Container><h1>제목</h1></Container>\n * <Container size=\"sm\" padding=\"none\"><div>콘텐츠</div></Container>\n * <Container fluid padding=\"xl\"><div>전체 너비</div></Container>\n */\nconst Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n ({\n className,\n size = \"lg\",\n padding = \"md\",\n centered = true,\n fluid = false,\n ...props\n }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n containerVariants({ size: fluid ? undefined : size, padding }),\n fluid && \"max-w-full\",\n centered && \"mx-auto\",\n className\n )}\n {...props}\n />\n )\n }\n)\nContainer.displayName = \"Container\"\n\nexport { Container } ","/**\n * CVA 공통 상수 — 전 컴포넌트에서 재사용\n *\n * 모든 CVA variant 정의에서 import하여 사용합니다.\n * @example\n * import { SHARED_DISABLED, SHARED_FOCUS } from '../lib/styles/cva-base'\n */\n\n/** 비활성 상태 공통 스타일 */\nexport const SHARED_DISABLED =\n 'disabled:pointer-events-none disabled:opacity-50' as const\n\n/** 포커스 링 공통 스타일 */\nexport const SHARED_FOCUS =\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2' as const\n\n/** 트랜지션 공통 스타일 */\nexport const SHARED_TRANSITION =\n 'transition-colors duration-150' as const\n\n/** 글래스모피즘 공통 스타일 */\nexport const SHARED_GLASS =\n 'backdrop-blur-md border-white/20 bg-white/10 dark:bg-white/5' as const\n\n/**\n * 폼 상태 스타일 (error / success)\n * Input, Select, Textarea, Switch 등 전체 폼 컴포넌트에서 사용\n */\nexport const FORM_STATE = {\n error: 'border-destructive focus-visible:ring-destructive',\n success: 'border-green-500 focus-visible:ring-green-500',\n} as const\n\n/**\n * HUA 시그니처 스프링 이징\n * cubic-bezier(0.34, 1.56, 0.64, 1) — \"쫀득한\" 느낌\n */\nexport const HUA_SPRING_EASING =\n 'cubic-bezier(0.34, 1.56, 0.64, 1)' as const\n\n/** 마이크로 모션 기본 트랜지션 */\nexport const SHARED_MICRO_MOTION =\n 'transition-all duration-[180ms]' as const\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const inputVariants = cva(\n \"flex h-10 w-full rounded-md border px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200 hover:border-accent-foreground hover:shadow-sm\",\n {\n variants: {\n variant: {\n default: \"border-input bg-background\",\n outline: \"border-2 border-input bg-transparent\",\n filled: \"border-transparent bg-secondary/50\",\n glass: \"border-white/20 bg-white/10 text-white placeholder:text-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Input 컴포넌트의 props / Input component props\n */\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n error?: boolean\n success?: boolean\n}\n\n/**\n * Input 컴포넌트 / Input component\n *\n * 표준 HTML input 요소를 래핑한 스타일링된 입력 필드 컴포넌트입니다.\n *\n * @example\n * <Input type=\"text\" placeholder=\"이름을 입력하세요\" />\n * <Input type=\"email\" error placeholder=\"이메일\" />\n */\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, variant = \"default\", error, success, ...props }, ref) => {\n const ariaInvalid = props[\"aria-invalid\" as keyof typeof props] as boolean | undefined;\n const isInvalid = error || (ariaInvalid !== undefined ? ariaInvalid : false);\n\n return (\n <input\n type={type}\n className={merge(\n inputVariants({ variant }),\n isInvalid && FORM_STATE.error,\n success && FORM_STATE.success,\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const textareaVariants = cva(\n \"flex w-full rounded-md border transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-offset-2 hover:border-accent-foreground hover:shadow-sm disabled:cursor-not-allowed disabled:opacity-50 placeholder:text-muted-foreground\",\n {\n variants: {\n variant: {\n default: \"border-input bg-background text-foreground focus:border-ring focus:ring-ring\",\n outline: \"border-2 border-input bg-transparent text-foreground focus:border-ring focus:ring-ring\",\n filled: \"border-transparent bg-secondary/50 text-foreground focus:bg-background focus:border-ring focus:ring-ring\",\n ghost: \"border-transparent bg-transparent text-foreground focus:bg-muted focus:border-border focus:ring-muted-foreground\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white placeholder:text-white/60 focus:border-ring/50 focus:ring-ring/20 focus:bg-white/20\",\n },\n size: {\n sm: \"px-3 py-2 text-sm min-h-[80px]\",\n md: \"px-4 py-3 text-base min-h-[100px]\",\n lg: \"px-4 py-3 text-lg min-h-[120px]\",\n },\n resize: {\n none: \"resize-none\",\n vertical: \"resize-y\",\n horizontal: \"resize-x\",\n both: \"resize\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n resize: \"vertical\",\n },\n }\n)\n\n/**\n * Textarea 컴포넌트의 props / Textarea component props\n */\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n resize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\"\n}\n\n/**\n * Textarea 컴포넌트 / Textarea component\n * \n * 여러 줄 텍스트 입력을 위한 텍스트 영역 컴포넌트입니다.\n * 다양한 스타일 변형과 크기를 지원하며, 접근성 속성을 포함합니다.\n * \n * Text area component for multi-line text input.\n * Supports various style variants and sizes, includes accessibility attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Textarea placeholder=\"내용을 입력하세요\" />\n * \n * @example\n * // 에러 상태 / Error state\n * <Textarea \n * error\n * placeholder=\"에러가 발생했습니다\"\n * aria-label=\"설명 입력\"\n * />\n * \n * @example\n * // 크기 조절 비활성화 / Disable resize\n * <Textarea \n * resize=\"none\"\n * rows={5}\n * placeholder=\"고정 크기 텍스트 영역\"\n * />\n * \n * @param {TextareaProps} props - Textarea 컴포넌트의 props / Textarea component props\n * @param {React.Ref<HTMLTextAreaElement>} ref - textarea 요소 ref / textarea element ref\n * @returns {JSX.Element} Textarea 컴포넌트 / Textarea component\n * \n * @todo 접근성 개선: aria-invalid 속성 자동 추가 필요 / Accessibility improvement: auto-add aria-invalid attribute\n */\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n resize = \"vertical\",\n ...props \n }, ref) => {\n const ariaInvalid = props['aria-invalid' as keyof typeof props] as boolean | undefined\n const isInvalid = error || (ariaInvalid !== undefined ? ariaInvalid : false)\n\n return (\n <textarea\n className={merge(\n textareaVariants({ variant, size, resize }),\n error && FORM_STATE.error,\n success && FORM_STATE.success,\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n {\n variants: {\n variant: {\n default: \"text-foreground\",\n glass: \"text-white\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Label 컴포넌트의 props / Label component props\n */\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n required?: boolean\n error?: boolean\n disabled?: boolean\n variant?: \"default\" | \"glass\"\n}\n\n/**\n * Label 컴포넌트 / Label component\n *\n * 폼 필드의 레이블을 표시하는 컴포넌트입니다.\n *\n * @example\n * <Label htmlFor=\"email\">이메일</Label>\n * <Label required htmlFor=\"name\">이름</Label>\n * <Label error htmlFor=\"password\">비밀번호</Label>\n */\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({\n className,\n children,\n required = false,\n error = false,\n disabled = false,\n variant = \"default\",\n ...props\n }, ref) => {\n return (\n <label\n ref={ref}\n className={merge(\n labelVariants({ variant }),\n error && (variant === \"glass\" ? \"text-red-400\" : \"text-destructive\"),\n disabled && (variant === \"glass\" ? \"text-white/50\" : \"text-muted-foreground\"),\n className\n )}\n aria-required={required ? true : undefined}\n {...props}\n >\n {children}\n {required && (\n <span className={variant === \"glass\" ? \"text-red-400 ml-1\" : \"text-destructive ml-1\"} aria-label=\"필수 필드\">*</span>\n )}\n </label>\n )\n }\n)\nLabel.displayName = \"Label\"\n\nexport { Label } ","/**\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 // iconsax resolver 미등록 시 조용히 처리\n if (iconSet !== 'iconsax' || getIconsaxResolver()) {\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 * Checkbox 컴포넌트의 props / Checkbox component props\n * @typedef {Object} CheckboxProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Checkbox 스타일 변형 / Checkbox style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Checkbox 크기 / Checkbox size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 체크박스 레이블 텍스트 / Checkbox label text\n * @property {string} [description] - 체크박스 설명 텍스트 / Checkbox description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Checkbox 컴포넌트 / Checkbox component\n * \n * 체크박스 입력 필드를 제공하는 컴포넌트입니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Checkbox input field component.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Checkbox label=\"이용약관에 동의합니다\" />\n * \n * @example\n * // 에러 상태와 설명 / Error state with description\n * <Checkbox \n * label=\"필수 항목\"\n * description=\"이 항목은 필수입니다\"\n * error\n * />\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [checked, setChecked] = useState(false)\n * <Checkbox \n * checked={checked}\n * onChange={(e) => setChecked(e.target.checked)}\n * label=\"동의\"\n * />\n * \n * @param {CheckboxProps} props - Checkbox 컴포넌트의 props / Checkbox component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Checkbox 컴포넌트 / Checkbox component\n */\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const generatedId = React.useId()\n const checkboxId = id || generatedId\n const labelId = label ? `${checkboxId}-label` : undefined\n const descriptionId = description ? `${checkboxId}-description` : undefined\n const sizeClasses = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-6 h-6\"\n }\n\n const iconSizes = {\n sm: 12,\n md: 14,\n lg: 16\n }\n\n const variantClasses = {\n default: \"border-input bg-background text-primary focus:ring-ring\",\n outline: \"border-2 border-input bg-transparent text-primary focus:ring-ring\",\n filled: \"border-transparent bg-muted text-primary focus:bg-background focus:ring-ring\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:ring-ring/50 focus:bg-white/20\",\n }\n\n const stateClasses = error\n ? \"border-destructive focus:ring-destructive\"\n : success\n ? \"border-green-500 focus:ring-green-500\"\n : \"\"\n\n // Support both controlled and uncontrolled modes\n const isControlled = props.checked !== undefined;\n const isChecked = props.checked ?? props.defaultChecked ?? false;\n // Add readOnly if controlled without onChange to suppress React warning\n const needsReadOnly = isControlled && !props.onChange && !props.readOnly;\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id={checkboxId}\n className={merge(\n \"peer absolute inset-0 w-full h-full opacity-0 cursor-pointer z-10\",\n className\n )}\n ref={ref}\n aria-checked={isChecked}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"checkbox\"\n readOnly={needsReadOnly || props.readOnly}\n {...props}\n />\n <div\n className={merge(\n \"flex items-center justify-center rounded border transition-all duration-200 cursor-pointer relative\",\n \"peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-offset-2\",\n \"peer-hover:border-accent-foreground peer-hover:shadow-sm\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses,\n isChecked && \"bg-primary border-primary shadow-md shadow-primary/20\",\n !isChecked && \"bg-background\"\n )}\n >\n {/* 체크 아이콘으로 개선 */}\n <Icon \n name=\"check\" \n size={iconSizes[size]} \n className={merge(\n \"text-white transition-all duration-200\",\n isChecked ? \"opacity-100 scale-100\" : \"opacity-0 scale-0\"\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={checkboxId} id={labelId} className=\"text-sm font-medium text-foreground cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nCheckbox.displayName = \"Checkbox\"\n\nexport { Checkbox } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Switch 컴포넌트의 props / Switch component props\n * @typedef {Object} SwitchProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Switch 스타일 변형 / Switch style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Switch 크기 / Switch size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 스위치 레이블 텍스트 / Switch label text\n * @property {string} [description] - 스위치 설명 텍스트 / Switch description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface SwitchProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Switch 컴포넌트 / Switch component\n * \n * 토글 스위치 입력 필드를 제공하는 컴포넌트입니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Toggle switch input field component.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Switch label=\"알림 받기\" />\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [enabled, setEnabled] = useState(false)\n * <Switch \n * checked={enabled}\n * onChange={(e) => setEnabled(e.target.checked)}\n * label=\"다크 모드\"\n * />\n * \n * @example\n * // 에러 상태 / Error state\n * <Switch \n * label=\"필수 설정\"\n * description=\"이 설정을 활성화해야 합니다\"\n * error\n * />\n * \n * @param {SwitchProps} props - Switch 컴포넌트의 props / Switch component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Switch 컴포넌트 / Switch component\n */\nconst Switch = React.forwardRef<HTMLInputElement, SwitchProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const generatedId = React.useId()\n const switchId = id || generatedId\n const labelId = label ? `${switchId}-label` : undefined\n const descriptionId = description ? `${switchId}-description` : undefined\n // Track sizes - proper proportions for smooth toggle\n const sizeClasses = {\n sm: \"w-9 h-5\",\n md: \"w-11 h-6\",\n lg: \"w-14 h-8\"\n }\n\n // Thumb sizes - slightly smaller than track height for padding\n const thumbSizes = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-7 h-7\"\n }\n\n // Thumb position when checked - calculated for proper alignment\n const thumbTranslate = {\n sm: \"peer-checked:translate-x-4\",\n md: \"peer-checked:translate-x-5\",\n lg: \"peer-checked:translate-x-6\"\n }\n\n const variantClasses = {\n default: \"bg-muted peer-checked:bg-primary\",\n outline: \"bg-transparent border-2 border-input peer-checked:border-primary peer-checked:bg-primary\",\n filled: \"bg-secondary peer-checked:bg-primary\",\n glass: \"bg-white/20 backdrop-blur-sm border border-white/30 peer-checked:bg-primary/50 peer-checked:border-primary/30\",\n }\n\n const stateClasses = error\n ? \"bg-destructive/20 peer-checked:bg-destructive\"\n : success\n ? \"bg-green-200 peer-checked:bg-green-600 dark:bg-green-800 dark:peer-checked:bg-green-500\"\n : \"\"\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id={switchId}\n className={merge(\n \"peer sr-only\",\n className\n )}\n ref={ref}\n aria-checked={props.checked ?? false}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"switch\"\n {...props}\n />\n <div\n className={merge(\n \"relative inline-flex cursor-pointer items-center rounded-full transition-colors duration-200 ease-in-out\",\n \"peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-ring peer-focus:ring-offset-2\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses\n )}\n >\n <div\n className={merge(\n \"pointer-events-none absolute rounded-full bg-white shadow-md ring-0\",\n \"transition-all duration-200 ease-out\",\n \"top-1/2 -translate-y-1/2 left-0.5\",\n thumbSizes[size],\n thumbTranslate[size]\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={switchId} id={labelId} className=\"text-sm font-medium text-foreground cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nSwitch.displayName = \"Switch\"\n\nexport { Switch } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const skeletonVariants = cva(\n \"block\",\n {\n variants: {\n variant: {\n text: \"rounded w-full h-4\",\n circular: \"rounded-full w-10 h-10\",\n rounded: \"rounded-lg w-full h-[200px]\",\n rectangular: \"rounded-none w-full h-[200px]\",\n },\n animation: {\n pulse: \"animate-pulse bg-muted\",\n wave: \"bg-muted\",\n shimmer: \"bg-muted\",\n },\n },\n defaultVariants: {\n variant: \"text\",\n animation: \"pulse\",\n },\n }\n)\n\n/**\n * Skeleton 컴포넌트의 props\n */\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"text\" | \"circular\" | \"rectangular\" | \"rounded\"\n width?: string | number\n height?: string | number\n animation?: \"pulse\" | \"wave\" | \"shimmer\"\n className?: string\n}\n\n/**\n * Skeleton 컴포넌트 / Skeleton component\n *\n * 로딩 중 콘텐츠의 플레이스홀더를 표시하는 스켈레톤 컴포넌트입니다.\n *\n * @example\n * <Skeleton />\n * <Skeleton variant=\"circular\" width={40} height={40} />\n * <Skeleton variant=\"rounded\" width=\"100%\" height={200} animation=\"wave\" />\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({\n className,\n variant = \"text\",\n width,\n height,\n animation = \"pulse\",\n ...props\n }, ref) => {\n const getAnimationStyle = (): React.CSSProperties => {\n if (animation === \"wave\" || animation === \"shimmer\") {\n return {\n background: \"linear-gradient(90deg, hsl(var(--muted)) 0%, hsl(var(--muted-foreground) / 0.2) 50%, hsl(var(--muted)) 100%)\",\n backgroundSize: \"200% 100%\",\n animation: \"shimmer 1.5s ease-in-out infinite\",\n }\n }\n return {}\n }\n\n return (\n <>\n {(animation === \"wave\" || animation === \"shimmer\") && (\n <style>{`\n @keyframes shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n `}</style>\n )}\n <div\n ref={ref}\n className={merge(\n skeletonVariants({ variant, animation }),\n className\n )}\n style={{\n ...(width != null ? { width: typeof width === \"number\" ? `${width}px` : width } : {}),\n ...(height != null ? { height: typeof height === \"number\" ? `${height}px` : height } : {}),\n ...getAnimationStyle(),\n }}\n {...props}\n />\n </>\n )\n }\n)\nSkeleton.displayName = \"Skeleton\"\n\n// 편의 컴포넌트들\nexport const SkeletonText = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"text\" className={className} {...props} />\n )\n)\nSkeletonText.displayName = \"SkeletonText\"\n\nexport const SkeletonCircle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"circular\" className={className} {...props} />\n )\n)\nSkeletonCircle.displayName = \"SkeletonCircle\"\n\nexport const SkeletonRectangle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rectangular\" className={className} {...props} />\n )\n)\nSkeletonRectangle.displayName = \"SkeletonRectangle\"\n\nexport const SkeletonRounded = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rounded\" className={className} {...props} />\n )\n)\nSkeletonRounded.displayName = \"SkeletonRounded\"\n\n// 복합 스켈레톤 컴포넌트들\nexport const SkeletonCard = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4 p-6\", className)} // 16px 간격, 24px 패딩\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" /> {/* 16px 높이, 75% 너비 */}\n <SkeletonText className=\"h-3 w-1/2\" /> {/* 12px 높이, 50% 너비 */}\n </div>\n </div>\n <SkeletonRounded className=\"w-full h-32\" /> {/* 128px 높이 */}\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n <SkeletonText className=\"h-4 w-4/6\" />\n </div>\n </div>\n )\n)\nSkeletonCard.displayName = \"SkeletonCard\"\n\nexport const SkeletonAvatar = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center space-x-4\", className)} // 16px 간격\n {...props}\n >\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n )\n)\nSkeletonAvatar.displayName = \"SkeletonAvatar\"\n\nexport const SkeletonImage = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)} // 8px 간격\n {...props}\n >\n <SkeletonRounded className=\"w-full h-48\" /> {/* 192px 높이 */}\n <SkeletonText className=\"h-4 w-1/2\" />\n </div>\n )\n)\nSkeletonImage.displayName = \"SkeletonImage\"\n\nexport const SkeletonUserProfile = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-16 h-16\" /> {/* 64px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-5 w-1/2\" />\n <SkeletonText className=\"h-3 w-1/3\" />\n </div>\n </div>\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n </div>\n </div>\n )\n)\nSkeletonUserProfile.displayName = \"SkeletonUserProfile\"\n\nexport const SkeletonList = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-10 h-10\" /> {/* 40px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n )\n)\nSkeletonList.displayName = \"SkeletonList\"\n\nexport const SkeletonTable = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {/* 헤더 */}\n <div className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n {/* 행들 */}\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n ))}\n </div>\n )\n)\nSkeletonTable.displayName = \"SkeletonTable\"\n\nexport { Skeleton } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const progressBarVariants = cva(\n \"h-full rounded-full transition-all duration-300 ease-out\",\n {\n variants: {\n variant: {\n default: \"bg-foreground\",\n success: \"bg-[var(--progress-success)]\",\n warning: \"bg-[var(--progress-warning)]\",\n error: \"bg-[var(--progress-error)]\",\n info: \"bg-[var(--progress-info)]\",\n glass: \"bg-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport const progressTrackVariants = cva(\n \"relative w-full overflow-hidden rounded-full\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n success: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n warning: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n error: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n info: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n glass: \"bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/10 dark:border-slate-700/50\",\n },\n size: {\n sm: \"h-2\",\n md: \"h-3\",\n lg: \"h-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n }\n)\n\n/**\n * Progress 컴포넌트의 props\n */\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: number\n max?: number\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\" | \"glass\"\n showValue?: boolean\n animated?: boolean\n striped?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Progress 컴포넌트 / Progress component\n *\n * 진행률을 표시하는 프로그레스 바 컴포넌트입니다.\n *\n * @example\n * <Progress value={50} />\n * <Progress value={75} variant=\"success\" label=\"업로드\" showValue />\n * <Progress value={90} variant=\"warning\" striped animated />\n */\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n ({\n className,\n value = 0,\n max = 100,\n size = \"md\",\n variant = \"default\",\n showValue = false,\n animated = true,\n striped = false,\n label,\n description,\n ...props\n }, ref) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n return (\n <div className={merge(\"w-full\", className)} {...props}>\n {(label || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n {label && (\n <span className=\"text-sm font-medium text-foreground\">\n {label}\n </span>\n )}\n {showValue && (\n <span className=\"text-sm text-muted-foreground\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n\n <div\n ref={ref}\n className={progressTrackVariants({ variant, size })}\n >\n <div\n className={merge(\n progressBarVariants({ variant }),\n striped && \"bg-gradient-to-r from-transparent via-white/20 to-transparent bg-[length:20px_100%] animate-pulse\",\n animated && \"animate-pulse\"\n )}\n style={{\n width: `${percentage}%`,\n transition: animated ? \"width 0.3s ease-out\" : \"none\"\n }}\n />\n </div>\n\n {description && (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )\n }\n)\nProgress.displayName = \"Progress\"\n\n// 편의 컴포넌트들\nexport const ProgressSuccess = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nProgressSuccess.displayName = \"ProgressSuccess\"\n\nexport const ProgressWarning = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nProgressWarning.displayName = \"ProgressWarning\"\n\nexport const ProgressError = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nProgressError.displayName = \"ProgressError\"\n\nexport const ProgressInfo = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nProgressInfo.displayName = \"ProgressInfo\"\n\n// 복합 Progress 컴포넌트들\nexport const ProgressWrapper = React.forwardRef<HTMLDivElement, ProgressProps & { title?: string }>(\n ({ title, className, ...props }, ref) => (\n <div className={merge(\"p-4 bg-card rounded-lg border border-border\", className)}>\n {title && (\n <h3 className=\"text-sm font-semibold text-foreground mb-3\">\n {title}\n </h3>\n )}\n <Progress ref={ref} {...props} />\n </div>\n )\n)\nProgressWrapper.displayName = \"ProgressWrapper\"\n\nexport const ProgressGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nProgressGroup.displayName = \"ProgressGroup\"\n\nexport { Progress }\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Alert 컴포넌트의 props\n * @typedef {Object} AlertProps\n * @property {\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"} [variant=\"default\"] - Alert 스타일 변형\n * @property {string} [title] - Alert 제목\n * @property {string} [description] - Alert 설명\n * @property {React.ReactNode} [icon] - 커스텀 아이콘\n * @property {React.ReactNode} [action] - 액션 버튼/요소\n * @property {boolean} [closable=false] - 닫기 버튼 표시 여부\n * @property {() => void} [onClose] - 닫기 버튼 클릭 시 호출되는 콜백\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\"\n title?: string\n description?: string\n icon?: React.ReactNode\n action?: React.ReactNode\n closable?: boolean\n onClose?: () => void\n}\n\n/**\n * Alert 컴포넌트 / Alert component\n * \n * 사용자에게 중요한 정보나 경고를 표시하는 컴포넌트입니다.\n * 다양한 변형(variant)을 지원하며, 아이콘, 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n * \n * Component for displaying important information or warnings to users.\n * Supports various variants and can include icons, titles, descriptions, and action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Alert variant=\"info\" title=\"정보\" description=\"이것은 정보 메시지입니다.\" />\n * \n * @example\n * // 닫기 버튼 포함 / With close button\n * <Alert \n * variant=\"warning\" \n * title=\"경고\" \n * closable \n * onClose={() => console.log('닫기')}\n * />\n * \n * @example\n * // 커스텀 아이콘과 액션 / Custom icon and action\n * <Alert \n * variant=\"success\"\n * icon={<Icon name=\"check\" />}\n * action={<Button size=\"sm\">확인</Button>}\n * >\n * 작업이 완료되었습니다.\n * </Alert>\n * \n * @param {AlertProps} props - Alert 컴포넌트의 props / Alert component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Alert 컴포넌트 / Alert component\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ \n className, \n variant = \"default\",\n title,\n description,\n icon,\n action,\n closable = false,\n onClose,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"success\":\n return \"bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200\"\n case \"warning\":\n return \"bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200\"\n case \"error\":\n return \"bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200\"\n case \"info\":\n return \"bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200\"\n default:\n return \"bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200\"\n }\n }\n\n const getIconClasses = () => {\n switch (variant) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n default:\n return \"text-muted-foreground\"\n }\n }\n\n const getDefaultIcon = () => {\n switch (variant) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n default:\n return null\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative rounded-lg border p-4\", // 16px 패딩\n getVariantClasses(),\n className\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\"> {/* 12px 간격 */}\n {/* 아이콘 */}\n {(icon || getDefaultIcon()) && (\n <div className={merge(\"flex-shrink-0 mt-0.5\", getIconClasses())}>\n {icon || getDefaultIcon()}\n </div>\n )}\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {title}\n </h4>\n )}\n {description && (\n <p className=\"text-sm leading-relaxed\">\n {description}\n </p>\n )}\n {children && (\n <div className=\"mt-2\"> {/* 8px 여백 */}\n {children}\n </div>\n )}\n </div>\n\n {/* 액션 */}\n {(action || closable) && (\n <div className=\"flex-shrink-0 flex items-center gap-2\"> {/* 8px 간격 */}\n {action}\n {closable && (\n <button\n onClick={onClose}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconClasses()\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\nAlert.displayName = \"Alert\"\n\n// 편의 컴포넌트들\nexport const AlertSuccess = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nAlertSuccess.displayName = \"AlertSuccess\"\n\nexport const AlertWarning = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nAlertWarning.displayName = \"AlertWarning\"\n\nexport const AlertError = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nAlertError.displayName = \"AlertError\"\n\nexport const AlertInfo = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nAlertInfo.displayName = \"AlertInfo\"\n\nexport { Alert } ","\"use client\"\n\nimport React, { useState, useEffect, useCallback } from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Button } from \"./Button\"\n\n/**\n * 슬라이드 아이템 인터페이스\n */\nexport interface HeroSlide {\n title: string\n subtitle?: string\n description: string\n primaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n secondaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n background?: \"none\" | \"gradient\" | \"particles\" | \"image\"\n backgroundImage?: string\n}\n\n/**\n * HeroSection 컴포넌트의 props\n */\nexport interface HeroSectionProps extends React.HTMLAttributes<HTMLElement> {\n // 단일 모드 props\n title?: string\n subtitle?: string\n description?: string\n primaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n secondaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n // 슬라이드 모드 props\n slides?: HeroSlide[]\n autoPlay?: boolean\n interval?: number\n indicator?: \"dots\" | \"line\" | \"numbers\" | \"none\"\n showControls?: boolean\n pauseOnHover?: boolean\n // 공통 props\n background?: \"none\" | \"gradient\" | \"particles\" | \"video\" | \"image\"\n customBackground?: string\n /**\n * 히어로 섹션 크기\n * - sm: 400px, md: 500px, lg: 600px, xl: 700px\n * - full: 100vh (뷰포트 전체)\n */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n /**\n * 헤더 뒤까지 확장 (fixed header가 있을 때)\n * true면 -mt-16 적용되어 헤더 뒤로 들어감\n */\n fullBleed?: boolean\n}\n\n/**\n * HeroSection 컴포넌트\n *\n * 단일 히어로 또는 슬라이드 히어로를 지원합니다.\n * slides prop이 있으면 슬라이드 모드로 동작합니다.\n */\nconst HeroSection = React.forwardRef<HTMLElement, HeroSectionProps>(\n ({\n className,\n // 단일 모드\n title,\n subtitle,\n description,\n primaryAction,\n secondaryAction,\n // 슬라이드 모드\n slides,\n autoPlay = false,\n interval = 5000,\n indicator = \"dots\",\n showControls = true,\n pauseOnHover = true,\n // 공통\n background = \"gradient\",\n customBackground,\n size = \"lg\",\n fullBleed = false,\n ...props\n }, ref) => {\n const [currentSlide, setCurrentSlide] = useState(0)\n const [isPaused, setIsPaused] = useState(false)\n\n // 슬라이드 모드 여부\n const isSlideMode = slides && slides.length > 0\n const slideCount = slides?.length || 0\n\n // 다음 슬라이드\n const nextSlide = useCallback(() => {\n if (!isSlideMode) return\n setCurrentSlide((prev) => (prev + 1) % slideCount)\n }, [isSlideMode, slideCount])\n\n // 이전 슬라이드\n const prevSlide = useCallback(() => {\n if (!isSlideMode) return\n setCurrentSlide((prev) => (prev - 1 + slideCount) % slideCount)\n }, [isSlideMode, slideCount])\n\n // 특정 슬라이드로 이동\n const goToSlide = useCallback((index: number) => {\n setCurrentSlide(index)\n }, [])\n\n // 자동 재생\n useEffect(() => {\n if (!autoPlay || !isSlideMode || isPaused) return\n\n const timer = setInterval(nextSlide, interval)\n return () => clearInterval(timer)\n }, [autoPlay, isSlideMode, isPaused, interval, nextSlide])\n\n // 현재 표시할 콘텐츠\n const currentContent = isSlideMode ? slides[currentSlide] : {\n title: title || \"\",\n subtitle,\n description: description || \"\",\n primaryAction,\n secondaryAction,\n background,\n }\n\n const sizeClasses = {\n sm: \"min-h-[400px]\",\n md: \"min-h-[500px]\",\n lg: \"min-h-[600px]\",\n xl: \"min-h-[700px]\",\n full: \"min-h-screen\"\n }\n\n const titleSizeClasses = {\n sm: \"text-2xl sm:text-3xl md:text-4xl leading-tight\",\n md: \"text-3xl sm:text-4xl md:text-5xl leading-tight\",\n lg: \"text-3xl sm:text-4xl md:text-5xl lg:text-6xl leading-tight\",\n xl: \"text-3xl sm:text-4xl md:text-5xl lg:text-6xl leading-tight\",\n full: \"text-4xl sm:text-5xl md:text-6xl lg:text-7xl leading-tight\"\n }\n\n const subtitleSizeClasses = {\n sm: \"text-base sm:text-lg md:text-xl leading-snug\",\n md: \"text-lg sm:text-xl md:text-2xl leading-snug\",\n lg: \"text-lg sm:text-xl md:text-2xl lg:text-3xl leading-snug\",\n xl: \"text-xl sm:text-2xl md:text-3xl leading-snug\",\n full: \"text-xl sm:text-2xl md:text-3xl lg:text-4xl leading-snug\"\n }\n\n const descriptionSizeClasses = {\n sm: \"text-sm sm:text-base md:text-lg leading-relaxed\",\n md: \"text-base sm:text-lg md:text-xl leading-relaxed\",\n lg: \"text-base sm:text-lg md:text-xl leading-relaxed\",\n xl: \"text-base sm:text-lg md:text-xl leading-relaxed\",\n full: \"text-lg sm:text-xl md:text-2xl leading-relaxed\"\n }\n\n const currentBg = isSlideMode ? (currentContent.background || background) : background\n\n const backgroundContent: Record<string, React.ReactNode> = {\n none: null,\n gradient: (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n {/* 왼쪽 위 - 메인 그라데이션 */}\n <div className=\"absolute top-0 left-0 w-80 h-80 sm:w-96 sm:h-96 md:w-[500px] md:h-[500px] -translate-x-1/3 -translate-y-1/3 rounded-full bg-gradient-to-br from-teal-400 via-cyan-500 to-teal-600 opacity-40 blur-3xl\" />\n {/* 오른쪽 아래 - 보조 그라데이션 */}\n <div className=\"absolute bottom-0 right-0 w-72 h-72 sm:w-80 sm:h-80 md:w-[400px] md:h-[400px] translate-x-1/4 translate-y-1/4 rounded-full bg-gradient-to-tr from-cyan-400 via-teal-500 to-emerald-500 opacity-35 blur-3xl\" />\n {/* 중앙 액센트 */}\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-48 h-48 sm:w-64 sm:h-64 md:w-80 md:h-80 rounded-full bg-teal-500/20 blur-2xl\" />\n </div>\n ),\n particles: (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <div className=\"absolute inset-0 bg-gradient-to-br from-secondary/50 via-background to-secondary/30\" />\n </div>\n ),\n video: customBackground ? (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <video\n autoPlay\n loop\n muted\n playsInline\n className=\"absolute inset-0 w-full h-full object-cover opacity-20\"\n >\n <source src={customBackground} type=\"video/mp4\" />\n </video>\n </div>\n ) : null,\n image: (customBackground || (isSlideMode && (currentContent as HeroSlide).backgroundImage)) ? (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <img\n src={(isSlideMode && (currentContent as HeroSlide).backgroundImage) || customBackground}\n alt=\"\"\n className=\"absolute inset-0 w-full h-full object-cover opacity-30\"\n />\n <div className=\"absolute inset-0 bg-gradient-to-t from-background via-background/50 to-transparent\" />\n </div>\n ) : null,\n }\n\n // 인디케이터 렌더링\n const renderIndicator = () => {\n if (!isSlideMode || indicator === \"none\") return null\n\n switch (indicator) {\n case \"dots\":\n return (\n <div className=\"flex gap-2 justify-center mt-8\">\n {slides.map((_, index) => (\n <button\n key={index}\n onClick={() => goToSlide(index)}\n className={merge(\n \"w-2.5 h-2.5 rounded-full transition-all duration-300\",\n currentSlide === index\n ? \"bg-primary w-8\"\n : \"bg-muted-foreground/30 hover:bg-muted-foreground/50\"\n )}\n aria-label={`Go to slide ${index + 1}`}\n />\n ))}\n </div>\n )\n\n case \"line\":\n return (\n <div className=\"flex gap-1 justify-center mt-8 max-w-xs mx-auto\">\n {slides.map((_, index) => (\n <button\n key={index}\n onClick={() => goToSlide(index)}\n className=\"flex-1 h-1 rounded-full overflow-hidden bg-muted-foreground/20\"\n aria-label={`Go to slide ${index + 1}`}\n >\n <div\n className={merge(\n \"h-full bg-primary transition-all duration-300\",\n currentSlide === index ? \"w-full\" : \"w-0\"\n )}\n />\n </button>\n ))}\n </div>\n )\n\n case \"numbers\":\n return (\n <div className=\"flex items-center justify-center gap-2 mt-8 text-sm text-muted-foreground\">\n <span className=\"text-foreground font-semibold\">{currentSlide + 1}</span>\n <span>/</span>\n <span>{slideCount}</span>\n </div>\n )\n\n default:\n return null\n }\n }\n\n return (\n <section\n ref={ref}\n className={merge(\n \"relative w-full flex flex-col justify-center items-center text-center px-4 sm:px-6 lg:px-8 overflow-hidden\",\n sizeClasses[size],\n fullBleed && \"-mt-16 pt-16\",\n className\n )}\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\n {...props}\n >\n {backgroundContent[currentBg]}\n\n {/* 슬라이드 콘텐츠 */}\n <div className=\"relative z-10 max-w-4xl mx-auto\">\n <div\n key={isSlideMode ? currentSlide : 0}\n className=\"animate-in fade-in slide-in-from-bottom-4 duration-500\"\n >\n <h1 className={merge(\n \"font-extrabold mb-4 sm:mb-6 text-foreground\",\n titleSizeClasses[size]\n )}>\n <span className=\"block gradient-text\">\n {currentContent.title}\n </span>\n {currentContent.subtitle && (\n <span className={merge(\n \"block font-semibold mt-2 sm:mt-4 text-muted-foreground\",\n subtitleSizeClasses[size]\n )}>\n {currentContent.subtitle}\n </span>\n )}\n </h1>\n\n <div className={merge(\n \"text-muted-foreground mb-6 sm:mb-8 md:mb-10 max-w-2xl mx-auto\",\n descriptionSizeClasses[size]\n )}>\n {currentContent.description.split('\\n').map((line, i, arr) => (\n <React.Fragment key={i}>\n {line}\n {i < arr.length - 1 && <br />}\n </React.Fragment>\n ))}\n </div>\n\n {(currentContent.primaryAction || currentContent.secondaryAction) && (\n <div className=\"flex flex-col sm:flex-row gap-4 justify-center\">\n {currentContent.primaryAction && (\n <Button\n href={currentContent.primaryAction.href}\n size={size === \"xl\" || size === \"full\" ? \"lg\" : \"md\"}\n hover=\"scale\"\n className=\"inline-flex items-center gap-2\"\n >\n {currentContent.primaryAction.icon}\n {currentContent.primaryAction.label}\n </Button>\n )}\n\n {currentContent.secondaryAction && (\n <Button\n href={currentContent.secondaryAction.href}\n variant=\"outline\"\n size={size === \"xl\" || size === \"full\" ? \"lg\" : \"md\"}\n hover=\"scale\"\n className=\"inline-flex items-center gap-2\"\n >\n {currentContent.secondaryAction.icon}\n {currentContent.secondaryAction.label}\n </Button>\n )}\n </div>\n )}\n </div>\n\n {/* 인디케이터 */}\n {renderIndicator()}\n </div>\n\n {/* 좌우 컨트롤 */}\n {isSlideMode && showControls && slideCount > 1 && (\n <>\n <button\n onClick={prevSlide}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 z-20 p-2 rounded-full bg-card/80 backdrop-blur-sm border border-border text-foreground hover:bg-card transition-colors\"\n aria-label=\"Previous slide\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <button\n onClick={nextSlide}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 z-20 p-2 rounded-full bg-card/80 backdrop-blur-sm border border-border text-foreground hover:bg-card transition-colors\"\n aria-label=\"Next slide\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </>\n )}\n </section>\n )\n }\n)\n\nHeroSection.displayName = \"HeroSection\"\n\nexport { HeroSection }\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { merge } from '../lib/utils'\n\n/**\n * ScrollProgress 컴포넌트의 props / ScrollProgress component props\n * @typedef {Object} ScrollProgressProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {number} [height=2] - 진행률 바 높이 (px) / Progress bar height (px)\n * @property {'default' | 'primary' | 'secondary' | 'gradient'} [color='gradient'] - 진행률 바 색상 / Progress bar color\n * @property {'top' | 'bottom'} [position='top'] - 표시 위치 / Display position\n * @property {boolean} [animated=true] - 애니메이션 활성화 여부 / Enable animation\n * @property {boolean} [showPercentage=false] - 퍼센트 표시 여부 / Show percentage\n */\nexport interface ScrollProgressProps {\n className?: string\n height?: number\n color?: 'default' | 'primary' | 'secondary' | 'gradient'\n position?: 'top' | 'bottom'\n animated?: boolean\n showPercentage?: boolean\n}\n\n/**\n * ScrollProgress 컴포넌트 / ScrollProgress component\n * \n * 페이지 스크롤 진행률을 표시하는 컴포넌트입니다.\n * 페이지 상단 또는 하단에 고정되어 표시됩니다.\n * \n * Component that displays page scroll progress.\n * Fixed at top or bottom of the page.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ScrollProgress />\n * \n * @example\n * // 하단에 표시, 퍼센트 포함 / Display at bottom with percentage\n * <ScrollProgress \n * position=\"bottom\"\n * color=\"primary\"\n * showPercentage\n * height={4}\n * />\n * \n * @param {ScrollProgressProps} props - ScrollProgress 컴포넌트의 props / ScrollProgress component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ScrollProgress 컴포넌트 / ScrollProgress component\n */\nconst ScrollProgress = React.forwardRef<HTMLDivElement, ScrollProgressProps>(({\n className,\n height = 2,\n color = 'gradient',\n position = 'top',\n animated: _animated = true,\n showPercentage = false,\n ...props\n}, ref) => {\n const [progress, setProgress] = useState(0)\n\n useEffect(() => {\n const updateProgress = () => {\n const scrollTop = window.scrollY\n const docHeight = document.documentElement.scrollHeight - window.innerHeight\n const currentProgress = docHeight > 0 ? (scrollTop / docHeight) * 100 : 0\n setProgress(currentProgress)\n }\n\n // 초기 실행\n updateProgress()\n\n window.addEventListener('scroll', updateProgress, { passive: true })\n window.addEventListener('resize', updateProgress, { passive: true })\n \n return () => {\n window.removeEventListener('scroll', updateProgress)\n window.removeEventListener('resize', updateProgress)\n }\n }, [])\n\n // 색상 옵션 (Teal 브랜드 기반)\n const progressColors: Record<string, string> = {\n default: 'bg-foreground',\n primary: 'bg-primary',\n secondary: 'bg-muted-foreground',\n gradient: 'bg-gradient-to-r from-teal-600 via-cyan-500 to-teal-600'\n }\n\n const positionClasses = {\n top: 'top-0 left-0 right-0',\n bottom: 'bottom-0 left-0 right-0'\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n 'fixed z-50',\n positionClasses[position],\n className\n )}\n style={{ height: `${height}px` }}\n {...props}\n >\n {/* 배경 바 */}\n <div className=\"absolute inset-0 w-full h-full bg-border/30\" />\n \n {/* 진행률 바 - absolute로 배경 위에 표시 */}\n <div\n className={merge(\n 'absolute top-0 left-0 h-full origin-left transition-all duration-100 ease-out',\n progressColors[color] || progressColors.gradient\n )}\n style={{\n width: `${progress}%`,\n transformOrigin: 'left'\n }}\n />\n \n {/* 퍼센트 표시 (선택사항) */}\n {showPercentage && (\n <div className=\"absolute top-2 right-2 text-xs text-muted-foreground bg-card px-2 py-1 rounded border border-border\">\n {Math.round(progress)}%\n </div>\n )}\n </div>\n )\n})\n\nScrollProgress.displayName = 'ScrollProgress'\n\nexport { ScrollProgress } ","\"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\n/**\n * SDUI Component Registry\n *\n * 컴포넌트 타입 문자열 → 실제 React 컴포넌트 매핑\n */\n\nimport React, { useState } from \"react\";\nimport type { SDUIComponentRegistry } from \"./types\";\nimport { cn } from \"../lib/utils\";\n\n// 기본 컴포넌트들\nimport { Button } from \"../components/Button\";\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from \"../components/Card\";\nimport { Badge } from \"../components/Badge\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../components/Avatar\";\nimport { Container } from \"../components/Container\";\nimport { Input } from \"../components/Input\";\nimport { Textarea } from \"../components/Textarea\";\nimport { Label } from \"../components/Label\";\nimport { Checkbox, type CheckboxProps } from \"../components/Checkbox\";\nimport { Switch, type SwitchProps } from \"../components/Switch\";\nimport { type InputProps } from \"../components/Input\";\nimport { type TextareaProps } from \"../components/Textarea\";\nimport { Skeleton } from \"../components/Skeleton\";\nimport { Progress } from \"../components/Progress\";\nimport { Alert } from \"../components/Alert\";\nimport { Icon } from \"../components/Icon\";\nimport type { IconName } from \"../lib/icons\";\n\n// Advanced 컴포넌트들\nimport { HeroSection } from \"../components/HeroSection\";\nimport { ScrollProgress } from \"../components/ScrollProgress\";\n\n// Interactive 컴포넌트들\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from \"../components/Accordion\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"../components/Tabs\";\n\n// 레이아웃 프리미티브\nconst Box: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n // 커스텀 스타일 props (DOM에 직접 전달하지 않음)\n backgroundColor?: string;\n padding?: string | number;\n margin?: string | number;\n borderRadius?: string | number;\n border?: string;\n}> = ({\n children,\n justify,\n align,\n className = \"\",\n style,\n // 커스텀 props 분리 (DOM에 전달 X)\n backgroundColor,\n padding,\n margin,\n borderRadius,\n border,\n ...props\n}) => {\n // 커스텀 props를 style 객체로 병합\n const customStyle: React.CSSProperties = {\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n ...(margin !== undefined && { margin: typeof margin === 'number' ? `${margin}px` : margin }),\n ...(borderRadius !== undefined && { borderRadius: typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius }),\n ...(border && { border }),\n };\n\n return (\n <div\n className={cn(\n (justify || align) && \"flex\",\n justify && justifyMap[justify],\n align && alignMap[align],\n className\n )}\n style={Object.keys(customStyle).length > 0 ? customStyle : undefined}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// Spacer - 공백용 void 컴포넌트\nconst Spacer: React.FC<{ size?: number; className?: string }> = ({ size = 16, className = \"\" }) => (\n <div className={className} style={{ width: size, height: size, flexShrink: 0 }} />\n);\n\n// 정렬 매핑\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n};\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n};\n\nconst Flex: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n direction?: \"row\" | \"column\";\n gap?: number;\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n direction = \"row\",\n gap = 0,\n justify = \"start\",\n align = \"stretch\",\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`flex ${direction === \"column\" ? \"flex-col\" : \"flex-row\"} ${justifyMap[justify]} ${alignMap[align]} ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\nconst Grid: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n cols?: number;\n gap?: number;\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n cols = 1,\n gap = 4,\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`grid ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// 텍스트 정렬 매핑\nconst textAlignMap = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n\n// 타이포그래피 스타일 props 타입\ninterface TypographyStyleProps {\n fontSize?: string;\n lineHeight?: string;\n fontWeight?: string;\n letterSpacing?: string;\n}\n\n// 타이포그래피 스타일 props를 style 객체로 변환\nfunction getTypographyStyle(props: TypographyStyleProps): React.CSSProperties {\n const style: React.CSSProperties = {};\n if (props.fontSize) style.fontSize = props.fontSize;\n if (props.lineHeight) style.lineHeight = props.lineHeight;\n if (props.fontWeight) style.fontWeight = props.fontWeight;\n if (props.letterSpacing) style.letterSpacing = props.letterSpacing;\n return style;\n}\n\nconst Text: React.FC<React.HTMLAttributes<HTMLParagraphElement> & {\n variant?: \"body\" | \"muted\" | \"lead\";\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps> = ({\n children,\n variant = \"body\",\n align = \"center\",\n className = \"\",\n style,\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n ...props\n}) => {\n const variantClasses = {\n body: \"text-foreground\",\n muted: \"text-muted-foreground text-sm\",\n lead: \"text-xl text-muted-foreground\",\n };\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n\n return (\n <p\n className={`${variantClasses[variant]} ${textAlignMap[align]} ${className}`}\n style={mergedStyle}\n {...props}\n >\n {children}\n </p>\n );\n};\n\n// Heading 컴포넌트들 (정렬 + 타이포그래피 스타일 지원)\ntype HeadingProps = React.HTMLAttributes<HTMLHeadingElement> & {\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps;\n\nconst H1: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h1 className={`text-4xl md:text-5xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h1>\n );\n};\n\nconst H2: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h2 className={`text-3xl md:text-4xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h2>\n );\n};\n\nconst H3: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h3 className={`text-2xl md:text-3xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h3>\n );\n};\n\nconst H4: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h4 className={`text-xl md:text-2xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h4>\n );\n};\n\nconst Link: React.FC<React.AnchorHTMLAttributes<HTMLAnchorElement>> = ({\n children,\n href = \"#\",\n className = \"\",\n ...props\n}) => {\n // 절대 경로 처리: http/https로 시작하지 않으면 그대로, 시작하면 외부 링크\n const isExternal = href.startsWith(\"http://\") || href.startsWith(\"https://\");\n\n return (\n <a\n href={href}\n className={`text-primary hover:underline ${className}`}\n {...(isExternal ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n {...props}\n >\n {children}\n </a>\n );\n};\n\nconst Image: React.FC<React.ImgHTMLAttributes<HTMLImageElement>> = ({ className = \"\", alt = \"\", ...props }) => (\n <img className={`max-w-full h-auto ${className}`} alt={alt} {...props} />\n);\n\n// SDUI용 Icon 래퍼 (name을 string으로 받음)\nconst SDUIIcon: React.FC<{ name?: string; size?: number; className?: string }> = ({\n name = \"star\",\n size = 24,\n className = \"\",\n}) => <Icon name={name as IconName} size={size} className={className} />;\n\nconst Section: React.FC<React.HTMLAttributes<HTMLElement>> = ({\n children,\n className = \"\",\n ...props\n}) => (\n <section className={`py-10 ${className}`} {...props}>\n {children}\n </section>\n);\n\nconst Divider: React.FC<React.HTMLAttributes<HTMLHRElement>> = ({ className = \"\", ...props }) => (\n <hr className={`border-border ${className}`} {...props} />\n);\n\n// Header - 네비게이션 헤더 (GNB)\nconst Header: React.FC<React.HTMLAttributes<HTMLElement> & {\n sticky?: boolean;\n transparent?: boolean;\n blur?: boolean;\n overlay?: boolean;\n}> = ({\n children,\n sticky = true,\n transparent = false,\n blur = true,\n overlay = false,\n className = \"\",\n ...props\n}) => (\n <header\n className={cn(\n \"w-full px-4 py-3 z-50\",\n overlay ? \"absolute top-0 left-0 right-0\" : sticky && \"sticky top-0\",\n transparent ? \"bg-transparent\" : \"bg-background/80\",\n blur && !transparent && \"backdrop-blur-md\",\n !transparent && \"border-b border-border\",\n className\n )}\n {...props}\n >\n <div className=\"max-w-7xl mx-auto\">\n {children}\n </div>\n </header>\n);\n\n/**\n * SDUI용 Uncontrolled 래퍼 컴포넌트들\n * 프리뷰에서 인터랙션이 동작하도록 자체 상태 관리\n */\n\n// Uncontrolled Checkbox - 클릭하면 상태 토글\nconst SDUICheckbox: React.FC<CheckboxProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Checkbox\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Switch - 클릭하면 상태 토글\nconst SDUISwitch: React.FC<SwitchProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Switch\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Input - 자체 상태 관리\nconst SDUIInput: React.FC<InputProps> = ({ defaultValue = \"\", onChange, ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Input\n {...props}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Textarea - 자체 상태 관리 + resize 지원\nconst SDUITextarea: React.FC<TextareaProps> = ({ defaultValue = \"\", onChange, resize = \"vertical\", ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Textarea\n {...props}\n resize={resize}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n/**\n * SDUI용 간단한 Accordion - 데이터 기반\n * items 배열로 아코디언 생성\n */\ninterface SimpleAccordionItem {\n title: string;\n content: string;\n value?: string;\n}\n\nconst SDUIAccordion: React.FC<{\n items?: SimpleAccordionItem[];\n type?: \"single\" | \"multiple\";\n collapsible?: boolean;\n defaultValue?: string;\n className?: string;\n}> = ({\n items = [],\n type = \"single\",\n collapsible = true,\n defaultValue,\n className = \"\",\n}) => {\n return (\n <Accordion\n type={type}\n collapsible={collapsible}\n defaultValue={defaultValue}\n className={className}\n >\n {items.map((item, index) => {\n const value = item.value || `item-${index}`;\n return (\n <AccordionItem key={value} value={value}>\n <AccordionTrigger>{item.title}</AccordionTrigger>\n <AccordionContent>{item.content}</AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordion>\n );\n};\n\n/**\n * SDUI용 간단한 Tabs - 데이터 기반\n * tabs 배열로 탭 생성\n */\ninterface SimpleTabItem {\n label: string;\n content: string;\n value?: string;\n}\n\nconst SDUITabs: React.FC<{\n tabs?: SimpleTabItem[];\n defaultValue?: string;\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\";\n className?: string;\n}> = ({\n tabs = [],\n defaultValue,\n variant = \"default\",\n className = \"\",\n}) => {\n const firstValue = tabs[0]?.value || \"tab-0\";\n\n return (\n <Tabs\n defaultValue={defaultValue || firstValue}\n variant={variant}\n className={className}\n >\n <TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsTrigger key={value} value={value}>\n {tab.label}\n </TabsTrigger>\n );\n })}\n </TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsContent key={value} value={value}>\n {tab.content}\n </TabsContent>\n );\n })}\n </Tabs>\n );\n};\n\n/**\n * 기본 컴포넌트 레지스트리\n */\nexport const defaultRegistry: SDUIComponentRegistry = {\n // 레이아웃\n Box,\n Spacer,\n Flex,\n Grid,\n Section,\n Container,\n Divider,\n\n // 타이포그래피\n Text,\n H1,\n H2,\n H3,\n H4,\n Link,\n\n // 미디어\n Image,\n Icon: SDUIIcon,\n\n // 기본 UI\n Button,\n Badge,\n Avatar,\n AvatarImage,\n AvatarFallback,\n Input: SDUIInput,\n Textarea: SDUITextarea,\n Label,\n Checkbox: SDUICheckbox,\n Switch: SDUISwitch,\n Skeleton,\n Progress,\n\n // 카드\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n\n // 피드백\n Alert,\n\n // Advanced (Pro)\n Header,\n HeroSection,\n ScrollProgress,\n\n // Interactive (Pro)\n Accordion: SDUIAccordion,\n Tabs: SDUITabs,\n};\n\n/**\n * 레지스트리 확장 헬퍼\n */\nexport function extendRegistry(\n customComponents: SDUIComponentRegistry\n): SDUIComponentRegistry {\n return {\n ...defaultRegistry,\n ...customComponents,\n };\n}\n\n/**\n * 컴포넌트 존재 여부 확인\n */\nexport function hasComponent(registry: SDUIComponentRegistry, type: string): boolean {\n return type in registry;\n}\n","\"use client\";\n\n/**\n * SDUI Renderer\n *\n * JSON 스키마를 받아서 실제 React 컴포넌트로 렌더링\n */\n\nimport React, { createContext, useContext, useState, useCallback, useMemo } from \"react\";\nimport type {\n SDUINode,\n SDUIPageSchema,\n SDUIRendererProps,\n SDUIContext,\n SDUIAction,\n SDUICondition,\n SDUIComponentRegistry,\n} from \"./types\";\nimport { defaultRegistry } from \"./registry\";\n\n// SDUI Context\nconst SDUIContextInternal = createContext<SDUIContext | null>(null);\n\n/**\n * SDUI Context Hook\n */\nexport function useSDUI(): SDUIContext {\n const context = useContext(SDUIContextInternal);\n if (!context) {\n throw new Error(\"useSDUI must be used within SDUIRenderer\");\n }\n return context;\n}\n\n/**\n * 데이터 경로로 값 가져오기\n * 예: \"user.profile.name\" → data.user.profile.name\n */\nfunction getByPath(obj: Record<string, unknown>, path: string): unknown {\n return path.split(\".\").reduce((acc: unknown, key) => {\n if (acc && typeof acc === \"object\" && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * 데이터 경로로 값 설정하기\n */\nfunction setByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): Record<string, unknown> {\n const keys = path.split(\".\");\n const result = { ...obj };\n let current: Record<string, unknown> = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n current[key] = { ...(current[key] as Record<string, unknown> || {}) };\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result;\n}\n\n/**\n * 조건 평가\n */\nfunction evaluateCondition(\n condition: SDUICondition,\n data: Record<string, unknown>\n): boolean {\n const value = getByPath(data, condition.path);\n\n switch (condition.operator) {\n case \"eq\":\n return value === condition.value;\n case \"neq\":\n return value !== condition.value;\n case \"gt\":\n return typeof value === \"number\" && value > (condition.value as number);\n case \"lt\":\n return typeof value === \"number\" && value < (condition.value as number);\n case \"gte\":\n return typeof value === \"number\" && value >= (condition.value as number);\n case \"lte\":\n return typeof value === \"number\" && value <= (condition.value as number);\n case \"exists\":\n return value !== undefined && value !== null;\n case \"notExists\":\n return value === undefined || value === null;\n default:\n return true;\n }\n}\n\n/**\n * Props에서 데이터 바인딩 처리\n * {{ path }} 형식을 실제 데이터로 치환\n */\nfunction resolveProps(\n props: Record<string, unknown>,\n data: Record<string, unknown>\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === \"string\") {\n // {{ path }} 패턴 처리\n const bindingMatch = value.match(/^\\{\\{\\s*(.+?)\\s*\\}\\}$/);\n if (bindingMatch) {\n resolved[key] = getByPath(data, bindingMatch[1]);\n } else {\n // 문자열 내 부분 바인딩: \"Hello, {{ user.name }}!\"\n resolved[key] = value.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n }\n } else if (Array.isArray(value)) {\n resolved[key] = value.map((item) =>\n typeof item === \"object\" && item !== null\n ? resolveProps(item as Record<string, unknown>, data)\n : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n resolved[key] = resolveProps(value as Record<string, unknown>, data);\n } else {\n resolved[key] = value;\n }\n }\n\n return resolved;\n}\n\n/**\n * 단일 노드 렌더러\n */\ninterface NodeRendererProps {\n node: SDUINode;\n registry: SDUIComponentRegistry;\n}\n\nfunction NodeRenderer({ node, registry }: NodeRendererProps) {\n const { data, handleAction } = useSDUI();\n\n // 조건부 렌더링 체크\n if (node.when && !evaluateCondition(node.when, data)) {\n return null;\n }\n\n // 컴포넌트 찾기\n const Component = registry[node.type];\n if (!Component) {\n console.warn(`[SDUI] Unknown component type: ${node.type}`);\n return (\n <div className=\"p-4 border border-destructive/50 bg-destructive/10 rounded text-sm text-destructive\">\n Unknown component: {node.type}\n </div>\n );\n }\n\n // Props 처리\n const resolvedProps = node.props ? resolveProps(node.props, data) : {};\n\n // 이벤트 핸들러 처리\n const eventProps: Record<string, unknown> = {};\n if (node.on) {\n if (node.on.click) {\n eventProps.onClick = () => handleAction(node.on!.click!);\n }\n if (node.on.submit) {\n eventProps.onSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n handleAction(node.on!.submit!);\n };\n }\n }\n\n // Children 처리\n let children: React.ReactNode = null;\n if (node.children) {\n if (typeof node.children === \"string\") {\n // 문자열 바인딩 처리\n children = node.children.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n } else if (Array.isArray(node.children)) {\n children = node.children.map((child, index) => (\n <NodeRenderer\n key={child.key || `child-${index}`}\n node={child}\n registry={registry}\n />\n ));\n }\n }\n\n // void 엘리먼트는 children을 받지 않음\n const voidElements = ['Divider', 'Input', 'Textarea', 'Checkbox', 'Switch', 'Progress', 'Skeleton', 'Image', 'ScrollProgress'];\n const isVoidElement = voidElements.includes(node.type);\n\n if (isVoidElement || children === null) {\n return <Component {...resolvedProps} {...eventProps} />;\n }\n\n return (\n <Component {...resolvedProps} {...eventProps}>\n {children}\n </Component>\n );\n}\n\n/**\n * SDUI Renderer 메인 컴포넌트\n */\nexport function SDUIRenderer({\n schema,\n components,\n data: initialData = {},\n onAction,\n onNavigate,\n}: SDUIRendererProps) {\n // 페이지 스키마인지 노드인지 확인\n const isPageSchema = \"root\" in schema;\n const rootNode = isPageSchema ? (schema as SDUIPageSchema).root : (schema as SDUINode);\n const schemaData = isPageSchema ? (schema as SDUIPageSchema).data : {};\n\n // 데이터 상태\n const [data, setDataState] = useState<Record<string, unknown>>({\n ...schemaData,\n ...initialData,\n });\n\n // 레지스트리 병합\n const registry = useMemo(\n () => ({ ...defaultRegistry, ...components }),\n [components]\n );\n\n // 데이터 업데이트\n const setData = useCallback((path: string, value: unknown) => {\n setDataState((prev) => setByPath(prev, path, value));\n }, []);\n\n // 네비게이션\n const navigate = useCallback(\n (path: string) => {\n if (onNavigate) {\n onNavigate(path);\n } else if (typeof window !== \"undefined\") {\n window.location.href = path;\n }\n },\n [onNavigate]\n );\n\n // 액션 핸들러\n const handleAction = useCallback(\n (action: SDUIAction) => {\n switch (action.type) {\n case \"navigate\":\n navigate(action.payload?.path as string);\n break;\n case \"setState\":\n if (action.payload?.path && action.payload?.value !== undefined) {\n setData(action.payload.path as string, action.payload.value);\n }\n break;\n case \"api\":\n // API 호출은 외부에서 처리\n onAction?.(action);\n break;\n case \"custom\":\n onAction?.(action);\n break;\n default:\n onAction?.(action);\n }\n },\n [navigate, setData, onAction]\n );\n\n // Context 값\n const contextValue: SDUIContext = useMemo(\n () => ({\n data,\n setData,\n handleAction,\n navigate,\n }),\n [data, setData, handleAction, navigate]\n );\n\n return (\n <SDUIContextInternal.Provider value={contextValue}>\n <NodeRenderer node={rootNode} registry={registry} />\n </SDUIContextInternal.Provider>\n );\n}\n\n/**\n * JSON 문자열에서 렌더링 (편의용)\n */\nexport function SDUIFromJSON({\n json,\n ...props\n}: Omit<SDUIRendererProps, \"schema\"> & { json: string }) {\n try {\n const schema = JSON.parse(json);\n return <SDUIRenderer schema={schema} {...props} />;\n } catch (error) {\n return (\n <div className=\"p-4 border border-destructive bg-destructive/10 rounded\">\n <p className=\"font-semibold text-destructive\">SDUI Parse Error</p>\n <pre className=\"text-sm mt-2 text-destructive/80\">\n {(error as Error).message}\n </pre>\n </div>\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/Button.variants.ts","../src/lib/Slot.tsx","../src/components/Button.tsx","../src/components/Card.tsx","../src/components/Badge.tsx","../src/components/Avatar.tsx","../src/components/Container.tsx","../src/lib/styles/cva-base.ts","../src/components/Input.tsx","../src/components/Textarea.tsx","../src/components/Label.tsx","../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/Checkbox.tsx","../src/components/Switch.tsx","../src/components/Skeleton.tsx","../src/components/Progress.tsx","../src/components/Alert.tsx","../src/components/HeroSection.tsx","../src/components/ScrollProgress.tsx","../src/components/Accordion.tsx","../src/components/Tabs.tsx","../src/sdui/registry.tsx","../src/sdui/SDUIRenderer.tsx"],"names":["merge","inputs","twMerge","clsx","mergeMap","classMap","classes","condition","className","cn","springTransition","buttonVariants","cva","gradientPresets","composeRefs","refs","node","ref","composeEventHandlers","parentHandler","childHandler","event","mergeClassName","slotClassName","childClassName","mergeStyle","slotStyle","childStyle","mergeProps","slotProps","childProps","mergedProps","propName","slotValue","childValue","isSlottable","child","React","Slot","children","forwardedRef","childArray","childRef","mergedRef","isBrowser","useReducedMotion","reduce","setReduce","_a","mq","onChange","ButtonInner","variant","size","loading","icon","iconPosition","gradient","customGradient","rounded","shadow","hover","fullWidth","iconOnly","disabled","asChild","rest","reduced","gradientClass","base","content","jsxs","Fragment","jsx","onClick","target","rel","href","_ariaLabel","anchorClassName","anchorProps","isDisabled","handleAnchorClick","e","buttonClassName","btnProps","Button","cardVariants","Card","padding","hoverable","props","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","badgeVariants","Badge","avatarVariants","Avatar","src","alt","fallbackText","imgError","setImgError","useState","getFallbackContent","showImage","AvatarImage","AvatarFallback","containerVariants","Container","centered","fluid","FORM_STATE","inputVariants","Input","type","error","success","ariaInvalid","isInvalid","textareaVariants","Textarea","resize","labelVariants","Label","required","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","name","emotion","status","weight","animated","pulse","spin","bounce","ariaLabel","ariaHidden","_b","config","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","iconsaxVariant","isClient","setIsClient","providerReady","setProviderReady","resolvedIcon","baseName","normalized","providerName","iconsaxIcon","variantClasses","ResolvedIcon","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon","Checkbox","label","description","id","generatedId","checkboxId","labelId","descriptionId","sizeClasses","iconSizes","stateClasses","isControlled","isChecked","needsReadOnly","Switch","switchId","thumbSizes","thumbTranslate","skeletonVariants","Skeleton","width","height","animation","getAnimationStyle","SkeletonText","SkeletonCircle","SkeletonRectangle","SkeletonRounded","SkeletonCard","SkeletonAvatar","SkeletonImage","SkeletonUserProfile","SkeletonList","_","SkeletonTable","progressBarVariants","progressTrackVariants","Progress","value","max","showValue","striped","percentage","ProgressSuccess","ProgressWarning","ProgressError","ProgressInfo","ProgressWrapper","title","ProgressGroup","Alert","action","closable","onClose","getVariantClasses","getIconClasses","getDefaultIcon","AlertSuccess","AlertWarning","AlertError","AlertInfo","HeroSection","subtitle","primaryAction","secondaryAction","slides","autoPlay","interval","indicator","showControls","pauseOnHover","background","customBackground","fullBleed","currentSlide","setCurrentSlide","isPaused","setIsPaused","isSlideMode","slideCount","nextSlide","useCallback","prev","prevSlide","goToSlide","useEffect","timer","currentContent","titleSizeClasses","subtitleSizeClasses","descriptionSizeClasses","currentBg","backgroundContent","renderIndicator","line","i","arr","ScrollProgress","color","position","_animated","showPercentage","progress","setProgress","updateProgress","scrollTop","docHeight","currentProgress","progressColors","Accordion","defaultValue","onValueChange","collapsible","openItems","setOpenItems","handleItemToggle","itemValue","newOpenItems","item","itemValues","values","handleKeyDown","currentValue","currentIndex","newIndex","triggerElement","AccordionItem","onToggle","isOpen","AccordionTrigger","defaultIcon","contentId","triggerId","AccordionContent","dataValue","setHeight","contentRef","TabsContent","active","Tabs","orientation","activeTab","setActiveTab","handleTabChange","newValue","TabsList","listRef","tabValues","getSizeClasses","TabsTrigger","_orientation","handleClick","TabsPills","TabsUnderline","TabsCards","Box","justify","align","style","backgroundColor","margin","borderRadius","border","customStyle","justifyMap","alignMap","Spacer","Flex","direction","gap","Grid","cols","textAlignMap","getTypographyStyle","Text","fontSize","lineHeight","fontWeight","letterSpacing","typoStyle","mergedStyle","H1","H2","H3","H4","isExternal","SDUIIcon","Section","Divider","Header","sticky","transparent","blur","overlay","SDUICheckbox","defaultChecked","checked","setChecked","SDUISwitch","SDUIInput","setValue","SDUITextarea","SDUIAccordion","items","SDUITabs","tabs","firstValue","tab","defaultRegistry","extendRegistry","customComponents","hasComponent","registry","SDUIContextInternal","useSDUI","context","getByPath","obj","path","acc","key","setByPath","keys","result","current","evaluateCondition","data","resolveProps","resolved","bindingMatch","val","NodeRenderer","handleAction","Component","resolvedProps","eventProps","SDUIRenderer","schema","components","initialData","onAction","onNavigate","isPageSchema","rootNode","schemaData","setDataState","useMemo","setData","navigate","_c","contextValue","SDUIFromJSON","json"],"mappings":"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","file":"sdui.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 ","import { cva } from 'class-variance-authority'\n\n/**\n * HUA Spring Easing transition — 시그니처 \"쫀득한\" 느낌\n * cubic-bezier(0.34, 1.56, 0.64, 1)\n */\nconst springTransition =\n '[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]'\n\nexport const buttonVariants = cva(\n // ── base ──\n 'inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-200 disabled:pointer-events-none disabled:opacity-50 min-w-fit focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--color-background)]',\n {\n variants: {\n /** 스타일 변형 */\n variant: {\n default:\n 'bg-[var(--color-primary)] text-[var(--color-primary-foreground)] hover:opacity-90',\n destructive:\n 'bg-[var(--color-destructive)] text-[var(--color-destructive-foreground)] hover:opacity-90 focus-visible:ring-[var(--color-destructive)]',\n outline:\n 'border-2 border-[var(--color-border)] bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\n secondary:\n 'bg-[var(--color-secondary)] text-[var(--color-secondary-foreground)] hover:opacity-80',\n ghost:\n 'bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\n link:\n 'bg-transparent text-[var(--color-primary)] underline hover:opacity-80 focus-visible:ring-offset-0',\n gradient:\n 'bg-gradient-to-r from-[var(--btn-gradient-from,theme(colors.teal.500))] to-[var(--btn-gradient-to,theme(colors.cyan.500))] text-white hover:shadow-lg',\n neon:\n 'bg-slate-900 dark:bg-slate-950 text-teal-400 border border-teal-500/50 shadow-lg shadow-[var(--btn-neon-glow,theme(colors.teal.500/20%))] hover:shadow-[var(--btn-neon-glow,theme(colors.teal.500/40%))] hover:border-teal-400',\n glass:\n 'bg-white/50 dark:bg-slate-900/50 backdrop-blur-md border border-slate-200/50 dark:border-slate-700/50 text-slate-900 dark:text-slate-100 hover:bg-white/70 dark:hover:bg-slate-900/70',\n },\n /** 크기 */\n size: {\n sm: 'h-8 px-4 py-2 text-sm',\n md: 'h-10 px-6 py-2 text-base',\n lg: 'h-12 px-8 py-3 text-lg',\n xl: 'h-14 px-10 py-4 text-xl',\n icon: 'h-10 w-10 p-0',\n },\n /** 모서리 둥글기 */\n rounded: {\n sm: 'rounded',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'rounded-full',\n },\n /** 그림자 */\n shadow: {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg',\n xl: 'shadow-xl',\n },\n /** 호버 효과 — springy가 HUA-UI 시그니처 */\n hover: {\n springy: `hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${springTransition} transform-gpu`,\n scale:\n 'hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu',\n glow: 'hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200',\n slide: `hover:-translate-y-0.5 hover:shadow-md ${springTransition} transform-gpu`,\n none: '',\n },\n /** 전체 너비 */\n fullWidth: {\n true: 'w-full',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n rounded: 'md',\n shadow: 'md',\n hover: 'springy',\n fullWidth: false,\n },\n }\n)\n\n/** Gradient 프리셋 */\nexport const gradientPresets: Record<string, string> = {\n blue: 'from-teal-500 to-cyan-500',\n purple: 'from-purple-500 to-pink-500',\n green: 'from-green-500 to-emerald-500 dark:from-green-400 dark:to-emerald-400',\n orange: 'from-orange-500 to-red-500 dark:from-orange-300 dark:to-red-300',\n pink: 'from-pink-500 to-rose-500',\n}\n\nexport type { VariantProps } from 'class-variance-authority'\n","\"use client\";\n\nimport React from \"react\";\nimport { clsx } from \"clsx\";\n\n/**\n * Slot 컴포넌트\n *\n * Radix UI의 asChild 패턴을 구현합니다.\n * 자식 요소의 props와 ref를 병합하여 하나의 요소로 렌더링합니다.\n *\n * @example\n * // Button에서 asChild 사용\n * <Button asChild>\n * <Link href=\"/home\">홈으로</Link>\n * </Button>\n *\n * @see https://www.radix-ui.com/primitives/docs/utilities/slot\n */\n\ntype SlotProps = React.HTMLAttributes<HTMLElement> & {\n children?: React.ReactNode;\n};\n\n/**\n * 여러 ref를 하나로 합칩니다\n */\nfunction composeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): React.RefCallback<T> {\n return (node) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref != null) {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n };\n}\n\n/**\n * 이벤트 핸들러를 합성합니다\n * \n * 부모(slot) 핸들러를 먼저 실행하고, 그 다음 자식 핸들러를 실행합니다.\n * defaultPrevented가 true이면 자식 핸들러는 실행하지 않습니다.\n */\nfunction composeEventHandlers<E>(\n parentHandler?: (event: E) => void,\n childHandler?: (event: E) => void\n): (event: E) => void {\n return (event) => {\n parentHandler?.(event);\n if (!(event as unknown as { defaultPrevented: boolean }).defaultPrevented) {\n childHandler?.(event);\n }\n };\n}\n\n/**\n * className을 병합합니다\n */\nfunction mergeClassName(\n slotClassName?: string,\n childClassName?: string\n): string | undefined {\n if (!slotClassName && !childClassName) return undefined;\n return clsx(slotClassName, childClassName);\n}\n\n/**\n * style을 병합합니다\n */\nfunction mergeStyle(\n slotStyle?: React.CSSProperties,\n childStyle?: React.CSSProperties\n): React.CSSProperties | undefined {\n if (!slotStyle && !childStyle) return undefined;\n return { ...slotStyle, ...childStyle };\n}\n\n/**\n * props를 병합합니다 (이벤트 핸들러, className, style 등)\n */\nfunction mergeProps(\n slotProps: Record<string, unknown>,\n childProps: Record<string, unknown>\n): Record<string, unknown> {\n const mergedProps: Record<string, unknown> = { ...slotProps };\n\n for (const propName in childProps) {\n const slotValue = slotProps[propName];\n const childValue = childProps[propName];\n\n // 이벤트 핸들러 병합 (부모(slot) → 자식 순서)\n if (/^on[A-Z]/.test(propName)) {\n if (slotValue && childValue) {\n mergedProps[propName] = composeEventHandlers(\n slotValue as (event: unknown) => void,\n childValue as (event: unknown) => void\n );\n } else {\n mergedProps[propName] = childValue || slotValue;\n }\n }\n // className 병합\n else if (propName === \"className\") {\n mergedProps[propName] = mergeClassName(\n slotValue as string | undefined,\n childValue as string | undefined\n );\n }\n // style 병합\n else if (propName === \"style\") {\n mergedProps[propName] = mergeStyle(\n slotValue as React.CSSProperties | undefined,\n childValue as React.CSSProperties | undefined\n );\n }\n // 그 외: 자식 값 우선\n else {\n mergedProps[propName] = childValue !== undefined ? childValue : slotValue;\n }\n }\n\n return mergedProps;\n}\n\n/**\n * 유효한 단일 React 요소인지 확인\n */\nfunction isSlottable(child: React.ReactNode): child is React.ReactElement {\n return React.isValidElement(child);\n}\n\n/**\n * Slot 컴포넌트\n *\n * 자식 요소에 부모의 props를 주입합니다.\n * asChild 패턴을 구현할 때 사용합니다.\n */\nconst Slot = React.forwardRef<HTMLElement, SlotProps>(\n ({ children, ...slotProps }, forwardedRef) => {\n const childArray = React.Children.toArray(children);\n\n // 유효한 단일 자식이 있는지 확인\n if (childArray.length !== 1) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Slot] asChild는 정확히 하나의 자식 요소가 필요합니다.\"\n );\n }\n return null;\n }\n\n const child = childArray[0];\n\n if (!isSlottable(child)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[Slot] 자식은 유효한 React 요소여야 합니다.\");\n }\n return null;\n }\n\n // 자식 요소의 props와 ref 추출\n const childProps = child.props as Record<string, unknown>;\n const childRef = (child as unknown as { ref?: React.Ref<HTMLElement> }).ref;\n\n // props와 ref 병합\n const mergedProps = mergeProps(slotProps, childProps);\n const mergedRef = composeRefs(forwardedRef, childRef);\n\n return React.cloneElement(child, {\n ...mergedProps,\n ref: mergedRef,\n } as React.Attributes);\n }\n);\n\nSlot.displayName = \"Slot\";\n\nexport { Slot, composeRefs, mergeProps };\nexport type { SlotProps };\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { buttonVariants, gradientPresets } from \"./Button.variants\";\nimport { Slot } from \"../lib/Slot\";\n\n/**\n * 버튼 스타일 변형 / Button style variant\n */\ntype Variant =\n | \"default\" | \"destructive\" | \"outline\" | \"secondary\"\n | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\";\n\n/**\n * 버튼 크기 / Button size\n */\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\";\n\n/**\n * 버튼 모서리 둥글기 / Button border radius\n */\ntype Rounded = \"sm\" | \"md\" | \"lg\" | \"full\";\n\n/**\n * 버튼 그림자 / Button shadow\n */\ntype Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * 버튼 호버 효과 / Button hover effect\n * \"springy\"가 HUA-UI 시그니처 - 공 튕기듯 미세한 반동\n */\ntype Hover = \"springy\" | \"scale\" | \"glow\" | \"slide\" | \"none\";\n\n/**\n * 그라디언트 색상 이름 / Gradient color name\n */\ntype GradientName = \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\";\n\n/**\n * Button 컴포넌트의 공통 props / Common props for Button component\n */\ntype CommonProps = {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n icon?: React.ReactNode;\n iconPosition?: \"left\" | \"right\";\n gradient?: GradientName;\n customGradient?: string;\n rounded?: Rounded;\n shadow?: Shadow;\n hover?: Hover;\n fullWidth?: boolean;\n iconOnly?: boolean;\n \"aria-label\"?: string;\n className?: string;\n disabled?: boolean;\n asChild?: boolean;\n};\n\ntype AnchorProps = CommonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"className\"> & {\n href: string;\n };\n\ntype NativeButtonProps = CommonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"className\" | \"type\"> & {\n href?: undefined;\n };\n\n/**\n * Button 컴포넌트의 props 타입 / Button component props type\n * href가 제공되면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n */\nexport type ButtonProps = AnchorProps | NativeButtonProps;\n\ntype AnchorOrButton = HTMLAnchorElement | HTMLButtonElement;\n\nconst isBrowser = typeof window !== \"undefined\";\nfunction useReducedMotion() {\n const [reduce, setReduce] = React.useState(false);\n React.useEffect(() => {\n if (!isBrowser || !(\"matchMedia\" in window)) return;\n const mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const onChange = () => setReduce(!!mq.matches);\n onChange();\n mq.addEventListener?.(\"change\", onChange);\n return () => mq.removeEventListener?.(\"change\", onChange);\n }, []);\n return reduce;\n}\n\n/**\n * Button 컴포넌트 / Button component\n *\n * 다양한 스타일과 크기를 지원하는 범용 버튼 컴포넌트입니다.\n * href prop을 제공하면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n *\n * @example\n * <Button onClick={() => console.log('클릭')}>클릭하세요</Button>\n * <Button variant=\"destructive\" size=\"lg\">삭제</Button>\n * <Button variant=\"gradient\" gradient=\"purple\">그라디언트</Button>\n * <Button href=\"/about\" variant=\"link\">자세히 보기</Button>\n */\nconst ButtonInner = React.forwardRef<AnchorOrButton, ButtonProps>(function ButtonInner(\n {\n variant = \"default\",\n size = \"md\",\n loading = false,\n icon,\n iconPosition = \"left\",\n gradient = \"blue\",\n customGradient,\n rounded = \"md\",\n shadow = \"md\",\n hover = \"springy\",\n fullWidth,\n iconOnly,\n className,\n children,\n disabled,\n asChild = false,\n ...rest\n },\n ref\n) {\n const reduced = useReducedMotion();\n\n // gradient variant: 커스텀 그라디언트 클래스 처리\n const gradientClass =\n variant === \"gradient\"\n ? customGradient\n ? `bg-gradient-to-r ${customGradient}`\n : `bg-gradient-to-r ${gradientPresets[gradient] || gradientPresets.blue}`\n : undefined;\n\n const base = merge(\n buttonVariants({\n variant,\n size,\n rounded,\n shadow,\n hover: reduced ? \"none\" : hover,\n fullWidth: fullWidth ?? false,\n }),\n gradientClass,\n className\n );\n\n const Spinner = (\n <span role=\"status\" aria-live=\"polite\" className=\"-ml-1 mr-2 inline-flex\">\n <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n <span className=\"sr-only\">로딩 중</span>\n </span>\n );\n\n const content = (\n <>\n {loading && Spinner}\n {!loading && icon && iconPosition === \"left\" && <span className=\"mr-2\">{icon}</span>}\n {children}\n {!loading && icon && iconPosition === \"right\" && <span className=\"ml-2\">{icon}</span>}\n </>\n );\n\n if (iconOnly && !(\"aria-label\" in rest) && process.env.NODE_ENV !== \"production\") {\n console.warn(\"[Button] iconOnly 사용 시 aria-label을 제공하세요.\");\n }\n\n // asChild 모드: Slot을 사용하여 자식 요소에 props 병합\n if (asChild) {\n const slotProps = {\n className: base,\n ref,\n disabled: disabled || loading,\n \"aria-busy\": loading || undefined,\n \"aria-disabled\": (disabled || loading) || undefined,\n ...rest,\n };\n return <Slot {...slotProps}>{children}</Slot>;\n }\n\n // 앵커 모드\n if (\"href\" in rest && rest.href) {\n const { onClick, target, rel, href, \"aria-label\": _ariaLabel, className: anchorClassName, ...anchorProps } = rest as AnchorProps;\n const isDisabled = !!disabled || loading;\n\n const handleAnchorClick: React.MouseEventHandler<HTMLAnchorElement> = (e) => {\n if (isDisabled) { e.preventDefault(); e.stopPropagation(); return; }\n onClick?.(e);\n };\n\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={merge(base, anchorClassName)}\n onClick={handleAnchorClick}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled ? -1 : anchorProps.tabIndex}\n target={target}\n rel={target === \"_blank\" ? rel ?? \"noopener noreferrer\" : rel}\n {...anchorProps}\n >\n {content}\n </a>\n );\n }\n\n // 버튼 모드\n const { className: buttonClassName, ...btnProps } = rest as NativeButtonProps;\n const isDisabled = !!disabled || loading;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n className={merge(base, buttonClassName)}\n type=\"button\"\n disabled={isDisabled}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n {...btnProps}\n >\n {content}\n </button>\n );\n});\n\nButtonInner.displayName = \"Button\";\n\nexport const Button = ButtonInner;\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const cardVariants = cva(\n \"rounded-lg\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground border border-border\",\n outline: \"bg-transparent border-2 border-border\",\n elevated: \"bg-card text-card-foreground shadow-lg border border-border\",\n },\n shadow: {\n none: \"shadow-none\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n },\n padding: {\n none: \"\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n padding: \"none\",\n },\n }\n)\n\n/**\n * Card 컴포넌트의 props / Card component props\n */\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"outline\" | \"elevated\"\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\"\n hoverable?: boolean\n}\n\n/**\n * Card 컴포넌트 / Card component\n *\n * 콘텐츠를 카드 형태로 표시하는 컴포넌트입니다.\n *\n * @example\n * <Card>\n * <CardHeader><CardTitle>제목</CardTitle></CardHeader>\n * <CardContent><p>내용</p></CardContent>\n * </Card>\n */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant = \"default\", shadow, padding = \"none\", hoverable, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n cardVariants({ variant, shadow, padding }),\n hoverable && \"transition-shadow hover:shadow-lg cursor-pointer\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nCard.displayName = \"Card\"\n\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex flex-col space-y-1 p-3\", className)}\n {...props}\n />\n )\n)\n\nCardHeader.displayName = \"CardHeader\"\n\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, CardTitleProps>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={merge(\n \"text-base md:text-lg font-semibold leading-tight tracking-tight\",\n className\n )}\n {...props}\n />\n )\n)\n\nCardTitle.displayName = \"CardTitle\"\n\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={merge(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\n\nCardDescription.displayName = \"CardDescription\"\n\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={merge(\"px-3 pb-3\", className)} {...props} />\n )\n)\n\nCardContent.displayName = \"CardContent\"\n\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center px-3 pb-3\", className)}\n {...props}\n />\n )\n)\n\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80\",\n secondary: \"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80\",\n destructive: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n error: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n outline: \"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]\",\n glass: \"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n *\n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge }\n","\"use client\"\n\nimport React, { useState } from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const avatarVariants = cva(\n \"relative flex shrink-0 overflow-hidden rounded-full\",\n {\n variants: {\n size: {\n sm: \"w-8 h-8 text-xs\",\n md: \"w-10 h-10 text-sm\",\n lg: \"w-12 h-12 text-base\",\n },\n variant: {\n default: \"\",\n glass: \"ring-1 ring-white/30 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\n/**\n * Avatar 컴포넌트의 props / Avatar component props\n */\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"glass\"\n src?: string\n alt?: string\n fallbackText?: string\n}\n\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {}\nexport interface AvatarFallbackProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Avatar 컴포넌트 / Avatar component\n *\n * 사용자 프로필 이미지를 표시하는 컴포넌트입니다.\n *\n * @example\n * <Avatar src=\"/user.jpg\" alt=\"사용자\" />\n * <Avatar alt=\"홍길동\">홍</Avatar>\n * <Avatar variant=\"glass\" size=\"lg\" src=\"/user.jpg\" alt=\"사용자\" />\n */\nconst Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ className, size = \"md\", variant = \"default\", src, alt, fallbackText, children, ...props }, ref) => {\n const [imgError, setImgError] = useState(false)\n\n const getFallbackContent = () => {\n if (fallbackText) return fallbackText\n if (children) return children\n if (alt) return alt.charAt(0).toUpperCase()\n return \"U\"\n }\n\n const showImage = src && !imgError\n\n return (\n <div\n ref={ref}\n className={merge(avatarVariants({ size, variant }), className)}\n {...props}\n >\n {showImage ? (\n <AvatarImage\n src={src}\n alt={alt || \"avatar\"}\n onError={() => setImgError(true)}\n />\n ) : (\n <AvatarFallback>\n {getFallbackContent()}\n </AvatarFallback>\n )}\n </div>\n )\n }\n)\nAvatar.displayName = \"Avatar\"\n\nconst AvatarImage = React.forwardRef<HTMLImageElement, AvatarImageProps>(\n ({ className, ...props }, ref) => (\n <img\n ref={ref}\n className={merge(\"aspect-square h-full w-full object-cover object-center\", className)}\n {...props}\n />\n )\n)\nAvatarImage.displayName = \"AvatarImage\"\n\nconst AvatarFallback = React.forwardRef<HTMLDivElement, AvatarFallbackProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\n \"flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-semibold\",\n className\n )}\n {...props}\n />\n )\n)\nAvatarFallback.displayName = \"AvatarFallback\"\n\nexport { Avatar, AvatarImage, AvatarFallback } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const containerVariants = cva(\n \"w-full\",\n {\n variants: {\n size: {\n sm: \"max-w-2xl\",\n md: \"max-w-4xl\",\n lg: \"max-w-6xl\",\n xl: \"max-w-7xl\",\n full: \"max-w-full\",\n },\n padding: {\n none: \"\",\n sm: \"px-3 sm:px-4 py-6 sm:py-8\",\n md: \"px-4 sm:px-6 py-8 sm:py-12\",\n lg: \"px-4 sm:px-6 lg:px-8 py-10 sm:py-16\",\n xl: \"px-6 sm:px-8 lg:px-12 py-12 sm:py-20\",\n },\n },\n defaultVariants: {\n size: \"lg\",\n padding: \"md\",\n },\n }\n)\n\n/**\n * Container 컴포넌트의 props\n */\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n centered?: boolean\n fluid?: boolean\n}\n\n/**\n * Container 컴포넌트\n *\n * 콘텐츠를 감싸는 컨테이너 컴포넌트입니다.\n * 반응형 최대 너비와 패딩을 제공하여 일관된 레이아웃을 구성합니다.\n *\n * @example\n * <Container><h1>제목</h1></Container>\n * <Container size=\"sm\" padding=\"none\"><div>콘텐츠</div></Container>\n * <Container fluid padding=\"xl\"><div>전체 너비</div></Container>\n */\nconst Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n ({\n className,\n size = \"lg\",\n padding = \"md\",\n centered = true,\n fluid = false,\n ...props\n }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n containerVariants({ size: fluid ? undefined : size, padding }),\n fluid && \"max-w-full\",\n centered && \"mx-auto\",\n className\n )}\n {...props}\n />\n )\n }\n)\nContainer.displayName = \"Container\"\n\nexport { Container } ","/**\n * CVA 공통 상수 — 전 컴포넌트에서 재사용\n *\n * 모든 CVA variant 정의에서 import하여 사용합니다.\n * @example\n * import { SHARED_DISABLED, SHARED_FOCUS } from '../lib/styles/cva-base'\n */\n\n/** 비활성 상태 공통 스타일 */\nexport const SHARED_DISABLED =\n 'disabled:pointer-events-none disabled:opacity-50' as const\n\n/** 포커스 링 공통 스타일 */\nexport const SHARED_FOCUS =\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2' as const\n\n/** 트랜지션 공통 스타일 */\nexport const SHARED_TRANSITION =\n 'transition-colors duration-150' as const\n\n/** 글래스모피즘 공통 스타일 */\nexport const SHARED_GLASS =\n 'backdrop-blur-md border-white/20 bg-white/10 dark:bg-white/5' as const\n\n/**\n * 폼 상태 스타일 (error / success)\n * Input, Select, Textarea, Switch 등 전체 폼 컴포넌트에서 사용\n */\nexport const FORM_STATE = {\n error: 'border-destructive focus-visible:ring-destructive',\n success: 'border-green-500 focus-visible:ring-green-500',\n} as const\n\n/**\n * HUA 시그니처 스프링 이징\n * cubic-bezier(0.34, 1.56, 0.64, 1) — \"쫀득한\" 느낌\n */\nexport const HUA_SPRING_EASING =\n 'cubic-bezier(0.34, 1.56, 0.64, 1)' as const\n\n/** 마이크로 모션 기본 트랜지션 */\nexport const SHARED_MICRO_MOTION =\n 'transition-all duration-[180ms]' as const\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const inputVariants = cva(\n \"flex h-10 w-full rounded-md border px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200 hover:border-accent-foreground hover:shadow-sm\",\n {\n variants: {\n variant: {\n default: \"border-input bg-background\",\n outline: \"border-2 border-input bg-transparent\",\n filled: \"border-transparent bg-secondary/50\",\n glass: \"border-white/20 bg-white/10 text-white placeholder:text-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Input 컴포넌트의 props / Input component props\n */\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n error?: boolean\n success?: boolean\n}\n\n/**\n * Input 컴포넌트 / Input component\n *\n * 표준 HTML input 요소를 래핑한 스타일링된 입력 필드 컴포넌트입니다.\n *\n * @example\n * <Input type=\"text\" placeholder=\"이름을 입력하세요\" />\n * <Input type=\"email\" error placeholder=\"이메일\" />\n */\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, variant = \"default\", error, success, ...props }, ref) => {\n const ariaInvalid = props[\"aria-invalid\" as keyof typeof props] as boolean | undefined;\n const isInvalid = error || (ariaInvalid !== undefined ? ariaInvalid : false);\n\n return (\n <input\n type={type}\n className={merge(\n inputVariants({ variant }),\n isInvalid && FORM_STATE.error,\n success && FORM_STATE.success,\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const textareaVariants = cva(\n \"flex w-full rounded-md border transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-offset-2 hover:border-accent-foreground hover:shadow-sm disabled:cursor-not-allowed disabled:opacity-50 placeholder:text-muted-foreground\",\n {\n variants: {\n variant: {\n default: \"border-input bg-background text-foreground focus:border-ring focus:ring-ring\",\n outline: \"border-2 border-input bg-transparent text-foreground focus:border-ring focus:ring-ring\",\n filled: \"border-transparent bg-secondary/50 text-foreground focus:bg-background focus:border-ring focus:ring-ring\",\n ghost: \"border-transparent bg-transparent text-foreground focus:bg-muted focus:border-border focus:ring-muted-foreground\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white placeholder:text-white/60 focus:border-ring/50 focus:ring-ring/20 focus:bg-white/20\",\n },\n size: {\n sm: \"px-3 py-2 text-sm min-h-[80px]\",\n md: \"px-4 py-3 text-base min-h-[100px]\",\n lg: \"px-4 py-3 text-lg min-h-[120px]\",\n },\n resize: {\n none: \"resize-none\",\n vertical: \"resize-y\",\n horizontal: \"resize-x\",\n both: \"resize\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n resize: \"vertical\",\n },\n }\n)\n\n/**\n * Textarea 컴포넌트의 props / Textarea component props\n */\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n resize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\"\n}\n\n/**\n * Textarea 컴포넌트 / Textarea component\n * \n * 여러 줄 텍스트 입력을 위한 텍스트 영역 컴포넌트입니다.\n * 다양한 스타일 변형과 크기를 지원하며, 접근성 속성을 포함합니다.\n * \n * Text area component for multi-line text input.\n * Supports various style variants and sizes, includes accessibility attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Textarea placeholder=\"내용을 입력하세요\" />\n * \n * @example\n * // 에러 상태 / Error state\n * <Textarea \n * error\n * placeholder=\"에러가 발생했습니다\"\n * aria-label=\"설명 입력\"\n * />\n * \n * @example\n * // 크기 조절 비활성화 / Disable resize\n * <Textarea \n * resize=\"none\"\n * rows={5}\n * placeholder=\"고정 크기 텍스트 영역\"\n * />\n * \n * @param {TextareaProps} props - Textarea 컴포넌트의 props / Textarea component props\n * @param {React.Ref<HTMLTextAreaElement>} ref - textarea 요소 ref / textarea element ref\n * @returns {JSX.Element} Textarea 컴포넌트 / Textarea component\n * \n * @todo 접근성 개선: aria-invalid 속성 자동 추가 필요 / Accessibility improvement: auto-add aria-invalid attribute\n */\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n resize = \"vertical\",\n ...props \n }, ref) => {\n const ariaInvalid = props['aria-invalid' as keyof typeof props] as boolean | undefined\n const isInvalid = error || (ariaInvalid !== undefined ? ariaInvalid : false)\n\n return (\n <textarea\n className={merge(\n textareaVariants({ variant, size, resize }),\n error && FORM_STATE.error,\n success && FORM_STATE.success,\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n {\n variants: {\n variant: {\n default: \"text-foreground\",\n glass: \"text-white\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Label 컴포넌트의 props / Label component props\n */\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n required?: boolean\n error?: boolean\n disabled?: boolean\n variant?: \"default\" | \"glass\"\n}\n\n/**\n * Label 컴포넌트 / Label component\n *\n * 폼 필드의 레이블을 표시하는 컴포넌트입니다.\n *\n * @example\n * <Label htmlFor=\"email\">이메일</Label>\n * <Label required htmlFor=\"name\">이름</Label>\n * <Label error htmlFor=\"password\">비밀번호</Label>\n */\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({\n className,\n children,\n required = false,\n error = false,\n disabled = false,\n variant = \"default\",\n ...props\n }, ref) => {\n return (\n <label\n ref={ref}\n className={merge(\n labelVariants({ variant }),\n error && (variant === \"glass\" ? \"text-red-400\" : \"text-destructive\"),\n disabled && (variant === \"glass\" ? \"text-white/50\" : \"text-muted-foreground\"),\n className\n )}\n aria-required={required ? true : undefined}\n {...props}\n >\n {children}\n {required && (\n <span className={variant === \"glass\" ? \"text-red-400 ml-1\" : \"text-destructive ml-1\"} aria-label=\"필수 필드\">*</span>\n )}\n </label>\n )\n }\n)\nLabel.displayName = \"Label\"\n\nexport { Label } ","/**\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 * Checkbox 컴포넌트의 props / Checkbox component props\n * @typedef {Object} CheckboxProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Checkbox 스타일 변형 / Checkbox style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Checkbox 크기 / Checkbox size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 체크박스 레이블 텍스트 / Checkbox label text\n * @property {string} [description] - 체크박스 설명 텍스트 / Checkbox description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Checkbox 컴포넌트 / Checkbox component\n * \n * 체크박스 입력 필드를 제공하는 컴포넌트입니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Checkbox input field component.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Checkbox label=\"이용약관에 동의합니다\" />\n * \n * @example\n * // 에러 상태와 설명 / Error state with description\n * <Checkbox \n * label=\"필수 항목\"\n * description=\"이 항목은 필수입니다\"\n * error\n * />\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [checked, setChecked] = useState(false)\n * <Checkbox \n * checked={checked}\n * onChange={(e) => setChecked(e.target.checked)}\n * label=\"동의\"\n * />\n * \n * @param {CheckboxProps} props - Checkbox 컴포넌트의 props / Checkbox component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Checkbox 컴포넌트 / Checkbox component\n */\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const generatedId = React.useId()\n const checkboxId = id || generatedId\n const labelId = label ? `${checkboxId}-label` : undefined\n const descriptionId = description ? `${checkboxId}-description` : undefined\n const sizeClasses = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-6 h-6\"\n }\n\n const iconSizes = {\n sm: 12,\n md: 14,\n lg: 16\n }\n\n const variantClasses = {\n default: \"border-input bg-background text-primary focus:ring-ring\",\n outline: \"border-2 border-input bg-transparent text-primary focus:ring-ring\",\n filled: \"border-transparent bg-muted text-primary focus:bg-background focus:ring-ring\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:ring-ring/50 focus:bg-white/20\",\n }\n\n const stateClasses = error\n ? \"border-destructive focus:ring-destructive\"\n : success\n ? \"border-green-500 focus:ring-green-500\"\n : \"\"\n\n // Support both controlled and uncontrolled modes\n const isControlled = props.checked !== undefined;\n const isChecked = props.checked ?? props.defaultChecked ?? false;\n // Add readOnly if controlled without onChange to suppress React warning\n const needsReadOnly = isControlled && !props.onChange && !props.readOnly;\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id={checkboxId}\n className={merge(\n \"peer absolute inset-0 w-full h-full opacity-0 cursor-pointer z-10\",\n className\n )}\n ref={ref}\n aria-checked={isChecked}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"checkbox\"\n readOnly={needsReadOnly || props.readOnly}\n {...props}\n />\n <div\n className={merge(\n \"flex items-center justify-center rounded border transition-all duration-200 cursor-pointer relative\",\n \"peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-offset-2\",\n \"peer-hover:border-accent-foreground peer-hover:shadow-sm\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses,\n isChecked && \"bg-primary border-primary shadow-md shadow-primary/20\",\n !isChecked && \"bg-background\"\n )}\n >\n {/* 체크 아이콘으로 개선 */}\n <Icon \n name=\"check\" \n size={iconSizes[size]} \n className={merge(\n \"text-white transition-all duration-200\",\n isChecked ? \"opacity-100 scale-100\" : \"opacity-0 scale-0\"\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={checkboxId} id={labelId} className=\"text-sm font-medium text-foreground cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nCheckbox.displayName = \"Checkbox\"\n\nexport { Checkbox } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Switch 컴포넌트의 props / Switch component props\n * @typedef {Object} SwitchProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Switch 스타일 변형 / Switch style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Switch 크기 / Switch size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 스위치 레이블 텍스트 / Switch label text\n * @property {string} [description] - 스위치 설명 텍스트 / Switch description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface SwitchProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Switch 컴포넌트 / Switch component\n * \n * 토글 스위치 입력 필드를 제공하는 컴포넌트입니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Toggle switch input field component.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Switch label=\"알림 받기\" />\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [enabled, setEnabled] = useState(false)\n * <Switch \n * checked={enabled}\n * onChange={(e) => setEnabled(e.target.checked)}\n * label=\"다크 모드\"\n * />\n * \n * @example\n * // 에러 상태 / Error state\n * <Switch \n * label=\"필수 설정\"\n * description=\"이 설정을 활성화해야 합니다\"\n * error\n * />\n * \n * @param {SwitchProps} props - Switch 컴포넌트의 props / Switch component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Switch 컴포넌트 / Switch component\n */\nconst Switch = React.forwardRef<HTMLInputElement, SwitchProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const generatedId = React.useId()\n const switchId = id || generatedId\n const labelId = label ? `${switchId}-label` : undefined\n const descriptionId = description ? `${switchId}-description` : undefined\n // Track sizes - proper proportions for smooth toggle\n const sizeClasses = {\n sm: \"w-9 h-5\",\n md: \"w-11 h-6\",\n lg: \"w-14 h-8\"\n }\n\n // Thumb sizes - slightly smaller than track height for padding\n const thumbSizes = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-7 h-7\"\n }\n\n // Thumb position when checked - calculated for proper alignment\n const thumbTranslate = {\n sm: \"peer-checked:translate-x-4\",\n md: \"peer-checked:translate-x-5\",\n lg: \"peer-checked:translate-x-6\"\n }\n\n const variantClasses = {\n default: \"bg-muted peer-checked:bg-primary\",\n outline: \"bg-transparent border-2 border-input peer-checked:border-primary peer-checked:bg-primary\",\n filled: \"bg-secondary peer-checked:bg-primary\",\n glass: \"bg-white/20 backdrop-blur-sm border border-white/30 peer-checked:bg-primary/50 peer-checked:border-primary/30\",\n }\n\n const stateClasses = error\n ? \"bg-destructive/20 peer-checked:bg-destructive\"\n : success\n ? \"bg-green-200 peer-checked:bg-green-600 dark:bg-green-800 dark:peer-checked:bg-green-500\"\n : \"\"\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id={switchId}\n className={merge(\n \"peer sr-only\",\n className\n )}\n ref={ref}\n aria-checked={props.checked ?? false}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"switch\"\n {...props}\n />\n <div\n className={merge(\n \"relative inline-flex cursor-pointer items-center rounded-full transition-colors duration-200 ease-in-out\",\n \"peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-ring peer-focus:ring-offset-2\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses\n )}\n >\n <div\n className={merge(\n \"pointer-events-none absolute rounded-full bg-white shadow-md ring-0\",\n \"transition-all duration-200 ease-out\",\n \"top-1/2 -translate-y-1/2 left-0.5\",\n thumbSizes[size],\n thumbTranslate[size]\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={switchId} id={labelId} className=\"text-sm font-medium text-foreground cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nSwitch.displayName = \"Switch\"\n\nexport { Switch } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const skeletonVariants = cva(\n \"block\",\n {\n variants: {\n variant: {\n text: \"rounded w-full h-4\",\n circular: \"rounded-full w-10 h-10\",\n rounded: \"rounded-lg w-full h-[200px]\",\n rectangular: \"rounded-none w-full h-[200px]\",\n },\n animation: {\n pulse: \"animate-pulse bg-muted\",\n wave: \"bg-muted\",\n shimmer: \"bg-muted\",\n },\n },\n defaultVariants: {\n variant: \"text\",\n animation: \"pulse\",\n },\n }\n)\n\n/**\n * Skeleton 컴포넌트의 props\n */\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"text\" | \"circular\" | \"rectangular\" | \"rounded\"\n width?: string | number\n height?: string | number\n animation?: \"pulse\" | \"wave\" | \"shimmer\"\n className?: string\n}\n\n/**\n * Skeleton 컴포넌트 / Skeleton component\n *\n * 로딩 중 콘텐츠의 플레이스홀더를 표시하는 스켈레톤 컴포넌트입니다.\n *\n * @example\n * <Skeleton />\n * <Skeleton variant=\"circular\" width={40} height={40} />\n * <Skeleton variant=\"rounded\" width=\"100%\" height={200} animation=\"wave\" />\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({\n className,\n variant = \"text\",\n width,\n height,\n animation = \"pulse\",\n ...props\n }, ref) => {\n const getAnimationStyle = (): React.CSSProperties => {\n if (animation === \"wave\" || animation === \"shimmer\") {\n return {\n background: \"linear-gradient(90deg, hsl(var(--muted)) 0%, hsl(var(--muted-foreground) / 0.2) 50%, hsl(var(--muted)) 100%)\",\n backgroundSize: \"200% 100%\",\n animation: \"shimmer 1.5s ease-in-out infinite\",\n }\n }\n return {}\n }\n\n return (\n <>\n {(animation === \"wave\" || animation === \"shimmer\") && (\n <style>{`\n @keyframes shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n `}</style>\n )}\n <div\n ref={ref}\n className={merge(\n skeletonVariants({ variant, animation }),\n className\n )}\n style={{\n ...(width != null ? { width: typeof width === \"number\" ? `${width}px` : width } : {}),\n ...(height != null ? { height: typeof height === \"number\" ? `${height}px` : height } : {}),\n ...getAnimationStyle(),\n }}\n {...props}\n />\n </>\n )\n }\n)\nSkeleton.displayName = \"Skeleton\"\n\n// 편의 컴포넌트들\nexport const SkeletonText = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"text\" className={className} {...props} />\n )\n)\nSkeletonText.displayName = \"SkeletonText\"\n\nexport const SkeletonCircle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"circular\" className={className} {...props} />\n )\n)\nSkeletonCircle.displayName = \"SkeletonCircle\"\n\nexport const SkeletonRectangle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rectangular\" className={className} {...props} />\n )\n)\nSkeletonRectangle.displayName = \"SkeletonRectangle\"\n\nexport const SkeletonRounded = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rounded\" className={className} {...props} />\n )\n)\nSkeletonRounded.displayName = \"SkeletonRounded\"\n\n// 복합 스켈레톤 컴포넌트들\nexport const SkeletonCard = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4 p-6\", className)} // 16px 간격, 24px 패딩\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" /> {/* 16px 높이, 75% 너비 */}\n <SkeletonText className=\"h-3 w-1/2\" /> {/* 12px 높이, 50% 너비 */}\n </div>\n </div>\n <SkeletonRounded className=\"w-full h-32\" /> {/* 128px 높이 */}\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n <SkeletonText className=\"h-4 w-4/6\" />\n </div>\n </div>\n )\n)\nSkeletonCard.displayName = \"SkeletonCard\"\n\nexport const SkeletonAvatar = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center space-x-4\", className)} // 16px 간격\n {...props}\n >\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n )\n)\nSkeletonAvatar.displayName = \"SkeletonAvatar\"\n\nexport const SkeletonImage = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)} // 8px 간격\n {...props}\n >\n <SkeletonRounded className=\"w-full h-48\" /> {/* 192px 높이 */}\n <SkeletonText className=\"h-4 w-1/2\" />\n </div>\n )\n)\nSkeletonImage.displayName = \"SkeletonImage\"\n\nexport const SkeletonUserProfile = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-16 h-16\" /> {/* 64px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-5 w-1/2\" />\n <SkeletonText className=\"h-3 w-1/3\" />\n </div>\n </div>\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n </div>\n </div>\n )\n)\nSkeletonUserProfile.displayName = \"SkeletonUserProfile\"\n\nexport const SkeletonList = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-10 h-10\" /> {/* 40px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n )\n)\nSkeletonList.displayName = \"SkeletonList\"\n\nexport const SkeletonTable = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {/* 헤더 */}\n <div className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n {/* 행들 */}\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n ))}\n </div>\n )\n)\nSkeletonTable.displayName = \"SkeletonTable\"\n\nexport { Skeleton } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const progressBarVariants = cva(\n \"h-full rounded-full transition-all duration-300 ease-out\",\n {\n variants: {\n variant: {\n default: \"bg-foreground\",\n success: \"bg-[var(--progress-success)]\",\n warning: \"bg-[var(--progress-warning)]\",\n error: \"bg-[var(--progress-error)]\",\n info: \"bg-[var(--progress-info)]\",\n glass: \"bg-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport const progressTrackVariants = cva(\n \"relative w-full overflow-hidden rounded-full\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n success: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n warning: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n error: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n info: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n glass: \"bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/10 dark:border-slate-700/50\",\n },\n size: {\n sm: \"h-2\",\n md: \"h-3\",\n lg: \"h-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n }\n)\n\n/**\n * Progress 컴포넌트의 props\n */\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: number\n max?: number\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\" | \"glass\"\n showValue?: boolean\n animated?: boolean\n striped?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Progress 컴포넌트 / Progress component\n *\n * 진행률을 표시하는 프로그레스 바 컴포넌트입니다.\n *\n * @example\n * <Progress value={50} />\n * <Progress value={75} variant=\"success\" label=\"업로드\" showValue />\n * <Progress value={90} variant=\"warning\" striped animated />\n */\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n ({\n className,\n value = 0,\n max = 100,\n size = \"md\",\n variant = \"default\",\n showValue = false,\n animated = true,\n striped = false,\n label,\n description,\n ...props\n }, ref) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n return (\n <div className={merge(\"w-full\", className)} {...props}>\n {(label || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n {label && (\n <span className=\"text-sm font-medium text-foreground\">\n {label}\n </span>\n )}\n {showValue && (\n <span className=\"text-sm text-muted-foreground\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n\n <div\n ref={ref}\n className={progressTrackVariants({ variant, size })}\n >\n <div\n className={merge(\n progressBarVariants({ variant }),\n striped && \"bg-gradient-to-r from-transparent via-white/20 to-transparent bg-[length:20px_100%] animate-pulse\",\n animated && \"animate-pulse\"\n )}\n style={{\n width: `${percentage}%`,\n transition: animated ? \"width 0.3s ease-out\" : \"none\"\n }}\n />\n </div>\n\n {description && (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )\n }\n)\nProgress.displayName = \"Progress\"\n\n// 편의 컴포넌트들\nexport const ProgressSuccess = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nProgressSuccess.displayName = \"ProgressSuccess\"\n\nexport const ProgressWarning = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nProgressWarning.displayName = \"ProgressWarning\"\n\nexport const ProgressError = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nProgressError.displayName = \"ProgressError\"\n\nexport const ProgressInfo = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nProgressInfo.displayName = \"ProgressInfo\"\n\n// 복합 Progress 컴포넌트들\nexport const ProgressWrapper = React.forwardRef<HTMLDivElement, ProgressProps & { title?: string }>(\n ({ title, className, ...props }, ref) => (\n <div className={merge(\"p-4 bg-card rounded-lg border border-border\", className)}>\n {title && (\n <h3 className=\"text-sm font-semibold text-foreground mb-3\">\n {title}\n </h3>\n )}\n <Progress ref={ref} {...props} />\n </div>\n )\n)\nProgressWrapper.displayName = \"ProgressWrapper\"\n\nexport const ProgressGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nProgressGroup.displayName = \"ProgressGroup\"\n\nexport { Progress }\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Alert 컴포넌트의 props\n * @typedef {Object} AlertProps\n * @property {\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"} [variant=\"default\"] - Alert 스타일 변형\n * @property {string} [title] - Alert 제목\n * @property {string} [description] - Alert 설명\n * @property {React.ReactNode} [icon] - 커스텀 아이콘\n * @property {React.ReactNode} [action] - 액션 버튼/요소\n * @property {boolean} [closable=false] - 닫기 버튼 표시 여부\n * @property {() => void} [onClose] - 닫기 버튼 클릭 시 호출되는 콜백\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\"\n title?: string\n description?: string\n icon?: React.ReactNode\n action?: React.ReactNode\n closable?: boolean\n onClose?: () => void\n}\n\n/**\n * Alert 컴포넌트 / Alert component\n * \n * 사용자에게 중요한 정보나 경고를 표시하는 컴포넌트입니다.\n * 다양한 변형(variant)을 지원하며, 아이콘, 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n * \n * Component for displaying important information or warnings to users.\n * Supports various variants and can include icons, titles, descriptions, and action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Alert variant=\"info\" title=\"정보\" description=\"이것은 정보 메시지입니다.\" />\n * \n * @example\n * // 닫기 버튼 포함 / With close button\n * <Alert \n * variant=\"warning\" \n * title=\"경고\" \n * closable \n * onClose={() => console.log('닫기')}\n * />\n * \n * @example\n * // 커스텀 아이콘과 액션 / Custom icon and action\n * <Alert \n * variant=\"success\"\n * icon={<Icon name=\"check\" />}\n * action={<Button size=\"sm\">확인</Button>}\n * >\n * 작업이 완료되었습니다.\n * </Alert>\n * \n * @param {AlertProps} props - Alert 컴포넌트의 props / Alert component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Alert 컴포넌트 / Alert component\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ \n className, \n variant = \"default\",\n title,\n description,\n icon,\n action,\n closable = false,\n onClose,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"success\":\n return \"bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200\"\n case \"warning\":\n return \"bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200\"\n case \"error\":\n return \"bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200\"\n case \"info\":\n return \"bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200\"\n default:\n return \"bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200\"\n }\n }\n\n const getIconClasses = () => {\n switch (variant) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n default:\n return \"text-muted-foreground\"\n }\n }\n\n const getDefaultIcon = () => {\n switch (variant) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n default:\n return null\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative rounded-lg border p-4\", // 16px 패딩\n getVariantClasses(),\n className\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\"> {/* 12px 간격 */}\n {/* 아이콘 */}\n {(icon || getDefaultIcon()) && (\n <div className={merge(\"flex-shrink-0 mt-0.5\", getIconClasses())}>\n {icon || getDefaultIcon()}\n </div>\n )}\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {title}\n </h4>\n )}\n {description && (\n <p className=\"text-sm leading-relaxed\">\n {description}\n </p>\n )}\n {children && (\n <div className=\"mt-2\"> {/* 8px 여백 */}\n {children}\n </div>\n )}\n </div>\n\n {/* 액션 */}\n {(action || closable) && (\n <div className=\"flex-shrink-0 flex items-center gap-2\"> {/* 8px 간격 */}\n {action}\n {closable && (\n <button\n onClick={onClose}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconClasses()\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\nAlert.displayName = \"Alert\"\n\n// 편의 컴포넌트들\nexport const AlertSuccess = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nAlertSuccess.displayName = \"AlertSuccess\"\n\nexport const AlertWarning = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nAlertWarning.displayName = \"AlertWarning\"\n\nexport const AlertError = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nAlertError.displayName = \"AlertError\"\n\nexport const AlertInfo = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nAlertInfo.displayName = \"AlertInfo\"\n\nexport { Alert } ","\"use client\"\n\nimport React, { useState, useEffect, useCallback } from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Button } from \"./Button\"\n\n/**\n * 슬라이드 아이템 인터페이스\n */\nexport interface HeroSlide {\n title: string\n subtitle?: string\n description: string\n primaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n secondaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n background?: \"none\" | \"gradient\" | \"particles\" | \"image\"\n backgroundImage?: string\n}\n\n/**\n * HeroSection 컴포넌트의 props\n */\nexport interface HeroSectionProps extends React.HTMLAttributes<HTMLElement> {\n // 단일 모드 props\n title?: string\n subtitle?: string\n description?: string\n primaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n secondaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n // 슬라이드 모드 props\n slides?: HeroSlide[]\n autoPlay?: boolean\n interval?: number\n indicator?: \"dots\" | \"line\" | \"numbers\" | \"none\"\n showControls?: boolean\n pauseOnHover?: boolean\n // 공통 props\n background?: \"none\" | \"gradient\" | \"particles\" | \"video\" | \"image\"\n customBackground?: string\n /**\n * 히어로 섹션 크기\n * - sm: 400px, md: 500px, lg: 600px, xl: 700px\n * - full: 100vh (뷰포트 전체)\n */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n /**\n * 헤더 뒤까지 확장 (fixed header가 있을 때)\n * true면 -mt-16 적용되어 헤더 뒤로 들어감\n */\n fullBleed?: boolean\n}\n\n/**\n * HeroSection 컴포넌트\n *\n * 단일 히어로 또는 슬라이드 히어로를 지원합니다.\n * slides prop이 있으면 슬라이드 모드로 동작합니다.\n */\nconst HeroSection = React.forwardRef<HTMLElement, HeroSectionProps>(\n ({\n className,\n // 단일 모드\n title,\n subtitle,\n description,\n primaryAction,\n secondaryAction,\n // 슬라이드 모드\n slides,\n autoPlay = false,\n interval = 5000,\n indicator = \"dots\",\n showControls = true,\n pauseOnHover = true,\n // 공통\n background = \"gradient\",\n customBackground,\n size = \"lg\",\n fullBleed = false,\n ...props\n }, ref) => {\n const [currentSlide, setCurrentSlide] = useState(0)\n const [isPaused, setIsPaused] = useState(false)\n\n // 슬라이드 모드 여부\n const isSlideMode = slides && slides.length > 0\n const slideCount = slides?.length || 0\n\n // 다음 슬라이드\n const nextSlide = useCallback(() => {\n if (!isSlideMode) return\n setCurrentSlide((prev) => (prev + 1) % slideCount)\n }, [isSlideMode, slideCount])\n\n // 이전 슬라이드\n const prevSlide = useCallback(() => {\n if (!isSlideMode) return\n setCurrentSlide((prev) => (prev - 1 + slideCount) % slideCount)\n }, [isSlideMode, slideCount])\n\n // 특정 슬라이드로 이동\n const goToSlide = useCallback((index: number) => {\n setCurrentSlide(index)\n }, [])\n\n // 자동 재생\n useEffect(() => {\n if (!autoPlay || !isSlideMode || isPaused) return\n\n const timer = setInterval(nextSlide, interval)\n return () => clearInterval(timer)\n }, [autoPlay, isSlideMode, isPaused, interval, nextSlide])\n\n // 현재 표시할 콘텐츠\n const currentContent = isSlideMode ? slides[currentSlide] : {\n title: title || \"\",\n subtitle,\n description: description || \"\",\n primaryAction,\n secondaryAction,\n background,\n }\n\n const sizeClasses = {\n sm: \"min-h-[400px]\",\n md: \"min-h-[500px]\",\n lg: \"min-h-[600px]\",\n xl: \"min-h-[700px]\",\n full: \"min-h-screen\"\n }\n\n const titleSizeClasses = {\n sm: \"text-2xl sm:text-3xl md:text-4xl leading-tight\",\n md: \"text-3xl sm:text-4xl md:text-5xl leading-tight\",\n lg: \"text-3xl sm:text-4xl md:text-5xl lg:text-6xl leading-tight\",\n xl: \"text-3xl sm:text-4xl md:text-5xl lg:text-6xl leading-tight\",\n full: \"text-4xl sm:text-5xl md:text-6xl lg:text-7xl leading-tight\"\n }\n\n const subtitleSizeClasses = {\n sm: \"text-base sm:text-lg md:text-xl leading-snug\",\n md: \"text-lg sm:text-xl md:text-2xl leading-snug\",\n lg: \"text-lg sm:text-xl md:text-2xl lg:text-3xl leading-snug\",\n xl: \"text-xl sm:text-2xl md:text-3xl leading-snug\",\n full: \"text-xl sm:text-2xl md:text-3xl lg:text-4xl leading-snug\"\n }\n\n const descriptionSizeClasses = {\n sm: \"text-sm sm:text-base md:text-lg leading-relaxed\",\n md: \"text-base sm:text-lg md:text-xl leading-relaxed\",\n lg: \"text-base sm:text-lg md:text-xl leading-relaxed\",\n xl: \"text-base sm:text-lg md:text-xl leading-relaxed\",\n full: \"text-lg sm:text-xl md:text-2xl leading-relaxed\"\n }\n\n const currentBg = isSlideMode ? (currentContent.background || background) : background\n\n const backgroundContent: Record<string, React.ReactNode> = {\n none: null,\n gradient: (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n {/* 왼쪽 위 - 메인 그라데이션 */}\n <div className=\"absolute top-0 left-0 w-80 h-80 sm:w-96 sm:h-96 md:w-[500px] md:h-[500px] -translate-x-1/3 -translate-y-1/3 rounded-full bg-gradient-to-br from-teal-400 via-cyan-500 to-teal-600 opacity-40 blur-3xl\" />\n {/* 오른쪽 아래 - 보조 그라데이션 */}\n <div className=\"absolute bottom-0 right-0 w-72 h-72 sm:w-80 sm:h-80 md:w-[400px] md:h-[400px] translate-x-1/4 translate-y-1/4 rounded-full bg-gradient-to-tr from-cyan-400 via-teal-500 to-emerald-500 opacity-35 blur-3xl\" />\n {/* 중앙 액센트 */}\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-48 h-48 sm:w-64 sm:h-64 md:w-80 md:h-80 rounded-full bg-teal-500/20 blur-2xl\" />\n </div>\n ),\n particles: (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <div className=\"absolute inset-0 bg-gradient-to-br from-secondary/50 via-background to-secondary/30\" />\n </div>\n ),\n video: customBackground ? (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <video\n autoPlay\n loop\n muted\n playsInline\n className=\"absolute inset-0 w-full h-full object-cover opacity-20\"\n >\n <source src={customBackground} type=\"video/mp4\" />\n </video>\n </div>\n ) : null,\n image: (customBackground || (isSlideMode && (currentContent as HeroSlide).backgroundImage)) ? (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <img\n src={(isSlideMode && (currentContent as HeroSlide).backgroundImage) || customBackground}\n alt=\"\"\n className=\"absolute inset-0 w-full h-full object-cover opacity-30\"\n />\n <div className=\"absolute inset-0 bg-gradient-to-t from-background via-background/50 to-transparent\" />\n </div>\n ) : null,\n }\n\n // 인디케이터 렌더링\n const renderIndicator = () => {\n if (!isSlideMode || indicator === \"none\") return null\n\n switch (indicator) {\n case \"dots\":\n return (\n <div className=\"flex gap-2 justify-center mt-8\">\n {slides.map((_, index) => (\n <button\n key={index}\n onClick={() => goToSlide(index)}\n className={merge(\n \"w-2.5 h-2.5 rounded-full transition-all duration-300\",\n currentSlide === index\n ? \"bg-primary w-8\"\n : \"bg-muted-foreground/30 hover:bg-muted-foreground/50\"\n )}\n aria-label={`Go to slide ${index + 1}`}\n />\n ))}\n </div>\n )\n\n case \"line\":\n return (\n <div className=\"flex gap-1 justify-center mt-8 max-w-xs mx-auto\">\n {slides.map((_, index) => (\n <button\n key={index}\n onClick={() => goToSlide(index)}\n className=\"flex-1 h-1 rounded-full overflow-hidden bg-muted-foreground/20\"\n aria-label={`Go to slide ${index + 1}`}\n >\n <div\n className={merge(\n \"h-full bg-primary transition-all duration-300\",\n currentSlide === index ? \"w-full\" : \"w-0\"\n )}\n />\n </button>\n ))}\n </div>\n )\n\n case \"numbers\":\n return (\n <div className=\"flex items-center justify-center gap-2 mt-8 text-sm text-muted-foreground\">\n <span className=\"text-foreground font-semibold\">{currentSlide + 1}</span>\n <span>/</span>\n <span>{slideCount}</span>\n </div>\n )\n\n default:\n return null\n }\n }\n\n return (\n <section\n ref={ref}\n className={merge(\n \"relative w-full flex flex-col justify-center items-center text-center px-4 sm:px-6 lg:px-8 overflow-hidden\",\n sizeClasses[size],\n fullBleed && \"-mt-16 pt-16\",\n className\n )}\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\n {...props}\n >\n {backgroundContent[currentBg]}\n\n {/* 슬라이드 콘텐츠 */}\n <div className=\"relative z-10 max-w-4xl mx-auto\">\n <div\n key={isSlideMode ? currentSlide : 0}\n className=\"animate-in fade-in slide-in-from-bottom-4 duration-500\"\n >\n <h1 className={merge(\n \"font-extrabold mb-4 sm:mb-6 text-foreground\",\n titleSizeClasses[size]\n )}>\n <span className=\"block gradient-text\">\n {currentContent.title}\n </span>\n {currentContent.subtitle && (\n <span className={merge(\n \"block font-semibold mt-2 sm:mt-4 text-muted-foreground\",\n subtitleSizeClasses[size]\n )}>\n {currentContent.subtitle}\n </span>\n )}\n </h1>\n\n <div className={merge(\n \"text-muted-foreground mb-6 sm:mb-8 md:mb-10 max-w-2xl mx-auto\",\n descriptionSizeClasses[size]\n )}>\n {currentContent.description.split('\\n').map((line, i, arr) => (\n <React.Fragment key={i}>\n {line}\n {i < arr.length - 1 && <br />}\n </React.Fragment>\n ))}\n </div>\n\n {(currentContent.primaryAction || currentContent.secondaryAction) && (\n <div className=\"flex flex-col sm:flex-row gap-4 justify-center\">\n {currentContent.primaryAction && (\n <Button\n href={currentContent.primaryAction.href}\n size={size === \"xl\" || size === \"full\" ? \"lg\" : \"md\"}\n hover=\"scale\"\n className=\"inline-flex items-center gap-2\"\n >\n {currentContent.primaryAction.icon}\n {currentContent.primaryAction.label}\n </Button>\n )}\n\n {currentContent.secondaryAction && (\n <Button\n href={currentContent.secondaryAction.href}\n variant=\"outline\"\n size={size === \"xl\" || size === \"full\" ? \"lg\" : \"md\"}\n hover=\"scale\"\n className=\"inline-flex items-center gap-2\"\n >\n {currentContent.secondaryAction.icon}\n {currentContent.secondaryAction.label}\n </Button>\n )}\n </div>\n )}\n </div>\n\n {/* 인디케이터 */}\n {renderIndicator()}\n </div>\n\n {/* 좌우 컨트롤 */}\n {isSlideMode && showControls && slideCount > 1 && (\n <>\n <button\n onClick={prevSlide}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 z-20 p-2 rounded-full bg-card/80 backdrop-blur-sm border border-border text-foreground hover:bg-card transition-colors\"\n aria-label=\"Previous slide\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <button\n onClick={nextSlide}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 z-20 p-2 rounded-full bg-card/80 backdrop-blur-sm border border-border text-foreground hover:bg-card transition-colors\"\n aria-label=\"Next slide\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </>\n )}\n </section>\n )\n }\n)\n\nHeroSection.displayName = \"HeroSection\"\n\nexport { HeroSection }\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { merge } from '../lib/utils'\n\n/**\n * ScrollProgress 컴포넌트의 props / ScrollProgress component props\n * @typedef {Object} ScrollProgressProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {number} [height=2] - 진행률 바 높이 (px) / Progress bar height (px)\n * @property {'default' | 'primary' | 'secondary' | 'gradient'} [color='gradient'] - 진행률 바 색상 / Progress bar color\n * @property {'top' | 'bottom'} [position='top'] - 표시 위치 / Display position\n * @property {boolean} [animated=true] - 애니메이션 활성화 여부 / Enable animation\n * @property {boolean} [showPercentage=false] - 퍼센트 표시 여부 / Show percentage\n */\nexport interface ScrollProgressProps {\n className?: string\n height?: number\n color?: 'default' | 'primary' | 'secondary' | 'gradient'\n position?: 'top' | 'bottom'\n animated?: boolean\n showPercentage?: boolean\n}\n\n/**\n * ScrollProgress 컴포넌트 / ScrollProgress component\n * \n * 페이지 스크롤 진행률을 표시하는 컴포넌트입니다.\n * 페이지 상단 또는 하단에 고정되어 표시됩니다.\n * \n * Component that displays page scroll progress.\n * Fixed at top or bottom of the page.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ScrollProgress />\n * \n * @example\n * // 하단에 표시, 퍼센트 포함 / Display at bottom with percentage\n * <ScrollProgress \n * position=\"bottom\"\n * color=\"primary\"\n * showPercentage\n * height={4}\n * />\n * \n * @param {ScrollProgressProps} props - ScrollProgress 컴포넌트의 props / ScrollProgress component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ScrollProgress 컴포넌트 / ScrollProgress component\n */\nconst ScrollProgress = React.forwardRef<HTMLDivElement, ScrollProgressProps>(({\n className,\n height = 2,\n color = 'gradient',\n position = 'top',\n animated: _animated = true,\n showPercentage = false,\n ...props\n}, ref) => {\n const [progress, setProgress] = useState(0)\n\n useEffect(() => {\n const updateProgress = () => {\n const scrollTop = window.scrollY\n const docHeight = document.documentElement.scrollHeight - window.innerHeight\n const currentProgress = docHeight > 0 ? (scrollTop / docHeight) * 100 : 0\n setProgress(currentProgress)\n }\n\n // 초기 실행\n updateProgress()\n\n window.addEventListener('scroll', updateProgress, { passive: true })\n window.addEventListener('resize', updateProgress, { passive: true })\n \n return () => {\n window.removeEventListener('scroll', updateProgress)\n window.removeEventListener('resize', updateProgress)\n }\n }, [])\n\n // 색상 옵션 (Teal 브랜드 기반)\n const progressColors: Record<string, string> = {\n default: 'bg-foreground',\n primary: 'bg-primary',\n secondary: 'bg-muted-foreground',\n gradient: 'bg-gradient-to-r from-teal-600 via-cyan-500 to-teal-600'\n }\n\n const positionClasses = {\n top: 'top-0 left-0 right-0',\n bottom: 'bottom-0 left-0 right-0'\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n 'fixed z-50',\n positionClasses[position],\n className\n )}\n style={{ height: `${height}px` }}\n {...props}\n >\n {/* 배경 바 */}\n <div className=\"absolute inset-0 w-full h-full bg-border/30\" />\n \n {/* 진행률 바 - absolute로 배경 위에 표시 */}\n <div\n className={merge(\n 'absolute top-0 left-0 h-full origin-left transition-all duration-100 ease-out',\n progressColors[color] || progressColors.gradient\n )}\n style={{\n width: `${progress}%`,\n transformOrigin: 'left'\n }}\n />\n \n {/* 퍼센트 표시 (선택사항) */}\n {showPercentage && (\n <div className=\"absolute top-2 right-2 text-xs text-muted-foreground bg-card px-2 py-1 rounded border border-border\">\n {Math.round(progress)}%\n </div>\n )}\n </div>\n )\n})\n\nScrollProgress.displayName = 'ScrollProgress'\n\nexport { ScrollProgress } ","\"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\n/**\n * SDUI Component Registry\n *\n * 컴포넌트 타입 문자열 → 실제 React 컴포넌트 매핑\n */\n\nimport React, { useState } from \"react\";\nimport type { SDUIComponentRegistry } from \"./types\";\nimport { cn } from \"../lib/utils\";\n\n// 기본 컴포넌트들\nimport { Button } from \"../components/Button\";\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from \"../components/Card\";\nimport { Badge } from \"../components/Badge\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../components/Avatar\";\nimport { Container } from \"../components/Container\";\nimport { Input } from \"../components/Input\";\nimport { Textarea } from \"../components/Textarea\";\nimport { Label } from \"../components/Label\";\nimport { Checkbox, type CheckboxProps } from \"../components/Checkbox\";\nimport { Switch, type SwitchProps } from \"../components/Switch\";\nimport { type InputProps } from \"../components/Input\";\nimport { type TextareaProps } from \"../components/Textarea\";\nimport { Skeleton } from \"../components/Skeleton\";\nimport { Progress } from \"../components/Progress\";\nimport { Alert } from \"../components/Alert\";\nimport { Icon } from \"../components/Icon\";\nimport type { IconName } from \"../lib/icons\";\n\n// Advanced 컴포넌트들\nimport { HeroSection } from \"../components/HeroSection\";\nimport { ScrollProgress } from \"../components/ScrollProgress\";\n\n// Interactive 컴포넌트들\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from \"../components/Accordion\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"../components/Tabs\";\n\n// 레이아웃 프리미티브\nconst Box: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n // 커스텀 스타일 props (DOM에 직접 전달하지 않음)\n backgroundColor?: string;\n padding?: string | number;\n margin?: string | number;\n borderRadius?: string | number;\n border?: string;\n}> = ({\n children,\n justify,\n align,\n className = \"\",\n style,\n // 커스텀 props 분리 (DOM에 전달 X)\n backgroundColor,\n padding,\n margin,\n borderRadius,\n border,\n ...props\n}) => {\n // 커스텀 props를 style 객체로 병합\n const customStyle: React.CSSProperties = {\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n ...(margin !== undefined && { margin: typeof margin === 'number' ? `${margin}px` : margin }),\n ...(borderRadius !== undefined && { borderRadius: typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius }),\n ...(border && { border }),\n };\n\n return (\n <div\n className={cn(\n (justify || align) && \"flex\",\n justify && justifyMap[justify],\n align && alignMap[align],\n className\n )}\n style={Object.keys(customStyle).length > 0 ? customStyle : undefined}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// Spacer - 공백용 void 컴포넌트\nconst Spacer: React.FC<{ size?: number; className?: string }> = ({ size = 16, className = \"\" }) => (\n <div className={className} style={{ width: size, height: size, flexShrink: 0 }} />\n);\n\n// 정렬 매핑\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n};\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n};\n\nconst Flex: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n direction?: \"row\" | \"column\";\n gap?: number;\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n direction = \"row\",\n gap = 0,\n justify = \"start\",\n align = \"stretch\",\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`flex ${direction === \"column\" ? \"flex-col\" : \"flex-row\"} ${justifyMap[justify]} ${alignMap[align]} ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\nconst Grid: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n cols?: number;\n gap?: number;\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n cols = 1,\n gap = 4,\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`grid ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// 텍스트 정렬 매핑\nconst textAlignMap = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n\n// 타이포그래피 스타일 props 타입\ninterface TypographyStyleProps {\n fontSize?: string;\n lineHeight?: string;\n fontWeight?: string;\n letterSpacing?: string;\n}\n\n// 타이포그래피 스타일 props를 style 객체로 변환\nfunction getTypographyStyle(props: TypographyStyleProps): React.CSSProperties {\n const style: React.CSSProperties = {};\n if (props.fontSize) style.fontSize = props.fontSize;\n if (props.lineHeight) style.lineHeight = props.lineHeight;\n if (props.fontWeight) style.fontWeight = props.fontWeight;\n if (props.letterSpacing) style.letterSpacing = props.letterSpacing;\n return style;\n}\n\nconst Text: React.FC<React.HTMLAttributes<HTMLParagraphElement> & {\n variant?: \"body\" | \"muted\" | \"lead\";\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps> = ({\n children,\n variant = \"body\",\n align = \"center\",\n className = \"\",\n style,\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n ...props\n}) => {\n const variantClasses = {\n body: \"text-foreground\",\n muted: \"text-muted-foreground text-sm\",\n lead: \"text-xl text-muted-foreground\",\n };\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n\n return (\n <p\n className={`${variantClasses[variant]} ${textAlignMap[align]} ${className}`}\n style={mergedStyle}\n {...props}\n >\n {children}\n </p>\n );\n};\n\n// Heading 컴포넌트들 (정렬 + 타이포그래피 스타일 지원)\ntype HeadingProps = React.HTMLAttributes<HTMLHeadingElement> & {\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps;\n\nconst H1: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h1 className={`text-4xl md:text-5xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h1>\n );\n};\n\nconst H2: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h2 className={`text-3xl md:text-4xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h2>\n );\n};\n\nconst H3: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h3 className={`text-2xl md:text-3xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h3>\n );\n};\n\nconst H4: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h4 className={`text-xl md:text-2xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h4>\n );\n};\n\nconst Link: React.FC<React.AnchorHTMLAttributes<HTMLAnchorElement>> = ({\n children,\n href = \"#\",\n className = \"\",\n ...props\n}) => {\n // 절대 경로 처리: http/https로 시작하지 않으면 그대로, 시작하면 외부 링크\n const isExternal = href.startsWith(\"http://\") || href.startsWith(\"https://\");\n\n return (\n <a\n href={href}\n className={`text-primary hover:underline ${className}`}\n {...(isExternal ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n {...props}\n >\n {children}\n </a>\n );\n};\n\nconst Image: React.FC<React.ImgHTMLAttributes<HTMLImageElement>> = ({ className = \"\", alt = \"\", ...props }) => (\n <img className={`max-w-full h-auto ${className}`} alt={alt} {...props} />\n);\n\n// SDUI용 Icon 래퍼 (name을 string으로 받음)\nconst SDUIIcon: React.FC<{ name?: string; size?: number; className?: string }> = ({\n name = \"star\",\n size = 24,\n className = \"\",\n}) => <Icon name={name as IconName} size={size} className={className} />;\n\nconst Section: React.FC<React.HTMLAttributes<HTMLElement>> = ({\n children,\n className = \"\",\n ...props\n}) => (\n <section className={`py-10 ${className}`} {...props}>\n {children}\n </section>\n);\n\nconst Divider: React.FC<React.HTMLAttributes<HTMLHRElement>> = ({ className = \"\", ...props }) => (\n <hr className={`border-border ${className}`} {...props} />\n);\n\n// Header - 네비게이션 헤더 (GNB)\nconst Header: React.FC<React.HTMLAttributes<HTMLElement> & {\n sticky?: boolean;\n transparent?: boolean;\n blur?: boolean;\n overlay?: boolean;\n}> = ({\n children,\n sticky = true,\n transparent = false,\n blur = true,\n overlay = false,\n className = \"\",\n ...props\n}) => (\n <header\n className={cn(\n \"w-full px-4 py-3 z-50\",\n overlay ? \"absolute top-0 left-0 right-0\" : sticky && \"sticky top-0\",\n transparent ? \"bg-transparent\" : \"bg-background/80\",\n blur && !transparent && \"backdrop-blur-md\",\n !transparent && \"border-b border-border\",\n className\n )}\n {...props}\n >\n <div className=\"max-w-7xl mx-auto\">\n {children}\n </div>\n </header>\n);\n\n/**\n * SDUI용 Uncontrolled 래퍼 컴포넌트들\n * 프리뷰에서 인터랙션이 동작하도록 자체 상태 관리\n */\n\n// Uncontrolled Checkbox - 클릭하면 상태 토글\nconst SDUICheckbox: React.FC<CheckboxProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Checkbox\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Switch - 클릭하면 상태 토글\nconst SDUISwitch: React.FC<SwitchProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Switch\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Input - 자체 상태 관리\nconst SDUIInput: React.FC<InputProps> = ({ defaultValue = \"\", onChange, ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Input\n {...props}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Textarea - 자체 상태 관리 + resize 지원\nconst SDUITextarea: React.FC<TextareaProps> = ({ defaultValue = \"\", onChange, resize = \"vertical\", ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Textarea\n {...props}\n resize={resize}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n/**\n * SDUI용 간단한 Accordion - 데이터 기반\n * items 배열로 아코디언 생성\n */\ninterface SimpleAccordionItem {\n title: string;\n content: string;\n value?: string;\n}\n\nconst SDUIAccordion: React.FC<{\n items?: SimpleAccordionItem[];\n type?: \"single\" | \"multiple\";\n collapsible?: boolean;\n defaultValue?: string;\n className?: string;\n}> = ({\n items = [],\n type = \"single\",\n collapsible = true,\n defaultValue,\n className = \"\",\n}) => {\n return (\n <Accordion\n type={type}\n collapsible={collapsible}\n defaultValue={defaultValue}\n className={className}\n >\n {items.map((item, index) => {\n const value = item.value || `item-${index}`;\n return (\n <AccordionItem key={value} value={value}>\n <AccordionTrigger>{item.title}</AccordionTrigger>\n <AccordionContent>{item.content}</AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordion>\n );\n};\n\n/**\n * SDUI용 간단한 Tabs - 데이터 기반\n * tabs 배열로 탭 생성\n */\ninterface SimpleTabItem {\n label: string;\n content: string;\n value?: string;\n}\n\nconst SDUITabs: React.FC<{\n tabs?: SimpleTabItem[];\n defaultValue?: string;\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\";\n className?: string;\n}> = ({\n tabs = [],\n defaultValue,\n variant = \"default\",\n className = \"\",\n}) => {\n const firstValue = tabs[0]?.value || \"tab-0\";\n\n return (\n <Tabs\n defaultValue={defaultValue || firstValue}\n variant={variant}\n className={className}\n >\n <TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsTrigger key={value} value={value}>\n {tab.label}\n </TabsTrigger>\n );\n })}\n </TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsContent key={value} value={value}>\n {tab.content}\n </TabsContent>\n );\n })}\n </Tabs>\n );\n};\n\n/**\n * 기본 컴포넌트 레지스트리\n */\nexport const defaultRegistry: SDUIComponentRegistry = {\n // 레이아웃\n Box,\n Spacer,\n Flex,\n Grid,\n Section,\n Container,\n Divider,\n\n // 타이포그래피\n Text,\n H1,\n H2,\n H3,\n H4,\n Link,\n\n // 미디어\n Image,\n Icon: SDUIIcon,\n\n // 기본 UI\n Button,\n Badge,\n Avatar,\n AvatarImage,\n AvatarFallback,\n Input: SDUIInput,\n Textarea: SDUITextarea,\n Label,\n Checkbox: SDUICheckbox,\n Switch: SDUISwitch,\n Skeleton,\n Progress,\n\n // 카드\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n\n // 피드백\n Alert,\n\n // Advanced (Pro)\n Header,\n HeroSection,\n ScrollProgress,\n\n // Interactive (Pro)\n Accordion: SDUIAccordion,\n Tabs: SDUITabs,\n};\n\n/**\n * 레지스트리 확장 헬퍼\n */\nexport function extendRegistry(\n customComponents: SDUIComponentRegistry\n): SDUIComponentRegistry {\n return {\n ...defaultRegistry,\n ...customComponents,\n };\n}\n\n/**\n * 컴포넌트 존재 여부 확인\n */\nexport function hasComponent(registry: SDUIComponentRegistry, type: string): boolean {\n return type in registry;\n}\n","\"use client\";\n\n/**\n * SDUI Renderer\n *\n * JSON 스키마를 받아서 실제 React 컴포넌트로 렌더링\n */\n\nimport React, { createContext, useContext, useState, useCallback, useMemo } from \"react\";\nimport type {\n SDUINode,\n SDUIPageSchema,\n SDUIRendererProps,\n SDUIContext,\n SDUIAction,\n SDUICondition,\n SDUIComponentRegistry,\n} from \"./types\";\nimport { defaultRegistry } from \"./registry\";\n\n// SDUI Context\nconst SDUIContextInternal = createContext<SDUIContext | null>(null);\n\n/**\n * SDUI Context Hook\n */\nexport function useSDUI(): SDUIContext {\n const context = useContext(SDUIContextInternal);\n if (!context) {\n throw new Error(\"useSDUI must be used within SDUIRenderer\");\n }\n return context;\n}\n\n/**\n * 데이터 경로로 값 가져오기\n * 예: \"user.profile.name\" → data.user.profile.name\n */\nfunction getByPath(obj: Record<string, unknown>, path: string): unknown {\n return path.split(\".\").reduce((acc: unknown, key) => {\n if (acc && typeof acc === \"object\" && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * 데이터 경로로 값 설정하기\n */\nfunction setByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): Record<string, unknown> {\n const keys = path.split(\".\");\n const result = { ...obj };\n let current: Record<string, unknown> = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n current[key] = { ...(current[key] as Record<string, unknown> || {}) };\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result;\n}\n\n/**\n * 조건 평가\n */\nfunction evaluateCondition(\n condition: SDUICondition,\n data: Record<string, unknown>\n): boolean {\n const value = getByPath(data, condition.path);\n\n switch (condition.operator) {\n case \"eq\":\n return value === condition.value;\n case \"neq\":\n return value !== condition.value;\n case \"gt\":\n return typeof value === \"number\" && value > (condition.value as number);\n case \"lt\":\n return typeof value === \"number\" && value < (condition.value as number);\n case \"gte\":\n return typeof value === \"number\" && value >= (condition.value as number);\n case \"lte\":\n return typeof value === \"number\" && value <= (condition.value as number);\n case \"exists\":\n return value !== undefined && value !== null;\n case \"notExists\":\n return value === undefined || value === null;\n default:\n return true;\n }\n}\n\n/**\n * Props에서 데이터 바인딩 처리\n * {{ path }} 형식을 실제 데이터로 치환\n */\nfunction resolveProps(\n props: Record<string, unknown>,\n data: Record<string, unknown>\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === \"string\") {\n // {{ path }} 패턴 처리\n const bindingMatch = value.match(/^\\{\\{\\s*(.+?)\\s*\\}\\}$/);\n if (bindingMatch) {\n resolved[key] = getByPath(data, bindingMatch[1]);\n } else {\n // 문자열 내 부분 바인딩: \"Hello, {{ user.name }}!\"\n resolved[key] = value.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n }\n } else if (Array.isArray(value)) {\n resolved[key] = value.map((item) =>\n typeof item === \"object\" && item !== null\n ? resolveProps(item as Record<string, unknown>, data)\n : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n resolved[key] = resolveProps(value as Record<string, unknown>, data);\n } else {\n resolved[key] = value;\n }\n }\n\n return resolved;\n}\n\n/**\n * 단일 노드 렌더러\n */\ninterface NodeRendererProps {\n node: SDUINode;\n registry: SDUIComponentRegistry;\n}\n\nfunction NodeRenderer({ node, registry }: NodeRendererProps) {\n const { data, handleAction } = useSDUI();\n\n // 조건부 렌더링 체크\n if (node.when && !evaluateCondition(node.when, data)) {\n return null;\n }\n\n // 컴포넌트 찾기\n const Component = registry[node.type];\n if (!Component) {\n console.warn(`[SDUI] Unknown component type: ${node.type}`);\n return (\n <div className=\"p-4 border border-destructive/50 bg-destructive/10 rounded text-sm text-destructive\">\n Unknown component: {node.type}\n </div>\n );\n }\n\n // Props 처리\n const resolvedProps = node.props ? resolveProps(node.props, data) : {};\n\n // 이벤트 핸들러 처리\n const eventProps: Record<string, unknown> = {};\n if (node.on) {\n if (node.on.click) {\n eventProps.onClick = () => handleAction(node.on!.click!);\n }\n if (node.on.submit) {\n eventProps.onSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n handleAction(node.on!.submit!);\n };\n }\n }\n\n // Children 처리\n let children: React.ReactNode = null;\n if (node.children) {\n if (typeof node.children === \"string\") {\n // 문자열 바인딩 처리\n children = node.children.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n } else if (Array.isArray(node.children)) {\n children = node.children.map((child, index) => (\n <NodeRenderer\n key={child.key || `child-${index}`}\n node={child}\n registry={registry}\n />\n ));\n }\n }\n\n // void 엘리먼트는 children을 받지 않음\n const voidElements = ['Divider', 'Input', 'Textarea', 'Checkbox', 'Switch', 'Progress', 'Skeleton', 'Image', 'ScrollProgress'];\n const isVoidElement = voidElements.includes(node.type);\n\n if (isVoidElement || children === null) {\n return <Component {...resolvedProps} {...eventProps} />;\n }\n\n return (\n <Component {...resolvedProps} {...eventProps}>\n {children}\n </Component>\n );\n}\n\n/**\n * SDUI Renderer 메인 컴포넌트\n */\nexport function SDUIRenderer({\n schema,\n components,\n data: initialData = {},\n onAction,\n onNavigate,\n}: SDUIRendererProps) {\n // 페이지 스키마인지 노드인지 확인\n const isPageSchema = \"root\" in schema;\n const rootNode = isPageSchema ? (schema as SDUIPageSchema).root : (schema as SDUINode);\n const schemaData = isPageSchema ? (schema as SDUIPageSchema).data : {};\n\n // 데이터 상태\n const [data, setDataState] = useState<Record<string, unknown>>({\n ...schemaData,\n ...initialData,\n });\n\n // 레지스트리 병합\n const registry = useMemo(\n () => ({ ...defaultRegistry, ...components }),\n [components]\n );\n\n // 데이터 업데이트\n const setData = useCallback((path: string, value: unknown) => {\n setDataState((prev) => setByPath(prev, path, value));\n }, []);\n\n // 네비게이션\n const navigate = useCallback(\n (path: string) => {\n if (onNavigate) {\n onNavigate(path);\n } else if (typeof window !== \"undefined\") {\n window.location.href = path;\n }\n },\n [onNavigate]\n );\n\n // 액션 핸들러\n const handleAction = useCallback(\n (action: SDUIAction) => {\n switch (action.type) {\n case \"navigate\":\n navigate(action.payload?.path as string);\n break;\n case \"setState\":\n if (action.payload?.path && action.payload?.value !== undefined) {\n setData(action.payload.path as string, action.payload.value);\n }\n break;\n case \"api\":\n // API 호출은 외부에서 처리\n onAction?.(action);\n break;\n case \"custom\":\n onAction?.(action);\n break;\n default:\n onAction?.(action);\n }\n },\n [navigate, setData, onAction]\n );\n\n // Context 값\n const contextValue: SDUIContext = useMemo(\n () => ({\n data,\n setData,\n handleAction,\n navigate,\n }),\n [data, setData, handleAction, navigate]\n );\n\n return (\n <SDUIContextInternal.Provider value={contextValue}>\n <NodeRenderer node={rootNode} registry={registry} />\n </SDUIContextInternal.Provider>\n );\n}\n\n/**\n * JSON 문자열에서 렌더링 (편의용)\n */\nexport function SDUIFromJSON({\n json,\n ...props\n}: Omit<SDUIRendererProps, \"schema\"> & { json: string }) {\n try {\n const schema = JSON.parse(json);\n return <SDUIRenderer schema={schema} {...props} />;\n } catch (error) {\n return (\n <div className=\"p-4 border border-destructive bg-destructive/10 rounded\">\n <p className=\"font-semibold text-destructive\">SDUI Parse Error</p>\n <pre className=\"text-sm mt-2 text-destructive/80\">\n {(error as Error).message}\n </pre>\n </div>\n );\n }\n}\n"]}
|