@hua-labs/ui 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/README.md +55 -67
  2. package/dist/{ComponentLayout-btJq4TjA.d.mts → ComponentLayout-BhM4VSoq.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.mjs +3 -3
  7. package/dist/advanced-dashboard.mjs.map +1 -1
  8. package/dist/advanced-emotion.mjs +1 -1
  9. package/dist/advanced-motion.d.mts +74 -7
  10. package/dist/advanced-motion.mjs +1 -1
  11. package/dist/advanced.d.mts +4 -4
  12. package/dist/advanced.mjs +3 -3
  13. package/dist/advanced.mjs.map +1 -1
  14. package/dist/{chunk-GLZKT7JN.mjs → chunk-5DPW7SVD.mjs} +3 -3
  15. package/dist/{chunk-GLZKT7JN.mjs.map → chunk-5DPW7SVD.mjs.map} +1 -1
  16. package/dist/{chunk-X7ZIWYRC.mjs → chunk-5L5HIPKA.mjs} +2 -2
  17. package/dist/{chunk-X7ZIWYRC.mjs.map → chunk-5L5HIPKA.mjs.map} +1 -1
  18. package/dist/chunk-A5YOVVM5.mjs +3 -0
  19. package/dist/chunk-A5YOVVM5.mjs.map +1 -0
  20. package/dist/chunk-CNW22G24.mjs +13 -0
  21. package/dist/chunk-CNW22G24.mjs.map +1 -0
  22. package/dist/chunk-CW66UBQG.mjs +3 -0
  23. package/dist/chunk-CW66UBQG.mjs.map +1 -0
  24. package/dist/chunk-EAZEI74V.mjs +3 -0
  25. package/dist/chunk-EAZEI74V.mjs.map +1 -0
  26. package/dist/{chunk-LH77I6HO.mjs → chunk-EPY3432E.mjs} +2 -2
  27. package/dist/{chunk-LH77I6HO.mjs.map → chunk-EPY3432E.mjs.map} +1 -1
  28. package/dist/{chunk-SGEP3CQE.mjs → chunk-F2M4YDDQ.mjs} +2 -2
  29. package/dist/{chunk-SGEP3CQE.mjs.map → chunk-F2M4YDDQ.mjs.map} +1 -1
  30. package/dist/chunk-FHMFDCX2.mjs +3 -0
  31. package/dist/chunk-FHMFDCX2.mjs.map +1 -0
  32. package/dist/chunk-HBIUCLFL.mjs +3 -0
  33. package/dist/chunk-HBIUCLFL.mjs.map +1 -0
  34. package/dist/{chunk-LOYAJIWO.mjs → chunk-HEBXAFRY.mjs} +2 -2
  35. package/dist/{chunk-LOYAJIWO.mjs.map → chunk-HEBXAFRY.mjs.map} +1 -1
  36. package/dist/chunk-IG47LMOD.mjs +3 -0
  37. package/dist/chunk-IG47LMOD.mjs.map +1 -0
  38. package/dist/{chunk-IFSEJVOR.mjs → chunk-J47ZEXEL.mjs} +2 -2
  39. package/dist/{chunk-IFSEJVOR.mjs.map → chunk-J47ZEXEL.mjs.map} +1 -1
  40. package/dist/{chunk-IN7RWQCJ.mjs → chunk-K2FOFIST.mjs} +2 -2
  41. package/dist/{chunk-IN7RWQCJ.mjs.map → chunk-K2FOFIST.mjs.map} +1 -1
  42. package/dist/{chunk-UWHCM3S6.mjs → chunk-LL6QPRD7.mjs} +2 -2
  43. package/dist/{chunk-UWHCM3S6.mjs.map → chunk-LL6QPRD7.mjs.map} +1 -1
  44. package/dist/{chunk-PAEKNQWW.mjs → chunk-NMJLOK6M.mjs} +2 -2
  45. package/dist/{chunk-PAEKNQWW.mjs.map → chunk-NMJLOK6M.mjs.map} +1 -1
  46. package/dist/chunk-O24K56OS.mjs +3 -0
  47. package/dist/chunk-O24K56OS.mjs.map +1 -0
  48. package/dist/chunk-OIWG3IJ7.mjs +3 -0
  49. package/dist/chunk-OIWG3IJ7.mjs.map +1 -0
  50. package/dist/{chunk-VWSBJUNI.mjs → chunk-OLLU7ZFH.mjs} +2 -2
  51. package/dist/{chunk-VWSBJUNI.mjs.map → chunk-OLLU7ZFH.mjs.map} +1 -1
  52. package/dist/chunk-Q76JW7X5.mjs +73 -0
  53. package/dist/chunk-Q76JW7X5.mjs.map +1 -0
  54. package/dist/chunk-QEMPERUK.mjs +3 -0
  55. package/dist/chunk-QEMPERUK.mjs.map +1 -0
  56. package/dist/{chunk-XV3Y7QVU.mjs → chunk-QRM66RQG.mjs} +2 -2
  57. package/dist/{chunk-XV3Y7QVU.mjs.map → chunk-QRM66RQG.mjs.map} +1 -1
  58. package/dist/{chunk-6KTHJ3EL.mjs → chunk-QRRP7TGF.mjs} +3 -3
  59. package/dist/{chunk-6KTHJ3EL.mjs.map → chunk-QRRP7TGF.mjs.map} +1 -1
  60. package/dist/chunk-SD6XGDAC.mjs +3 -0
  61. package/dist/chunk-SD6XGDAC.mjs.map +1 -0
  62. package/dist/chunk-SDFVGFXT.mjs +3 -0
  63. package/dist/chunk-SDFVGFXT.mjs.map +1 -0
  64. package/dist/{chunk-N7M6RIN4.mjs → chunk-SMLDNOV3.mjs} +3 -3
  65. package/dist/{chunk-N7M6RIN4.mjs.map → chunk-SMLDNOV3.mjs.map} +1 -1
  66. package/dist/{chunk-NBJUE7NR.mjs → chunk-TAP6MYDW.mjs} +2 -2
  67. package/dist/{chunk-NBJUE7NR.mjs.map → chunk-TAP6MYDW.mjs.map} +1 -1
  68. package/dist/{chunk-PYBYZVSL.mjs → chunk-TBZ645BI.mjs} +2 -2
  69. package/dist/{chunk-PYBYZVSL.mjs.map → chunk-TBZ645BI.mjs.map} +1 -1
  70. package/dist/{chunk-C4OACMTB.mjs → chunk-V2DNYJR6.mjs} +2 -2
  71. package/dist/{chunk-C4OACMTB.mjs.map → chunk-V2DNYJR6.mjs.map} +1 -1
  72. package/dist/chunk-VBABZXL7.mjs +3 -0
  73. package/dist/chunk-VBABZXL7.mjs.map +1 -0
  74. package/dist/{chunk-OSCMSA2Q.mjs → chunk-WYBSHTGY.mjs} +2 -2
  75. package/dist/{chunk-OSCMSA2Q.mjs.map → chunk-WYBSHTGY.mjs.map} +1 -1
  76. package/dist/chunk-ZQUMJQYV.mjs +3 -0
  77. package/dist/chunk-ZQUMJQYV.mjs.map +1 -0
  78. package/dist/chunk-ZY23NOT4.mjs +3 -0
  79. package/dist/chunk-ZY23NOT4.mjs.map +1 -0
  80. package/dist/components/Action.d.ts.map +1 -1
  81. package/dist/components/Badge.d.ts +1 -1
  82. package/dist/components/Button.d.ts.map +1 -1
  83. package/dist/components/Card.d.ts.map +1 -1
  84. package/dist/components/DatePicker.d.ts.map +1 -1
  85. package/dist/components/Dropdown.d.ts +0 -50
  86. package/dist/components/Dropdown.d.ts.map +1 -1
  87. package/dist/components/Icon/Icon.d.ts.map +1 -1
  88. package/dist/components/Modal.d.ts.map +1 -1
  89. package/dist/components/Popover.d.ts +2 -0
  90. package/dist/components/Popover.d.ts.map +1 -1
  91. package/dist/components/Progress.d.ts +3 -2
  92. package/dist/components/Progress.d.ts.map +1 -1
  93. package/dist/components/Section.d.ts +44 -0
  94. package/dist/components/Section.d.ts.map +1 -0
  95. package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
  96. package/dist/components/advanced/Carousel.d.ts.map +1 -1
  97. package/dist/components/advanced/DotNav.d.ts +26 -0
  98. package/dist/components/advanced/DotNav.d.ts.map +1 -0
  99. package/dist/components/advanced/HorizontalScroll.d.ts +20 -0
  100. package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -0
  101. package/dist/components/advanced/ImageReveal.d.ts +24 -0
  102. package/dist/components/advanced/ImageReveal.d.ts.map +1 -0
  103. package/dist/components/advanced/Parallax.d.ts +9 -6
  104. package/dist/components/advanced/Parallax.d.ts.map +1 -1
  105. package/dist/components/advanced/TextReveal.d.ts.map +1 -1
  106. package/dist/components/advanced/index.d.ts +6 -0
  107. package/dist/components/advanced/index.d.ts.map +1 -1
  108. package/dist/data.mjs +1 -1
  109. package/dist/data.mjs.map +1 -1
  110. package/dist/feedback.mjs +1 -1
  111. package/dist/form.mjs +3 -3
  112. package/dist/form.mjs.map +1 -1
  113. package/dist/{icons-Bj_nr8Ba.d.mts → icons-DcOBy9Hf.d.mts} +10 -1
  114. package/dist/iconsax-extended.mjs +2 -2
  115. package/dist/iconsax-extended.mjs.map +1 -1
  116. package/dist/index.d.mts +10 -109
  117. package/dist/index.d.ts +4 -0
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.mjs +14 -14
  120. package/dist/index.mjs.map +1 -1
  121. package/dist/interactive.mjs +1 -1
  122. package/dist/interactive.mjs.map +1 -1
  123. package/dist/landing/LandingAbout.d.ts +3 -0
  124. package/dist/landing/LandingAbout.d.ts.map +1 -0
  125. package/dist/landing/LandingCTA.d.ts +3 -0
  126. package/dist/landing/LandingCTA.d.ts.map +1 -0
  127. package/dist/landing/LandingContact.d.ts +3 -0
  128. package/dist/landing/LandingContact.d.ts.map +1 -0
  129. package/dist/landing/LandingExperience.d.ts +3 -0
  130. package/dist/landing/LandingExperience.d.ts.map +1 -0
  131. package/dist/landing/LandingFeatures.d.ts +3 -0
  132. package/dist/landing/LandingFeatures.d.ts.map +1 -0
  133. package/dist/landing/LandingHero.d.ts +3 -0
  134. package/dist/landing/LandingHero.d.ts.map +1 -0
  135. package/dist/landing/LandingLogoCloud.d.ts +3 -0
  136. package/dist/landing/LandingLogoCloud.d.ts.map +1 -0
  137. package/dist/landing/LandingMetrics.d.ts +3 -0
  138. package/dist/landing/LandingMetrics.d.ts.map +1 -0
  139. package/dist/landing/LandingProjects.d.ts +3 -0
  140. package/dist/landing/LandingProjects.d.ts.map +1 -0
  141. package/dist/landing/LandingProvider.d.ts +4 -0
  142. package/dist/landing/LandingProvider.d.ts.map +1 -0
  143. package/dist/landing/LandingShowcase.d.ts +3 -0
  144. package/dist/landing/LandingShowcase.d.ts.map +1 -0
  145. package/dist/landing/LandingSkills.d.ts +3 -0
  146. package/dist/landing/LandingSkills.d.ts.map +1 -0
  147. package/dist/landing/LandingStats.d.ts +3 -0
  148. package/dist/landing/LandingStats.d.ts.map +1 -0
  149. package/dist/landing/LandingTestimonials.d.ts +3 -0
  150. package/dist/landing/LandingTestimonials.d.ts.map +1 -0
  151. package/dist/landing/index.d.ts +47 -0
  152. package/dist/landing/index.d.ts.map +1 -0
  153. package/dist/landing/themes/app.d.ts +3 -0
  154. package/dist/landing/themes/app.d.ts.map +1 -0
  155. package/dist/landing/themes/corporate.d.ts +3 -0
  156. package/dist/landing/themes/corporate.d.ts.map +1 -0
  157. package/dist/landing/themes/dashboard.d.ts +3 -0
  158. package/dist/landing/themes/dashboard.d.ts.map +1 -0
  159. package/dist/landing/themes/immersive.d.ts +3 -0
  160. package/dist/landing/themes/immersive.d.ts.map +1 -0
  161. package/dist/landing/themes/index.d.ts +15 -0
  162. package/dist/landing/themes/index.d.ts.map +1 -0
  163. package/dist/landing/themes/marketing.d.ts +3 -0
  164. package/dist/landing/themes/marketing.d.ts.map +1 -0
  165. package/dist/landing/themes/portfolio.d.ts +3 -0
  166. package/dist/landing/themes/portfolio.d.ts.map +1 -0
  167. package/dist/landing/themes/product.d.ts +3 -0
  168. package/dist/landing/themes/product.d.ts.map +1 -0
  169. package/dist/landing/types.d.ts +346 -0
  170. package/dist/landing/types.d.ts.map +1 -0
  171. package/dist/landing.d.mts +417 -0
  172. package/dist/landing.mjs +31 -0
  173. package/dist/landing.mjs.map +1 -0
  174. package/dist/lib/icon-providers.d.ts +9 -25
  175. package/dist/lib/icon-providers.d.ts.map +1 -1
  176. package/dist/lib/icons.d.ts +10 -1
  177. package/dist/lib/icons.d.ts.map +1 -1
  178. package/dist/lib/utils.d.ts.map +1 -1
  179. package/dist/navigation.d.mts +1 -1
  180. package/dist/navigation.mjs +1 -1
  181. package/dist/navigation.mjs.map +1 -1
  182. package/dist/overlay.d.mts +2 -50
  183. package/dist/overlay.mjs +1 -1
  184. package/dist/overlay.mjs.map +1 -1
  185. package/dist/sdui.mjs +1 -1
  186. package/dist/sdui.mjs.map +1 -1
  187. package/dist/theme.d.mts +85 -0
  188. package/dist/theme.d.ts +14 -0
  189. package/dist/theme.d.ts.map +1 -0
  190. package/dist/theme.mjs +3 -0
  191. package/dist/theme.mjs.map +1 -0
  192. package/package.json +30 -20
  193. package/src/styles/landing.css +107 -0
  194. package/src/styles/utilities.css +58 -0
  195. package/dist/advanced-dashboard.js +0 -39
  196. package/dist/advanced-dashboard.js.map +0 -1
  197. package/dist/advanced-emotion.js +0 -2
  198. package/dist/advanced-emotion.js.map +0 -1
  199. package/dist/advanced-motion.js +0 -82
  200. package/dist/advanced-motion.js.map +0 -1
  201. package/dist/advanced.js +0 -112
  202. package/dist/advanced.js.map +0 -1
  203. package/dist/chunk-BXX2TZUB.mjs +0 -3
  204. package/dist/chunk-BXX2TZUB.mjs.map +0 -1
  205. package/dist/chunk-COR6CDMA.mjs +0 -83
  206. package/dist/chunk-COR6CDMA.mjs.map +0 -1
  207. package/dist/chunk-FFH4ZFKS.mjs +0 -3
  208. package/dist/chunk-FFH4ZFKS.mjs.map +0 -1
  209. package/dist/chunk-HN5LSP6L.mjs +0 -3
  210. package/dist/chunk-HN5LSP6L.mjs.map +0 -1
  211. package/dist/chunk-LPAG7DCA.mjs +0 -3
  212. package/dist/chunk-LPAG7DCA.mjs.map +0 -1
  213. package/dist/chunk-QQCELXFD.mjs +0 -3
  214. package/dist/chunk-QQCELXFD.mjs.map +0 -1
  215. package/dist/chunk-RPUS7G7Q.mjs +0 -3
  216. package/dist/chunk-RPUS7G7Q.mjs.map +0 -1
  217. package/dist/chunk-SDFHJ4GB.mjs +0 -3
  218. package/dist/chunk-SDFHJ4GB.mjs.map +0 -1
  219. package/dist/chunk-UUHAXGMO.mjs +0 -3
  220. package/dist/chunk-UUHAXGMO.mjs.map +0 -1
  221. package/dist/data.js +0 -3
  222. package/dist/data.js.map +0 -1
  223. package/dist/feedback.js +0 -12
  224. package/dist/feedback.js.map +0 -1
  225. package/dist/form.js +0 -8
  226. package/dist/form.js.map +0 -1
  227. package/dist/iconsax-extended.js +0 -3
  228. package/dist/iconsax-extended.js.map +0 -1
  229. package/dist/iconsax.js +0 -3
  230. package/dist/iconsax.js.map +0 -1
  231. package/dist/index.js +0 -51
  232. package/dist/index.js.map +0 -1
  233. package/dist/interactive.js +0 -2
  234. package/dist/interactive.js.map +0 -1
  235. package/dist/lib/phosphor-icons.d.ts +0 -6
  236. package/dist/lib/phosphor-icons.d.ts.map +0 -1
  237. package/dist/navigation.js +0 -12
  238. package/dist/navigation.js.map +0 -1
  239. package/dist/overlay.js +0 -3
  240. package/dist/overlay.js.map +0 -1
  241. package/dist/sdui.js +0 -9
  242. package/dist/sdui.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/styles/colors.ts","../src/lib/styles/variants.ts"],"names":["colorShades","colorClass","color","shade","prefix","withDarkMode","lightClass","darkClass","defaultColorConfig","gradientConfig","createColorStyles","config","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","finalConfig","defaultBorder","defaultBg","defaultStyle","merge","gradientFrom","gradientTo","gradientBorder","gradientStyle","outlineBorder","outlineBg","outlineText","outlineStyle","elevatedBorder","elevatedBg","elevatedShadow","elevatedStyle","iconBg","iconText","iconStyle","badgeBg","badgeText","badgeStyle","colorStylesCache","useColorStyles","cacheKey","createVariantStyles","variant","colorStyles","baseClasses","createSizeStyles","size","createRoundedStyles","rounded","createShadowStyles","shadow","HUA_SPRING_EASING","createHoverStyles","hover","reducedMotion","springTransition"],"mappings":"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","file":"chunk-LH77I6HO.mjs","sourcesContent":["/**\n * HUA UI 공통 색상 시스템\n * 중앙화된 색상 팔레트와 스타일 생성 유틸리티\n */\n\nimport type { Color } from \"../types/common\";\nimport { merge } from \"../utils\";\n\n/**\n * Tailwind CSS 색상 클래스 매핑\n * 각 색상의 50-900 단계를 정의합니다.\n */\nconst colorShades = {\n 50: \"50\",\n 100: \"100\",\n 200: \"200\",\n 300: \"300\",\n 400: \"400\",\n 500: \"500\",\n 600: \"600\",\n 700: \"700\",\n 800: \"800\",\n 900: \"900\",\n} as const;\n\ntype ColorShade = keyof typeof colorShades;\n\n/**\n * 색상별 클래스 생성 헬퍼\n */\nfunction colorClass(color: Color, shade: ColorShade, prefix: string = \"\"): string {\n return `${prefix}${color}-${colorShades[shade]}`;\n}\n\n/**\n * 다크 모드 지원 클래스 생성\n */\nfunction withDarkMode(lightClass: string, darkClass: string): string {\n return `${lightClass} dark:${darkClass}`;\n}\n\n/**\n * 색상 스타일 설정 인터페이스\n */\nexport interface ColorStyleConfig {\n /** 기본 variant 스타일 */\n default?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n };\n /** 그라데이션 variant 스타일 */\n gradient?: {\n from?: ColorShade;\n to?: ColorShade;\n border?: { light: ColorShade; dark?: ColorShade };\n };\n /** 아웃라인 variant 스타일 */\n outline?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: string;\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** Elevated variant 스타일 */\n elevated?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: string; dark: string };\n shadow?: string;\n };\n /** 아이콘 스타일 */\n icon?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** 배지 스타일 */\n badge?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n}\n\n/**\n * 생성된 색상 스타일 인터페이스\n */\nexport interface ColorStyles {\n default: string;\n gradient: string;\n outline: string;\n elevated: string;\n icon: string;\n badge: string;\n}\n\n/**\n * 기본 색상 스타일 설정\n * 각 색상에 대한 기본 스타일 템플릿\n */\nconst defaultColorConfig: Omit<ColorStyleConfig, \"gradient\"> = {\n default: {\n border: { light: 200, dark: 700 },\n background: { light: 50, dark: 900, opacity: \"50\" },\n },\n outline: {\n border: { light: 300, dark: 600 },\n background: \"transparent\",\n text: { light: 600, dark: 400 },\n },\n elevated: {\n border: { light: 200, dark: 700 },\n background: { light: \"white\", dark: \"gray-800\" },\n shadow: \"lg\",\n },\n icon: {\n background: { light: 100, dark: 900, opacity: \"30\" },\n text: { light: 600, dark: 400 },\n },\n badge: {\n background: { light: 50, dark: 900, opacity: \"30\" },\n text: { light: 700, dark: 300 },\n },\n};\n\n/**\n * 그라데이션 스타일 설정\n */\nconst gradientConfig: ColorStyleConfig[\"gradient\"] = {\n from: 500,\n to: 600,\n border: { light: 400, dark: 500 },\n};\n\n/**\n * 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n * \n * @example\n * ```tsx\n * const styles = createColorStyles(\"blue\");\n * // styles.default, styles.gradient, styles.outline 등 사용 가능\n * ```\n */\nexport function createColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const finalConfig: ColorStyleConfig = {\n default: config?.default || defaultColorConfig.default,\n gradient: config?.gradient || gradientConfig,\n outline: config?.outline || defaultColorConfig.outline,\n elevated: config?.elevated || defaultColorConfig.elevated,\n icon: config?.icon || defaultColorConfig.icon,\n badge: config?.badge || defaultColorConfig.badge,\n };\n\n // Default variant\n const defaultBorder = finalConfig.default?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.default.border.light)}`,\n `border-${colorClass(color, finalConfig.default.border.dark || finalConfig.default.border.light)}`\n )\n : \"\";\n \n const defaultBg = finalConfig.default?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.default.background.dark || finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`\n )\n : \"\";\n\n const defaultStyle = merge(defaultBorder, defaultBg);\n\n // Gradient variant\n const gradientFrom = finalConfig.gradient?.from\n ? `from-${colorClass(color, finalConfig.gradient.from)}`\n : \"\";\n const gradientTo = finalConfig.gradient?.to\n ? `to-${colorClass(color, finalConfig.gradient.to)}`\n : \"\";\n const gradientBorder = finalConfig.gradient?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.gradient.border.light)}`,\n `border-${colorClass(color, finalConfig.gradient.border.dark || finalConfig.gradient.border.light)}`\n )\n : \"\";\n \n const gradientStyle = merge(\n \"bg-gradient-to-br\",\n gradientFrom,\n gradientTo,\n gradientBorder\n );\n\n // Outline variant\n const outlineBorder = finalConfig.outline?.border\n ? `border-2 ${withDarkMode(\n `border-${colorClass(color, finalConfig.outline.border.light)}`,\n `border-${colorClass(color, finalConfig.outline.border.dark || finalConfig.outline.border.light)}`\n )}`\n : \"\";\n const outlineBg = finalConfig.outline?.background || \"bg-transparent\";\n const outlineText = finalConfig.outline?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.outline.text.light)}`,\n `text-${colorClass(color, finalConfig.outline.text.dark || finalConfig.outline.text.light)}`\n )\n : \"\";\n \n const outlineStyle = merge(outlineBorder, outlineBg, outlineText);\n\n // Elevated variant\n const elevatedBorder = finalConfig.elevated?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.elevated.border.light)}`,\n `border-${colorClass(color, finalConfig.elevated.border.dark || finalConfig.elevated.border.light)}`\n )\n : \"\";\n const elevatedBg = finalConfig.elevated?.background\n ? withDarkMode(\n `bg-${finalConfig.elevated.background.light}`,\n `bg-${finalConfig.elevated.background.dark}`\n )\n : \"\";\n const elevatedShadow = finalConfig.elevated?.shadow\n ? `shadow-${finalConfig.elevated.shadow}`\n : \"\";\n \n const elevatedStyle = merge(elevatedBorder, elevatedBg, elevatedShadow);\n\n // Icon style\n const iconBg = finalConfig.icon?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.icon.background.dark || finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`\n )\n : \"\";\n const iconText = finalConfig.icon?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.icon.text.light)}`,\n `text-${colorClass(color, finalConfig.icon.text.dark || finalConfig.icon.text.light)}`\n )\n : \"\";\n \n const iconStyle = merge(iconBg, iconText);\n\n // Badge style\n const badgeBg = finalConfig.badge?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.badge.background.dark || finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`\n )\n : \"\";\n const badgeText = finalConfig.badge?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.badge.text.light)}`,\n `text-${colorClass(color, finalConfig.badge.text.dark || finalConfig.badge.text.light)}`\n )\n : \"\";\n \n const badgeStyle = merge(badgeBg, badgeText);\n\n return {\n default: defaultStyle,\n gradient: gradientStyle,\n outline: outlineStyle,\n elevated: elevatedStyle,\n icon: iconStyle,\n badge: badgeStyle,\n };\n}\n\n/**\n * 색상 스타일 캐시\n * 동일한 색상과 설정에 대해 재사용하여 성능 최적화\n */\nconst colorStylesCache = new Map<string, ColorStyles>();\n\n/**\n * 메모이제이션된 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n */\nexport function useColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const cacheKey = `${color}-${JSON.stringify(config || {})}`;\n \n if (!colorStylesCache.has(cacheKey)) {\n colorStylesCache.set(cacheKey, createColorStyles(color, config));\n }\n \n return colorStylesCache.get(cacheKey)!;\n}\n\n","/**\n * HUA UI 공통 Variant 시스템\n * 컴포넌트 variant 스타일 생성 유틸리티\n */\n\nimport type { ExtendedVariant, Size } from \"../types/common\";\nimport type { ColorStyles } from \"./colors\";\nimport { merge } from \"../utils\";\n\n/**\n * Variant 스타일 생성 함수\n * \n * @param variant - Variant 타입\n * @param colorStyles - 색상 스타일 객체\n * @returns 생성된 variant 클래스 문자열\n * \n * @example\n * ```tsx\n * const colorStyles = useColorStyles(\"blue\");\n * const variantClass = createVariantStyles(\"elevated\", colorStyles);\n * ```\n */\nexport function createVariantStyles(\n variant: ExtendedVariant,\n colorStyles: ColorStyles\n): string {\n const baseClasses = \"rounded-2xl border transition-all duration-200\";\n \n switch (variant) {\n case \"default\":\n return merge(baseClasses, colorStyles.default);\n \n case \"gradient\":\n return merge(baseClasses, \"text-white\", colorStyles.gradient);\n \n case \"outline\":\n return merge(baseClasses, colorStyles.outline);\n \n case \"elevated\":\n return merge(baseClasses, colorStyles.elevated);\n \n default:\n return baseClasses;\n }\n}\n\n/**\n * Size 스타일 설정 인터페이스\n */\nexport interface SizeStyles {\n container: string;\n icon: string;\n iconContainer: string;\n text: string;\n title: string;\n description: string;\n}\n\n/**\n * Size 스타일 생성 함수\n * \n * @param size - 크기 타입\n * @returns 생성된 size 스타일 객체\n * \n * @example\n * ```tsx\n * const sizeStyles = createSizeStyles(\"md\");\n * // sizeStyles.container, sizeStyles.icon 등 사용 가능\n * ```\n */\nexport function createSizeStyles(size: Size = \"md\"): SizeStyles {\n const sizeMap: Record<Size, SizeStyles> = {\n sm: {\n container: \"p-4\",\n icon: \"h-4 w-4\",\n iconContainer: \"w-8 h-8\",\n text: \"text-xs\",\n title: \"text-xs\",\n description: \"text-xs\",\n },\n md: {\n container: \"p-6\",\n icon: \"h-6 w-6\",\n iconContainer: \"w-12 h-12\",\n text: \"text-base\",\n title: \"text-sm\",\n description: \"text-sm\",\n },\n lg: {\n container: \"p-8\",\n icon: \"h-8 w-8\",\n iconContainer: \"w-16 h-16\",\n text: \"text-lg\",\n title: \"text-base\",\n description: \"text-base\",\n },\n xl: {\n container: \"p-10\",\n icon: \"h-10 w-10\",\n iconContainer: \"w-20 h-20\",\n text: \"text-xl\",\n title: \"text-lg\",\n description: \"text-lg\",\n },\n };\n \n return sizeMap[size];\n}\n\n/**\n * Rounded 스타일 타입\n */\nexport type Rounded = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\" | \"none\";\n\n/**\n * Rounded 스타일 생성 함수\n * \n * @param rounded - Rounded 타입\n * @returns 생성된 rounded 클래스 문자열\n */\nexport function createRoundedStyles(rounded: Rounded = \"md\"): string {\n const roundedMap: Record<Rounded, string> = {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n none: \"rounded-none\",\n };\n \n return roundedMap[rounded];\n}\n\n/**\n * Shadow 스타일 타입\n */\nexport type Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\n/**\n * Shadow 스타일 생성 함수\n * \n * @param shadow - Shadow 타입\n * @returns 생성된 shadow 클래스 문자열\n */\nexport function createShadowStyles(shadow: Shadow = \"md\"): string {\n if (shadow === \"none\") return \"\";\n \n return `shadow-${shadow}`;\n}\n\n/**\n * Hover 효과 타입\n */\nexport type HoverEffect = \"scale\" | \"glow\" | \"slide\" | \"springy\" | \"none\";\n\n/**\n * HUA-UI 스프링 이징\n * 공 튕기듯 아주 미세한 반동 - cubic-bezier(0.34, 1.56, 0.64, 1)\n */\nexport const HUA_SPRING_EASING = \"cubic-bezier(0.34, 1.56, 0.64, 1)\";\n\n/**\n * Hover 효과 스타일 생성 함수\n *\n * @param hover - Hover 효과 타입\n * @param reducedMotion - 애니메이션 축소 설정 여부\n * @returns 생성된 hover 클래스 문자열\n *\n * @description\n * HUA-UI 시그니처: \"스륵 부드럽고 아주 미세하게 쫀득\"\n * - 스프링 이징으로 미세한 반동 효과\n * - 1.5% 스케일 변화로 자연스러운 피드백\n */\nexport function createHoverStyles(\n hover: HoverEffect = \"springy\",\n reducedMotion: boolean = false\n): string {\n if (reducedMotion || hover === \"none\") return \"\";\n\n // 스프링 이징 스타일 (Tailwind arbitrary value)\n // HUA-UI 시그니처: 아주 미세한 스프링 반동 (쫀득한 느낌)\n const springTransition = \"[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]\";\n\n const hoverMap: Record<HoverEffect, string> = {\n // HUA-UI 시그니처 스프링 효과 (기본값)\n // scale 1.5% + 미세한 shadow 추가로 입체감\n springy: `hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${springTransition} transform-gpu`,\n // scale만 (스프링 없음)\n scale: \"hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu\",\n // 글로우 효과 - shadow 강화\n glow: \"hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200\",\n // 슬라이드 효과 - 위로 살짝 뜨는 느낌 + shadow\n slide: `hover:-translate-y-0.5 hover:shadow-md ${springTransition} transform-gpu`,\n none: \"\",\n };\n\n return hoverMap[hover];\n}\n\n"]}
