@hua-labs/ui 2.1.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/README.md +55 -67
  2. package/dist/{ComponentLayout-btJq4TjA.d.mts → ComponentLayout-DrZpz0yv.d.mts} +1 -1
  3. package/dist/Section-BWzyshgX.d.mts +67 -0
  4. package/dist/advanced/dashboard.d.ts.map +1 -1
  5. package/dist/advanced-dashboard.d.mts +1 -1
  6. package/dist/advanced-dashboard.js +4 -4
  7. package/dist/advanced-dashboard.js.map +1 -1
  8. package/dist/advanced-dashboard.mjs +3 -3
  9. package/dist/advanced-dashboard.mjs.map +1 -1
  10. package/dist/advanced-emotion.js +1 -1
  11. package/dist/advanced-emotion.js.map +1 -1
  12. package/dist/advanced-emotion.mjs +1 -1
  13. package/dist/advanced-motion.d.mts +65 -1
  14. package/dist/advanced-motion.js +14 -14
  15. package/dist/advanced-motion.js.map +1 -1
  16. package/dist/advanced-motion.mjs +1 -1
  17. package/dist/advanced.d.mts +4 -4
  18. package/dist/advanced.js +16 -16
  19. package/dist/advanced.js.map +1 -1
  20. package/dist/advanced.mjs +3 -3
  21. package/dist/advanced.mjs.map +1 -1
  22. package/dist/chunk-3CCF7U3P.mjs +3 -0
  23. package/dist/{chunk-IFSEJVOR.mjs.map → chunk-3CCF7U3P.mjs.map} +1 -1
  24. package/dist/chunk-3GAUTZXQ.mjs +3 -0
  25. package/dist/{chunk-X7ZIWYRC.mjs.map → chunk-3GAUTZXQ.mjs.map} +1 -1
  26. package/dist/chunk-42RGFEL2.mjs +3 -0
  27. package/dist/chunk-42RGFEL2.mjs.map +1 -0
  28. package/dist/chunk-4NJE7D6X.mjs +3 -0
  29. package/dist/chunk-4NJE7D6X.mjs.map +1 -0
  30. package/dist/chunk-6HVJFEDA.mjs +3 -0
  31. package/dist/chunk-6HVJFEDA.mjs.map +1 -0
  32. package/dist/chunk-7OYT3QSY.mjs +3 -0
  33. package/dist/chunk-7OYT3QSY.mjs.map +1 -0
  34. package/dist/chunk-ANYZ56VB.mjs +3 -0
  35. package/dist/{chunk-QQCELXFD.mjs.map → chunk-ANYZ56VB.mjs.map} +1 -1
  36. package/dist/chunk-AOSXB5JJ.mjs +4 -0
  37. package/dist/{chunk-GLZKT7JN.mjs.map → chunk-AOSXB5JJ.mjs.map} +1 -1
  38. package/dist/chunk-B544MRF7.mjs +3 -0
  39. package/dist/{chunk-SDFHJ4GB.mjs.map → chunk-B544MRF7.mjs.map} +1 -1
  40. package/dist/chunk-CVWWS25A.mjs +3 -0
  41. package/dist/chunk-CVWWS25A.mjs.map +1 -0
  42. package/dist/chunk-DYNBM24D.mjs +3 -0
  43. package/dist/{chunk-OSCMSA2Q.mjs.map → chunk-DYNBM24D.mjs.map} +1 -1
  44. package/dist/{chunk-NBJUE7NR.mjs → chunk-FX57OSYG.mjs} +2 -2
  45. package/dist/{chunk-NBJUE7NR.mjs.map → chunk-FX57OSYG.mjs.map} +1 -1
  46. package/dist/chunk-IJSYSNM5.mjs +3 -0
  47. package/dist/{chunk-IN7RWQCJ.mjs.map → chunk-IJSYSNM5.mjs.map} +1 -1
  48. package/dist/chunk-KJZGOL2Z.mjs +3 -0
  49. package/dist/{chunk-LOYAJIWO.mjs.map → chunk-KJZGOL2Z.mjs.map} +1 -1
  50. package/dist/chunk-KYRIUUQP.mjs +3 -0
  51. package/dist/{chunk-PAEKNQWW.mjs.map → chunk-KYRIUUQP.mjs.map} +1 -1
  52. package/dist/chunk-LSA7DU3N.mjs +73 -0
  53. package/dist/chunk-LSA7DU3N.mjs.map +1 -0
  54. package/dist/chunk-MDLCJASB.mjs +3 -0
  55. package/dist/{chunk-LH77I6HO.mjs.map → chunk-MDLCJASB.mjs.map} +1 -1
  56. package/dist/chunk-N56BUOCD.mjs +3 -0
  57. package/dist/{chunk-XV3Y7QVU.mjs.map → chunk-N56BUOCD.mjs.map} +1 -1
  58. package/dist/chunk-OFYITQXI.mjs +13 -0
  59. package/dist/chunk-OFYITQXI.mjs.map +1 -0
  60. package/dist/chunk-OZNST3EZ.mjs +3 -0
  61. package/dist/{chunk-SGEP3CQE.mjs.map → chunk-OZNST3EZ.mjs.map} +1 -1
  62. package/dist/chunk-RS6RKW5U.mjs +13 -0
  63. package/dist/{chunk-6KTHJ3EL.mjs.map → chunk-RS6RKW5U.mjs.map} +1 -1
  64. package/dist/{chunk-C4OACMTB.mjs → chunk-TXBZZJNR.mjs} +2 -2
  65. package/dist/{chunk-C4OACMTB.mjs.map → chunk-TXBZZJNR.mjs.map} +1 -1
  66. package/dist/chunk-TZ4YSHMC.mjs +3 -0
  67. package/dist/{chunk-UWHCM3S6.mjs.map → chunk-TZ4YSHMC.mjs.map} +1 -1
  68. package/dist/chunk-U6CTBZ2U.mjs +3 -0
  69. package/dist/chunk-U6CTBZ2U.mjs.map +1 -0
  70. package/dist/{chunk-PYBYZVSL.mjs → chunk-WP7VFE77.mjs} +2 -2
  71. package/dist/{chunk-PYBYZVSL.mjs.map → chunk-WP7VFE77.mjs.map} +1 -1
  72. package/dist/{chunk-FFH4ZFKS.mjs → chunk-XCZMLKPK.mjs} +2 -2
  73. package/dist/{chunk-FFH4ZFKS.mjs.map → chunk-XCZMLKPK.mjs.map} +1 -1
  74. package/dist/chunk-XGHT7WMO.mjs +3 -0
  75. package/dist/chunk-XGHT7WMO.mjs.map +1 -0
  76. package/dist/chunk-XL4KTJ4L.mjs +3 -0
  77. package/dist/{chunk-VWSBJUNI.mjs.map → chunk-XL4KTJ4L.mjs.map} +1 -1
  78. package/dist/chunk-Z74YUUVT.mjs +3 -0
  79. package/dist/chunk-Z74YUUVT.mjs.map +1 -0
  80. package/dist/chunk-ZXZIHU7J.mjs +8 -0
  81. package/dist/{chunk-N7M6RIN4.mjs.map → chunk-ZXZIHU7J.mjs.map} +1 -1
  82. package/dist/components/Card.d.ts.map +1 -1
  83. package/dist/components/DatePicker.d.ts.map +1 -1
  84. package/dist/components/Modal.d.ts.map +1 -1
  85. package/dist/components/Popover.d.ts +2 -0
  86. package/dist/components/Popover.d.ts.map +1 -1
  87. package/dist/components/Progress.d.ts +1 -0
  88. package/dist/components/Progress.d.ts.map +1 -1
  89. package/dist/components/Section.d.ts +44 -0
  90. package/dist/components/Section.d.ts.map +1 -0
  91. package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
  92. package/dist/components/advanced/DotNav.d.ts +26 -0
  93. package/dist/components/advanced/DotNav.d.ts.map +1 -0
  94. package/dist/components/advanced/HorizontalScroll.d.ts +20 -0
  95. package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -0
  96. package/dist/components/advanced/ImageReveal.d.ts +24 -0
  97. package/dist/components/advanced/ImageReveal.d.ts.map +1 -0
  98. package/dist/components/advanced/index.d.ts +6 -0
  99. package/dist/components/advanced/index.d.ts.map +1 -1
  100. package/dist/data.mjs +2 -2
  101. package/dist/data.mjs.map +1 -1
  102. package/dist/feedback.mjs +1 -1
  103. package/dist/form.js +3 -3
  104. package/dist/form.js.map +1 -1
  105. package/dist/form.mjs +4 -4
  106. package/dist/form.mjs.map +1 -1
  107. package/dist/{icons-Bj_nr8Ba.d.mts → icons-DmhQEH_E.d.mts} +6 -1
  108. package/dist/iconsax-extended.js +1 -1
  109. package/dist/iconsax-extended.js.map +1 -1
  110. package/dist/iconsax-extended.mjs +1 -1
  111. package/dist/iconsax-extended.mjs.map +1 -1
  112. package/dist/index.d.mts +9 -27
  113. package/dist/index.d.ts +4 -0
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +6 -6
  116. package/dist/index.js.map +1 -1
  117. package/dist/index.mjs +2 -2
  118. package/dist/index.mjs.map +1 -1
  119. package/dist/interactive.js +1 -1
  120. package/dist/interactive.js.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.js +100 -0
  173. package/dist/landing.js.map +1 -0
  174. package/dist/landing.mjs +31 -0
  175. package/dist/landing.mjs.map +1 -0
  176. package/dist/lib/icons.d.ts +6 -1
  177. package/dist/lib/icons.d.ts.map +1 -1
  178. package/dist/navigation.d.mts +1 -1
  179. package/dist/navigation.js +2 -2
  180. package/dist/navigation.js.map +1 -1
  181. package/dist/navigation.mjs +1 -1
  182. package/dist/navigation.mjs.map +1 -1
  183. package/dist/overlay.d.mts +2 -0
  184. package/dist/overlay.js +1 -1
  185. package/dist/overlay.js.map +1 -1
  186. package/dist/overlay.mjs +1 -1
  187. package/dist/overlay.mjs.map +1 -1
  188. package/dist/sdui.js +4 -4
  189. package/dist/sdui.js.map +1 -1
  190. package/dist/sdui.mjs +1 -1
  191. package/dist/sdui.mjs.map +1 -1
  192. package/package.json +16 -10
  193. package/src/styles/landing.css +107 -0
  194. package/src/styles/utilities.css +58 -0
  195. package/dist/chunk-6KTHJ3EL.mjs +0 -13
  196. package/dist/chunk-BXX2TZUB.mjs +0 -3
  197. package/dist/chunk-BXX2TZUB.mjs.map +0 -1
  198. package/dist/chunk-COR6CDMA.mjs +0 -83
  199. package/dist/chunk-COR6CDMA.mjs.map +0 -1
  200. package/dist/chunk-GLZKT7JN.mjs +0 -4
  201. package/dist/chunk-HN5LSP6L.mjs +0 -3
  202. package/dist/chunk-HN5LSP6L.mjs.map +0 -1
  203. package/dist/chunk-IFSEJVOR.mjs +0 -3
  204. package/dist/chunk-IN7RWQCJ.mjs +0 -3
  205. package/dist/chunk-LH77I6HO.mjs +0 -3
  206. package/dist/chunk-LOYAJIWO.mjs +0 -3
  207. package/dist/chunk-LPAG7DCA.mjs +0 -3
  208. package/dist/chunk-LPAG7DCA.mjs.map +0 -1
  209. package/dist/chunk-N7M6RIN4.mjs +0 -8
  210. package/dist/chunk-OSCMSA2Q.mjs +0 -3
  211. package/dist/chunk-PAEKNQWW.mjs +0 -3
  212. package/dist/chunk-QQCELXFD.mjs +0 -3
  213. package/dist/chunk-RPUS7G7Q.mjs +0 -3
  214. package/dist/chunk-RPUS7G7Q.mjs.map +0 -1
  215. package/dist/chunk-SDFHJ4GB.mjs +0 -3
  216. package/dist/chunk-SGEP3CQE.mjs +0 -3
  217. package/dist/chunk-UUHAXGMO.mjs +0 -3
  218. package/dist/chunk-UUHAXGMO.mjs.map +0 -1
  219. package/dist/chunk-UWHCM3S6.mjs +0 -3
  220. package/dist/chunk-VWSBJUNI.mjs +0 -3
  221. package/dist/chunk-X7ZIWYRC.mjs +0 -3
  222. package/dist/chunk-XV3Y7QVU.mjs +0 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Toast.tsx"],"names":["ToastContext","createContext","useToast","context","useContext","noopAddToast","noopRemoveToast","noopClearToasts","useToastSafe","ToastProvider","children","maxToasts","position","toasts","setToasts","useState","removeToast","useCallback","id","prev","toast","addToast","newToast","clearToasts","jsxs","jsx","ToastContainer","positionClasses","merge","ToastItem","onRemove","isVisible","setIsVisible","React","handleRemove","getToastStyles","type","getIconStyles","getToastIcon"],"mappings":"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","file":"chunk-OSCMSA2Q.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { createContext, useContext, useState, useCallback } from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Toast 메시지 타입 / Toast message type\n * @typedef {Object} Toast\n * @property {string} id - Toast 고유 ID / Toast unique ID\n * @property {\"success\" | \"error\" | \"warning\" | \"info\"} type - Toast 타입 / Toast type\n * @property {string} [title] - Toast 제목 / Toast title\n * @property {string} message - Toast 메시지 / Toast message\n * @property {number} [duration] - 표시 시간(ms), 0이면 자동 제거 안 함 / Display duration (ms), 0 means no auto-remove\n * @property {Object} [action] - 액션 버튼 / Action button\n * @property {string} action.label - 액션 버튼 레이블 / Action button label\n * @property {() => void} action.onClick - 액션 버튼 클릭 핸들러 / Action button click handler\n */\nexport interface Toast {\n id: string\n type: \"success\" | \"error\" | \"warning\" | \"info\"\n title?: string\n message: string\n duration?: number\n action?: {\n label: string\n onClick: () => void\n }\n}\n\n// Toast Context 타입\ninterface ToastContextType {\n toasts: Toast[]\n addToast: (toast: Omit<Toast, \"id\">) => void\n removeToast: (id: string) => void\n clearToasts: () => void\n}\n\n// Toast Context 생성\nconst ToastContext = createContext<ToastContextType | undefined>(undefined)\n\n/**\n * useToast Hook\n *\n * Toast를 추가, 제거, 초기화하는 훅입니다.\n * ToastProvider 내부에서만 사용 가능합니다.\n *\n * Hook for adding, removing, and clearing toasts.\n * Can only be used within ToastProvider.\n *\n * @example\n * const { addToast, removeToast, clearToasts } = useToast()\n *\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * duration: 3000\n * })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 / Toast context value\n * @throws {Error} ToastProvider 외부에서 사용 시 에러 발생 / Error when used outside ToastProvider\n */\nexport function useToast(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\")\n }\n return context\n}\n\n// No-op functions for safe toast hook\nconst noopAddToast = () => {}\nconst noopRemoveToast = () => {}\nconst noopClearToasts = () => {}\n\n/**\n * useToastSafe Hook\n *\n * ToastProvider 없이도 안전하게 사용할 수 있는 useToast 훅입니다.\n * Provider가 없으면 no-op 함수를 반환합니다.\n *\n * Safe version of useToast that works without ToastProvider.\n * Returns no-op functions when used outside ToastProvider.\n *\n * @example\n * const { addToast } = useToastSafe()\n *\n * // 안전하게 호출 가능 - Provider 없으면 아무 일도 안 함\n * addToast({ type: \"success\", message: \"저장됨\" })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 또는 no-op 함수들\n */\nexport function useToastSafe(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n return {\n toasts: [],\n addToast: noopAddToast,\n removeToast: noopRemoveToast,\n clearToasts: noopClearToasts,\n }\n }\n return context\n}\n\n/**\n * ToastProvider 컴포넌트의 props / ToastProvider component props\n * @typedef {Object} ToastProviderProps\n * @property {React.ReactNode} children - 자식 컴포넌트 / Child components\n * @property {number} [maxToasts=5] - 최대 Toast 개수 / Maximum number of toasts\n * @property {\"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"} [position=\"top-right\"] - Toast 표시 위치 / Toast display position\n */\ninterface ToastProviderProps {\n children: React.ReactNode\n maxToasts?: number\n position?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"\n}\n\n/**\n * ToastProvider 컴포넌트 / ToastProvider component\n * \n * Toast 시스템의 컨텍스트를 제공하는 Provider 컴포넌트입니다.\n * 앱의 루트 레벨에서 사용하여 전역 Toast 기능을 활성화합니다.\n * \n * Provider component that provides context for the Toast system.\n * Use at the root level of your app to enable global Toast functionality.\n * \n * @component\n * @example\n * // App.tsx\n * <ToastProvider position=\"top-center\" maxToasts={3}>\n * <App />\n * </ToastProvider>\n * \n * @example\n * // 컴포넌트에서 사용 / Usage in component\n * const { addToast } = useToast()\n * \n * const handleSave = () => {\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * title: \"성공\"\n * })\n * }\n * \n * @param {ToastProviderProps} props - ToastProvider 컴포넌트의 props / ToastProvider component props\n * @returns {JSX.Element} ToastProvider 컴포넌트 / ToastProvider component\n * \n * @todo 접근성 개선: ToastItem에 role=\"alert\" 또는 role=\"status\" 추가 필요 / Accessibility: Add role=\"alert\" or role=\"status\" to ToastItem\n * @todo 접근성 개선: aria-live=\"polite\" 또는 aria-live=\"assertive\" 추가 필요 / Accessibility: Add aria-live=\"polite\" or aria-live=\"assertive\"\n */\nexport function ToastProvider({\n children,\n maxToasts = 5,\n position = \"top-right\"\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<Toast[]>([])\n\n const removeToast = useCallback((id: string) => {\n setToasts(prev => prev.filter(toast => toast.id !== id))\n }, [])\n\n const addToast = useCallback((toast: Omit<Toast, \"id\">) => {\n const id = Math.random().toString(36).substr(2, 9)\n const newToast: Toast = { ...toast, id }\n\n setToasts(prev => {\n const updatedToasts = [...prev, newToast]\n return updatedToasts.slice(-maxToasts) // 최대 개수 제한\n })\n\n // 자동 제거\n if (toast.duration !== 0) {\n setTimeout(() => {\n removeToast(id)\n }, toast.duration || 5000)\n }\n }, [maxToasts, removeToast])\n\n const clearToasts = useCallback(() => {\n setToasts([])\n }, [])\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast, clearToasts }}>\n {children}\n <ToastContainer toasts={toasts} removeToast={removeToast} position={position} />\n </ToastContext.Provider>\n )\n}\n\n// Toast Container Props\ninterface ToastContainerProps {\n toasts: Toast[]\n removeToast: (id: string) => void\n position: string\n}\n\n// Toast Container\nfunction ToastContainer({ toasts, removeToast, position }: ToastContainerProps) {\n const positionClasses = {\n \"top-right\": \"top-4 right-4\",\n \"top-left\": \"top-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n \"bottom-left\": \"bottom-4 left-4\",\n \"top-center\": \"top-4 left-1/2 transform -translate-x-1/2\",\n \"bottom-center\": \"bottom-4 left-1/2 transform -translate-x-1/2\"\n }\n\n if (toasts.length === 0) return null\n\n return (\n <div className={merge(\n \"fixed z-50 space-y-3 max-w-sm\", // 12px 간격\n positionClasses[position as keyof typeof positionClasses]\n )}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n )\n}\n\n// Toast Item Props\ninterface ToastItemProps {\n toast: Toast\n onRemove: (id: string) => void\n}\n\n// Toast Item\nfunction ToastItem({ toast, onRemove }: ToastItemProps) {\n const [isVisible, setIsVisible] = useState(false)\n\n React.useEffect(() => {\n setIsVisible(true)\n }, [])\n\n const handleRemove = () => {\n setIsVisible(false)\n setTimeout(() => onRemove(toast.id), 300)\n }\n\n // CSS 변수 기반 배경색 (Tailwind v4 dark: variant + bg-color 충돌 우회)\n // 앱에서 --toast-*-bg 변수 정의 필요\n const getToastStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"bg-[var(--toast-success-bg)] border-green-300 dark:border-green-700 text-green-800 dark:text-green-200 shadow-lg shadow-green-100/50 dark:shadow-none\"\n case \"error\":\n return \"bg-[var(--toast-error-bg)] border-red-300 dark:border-red-700 text-red-800 dark:text-red-200 shadow-lg shadow-red-100/50 dark:shadow-none\"\n case \"warning\":\n return \"bg-[var(--toast-warning-bg)] border-yellow-300 dark:border-yellow-700 text-yellow-800 dark:text-yellow-200 shadow-lg shadow-yellow-100/50 dark:shadow-none\"\n case \"info\":\n return \"bg-[var(--toast-info-bg)] border-indigo-300 dark:border-indigo-700 text-cyan-800 dark:text-cyan-200 shadow-lg shadow-indigo-100/50 dark:shadow-none\"\n }\n }\n\n const getIconStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n }\n }\n\n const getToastIcon = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n }\n }\n\n return (\n <div\n className={merge(\n \"flex items-start p-4 rounded-xl border backdrop-blur-sm transition-all duration-300 transform\",\n getToastStyles(toast.type),\n isVisible\n ? \"translate-x-0 opacity-100 scale-100\"\n : \"translate-x-full opacity-0 scale-95\"\n )}\n style={{\n animation: isVisible ? \"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)\" : undefined\n }}\n >\n {/* 아이콘 */}\n <div className={merge(\"flex-shrink-0 mr-3\", getIconStyles(toast.type))}> {/* 12px 여백 */}\n {getToastIcon(toast.type)}\n </div>\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {toast.title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {toast.title}\n </h4>\n )}\n <p className=\"text-sm leading-relaxed\">\n {toast.message}\n </p>\n\n {/* 액션 버튼 */}\n {toast.action && (\n <button\n onClick={toast.action.onClick}\n className=\"mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200\" // 12px 여백\n >\n {toast.action.label}\n </button>\n )}\n </div>\n\n {/* 닫기 버튼 */}\n <div className=\"flex-shrink-0 ml-4\"> {/* 16px 여백 */}\n <button\n onClick={handleRemove}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconStyles(toast.type)\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n )\n}\n\n// 편의 함수들 (ToastProvider 내부에서만 사용 가능 - 스텁 함수)\nexport const showToast = (_toast: Omit<Toast, \"id\">) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showSuccessToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showErrorToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showWarningToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showInfoToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n} "]}
