@hua-labs/ui 2.1.1 → 2.2.0
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 +1 -1
- package/dist/{ComponentLayout-DrZpz0yv.d.mts → ComponentLayout-BhM4VSoq.d.mts} +1 -1
- package/dist/advanced-dashboard.d.mts +1 -1
- package/dist/advanced-dashboard.mjs +3 -3
- package/dist/advanced-dashboard.mjs.map +1 -1
- package/dist/advanced-emotion.mjs +1 -1
- package/dist/advanced-motion.d.mts +9 -6
- package/dist/advanced-motion.mjs +1 -1
- package/dist/advanced.d.mts +3 -3
- package/dist/advanced.mjs +2 -2
- package/dist/advanced.mjs.map +1 -1
- package/dist/chunk-5DPW7SVD.mjs +4 -0
- package/dist/{chunk-AOSXB5JJ.mjs.map → chunk-5DPW7SVD.mjs.map} +1 -1
- package/dist/chunk-5L5HIPKA.mjs +3 -0
- package/dist/{chunk-3GAUTZXQ.mjs.map → chunk-5L5HIPKA.mjs.map} +1 -1
- package/dist/chunk-A5YOVVM5.mjs +3 -0
- package/dist/chunk-A5YOVVM5.mjs.map +1 -0
- package/dist/chunk-CNW22G24.mjs +13 -0
- package/dist/chunk-CNW22G24.mjs.map +1 -0
- package/dist/chunk-CW66UBQG.mjs +3 -0
- package/dist/{chunk-6HVJFEDA.mjs.map → chunk-CW66UBQG.mjs.map} +1 -1
- package/dist/chunk-EAZEI74V.mjs +3 -0
- package/dist/chunk-EAZEI74V.mjs.map +1 -0
- package/dist/chunk-EPY3432E.mjs +3 -0
- package/dist/{chunk-MDLCJASB.mjs.map → chunk-EPY3432E.mjs.map} +1 -1
- package/dist/chunk-F2M4YDDQ.mjs +3 -0
- package/dist/{chunk-OZNST3EZ.mjs.map → chunk-F2M4YDDQ.mjs.map} +1 -1
- package/dist/chunk-FHMFDCX2.mjs +3 -0
- package/dist/{chunk-4NJE7D6X.mjs.map → chunk-FHMFDCX2.mjs.map} +1 -1
- package/dist/chunk-HBIUCLFL.mjs +3 -0
- package/dist/chunk-HBIUCLFL.mjs.map +1 -0
- package/dist/chunk-HEBXAFRY.mjs +3 -0
- package/dist/{chunk-KJZGOL2Z.mjs.map → chunk-HEBXAFRY.mjs.map} +1 -1
- package/dist/chunk-IG47LMOD.mjs +3 -0
- package/dist/{chunk-42RGFEL2.mjs.map → chunk-IG47LMOD.mjs.map} +1 -1
- package/dist/chunk-J47ZEXEL.mjs +3 -0
- package/dist/{chunk-3CCF7U3P.mjs.map → chunk-J47ZEXEL.mjs.map} +1 -1
- package/dist/chunk-K2FOFIST.mjs +3 -0
- package/dist/{chunk-IJSYSNM5.mjs.map → chunk-K2FOFIST.mjs.map} +1 -1
- package/dist/chunk-LL6QPRD7.mjs +3 -0
- package/dist/{chunk-TZ4YSHMC.mjs.map → chunk-LL6QPRD7.mjs.map} +1 -1
- package/dist/chunk-NMJLOK6M.mjs +3 -0
- package/dist/{chunk-KYRIUUQP.mjs.map → chunk-NMJLOK6M.mjs.map} +1 -1
- package/dist/chunk-O24K56OS.mjs +3 -0
- package/dist/chunk-O24K56OS.mjs.map +1 -0
- package/dist/chunk-OIWG3IJ7.mjs +3 -0
- package/dist/chunk-OIWG3IJ7.mjs.map +1 -0
- package/dist/chunk-OLLU7ZFH.mjs +3 -0
- package/dist/{chunk-XL4KTJ4L.mjs.map → chunk-OLLU7ZFH.mjs.map} +1 -1
- package/dist/chunk-Q76JW7X5.mjs +73 -0
- package/dist/chunk-Q76JW7X5.mjs.map +1 -0
- package/dist/chunk-QEMPERUK.mjs +3 -0
- package/dist/chunk-QEMPERUK.mjs.map +1 -0
- package/dist/chunk-QRM66RQG.mjs +3 -0
- package/dist/{chunk-N56BUOCD.mjs.map → chunk-QRM66RQG.mjs.map} +1 -1
- package/dist/chunk-QRRP7TGF.mjs +13 -0
- package/dist/{chunk-RS6RKW5U.mjs.map → chunk-QRRP7TGF.mjs.map} +1 -1
- package/dist/chunk-SD6XGDAC.mjs +3 -0
- package/dist/chunk-SD6XGDAC.mjs.map +1 -0
- package/dist/chunk-SDFVGFXT.mjs +3 -0
- package/dist/{chunk-CVWWS25A.mjs.map → chunk-SDFVGFXT.mjs.map} +1 -1
- package/dist/chunk-SMLDNOV3.mjs +8 -0
- package/dist/{chunk-ZXZIHU7J.mjs.map → chunk-SMLDNOV3.mjs.map} +1 -1
- package/dist/{chunk-FX57OSYG.mjs → chunk-TAP6MYDW.mjs} +2 -2
- package/dist/{chunk-FX57OSYG.mjs.map → chunk-TAP6MYDW.mjs.map} +1 -1
- package/dist/{chunk-WP7VFE77.mjs → chunk-TBZ645BI.mjs} +2 -2
- package/dist/{chunk-WP7VFE77.mjs.map → chunk-TBZ645BI.mjs.map} +1 -1
- package/dist/{chunk-TXBZZJNR.mjs → chunk-V2DNYJR6.mjs} +2 -2
- package/dist/{chunk-TXBZZJNR.mjs.map → chunk-V2DNYJR6.mjs.map} +1 -1
- package/dist/{chunk-Z74YUUVT.mjs → chunk-VBABZXL7.mjs} +2 -2
- package/dist/{chunk-Z74YUUVT.mjs.map → chunk-VBABZXL7.mjs.map} +1 -1
- package/dist/chunk-WYBSHTGY.mjs +3 -0
- package/dist/{chunk-DYNBM24D.mjs.map → chunk-WYBSHTGY.mjs.map} +1 -1
- package/dist/chunk-ZQUMJQYV.mjs +3 -0
- package/dist/chunk-ZQUMJQYV.mjs.map +1 -0
- package/dist/chunk-ZY23NOT4.mjs +3 -0
- package/dist/chunk-ZY23NOT4.mjs.map +1 -0
- package/dist/components/Action.d.ts.map +1 -1
- package/dist/components/Badge.d.ts +1 -1
- package/dist/components/Button.d.ts.map +1 -1
- package/dist/components/DatePicker.d.ts.map +1 -1
- package/dist/components/Dropdown.d.ts +0 -50
- package/dist/components/Dropdown.d.ts.map +1 -1
- package/dist/components/Icon/Icon.d.ts.map +1 -1
- package/dist/components/Modal.d.ts.map +1 -1
- package/dist/components/Popover.d.ts.map +1 -1
- package/dist/components/Progress.d.ts +2 -2
- package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
- package/dist/components/advanced/Carousel.d.ts.map +1 -1
- package/dist/components/advanced/ImageReveal.d.ts.map +1 -1
- package/dist/components/advanced/Parallax.d.ts +9 -6
- package/dist/components/advanced/Parallax.d.ts.map +1 -1
- package/dist/components/advanced/TextReveal.d.ts.map +1 -1
- package/dist/data.mjs +2 -2
- package/dist/data.mjs.map +1 -1
- package/dist/feedback.mjs +1 -1
- package/dist/form.mjs +4 -4
- package/dist/form.mjs.map +1 -1
- package/dist/{icons-DmhQEH_E.d.mts → icons-DcOBy9Hf.d.mts} +4 -0
- package/dist/iconsax-extended.mjs +2 -2
- package/dist/iconsax-extended.mjs.map +1 -1
- package/dist/index.d.mts +6 -87
- package/dist/index.mjs +14 -14
- package/dist/index.mjs.map +1 -1
- package/dist/interactive.mjs +1 -1
- package/dist/interactive.mjs.map +1 -1
- package/dist/landing.mjs +7 -7
- package/dist/landing.mjs.map +1 -1
- package/dist/lib/icon-providers.d.ts +9 -25
- package/dist/lib/icon-providers.d.ts.map +1 -1
- package/dist/lib/icons.d.ts +4 -0
- package/dist/lib/icons.d.ts.map +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/navigation.d.mts +1 -1
- package/dist/navigation.mjs +1 -1
- package/dist/navigation.mjs.map +1 -1
- package/dist/overlay.d.mts +0 -50
- package/dist/overlay.mjs +1 -1
- package/dist/overlay.mjs.map +1 -1
- package/dist/sdui.mjs +1 -1
- package/dist/sdui.mjs.map +1 -1
- package/dist/theme.d.mts +85 -0
- package/dist/theme.d.ts +14 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.mjs +3 -0
- package/dist/theme.mjs.map +1 -0
- package/package.json +18 -14
- package/dist/advanced-dashboard.js +0 -39
- package/dist/advanced-dashboard.js.map +0 -1
- package/dist/advanced-emotion.js +0 -2
- package/dist/advanced-emotion.js.map +0 -1
- package/dist/advanced-motion.js +0 -82
- package/dist/advanced-motion.js.map +0 -1
- package/dist/advanced.js +0 -112
- package/dist/advanced.js.map +0 -1
- package/dist/chunk-3CCF7U3P.mjs +0 -3
- package/dist/chunk-3GAUTZXQ.mjs +0 -3
- package/dist/chunk-42RGFEL2.mjs +0 -3
- package/dist/chunk-4NJE7D6X.mjs +0 -3
- package/dist/chunk-6HVJFEDA.mjs +0 -3
- package/dist/chunk-7OYT3QSY.mjs +0 -3
- package/dist/chunk-7OYT3QSY.mjs.map +0 -1
- package/dist/chunk-ANYZ56VB.mjs +0 -3
- package/dist/chunk-ANYZ56VB.mjs.map +0 -1
- package/dist/chunk-AOSXB5JJ.mjs +0 -4
- package/dist/chunk-B544MRF7.mjs +0 -3
- package/dist/chunk-B544MRF7.mjs.map +0 -1
- package/dist/chunk-CVWWS25A.mjs +0 -3
- package/dist/chunk-DYNBM24D.mjs +0 -3
- package/dist/chunk-IJSYSNM5.mjs +0 -3
- package/dist/chunk-KJZGOL2Z.mjs +0 -3
- package/dist/chunk-KYRIUUQP.mjs +0 -3
- package/dist/chunk-LSA7DU3N.mjs +0 -73
- package/dist/chunk-LSA7DU3N.mjs.map +0 -1
- package/dist/chunk-MDLCJASB.mjs +0 -3
- package/dist/chunk-N56BUOCD.mjs +0 -3
- package/dist/chunk-OFYITQXI.mjs +0 -13
- package/dist/chunk-OFYITQXI.mjs.map +0 -1
- package/dist/chunk-OZNST3EZ.mjs +0 -3
- package/dist/chunk-RS6RKW5U.mjs +0 -13
- package/dist/chunk-TZ4YSHMC.mjs +0 -3
- package/dist/chunk-U6CTBZ2U.mjs +0 -3
- package/dist/chunk-U6CTBZ2U.mjs.map +0 -1
- package/dist/chunk-XCZMLKPK.mjs +0 -3
- package/dist/chunk-XCZMLKPK.mjs.map +0 -1
- package/dist/chunk-XGHT7WMO.mjs +0 -3
- package/dist/chunk-XGHT7WMO.mjs.map +0 -1
- package/dist/chunk-XL4KTJ4L.mjs +0 -3
- package/dist/chunk-ZXZIHU7J.mjs +0 -8
- package/dist/data.js +0 -3
- package/dist/data.js.map +0 -1
- package/dist/feedback.js +0 -12
- package/dist/feedback.js.map +0 -1
- package/dist/form.js +0 -8
- package/dist/form.js.map +0 -1
- package/dist/iconsax-extended.js +0 -3
- package/dist/iconsax-extended.js.map +0 -1
- package/dist/iconsax.js +0 -3
- package/dist/iconsax.js.map +0 -1
- package/dist/index.js +0 -51
- package/dist/index.js.map +0 -1
- package/dist/interactive.js +0 -2
- package/dist/interactive.js.map +0 -1
- package/dist/landing.js +0 -100
- package/dist/landing.js.map +0 -1
- package/dist/lib/phosphor-icons.d.ts +0 -6
- package/dist/lib/phosphor-icons.d.ts.map +0 -1
- package/dist/navigation.js +0 -12
- package/dist/navigation.js.map +0 -1
- package/dist/overlay.js +0 -3
- package/dist/overlay.js.map +0 -1
- package/dist/sdui.js +0 -9
- package/dist/sdui.js.map +0 -1
package/dist/form.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../src/components/Form.tsx","../src/components/FormControl.tsx","../src/components/Label.tsx","../src/lib/styles/cva-base.ts","../src/components/Input.tsx","../src/components/NumberInput.tsx","../src/components/Textarea.tsx","../src/components/Select.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/Radio.tsx","../src/components/Switch.tsx","../src/components/Slider.tsx","../src/components/Popover.tsx","../src/components/Button.variants.ts","../src/lib/Slot.tsx","../src/components/Button.tsx","../src/components/DatePicker.tsx","../src/components/Upload.tsx","../src/components/Autocomplete.tsx","../src/components/ColorPicker.tsx"],"names":["merge","inputs","twMerge","clsx","mergeMap","classMap","classes","condition","className","cn","Form","React","children","onSubmit","variant","props","ref","jsx","e","FormField","error","required","errorId","enhancedChildren","child","childProps","childType","isFormComponent","typeObj","displayName","name","isNativeFormElement","existingAriaDescribedBy","ariaDescribedBy","jsxs","FormGroup","inline","FormControl","label","description","htmlFor","showErrorIcon","suppressBrowserValidation","hasError","originalOnInvalid","ErrorIcon","VALIDATION_PRESETS","useFormValidation","initialErrors","errors","setErrors","validate","rules","newErrors","field","rule","value","type","minLength","maxLength","min","max","pattern","custom","messages","stringValue","preset","customError","clearError","prev","next","clearAllErrors","labelVariants","cva","Label","disabled","FORM_STATE","inputVariants","Input","success","ariaInvalid","isInvalid","NumberInput","controlledValue","defaultValue","step","onChange","size","showButtons","buttonLayout","internalValue","setInternalValue","isControlled","currentValue","updateValue","newValue","clampedValue","increment","decrement","handleInputChange","inputValue","handleBlur","_a","handleKeyDown","sizes","buttonBase","canDecrement","canIncrement","ChevronUp","ChevronDown","Minus","Plus","textareaVariants","Textarea","resize","selectVariants","Select","leftIcon","placeholder","ariaLabel","selectRef","combinedRef","node","isFocused","setIsFocused","SelectOption","icons","House","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","ListIcon","X","MagnifyingGlass","Gear","ArrowSquareOut","CaretLeft","CaretRight","CaretDown","CaretUp","Pencil","Trash","Download","Upload","ArrowClockwise","FloppyDisk","Copy","SpinnerGap","CheckCircle","XCircle","WarningCircle","Info","Check","Circle","Question","User","Users","UserPlus","SignIn","SignOut","Eye","EyeSlash","ChartBar","TrendUp","Pulse","Database","Lightning","FileText","File","Folder","Book","BookOpen","Envelope","ChatCircle","Phone","Image","Video","Camera","Smiley","SmileySad","SmileyMeh","Lock","LockOpen","Shield","Wallet","Key","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","Sparkle","Globe","DeviceMobile","Ticket","Clipboard","WifiHigh","WifiSlash","Cpu","MaskHappy","Rocket","Layout","Megaphone","Stack","Prohibit","TextB","TextItalic","TextStrikethrough","TextHOne","Link","Code","FileCode","Quotes","List","ListNumbers","emotionIcons","statusIcons","toCamelCase","str","word","index","PhosphorIcons","LucideIcons","PROJECT_ICONS","initPhosphorIcons","initLucideIcons","getIconFromProvider","iconName","provider","iconMapping","getIconDirect","mappedName","phosphorName1","phosphorName2","lucideName","camelCaseName","match","getIconNameForProvider","ICON_ALIASES","normalizeIconName","camelCased","aliasTarget","defaultIconConfig","IconContext","createContext","useIconContext","useContext","IconComponent","emotion","status","weight","animated","pulse","spin","bounce","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","Checkbox","id","generatedId","checkboxId","labelId","descriptionId","sizeClasses","iconSizes","stateClasses","isChecked","needsReadOnly","Radio","radioId","dotSizes","Switch","switchId","thumbSizes","thumbTranslate","Slider","showValue","showLabel","onValueChange","orientation","isRange","handleChange","newRange","thumbVariantClasses","thumbSizeClasses","orientationClasses","renderSlider","renderValue","val","_","Popover","trigger","controlledOpen","onOpenChange","position","align","offset","contentClassName","fullWidth","internalOpen","setInternalOpen","triggerRef","popoverRef","isOpen","handleOpenChange","newOpen","handleTriggerClick","handleClickOutside","event","getPositionClasses","baseClasses","getAlignmentClasses","getArrowClasses","PopoverTrigger","PopoverContent","springTransition","buttonVariants","gradientPresets","composeRefs","refs","composeEventHandlers","parentHandler","childHandler","mergeClassName","slotClassName","childClassName","mergeStyle","slotStyle","childStyle","mergeProps","slotProps","mergedProps","propName","slotValue","childValue","isSlottable","Slot","forwardedRef","childArray","childRef","mergedRef","isBrowser","useReducedMotion","reduce","setReduce","mq","ButtonInner","loading","icon","iconPosition","gradient","customGradient","rounded","shadow","hover","iconOnly","asChild","rest","reduced","gradientClass","base","content","Fragment","onClick","target","rel","href","_ariaLabel","anchorClassName","anchorProps","isDisabled","handleAnchorClick","buttonClassName","btnProps","Button","formatDate","date","format","_locale","year","month","day","getDaysInMonth","getFirstDayOfMonth","DatePicker","minDate","maxDate","dateFormat","locale","markedDates","setIsOpen","currentMonth","setCurrentMonth","hoveredDate","setHoveredDate","displayDate","handleDateSelect","handlePrevMonth","handleNextMonth","handleToday","today","daysInMonth","firstDay","weekDaysMap","weekDays","formatMonth","loc","todayText","ariaLabels","formatDateAriaLabel","isDateDisabled","isDateSelected","isToday","isMarkedDate","marked","calendarDays","i","remainingDays","triggerButton","isCurrentMonth","isSelected","isTodayDate","isMarked","isHovered","buttonStyle","formatFileSize","bytes","k","getFileIcon","files","onRemove","multiple","accept","maxSize","maxFiles","dragDrop","fileInputRef","isDragging","setIsDragging","handleFileSelect","selectedFiles","fileArray","validFiles","file","handleClick","handleDragOver","handleDragLeave","handleDrop","handleRemove","Autocomplete","options","maxHeight","clearable","filterable","onSearch","emptyText","setInputValue","filteredOptions","setFilteredOptions","selectedIndex","setSelectedIndex","isSearching","setIsSearching","inputRef","dropdownRef","selectedOption","opt","result","filtered","option","handleInputFocus","handleInputBlur","handleOptionSelect","handleClear","isValueSelected","TAILWIND_PALETTE","SPECIAL_COLORS","hexToHsl","hex","r","g","b","h","s","l","d","hslToHex","a","f","color","isValidColor","SaturationLightnessPicker","hue","saturation","lightness","boxRef","useRef","useCallback","clientX","clientY","rect","x","y","newS","newL","handleMouseDown","useEffect","handleMouseMove","handleMouseUp","cursorX","cursorY","HueSlider","TailwindTab","currentColor","onColorSelect","colorName","shades","idx","CustomTab","hexInput","onHslChange","onHexInputChange","newH","ColorPicker","activeTab","setActiveTab","useState","setH","setS","setL","setHexInput","handleHslChange","handleHexInputChange","handleColorSelect"],"mappings":"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","file":"form.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 ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Form 컴포넌트의 props / Form component props\n * @typedef {Object} FormProps\n * @property {(e: React.FormEvent<HTMLFormElement>) => void} [onSubmit] - 폼 제출 핸들러 / Form submit handler\n * @property {\"default\" | \"glass\"} [variant=\"default\"] - Form 스타일 변형 / Form style variant\n * @extends {React.FormHTMLAttributes<HTMLFormElement>}\n */\nexport interface FormProps extends React.FormHTMLAttributes<HTMLFormElement> {\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void\n variant?: \"default\" | \"glass\"\n}\n\n/**\n * FormField 컴포넌트의 props / FormField component props\n * @typedef {Object} FormFieldProps\n * @property {string} [error] - 에러 메시지 / Error message\n * @property {boolean} [required=false] - 필수 필드 여부 / Required field\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface FormFieldProps extends React.HTMLAttributes<HTMLDivElement> {\n error?: string\n required?: boolean\n}\n\n/**\n * FormGroup 컴포넌트의 props / FormGroup component props\n * @typedef {Object} FormGroupProps\n * @property {boolean} [inline=false] - 인라인 레이아웃 여부 / Inline layout\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface FormGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n inline?: boolean\n}\n\n/**\n * Form 컴포넌트 / Form component\n * \n * 폼 컨테이너 컴포넌트입니다.\n * FormField, FormGroup과 함께 사용하여 구조화된 폼을 구성합니다.\n * \n * Form container component.\n * Used with FormField and FormGroup to create structured forms.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Form onSubmit={(e) => { e.preventDefault(); console.log('제출') }}>\n * <FormField>\n * <Label>이름</Label>\n * <Input />\n * </FormField>\n * </Form>\n * \n * @example\n * // Glass 스타일 / Glass style\n * <Form variant=\"glass\" onSubmit={handleSubmit}>\n * <FormGroup>\n * <FormField>\n * <Label>이메일</Label>\n * <Input type=\"email\" />\n * </FormField>\n * </FormGroup>\n * </Form>\n * \n * @param {FormProps} props - Form 컴포넌트의 props / Form component props\n * @param {React.Ref<HTMLFormElement>} ref - form 요소 ref / form element ref\n * @returns {JSX.Element} Form 컴포넌트 / Form component\n */\nconst Form = React.forwardRef<HTMLFormElement, FormProps>(\n ({ \n className, \n children, \n onSubmit,\n variant = \"default\",\n ...props \n }, ref) => {\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n onSubmit?.(e)\n }\n\n const variantClasses = {\n default: \"space-y-6\",\n glass: \"space-y-6 bg-white/10 backdrop-blur-sm border border-white/20 rounded-xl p-6 shadow-xl dark:bg-slate-800/20 dark:border-slate-700/50\"\n }\n\n return (\n <form\n ref={ref}\n onSubmit={handleSubmit}\n className={merge(variantClasses[variant], className)}\n {...props}\n >\n {children}\n </form>\n )\n }\n)\nForm.displayName = \"Form\"\n\n/**\n * FormField 컴포넌트 / FormField component\n * \n * 폼 필드를 감싸는 컨테이너입니다.\n * 에러 메시지를 표시하고 필수 필드 표시를 지원합니다.\n * \n * Container that wraps a form field.\n * Displays error messages and supports required field indication.\n * \n * @component\n * @example\n * <FormField error=\"이 필드는 필수입니다\" required>\n * <Label>이름</Label>\n * <Input />\n * </FormField>\n * \n * @param {FormFieldProps} props - FormField 컴포넌트의 props / FormField component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} FormField 컴포넌트 / FormField component\n */\nconst FormField = React.forwardRef<HTMLDivElement, FormFieldProps>(\n ({ \n className, \n children, \n error,\n required,\n ...props \n }, ref) => {\n const errorId = React.useId()\n\n // 자식 요소에 aria-describedby와 aria-invalid 연결\n // Connect aria-describedby and aria-invalid to child elements\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n const childProps = child.props as Record<string, unknown>\n const childType = child.type\n \n // Input, Select, Textarea 컴포넌트 확인\n // Check for Input, Select, Textarea components\n let isFormComponent = false\n if (typeof childType === 'object' && childType !== null) {\n const typeObj = childType as Record<string, unknown>\n const displayName = typeObj.displayName as string | undefined\n const name = typeObj.name as string | undefined\n isFormComponent = \n displayName === 'Input' || \n displayName === 'Select' || \n displayName === 'Textarea' ||\n name === 'Input' || \n name === 'Select' || \n name === 'Textarea'\n }\n \n // 네이티브 HTML 요소 확인\n // Check for native HTML elements\n const isNativeFormElement = \n typeof childType === 'string' &&\n ['input', 'select', 'textarea'].includes(childType.toLowerCase())\n \n if (isFormComponent || isNativeFormElement) {\n const existingAriaDescribedBy = childProps['aria-describedby'] as string | undefined\n const ariaDescribedBy = error \n ? existingAriaDescribedBy \n ? `${existingAriaDescribedBy} ${errorId}`\n : errorId\n : existingAriaDescribedBy\n \n return React.cloneElement(child, {\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': error ? true : childProps['aria-invalid'],\n required: required || childProps.required,\n } as Record<string, unknown>)\n }\n }\n return child\n })\n\n return (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)}\n {...props}\n >\n {enhancedChildren}\n {error && (\n <p \n id={errorId}\n className=\"text-sm text-red-600 dark:text-red-400\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {error}\n </p>\n )}\n </div>\n )\n }\n)\nFormField.displayName = \"FormField\"\n\n/**\n * FormGroup 컴포넌트 / FormGroup component\n * \n * 여러 폼 필드를 그룹화하는 컨테이너입니다.\n * Container that groups multiple form fields.\n * \n * @component\n * @example\n * <FormGroup inline>\n * <FormField>\n * <Label>이름</Label>\n * <Input />\n * </FormField>\n * <FormField>\n * <Label>성</Label>\n * <Input />\n * </FormField>\n * </FormGroup>\n * \n * @param {FormGroupProps} props - FormGroup 컴포넌트의 props / FormGroup component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} FormGroup 컴포넌트 / FormGroup component\n */\nconst FormGroup = React.forwardRef<HTMLDivElement, FormGroupProps>(\n ({ \n className, \n children, \n inline = false,\n ...props \n }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n inline ? \"flex gap-4\" : \"space-y-4\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nFormGroup.displayName = \"FormGroup\"\n\nexport { Form, FormField, FormGroup } ","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\n\n/**\n * FormControl 컴포넌트의 props / FormControl component props\n * @typedef {Object} FormControlProps\n * @property {string} [label] - 필드 레이블 / Field label\n * @property {string} [description] - 필드 설명 / Field description\n * @property {string} [error] - 에러 메시지 / Error message\n * @property {boolean} [required=false] - 필수 필드 표시 / Required field indicator\n * @property {string} [htmlFor] - 레이블의 for 속성 / Label's for attribute\n * @property {boolean} [showErrorIcon=true] - 에러 아이콘 표시 / Show error icon\n * @property {boolean} [suppressBrowserValidation=true] - 브라우저 유효성 검사 UI 숨기기 / Hide browser validation UI\n * @property {React.ReactNode} children - 폼 입력 요소 / Form input element\n */\nexport interface FormControlProps {\n label?: string;\n description?: string;\n error?: string;\n required?: boolean;\n htmlFor?: string;\n showErrorIcon?: boolean;\n suppressBrowserValidation?: boolean;\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * FormControl 컴포넌트 / FormControl component\n *\n * 폼 입력 요소를 감싸서 레이블, 설명, 에러 메시지를 표시합니다.\n * 브라우저 기본 유효성 검사 팝업 대신 커스텀 에러 메시지를 사용합니다.\n *\n * Wraps form input elements with label, description, and error messages.\n * Uses custom error messages instead of browser default validation popups.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <FormControl label=\"Email\" required error={errors.email}>\n * <Input type=\"email\" />\n * </FormControl>\n *\n * @example\n * // 설명 포함 / With description\n * <FormControl\n * label=\"Password\"\n * description=\"Must be at least 8 characters\"\n * error={errors.password}\n * >\n * <Input type=\"password\" />\n * </FormControl>\n */\nfunction FormControl({\n label,\n description,\n error,\n required = false,\n htmlFor,\n showErrorIcon = true,\n suppressBrowserValidation = true,\n className,\n children,\n}: FormControlProps) {\n const hasError = !!error;\n\n // Clone children to add aria-invalid and suppress browser validation\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n const childProps: Record<string, unknown> = {\n \"aria-invalid\": hasError || undefined,\n \"aria-describedby\": hasError ? `${htmlFor}-error` : undefined,\n };\n\n // Suppress browser validation tooltip by handling onInvalid\n if (suppressBrowserValidation) {\n childProps.onInvalid = (e: React.FormEvent) => {\n e.preventDefault();\n // Call original onInvalid if exists\n const originalOnInvalid = (child.props as Record<string, unknown>).onInvalid;\n if (typeof originalOnInvalid === \"function\") {\n originalOnInvalid(e);\n }\n };\n }\n\n return React.cloneElement(child, childProps);\n }\n return child;\n });\n\n return (\n <div className={merge(\"space-y-2\", className)}>\n {/* Label */}\n {label && (\n <label\n htmlFor={htmlFor}\n className={merge(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n hasError && \"text-destructive\"\n )}\n >\n {label}\n {required && (\n <span className=\"text-destructive ml-1\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n\n {/* Description */}\n {description && !hasError && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n\n {/* Input - with :invalid styling support */}\n <div className=\"relative [&_input:invalid]:border-destructive/50 [&_select:invalid]:border-destructive/50 [&_textarea:invalid]:border-destructive/50\">\n {enhancedChildren}\n </div>\n\n {/* Error Message */}\n {hasError && (\n <div\n id={htmlFor ? `${htmlFor}-error` : undefined}\n className=\"flex items-start gap-2 text-sm text-destructive\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {showErrorIcon && <ErrorIcon className=\"w-4 h-4 mt-0.5 flex-shrink-0\" />}\n <span>{error}</span>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * useFormValidation 훅 / useFormValidation hook\n *\n * 폼 유효성 검사를 위한 훅입니다.\n * 브라우저 기본 유효성 검사를 비활성화하고 커스텀 에러 메시지를 사용합니다.\n *\n * Hook for form validation.\n * Disables browser default validation and uses custom error messages.\n *\n * @example\n * const { errors, validate, clearError } = useFormValidation();\n *\n * const handleSubmit = (e) => {\n * e.preventDefault();\n * const isValid = validate({\n * email: { value: email, required: true, pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/ },\n * password: { value: password, required: true, minLength: 8 },\n * });\n * if (isValid) { ... }\n * };\n */\n/**\n * Validation preset types for common field formats\n */\ntype ValidationPreset = \"email\" | \"phone\" | \"url\" | \"alphanumeric\" | \"password\";\n\n/**\n * Preset validation patterns and error messages\n */\nconst VALIDATION_PRESETS: Record<ValidationPreset, { pattern: RegExp; message: string }> = {\n email: {\n pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n message: \"Invalid email format\",\n },\n phone: {\n pattern: /^[\\d\\s\\-+()]{10,}$/,\n message: \"Invalid phone number format\",\n },\n url: {\n pattern: /^https?:\\/\\/.+\\..+/,\n message: \"Invalid URL format (must start with http:// or https://)\",\n },\n alphanumeric: {\n pattern: /^[a-zA-Z0-9]+$/,\n message: \"Only letters and numbers are allowed\",\n },\n password: {\n pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$/,\n message: \"Must contain at least 8 characters with uppercase, lowercase, and number\",\n },\n};\n\ninterface ValidationRule {\n value: string | number | boolean;\n type?: ValidationPreset;\n required?: boolean;\n minLength?: number;\n maxLength?: number;\n min?: number;\n max?: number;\n pattern?: RegExp;\n custom?: (value: string | number | boolean) => string | undefined;\n messages?: {\n required?: string;\n type?: string;\n minLength?: string;\n maxLength?: string;\n min?: string;\n max?: string;\n pattern?: string;\n };\n}\n\ntype ValidationRules = Record<string, ValidationRule>;\ntype ValidationErrors = Record<string, string>;\n\nfunction useFormValidation(initialErrors: ValidationErrors = {}) {\n const [errors, setErrors] = React.useState<ValidationErrors>(initialErrors);\n\n const validate = React.useCallback((rules: ValidationRules): boolean => {\n const newErrors: ValidationErrors = {};\n\n for (const [field, rule] of Object.entries(rules)) {\n const { value, type, required, minLength, maxLength, min, max, pattern, custom, messages = {} } = rule;\n const stringValue = String(value);\n\n // Required check\n if (required && (!value || stringValue.trim() === \"\")) {\n newErrors[field] = messages.required || \"This field is required\";\n continue;\n }\n\n // Skip other validations if empty and not required\n if (!value || stringValue.trim() === \"\") continue;\n\n // Type preset check (email, phone, url, alphanumeric, password)\n if (type) {\n const preset = VALIDATION_PRESETS[type];\n if (preset && !preset.pattern.test(stringValue)) {\n newErrors[field] = messages.type || preset.message;\n continue;\n }\n }\n\n // MinLength check\n if (minLength !== undefined && stringValue.length < minLength) {\n newErrors[field] = messages.minLength || `Must be at least ${minLength} characters`;\n continue;\n }\n\n // MaxLength check\n if (maxLength !== undefined && stringValue.length > maxLength) {\n newErrors[field] = messages.maxLength || `Must be at most ${maxLength} characters`;\n continue;\n }\n\n // Min check (for numbers)\n if (min !== undefined && typeof value === \"number\" && value < min) {\n newErrors[field] = messages.min || `Must be at least ${min}`;\n continue;\n }\n\n // Max check (for numbers)\n if (max !== undefined && typeof value === \"number\" && value > max) {\n newErrors[field] = messages.max || `Must be at most ${max}`;\n continue;\n }\n\n // Pattern check (for custom patterns, overrides type preset)\n if (pattern && !pattern.test(stringValue)) {\n newErrors[field] = messages.pattern || \"Invalid format\";\n continue;\n }\n\n // Custom validation\n if (custom) {\n const customError = custom(value);\n if (customError) {\n newErrors[field] = customError;\n }\n }\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n }, []);\n\n const clearError = React.useCallback((field: string) => {\n setErrors((prev) => {\n const next = { ...prev };\n delete next[field];\n return next;\n });\n }, []);\n\n const clearAllErrors = React.useCallback(() => {\n setErrors({});\n }, []);\n\n return { errors, validate, clearError, clearAllErrors, setErrors };\n}\n\n// Error icon component\nfunction ErrorIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n );\n}\n\nexport { FormControl, useFormValidation, VALIDATION_PRESETS };\nexport type { ValidationRule, ValidationRules, ValidationErrors, ValidationPreset };\n","\"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 * 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 { merge } from \"../lib/utils\";\n\n/**\n * NumberInput 컴포넌트의 props / NumberInput component props\n * @typedef {Object} NumberInputProps\n * @property {number} [value] - 현재 값 / Current value\n * @property {number} [defaultValue=0] - 기본 값 / Default value\n * @property {number} [min] - 최소 값 / Minimum value\n * @property {number} [max] - 최대 값 / Maximum value\n * @property {number} [step=1] - 증감 단위 / Step amount\n * @property {(value: number) => void} [onChange] - 값 변경 콜백 / Value change callback\n * @property {boolean} [disabled=false] - 비활성화 / Disabled state\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {boolean} [showButtons=true] - +/- 버튼 표시 / Show +/- buttons\n * @property {\"horizontal\" | \"vertical\"} [buttonLayout=\"horizontal\"] - 버튼 배치 / Button layout\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface NumberInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"value\" | \"defaultValue\" | \"size\" | \"type\"> {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n showButtons?: boolean;\n buttonLayout?: \"horizontal\" | \"vertical\";\n}\n\n/**\n * NumberInput 컴포넌트 / NumberInput component\n *\n * 숫자 입력을 위한 컴포넌트로, 커스텀 +/- 버튼을 제공합니다.\n * 브라우저 기본 스피너 대신 스타일링된 버튼을 사용합니다.\n *\n * Number input component with custom +/- buttons.\n * Uses styled buttons instead of browser default spinners.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <NumberInput value={count} onChange={setCount} />\n *\n * @example\n * // 범위 지정 / With range\n * <NumberInput min={0} max={100} step={5} />\n *\n * @example\n * // 세로 버튼 / Vertical buttons\n * <NumberInput buttonLayout=\"vertical\" />\n */\nconst NumberInput = React.forwardRef<HTMLInputElement, NumberInputProps>(\n (\n {\n value: controlledValue,\n defaultValue = 0,\n min,\n max,\n step = 1,\n onChange,\n disabled = false,\n size = \"md\",\n showButtons = true,\n buttonLayout = \"horizontal\",\n className,\n ...props\n },\n ref\n ) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n const updateValue = React.useCallback(\n (newValue: number) => {\n // Clamp to min/max\n let clampedValue = newValue;\n if (min !== undefined) clampedValue = Math.max(min, clampedValue);\n if (max !== undefined) clampedValue = Math.min(max, clampedValue);\n\n if (!isControlled) {\n setInternalValue(clampedValue);\n }\n onChange?.(clampedValue);\n },\n [isControlled, min, max, onChange]\n );\n\n const increment = () => {\n if (disabled) return;\n updateValue(currentValue + step);\n };\n\n const decrement = () => {\n if (disabled) return;\n updateValue(currentValue - step);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n // Allow empty string, minus sign alone (for typing negative numbers), or valid numbers\n if (inputValue === \"\" || inputValue === \"-\") {\n return;\n }\n const newValue = parseFloat(inputValue);\n if (!isNaN(newValue)) {\n // If min is set, enforce it on direct input\n if (min !== undefined && newValue < min) {\n updateValue(min);\n } else {\n updateValue(newValue);\n }\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n // On blur, ensure value is within bounds\n if (min !== undefined && currentValue < min) {\n updateValue(min);\n }\n if (max !== undefined && currentValue > max) {\n updateValue(max);\n }\n props.onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n increment();\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n decrement();\n }\n };\n\n // Spacing system: 4px grid\n // sm: h-8 (32px), px-2 (8px), gap-1 (4px)\n // md: h-10 (40px), px-3 (12px), gap-2 (8px)\n // lg: h-12 (48px), px-4 (16px), gap-2 (8px)\n const sizeClasses = {\n sm: {\n input: \"h-8 text-sm px-2 py-1\",\n button: \"w-8 h-8 text-sm\",\n wrapper: \"gap-1\",\n },\n md: {\n input: \"h-10 text-sm px-3 py-2\",\n button: \"w-10 h-10 text-sm\",\n wrapper: \"gap-2\",\n },\n lg: {\n input: \"h-12 text-base px-4 py-2.5\",\n button: \"w-12 h-12 text-base\",\n wrapper: \"gap-2\",\n },\n };\n\n const sizes = sizeClasses[size];\n\n const buttonBase = merge(\n \"flex items-center justify-center rounded-md border border-input bg-background\",\n \"hover:bg-secondary hover:border-primary/50 active:scale-95\",\n \"transition-all duration-150\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-background\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n sizes.button\n );\n\n const canDecrement = min === undefined || currentValue > min;\n const canIncrement = max === undefined || currentValue < max;\n\n if (buttonLayout === \"vertical\") {\n return (\n <div className={merge(\"inline-flex items-center\", sizes.wrapper, className)}>\n <div className=\"flex flex-col gap-0.5\">\n <button\n type=\"button\"\n onClick={increment}\n disabled={disabled || !canIncrement}\n className={merge(buttonBase, \"rounded-b-none h-[calc(50%-1px)]\")}\n aria-label=\"Increase\"\n >\n <ChevronUp className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={decrement}\n disabled={disabled || !canDecrement}\n className={merge(buttonBase, \"rounded-t-none h-[calc(50%-1px)]\")}\n aria-label=\"Decrease\"\n >\n <ChevronDown className=\"w-3 h-3\" />\n </button>\n </div>\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n pattern={min !== undefined && min >= 0 ? \"[0-9]*\" : \"-?[0-9]*\"}\n value={currentValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n disabled={disabled}\n className={merge(\n \"w-16 text-center rounded-md border border-input bg-background\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\",\n sizes.input\n )}\n {...props}\n />\n </div>\n );\n }\n\n return (\n <div className={merge(\"inline-flex items-center\", sizes.wrapper, className)}>\n {showButtons && (\n <button\n type=\"button\"\n onClick={decrement}\n disabled={disabled || !canDecrement}\n className={buttonBase}\n aria-label=\"Decrease\"\n >\n <Minus className=\"w-3.5 h-3.5\" />\n </button>\n )}\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n pattern={min !== undefined && min >= 0 ? \"[0-9]*\" : \"-?[0-9]*\"}\n value={currentValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n disabled={disabled}\n className={merge(\n \"w-16 text-center rounded-md border border-input bg-background\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\",\n sizes.input\n )}\n {...props}\n />\n {showButtons && (\n <button\n type=\"button\"\n onClick={increment}\n disabled={disabled || !canIncrement}\n className={buttonBase}\n aria-label=\"Increase\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n );\n }\n);\n\nNumberInput.displayName = \"NumberInput\";\n\n// Simple icon components to avoid external dependency\nfunction Minus({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 12H4\" />\n </svg>\n );\n}\n\nfunction Plus({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n );\n}\n\nfunction ChevronUp({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n );\n}\n\nfunction ChevronDown({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\nexport { NumberInput };\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\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const selectVariants = cva(\n \"flex w-full appearance-none rounded-md border transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-ring focus:ring-offset-2 hover:border-accent-foreground hover:shadow-sm disabled:cursor-not-allowed disabled:opacity-50\",\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 focus:border-ring/50 focus:ring-ring/20 focus:bg-white/20\",\n },\n size: {\n sm: \"h-8 pl-2 text-sm\",\n md: \"h-10 pl-3 text-sm\",\n lg: \"h-12 pl-4 text-base\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n }\n)\n\n/**\n * Select 컴포넌트의 props / Select component props\n */\nexport interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n leftIcon?: React.ReactNode\n placeholder?: string\n}\n\n/**\n * SelectOption 컴포넌트의 props / SelectOption component props\n * @typedef {Object} SelectOptionProps\n * @property {string} value - 옵션 값 / Option value\n * @property {React.ReactNode} children - 옵션 표시 텍스트 / Option display text\n * @extends {React.OptionHTMLAttributes<HTMLOptionElement>}\n */\nexport interface SelectOptionProps extends React.OptionHTMLAttributes<HTMLOptionElement> {\n value: string\n children: React.ReactNode\n}\n\n/**\n * Select 컴포넌트 / Select component\n * \n * 드롭다운 선택 메뉴를 제공하는 컴포넌트입니다.\n * 다양한 스타일 변형과 크기를 지원하며, 접근성 속성을 포함합니다.\n * \n * Dropdown selection menu component.\n * Supports various style variants and sizes, includes accessibility attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Select>\n * <option value=\"option1\">옵션 1</option>\n * <option value=\"option2\">옵션 2</option>\n * </Select>\n * \n * @example\n * // 에러 상태와 아이콘 / Error state with icon\n * <Select \n * error \n * leftIcon={<Icon name=\"alert\" />}\n * aria-label=\"국가 선택\"\n * >\n * <option value=\"\">국가를 선택하세요</option>\n * <option value=\"kr\">한국</option>\n * <option value=\"us\">미국</option>\n * </Select>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Select variant=\"outline\" size=\"lg\">\n * <option value=\"1\">항목 1</option>\n * </Select>\n * \n * @param {SelectProps} props - Select 컴포넌트의 props / Select component props\n * @param {React.Ref<HTMLSelectElement>} ref - select 요소 ref / select element ref\n * @returns {JSX.Element} Select 컴포넌트 / Select component\n */\nconst Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n leftIcon,\n placeholder,\n children,\n \"aria-label\": ariaLabel,\n \"aria-invalid\": ariaInvalid,\n ...props \n }, ref) => {\n const selectRef = React.useRef<HTMLSelectElement>(null)\n const combinedRef = React.useCallback((node: HTMLSelectElement | null) => {\n selectRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLSelectElement | null>).current = node\n }\n }, [ref])\n \n const [isFocused, setIsFocused] = React.useState(false)\n\n return (\n <div className=\"relative\">\n {leftIcon && (\n <div className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground pointer-events-none z-10\">\n {leftIcon}\n </div>\n )}\n <select\n ref={combinedRef}\n className={merge(\n selectVariants({ variant, size }),\n error && FORM_STATE.error,\n success && FORM_STATE.success,\n leftIcon ? \"pl-10\" : \"\",\n \"pr-10\",\n className\n )}\n aria-label={ariaLabel || (placeholder ? undefined : \"선택\")}\n aria-invalid={ariaInvalid !== undefined ? ariaInvalid : (error || undefined)}\n onFocus={(e) => {\n setIsFocused(true)\n props.onFocus?.(e)\n }}\n onBlur={(e) => {\n setIsFocused(false)\n props.onBlur?.(e)\n }}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {children}\n </select>\n <div className={merge(\n \"absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none\",\n \"transition-transform duration-200 ease-out\",\n isFocused && \"rotate-180\"\n )}>\n <svg\n className=\"w-4 h-4 text-muted-foreground\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </div>\n </div>\n )\n }\n)\nSelect.displayName = \"Select\"\n\nconst SelectOption = React.forwardRef<HTMLOptionElement, SelectOptionProps>(\n ({ className, ...props }, ref) => (\n <option\n className={className || \"\"}\n ref={ref}\n {...props}\n />\n )\n)\nSelectOption.displayName = \"SelectOption\"\n\nexport { Select, SelectOption } ","/**\n * Core Icons (Phosphor Icons)\n *\n * 핵심 아이콘만 포함하여 번들 크기를 최적화합니다.\n * 나머지 아이콘은 동적 fallback으로 처리됩니다.\n *\n * 포함 기준:\n * 1. my-app에서 실제 사용 중인 아이콘\n * 2. UI 컴포넌트에서 자주 사용되는 아이콘\n * 3. 각 카테고리의 대표 아이콘\n *\n * 새로운 아이콘이 필요하면 동적 fallback이 자동으로 처리합니다.\n */\n\nimport {\n // Navigation\n House,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowDown,\n List as ListIcon,\n X,\n MagnifyingGlass,\n Gear,\n ArrowSquareOut,\n CaretLeft,\n CaretRight,\n CaretDown,\n CaretUp,\n\n // Actions\n Pencil,\n Trash,\n Plus,\n Minus,\n Download,\n Upload,\n ArrowClockwise,\n FloppyDisk,\n Copy,\n\n // Text Formatting (Markdown Toolbar)\n TextB,\n TextItalic,\n TextStrikethrough,\n TextHOne,\n Link,\n Code,\n FileCode,\n Quotes,\n List,\n ListNumbers,\n\n // Status & Feedback\n SpinnerGap,\n CheckCircle,\n XCircle,\n WarningCircle,\n Info,\n Check,\n Circle,\n Question,\n\n // User & Auth\n User,\n Users,\n UserPlus,\n SignIn,\n SignOut,\n Eye,\n EyeSlash,\n\n // Data & Analytics\n ChartBar,\n TrendUp,\n Pulse,\n Database,\n Lightning,\n\n // Files & Content\n FileText,\n File,\n Folder,\n Book,\n BookOpen,\n\n // Communication\n Envelope,\n ChatCircle,\n Phone,\n\n // Media\n Image,\n Video,\n Camera,\n\n // Emotions\n Smiley,\n SmileySad,\n SmileyMeh,\n\n // Security\n Lock,\n LockOpen,\n Shield,\n Wallet,\n Key,\n\n // Time & Date\n Clock,\n Calendar,\n CalendarPlus,\n\n // UI Elements\n Bell,\n Heart,\n Star,\n Bookmark,\n Share,\n\n // Theme\n Monitor,\n Sun,\n Moon,\n\n // Additional\n Lightbulb,\n Brain,\n Flag,\n Square,\n Sparkle,\n Globe,\n DeviceMobile,\n Ticket,\n Clipboard,\n WifiHigh,\n WifiSlash,\n Cpu,\n MaskHappy,\n Rocket,\n\n // Admin\n Layout,\n Megaphone,\n Stack,\n Prohibit,\n} from '@phosphor-icons/react/dist/ssr'\n\n// 핵심 아이콘 객체 (키는 기존과 동일, 값만 Phosphor로 교체)\nexport const icons = {\n // Navigation\n home: House,\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n arrowUp: ArrowUp,\n arrowDown: ArrowDown,\n menu: ListIcon,\n close: X,\n search: MagnifyingGlass,\n settings: Gear,\n externalLink: ArrowSquareOut,\n chevronLeft: CaretLeft,\n chevronRight: CaretRight,\n chevronDown: CaretDown,\n chevronUp: CaretUp,\n\n // Actions\n edit: Pencil,\n delete: Trash,\n add: Plus,\n remove: Minus,\n download: Download,\n upload: Upload,\n refresh: ArrowClockwise,\n save: FloppyDisk,\n copy: Copy,\n\n // Status & Feedback\n loader: SpinnerGap,\n success: CheckCircle,\n error: XCircle,\n alertCircle: WarningCircle,\n warning: WarningCircle,\n info: Info,\n check: Check,\n circle: Circle,\n helpCircle: Question,\n\n // User & Auth\n user: User,\n users: Users,\n userPlus: UserPlus,\n logIn: SignIn,\n logOut: SignOut,\n eye: Eye,\n eyeOff: EyeSlash,\n\n // Data & Analytics\n chart: ChartBar,\n barChart: ChartBar,\n trendingUp: TrendUp,\n activity: Pulse,\n database: Database,\n zap: Lightning,\n\n // Files & Content\n fileText: FileText,\n file: File,\n folder: Folder,\n book: Book,\n bookOpen: BookOpen,\n\n // Communication\n mail: Envelope,\n message: ChatCircle,\n phone: Phone,\n\n // Media\n image: Image,\n video: Video,\n camera: Camera,\n\n // Emotions\n smile: Smiley,\n frown: SmileySad,\n meh: SmileyMeh,\n\n // Security\n lock: Lock,\n unlock: LockOpen,\n shield: Shield,\n wallet: Wallet,\n key: Key,\n\n // Time & Date\n clock: Clock,\n calendar: Calendar,\n calendarPlus: CalendarPlus,\n\n // UI Elements\n bell: Bell,\n heart: Heart,\n star: Star,\n bookmark: Bookmark,\n share: Share,\n\n // Theme\n monitor: Monitor,\n sun: Sun,\n moon: Moon,\n\n // Additional\n lightbulb: Lightbulb,\n brain: Brain,\n flag: Flag,\n square: Square,\n sparkle: Sparkle,\n sparkles: Sparkle,\n globe: Globe,\n smartphone: DeviceMobile,\n deviceMobile: DeviceMobile,\n floppyDisk: FloppyDisk,\n\n // Connectivity\n ticket: Ticket,\n clipboard: Clipboard,\n wifi: WifiHigh,\n wifiOff: WifiSlash,\n cpu: Cpu,\n mask: MaskHappy,\n rocket: Rocket,\n\n // Admin\n layout: Layout,\n megaphone: Megaphone,\n layers: Stack,\n ban: Prohibit,\n\n // Text Formatting (Markdown Toolbar)\n bold: TextB,\n italic: TextItalic,\n strikethrough: TextStrikethrough,\n heading: TextHOne,\n link: Link,\n code: Code,\n fileCode: FileCode,\n quote: Quotes,\n list: List,\n listOrdered: ListNumbers,\n minus: Minus,\n} as const\n\n// 아이콘 이름 타입\nexport type IconName = keyof typeof icons\n\n// 감정별 아이콘 매핑\nexport const emotionIcons = {\n happy: 'smile',\n sad: 'frown',\n neutral: 'meh',\n excited: 'smile',\n angry: 'frown',\n love: 'heart',\n like: 'heart',\n dislike: 'frown',\n} as const\n\n// 상태별 아이콘 매핑\nexport const statusIcons = {\n loading: 'loader',\n success: 'success',\n error: 'error',\n warning: 'warning',\n info: 'info',\n locked: 'lock',\n unlocked: 'unlock',\n visible: 'eye',\n hidden: 'eyeOff',\n} as const\n\n// 아이콘 카테고리별 그룹화 (참고용)\nexport const iconCategories = {\n navigation: ['home', 'arrowLeft', 'arrowRight', 'arrowUp', 'arrowDown', 'menu', 'close', 'search', 'settings', 'externalLink', 'chevronLeft', 'chevronRight', 'chevronDown', 'chevronUp'],\n actions: ['edit', 'delete', 'add', 'remove', 'download', 'upload', 'refresh', 'save', 'copy'],\n status: ['loader', 'success', 'error', 'alertCircle', 'warning', 'info', 'check', 'circle'],\n user: ['user', 'users', 'userPlus', 'logIn', 'logOut', 'eye', 'eyeOff'],\n data: ['chart', 'barChart', 'trendingUp', 'activity', 'database', 'zap'],\n files: ['fileText', 'file', 'folder', 'book'],\n communication: ['mail', 'message', 'phone'],\n media: ['image', 'video', 'camera'],\n emotions: ['smile', 'frown', 'meh'],\n security: ['lock', 'unlock', 'shield'],\n time: ['clock', 'calendar'],\n ui: ['bell', 'heart', 'star', 'bookmark', 'share'],\n theme: ['monitor', 'sun', 'moon'],\n} as const\n","/**\n * Case Conversion Utilities\n *\n * 문자열 케이스 변환 유틸리티 함수들입니다.\n * Utility functions for string case conversion.\n */\n\n/**\n * 문자열을 camelCase로 변환합니다.\n * Converts a string to camelCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns camelCase 문자열 / camelCase string\n *\n * @example\n * toCamelCase('arrow-left') // 'arrowLeft'\n * toCamelCase('arrow_left') // 'arrowLeft'\n * toCamelCase('ArrowLeft') // 'arrowLeft'\n * toCamelCase('arrowLeft') // 'arrowLeft'\n * toCamelCase('HEART') // 'heart'\n */\nexport function toCamelCase(str: string): string {\n if (!str) return str\n\n // 이미 camelCase인지 확인 (kebab/snake가 아니고 첫 글자가 소문자)\n if (!/[-_]/.test(str) && /^[a-z]/.test(str)) {\n return str\n }\n\n // 전체가 대문자인 경우 (HEART, USER 등) → 전체 소문자로\n if (/^[A-Z]+$/.test(str)) {\n return str.toLowerCase()\n }\n\n // PascalCase를 camelCase로 변환 (ArrowLeft → arrowLeft)\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str.charAt(0).toLowerCase() + str.slice(1)\n }\n\n // kebab-case 또는 snake_case를 camelCase로 변환\n return str\n .split(/[-_]/)\n .map((word, index) => {\n if (index === 0) {\n return word.toLowerCase()\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n })\n .join('')\n}\n\n/**\n * 문자열을 PascalCase로 변환합니다.\n * Converts a string to PascalCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns PascalCase 문자열 / PascalCase string\n *\n * @example\n * toPascalCase('arrow-left') // 'ArrowLeft'\n * toPascalCase('arrow_left') // 'ArrowLeft'\n * toPascalCase('arrowLeft') // 'ArrowLeft'\n * toPascalCase('ArrowLeft') // 'ArrowLeft'\n */\nexport function toPascalCase(str: string): string {\n if (!str) return str\n\n // 이미 PascalCase인지 확인\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str\n }\n\n // kebab-case 또는 snake_case가 포함된 경우\n if (/[-_]/.test(str)) {\n return str\n .split(/[-_]/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n }\n\n // camelCase를 PascalCase로 변환\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n","/**\n * Icon Provider System\n *\n * 각 프로바이더별 로딩 전략 / Loading strategies per provider:\n *\n * 1. Phosphor Icons (https://phosphoricons.com) - default\n * - Official package: @phosphor-icons/react (MIT License)\n * - icons.ts에서 정적 import (SSR-safe /dist/ssr)\n * - PROJECT_ICONS 매핑으로 통합 이름 지원\n * - 폴백: initPhosphorIcons()로 동적 namespace 조회\n *\n * 2. Lucide Icons (https://lucide.dev) - deprecated, backward compat\n * - initLucideIcons() 호출 시에만 로드 / Lazy loaded on demand\n * - 향후 제거 예정 / Will be removed in future\n *\n * 3. Iconsax Icons (https://iconsax.io) - separate entry\n * - '@hua-labs/ui/iconsax'에서 import 시 자동 등록\n * - 코어 번들에 포함되지 않음 / Not in core bundle\n * - registerIconsaxResolver()로 lazy 연결\n */\n\nimport { toPascalCase } from './case-utils'\n\n// Phosphor Icons - lazy loaded (전체 namespace import 방지, createContext SSR 이슈)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet PhosphorIcons: any = null\n\n// Lucide Icons - lazy loaded (하위호환, deprecated)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet LucideIcons: any = null\n\n// Iconsax resolver - registered lazily when iconsax entry is loaded\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet iconsaxResolver: ((name: string, variant?: string) => any) | null = null\n\n/**\n * Register iconsax resolver (called from iconsax entry point).\n * Allows the core Icon component to resolve iconsax icons\n * without statically importing the iconsax bundle.\n */\nexport function registerIconsaxResolver(resolver: typeof iconsaxResolver) {\n iconsaxResolver = resolver\n}\n\n/**\n * Get registered iconsax resolver\n */\nexport function getIconsaxResolver() {\n return iconsaxResolver\n}\n\n// Icon Provider Type\nexport type IconProvider = 'lucide' | 'phosphor' | 'iconsax'\n\n// Icon Provider Configuration\nexport interface IconProviderConfig {\n provider: IconProvider\n prefix?: string\n}\n\n/**\n * Project-specific icon list\n * These are the icons actually used in SumUp project\n * Only these icons will be loaded for optimal bundle size\n */\nexport const PROJECT_ICONS = {\n // Navigation & Layout\n 'home': { lucide: 'Home', phosphor: 'House', iconsax: 'Home2' },\n 'layout-dashboard': { lucide: 'LayoutDashboard', phosphor: 'SquaresFour' },\n 'folder': { lucide: 'Folder', phosphor: 'Folder', iconsax: 'Folder' },\n 'alert-circle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'alertCircle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'columns': { lucide: 'Columns', phosphor: 'Columns' },\n 'users': { lucide: 'Users', phosphor: 'Users', iconsax: 'People' },\n 'settings': { lucide: 'Settings', phosphor: 'Gear' },\n 'menu': { lucide: 'Menu', phosphor: 'List', iconsax: 'Menu' },\n 'close': { lucide: 'X', phosphor: 'X', iconsax: 'CloseCircle' },\n 'chevronLeft': { lucide: 'ChevronLeft', phosphor: 'CaretLeft', iconsax: 'ArrowLeft2' },\n 'chevronRight': { lucide: 'ChevronRight', phosphor: 'CaretRight', iconsax: 'ArrowRight2' },\n 'chevronDown': { lucide: 'ChevronDown', phosphor: 'CaretDown', iconsax: 'ArrowDown2' },\n 'chevronUp': { lucide: 'ChevronUp', phosphor: 'CaretUp', iconsax: 'ArrowUp2' },\n 'arrowLeft': { lucide: 'ArrowLeft', phosphor: 'ArrowLeft', iconsax: 'ArrowLeft' },\n 'arrowRight': { lucide: 'ArrowRight', phosphor: 'ArrowRight', iconsax: 'ArrowRight' },\n 'arrowUp': { lucide: 'ArrowUp', phosphor: 'ArrowUp', iconsax: 'ArrowUp' },\n 'arrowDown': { lucide: 'ArrowDown', phosphor: 'ArrowDown', iconsax: 'ArrowDown' },\n\n // Actions\n 'add': { lucide: 'Plus', phosphor: 'Plus', iconsax: 'Add' },\n 'edit': { lucide: 'Edit', phosphor: 'Pencil' },\n 'pencil': { lucide: 'Pencil', phosphor: 'Pencil' },\n 'delete': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'trash': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'upload': { lucide: 'Upload', phosphor: 'Upload', iconsax: 'Upload' },\n 'download': { lucide: 'Download', phosphor: 'Download', iconsax: 'Download' },\n 'x': { lucide: 'X', phosphor: 'X' },\n 'check': { lucide: 'Check', phosphor: 'Check', iconsax: 'Check' },\n 'search': { lucide: 'Search', phosphor: 'MagnifyingGlass', iconsax: 'SearchNormal' },\n 'share': { lucide: 'Share', phosphor: 'Share' },\n 'copy': { lucide: 'Copy', phosphor: 'Copy' },\n 'save': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Status & Feedback\n 'loader': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'loader2': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'check-circle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'checkCircle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'success': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'error': { lucide: 'XCircle', phosphor: 'XCircle', iconsax: 'CloseCircle' },\n 'warning': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Warning2' },\n 'info': { lucide: 'Info', phosphor: 'Info', iconsax: 'InfoCircle' },\n 'refresh': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'refreshCw': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'bell': { lucide: 'Bell', phosphor: 'Bell', iconsax: 'Bell' },\n 'heart': { lucide: 'Heart', phosphor: 'Heart', iconsax: 'Heart' },\n 'star': { lucide: 'Star', phosphor: 'Star', iconsax: 'Star' },\n 'bookmark': { lucide: 'Bookmark', phosphor: 'Bookmark' },\n\n // User & Auth\n 'user': { lucide: 'User', phosphor: 'User', iconsax: 'User' },\n 'userPlus': { lucide: 'UserPlus', phosphor: 'UserPlus', iconsax: 'UserAdd' },\n 'logIn': { lucide: 'LogIn', phosphor: 'SignIn', iconsax: 'Login' },\n 'logOut': { lucide: 'LogOut', phosphor: 'SignOut', iconsax: 'Logout' },\n 'chrome': { lucide: 'Chrome', phosphor: 'ChromeLogo', iconsax: 'Chrome' },\n 'github': { lucide: 'Github', phosphor: 'GithubLogo' },\n 'message': { lucide: 'MessageCircle', phosphor: 'ChatCircle' },\n\n // Content\n 'messageSquare': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'message-square': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'inbox': { lucide: 'Inbox', phosphor: 'Inbox' },\n 'calendar': { lucide: 'Calendar', phosphor: 'Calendar' },\n 'calendarPlus': { lucide: 'CalendarPlus', phosphor: 'CalendarPlus' },\n 'checkSquare': { lucide: 'CheckSquare', phosphor: 'CheckSquare', iconsax: 'TickSquare' },\n 'clock': { lucide: 'Clock', phosphor: 'Clock' },\n 'book': { lucide: 'Book', phosphor: 'Book', iconsax: 'Book' },\n 'bookOpen': { lucide: 'BookOpen', phosphor: 'BookOpen', iconsax: 'Book' },\n\n // Theme & UI\n 'monitor': { lucide: 'Monitor', phosphor: 'Monitor', iconsax: 'Monitor' },\n 'sun': { lucide: 'Sun', phosphor: 'Sun', iconsax: 'Sun' },\n 'moon': { lucide: 'Moon', phosphor: 'Moon', iconsax: 'Moon' },\n\n // AI & Features\n 'sparkle': { lucide: 'Sparkle', phosphor: 'Sparkle' },\n 'sparkles': { lucide: 'Sparkles', phosphor: 'Sparkle' },\n 'lightbulb': { lucide: 'Lightbulb', phosphor: 'Lightbulb' },\n 'brain': { lucide: 'Brain', phosphor: 'Brain' },\n 'zap': { lucide: 'Zap', phosphor: 'Lightning' },\n\n // Device & Platform\n 'globe': { lucide: 'Globe', phosphor: 'Globe', iconsax: 'Global' },\n 'deviceMobile': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'smartphone': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'floppyDisk': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Data & Analytics\n 'chart': { lucide: 'BarChart3', phosphor: 'ChartBar' },\n 'barChart': { lucide: 'BarChart', phosphor: 'ChartBar' },\n 'trendingUp': { lucide: 'TrendingUp', phosphor: 'TrendUp' },\n 'trendingDown': { lucide: 'TrendingDown', phosphor: 'TrendDown' },\n 'activity': { lucide: 'Activity', phosphor: 'Pulse' },\n 'database': { lucide: 'Database', phosphor: 'Database' },\n 'dollarSign': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'dollar': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'currency': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n\n 'layers': { lucide: 'Layers', phosphor: 'Stack' },\n 'ban': { lucide: 'Ban', phosphor: 'Prohibit' },\n\n // Security\n 'lock': { lucide: 'Lock', phosphor: 'Lock', iconsax: 'Lock' },\n 'unlock': { lucide: 'Unlock', phosphor: 'LockOpen', iconsax: 'Unlock' },\n 'shield': { lucide: 'Shield', phosphor: 'Shield', iconsax: 'Shield' },\n 'key': { lucide: 'Key', phosphor: 'Key' },\n\n // Media\n 'play': { lucide: 'Play', phosphor: 'Play', iconsax: 'Play' },\n 'pause': { lucide: 'Pause', phosphor: 'Pause', iconsax: 'Pause' },\n 'image': { lucide: 'Image', phosphor: 'Image', iconsax: 'Image' },\n 'video': { lucide: 'Video', phosphor: 'Video', iconsax: 'Video' },\n 'camera': { lucide: 'Camera', phosphor: 'Camera', iconsax: 'Camera' },\n\n // Files\n 'fileText': { lucide: 'FileText', phosphor: 'FileText' },\n 'file': { lucide: 'File', phosphor: 'File' },\n\n // Navigation\n 'externalLink': { lucide: 'ExternalLink', phosphor: 'ArrowSquareOut' },\n 'link': { lucide: 'Link', phosphor: 'Link', iconsax: 'Link' },\n 'moreHorizontal': { lucide: 'MoreHorizontal', phosphor: 'DotsThreeOutline' },\n 'moreVertical': { lucide: 'MoreVertical', phosphor: 'DotsThreeVertical' },\n\n // Priority\n 'remove': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n\n // Eye (password)\n 'eye': { lucide: 'Eye', phosphor: 'Eye', iconsax: 'Eye' },\n 'eyeOff': { lucide: 'EyeOff', phosphor: 'EyeSlash', iconsax: 'EyeSlash' },\n\n // Emotions\n 'smile': { lucide: 'Smile', phosphor: 'Smiley', iconsax: 'EmojiHappy' },\n 'frown': { lucide: 'Frown', phosphor: 'SmileySad', iconsax: 'EmojiSad' },\n 'meh': { lucide: 'Meh', phosphor: 'SmileyMeh', iconsax: 'EmojiNormal' },\n\n // Social\n 'mail': { lucide: 'Mail', phosphor: 'Envelope' },\n 'phone': { lucide: 'Phone', phosphor: 'Phone' },\n\n // Additional\n 'flag': { lucide: 'Flag', phosphor: 'Flag', iconsax: 'Flag' },\n 'rocket': { lucide: 'Rocket', phosphor: 'Rocket', iconsax: 'Rocket' },\n\n // Connectivity & Misc\n 'ticket': { lucide: 'Ticket', phosphor: 'Ticket', iconsax: 'Ticket' },\n 'clipboard': { lucide: 'ClipboardList', phosphor: 'Clipboard', iconsax: 'Sticker' },\n 'wifi': { lucide: 'Wifi', phosphor: 'WifiHigh', iconsax: 'Wifi' },\n 'wifiOff': { lucide: 'WifiOff', phosphor: 'WifiSlash' },\n 'cpu': { lucide: 'Cpu', phosphor: 'Cpu', iconsax: 'Computing' },\n 'mask': { lucide: 'Drama', phosphor: 'MaskHappy', iconsax: 'EmojiHappy' },\n\n // Text Formatting (Markdown Toolbar)\n 'bold': { lucide: 'Bold', phosphor: 'TextB' },\n 'italic': { lucide: 'Italic', phosphor: 'TextItalic' },\n 'strikethrough': { lucide: 'Strikethrough', phosphor: 'TextStrikethrough' },\n 'heading': { lucide: 'Heading', phosphor: 'TextHOne' },\n 'code': { lucide: 'Code', phosphor: 'Code', iconsax: 'Code' },\n 'fileCode': { lucide: 'FileCode', phosphor: 'FileCode' },\n 'quote': { lucide: 'Quote', phosphor: 'Quotes', iconsax: 'QuoteUp' },\n 'list': { lucide: 'List', phosphor: 'List' },\n 'listOrdered': { lucide: 'ListOrdered', phosphor: 'ListNumbers' },\n 'minus': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n} as const\n\n/**\n * Initialize Phosphor Icons (lazy load for fallback/dynamic lookup)\n * icons.ts의 개별 import와 별개로, PROJECT_ICONS fallback용\n */\nexport async function initPhosphorIcons() {\n if (typeof window === 'undefined') return null\n\n if (!PhosphorIcons) {\n try {\n const phosphorModule = await import('@phosphor-icons/react')\n PhosphorIcons = phosphorModule\n } catch {\n console.warn('Phosphor Icons not available. Install @phosphor-icons/react to use.')\n return null\n }\n }\n return PhosphorIcons\n}\n\n/**\n * Initialize Lucide Icons (lazy load)\n */\nexport async function initLucideIcons() {\n if (typeof window === 'undefined') return null\n\n if (!LucideIcons) {\n try {\n const lucideModule = await import('lucide-react')\n LucideIcons = lucideModule\n } catch {\n console.warn('Lucide Icons not available. Install lucide-react to use lucide provider.')\n return null\n }\n }\n return LucideIcons\n}\n\n/**\n * Get icon from provider\n * Only resolves icons that are in PROJECT_ICONS for optimal bundle size\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nexport function getIconFromProvider(\n iconName: string,\n provider: IconProvider = 'phosphor'\n): React.ComponentType<Record<string, unknown>> | null {\n // Check if icon is in project icon list\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n\n if (!iconMapping) {\n // Fallback to direct lookup for backward compatibility\n return getIconDirect(iconName, provider)\n }\n\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n\n switch (provider) {\n case 'phosphor':\n if (!mappedName || !PhosphorIcons) return null\n return PhosphorIcons?.[mappedName] || null\n\n case 'lucide':\n if (!mappedName || !LucideIcons) {\n return null\n }\n return LucideIcons?.[mappedName] || null\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = mappedName || toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Direct icon lookup (fallback for icons not in PROJECT_ICONS)\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nfunction getIconDirect(\n iconName: string,\n provider: IconProvider\n): React.ComponentType<Record<string, unknown>> | null {\n switch (provider) {\n case 'phosphor': {\n if (!PhosphorIcons) return null\n const phosphorName1 = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const phosphorName2 = iconName\n .split(/(?=[A-Z])/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n return PhosphorIcons?.[phosphorName1] ||\n PhosphorIcons?.[phosphorName2] ||\n PhosphorIcons?.[iconName] ||\n null\n }\n\n case 'lucide': {\n if (!LucideIcons) {\n return null\n }\n const lucideName = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const camelCaseName = iconName.replace(/([A-Z])/g, (match) =>\n match === iconName[0] ? match.toLowerCase() : match\n )\n return LucideIcons?.[lucideName] ||\n LucideIcons?.[iconName] ||\n LucideIcons?.[camelCaseName] ||\n null\n }\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Get icon name for provider\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 프로바이더별 아이콘 이름 / Icon name for provider\n */\nexport function getIconNameForProvider(\n iconName: string,\n provider: IconProvider\n): string {\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (iconMapping) {\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n if (mappedName) {\n return mappedName\n }\n }\n return iconName\n}\n\n/**\n * Get all project icon names\n */\nexport function getProjectIconNames(): string[] {\n return Object.keys(PROJECT_ICONS)\n}\n","/**\n * Icon Aliases\n * \n * 여러 이름이 같은 아이콘을 가리키도록 하는 alias 시스템\n * DX 향상을 위해 직관적인 이름들을 지원합니다.\n */\n\nexport const ICON_ALIASES: Record<string, string> = {\n // kebab-case → camelCase mappings (자동 변환 지원)\n 'arrow-left': 'arrowLeft',\n 'arrow-right': 'arrowRight',\n 'arrow-up': 'arrowUp',\n 'arrow-down': 'arrowDown',\n 'chevron-left': 'chevronLeft',\n 'chevron-right': 'chevronRight',\n 'chevron-up': 'chevronUp',\n 'chevron-down': 'chevronDown',\n 'external-link': 'externalLink',\n 'more-horizontal': 'moreHorizontal',\n 'more-vertical': 'moreVertical',\n 'user-plus': 'userPlus',\n 'log-in': 'logIn',\n 'log-out': 'logOut',\n 'check-circle': 'checkCircle',\n 'check-square': 'checkSquare',\n 'alert-circle': 'alertCircle',\n 'eye-off': 'eyeOff',\n 'file-text': 'fileText',\n 'book-open': 'bookOpen',\n 'bar-chart': 'barChart',\n 'trending-up': 'trendingUp',\n 'trending-down': 'trendingDown',\n 'message-square': 'messageSquare',\n 'calendar-plus': 'calendarPlus',\n 'refresh-cw': 'refreshCw',\n 'dollar-sign': 'dollarSign',\n 'layout-dashboard': 'layoutDashboard',\n 'device-mobile': 'deviceMobile',\n 'floppy-disk': 'floppyDisk',\n\n // Navigation aliases\n 'back': 'arrowLeft',\n 'prev': 'arrowLeft',\n 'previous': 'arrowLeft',\n 'forward': 'arrowRight',\n 'next': 'arrowRight',\n \n // Close aliases\n 'close': 'x',\n 'cancel': 'x',\n \n // Delete aliases\n 'remove': 'delete',\n 'trash': 'delete',\n \n // Add aliases\n 'plus': 'add',\n 'new': 'add',\n \n // Edit aliases\n 'pencil': 'edit',\n 'modify': 'edit',\n \n // Save aliases\n 'store': 'save',\n 'floppy': 'save',\n \n // Search aliases\n 'magnify': 'search',\n \n // User aliases\n 'person': 'user',\n 'account': 'user',\n 'profile': 'user',\n \n // Settings aliases\n 'gear': 'settings',\n 'config': 'settings',\n 'preferences': 'settings',\n \n // Home aliases\n 'house': 'home',\n 'main': 'home',\n \n // Check aliases\n 'done': 'check',\n 'complete': 'check',\n 'tick': 'check',\n \n // Info aliases\n 'information': 'info',\n 'help': 'info',\n \n // Warning aliases\n 'alert': 'warning',\n 'caution': 'warning',\n \n // Success aliases\n 'checkmark': 'success',\n 'checkCircle': 'success',\n \n // Error aliases\n 'fail': 'error',\n 'cross': 'error',\n 'xCircle': 'error',\n \n // Loading aliases\n 'spinner': 'loader',\n 'loading': 'loader',\n 'wait': 'loader',\n \n // Refresh aliases\n 'reload': 'refresh',\n 'update': 'refresh',\n 'sync': 'refresh',\n \n // Eye aliases\n 'show': 'eye',\n 'view': 'eye',\n 'hide': 'eyeOff',\n 'hidden': 'eyeOff',\n \n // Lock aliases\n 'secure': 'lock',\n 'locked': 'lock',\n 'unsecure': 'unlock',\n 'unlocked': 'unlock',\n \n // Download aliases\n 'get': 'download',\n 'fetch': 'download',\n \n // Upload aliases\n 'post': 'upload',\n \n // Share aliases\n 'send': 'share',\n 'export': 'share',\n \n // Copy aliases\n 'duplicate': 'copy',\n 'clone': 'copy',\n \n // Mail aliases\n 'email': 'mail',\n 'envelope': 'mail',\n \n // Message aliases\n 'chat': 'message',\n 'comment': 'message',\n 'talk': 'message',\n \n // Calendar aliases\n 'date': 'calendar',\n 'schedule': 'calendar',\n \n // Clock aliases\n 'time': 'clock',\n 'watch': 'clock',\n \n // File aliases\n 'document': 'fileText',\n 'doc': 'fileText',\n 'text': 'fileText',\n \n // Folder aliases\n 'directory': 'folder',\n 'dir': 'folder',\n \n // Image aliases\n 'picture': 'image',\n 'img': 'image',\n \n // Video aliases\n 'movie': 'video',\n 'film': 'video',\n \n // Camera aliases\n 'photo': 'camera',\n 'capture': 'camera',\n \n // Play aliases\n 'start': 'play',\n 'run': 'play',\n \n // Pause aliases\n 'stop': 'pause',\n 'halt': 'pause',\n \n // Heart aliases\n 'like': 'heart',\n 'love': 'heart',\n \n // Star aliases\n 'favorite': 'star',\n \n // Bookmark aliases\n 'saveBookmark': 'bookmark',\n \n // Bell aliases\n 'notification': 'bell',\n 'notify': 'bell',\n 'alarm': 'bell',\n \n // Settings aliases\n 'prefs': 'settings',\n \n // Search aliases (duplicate removed - see line 37)\n 'lookup': 'search',\n \n // More aliases\n 'dots': 'moreHorizontal',\n 'moreMenu': 'moreHorizontal',\n 'moreOptions': 'moreVertical',\n \n // External link aliases\n 'external': 'externalLink',\n 'outbound': 'externalLink',\n 'open': 'externalLink',\n \n // Link aliases\n 'url': 'link',\n 'hyperlink': 'link',\n \n // Chart aliases\n 'graph': 'barChart',\n 'stats': 'barChart',\n 'analytics': 'barChart',\n \n // Database aliases\n 'db': 'database',\n 'storage': 'database',\n \n // Activity aliases\n 'pulse': 'activity',\n 'monitor': 'activity',\n \n // Trending aliases\n 'up': 'trendingUp',\n 'down': 'trendingDown',\n \n // Zap aliases\n 'lightning': 'zap',\n 'bolt': 'zap',\n 'flash': 'zap',\n \n // Shield aliases\n 'security': 'shield',\n 'protect': 'shield',\n \n // Key aliases\n 'password': 'key',\n 'secret': 'key',\n \n // Log in aliases\n 'signin': 'logIn',\n 'login': 'logIn',\n 'enter': 'logIn',\n \n // Log out aliases\n 'signout': 'logOut',\n 'logout': 'logOut',\n 'exit': 'logOut',\n \n // Users aliases\n 'people': 'users',\n 'group': 'users',\n 'team': 'users',\n \n // User plus aliases\n 'addUser': 'userPlus',\n 'invite': 'userPlus',\n \n // Book aliases\n 'read': 'book',\n 'library': 'book',\n \n // Book open aliases\n 'reading': 'bookOpen',\n 'openBook': 'bookOpen',\n \n // Sun aliases\n 'light': 'sun',\n 'day': 'sun',\n \n // Moon aliases\n 'dark': 'moon',\n 'night': 'moon',\n \n // Monitor aliases\n 'screen': 'monitor',\n 'display': 'monitor',\n \n // Brain aliases\n 'ai': 'brain',\n 'intelligence': 'brain',\n 'think': 'brain',\n \n // Lightbulb aliases\n 'idea': 'lightbulb',\n 'bulb': 'lightbulb',\n 'inspiration': 'lightbulb',\n \n // Sparkles aliases\n 'magic': 'sparkles',\n 'stars': 'sparkles',\n 'glitter': 'sparkles',\n} as const\n\n/**\n * Resolve icon alias to actual icon name\n * \n * @param iconName - 아이콘 이름 또는 별칭 / Icon name or alias\n * @returns 실제 아이콘 이름 / Actual icon name\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function resolveIconAlias(iconName: string): string {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return ICON_ALIASES[iconName] || iconName;\n}\n\n/**\n * Get all aliases for an icon name\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @returns 해당 아이콘의 모든 별칭 배열 / Array of all aliases for the icon\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function getIconAliases(iconName: string): string[] {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return Object.entries(ICON_ALIASES)\n .filter(([_, target]) => target === iconName)\n .map(([alias]) => alias);\n}\n\n\n","/**\n * Icon Name Normalization System\n *\n * 아이콘 이름 정규화를 위한 통합 시스템입니다.\n *\n * Features:\n * - kebab-case → camelCase conversion\n * - snake_case → camelCase conversion\n * - PascalCase → camelCase conversion\n * - Alias resolution\n * - Provider-specific name mapping\n */\n\nimport { ICON_ALIASES } from './icon-aliases'\nimport { toCamelCase, toPascalCase } from './case-utils'\n\n// Re-export case utils for backward compatibility\nexport { toCamelCase, toPascalCase } from './case-utils'\n\n// IconProvider type (avoid circular dependency with icon-providers.ts)\nexport type IconProviderType = 'lucide' | 'phosphor' | 'iconsax'\n\n/**\n * 정규화 결과 인터페이스\n */\nexport interface NormalizeResult {\n /** 정규화된 아이콘 이름 (camelCase) */\n normalized: string\n /** 원본 이름이 alias였는지 여부 */\n wasAlias: boolean\n /** 원본 alias 이름 (alias였던 경우) */\n originalAlias?: string\n}\n\n/**\n * 아이콘 이름을 정규화합니다.\n *\n * @example\n * normalizeIconName('arrow-left') // { normalized: 'arrowLeft', wasAlias: false }\n * normalizeIconName('back') // { normalized: 'arrowLeft', wasAlias: true, originalAlias: 'back' }\n * normalizeIconName('ArrowLeft') // { normalized: 'arrowLeft', wasAlias: false }\n */\nexport function normalizeIconName(iconName: string): NormalizeResult {\n if (!iconName || typeof iconName !== 'string') {\n return { normalized: iconName || '', wasAlias: false }\n }\n\n const camelCased = toCamelCase(iconName)\n const aliasTarget = ICON_ALIASES[iconName] || ICON_ALIASES[camelCased]\n\n if (aliasTarget) {\n return {\n normalized: aliasTarget,\n wasAlias: true,\n originalAlias: iconName\n }\n }\n\n return {\n normalized: camelCased,\n wasAlias: false\n }\n}\n\n/**\n * 프로바이더별 아이콘 이름을 반환합니다.\n *\n * @example\n * getProviderIconName('arrowLeft', 'lucide') // 'ArrowLeft'\n * getProviderIconName('heart', 'iconsax') // 'Heart'\n */\nexport function getProviderIconName(\n normalizedName: string,\n provider: IconProviderType\n): string {\n switch (provider) {\n case 'lucide':\n case 'phosphor':\n case 'iconsax':\n return toPascalCase(normalizedName)\n default:\n return normalizedName\n }\n}\n","/**\n * Icon Config Types\n *\n * Icon 시스템의 설정 타입 정의\n * 상태관리는 서비스 레벨에서 관리 (Zustand 등)\n */\n\nexport type IconSet = 'lucide' | 'phosphor' | 'iconsax'\n\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'duotone' | 'fill'\n\nexport type IconsaxVariant = 'line' | 'bold'\n\nexport interface IconConfig {\n set: IconSet\n weight: PhosphorWeight\n size: number\n color: string\n strokeWidth?: number // Lucide용\n iconsaxVariant?: IconsaxVariant // Iconsax용 (line | bold)\n}\n\nexport const defaultIconConfig: IconConfig = {\n set: 'phosphor',\n weight: 'regular',\n size: 20,\n color: 'currentColor',\n strokeWidth: 1.25,\n iconsaxVariant: 'line',\n}\n\n/**\n * 세트별 기본 strokeWidth\n */\nexport const getDefaultStrokeWidth = (set: IconSet): number => {\n switch (set) {\n case 'lucide':\n return 1.25\n case 'phosphor':\n return 1.25 // Phosphor는 weight 사용\n case 'iconsax':\n return 1.5\n default:\n return 1.25\n }\n}\n","'use client'\n\n/**\n * IconProvider - Icon 시스템 전역 설정 Provider\n *\n * React Context를 사용하여 전역 아이콘 설정을 제공합니다.\n *\n * @example\n * ```tsx\n * <IconProvider set=\"phosphor\" weight=\"regular\" size={20}>\n * <App />\n * </IconProvider>\n * ```\n */\n\nimport React, { createContext, useContext } from 'react'\nimport { type IconConfig, type IconSet, type PhosphorWeight, type IconsaxVariant, defaultIconConfig } from './icon-store'\n\n/**\n * IconProvider 컴포넌트 Props\n */\nexport interface IconProviderProps {\n /** 아이콘 세트 (lucide, phosphor, iconsax) */\n set?: IconSet\n /** Phosphor 아이콘 weight */\n weight?: PhosphorWeight\n /** Iconsax 아이콘 변형 (line, bold) */\n iconsaxVariant?: IconsaxVariant\n /** 기본 아이콘 크기 */\n size?: number\n /** 기본 아이콘 색상 */\n color?: string\n /** Lucide/Iconsax 아이콘 stroke width */\n strokeWidth?: number\n /** 자식 컴포넌트 */\n children: React.ReactNode\n}\n\ninterface IconContextValue extends IconConfig {}\n\nconst IconContext = createContext<IconContextValue>(defaultIconConfig)\n\nexport function IconProvider({\n set = defaultIconConfig.set,\n weight = defaultIconConfig.weight,\n iconsaxVariant = defaultIconConfig.iconsaxVariant,\n size = defaultIconConfig.size,\n color = defaultIconConfig.color,\n strokeWidth = defaultIconConfig.strokeWidth,\n children,\n}: IconProviderProps) {\n const value: IconContextValue = {\n set,\n weight,\n iconsaxVariant,\n size,\n color,\n strokeWidth,\n }\n\n return (\n <IconContext.Provider value={value}>\n {children}\n </IconContext.Provider>\n )\n}\n\nexport function useIconContext(): IconContextValue {\n return useContext(IconContext)\n}\n\n// Re-export types for convenience\nexport type { IconSet, PhosphorWeight, IconsaxVariant, IconConfig } from './icon-store'\nexport { defaultIconConfig, getDefaultStrokeWidth } from './icon-store'\n","import React from 'react'\nimport type { IconProps as PhosphorIconProps } from '@phosphor-icons/react'\nimport { merge, mergeMap } from '../../lib/utils'\nimport { icons, IconName, emotionIcons, statusIcons } from '../../lib/icons'\nimport { getIconFromProvider, getIconsaxResolver, initPhosphorIcons, initLucideIcons, getIconNameForProvider } from '../../lib/icon-providers'\nimport { normalizeIconName } from '../../lib/normalize-icon-name'\nimport { useIconContext, type IconSet } from './IconProvider'\nimport { type PhosphorWeight } from './icon-store'\nimport type { AllIconName } from '../../lib/icon-names'\n\n/**\n * Icon 컴포넌트 Props\n */\nexport interface IconProps {\n /** 아이콘 이름 / Icon name */\n name: AllIconName\n /** 아이콘 크기 (숫자 또는 문자열) / Icon size (number or string) */\n size?: number | string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 감정 아이콘 타입 / Emotion icon type */\n emotion?: keyof typeof emotionIcons\n /** 상태 아이콘 타입 / Status icon type */\n status?: keyof typeof statusIcons\n /** 아이콘 프로바이더 오버라이드 / Icon provider override */\n provider?: IconSet\n /** 부드러운 애니메이션 효과 / Smooth animation effect */\n animated?: boolean\n /** 펄스 애니메이션 / Pulse animation */\n pulse?: boolean\n /** 회전 애니메이션 / Spin animation */\n spin?: boolean\n /** 바운스 애니메이션 / Bounce animation */\n bounce?: boolean\n /** 색상 변형 / Color variant */\n variant?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'muted' | 'inherit'\n /** Phosphor 아이콘 weight 오버라이드 / Phosphor icon weight override */\n weight?: PhosphorWeight\n /** 스크린 리더용 라벨 / Screen reader label */\n 'aria-label'?: string\n /** 장식용 아이콘 / Decorative icon (hidden from screen readers) */\n 'aria-hidden'?: boolean\n}\n\n/**\n * Icon 컴포넌트\n *\n * 다중 아이콘 라이브러리(Phosphor, Lucide, Iconsax)를 지원하는 통합 아이콘 컴포넌트.\n * IconProvider를 통해 전역 설정을 관리하며, 개별 아이콘에서도 오버라이드 가능.\n *\n * Iconsax는 별도 entry('@hua-labs/ui/iconsax')를 import해야 동작합니다.\n *\n * @example\n * ```tsx\n * <Icon name=\"heart\" />\n * <Icon name=\"user\" size={24} />\n * <Icon name=\"check\" variant=\"success\" />\n * <Icon name=\"loader\" spin />\n * ```\n */\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(({\n name,\n size,\n className,\n emotion,\n status,\n provider,\n weight,\n animated = false,\n pulse = false,\n spin = false,\n bounce = false,\n variant = 'default',\n 'aria-label': ariaLabel,\n 'aria-hidden': ariaHidden\n}, ref) => {\n const config = useIconContext()\n\n const iconSet = provider || config.set\n const iconSize = size ?? config.size\n const iconWeight = weight || config.weight\n const iconColor = config.color\n const iconStrokeWidth = config.strokeWidth ?? 1.25\n const iconsaxVariant = config.iconsaxVariant ?? 'line'\n\n const [isClient, setIsClient] = React.useState(false)\n const [providerReady, setProviderReady] = React.useState(false)\n\n React.useEffect(() => {\n setIsClient(true)\n\n // Provider별 lazy load 초기화\n if (iconSet === 'lucide') {\n initLucideIcons().then(() => setProviderReady(true))\n } else if (iconSet === 'phosphor') {\n initPhosphorIcons().then(() => setProviderReady(true))\n } else {\n setProviderReady(true)\n }\n }, [iconSet])\n\n // 통합 정규화\n const resolvedIcon = React.useMemo(() => {\n const baseName = emotion ? emotionIcons[emotion] :\n status ? statusIcons[status] : name\n const { normalized } = normalizeIconName(baseName)\n const providerName = getIconNameForProvider(normalized, iconSet)\n return { normalized, providerName }\n }, [name, emotion, status, iconSet])\n\n const iconName = resolvedIcon.normalized as AllIconName\n\n // Iconsax: resolver를 통해 가져오기 (iconsax entry import 시 자동 등록됨)\n const iconsaxIcon = React.useMemo(() => {\n if (iconSet === 'iconsax' && isClient) {\n const resolver = getIconsaxResolver()\n if (resolver) {\n return resolver(resolvedIcon.providerName, iconsaxVariant)\n }\n }\n return null\n }, [iconSet, resolvedIcon.providerName, isClient, iconsaxVariant])\n\n // 색상 변형 클래스\n const variantClasses = mergeMap({\n 'text-current': variant === 'default',\n 'text-primary': variant === 'primary',\n 'text-muted-foreground': variant === 'secondary' || variant === 'muted',\n 'text-green-600 dark:text-green-400': variant === 'success',\n 'text-yellow-600 dark:text-yellow-400': variant === 'warning',\n 'text-destructive': variant === 'error',\n })\n\n // 서버사이드에서는 빈 span 반환\n if (!isClient) {\n return (\n <span\n style={{ width: iconSize, height: iconSize }}\n className={merge(variantClasses, className)}\n aria-hidden={ariaHidden !== undefined ? ariaHidden : true}\n aria-label={ariaLabel}\n />\n )\n }\n\n // Provider에 따라 아이콘 가져오기\n type IconComponentType = React.ComponentType<PhosphorIconProps | React.SVGProps<SVGSVGElement> | Record<string, unknown>>\n let ResolvedIcon: IconComponentType | null = null\n\n if (iconSet === 'phosphor') {\n // 1. icons.ts에서 먼저 찾기 (Phosphor 아이콘이 기본, 정적 import)\n ResolvedIcon = (icons[iconName as IconName] || null) as IconComponentType | null\n // 2. 없으면 동적으로 Phosphor namespace에서 가져오기 (fallback, providerReady 필요)\n if (!ResolvedIcon && providerReady) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else if (iconSet === 'iconsax') {\n ResolvedIcon = iconsaxIcon as IconComponentType | null\n if (!ResolvedIcon) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else {\n // Lucide나 다른 provider\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n\n if (!ResolvedIcon) {\n if (iconSet === 'iconsax' && !getIconsaxResolver()) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `Icon \"${iconName}\" — iconsax resolver not registered. ` +\n `Use HuaProvider with icons.set='iconsax', or add: import '@hua-labs/ui/iconsax'`\n )\n }\n } else {\n console.warn(`Icon \"${iconName}\" not found for provider \"${iconSet}\"`)\n }\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center rounded-full border-2 border-dashed border-border',\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n aria-label={ariaLabel || `아이콘을 찾을 수 없음: ${iconName}`}\n title={`Icon not found: ${iconName}`}\n >\n <span className=\"text-xs text-muted-foreground\" aria-hidden=\"true\">\n ?\n </span>\n </span>\n )\n }\n\n // 세트별 props 준비\n type IconPropsType = PhosphorIconProps & {\n size?: number\n width?: number | string\n height?: number | string\n color?: string\n weight?: PhosphorWeight\n strokeWidth?: number\n }\n\n const iconProps: IconPropsType = {\n size: typeof iconSize === 'number' ? iconSize : undefined,\n width: typeof iconSize === 'string' ? iconSize : iconSize,\n height: typeof iconSize === 'string' ? iconSize : iconSize,\n color: iconColor,\n } as IconPropsType\n\n if (iconSet === 'phosphor') {\n iconProps.weight = iconWeight\n } else {\n iconProps.strokeWidth = iconStrokeWidth\n }\n\n const animationClasses = mergeMap({\n 'animate-pulse': pulse,\n 'animate-spin': spin,\n 'animate-bounce': bounce,\n 'transition-all duration-200 ease-in-out': animated,\n })\n\n const accessibilityProps: React.AriaAttributes = {}\n\n if (ariaLabel) {\n accessibilityProps['aria-label'] = ariaLabel\n accessibilityProps['aria-hidden'] = false\n } else if (ariaHidden !== undefined) {\n accessibilityProps['aria-hidden'] = ariaHidden\n } else {\n accessibilityProps['aria-hidden'] = true\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center',\n animationClasses,\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n {...accessibilityProps}\n >\n {ResolvedIcon && React.createElement(ResolvedIcon, {\n ...iconProps,\n className: variantClasses,\n 'aria-hidden': true\n } as React.ComponentProps<typeof ResolvedIcon>)}\n </span>\n )\n})\n\nIconComponent.displayName = 'Icon'\n\nconst MemoizedIcon = React.memo(IconComponent, (prevProps, nextProps) => {\n return (\n prevProps.name === nextProps.name &&\n prevProps.size === nextProps.size &&\n prevProps.className === nextProps.className &&\n prevProps.emotion === nextProps.emotion &&\n prevProps.status === nextProps.status &&\n prevProps.provider === nextProps.provider &&\n prevProps.animated === nextProps.animated &&\n prevProps.pulse === nextProps.pulse &&\n prevProps.spin === nextProps.spin &&\n prevProps.bounce === nextProps.bounce &&\n prevProps.variant === nextProps.variant &&\n prevProps.weight === nextProps.weight &&\n prevProps['aria-label'] === nextProps['aria-label'] &&\n prevProps['aria-hidden'] === nextProps['aria-hidden']\n )\n})\n\nexport const Icon = MemoizedIcon as typeof IconComponent\nIcon.displayName = 'Icon'\n\nexport const EmotionIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { emotion: keyof typeof emotionIcons }>(\n (props, ref) => <Icon ref={ref} name=\"smile\" {...props} />\n)\nEmotionIcon.displayName = 'EmotionIcon'\n\nexport const StatusIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { status: keyof typeof statusIcons }>(\n (props, ref) => <Icon ref={ref} name=\"info\" {...props} />\n)\nStatusIcon.displayName = 'StatusIcon'\n\nexport const LoadingIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"loader\" status=\"loading\" spin aria-label=\"로딩 중\" {...props} />\n )\n)\nLoadingIcon.displayName = 'LoadingIcon'\n\nexport const SuccessIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"check\" status=\"success\" variant=\"success\" aria-label=\"성공\" {...props} />\n )\n)\nSuccessIcon.displayName = 'SuccessIcon'\n\nexport const ErrorIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"alertCircle\" status=\"error\" variant=\"error\" aria-label=\"오류\" {...props} />\n )\n)\nErrorIcon.displayName = 'ErrorIcon'\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * 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 * Radio 컴포넌트의 props / Radio component props\n * @typedef {Object} RadioProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Radio 스타일 변형 / Radio style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Radio 크기 / Radio size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 라디오 버튼 레이블 텍스트 / Radio button label text\n * @property {string} [description] - 라디오 버튼 설명 텍스트 / Radio button description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface RadioProps 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 * Radio 컴포넌트 / Radio component\n * \n * 라디오 버튼 입력 필드를 제공하는 컴포넌트입니다.\n * 같은 name 속성을 가진 여러 Radio는 그룹으로 동작합니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Radio button input field component.\n * Multiple Radio components with the same name attribute work as a group.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 (그룹) / Basic usage (group)\n * <Radio name=\"option\" value=\"1\" label=\"옵션 1\" />\n * <Radio name=\"option\" value=\"2\" label=\"옵션 2\" />\n * <Radio name=\"option\" value=\"3\" label=\"옵션 3\" />\n * \n * @example\n * // 에러 상태 / Error state\n * <Radio \n * name=\"gender\"\n * value=\"male\"\n * label=\"남성\"\n * error\n * />\n * \n * @param {RadioProps} props - Radio 컴포넌트의 props / Radio component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Radio 컴포넌트 / Radio component\n */\nconst Radio = React.forwardRef<HTMLInputElement, RadioProps>(\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 radioId = id || generatedId\n const labelId = label ? `${radioId}-label` : undefined\n const descriptionId = description ? `${radioId}-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 dotSizes = {\n sm: \"w-1.5 h-1.5\",\n md: \"w-2 h-2\",\n lg: \"w-2.5 h-2.5\"\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=\"radio\"\n id={radioId}\n className={merge(\n \"peer sr-only\",\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=\"radio\"\n readOnly={needsReadOnly || props.readOnly}\n {...props}\n />\n <div\n className={merge(\n \"flex items-center justify-center rounded-full border transition-all duration-200 cursor-pointer\",\n \"peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-offset-2\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses,\n isChecked && \"border-primary dark:border-primary\"\n )}\n >\n <div\n className={merge(\n \"rounded-full bg-primary dark:bg-primary transition-all duration-200\",\n dotSizes[size],\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={radioId} 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)\nRadio.displayName = \"Radio\"\n\nexport { Radio } ","\"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 { merge } from \"../lib/utils\"\n\n/**\n * Slider 컴포넌트의 props\n * @typedef {Object} SliderProps\n * @property {\"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\"} [variant=\"default\"] - Slider 스타일 변형\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Slider 크기\n * @property {boolean} [showValue=false] - 현재 값 표시 여부\n * @property {boolean} [showLabel=false] - 라벨 표시 여부\n * @property {string} [label] - 라벨 텍스트\n * @property {number} [min=0] - 최소값\n * @property {number} [max=100] - 최대값\n * @property {number} [step=1] - 단계값\n * @property {number | number[]} [value=0] - 현재 값 (배열이면 범위 슬라이더)\n * @property {(value: number | number[]) => void} [onValueChange] - 값 변경 콜백\n * @property {\"horizontal\" | \"vertical\"} [orientation=\"horizontal\"] - Slider 방향\n * @property {boolean} [disabled=false] - 비활성화 여부\n * @property {string} [className] - 추가 CSS 클래스\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'value' | 'onChange' | 'size'>}\n */\nexport interface SliderProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'value' | 'onChange' | 'size'> {\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\"\n size?: \"sm\" | \"md\" | \"lg\"\n showValue?: boolean\n showLabel?: boolean\n label?: string\n min?: number\n max?: number\n step?: number\n value?: number | number[]\n onValueChange?: (value: number | number[]) => void\n orientation?: \"horizontal\" | \"vertical\"\n disabled?: boolean\n className?: string\n}\n\n/**\n * Slider 컴포넌트 / Slider component\n * \n * 숫자 값을 선택하는 슬라이더 컴포넌트입니다.\n * 단일 값 또는 범위 값을 선택할 수 있습니다.\n * \n * Slider component for selecting numeric values.\n * Supports single value or range value selection.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [value, setValue] = useState(50)\n * <Slider value={value} onValueChange={setValue} />\n * \n * @example\n * // 범위 슬라이더 / Range slider\n * const [range, setRange] = useState([20, 80])\n * <Slider \n * value={range} \n * onValueChange={setRange}\n * showValue\n * label=\"가격 범위\"\n * />\n * \n * @example\n * // 세로 슬라이더 / Vertical slider\n * <Slider \n * orientation=\"vertical\"\n * variant=\"primary\"\n * size=\"lg\"\n * className=\"h-64\"\n * />\n * \n * @param {SliderProps} props - Slider 컴포넌트의 props / Slider component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Slider 컴포넌트 / Slider component\n */\nconst Slider = React.forwardRef<HTMLInputElement, SliderProps>(\n ({ \n className,\n variant = \"default\",\n size = \"md\",\n showValue = false,\n showLabel = false,\n label,\n min = 0,\n max = 100,\n step = 1,\n value = 0,\n onValueChange,\n orientation = \"horizontal\",\n disabled = false,\n ...props \n }, ref) => {\n const isRange = Array.isArray(value)\n const currentValue = isRange ? value : [value]\n \n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = parseFloat(e.target.value)\n if (onValueChange) {\n if (isRange) {\n // 범위 슬라이더의 경우, 어떤 슬라이더가 변경되었는지 확인\n const index = parseInt(e.target.dataset.index || \"0\")\n const newRange = [...currentValue]\n newRange[index] = newValue\n onValueChange(newRange)\n } else {\n onValueChange(newValue)\n }\n }\n }\n\n const variantClasses = {\n default: \"bg-muted\",\n primary: \"bg-primary/20\",\n success: \"bg-[var(--progress-success)]/20\",\n warning: \"bg-[var(--progress-warning)]/20\",\n danger: \"bg-destructive/20\",\n }\n\n const thumbVariantClasses = {\n default: \"bg-muted-foreground hover:bg-foreground\",\n primary: \"bg-primary hover:bg-primary/90\",\n success: \"bg-[var(--progress-success)] hover:bg-[var(--progress-success)]/90\",\n warning: \"bg-[var(--progress-warning)] hover:bg-[var(--progress-warning)]/90\",\n danger: \"bg-destructive hover:bg-destructive/90\",\n }\n\n const sizeClasses = {\n sm: orientation === \"horizontal\" ? \"h-1\" : \"w-1\",\n md: orientation === \"horizontal\" ? \"h-2\" : \"w-2\",\n lg: orientation === \"horizontal\" ? \"h-3\" : \"w-3\"\n }\n\n const thumbSizeClasses = {\n sm: \"w-3 h-3\",\n md: \"w-4 h-4\",\n lg: \"w-6 h-6\"\n }\n\n const orientationClasses = orientation === \"vertical\" \n ? \"flex-col h-full\" \n : \"flex-row w-full\"\n\n const renderSlider = (index: number = 0) => (\n <input\n key={index}\n ref={index === 0 ? ref : undefined}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={currentValue[index]}\n onChange={handleChange}\n data-index={index}\n disabled={disabled}\n className={merge(\n \"appearance-none cursor-pointer rounded-full transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n orientation === \"vertical\" ? \"writing-mode: bt-lr; -webkit-appearance: slider-vertical\" : \"\",\n className\n )}\n style={{\n ...(orientation === \"vertical\" && {\n writingMode: \"vertical-rl\" as const,\n WebkitAppearance: \"slider-vertical\"\n })\n }}\n {...props}\n />\n )\n\n const renderValue = () => {\n if (!showValue) return null\n \n if (isRange) {\n return (\n <div className=\"flex gap-2 text-sm text-muted-foreground\">\n {currentValue.map((val, index) => (\n <span key={index} className=\"font-mono\">\n {val}\n </span>\n ))}\n </div>\n )\n }\n \n return (\n <span className=\"text-sm font-mono text-muted-foreground\">\n {currentValue[0]}\n </span>\n )\n }\n\n return (\n <div className={merge(\"flex items-center gap-4\", orientationClasses)}>\n {showLabel && label && (\n <label className=\"text-sm font-medium text-foreground min-w-0\">\n {label}\n </label>\n )}\n \n <div className=\"flex-1 relative\">\n <div className={merge(\"relative\", orientation === \"vertical\" ? \"h-full\" : \"w-full h-4 flex items-center\")}>\n {/* 배경 트랙 */}\n <div className={merge(\n \"absolute rounded-full\",\n sizeClasses[size],\n variantClasses[variant],\n orientation === \"vertical\" ? \"h-full left-1/2 -translate-x-1/2\" : \"w-full\"\n )} />\n \n {/* 활성 트랙 (값에 따른 채워진 부분) */}\n {isRange ? (\n // 범위 슬라이더\n <div className={merge(\n \"absolute rounded-full bg-primary\",\n sizeClasses[size],\n orientation === \"vertical\"\n ? \"left-1/2 -translate-x-1/2\"\n : \"\"\n )} style={{\n ...(orientation === \"vertical\"\n ? {\n bottom: `${(currentValue[0] - min) / (max - min) * 100}%`,\n height: `${(currentValue[1] - currentValue[0]) / (max - min) * 100}%`\n }\n : {\n left: `${(currentValue[0] - min) / (max - min) * 100}%`,\n width: `${(currentValue[1] - currentValue[0]) / (max - min) * 100}%`\n }\n )\n }} />\n ) : (\n // 단일 슬라이더\n <div className={merge(\n \"absolute rounded-full bg-primary\",\n sizeClasses[size],\n orientation === \"vertical\"\n ? \"left-1/2 -translate-x-1/2 bottom-0\"\n : \"left-0\"\n )} style={{\n ...(orientation === \"vertical\"\n ? { height: `${(currentValue[0] - min) / (max - min) * 100}%` }\n : { width: `${(currentValue[0] - min) / (max - min) * 100}%` }\n )\n }} />\n )}\n \n {/* 슬라이더 핸들들 */}\n {isRange ? (\n // 범위 슬라이더 핸들\n currentValue.map((_, index) => (\n <div\n key={index}\n className={merge(\n \"absolute rounded-full border-2 border-white shadow-lg transition-all duration-200 hover:scale-110\",\n thumbSizeClasses[size],\n thumbVariantClasses[variant],\n orientation === \"vertical\" \n ? \"left-1/2 transform -translate-x-1/2\" \n : \"top-1/2 transform -translate-y-1/2\"\n )}\n style={{\n ...(orientation === \"vertical\"\n ? { bottom: `${(currentValue[index] - min) / (max - min) * 100}%` }\n : { left: `${(currentValue[index] - min) / (max - min) * 100}%` }\n )\n }}\n />\n ))\n ) : (\n // 단일 슬라이더 핸들\n <div\n className={merge(\n \"absolute rounded-full border-2 border-white shadow-lg transition-all duration-200 hover:scale-110\",\n thumbSizeClasses[size],\n thumbVariantClasses[variant],\n orientation === \"vertical\" \n ? \"left-1/2 transform -translate-x-1/2\" \n : \"top-1/2 transform -translate-y-1/2\"\n )}\n style={{\n ...(orientation === \"vertical\"\n ? { bottom: `${(currentValue[0] - min) / (max - min) * 100}%` }\n : { left: `${(currentValue[0] - min) / (max - min) * 100}%` }\n )\n }}\n />\n )}\n </div>\n \n {/* 실제 input 요소들 (숨김) */}\n <div className=\"absolute inset-0 opacity-0\">\n {isRange ? (\n currentValue.map((_, index) => renderSlider(index))\n ) : (\n renderSlider()\n )}\n </div>\n </div>\n \n {renderValue()}\n </div>\n )\n }\n)\nSlider.displayName = \"Slider\"\n\nexport { Slider }\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Popover 컴포넌트의 props / Popover component props\n * @typedef {Object} PopoverProps\n * @property {React.ReactNode} children - Popover 내용 / Popover content\n * @property {React.ReactNode} trigger - Popover를 열기 위한 트리거 요소 / Trigger element to open popover\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [position=\"bottom\"] - Popover 표시 위치 / Popover display position\n * @property {\"start\" | \"center\" | \"end\"} [align=\"center\"] - Popover 정렬 / Popover alignment\n * @property {number} [offset=8] - 트리거와 Popover 사이 간격 (px) / Spacing between trigger and popover (px)\n * @property {boolean} [disabled=false] - Popover 비활성화 여부 / Disable popover\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface PopoverProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n trigger: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\n align?: \"start\" | \"center\" | \"end\"\n offset?: number\n disabled?: boolean\n /** Popover 콘텐츠 영역 추가 클래스 / Additional class for popover content area */\n contentClassName?: string\n /** 트리거를 full-width로 렌더링 (DatePicker 등) / Render trigger as full-width */\n fullWidth?: boolean\n}\n\n/**\n * Popover 컴포넌트 / Popover component\n * \n * 트리거 요소를 클릭하면 표시되는 팝오버 컴포넌트입니다.\n * 외부 클릭 시 자동으로 닫힙니다.\n * \n * Popover component that appears when the trigger element is clicked.\n * Automatically closes when clicking outside.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Popover trigger={<Button>열기</Button>}>\n * <div className=\"p-4\">Popover 내용</div>\n * </Popover>\n * \n * @example\n * // 제어 모드 / Controlled mode\n * const [open, setOpen] = useState(false)\n * <Popover \n * open={open}\n * onOpenChange={setOpen}\n * trigger={<Button>제어 모드</Button>}\n * position=\"top\"\n * >\n * <div className=\"p-4\">내용</div>\n * </Popover>\n * \n * @param {PopoverProps} props - Popover 컴포넌트의 props / Popover component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Popover 컴포넌트 / Popover component\n */\nconst Popover = React.forwardRef<HTMLDivElement, PopoverProps>(\n ({ \n className,\n children,\n trigger,\n open: controlledOpen,\n onOpenChange,\n position = \"bottom\",\n align = \"center\",\n offset = 8,\n disabled = false,\n contentClassName,\n fullWidth = false,\n ...props\n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const triggerRef = React.useRef<HTMLDivElement>(null)\n const popoverRef = React.useRef<HTMLDivElement>(null)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const handleOpenChange = React.useCallback((newOpen: boolean) => {\n if (disabled) return\n\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }, [disabled, isControlled, onOpenChange])\n\n const handleTriggerClick = () => {\n handleOpenChange(!isOpen)\n }\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current && \n popoverRef.current && \n !triggerRef.current.contains(event.target as Node) &&\n !popoverRef.current.contains(event.target as Node)\n ) {\n handleOpenChange(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }\n }, [isOpen, handleOpenChange])\n\n const getPositionClasses = () => {\n const baseClasses = \"absolute z-50\"\n\n switch (position) {\n case \"top\":\n return merge(baseClasses, \"bottom-full\", `mb-${Math.max(1, Math.floor(offset / 4))}`)\n case \"bottom\":\n return merge(baseClasses, \"top-full\", `mt-${Math.max(1, Math.floor(offset / 4))}`)\n case \"left\":\n return merge(baseClasses, \"right-full\", `mr-${Math.max(1, Math.floor(offset / 4))}`)\n case \"right\":\n return merge(baseClasses, \"left-full\", `ml-${Math.max(1, Math.floor(offset / 4))}`)\n default:\n return merge(baseClasses, \"top-full\", `mt-${Math.max(1, Math.floor(offset / 4))}`)\n }\n }\n\n const getAlignmentClasses = () => {\n switch (align) {\n case \"start\":\n if (position === \"top\" || position === \"bottom\") {\n return \"left-0\"\n } else {\n return \"top-0\"\n }\n case \"end\":\n if (position === \"top\" || position === \"bottom\") {\n return \"right-0\"\n } else {\n return \"bottom-0\"\n }\n case \"center\":\n default:\n if (position === \"top\" || position === \"bottom\") {\n return \"left-1/2 -translate-x-1/2\"\n } else {\n return \"top-1/2 -translate-y-1/2\"\n }\n }\n }\n\n const getArrowClasses = () => {\n const baseClasses = \"absolute w-0 h-0 border-4 border-transparent\"\n \n switch (position) {\n case \"top\":\n return `${baseClasses} top-full left-1/2 -translate-x-1/2 border-t-gray-200 dark:border-t-gray-700`\n case \"bottom\":\n return `${baseClasses} bottom-full left-1/2 -translate-x-1/2 border-b-gray-200 dark:border-b-gray-700`\n case \"left\":\n return `${baseClasses} left-full top-1/2 -translate-y-1/2 border-l-gray-200 dark:border-l-gray-700`\n case \"right\":\n return `${baseClasses} right-full top-1/2 -translate-y-1/2 border-r-gray-200 dark:border-r-gray-700`\n default:\n return `${baseClasses} bottom-full left-1/2 -translate-x-1/2 border-b-gray-200 dark:border-b-gray-700`\n }\n }\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {/* 트리거 */}\n <div\n ref={triggerRef}\n onClick={handleTriggerClick}\n className={merge(fullWidth ? \"block w-full\" : \"inline-block\", \"cursor-pointer\")}\n >\n {trigger}\n </div>\n\n {/* 팝오버 */}\n {isOpen && (\n <div\n ref={popoverRef}\n className={merge(\n \"bg-popover text-popover-foreground border border-border rounded-lg shadow-lg p-4 min-w-[200px]\",\n getPositionClasses(),\n getAlignmentClasses(),\n contentClassName\n )}\n >\n {/* 화살표 */}\n <div className={getArrowClasses()} />\n \n {/* 내용 */}\n <div className=\"relative z-10\">\n {children}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\nPopover.displayName = \"Popover\"\n\n// 편의 컴포넌트들\nexport const PopoverTrigger = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"inline-block cursor-pointer\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nPopoverTrigger.displayName = \"PopoverTrigger\"\n\nexport const PopoverContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"bg-popover text-popover-foreground border border-border rounded-lg shadow-lg p-4\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nPopoverContent.displayName = \"PopoverContent\"\n\nexport { Popover } ","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 { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport { Popover } from \"./Popover\"\nimport { Button } from \"./Button\"\n\n/**\n * DatePicker 컴포넌트의 props / DatePicker component props\n * @typedef {Object} DatePickerProps\n * @property {Date | null} [value] - 선택된 날짜 / Selected date\n * @property {(date: Date | null) => void} [onChange] - 날짜 변경 핸들러 / Date change handler\n * @property {Date} [minDate] - 최소 날짜 / Minimum date\n * @property {Date} [maxDate] - 최대 날짜 / Maximum date\n * @property {string} [placeholder=\"날짜를 선택하세요\"] - 플레이스홀더 / Placeholder\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @property {boolean} [error=false] - 에러 상태 / Error state\n * @property {string} [dateFormat=\"YYYY-MM-DD\"] - 날짜 포맷 / Date format\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {string} [className] - 추가 클래스명 / Additional class name\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>}\n */\nexport interface DatePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n value?: Date | null\n onChange?: (date: Date | null) => void\n minDate?: Date\n maxDate?: Date\n placeholder?: string\n disabled?: boolean\n error?: boolean\n dateFormat?: string\n locale?: string\n size?: \"sm\" | \"md\" | \"lg\"\n className?: string\n /** 표시할 날짜 배열 (점으로 표시) / Dates to mark with a dot */\n markedDates?: Date[]\n}\n\nconst sizeClasses = {\n sm: \"h-8 text-sm px-3\",\n md: \"h-10 text-sm px-4\",\n lg: \"h-12 text-base px-5\",\n}\n\nconst formatDate = (date: Date | null, format: string = \"YYYY-MM-DD\", _locale: string = \"ko-KR\"): string => {\n if (!date) return \"\"\n \n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, \"0\")\n const day = String(date.getDate()).padStart(2, \"0\")\n \n return format\n .replace(\"YYYY\", String(year))\n .replace(\"MM\", month)\n .replace(\"DD\", day)\n}\n\nconst getDaysInMonth = (year: number, month: number): number => {\n return new Date(year, month + 1, 0).getDate()\n}\n\nconst getFirstDayOfMonth = (year: number, month: number): number => {\n return new Date(year, month, 1).getDay()\n}\n\n/**\n * DatePicker 컴포넌트 / DatePicker component\n * \n * 날짜를 선택할 수 있는 컴포넌트입니다.\n * 캘린더 팝오버를 통해 직관적으로 날짜를 선택할 수 있습니다.\n * \n * Component for selecting dates.\n * Allows intuitive date selection through a calendar popover.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <DatePicker\n * value={selectedDate}\n * onChange={setSelectedDate}\n * />\n * \n * @example\n * // 날짜 범위 제한 / Date range restriction\n * <DatePicker\n * value={date}\n * onChange={setDate}\n * minDate={new Date(\"2024-01-01\")}\n * maxDate={new Date(\"2024-12-31\")}\n * placeholder=\"날짜 선택\"\n * />\n * \n * @param {DatePickerProps} props - DatePicker 컴포넌트의 props / DatePicker component props\n * @returns {JSX.Element} DatePicker 컴포넌트 / DatePicker component\n */\nexport const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n value,\n onChange,\n minDate,\n maxDate,\n placeholder = \"날짜를 선택하세요\",\n disabled = false,\n error = false,\n dateFormat = \"YYYY-MM-DD\",\n locale = \"ko-KR\",\n size = \"md\",\n className,\n markedDates,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = React.useState(false)\n const [currentMonth, setCurrentMonth] = React.useState(value ? new Date(value.getFullYear(), value.getMonth()) : new Date())\n const [hoveredDate, setHoveredDate] = React.useState<Date | null>(null)\n\n const displayDate = value ? formatDate(value, dateFormat, locale) : \"\"\n\n const handleDateSelect = (date: Date) => {\n if (minDate && date < minDate) return\n if (maxDate && date > maxDate) return\n onChange?.(date)\n setIsOpen(false)\n }\n\n const handlePrevMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1))\n }\n\n const handleNextMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1))\n }\n\n const handleToday = () => {\n const today = new Date()\n today.setHours(0, 0, 0, 0)\n handleDateSelect(today)\n }\n\n const year = currentMonth.getFullYear()\n const month = currentMonth.getMonth()\n const daysInMonth = getDaysInMonth(year, month)\n const firstDay = getFirstDayOfMonth(year, month)\n\n // 로케일별 요일 텍스트\n const weekDaysMap: Record<string, string[]> = {\n \"ko-KR\": [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n \"ko\": [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n \"ja-JP\": [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"],\n \"ja\": [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"],\n \"en-US\": [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n \"en\": [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n }\n const weekDays = weekDaysMap[locale] || weekDaysMap[\"en\"]\n\n // 로케일별 월 포맷\n const formatMonth = (year: number, month: number, loc: string): string => {\n if (loc === \"ko-KR\" || loc === \"ko\") {\n return `${year}년 ${month + 1}월`\n } else if (loc === \"ja-JP\" || loc === \"ja\") {\n return `${year}年 ${month + 1}月`\n } else {\n const monthNames = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"]\n return `${monthNames[month]} ${year}`\n }\n }\n\n // 로케일별 \"오늘\" 텍스트\n const todayTextMap: Record<string, string> = {\n \"ko-KR\": \"오늘\",\n \"ko\": \"오늘\",\n \"ja-JP\": \"今日\",\n \"ja\": \"今日\",\n \"en-US\": \"Today\",\n \"en\": \"Today\",\n }\n const todayText = todayTextMap[locale] || \"Today\"\n\n // 로케일별 aria-label 텍스트\n const ariaLabels = {\n prevMonth: locale.startsWith(\"ko\") ? \"이전 달\" : locale.startsWith(\"ja\") ? \"前月\" : \"Previous month\",\n nextMonth: locale.startsWith(\"ko\") ? \"다음 달\" : locale.startsWith(\"ja\") ? \"翌月\" : \"Next month\",\n }\n\n // 날짜 aria-label 포맷\n const formatDateAriaLabel = (date: Date, loc: string): string => {\n if (loc.startsWith(\"ko\")) {\n return `${date.getFullYear()}년 ${date.getMonth() + 1}월 ${date.getDate()}일`\n } else if (loc.startsWith(\"ja\")) {\n return `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日`\n } else {\n return date.toLocaleDateString(\"en-US\", { year: \"numeric\", month: \"long\", day: \"numeric\" })\n }\n }\n\n const isDateDisabled = (date: Date): boolean => {\n if (minDate && date < minDate) return true\n if (maxDate && date > maxDate) return true\n return false\n }\n\n const isDateSelected = (date: Date): boolean => {\n if (!value) return false\n return (\n date.getFullYear() === value.getFullYear() &&\n date.getMonth() === value.getMonth() &&\n date.getDate() === value.getDate()\n )\n }\n\n const isToday = (date: Date): boolean => {\n const today = new Date()\n return (\n date.getFullYear() === today.getFullYear() &&\n date.getMonth() === today.getMonth() &&\n date.getDate() === today.getDate()\n )\n }\n\n const isMarkedDate = (date: Date): boolean => {\n if (!markedDates) return false\n return markedDates.some(\n (marked) =>\n marked.getFullYear() === date.getFullYear() &&\n marked.getMonth() === date.getMonth() &&\n marked.getDate() === date.getDate()\n )\n }\n\n const calendarDays: (Date | null)[] = []\n\n // 이전 달의 마지막 날들\n for (let i = firstDay - 1; i >= 0; i--) {\n const date = new Date(year, month, -i)\n calendarDays.push(date)\n }\n\n // 현재 달의 날들\n for (let day = 1; day <= daysInMonth; day++) {\n calendarDays.push(new Date(year, month, day))\n }\n\n // 다음 달의 첫 날들 (현재 행만 채우기 - 불필요한 추가 행 방지)\n const totalRows = Math.ceil(calendarDays.length / 7)\n const totalSlots = totalRows * 7\n const remainingDays = totalSlots - calendarDays.length\n for (let day = 1; day <= remainingDays; day++) {\n calendarDays.push(new Date(year, month + 1, day))\n }\n\n const triggerButton = (\n <button\n type=\"button\"\n disabled={disabled}\n className={merge(\n \"flex w-full items-center justify-between rounded-lg border border-input bg-background px-4 py-2 text-left text-sm transition-colors\",\n \"hover:bg-muted focus:outline-none focus:ring-1 focus:ring-ring focus:ring-offset-2\",\n error && \"border-destructive focus:ring-destructive\",\n disabled && \"cursor-not-allowed opacity-50\",\n sizeClasses[size]\n )}\n aria-label={displayDate || placeholder}\n >\n <span className={merge(\"flex-1\", !displayDate && \"text-muted-foreground\")}>\n {displayDate || placeholder}\n </span>\n <Icon\n name=\"calendar\"\n className=\"ml-2 h-4 w-4\"\n />\n </button>\n )\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n <Popover\n open={isOpen}\n onOpenChange={setIsOpen}\n trigger={triggerButton}\n position=\"bottom\"\n align=\"start\"\n fullWidth\n contentClassName=\"p-0\"\n >\n <div\n className=\"rounded-lg\"\n style={{ backgroundColor: 'var(--color-popover, #111827)' }}\n >\n <div className=\"p-4\">\n {/* 헤더 */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n className=\"rounded-lg p-2 hover:bg-muted transition-colors\"\n aria-label={ariaLabels.prevMonth}\n >\n <Icon name=\"chevronLeft\" className=\"h-4 w-4\" />\n </button>\n <div className=\"text-lg font-semibold text-foreground\">\n {formatMonth(year, month, locale)}\n </div>\n <button\n type=\"button\"\n onClick={handleNextMonth}\n className=\"rounded-lg p-2 hover:bg-muted transition-colors\"\n aria-label={ariaLabels.nextMonth}\n >\n <Icon name=\"chevronRight\" className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* 요일 헤더 */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {weekDays.map((day, index) => (\n <div\n key={index}\n className={merge(\n \"text-center text-xs font-medium py-2\",\n index === 0 && \"text-destructive\",\n index === 6 && \"text-primary\"\n )}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* 캘린더 그리드 */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((date, index) => {\n if (!date) return <div key={index} />\n\n const isCurrentMonth = date.getMonth() === month\n const isDisabled = isDateDisabled(date)\n const isSelected = isDateSelected(date)\n const isTodayDate = isToday(date)\n const isMarked = isMarkedDate(date)\n const isHovered = hoveredDate &&\n date.getFullYear() === hoveredDate.getFullYear() &&\n date.getMonth() === hoveredDate.getMonth() &&\n date.getDate() === hoveredDate.getDate()\n\n const buttonStyle: React.CSSProperties = {\n ...(!isCurrentMonth && !isSelected ? { opacity: 0.3 } : {}),\n ...(isSelected ? { backgroundColor: 'hsl(var(--primary, 187 92% 50%))', color: '#fff' } : {}),\n ...(isTodayDate && !isSelected ? {\n boxShadow: 'inset 0 0 0 2px hsl(var(--primary, 187 92% 50%))',\n fontWeight: 700,\n } : {}),\n ...(isHovered && !isSelected ? { backgroundColor: 'hsl(var(--primary, 187 92% 50%) / 0.15)' } : {}),\n }\n\n return (\n <button\n key={index}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleDateSelect(date)}\n onMouseEnter={() => setHoveredDate(date)}\n onMouseLeave={() => setHoveredDate(null)}\n className=\"relative flex flex-col items-center justify-center h-9 w-9 rounded-lg text-sm font-medium transition-all focus:outline-none\"\n style={buttonStyle}\n aria-label={formatDateAriaLabel(date, locale)}\n >\n <span className=\"relative z-10 leading-none\">\n {date.getDate()}\n </span>\n {isMarked && (\n <span\n className=\"absolute rounded-full\"\n style={{\n bottom: '1px',\n width: '6px',\n height: '6px',\n backgroundColor: isSelected ? '#fff' : 'hsl(var(--primary, 187 92% 50%))',\n }}\n />\n )}\n </button>\n )\n })}\n </div>\n\n {/* 오늘 버튼 */}\n <div className=\"mt-4 pt-4 border-t border-border\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleToday}\n className=\"w-full\"\n >\n {todayText}\n </Button>\n </div>\n </div>\n </div>\n </Popover>\n </div>\n )\n }\n)\n\nDatePicker.displayName = \"DatePicker\"\n\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * 업로드된 파일 정보 인터페이스 / Uploaded file information interface\n * @typedef {Object} UploadedFile\n * @property {string} id - 파일 고유 ID / File unique ID\n * @property {File} file - 파일 객체 / File object\n * @property {string} name - 파일 이름 / File name\n * @property {number} size - 파일 크기 (bytes) / File size in bytes\n * @property {string} type - 파일 타입 / File type\n * @property {number} [progress] - 업로드 진행률 (0-100) / Upload progress (0-100)\n * @property {\"pending\" | \"uploading\" | \"success\" | \"error\"} [status] - 업로드 상태 / Upload status\n * @property {string} [url] - 업로드된 파일 URL / Uploaded file URL\n * @property {string} [error] - 에러 메시지 / Error message\n */\nexport interface UploadedFile {\n id: string\n file: File\n name: string\n size: number\n type: string\n progress?: number\n status?: \"pending\" | \"uploading\" | \"success\" | \"error\"\n url?: string\n error?: string\n}\n\n/**\n * Upload 컴포넌트의 props / Upload component props\n * @typedef {Object} UploadProps\n * @property {UploadedFile[]} [files] - 업로드된 파일 목록 / Uploaded files list\n * @property {(files: File[]) => void} [onChange] - 파일 선택 핸들러 / File selection handler\n * @property {(file: UploadedFile) => void} [onRemove] - 파일 제거 핸들러 / File removal handler\n * @property {boolean} [multiple=false] - 다중 파일 선택 허용 / Allow multiple file selection\n * @property {string} [accept] - 허용할 파일 타입 (예: \"image/*\", \".pdf\") / Accepted file types\n * @property {number} [maxSize] - 최대 파일 크기 (bytes) / Maximum file size in bytes\n * @property {number} [maxFiles] - 최대 파일 개수 / Maximum number of files\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @property {boolean} [dragDrop=true] - 드래그 앤 드롭 활성화 / Enable drag and drop\n * @property {string} [placeholder=\"파일을 선택하거나 여기에 드래그하세요\"] - 플레이스홀더 / Placeholder\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {string} [className] - 추가 클래스명 / Additional class name\n */\nexport interface UploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n files?: UploadedFile[]\n onChange?: (files: File[]) => void\n onRemove?: (file: UploadedFile) => void\n multiple?: boolean\n accept?: string\n maxSize?: number\n maxFiles?: number\n disabled?: boolean\n dragDrop?: boolean\n placeholder?: string\n size?: \"sm\" | \"md\" | \"lg\"\n className?: string\n}\n\nconst formatFileSize = (bytes: number): string => {\n if (bytes === 0) return \"0 Bytes\"\n const k = 1024\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"]\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + \" \" + sizes[i]\n}\n\nconst getFileIcon = (type: string): IconName => {\n if (type.startsWith(\"image/\")) return \"image\"\n if (type.startsWith(\"video/\")) return \"video\"\n if (type.includes(\"pdf\")) return \"fileText\"\n if (type.includes(\"word\") || type.includes(\"document\")) return \"fileText\"\n if (type.includes(\"excel\") || type.includes(\"spreadsheet\")) return \"fileText\"\n return \"file\"\n}\n\n/**\n * Upload 컴포넌트 / Upload component\n * \n * 파일을 업로드할 수 있는 컴포넌트입니다.\n * 드래그 앤 드롭, 다중 파일 선택, 파일 크기 제한 등을 지원합니다.\n * \n * Component for uploading files.\n * Supports drag and drop, multiple file selection, file size limits, and more.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Upload\n * onChange={(files) => console.log(files)}\n * />\n * \n * @example\n * // 이미지만, 다중 선택 / Images only, multiple selection\n * <Upload\n * accept=\"image/*\"\n * multiple\n * maxSize={5 * 1024 * 1024} // 5MB\n * maxFiles={5}\n * files={uploadedFiles}\n * onRemove={(file) => handleRemove(file)}\n * />\n * \n * @param {UploadProps} props - Upload 컴포넌트의 props / Upload component props\n * @returns {JSX.Element} Upload 컴포넌트 / Upload component\n */\nexport const Upload = React.forwardRef<HTMLDivElement, UploadProps>(\n (\n {\n files = [],\n onChange,\n onRemove,\n multiple = false,\n accept,\n maxSize,\n maxFiles,\n disabled = false,\n dragDrop = true,\n placeholder = \"파일을 선택하거나 여기에 드래그하세요\",\n size = \"md\",\n className,\n ...props\n },\n ref\n ) => {\n const fileInputRef = React.useRef<HTMLInputElement>(null)\n const [isDragging, setIsDragging] = React.useState(false)\n\n const handleFileSelect = (selectedFiles: FileList | null) => {\n if (!selectedFiles || selectedFiles.length === 0) return\n\n const fileArray = Array.from(selectedFiles)\n \n // 파일 개수 체크\n if (maxFiles && files.length + fileArray.length > maxFiles) {\n alert(`최대 ${maxFiles}개의 파일만 업로드할 수 있습니다.`)\n return\n }\n\n // 파일 크기 체크\n const validFiles = fileArray.filter((file) => {\n if (maxSize && file.size > maxSize) {\n alert(`파일 크기는 ${formatFileSize(maxSize)}를 초과할 수 없습니다: ${file.name}`)\n return false\n }\n return true\n })\n\n if (validFiles.length > 0) {\n onChange?.(validFiles)\n }\n }\n\n const handleClick = () => {\n if (!disabled) {\n fileInputRef.current?.click()\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n if (!disabled && dragDrop) {\n setIsDragging(true)\n }\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n setIsDragging(false)\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n setIsDragging(false)\n if (!disabled && dragDrop) {\n handleFileSelect(e.dataTransfer.files)\n }\n }\n\n const handleRemove = (file: UploadedFile) => {\n onRemove?.(file)\n }\n\n const sizeClasses = {\n sm: \"p-4\",\n md: \"p-6\",\n lg: \"p-8\",\n }\n\n return (\n <div ref={ref} className={merge(\"w-full\", className)} {...props}>\n {/* 업로드 영역 */}\n <div\n onClick={handleClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n className={merge(\n \"relative border-2 border-dashed rounded-xl transition-all cursor-pointer\",\n \"bg-muted/50\",\n \"border-border\",\n isDragging && \"border-primary bg-primary/10\",\n disabled && \"cursor-not-allowed opacity-50\",\n sizeClasses[size]\n )}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n onChange={(e) => handleFileSelect(e.target.files)}\n className=\"hidden\"\n aria-label=\"파일 선택\"\n />\n \n <div className=\"flex flex-col items-center justify-center text-center\">\n <div className={merge(\n \"rounded-full bg-primary/10 p-4 mb-4\",\n isDragging && \"bg-primary/20\"\n )}>\n <Icon\n name=\"upload\"\n className={merge(\n \"h-8 w-8 text-primary\",\n isDragging && \"scale-110\"\n )} \n />\n </div>\n <p className=\"text-sm font-medium text-foreground mb-1\">\n {placeholder}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {accept && `지원 형식: ${accept}`}\n {maxSize && ` • 최대 크기: ${formatFileSize(maxSize)}`}\n {maxFiles && ` • 최대 ${maxFiles}개`}\n </p>\n </div>\n </div>\n\n {/* 파일 목록 */}\n {files.length > 0 && (\n <div className=\"mt-4 space-y-2\">\n {files.map((file) => (\n <div\n key={file.id}\n className={merge(\n \"flex items-center gap-3 p-3 rounded-lg border\",\n \"bg-card\",\n \"border-border\",\n file.status === \"error\" && \"border-destructive/50 bg-destructive/5\"\n )}\n >\n <div className=\"flex-shrink-0\">\n <div className=\"rounded-lg bg-muted p-2\">\n <Icon\n name={getFileIcon(file.type)}\n className=\"h-5 w-5 text-muted-foreground\"\n />\n </div>\n </div>\n \n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground truncate\">\n {file.name}\n </p>\n <div className=\"flex items-center gap-2 mt-1\">\n <p className=\"text-xs text-muted-foreground\">\n {formatFileSize(file.size)}\n </p>\n {file.status === \"uploading\" && file.progress !== undefined && (\n <>\n <div className=\"flex-1 h-1.5 bg-muted rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-primary transition-all duration-300\"\n style={{ width: `${file.progress}%` }}\n />\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {file.progress}%\n </span>\n </>\n )}\n {file.status === \"success\" && (\n <span className=\"text-xs text-[var(--progress-success)] flex items-center gap-1\">\n <Icon name=\"check\" className=\"h-3 w-3\" />\n 완료\n </span>\n )}\n {file.status === \"error\" && (\n <span className=\"text-xs text-destructive\">\n {file.error || \"업로드 실패\"}\n </span>\n )}\n </div>\n </div>\n\n {onRemove && (\n <button\n type=\"button\"\n onClick={() => handleRemove(file)}\n className=\"flex-shrink-0 rounded-lg p-1.5 hover:bg-muted transition-colors\"\n aria-label=\"파일 제거\"\n >\n <Icon name=\"close\" className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n\nUpload.displayName = \"Upload\"\n\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport { Input } from \"./Input\"\n\n/**\n * Autocomplete 옵션 인터페이스 / Autocomplete option interface\n * @typedef {Object} AutocompleteOption\n * @property {string} value - 옵션 값 / Option value\n * @property {string} label - 옵션 라벨 / Option label\n * @property {string} [description] - 옵션 설명 / Option description\n * @property {React.ReactNode} [icon] - 옵션 아이콘 / Option icon\n * @property {Record<string, unknown>} [data] - 추가 데이터 / Additional data\n */\nexport interface AutocompleteOption {\n value: string\n label: string\n description?: string\n icon?: React.ReactNode\n data?: Record<string, unknown>\n}\n\n/**\n * Autocomplete 컴포넌트의 props / Autocomplete component props\n * @typedef {Object} AutocompleteProps\n * @property {AutocompleteOption[]} options - 옵션 목록 / Options list\n * @property {string} [value] - 선택된 값 / Selected value\n * @property {(value: string, option?: AutocompleteOption) => void} [onChange] - 값 변경 핸들러 / Value change handler\n * @property {string} [placeholder=\"검색하거나 선택하세요\"] - 플레이스홀더 / Placeholder\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @property {boolean} [error=false] - 에러 상태 / Error state\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\n * @property {number} [maxHeight=300] - 드롭다운 최대 높이 (px) / Dropdown max height in px\n * @property {boolean} [clearable=true] - 지우기 버튼 표시 / Show clear button\n * @property {boolean} [filterable=true] - 필터링 활성화 / Enable filtering\n * @property {(query: string) => AutocompleteOption[] | Promise<AutocompleteOption[]>} [onSearch] - 검색 핸들러 (비동기 지원) / Search handler (async support)\n * @property {React.ReactNode} [emptyText=\"결과가 없습니다\"] - 빈 결과 텍스트 / Empty result text\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {string} [className] - 추가 클래스명 / Additional class name\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>}\n */\nexport interface AutocompleteProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n options: AutocompleteOption[]\n value?: string\n onChange?: (value: string, option?: AutocompleteOption) => void\n placeholder?: string\n disabled?: boolean\n error?: boolean\n loading?: boolean\n maxHeight?: number\n clearable?: boolean\n filterable?: boolean\n onSearch?: (query: string) => AutocompleteOption[] | Promise<AutocompleteOption[]>\n emptyText?: string\n size?: \"sm\" | \"md\" | \"lg\"\n className?: string\n}\n\nconst sizeClasses = {\n sm: \"h-8 text-sm\",\n md: \"h-10 text-sm\",\n lg: \"h-12 text-base\",\n}\n\n/**\n * Autocomplete 컴포넌트 / Autocomplete component\n * \n * 자동완성 입력 컴포넌트입니다.\n * 입력하면서 옵션을 필터링하고 선택할 수 있습니다.\n * \n * Autocomplete input component.\n * Filters and selects options as you type.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Autocomplete\n * options={[\n * { value: \"1\", label: \"옵션 1\" },\n * { value: \"2\", label: \"옵션 2\" }\n * ]}\n * onChange={(value) => console.log(value)}\n * />\n * \n * @example\n * // 비동기 검색 / Async search\n * <Autocomplete\n * options={options}\n * onSearch={async (query) => {\n * const results = await searchAPI(query)\n * return results\n * }}\n * loading={isLoading}\n * />\n * \n * @param {AutocompleteProps} props - Autocomplete 컴포넌트의 props / Autocomplete component props\n * @returns {JSX.Element} Autocomplete 컴포넌트 / Autocomplete component\n */\nexport const Autocomplete = React.forwardRef<HTMLDivElement, AutocompleteProps>(\n (\n {\n options,\n value,\n onChange,\n placeholder = \"검색하거나 선택하세요\",\n disabled = false,\n error = false,\n loading = false,\n maxHeight = 300,\n clearable = true,\n filterable = true,\n onSearch,\n emptyText = \"결과가 없습니다\",\n size = \"md\",\n className,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = React.useState(false)\n const [inputValue, setInputValue] = React.useState(\"\")\n const [filteredOptions, setFilteredOptions] = React.useState<AutocompleteOption[]>(options)\n const [selectedIndex, setSelectedIndex] = React.useState(-1)\n const [isSearching, setIsSearching] = React.useState(false)\n \n const inputRef = React.useRef<HTMLInputElement>(null)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n\n const selectedOption = React.useMemo(() => {\n return options.find((opt) => opt.value === value)\n }, [options, value])\n\n // 초기 입력값 설정\n React.useEffect(() => {\n if (selectedOption) {\n setInputValue(selectedOption.label)\n } else if (!value) {\n setInputValue(\"\")\n }\n }, [selectedOption, value])\n\n // 옵션 필터링\n React.useEffect(() => {\n if (onSearch) {\n setIsSearching(true)\n const result = onSearch(inputValue)\n if (result instanceof Promise) {\n result.then((filtered) => {\n setFilteredOptions(filtered)\n setIsSearching(false)\n })\n } else {\n setFilteredOptions(result)\n setIsSearching(false)\n }\n } else if (filterable) {\n if (!inputValue.trim()) {\n setFilteredOptions(options)\n } else {\n const filtered = options.filter((option) =>\n option.label.toLowerCase().includes(inputValue.toLowerCase()) ||\n option.value.toLowerCase().includes(inputValue.toLowerCase()) ||\n option.description?.toLowerCase().includes(inputValue.toLowerCase())\n )\n setFilteredOptions(filtered)\n }\n } else {\n setFilteredOptions(options)\n }\n }, [inputValue, options, filterable, onSearch])\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n setInputValue(newValue)\n setIsOpen(true)\n setSelectedIndex(-1)\n \n if (!newValue && clearable) {\n onChange?.(\"\")\n }\n }\n\n const handleInputFocus = () => {\n setIsOpen(true)\n }\n\n const handleInputBlur = (e: React.FocusEvent) => {\n // 드롭다운 클릭 시에는 닫지 않음\n if (dropdownRef.current?.contains(e.relatedTarget as Node)) {\n return\n }\n setIsOpen(false)\n setSelectedIndex(-1)\n \n // 선택된 옵션이 있으면 그 라벨로 복원\n if (selectedOption) {\n setInputValue(selectedOption.label)\n }\n }\n\n const handleOptionSelect = (option: AutocompleteOption) => {\n setInputValue(option.label)\n onChange?.(option.value, option)\n setIsOpen(false)\n inputRef.current?.blur()\n }\n\n const handleClear = () => {\n setInputValue(\"\")\n onChange?.(\"\")\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen || filteredOptions.length === 0) {\n if (e.key === \"ArrowDown\") {\n setIsOpen(true)\n }\n return\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault()\n setSelectedIndex((prev) => \n prev < filteredOptions.length - 1 ? prev + 1 : prev\n )\n break\n case \"ArrowUp\":\n e.preventDefault()\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : -1))\n break\n case \"Enter\":\n e.preventDefault()\n if (selectedIndex >= 0 && filteredOptions[selectedIndex]) {\n handleOptionSelect(filteredOptions[selectedIndex])\n }\n break\n case \"Escape\":\n setIsOpen(false)\n inputRef.current?.blur()\n break\n }\n }\n\n return (\n <div ref={ref} className={merge(\"relative w-full\", className)} {...props}>\n <div className=\"relative\">\n <Input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={error}\n aria-autocomplete=\"list\"\n aria-expanded={isOpen}\n aria-controls=\"autocomplete-list\"\n className={merge(sizeClasses[size], \"pr-10\")}\n />\n \n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1\">\n {loading || isSearching ? (\n <Icon \n name=\"loader\"\n className=\"h-4 w-4 animate-spin text-muted-foreground\"\n />\n ) : clearable && inputValue ? (\n <button\n type=\"button\"\n onClick={handleClear}\n className=\"rounded p-1 hover:bg-muted transition-colors\"\n aria-label=\"지우기\"\n >\n <Icon name=\"close\" className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n ) : (\n <Icon name=\"chevronDown\" className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </div>\n </div>\n\n {/* 드롭다운 */}\n {isOpen && (\n <div\n ref={dropdownRef}\n id=\"autocomplete-list\"\n role=\"listbox\"\n className={merge(\n \"absolute z-50 w-full mt-1 rounded-lg border shadow-lg\",\n \"bg-popover text-popover-foreground\",\n \"border-border\",\n \"overflow-hidden\"\n )}\n style={{ maxHeight: `${maxHeight}px` }}\n >\n <div className=\"overflow-y-auto\" style={{ maxHeight: `${maxHeight}px` }}>\n {filteredOptions.length === 0 ? (\n <div className=\"px-4 py-8 text-center text-sm text-muted-foreground\">\n {emptyText}\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = selectedIndex === index\n const isValueSelected = value === option.value\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isValueSelected}\n onClick={() => handleOptionSelect(option)}\n onMouseEnter={() => setSelectedIndex(index)}\n className={merge(\n \"px-4 py-3 cursor-pointer transition-colors\",\n \"hover:bg-muted\",\n isSelected && \"bg-primary/10\",\n isValueSelected && \"bg-primary/15\"\n )}\n >\n <div className=\"flex items-center gap-3\">\n {option.icon && (\n <div className=\"flex-shrink-0 text-muted-foreground\">\n {option.icon}\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-foreground\">\n {option.label}\n </p>\n {isValueSelected && (\n <Icon \n name=\"check\" \n className=\"h-4 w-4 text-primary flex-shrink-0\"\n />\n )}\n </div>\n {option.description && (\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {option.description}\n </p>\n )}\n </div>\n </div>\n </div>\n )\n })\n )}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\n\nAutocomplete.displayName = \"Autocomplete\"\n\n\n","\"use client\";\n\n/**\n * ColorPicker 컴포넌트\n *\n * 탭 기반 컬러 피커 (의존성 없음)\n * - Tailwind 탭: Tailwind CSS 프리셋 팔레트\n * - Custom 탭: HSL 슬라이더 + HEX 입력\n *\n * @example\n * ```tsx\n * <ColorPicker value=\"#3b82f6\" onChange={(color) => console.log(color)} />\n * ```\n */\n\nimport React, { useState, useRef, useCallback, useEffect } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface ColorPickerProps {\n /** 현재 색상 값 (HEX 또는 'transparent') */\n value: string;\n /** 색상 변경 콜백 */\n onChange: (color: string) => void;\n /** 추가 클래스명 */\n className?: string;\n /** 비활성화 여부 */\n disabled?: boolean;\n}\n\ntype TabType = \"tailwind\" | \"custom\";\n\n// Tailwind 팔레트 프리셋\nconst TAILWIND_PALETTE = {\n gray: [\"#f9fafb\", \"#f3f4f6\", \"#e5e7eb\", \"#d1d5db\", \"#9ca3af\", \"#6b7280\", \"#4b5563\", \"#374151\", \"#1f2937\", \"#111827\"],\n red: [\"#fef2f2\", \"#fee2e2\", \"#fecaca\", \"#fca5a5\", \"#f87171\", \"#ef4444\", \"#dc2626\", \"#b91c1c\", \"#991b1b\", \"#7f1d1d\"],\n orange: [\"#fff7ed\", \"#ffedd5\", \"#fed7aa\", \"#fdba74\", \"#fb923c\", \"#f97316\", \"#ea580c\", \"#c2410c\", \"#9a3412\", \"#7c2d12\"],\n amber: [\"#fffbeb\", \"#fef3c7\", \"#fde68a\", \"#fcd34d\", \"#fbbf24\", \"#f59e0b\", \"#d97706\", \"#b45309\", \"#92400e\", \"#78350f\"],\n yellow: [\"#fefce8\", \"#fef9c3\", \"#fef08a\", \"#fde047\", \"#facc15\", \"#eab308\", \"#ca8a04\", \"#a16207\", \"#854d0e\", \"#713f12\"],\n lime: [\"#f7fee7\", \"#ecfccb\", \"#d9f99d\", \"#bef264\", \"#a3e635\", \"#84cc16\", \"#65a30d\", \"#4d7c0f\", \"#3f6212\", \"#365314\"],\n green: [\"#f0fdf4\", \"#dcfce7\", \"#bbf7d0\", \"#86efac\", \"#4ade80\", \"#22c55e\", \"#16a34a\", \"#15803d\", \"#166534\", \"#14532d\"],\n emerald: [\"#ecfdf5\", \"#d1fae5\", \"#a7f3d0\", \"#6ee7b7\", \"#34d399\", \"#10b981\", \"#059669\", \"#047857\", \"#065f46\", \"#064e3b\"],\n teal: [\"#f0fdfa\", \"#ccfbf1\", \"#99f6e4\", \"#5eead4\", \"#2dd4bf\", \"#14b8a6\", \"#0d9488\", \"#0f766e\", \"#115e59\", \"#134e4a\"],\n cyan: [\"#ecfeff\", \"#cffafe\", \"#a5f3fc\", \"#67e8f9\", \"#22d3ee\", \"#06b6d4\", \"#0891b2\", \"#0e7490\", \"#155e75\", \"#164e63\"],\n sky: [\"#f0f9ff\", \"#e0f2fe\", \"#bae6fd\", \"#7dd3fc\", \"#38bdf8\", \"#0ea5e9\", \"#0284c7\", \"#0369a1\", \"#075985\", \"#0c4a6e\"],\n blue: [\"#eff6ff\", \"#dbeafe\", \"#bfdbfe\", \"#93c5fd\", \"#60a5fa\", \"#3b82f6\", \"#2563eb\", \"#1d4ed8\", \"#1e40af\", \"#1e3a8a\"],\n indigo: [\"#eef2ff\", \"#e0e7ff\", \"#c7d2fe\", \"#a5b4fc\", \"#818cf8\", \"#6366f1\", \"#4f46e5\", \"#4338ca\", \"#3730a3\", \"#312e81\"],\n violet: [\"#f5f3ff\", \"#ede9fe\", \"#ddd6fe\", \"#c4b5fd\", \"#a78bfa\", \"#8b5cf6\", \"#7c3aed\", \"#6d28d9\", \"#5b21b6\", \"#4c1d95\"],\n purple: [\"#faf5ff\", \"#f3e8ff\", \"#e9d5ff\", \"#d8b4fe\", \"#c084fc\", \"#a855f7\", \"#9333ea\", \"#7e22ce\", \"#6b21a8\", \"#581c87\"],\n fuchsia: [\"#fdf4ff\", \"#fae8ff\", \"#f5d0fe\", \"#f0abfc\", \"#e879f9\", \"#d946ef\", \"#c026d3\", \"#a21caf\", \"#86198f\", \"#701a75\"],\n pink: [\"#fdf2f8\", \"#fce7f3\", \"#fbcfe8\", \"#f9a8d4\", \"#f472b6\", \"#ec4899\", \"#db2777\", \"#be185d\", \"#9d174d\", \"#831843\"],\n rose: [\"#fff1f2\", \"#ffe4e6\", \"#fecdd3\", \"#fda4af\", \"#fb7185\", \"#f43f5e\", \"#e11d48\", \"#be123c\", \"#9f1239\", \"#881337\"],\n};\n\nconst SPECIAL_COLORS = [\"#000000\", \"#ffffff\", \"transparent\"];\n\n// HEX to HSL\nfunction hexToHsl(hex: string): [number, number, number] {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return [0, 100, 50];\n\n const r = parseInt(result[1], 16) / 255;\n const g = parseInt(result[2], 16) / 255;\n const b = parseInt(result[3], 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break;\n case g: h = ((b - r) / d + 2) / 6; break;\n case b: h = ((r - g) / d + 4) / 6; break;\n }\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100)];\n}\n\n// HSL to HEX\nfunction hslToHex(h: number, s: number, l: number): string {\n s /= 100;\n l /= 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color).toString(16).padStart(2, \"0\");\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\n// 유효한 색상인지 체크\nfunction isValidColor(color: string): boolean {\n return /^#[0-9A-Fa-f]{6}$/.test(color) || color === \"transparent\";\n}\n\n/**\n * Saturation-Lightness 2D 박스\n */\nfunction SaturationLightnessPicker({\n hue,\n saturation,\n lightness,\n onChange,\n disabled,\n}: {\n hue: number;\n saturation: number;\n lightness: number;\n onChange: (s: number, l: number) => void;\n disabled?: boolean;\n}) {\n const boxRef = useRef<HTMLDivElement>(null);\n const isDragging = useRef(false);\n\n const handleChange = useCallback(\n (clientX: number, clientY: number) => {\n if (!boxRef.current || disabled) return;\n const rect = boxRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const y = Math.max(0, Math.min(1, (clientY - rect.top) / rect.height));\n const newS = Math.round(x * 100);\n const newL = Math.round((1 - y) * 100);\n onChange(newS, newL);\n },\n [onChange, disabled]\n );\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (disabled) return;\n isDragging.current = true;\n handleChange(e.clientX, e.clientY);\n };\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDragging.current) handleChange(e.clientX, e.clientY);\n };\n const handleMouseUp = () => { isDragging.current = false; };\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [handleChange]);\n\n const cursorX = saturation;\n const cursorY = 100 - lightness;\n\n return (\n <div\n ref={boxRef}\n className={cn(\n \"relative w-full h-28 rounded-md overflow-hidden\",\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-crosshair\"\n )}\n style={{\n background: `\n linear-gradient(to top, #000, transparent),\n linear-gradient(to right, #fff, hsl(${hue}, 100%, 50%))\n `,\n }}\n onMouseDown={handleMouseDown}\n >\n <div\n className=\"absolute w-4 h-4 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white shadow-md pointer-events-none\"\n style={{\n left: `${cursorX}%`,\n top: `${cursorY}%`,\n background: hslToHex(hue, saturation, lightness),\n }}\n />\n </div>\n );\n}\n\n/**\n * Hue 슬라이더\n */\nfunction HueSlider({\n hue,\n onChange,\n disabled,\n}: {\n hue: number;\n onChange: (h: number) => void;\n disabled?: boolean;\n}) {\n return (\n <div className=\"relative\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"360\"\n value={hue}\n disabled={disabled}\n onChange={(e) => onChange(Number(e.target.value))}\n className={cn(\n \"w-full h-3 rounded-md appearance-none cursor-pointer\",\n \"[&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3.5 [&::-webkit-slider-thumb]:h-3.5\",\n \"[&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white\",\n \"[&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-current\",\n \"[&::-webkit-slider-thumb]:shadow-md [&::-webkit-slider-thumb]:cursor-pointer\",\n \"[&::-moz-range-thumb]:w-3.5 [&::-moz-range-thumb]:h-3.5\",\n \"[&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:bg-white\",\n \"[&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-current\",\n \"[&::-moz-range-thumb]:shadow-md [&::-moz-range-thumb]:cursor-pointer\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n style={{\n background: `linear-gradient(to right,\n hsl(0, 100%, 50%), hsl(60, 100%, 50%), hsl(120, 100%, 50%),\n hsl(180, 100%, 50%), hsl(240, 100%, 50%), hsl(300, 100%, 50%), hsl(360, 100%, 50%)\n )`,\n color: `hsl(${hue}, 100%, 50%)`,\n }}\n />\n </div>\n );\n}\n\n/**\n * Tailwind 프리셋 탭\n */\nfunction TailwindTab({\n currentColor,\n onColorSelect,\n disabled,\n}: {\n currentColor: string;\n onColorSelect: (color: string) => void;\n disabled?: boolean;\n}) {\n return (\n <div className=\"space-y-2\">\n {/* 팔레트 그리드 */}\n <div className=\"space-y-0.5\">\n {Object.entries(TAILWIND_PALETTE).map(([colorName, shades]) => (\n <div key={colorName} className=\"flex gap-0.5\">\n {shades.map((color, idx) => (\n <button\n key={`${colorName}-${idx}`}\n type=\"button\"\n disabled={disabled}\n className={cn(\n \"flex-1 aspect-square rounded-[2px] transition-transform\",\n !disabled && \"hover:scale-110 hover:z-10\",\n currentColor.toLowerCase() === color.toLowerCase() && \"ring-1 ring-ring ring-offset-1\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n style={{ background: color }}\n onClick={() => onColorSelect(color)}\n title={`${colorName}-${(idx + 1) * 100}`}\n />\n ))}\n </div>\n ))}\n </div>\n\n {/* 특수 색상 */}\n <div className=\"flex gap-1 pt-1 border-t border-border\">\n {SPECIAL_COLORS.map((color) => (\n <button\n key={color}\n type=\"button\"\n disabled={disabled}\n className={cn(\n \"w-6 h-6 rounded-sm border border-border/50 transition-transform\",\n !disabled && \"hover:scale-110\",\n currentColor === color && \"ring-1 ring-ring ring-offset-1\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n style={{\n background: color === \"transparent\"\n ? \"repeating-conic-gradient(#ccc 0% 25%, transparent 0% 50%) 50% / 8px 8px\"\n : color,\n }}\n onClick={() => onColorSelect(color)}\n title={color}\n />\n ))}\n <span className=\"flex-1 text-[10px] text-muted-foreground self-center text-right\">\n Black / White / Transparent\n </span>\n </div>\n </div>\n );\n}\n\n/**\n * Custom 탭 (HSL + HEX)\n */\nfunction CustomTab({\n h,\n s,\n l,\n hexInput,\n onHslChange,\n onHexInputChange,\n disabled,\n}: {\n h: number;\n s: number;\n l: number;\n hexInput: string;\n onHslChange: (h: number, s: number, l: number) => void;\n onHexInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n disabled?: boolean;\n}) {\n const currentColor = hslToHex(h, s, l);\n\n return (\n <div className=\"space-y-3\">\n {/* Saturation/Lightness 박스 */}\n <SaturationLightnessPicker\n hue={h}\n saturation={s}\n lightness={l}\n onChange={(newS, newL) => onHslChange(h, newS, newL)}\n disabled={disabled}\n />\n\n {/* Hue 슬라이더 */}\n <HueSlider hue={h} onChange={(newH) => onHslChange(newH, s, l)} disabled={disabled} />\n\n {/* 프리뷰 + HEX 입력 */}\n <div className=\"flex gap-2 items-center\">\n <div\n className=\"w-10 h-10 rounded-md border border-border shadow-inner flex-shrink-0\"\n style={{ background: currentColor }}\n />\n <input\n type=\"text\"\n value={hexInput}\n onChange={onHexInputChange}\n disabled={disabled}\n className={cn(\n \"flex-1 px-3 py-2 text-sm rounded-md border bg-background font-mono\",\n \"focus:outline-none focus:ring-1 focus:ring-ring\",\n !isValidColor(hexInput) && \"border-destructive\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n placeholder=\"#000000\"\n maxLength={7}\n />\n </div>\n\n {/* HSL 값 표시 */}\n <div className=\"flex gap-2 text-[10px] text-muted-foreground\">\n <span>H: {h}°</span>\n <span>S: {s}%</span>\n <span>L: {l}%</span>\n </div>\n </div>\n );\n}\n\n/**\n * ColorPicker 컴포넌트\n *\n * 탭 기반 컬러 피커로 Tailwind CSS 프리셋과 커스텀 HSL 피커를 제공합니다.\n */\nexport const ColorPicker = React.forwardRef<HTMLDivElement, ColorPickerProps>(\n ({ value, onChange, className, disabled = false }, ref) => {\n const [activeTab, setActiveTab] = useState<TabType>(\"tailwind\");\n\n // HSL 상태\n const [hue, saturation, lightness] = hexToHsl(value || \"#3b82f6\");\n const [h, setH] = useState(hue);\n const [s, setS] = useState(saturation);\n const [l, setL] = useState(lightness);\n const [hexInput, setHexInput] = useState(value || \"#3b82f6\");\n\n // 외부 value 변경 시 동기화\n useEffect(() => {\n if (isValidColor(value)) {\n const [newH, newS, newL] = hexToHsl(value);\n setH(newH);\n setS(newS);\n setL(newL);\n setHexInput(value);\n }\n }, [value]);\n\n // HSL 변경 핸들러\n const handleHslChange = useCallback(\n (newH: number, newS: number, newL: number) => {\n setH(newH);\n setS(newS);\n setL(newL);\n const hex = hslToHex(newH, newS, newL);\n setHexInput(hex);\n onChange(hex);\n },\n [onChange]\n );\n\n // HEX 입력 핸들러\n const handleHexInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n let hex = e.target.value;\n if (!hex.startsWith(\"#\")) hex = \"#\" + hex;\n setHexInput(hex);\n if (isValidColor(hex)) {\n const [newH, newS, newL] = hexToHsl(hex);\n setH(newH);\n setS(newS);\n setL(newL);\n onChange(hex);\n }\n };\n\n // 프리셋 색상 선택\n const handleColorSelect = (color: string) => {\n if (disabled) return;\n if (color === \"transparent\") {\n setHexInput(\"transparent\");\n onChange(\"transparent\");\n return;\n }\n const [newH, newS, newL] = hexToHsl(color);\n setH(newH);\n setS(newS);\n setL(newL);\n setHexInput(color);\n onChange(color);\n };\n\n const currentColor = hslToHex(h, s, l);\n\n return (\n <div ref={ref} className={cn(\"space-y-2\", className)}>\n {/* 탭 헤더 */}\n <div className=\"flex gap-1 p-0.5 bg-muted/50 rounded-md\">\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => setActiveTab(\"tailwind\")}\n className={cn(\n \"flex-1 px-2 py-1 text-xs font-medium rounded transition-colors\",\n activeTab === \"tailwind\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n Tailwind\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => setActiveTab(\"custom\")}\n className={cn(\n \"flex-1 px-2 py-1 text-xs font-medium rounded transition-colors\",\n activeTab === \"custom\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n Custom\n </button>\n </div>\n\n {/* 현재 색상 미리보기 */}\n <div className=\"flex items-center gap-2 px-1\">\n <div\n className=\"w-6 h-6 rounded border border-border shadow-inner flex-shrink-0\"\n style={{\n background: hexInput === \"transparent\"\n ? \"repeating-conic-gradient(#ccc 0% 25%, transparent 0% 50%) 50% / 8px 8px\"\n : currentColor,\n }}\n />\n <span className=\"text-xs font-mono text-muted-foreground truncate\">\n {hexInput === \"transparent\" ? \"transparent\" : currentColor}\n </span>\n </div>\n\n {/* 탭 콘텐츠 */}\n {activeTab === \"tailwind\" ? (\n <TailwindTab currentColor={hexInput} onColorSelect={handleColorSelect} disabled={disabled} />\n ) : (\n <CustomTab\n h={h}\n s={s}\n l={l}\n hexInput={hexInput}\n onHslChange={handleHslChange}\n onHexInputChange={handleHexInputChange}\n disabled={disabled}\n />\n )}\n </div>\n );\n }\n);\n\nColorPicker.displayName = \"ColorPicker\";\n\nexport default ColorPicker;\n"]}
|