@hua-labs/ui 2.0.2 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +34 -161
  2. package/dist/{ComponentLayout-btJq4TjA.d.mts → ComponentLayout-DrZpz0yv.d.mts} +1 -1
  3. package/dist/Section-BWzyshgX.d.mts +67 -0
  4. package/dist/advanced/dashboard.d.ts.map +1 -1
  5. package/dist/advanced-dashboard.d.mts +1 -1
  6. package/dist/advanced-dashboard.js +4 -4
  7. package/dist/advanced-dashboard.js.map +1 -1
  8. package/dist/advanced-dashboard.mjs +3 -3
  9. package/dist/advanced-dashboard.mjs.map +1 -1
  10. package/dist/advanced-emotion.mjs +1 -1
  11. package/dist/advanced-motion.d.mts +65 -1
  12. package/dist/advanced-motion.js +14 -14
  13. package/dist/advanced-motion.js.map +1 -1
  14. package/dist/advanced-motion.mjs +1 -1
  15. package/dist/advanced.d.mts +4 -4
  16. package/dist/advanced.js +16 -16
  17. package/dist/advanced.js.map +1 -1
  18. package/dist/advanced.mjs +3 -3
  19. package/dist/advanced.mjs.map +1 -1
  20. package/dist/chunk-3CCF7U3P.mjs +3 -0
  21. package/dist/{chunk-IFSEJVOR.mjs.map → chunk-3CCF7U3P.mjs.map} +1 -1
  22. package/dist/chunk-3GAUTZXQ.mjs +3 -0
  23. package/dist/{chunk-X7ZIWYRC.mjs.map → chunk-3GAUTZXQ.mjs.map} +1 -1
  24. package/dist/chunk-42RGFEL2.mjs +3 -0
  25. package/dist/chunk-42RGFEL2.mjs.map +1 -0
  26. package/dist/chunk-4NJE7D6X.mjs +3 -0
  27. package/dist/chunk-4NJE7D6X.mjs.map +1 -0
  28. package/dist/chunk-6HVJFEDA.mjs +3 -0
  29. package/dist/{chunk-FSL373O6.mjs.map → chunk-6HVJFEDA.mjs.map} +1 -1
  30. package/dist/chunk-7OYT3QSY.mjs +3 -0
  31. package/dist/chunk-7OYT3QSY.mjs.map +1 -0
  32. package/dist/chunk-ANYZ56VB.mjs +3 -0
  33. package/dist/{chunk-QQCELXFD.mjs.map → chunk-ANYZ56VB.mjs.map} +1 -1
  34. package/dist/chunk-AOSXB5JJ.mjs +4 -0
  35. package/dist/{chunk-GLZKT7JN.mjs.map → chunk-AOSXB5JJ.mjs.map} +1 -1
  36. package/dist/chunk-B544MRF7.mjs +3 -0
  37. package/dist/{chunk-SDFHJ4GB.mjs.map → chunk-B544MRF7.mjs.map} +1 -1
  38. package/dist/chunk-CVWWS25A.mjs +3 -0
  39. package/dist/chunk-CVWWS25A.mjs.map +1 -0
  40. package/dist/chunk-DYNBM24D.mjs +3 -0
  41. package/dist/{chunk-OSCMSA2Q.mjs.map → chunk-DYNBM24D.mjs.map} +1 -1
  42. package/dist/{chunk-NBJUE7NR.mjs → chunk-FX57OSYG.mjs} +2 -2
  43. package/dist/{chunk-NBJUE7NR.mjs.map → chunk-FX57OSYG.mjs.map} +1 -1
  44. package/dist/chunk-IJSYSNM5.mjs +3 -0
  45. package/dist/{chunk-IN7RWQCJ.mjs.map → chunk-IJSYSNM5.mjs.map} +1 -1
  46. package/dist/chunk-KJZGOL2Z.mjs +3 -0
  47. package/dist/{chunk-LOYAJIWO.mjs.map → chunk-KJZGOL2Z.mjs.map} +1 -1
  48. package/dist/chunk-KYRIUUQP.mjs +3 -0
  49. package/dist/{chunk-PAEKNQWW.mjs.map → chunk-KYRIUUQP.mjs.map} +1 -1
  50. package/dist/chunk-LSA7DU3N.mjs +73 -0
  51. package/dist/chunk-LSA7DU3N.mjs.map +1 -0
  52. package/dist/chunk-MDLCJASB.mjs +3 -0
  53. package/dist/{chunk-LH77I6HO.mjs.map → chunk-MDLCJASB.mjs.map} +1 -1
  54. package/dist/chunk-N56BUOCD.mjs +3 -0
  55. package/dist/{chunk-XV3Y7QVU.mjs.map → chunk-N56BUOCD.mjs.map} +1 -1
  56. package/dist/chunk-OFYITQXI.mjs +13 -0
  57. package/dist/chunk-OFYITQXI.mjs.map +1 -0
  58. package/dist/chunk-OZNST3EZ.mjs +3 -0
  59. package/dist/{chunk-SGEP3CQE.mjs.map → chunk-OZNST3EZ.mjs.map} +1 -1
  60. package/dist/chunk-RS6RKW5U.mjs +13 -0
  61. package/dist/{chunk-6KTHJ3EL.mjs.map → chunk-RS6RKW5U.mjs.map} +1 -1
  62. package/dist/{chunk-C4OACMTB.mjs → chunk-TXBZZJNR.mjs} +2 -2
  63. package/dist/{chunk-C4OACMTB.mjs.map → chunk-TXBZZJNR.mjs.map} +1 -1
  64. package/dist/chunk-TZ4YSHMC.mjs +3 -0
  65. package/dist/{chunk-UWHCM3S6.mjs.map → chunk-TZ4YSHMC.mjs.map} +1 -1
  66. package/dist/chunk-U6CTBZ2U.mjs +3 -0
  67. package/dist/chunk-U6CTBZ2U.mjs.map +1 -0
  68. package/dist/{chunk-5BMH7223.mjs → chunk-WP7VFE77.mjs} +2 -2
  69. package/dist/{chunk-5BMH7223.mjs.map → chunk-WP7VFE77.mjs.map} +1 -1
  70. package/dist/{chunk-FFH4ZFKS.mjs → chunk-XCZMLKPK.mjs} +2 -2
  71. package/dist/{chunk-FFH4ZFKS.mjs.map → chunk-XCZMLKPK.mjs.map} +1 -1
  72. package/dist/chunk-XGHT7WMO.mjs +3 -0
  73. package/dist/chunk-XGHT7WMO.mjs.map +1 -0
  74. package/dist/chunk-XL4KTJ4L.mjs +3 -0
  75. package/dist/{chunk-VWSBJUNI.mjs.map → chunk-XL4KTJ4L.mjs.map} +1 -1
  76. package/dist/chunk-Z74YUUVT.mjs +3 -0
  77. package/dist/chunk-Z74YUUVT.mjs.map +1 -0
  78. package/dist/chunk-ZXZIHU7J.mjs +8 -0
  79. package/dist/{chunk-N7M6RIN4.mjs.map → chunk-ZXZIHU7J.mjs.map} +1 -1
  80. package/dist/components/DatePicker.d.ts.map +1 -1
  81. package/dist/components/Modal.d.ts.map +1 -1
  82. package/dist/components/Popover.d.ts +2 -0
  83. package/dist/components/Popover.d.ts.map +1 -1
  84. package/dist/components/Progress.d.ts +1 -0
  85. package/dist/components/Progress.d.ts.map +1 -1
  86. package/dist/components/Section.d.ts +44 -0
  87. package/dist/components/Section.d.ts.map +1 -0
  88. package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
  89. package/dist/components/advanced/DotNav.d.ts +26 -0
  90. package/dist/components/advanced/DotNav.d.ts.map +1 -0
  91. package/dist/components/advanced/HorizontalScroll.d.ts +20 -0
  92. package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -0
  93. package/dist/components/advanced/ImageReveal.d.ts +24 -0
  94. package/dist/components/advanced/ImageReveal.d.ts.map +1 -0
  95. package/dist/components/advanced/index.d.ts +6 -0
  96. package/dist/components/advanced/index.d.ts.map +1 -1
  97. package/dist/data.mjs +2 -2
  98. package/dist/data.mjs.map +1 -1
  99. package/dist/feedback.mjs +1 -1
  100. package/dist/form.js +3 -3
  101. package/dist/form.js.map +1 -1
  102. package/dist/form.mjs +4 -4
  103. package/dist/form.mjs.map +1 -1
  104. package/dist/{icons-Bj_nr8Ba.d.mts → icons-DmhQEH_E.d.mts} +6 -1
  105. package/dist/index.d.mts +9 -27
  106. package/dist/index.d.ts +4 -0
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +6 -6
  109. package/dist/index.js.map +1 -1
  110. package/dist/index.mjs +2 -2
  111. package/dist/index.mjs.map +1 -1
  112. package/dist/interactive.js +1 -1
  113. package/dist/interactive.js.map +1 -1
  114. package/dist/interactive.mjs +1 -1
  115. package/dist/interactive.mjs.map +1 -1
  116. package/dist/landing/LandingAbout.d.ts +3 -0
  117. package/dist/landing/LandingAbout.d.ts.map +1 -0
  118. package/dist/landing/LandingCTA.d.ts +3 -0
  119. package/dist/landing/LandingCTA.d.ts.map +1 -0
  120. package/dist/landing/LandingContact.d.ts +3 -0
  121. package/dist/landing/LandingContact.d.ts.map +1 -0
  122. package/dist/landing/LandingExperience.d.ts +3 -0
  123. package/dist/landing/LandingExperience.d.ts.map +1 -0
  124. package/dist/landing/LandingFeatures.d.ts +3 -0
  125. package/dist/landing/LandingFeatures.d.ts.map +1 -0
  126. package/dist/landing/LandingHero.d.ts +3 -0
  127. package/dist/landing/LandingHero.d.ts.map +1 -0
  128. package/dist/landing/LandingLogoCloud.d.ts +3 -0
  129. package/dist/landing/LandingLogoCloud.d.ts.map +1 -0
  130. package/dist/landing/LandingMetrics.d.ts +3 -0
  131. package/dist/landing/LandingMetrics.d.ts.map +1 -0
  132. package/dist/landing/LandingProjects.d.ts +3 -0
  133. package/dist/landing/LandingProjects.d.ts.map +1 -0
  134. package/dist/landing/LandingProvider.d.ts +4 -0
  135. package/dist/landing/LandingProvider.d.ts.map +1 -0
  136. package/dist/landing/LandingShowcase.d.ts +3 -0
  137. package/dist/landing/LandingShowcase.d.ts.map +1 -0
  138. package/dist/landing/LandingSkills.d.ts +3 -0
  139. package/dist/landing/LandingSkills.d.ts.map +1 -0
  140. package/dist/landing/LandingStats.d.ts +3 -0
  141. package/dist/landing/LandingStats.d.ts.map +1 -0
  142. package/dist/landing/LandingTestimonials.d.ts +3 -0
  143. package/dist/landing/LandingTestimonials.d.ts.map +1 -0
  144. package/dist/landing/index.d.ts +47 -0
  145. package/dist/landing/index.d.ts.map +1 -0
  146. package/dist/landing/themes/app.d.ts +3 -0
  147. package/dist/landing/themes/app.d.ts.map +1 -0
  148. package/dist/landing/themes/corporate.d.ts +3 -0
  149. package/dist/landing/themes/corporate.d.ts.map +1 -0
  150. package/dist/landing/themes/dashboard.d.ts +3 -0
  151. package/dist/landing/themes/dashboard.d.ts.map +1 -0
  152. package/dist/landing/themes/immersive.d.ts +3 -0
  153. package/dist/landing/themes/immersive.d.ts.map +1 -0
  154. package/dist/landing/themes/index.d.ts +15 -0
  155. package/dist/landing/themes/index.d.ts.map +1 -0
  156. package/dist/landing/themes/marketing.d.ts +3 -0
  157. package/dist/landing/themes/marketing.d.ts.map +1 -0
  158. package/dist/landing/themes/portfolio.d.ts +3 -0
  159. package/dist/landing/themes/portfolio.d.ts.map +1 -0
  160. package/dist/landing/themes/product.d.ts +3 -0
  161. package/dist/landing/themes/product.d.ts.map +1 -0
  162. package/dist/landing/types.d.ts +346 -0
  163. package/dist/landing/types.d.ts.map +1 -0
  164. package/dist/landing.d.mts +417 -0
  165. package/dist/landing.js +100 -0
  166. package/dist/landing.js.map +1 -0
  167. package/dist/landing.mjs +31 -0
  168. package/dist/landing.mjs.map +1 -0
  169. package/dist/lib/icons.d.ts +6 -1
  170. package/dist/lib/icons.d.ts.map +1 -1
  171. package/dist/navigation.d.mts +1 -1
  172. package/dist/navigation.js +2 -2
  173. package/dist/navigation.js.map +1 -1
  174. package/dist/navigation.mjs +1 -1
  175. package/dist/navigation.mjs.map +1 -1
  176. package/dist/overlay.d.mts +2 -0
  177. package/dist/overlay.js +1 -1
  178. package/dist/overlay.js.map +1 -1
  179. package/dist/overlay.mjs +1 -1
  180. package/dist/overlay.mjs.map +1 -1
  181. package/dist/sdui.js +4 -4
  182. package/dist/sdui.js.map +1 -1
  183. package/dist/sdui.mjs +1 -1
  184. package/dist/sdui.mjs.map +1 -1
  185. package/package.json +18 -7
  186. package/src/styles/landing.css +107 -0
  187. package/src/styles/utilities.css +58 -0
  188. package/dist/chunk-6KTHJ3EL.mjs +0 -13
  189. package/dist/chunk-COR6CDMA.mjs +0 -83
  190. package/dist/chunk-COR6CDMA.mjs.map +0 -1
  191. package/dist/chunk-FSL373O6.mjs +0 -3
  192. package/dist/chunk-GLZKT7JN.mjs +0 -4
  193. package/dist/chunk-HN5LSP6L.mjs +0 -3
  194. package/dist/chunk-HN5LSP6L.mjs.map +0 -1
  195. package/dist/chunk-IFSEJVOR.mjs +0 -3
  196. package/dist/chunk-IN7RWQCJ.mjs +0 -3
  197. package/dist/chunk-LH77I6HO.mjs +0 -3
  198. package/dist/chunk-LOYAJIWO.mjs +0 -3
  199. package/dist/chunk-LPAG7DCA.mjs +0 -3
  200. package/dist/chunk-LPAG7DCA.mjs.map +0 -1
  201. package/dist/chunk-N7M6RIN4.mjs +0 -8
  202. package/dist/chunk-OSCMSA2Q.mjs +0 -3
  203. package/dist/chunk-PAEKNQWW.mjs +0 -3
  204. package/dist/chunk-QQCELXFD.mjs +0 -3
  205. package/dist/chunk-RPUS7G7Q.mjs +0 -3
  206. package/dist/chunk-RPUS7G7Q.mjs.map +0 -1
  207. package/dist/chunk-SDFHJ4GB.mjs +0 -3
  208. package/dist/chunk-SGEP3CQE.mjs +0 -3
  209. package/dist/chunk-UUHAXGMO.mjs +0 -3
  210. package/dist/chunk-UUHAXGMO.mjs.map +0 -1
  211. package/dist/chunk-UWHCM3S6.mjs +0 -3
  212. package/dist/chunk-VWSBJUNI.mjs +0 -3
  213. package/dist/chunk-X7ZIWYRC.mjs +0 -3
  214. package/dist/chunk-XV3Y7QVU.mjs +0 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/styles/cva-base.ts","../src/components/Input.tsx","../src/components/Label.tsx","../src/components/Switch.tsx"],"names":["FORM_STATE","inputVariants","cva","Input","React","className","type","variant","error","success","props","ref","ariaInvalid","isInvalid","jsx","merge","labelVariants","Label","children","required","disabled","jsxs","Switch","size","label","description","id","_a","generatedId","switchId","labelId","descriptionId","sizeClasses","thumbSizes","thumbTranslate","variantClasses","stateClasses"],"mappings":"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","file":"chunk-SGEP3CQE.mjs","sourcesContent":["/**\n * CVA 공통 상수 — 전 컴포넌트에서 재사용\n *\n * 모든 CVA variant 정의에서 import하여 사용합니다.\n * @example\n * import { SHARED_DISABLED, SHARED_FOCUS } from '../lib/styles/cva-base'\n */\n\n/** 비활성 상태 공통 스타일 */\nexport const SHARED_DISABLED =\n 'disabled:pointer-events-none disabled:opacity-50' as const\n\n/** 포커스 링 공통 스타일 */\nexport const SHARED_FOCUS =\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2' as const\n\n/** 트랜지션 공통 스타일 */\nexport const SHARED_TRANSITION =\n 'transition-colors duration-150' as const\n\n/** 글래스모피즘 공통 스타일 */\nexport const SHARED_GLASS =\n 'backdrop-blur-md border-white/20 bg-white/10 dark:bg-white/5' as const\n\n/**\n * 폼 상태 스타일 (error / success)\n * Input, Select, Textarea, Switch 등 전체 폼 컴포넌트에서 사용\n */\nexport const FORM_STATE = {\n error: 'border-destructive focus-visible:ring-destructive',\n success: 'border-green-500 focus-visible:ring-green-500',\n} as const\n\n/**\n * HUA 시그니처 스프링 이징\n * cubic-bezier(0.34, 1.56, 0.64, 1) — \"쫀득한\" 느낌\n */\nexport const HUA_SPRING_EASING =\n 'cubic-bezier(0.34, 1.56, 0.64, 1)' as const\n\n/** 마이크로 모션 기본 트랜지션 */\nexport const SHARED_MICRO_MOTION =\n 'transition-all duration-[180ms]' as const\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const inputVariants = cva(\n \"flex h-10 w-full rounded-md border px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200 hover:border-accent-foreground hover:shadow-sm\",\n {\n variants: {\n variant: {\n default: \"border-input bg-background\",\n outline: \"border-2 border-input bg-transparent\",\n filled: \"border-transparent bg-secondary/50\",\n glass: \"border-white/20 bg-white/10 text-white placeholder:text-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Input 컴포넌트의 props / Input component props\n */\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n error?: boolean\n success?: boolean\n}\n\n/**\n * Input 컴포넌트 / Input component\n *\n * 표준 HTML input 요소를 래핑한 스타일링된 입력 필드 컴포넌트입니다.\n *\n * @example\n * <Input type=\"text\" placeholder=\"이름을 입력하세요\" />\n * <Input type=\"email\" error placeholder=\"이메일\" />\n */\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, variant = \"default\", error, success, ...props }, ref) => {\n const ariaInvalid = props[\"aria-invalid\" as keyof typeof props] as boolean | undefined;\n const isInvalid = error || (ariaInvalid !== undefined ? ariaInvalid : false);\n\n return (\n <input\n type={type}\n className={merge(\n inputVariants({ variant }),\n isInvalid && FORM_STATE.error,\n success && FORM_STATE.success,\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n {\n variants: {\n variant: {\n default: \"text-foreground\",\n glass: \"text-white\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Label 컴포넌트의 props / Label component props\n */\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n required?: boolean\n error?: boolean\n disabled?: boolean\n variant?: \"default\" | \"glass\"\n}\n\n/**\n * Label 컴포넌트 / Label component\n *\n * 폼 필드의 레이블을 표시하는 컴포넌트입니다.\n *\n * @example\n * <Label htmlFor=\"email\">이메일</Label>\n * <Label required htmlFor=\"name\">이름</Label>\n * <Label error htmlFor=\"password\">비밀번호</Label>\n */\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({\n className,\n children,\n required = false,\n error = false,\n disabled = false,\n variant = \"default\",\n ...props\n }, ref) => {\n return (\n <label\n ref={ref}\n className={merge(\n labelVariants({ variant }),\n error && (variant === \"glass\" ? \"text-red-400\" : \"text-destructive\"),\n disabled && (variant === \"glass\" ? \"text-white/50\" : \"text-muted-foreground\"),\n className\n )}\n aria-required={required ? true : undefined}\n {...props}\n >\n {children}\n {required && (\n <span className={variant === \"glass\" ? \"text-red-400 ml-1\" : \"text-destructive ml-1\"} aria-label=\"필수 필드\">*</span>\n )}\n </label>\n )\n }\n)\nLabel.displayName = \"Label\"\n\nexport { Label } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Switch 컴포넌트의 props / Switch component props\n * @typedef {Object} SwitchProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Switch 스타일 변형 / Switch style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Switch 크기 / Switch size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 스위치 레이블 텍스트 / Switch label text\n * @property {string} [description] - 스위치 설명 텍스트 / Switch description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface SwitchProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Switch 컴포넌트 / Switch component\n * \n * 토글 스위치 입력 필드를 제공하는 컴포넌트입니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Toggle switch input field component.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Switch label=\"알림 받기\" />\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [enabled, setEnabled] = useState(false)\n * <Switch \n * checked={enabled}\n * onChange={(e) => setEnabled(e.target.checked)}\n * label=\"다크 모드\"\n * />\n * \n * @example\n * // 에러 상태 / Error state\n * <Switch \n * label=\"필수 설정\"\n * description=\"이 설정을 활성화해야 합니다\"\n * error\n * />\n * \n * @param {SwitchProps} props - Switch 컴포넌트의 props / Switch component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Switch 컴포넌트 / Switch component\n */\nconst Switch = React.forwardRef<HTMLInputElement, SwitchProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const generatedId = React.useId()\n const switchId = id || generatedId\n const labelId = label ? `${switchId}-label` : undefined\n const descriptionId = description ? `${switchId}-description` : undefined\n // Track sizes - proper proportions for smooth toggle\n const sizeClasses = {\n sm: \"w-9 h-5\",\n md: \"w-11 h-6\",\n lg: \"w-14 h-8\"\n }\n\n // Thumb sizes - slightly smaller than track height for padding\n const thumbSizes = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-7 h-7\"\n }\n\n // Thumb position when checked - calculated for proper alignment\n const thumbTranslate = {\n sm: \"peer-checked:translate-x-4\",\n md: \"peer-checked:translate-x-5\",\n lg: \"peer-checked:translate-x-6\"\n }\n\n const variantClasses = {\n default: \"bg-muted peer-checked:bg-primary\",\n outline: \"bg-transparent border-2 border-input peer-checked:border-primary peer-checked:bg-primary\",\n filled: \"bg-secondary peer-checked:bg-primary\",\n glass: \"bg-white/20 backdrop-blur-sm border border-white/30 peer-checked:bg-primary/50 peer-checked:border-primary/30\",\n }\n\n const stateClasses = error\n ? \"bg-destructive/20 peer-checked:bg-destructive\"\n : success\n ? \"bg-green-200 peer-checked:bg-green-600 dark:bg-green-800 dark:peer-checked:bg-green-500\"\n : \"\"\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id={switchId}\n className={merge(\n \"peer sr-only\",\n className\n )}\n ref={ref}\n aria-checked={props.checked ?? false}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"switch\"\n {...props}\n />\n <div\n className={merge(\n \"relative inline-flex cursor-pointer items-center rounded-full transition-colors duration-200 ease-in-out\",\n \"peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-ring peer-focus:ring-offset-2\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses\n )}\n >\n <div\n className={merge(\n \"pointer-events-none absolute rounded-full bg-white shadow-md ring-0\",\n \"transition-all duration-200 ease-out\",\n \"top-1/2 -translate-y-1/2 left-0.5\",\n thumbSizes[size],\n thumbTranslate[size]\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={switchId} id={labelId} className=\"text-sm font-medium text-foreground cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nSwitch.displayName = \"Switch\"\n\nexport { Switch } "]}
