@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.
Files changed (193) hide show
  1. package/README.md +1 -1
  2. package/dist/{ComponentLayout-DrZpz0yv.d.mts → ComponentLayout-BhM4VSoq.d.mts} +1 -1
  3. package/dist/advanced-dashboard.d.mts +1 -1
  4. package/dist/advanced-dashboard.mjs +3 -3
  5. package/dist/advanced-dashboard.mjs.map +1 -1
  6. package/dist/advanced-emotion.mjs +1 -1
  7. package/dist/advanced-motion.d.mts +9 -6
  8. package/dist/advanced-motion.mjs +1 -1
  9. package/dist/advanced.d.mts +3 -3
  10. package/dist/advanced.mjs +2 -2
  11. package/dist/advanced.mjs.map +1 -1
  12. package/dist/chunk-5DPW7SVD.mjs +4 -0
  13. package/dist/{chunk-AOSXB5JJ.mjs.map → chunk-5DPW7SVD.mjs.map} +1 -1
  14. package/dist/chunk-5L5HIPKA.mjs +3 -0
  15. package/dist/{chunk-3GAUTZXQ.mjs.map → chunk-5L5HIPKA.mjs.map} +1 -1
  16. package/dist/chunk-A5YOVVM5.mjs +3 -0
  17. package/dist/chunk-A5YOVVM5.mjs.map +1 -0
  18. package/dist/chunk-CNW22G24.mjs +13 -0
  19. package/dist/chunk-CNW22G24.mjs.map +1 -0
  20. package/dist/chunk-CW66UBQG.mjs +3 -0
  21. package/dist/{chunk-6HVJFEDA.mjs.map → chunk-CW66UBQG.mjs.map} +1 -1
  22. package/dist/chunk-EAZEI74V.mjs +3 -0
  23. package/dist/chunk-EAZEI74V.mjs.map +1 -0
  24. package/dist/chunk-EPY3432E.mjs +3 -0
  25. package/dist/{chunk-MDLCJASB.mjs.map → chunk-EPY3432E.mjs.map} +1 -1
  26. package/dist/chunk-F2M4YDDQ.mjs +3 -0
  27. package/dist/{chunk-OZNST3EZ.mjs.map → chunk-F2M4YDDQ.mjs.map} +1 -1
  28. package/dist/chunk-FHMFDCX2.mjs +3 -0
  29. package/dist/{chunk-4NJE7D6X.mjs.map → chunk-FHMFDCX2.mjs.map} +1 -1
  30. package/dist/chunk-HBIUCLFL.mjs +3 -0
  31. package/dist/chunk-HBIUCLFL.mjs.map +1 -0
  32. package/dist/chunk-HEBXAFRY.mjs +3 -0
  33. package/dist/{chunk-KJZGOL2Z.mjs.map → chunk-HEBXAFRY.mjs.map} +1 -1
  34. package/dist/chunk-IG47LMOD.mjs +3 -0
  35. package/dist/{chunk-42RGFEL2.mjs.map → chunk-IG47LMOD.mjs.map} +1 -1
  36. package/dist/chunk-J47ZEXEL.mjs +3 -0
  37. package/dist/{chunk-3CCF7U3P.mjs.map → chunk-J47ZEXEL.mjs.map} +1 -1
  38. package/dist/chunk-K2FOFIST.mjs +3 -0
  39. package/dist/{chunk-IJSYSNM5.mjs.map → chunk-K2FOFIST.mjs.map} +1 -1
  40. package/dist/chunk-LL6QPRD7.mjs +3 -0
  41. package/dist/{chunk-TZ4YSHMC.mjs.map → chunk-LL6QPRD7.mjs.map} +1 -1
  42. package/dist/chunk-NMJLOK6M.mjs +3 -0
  43. package/dist/{chunk-KYRIUUQP.mjs.map → chunk-NMJLOK6M.mjs.map} +1 -1
  44. package/dist/chunk-O24K56OS.mjs +3 -0
  45. package/dist/chunk-O24K56OS.mjs.map +1 -0
  46. package/dist/chunk-OIWG3IJ7.mjs +3 -0
  47. package/dist/chunk-OIWG3IJ7.mjs.map +1 -0
  48. package/dist/chunk-OLLU7ZFH.mjs +3 -0
  49. package/dist/{chunk-XL4KTJ4L.mjs.map → chunk-OLLU7ZFH.mjs.map} +1 -1
  50. package/dist/chunk-Q76JW7X5.mjs +73 -0
  51. package/dist/chunk-Q76JW7X5.mjs.map +1 -0
  52. package/dist/chunk-QEMPERUK.mjs +3 -0
  53. package/dist/chunk-QEMPERUK.mjs.map +1 -0
  54. package/dist/chunk-QRM66RQG.mjs +3 -0
  55. package/dist/{chunk-N56BUOCD.mjs.map → chunk-QRM66RQG.mjs.map} +1 -1
  56. package/dist/chunk-QRRP7TGF.mjs +13 -0
  57. package/dist/{chunk-RS6RKW5U.mjs.map → chunk-QRRP7TGF.mjs.map} +1 -1
  58. package/dist/chunk-SD6XGDAC.mjs +3 -0
  59. package/dist/chunk-SD6XGDAC.mjs.map +1 -0
  60. package/dist/chunk-SDFVGFXT.mjs +3 -0
  61. package/dist/{chunk-CVWWS25A.mjs.map → chunk-SDFVGFXT.mjs.map} +1 -1
  62. package/dist/chunk-SMLDNOV3.mjs +8 -0
  63. package/dist/{chunk-ZXZIHU7J.mjs.map → chunk-SMLDNOV3.mjs.map} +1 -1
  64. package/dist/{chunk-FX57OSYG.mjs → chunk-TAP6MYDW.mjs} +2 -2
  65. package/dist/{chunk-FX57OSYG.mjs.map → chunk-TAP6MYDW.mjs.map} +1 -1
  66. package/dist/{chunk-WP7VFE77.mjs → chunk-TBZ645BI.mjs} +2 -2
  67. package/dist/{chunk-WP7VFE77.mjs.map → chunk-TBZ645BI.mjs.map} +1 -1
  68. package/dist/{chunk-TXBZZJNR.mjs → chunk-V2DNYJR6.mjs} +2 -2
  69. package/dist/{chunk-TXBZZJNR.mjs.map → chunk-V2DNYJR6.mjs.map} +1 -1
  70. package/dist/{chunk-Z74YUUVT.mjs → chunk-VBABZXL7.mjs} +2 -2
  71. package/dist/{chunk-Z74YUUVT.mjs.map → chunk-VBABZXL7.mjs.map} +1 -1
  72. package/dist/chunk-WYBSHTGY.mjs +3 -0
  73. package/dist/{chunk-DYNBM24D.mjs.map → chunk-WYBSHTGY.mjs.map} +1 -1
  74. package/dist/chunk-ZQUMJQYV.mjs +3 -0
  75. package/dist/chunk-ZQUMJQYV.mjs.map +1 -0
  76. package/dist/chunk-ZY23NOT4.mjs +3 -0
  77. package/dist/chunk-ZY23NOT4.mjs.map +1 -0
  78. package/dist/components/Action.d.ts.map +1 -1
  79. package/dist/components/Badge.d.ts +1 -1
  80. package/dist/components/Button.d.ts.map +1 -1
  81. package/dist/components/DatePicker.d.ts.map +1 -1
  82. package/dist/components/Dropdown.d.ts +0 -50
  83. package/dist/components/Dropdown.d.ts.map +1 -1
  84. package/dist/components/Icon/Icon.d.ts.map +1 -1
  85. package/dist/components/Modal.d.ts.map +1 -1
  86. package/dist/components/Popover.d.ts.map +1 -1
  87. package/dist/components/Progress.d.ts +2 -2
  88. package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
  89. package/dist/components/advanced/Carousel.d.ts.map +1 -1
  90. package/dist/components/advanced/ImageReveal.d.ts.map +1 -1
  91. package/dist/components/advanced/Parallax.d.ts +9 -6
  92. package/dist/components/advanced/Parallax.d.ts.map +1 -1
  93. package/dist/components/advanced/TextReveal.d.ts.map +1 -1
  94. package/dist/data.mjs +2 -2
  95. package/dist/data.mjs.map +1 -1
  96. package/dist/feedback.mjs +1 -1
  97. package/dist/form.mjs +4 -4
  98. package/dist/form.mjs.map +1 -1
  99. package/dist/{icons-DmhQEH_E.d.mts → icons-DcOBy9Hf.d.mts} +4 -0
  100. package/dist/iconsax-extended.mjs +2 -2
  101. package/dist/iconsax-extended.mjs.map +1 -1
  102. package/dist/index.d.mts +6 -87
  103. package/dist/index.mjs +14 -14
  104. package/dist/index.mjs.map +1 -1
  105. package/dist/interactive.mjs +1 -1
  106. package/dist/interactive.mjs.map +1 -1
  107. package/dist/landing.mjs +7 -7
  108. package/dist/landing.mjs.map +1 -1
  109. package/dist/lib/icon-providers.d.ts +9 -25
  110. package/dist/lib/icon-providers.d.ts.map +1 -1
  111. package/dist/lib/icons.d.ts +4 -0
  112. package/dist/lib/icons.d.ts.map +1 -1
  113. package/dist/lib/utils.d.ts.map +1 -1
  114. package/dist/navigation.d.mts +1 -1
  115. package/dist/navigation.mjs +1 -1
  116. package/dist/navigation.mjs.map +1 -1
  117. package/dist/overlay.d.mts +0 -50
  118. package/dist/overlay.mjs +1 -1
  119. package/dist/overlay.mjs.map +1 -1
  120. package/dist/sdui.mjs +1 -1
  121. package/dist/sdui.mjs.map +1 -1
  122. package/dist/theme.d.mts +85 -0
  123. package/dist/theme.d.ts +14 -0
  124. package/dist/theme.d.ts.map +1 -0
  125. package/dist/theme.mjs +3 -0
  126. package/dist/theme.mjs.map +1 -0
  127. package/package.json +18 -14
  128. package/dist/advanced-dashboard.js +0 -39
  129. package/dist/advanced-dashboard.js.map +0 -1
  130. package/dist/advanced-emotion.js +0 -2
  131. package/dist/advanced-emotion.js.map +0 -1
  132. package/dist/advanced-motion.js +0 -82
  133. package/dist/advanced-motion.js.map +0 -1
  134. package/dist/advanced.js +0 -112
  135. package/dist/advanced.js.map +0 -1
  136. package/dist/chunk-3CCF7U3P.mjs +0 -3
  137. package/dist/chunk-3GAUTZXQ.mjs +0 -3
  138. package/dist/chunk-42RGFEL2.mjs +0 -3
  139. package/dist/chunk-4NJE7D6X.mjs +0 -3
  140. package/dist/chunk-6HVJFEDA.mjs +0 -3
  141. package/dist/chunk-7OYT3QSY.mjs +0 -3
  142. package/dist/chunk-7OYT3QSY.mjs.map +0 -1
  143. package/dist/chunk-ANYZ56VB.mjs +0 -3
  144. package/dist/chunk-ANYZ56VB.mjs.map +0 -1
  145. package/dist/chunk-AOSXB5JJ.mjs +0 -4
  146. package/dist/chunk-B544MRF7.mjs +0 -3
  147. package/dist/chunk-B544MRF7.mjs.map +0 -1
  148. package/dist/chunk-CVWWS25A.mjs +0 -3
  149. package/dist/chunk-DYNBM24D.mjs +0 -3
  150. package/dist/chunk-IJSYSNM5.mjs +0 -3
  151. package/dist/chunk-KJZGOL2Z.mjs +0 -3
  152. package/dist/chunk-KYRIUUQP.mjs +0 -3
  153. package/dist/chunk-LSA7DU3N.mjs +0 -73
  154. package/dist/chunk-LSA7DU3N.mjs.map +0 -1
  155. package/dist/chunk-MDLCJASB.mjs +0 -3
  156. package/dist/chunk-N56BUOCD.mjs +0 -3
  157. package/dist/chunk-OFYITQXI.mjs +0 -13
  158. package/dist/chunk-OFYITQXI.mjs.map +0 -1
  159. package/dist/chunk-OZNST3EZ.mjs +0 -3
  160. package/dist/chunk-RS6RKW5U.mjs +0 -13
  161. package/dist/chunk-TZ4YSHMC.mjs +0 -3
  162. package/dist/chunk-U6CTBZ2U.mjs +0 -3
  163. package/dist/chunk-U6CTBZ2U.mjs.map +0 -1
  164. package/dist/chunk-XCZMLKPK.mjs +0 -3
  165. package/dist/chunk-XCZMLKPK.mjs.map +0 -1
  166. package/dist/chunk-XGHT7WMO.mjs +0 -3
  167. package/dist/chunk-XGHT7WMO.mjs.map +0 -1
  168. package/dist/chunk-XL4KTJ4L.mjs +0 -3
  169. package/dist/chunk-ZXZIHU7J.mjs +0 -8
  170. package/dist/data.js +0 -3
  171. package/dist/data.js.map +0 -1
  172. package/dist/feedback.js +0 -12
  173. package/dist/feedback.js.map +0 -1
  174. package/dist/form.js +0 -8
  175. package/dist/form.js.map +0 -1
  176. package/dist/iconsax-extended.js +0 -3
  177. package/dist/iconsax-extended.js.map +0 -1
  178. package/dist/iconsax.js +0 -3
  179. package/dist/iconsax.js.map +0 -1
  180. package/dist/index.js +0 -51
  181. package/dist/index.js.map +0 -1
  182. package/dist/interactive.js +0 -2
  183. package/dist/interactive.js.map +0 -1
  184. package/dist/landing.js +0 -100
  185. package/dist/landing.js.map +0 -1
  186. package/dist/lib/phosphor-icons.d.ts +0 -6
  187. package/dist/lib/phosphor-icons.d.ts.map +0 -1
  188. package/dist/navigation.js +0 -12
  189. package/dist/navigation.js.map +0 -1
  190. package/dist/overlay.js +0 -3
  191. package/dist/overlay.js.map +0 -1
  192. package/dist/sdui.js +0 -9
  193. package/dist/sdui.js.map +0 -1