1
+ {"version":3,"sources":["../src/lib/styles/colors.ts","../src/lib/styles/variants.ts"],"names":["colorShades","colorClass","color","shade","prefix","withDarkMode","lightClass","darkClass","defaultColorConfig","gradientConfig","createColorStyles","config","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","finalConfig","defaultBorder","defaultBg","defaultStyle","merge","gradientFrom","gradientTo","gradientBorder","gradientStyle","outlineBorder","outlineBg","outlineText","outlineStyle","elevatedBorder","elevatedBg","elevatedShadow","elevatedStyle","iconBg","iconText","iconStyle","badgeBg","badgeText","badgeStyle","colorStylesCache","useColorStyles","cacheKey","createVariantStyles","variant","colorStyles","baseClasses","createSizeStyles","size","createRoundedStyles","rounded","createShadowStyles","shadow","HUA_SPRING_EASING","createHoverStyles","hover","reducedMotion","springTransition"],"mappings":"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","file":"chunk-EPY3432E.mjs","sourcesContent":["/**\n * HUA UI 공통 색상 시스템\n * 중앙화된 색상 팔레트와 스타일 생성 유틸리티\n */\n\nimport type { Color } from \"../types/common\";\nimport { merge } from \"../utils\";\n\n/**\n * Tailwind CSS 색상 클래스 매핑\n * 각 색상의 50-900 단계를 정의합니다.\n */\nconst colorShades = {\n 50: \"50\",\n 100: \"100\",\n 200: \"200\",\n 300: \"300\",\n 400: \"400\",\n 500: \"500\",\n 600: \"600\",\n 700: \"700\",\n 800: \"800\",\n 900: \"900\",\n} as const;\n\ntype ColorShade = keyof typeof colorShades;\n\n/**\n * 색상별 클래스 생성 헬퍼\n */\nfunction colorClass(color: Color, shade: ColorShade, prefix: string = \"\"): string {\n return `${prefix}${color}-${colorShades[shade]}`;\n}\n\n/**\n * 다크 모드 지원 클래스 생성\n */\nfunction withDarkMode(lightClass: string, darkClass: string): string {\n return `${lightClass} dark:${darkClass}`;\n}\n\n/**\n * 색상 스타일 설정 인터페이스\n */\nexport interface ColorStyleConfig {\n /** 기본 variant 스타일 */\n default?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n };\n /** 그라데이션 variant 스타일 */\n gradient?: {\n from?: ColorShade;\n to?: ColorShade;\n border?: { light: ColorShade; dark?: ColorShade };\n };\n /** 아웃라인 variant 스타일 */\n outline?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: string;\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** Elevated variant 스타일 */\n elevated?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: string; dark: string };\n shadow?: string;\n };\n /** 아이콘 스타일 */\n icon?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** 배지 스타일 */\n badge?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n}\n\n/**\n * 생성된 색상 스타일 인터페이스\n */\nexport interface ColorStyles {\n default: string;\n gradient: string;\n outline: string;\n elevated: string;\n icon: string;\n badge: string;\n}\n\n/**\n * 기본 색상 스타일 설정\n * 각 색상에 대한 기본 스타일 템플릿\n */\nconst defaultColorConfig: Omit<ColorStyleConfig, \"gradient\"> = {\n default: {\n border: { light: 200, dark: 700 },\n background: { light: 50, dark: 900, opacity: \"50\" },\n },\n outline: {\n border: { light: 300, dark: 600 },\n background: \"transparent\",\n text: { light: 600, dark: 400 },\n },\n elevated: {\n border: { light: 200, dark: 700 },\n background: { light: \"white\", dark: \"gray-800\" },\n shadow: \"lg\",\n },\n icon: {\n background: { light: 100, dark: 900, opacity: \"30\" },\n text: { light: 600, dark: 400 },\n },\n badge: {\n background: { light: 50, dark: 900, opacity: \"30\" },\n text: { light: 700, dark: 300 },\n },\n};\n\n/**\n * 그라데이션 스타일 설정\n */\nconst gradientConfig: ColorStyleConfig[\"gradient\"] = {\n from: 500,\n to: 600,\n border: { light: 400, dark: 500 },\n};\n\n/**\n * 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n * \n * @example\n * ```tsx\n * const styles = createColorStyles(\"blue\");\n * // styles.default, styles.gradient, styles.outline 등 사용 가능\n * ```\n */\nexport function createColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const finalConfig: ColorStyleConfig = {\n default: config?.default || defaultColorConfig.default,\n gradient: config?.gradient || gradientConfig,\n outline: config?.outline || defaultColorConfig.outline,\n elevated: config?.elevated || defaultColorConfig.elevated,\n icon: config?.icon || defaultColorConfig.icon,\n badge: config?.badge || defaultColorConfig.badge,\n };\n\n // Default variant\n const defaultBorder = finalConfig.default?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.default.border.light)}`,\n `border-${colorClass(color, finalConfig.default.border.dark || finalConfig.default.border.light)}`\n )\n : \"\";\n \n const defaultBg = finalConfig.default?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.default.background.dark || finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`\n )\n : \"\";\n\n const defaultStyle = merge(defaultBorder, defaultBg);\n\n // Gradient variant\n const gradientFrom = finalConfig.gradient?.from\n ? `from-${colorClass(color, finalConfig.gradient.from)}`\n : \"\";\n const gradientTo = finalConfig.gradient?.to\n ? `to-${colorClass(color, finalConfig.gradient.to)}`\n : \"\";\n const gradientBorder = finalConfig.gradient?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.gradient.border.light)}`,\n `border-${colorClass(color, finalConfig.gradient.border.dark || finalConfig.gradient.border.light)}`\n )\n : \"\";\n \n const gradientStyle = merge(\n \"bg-gradient-to-br\",\n gradientFrom,\n gradientTo,\n gradientBorder\n );\n\n // Outline variant\n const outlineBorder = finalConfig.outline?.border\n ? `border-2 ${withDarkMode(\n `border-${colorClass(color, finalConfig.outline.border.light)}`,\n `border-${colorClass(color, finalConfig.outline.border.dark || finalConfig.outline.border.light)}`\n )}`\n : \"\";\n const outlineBg = finalConfig.outline?.background || \"bg-transparent\";\n const outlineText = finalConfig.outline?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.outline.text.light)}`,\n `text-${colorClass(color, finalConfig.outline.text.dark || finalConfig.outline.text.light)}`\n )\n : \"\";\n \n const outlineStyle = merge(outlineBorder, outlineBg, outlineText);\n\n // Elevated variant\n const elevatedBorder = finalConfig.elevated?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.elevated.border.light)}`,\n `border-${colorClass(color, finalConfig.elevated.border.dark || finalConfig.elevated.border.light)}`\n )\n : \"\";\n const elevatedBg = finalConfig.elevated?.background\n ? withDarkMode(\n `bg-${finalConfig.elevated.background.light}`,\n `bg-${finalConfig.elevated.background.dark}`\n )\n : \"\";\n const elevatedShadow = finalConfig.elevated?.shadow\n ? `shadow-${finalConfig.elevated.shadow}`\n : \"\";\n \n const elevatedStyle = merge(elevatedBorder, elevatedBg, elevatedShadow);\n\n // Icon style\n const iconBg = finalConfig.icon?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.icon.background.dark || finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`\n )\n : \"\";\n const iconText = finalConfig.icon?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.icon.text.light)}`,\n `text-${colorClass(color, finalConfig.icon.text.dark || finalConfig.icon.text.light)}`\n )\n : \"\";\n \n const iconStyle = merge(iconBg, iconText);\n\n // Badge style\n const badgeBg = finalConfig.badge?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.badge.background.dark || finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`\n )\n : \"\";\n const badgeText = finalConfig.badge?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.badge.text.light)}`,\n `text-${colorClass(color, finalConfig.badge.text.dark || finalConfig.badge.text.light)}`\n )\n : \"\";\n \n const badgeStyle = merge(badgeBg, badgeText);\n\n return {\n default: defaultStyle,\n gradient: gradientStyle,\n outline: outlineStyle,\n elevated: elevatedStyle,\n icon: iconStyle,\n badge: badgeStyle,\n };\n}\n\n/**\n * 색상 스타일 캐시\n * 동일한 색상과 설정에 대해 재사용하여 성능 최적화\n */\nconst colorStylesCache = new Map<string, ColorStyles>();\n\n/**\n * 메모이제이션된 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n */\nexport function useColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const cacheKey = `${color}-${JSON.stringify(config || {})}`;\n \n if (!colorStylesCache.has(cacheKey)) {\n colorStylesCache.set(cacheKey, createColorStyles(color, config));\n }\n \n return colorStylesCache.get(cacheKey)!;\n}\n\n","/**\n * HUA UI 공통 Variant 시스템\n * 컴포넌트 variant 스타일 생성 유틸리티\n */\n\nimport type { ExtendedVariant, Size } from \"../types/common\";\nimport type { ColorStyles } from \"./colors\";\nimport { merge } from \"../utils\";\n\n/**\n * Variant 스타일 생성 함수\n * \n * @param variant - Variant 타입\n * @param colorStyles - 색상 스타일 객체\n * @returns 생성된 variant 클래스 문자열\n * \n * @example\n * ```tsx\n * const colorStyles = useColorStyles(\"blue\");\n * const variantClass = createVariantStyles(\"elevated\", colorStyles);\n * ```\n */\nexport function createVariantStyles(\n variant: ExtendedVariant,\n colorStyles: ColorStyles\n): string {\n const baseClasses = \"rounded-2xl border transition-all duration-200\";\n \n switch (variant) {\n case \"default\":\n return merge(baseClasses, colorStyles.default);\n \n case \"gradient\":\n return merge(baseClasses, \"text-white\", colorStyles.gradient);\n \n case \"outline\":\n return merge(baseClasses, colorStyles.outline);\n \n case \"elevated\":\n return merge(baseClasses, colorStyles.elevated);\n \n default:\n return baseClasses;\n }\n}\n\n/**\n * Size 스타일 설정 인터페이스\n */\nexport interface SizeStyles {\n container: string;\n icon: string;\n iconContainer: string;\n text: string;\n title: string;\n description: string;\n}\n\n/**\n * Size 스타일 생성 함수\n * \n * @param size - 크기 타입\n * @returns 생성된 size 스타일 객체\n * \n * @example\n * ```tsx\n * const sizeStyles = createSizeStyles(\"md\");\n * // sizeStyles.container, sizeStyles.icon 등 사용 가능\n * ```\n */\nexport function createSizeStyles(size: Size = \"md\"): SizeStyles {\n const sizeMap: Record<Size, SizeStyles> = {\n sm: {\n container: \"p-4\",\n icon: \"h-4 w-4\",\n iconContainer: \"w-8 h-8\",\n text: \"text-xs\",\n title: \"text-xs\",\n description: \"text-xs\",\n },\n md: {\n container: \"p-6\",\n icon: \"h-6 w-6\",\n iconContainer: \"w-12 h-12\",\n text: \"text-base\",\n title: \"text-sm\",\n description: \"text-sm\",\n },\n lg: {\n container: \"p-8\",\n icon: \"h-8 w-8\",\n iconContainer: \"w-16 h-16\",\n text: \"text-lg\",\n title: \"text-base\",\n description: \"text-base\",\n },\n xl: {\n container: \"p-10\",\n icon: \"h-10 w-10\",\n iconContainer: \"w-20 h-20\",\n text: \"text-xl\",\n title: \"text-lg\",\n description: \"text-lg\",\n },\n };\n \n return sizeMap[size];\n}\n\n/**\n * Rounded 스타일 타입\n */\nexport type Rounded = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\" | \"none\";\n\n/**\n * Rounded 스타일 생성 함수\n * \n * @param rounded - Rounded 타입\n * @returns 생성된 rounded 클래스 문자열\n */\nexport function createRoundedStyles(rounded: Rounded = \"md\"): string {\n const roundedMap: Record<Rounded, string> = {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n none: \"rounded-none\",\n };\n \n return roundedMap[rounded];\n}\n\n/**\n * Shadow 스타일 타입\n */\nexport type Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\n/**\n * Shadow 스타일 생성 함수\n * \n * @param shadow - Shadow 타입\n * @returns 생성된 shadow 클래스 문자열\n */\nexport function createShadowStyles(shadow: Shadow = \"md\"): string {\n if (shadow === \"none\") return \"\";\n \n return `shadow-${shadow}`;\n}\n\n/**\n * Hover 효과 타입\n */\nexport type HoverEffect = \"scale\" | \"glow\" | \"slide\" | \"springy\" | \"none\";\n\n/**\n * HUA-UI 스프링 이징\n * 공 튕기듯 아주 미세한 반동 - cubic-bezier(0.34, 1.56, 0.64, 1)\n */\nexport const HUA_SPRING_EASING = \"cubic-bezier(0.34, 1.56, 0.64, 1)\";\n\n/**\n * Hover 효과 스타일 생성 함수\n *\n * @param hover - Hover 효과 타입\n * @param reducedMotion - 애니메이션 축소 설정 여부\n * @returns 생성된 hover 클래스 문자열\n *\n * @description\n * HUA-UI 시그니처: \"스륵 부드럽고 아주 미세하게 쫀득\"\n * - 스프링 이징으로 미세한 반동 효과\n * - 1.5% 스케일 변화로 자연스러운 피드백\n */\nexport function createHoverStyles(\n hover: HoverEffect = \"springy\",\n reducedMotion: boolean = false\n): string {\n if (reducedMotion || hover === \"none\") return \"\";\n\n // 스프링 이징 스타일 (Tailwind arbitrary value)\n // HUA-UI 시그니처: 아주 미세한 스프링 반동 (쫀득한 느낌)\n const springTransition = \"[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]\";\n\n const hoverMap: Record<HoverEffect, string> = {\n // HUA-UI 시그니처 스프링 효과 (기본값)\n // scale 1.5% + 미세한 shadow 추가로 입체감\n springy: `hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${springTransition} transform-gpu`,\n // scale만 (스프링 없음)\n scale: \"hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu\",\n // 글로우 효과 - shadow 강화\n glow: \"hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200\",\n // 슬라이드 효과 - 위로 살짝 뜨는 느낌 + shadow\n slide: `hover:-translate-y-0.5 hover:shadow-md ${springTransition} transform-gpu`,\n none: \"\",\n };\n\n return hoverMap[hover];\n}\n\n"]}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import {a}from'./chunk-UUHAXGMO.mjs';import h from'react';import {cva}from'class-variance-authority';import {jsx,jsxs}from'react/jsx-runtime';var b={error:"border-destructive focus-visible:ring-destructive",success:"border-green-500 focus-visible:ring-green-500"};var L=cva("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",{variants:{variant:{default:"border-input bg-background",outline:"border-2 border-input bg-transparent",filled:"border-transparent bg-secondary/50",glass:"border-white/20 bg-white/10 text-white placeholder:text-white/50 backdrop-blur-sm"}},defaultVariants:{variant:"default"}}),T=h.forwardRef(({className:n,type:l,variant:t="default",error:s,success:d,...e},r)=>{let o=e["aria-invalid"],i=s||(o!==void 0?o:false);return jsx("input",{type:l,className:a(L({variant:t}),i&&b.error,d&&b.success,n),ref:r,"aria-invalid":i||void 0,...e})});T.displayName="Input";var M=cva("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",{variants:{variant:{default:"text-foreground",glass:"text-white"}},defaultVariants:{variant:"default"}}),_=h.forwardRef(({className:n,children:l,required:t=false,error:s=false,disabled:d=false,variant:e="default",...r},o)=>jsxs("label",{ref:o,className:a(M({variant:e}),s&&(e==="glass"?"text-red-400":"text-destructive"),d&&(e==="glass"?"text-white/50":"text-muted-foreground"),n),"aria-required":t?true:void 0,...r,children:[l,t&&jsx("span",{className:e==="glass"?"text-red-400 ml-1":"text-destructive ml-1","aria-label":"\uD544\uC218 \uD544\uB4DC",children:"*"})]}));_.displayName="Label";var P=h.forwardRef(({className:n,variant:l="default",size:t="md",error:s=false,success:d=false,label:e,description:r,id:o,...i},v)=>{var g;let x=h.useId(),u=o||x,f=e?`${u}-label`:void 0,m=r?`${u}-description`:void 0,w={sm:"w-9 h-5",md:"w-11 h-6",lg:"w-14 h-8"},k={sm:"w-4 h-4",md:"w-5 h-5",lg:"w-7 h-7"},y={sm:"peer-checked:translate-x-4",md:"peer-checked:translate-x-5",lg:"peer-checked:translate-x-6"},I={default:"bg-muted peer-checked:bg-primary",outline:"bg-transparent border-2 border-input peer-checked:border-primary peer-checked:bg-primary",filled:"bg-secondary peer-checked:bg-primary",glass:"bg-white/20 backdrop-blur-sm border border-white/30 peer-checked:bg-primary/50 peer-checked:border-primary/30"},N=s?"bg-destructive/20 peer-checked:bg-destructive":d?"bg-green-200 peer-checked:bg-green-600 dark:bg-green-800 dark:peer-checked:bg-green-500":"";return jsxs("div",{className:"flex items-start space-x-3",children:[jsxs("div",{className:"relative",children:[jsx("input",{type:"checkbox",id:u,className:a("peer sr-only",n),ref:v,"aria-checked":(g=i.checked)!=null?g:false,"aria-invalid":s,"aria-label":e?void 0:i["aria-label"],"aria-labelledby":e?f:void 0,"aria-describedby":m,role:"switch",...i}),jsx("div",{className:a("relative inline-flex cursor-pointer items-center rounded-full transition-colors duration-200 ease-in-out","peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-ring peer-focus:ring-offset-2","peer-disabled:cursor-not-allowed peer-disabled:opacity-50",w[t],I[l],N),children:jsx("div",{className:a("pointer-events-none absolute rounded-full bg-white shadow-md ring-0","transition-all duration-200 ease-out","top-1/2 -translate-y-1/2 left-0.5",k[t],y[t])})})]}),(e||r)&&jsxs("div",{className:"flex flex-col",children:[e&&jsx("label",{htmlFor:u,id:f,className:"text-sm font-medium text-foreground cursor-pointer",children:e}),r&&jsx("p",{id:m,className:"text-sm text-muted-foreground",children:r})]})]})});P.displayName="Switch";export{b as a,T as b,_ as c,P as d};//# sourceMappingURL=chunk-SGEP3CQE.mjs.map
3
- //# sourceMappingURL=chunk-SGEP3CQE.mjs.map
2
+ import {a}from'./chunk-QEMPERUK.mjs';import h from'react';import {cva}from'class-variance-authority';import {jsx,jsxs}from'react/jsx-runtime';var b={error:"border-destructive focus-visible:ring-destructive",success:"border-green-500 focus-visible:ring-green-500"};var L=cva("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",{variants:{variant:{default:"border-input bg-background",outline:"border-2 border-input bg-transparent",filled:"border-transparent bg-secondary/50",glass:"border-white/20 bg-white/10 text-white placeholder:text-white/50 backdrop-blur-sm"}},defaultVariants:{variant:"default"}}),T=h.forwardRef(({className:n,type:l,variant:t="default",error:s,success:d,...e},r)=>{let o=e["aria-invalid"],i=s||(o!==void 0?o:false);return jsx("input",{type:l,className:a(L({variant:t}),i&&b.error,d&&b.success,n),ref:r,"aria-invalid":i||void 0,...e})});T.displayName="Input";var M=cva("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",{variants:{variant:{default:"text-foreground",glass:"text-white"}},defaultVariants:{variant:"default"}}),_=h.forwardRef(({className:n,children:l,required:t=false,error:s=false,disabled:d=false,variant:e="default",...r},o)=>jsxs("label",{ref:o,className:a(M({variant:e}),s&&(e==="glass"?"text-red-400":"text-destructive"),d&&(e==="glass"?"text-white/50":"text-muted-foreground"),n),"aria-required":t?true:void 0,...r,children:[l,t&&jsx("span",{className:e==="glass"?"text-red-400 ml-1":"text-destructive ml-1","aria-label":"\uD544\uC218 \uD544\uB4DC",children:"*"})]}));_.displayName="Label";var P=h.forwardRef(({className:n,variant:l="default",size:t="md",error:s=false,success:d=false,label:e,description:r,id:o,...i},v)=>{var g;let x=h.useId(),u=o||x,f=e?`${u}-label`:void 0,m=r?`${u}-description`:void 0,w={sm:"w-9 h-5",md:"w-11 h-6",lg:"w-14 h-8"},k={sm:"w-4 h-4",md:"w-5 h-5",lg:"w-7 h-7"},y={sm:"peer-checked:translate-x-4",md:"peer-checked:translate-x-5",lg:"peer-checked:translate-x-6"},I={default:"bg-muted peer-checked:bg-primary",outline:"bg-transparent border-2 border-input peer-checked:border-primary peer-checked:bg-primary",filled:"bg-secondary peer-checked:bg-primary",glass:"bg-white/20 backdrop-blur-sm border border-white/30 peer-checked:bg-primary/50 peer-checked:border-primary/30"},N=s?"bg-destructive/20 peer-checked:bg-destructive":d?"bg-green-200 peer-checked:bg-green-600 dark:bg-green-800 dark:peer-checked:bg-green-500":"";return jsxs("div",{className:"flex items-start space-x-3",children:[jsxs("div",{className:"relative",children:[jsx("input",{type:"checkbox",id:u,className:a("peer sr-only",n),ref:v,"aria-checked":(g=i.checked)!=null?g:false,"aria-invalid":s,"aria-label":e?void 0:i["aria-label"],"aria-labelledby":e?f:void 0,"aria-describedby":m,role:"switch",...i}),jsx("div",{className:a("relative inline-flex cursor-pointer items-center rounded-full transition-colors duration-200 ease-in-out","peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-ring peer-focus:ring-offset-2","peer-disabled:cursor-not-allowed peer-disabled:opacity-50",w[t],I[l],N),children:jsx("div",{className:a("pointer-events-none absolute rounded-full bg-white shadow-md ring-0","transition-all duration-200 ease-out","top-1/2 -translate-y-1/2 left-0.5",k[t],y[t])})})]}),(e||r)&&jsxs("div",{className:"flex flex-col",children:[e&&jsx("label",{htmlFor:u,id:f,className:"text-sm font-medium text-foreground cursor-pointer",children:e}),r&&jsx("p",{id:m,className:"text-sm text-muted-foreground",children:r})]})]})});P.displayName="Switch";export{b as a,T as b,_ as c,P as d};//# sourceMappingURL=chunk-F2M4YDDQ.mjs.map
3
+ //# sourceMappingURL=chunk-F2M4YDDQ.mjs.map
@@ -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-F2M4YDDQ.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,3 @@
1
+ "use client";
2
+ import {l}from'./chunk-ZQUMJQYV.mjs';import {a}from'./chunk-QEMPERUK.mjs';import x from'react';import {jsxs,jsx}from'react/jsx-runtime';var y=x.forwardRef(({className:n,icon:e,title:s,description:d,variant:a$1="default",size:r="md",hover:i="scale",gradient:g="blue",customGradient:m,...c},p)=>{let u={sm:"p-4",md:"p-6",lg:"p-8"},b={default:"bg-background/90 backdrop-blur-sm border border-border/50",gradient:`bg-gradient-to-br ${m||v(g)}`,glass:"bg-white/10 dark:bg-gray-800/10 backdrop-blur-md border border-white/20 dark:border-gray-700/20",neon:"bg-gray-900/90 dark:bg-gray-900/90 border border-cyan-400/30 dark:border-cyan-400/30 shadow-lg shadow-cyan-400/20"},f={scale:"hover:scale-105 transition-transform duration-300",glow:"hover:shadow-2xl hover:shadow-cyan-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300",slide:"hover:-translate-y-2 transition-transform duration-300",none:""},h=r==="lg"?"text-5xl":r==="md"?"text-4xl":"text-3xl";return jsxs("div",{ref:p,className:a("rounded-2xl shadow-lg transition-all duration-300 flex flex-col items-center text-center",u[r],b[a$1],f[i],n),...c,children:[e&&jsx("div",{className:`mb-4 ${h} ${a$1==="neon"?"text-cyan-400":""}`,children:typeof e=="string"&&e.startsWith("http")?jsx("img",{src:e,alt:s,className:"w-full h-full object-contain"}):jsx(l,{name:e,className:"w-full h-full"})}),jsx("h3",{className:a("font-bold mb-2",r==="lg"?"text-2xl":r==="md"?"text-xl":"text-lg",a$1==="gradient"?"text-white":"text-foreground"),children:s}),jsx("p",{className:a(r==="lg"?"text-base":"text-sm",a$1==="gradient"?"text-white/90":"text-muted-foreground"),children:d})]})});y.displayName="FeatureCard";function v(n){let e={blue:"from-indigo-500 via-cyan-500 to-cyan-600",purple:"from-purple-500 via-pink-500 to-purple-600",green:"from-green-500 via-emerald-500 to-green-600",orange:"from-orange-500 via-red-500 to-orange-600",pink:"from-pink-500 via-rose-500 to-pink-600"};return e[n]||e.blue}export{y as a};//# sourceMappingURL=chunk-FHMFDCX2.mjs.map
3
+ //# sourceMappingURL=chunk-FHMFDCX2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/FeatureCard.tsx"],"names":["FeatureCard","React","className","icon","title","description","variant","size","hover","gradient","customGradient","props","ref","sizeClasses","variantClasses","getGradientClass","hoverClasses","iconSize","jsxs","merge","jsx","Icon","gradients"],"mappings":"wIAuEA,IAAMA,CAAAA,CAAcC,CAAAA,CAAM,WACxB,CAAC,CACC,UAAAC,CAAAA,CACA,IAAA,CAAAC,EACA,KAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,GAAAA,CAAU,UACV,IAAA,CAAAC,CAAAA,CAAO,KACP,KAAA,CAAAC,CAAAA,CAAQ,QACR,QAAA,CAAAC,CAAAA,CAAW,MAAA,CACX,cAAA,CAAAC,CAAAA,CACA,GAAGC,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMC,CAAAA,CAAc,CAClB,GAAI,KAAA,CACJ,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KACN,CAAA,CAEMC,EAAiB,CACrB,OAAA,CAAS,4DACT,QAAA,CAAU,CAAA,kBAAA,EAAqBJ,GAAkBK,CAAAA,CAAiBN,CAAQ,CAAC,CAAA,CAAA,CAC3E,KAAA,CAAO,iGAAA,CACP,KAAM,mHACR,CAAA,CAEMO,CAAAA,CAAe,CACnB,KAAA,CAAO,mDAAA,CACP,KAAM,wGAAA,CACN,KAAA,CAAO,wDAAA,CACP,IAAA,CAAM,EACR,CAAA,CAEMC,EAAWV,CAAAA,GAAS,IAAA,CAAO,WAAaA,CAAAA,GAAS,IAAA,CAAO,WAAa,UAAA,CAE3E,OACEW,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKN,CAAAA,CACL,UAAWO,CAAAA,CACT,0FAAA,CACAN,CAAAA,CAAYN,CAAI,CAAA,CAChBO,CAAAA,CAAeR,GAAO,CAAA,CACtBU,CAAAA,CAAaR,CAAK,CAAA,CAClBN,CACF,CAAA,CACC,GAAGS,CAAAA,CAEH,QAAA,CAAA,CAAAR,GACCiB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAW,CAAA,KAAA,EAAQH,CAAQ,CAAA,CAAA,EAAIX,GAAAA,GAAY,MAAA,CAAS,eAAA,CAAkB,EAAE,CAAA,CAAA,CAC1E,QAAA,CAAA,OAAOH,GAAS,QAAA,EAAYA,CAAAA,CAAK,WAAW,MAAM,CAAA,CACjDiB,GAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKjB,CAAAA,CAAM,IAAKC,CAAAA,CAAO,SAAA,CAAU,+BAA+B,CAAA,CAErEgB,GAAAA,CAACC,EAAA,CAAK,IAAA,CAAMlB,CAAAA,CAAqB,SAAA,CAAU,eAAA,CAAgB,CAAA,CAE/D,EAGFiB,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAWD,CAAAA,CACb,gBAAA,CACAZ,CAAAA,GAAS,KAAO,UAAA,CAAaA,CAAAA,GAAS,IAAA,CAAO,SAAA,CAAY,SAAA,CACzDD,GAAAA,GAAY,WAAa,YAAA,CAAe,iBAC1C,EACG,QAAA,CAAAF,CAAAA,CACH,EAEAgB,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAWD,CAAAA,CACZZ,CAAAA,GAAS,IAAA,CAAO,YAAc,SAAA,CAC9BD,GAAAA,GAAY,UAAA,CAAa,eAAA,CAAkB,uBAC7C,CAAA,CACG,SAAAD,CAAAA,CACH,CAAA,CAAA,CACF,CAEJ,CACF,EAEAL,CAAAA,CAAY,YAAc,aAAA,CAE1B,SAASe,EAAiBN,CAAAA,CAA0B,CAClD,IAAMa,CAAAA,CAAY,CAChB,IAAA,CAAM,0CAAA,CACN,MAAA,CAAQ,4CAAA,CACR,MAAO,6CAAA,CACP,MAAA,CAAQ,2CAAA,CACR,IAAA,CAAM,wCACR,CAAA,CACA,OAAOA,CAAAA,CAAUb,CAAkC,CAAA,EAAKa,CAAAA,CAAU,IACpE","file":"chunk-FHMFDCX2.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { AllIconName } from \"../lib/icon-names\"\n\n/**\n * FeatureCard 아이콘 타입 / FeatureCard icon type\n * - AllIconName: icons.ts + PROJECT_ICONS의 모든 아이콘 / All icons from icons.ts + PROJECT_ICONS\n * - `http${string}`: 이미지 URL / Image URL\n */\ntype FeatureCardIconType = AllIconName | `http${string}`\n\n/**\n * FeatureCard 컴포넌트의 props / FeatureCard component props\n * @typedef {Object} FeatureCardProps\n * @property {FeatureCardIconType} [icon] - 아이콘 (IconName, ProjectIconName 또는 이미지 URL) / Icon (IconName, ProjectIconName or image URL)\n * @property {string} title - 카드 제목 / Card title\n * @property {string} description - 카드 설명 / Card description\n * @property {\"default\" | \"gradient\" | \"glass\" | \"neon\"} [variant=\"default\"] - FeatureCard 스타일 변형 / FeatureCard style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - FeatureCard 크기 / FeatureCard size\n * @property {\"scale\" | \"glow\" | \"slide\" | \"none\"} [hover=\"scale\"] - 호버 효과 / Hover effect\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"} [gradient=\"blue\"] - 그라디언트 색상 / Gradient color\n * @property {string} [customGradient] - 커스텀 그라디언트 클래스 / Custom gradient class\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface FeatureCardProps extends React.HTMLAttributes<HTMLDivElement> {\n icon?: FeatureCardIconType\n title: string\n description: string\n variant?: \"default\" | \"gradient\" | \"glass\" | \"neon\"\n size?: \"sm\" | \"md\" | \"lg\"\n hover?: \"scale\" | \"glow\" | \"slide\" | \"none\"\n gradient?: \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"\n customGradient?: string\n}\n\n/**\n * FeatureCard 컴포넌트 / FeatureCard component\n * \n * 기능을 소개하는 카드 컴포넌트입니다.\n * 아이콘, 제목, 설명을 포함하며, 다양한 스타일과 호버 효과를 지원합니다.\n * \n * Card component that introduces features.\n * Includes icon, title, and description, supports various styles and hover effects.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <FeatureCard\n * icon=\"star\"\n * title=\"고급 기능\"\n * description=\"강력한 기능을 제공합니다\"\n * />\n * \n * @example\n * // Gradient 스타일 / Gradient style\n * <FeatureCard\n * icon=\"zap\"\n * title=\"빠른 성능\"\n * description=\"최적화된 성능\"\n * variant=\"gradient\"\n * gradient=\"purple\"\n * hover=\"glow\"\n * />\n * \n * @param {FeatureCardProps} props - FeatureCard 컴포넌트의 props / FeatureCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} FeatureCard 컴포넌트 / FeatureCard component\n */\nconst FeatureCard = React.forwardRef<HTMLDivElement, FeatureCardProps>(\n ({ \n className, \n icon, \n title, \n description, \n variant = \"default\", \n size = \"md\",\n hover = \"scale\",\n gradient = \"blue\",\n customGradient,\n ...props \n }, ref) => {\n const sizeClasses = {\n sm: \"p-4\",\n md: \"p-6\",\n lg: \"p-8\"\n }\n\n const variantClasses = {\n default: \"bg-background/90 backdrop-blur-sm border border-border/50\",\n gradient: `bg-gradient-to-br ${customGradient || getGradientClass(gradient)}`,\n glass: \"bg-white/10 dark:bg-gray-800/10 backdrop-blur-md border border-white/20 dark:border-gray-700/20\",\n neon: \"bg-gray-900/90 dark:bg-gray-900/90 border border-cyan-400/30 dark:border-cyan-400/30 shadow-lg shadow-cyan-400/20\"\n }\n\n const hoverClasses = {\n scale: \"hover:scale-105 transition-transform duration-300\",\n glow: \"hover:shadow-2xl hover:shadow-cyan-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300\",\n slide: \"hover:-translate-y-2 transition-transform duration-300\",\n none: \"\"\n }\n\n const iconSize = size === \"lg\" ? \"text-5xl\" : size === \"md\" ? \"text-4xl\" : \"text-3xl\"\n\n return (\n <div\n ref={ref}\n className={merge(\n \"rounded-2xl shadow-lg transition-all duration-300 flex flex-col items-center text-center\",\n sizeClasses[size],\n variantClasses[variant],\n hoverClasses[hover],\n className\n )}\n {...props}\n >\n {icon && (\n <div className={`mb-4 ${iconSize} ${variant === \"neon\" ? \"text-cyan-400\" : \"\"}`}>\n {typeof icon === \"string\" && icon.startsWith(\"http\") ? (\n <img src={icon} alt={title} className=\"w-full h-full object-contain\" />\n ) : (\n <Icon name={icon as AllIconName} className=\"w-full h-full\" />\n )}\n </div>\n )}\n \n <h3 className={merge(\n \"font-bold mb-2\",\n size === \"lg\" ? \"text-2xl\" : size === \"md\" ? \"text-xl\" : \"text-lg\",\n variant === \"gradient\" ? \"text-white\" : \"text-foreground\"\n )}>\n {title}\n </h3>\n \n <p className={merge(\n size === \"lg\" ? \"text-base\" : \"text-sm\",\n variant === \"gradient\" ? \"text-white/90\" : \"text-muted-foreground\"\n )}>\n {description}\n </p>\n </div>\n )\n }\n)\n\nFeatureCard.displayName = \"FeatureCard\"\n\nfunction getGradientClass(gradient: string): string {\n const gradients = {\n blue: \"from-indigo-500 via-cyan-500 to-cyan-600\",\n purple: \"from-purple-500 via-pink-500 to-purple-600\",\n green: \"from-green-500 via-emerald-500 to-green-600\",\n orange: \"from-orange-500 via-red-500 to-orange-600\",\n pink: \"from-pink-500 via-rose-500 to-pink-600\"\n }\n return gradients[gradient as keyof typeof gradients] || gradients.blue\n}\n\nexport { FeatureCard } "]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import {a}from'./chunk-QEMPERUK.mjs';import n from'react';import {createPortal}from'react-dom';import {jsxs,jsx}from'react/jsx-runtime';function v({onClick:a$1,className:o}){return jsx("button",{onClick:a$1,className:a("p-2 text-muted-foreground hover:text-foreground transition-all duration-200 rounded-full hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 z-20",o),"aria-label":"\uB2EB\uAE30",children: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"})})})}function $(...a){return n.useCallback(o=>{a.forEach(e=>{e&&(typeof e=="function"?e(o):e.current=o);});},a)}var j=n.forwardRef(({className:a$1,isOpen:o,onClose:e,children:g,size:p="md",closable:s,closeOnOverlayClick:x=true,title:r,description:c,showBackdrop:y=true,backdropClassName:h,centered:k=true},w)=>{let m=s!=null?s:true,N=n.useRef(null),R=$(w,N);n.useEffect(()=>{let i=u=>{u.key==="Escape"&&e();};if(o){document.addEventListener("keydown",i);let u=window.innerWidth-document.documentElement.clientWidth;document.body.style.overflow="hidden",document.body.style.paddingRight=`${u}px`;}return ()=>{document.removeEventListener("keydown",i),document.body.style.overflow="unset",document.body.style.paddingRight="unset";}},[o,e]);let C=i=>{x&&i.target===i.currentTarget&&e();},E={sm:"max-w-xs",md:"max-w-sm",lg:"max-w-md",xl:"max-w-lg","2xl":"max-w-xl","3xl":"max-w-2xl"},M=n.useId(),T=n.useId(),f=r?`modal-title-${M}`:void 0,b=c?`modal-description-${T}`:void 0,[z,I]=n.useState(false);if(n.useEffect(()=>{I(true);},[]),!o)return null;let L=jsxs("div",{className:a("fixed inset-0 z-50 overflow-y-auto",a$1),onClick:C,role:"dialog","aria-modal":"true","aria-labelledby":f,"aria-describedby":b,children:[y&&jsx("div",{className:a("fixed inset-0 bg-black/85 backdrop-blur-md transition-opacity duration-300 pointer-events-none",h)}),jsx("div",{className:a("flex h-full justify-center p-4",k?"items-center":"items-start pt-16"),children:jsxs("div",{ref:R,className:a("relative bg-[var(--modal-bg)] rounded-lg shadow-2xl border border-[var(--modal-border)] transform transition-all duration-300 ease-out",E[p]),style:{animation:"modalSlideIn 0.3s cubic-bezier(0.16, 1, 0.3, 1)"},children:[r&&jsxs("div",{className:"relative z-10 px-6 pt-6 pb-4 border-b border-border/50",children:[jsxs("div",{className:"flex items-center justify-between gap-4 mb-2",children:[jsx("h2",{id:f,className:"text-xl font-semibold text-foreground flex-1 min-w-0",children:r}),m&&jsx(v,{onClick:e,className:"flex-shrink-0"})]}),c&&jsx("p",{id:b,className:"text-sm text-muted-foreground",children:c})]}),!r&&m&&jsx(v,{onClick:e,className:"absolute top-4 right-4"}),jsx("div",{className:`relative z-10 ${r?"px-6 mb-6":"p-6"}`,children:g})]})})]});return z&&typeof document!="undefined"?createPortal(L,document.body):null});j.displayName="Modal";export{j as a};//# sourceMappingURL=chunk-HBIUCLFL.mjs.map
3
+ //# sourceMappingURL=chunk-HBIUCLFL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Modal.tsx"],"names":["ModalCloseButton","onClick","className","jsx","merge","useCombinedRefs","refs","React","node","ref","Modal","isOpen","onClose","children","size","closable","closeOnOverlayClick","title","description","showBackdrop","backdropClassName","centered","_closable","modalRef","combinedRef","handleEscape","e","scrollbarWidth","handleOverlayClick","sizeClasses","generatedTitleId","generatedDescId","titleId","descriptionId","mounted","setMounted","modalContent","jsxs","createPortal"],"mappings":"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","file":"chunk-HBIUCLFL.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Modal 컴포넌트의 props / Modal component props\n * @typedef {Object} ModalProps\n * @property {boolean} isOpen - 모달 열림/닫힘 상태 / Modal open/close state\n * @property {() => void} onClose - 모달 닫기 콜백 함수 / Modal close callback function\n * @property {React.ReactNode} children - 모달 내용 / Modal content\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\"} [size=\"md\"] - 모달 크기 / Modal size\n * @property {boolean} [closable=true] - 닫기 버튼 표시 여부 / Show close button\n * @property {boolean} [closeOnOverlayClick=true] - 오버레이 클릭 시 닫기 여부 / Close on overlay click\n * @property {string} [title] - 모달 제목 / Modal title\n * @property {string} [description] - 모달 설명 / Modal description\n * @property {boolean} [showBackdrop=true] - 배경 오버레이 표시 여부 / Show backdrop overlay\n * @property {string} [backdropClassName] - 배경 오버레이 추가 CSS 클래스 / Additional CSS class for backdrop\n * @property {boolean} [centered=true] - 모달을 화면 중앙에 배치할지 여부 / Center modal on screen\n * @property {string} [className] - 모달 컨테이너 추가 CSS 클래스 / Additional CSS class for modal container\n */\nexport interface ModalProps {\n /** 모달 열림/닫힘 상태 / Modal open/close state */\n isOpen: boolean\n /** 모달 닫기 콜백 함수 / Modal close callback function */\n onClose: () => void\n /** 모달 내용 / Modal content */\n children: React.ReactNode\n /** 모달 크기 / Modal size */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\"\n /** 닫기 버튼 표시 여부 / Show close button */\n closable?: boolean\n /** 오버레이 클릭 시 닫기 여부 / Close on overlay click */\n closeOnOverlayClick?: boolean\n /** 모달 제목 / Modal title */\n title?: string\n /** 모달 설명 / Modal description */\n description?: string\n /** 배경 오버레이 표시 여부 / Show backdrop overlay */\n showBackdrop?: boolean\n /** 배경 오버레이 추가 CSS 클래스 / Additional CSS class for backdrop */\n backdropClassName?: string\n /** 모달을 화면 중앙에 배치할지 여부 / Center modal on screen */\n centered?: boolean\n /** 모달 컨테이너 추가 CSS 클래스 / Additional CSS class for modal container */\n className?: string\n}\n\n// 모달 닫기 버튼 컴포넌트 (title 유무에 따라 위치만 다름)\nfunction ModalCloseButton({\n onClick,\n className,\n}: {\n onClick: () => void;\n className?: string;\n}) {\n return (\n <button\n onClick={onClick}\n className={merge(\n \"p-2 text-muted-foreground hover:text-foreground transition-all duration-200 rounded-full hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 z-20\",\n className\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n );\n}\n\n// Ref 병합 유틸리티\nfunction useCombinedRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return React.useCallback(\n (node: T) => {\n refs.forEach((ref) => {\n if (!ref) return;\n if (typeof ref === \"function\") {\n ref(node);\n } else {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs\n );\n}\n\n/**\n * Modal 컴포넌트 / Modal component\n * \n * 오버레이와 함께 표시되는 모달 다이얼로그 컴포넌트입니다.\n * ESC 키로 닫기, 오버레이 클릭으로 닫기, 접근성 속성(ARIA)을 지원합니다.\n * \n * Modal dialog component displayed with overlay.\n * Supports closing with ESC key, overlay click, and ARIA accessibility attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [isOpen, setIsOpen] = useState(false)\n * \n * <Modal isOpen={isOpen} onClose={() => setIsOpen(false)}>\n * <p>모달 내용</p>\n * </Modal>\n * \n * @example\n * // 제목과 설명 포함 / With title and description\n * <Modal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"확인\"\n * description=\"이 작업을 계속하시겠습니까?\"\n * >\n * <Button onClick={handleConfirm}>확인</Button>\n * </Modal>\n * \n * @example\n * // 큰 크기 모달 / Large size modal\n * <Modal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * size=\"xl\"\n * closeOnOverlayClick={false}\n * >\n * <div>큰 모달 내용</div>\n * </Modal>\n * \n * @param {ModalProps} props - Modal 컴포넌트의 props / Modal component props\n * @param {React.Ref<HTMLDivElement>} ref - 모달 컨테이너 ref / Modal container ref\n * @returns {JSX.Element} Modal 컴포넌트 / Modal component\n */\nexport const Modal = React.forwardRef<HTMLDivElement, ModalProps>(\n ({\n className,\n isOpen,\n onClose,\n children,\n size = \"md\",\n closable,\n closeOnOverlayClick = true,\n title,\n description,\n showBackdrop = true,\n backdropClassName,\n centered = true\n }, ref) => {\n const _closable = closable ?? true\n const modalRef = React.useRef<HTMLDivElement>(null)\n const combinedRef = useCombinedRefs(ref, modalRef)\n\n // ESC 키로 모달 닫기 및 스크롤 잠금 (화면 흔들림 방지)\n React.useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose()\n }\n }\n\n if (isOpen) {\n document.addEventListener(\"keydown\", handleEscape)\n // 스크롤바 너비 계산하여 padding 추가 (화면 흔들림 방지)\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n document.body.style.overflow = \"hidden\"\n document.body.style.paddingRight = `${scrollbarWidth}px`\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"unset\"\n document.body.style.paddingRight = \"unset\"\n }\n }, [isOpen, onClose])\n\n // 모달 외부 클릭으로 닫기\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onClose()\n }\n }\n\n // 모달 크기 클래스 (max-w 기반, 콘텐츠에 맞게 자연스럽게 축소)\n const sizeClasses = {\n sm: \"max-w-xs\", // 320px\n md: \"max-w-sm\", // 384px\n lg: \"max-w-md\", // 448px\n xl: \"max-w-lg\", // 512px\n \"2xl\": \"max-w-xl\", // 576px\n \"3xl\": \"max-w-2xl\" // 672px\n }\n\n // 접근성을 위한 ID 생성\n const generatedTitleId = React.useId()\n const generatedDescId = React.useId()\n const titleId = title ? `modal-title-${generatedTitleId}` : undefined;\n const descriptionId = description ? `modal-description-${generatedDescId}` : undefined;\n\n // SSR에서는 document가 없으므로 체크\n const [mounted, setMounted] = React.useState(false)\n React.useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!isOpen) return null\n\n const modalContent = (\n <div\n className={merge(\n \"fixed inset-0 z-50 overflow-y-auto\",\n className\n )}\n onClick={handleOverlayClick}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n >\n {/* 배경 오버레이 - pointer-events-none으로 클릭이 뒤로 전달됨 */}\n {showBackdrop && (\n <div\n className={merge(\n \"fixed inset-0 bg-black/85 backdrop-blur-md transition-opacity duration-300 pointer-events-none\",\n backdropClassName\n )}\n />\n )}\n\n {/* 센터링 컨테이너 */}\n <div className={merge(\n \"flex h-full justify-center p-4\",\n centered ? \"items-center\" : \"items-start pt-16\"\n )}>\n {/* 모달 컨테이너 */}\n {/* CSS 변수 기반 배경색 (Tailwind v4 dark: + bg-* 충돌 우회) */}\n <div\n ref={combinedRef}\n className={merge(\n \"relative bg-[var(--modal-bg)] rounded-lg shadow-2xl border border-[var(--modal-border)] transform transition-all duration-300 ease-out\",\n sizeClasses[size]\n )}\n style={{\n animation: \"modalSlideIn 0.3s cubic-bezier(0.16, 1, 0.3, 1)\"\n }}\n >\n \n {/* 헤더 */}\n {title && (\n <div className=\"relative z-10 px-6 pt-6 pb-4 border-b border-border/50\">\n {/* 타이틀과 닫기 버튼 - 같은 줄, 양쪽 끝 */}\n <div className=\"flex items-center justify-between gap-4 mb-2\">\n <h2 id={titleId} className=\"text-xl font-semibold text-foreground flex-1 min-w-0\">{title}</h2>\n {/* 닫기 버튼 - 타이틀과 같은 계층의 오른쪽 끝 */}\n {_closable && (\n <ModalCloseButton onClick={onClose} className=\"flex-shrink-0\" />\n )}\n </div>\n {/* 설명 - 아래 줄 */}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n )}\n\n {/* 타이틀이 없을 때만 별도 닫기 버튼 */}\n {!title && _closable && (\n <ModalCloseButton onClick={onClose} className=\"absolute top-4 right-4\" />\n )}\n \n {/* 모달 내용 */}\n <div className={`relative z-10 ${title ? 'px-6 mb-6' : 'p-6'}`}>\n {children}\n </div>\n </div>\n </div>\n </div>\n )\n\n // 브라우저에서만 createPortal 사용 (SSR 호환)\n if (mounted && typeof document !== 'undefined') {\n return createPortal(modalContent, document.body)\n }\n\n // SSR fallback - 그냥 렌더링 (첫 렌더링에는 보이지 않음)\n return null\n})\n\nModal.displayName = \"Modal\" "]}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import {l as l$1}from'./chunk-HN5LSP6L.mjs';import {a}from'./chunk-UUHAXGMO.mjs';import l from'react';import {jsxs,jsx}from'react/jsx-runtime';var w=l.forwardRef(({className:i,children:a$1,items:n,maxItems:s,showHomeIcon:c,homeLabel:f="Home",separator:p=jsx(l$1,{name:"chevronRight",className:"w-3 h-3 text-muted-foreground flex-shrink-0"}),variant:g="default",...h},N)=>{let I={default:"inline-flex items-center text-sm w-fit",subtle:"inline-flex items-center text-xs bg-background/40 backdrop-blur-md rounded-md px-3 py-2 border border-border/30 w-fit shadow-sm",transparent:"inline-flex items-center text-xs w-fit",glass:"inline-flex items-center text-xs bg-background/30 backdrop-blur-lg rounded-lg px-4 py-2 border border-border/25 w-fit shadow-lg"},o=(()=>{if(n){let r=[...n];if(s&&r.length>s){let e=r[0],d=r.slice(-(s-1));r=[e,{label:"...",href:void 0},...d];}return r.map((e,d)=>{let B=d===r.length-1&&!e.href;return jsxs(x,{href:e.href,isCurrent:B,children:[e.icon&&jsx(l$1,{name:e.icon,className:"w-4 h-4 mr-1"}),e.label]},d)})}return a$1?l.Children.map(a$1,(r,e)=>l.isValidElement(r)?jsxs("li",{className:"flex items-center",children:[r,e<l.Children.count(a$1)-1&&jsx("span",{className:"mx-3 text-muted-foreground flex items-center justify-center","aria-hidden":"true",children:p})]},e):r):null})(),y=n?n.length:a$1?l.Children.count(a$1):0;return jsx("nav",{ref:N,"aria-label":"Breadcrumb",className:a(I[g],i),...h,children:jsxs("ol",{className:"inline-flex items-center",children:[c&&jsxs("li",{className:"flex items-center",children:[jsxs(x,{href:"/",children:[jsx(l$1,{name:"home",className:"w-4 h-4 mr-1"}),f]}),y>0&&jsx("span",{className:"mx-3 text-muted-foreground flex items-center justify-center","aria-hidden":"true",children:p})]}),n?o==null?void 0:o.map((r,e)=>jsxs("li",{className:"flex items-center",children:[r,e<((o==null?void 0:o.length)||0)-1&&jsx("span",{className:"mx-3 text-muted-foreground flex items-center justify-center","aria-hidden":"true",children:p})]},e)):o]})})});w.displayName="Breadcrumb";var x=l.forwardRef(({className:i,href:a$1,isCurrent:n=false,children:s,...c},f)=>n?jsx("span",{ref:f,"aria-current":"page",className:a("text-muted-foreground font-medium",i),...c,children:s}):a$1?jsx("a",{href:a$1,className:a("text-muted-foreground hover:text-foreground transition-colors",i),...c,children:s}):jsx("span",{ref:f,className:a("text-muted-foreground",i),...c,children:s}));x.displayName="BreadcrumbItem";export{w as a,x as b};//# sourceMappingURL=chunk-LOYAJIWO.mjs.map
3
- //# sourceMappingURL=chunk-LOYAJIWO.mjs.map
2
+ import {l as l$1}from'./chunk-ZQUMJQYV.mjs';import {a}from'./chunk-QEMPERUK.mjs';import l from'react';import {jsxs,jsx}from'react/jsx-runtime';var w=l.forwardRef(({className:i,children:a$1,items:n,maxItems:s,showHomeIcon:c,homeLabel:f="Home",separator:p=jsx(l$1,{name:"chevronRight",className:"w-3 h-3 text-muted-foreground flex-shrink-0"}),variant:g="default",...h},N)=>{let I={default:"inline-flex items-center text-sm w-fit",subtle:"inline-flex items-center text-xs bg-background/40 backdrop-blur-md rounded-md px-3 py-2 border border-border/30 w-fit shadow-sm",transparent:"inline-flex items-center text-xs w-fit",glass:"inline-flex items-center text-xs bg-background/30 backdrop-blur-lg rounded-lg px-4 py-2 border border-border/25 w-fit shadow-lg"},o=(()=>{if(n){let r=[...n];if(s&&r.length>s){let e=r[0],d=r.slice(-(s-1));r=[e,{label:"...",href:void 0},...d];}return r.map((e,d)=>{let B=d===r.length-1&&!e.href;return jsxs(x,{href:e.href,isCurrent:B,children:[e.icon&&jsx(l$1,{name:e.icon,className:"w-4 h-4 mr-1"}),e.label]},d)})}return a$1?l.Children.map(a$1,(r,e)=>l.isValidElement(r)?jsxs("li",{className:"flex items-center",children:[r,e<l.Children.count(a$1)-1&&jsx("span",{className:"mx-3 text-muted-foreground flex items-center justify-center","aria-hidden":"true",children:p})]},e):r):null})(),y=n?n.length:a$1?l.Children.count(a$1):0;return jsx("nav",{ref:N,"aria-label":"Breadcrumb",className:a(I[g],i),...h,children:jsxs("ol",{className:"inline-flex items-center",children:[c&&jsxs("li",{className:"flex items-center",children:[jsxs(x,{href:"/",children:[jsx(l$1,{name:"home",className:"w-4 h-4 mr-1"}),f]}),y>0&&jsx("span",{className:"mx-3 text-muted-foreground flex items-center justify-center","aria-hidden":"true",children:p})]}),n?o==null?void 0:o.map((r,e)=>jsxs("li",{className:"flex items-center",children:[r,e<((o==null?void 0:o.length)||0)-1&&jsx("span",{className:"mx-3 text-muted-foreground flex items-center justify-center","aria-hidden":"true",children:p})]},e)):o]})})});w.displayName="Breadcrumb";var x=l.forwardRef(({className:i,href:a$1,isCurrent:n=false,children:s,...c},f)=>n?jsx("span",{ref:f,"aria-current":"page",className:a("text-muted-foreground font-medium",i),...c,children:s}):a$1?jsx("a",{href:a$1,className:a("text-muted-foreground hover:text-foreground transition-colors",i),...c,children:s}):jsx("span",{ref:f,className:a("text-muted-foreground",i),...c,children:s}));x.displayName="BreadcrumbItem";export{w as a,x as b};//# sourceMappingURL=chunk-HEBXAFRY.mjs.map
3
+ //# sourceMappingURL=chunk-HEBXAFRY.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Breadcrumb.tsx"],"names":["Breadcrumb","React","className","children","items","maxItems","showHomeIcon","homeLabel","separator","jsx","Icon","variant","props","ref","variantStyles","renderedItems","displayItems","firstItem","lastItems","item","index","isCurrent","jsxs","BreadcrumbItem","child","itemsCount","merge","href"],"mappings":"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","file":"chunk-LOYAJIWO.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * Breadcrumb 항목 타입 / Breadcrumb item type\n */\nexport interface BreadcrumbItemData {\n label: string\n href?: string\n icon?: IconName\n}\n\n/**\n * Breadcrumb 컴포넌트의 props / Breadcrumb component props\n * @typedef {Object} BreadcrumbProps\n * @property {React.ReactNode} [children] - BreadcrumbItem 컴포넌트들 / BreadcrumbItem components\n * @property {BreadcrumbItemData[]} [items] - Breadcrumb 항목 배열 (children 대신 사용 가능) / Breadcrumb items array (alternative to children)\n * @property {number} [maxItems] - 최대 표시할 항목 수 (긴 경로 처리) / Maximum number of items to display (for long paths)\n * @property {boolean} [showHomeIcon] - 홈 아이콘 표시 여부 / Show home icon\n * @property {string} [homeLabel] - 홈 라벨 (기본: \"Home\") / Home label (default: \"Home\")\n * @property {React.ReactNode} [separator] - 항목 사이 구분자 (기본: chevronRight 아이콘) / Separator between items (default: chevronRight icon)\n * @property {'default' | 'subtle' | 'transparent' | 'glass'} [variant='default'] - Breadcrumb 스타일 변형 / Breadcrumb style variant\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode\n items?: BreadcrumbItemData[]\n maxItems?: number\n showHomeIcon?: boolean\n homeLabel?: string\n separator?: React.ReactNode\n variant?: 'default' | 'subtle' | 'transparent' | 'glass'\n}\n\n/**\n * BreadcrumbItem 컴포넌트의 props / BreadcrumbItem component props\n * @typedef {Object} BreadcrumbItemProps\n * @property {string} [href] - 링크 URL (없으면 일반 텍스트) / Link URL (plain text if not provided)\n * @property {boolean} [isCurrent=false] - 현재 페이지 여부 / Current page indicator\n * @property {React.ReactNode} children - 항목 텍스트 / Item text\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface BreadcrumbItemProps {\n href?: string\n isCurrent?: boolean\n children: React.ReactNode\n className?: string\n}\n\n/**\n * Breadcrumb 컴포넌트 / Breadcrumb component\n * \n * 네비게이션 경로를 표시하는 breadcrumb 컴포넌트입니다.\n * 현재 위치와 경로를 시각적으로 표현합니다.\n * \n * Breadcrumb component for displaying navigation paths.\n * Visually represents current location and path.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Breadcrumb>\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\n * <BreadcrumbItem href=\"/products\">상품</BreadcrumbItem>\n * <BreadcrumbItem isCurrent>상세</BreadcrumbItem>\n * </Breadcrumb>\n * \n * @example\n * // 커스텀 구분자 / Custom separator\n * <Breadcrumb separator={<span>/</span>}>\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\n * <BreadcrumbItem isCurrent>현재</BreadcrumbItem>\n * </Breadcrumb>\n * \n * @param {BreadcrumbProps} props - Breadcrumb 컴포넌트의 props / Breadcrumb component props\n * @param {React.Ref<HTMLDivElement>} ref - nav 요소 ref / nav element ref\n * @returns {JSX.Element} Breadcrumb 컴포넌트 / Breadcrumb component\n */\nconst Breadcrumb = React.forwardRef<HTMLDivElement, BreadcrumbProps>(\n ({ \n className, \n children, \n items,\n maxItems,\n showHomeIcon,\n homeLabel = \"Home\",\n separator = <Icon name=\"chevronRight\" className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />, \n variant = 'default', \n ...props \n }, ref) => {\n const variantStyles = {\n default: \"inline-flex items-center text-sm w-fit\",\n subtle: \"inline-flex items-center text-xs bg-background/40 backdrop-blur-md rounded-md px-3 py-2 border border-border/30 w-fit shadow-sm\",\n transparent: \"inline-flex items-center text-xs w-fit\",\n glass: \"inline-flex items-center text-xs bg-background/30 backdrop-blur-lg rounded-lg px-4 py-2 border border-border/25 w-fit shadow-lg\"\n }\n \n // items prop이 있으면 BreadcrumbItem으로 변환\n const renderItems = () => {\n if (items) {\n let displayItems = [...items]\n \n // maxItems 처리\n if (maxItems && displayItems.length > maxItems) {\n const firstItem = displayItems[0]\n const lastItems = displayItems.slice(-(maxItems - 1))\n displayItems = [firstItem, { label: '...', href: undefined }, ...lastItems]\n }\n \n // 마지막 항목은 isCurrent로 표시\n return displayItems.map((item, index) => {\n const isLast = index === displayItems.length - 1\n const isCurrent = isLast && !item.href\n \n return (\n <BreadcrumbItem\n key={index}\n href={item.href}\n isCurrent={isCurrent}\n >\n {item.icon && (\n <Icon name={item.icon} className=\"w-4 h-4 mr-1\" />\n )}\n {item.label}\n </BreadcrumbItem>\n )\n })\n }\n \n // children이 있으면 그대로 사용\n if (children) {\n return React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n return (\n <li key={index} className=\"flex items-center\">\n {child}\n {index < React.Children.count(children) - 1 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n )\n }\n return child\n })\n }\n \n return null\n }\n \n const renderedItems = renderItems()\n const itemsCount = items ? items.length : (children ? React.Children.count(children) : 0)\n \n return (\n <nav\n ref={ref}\n aria-label=\"Breadcrumb\"\n className={merge(variantStyles[variant], className)}\n {...props}\n >\n <ol className=\"inline-flex items-center\">\n {showHomeIcon && (\n <li className=\"flex items-center\">\n <BreadcrumbItem href=\"/\">\n <Icon name=\"home\" className=\"w-4 h-4 mr-1\" />\n {homeLabel}\n </BreadcrumbItem>\n {itemsCount > 0 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n )}\n {items ? (\n renderedItems?.map((item, index) => (\n <li key={index} className=\"flex items-center\">\n {item}\n {index < (renderedItems?.length || 0) - 1 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n ))\n ) : (\n renderedItems\n )}\n </ol>\n </nav>\n )\n }\n)\nBreadcrumb.displayName = \"Breadcrumb\"\n\n/**\n * BreadcrumbItem 컴포넌트\n * Breadcrumb의 개별 항목을 표시합니다.\n * \n * @component\n * @param {BreadcrumbItemProps} props - BreadcrumbItem 컴포넌트의 props\n * @param {React.Ref<HTMLLIElement>} ref - li 요소 ref\n * @returns {JSX.Element} BreadcrumbItem 컴포넌트\n */\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, BreadcrumbItemProps>(\n ({ className, href, isCurrent = false, children, ...props }, ref) => {\n if (isCurrent) {\n return (\n <span\n ref={ref}\n aria-current=\"page\"\n className={merge(\n \"text-muted-foreground font-medium\",\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n\n if (href) {\n return (\n <a\n href={href}\n className={merge(\n \"text-muted-foreground hover:text-foreground transition-colors\",\n className\n )}\n {...props}\n >\n {children}\n </a>\n )\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n \"text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\n\nexport { Breadcrumb, BreadcrumbItem } "]}
1
+ {"version":3,"sources":["../src/components/Breadcrumb.tsx"],"names":["Breadcrumb","React","className","children","items","maxItems","showHomeIcon","homeLabel","separator","jsx","Icon","variant","props","ref","variantStyles","renderedItems","displayItems","firstItem","lastItems","item","index","isCurrent","jsxs","BreadcrumbItem","child","itemsCount","merge","href"],"mappings":"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","file":"chunk-HEBXAFRY.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * Breadcrumb 항목 타입 / Breadcrumb item type\n */\nexport interface BreadcrumbItemData {\n label: string\n href?: string\n icon?: IconName\n}\n\n/**\n * Breadcrumb 컴포넌트의 props / Breadcrumb component props\n * @typedef {Object} BreadcrumbProps\n * @property {React.ReactNode} [children] - BreadcrumbItem 컴포넌트들 / BreadcrumbItem components\n * @property {BreadcrumbItemData[]} [items] - Breadcrumb 항목 배열 (children 대신 사용 가능) / Breadcrumb items array (alternative to children)\n * @property {number} [maxItems] - 최대 표시할 항목 수 (긴 경로 처리) / Maximum number of items to display (for long paths)\n * @property {boolean} [showHomeIcon] - 홈 아이콘 표시 여부 / Show home icon\n * @property {string} [homeLabel] - 홈 라벨 (기본: \"Home\") / Home label (default: \"Home\")\n * @property {React.ReactNode} [separator] - 항목 사이 구분자 (기본: chevronRight 아이콘) / Separator between items (default: chevronRight icon)\n * @property {'default' | 'subtle' | 'transparent' | 'glass'} [variant='default'] - Breadcrumb 스타일 변형 / Breadcrumb style variant\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode\n items?: BreadcrumbItemData[]\n maxItems?: number\n showHomeIcon?: boolean\n homeLabel?: string\n separator?: React.ReactNode\n variant?: 'default' | 'subtle' | 'transparent' | 'glass'\n}\n\n/**\n * BreadcrumbItem 컴포넌트의 props / BreadcrumbItem component props\n * @typedef {Object} BreadcrumbItemProps\n * @property {string} [href] - 링크 URL (없으면 일반 텍스트) / Link URL (plain text if not provided)\n * @property {boolean} [isCurrent=false] - 현재 페이지 여부 / Current page indicator\n * @property {React.ReactNode} children - 항목 텍스트 / Item text\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface BreadcrumbItemProps {\n href?: string\n isCurrent?: boolean\n children: React.ReactNode\n className?: string\n}\n\n/**\n * Breadcrumb 컴포넌트 / Breadcrumb component\n * \n * 네비게이션 경로를 표시하는 breadcrumb 컴포넌트입니다.\n * 현재 위치와 경로를 시각적으로 표현합니다.\n * \n * Breadcrumb component for displaying navigation paths.\n * Visually represents current location and path.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Breadcrumb>\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\n * <BreadcrumbItem href=\"/products\">상품</BreadcrumbItem>\n * <BreadcrumbItem isCurrent>상세</BreadcrumbItem>\n * </Breadcrumb>\n * \n * @example\n * // 커스텀 구분자 / Custom separator\n * <Breadcrumb separator={<span>/</span>}>\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\n * <BreadcrumbItem isCurrent>현재</BreadcrumbItem>\n * </Breadcrumb>\n * \n * @param {BreadcrumbProps} props - Breadcrumb 컴포넌트의 props / Breadcrumb component props\n * @param {React.Ref<HTMLDivElement>} ref - nav 요소 ref / nav element ref\n * @returns {JSX.Element} Breadcrumb 컴포넌트 / Breadcrumb component\n */\nconst Breadcrumb = React.forwardRef<HTMLDivElement, BreadcrumbProps>(\n ({ \n className, \n children, \n items,\n maxItems,\n showHomeIcon,\n homeLabel = \"Home\",\n separator = <Icon name=\"chevronRight\" className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />, \n variant = 'default', \n ...props \n }, ref) => {\n const variantStyles = {\n default: \"inline-flex items-center text-sm w-fit\",\n subtle: \"inline-flex items-center text-xs bg-background/40 backdrop-blur-md rounded-md px-3 py-2 border border-border/30 w-fit shadow-sm\",\n transparent: \"inline-flex items-center text-xs w-fit\",\n glass: \"inline-flex items-center text-xs bg-background/30 backdrop-blur-lg rounded-lg px-4 py-2 border border-border/25 w-fit shadow-lg\"\n }\n \n // items prop이 있으면 BreadcrumbItem으로 변환\n const renderItems = () => {\n if (items) {\n let displayItems = [...items]\n \n // maxItems 처리\n if (maxItems && displayItems.length > maxItems) {\n const firstItem = displayItems[0]\n const lastItems = displayItems.slice(-(maxItems - 1))\n displayItems = [firstItem, { label: '...', href: undefined }, ...lastItems]\n }\n \n // 마지막 항목은 isCurrent로 표시\n return displayItems.map((item, index) => {\n const isLast = index === displayItems.length - 1\n const isCurrent = isLast && !item.href\n \n return (\n <BreadcrumbItem\n key={index}\n href={item.href}\n isCurrent={isCurrent}\n >\n {item.icon && (\n <Icon name={item.icon} className=\"w-4 h-4 mr-1\" />\n )}\n {item.label}\n </BreadcrumbItem>\n )\n })\n }\n \n // children이 있으면 그대로 사용\n if (children) {\n return React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n return (\n <li key={index} className=\"flex items-center\">\n {child}\n {index < React.Children.count(children) - 1 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n )\n }\n return child\n })\n }\n \n return null\n }\n \n const renderedItems = renderItems()\n const itemsCount = items ? items.length : (children ? React.Children.count(children) : 0)\n \n return (\n <nav\n ref={ref}\n aria-label=\"Breadcrumb\"\n className={merge(variantStyles[variant], className)}\n {...props}\n >\n <ol className=\"inline-flex items-center\">\n {showHomeIcon && (\n <li className=\"flex items-center\">\n <BreadcrumbItem href=\"/\">\n <Icon name=\"home\" className=\"w-4 h-4 mr-1\" />\n {homeLabel}\n </BreadcrumbItem>\n {itemsCount > 0 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n )}\n {items ? (\n renderedItems?.map((item, index) => (\n <li key={index} className=\"flex items-center\">\n {item}\n {index < (renderedItems?.length || 0) - 1 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n ))\n ) : (\n renderedItems\n )}\n </ol>\n </nav>\n )\n }\n)\nBreadcrumb.displayName = \"Breadcrumb\"\n\n/**\n * BreadcrumbItem 컴포넌트\n * Breadcrumb의 개별 항목을 표시합니다.\n * \n * @component\n * @param {BreadcrumbItemProps} props - BreadcrumbItem 컴포넌트의 props\n * @param {React.Ref<HTMLLIElement>} ref - li 요소 ref\n * @returns {JSX.Element} BreadcrumbItem 컴포넌트\n */\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, BreadcrumbItemProps>(\n ({ className, href, isCurrent = false, children, ...props }, ref) => {\n if (isCurrent) {\n return (\n <span\n ref={ref}\n aria-current=\"page\"\n className={merge(\n \"text-muted-foreground font-medium\",\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n\n if (href) {\n return (\n <a\n href={href}\n className={merge(\n \"text-muted-foreground hover:text-foreground transition-colors\",\n className\n )}\n {...props}\n >\n {children}\n </a>\n )\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n \"text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\n\nexport { Breadcrumb, BreadcrumbItem } "]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import {a}from'./chunk-QEMPERUK.mjs';import t from'react';import {cva}from'class-variance-authority';import {jsxs,jsx}from'react/jsx-runtime';var k=cva("h-full rounded-full transition-all duration-300 ease-out",{variants:{variant:{default:"bg-foreground",success:"bg-[var(--progress-success)]",warning:"bg-[var(--progress-warning)]",error:"bg-[var(--progress-error)]",info:"bg-[var(--progress-info)]",glass:"bg-white/50 backdrop-blur-sm"}},defaultVariants:{variant:"default"}}),h=cva("relative w-full overflow-hidden rounded-full",{variants:{variant:{default:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",success:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",warning:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",error:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",info:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",glass:"bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/10 dark:border-slate-700/50"},size:{sm:"h-2",md:"h-3",lg:"h-4"}},defaultVariants:{variant:"default",size:"md"}}),o=t.forwardRef(({className:r,value:e=0,max:s=100,size:n="md",variant:b="default",showValue:l=false,animated:m=true,striped:P=false,label:d,description:p,autoVariant:w=false,...x},N)=>{let c=Math.min(Math.max(e/s*100,0),100),f=(()=>{if(!w)return b;let v=e/s;return v>.5?"success":v>.25?"warning":"error"})();return jsxs("div",{className:a("w-full",r),...x,children:[(d||l)&&jsxs("div",{className:"flex items-center justify-between mb-2",children:[d&&jsx("span",{className:"text-sm font-medium text-foreground",children:d}),l&&jsxs("span",{className:"text-sm text-muted-foreground",children:[Math.round(c),"%"]})]}),jsx("div",{ref:N,className:h({variant:f,size:n}),children:jsx("div",{className:a(k({variant:f}),P&&"bg-gradient-to-r from-transparent via-white/20 to-transparent bg-[length:20px_100%] animate-pulse",m&&"animate-pulse"),style:{width:`${c}%`,transition:m?"width 0.3s ease-out":"none"}})}),p&&jsx("p",{className:"mt-2 text-xs text-muted-foreground",children:p})]})});o.displayName="Progress";var M=t.forwardRef(({className:r,...e},s)=>jsx(o,{ref:s,variant:"success",className:r,...e}));M.displayName="ProgressSuccess";var T=t.forwardRef(({className:r,...e},s)=>jsx(o,{ref:s,variant:"warning",className:r,...e}));T.displayName="ProgressWarning";var E=t.forwardRef(({className:r,...e},s)=>jsx(o,{ref:s,variant:"error",className:r,...e}));E.displayName="ProgressError";var H=t.forwardRef(({className:r,...e},s)=>jsx(o,{ref:s,variant:"info",className:r,...e}));H.displayName="ProgressInfo";var L=t.forwardRef(({title:r,className:e,...s},n)=>jsxs("div",{className:a("p-4 bg-card rounded-lg border border-border",e),children:[r&&jsx("h3",{className:"text-sm font-semibold text-foreground mb-3",children:r}),jsx(o,{ref:n,...s})]}));L.displayName="ProgressWrapper";var y=t.forwardRef(({className:r,children:e,...s},n)=>jsx("div",{ref:n,className:a("space-y-4",r),...s,children:e}));y.displayName="ProgressGroup";export{o as a,M as b,T as c,E as d,H as e,y as f};//# sourceMappingURL=chunk-IG47LMOD.mjs.map
3
+ //# sourceMappingURL=chunk-IG47LMOD.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Progress.tsx"],"names":["progressBarVariants","cva","progressTrackVariants","Progress","React","className","value","max","size","variant","showValue","animated","striped","label","description","autoVariant","props","ref","percentage","resolvedVariant","ratio","jsxs","merge","jsx","ProgressSuccess","ProgressWarning","ProgressError","ProgressInfo","ProgressWrapper","title","ProgressGroup","children"],"mappings":"kJAMaA,CAAAA,CAAsBC,GAAAA,CACjC,0DAAA,CACA,CACE,QAAA,CAAU,CACR,QAAS,CACP,OAAA,CAAS,eAAA,CACT,OAAA,CAAS,8BAAA,CACT,OAAA,CAAS,+BACT,KAAA,CAAO,4BAAA,CACP,KAAM,2BAAA,CACN,KAAA,CAAO,8BACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,OAAA,CAAS,SACX,CACF,CACF,CAAA,CAEaC,CAAAA,CAAwBD,GAAAA,CACnC,8CAAA,CACA,CACE,SAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,4DAAA,CACT,OAAA,CAAS,6DACT,OAAA,CAAS,4DAAA,CACT,MAAO,4DAAA,CACP,IAAA,CAAM,6DACN,KAAA,CAAO,mGACT,CAAA,CACA,IAAA,CAAM,CACJ,EAAA,CAAI,MACJ,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KACN,CACF,CAAA,CACA,gBAAiB,CACf,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,IACR,CACF,CACF,CAAA,CA4BME,CAAAA,CAAWC,CAAAA,CAAM,UAAA,CACrB,CAAC,CACC,UAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CAAQ,CAAA,CACR,GAAA,CAAAC,CAAAA,CAAM,IACN,IAAA,CAAAC,CAAAA,CAAO,IAAA,CACP,OAAA,CAAAC,CAAAA,CAAU,SAAA,CACV,UAAAC,CAAAA,CAAY,KAAA,CACZ,QAAA,CAAAC,CAAAA,CAAW,IAAA,CACX,OAAA,CAAAC,EAAU,KAAA,CACV,KAAA,CAAAC,EACA,WAAA,CAAAC,CAAAA,CACA,YAAAC,CAAAA,CAAc,KAAA,CACd,GAAGC,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMC,CAAAA,CAAa,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAKZ,EAAQC,CAAAA,CAAO,GAAA,CAAK,CAAC,CAAA,CAAG,GAAG,CAAA,CAE3DY,GAAmB,IAAM,CAC7B,GAAI,CAACJ,CAAAA,CAAa,OAAON,EACzB,IAAMW,CAAAA,CAAQd,CAAAA,CAAQC,CAAAA,CACtB,OAAIa,CAAAA,CAAQ,GAAY,SAAA,CACpBA,CAAAA,CAAQ,GAAA,CAAa,SAAA,CAClB,OACT,CAAA,IAEA,OACEC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,CAAAA,CAAM,QAAA,CAAUjB,CAAS,CAAA,CAAI,GAAGW,EAC5C,QAAA,CAAA,CAAA,CAAAH,CAAAA,EAASH,IACTW,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wCAAA,CACZ,QAAA,CAAA,CAAAR,CAAAA,EACCU,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qCAAA,CACb,QAAA,CAAAV,CAAAA,CACH,CAAA,CAEDH,GACCW,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAA,CAAA,IAAA,CAAK,KAAA,CAAMH,CAAU,CAAA,CAAE,GAAA,CAAA,CAC1B,CAAA,CAAA,CAEJ,CAAA,CAGFK,GAAAA,CAAC,KAAA,CAAA,CACC,IAAKN,CAAAA,CACL,SAAA,CAAWf,CAAAA,CAAsB,CAAE,OAAA,CAASiB,CAAAA,CAAiB,KAAAX,CAAK,CAAC,CAAA,CAEnE,QAAA,CAAAe,GAAAA,CAAC,KAAA,CAAA,CACC,UAAWD,CAAAA,CACTtB,CAAAA,CAAoB,CAAE,OAAA,CAASmB,CAAgB,CAAC,EAChDP,CAAAA,EAAW,mGAAA,CACXD,GAAY,eACd,CAAA,CACA,MAAO,CACL,KAAA,CAAO,CAAA,EAAGO,CAAU,CAAA,CAAA,CAAA,CACpB,UAAA,CAAYP,EAAW,qBAAA,CAAwB,MACjD,CAAA,CACF,CAAA,CACF,CAAA,CAECG,CAAAA,EACCS,IAAC,GAAA,CAAA,CAAE,SAAA,CAAU,oCAAA,CACV,QAAA,CAAAT,CAAAA,CACH,CAAA,CAAA,CAEJ,CAEJ,CACF,EACAX,CAAAA,CAAS,WAAA,CAAc,UAAA,CAGhB,IAAMqB,EAAkBpB,CAAAA,CAAM,UAAA,CACnC,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,GAAGW,CAAM,CAAA,CAAGC,CAAAA,GACxBM,GAAAA,CAACpB,CAAAA,CAAA,CAAS,IAAKc,CAAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAWZ,CAAAA,CAAY,GAAGW,EAAO,CAE3E,EACAQ,EAAgB,WAAA,CAAc,iBAAA,KAEjBC,CAAAA,CAAkBrB,CAAAA,CAAM,UAAA,CACnC,CAAC,CAAE,SAAA,CAAAC,EAAW,GAAGW,CAAM,CAAA,CAAGC,CAAAA,GACxBM,GAAAA,CAACpB,CAAAA,CAAA,CAAS,GAAA,CAAKc,CAAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAWZ,CAAAA,CAAY,GAAGW,CAAAA,CAAO,CAE3E,EACAS,CAAAA,CAAgB,WAAA,CAAc,iBAAA,KAEjBC,CAAAA,CAAgBtB,CAAAA,CAAM,UAAA,CACjC,CAAC,CAAE,SAAA,CAAAC,EAAW,GAAGW,CAAM,CAAA,CAAGC,CAAAA,GACxBM,GAAAA,CAACpB,CAAAA,CAAA,CAAS,GAAA,CAAKc,CAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAWZ,CAAAA,CAAY,GAAGW,CAAAA,CAAO,CAEzE,EACAU,CAAAA,CAAc,WAAA,CAAc,gBAErB,IAAMC,CAAAA,CAAevB,CAAAA,CAAM,UAAA,CAChC,CAAC,CAAE,UAAAC,CAAAA,CAAW,GAAGW,CAAM,CAAA,CAAGC,CAAAA,GACxBM,GAAAA,CAACpB,EAAA,CAAS,GAAA,CAAKc,CAAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAWZ,EAAY,GAAGW,CAAAA,CAAO,CAExE,EACAW,CAAAA,CAAa,WAAA,CAAc,eAGpB,IAAMC,CAAAA,CAAkBxB,CAAAA,CAAM,UAAA,CACnC,CAAC,CAAE,MAAAyB,CAAAA,CAAO,SAAA,CAAAxB,CAAAA,CAAW,GAAGW,CAAM,CAAA,CAAGC,IAC/BI,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,CAAAA,CAAM,6CAAA,CAA+CjB,CAAS,EAC3E,QAAA,CAAA,CAAAwB,CAAAA,EACCN,IAAC,IAAA,CAAA,CAAG,SAAA,CAAU,6CACX,QAAA,CAAAM,CAAAA,CACH,CAAA,CAEFN,GAAAA,CAACpB,CAAAA,CAAA,CAAS,IAAKc,CAAAA,CAAM,GAAGD,CAAAA,CAAO,CAAA,CAAA,CACjC,CAEJ,CAAA,CACAY,EAAgB,WAAA,CAAc,iBAAA,CAEvB,IAAME,CAAAA,CAAgB1B,CAAAA,CAAM,UAAA,CACjC,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,QAAA,CAAA0B,CAAAA,CAAU,GAAGf,CAAM,CAAA,CAAGC,CAAAA,GAClCM,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKN,CAAAA,CACL,UAAWK,CAAAA,CAAM,WAAA,CAAajB,CAAS,CAAA,CACtC,GAAGW,CAAAA,CAEH,SAAAe,CAAAA,CACH,CAEJ,EACAD,CAAAA,CAAc,WAAA,CAAc,eAAA","file":"chunk-IG47LMOD.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const progressBarVariants = cva(\n \"h-full rounded-full transition-all duration-300 ease-out\",\n {\n variants: {\n variant: {\n default: \"bg-foreground\",\n success: \"bg-[var(--progress-success)]\",\n warning: \"bg-[var(--progress-warning)]\",\n error: \"bg-[var(--progress-error)]\",\n info: \"bg-[var(--progress-info)]\",\n glass: \"bg-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport const progressTrackVariants = cva(\n \"relative w-full overflow-hidden rounded-full\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n success: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n warning: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n error: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n info: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n glass: \"bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/10 dark:border-slate-700/50\",\n },\n size: {\n sm: \"h-2\",\n md: \"h-3\",\n lg: \"h-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n }\n)\n\n/**\n * Progress 컴포넌트의 props\n */\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: number\n max?: number\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\" | \"glass\"\n showValue?: boolean\n animated?: boolean\n striped?: boolean\n label?: string\n description?: string\n autoVariant?: boolean\n}\n\n/**\n * Progress 컴포넌트 / Progress component\n *\n * 진행률을 표시하는 프로그레스 바 컴포넌트입니다.\n *\n * @example\n * <Progress value={50} />\n * <Progress value={75} variant=\"success\" label=\"업로드\" showValue />\n * <Progress value={90} variant=\"warning\" striped animated />\n */\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n ({\n className,\n value = 0,\n max = 100,\n size = \"md\",\n variant = \"default\",\n showValue = false,\n animated = true,\n striped = false,\n label,\n description,\n autoVariant = false,\n ...props\n }, ref) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n const resolvedVariant = (() => {\n if (!autoVariant) return variant;\n const ratio = value / max;\n if (ratio > 0.5) return 'success';\n if (ratio > 0.25) return 'warning';\n return 'error';\n })();\n\n return (\n <div className={merge(\"w-full\", className)} {...props}>\n {(label || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n {label && (\n <span className=\"text-sm font-medium text-foreground\">\n {label}\n </span>\n )}\n {showValue && (\n <span className=\"text-sm text-muted-foreground\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n\n <div\n ref={ref}\n className={progressTrackVariants({ variant: resolvedVariant, size })}\n >\n <div\n className={merge(\n progressBarVariants({ variant: resolvedVariant }),\n striped && \"bg-gradient-to-r from-transparent via-white/20 to-transparent bg-[length:20px_100%] animate-pulse\",\n animated && \"animate-pulse\"\n )}\n style={{\n width: `${percentage}%`,\n transition: animated ? \"width 0.3s ease-out\" : \"none\"\n }}\n />\n </div>\n\n {description && (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )\n }\n)\nProgress.displayName = \"Progress\"\n\n// 편의 컴포넌트들\nexport const ProgressSuccess = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nProgressSuccess.displayName = \"ProgressSuccess\"\n\nexport const ProgressWarning = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nProgressWarning.displayName = \"ProgressWarning\"\n\nexport const ProgressError = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nProgressError.displayName = \"ProgressError\"\n\nexport const ProgressInfo = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nProgressInfo.displayName = \"ProgressInfo\"\n\n// 복합 Progress 컴포넌트들\nexport const ProgressWrapper = React.forwardRef<HTMLDivElement, ProgressProps & { title?: string }>(\n ({ title, className, ...props }, ref) => (\n <div className={merge(\"p-4 bg-card rounded-lg border border-border\", className)}>\n {title && (\n <h3 className=\"text-sm font-semibold text-foreground mb-3\">\n {title}\n </h3>\n )}\n <Progress ref={ref} {...props} />\n </div>\n )\n)\nProgressWrapper.displayName = \"ProgressWrapper\"\n\nexport const ProgressGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nProgressGroup.displayName = \"ProgressGroup\"\n\nexport { Progress }\n"]}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import {a}from'./chunk-UUHAXGMO.mjs';import r from'react';import {cva}from'class-variance-authority';import {jsx}from'react/jsx-runtime';var d=cva("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2",{variants:{variant:{default:"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80",secondary:"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80",destructive:"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80",error:"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80",outline:"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]",glass:"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80"}},defaultVariants:{variant:"default"}}),b=r.memo(r.forwardRef(({className:t,variant:a$1="default",...o},i)=>jsx("div",{ref:i,className:a(d({variant:a$1}),t),...o})));b.displayName="Badge";export{b as a};//# sourceMappingURL=chunk-IFSEJVOR.mjs.map
3
- //# sourceMappingURL=chunk-IFSEJVOR.mjs.map
2
+ import {a}from'./chunk-QEMPERUK.mjs';import r from'react';import {cva}from'class-variance-authority';import {jsx}from'react/jsx-runtime';var d=cva("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2",{variants:{variant:{default:"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80",secondary:"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80",destructive:"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80",error:"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80",outline:"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]",glass:"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80"}},defaultVariants:{variant:"default"}}),b=r.memo(r.forwardRef(({className:t,variant:a$1="default",...o},i)=>jsx("div",{ref:i,className:a(d({variant:a$1}),t),...o})));b.displayName="Badge";export{b as a};//# sourceMappingURL=chunk-J47ZEXEL.mjs.map
3
+ //# sourceMappingURL=chunk-J47ZEXEL.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Badge.tsx"],"names":["badgeVariants","cva","Badge","React","className","variant","props","ref","jsx","merge"],"mappings":"6IAMaA,CAAAA,CAAgBC,GAAAA,CAC3B,iOAAA,CACA,CACE,SAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,iFACT,SAAA,CAAW,oFAAA,CACX,WAAA,CAAa,iEAAA,CACb,MAAO,iEAAA,CACP,OAAA,CAAS,sIAAA,CACT,KAAA,CAAO,uIACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,QAAS,SACX,CACF,CACF,CAAA,CAmBMC,EAAQC,CAAAA,CAAM,IAAA,CAAKA,CAAAA,CAAM,UAAA,CAC7B,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,OAAA,CAAAC,IAAU,SAAA,CAAW,GAAGC,CAAM,CAAA,CAAGC,IAE3CC,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKD,CAAAA,CACL,UAAWE,CAAAA,CAAMT,CAAAA,CAAc,CAAE,OAAA,CAAAK,GAAQ,CAAC,CAAA,CAAGD,CAAS,CAAA,CACrD,GAAGE,CAAAA,CACN,CAGN,CAAC,EACDJ,EAAM,WAAA,CAAc,OAAA","file":"chunk-IFSEJVOR.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80\",\n secondary: \"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80\",\n destructive: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n error: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n outline: \"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]\",\n glass: \"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n *\n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge }\n"]}
1
+ {"version":3,"sources":["../src/components/Badge.tsx"],"names":["badgeVariants","cva","Badge","React","className","variant","props","ref","jsx","merge"],"mappings":"6IAMaA,CAAAA,CAAgBC,GAAAA,CAC3B,iOAAA,CACA,CACE,SAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,iFACT,SAAA,CAAW,oFAAA,CACX,WAAA,CAAa,iEAAA,CACb,MAAO,iEAAA,CACP,OAAA,CAAS,sIAAA,CACT,KAAA,CAAO,uIACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,QAAS,SACX,CACF,CACF,CAAA,CAmBMC,EAAQC,CAAAA,CAAM,IAAA,CAAKA,CAAAA,CAAM,UAAA,CAC7B,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,OAAA,CAAAC,IAAU,SAAA,CAAW,GAAGC,CAAM,CAAA,CAAGC,IAE3CC,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKD,CAAAA,CACL,UAAWE,CAAAA,CAAMT,CAAAA,CAAc,CAAE,OAAA,CAAAK,GAAQ,CAAC,CAAA,CAAGD,CAAS,CAAA,CACrD,GAAGE,CAAAA,CACN,CAGN,CAAC,EACDJ,EAAM,WAAA,CAAc,OAAA","file":"chunk-J47ZEXEL.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80\",\n secondary: \"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80\",\n destructive: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n error: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n outline: \"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]\",\n glass: \"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n *\n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge }\n"]}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import {a}from'./chunk-UUHAXGMO.mjs';import i,{useState}from'react';import {cva}from'class-variance-authority';import {jsx}from'react/jsx-runtime';var w=cva("relative flex shrink-0 overflow-hidden rounded-full",{variants:{size:{sm:"w-8 h-8 text-xs",md:"w-10 h-10 text-sm",lg:"w-12 h-12 text-base"},variant:{default:"",glass:"ring-1 ring-white/30 backdrop-blur-sm"}},defaultVariants:{size:"md",variant:"default"}}),h=i.forwardRef(({className:e,size:a$1="md",variant:t="default",src:n,alt:l,fallbackText:o,children:m,...v},d)=>{let[u,g]=useState(false),p=()=>o||m||(l?l.charAt(0).toUpperCase():"U"),A=n&&!u;return jsx("div",{ref:d,className:a(w({size:a$1,variant:t}),e),...v,children:A?jsx(f,{src:n,alt:l||"avatar",onError:()=>g(true)}):jsx(c,{children:p()})})});h.displayName="Avatar";var f=i.forwardRef(({className:e,...a$1},t)=>jsx("img",{ref:t,className:a("aspect-square h-full w-full object-cover object-center",e),...a$1}));f.displayName="AvatarImage";var c=i.forwardRef(({className:e,...a$1},t)=>jsx("div",{ref:t,className:a("flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-semibold",e),...a$1}));c.displayName="AvatarFallback";export{h as a,f as b,c};//# sourceMappingURL=chunk-IN7RWQCJ.mjs.map
3
- //# sourceMappingURL=chunk-IN7RWQCJ.mjs.map
2
+ import {a}from'./chunk-QEMPERUK.mjs';import i,{useState}from'react';import {cva}from'class-variance-authority';import {jsx}from'react/jsx-runtime';var w=cva("relative flex shrink-0 overflow-hidden rounded-full",{variants:{size:{sm:"w-8 h-8 text-xs",md:"w-10 h-10 text-sm",lg:"w-12 h-12 text-base"},variant:{default:"",glass:"ring-1 ring-white/30 backdrop-blur-sm"}},defaultVariants:{size:"md",variant:"default"}}),h=i.forwardRef(({className:e,size:a$1="md",variant:t="default",src:n,alt:l,fallbackText:o,children:m,...v},d)=>{let[u,g]=useState(false),p=()=>o||m||(l?l.charAt(0).toUpperCase():"U"),A=n&&!u;return jsx("div",{ref:d,className:a(w({size:a$1,variant:t}),e),...v,children:A?jsx(f,{src:n,alt:l||"avatar",onError:()=>g(true)}):jsx(c,{children:p()})})});h.displayName="Avatar";var f=i.forwardRef(({className:e,...a$1},t)=>jsx("img",{ref:t,className:a("aspect-square h-full w-full object-cover object-center",e),...a$1}));f.displayName="AvatarImage";var c=i.forwardRef(({className:e,...a$1},t)=>jsx("div",{ref:t,className:a("flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-semibold",e),...a$1}));c.displayName="AvatarFallback";export{h as a,f as b,c};//# sourceMappingURL=chunk-K2FOFIST.mjs.map
3
+ //# sourceMappingURL=chunk-K2FOFIST.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Avatar.tsx"],"names":["avatarVariants","cva","Avatar","React","className","size","variant","src","alt","fallbackText","children","props","ref","imgError","setImgError","useState","getFallbackContent","showImage","jsx","merge","AvatarImage","AvatarFallback"],"mappings":"mJAMO,IAAMA,CAAAA,CAAiBC,IAC5B,qDAAA,CACA,CACE,SAAU,CACR,IAAA,CAAM,CACJ,EAAA,CAAI,iBAAA,CACJ,EAAA,CAAI,oBACJ,EAAA,CAAI,qBACN,EACA,OAAA,CAAS,CACP,QAAS,EAAA,CACT,KAAA,CAAO,uCACT,CACF,CAAA,CACA,gBAAiB,CACf,IAAA,CAAM,KACN,OAAA,CAAS,SACX,CACF,CACF,CAAA,CA0BMC,CAAAA,CAASC,CAAAA,CAAM,UAAA,CACnB,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,KAAAC,GAAAA,CAAO,IAAA,CAAM,QAAAC,CAAAA,CAAU,SAAA,CAAW,IAAAC,CAAAA,CAAK,GAAA,CAAAC,EAAK,YAAA,CAAAC,CAAAA,CAAc,SAAAC,CAAAA,CAAU,GAAGC,CAAM,CAAA,CAAGC,CAAAA,GAAQ,CACpG,GAAM,CAACC,CAAAA,CAAUC,CAAW,CAAA,CAAIC,QAAAA,CAAS,KAAK,CAAA,CAExCC,CAAAA,CAAqB,IACrBP,CAAAA,EACAC,CAAAA,GACAF,EAAYA,CAAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,GACvB,GAAA,CAAA,CAGHS,CAAAA,CAAYV,GAAO,CAACM,CAAAA,CAE1B,OACEK,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKN,EACL,SAAA,CAAWO,CAAAA,CAAMnB,EAAe,CAAE,IAAA,CAAAK,IAAM,OAAA,CAAAC,CAAQ,CAAC,CAAA,CAAGF,CAAS,EAC5D,GAAGO,CAAAA,CAEH,SAAAM,CAAAA,CACCC,GAAAA,CAACE,EAAA,CACC,GAAA,CAAKb,CAAAA,CACL,GAAA,CAAKC,CAAAA,EAAO,QAAA,CACZ,QAAS,IAAMM,CAAAA,CAAY,IAAI,CAAA,CACjC,CAAA,CAEAI,IAACG,CAAAA,CAAA,CACE,SAAAL,CAAAA,EAAmB,CACtB,EAEJ,CAEJ,CACF,EACAd,CAAAA,CAAO,WAAA,CAAc,SAErB,IAAMkB,CAAAA,CAAcjB,CAAAA,CAAM,UAAA,CACxB,CAAC,CAAE,UAAAC,CAAAA,CAAW,GAAGO,GAAM,CAAA,CAAGC,CAAAA,GACxBM,IAAC,KAAA,CAAA,CACC,GAAA,CAAKN,EACL,SAAA,CAAWO,CAAAA,CAAM,yDAA0Df,CAAS,CAAA,CACnF,GAAGO,GAAAA,CACN,CAEJ,EACAS,CAAAA,CAAY,WAAA,CAAc,aAAA,CAE1B,IAAMC,CAAAA,CAAiBlB,CAAAA,CAAM,WAC3B,CAAC,CAAE,UAAAC,CAAAA,CAAW,GAAGO,GAAM,CAAA,CAAGC,CAAAA,GACxBM,IAAC,KAAA,CAAA,CACC,GAAA,CAAKN,EACL,SAAA,CAAWO,CAAAA,CACT,+GACAf,CACF,CAAA,CACC,GAAGO,GAAAA,CACN,CAEJ,EACAU,CAAAA,CAAe,WAAA,CAAc,gBAAA","file":"chunk-IN7RWQCJ.mjs","sourcesContent":["\"use client\"\n\nimport React, { useState } from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const avatarVariants = cva(\n \"relative flex shrink-0 overflow-hidden rounded-full\",\n {\n variants: {\n size: {\n sm: \"w-8 h-8 text-xs\",\n md: \"w-10 h-10 text-sm\",\n lg: \"w-12 h-12 text-base\",\n },\n variant: {\n default: \"\",\n glass: \"ring-1 ring-white/30 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\n/**\n * Avatar 컴포넌트의 props / Avatar component props\n */\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"glass\"\n src?: string\n alt?: string\n fallbackText?: string\n}\n\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {}\nexport interface AvatarFallbackProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Avatar 컴포넌트 / Avatar component\n *\n * 사용자 프로필 이미지를 표시하는 컴포넌트입니다.\n *\n * @example\n * <Avatar src=\"/user.jpg\" alt=\"사용자\" />\n * <Avatar alt=\"홍길동\">홍</Avatar>\n * <Avatar variant=\"glass\" size=\"lg\" src=\"/user.jpg\" alt=\"사용자\" />\n */\nconst Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ className, size = \"md\", variant = \"default\", src, alt, fallbackText, children, ...props }, ref) => {\n const [imgError, setImgError] = useState(false)\n\n const getFallbackContent = () => {\n if (fallbackText) return fallbackText\n if (children) return children\n if (alt) return alt.charAt(0).toUpperCase()\n return \"U\"\n }\n\n const showImage = src && !imgError\n\n return (\n <div\n ref={ref}\n className={merge(avatarVariants({ size, variant }), className)}\n {...props}\n >\n {showImage ? (\n <AvatarImage\n src={src}\n alt={alt || \"avatar\"}\n onError={() => setImgError(true)}\n />\n ) : (\n <AvatarFallback>\n {getFallbackContent()}\n </AvatarFallback>\n )}\n </div>\n )\n }\n)\nAvatar.displayName = \"Avatar\"\n\nconst AvatarImage = React.forwardRef<HTMLImageElement, AvatarImageProps>(\n ({ className, ...props }, ref) => (\n <img\n ref={ref}\n className={merge(\"aspect-square h-full w-full object-cover object-center\", className)}\n {...props}\n />\n )\n)\nAvatarImage.displayName = \"AvatarImage\"\n\nconst AvatarFallback = React.forwardRef<HTMLDivElement, AvatarFallbackProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\n \"flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-semibold\",\n className\n )}\n {...props}\n />\n )\n)\nAvatarFallback.displayName = \"AvatarFallback\"\n\nexport { Avatar, AvatarImage, AvatarFallback } "]}
1
+ {"version":3,"sources":["../src/components/Avatar.tsx"],"names":["avatarVariants","cva","Avatar","React","className","size","variant","src","alt","fallbackText","children","props","ref","imgError","setImgError","useState","getFallbackContent","showImage","jsx","merge","AvatarImage","AvatarFallback"],"mappings":"mJAMO,IAAMA,CAAAA,CAAiBC,IAC5B,qDAAA,CACA,CACE,SAAU,CACR,IAAA,CAAM,CACJ,EAAA,CAAI,iBAAA,CACJ,EAAA,CAAI,oBACJ,EAAA,CAAI,qBACN,EACA,OAAA,CAAS,CACP,QAAS,EAAA,CACT,KAAA,CAAO,uCACT,CACF,CAAA,CACA,gBAAiB,CACf,IAAA,CAAM,KACN,OAAA,CAAS,SACX,CACF,CACF,CAAA,CA0BMC,CAAAA,CAASC,CAAAA,CAAM,UAAA,CACnB,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,KAAAC,GAAAA,CAAO,IAAA,CAAM,QAAAC,CAAAA,CAAU,SAAA,CAAW,IAAAC,CAAAA,CAAK,GAAA,CAAAC,EAAK,YAAA,CAAAC,CAAAA,CAAc,SAAAC,CAAAA,CAAU,GAAGC,CAAM,CAAA,CAAGC,CAAAA,GAAQ,CACpG,GAAM,CAACC,CAAAA,CAAUC,CAAW,CAAA,CAAIC,QAAAA,CAAS,KAAK,CAAA,CAExCC,CAAAA,CAAqB,IACrBP,CAAAA,EACAC,CAAAA,GACAF,EAAYA,CAAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,GACvB,GAAA,CAAA,CAGHS,CAAAA,CAAYV,GAAO,CAACM,CAAAA,CAE1B,OACEK,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKN,EACL,SAAA,CAAWO,CAAAA,CAAMnB,EAAe,CAAE,IAAA,CAAAK,IAAM,OAAA,CAAAC,CAAQ,CAAC,CAAA,CAAGF,CAAS,EAC5D,GAAGO,CAAAA,CAEH,SAAAM,CAAAA,CACCC,GAAAA,CAACE,EAAA,CACC,GAAA,CAAKb,CAAAA,CACL,GAAA,CAAKC,CAAAA,EAAO,QAAA,CACZ,QAAS,IAAMM,CAAAA,CAAY,IAAI,CAAA,CACjC,CAAA,CAEAI,IAACG,CAAAA,CAAA,CACE,SAAAL,CAAAA,EAAmB,CACtB,EAEJ,CAEJ,CACF,EACAd,CAAAA,CAAO,WAAA,CAAc,SAErB,IAAMkB,CAAAA,CAAcjB,CAAAA,CAAM,UAAA,CACxB,CAAC,CAAE,UAAAC,CAAAA,CAAW,GAAGO,GAAM,CAAA,CAAGC,CAAAA,GACxBM,IAAC,KAAA,CAAA,CACC,GAAA,CAAKN,EACL,SAAA,CAAWO,CAAAA,CAAM,yDAA0Df,CAAS,CAAA,CACnF,GAAGO,GAAAA,CACN,CAEJ,EACAS,CAAAA,CAAY,WAAA,CAAc,aAAA,CAE1B,IAAMC,CAAAA,CAAiBlB,CAAAA,CAAM,WAC3B,CAAC,CAAE,UAAAC,CAAAA,CAAW,GAAGO,GAAM,CAAA,CAAGC,CAAAA,GACxBM,IAAC,KAAA,CAAA,CACC,GAAA,CAAKN,EACL,SAAA,CAAWO,CAAAA,CACT,+GACAf,CACF,CAAA,CACC,GAAGO,GAAAA,CACN,CAEJ,EACAU,CAAAA,CAAe,WAAA,CAAc,gBAAA","file":"chunk-K2FOFIST.mjs","sourcesContent":["\"use client\"\n\nimport React, { useState } from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const avatarVariants = cva(\n \"relative flex shrink-0 overflow-hidden rounded-full\",\n {\n variants: {\n size: {\n sm: \"w-8 h-8 text-xs\",\n md: \"w-10 h-10 text-sm\",\n lg: \"w-12 h-12 text-base\",\n },\n variant: {\n default: \"\",\n glass: \"ring-1 ring-white/30 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\n/**\n * Avatar 컴포넌트의 props / Avatar component props\n */\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"glass\"\n src?: string\n alt?: string\n fallbackText?: string\n}\n\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {}\nexport interface AvatarFallbackProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Avatar 컴포넌트 / Avatar component\n *\n * 사용자 프로필 이미지를 표시하는 컴포넌트입니다.\n *\n * @example\n * <Avatar src=\"/user.jpg\" alt=\"사용자\" />\n * <Avatar alt=\"홍길동\">홍</Avatar>\n * <Avatar variant=\"glass\" size=\"lg\" src=\"/user.jpg\" alt=\"사용자\" />\n */\nconst Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ className, size = \"md\", variant = \"default\", src, alt, fallbackText, children, ...props }, ref) => {\n const [imgError, setImgError] = useState(false)\n\n const getFallbackContent = () => {\n if (fallbackText) return fallbackText\n if (children) return children\n if (alt) return alt.charAt(0).toUpperCase()\n return \"U\"\n }\n\n const showImage = src && !imgError\n\n return (\n <div\n ref={ref}\n className={merge(avatarVariants({ size, variant }), className)}\n {...props}\n >\n {showImage ? (\n <AvatarImage\n src={src}\n alt={alt || \"avatar\"}\n onError={() => setImgError(true)}\n />\n ) : (\n <AvatarFallback>\n {getFallbackContent()}\n </AvatarFallback>\n )}\n </div>\n )\n }\n)\nAvatar.displayName = \"Avatar\"\n\nconst AvatarImage = React.forwardRef<HTMLImageElement, AvatarImageProps>(\n ({ className, ...props }, ref) => (\n <img\n ref={ref}\n className={merge(\"aspect-square h-full w-full object-cover object-center\", className)}\n {...props}\n />\n )\n)\nAvatarImage.displayName = \"AvatarImage\"\n\nconst AvatarFallback = React.forwardRef<HTMLDivElement, AvatarFallbackProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\n \"flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-semibold\",\n className\n )}\n {...props}\n />\n )\n)\nAvatarFallback.displayName = \"AvatarFallback\"\n\nexport { Avatar, AvatarImage, AvatarFallback } "]}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import {a as a$1}from'./chunk-SGEP3CQE.mjs';import {l}from'./chunk-HN5LSP6L.mjs';import {a}from'./chunk-UUHAXGMO.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$2=false,success:u=false,resize:r="vertical",...t},f)=>{let e=t["aria-invalid"],g=a$2||(e!==void 0?e:false);return jsx("textarea",{className:a(L({variant:c,size:i,resize:r}),a$2&&a$1.error,u&&a$1.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$1=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$1?"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:a("peer absolute inset-0 w-full h-full opacity-0 cursor-pointer z-10",l$1),ref:g,"aria-checked":d,"aria-invalid":a$1,"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:a("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:a("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-UWHCM3S6.mjs.map
3
- //# sourceMappingURL=chunk-UWHCM3S6.mjs.map
2
+ import {a as a$1}from'./chunk-F2M4YDDQ.mjs';import {l}from'./chunk-ZQUMJQYV.mjs';import {a}from'./chunk-QEMPERUK.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$2=false,success:u=false,resize:r="vertical",...t},f)=>{let e=t["aria-invalid"],g=a$2||(e!==void 0?e:false);return jsx("textarea",{className:a(L({variant:c,size:i,resize:r}),a$2&&a$1.error,u&&a$1.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$1=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$1?"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:a("peer absolute inset-0 w-full h-full opacity-0 cursor-pointer z-10",l$1),ref:g,"aria-checked":d,"aria-invalid":a$1,"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:a("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:a("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-LL6QPRD7.mjs.map
3
+ //# sourceMappingURL=chunk-LL6QPRD7.mjs.map