1
+ {"version":3,"sources":["../src/lib/styles/cva-base.ts","../src/components/Input.tsx","../src/components/Label.tsx","../src/components/Switch.tsx"],"names":["FORM_STATE","inputVariants","cva","Input","React","className","type","variant","error","success","props","ref","ariaInvalid","isInvalid","jsx","merge","labelVariants","Label","children","required","disabled","jsxs","Switch","size","label","description","id","_a","generatedId","switchId","labelId","descriptionId","sizeClasses","thumbSizes","thumbTranslate","variantClasses","stateClasses"],"mappings":"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","file":"chunk-OZNST3EZ.mjs","sourcesContent":["/**\n * CVA 공통 상수 — 전 컴포넌트에서 재사용\n *\n * 모든 CVA variant 정의에서 import하여 사용합니다.\n * @example\n * import { SHARED_DISABLED, SHARED_FOCUS } from '../lib/styles/cva-base'\n */\n\n/** 비활성 상태 공통 스타일 */\nexport const SHARED_DISABLED =\n 'disabled:pointer-events-none disabled:opacity-50' as const\n\n/** 포커스 링 공통 스타일 */\nexport const SHARED_FOCUS =\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2' as const\n\n/** 트랜지션 공통 스타일 */\nexport const SHARED_TRANSITION =\n 'transition-colors duration-150' as const\n\n/** 글래스모피즘 공통 스타일 */\nexport const SHARED_GLASS =\n 'backdrop-blur-md border-white/20 bg-white/10 dark:bg-white/5' as const\n\n/**\n * 폼 상태 스타일 (error / success)\n * Input, Select, Textarea, Switch 등 전체 폼 컴포넌트에서 사용\n */\nexport const FORM_STATE = {\n error: 'border-destructive focus-visible:ring-destructive',\n success: 'border-green-500 focus-visible:ring-green-500',\n} as const\n\n/**\n * HUA 시그니처 스프링 이징\n * cubic-bezier(0.34, 1.56, 0.64, 1) — \"쫀득한\" 느낌\n */\nexport const HUA_SPRING_EASING =\n 'cubic-bezier(0.34, 1.56, 0.64, 1)' as const\n\n/** 마이크로 모션 기본 트랜지션 */\nexport const SHARED_MICRO_MOTION =\n 'transition-all duration-[180ms]' as const\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const inputVariants = cva(\n \"flex h-10 w-full rounded-md border px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200 hover:border-accent-foreground hover:shadow-sm\",\n {\n variants: {\n variant: {\n default: \"border-input bg-background\",\n outline: \"border-2 border-input bg-transparent\",\n filled: \"border-transparent bg-secondary/50\",\n glass: \"border-white/20 bg-white/10 text-white placeholder:text-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Input 컴포넌트의 props / Input component props\n */\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n error?: boolean\n success?: boolean\n}\n\n/**\n * Input 컴포넌트 / Input component\n *\n * 표준 HTML input 요소를 래핑한 스타일링된 입력 필드 컴포넌트입니다.\n *\n * @example\n * <Input type=\"text\" placeholder=\"이름을 입력하세요\" />\n * <Input type=\"email\" error placeholder=\"이메일\" />\n */\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, variant = \"default\", error, success, ...props }, ref) => {\n const ariaInvalid = props[\"aria-invalid\" as keyof typeof props] as boolean | undefined;\n const isInvalid = error || (ariaInvalid !== undefined ? ariaInvalid : false);\n\n return (\n <input\n type={type}\n className={merge(\n inputVariants({ variant }),\n isInvalid && FORM_STATE.error,\n success && FORM_STATE.success,\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n {\n variants: {\n variant: {\n default: \"text-foreground\",\n glass: \"text-white\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Label 컴포넌트의 props / Label component props\n */\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n required?: boolean\n error?: boolean\n disabled?: boolean\n variant?: \"default\" | \"glass\"\n}\n\n/**\n * Label 컴포넌트 / Label component\n *\n * 폼 필드의 레이블을 표시하는 컴포넌트입니다.\n *\n * @example\n * <Label htmlFor=\"email\">이메일</Label>\n * <Label required htmlFor=\"name\">이름</Label>\n * <Label error htmlFor=\"password\">비밀번호</Label>\n */\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({\n className,\n children,\n required = false,\n error = false,\n disabled = false,\n variant = \"default\",\n ...props\n }, ref) => {\n return (\n <label\n ref={ref}\n className={merge(\n labelVariants({ variant }),\n error && (variant === \"glass\" ? \"text-red-400\" : \"text-destructive\"),\n disabled && (variant === \"glass\" ? \"text-white/50\" : \"text-muted-foreground\"),\n className\n )}\n aria-required={required ? true : undefined}\n {...props}\n >\n {children}\n {required && (\n <span className={variant === \"glass\" ? \"text-red-400 ml-1\" : \"text-destructive ml-1\"} aria-label=\"필수 필드\">*</span>\n )}\n </label>\n )\n }\n)\nLabel.displayName = \"Label\"\n\nexport { Label } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Switch 컴포넌트의 props / Switch component props\n * @typedef {Object} SwitchProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Switch 스타일 변형 / Switch style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Switch 크기 / Switch size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 스위치 레이블 텍스트 / Switch label text\n * @property {string} [description] - 스위치 설명 텍스트 / Switch description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface SwitchProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Switch 컴포넌트 / Switch component\n * \n * 토글 스위치 입력 필드를 제공하는 컴포넌트입니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Toggle switch input field component.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Switch label=\"알림 받기\" />\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [enabled, setEnabled] = useState(false)\n * <Switch \n * checked={enabled}\n * onChange={(e) => setEnabled(e.target.checked)}\n * label=\"다크 모드\"\n * />\n * \n * @example\n * // 에러 상태 / Error state\n * <Switch \n * label=\"필수 설정\"\n * description=\"이 설정을 활성화해야 합니다\"\n * error\n * />\n * \n * @param {SwitchProps} props - Switch 컴포넌트의 props / Switch component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Switch 컴포넌트 / Switch component\n */\nconst Switch = React.forwardRef<HTMLInputElement, SwitchProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const generatedId = React.useId()\n const switchId = id || generatedId\n const labelId = label ? `${switchId}-label` : undefined\n const descriptionId = description ? `${switchId}-description` : undefined\n // Track sizes - proper proportions for smooth toggle\n const sizeClasses = {\n sm: \"w-9 h-5\",\n md: \"w-11 h-6\",\n lg: \"w-14 h-8\"\n }\n\n // Thumb sizes - slightly smaller than track height for padding\n const thumbSizes = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-7 h-7\"\n }\n\n // Thumb position when checked - calculated for proper alignment\n const thumbTranslate = {\n sm: \"peer-checked:translate-x-4\",\n md: \"peer-checked:translate-x-5\",\n lg: \"peer-checked:translate-x-6\"\n }\n\n const variantClasses = {\n default: \"bg-muted peer-checked:bg-primary\",\n outline: \"bg-transparent border-2 border-input peer-checked:border-primary peer-checked:bg-primary\",\n filled: \"bg-secondary peer-checked:bg-primary\",\n glass: \"bg-white/20 backdrop-blur-sm border border-white/30 peer-checked:bg-primary/50 peer-checked:border-primary/30\",\n }\n\n const stateClasses = error\n ? \"bg-destructive/20 peer-checked:bg-destructive\"\n : success\n ? \"bg-green-200 peer-checked:bg-green-600 dark:bg-green-800 dark:peer-checked:bg-green-500\"\n : \"\"\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id={switchId}\n className={merge(\n \"peer sr-only\",\n className\n )}\n ref={ref}\n aria-checked={props.checked ?? false}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"switch\"\n {...props}\n />\n <div\n className={merge(\n \"relative inline-flex cursor-pointer items-center rounded-full transition-colors duration-200 ease-in-out\",\n \"peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-ring peer-focus:ring-offset-2\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses\n )}\n >\n <div\n className={merge(\n \"pointer-events-none absolute rounded-full bg-white shadow-md ring-0\",\n \"transition-all duration-200 ease-out\",\n \"top-1/2 -translate-y-1/2 left-0.5\",\n thumbSizes[size],\n thumbTranslate[size]\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={switchId} id={labelId} className=\"text-sm font-medium text-foreground cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nSwitch.displayName = \"Switch\"\n\nexport { Switch } "]}
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import {b as b$1}from'./chunk-U6CTBZ2U.mjs';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function b({className:s,size:n="md",variant:l="default",text:o,color:d="default"}){let u={sm:"w-6 h-6",md:"w-8 h-8",lg:"w-12 h-12",xl:"w-16 h-16"},r={default:"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80",primary:"border-primary/30 border-t-primary dark:border-primary/20 dark:border-t-primary/80",secondary:"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80",success:"border-green-300 border-t-green-600 dark:border-green-500/50 dark:border-t-green-300",warning:"border-yellow-300 border-t-yellow-600 dark:border-yellow-500/50 dark:border-t-yellow-300",error:"border-red-300 border-t-red-600 dark:border-red-500/50 dark:border-t-red-300",glass:"border-white/50 border-t-white/90 dark:border-slate-400/60 dark:border-t-slate-100"},m=()=>{switch(l){case "dots":return jsxs(Fragment,{children:[jsx("style",{children:`
3
+ @keyframes dotPulse {
4
+ 0%, 80%, 100% { opacity: 0.3; }
5
+ 40% { opacity: 1; }
6
+ }
7
+ `}),jsxs("div",{className:"flex space-x-1 items-center",children:[jsx("div",{className:"w-2 h-2 bg-current rounded-full",style:{animation:"dotPulse 1.4s ease-in-out infinite",animationDelay:"0ms"}}),jsx("div",{className:"w-2 h-2 bg-current rounded-full",style:{animation:"dotPulse 1.4s ease-in-out infinite",animationDelay:"200ms"}}),jsx("div",{className:"w-2 h-2 bg-current rounded-full",style:{animation:"dotPulse 1.4s ease-in-out infinite",animationDelay:"400ms"}})]})]});case "bars":return jsxs(Fragment,{children:[jsx("style",{children:`
8
+ @keyframes barWave {
9
+ 0%, 40%, 100% { transform: scaleY(0.4); }
10
+ 20% { transform: scaleY(1); }
11
+ }
12
+ `}),jsxs("div",{className:"flex space-x-0.5 h-full items-center",children:[jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"0ms"}}),jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"100ms"}}),jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"200ms"}}),jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"300ms"}}),jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"400ms"}})]})]});case "ring":return jsx("div",{className:b$1("w-full h-full animate-spin rounded-full",n==="xl"?"border-[3px]":n==="lg"?"border-[2.5px]":"border-2",r[d]||r.default)});case "ripple":return jsxs("div",{className:"relative w-full h-full",children:[jsx("div",{className:b$1("absolute inset-0 rounded-full border-2 animate-ping",r[d]||r.default)}),jsx("div",{className:b$1("w-full h-full rounded-full border-2",r[d]||r.default)})]});default:return jsx("div",{className:b$1("w-full h-full animate-spin rounded-full",n==="xl"?"border-[3px]":n==="lg"?"border-[2.5px]":"border-2",r[d]||r.default)})}};return jsxs("div",{className:b$1("flex flex-col items-center justify-center",s),children:[jsx("div",{className:b$1(u[n],"text-muted-foreground"),children:m()}),o&&jsx("p",{className:"mt-3 text-sm text-muted-foreground text-center",children:o})]})}export{b as a};//# sourceMappingURL=chunk-RS6RKW5U.mjs.map
13
+ //# sourceMappingURL=chunk-RS6RKW5U.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/LoadingSpinner.tsx"],"names":["LoadingSpinner","className","size","variant","text","color","sizeClasses","spinnerColors","renderSpinner","jsxs","Fragment","jsx","merge"],"mappings":"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","file":"chunk-6KTHJ3EL.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @typedef {Object} LoadingSpinnerProps\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\"} [size=\"md\"] - Spinner 크기 / Spinner size\n * @property {\"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"} [variant=\"default\"] - Spinner 애니메이션 타입 / Spinner animation type\n * @property {string} [text] - Spinner 아래 표시할 텍스트 / Text to display below spinner\n * @property {\"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"} [color=\"default\"] - Spinner 색상 / Spinner color\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface LoadingSpinnerProps {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n variant?: \"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"\n text?: string\n color?: \"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"\n className?: string\n}\n\n/**\n * LoadingSpinner 컴포넌트 / LoadingSpinner component\n * \n * 로딩 상태를 표시하는 스피너 컴포넌트입니다.\n * 다양한 애니메이션 타입과 크기를 지원합니다.\n * \n * Spinner component that displays loading state.\n * Supports various animation types and sizes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <LoadingSpinner />\n * \n * @example\n * // 텍스트와 함께 / With text\n * <LoadingSpinner \n * text=\"로딩 중...\"\n * size=\"lg\"\n * color=\"primary\"\n * />\n * \n * @example\n * // 다양한 애니메이션 / Various animations\n * <LoadingSpinner variant=\"dots\" />\n * <LoadingSpinner variant=\"bars\" color=\"success\" />\n * <LoadingSpinner variant=\"ripple\" size=\"xl\" />\n * \n * @param {LoadingSpinnerProps} props - LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @returns {JSX.Element} LoadingSpinner 컴포넌트 / LoadingSpinner component\n */\nexport function LoadingSpinner({ \n className, \n size = \"md\", \n variant = \"default\", \n text, \n color = \"default\" \n}: LoadingSpinnerProps) {\n const sizeClasses = {\n sm: \"w-6 h-6\", // 24px - 더 넉넉한 크기\n md: \"w-8 h-8\", // 32px - 더 넉넉한 크기\n lg: \"w-12 h-12\", // 48px - 더 넉넉한 크기\n xl: \"w-16 h-16\" // 64px - 더 넉넉한 크기\n }\n\n // LoadingSpinner는 border 색상을 사용하므로 특화 색상 시스템 사용\n // 다크모드: track(배경)은 밝게, spinner(회전부)는 더 밝게 → 대비 확보\n const spinnerColors: Record<string, string> = {\n default: \"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80\",\n primary: \"border-primary/30 border-t-primary dark:border-primary/20 dark:border-t-primary/80\",\n secondary: \"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80\",\n success: \"border-green-300 border-t-green-600 dark:border-green-500/50 dark:border-t-green-300\",\n warning: \"border-yellow-300 border-t-yellow-600 dark:border-yellow-500/50 dark:border-t-yellow-300\",\n error: \"border-red-300 border-t-red-600 dark:border-red-500/50 dark:border-t-red-300\",\n glass: \"border-white/50 border-t-white/90 dark:border-slate-400/60 dark:border-t-slate-100\"\n }\n\n const renderSpinner = () => {\n switch (variant) {\n case \"dots\":\n // 순차 점멸 애니메이션 (... 형태)\n return (\n <>\n <style>{`\n @keyframes dotPulse {\n 0%, 80%, 100% { opacity: 0.3; }\n 40% { opacity: 1; }\n }\n `}</style>\n <div className=\"flex space-x-1 items-center\">\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '0ms' }} />\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '200ms' }} />\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '400ms' }} />\n </div>\n </>\n )\n case \"bars\":\n return (\n <>\n <style>{`\n @keyframes barWave {\n 0%, 40%, 100% { transform: scaleY(0.4); }\n 20% { transform: scaleY(1); }\n }\n `}</style>\n <div className=\"flex space-x-0.5 h-full items-center\">\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '0ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '100ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '200ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '300ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '400ms' }} />\n </div>\n </>\n )\n case \"ring\":\n return (\n <div className={merge(\n \"w-full h-full animate-spin rounded-full\",\n size === \"xl\" ? \"border-[3px]\" : size === \"lg\" ? \"border-[2.5px]\" : \"border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n case \"ripple\":\n return (\n <div className=\"relative w-full h-full\">\n <div className={merge(\n \"absolute inset-0 rounded-full border-2 animate-ping\",\n spinnerColors[color] || spinnerColors.default\n )} />\n <div className={merge(\n \"w-full h-full rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n </div>\n )\n default:\n return (\n <div className={merge(\n \"w-full h-full animate-spin rounded-full\",\n size === \"xl\" ? \"border-[3px]\" : size === \"lg\" ? \"border-[2.5px]\" : \"border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n }\n }\n\n return (\n <div className={merge(\"flex flex-col items-center justify-center\", className)}>\n <div className={merge(sizeClasses[size], \"text-muted-foreground\")}>\n {renderSpinner()}\n </div>\n {text && (\n <p className=\"mt-3 text-sm text-muted-foreground text-center\">\n {text}\n </p>\n )}\n </div>\n )\n} "]}
1
+ {"version":3,"sources":["../src/components/LoadingSpinner.tsx"],"names":["LoadingSpinner","className","size","variant","text","color","sizeClasses","spinnerColors","renderSpinner","jsxs","Fragment","jsx","merge"],"mappings":"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","file":"chunk-RS6RKW5U.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @typedef {Object} LoadingSpinnerProps\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\"} [size=\"md\"] - Spinner 크기 / Spinner size\n * @property {\"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"} [variant=\"default\"] - Spinner 애니메이션 타입 / Spinner animation type\n * @property {string} [text] - Spinner 아래 표시할 텍스트 / Text to display below spinner\n * @property {\"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"} [color=\"default\"] - Spinner 색상 / Spinner color\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface LoadingSpinnerProps {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n variant?: \"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"\n text?: string\n color?: \"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"\n className?: string\n}\n\n/**\n * LoadingSpinner 컴포넌트 / LoadingSpinner component\n * \n * 로딩 상태를 표시하는 스피너 컴포넌트입니다.\n * 다양한 애니메이션 타입과 크기를 지원합니다.\n * \n * Spinner component that displays loading state.\n * Supports various animation types and sizes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <LoadingSpinner />\n * \n * @example\n * // 텍스트와 함께 / With text\n * <LoadingSpinner \n * text=\"로딩 중...\"\n * size=\"lg\"\n * color=\"primary\"\n * />\n * \n * @example\n * // 다양한 애니메이션 / Various animations\n * <LoadingSpinner variant=\"dots\" />\n * <LoadingSpinner variant=\"bars\" color=\"success\" />\n * <LoadingSpinner variant=\"ripple\" size=\"xl\" />\n * \n * @param {LoadingSpinnerProps} props - LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @returns {JSX.Element} LoadingSpinner 컴포넌트 / LoadingSpinner component\n */\nexport function LoadingSpinner({ \n className, \n size = \"md\", \n variant = \"default\", \n text, \n color = \"default\" \n}: LoadingSpinnerProps) {\n const sizeClasses = {\n sm: \"w-6 h-6\", // 24px - 더 넉넉한 크기\n md: \"w-8 h-8\", // 32px - 더 넉넉한 크기\n lg: \"w-12 h-12\", // 48px - 더 넉넉한 크기\n xl: \"w-16 h-16\" // 64px - 더 넉넉한 크기\n }\n\n // LoadingSpinner는 border 색상을 사용하므로 특화 색상 시스템 사용\n // 다크모드: track(배경)은 밝게, spinner(회전부)는 더 밝게 → 대비 확보\n const spinnerColors: Record<string, string> = {\n default: \"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80\",\n primary: \"border-primary/30 border-t-primary dark:border-primary/20 dark:border-t-primary/80\",\n secondary: \"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80\",\n success: \"border-green-300 border-t-green-600 dark:border-green-500/50 dark:border-t-green-300\",\n warning: \"border-yellow-300 border-t-yellow-600 dark:border-yellow-500/50 dark:border-t-yellow-300\",\n error: \"border-red-300 border-t-red-600 dark:border-red-500/50 dark:border-t-red-300\",\n glass: \"border-white/50 border-t-white/90 dark:border-slate-400/60 dark:border-t-slate-100\"\n }\n\n const renderSpinner = () => {\n switch (variant) {\n case \"dots\":\n // 순차 점멸 애니메이션 (... 형태)\n return (\n <>\n <style>{`\n @keyframes dotPulse {\n 0%, 80%, 100% { opacity: 0.3; }\n 40% { opacity: 1; }\n }\n `}</style>\n <div className=\"flex space-x-1 items-center\">\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '0ms' }} />\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '200ms' }} />\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '400ms' }} />\n </div>\n </>\n )\n case \"bars\":\n return (\n <>\n <style>{`\n @keyframes barWave {\n 0%, 40%, 100% { transform: scaleY(0.4); }\n 20% { transform: scaleY(1); }\n }\n `}</style>\n <div className=\"flex space-x-0.5 h-full items-center\">\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '0ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '100ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '200ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '300ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '400ms' }} />\n </div>\n </>\n )\n case \"ring\":\n return (\n <div className={merge(\n \"w-full h-full animate-spin rounded-full\",\n size === \"xl\" ? \"border-[3px]\" : size === \"lg\" ? \"border-[2.5px]\" : \"border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n case \"ripple\":\n return (\n <div className=\"relative w-full h-full\">\n <div className={merge(\n \"absolute inset-0 rounded-full border-2 animate-ping\",\n spinnerColors[color] || spinnerColors.default\n )} />\n <div className={merge(\n \"w-full h-full rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n </div>\n )\n default:\n return (\n <div className={merge(\n \"w-full h-full animate-spin rounded-full\",\n size === \"xl\" ? \"border-[3px]\" : size === \"lg\" ? \"border-[2.5px]\" : \"border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n }\n }\n\n return (\n <div className={merge(\"flex flex-col items-center justify-center\", className)}>\n <div className={merge(sizeClasses[size], \"text-muted-foreground\")}>\n {renderSpinner()}\n </div>\n {text && (\n <p className=\"mt-3 text-sm text-muted-foreground text-center\">\n {text}\n </p>\n )}\n </div>\n )\n} "]}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import {a}from'./chunk-UUHAXGMO.mjs';import o from'react';import {jsx,jsxs}from'react/jsx-runtime';var n=o.forwardRef(({className:a$1,variant:r="default",title:t,description:i,icon:d,action:c,closable:u=false,onClose:k,children:m,...v},b)=>{let p=()=>{switch(r){case "success":return "bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200";case "warning":return "bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200";case "error":return "bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200";case "info":return "bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200";default:return "bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200"}},g=()=>{switch(r){case "success":return "text-green-500 dark:text-green-400";case "warning":return "text-yellow-500 dark:text-yellow-400";case "error":return "text-red-500 dark:text-red-400";case "info":return "text-cyan-500 dark:text-cyan-400";default:return "text-muted-foreground"}},f=()=>{switch(r){case "success":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})});case "warning":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})});case "error":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})});case "info":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})});default:return null}};return jsx("div",{ref:b,className:a("relative rounded-lg border p-4",p(),a$1),...v,children:jsxs("div",{className:"flex items-start gap-3",children:[" ",(d||f())&&jsx("div",{className:a("flex-shrink-0 mt-0.5",g()),children:d||f()}),jsxs("div",{className:"flex-1 min-w-0",children:[t&&jsxs("h4",{className:"text-sm font-semibold mb-1",children:[" ",t]}),i&&jsx("p",{className:"text-sm leading-relaxed",children:i}),m&&jsxs("div",{className:"mt-2",children:[" ",m]})]}),(c||u)&&jsxs("div",{className:"flex-shrink-0 flex items-center gap-2",children:[" ",c,u&&jsx("button",{onClick:k,className:a("inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2",g()),"aria-label":"\uB2EB\uAE30",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]})]})})});n.displayName="Alert";var x=o.forwardRef(({className:a,...r},t)=>jsx(n,{ref:t,variant:"success",className:a,...r}));x.displayName="AlertSuccess";var w=o.forwardRef(({className:a,...r},t)=>jsx(n,{ref:t,variant:"warning",className:a,...r}));w.displayName="AlertWarning";var h=o.forwardRef(({className:a,...r},t)=>jsx(n,{ref:t,variant:"error",className:a,...r}));h.displayName="AlertError";var N=o.forwardRef(({className:a,...r},t)=>jsx(n,{ref:t,variant:"info",className:a,...r}));N.displayName="AlertInfo";export{n as a,x as b,w as c,h as d,N as e};//# sourceMappingURL=chunk-C4OACMTB.mjs.map
3
- //# sourceMappingURL=chunk-C4OACMTB.mjs.map
2
+ import {b}from'./chunk-U6CTBZ2U.mjs';import o from'react';import {jsx,jsxs}from'react/jsx-runtime';var n=o.forwardRef(({className:a,variant:r="default",title:t,description:i,icon:d,action:c,closable:u=false,onClose:k,children:m,...v},b$1)=>{let p=()=>{switch(r){case "success":return "bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200";case "warning":return "bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200";case "error":return "bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200";case "info":return "bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200";default:return "bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200"}},g=()=>{switch(r){case "success":return "text-green-500 dark:text-green-400";case "warning":return "text-yellow-500 dark:text-yellow-400";case "error":return "text-red-500 dark:text-red-400";case "info":return "text-cyan-500 dark:text-cyan-400";default:return "text-muted-foreground"}},f=()=>{switch(r){case "success":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})});case "warning":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})});case "error":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})});case "info":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})});default:return null}};return jsx("div",{ref:b$1,className:b("relative rounded-lg border p-4",p(),a),...v,children:jsxs("div",{className:"flex items-start gap-3",children:[" ",(d||f())&&jsx("div",{className:b("flex-shrink-0 mt-0.5",g()),children:d||f()}),jsxs("div",{className:"flex-1 min-w-0",children:[t&&jsxs("h4",{className:"text-sm font-semibold mb-1",children:[" ",t]}),i&&jsx("p",{className:"text-sm leading-relaxed",children:i}),m&&jsxs("div",{className:"mt-2",children:[" ",m]})]}),(c||u)&&jsxs("div",{className:"flex-shrink-0 flex items-center gap-2",children:[" ",c,u&&jsx("button",{onClick:k,className:b("inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2",g()),"aria-label":"\uB2EB\uAE30",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]})]})})});n.displayName="Alert";var x=o.forwardRef(({className:a,...r},t)=>jsx(n,{ref:t,variant:"success",className:a,...r}));x.displayName="AlertSuccess";var w=o.forwardRef(({className:a,...r},t)=>jsx(n,{ref:t,variant:"warning",className:a,...r}));w.displayName="AlertWarning";var h=o.forwardRef(({className:a,...r},t)=>jsx(n,{ref:t,variant:"error",className:a,...r}));h.displayName="AlertError";var N=o.forwardRef(({className:a,...r},t)=>jsx(n,{ref:t,variant:"info",className:a,...r}));N.displayName="AlertInfo";export{n as a,x as b,w as c,h as d,N as e};//# sourceMappingURL=chunk-TXBZZJNR.mjs.map
3
+ //# sourceMappingURL=chunk-TXBZZJNR.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Alert.tsx"],"names":["Alert","React","className","variant","title","description","icon","action","closable","onClose","children","props","ref","getVariantClasses","getIconClasses","getDefaultIcon","jsx","merge","jsxs","AlertSuccess","AlertWarning","AlertError","AlertInfo"],"mappings":"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","file":"chunk-C4OACMTB.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Alert 컴포넌트의 props\n * @typedef {Object} AlertProps\n * @property {\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"} [variant=\"default\"] - Alert 스타일 변형\n * @property {string} [title] - Alert 제목\n * @property {string} [description] - Alert 설명\n * @property {React.ReactNode} [icon] - 커스텀 아이콘\n * @property {React.ReactNode} [action] - 액션 버튼/요소\n * @property {boolean} [closable=false] - 닫기 버튼 표시 여부\n * @property {() => void} [onClose] - 닫기 버튼 클릭 시 호출되는 콜백\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\"\n title?: string\n description?: string\n icon?: React.ReactNode\n action?: React.ReactNode\n closable?: boolean\n onClose?: () => void\n}\n\n/**\n * Alert 컴포넌트 / Alert component\n * \n * 사용자에게 중요한 정보나 경고를 표시하는 컴포넌트입니다.\n * 다양한 변형(variant)을 지원하며, 아이콘, 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n * \n * Component for displaying important information or warnings to users.\n * Supports various variants and can include icons, titles, descriptions, and action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Alert variant=\"info\" title=\"정보\" description=\"이것은 정보 메시지입니다.\" />\n * \n * @example\n * // 닫기 버튼 포함 / With close button\n * <Alert \n * variant=\"warning\" \n * title=\"경고\" \n * closable \n * onClose={() => console.log('닫기')}\n * />\n * \n * @example\n * // 커스텀 아이콘과 액션 / Custom icon and action\n * <Alert \n * variant=\"success\"\n * icon={<Icon name=\"check\" />}\n * action={<Button size=\"sm\">확인</Button>}\n * >\n * 작업이 완료되었습니다.\n * </Alert>\n * \n * @param {AlertProps} props - Alert 컴포넌트의 props / Alert component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Alert 컴포넌트 / Alert component\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ \n className, \n variant = \"default\",\n title,\n description,\n icon,\n action,\n closable = false,\n onClose,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"success\":\n return \"bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200\"\n case \"warning\":\n return \"bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200\"\n case \"error\":\n return \"bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200\"\n case \"info\":\n return \"bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200\"\n default:\n return \"bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200\"\n }\n }\n\n const getIconClasses = () => {\n switch (variant) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n default:\n return \"text-muted-foreground\"\n }\n }\n\n const getDefaultIcon = () => {\n switch (variant) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n default:\n return null\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative rounded-lg border p-4\", // 16px 패딩\n getVariantClasses(),\n className\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\"> {/* 12px 간격 */}\n {/* 아이콘 */}\n {(icon || getDefaultIcon()) && (\n <div className={merge(\"flex-shrink-0 mt-0.5\", getIconClasses())}>\n {icon || getDefaultIcon()}\n </div>\n )}\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {title}\n </h4>\n )}\n {description && (\n <p className=\"text-sm leading-relaxed\">\n {description}\n </p>\n )}\n {children && (\n <div className=\"mt-2\"> {/* 8px 여백 */}\n {children}\n </div>\n )}\n </div>\n\n {/* 액션 */}\n {(action || closable) && (\n <div className=\"flex-shrink-0 flex items-center gap-2\"> {/* 8px 간격 */}\n {action}\n {closable && (\n <button\n onClick={onClose}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconClasses()\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\nAlert.displayName = \"Alert\"\n\n// 편의 컴포넌트들\nexport const AlertSuccess = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nAlertSuccess.displayName = \"AlertSuccess\"\n\nexport const AlertWarning = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nAlertWarning.displayName = \"AlertWarning\"\n\nexport const AlertError = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nAlertError.displayName = \"AlertError\"\n\nexport const AlertInfo = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nAlertInfo.displayName = \"AlertInfo\"\n\nexport { Alert } "]}
1
+ {"version":3,"sources":["../src/components/Alert.tsx"],"names":["Alert","React","className","variant","title","description","icon","action","closable","onClose","children","props","ref","getVariantClasses","getIconClasses","getDefaultIcon","jsx","merge","jsxs","AlertSuccess","AlertWarning","AlertError","AlertInfo"],"mappings":"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","file":"chunk-TXBZZJNR.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Alert 컴포넌트의 props\n * @typedef {Object} AlertProps\n * @property {\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"} [variant=\"default\"] - Alert 스타일 변형\n * @property {string} [title] - Alert 제목\n * @property {string} [description] - Alert 설명\n * @property {React.ReactNode} [icon] - 커스텀 아이콘\n * @property {React.ReactNode} [action] - 액션 버튼/요소\n * @property {boolean} [closable=false] - 닫기 버튼 표시 여부\n * @property {() => void} [onClose] - 닫기 버튼 클릭 시 호출되는 콜백\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\"\n title?: string\n description?: string\n icon?: React.ReactNode\n action?: React.ReactNode\n closable?: boolean\n onClose?: () => void\n}\n\n/**\n * Alert 컴포넌트 / Alert component\n * \n * 사용자에게 중요한 정보나 경고를 표시하는 컴포넌트입니다.\n * 다양한 변형(variant)을 지원하며, 아이콘, 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n * \n * Component for displaying important information or warnings to users.\n * Supports various variants and can include icons, titles, descriptions, and action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Alert variant=\"info\" title=\"정보\" description=\"이것은 정보 메시지입니다.\" />\n * \n * @example\n * // 닫기 버튼 포함 / With close button\n * <Alert \n * variant=\"warning\" \n * title=\"경고\" \n * closable \n * onClose={() => console.log('닫기')}\n * />\n * \n * @example\n * // 커스텀 아이콘과 액션 / Custom icon and action\n * <Alert \n * variant=\"success\"\n * icon={<Icon name=\"check\" />}\n * action={<Button size=\"sm\">확인</Button>}\n * >\n * 작업이 완료되었습니다.\n * </Alert>\n * \n * @param {AlertProps} props - Alert 컴포넌트의 props / Alert component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Alert 컴포넌트 / Alert component\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ \n className, \n variant = \"default\",\n title,\n description,\n icon,\n action,\n closable = false,\n onClose,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"success\":\n return \"bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200\"\n case \"warning\":\n return \"bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200\"\n case \"error\":\n return \"bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200\"\n case \"info\":\n return \"bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200\"\n default:\n return \"bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200\"\n }\n }\n\n const getIconClasses = () => {\n switch (variant) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n default:\n return \"text-muted-foreground\"\n }\n }\n\n const getDefaultIcon = () => {\n switch (variant) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n default:\n return null\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative rounded-lg border p-4\", // 16px 패딩\n getVariantClasses(),\n className\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\"> {/* 12px 간격 */}\n {/* 아이콘 */}\n {(icon || getDefaultIcon()) && (\n <div className={merge(\"flex-shrink-0 mt-0.5\", getIconClasses())}>\n {icon || getDefaultIcon()}\n </div>\n )}\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {title}\n </h4>\n )}\n {description && (\n <p className=\"text-sm leading-relaxed\">\n {description}\n </p>\n )}\n {children && (\n <div className=\"mt-2\"> {/* 8px 여백 */}\n {children}\n </div>\n )}\n </div>\n\n {/* 액션 */}\n {(action || closable) && (\n <div className=\"flex-shrink-0 flex items-center gap-2\"> {/* 8px 간격 */}\n {action}\n {closable && (\n <button\n onClick={onClose}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconClasses()\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\nAlert.displayName = \"Alert\"\n\n// 편의 컴포넌트들\nexport const AlertSuccess = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nAlertSuccess.displayName = \"AlertSuccess\"\n\nexport const AlertWarning = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nAlertWarning.displayName = \"AlertWarning\"\n\nexport const AlertError = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nAlertError.displayName = \"AlertError\"\n\nexport const AlertInfo = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nAlertInfo.displayName = \"AlertInfo\"\n\nexport { Alert } "]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import {a}from'./chunk-OZNST3EZ.mjs';import {l}from'./chunk-7OYT3QSY.mjs';import {b}from'./chunk-U6CTBZ2U.mjs';import w from'react';import {cva}from'class-variance-authority';import {jsx,jsxs}from'react/jsx-runtime';var L=cva("flex w-full rounded-md border transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-offset-2 hover:border-accent-foreground hover:shadow-sm disabled:cursor-not-allowed disabled:opacity-50 placeholder:text-muted-foreground",{variants:{variant:{default:"border-input bg-background text-foreground focus:border-ring focus:ring-ring",outline:"border-2 border-input bg-transparent text-foreground focus:border-ring focus:ring-ring",filled:"border-transparent bg-secondary/50 text-foreground focus:bg-background focus:border-ring focus:ring-ring",ghost:"border-transparent bg-transparent text-foreground focus:bg-muted focus:border-border focus:ring-muted-foreground",glass:"border-white/30 bg-white/10 backdrop-blur-sm text-white placeholder:text-white/60 focus:border-ring/50 focus:ring-ring/20 focus:bg-white/20"},size:{sm:"px-3 py-2 text-sm min-h-[80px]",md:"px-4 py-3 text-base min-h-[100px]",lg:"px-4 py-3 text-lg min-h-[120px]"},resize:{none:"resize-none",vertical:"resize-y",horizontal:"resize-x",both:"resize"}},defaultVariants:{variant:"default",size:"md",resize:"vertical"}}),O=w.forwardRef(({className:l,variant:c="default",size:i="md",error:a$1=false,success:u=false,resize:r="vertical",...t},f)=>{let e=t["aria-invalid"],g=a$1||(e!==void 0?e:false);return jsx("textarea",{className:b(L({variant:c,size:i,resize:r}),a$1&&a.error,u&&a.success,l),ref:f,"aria-invalid":g||void 0,...t})});O.displayName="Textarea";var E=w.forwardRef(({className:l$1,variant:c="default",size:i="md",error:a=false,success:u=false,label:r,description:t,id:f,...e},g)=>{var h,v;let k=w.useId(),s=f||k,p=r?`${s}-label`:void 0,x=t?`${s}-description`:void 0,z={sm:"w-4 h-4",md:"w-5 h-5",lg:"w-6 h-6"},T={sm:12,md:14,lg:16},C={default:"border-input bg-background text-primary focus:ring-ring",outline:"border-2 border-input bg-transparent text-primary focus:ring-ring",filled:"border-transparent bg-muted text-primary focus:bg-background focus:ring-ring",glass:"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:ring-ring/50 focus:bg-white/20"},I=a?"border-destructive focus:ring-destructive":u?"border-green-500 focus:ring-green-500":"",N=e.checked!==void 0,d=(v=(h=e.checked)!=null?h:e.defaultChecked)!=null?v:false,R=N&&!e.onChange&&!e.readOnly;return jsxs("div",{className:"flex items-start space-x-3",children:[jsxs("div",{className:"relative",children:[jsx("input",{type:"checkbox",id:s,className:b("peer absolute inset-0 w-full h-full opacity-0 cursor-pointer z-10",l$1),ref:g,"aria-checked":d,"aria-invalid":a,"aria-label":r?void 0:e["aria-label"],"aria-labelledby":r?p:void 0,"aria-describedby":x,role:"checkbox",readOnly:R||e.readOnly,...e}),jsx("div",{className:b("flex items-center justify-center rounded border transition-all duration-200 cursor-pointer relative","peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-offset-2","peer-hover:border-accent-foreground peer-hover:shadow-sm","peer-disabled:cursor-not-allowed peer-disabled:opacity-50",z[i],C[c],I,d&&"bg-primary border-primary shadow-md shadow-primary/20",!d&&"bg-background"),children:jsx(l,{name:"check",size:T[i],className:b("text-white transition-all duration-200",d?"opacity-100 scale-100":"opacity-0 scale-0")})})]}),(r||t)&&jsxs("div",{className:"flex flex-col",children:[r&&jsx("label",{htmlFor:s,id:p,className:"text-sm font-medium text-foreground cursor-pointer",children:r}),t&&jsx("p",{id:x,className:"text-sm text-muted-foreground",children:t})]})]})});E.displayName="Checkbox";export{O as a,E as b};//# sourceMappingURL=chunk-TZ4YSHMC.mjs.map
3
+ //# sourceMappingURL=chunk-TZ4YSHMC.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Textarea.tsx","../src/components/Checkbox.tsx"],"names":["textareaVariants","cva","Textarea","React","className","variant","size","error","success","resize","props","ref","ariaInvalid","isInvalid","jsx","merge","FORM_STATE","Checkbox","label","description","id","_a","_b","generatedId","checkboxId","labelId","descriptionId","sizeClasses","iconSizes","variantClasses","stateClasses","isControlled","isChecked","needsReadOnly","jsxs","Icon"],"mappings":"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","file":"chunk-UWHCM3S6.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const textareaVariants = cva(\n \"flex w-full rounded-md border transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-offset-2 hover:border-accent-foreground hover:shadow-sm disabled:cursor-not-allowed disabled:opacity-50 placeholder:text-muted-foreground\",\n {\n variants: {\n variant: {\n default: \"border-input bg-background text-foreground focus:border-ring focus:ring-ring\",\n outline: \"border-2 border-input bg-transparent text-foreground focus:border-ring focus:ring-ring\",\n filled: \"border-transparent bg-secondary/50 text-foreground focus:bg-background focus:border-ring focus:ring-ring\",\n ghost: \"border-transparent bg-transparent text-foreground focus:bg-muted focus:border-border focus:ring-muted-foreground\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white placeholder:text-white/60 focus:border-ring/50 focus:ring-ring/20 focus:bg-white/20\",\n },\n size: {\n sm: \"px-3 py-2 text-sm min-h-[80px]\",\n md: \"px-4 py-3 text-base min-h-[100px]\",\n lg: \"px-4 py-3 text-lg min-h-[120px]\",\n },\n resize: {\n none: \"resize-none\",\n vertical: \"resize-y\",\n horizontal: \"resize-x\",\n both: \"resize\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n resize: \"vertical\",\n },\n }\n)\n\n/**\n * Textarea 컴포넌트의 props / Textarea component props\n */\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n resize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\"\n}\n\n/**\n * Textarea 컴포넌트 / Textarea component\n * \n * 여러 줄 텍스트 입력을 위한 텍스트 영역 컴포넌트입니다.\n * 다양한 스타일 변형과 크기를 지원하며, 접근성 속성을 포함합니다.\n * \n * Text area component for multi-line text input.\n * Supports various style variants and sizes, includes accessibility attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Textarea placeholder=\"내용을 입력하세요\" />\n * \n * @example\n * // 에러 상태 / Error state\n * <Textarea \n * error\n * placeholder=\"에러가 발생했습니다\"\n * aria-label=\"설명 입력\"\n * />\n * \n * @example\n * // 크기 조절 비활성화 / Disable resize\n * <Textarea \n * resize=\"none\"\n * rows={5}\n * placeholder=\"고정 크기 텍스트 영역\"\n * />\n * \n * @param {TextareaProps} props - Textarea 컴포넌트의 props / Textarea component props\n * @param {React.Ref<HTMLTextAreaElement>} ref - textarea 요소 ref / textarea element ref\n * @returns {JSX.Element} Textarea 컴포넌트 / Textarea component\n * \n * @todo 접근성 개선: aria-invalid 속성 자동 추가 필요 / Accessibility improvement: auto-add aria-invalid attribute\n */\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n resize = \"vertical\",\n ...props \n }, ref) => {\n const ariaInvalid = props['aria-invalid' as keyof typeof props] as boolean | undefined\n const isInvalid = error || (ariaInvalid !== undefined ? ariaInvalid : false)\n\n return (\n <textarea\n className={merge(\n textareaVariants({ variant, size, resize }),\n error && FORM_STATE.error,\n success && FORM_STATE.success,\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Checkbox 컴포넌트의 props / Checkbox component props\n * @typedef {Object} CheckboxProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Checkbox 스타일 변형 / Checkbox style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Checkbox 크기 / Checkbox size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 체크박스 레이블 텍스트 / Checkbox label text\n * @property {string} [description] - 체크박스 설명 텍스트 / Checkbox description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Checkbox 컴포넌트 / Checkbox component\n * \n * 체크박스 입력 필드를 제공하는 컴포넌트입니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Checkbox input field component.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Checkbox label=\"이용약관에 동의합니다\" />\n * \n * @example\n * // 에러 상태와 설명 / Error state with description\n * <Checkbox \n * label=\"필수 항목\"\n * description=\"이 항목은 필수입니다\"\n * error\n * />\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [checked, setChecked] = useState(false)\n * <Checkbox \n * checked={checked}\n * onChange={(e) => setChecked(e.target.checked)}\n * label=\"동의\"\n * />\n * \n * @param {CheckboxProps} props - Checkbox 컴포넌트의 props / Checkbox component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Checkbox 컴포넌트 / Checkbox component\n */\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const generatedId = React.useId()\n const checkboxId = id || generatedId\n const labelId = label ? `${checkboxId}-label` : undefined\n const descriptionId = description ? `${checkboxId}-description` : undefined\n const sizeClasses = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-6 h-6\"\n }\n\n const iconSizes = {\n sm: 12,\n md: 14,\n lg: 16\n }\n\n const variantClasses = {\n default: \"border-input bg-background text-primary focus:ring-ring\",\n outline: \"border-2 border-input bg-transparent text-primary focus:ring-ring\",\n filled: \"border-transparent bg-muted text-primary focus:bg-background focus:ring-ring\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:ring-ring/50 focus:bg-white/20\",\n }\n\n const stateClasses = error\n ? \"border-destructive focus:ring-destructive\"\n : success\n ? \"border-green-500 focus:ring-green-500\"\n : \"\"\n\n // Support both controlled and uncontrolled modes\n const isControlled = props.checked !== undefined;\n const isChecked = props.checked ?? props.defaultChecked ?? false;\n // Add readOnly if controlled without onChange to suppress React warning\n const needsReadOnly = isControlled && !props.onChange && !props.readOnly;\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id={checkboxId}\n className={merge(\n \"peer absolute inset-0 w-full h-full opacity-0 cursor-pointer z-10\",\n className\n )}\n ref={ref}\n aria-checked={isChecked}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"checkbox\"\n readOnly={needsReadOnly || props.readOnly}\n {...props}\n />\n <div\n className={merge(\n \"flex items-center justify-center rounded border transition-all duration-200 cursor-pointer relative\",\n \"peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-offset-2\",\n \"peer-hover:border-accent-foreground peer-hover:shadow-sm\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses,\n isChecked && \"bg-primary border-primary shadow-md shadow-primary/20\",\n !isChecked && \"bg-background\"\n )}\n >\n {/* 체크 아이콘으로 개선 */}\n <Icon \n name=\"check\" \n size={iconSizes[size]} \n className={merge(\n \"text-white transition-all duration-200\",\n isChecked ? \"opacity-100 scale-100\" : \"opacity-0 scale-0\"\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={checkboxId} id={labelId} className=\"text-sm font-medium text-foreground cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nCheckbox.displayName = \"Checkbox\"\n\nexport { Checkbox } "]}
1
+ {"version":3,"sources":["../src/components/Textarea.tsx","../src/components/Checkbox.tsx"],"names":["textareaVariants","cva","Textarea","React","className","variant","size","error","success","resize","props","ref","ariaInvalid","isInvalid","jsx","merge","FORM_STATE","Checkbox","label","description","id","_a","_b","generatedId","checkboxId","labelId","descriptionId","sizeClasses","iconSizes","variantClasses","stateClasses","isControlled","isChecked","needsReadOnly","jsxs","Icon"],"mappings":"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","file":"chunk-TZ4YSHMC.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const textareaVariants = cva(\n \"flex w-full rounded-md border transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-offset-2 hover:border-accent-foreground hover:shadow-sm disabled:cursor-not-allowed disabled:opacity-50 placeholder:text-muted-foreground\",\n {\n variants: {\n variant: {\n default: \"border-input bg-background text-foreground focus:border-ring focus:ring-ring\",\n outline: \"border-2 border-input bg-transparent text-foreground focus:border-ring focus:ring-ring\",\n filled: \"border-transparent bg-secondary/50 text-foreground focus:bg-background focus:border-ring focus:ring-ring\",\n ghost: \"border-transparent bg-transparent text-foreground focus:bg-muted focus:border-border focus:ring-muted-foreground\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white placeholder:text-white/60 focus:border-ring/50 focus:ring-ring/20 focus:bg-white/20\",\n },\n size: {\n sm: \"px-3 py-2 text-sm min-h-[80px]\",\n md: \"px-4 py-3 text-base min-h-[100px]\",\n lg: \"px-4 py-3 text-lg min-h-[120px]\",\n },\n resize: {\n none: \"resize-none\",\n vertical: \"resize-y\",\n horizontal: \"resize-x\",\n both: \"resize\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n resize: \"vertical\",\n },\n }\n)\n\n/**\n * Textarea 컴포넌트의 props / Textarea component props\n */\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n resize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\"\n}\n\n/**\n * Textarea 컴포넌트 / Textarea component\n * \n * 여러 줄 텍스트 입력을 위한 텍스트 영역 컴포넌트입니다.\n * 다양한 스타일 변형과 크기를 지원하며, 접근성 속성을 포함합니다.\n * \n * Text area component for multi-line text input.\n * Supports various style variants and sizes, includes accessibility attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Textarea placeholder=\"내용을 입력하세요\" />\n * \n * @example\n * // 에러 상태 / Error state\n * <Textarea \n * error\n * placeholder=\"에러가 발생했습니다\"\n * aria-label=\"설명 입력\"\n * />\n * \n * @example\n * // 크기 조절 비활성화 / Disable resize\n * <Textarea \n * resize=\"none\"\n * rows={5}\n * placeholder=\"고정 크기 텍스트 영역\"\n * />\n * \n * @param {TextareaProps} props - Textarea 컴포넌트의 props / Textarea component props\n * @param {React.Ref<HTMLTextAreaElement>} ref - textarea 요소 ref / textarea element ref\n * @returns {JSX.Element} Textarea 컴포넌트 / Textarea component\n * \n * @todo 접근성 개선: aria-invalid 속성 자동 추가 필요 / Accessibility improvement: auto-add aria-invalid attribute\n */\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n resize = \"vertical\",\n ...props \n }, ref) => {\n const ariaInvalid = props['aria-invalid' as keyof typeof props] as boolean | undefined\n const isInvalid = error || (ariaInvalid !== undefined ? ariaInvalid : false)\n\n return (\n <textarea\n className={merge(\n textareaVariants({ variant, size, resize }),\n error && FORM_STATE.error,\n success && FORM_STATE.success,\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Checkbox 컴포넌트의 props / Checkbox component props\n * @typedef {Object} CheckboxProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Checkbox 스타일 변형 / Checkbox style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Checkbox 크기 / Checkbox size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 체크박스 레이블 텍스트 / Checkbox label text\n * @property {string} [description] - 체크박스 설명 텍스트 / Checkbox description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Checkbox 컴포넌트 / Checkbox component\n * \n * 체크박스 입력 필드를 제공하는 컴포넌트입니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Checkbox input field component.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Checkbox label=\"이용약관에 동의합니다\" />\n * \n * @example\n * // 에러 상태와 설명 / Error state with description\n * <Checkbox \n * label=\"필수 항목\"\n * description=\"이 항목은 필수입니다\"\n * error\n * />\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [checked, setChecked] = useState(false)\n * <Checkbox \n * checked={checked}\n * onChange={(e) => setChecked(e.target.checked)}\n * label=\"동의\"\n * />\n * \n * @param {CheckboxProps} props - Checkbox 컴포넌트의 props / Checkbox component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Checkbox 컴포넌트 / Checkbox component\n */\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const generatedId = React.useId()\n const checkboxId = id || generatedId\n const labelId = label ? `${checkboxId}-label` : undefined\n const descriptionId = description ? `${checkboxId}-description` : undefined\n const sizeClasses = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-6 h-6\"\n }\n\n const iconSizes = {\n sm: 12,\n md: 14,\n lg: 16\n }\n\n const variantClasses = {\n default: \"border-input bg-background text-primary focus:ring-ring\",\n outline: \"border-2 border-input bg-transparent text-primary focus:ring-ring\",\n filled: \"border-transparent bg-muted text-primary focus:bg-background focus:ring-ring\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:ring-ring/50 focus:bg-white/20\",\n }\n\n const stateClasses = error\n ? \"border-destructive focus:ring-destructive\"\n : success\n ? \"border-green-500 focus:ring-green-500\"\n : \"\"\n\n // Support both controlled and uncontrolled modes\n const isControlled = props.checked !== undefined;\n const isChecked = props.checked ?? props.defaultChecked ?? false;\n // Add readOnly if controlled without onChange to suppress React warning\n const needsReadOnly = isControlled && !props.onChange && !props.readOnly;\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id={checkboxId}\n className={merge(\n \"peer absolute inset-0 w-full h-full opacity-0 cursor-pointer z-10\",\n className\n )}\n ref={ref}\n aria-checked={isChecked}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"checkbox\"\n readOnly={needsReadOnly || props.readOnly}\n {...props}\n />\n <div\n className={merge(\n \"flex items-center justify-center rounded border transition-all duration-200 cursor-pointer relative\",\n \"peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-offset-2\",\n \"peer-hover:border-accent-foreground peer-hover:shadow-sm\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses,\n isChecked && \"bg-primary border-primary shadow-md shadow-primary/20\",\n !isChecked && \"bg-background\"\n )}\n >\n {/* 체크 아이콘으로 개선 */}\n <Icon \n name=\"check\" \n size={iconSizes[size]} \n className={merge(\n \"text-white transition-all duration-200\",\n isChecked ? \"opacity-100 scale-100\" : \"opacity-0 scale-0\"\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={checkboxId} id={labelId} className=\"text-sm font-medium text-foreground cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nCheckbox.displayName = \"Checkbox\"\n\nexport { Checkbox } "]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import {clsx}from'clsx';import {twMerge}from'tailwind-merge';var g=(t=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(t,{get:(e,o)=>(typeof require!="undefined"?require:e)[o]}):t)(function(t){if(typeof require!="undefined")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});function i(...t){return twMerge(clsx(t))}function d(t,e,o){return i(t?e:o||"")}function R(t,e="ko-KR"){let o=typeof t=="string"?new Date(t):t,r=new Date().getTime()-o.getTime(),n=Math.floor(r/6e4),s=Math.floor(r/36e5),a=Math.floor(r/864e5);return n<1?e==="ko-KR"?"\uBC29\uAE08 \uC804":"just now":n<60?e==="ko-KR"?`${n}\uBD84 \uC804`:`${n}m ago`:s<24?e==="ko-KR"?`${s}\uC2DC\uAC04 \uC804`:`${s}h ago`:a<7?e==="ko-KR"?`${a}\uC77C \uC804`:`${a}d ago`:o.toLocaleDateString(e)}function w(t){let e=Object.entries(t).filter(([,o])=>o).map(([o])=>o);return i(...e)}var x=i;export{g as a,i as b,d as c,R as d,w as e,x as f};//# sourceMappingURL=chunk-U6CTBZ2U.mjs.map
3
+ //# sourceMappingURL=chunk-U6CTBZ2U.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/utils.ts"],"names":["merge","inputs","twMerge","clsx","mergeIf","condition","trueClass","falseClass","formatRelativeTime","timestamp","locale","date","diff","minutes","hours","days","mergeMap","classMap","classes","className","cn"],"mappings":"6DAAA,IAAA,CAAA,CAAA,CAAA,CAAA,EAAA,OAAA,OAAA,EAAA,WAAA,CAAA,OAAA,CAAA,OAAA,KAAA,EAAA,WAAA,CAAA,IAAA,KAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,OAAA,OAAA,EAAA,WAAA,CAAA,OAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,SAAA,CAAA,CAAA,CAAA,GAAA,OAAA,OAAA,EAAA,WAAA,CAAA,OAAA,OAAA,CAAA,KAAA,CAAA,IAAA,CAAA,SAAA,CAAA,CAAA,MAAA,KAAA,CAAA,sBAAA,CAAA,CAAA,CAAA,oBAAA,CAAA,CAAA,EAiBO,SAASA,CAAAA,CAAAA,GAASC,EAAsB,CAC7C,OAAOC,OAAAA,CAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CAiBO,SAASG,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACA,CACA,OAAOP,CAAAA,CAAMK,CAAAA,CAAYC,CAAAA,CAAYC,GAAc,EAAE,CACvD,CAwBO,SAASC,EAAmBC,CAAAA,CAA0BC,CAAAA,CAAS,OAAA,CAAiB,CACrF,IAAMC,CAAAA,CAAO,OAAOF,CAAAA,EAAc,SAAW,IAAI,IAAA,CAAKA,CAAS,CAAA,CAAIA,EAE7DG,CAAAA,CADM,IAAI,IAAA,EAAK,CACJ,SAAQ,CAAID,CAAAA,CAAK,OAAA,EAAQ,CACpCE,CAAAA,CAAU,IAAA,CAAK,KAAA,CAAMD,CAAAA,CAAO,GAAK,CAAA,CACjCE,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAMF,EAAO,IAAO,CAAA,CACjCG,CAAAA,CAAO,IAAA,CAAK,MAAMH,CAAAA,CAAO,KAAQ,CAAA,CAEvC,OAAIC,CAAAA,CAAU,CAAA,CAAUH,CAAAA,GAAW,OAAA,CAAU,sBAAS,UAAA,CAClDG,CAAAA,CAAU,EAAA,CAAWH,CAAAA,GAAW,QAAU,CAAA,EAAGG,CAAO,CAAA,aAAA,CAAA,CAAQ,CAAA,EAAGA,CAAO,CAAA,KAAA,CAAA,CACtEC,CAAAA,CAAQ,EAAA,CAAWJ,CAAAA,GAAW,OAAA,CAAU,CAAA,EAAGI,CAAK,CAAA,mBAAA,CAAA,CAAS,GAAGA,CAAK,CAAA,KAAA,CAAA,CACjEC,CAAAA,CAAO,CAAA,CAAUL,IAAW,OAAA,CAAU,CAAA,EAAGK,CAAI,CAAA,aAAA,CAAA,CAAQ,GAAGA,CAAI,CAAA,KAAA,CAAA,CACzDJ,CAAAA,CAAK,kBAAA,CAAmBD,CAAM,CACvC,CAmBO,SAASM,EAASC,CAAAA,CAAsD,CAC7E,IAAMC,CAAAA,CAAU,OAAO,OAAA,CAAQD,CAAQ,CAAA,CACpC,MAAA,CAAO,CAAC,EAAGZ,CAAS,CAAA,GAAMA,CAAS,CAAA,CACnC,GAAA,CAAI,CAAC,CAACc,CAAS,CAAA,GAAMA,CAAS,CAAA,CAEjC,OAAOnB,EAAM,GAAGkB,CAAO,CACzB,KAGaE,CAAAA,CAAKpB","file":"chunk-U6CTBZ2U.mjs","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\n/**\n * HUA UI의 스마트 클래스 병합 유틸리티\n * clsx와 tailwind-merge를 결합하여 중복 클래스를 자동으로 해결합니다.\n * \n * @param inputs - 병합할 클래스 값들\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * merge(\"px-2 py-1\", \"px-4\") // \"py-1 px-4\"\n * merge(\"text-red-500\", \"text-blue-500\") // \"text-blue-500\"\n * merge(\"bg-white\", \"dark:bg-slate-900\") // \"bg-white dark:bg-slate-900\"\n * ```\n */\nexport function merge(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * 조건부 클래스 병합 유틸리티\n * 조건에 따라 클래스를 선택적으로 병합합니다.\n * \n * @param condition - 클래스를 적용할 조건\n * @param trueClass - 조건이 true일 때 적용할 클래스\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeIf(isActive, \"bg-blue-500\", \"bg-gray-200\")\n * mergeIf(isLoading, \"opacity-50 cursor-not-allowed\")\n * ```\n */\nexport function mergeIf(\n condition: boolean,\n trueClass: ClassValue,\n falseClass?: ClassValue\n) {\n return merge(condition ? trueClass : falseClass || \"\")\n}\n\n/**\n * 상대 시간 포맷팅 유틸리티\n * \n * 날짜를 상대 시간 형식으로 포맷팅합니다 (예: \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * 7일 이상 경과한 경우 절대 날짜를 반환합니다.\n * \n * Formats a date as relative time (e.g., \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * Returns absolute date for dates older than 7 days.\n * \n * @param timestamp - 포맷팅할 날짜 (Date 객체 또는 ISO 문자열) / Date to format (Date object or ISO string)\n * @param locale - 로케일 (기본값: \"ko-KR\") / Locale (default: \"ko-KR\")\n * @returns 포맷팅된 상대 시간 문자열 / Formatted relative time string\n * \n * @example\n * ```tsx\n * formatRelativeTime(new Date()) // \"방금 전\"\n * formatRelativeTime(new Date(Date.now() - 5 * 60000)) // \"5분 전\"\n * formatRelativeTime(new Date(Date.now() - 2 * 3600000)) // \"2시간 전\"\n * formatRelativeTime(new Date(Date.now() - 3 * 86400000)) // \"3일 전\"\n * formatRelativeTime(new Date(\"2024-01-01\")) // \"2024. 1. 1.\" (7일 이상 경과)\n * ```\n */\nexport function formatRelativeTime(timestamp: Date | string, locale = \"ko-KR\"): string {\n const date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return locale === \"ko-KR\" ? \"방금 전\" : \"just now\";\n if (minutes < 60) return locale === \"ko-KR\" ? `${minutes}분 전` : `${minutes}m ago`;\n if (hours < 24) return locale === \"ko-KR\" ? `${hours}시간 전` : `${hours}h ago`;\n if (days < 7) return locale === \"ko-KR\" ? `${days}일 전` : `${days}d ago`;\n return date.toLocaleDateString(locale);\n}\n\n/**\n * 객체 기반 클래스 병합 유틸리티\n * 객체의 키-값 쌍을 기반으로 조건부 클래스를 병합합니다.\n * \n * @param classMap - 클래스 맵 객체\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeMap({\n * \"bg-blue-500\": isPrimary,\n * \"bg-gray-500\": !isPrimary,\n * \"text-white\": true,\n * \"opacity-50\": isDisabled\n * })\n * ```\n */\nexport function mergeMap(classMap: Record<string, boolean | undefined | null>) {\n const classes = Object.entries(classMap)\n .filter(([, condition]) => condition)\n .map(([className]) => className)\n \n return merge(...classes)\n}\n\n// 하위 호환성을 위해 cn도 export (점진적 마이그레이션 지원)\nexport const cn = merge "]}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import {a as a$2,b,c,d,e}from'./chunk-FSL373O6.mjs';import {a as a$1}from'./chunk-IFSEJVOR.mjs';import {a}from'./chunk-UUHAXGMO.mjs';import S from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var g=S.forwardRef(({className:u,value:r,max:c=100,size:l="md",color:m="blue",...o},d)=>{let v={sm:"h-2",md:"h-3",lg:"h-4"},N={blue:"bg-indigo-500",green:"bg-green-500",yellow:"bg-yellow-500",red:"bg-red-500",purple:"bg-purple-500",orange:"bg-orange-500",indigo:"bg-indigo-500",pink:"bg-pink-500",gray:"bg-gray-500"},p=Math.min(Math.max(r/c*100,0),100);return jsx("div",{ref:d,className:a("w-full bg-muted rounded-full",v[l],u),...o,children:jsx("div",{className:a("h-full rounded-full transition-all duration-300",N[m]||N.blue),style:{width:`${p}%`}})})});g.displayName="EmotionMeter";var C=S.forwardRef(({className:u,emotion:r,isSelected:c=false,size:l="md",...m},o)=>jsx("button",{ref:o,className:a("rounded-full border-2 transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-1 focus:ring-ring",{sm:"w-8 h-8 text-sm",md:"w-12 h-12 text-lg",lg:"w-16 h-16 text-xl"}[l],c?"border-indigo-500 bg-indigo-50 dark:bg-indigo-900/20":"border-border bg-background",u),...m,children:r}));C.displayName="EmotionButton";var F=[{key:"joy",label:"\uAE30\uC068",icon:"smile",color:"yellow"},{key:"sadness",label:"\uC2AC\uD514",icon:"frown",color:"blue"},{key:"anger",label:"\uD654\uB0A8",icon:"angry",color:"red"},{key:"calm",label:"\uD3C9\uC628",icon:"heart",color:"green"},{key:"excitement",label:"\uC124\uB818",icon:"star",color:"pink"},{key:"worry",label:"\uAC71\uC815",icon:"meh",color:"gray"},{key:"gratitude",label:"\uAC10\uC0AC",icon:"heart",color:"purple"},{key:"loneliness",label:"\uC678\uB85C\uC6C0",icon:"user",color:"indigo"}],T=S.forwardRef(({className:u,selectedEmotion:r,onEmotionSelect:c,layout:l="grid",showIntensity:m=false,intensity:o=50,onIntensityChange:d,emotions:v=F,size:N="md",variant:p="button",...y},w)=>{let x=s=>{c==null||c(s);},h=s=>{let f=r===s.key;return p==="button"?jsx(C,{emotion:s.key,isSelected:f,size:N,onClick:()=>x(s.key),className:a("transition-all duration-200",f&&"ring-1 ring-offset-2 ring-primary"),children:s.label},s.key):p==="card"?jsx("div",{className:a("p-4 rounded-lg border-2 cursor-pointer transition-all duration-200 hover:shadow-md",f?"border-primary bg-primary/5":"border-border hover:border-primary/50"),onClick:()=>x(s.key),children:jsxs("div",{className:"flex items-center space-x-3",children:[jsx("div",{className:a("w-8 h-8 rounded-full flex items-center justify-center",f?"bg-primary text-primary-foreground":"bg-muted"),children:s.icon&&jsxs("span",{className:"text-lg",children:[s.icon==="smile"&&"\u{1F60A}",s.icon==="frown"&&"\u{1F622}",s.icon==="angry"&&"\u{1F620}",s.icon==="heart"&&"\u2764\uFE0F",s.icon==="star"&&"\u2B50",s.icon==="meh"&&"\u{1F610}",s.icon==="user"&&"\u{1F464}"]})}),jsx("span",{className:"font-medium truncate max-w-[120px]",children:s.label})]})},s.key):p==="chip"?jsx("div",{className:a("px-3 py-1 rounded-full cursor-pointer transition-all duration-200 text-sm font-medium",f?"bg-primary text-primary-foreground":"bg-muted hover:bg-muted/80"),onClick:()=>x(s.key),children:jsx("span",{className:"truncate max-w-[100px]",children:s.label})},s.key):null},E={grid:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2 md:gap-3",list:"space-y-2",compact:"flex flex-wrap gap-1"};return jsxs("div",{ref:w,className:a("space-y-4",u),...y,children:[jsx("div",{className:E[l],children:v.map(h)}),m&&r&&jsxs("div",{className:"space-y-3",children:[jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uAC10\uC815 \uAC15\uB3C4"}),jsxs("span",{className:"text-sm text-muted-foreground",children:[o,"%"]})]}),jsx("input",{type:"range",min:"0",max:"100",value:o,onChange:s=>d==null?void 0:d(Number(s.target.value)),className:"w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider"}),jsxs("div",{className:"flex justify-between text-xs text-muted-foreground",children:[jsx("span",{children:"\uC57D\uD568"}),jsx("span",{children:"\uBCF4\uD1B5"}),jsx("span",{children:"\uAC15\uD568"})]})]}),r&&m&&jsx("div",{className:"flex justify-center",children:jsx(g,{value:o,size:"md",color:"blue"})})]})});T.displayName="EmotionSelector";var z=S.forwardRef(({className:u,primaryEmotion:r,emotionDistribution:c$1=[],keywords:l=[],intensity:m=50,positivity:o=70,energy:d$1=60,showMeter:v=true,showDistribution:N=true,showKeywords:p=true,showMetrics:y=true,layout:w="detailed",...x},h)=>{let E=a=>a<30?"\uC57D\uD568":a<70?"\uBCF4\uD1B5":"\uAC15\uD568",s=a=>a<30?"\uBD80\uC815\uC801":a<70?"\uC911\uB9BD\uC801":"\uAE0D\uC815\uC801",f=a=>a<30?"\uB0AE\uC74C":a<70?"\uBCF4\uD1B5":"\uB192\uC74C";return w==="compact"?jsxs("div",{ref:h,className:a("space-y-3",u),...x,children:[r&&jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uC8FC\uC694 \uAC10\uC815:"}),jsxs("div",{className:"flex items-center space-x-2",children:[jsxs("span",{className:"text-sm text-muted-foreground",children:[r.name," (",r.intensity,"%)"]}),v&&jsx(g,{value:r.intensity,size:"sm",color:"blue"})]})]}),y&&jsxs(Fragment,{children:[jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uAC10\uC815 \uAC15\uB3C4:"}),jsx("span",{className:"text-sm text-muted-foreground",children:E(m)})]}),jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uAE0D\uC815\uC131:"}),jsx("span",{className:"text-sm text-muted-foreground",children:s(o)})]}),jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uC5D0\uB108\uC9C0:"}),jsx("span",{className:"text-sm text-muted-foreground",children:f(d$1)})]})]}),p&&l.length>0&&jsxs("div",{children:[jsx("span",{className:"text-sm font-medium",children:"\uD0A4\uC6CC\uB4DC:"}),jsx("div",{className:"flex flex-wrap gap-1 mt-1",children:l.map(a=>jsx(a$1,{variant:"secondary",className:"text-xs",children:a},a))})]})]}):w==="card"?jsxs(a$2,{ref:h,className:a("",u),...x,children:[jsxs(b,{children:[jsxs(c,{className:"flex items-center",children:[jsx("span",{className:"text-2xl mr-2",children:"\u2728"}),"AI \uBD84\uC11D"]}),jsx(d,{children:"\uAC10\uC815 \uBD84\uC11D \uACB0\uACFC"})]}),jsxs(e,{className:"space-y-4",children:[r&&jsxs("div",{className:"space-y-3",children:[jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uC8FC\uC694 \uAC10\uC815:"}),jsxs("span",{className:"ml-2 text-muted-foreground",children:[r.name," (",r.intensity,"%)"]})]}),v&&jsx("div",{className:"flex justify-center",children:jsx(g,{value:r.intensity,size:"md",color:"blue"})})]}),y&&jsxs(Fragment,{children:[jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uAC10\uC815 \uAC15\uB3C4:"}),jsx("span",{className:"ml-2 text-muted-foreground",children:E(m)})]}),jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uAE0D\uC815\uC131:"}),jsx("span",{className:"ml-2 text-muted-foreground",children:s(o)})]}),jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uC5D0\uB108\uC9C0:"}),jsx("span",{className:"ml-2 text-muted-foreground",children:f(d$1)})]})]}),p&&l.length>0&&jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uD0A4\uC6CC\uB4DC:"}),jsx("div",{className:"flex flex-wrap gap-1 mt-1",children:l.map(a=>jsx(a$1,{variant:"secondary",className:"text-xs",children:a},a))})]})]})]}):jsxs("div",{ref:h,className:a("space-y-6",u),...x,children:[r&&jsxs("div",{className:"space-y-4",children:[jsx("h3",{className:"text-lg font-semibold",children:"\uC8FC\uC694 \uAC10\uC815"}),jsxs("div",{className:"flex items-center space-x-4",children:[jsxs("div",{className:"text-center",children:[jsx("div",{className:"text-2xl font-bold text-primary",children:r.name}),jsxs("div",{className:"text-sm text-muted-foreground",children:[r.intensity,"% \uAC15\uB3C4"]})]}),v&&jsx(g,{value:r.intensity,size:"lg",color:"blue"})]})]}),N&&c$1.length>0&&jsxs("div",{className:"space-y-4",children:[jsx("h3",{className:"text-lg font-semibold",children:"\uAC10\uC815 \uBD84\uD3EC"}),jsx("div",{className:"space-y-3",children:c$1.map((a,D)=>jsxs("div",{className:"space-y-2",children:[jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:a.emotion}),jsxs("span",{className:"text-sm text-muted-foreground",children:[a.percentage,"%"]})]}),jsx("div",{className:"w-full bg-muted rounded-full h-2",children:jsx("div",{className:`${a.color} h-2 rounded-full transition-all duration-300`,style:{width:`${a.percentage}%`}})})]},D))})]}),y&&jsxs("div",{className:"space-y-4",children:[jsx("h3",{className:"text-lg font-semibold",children:"\uBD84\uC11D \uC9C0\uD45C"}),jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[jsxs("div",{className:"space-y-2",children:[jsx("div",{className:"text-sm font-medium",children:"\uAC10\uC815 \uAC15\uB3C4"}),jsx("div",{className:"text-2xl font-bold text-primary",children:E(m)}),jsx("div",{className:"w-full bg-muted rounded-full h-2",children:jsx("div",{className:"bg-primary h-2 rounded-full transition-all duration-300",style:{width:`${m}%`}})})]}),jsxs("div",{className:"space-y-2",children:[jsx("div",{className:"text-sm font-medium",children:"\uAE0D\uC815\uC131"}),jsx("div",{className:"text-2xl font-bold text-green-600",children:s(o)}),jsx("div",{className:"w-full bg-muted rounded-full h-2",children:jsx("div",{className:"bg-green-500 h-2 rounded-full transition-all duration-300",style:{width:`${o}%`}})})]}),jsxs("div",{className:"space-y-2",children:[jsx("div",{className:"text-sm font-medium",children:"\uC5D0\uB108\uC9C0"}),jsx("div",{className:"text-2xl font-bold text-orange-600",children:f(d$1)}),jsx("div",{className:"w-full bg-muted rounded-full h-2",children:jsx("div",{className:"bg-orange-500 h-2 rounded-full transition-all duration-300",style:{width:`${d$1}%`}})})]})]})]}),p&&l.length>0&&jsxs("div",{className:"space-y-4",children:[jsx("h3",{className:"text-lg font-semibold",children:"\uAC10\uC815 \uD0A4\uC6CC\uB4DC"}),jsx("div",{className:"flex flex-wrap gap-2",children:l.map(a=>jsx(a$1,{variant:"outline",className:"text-sm",children:a},a))})]})]})});z.displayName="EmotionAnalysis";export{g as a,C as b,T as c,z as d};//# sourceMappingURL=chunk-5BMH7223.mjs.map
3
- //# sourceMappingURL=chunk-5BMH7223.mjs.map
2
+ import {a as a$1,b as b$1,c,d,e}from'./chunk-6HVJFEDA.mjs';import {a}from'./chunk-3CCF7U3P.mjs';import {b}from'./chunk-U6CTBZ2U.mjs';import S from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var g=S.forwardRef(({className:u,value:r,max:c=100,size:l="md",color:m="blue",...o},d)=>{let v={sm:"h-2",md:"h-3",lg:"h-4"},N={blue:"bg-indigo-500",green:"bg-green-500",yellow:"bg-yellow-500",red:"bg-red-500",purple:"bg-purple-500",orange:"bg-orange-500",indigo:"bg-indigo-500",pink:"bg-pink-500",gray:"bg-gray-500"},p=Math.min(Math.max(r/c*100,0),100);return jsx("div",{ref:d,className:b("w-full bg-muted rounded-full",v[l],u),...o,children:jsx("div",{className:b("h-full rounded-full transition-all duration-300",N[m]||N.blue),style:{width:`${p}%`}})})});g.displayName="EmotionMeter";var C=S.forwardRef(({className:u,emotion:r,isSelected:c=false,size:l="md",...m},o)=>jsx("button",{ref:o,className:b("rounded-full border-2 transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-1 focus:ring-ring",{sm:"w-8 h-8 text-sm",md:"w-12 h-12 text-lg",lg:"w-16 h-16 text-xl"}[l],c?"border-indigo-500 bg-indigo-50 dark:bg-indigo-900/20":"border-border bg-background",u),...m,children:r}));C.displayName="EmotionButton";var F=[{key:"joy",label:"\uAE30\uC068",icon:"smile",color:"yellow"},{key:"sadness",label:"\uC2AC\uD514",icon:"frown",color:"blue"},{key:"anger",label:"\uD654\uB0A8",icon:"angry",color:"red"},{key:"calm",label:"\uD3C9\uC628",icon:"heart",color:"green"},{key:"excitement",label:"\uC124\uB818",icon:"star",color:"pink"},{key:"worry",label:"\uAC71\uC815",icon:"meh",color:"gray"},{key:"gratitude",label:"\uAC10\uC0AC",icon:"heart",color:"purple"},{key:"loneliness",label:"\uC678\uB85C\uC6C0",icon:"user",color:"indigo"}],T=S.forwardRef(({className:u,selectedEmotion:r,onEmotionSelect:c,layout:l="grid",showIntensity:m=false,intensity:o=50,onIntensityChange:d,emotions:v=F,size:N="md",variant:p="button",...y},w)=>{let x=s=>{c==null||c(s);},h=s=>{let f=r===s.key;return p==="button"?jsx(C,{emotion:s.key,isSelected:f,size:N,onClick:()=>x(s.key),className:b("transition-all duration-200",f&&"ring-1 ring-offset-2 ring-primary"),children:s.label},s.key):p==="card"?jsx("div",{className:b("p-4 rounded-lg border-2 cursor-pointer transition-all duration-200 hover:shadow-md",f?"border-primary bg-primary/5":"border-border hover:border-primary/50"),onClick:()=>x(s.key),children:jsxs("div",{className:"flex items-center space-x-3",children:[jsx("div",{className:b("w-8 h-8 rounded-full flex items-center justify-center",f?"bg-primary text-primary-foreground":"bg-muted"),children:s.icon&&jsxs("span",{className:"text-lg",children:[s.icon==="smile"&&"\u{1F60A}",s.icon==="frown"&&"\u{1F622}",s.icon==="angry"&&"\u{1F620}",s.icon==="heart"&&"\u2764\uFE0F",s.icon==="star"&&"\u2B50",s.icon==="meh"&&"\u{1F610}",s.icon==="user"&&"\u{1F464}"]})}),jsx("span",{className:"font-medium truncate max-w-[120px]",children:s.label})]})},s.key):p==="chip"?jsx("div",{className:b("px-3 py-1 rounded-full cursor-pointer transition-all duration-200 text-sm font-medium",f?"bg-primary text-primary-foreground":"bg-muted hover:bg-muted/80"),onClick:()=>x(s.key),children:jsx("span",{className:"truncate max-w-[100px]",children:s.label})},s.key):null},E={grid:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2 md:gap-3",list:"space-y-2",compact:"flex flex-wrap gap-1"};return jsxs("div",{ref:w,className:b("space-y-4",u),...y,children:[jsx("div",{className:E[l],children:v.map(h)}),m&&r&&jsxs("div",{className:"space-y-3",children:[jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uAC10\uC815 \uAC15\uB3C4"}),jsxs("span",{className:"text-sm text-muted-foreground",children:[o,"%"]})]}),jsx("input",{type:"range",min:"0",max:"100",value:o,onChange:s=>d==null?void 0:d(Number(s.target.value)),className:"w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider"}),jsxs("div",{className:"flex justify-between text-xs text-muted-foreground",children:[jsx("span",{children:"\uC57D\uD568"}),jsx("span",{children:"\uBCF4\uD1B5"}),jsx("span",{children:"\uAC15\uD568"})]})]}),r&&m&&jsx("div",{className:"flex justify-center",children:jsx(g,{value:o,size:"md",color:"blue"})})]})});T.displayName="EmotionSelector";var z=S.forwardRef(({className:u,primaryEmotion:r,emotionDistribution:c$1=[],keywords:l=[],intensity:m=50,positivity:o=70,energy:d$1=60,showMeter:v=true,showDistribution:N=true,showKeywords:p=true,showMetrics:y=true,layout:w="detailed",...x},h)=>{let E=a=>a<30?"\uC57D\uD568":a<70?"\uBCF4\uD1B5":"\uAC15\uD568",s=a=>a<30?"\uBD80\uC815\uC801":a<70?"\uC911\uB9BD\uC801":"\uAE0D\uC815\uC801",f=a=>a<30?"\uB0AE\uC74C":a<70?"\uBCF4\uD1B5":"\uB192\uC74C";return w==="compact"?jsxs("div",{ref:h,className:b("space-y-3",u),...x,children:[r&&jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uC8FC\uC694 \uAC10\uC815:"}),jsxs("div",{className:"flex items-center space-x-2",children:[jsxs("span",{className:"text-sm text-muted-foreground",children:[r.name," (",r.intensity,"%)"]}),v&&jsx(g,{value:r.intensity,size:"sm",color:"blue"})]})]}),y&&jsxs(Fragment,{children:[jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uAC10\uC815 \uAC15\uB3C4:"}),jsx("span",{className:"text-sm text-muted-foreground",children:E(m)})]}),jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uAE0D\uC815\uC131:"}),jsx("span",{className:"text-sm text-muted-foreground",children:s(o)})]}),jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uC5D0\uB108\uC9C0:"}),jsx("span",{className:"text-sm text-muted-foreground",children:f(d$1)})]})]}),p&&l.length>0&&jsxs("div",{children:[jsx("span",{className:"text-sm font-medium",children:"\uD0A4\uC6CC\uB4DC:"}),jsx("div",{className:"flex flex-wrap gap-1 mt-1",children:l.map(a$1=>jsx(a,{variant:"secondary",className:"text-xs",children:a$1},a$1))})]})]}):w==="card"?jsxs(a$1,{ref:h,className:b("",u),...x,children:[jsxs(b$1,{children:[jsxs(c,{className:"flex items-center",children:[jsx("span",{className:"text-2xl mr-2",children:"\u2728"}),"AI \uBD84\uC11D"]}),jsx(d,{children:"\uAC10\uC815 \uBD84\uC11D \uACB0\uACFC"})]}),jsxs(e,{className:"space-y-4",children:[r&&jsxs("div",{className:"space-y-3",children:[jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uC8FC\uC694 \uAC10\uC815:"}),jsxs("span",{className:"ml-2 text-muted-foreground",children:[r.name," (",r.intensity,"%)"]})]}),v&&jsx("div",{className:"flex justify-center",children:jsx(g,{value:r.intensity,size:"md",color:"blue"})})]}),y&&jsxs(Fragment,{children:[jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uAC10\uC815 \uAC15\uB3C4:"}),jsx("span",{className:"ml-2 text-muted-foreground",children:E(m)})]}),jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uAE0D\uC815\uC131:"}),jsx("span",{className:"ml-2 text-muted-foreground",children:s(o)})]}),jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uC5D0\uB108\uC9C0:"}),jsx("span",{className:"ml-2 text-muted-foreground",children:f(d$1)})]})]}),p&&l.length>0&&jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uD0A4\uC6CC\uB4DC:"}),jsx("div",{className:"flex flex-wrap gap-1 mt-1",children:l.map(a$1=>jsx(a,{variant:"secondary",className:"text-xs",children:a$1},a$1))})]})]})]}):jsxs("div",{ref:h,className:b("space-y-6",u),...x,children:[r&&jsxs("div",{className:"space-y-4",children:[jsx("h3",{className:"text-lg font-semibold",children:"\uC8FC\uC694 \uAC10\uC815"}),jsxs("div",{className:"flex items-center space-x-4",children:[jsxs("div",{className:"text-center",children:[jsx("div",{className:"text-2xl font-bold text-primary",children:r.name}),jsxs("div",{className:"text-sm text-muted-foreground",children:[r.intensity,"% \uAC15\uB3C4"]})]}),v&&jsx(g,{value:r.intensity,size:"lg",color:"blue"})]})]}),N&&c$1.length>0&&jsxs("div",{className:"space-y-4",children:[jsx("h3",{className:"text-lg font-semibold",children:"\uAC10\uC815 \uBD84\uD3EC"}),jsx("div",{className:"space-y-3",children:c$1.map((a,D)=>jsxs("div",{className:"space-y-2",children:[jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:a.emotion}),jsxs("span",{className:"text-sm text-muted-foreground",children:[a.percentage,"%"]})]}),jsx("div",{className:"w-full bg-muted rounded-full h-2",children:jsx("div",{className:`${a.color} h-2 rounded-full transition-all duration-300`,style:{width:`${a.percentage}%`}})})]},D))})]}),y&&jsxs("div",{className:"space-y-4",children:[jsx("h3",{className:"text-lg font-semibold",children:"\uBD84\uC11D \uC9C0\uD45C"}),jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[jsxs("div",{className:"space-y-2",children:[jsx("div",{className:"text-sm font-medium",children:"\uAC10\uC815 \uAC15\uB3C4"}),jsx("div",{className:"text-2xl font-bold text-primary",children:E(m)}),jsx("div",{className:"w-full bg-muted rounded-full h-2",children:jsx("div",{className:"bg-primary h-2 rounded-full transition-all duration-300",style:{width:`${m}%`}})})]}),jsxs("div",{className:"space-y-2",children:[jsx("div",{className:"text-sm font-medium",children:"\uAE0D\uC815\uC131"}),jsx("div",{className:"text-2xl font-bold text-green-600",children:s(o)}),jsx("div",{className:"w-full bg-muted rounded-full h-2",children:jsx("div",{className:"bg-green-500 h-2 rounded-full transition-all duration-300",style:{width:`${o}%`}})})]}),jsxs("div",{className:"space-y-2",children:[jsx("div",{className:"text-sm font-medium",children:"\uC5D0\uB108\uC9C0"}),jsx("div",{className:"text-2xl font-bold text-orange-600",children:f(d$1)}),jsx("div",{className:"w-full bg-muted rounded-full h-2",children:jsx("div",{className:"bg-orange-500 h-2 rounded-full transition-all duration-300",style:{width:`${d$1}%`}})})]})]})]}),p&&l.length>0&&jsxs("div",{className:"space-y-4",children:[jsx("h3",{className:"text-lg font-semibold",children:"\uAC10\uC815 \uD0A4\uC6CC\uB4DC"}),jsx("div",{className:"flex flex-wrap gap-2",children:l.map(a$1=>jsx(a,{variant:"outline",className:"text-sm",children:a$1},a$1))})]})]})});z.displayName="EmotionAnalysis";export{g as a,C as b,T as c,z as d};//# sourceMappingURL=chunk-WP7VFE77.mjs.map
3
+ //# sourceMappingURL=chunk-WP7VFE77.mjs.map