package/dist/form.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Form.tsx","../src/components/FormControl.tsx","../src/components/Select.tsx","../src/components/Radio.tsx","../src/components/Slider.tsx","../src/components/DatePicker.tsx","../src/components/Upload.tsx","../src/components/Autocomplete.tsx","../src/components/ColorPicker.tsx"],"names":["Form","React","className","children","onSubmit","variant","props","ref","jsx","e","merge","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","selectVariants","cva","Select","size","success","leftIcon","placeholder","ariaLabel","ariaInvalid","selectRef","combinedRef","node","isFocused","setIsFocused","FORM_STATE","_a","SelectOption","Radio","id","_b","generatedId","radioId","labelId","descriptionId","sizeClasses","dotSizes","variantClasses","stateClasses","isControlled","isChecked","needsReadOnly","Slider","showValue","showLabel","step","onValueChange","orientation","disabled","isRange","currentValue","handleChange","newValue","index","newRange","thumbVariantClasses","thumbSizeClasses","orientationClasses","renderSlider","renderValue","val","_","formatDate","date","format","_locale","year","month","day","getDaysInMonth","getFirstDayOfMonth","DatePicker","onChange","minDate","maxDate","dateFormat","locale","markedDates","isOpen","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","Icon","Popover","isCurrentMonth","isDisabled","isSelected","isTodayDate","isMarked","isHovered","buttonStyle","Button","formatFileSize","bytes","k","sizes","getFileIcon","Upload","files","onRemove","multiple","accept","maxSize","maxFiles","dragDrop","fileInputRef","isDragging","setIsDragging","handleFileSelect","selectedFiles","fileArray","validFiles","file","handleClick","handleDragOver","handleDragLeave","handleDrop","handleRemove","Fragment","Autocomplete","options","loading","maxHeight","clearable","filterable","onSearch","emptyText","inputValue","setInputValue","filteredOptions","setFilteredOptions","selectedIndex","setSelectedIndex","isSearching","setIsSearching","inputRef","dropdownRef","selectedOption","opt","result","filtered","option","handleInputChange","handleInputFocus","handleInputBlur","handleOptionSelect","handleClear","handleKeyDown","Input","isValueSelected","TAILWIND_PALETTE","SPECIAL_COLORS","hexToHsl","hex","r","g","b","h","s","l","d","hslToHex","f","n","color","isValidColor","SaturationLightnessPicker","hue","saturation","lightness","boxRef","useRef","useCallback","clientX","clientY","rect","x","y","newS","newL","handleMouseDown","useEffect","handleMouseMove","handleMouseUp","cursorX","cursorY","cn","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.mjs","sourcesContent":["\"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\"\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 } ","\"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 * 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\"\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"]}
1
+ {"version":3,"sources":["../src/components/Form.tsx","../src/components/FormControl.tsx","../src/components/Select.tsx","../src/components/Radio.tsx","../src/components/Slider.tsx","../src/components/DatePicker.tsx","../src/components/Upload.tsx","../src/components/Autocomplete.tsx","../src/components/ColorPicker.tsx"],"names":["Form","React","className","children","onSubmit","variant","props","ref","jsx","e","merge","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","selectVariants","cva","Select","size","success","leftIcon","placeholder","ariaLabel","ariaInvalid","selectRef","combinedRef","node","isFocused","setIsFocused","FORM_STATE","_a","SelectOption","Radio","id","_b","generatedId","radioId","labelId","descriptionId","sizeClasses","dotSizes","variantClasses","stateClasses","isControlled","isChecked","needsReadOnly","Slider","showValue","showLabel","step","onValueChange","orientation","disabled","isRange","currentValue","handleChange","newValue","index","newRange","thumbVariantClasses","thumbSizeClasses","orientationClasses","renderSlider","renderValue","val","_","formatDate","date","format","_locale","year","month","day","getDaysInMonth","getFirstDayOfMonth","DatePicker","onChange","minDate","maxDate","dateFormat","locale","markedDates","isOpen","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","Icon","Popover","isCurrentMonth","isDisabled","isSelected","isTodayDate","isMarked","isHovered","buttonStyle","Button","formatFileSize","bytes","k","sizes","getFileIcon","Upload","files","onRemove","multiple","accept","maxSize","maxFiles","dragDrop","fileInputRef","isDragging","setIsDragging","handleFileSelect","selectedFiles","fileArray","validFiles","file","handleClick","handleDragOver","handleDragLeave","handleDrop","handleRemove","Fragment","Autocomplete","options","loading","maxHeight","clearable","filterable","onSearch","emptyText","inputValue","setInputValue","filteredOptions","setFilteredOptions","selectedIndex","setSelectedIndex","isSearching","setIsSearching","inputRef","dropdownRef","selectedOption","opt","result","filtered","option","handleInputChange","handleInputFocus","handleInputBlur","handleOptionSelect","handleClear","handleKeyDown","Input","isValueSelected","TAILWIND_PALETTE","SPECIAL_COLORS","hexToHsl","hex","r","g","b","h","s","l","d","hslToHex","f","n","color","isValidColor","SaturationLightnessPicker","hue","saturation","lightness","boxRef","useRef","useCallback","clientX","clientY","rect","x","y","newS","newL","handleMouseDown","useEffect","handleMouseMove","handleMouseUp","cursorX","cursorY","cn","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.mjs","sourcesContent":["\"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\"\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 } ","\"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 * 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\"\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 bg-popover\"\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"]}