1
+ {"version":3,"sources":["../src/components/Toast.tsx"],"names":["ToastContext","createContext","useToast","context","useContext","noopAddToast","noopRemoveToast","noopClearToasts","useToastSafe","ToastProvider","children","maxToasts","position","toasts","setToasts","useState","removeToast","useCallback","id","prev","toast","addToast","newToast","clearToasts","jsxs","jsx","ToastContainer","positionClasses","merge","ToastItem","onRemove","isVisible","setIsVisible","React","handleRemove","getToastStyles","type","getIconStyles","getToastIcon"],"mappings":"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","file":"chunk-DYNBM24D.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { createContext, useContext, useState, useCallback } from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Toast 메시지 타입 / Toast message type\n * @typedef {Object} Toast\n * @property {string} id - Toast 고유 ID / Toast unique ID\n * @property {\"success\" | \"error\" | \"warning\" | \"info\"} type - Toast 타입 / Toast type\n * @property {string} [title] - Toast 제목 / Toast title\n * @property {string} message - Toast 메시지 / Toast message\n * @property {number} [duration] - 표시 시간(ms), 0이면 자동 제거 안 함 / Display duration (ms), 0 means no auto-remove\n * @property {Object} [action] - 액션 버튼 / Action button\n * @property {string} action.label - 액션 버튼 레이블 / Action button label\n * @property {() => void} action.onClick - 액션 버튼 클릭 핸들러 / Action button click handler\n */\nexport interface Toast {\n id: string\n type: \"success\" | \"error\" | \"warning\" | \"info\"\n title?: string\n message: string\n duration?: number\n action?: {\n label: string\n onClick: () => void\n }\n}\n\n// Toast Context 타입\ninterface ToastContextType {\n toasts: Toast[]\n addToast: (toast: Omit<Toast, \"id\">) => void\n removeToast: (id: string) => void\n clearToasts: () => void\n}\n\n// Toast Context 생성\nconst ToastContext = createContext<ToastContextType | undefined>(undefined)\n\n/**\n * useToast Hook\n *\n * Toast를 추가, 제거, 초기화하는 훅입니다.\n * ToastProvider 내부에서만 사용 가능합니다.\n *\n * Hook for adding, removing, and clearing toasts.\n * Can only be used within ToastProvider.\n *\n * @example\n * const { addToast, removeToast, clearToasts } = useToast()\n *\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * duration: 3000\n * })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 / Toast context value\n * @throws {Error} ToastProvider 외부에서 사용 시 에러 발생 / Error when used outside ToastProvider\n */\nexport function useToast(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\")\n }\n return context\n}\n\n// No-op functions for safe toast hook\nconst noopAddToast = () => {}\nconst noopRemoveToast = () => {}\nconst noopClearToasts = () => {}\n\n/**\n * useToastSafe Hook\n *\n * ToastProvider 없이도 안전하게 사용할 수 있는 useToast 훅입니다.\n * Provider가 없으면 no-op 함수를 반환합니다.\n *\n * Safe version of useToast that works without ToastProvider.\n * Returns no-op functions when used outside ToastProvider.\n *\n * @example\n * const { addToast } = useToastSafe()\n *\n * // 안전하게 호출 가능 - Provider 없으면 아무 일도 안 함\n * addToast({ type: \"success\", message: \"저장됨\" })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 또는 no-op 함수들\n */\nexport function useToastSafe(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n return {\n toasts: [],\n addToast: noopAddToast,\n removeToast: noopRemoveToast,\n clearToasts: noopClearToasts,\n }\n }\n return context\n}\n\n/**\n * ToastProvider 컴포넌트의 props / ToastProvider component props\n * @typedef {Object} ToastProviderProps\n * @property {React.ReactNode} children - 자식 컴포넌트 / Child components\n * @property {number} [maxToasts=5] - 최대 Toast 개수 / Maximum number of toasts\n * @property {\"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"} [position=\"top-right\"] - Toast 표시 위치 / Toast display position\n */\ninterface ToastProviderProps {\n children: React.ReactNode\n maxToasts?: number\n position?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"\n}\n\n/**\n * ToastProvider 컴포넌트 / ToastProvider component\n * \n * Toast 시스템의 컨텍스트를 제공하는 Provider 컴포넌트입니다.\n * 앱의 루트 레벨에서 사용하여 전역 Toast 기능을 활성화합니다.\n * \n * Provider component that provides context for the Toast system.\n * Use at the root level of your app to enable global Toast functionality.\n * \n * @component\n * @example\n * // App.tsx\n * <ToastProvider position=\"top-center\" maxToasts={3}>\n * <App />\n * </ToastProvider>\n * \n * @example\n * // 컴포넌트에서 사용 / Usage in component\n * const { addToast } = useToast()\n * \n * const handleSave = () => {\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * title: \"성공\"\n * })\n * }\n * \n * @param {ToastProviderProps} props - ToastProvider 컴포넌트의 props / ToastProvider component props\n * @returns {JSX.Element} ToastProvider 컴포넌트 / ToastProvider component\n * \n * @todo 접근성 개선: ToastItem에 role=\"alert\" 또는 role=\"status\" 추가 필요 / Accessibility: Add role=\"alert\" or role=\"status\" to ToastItem\n * @todo 접근성 개선: aria-live=\"polite\" 또는 aria-live=\"assertive\" 추가 필요 / Accessibility: Add aria-live=\"polite\" or aria-live=\"assertive\"\n */\nexport function ToastProvider({\n children,\n maxToasts = 5,\n position = \"top-right\"\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<Toast[]>([])\n\n const removeToast = useCallback((id: string) => {\n setToasts(prev => prev.filter(toast => toast.id !== id))\n }, [])\n\n const addToast = useCallback((toast: Omit<Toast, \"id\">) => {\n const id = Math.random().toString(36).substr(2, 9)\n const newToast: Toast = { ...toast, id }\n\n setToasts(prev => {\n const updatedToasts = [...prev, newToast]\n return updatedToasts.slice(-maxToasts) // 최대 개수 제한\n })\n\n // 자동 제거\n if (toast.duration !== 0) {\n setTimeout(() => {\n removeToast(id)\n }, toast.duration || 5000)\n }\n }, [maxToasts, removeToast])\n\n const clearToasts = useCallback(() => {\n setToasts([])\n }, [])\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast, clearToasts }}>\n {children}\n <ToastContainer toasts={toasts} removeToast={removeToast} position={position} />\n </ToastContext.Provider>\n )\n}\n\n// Toast Container Props\ninterface ToastContainerProps {\n toasts: Toast[]\n removeToast: (id: string) => void\n position: string\n}\n\n// Toast Container\nfunction ToastContainer({ toasts, removeToast, position }: ToastContainerProps) {\n const positionClasses = {\n \"top-right\": \"top-4 right-4\",\n \"top-left\": \"top-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n \"bottom-left\": \"bottom-4 left-4\",\n \"top-center\": \"top-4 left-1/2 transform -translate-x-1/2\",\n \"bottom-center\": \"bottom-4 left-1/2 transform -translate-x-1/2\"\n }\n\n if (toasts.length === 0) return null\n\n return (\n <div className={merge(\n \"fixed z-50 space-y-3 max-w-sm\", // 12px 간격\n positionClasses[position as keyof typeof positionClasses]\n )}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n )\n}\n\n// Toast Item Props\ninterface ToastItemProps {\n toast: Toast\n onRemove: (id: string) => void\n}\n\n// Toast Item\nfunction ToastItem({ toast, onRemove }: ToastItemProps) {\n const [isVisible, setIsVisible] = useState(false)\n\n React.useEffect(() => {\n setIsVisible(true)\n }, [])\n\n const handleRemove = () => {\n setIsVisible(false)\n setTimeout(() => onRemove(toast.id), 300)\n }\n\n // CSS 변수 기반 배경색 (Tailwind v4 dark: variant + bg-color 충돌 우회)\n // 앱에서 --toast-*-bg 변수 정의 필요\n const getToastStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"bg-[var(--toast-success-bg)] border-green-300 dark:border-green-700 text-green-800 dark:text-green-200 shadow-lg shadow-green-100/50 dark:shadow-none\"\n case \"error\":\n return \"bg-[var(--toast-error-bg)] border-red-300 dark:border-red-700 text-red-800 dark:text-red-200 shadow-lg shadow-red-100/50 dark:shadow-none\"\n case \"warning\":\n return \"bg-[var(--toast-warning-bg)] border-yellow-300 dark:border-yellow-700 text-yellow-800 dark:text-yellow-200 shadow-lg shadow-yellow-100/50 dark:shadow-none\"\n case \"info\":\n return \"bg-[var(--toast-info-bg)] border-indigo-300 dark:border-indigo-700 text-cyan-800 dark:text-cyan-200 shadow-lg shadow-indigo-100/50 dark:shadow-none\"\n }\n }\n\n const getIconStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n }\n }\n\n const getToastIcon = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n }\n }\n\n return (\n <div\n className={merge(\n \"flex items-start p-4 rounded-xl border backdrop-blur-sm transition-all duration-300 transform\",\n getToastStyles(toast.type),\n isVisible\n ? \"translate-x-0 opacity-100 scale-100\"\n : \"translate-x-full opacity-0 scale-95\"\n )}\n style={{\n animation: isVisible ? \"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)\" : undefined\n }}\n >\n {/* 아이콘 */}\n <div className={merge(\"flex-shrink-0 mr-3\", getIconStyles(toast.type))}> {/* 12px 여백 */}\n {getToastIcon(toast.type)}\n </div>\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {toast.title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {toast.title}\n </h4>\n )}\n <p className=\"text-sm leading-relaxed\">\n {toast.message}\n </p>\n\n {/* 액션 버튼 */}\n {toast.action && (\n <button\n onClick={toast.action.onClick}\n className=\"mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200\" // 12px 여백\n >\n {toast.action.label}\n </button>\n )}\n </div>\n\n {/* 닫기 버튼 */}\n <div className=\"flex-shrink-0 ml-4\"> {/* 16px 여백 */}\n <button\n onClick={handleRemove}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconStyles(toast.type)\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n )\n}\n\n// 편의 함수들 (ToastProvider 내부에서만 사용 가능 - 스텁 함수)\nexport const showToast = (_toast: Omit<Toast, \"id\">) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showSuccessToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showErrorToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showWarningToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showInfoToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n} "]}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import {a,b}from'./chunk-LOYAJIWO.mjs';import {a as a$1}from'./chunk-UUHAXGMO.mjs';import g from'react';import {jsxs,jsx}from'react/jsx-runtime';var p=g.forwardRef(({className:c,title:m,description:h,children:u,prevPage:t,nextPage:r,breadcrumbItems:i=[{label:"Components",href:"/components"}],...f},v)=>jsxs("div",{className:"relative min-h-screen",children:[jsx("div",{className:"fixed right-4 top-4 z-50 hidden lg:block",children:jsx("div",{className:"flex flex-col space-y-4",children:t&&jsx("a",{href:t.href,className:"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200",title:`\uC774\uC804: ${t.title}`,children:jsx("svg",{className:"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 15l7-7 7 7"})})})})}),jsx("div",{className:"fixed right-4 bottom-4 z-50 hidden lg:block",children:jsx("div",{className:"flex flex-col space-y-4",children:r&&jsx("a",{href:r.href,className:"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200",title:`\uB2E4\uC74C: ${r.title}`,children:jsx("svg",{className:"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})})})}),jsx("div",{ref:v,className:a$1("container mx-auto px-4 py-8",c),...f,children:jsxs("div",{className:"max-w-4xl mx-auto",children:[jsx(a,{className:"mb-6",children:i.map((s,a)=>jsx(b,{href:s.href,isCurrent:a===i.length-1,children:s.label},a))}),jsxs("div",{className:"mb-8",children:[jsx("h1",{className:"text-4xl font-bold mb-4",children:m}),jsx("p",{className:"text-lg text-muted-foreground",children:h})]}),jsx("div",{className:"space-y-8",children:u}),jsx("div",{className:"mt-12 lg:hidden",children:jsxs("div",{className:"flex items-center justify-between py-4 border-t border-border",children:[t&&jsxs("a",{href:t.href,className:"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors",children:[jsx("svg",{className:"w-4 h-4 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 19l-7-7 7-7"})}),t.title]}),r&&jsxs("a",{href:r.href,className:"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors",children:[r.title,jsx("svg",{className:"w-4 h-4 ml-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})})]})]})})]})})]}));p.displayName="ComponentLayout";export{p as a};//# sourceMappingURL=chunk-NBJUE7NR.mjs.map
3
- //# sourceMappingURL=chunk-NBJUE7NR.mjs.map
2
+ import {a,b}from'./chunk-KJZGOL2Z.mjs';import {b as b$1}from'./chunk-U6CTBZ2U.mjs';import g from'react';import {jsxs,jsx}from'react/jsx-runtime';var p=g.forwardRef(({className:c,title:m,description:h,children:u,prevPage:t,nextPage:r,breadcrumbItems:i=[{label:"Components",href:"/components"}],...f},v)=>jsxs("div",{className:"relative min-h-screen",children:[jsx("div",{className:"fixed right-4 top-4 z-50 hidden lg:block",children:jsx("div",{className:"flex flex-col space-y-4",children:t&&jsx("a",{href:t.href,className:"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200",title:`\uC774\uC804: ${t.title}`,children:jsx("svg",{className:"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 15l7-7 7 7"})})})})}),jsx("div",{className:"fixed right-4 bottom-4 z-50 hidden lg:block",children:jsx("div",{className:"flex flex-col space-y-4",children:r&&jsx("a",{href:r.href,className:"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200",title:`\uB2E4\uC74C: ${r.title}`,children:jsx("svg",{className:"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})})})}),jsx("div",{ref:v,className:b$1("container mx-auto px-4 py-8",c),...f,children:jsxs("div",{className:"max-w-4xl mx-auto",children:[jsx(a,{className:"mb-6",children:i.map((s,a)=>jsx(b,{href:s.href,isCurrent:a===i.length-1,children:s.label},a))}),jsxs("div",{className:"mb-8",children:[jsx("h1",{className:"text-4xl font-bold mb-4",children:m}),jsx("p",{className:"text-lg text-muted-foreground",children:h})]}),jsx("div",{className:"space-y-8",children:u}),jsx("div",{className:"mt-12 lg:hidden",children:jsxs("div",{className:"flex items-center justify-between py-4 border-t border-border",children:[t&&jsxs("a",{href:t.href,className:"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors",children:[jsx("svg",{className:"w-4 h-4 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 19l-7-7 7-7"})}),t.title]}),r&&jsxs("a",{href:r.href,className:"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors",children:[r.title,jsx("svg",{className:"w-4 h-4 ml-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})})]})]})})]})})]}));p.displayName="ComponentLayout";export{p as a};//# sourceMappingURL=chunk-FX57OSYG.mjs.map
3
+ //# sourceMappingURL=chunk-FX57OSYG.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ComponentLayout.tsx"],"names":["ComponentLayout","React","className","title","description","children","prevPage","nextPage","breadcrumbItems","props","ref","jsxs","jsx","merge","Breadcrumb","item","index","BreadcrumbItem"],"mappings":"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","file":"chunk-NBJUE7NR.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Breadcrumb, BreadcrumbItem } from \"./Breadcrumb\"\n\n/**\n * ComponentLayout 컴포넌트의 props / ComponentLayout component props\n * @typedef {Object} ComponentLayoutProps\n * @property {string} title - 페이지 제목 / Page title\n * @property {string} description - 페이지 설명 / Page description\n * @property {React.ReactNode} children - 페이지 내용 / Page content\n * @property {Object} [prevPage] - 이전 페이지 정보 / Previous page information\n * @property {string} prevPage.title - 이전 페이지 제목 / Previous page title\n * @property {string} prevPage.href - 이전 페이지 링크 / Previous page link\n * @property {Object} [nextPage] - 다음 페이지 정보 / Next page information\n * @property {string} nextPage.title - 다음 페이지 제목 / Next page title\n * @property {string} nextPage.href - 다음 페이지 링크 / Next page link\n * @property {Array<Object>} [breadcrumbItems] - Breadcrumb 항목들 / Breadcrumb items\n * @property {string} breadcrumbItems[].label - Breadcrumb 라벨 / Breadcrumb label\n * @property {string} [breadcrumbItems[].href] - Breadcrumb 링크 / Breadcrumb link\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ComponentLayoutProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string\n description: string\n children: React.ReactNode\n prevPage?: {\n title: string\n href: string\n }\n nextPage?: {\n title: string\n href: string\n }\n breadcrumbItems?: Array<{\n label: string\n href?: string\n }>\n}\n\n/**\n * ComponentLayout 컴포넌트 / ComponentLayout component\n * \n * 컴포넌트 문서 페이지 레이아웃을 제공하는 컴포넌트입니다.\n * 제목, 설명, Breadcrumb, 이전/다음 페이지 네비게이션을 포함합니다.\n * \n * Component that provides layout for component documentation pages.\n * Includes title, description, Breadcrumb, and previous/next page navigation.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ComponentLayout\n * title=\"Button 컴포넌트\"\n * description=\"버튼 컴포넌트 사용법\"\n * >\n * <Button>예제</Button>\n * </ComponentLayout>\n * \n * @example\n * // 이전/다음 페이지 네비게이션 포함 / With previous/next page navigation\n * <ComponentLayout\n * title=\"Input 컴포넌트\"\n * description=\"입력 컴포넌트 사용법\"\n * prevPage={{ title: \"Button\", href: \"/components/button\" }}\n * nextPage={{ title: \"Select\", href: \"/components/select\" }}\n * >\n * <Input placeholder=\"입력하세요\" />\n * </ComponentLayout>\n * \n * @param {ComponentLayoutProps} props - ComponentLayout 컴포넌트의 props / ComponentLayout component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ComponentLayout 컴포넌트 / ComponentLayout component\n */\nconst ComponentLayout = React.forwardRef<HTMLDivElement, ComponentLayoutProps>(\n ({ \n className, \n title, \n description, \n children, \n prevPage, \n nextPage,\n breadcrumbItems = [\n { label: \"Components\", href: \"/components\" }\n ],\n ...props \n }, ref) => {\n return (\n <div className=\"relative min-h-screen\">\n {/* 고정된 페이지 네비게이션 - 위쪽 */}\n <div className=\"fixed right-4 top-4 z-50 hidden lg:block\">\n <div className=\"flex flex-col space-y-4\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200\"\n title={`이전: ${prevPage.title}`}\n >\n <svg\n className=\"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n\n {/* 고정된 페이지 네비게이션 - 아래쪽 */}\n <div className=\"fixed right-4 bottom-4 z-50 hidden lg:block\">\n <div className=\"flex flex-col space-y-4\">\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200\"\n title={`다음: ${nextPage.title}`}\n >\n <svg\n className=\"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n\n {/* 메인 콘텐츠 */}\n <div\n ref={ref}\n className={merge(\"container mx-auto px-4 py-8\", className)}\n {...props}\n >\n <div className=\"max-w-4xl mx-auto\">\n {/* 브레드크럼 */}\n <Breadcrumb className=\"mb-6\">\n {breadcrumbItems.map((item, index) => (\n <BreadcrumbItem \n key={index}\n href={item.href}\n isCurrent={index === breadcrumbItems.length - 1}\n >\n {item.label}\n </BreadcrumbItem>\n ))}\n </Breadcrumb>\n\n {/* 페이지 헤더 */}\n <div className=\"mb-8\">\n <h1 className=\"text-4xl font-bold mb-4\">{title}</h1>\n <p className=\"text-lg text-muted-foreground\">\n {description}\n </p>\n </div>\n\n {/* 페이지 콘텐츠 */}\n <div className=\"space-y-8\">\n {children}\n </div>\n\n {/* 모바일 페이지 네비게이션 */}\n <div className=\"mt-12 lg:hidden\">\n <div className=\"flex items-center justify-between py-4 border-t border-border\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <svg className=\"w-4 h-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n {prevPage.title}\n </a>\n )}\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n {nextPage.title}\n <svg className=\"w-4 h-4 ml-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n }\n)\nComponentLayout.displayName = \"ComponentLayout\"\n\nexport { ComponentLayout } "]}
1
+ {"version":3,"sources":["../src/components/ComponentLayout.tsx"],"names":["ComponentLayout","React","className","title","description","children","prevPage","nextPage","breadcrumbItems","props","ref","jsxs","jsx","merge","Breadcrumb","item","index","BreadcrumbItem"],"mappings":"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","file":"chunk-FX57OSYG.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Breadcrumb, BreadcrumbItem } from \"./Breadcrumb\"\n\n/**\n * ComponentLayout 컴포넌트의 props / ComponentLayout component props\n * @typedef {Object} ComponentLayoutProps\n * @property {string} title - 페이지 제목 / Page title\n * @property {string} description - 페이지 설명 / Page description\n * @property {React.ReactNode} children - 페이지 내용 / Page content\n * @property {Object} [prevPage] - 이전 페이지 정보 / Previous page information\n * @property {string} prevPage.title - 이전 페이지 제목 / Previous page title\n * @property {string} prevPage.href - 이전 페이지 링크 / Previous page link\n * @property {Object} [nextPage] - 다음 페이지 정보 / Next page information\n * @property {string} nextPage.title - 다음 페이지 제목 / Next page title\n * @property {string} nextPage.href - 다음 페이지 링크 / Next page link\n * @property {Array<Object>} [breadcrumbItems] - Breadcrumb 항목들 / Breadcrumb items\n * @property {string} breadcrumbItems[].label - Breadcrumb 라벨 / Breadcrumb label\n * @property {string} [breadcrumbItems[].href] - Breadcrumb 링크 / Breadcrumb link\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ComponentLayoutProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string\n description: string\n children: React.ReactNode\n prevPage?: {\n title: string\n href: string\n }\n nextPage?: {\n title: string\n href: string\n }\n breadcrumbItems?: Array<{\n label: string\n href?: string\n }>\n}\n\n/**\n * ComponentLayout 컴포넌트 / ComponentLayout component\n * \n * 컴포넌트 문서 페이지 레이아웃을 제공하는 컴포넌트입니다.\n * 제목, 설명, Breadcrumb, 이전/다음 페이지 네비게이션을 포함합니다.\n * \n * Component that provides layout for component documentation pages.\n * Includes title, description, Breadcrumb, and previous/next page navigation.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ComponentLayout\n * title=\"Button 컴포넌트\"\n * description=\"버튼 컴포넌트 사용법\"\n * >\n * <Button>예제</Button>\n * </ComponentLayout>\n * \n * @example\n * // 이전/다음 페이지 네비게이션 포함 / With previous/next page navigation\n * <ComponentLayout\n * title=\"Input 컴포넌트\"\n * description=\"입력 컴포넌트 사용법\"\n * prevPage={{ title: \"Button\", href: \"/components/button\" }}\n * nextPage={{ title: \"Select\", href: \"/components/select\" }}\n * >\n * <Input placeholder=\"입력하세요\" />\n * </ComponentLayout>\n * \n * @param {ComponentLayoutProps} props - ComponentLayout 컴포넌트의 props / ComponentLayout component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ComponentLayout 컴포넌트 / ComponentLayout component\n */\nconst ComponentLayout = React.forwardRef<HTMLDivElement, ComponentLayoutProps>(\n ({ \n className, \n title, \n description, \n children, \n prevPage, \n nextPage,\n breadcrumbItems = [\n { label: \"Components\", href: \"/components\" }\n ],\n ...props \n }, ref) => {\n return (\n <div className=\"relative min-h-screen\">\n {/* 고정된 페이지 네비게이션 - 위쪽 */}\n <div className=\"fixed right-4 top-4 z-50 hidden lg:block\">\n <div className=\"flex flex-col space-y-4\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200\"\n title={`이전: ${prevPage.title}`}\n >\n <svg\n className=\"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n\n {/* 고정된 페이지 네비게이션 - 아래쪽 */}\n <div className=\"fixed right-4 bottom-4 z-50 hidden lg:block\">\n <div className=\"flex flex-col space-y-4\">\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200\"\n title={`다음: ${nextPage.title}`}\n >\n <svg\n className=\"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n\n {/* 메인 콘텐츠 */}\n <div\n ref={ref}\n className={merge(\"container mx-auto px-4 py-8\", className)}\n {...props}\n >\n <div className=\"max-w-4xl mx-auto\">\n {/* 브레드크럼 */}\n <Breadcrumb className=\"mb-6\">\n {breadcrumbItems.map((item, index) => (\n <BreadcrumbItem \n key={index}\n href={item.href}\n isCurrent={index === breadcrumbItems.length - 1}\n >\n {item.label}\n </BreadcrumbItem>\n ))}\n </Breadcrumb>\n\n {/* 페이지 헤더 */}\n <div className=\"mb-8\">\n <h1 className=\"text-4xl font-bold mb-4\">{title}</h1>\n <p className=\"text-lg text-muted-foreground\">\n {description}\n </p>\n </div>\n\n {/* 페이지 콘텐츠 */}\n <div className=\"space-y-8\">\n {children}\n </div>\n\n {/* 모바일 페이지 네비게이션 */}\n <div className=\"mt-12 lg:hidden\">\n <div className=\"flex items-center justify-between py-4 border-t border-border\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <svg className=\"w-4 h-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n {prevPage.title}\n </a>\n )}\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n {nextPage.title}\n <svg className=\"w-4 h-4 ml-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n }\n)\nComponentLayout.displayName = \"ComponentLayout\"\n\nexport { ComponentLayout } "]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import {b}from'./chunk-U6CTBZ2U.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="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:b(w({size:a,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},t)=>jsx("img",{ref:t,className:b("aspect-square h-full w-full object-cover object-center",e),...a}));f.displayName="AvatarImage";var c=i.forwardRef(({className:e,...a},t)=>jsx("div",{ref:t,className:b("flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-semibold",e),...a}));c.displayName="AvatarFallback";export{h as a,f as b,c};//# sourceMappingURL=chunk-IJSYSNM5.mjs.map
3
+ //# sourceMappingURL=chunk-IJSYSNM5.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,CAAAA,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,EAAM,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,CAAM,CAAA,CAAGC,CAAAA,GACxBM,IAAC,KAAA,CAAA,CACC,GAAA,CAAKN,EACL,SAAA,CAAWO,CAAAA,CAAM,yDAA0Df,CAAS,CAAA,CACnF,GAAGO,CAAAA,CACN,CAEJ,EACAS,CAAAA,CAAY,WAAA,CAAc,aAAA,CAE1B,IAAMC,CAAAA,CAAiBlB,CAAAA,CAAM,WAC3B,CAAC,CAAE,UAAAC,CAAAA,CAAW,GAAGO,CAAM,CAAA,CAAGC,CAAAA,GACxBM,IAAC,KAAA,CAAA,CACC,GAAA,CAAKN,EACL,SAAA,CAAWO,CAAAA,CACT,+GACAf,CACF,CAAA,CACC,GAAGO,CAAAA,CACN,CAEJ,EACAU,CAAAA,CAAe,WAAA,CAAc,gBAAA","file":"chunk-IJSYSNM5.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 } "]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import {l as l$1}from'./chunk-7OYT3QSY.mjs';import {b}from'./chunk-U6CTBZ2U.mjs';import l from'react';import {jsxs,jsx}from'react/jsx-runtime';var w=l.forwardRef(({className:i,children:a,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?l.Children.map(a,(r,e)=>l.isValidElement(r)?jsxs("li",{className:"flex items-center",children:[r,e<l.Children.count(a)-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?l.Children.count(a):0;return jsx("nav",{ref:N,"aria-label":"Breadcrumb",className:b(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,isCurrent:n=false,children:s,...c},f)=>n?jsx("span",{ref:f,"aria-current":"page",className:b("text-muted-foreground font-medium",i),...c,children:s}):a?jsx("a",{href:a,className:b("text-muted-foreground hover:text-foreground transition-colors",i),...c,children:s}):jsx("span",{ref:f,className:b("text-muted-foreground",i),...c,children:s}));x.displayName="BreadcrumbItem";export{w as a,x as b};//# sourceMappingURL=chunk-KJZGOL2Z.mjs.map
3
+ //# sourceMappingURL=chunk-KJZGOL2Z.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-KJZGOL2Z.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 {b as b$1}from'./chunk-U6CTBZ2U.mjs';import o from'react';import {jsx}from'react/jsx-runtime';var b=o.forwardRef(({className:e,variant:t="default",size:a="md",...d},s)=>{let n=()=>{switch(t){case "bordered":return "border border-border divide-x divide-border";case "striped":return "divide-y divide-border";default:return ""}},c=()=>{switch(a){case "sm":return "text-sm";case "lg":return "text-base";default:return "text-sm"}};return jsx("div",{className:"w-full overflow-auto",children:jsx("table",{ref:s,className:b$1("w-full caption-bottom",n(),c(),e),...d})})});b.displayName="Table";var i=o.forwardRef(({className:e,...t},a)=>jsx("thead",{ref:a,className:b$1("[&_tr]:border-b",e),...t}));i.displayName="TableHeader";var T=o.forwardRef(({className:e,...t},a)=>jsx("tbody",{ref:a,className:b$1("[&_tr:last-child]:border-0",e),...t}));T.displayName="TableBody";var m=o.forwardRef(({className:e,...t},a)=>jsx("tfoot",{ref:a,className:b$1("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...t}));m.displayName="TableFooter";var f=o.forwardRef(({className:e,variant:t="default",...a},d)=>jsx("tr",{ref:d,className:b$1("border-b transition-colors data-[state=selected]:bg-muted/50",t==="hover"?"hover:bg-muted/50":"",e),...a}));f.displayName="TableRow";var p=o.forwardRef(({className:e,...t},a)=>jsx("th",{ref:a,className:b$1("h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",e),...t}));p.displayName="TableHead";var u=o.forwardRef(({className:e,...t},a)=>jsx("td",{ref:a,className:b$1("p-4 align-middle [&:has([role=checkbox])]:pr-0",e),...t}));u.displayName="TableCell";var R=o.forwardRef(({className:e,...t},a)=>jsx("caption",{ref:a,className:b$1("mt-4 text-sm text-muted-foreground",e),...t}));R.displayName="TableCaption";export{b as a,i as b,T as c,m as d,f as e,p as f,u as g,R as h};//# sourceMappingURL=chunk-KYRIUUQP.mjs.map
3
+ //# sourceMappingURL=chunk-KYRIUUQP.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Table.tsx"],"names":["Table","React","className","variant","size","props","ref","getVariantClasses","getSizeClasses","jsx","merge","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption"],"mappings":"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","file":"chunk-PAEKNQWW.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Table 컴포넌트의 props / Table component props\n * @typedef {Object} TableProps\n * @property {React.ReactNode} children - TableHeader, TableBody, TableFooter 등 / TableHeader, TableBody, TableFooter, etc.\n * @property {\"default\" | \"bordered\" | \"striped\"} [variant=\"default\"] - Table 스타일 변형 / Table style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Table 크기 / Table size\n * @extends {React.HTMLAttributes<HTMLTableElement>}\n */\nexport interface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n children: React.ReactNode\n variant?: \"default\" | \"bordered\" | \"striped\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TableHeader 컴포넌트의 props / TableHeader component props\n * @typedef {Object} TableHeaderProps\n * @property {React.ReactNode} children - TableHead 컴포넌트들 / TableHead components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableBody 컴포넌트의 props / TableBody component props\n * @typedef {Object} TableBodyProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableFooter 컴포넌트의 props / TableFooter component props\n * @typedef {Object} TableFooterProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableRow 컴포넌트의 props / TableRow component props\n * @typedef {Object} TableRowProps\n * @property {React.ReactNode} children - TableHead 또는 TableCell 컴포넌트들 / TableHead or TableCell components\n * @property {\"default\" | \"hover\"} [variant=\"default\"] - Row 스타일 변형 / Row style variant\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\n */\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n children: React.ReactNode\n variant?: \"default\" | \"hover\"\n}\n\n/**\n * TableHead 컴포넌트의 props / TableHead component props\n * @typedef {Object} TableHeadProps\n * @property {React.ReactNode} children - 헤더 셀 내용 / Header cell content\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * TableCell 컴포넌트의 props / TableCell component props\n * @typedef {Object} TableCellProps\n * @property {React.ReactNode} children - 셀 내용 / Cell content\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * Table 컴포넌트 / Table component\n * \n * 데이터를 표 형태로 표시하는 테이블 컴포넌트입니다.\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell과 함께 사용합니다.\n * \n * Table component that displays data in tabular format.\n * Used with TableHeader, TableBody, TableFooter, TableRow, TableHead, and TableCell.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>이름</TableHead>\n * <TableHead>나이</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>홍길동</TableCell>\n * <TableCell>30</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Bordered 스타일 / Bordered style\n * <Table variant=\"bordered\">\n * <TableHeader>\n * <TableRow>\n * <TableHead>항목</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>값</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Striped 스타일, 호버 효과 / Striped style with hover effect\n * <Table variant=\"striped\">\n * <TableBody>\n * <TableRow variant=\"hover\">\n * <TableCell>데이터</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @param {TableProps} props - Table 컴포넌트의 props / Table component props\n * @param {React.Ref<HTMLTableElement>} ref - table 요소 ref / table element ref\n * @returns {JSX.Element} Table 컴포넌트 / Table component\n */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, variant = \"default\", size = \"md\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"bordered\":\n return \"border border-border divide-x divide-border\"\n case \"striped\":\n return \"divide-y divide-border\"\n default:\n return \"\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-sm\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <div className=\"w-full overflow-auto\">\n <table\n ref={ref}\n className={merge(\n \"w-full caption-bottom\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n />\n </div>\n )\n }\n)\nTable.displayName = \"Table\"\n\n/**\n * TableHeader 컴포넌트 / TableHeader component\n * 테이블의 헤더 영역을 표시합니다.\n * Displays the header area of a table.\n * \n * @component\n * @param {TableHeaderProps} props - TableHeader 컴포넌트의 props / TableHeader component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - thead 요소 ref / thead element ref\n * @returns {JSX.Element} TableHeader 컴포넌트 / TableHeader component\n */\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={merge(\"[&_tr]:border-b\", className)} {...props} />\n )\n)\nTableHeader.displayName = \"TableHeader\"\n\n/**\n * TableBody 컴포넌트 / TableBody component\n * 테이블의 본문 영역을 표시합니다.\n * Displays the body area of a table.\n * \n * @component\n * @param {TableBodyProps} props - TableBody 컴포넌트의 props / TableBody component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tbody 요소 ref / tbody element ref\n * @returns {JSX.Element} TableBody 컴포넌트 / TableBody component\n */\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={merge(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n)\nTableBody.displayName = \"TableBody\"\n\n/**\n * TableFooter 컴포넌트 / TableFooter component\n * 테이블의 푸터 영역을 표시합니다.\n * Displays the footer area of a table.\n * \n * @component\n * @param {TableFooterProps} props - TableFooter 컴포넌트의 props / TableFooter component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tfoot 요소 ref / tfoot element ref\n * @returns {JSX.Element} TableFooter 컴포넌트 / TableFooter component\n */\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={merge(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableFooter.displayName = \"TableFooter\"\n\n/**\n * TableRow 컴포넌트 / TableRow component\n * 테이블의 행을 표시합니다.\n * Displays a table row.\n * \n * @component\n * @param {TableRowProps} props - TableRow 컴포넌트의 props / TableRow component props\n * @param {React.Ref<HTMLTableRowElement>} ref - tr 요소 ref / tr element ref\n * @returns {JSX.Element} TableRow 컴포넌트 / TableRow component\n */\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"hover\":\n return \"hover:bg-muted/50\"\n default:\n return \"\"\n }\n }\n\n return (\n <tr\n ref={ref}\n className={merge(\n \"border-b transition-colors data-[state=selected]:bg-muted/50\",\n getVariantClasses(),\n className\n )}\n {...props}\n />\n )\n }\n)\nTableRow.displayName = \"TableRow\"\n\n/**\n * TableHead 컴포넌트 / TableHead component\n * 테이블의 헤더 셀을 표시합니다.\n * Displays a table header cell.\n * \n * @component\n * @param {TableHeadProps} props - TableHead 컴포넌트의 props / TableHead component props\n * @param {React.Ref<HTMLTableCellElement>} ref - th 요소 ref / th element ref\n * @returns {JSX.Element} TableHead 컴포넌트 / TableHead component\n */\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={merge(\n \"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableHead.displayName = \"TableHead\"\n\n/**\n * TableCell 컴포넌트 / TableCell component\n * 테이블의 데이터 셀을 표시합니다.\n * Displays a table data cell.\n * \n * @component\n * @param {TableCellProps} props - TableCell 컴포넌트의 props / TableCell component props\n * @param {React.Ref<HTMLTableCellElement>} ref - td 요소 ref / td element ref\n * @returns {JSX.Element} TableCell 컴포넌트 / TableCell component\n */\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={merge(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n)\nTableCell.displayName = \"TableCell\"\n\n/**\n * TableCaption 컴포넌트 / TableCaption component\n * 테이블의 캡션을 표시합니다.\n * Displays a table caption.\n * \n * @component\n * @param {React.HTMLAttributes<HTMLTableCaptionElement>} props - TableCaption 컴포넌트의 props / TableCaption component props\n * @param {React.Ref<HTMLTableCaptionElement>} ref - caption 요소 ref / caption element ref\n * @returns {JSX.Element} TableCaption 컴포넌트 / TableCaption component\n */\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={merge(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} "]}
1
+ {"version":3,"sources":["../src/components/Table.tsx"],"names":["Table","React","className","variant","size","props","ref","getVariantClasses","getSizeClasses","jsx","merge","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption"],"mappings":"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","file":"chunk-KYRIUUQP.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Table 컴포넌트의 props / Table component props\n * @typedef {Object} TableProps\n * @property {React.ReactNode} children - TableHeader, TableBody, TableFooter 등 / TableHeader, TableBody, TableFooter, etc.\n * @property {\"default\" | \"bordered\" | \"striped\"} [variant=\"default\"] - Table 스타일 변형 / Table style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Table 크기 / Table size\n * @extends {React.HTMLAttributes<HTMLTableElement>}\n */\nexport interface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n children: React.ReactNode\n variant?: \"default\" | \"bordered\" | \"striped\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TableHeader 컴포넌트의 props / TableHeader component props\n * @typedef {Object} TableHeaderProps\n * @property {React.ReactNode} children - TableHead 컴포넌트들 / TableHead components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableBody 컴포넌트의 props / TableBody component props\n * @typedef {Object} TableBodyProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableFooter 컴포넌트의 props / TableFooter component props\n * @typedef {Object} TableFooterProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableRow 컴포넌트의 props / TableRow component props\n * @typedef {Object} TableRowProps\n * @property {React.ReactNode} children - TableHead 또는 TableCell 컴포넌트들 / TableHead or TableCell components\n * @property {\"default\" | \"hover\"} [variant=\"default\"] - Row 스타일 변형 / Row style variant\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\n */\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n children: React.ReactNode\n variant?: \"default\" | \"hover\"\n}\n\n/**\n * TableHead 컴포넌트의 props / TableHead component props\n * @typedef {Object} TableHeadProps\n * @property {React.ReactNode} children - 헤더 셀 내용 / Header cell content\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * TableCell 컴포넌트의 props / TableCell component props\n * @typedef {Object} TableCellProps\n * @property {React.ReactNode} children - 셀 내용 / Cell content\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * Table 컴포넌트 / Table component\n * \n * 데이터를 표 형태로 표시하는 테이블 컴포넌트입니다.\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell과 함께 사용합니다.\n * \n * Table component that displays data in tabular format.\n * Used with TableHeader, TableBody, TableFooter, TableRow, TableHead, and TableCell.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>이름</TableHead>\n * <TableHead>나이</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>홍길동</TableCell>\n * <TableCell>30</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Bordered 스타일 / Bordered style\n * <Table variant=\"bordered\">\n * <TableHeader>\n * <TableRow>\n * <TableHead>항목</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>값</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Striped 스타일, 호버 효과 / Striped style with hover effect\n * <Table variant=\"striped\">\n * <TableBody>\n * <TableRow variant=\"hover\">\n * <TableCell>데이터</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @param {TableProps} props - Table 컴포넌트의 props / Table component props\n * @param {React.Ref<HTMLTableElement>} ref - table 요소 ref / table element ref\n * @returns {JSX.Element} Table 컴포넌트 / Table component\n */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, variant = \"default\", size = \"md\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"bordered\":\n return \"border border-border divide-x divide-border\"\n case \"striped\":\n return \"divide-y divide-border\"\n default:\n return \"\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-sm\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <div className=\"w-full overflow-auto\">\n <table\n ref={ref}\n className={merge(\n \"w-full caption-bottom\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n />\n </div>\n )\n }\n)\nTable.displayName = \"Table\"\n\n/**\n * TableHeader 컴포넌트 / TableHeader component\n * 테이블의 헤더 영역을 표시합니다.\n * Displays the header area of a table.\n * \n * @component\n * @param {TableHeaderProps} props - TableHeader 컴포넌트의 props / TableHeader component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - thead 요소 ref / thead element ref\n * @returns {JSX.Element} TableHeader 컴포넌트 / TableHeader component\n */\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={merge(\"[&_tr]:border-b\", className)} {...props} />\n )\n)\nTableHeader.displayName = \"TableHeader\"\n\n/**\n * TableBody 컴포넌트 / TableBody component\n * 테이블의 본문 영역을 표시합니다.\n * Displays the body area of a table.\n * \n * @component\n * @param {TableBodyProps} props - TableBody 컴포넌트의 props / TableBody component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tbody 요소 ref / tbody element ref\n * @returns {JSX.Element} TableBody 컴포넌트 / TableBody component\n */\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={merge(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n)\nTableBody.displayName = \"TableBody\"\n\n/**\n * TableFooter 컴포넌트 / TableFooter component\n * 테이블의 푸터 영역을 표시합니다.\n * Displays the footer area of a table.\n * \n * @component\n * @param {TableFooterProps} props - TableFooter 컴포넌트의 props / TableFooter component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tfoot 요소 ref / tfoot element ref\n * @returns {JSX.Element} TableFooter 컴포넌트 / TableFooter component\n */\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={merge(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableFooter.displayName = \"TableFooter\"\n\n/**\n * TableRow 컴포넌트 / TableRow component\n * 테이블의 행을 표시합니다.\n * Displays a table row.\n * \n * @component\n * @param {TableRowProps} props - TableRow 컴포넌트의 props / TableRow component props\n * @param {React.Ref<HTMLTableRowElement>} ref - tr 요소 ref / tr element ref\n * @returns {JSX.Element} TableRow 컴포넌트 / TableRow component\n */\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"hover\":\n return \"hover:bg-muted/50\"\n default:\n return \"\"\n }\n }\n\n return (\n <tr\n ref={ref}\n className={merge(\n \"border-b transition-colors data-[state=selected]:bg-muted/50\",\n getVariantClasses(),\n className\n )}\n {...props}\n />\n )\n }\n)\nTableRow.displayName = \"TableRow\"\n\n/**\n * TableHead 컴포넌트 / TableHead component\n * 테이블의 헤더 셀을 표시합니다.\n * Displays a table header cell.\n * \n * @component\n * @param {TableHeadProps} props - TableHead 컴포넌트의 props / TableHead component props\n * @param {React.Ref<HTMLTableCellElement>} ref - th 요소 ref / th element ref\n * @returns {JSX.Element} TableHead 컴포넌트 / TableHead component\n */\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={merge(\n \"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableHead.displayName = \"TableHead\"\n\n/**\n * TableCell 컴포넌트 / TableCell component\n * 테이블의 데이터 셀을 표시합니다.\n * Displays a table data cell.\n * \n * @component\n * @param {TableCellProps} props - TableCell 컴포넌트의 props / TableCell component props\n * @param {React.Ref<HTMLTableCellElement>} ref - td 요소 ref / td element ref\n * @returns {JSX.Element} TableCell 컴포넌트 / TableCell component\n */\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={merge(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n)\nTableCell.displayName = \"TableCell\"\n\n/**\n * TableCaption 컴포넌트 / TableCaption component\n * 테이블의 캡션을 표시합니다.\n * Displays a table caption.\n * \n * @component\n * @param {React.HTMLAttributes<HTMLTableCaptionElement>} props - TableCaption 컴포넌트의 props / TableCaption component props\n * @param {React.Ref<HTMLTableCaptionElement>} ref - caption 요소 ref / caption element ref\n * @returns {JSX.Element} TableCaption 컴포넌트 / TableCaption component\n */\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={merge(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} "]}
@@ -0,0 +1,73 @@
1
+ "use client";
2
+ import {b}from'./chunk-U6CTBZ2U.mjs';import W,{useRef,useState,useEffect,useCallback}from'react';import {jsxs,jsx,Fragment}from'react/jsx-runtime';var Re=W.forwardRef(({children:n,className:o,direction:e="left",speed:r=50,pauseOnHover:m=true,pauseOnClick:R=false,gap:b$1=16,gradient:x=true,gradientColor:w="hsl(var(--background))",gradientWidth:d=100,style:c,...g},T)=>{let v=useRef(null),[f,E]=useState(0),[N,k]=useState(0),[p,s]=useState(false),M=e==="left"||e==="right",X=e==="right"||e==="down";useEffect(()=>{let P=v.current;if(!P)return;let S=P.firstElementChild;if(!S)return;let B=()=>{M?E(S.offsetWidth):k(S.offsetHeight);};B();let q=new ResizeObserver(B);return q.observe(S),()=>q.disconnect()},[M,n]);let O={"--marquee-duration":`${M?f/r:N/r}s`,"--marquee-gap":`${b$1}px`},j=x?{"--gradient-color":w,"--gradient-width":`${d}px`}:{};return jsxs("div",{ref:T,className:b("relative overflow-hidden",x&&"marquee-gradient",o),style:{...c,...j},onMouseEnter:()=>m&&s(true),onMouseLeave:()=>m&&s(false),onClick:()=>R&&s(!p),...g,children:[jsxs("div",{ref:v,className:b("flex",M?"flex-row":"flex-col",p?"animate-pause":"",M?X?"animate-marquee-right":"animate-marquee-left":X?"animate-marquee-down":"animate-marquee-up"),style:O,children:[jsx("div",{className:b("flex shrink-0",M?"flex-row":"flex-col"),style:{gap:b$1},children:n}),jsx("div",{className:b("flex shrink-0",M?"flex-row":"flex-col"),style:{gap:b$1,[M?"marginLeft":"marginTop"]:b$1},"aria-hidden":"true",children:n})]}),jsx("style",{dangerouslySetInnerHTML:{__html:`
3
+ @keyframes marquee-left {
4
+ from { transform: translateX(0); }
5
+ to { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }
6
+ }
7
+ @keyframes marquee-right {
8
+ from { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }
9
+ to { transform: translateX(0); }
10
+ }
11
+ @keyframes marquee-up {
12
+ from { transform: translateY(0); }
13
+ to { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }
14
+ }
15
+ @keyframes marquee-down {
16
+ from { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }
17
+ to { transform: translateY(0); }
18
+ }
19
+ .animate-marquee-left { animation: marquee-left var(--marquee-duration) linear infinite; }
20
+ .animate-marquee-right { animation: marquee-right var(--marquee-duration) linear infinite; }
21
+ .animate-marquee-up { animation: marquee-up var(--marquee-duration) linear infinite; }
22
+ .animate-marquee-down { animation: marquee-down var(--marquee-duration) linear infinite; }
23
+ .animate-pause { animation-play-state: paused !important; }
24
+ .marquee-gradient::before, .marquee-gradient::after {
25
+ content: "";
26
+ position: absolute;
27
+ top: 0;
28
+ bottom: 0;
29
+ width: var(--gradient-width);
30
+ z-index: 10;
31
+ pointer-events: none;
32
+ }
33
+ .marquee-gradient::before {
34
+ left: 0;
35
+ background: linear-gradient(to right, var(--gradient-color), transparent);
36
+ }
37
+ .marquee-gradient::after {
38
+ right: 0;
39
+ background: linear-gradient(to left, var(--gradient-color), transparent);
40
+ }
41
+ `}})]})});Re.displayName="Marquee";var Te=W.forwardRef(({children:n,className:o,glowColor:e="rgba(120, 119, 198, 0.3)",glowSize:r=400,glowOpacity:m=.6,border:R=true,borderColor:b$1,style:x,...w},d)=>{let c=useRef(null),[g,T]=useState({x:0,y:0}),[v,f]=useState(false),E=useCallback(p=>{if(!c.current)return;let s=c.current.getBoundingClientRect();T({x:p.clientX-s.left,y:p.clientY-s.top});},[]),N={position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:"inherit",opacity:v?m:0,background:`radial-gradient(${r}px circle at ${g.x}px ${g.y}px, ${e}, transparent 40%)`,transition:"opacity 0.3s ease",pointerEvents:"none"},k=R?{position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:"inherit",opacity:v?1:0,background:`radial-gradient(${r/2}px circle at ${g.x}px ${g.y}px, ${b$1||e}, transparent 40%)`,transition:"opacity 0.3s ease",pointerEvents:"none",mask:"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",maskComposite:"exclude",WebkitMaskComposite:"xor",padding:"1px"}:{};return jsxs("div",{ref:Ee(d,c),className:b("relative overflow-hidden rounded-xl bg-card border border-border p-6","transition-all duration-300",v&&"border-transparent",o),style:x,onMouseMove:E,onMouseEnter:()=>f(true),onMouseLeave:()=>f(false),...w,children:[jsx("div",{style:N,"aria-hidden":"true"}),R&&jsx("div",{style:k,"aria-hidden":"true"}),jsx("div",{className:"relative z-10",children:n})]})});Te.displayName="GlowCard";function Ee(...n){return o=>{n.forEach(e=>{typeof e=="function"?e(o):e&&typeof e=="object"&&(e.current=o);});}}var Se=W.forwardRef(({children:n,className:o,spotlightColor:e="rgba(255, 255, 255, 0.1)",spotlightSize:r=300,gradient:m=true,gradientFrom:R="rgba(255, 255, 255, 0.05)",gradientTo:b$1="transparent",style:x,...w},d)=>{let c=useRef(null),[g,T]=useState({x:0,y:0}),[v,f]=useState(false),E=useCallback(p=>{if(!c.current)return;let s=c.current.getBoundingClientRect();T({x:p.clientX-s.left,y:p.clientY-s.top});},[]),N={position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:"inherit",opacity:v?1:0,background:`radial-gradient(${r}px circle at ${g.x}px ${g.y}px, ${e}, transparent 60%)`,transition:"opacity 0.4s ease",pointerEvents:"none"},k=m?{position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:"inherit",background:`linear-gradient(135deg, ${R} 0%, ${b$1} 100%)`,pointerEvents:"none"}:{};return jsxs("div",{ref:qe(d,c),className:b("relative overflow-hidden rounded-xl","bg-gray-900 border border-gray-800","transition-all duration-300",v&&"border-gray-700 shadow-2xl shadow-black/20",o),style:x,onMouseMove:E,onMouseEnter:()=>f(true),onMouseLeave:()=>f(false),...w,children:[m&&jsx("div",{style:k,"aria-hidden":"true"}),jsx("div",{style:N,"aria-hidden":"true"}),jsx("div",{className:"relative z-10",children:n})]})});Se.displayName="SpotlightCard";function qe(...n){return o=>{n.forEach(e=>{typeof e=="function"?e(o):e&&typeof e=="object"&&(e.current=o);});}}var Ae=["#ff0080","#7928ca","#0070f3","#00dfd8"],ze=W.forwardRef(({children:n,className:o,colors:e=Ae,speed:r=3,blur:m=true,blurAmount:R=100,type:b$1="mesh",animate:x=true,style:w,...d},c)=>{let[g,T]=useState(false),v=De(),f=x&&!v;useEffect(()=>{T(true);},[]);let E=()=>{switch(b$1){case "linear":return jsx("div",{className:"absolute inset-0",style:{background:`linear-gradient(
42
+ ${f?"var(--gradient-angle, 0deg)":"135deg"},
43
+ ${e.join(", ")}
44
+ )`,animation:f?`gradient-rotate ${r}s linear infinite`:void 0}});case "radial":return jsx("div",{className:"absolute inset-0",style:{background:`radial-gradient(
45
+ circle at ${f?"var(--gradient-x, 50%) var(--gradient-y, 50%)":"50% 50%"},
46
+ ${e.join(", ")}
47
+ )`,animation:f?`gradient-move ${r}s ease-in-out infinite`:void 0}});case "conic":return jsx("div",{className:"absolute inset-0",style:{background:`conic-gradient(
48
+ from ${f?"var(--gradient-angle, 0deg)":"0deg"} at 50% 50%,
49
+ ${e.join(", ")},
50
+ ${e[0]}
51
+ )`,animation:f?`gradient-spin ${r}s linear infinite`:void 0}});default:return g?jsx(Fragment,{children:e.map((N,k)=>{let p=360/e.length*k,s=r/e.length*k;return jsx("div",{className:"absolute rounded-full mix-blend-screen",style:{width:"60%",height:"60%",background:`radial-gradient(circle at center, ${N} 0%, transparent 70%)`,top:`${30+Math.sin(p*Math.PI/180)*20}%`,left:`${30+Math.cos(p*Math.PI/180)*20}%`,animation:f?`gradient-blob ${r}s ease-in-out infinite`:void 0,animationDelay:f?`${-s}s`:void 0}},k)})}):null}};return jsxs("div",{ref:c,className:b("relative overflow-hidden",o),style:w,...d,children:[jsx("div",{className:"absolute inset-0",style:{filter:m?`blur(${R}px)`:void 0},children:E()}),n&&jsx("div",{className:"relative z-10",children:n}),jsx("style",{dangerouslySetInnerHTML:{__html:`
52
+ @keyframes gradient-rotate {
53
+ 0% { --gradient-angle: 0deg; }
54
+ 100% { --gradient-angle: 360deg; }
55
+ }
56
+ @keyframes gradient-spin {
57
+ 0% { transform: rotate(0deg); }
58
+ 100% { transform: rotate(360deg); }
59
+ }
60
+ @keyframes gradient-move {
61
+ 0%, 100% { --gradient-x: 0%; --gradient-y: 0%; }
62
+ 25% { --gradient-x: 100%; --gradient-y: 0%; }
63
+ 50% { --gradient-x: 100%; --gradient-y: 100%; }
64
+ 75% { --gradient-x: 0%; --gradient-y: 100%; }
65
+ }
66
+ @keyframes gradient-blob {
67
+ 0%, 100% { transform: translate(0, 0) scale(1); }
68
+ 25% { transform: translate(20%, -20%) scale(1.1); }
69
+ 50% { transform: translate(0, 20%) scale(0.9); }
70
+ 75% { transform: translate(-20%, -10%) scale(1.05); }
71
+ }
72
+ `}})]})});ze.displayName="AnimatedGradient";function De(){let[n,o]=useState(false);return useEffect(()=>{let e=window.matchMedia("(prefers-reduced-motion: reduce)");o(e.matches);let r=m=>{o(m.matches);};return e.addEventListener("change",r),()=>e.removeEventListener("change",r)},[]),n}var je=W.forwardRef(({children:n,autoPlay:o=false,interval:e=5e3,loop:r=true,pauseOnHover:m=true,indicators:R="dots",indicatorPosition:b$1="bottom",showArrows:x=true,arrowPosition:w="inside",transition:d="slide",transitionDuration:c=500,onSlideChange:g,showPlayPause:T=false,playPausePosition:v="right",className:f,style:E,...N},k)=>{let p=()=>d==="slide"&&r?1:0,[s,M]=useState(p),[X,Q]=useState(!o),[O,j]=useState(false),[P,S]=useState(false),[B,q]=useState(false),[ee,te]=useState(null),[re,ne]=useState(null),ae=useRef(null),h=W.Children.count(n),K=Be(),se=useCallback(t=>d!=="slide"||!r?t:t===0?h-1:t===h+1?0:t-1,[r,h,d]),A=useCallback(t=>{if(P)return;let a=t;if(r?d!=="slide"&&(t<0?a=h-1:t>=h&&(a=0)):a=Math.max(0,Math.min(t,h-1)),a!==s){S(true),M(a);let u=r&&d==="slide"?a===0?h-1:a===h+1?0:a-1:a;g==null||g(u),setTimeout(()=>S(false),c);}},[s,h,r,P,c,d,g]);useEffect(()=>{!r||P||d!=="slide"||(s===0?setTimeout(()=>{q(true),M(h),setTimeout(()=>q(false),50);},c):s===h+1&&setTimeout(()=>{q(true),M(1),setTimeout(()=>q(false),50);},c));},[s,h,r,P,c,d]);let z=useCallback(()=>{A(s+1);},[s,A]),Y=useCallback(()=>{A(s-1);},[s,A]),fe=useCallback(()=>{j(t=>!t);},[]);useCallback(()=>{j(false);},[]);useCallback(()=>{j(true);},[]);useEffect(()=>{if(!o||X||O||K)return;let t=setInterval(z,e);return ()=>clearInterval(t)},[o,e,X,O,z,K]);let me=t=>{te(t.targetTouches[0].clientX);},ge=t=>{ne(t.targetTouches[0].clientX);},be=()=>{if(!ee||!re)return;let t=ee-re;Math.abs(t)>=50&&(t>0?z():Y()),te(null),ne(null);};useEffect(()=>{let t=u=>{u.key==="ArrowLeft"?Y():u.key==="ArrowRight"&&z();},a=ae.current;return a==null||a.addEventListener("keydown",t),()=>a==null?void 0:a.removeEventListener("keydown",t)},[z,Y]);let he=()=>{let t=K||B?0:c,a=se(s);switch(d){case "fade":return W.Children.map(n,(u,y)=>jsx("div",{className:b("absolute inset-0 w-full h-full",y===a?"z-10":"z-0"),style:{opacity:y===a?1:0,transition:`opacity ${t}ms ease-in-out`},children:u},y));case "scale":return W.Children.map(n,(u,y)=>jsx("div",{className:b("absolute inset-0 w-full h-full",y===a?"z-10":"z-0"),style:{opacity:y===a?1:0,transform:`scale(${y===a?1:.9})`,transition:`opacity ${t}ms ease-in-out, transform ${t}ms ease-in-out`},children:u},y));default:{let u=W.Children.toArray(n);return (r?[u[u.length-1],...u,u[0]]:u).map((H,D)=>jsx("div",{className:"absolute inset-0 w-full h-full",style:{transform:`translateX(${(D-s)*100}%)`,transition:B?"none":`transform ${t}ms ease-in-out`},children:H},D))}}},ie=()=>{if(R==="none")return null;let t=b$1.includes("inside"),a=b$1.includes("top"),u=se(s),y=b("flex items-center justify-center gap-2",t?b("absolute left-1/2 -translate-x-1/2 z-20",a?"top-4":"bottom-4"):b("mt-4",a&&"order-first mb-4 mt-0")),H=D=>{A(r&&d==="slide"?D+1:D);};return jsx("div",{className:y,role:"tablist",children:Array.from({length:h},(D,C)=>{let G=C===u;switch(R){case "bars":return jsx("button",{onClick:()=>H(C),className:b("h-1 rounded-full transition-all duration-300",G?"w-8 bg-white":"w-4 bg-white/50 hover:bg-white/70"),role:"tab","aria-selected":G,"aria-label":`\uC2AC\uB77C\uC774\uB4DC ${C+1}`},C);case "numbers":return jsx("button",{onClick:()=>H(C),className:b("w-8 h-8 rounded-full text-sm font-medium transition-all duration-300",G?"bg-white text-gray-900":"bg-white/30 text-white hover:bg-white/50"),role:"tab","aria-selected":G,"aria-label":`\uC2AC\uB77C\uC774\uB4DC ${C+1}`,children:C+1},C);default:return jsx("button",{onClick:()=>H(C),className:b("w-2.5 h-2.5 rounded-full transition-all duration-300",G?"bg-white scale-125":"bg-white/50 hover:bg-white/70"),role:"tab","aria-selected":G,"aria-label":`\uC2AC\uB77C\uC774\uB4DC ${C+1}`},C)}})})},ve=()=>{if(!T||!o)return null;let t=!O;return jsx("button",{onClick:fe,className:b("absolute bottom-4 z-20","w-8 h-8 rounded-full flex items-center justify-center","bg-white/80 hover:bg-white text-gray-800","transition-all duration-200","focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white",{left:"left-4",center:"left-1/2 -translate-x-1/2",right:"right-4"}[v]),"aria-label":t?"\uC77C\uC2DC\uC815\uC9C0":"\uC7AC\uC0DD",children:t?jsx(Qe,{className:"w-4 h-4"}):jsx(_e,{className:"w-4 h-4"})})},pe=()=>{if(!x||w==="hidden")return null;let t=r||s>0,a=r||s<h-1,u=b("absolute top-1/2 -translate-y-1/2 z-20","w-10 h-10 rounded-full flex items-center justify-center","bg-white/80 hover:bg-white text-gray-800","transition-all duration-200","disabled:opacity-30 disabled:cursor-not-allowed","focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white"),y=w==="outside"?"-left-14":"left-4",H=w==="outside"?"-right-14":"right-4";return jsxs(Fragment,{children:[jsx("button",{onClick:Y,disabled:!t,className:b(u,y),"aria-label":"\uC774\uC804 \uC2AC\uB77C\uC774\uB4DC",children:jsx(We,{className:"w-5 h-5"})}),jsx("button",{onClick:z,disabled:!a,className:b(u,H),"aria-label":"\uB2E4\uC74C \uC2AC\uB77C\uC774\uB4DC",children:jsx(Ye,{className:"w-5 h-5"})})]})};return jsxs("div",{ref:k,className:b("flex flex-col w-full h-full",w==="outside"&&"px-16",f),style:E,...N,children:[jsxs("div",{ref:ae,className:"relative overflow-hidden w-full flex-1",onMouseEnter:()=>m&&Q(true),onMouseLeave:()=>m&&Q(false),onTouchStart:me,onTouchMove:ge,onTouchEnd:be,tabIndex:0,role:"region","aria-roledescription":"carousel","aria-label":"\uC774\uBBF8\uC9C0 \uC2AC\uB77C\uC774\uB354",children:[he(),pe(),ve(),b$1.includes("inside")&&ie()]}),!b$1.includes("inside")&&ie()]})});je.displayName="Carousel";function Be(){let[n,o]=useState(false);return useEffect(()=>{let e=window.matchMedia("(prefers-reduced-motion: reduce)");o(e.matches);let r=m=>{o(m.matches);};return e.addEventListener("change",r),()=>e.removeEventListener("change",r)},[]),n}function We({className:n}){return jsx("svg",{className:n,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 19l-7-7 7-7"})})}function Ye({className:n}){return jsx("svg",{className:n,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})})}function _e({className:n}){return jsx("svg",{className:n,fill:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{d:"M8 5v14l11-7z"})})}function Qe({className:n}){return jsx("svg",{className:n,fill:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{d:"M6 4h4v16H6V4zm8 0h4v16h-4V4z"})})}export{Re as a,Te as b,Se as c,ze as d,je as e};//# sourceMappingURL=chunk-LSA7DU3N.mjs.map
73
+ //# sourceMappingURL=chunk-LSA7DU3N.mjs.map