@hua-labs/ui 2.1.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{ComponentLayout-DrZpz0yv.d.mts → ComponentLayout-BhM4VSoq.d.mts} +1 -1
- package/dist/advanced-dashboard.d.mts +1 -1
- package/dist/advanced-dashboard.mjs +3 -3
- package/dist/advanced-dashboard.mjs.map +1 -1
- package/dist/advanced-emotion.mjs +1 -1
- package/dist/advanced-motion.d.mts +9 -6
- package/dist/advanced-motion.mjs +1 -1
- package/dist/advanced.d.mts +3 -3
- package/dist/advanced.mjs +2 -2
- package/dist/advanced.mjs.map +1 -1
- package/dist/chunk-5DPW7SVD.mjs +4 -0
- package/dist/{chunk-AOSXB5JJ.mjs.map → chunk-5DPW7SVD.mjs.map} +1 -1
- package/dist/chunk-5L5HIPKA.mjs +3 -0
- package/dist/{chunk-3GAUTZXQ.mjs.map → chunk-5L5HIPKA.mjs.map} +1 -1
- package/dist/chunk-A5YOVVM5.mjs +3 -0
- package/dist/chunk-A5YOVVM5.mjs.map +1 -0
- package/dist/chunk-CNW22G24.mjs +13 -0
- package/dist/chunk-CNW22G24.mjs.map +1 -0
- package/dist/chunk-CW66UBQG.mjs +3 -0
- package/dist/{chunk-6HVJFEDA.mjs.map → chunk-CW66UBQG.mjs.map} +1 -1
- package/dist/chunk-EAZEI74V.mjs +3 -0
- package/dist/chunk-EAZEI74V.mjs.map +1 -0
- package/dist/chunk-EPY3432E.mjs +3 -0
- package/dist/{chunk-MDLCJASB.mjs.map → chunk-EPY3432E.mjs.map} +1 -1
- package/dist/chunk-F2M4YDDQ.mjs +3 -0
- package/dist/{chunk-OZNST3EZ.mjs.map → chunk-F2M4YDDQ.mjs.map} +1 -1
- package/dist/chunk-FHMFDCX2.mjs +3 -0
- package/dist/{chunk-4NJE7D6X.mjs.map → chunk-FHMFDCX2.mjs.map} +1 -1
- package/dist/chunk-HBIUCLFL.mjs +3 -0
- package/dist/chunk-HBIUCLFL.mjs.map +1 -0
- package/dist/chunk-HEBXAFRY.mjs +3 -0
- package/dist/{chunk-KJZGOL2Z.mjs.map → chunk-HEBXAFRY.mjs.map} +1 -1
- package/dist/chunk-IG47LMOD.mjs +3 -0
- package/dist/{chunk-42RGFEL2.mjs.map → chunk-IG47LMOD.mjs.map} +1 -1
- package/dist/chunk-J47ZEXEL.mjs +3 -0
- package/dist/{chunk-3CCF7U3P.mjs.map → chunk-J47ZEXEL.mjs.map} +1 -1
- package/dist/chunk-K2FOFIST.mjs +3 -0
- package/dist/{chunk-IJSYSNM5.mjs.map → chunk-K2FOFIST.mjs.map} +1 -1
- package/dist/chunk-LL6QPRD7.mjs +3 -0
- package/dist/{chunk-TZ4YSHMC.mjs.map → chunk-LL6QPRD7.mjs.map} +1 -1
- package/dist/chunk-NMJLOK6M.mjs +3 -0
- package/dist/{chunk-KYRIUUQP.mjs.map → chunk-NMJLOK6M.mjs.map} +1 -1
- package/dist/chunk-O24K56OS.mjs +3 -0
- package/dist/chunk-O24K56OS.mjs.map +1 -0
- package/dist/chunk-OIWG3IJ7.mjs +3 -0
- package/dist/chunk-OIWG3IJ7.mjs.map +1 -0
- package/dist/chunk-OLLU7ZFH.mjs +3 -0
- package/dist/{chunk-XL4KTJ4L.mjs.map → chunk-OLLU7ZFH.mjs.map} +1 -1
- package/dist/chunk-Q76JW7X5.mjs +73 -0
- package/dist/chunk-Q76JW7X5.mjs.map +1 -0
- package/dist/chunk-QEMPERUK.mjs +3 -0
- package/dist/chunk-QEMPERUK.mjs.map +1 -0
- package/dist/chunk-QRM66RQG.mjs +3 -0
- package/dist/{chunk-N56BUOCD.mjs.map → chunk-QRM66RQG.mjs.map} +1 -1
- package/dist/chunk-QRRP7TGF.mjs +13 -0
- package/dist/{chunk-RS6RKW5U.mjs.map → chunk-QRRP7TGF.mjs.map} +1 -1
- package/dist/chunk-SD6XGDAC.mjs +3 -0
- package/dist/chunk-SD6XGDAC.mjs.map +1 -0
- package/dist/chunk-SDFVGFXT.mjs +3 -0
- package/dist/{chunk-CVWWS25A.mjs.map → chunk-SDFVGFXT.mjs.map} +1 -1
- package/dist/chunk-SMLDNOV3.mjs +8 -0
- package/dist/{chunk-ZXZIHU7J.mjs.map → chunk-SMLDNOV3.mjs.map} +1 -1
- package/dist/{chunk-FX57OSYG.mjs → chunk-TAP6MYDW.mjs} +2 -2
- package/dist/{chunk-FX57OSYG.mjs.map → chunk-TAP6MYDW.mjs.map} +1 -1
- package/dist/{chunk-WP7VFE77.mjs → chunk-TBZ645BI.mjs} +2 -2
- package/dist/{chunk-WP7VFE77.mjs.map → chunk-TBZ645BI.mjs.map} +1 -1
- package/dist/{chunk-TXBZZJNR.mjs → chunk-V2DNYJR6.mjs} +2 -2
- package/dist/{chunk-TXBZZJNR.mjs.map → chunk-V2DNYJR6.mjs.map} +1 -1
- package/dist/{chunk-Z74YUUVT.mjs → chunk-VBABZXL7.mjs} +2 -2
- package/dist/{chunk-Z74YUUVT.mjs.map → chunk-VBABZXL7.mjs.map} +1 -1
- package/dist/chunk-WYBSHTGY.mjs +3 -0
- package/dist/{chunk-DYNBM24D.mjs.map → chunk-WYBSHTGY.mjs.map} +1 -1
- package/dist/chunk-ZQUMJQYV.mjs +3 -0
- package/dist/chunk-ZQUMJQYV.mjs.map +1 -0
- package/dist/chunk-ZY23NOT4.mjs +3 -0
- package/dist/chunk-ZY23NOT4.mjs.map +1 -0
- package/dist/components/Action.d.ts.map +1 -1
- package/dist/components/Badge.d.ts +1 -1
- package/dist/components/Button.d.ts.map +1 -1
- package/dist/components/DatePicker.d.ts.map +1 -1
- package/dist/components/Dropdown.d.ts +0 -50
- package/dist/components/Dropdown.d.ts.map +1 -1
- package/dist/components/Icon/Icon.d.ts.map +1 -1
- package/dist/components/Modal.d.ts.map +1 -1
- package/dist/components/Popover.d.ts.map +1 -1
- package/dist/components/Progress.d.ts +2 -2
- package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
- package/dist/components/advanced/Carousel.d.ts.map +1 -1
- package/dist/components/advanced/ImageReveal.d.ts.map +1 -1
- package/dist/components/advanced/Parallax.d.ts +9 -6
- package/dist/components/advanced/Parallax.d.ts.map +1 -1
- package/dist/components/advanced/TextReveal.d.ts.map +1 -1
- package/dist/data.mjs +2 -2
- package/dist/data.mjs.map +1 -1
- package/dist/feedback.mjs +1 -1
- package/dist/form.mjs +4 -4
- package/dist/form.mjs.map +1 -1
- package/dist/{icons-DmhQEH_E.d.mts → icons-DcOBy9Hf.d.mts} +4 -0
- package/dist/iconsax-extended.mjs +2 -2
- package/dist/iconsax-extended.mjs.map +1 -1
- package/dist/index.d.mts +6 -87
- package/dist/index.mjs +14 -14
- package/dist/index.mjs.map +1 -1
- package/dist/interactive.mjs +1 -1
- package/dist/interactive.mjs.map +1 -1
- package/dist/landing.mjs +7 -7
- package/dist/landing.mjs.map +1 -1
- package/dist/lib/icon-providers.d.ts +9 -25
- package/dist/lib/icon-providers.d.ts.map +1 -1
- package/dist/lib/icons.d.ts +4 -0
- package/dist/lib/icons.d.ts.map +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/navigation.d.mts +1 -1
- package/dist/navigation.mjs +1 -1
- package/dist/navigation.mjs.map +1 -1
- package/dist/overlay.d.mts +0 -50
- package/dist/overlay.mjs +1 -1
- package/dist/overlay.mjs.map +1 -1
- package/dist/sdui.mjs +1 -1
- package/dist/sdui.mjs.map +1 -1
- package/dist/theme.d.mts +85 -0
- package/dist/theme.d.ts +14 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.mjs +3 -0
- package/dist/theme.mjs.map +1 -0
- package/package.json +18 -14
- package/dist/advanced-dashboard.js +0 -39
- package/dist/advanced-dashboard.js.map +0 -1
- package/dist/advanced-emotion.js +0 -2
- package/dist/advanced-emotion.js.map +0 -1
- package/dist/advanced-motion.js +0 -82
- package/dist/advanced-motion.js.map +0 -1
- package/dist/advanced.js +0 -112
- package/dist/advanced.js.map +0 -1
- package/dist/chunk-3CCF7U3P.mjs +0 -3
- package/dist/chunk-3GAUTZXQ.mjs +0 -3
- package/dist/chunk-42RGFEL2.mjs +0 -3
- package/dist/chunk-4NJE7D6X.mjs +0 -3
- package/dist/chunk-6HVJFEDA.mjs +0 -3
- package/dist/chunk-7OYT3QSY.mjs +0 -3
- package/dist/chunk-7OYT3QSY.mjs.map +0 -1
- package/dist/chunk-ANYZ56VB.mjs +0 -3
- package/dist/chunk-ANYZ56VB.mjs.map +0 -1
- package/dist/chunk-AOSXB5JJ.mjs +0 -4
- package/dist/chunk-B544MRF7.mjs +0 -3
- package/dist/chunk-B544MRF7.mjs.map +0 -1
- package/dist/chunk-CVWWS25A.mjs +0 -3
- package/dist/chunk-DYNBM24D.mjs +0 -3
- package/dist/chunk-IJSYSNM5.mjs +0 -3
- package/dist/chunk-KJZGOL2Z.mjs +0 -3
- package/dist/chunk-KYRIUUQP.mjs +0 -3
- package/dist/chunk-LSA7DU3N.mjs +0 -73
- package/dist/chunk-LSA7DU3N.mjs.map +0 -1
- package/dist/chunk-MDLCJASB.mjs +0 -3
- package/dist/chunk-N56BUOCD.mjs +0 -3
- package/dist/chunk-OFYITQXI.mjs +0 -13
- package/dist/chunk-OFYITQXI.mjs.map +0 -1
- package/dist/chunk-OZNST3EZ.mjs +0 -3
- package/dist/chunk-RS6RKW5U.mjs +0 -13
- package/dist/chunk-TZ4YSHMC.mjs +0 -3
- package/dist/chunk-U6CTBZ2U.mjs +0 -3
- package/dist/chunk-U6CTBZ2U.mjs.map +0 -1
- package/dist/chunk-XCZMLKPK.mjs +0 -3
- package/dist/chunk-XCZMLKPK.mjs.map +0 -1
- package/dist/chunk-XGHT7WMO.mjs +0 -3
- package/dist/chunk-XGHT7WMO.mjs.map +0 -1
- package/dist/chunk-XL4KTJ4L.mjs +0 -3
- package/dist/chunk-ZXZIHU7J.mjs +0 -8
- package/dist/data.js +0 -3
- package/dist/data.js.map +0 -1
- package/dist/feedback.js +0 -12
- package/dist/feedback.js.map +0 -1
- package/dist/form.js +0 -8
- package/dist/form.js.map +0 -1
- package/dist/iconsax-extended.js +0 -3
- package/dist/iconsax-extended.js.map +0 -1
- package/dist/iconsax.js +0 -3
- package/dist/iconsax.js.map +0 -1
- package/dist/index.js +0 -51
- package/dist/index.js.map +0 -1
- package/dist/interactive.js +0 -2
- package/dist/interactive.js.map +0 -1
- package/dist/landing.js +0 -100
- package/dist/landing.js.map +0 -1
- package/dist/lib/phosphor-icons.d.ts +0 -6
- package/dist/lib/phosphor-icons.d.ts.map +0 -1
- package/dist/navigation.js +0 -12
- package/dist/navigation.js.map +0 -1
- package/dist/overlay.js +0 -3
- package/dist/overlay.js.map +0 -1
- package/dist/sdui.js +0 -9
- package/dist/sdui.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/advanced/emotion/EmotionMeter.tsx","../src/components/advanced/emotion/EmotionButton.tsx","../src/components/advanced/emotion/EmotionSelector.tsx","../src/components/advanced/emotion/EmotionAnalysis.tsx"],"names":["EmotionMeter","React","className","value","max","size","color","props","ref","sizeClasses","emotionColors","percentage","jsx","merge","EmotionButton","emotion","isSelected","defaultEmotions","EmotionSelector","selectedEmotion","onEmotionSelect","layout","showIntensity","intensity","onIntensityChange","emotions","variant","handleEmotionClick","emotionKey","renderEmotionItem","jsxs","layoutClasses","e","EmotionAnalysis","primaryEmotion","emotionDistribution","keywords","positivity","energy","showMeter","showDistribution","showKeywords","showMetrics","getIntensityLabel","getPositivityLabel","getEnergyLabel","Fragment","keyword","Badge","Card","CardHeader","CardTitle","CardDescription","CardContent","item","index"],"mappings":"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","file":"chunk-WP7VFE77.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from '../../../lib/utils';\nimport type { Color } from '../../../lib/types/common';\n\n/**\n * EmotionMeter 컴포넌트의 props / EmotionMeter component props\n * @typedef {Object} EmotionMeterProps\n * @property {number} value - 감정 강도 값 (0-max) / Emotion intensity value (0-max)\n * @property {number} [max=100] - 최대값 / Maximum value\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 미터 크기 / Meter size\n * @property {\"blue\" | \"green\" | \"yellow\" | \"red\"} [color=\"blue\"] - 미터 색상 / Meter color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface EmotionMeterProps extends React.HTMLAttributes<HTMLDivElement> {\n value: number\n max?: number\n size?: \"sm\" | \"md\" | \"lg\"\n color?: \"blue\" | \"green\" | \"yellow\" | \"red\" | Color\n}\n\n/**\n * EmotionMeter 컴포넌트 / EmotionMeter component\n *\n * 감정 강도를 표시하는 미터 컴포넌트입니다.\n * Progress 컴포넌트와 유사하지만 감정 분석에 특화되어 있습니다.\n *\n * Meter component that displays emotion intensity.\n * Similar to Progress component but specialized for emotion analysis.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionMeter value={75} />\n *\n * @example\n * // 다양한 색상 / Various colors\n * <EmotionMeter\n * value={80}\n * color=\"green\"\n * size=\"lg\"\n * />\n *\n * @param {EmotionMeterProps} props - EmotionMeter 컴포넌트의 props / EmotionMeter component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionMeter 컴포넌트 / EmotionMeter component\n */\nconst EmotionMeter = React.forwardRef<HTMLDivElement, EmotionMeterProps>(\n ({ className, value, max = 100, size = \"md\", color = \"blue\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"h-2\",\n md: \"h-3\",\n lg: \"h-4\"\n }\n\n // EmotionMeter는 특정 색상만 사용 (감정 분석 특화)\n const emotionColors: Record<string, string> = {\n blue: \"bg-indigo-500\",\n green: \"bg-green-500\",\n yellow: \"bg-yellow-500\",\n red: \"bg-red-500\",\n // 추가 색상 지원\n purple: \"bg-purple-500\",\n orange: \"bg-orange-500\",\n indigo: \"bg-indigo-500\",\n pink: \"bg-pink-500\",\n gray: \"bg-gray-500\",\n }\n\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n return (\n <div\n ref={ref}\n className={merge(\n \"w-full bg-muted rounded-full\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n <div\n className={merge(\n \"h-full rounded-full transition-all duration-300\",\n emotionColors[color] || emotionColors.blue\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n )\n }\n)\nEmotionMeter.displayName = \"EmotionMeter\"\n\nexport { EmotionMeter }\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from '../../../lib/utils';\n\n/**\n * EmotionButton 컴포넌트의 props / EmotionButton component props\n * @typedef {Object} EmotionButtonProps\n * @property {string} emotion - 감정 이모지 또는 텍스트 / Emotion emoji or text\n * @property {boolean} [isSelected=false] - 선택 상태 / Selected state\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 버튼 크기 / Button size\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface EmotionButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n emotion: string\n isSelected?: boolean\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * EmotionButton 컴포넌트 / EmotionButton component\n *\n * 감정을 선택하는 버튼 컴포넌트입니다.\n * 이모지나 텍스트로 감정을 표시하며, 선택 상태를 지원합니다.\n *\n * Button component for selecting emotions.\n * Displays emotion as emoji or text and supports selected state.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionButton emotion=\"😊\" />\n *\n * @example\n * // 선택 상태 / Selected state\n * <EmotionButton\n * emotion=\"😊\"\n * isSelected\n * size=\"lg\"\n * />\n *\n * @param {EmotionButtonProps} props - EmotionButton 컴포넌트의 props / EmotionButton component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} EmotionButton 컴포넌트 / EmotionButton component\n */\nconst EmotionButton = React.forwardRef<HTMLButtonElement, EmotionButtonProps>(\n ({ className, emotion, isSelected = false, size = \"md\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"w-8 h-8 text-sm\",\n md: \"w-12 h-12 text-lg\",\n lg: \"w-16 h-16 text-xl\"\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"rounded-full border-2 transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-1 focus:ring-ring\",\n sizeClasses[size],\n isSelected\n ? \"border-indigo-500 bg-indigo-50 dark:bg-indigo-900/20\"\n : \"border-border bg-background\",\n className\n )}\n {...props}\n >\n {emotion}\n </button>\n )\n }\n)\nEmotionButton.displayName = \"EmotionButton\"\n\nexport { EmotionButton }\n","'use client'\n\nimport React from \"react\"\nimport { EmotionButton } from \"./EmotionButton\"\nimport { EmotionMeter } from \"./EmotionMeter\"\nimport { merge } from '../../../lib/utils';\n\n/**\n * EmotionSelector 컴포넌트의 props / EmotionSelector component props\n * @typedef {Object} EmotionSelectorProps\n * @property {string} [selectedEmotion] - 선택된 감정 키 / Selected emotion key\n * @property {(emotion: string) => void} [onEmotionSelect] - 감정 선택 콜백 / Emotion selection callback\n * @property {\"grid\" | \"list\" | \"compact\"} [layout=\"grid\"] - 레이아웃 타입 / Layout type\n * @property {boolean} [showIntensity=false] - 강도 조절 표시 여부 / Show intensity control\n * @property {number} [intensity=50] - 감정 강도 (0-100) / Emotion intensity (0-100)\n * @property {(intensity: number) => void} [onIntensityChange] - 강도 변경 콜백 / Intensity change callback\n * @property {Array<Object>} [emotions] - 감정 목록 / Emotions list\n * @property {string} emotions[].key - 감정 키 / Emotion key\n * @property {string} emotions[].label - 감정 라벨 / Emotion label\n * @property {string} [emotions[].icon] - 감정 아이콘 / Emotion icon\n * @property {string} [emotions[].color] - 감정 색상 / Emotion color\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 감정 버튼 크기 / Emotion button size\n * @property {\"button\" | \"card\" | \"chip\"} [variant=\"button\"] - 감정 표시 스타일 / Emotion display style\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface EmotionSelectorProps extends React.HTMLAttributes<HTMLDivElement> {\n selectedEmotion?: string\n onEmotionSelect?: (emotion: string) => void\n layout?: \"grid\" | \"list\" | \"compact\"\n showIntensity?: boolean\n intensity?: number\n onIntensityChange?: (intensity: number) => void\n emotions?: Array<{\n key: string\n label: string\n icon?: string\n color?: string\n }>\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"button\" | \"card\" | \"chip\"\n}\n\nconst defaultEmotions = [\n { key: \"joy\", label: \"기쁨\", icon: \"smile\", color: \"yellow\" },\n { key: \"sadness\", label: \"슬픔\", icon: \"frown\", color: \"blue\" },\n { key: \"anger\", label: \"화남\", icon: \"angry\", color: \"red\" },\n { key: \"calm\", label: \"평온\", icon: \"heart\", color: \"green\" },\n { key: \"excitement\", label: \"설렘\", icon: \"star\", color: \"pink\" },\n { key: \"worry\", label: \"걱정\", icon: \"meh\", color: \"gray\" },\n { key: \"gratitude\", label: \"감사\", icon: \"heart\", color: \"purple\" },\n { key: \"loneliness\", label: \"외로움\", icon: \"user\", color: \"indigo\" }\n]\n\n/**\n * EmotionSelector 컴포넌트 / EmotionSelector component\n *\n * 감정을 선택하는 컴포넌트입니다.\n * 여러 감정 옵션을 제공하며, 강도 조절 기능을 포함할 수 있습니다.\n *\n * Component for selecting emotions.\n * Provides multiple emotion options and can include intensity control.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionSelector\n * selectedEmotion=\"joy\"\n * onEmotionSelect={(emotion) => console.log(emotion)}\n * />\n *\n * @example\n * // 강도 조절 포함 / With intensity control\n * <EmotionSelector\n * selectedEmotion=\"calm\"\n * onEmotionSelect={handleEmotionSelect}\n * showIntensity\n * intensity={intensity}\n * onIntensityChange={setIntensity}\n * variant=\"card\"\n * />\n *\n * @param {EmotionSelectorProps} props - EmotionSelector 컴포넌트의 props / EmotionSelector component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionSelector 컴포넌트 / EmotionSelector component\n */\nconst EmotionSelector = React.forwardRef<HTMLDivElement, EmotionSelectorProps>(\n ({\n className,\n selectedEmotion,\n onEmotionSelect,\n layout = \"grid\",\n showIntensity = false,\n intensity = 50,\n onIntensityChange,\n emotions = defaultEmotions,\n size = \"md\",\n variant = \"button\",\n ...props\n }, ref) => {\n const handleEmotionClick = (emotionKey: string) => {\n onEmotionSelect?.(emotionKey)\n }\n\n const renderEmotionItem = (emotion: typeof emotions[0]) => {\n const isSelected = selectedEmotion === emotion.key\n\n if (variant === \"button\") {\n return (\n <EmotionButton\n key={emotion.key}\n emotion={emotion.key}\n isSelected={isSelected}\n size={size}\n onClick={() => handleEmotionClick(emotion.key)}\n className={merge(\n \"transition-all duration-200\",\n isSelected && \"ring-1 ring-offset-2 ring-primary\"\n )}\n >\n {emotion.label}\n </EmotionButton>\n )\n }\n\n if (variant === \"card\") {\n return (\n <div\n key={emotion.key}\n className={merge(\n \"p-4 rounded-lg border-2 cursor-pointer transition-all duration-200 hover:shadow-md\",\n isSelected\n ? \"border-primary bg-primary/5\"\n : \"border-border hover:border-primary/50\"\n )}\n onClick={() => handleEmotionClick(emotion.key)}\n >\n <div className=\"flex items-center space-x-3\">\n <div className={merge(\n \"w-8 h-8 rounded-full flex items-center justify-center\",\n isSelected ? \"bg-primary text-primary-foreground\" : \"bg-muted\"\n )}>\n {emotion.icon && (\n <span className=\"text-lg\">\n {emotion.icon === \"smile\" && \"😊\"}\n {emotion.icon === \"frown\" && \"😢\"}\n {emotion.icon === \"angry\" && \"😠\"}\n {emotion.icon === \"heart\" && \"❤️\"}\n {emotion.icon === \"star\" && \"⭐\"}\n {emotion.icon === \"meh\" && \"😐\"}\n {emotion.icon === \"user\" && \"👤\"}\n </span>\n )}\n </div>\n <span className=\"font-medium truncate max-w-[120px]\">{emotion.label}</span>\n </div>\n </div>\n )\n }\n\n if (variant === \"chip\") {\n return (\n <div\n key={emotion.key}\n className={merge(\n \"px-3 py-1 rounded-full cursor-pointer transition-all duration-200 text-sm font-medium\",\n isSelected\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted hover:bg-muted/80\"\n )}\n onClick={() => handleEmotionClick(emotion.key)}\n >\n <span className=\"truncate max-w-[100px]\">{emotion.label}</span>\n </div>\n )\n }\n\n return null\n }\n\n const layoutClasses = {\n grid: \"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2 md:gap-3\",\n list: \"space-y-2\",\n compact: \"flex flex-wrap gap-1\"\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)}\n {...props}\n >\n <div className={layoutClasses[layout]}>\n {emotions.map(renderEmotionItem)}\n </div>\n\n {showIntensity && selectedEmotion && (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">감정 강도</span>\n <span className=\"text-sm text-muted-foreground\">{intensity}%</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={intensity}\n onChange={(e) => onIntensityChange?.(Number(e.target.value))}\n className=\"w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider\"\n />\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>약함</span>\n <span>보통</span>\n <span>강함</span>\n </div>\n </div>\n )}\n\n {selectedEmotion && showIntensity && (\n <div className=\"flex justify-center\">\n <EmotionMeter\n value={intensity}\n size=\"md\"\n color=\"blue\"\n />\n </div>\n )}\n </div>\n )\n }\n)\n\nEmotionSelector.displayName = \"EmotionSelector\"\n\nexport { EmotionSelector }\nexport type { EmotionSelectorProps }\n","'use client'\n\nimport React from \"react\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../Card';\nimport { Badge } from '../../Badge';\nimport { merge } from '../../../lib/utils';\nimport { EmotionMeter } from \"./EmotionMeter\"\n\n/**\n * EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\n * @typedef {Object} EmotionAnalysisProps\n * @property {Object} [primaryEmotion] - 주요 감정 정보 / Primary emotion information\n * @property {string} primaryEmotion.name - 감정 이름 / Emotion name\n * @property {number} primaryEmotion.intensity - 감정 강도 (0-100) / Emotion intensity (0-100)\n * @property {string} [primaryEmotion.color] - 감정 색상 / Emotion color\n * @property {Array<Object>} [emotionDistribution] - 감정 분포 배열 / Emotion distribution array\n * @property {string} emotionDistribution[].emotion - 감정 이름 / Emotion name\n * @property {number} emotionDistribution[].percentage - 감정 비율 (0-100) / Emotion percentage (0-100)\n * @property {string} emotionDistribution[].color - 감정 색상 / Emotion color\n * @property {string[]} [keywords] - 키워드 배열 / Keywords array\n * @property {number} [intensity=50] - 전체 강도 (0-100) / Overall intensity (0-100)\n * @property {number} [positivity=70] - 긍정성 (0-100) / Positivity (0-100)\n * @property {number} [energy=60] - 에너지 (0-100) / Energy (0-100)\n * @property {boolean} [showMeter=true] - 강도 미터 표시 여부 / Show intensity meter\n * @property {boolean} [showDistribution=true] - 분포 표시 여부 / Show distribution\n * @property {boolean} [showKeywords=true] - 키워드 표시 여부 / Show keywords\n * @property {boolean} [showMetrics=true] - 메트릭 표시 여부 / Show metrics\n * @property {\"compact\" | \"detailed\" | \"card\"} [layout=\"detailed\"] - 레이아웃 타입 / Layout type\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface EmotionAnalysisProps extends React.HTMLAttributes<HTMLDivElement> {\n primaryEmotion?: {\n name: string\n intensity: number\n color?: string\n }\n emotionDistribution?: Array<{\n emotion: string\n percentage: number\n color: string\n }>\n keywords?: string[]\n intensity?: number\n positivity?: number\n energy?: number\n showMeter?: boolean\n showDistribution?: boolean\n showKeywords?: boolean\n showMetrics?: boolean\n layout?: \"compact\" | \"detailed\" | \"card\"\n}\n\n/**\n * EmotionAnalysis 컴포넌트 / EmotionAnalysis component\n *\n * 감정 분석 결과를 표시하는 컴포넌트입니다.\n * 주요 감정, 감정 분포, 키워드, 메트릭(강도, 긍정성, 에너지)을 표시할 수 있습니다.\n *\n * Component that displays emotion analysis results.\n * Can display primary emotion, emotion distribution, keywords, and metrics (intensity, positivity, energy).\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionAnalysis\n * primaryEmotion={{ name: \"기쁨\", intensity: 80 }}\n * keywords={[\"행복\", \"만족\"]}\n * />\n *\n * @example\n * // 상세 레이아웃 / Detailed layout\n * <EmotionAnalysis\n * primaryEmotion={{ name: \"평온\", intensity: 65, color: \"green\" }}\n * emotionDistribution={[\n * { emotion: \"기쁨\", percentage: 40, color: \"yellow\" },\n * { emotion: \"평온\", percentage: 60, color: \"green\" }\n * ]}\n * keywords={[\"안정\", \"편안\"]}\n * intensity={65}\n * positivity={75}\n * energy={50}\n * layout=\"detailed\"\n * />\n *\n * @param {EmotionAnalysisProps} props - EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionAnalysis 컴포넌트 / EmotionAnalysis component\n */\nconst EmotionAnalysis = React.forwardRef<HTMLDivElement, EmotionAnalysisProps>(\n ({\n className,\n primaryEmotion,\n emotionDistribution = [],\n keywords = [],\n intensity = 50,\n positivity = 70,\n energy = 60,\n showMeter = true,\n showDistribution = true,\n showKeywords = true,\n showMetrics = true,\n layout = \"detailed\",\n ...props\n }, ref) => {\n const getIntensityLabel = (value: number) => {\n if (value < 30) return \"약함\"\n if (value < 70) return \"보통\"\n return \"강함\"\n }\n\n const getPositivityLabel = (value: number) => {\n if (value < 30) return \"부정적\"\n if (value < 70) return \"중립적\"\n return \"긍정적\"\n }\n\n const getEnergyLabel = (value: number) => {\n if (value < 30) return \"낮음\"\n if (value < 70) return \"보통\"\n return \"높음\"\n }\n\n if (layout === \"compact\") {\n return (\n <div\n ref={ref}\n className={merge(\"space-y-3\", className)}\n {...props}\n >\n {primaryEmotion && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">주요 감정:</span>\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-sm text-muted-foreground\">\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\n </span>\n {showMeter && (\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"sm\"\n color=\"blue\"\n />\n )}\n </div>\n </div>\n )}\n\n {showMetrics && (\n <>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">감정 강도:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getIntensityLabel(intensity)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">긍정성:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getPositivityLabel(positivity)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">에너지:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getEnergyLabel(energy)}\n </span>\n </div>\n </>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div>\n <span className=\"text-sm font-medium\">키워드:</span>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n\n if (layout === \"card\") {\n return (\n <Card\n ref={ref}\n className={merge(\"\", className)}\n {...props}\n >\n <CardHeader>\n <CardTitle className=\"flex items-center\">\n <span className=\"text-2xl mr-2\">✨</span>\n AI 분석\n </CardTitle>\n <CardDescription>\n 감정 분석 결과\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {primaryEmotion && (\n <div className=\"space-y-3\">\n <div className=\"text-sm\">\n <span className=\"font-medium\">주요 감정:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\n </span>\n </div>\n {showMeter && (\n <div className=\"flex justify-center\">\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"md\"\n color=\"blue\"\n />\n </div>\n )}\n </div>\n )}\n\n {showMetrics && (\n <>\n <div className=\"text-sm\">\n <span className=\"font-medium\">감정 강도:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getIntensityLabel(intensity)}\n </span>\n </div>\n <div className=\"text-sm\">\n <span className=\"font-medium\">긍정성:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getPositivityLabel(positivity)}\n </span>\n </div>\n <div className=\"text-sm\">\n <span className=\"font-medium\">에너지:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getEnergyLabel(energy)}\n </span>\n </div>\n </>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div className=\"text-sm\">\n <span className=\"font-medium\">키워드:</span>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n )\n }\n\n // detailed layout (default)\n return (\n <div\n ref={ref}\n className={merge(\"space-y-6\", className)}\n {...props}\n >\n {primaryEmotion && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">주요 감정</h3>\n <div className=\"flex items-center space-x-4\">\n <div className=\"text-center\">\n <div className=\"text-2xl font-bold text-primary\">\n {primaryEmotion.name}\n </div>\n <div className=\"text-sm text-muted-foreground\">\n {primaryEmotion.intensity}% 강도\n </div>\n </div>\n {showMeter && (\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"lg\"\n color=\"blue\"\n />\n )}\n </div>\n </div>\n )}\n\n {showDistribution && emotionDistribution.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">감정 분포</h3>\n <div className=\"space-y-3\">\n {emotionDistribution.map((item, index) => (\n <div key={index} className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">{item.emotion}</span>\n <span className=\"text-sm text-muted-foreground\">\n {item.percentage}%\n </span>\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className={`${item.color} h-2 rounded-full transition-all duration-300`}\n style={{ width: `${item.percentage}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {showMetrics && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">분석 지표</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">감정 강도</div>\n <div className=\"text-2xl font-bold text-primary\">\n {getIntensityLabel(intensity)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full transition-all duration-300\"\n style={{ width: `${intensity}%` }}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">긍정성</div>\n <div className=\"text-2xl font-bold text-green-600\">\n {getPositivityLabel(positivity)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-green-500 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${positivity}%` }}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">에너지</div>\n <div className=\"text-2xl font-bold text-orange-600\">\n {getEnergyLabel(energy)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-orange-500 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${energy}%` }}\n />\n </div>\n </div>\n </div>\n </div>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">감정 키워드</h3>\n <div className=\"flex flex-wrap gap-2\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"outline\" className=\"text-sm\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\n\nEmotionAnalysis.displayName = \"EmotionAnalysis\"\n\nexport { EmotionAnalysis }\nexport type { EmotionAnalysisProps }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/advanced/emotion/EmotionMeter.tsx","../src/components/advanced/emotion/EmotionButton.tsx","../src/components/advanced/emotion/EmotionSelector.tsx","../src/components/advanced/emotion/EmotionAnalysis.tsx"],"names":["EmotionMeter","React","className","value","max","size","color","props","ref","sizeClasses","emotionColors","percentage","jsx","merge","EmotionButton","emotion","isSelected","defaultEmotions","EmotionSelector","selectedEmotion","onEmotionSelect","layout","showIntensity","intensity","onIntensityChange","emotions","variant","handleEmotionClick","emotionKey","renderEmotionItem","jsxs","layoutClasses","e","EmotionAnalysis","primaryEmotion","emotionDistribution","keywords","positivity","energy","showMeter","showDistribution","showKeywords","showMetrics","getIntensityLabel","getPositivityLabel","getEnergyLabel","Fragment","keyword","Badge","Card","CardHeader","CardTitle","CardDescription","CardContent","item","index"],"mappings":"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","file":"chunk-TBZ645BI.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from '../../../lib/utils';\nimport type { Color } from '../../../lib/types/common';\n\n/**\n * EmotionMeter 컴포넌트의 props / EmotionMeter component props\n * @typedef {Object} EmotionMeterProps\n * @property {number} value - 감정 강도 값 (0-max) / Emotion intensity value (0-max)\n * @property {number} [max=100] - 최대값 / Maximum value\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 미터 크기 / Meter size\n * @property {\"blue\" | \"green\" | \"yellow\" | \"red\"} [color=\"blue\"] - 미터 색상 / Meter color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface EmotionMeterProps extends React.HTMLAttributes<HTMLDivElement> {\n value: number\n max?: number\n size?: \"sm\" | \"md\" | \"lg\"\n color?: \"blue\" | \"green\" | \"yellow\" | \"red\" | Color\n}\n\n/**\n * EmotionMeter 컴포넌트 / EmotionMeter component\n *\n * 감정 강도를 표시하는 미터 컴포넌트입니다.\n * Progress 컴포넌트와 유사하지만 감정 분석에 특화되어 있습니다.\n *\n * Meter component that displays emotion intensity.\n * Similar to Progress component but specialized for emotion analysis.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionMeter value={75} />\n *\n * @example\n * // 다양한 색상 / Various colors\n * <EmotionMeter\n * value={80}\n * color=\"green\"\n * size=\"lg\"\n * />\n *\n * @param {EmotionMeterProps} props - EmotionMeter 컴포넌트의 props / EmotionMeter component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionMeter 컴포넌트 / EmotionMeter component\n */\nconst EmotionMeter = React.forwardRef<HTMLDivElement, EmotionMeterProps>(\n ({ className, value, max = 100, size = \"md\", color = \"blue\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"h-2\",\n md: \"h-3\",\n lg: \"h-4\"\n }\n\n // EmotionMeter는 특정 색상만 사용 (감정 분석 특화)\n const emotionColors: Record<string, string> = {\n blue: \"bg-indigo-500\",\n green: \"bg-green-500\",\n yellow: \"bg-yellow-500\",\n red: \"bg-red-500\",\n // 추가 색상 지원\n purple: \"bg-purple-500\",\n orange: \"bg-orange-500\",\n indigo: \"bg-indigo-500\",\n pink: \"bg-pink-500\",\n gray: \"bg-gray-500\",\n }\n\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n return (\n <div\n ref={ref}\n className={merge(\n \"w-full bg-muted rounded-full\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n <div\n className={merge(\n \"h-full rounded-full transition-all duration-300\",\n emotionColors[color] || emotionColors.blue\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n )\n }\n)\nEmotionMeter.displayName = \"EmotionMeter\"\n\nexport { EmotionMeter }\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from '../../../lib/utils';\n\n/**\n * EmotionButton 컴포넌트의 props / EmotionButton component props\n * @typedef {Object} EmotionButtonProps\n * @property {string} emotion - 감정 이모지 또는 텍스트 / Emotion emoji or text\n * @property {boolean} [isSelected=false] - 선택 상태 / Selected state\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 버튼 크기 / Button size\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface EmotionButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n emotion: string\n isSelected?: boolean\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * EmotionButton 컴포넌트 / EmotionButton component\n *\n * 감정을 선택하는 버튼 컴포넌트입니다.\n * 이모지나 텍스트로 감정을 표시하며, 선택 상태를 지원합니다.\n *\n * Button component for selecting emotions.\n * Displays emotion as emoji or text and supports selected state.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionButton emotion=\"😊\" />\n *\n * @example\n * // 선택 상태 / Selected state\n * <EmotionButton\n * emotion=\"😊\"\n * isSelected\n * size=\"lg\"\n * />\n *\n * @param {EmotionButtonProps} props - EmotionButton 컴포넌트의 props / EmotionButton component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} EmotionButton 컴포넌트 / EmotionButton component\n */\nconst EmotionButton = React.forwardRef<HTMLButtonElement, EmotionButtonProps>(\n ({ className, emotion, isSelected = false, size = \"md\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"w-8 h-8 text-sm\",\n md: \"w-12 h-12 text-lg\",\n lg: \"w-16 h-16 text-xl\"\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"rounded-full border-2 transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-1 focus:ring-ring\",\n sizeClasses[size],\n isSelected\n ? \"border-indigo-500 bg-indigo-50 dark:bg-indigo-900/20\"\n : \"border-border bg-background\",\n className\n )}\n {...props}\n >\n {emotion}\n </button>\n )\n }\n)\nEmotionButton.displayName = \"EmotionButton\"\n\nexport { EmotionButton }\n","'use client'\n\nimport React from \"react\"\nimport { EmotionButton } from \"./EmotionButton\"\nimport { EmotionMeter } from \"./EmotionMeter\"\nimport { merge } from '../../../lib/utils';\n\n/**\n * EmotionSelector 컴포넌트의 props / EmotionSelector component props\n * @typedef {Object} EmotionSelectorProps\n * @property {string} [selectedEmotion] - 선택된 감정 키 / Selected emotion key\n * @property {(emotion: string) => void} [onEmotionSelect] - 감정 선택 콜백 / Emotion selection callback\n * @property {\"grid\" | \"list\" | \"compact\"} [layout=\"grid\"] - 레이아웃 타입 / Layout type\n * @property {boolean} [showIntensity=false] - 강도 조절 표시 여부 / Show intensity control\n * @property {number} [intensity=50] - 감정 강도 (0-100) / Emotion intensity (0-100)\n * @property {(intensity: number) => void} [onIntensityChange] - 강도 변경 콜백 / Intensity change callback\n * @property {Array<Object>} [emotions] - 감정 목록 / Emotions list\n * @property {string} emotions[].key - 감정 키 / Emotion key\n * @property {string} emotions[].label - 감정 라벨 / Emotion label\n * @property {string} [emotions[].icon] - 감정 아이콘 / Emotion icon\n * @property {string} [emotions[].color] - 감정 색상 / Emotion color\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 감정 버튼 크기 / Emotion button size\n * @property {\"button\" | \"card\" | \"chip\"} [variant=\"button\"] - 감정 표시 스타일 / Emotion display style\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface EmotionSelectorProps extends React.HTMLAttributes<HTMLDivElement> {\n selectedEmotion?: string\n onEmotionSelect?: (emotion: string) => void\n layout?: \"grid\" | \"list\" | \"compact\"\n showIntensity?: boolean\n intensity?: number\n onIntensityChange?: (intensity: number) => void\n emotions?: Array<{\n key: string\n label: string\n icon?: string\n color?: string\n }>\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"button\" | \"card\" | \"chip\"\n}\n\nconst defaultEmotions = [\n { key: \"joy\", label: \"기쁨\", icon: \"smile\", color: \"yellow\" },\n { key: \"sadness\", label: \"슬픔\", icon: \"frown\", color: \"blue\" },\n { key: \"anger\", label: \"화남\", icon: \"angry\", color: \"red\" },\n { key: \"calm\", label: \"평온\", icon: \"heart\", color: \"green\" },\n { key: \"excitement\", label: \"설렘\", icon: \"star\", color: \"pink\" },\n { key: \"worry\", label: \"걱정\", icon: \"meh\", color: \"gray\" },\n { key: \"gratitude\", label: \"감사\", icon: \"heart\", color: \"purple\" },\n { key: \"loneliness\", label: \"외로움\", icon: \"user\", color: \"indigo\" }\n]\n\n/**\n * EmotionSelector 컴포넌트 / EmotionSelector component\n *\n * 감정을 선택하는 컴포넌트입니다.\n * 여러 감정 옵션을 제공하며, 강도 조절 기능을 포함할 수 있습니다.\n *\n * Component for selecting emotions.\n * Provides multiple emotion options and can include intensity control.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionSelector\n * selectedEmotion=\"joy\"\n * onEmotionSelect={(emotion) => console.log(emotion)}\n * />\n *\n * @example\n * // 강도 조절 포함 / With intensity control\n * <EmotionSelector\n * selectedEmotion=\"calm\"\n * onEmotionSelect={handleEmotionSelect}\n * showIntensity\n * intensity={intensity}\n * onIntensityChange={setIntensity}\n * variant=\"card\"\n * />\n *\n * @param {EmotionSelectorProps} props - EmotionSelector 컴포넌트의 props / EmotionSelector component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionSelector 컴포넌트 / EmotionSelector component\n */\nconst EmotionSelector = React.forwardRef<HTMLDivElement, EmotionSelectorProps>(\n ({\n className,\n selectedEmotion,\n onEmotionSelect,\n layout = \"grid\",\n showIntensity = false,\n intensity = 50,\n onIntensityChange,\n emotions = defaultEmotions,\n size = \"md\",\n variant = \"button\",\n ...props\n }, ref) => {\n const handleEmotionClick = (emotionKey: string) => {\n onEmotionSelect?.(emotionKey)\n }\n\n const renderEmotionItem = (emotion: typeof emotions[0]) => {\n const isSelected = selectedEmotion === emotion.key\n\n if (variant === \"button\") {\n return (\n <EmotionButton\n key={emotion.key}\n emotion={emotion.key}\n isSelected={isSelected}\n size={size}\n onClick={() => handleEmotionClick(emotion.key)}\n className={merge(\n \"transition-all duration-200\",\n isSelected && \"ring-1 ring-offset-2 ring-primary\"\n )}\n >\n {emotion.label}\n </EmotionButton>\n )\n }\n\n if (variant === \"card\") {\n return (\n <div\n key={emotion.key}\n className={merge(\n \"p-4 rounded-lg border-2 cursor-pointer transition-all duration-200 hover:shadow-md\",\n isSelected\n ? \"border-primary bg-primary/5\"\n : \"border-border hover:border-primary/50\"\n )}\n onClick={() => handleEmotionClick(emotion.key)}\n >\n <div className=\"flex items-center space-x-3\">\n <div className={merge(\n \"w-8 h-8 rounded-full flex items-center justify-center\",\n isSelected ? \"bg-primary text-primary-foreground\" : \"bg-muted\"\n )}>\n {emotion.icon && (\n <span className=\"text-lg\">\n {emotion.icon === \"smile\" && \"😊\"}\n {emotion.icon === \"frown\" && \"😢\"}\n {emotion.icon === \"angry\" && \"😠\"}\n {emotion.icon === \"heart\" && \"❤️\"}\n {emotion.icon === \"star\" && \"⭐\"}\n {emotion.icon === \"meh\" && \"😐\"}\n {emotion.icon === \"user\" && \"👤\"}\n </span>\n )}\n </div>\n <span className=\"font-medium truncate max-w-[120px]\">{emotion.label}</span>\n </div>\n </div>\n )\n }\n\n if (variant === \"chip\") {\n return (\n <div\n key={emotion.key}\n className={merge(\n \"px-3 py-1 rounded-full cursor-pointer transition-all duration-200 text-sm font-medium\",\n isSelected\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted hover:bg-muted/80\"\n )}\n onClick={() => handleEmotionClick(emotion.key)}\n >\n <span className=\"truncate max-w-[100px]\">{emotion.label}</span>\n </div>\n )\n }\n\n return null\n }\n\n const layoutClasses = {\n grid: \"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2 md:gap-3\",\n list: \"space-y-2\",\n compact: \"flex flex-wrap gap-1\"\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)}\n {...props}\n >\n <div className={layoutClasses[layout]}>\n {emotions.map(renderEmotionItem)}\n </div>\n\n {showIntensity && selectedEmotion && (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">감정 강도</span>\n <span className=\"text-sm text-muted-foreground\">{intensity}%</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={intensity}\n onChange={(e) => onIntensityChange?.(Number(e.target.value))}\n className=\"w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider\"\n />\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>약함</span>\n <span>보통</span>\n <span>강함</span>\n </div>\n </div>\n )}\n\n {selectedEmotion && showIntensity && (\n <div className=\"flex justify-center\">\n <EmotionMeter\n value={intensity}\n size=\"md\"\n color=\"blue\"\n />\n </div>\n )}\n </div>\n )\n }\n)\n\nEmotionSelector.displayName = \"EmotionSelector\"\n\nexport { EmotionSelector }\nexport type { EmotionSelectorProps }\n","'use client'\n\nimport React from \"react\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../Card';\nimport { Badge } from '../../Badge';\nimport { merge } from '../../../lib/utils';\nimport { EmotionMeter } from \"./EmotionMeter\"\n\n/**\n * EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\n * @typedef {Object} EmotionAnalysisProps\n * @property {Object} [primaryEmotion] - 주요 감정 정보 / Primary emotion information\n * @property {string} primaryEmotion.name - 감정 이름 / Emotion name\n * @property {number} primaryEmotion.intensity - 감정 강도 (0-100) / Emotion intensity (0-100)\n * @property {string} [primaryEmotion.color] - 감정 색상 / Emotion color\n * @property {Array<Object>} [emotionDistribution] - 감정 분포 배열 / Emotion distribution array\n * @property {string} emotionDistribution[].emotion - 감정 이름 / Emotion name\n * @property {number} emotionDistribution[].percentage - 감정 비율 (0-100) / Emotion percentage (0-100)\n * @property {string} emotionDistribution[].color - 감정 색상 / Emotion color\n * @property {string[]} [keywords] - 키워드 배열 / Keywords array\n * @property {number} [intensity=50] - 전체 강도 (0-100) / Overall intensity (0-100)\n * @property {number} [positivity=70] - 긍정성 (0-100) / Positivity (0-100)\n * @property {number} [energy=60] - 에너지 (0-100) / Energy (0-100)\n * @property {boolean} [showMeter=true] - 강도 미터 표시 여부 / Show intensity meter\n * @property {boolean} [showDistribution=true] - 분포 표시 여부 / Show distribution\n * @property {boolean} [showKeywords=true] - 키워드 표시 여부 / Show keywords\n * @property {boolean} [showMetrics=true] - 메트릭 표시 여부 / Show metrics\n * @property {\"compact\" | \"detailed\" | \"card\"} [layout=\"detailed\"] - 레이아웃 타입 / Layout type\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface EmotionAnalysisProps extends React.HTMLAttributes<HTMLDivElement> {\n primaryEmotion?: {\n name: string\n intensity: number\n color?: string\n }\n emotionDistribution?: Array<{\n emotion: string\n percentage: number\n color: string\n }>\n keywords?: string[]\n intensity?: number\n positivity?: number\n energy?: number\n showMeter?: boolean\n showDistribution?: boolean\n showKeywords?: boolean\n showMetrics?: boolean\n layout?: \"compact\" | \"detailed\" | \"card\"\n}\n\n/**\n * EmotionAnalysis 컴포넌트 / EmotionAnalysis component\n *\n * 감정 분석 결과를 표시하는 컴포넌트입니다.\n * 주요 감정, 감정 분포, 키워드, 메트릭(강도, 긍정성, 에너지)을 표시할 수 있습니다.\n *\n * Component that displays emotion analysis results.\n * Can display primary emotion, emotion distribution, keywords, and metrics (intensity, positivity, energy).\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionAnalysis\n * primaryEmotion={{ name: \"기쁨\", intensity: 80 }}\n * keywords={[\"행복\", \"만족\"]}\n * />\n *\n * @example\n * // 상세 레이아웃 / Detailed layout\n * <EmotionAnalysis\n * primaryEmotion={{ name: \"평온\", intensity: 65, color: \"green\" }}\n * emotionDistribution={[\n * { emotion: \"기쁨\", percentage: 40, color: \"yellow\" },\n * { emotion: \"평온\", percentage: 60, color: \"green\" }\n * ]}\n * keywords={[\"안정\", \"편안\"]}\n * intensity={65}\n * positivity={75}\n * energy={50}\n * layout=\"detailed\"\n * />\n *\n * @param {EmotionAnalysisProps} props - EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionAnalysis 컴포넌트 / EmotionAnalysis component\n */\nconst EmotionAnalysis = React.forwardRef<HTMLDivElement, EmotionAnalysisProps>(\n ({\n className,\n primaryEmotion,\n emotionDistribution = [],\n keywords = [],\n intensity = 50,\n positivity = 70,\n energy = 60,\n showMeter = true,\n showDistribution = true,\n showKeywords = true,\n showMetrics = true,\n layout = \"detailed\",\n ...props\n }, ref) => {\n const getIntensityLabel = (value: number) => {\n if (value < 30) return \"약함\"\n if (value < 70) return \"보통\"\n return \"강함\"\n }\n\n const getPositivityLabel = (value: number) => {\n if (value < 30) return \"부정적\"\n if (value < 70) return \"중립적\"\n return \"긍정적\"\n }\n\n const getEnergyLabel = (value: number) => {\n if (value < 30) return \"낮음\"\n if (value < 70) return \"보통\"\n return \"높음\"\n }\n\n if (layout === \"compact\") {\n return (\n <div\n ref={ref}\n className={merge(\"space-y-3\", className)}\n {...props}\n >\n {primaryEmotion && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">주요 감정:</span>\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-sm text-muted-foreground\">\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\n </span>\n {showMeter && (\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"sm\"\n color=\"blue\"\n />\n )}\n </div>\n </div>\n )}\n\n {showMetrics && (\n <>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">감정 강도:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getIntensityLabel(intensity)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">긍정성:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getPositivityLabel(positivity)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">에너지:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getEnergyLabel(energy)}\n </span>\n </div>\n </>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div>\n <span className=\"text-sm font-medium\">키워드:</span>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n\n if (layout === \"card\") {\n return (\n <Card\n ref={ref}\n className={merge(\"\", className)}\n {...props}\n >\n <CardHeader>\n <CardTitle className=\"flex items-center\">\n <span className=\"text-2xl mr-2\">✨</span>\n AI 분석\n </CardTitle>\n <CardDescription>\n 감정 분석 결과\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {primaryEmotion && (\n <div className=\"space-y-3\">\n <div className=\"text-sm\">\n <span className=\"font-medium\">주요 감정:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\n </span>\n </div>\n {showMeter && (\n <div className=\"flex justify-center\">\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"md\"\n color=\"blue\"\n />\n </div>\n )}\n </div>\n )}\n\n {showMetrics && (\n <>\n <div className=\"text-sm\">\n <span className=\"font-medium\">감정 강도:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getIntensityLabel(intensity)}\n </span>\n </div>\n <div className=\"text-sm\">\n <span className=\"font-medium\">긍정성:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getPositivityLabel(positivity)}\n </span>\n </div>\n <div className=\"text-sm\">\n <span className=\"font-medium\">에너지:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getEnergyLabel(energy)}\n </span>\n </div>\n </>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div className=\"text-sm\">\n <span className=\"font-medium\">키워드:</span>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n )\n }\n\n // detailed layout (default)\n return (\n <div\n ref={ref}\n className={merge(\"space-y-6\", className)}\n {...props}\n >\n {primaryEmotion && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">주요 감정</h3>\n <div className=\"flex items-center space-x-4\">\n <div className=\"text-center\">\n <div className=\"text-2xl font-bold text-primary\">\n {primaryEmotion.name}\n </div>\n <div className=\"text-sm text-muted-foreground\">\n {primaryEmotion.intensity}% 강도\n </div>\n </div>\n {showMeter && (\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"lg\"\n color=\"blue\"\n />\n )}\n </div>\n </div>\n )}\n\n {showDistribution && emotionDistribution.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">감정 분포</h3>\n <div className=\"space-y-3\">\n {emotionDistribution.map((item, index) => (\n <div key={index} className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">{item.emotion}</span>\n <span className=\"text-sm text-muted-foreground\">\n {item.percentage}%\n </span>\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className={`${item.color} h-2 rounded-full transition-all duration-300`}\n style={{ width: `${item.percentage}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {showMetrics && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">분석 지표</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">감정 강도</div>\n <div className=\"text-2xl font-bold text-primary\">\n {getIntensityLabel(intensity)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full transition-all duration-300\"\n style={{ width: `${intensity}%` }}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">긍정성</div>\n <div className=\"text-2xl font-bold text-green-600\">\n {getPositivityLabel(positivity)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-green-500 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${positivity}%` }}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">에너지</div>\n <div className=\"text-2xl font-bold text-orange-600\">\n {getEnergyLabel(energy)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-orange-500 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${energy}%` }}\n />\n </div>\n </div>\n </div>\n </div>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">감정 키워드</h3>\n <div className=\"flex flex-wrap gap-2\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"outline\" className=\"text-sm\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\n\nEmotionAnalysis.displayName = \"EmotionAnalysis\"\n\nexport { EmotionAnalysis }\nexport type { EmotionAnalysisProps }\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
2
|
+
import {a}from'./chunk-QEMPERUK.mjs';import o from'react';import {jsx,jsxs}from'react/jsx-runtime';var n=o.forwardRef(({className:a$1,variant:r="default",title:t,description:i,icon:d,action:c,closable:u=false,onClose:k,children:m,...v},b)=>{let p=()=>{switch(r){case "success":return "bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200";case "warning":return "bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200";case "error":return "bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200";case "info":return "bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200";default:return "bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200"}},g=()=>{switch(r){case "success":return "text-green-500 dark:text-green-400";case "warning":return "text-yellow-500 dark:text-yellow-400";case "error":return "text-red-500 dark:text-red-400";case "info":return "text-cyan-500 dark:text-cyan-400";default:return "text-muted-foreground"}},f=()=>{switch(r){case "success":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})});case "warning":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})});case "error":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})});case "info":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})});default:return null}};return jsx("div",{ref:b,className:a("relative rounded-lg border p-4",p(),a$1),...v,children:jsxs("div",{className:"flex items-start gap-3",children:[" ",(d||f())&&jsx("div",{className:a("flex-shrink-0 mt-0.5",g()),children:d||f()}),jsxs("div",{className:"flex-1 min-w-0",children:[t&&jsxs("h4",{className:"text-sm font-semibold mb-1",children:[" ",t]}),i&&jsx("p",{className:"text-sm leading-relaxed",children:i}),m&&jsxs("div",{className:"mt-2",children:[" ",m]})]}),(c||u)&&jsxs("div",{className:"flex-shrink-0 flex items-center gap-2",children:[" ",c,u&&jsx("button",{onClick:k,className:a("inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2",g()),"aria-label":"\uB2EB\uAE30",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]})]})})});n.displayName="Alert";var x=o.forwardRef(({className:a,...r},t)=>jsx(n,{ref:t,variant:"success",className:a,...r}));x.displayName="AlertSuccess";var w=o.forwardRef(({className:a,...r},t)=>jsx(n,{ref:t,variant:"warning",className:a,...r}));w.displayName="AlertWarning";var h=o.forwardRef(({className:a,...r},t)=>jsx(n,{ref:t,variant:"error",className:a,...r}));h.displayName="AlertError";var N=o.forwardRef(({className:a,...r},t)=>jsx(n,{ref:t,variant:"info",className:a,...r}));N.displayName="AlertInfo";export{n as a,x as b,w as c,h as d,N as e};//# sourceMappingURL=chunk-V2DNYJR6.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-V2DNYJR6.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Alert.tsx"],"names":["Alert","React","className","variant","title","description","icon","action","closable","onClose","children","props","ref","getVariantClasses","getIconClasses","getDefaultIcon","jsx","merge","jsxs","AlertSuccess","AlertWarning","AlertError","AlertInfo"],"mappings":"mGAgEA,IAAMA,CAAAA,CAAQC,CAAAA,CAAM,UAAA,CAClB,CAAC,CACC,SAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CAAU,SAAA,CACV,MAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,EACA,QAAA,CAAAC,CAAAA,CAAW,KAAA,CACX,OAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,EACA,GAAGC,CACL,CAAA,CAAGC,GAAAA,GAAQ,CACT,IAAMC,EAAoB,IAAM,CAC9B,OAAQV,CAAAA,EACN,KAAK,UACH,OAAO,uIAAA,CACT,KAAK,SAAA,CACH,OAAO,6IAAA,CACT,KAAK,OAAA,CACH,OAAO,4HACT,KAAK,MAAA,CACH,OAAO,qIAAA,CACT,QACE,OAAO,2HACX,CACF,CAAA,CAEMW,EAAiB,IAAM,CAC3B,OAAQX,CAAAA,EACN,KAAK,UACH,OAAO,oCAAA,CACT,KAAK,SAAA,CACH,OAAO,sCAAA,CACT,KAAK,OAAA,CACH,OAAO,gCAAA,CACT,KAAK,MAAA,CACH,OAAO,mCACT,QACE,OAAO,uBACX,CACF,CAAA,CAEMY,CAAAA,CAAiB,IAAM,CAC3B,OAAQZ,CAAAA,EACN,KAAK,SAAA,CACH,OACEa,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,OAAO,cAAA,CAAe,OAAA,CAAQ,YACjE,QAAA,CAAAA,GAAAA,CAAC,QAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,EAAE,gBAAA,CAAiB,CAAA,CACxF,CAAA,CAEJ,KAAK,SAAA,CACH,OACEA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,eAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,QAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,2IAAA,CAA4I,EACnN,CAAA,CAEJ,KAAK,OAAA,CACH,OACEA,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,YACjE,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,QAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,sBAAA,CAAuB,CAAA,CAC9F,CAAA,CAEJ,KAAK,MAAA,CACH,OACEA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,KAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,IAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,EAAG,CAAA,CAAE,2DAAA,CAA4D,CAAA,CACnI,CAAA,CAEJ,QACE,OAAO,IACX,CACF,CAAA,CAEA,OACEA,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKJ,IACL,SAAA,CAAWK,CAAAA,CACT,gCAAA,CACAJ,CAAAA,EAAkB,CAClBX,CACF,EACC,GAAGS,CAAAA,CAEJ,SAAAO,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wBAAA,CAAyB,QAAA,CAAA,CAAA,GAAA,CAAA,CAEpCZ,CAAAA,EAAQS,CAAAA,EAAe,GACvBC,GAAAA,CAAC,OAAI,SAAA,CAAWC,CAAAA,CAAM,sBAAA,CAAwBH,CAAAA,EAAgB,CAAA,CAC3D,SAAAR,CAAAA,EAAQS,CAAAA,EAAe,CAC1B,CAAA,CAIFG,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gBAAA,CACZ,QAAA,CAAA,CAAAd,CAAAA,EACCc,IAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,6BAA6B,QAAA,CAAA,CAAA,GAAA,CACxCd,CAAAA,CAAAA,CACH,CAAA,CAEDC,CAAAA,EACCW,GAAAA,CAAC,GAAA,CAAA,CAAE,UAAU,yBAAA,CACV,QAAA,CAAAX,CAAAA,CACH,CAAA,CAEDK,CAAAA,EACCQ,IAAAA,CAAC,OAAI,SAAA,CAAU,MAAA,CAAO,QAAA,CAAA,CAAA,GAAA,CACnBR,CAAAA,CAAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAAA,CAGEH,GAAUC,CAAAA,GACVU,IAAAA,CAAC,OAAI,SAAA,CAAU,uCAAA,CAAwC,cACpDX,CAAAA,CACAC,CAAAA,EACCQ,GAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASP,CAAAA,CACT,UAAWQ,CAAAA,CACT,4LAAA,CACAH,CAAAA,EACF,CAAA,CACA,YAAA,CAAW,eAEX,QAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,OAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,GAAAA,CAAC,QAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,EAAE,sBAAA,CAAuB,CAAA,CAC9F,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,CACF,EACAhB,CAAAA,CAAM,WAAA,CAAc,OAAA,CAGb,IAAMmB,EAAelB,CAAAA,CAAM,UAAA,CAChC,CAAC,CAAE,SAAA,CAAAC,EAAW,GAAGS,CAAM,CAAA,CAAGC,CAAAA,GACxBI,GAAAA,CAAChB,CAAAA,CAAA,CAAM,GAAA,CAAKY,CAAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAWV,CAAAA,CAAY,GAAGS,CAAAA,CAAO,CAExE,EACAQ,CAAAA,CAAa,WAAA,CAAc,cAAA,KAEdC,CAAAA,CAAenB,CAAAA,CAAM,UAAA,CAChC,CAAC,CAAE,SAAA,CAAAC,EAAW,GAAGS,CAAM,CAAA,CAAGC,CAAAA,GACxBI,GAAAA,CAAChB,CAAAA,CAAA,CAAM,GAAA,CAAKY,CAAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAWV,CAAAA,CAAY,GAAGS,CAAAA,CAAO,CAExE,EACAS,CAAAA,CAAa,WAAA,CAAc,cAAA,KAEdC,CAAAA,CAAapB,CAAAA,CAAM,UAAA,CAC9B,CAAC,CAAE,SAAA,CAAAC,EAAW,GAAGS,CAAM,CAAA,CAAGC,CAAAA,GACxBI,GAAAA,CAAChB,CAAAA,CAAA,CAAM,GAAA,CAAKY,CAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAWV,CAAAA,CAAY,GAAGS,CAAAA,CAAO,CAEtE,EACAU,CAAAA,CAAW,WAAA,CAAc,YAAA,KAEZC,CAAAA,CAAYrB,CAAAA,CAAM,UAAA,CAC7B,CAAC,CAAE,SAAA,CAAAC,EAAW,GAAGS,CAAM,CAAA,CAAGC,CAAAA,GACxBI,GAAAA,CAAChB,CAAAA,CAAA,CAAM,GAAA,CAAKY,CAAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAWV,CAAAA,CAAY,GAAGS,CAAAA,CAAO,CAErE,EACAW,CAAAA,CAAU,WAAA,CAAc,WAAA","file":"chunk-TXBZZJNR.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Alert 컴포넌트의 props\n * @typedef {Object} AlertProps\n * @property {\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"} [variant=\"default\"] - Alert 스타일 변형\n * @property {string} [title] - Alert 제목\n * @property {string} [description] - Alert 설명\n * @property {React.ReactNode} [icon] - 커스텀 아이콘\n * @property {React.ReactNode} [action] - 액션 버튼/요소\n * @property {boolean} [closable=false] - 닫기 버튼 표시 여부\n * @property {() => void} [onClose] - 닫기 버튼 클릭 시 호출되는 콜백\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\"\n title?: string\n description?: string\n icon?: React.ReactNode\n action?: React.ReactNode\n closable?: boolean\n onClose?: () => void\n}\n\n/**\n * Alert 컴포넌트 / Alert component\n * \n * 사용자에게 중요한 정보나 경고를 표시하는 컴포넌트입니다.\n * 다양한 변형(variant)을 지원하며, 아이콘, 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n * \n * Component for displaying important information or warnings to users.\n * Supports various variants and can include icons, titles, descriptions, and action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Alert variant=\"info\" title=\"정보\" description=\"이것은 정보 메시지입니다.\" />\n * \n * @example\n * // 닫기 버튼 포함 / With close button\n * <Alert \n * variant=\"warning\" \n * title=\"경고\" \n * closable \n * onClose={() => console.log('닫기')}\n * />\n * \n * @example\n * // 커스텀 아이콘과 액션 / Custom icon and action\n * <Alert \n * variant=\"success\"\n * icon={<Icon name=\"check\" />}\n * action={<Button size=\"sm\">확인</Button>}\n * >\n * 작업이 완료되었습니다.\n * </Alert>\n * \n * @param {AlertProps} props - Alert 컴포넌트의 props / Alert component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Alert 컴포넌트 / Alert component\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ \n className, \n variant = \"default\",\n title,\n description,\n icon,\n action,\n closable = false,\n onClose,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"success\":\n return \"bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200\"\n case \"warning\":\n return \"bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200\"\n case \"error\":\n return \"bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200\"\n case \"info\":\n return \"bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200\"\n default:\n return \"bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200\"\n }\n }\n\n const getIconClasses = () => {\n switch (variant) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n default:\n return \"text-muted-foreground\"\n }\n }\n\n const getDefaultIcon = () => {\n switch (variant) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n default:\n return null\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative rounded-lg border p-4\", // 16px 패딩\n getVariantClasses(),\n className\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\"> {/* 12px 간격 */}\n {/* 아이콘 */}\n {(icon || getDefaultIcon()) && (\n <div className={merge(\"flex-shrink-0 mt-0.5\", getIconClasses())}>\n {icon || getDefaultIcon()}\n </div>\n )}\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {title}\n </h4>\n )}\n {description && (\n <p className=\"text-sm leading-relaxed\">\n {description}\n </p>\n )}\n {children && (\n <div className=\"mt-2\"> {/* 8px 여백 */}\n {children}\n </div>\n )}\n </div>\n\n {/* 액션 */}\n {(action || closable) && (\n <div className=\"flex-shrink-0 flex items-center gap-2\"> {/* 8px 간격 */}\n {action}\n {closable && (\n <button\n onClick={onClose}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconClasses()\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\nAlert.displayName = \"Alert\"\n\n// 편의 컴포넌트들\nexport const AlertSuccess = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nAlertSuccess.displayName = \"AlertSuccess\"\n\nexport const AlertWarning = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nAlertWarning.displayName = \"AlertWarning\"\n\nexport const AlertError = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nAlertError.displayName = \"AlertError\"\n\nexport const AlertInfo = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nAlertInfo.displayName = \"AlertInfo\"\n\nexport { Alert } "]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Alert.tsx"],"names":["Alert","React","className","variant","title","description","icon","action","closable","onClose","children","props","ref","getVariantClasses","getIconClasses","getDefaultIcon","jsx","merge","jsxs","AlertSuccess","AlertWarning","AlertError","AlertInfo"],"mappings":"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","file":"chunk-V2DNYJR6.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Alert 컴포넌트의 props\n * @typedef {Object} AlertProps\n * @property {\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"} [variant=\"default\"] - Alert 스타일 변형\n * @property {string} [title] - Alert 제목\n * @property {string} [description] - Alert 설명\n * @property {React.ReactNode} [icon] - 커스텀 아이콘\n * @property {React.ReactNode} [action] - 액션 버튼/요소\n * @property {boolean} [closable=false] - 닫기 버튼 표시 여부\n * @property {() => void} [onClose] - 닫기 버튼 클릭 시 호출되는 콜백\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\"\n title?: string\n description?: string\n icon?: React.ReactNode\n action?: React.ReactNode\n closable?: boolean\n onClose?: () => void\n}\n\n/**\n * Alert 컴포넌트 / Alert component\n * \n * 사용자에게 중요한 정보나 경고를 표시하는 컴포넌트입니다.\n * 다양한 변형(variant)을 지원하며, 아이콘, 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n * \n * Component for displaying important information or warnings to users.\n * Supports various variants and can include icons, titles, descriptions, and action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Alert variant=\"info\" title=\"정보\" description=\"이것은 정보 메시지입니다.\" />\n * \n * @example\n * // 닫기 버튼 포함 / With close button\n * <Alert \n * variant=\"warning\" \n * title=\"경고\" \n * closable \n * onClose={() => console.log('닫기')}\n * />\n * \n * @example\n * // 커스텀 아이콘과 액션 / Custom icon and action\n * <Alert \n * variant=\"success\"\n * icon={<Icon name=\"check\" />}\n * action={<Button size=\"sm\">확인</Button>}\n * >\n * 작업이 완료되었습니다.\n * </Alert>\n * \n * @param {AlertProps} props - Alert 컴포넌트의 props / Alert component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Alert 컴포넌트 / Alert component\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ \n className, \n variant = \"default\",\n title,\n description,\n icon,\n action,\n closable = false,\n onClose,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"success\":\n return \"bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200\"\n case \"warning\":\n return \"bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200\"\n case \"error\":\n return \"bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200\"\n case \"info\":\n return \"bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200\"\n default:\n return \"bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200\"\n }\n }\n\n const getIconClasses = () => {\n switch (variant) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n default:\n return \"text-muted-foreground\"\n }\n }\n\n const getDefaultIcon = () => {\n switch (variant) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n default:\n return null\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative rounded-lg border p-4\", // 16px 패딩\n getVariantClasses(),\n className\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\"> {/* 12px 간격 */}\n {/* 아이콘 */}\n {(icon || getDefaultIcon()) && (\n <div className={merge(\"flex-shrink-0 mt-0.5\", getIconClasses())}>\n {icon || getDefaultIcon()}\n </div>\n )}\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {title}\n </h4>\n )}\n {description && (\n <p className=\"text-sm leading-relaxed\">\n {description}\n </p>\n )}\n {children && (\n <div className=\"mt-2\"> {/* 8px 여백 */}\n {children}\n </div>\n )}\n </div>\n\n {/* 액션 */}\n {(action || closable) && (\n <div className=\"flex-shrink-0 flex items-center gap-2\"> {/* 8px 간격 */}\n {action}\n {closable && (\n <button\n onClick={onClose}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconClasses()\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\nAlert.displayName = \"Alert\"\n\n// 편의 컴포넌트들\nexport const AlertSuccess = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nAlertSuccess.displayName = \"AlertSuccess\"\n\nexport const AlertWarning = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nAlertWarning.displayName = \"AlertWarning\"\n\nexport const AlertError = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nAlertError.displayName = \"AlertError\"\n\nexport const AlertInfo = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nAlertInfo.displayName = \"AlertInfo\"\n\nexport { Alert } "]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {a}from'./chunk-
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
2
|
+
import {a}from'./chunk-SDFVGFXT.mjs';import {a as a$1}from'./chunk-QEMPERUK.mjs';import x from'react';import {cva}from'class-variance-authority';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var y=cva("relative w-full",{variants:{spacing:{none:"",sm:"py-12 sm:py-16",md:"py-16 sm:py-20 lg:py-24",lg:"py-20 sm:py-28",xl:"py-28 sm:py-36"},background:{none:"",muted:"bg-muted/30",accent:"bg-accent/5",primary:"bg-primary/5"}},defaultVariants:{spacing:"lg",background:"none"}}),b={width:"80px",height:"3px",borderRadius:"9999px",background:"linear-gradient(90deg, var(--color-primary, hsl(var(--primary))), var(--color-accent, hsl(var(--accent-foreground))))",marginBottom:"1.5rem"};function v({config:e}){let n=e.align!=="left";return jsxs("div",{className:a$1("mb-16",n&&"text-center"),children:[e.decorator!==false&&jsx("div",{style:b,className:a$1(n&&"mx-auto"),"aria-hidden":"true"}),jsx("h2",{className:"text-3xl md:text-5xl font-extrabold mb-4",children:e.title}),e.subtitle&&jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto",children:e.subtitle}),e.action&&jsx("div",{className:"mt-6",children:e.action})]})}var S=x.forwardRef(({className:e,spacing:n,background:c,container:l="lg",containerPadding:p="none",header:r,fullWidth:d=false,children:m,...g},u)=>{let o=jsxs(Fragment,{children:[r&&jsx(v,{config:r}),m]});return jsx("section",{ref:u,className:a$1(y({spacing:n,background:c}),"px-6",e),...g,children:d?o:jsx(a,{size:l,padding:p,centered:true,children:o})})});S.displayName="Section";export{y as a,S as b};//# sourceMappingURL=chunk-VBABZXL7.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-VBABZXL7.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Section.tsx"],"names":["sectionVariants","cva","sectionLineStyle","SectionHeader","config","isCenter","jsxs","merge","jsx","Section","React","className","spacing","background","container","containerPadding","header","fullWidth","children","props","ref","content","Fragment","Container"],"mappings":"mMAOO,IAAMA,CAAAA,CAAkBC,GAAAA,CAAI,iBAAA,CAAmB,CACpD,QAAA,CAAU,CACR,OAAA,CAAS,CACP,IAAA,CAAM,EAAA,CACN,GAAI,gBAAA,CACJ,EAAA,CAAI,yBAAA,CACJ,EAAA,CAAI,gBAAA,CACJ,EAAA,CAAI,gBACN,CAAA,CACA,UAAA,CAAY,CACV,IAAA,CAAM,EAAA,CACN,KAAA,CAAO,cACP,MAAA,CAAQ,aAAA,CACR,OAAA,CAAS,cACX,CACF,CAAA,CACA,gBAAiB,CAAE,OAAA,CAAS,IAAA,CAAM,UAAA,CAAY,MAAO,CACvD,CAAC,CAAA,CAyBKC,CAAAA,CAAwC,CAC5C,KAAA,CAAO,MAAA,CACP,MAAA,CAAQ,MACR,YAAA,CAAc,QAAA,CACd,UAAA,CAAY,uHAAA,CACZ,YAAA,CAAc,QAChB,EAEA,SAASC,CAAAA,CAAc,CAAE,MAAA,CAAAC,CAAO,CAAA,CAAoC,CAClE,IAAMC,CAAAA,CAAWD,CAAAA,CAAO,KAAA,GAAU,MAAA,CAElC,OACEE,KAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,GAAAA,CAAM,OAAA,CAASF,CAAAA,EAAY,aAAa,EACrD,QAAA,CAAA,CAAAD,CAAAA,CAAO,SAAA,GAAc,KAAA,EACpBI,GAAAA,CAAC,KAAA,CAAA,CACC,MAAON,CAAAA,CACP,SAAA,CAAWK,GAAAA,CAAMF,CAAAA,EAAY,SAAS,CAAA,CACtC,cAAY,MAAA,CACd,CAAA,CAEFG,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,0CAAA,CACX,SAAAJ,CAAAA,CAAO,KAAA,CACV,CAAA,CACCA,CAAAA,CAAO,QAAA,EACNI,GAAAA,CAAC,KAAE,SAAA,CAAU,iDAAA,CACV,QAAA,CAAAJ,CAAAA,CAAO,QAAA,CACV,CAAA,CAEDA,EAAO,MAAA,EACNI,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CAAQ,QAAA,CAAAJ,EAAO,MAAA,CAAO,CAAA,CAAA,CAEzC,CAEJ,CAiBA,IAAMK,CAAAA,CAAUC,EAAM,UAAA,CACpB,CAAC,CACC,SAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,EACA,UAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CAAY,IAAA,CACZ,gBAAA,CAAAC,EAAmB,MAAA,CACnB,MAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CAAY,KAAA,CACZ,SAAAC,CAAAA,CACA,GAAGC,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMC,CAAAA,CACJf,IAAAA,CAAAgB,QAAAA,CAAA,CACG,QAAA,CAAA,CAAAN,CAAAA,EAAUR,IAACL,CAAAA,CAAA,CAAc,MAAA,CAAQa,CAAAA,CAAQ,CAAA,CACzCE,CAAAA,CAAAA,CACH,EAGF,OACEV,GAAAA,CAAC,SAAA,CAAA,CACC,GAAA,CAAKY,CAAAA,CACL,SAAA,CAAWb,IACTP,CAAAA,CAAgB,CAAE,OAAA,CAAAY,CAAAA,CAAS,UAAA,CAAAC,CAAW,CAAC,CAAA,CACvC,MAAA,CACAF,CACF,CAAA,CACC,GAAGQ,CAAAA,CAEH,SAAAF,CAAAA,CAAYI,CAAAA,CACXb,GAAAA,CAACe,CAAAA,CAAA,CAAU,IAAA,CAAMT,EAAW,OAAA,CAASC,CAAAA,CAAkB,QAAA,CAAQ,IAAA,CAC5D,QAAA,CAAAM,CAAAA,CACH,EAEJ,CAEJ,CACF,EACAZ,CAAAA,CAAQ,WAAA,CAAc,SAAA","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/Section.tsx"],"names":["sectionVariants","cva","sectionLineStyle","SectionHeader","config","isCenter","jsxs","merge","jsx","Section","React","className","spacing","background","container","containerPadding","header","fullWidth","children","props","ref","content","Fragment","Container"],"mappings":"mMAOO,IAAMA,CAAAA,CAAkBC,GAAAA,CAAI,iBAAA,CAAmB,CACpD,QAAA,CAAU,CACR,OAAA,CAAS,CACP,IAAA,CAAM,EAAA,CACN,GAAI,gBAAA,CACJ,EAAA,CAAI,yBAAA,CACJ,EAAA,CAAI,gBAAA,CACJ,EAAA,CAAI,gBACN,CAAA,CACA,UAAA,CAAY,CACV,IAAA,CAAM,EAAA,CACN,KAAA,CAAO,cACP,MAAA,CAAQ,aAAA,CACR,OAAA,CAAS,cACX,CACF,CAAA,CACA,gBAAiB,CAAE,OAAA,CAAS,IAAA,CAAM,UAAA,CAAY,MAAO,CACvD,CAAC,CAAA,CAyBKC,CAAAA,CAAwC,CAC5C,KAAA,CAAO,MAAA,CACP,MAAA,CAAQ,MACR,YAAA,CAAc,QAAA,CACd,UAAA,CAAY,uHAAA,CACZ,YAAA,CAAc,QAChB,EAEA,SAASC,CAAAA,CAAc,CAAE,MAAA,CAAAC,CAAO,CAAA,CAAoC,CAClE,IAAMC,CAAAA,CAAWD,CAAAA,CAAO,KAAA,GAAU,MAAA,CAElC,OACEE,KAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,GAAAA,CAAM,OAAA,CAASF,CAAAA,EAAY,aAAa,EACrD,QAAA,CAAA,CAAAD,CAAAA,CAAO,SAAA,GAAc,KAAA,EACpBI,GAAAA,CAAC,KAAA,CAAA,CACC,MAAON,CAAAA,CACP,SAAA,CAAWK,GAAAA,CAAMF,CAAAA,EAAY,SAAS,CAAA,CACtC,cAAY,MAAA,CACd,CAAA,CAEFG,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,0CAAA,CACX,SAAAJ,CAAAA,CAAO,KAAA,CACV,CAAA,CACCA,CAAAA,CAAO,QAAA,EACNI,GAAAA,CAAC,KAAE,SAAA,CAAU,iDAAA,CACV,QAAA,CAAAJ,CAAAA,CAAO,QAAA,CACV,CAAA,CAEDA,EAAO,MAAA,EACNI,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CAAQ,QAAA,CAAAJ,EAAO,MAAA,CAAO,CAAA,CAAA,CAEzC,CAEJ,CAiBA,IAAMK,CAAAA,CAAUC,EAAM,UAAA,CACpB,CAAC,CACC,SAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,EACA,UAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CAAY,IAAA,CACZ,gBAAA,CAAAC,EAAmB,MAAA,CACnB,MAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CAAY,KAAA,CACZ,SAAAC,CAAAA,CACA,GAAGC,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMC,CAAAA,CACJf,IAAAA,CAAAgB,QAAAA,CAAA,CACG,QAAA,CAAA,CAAAN,CAAAA,EAAUR,IAACL,CAAAA,CAAA,CAAc,MAAA,CAAQa,CAAAA,CAAQ,CAAA,CACzCE,CAAAA,CAAAA,CACH,EAGF,OACEV,GAAAA,CAAC,SAAA,CAAA,CACC,GAAA,CAAKY,CAAAA,CACL,SAAA,CAAWb,IACTP,CAAAA,CAAgB,CAAE,OAAA,CAAAY,CAAAA,CAAS,UAAA,CAAAC,CAAW,CAAC,CAAA,CACvC,MAAA,CACAF,CACF,CAAA,CACC,GAAGQ,CAAAA,CAEH,SAAAF,CAAAA,CAAYI,CAAAA,CACXb,GAAAA,CAACe,CAAAA,CAAA,CAAU,IAAA,CAAMT,EAAW,OAAA,CAASC,CAAAA,CAAkB,QAAA,CAAQ,IAAA,CAC5D,QAAA,CAAAM,CAAAA,CACH,EAEJ,CAEJ,CACF,EACAZ,CAAAA,CAAQ,WAAA,CAAc,SAAA","file":"chunk-VBABZXL7.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { Container, type ContainerProps } from \"./Container\"\n\nexport const sectionVariants = cva(\"relative w-full\", {\n variants: {\n spacing: {\n none: \"\",\n sm: \"py-12 sm:py-16\",\n md: \"py-16 sm:py-20 lg:py-24\",\n lg: \"py-20 sm:py-28\",\n xl: \"py-28 sm:py-36\",\n },\n background: {\n none: \"\",\n muted: \"bg-muted/30\",\n accent: \"bg-accent/5\",\n primary: \"bg-primary/5\",\n },\n },\n defaultVariants: { spacing: \"lg\", background: \"none\" },\n})\n\nexport interface SectionHeaderConfig {\n title: string\n subtitle?: string\n action?: React.ReactNode\n /** section-line 데코레이터 표시 @default true */\n decorator?: boolean\n /** 텍스트 정렬 @default 'center' */\n align?: 'left' | 'center'\n}\n\nexport interface SectionProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof sectionVariants> {\n /** Container 사이즈 @default 'lg' */\n container?: ContainerProps['size']\n /** Container 패딩 @default 'none' */\n containerPadding?: ContainerProps['padding']\n /** 섹션 헤더 설정 */\n header?: SectionHeaderConfig\n /** 풀위드 모드 (Container 없이 직접) */\n fullWidth?: boolean\n}\n\nconst sectionLineStyle: React.CSSProperties = {\n width: '80px',\n height: '3px',\n borderRadius: '9999px',\n background: 'linear-gradient(90deg, var(--color-primary, hsl(var(--primary))), var(--color-accent, hsl(var(--accent-foreground))))',\n marginBottom: '1.5rem',\n}\n\nfunction SectionHeader({ config }: { config: SectionHeaderConfig }) {\n const isCenter = config.align !== 'left'\n\n return (\n <div className={merge(\"mb-16\", isCenter && \"text-center\")}>\n {config.decorator !== false && (\n <div\n style={sectionLineStyle}\n className={merge(isCenter && \"mx-auto\")}\n aria-hidden=\"true\"\n />\n )}\n <h2 className=\"text-3xl md:text-5xl font-extrabold mb-4\">\n {config.title}\n </h2>\n {config.subtitle && (\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto\">\n {config.subtitle}\n </p>\n )}\n {config.action && (\n <div className=\"mt-6\">{config.action}</div>\n )}\n </div>\n )\n}\n\n/**\n * Section 컴포넌트\n *\n * 랜딩 페이지 섹션의 보일러플레이트를 줄이는 시맨틱 래퍼.\n * 내부적으로 Container를 사용하며, header prop으로 제목/부제/데코레이터를 자동 생성합니다.\n *\n * @example\n * <Section header={{ title: \"제목\", subtitle: \"부제\" }}>\n * {children}\n * </Section>\n *\n * <Section spacing=\"xl\" background=\"muted\" fullWidth>\n * {fullWidthContent}\n * </Section>\n */\nconst Section = React.forwardRef<HTMLElement, SectionProps>(\n ({\n className,\n spacing,\n background,\n container = \"lg\",\n containerPadding = \"none\",\n header,\n fullWidth = false,\n children,\n ...props\n }, ref) => {\n const content = (\n <>\n {header && <SectionHeader config={header} />}\n {children}\n </>\n )\n\n return (\n <section\n ref={ref}\n className={merge(\n sectionVariants({ spacing, background }),\n \"px-6\",\n className\n )}\n {...props}\n >\n {fullWidth ? content : (\n <Container size={container} padding={containerPadding} centered>\n {content}\n </Container>\n )}\n </section>\n )\n }\n)\nSection.displayName = \"Section\"\n\nexport { Section }\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {a}from'./chunk-QEMPERUK.mjs';import b,{createContext,useContext,useState,useCallback}from'react';import {jsxs,jsx}from'react/jsx-runtime';var f=createContext(void 0);function I(){let t=useContext(f);if(!t)throw new Error("useToast must be used within a ToastProvider");return t}var w=()=>{},k=()=>{},y=()=>{};function R(){let t=useContext(f);return t||{toasts:[],addToast:w,removeToast:k,clearToasts:y}}function S({children:t,maxToasts:n=5,position:a="top-right"}){let[r,s]=useState([]),i=useCallback(o=>{s(u=>u.filter(g=>g.id!==o));},[]),l=useCallback(o=>{let u=Math.random().toString(36).substr(2,9),g={...o,id:u};s(v=>[...v,g].slice(-n)),o.duration!==0&&setTimeout(()=>{i(u);},o.duration||5e3);},[n,i]),m=useCallback(()=>{s([]);},[]);return jsxs(f.Provider,{value:{toasts:r,addToast:l,removeToast:i,clearToasts:m},children:[t,jsx(C,{toasts:r,removeToast:i,position:a})]})}function C({toasts:t,removeToast:n,position:a$1}){let r={"top-right":"top-4 right-4","top-left":"top-4 left-4","bottom-right":"bottom-4 right-4","bottom-left":"bottom-4 left-4","top-center":"top-4 left-1/2 transform -translate-x-1/2","bottom-center":"bottom-4 left-1/2 transform -translate-x-1/2"};return t.length===0?null:jsx("div",{className:a("fixed z-50 space-y-3 max-w-sm",r[a$1]),children:t.map(s=>jsx(L,{toast:s,onRemove:n},s.id))})}function L({toast:t,onRemove:n}){let[a$1,r]=useState(false);b.useEffect(()=>{r(true);},[]);let s=()=>{r(false),setTimeout(()=>n(t.id),300);},i=o=>{switch(o){case "success":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";case "error":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";case "warning":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";case "info":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"}},l=o=>{switch(o){case "success":return "text-green-500 dark:text-green-400";case "error":return "text-red-500 dark:text-red-400";case "warning":return "text-yellow-500 dark:text-yellow-400";case "info":return "text-cyan-500 dark:text-cyan-400"}},m=o=>{switch(o){case "success":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})});case "error":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})});case "warning":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})});case "info":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})}};return jsxs("div",{className:a("flex items-start p-4 rounded-xl border backdrop-blur-sm transition-all duration-300 transform",i(t.type),a$1?"translate-x-0 opacity-100 scale-100":"translate-x-full opacity-0 scale-95"),style:{animation:a$1?"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)":void 0},children:[jsxs("div",{className:a("flex-shrink-0 mr-3",l(t.type)),children:[" ",m(t.type)]}),jsxs("div",{className:"flex-1 min-w-0",children:[t.title&&jsxs("h4",{className:"text-sm font-semibold mb-1",children:[" ",t.title]}),jsx("p",{className:"text-sm leading-relaxed",children:t.message}),t.action&&jsx("button",{onClick:t.action.onClick,className:"mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200",children:t.action.label})]}),jsxs("div",{className:"flex-shrink-0 ml-4",children:[" ",jsx("button",{onClick:s,className:a("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",l(t.type)),"aria-label":"\uB2EB\uAE30",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]})]})}export{I as a,R as b,S as c};//# sourceMappingURL=chunk-WYBSHTGY.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-WYBSHTGY.mjs.map
|
|
@@ -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-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
|
+
{"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-WYBSHTGY.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} "]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {d,a}from'./chunk-QEMPERUK.mjs';import {House}from'@phosphor-icons/react/dist/ssr/House';import {ArrowLeft}from'@phosphor-icons/react/dist/ssr/ArrowLeft';import {ArrowRight}from'@phosphor-icons/react/dist/ssr/ArrowRight';import {ArrowUp}from'@phosphor-icons/react/dist/ssr/ArrowUp';import {ArrowDown}from'@phosphor-icons/react/dist/ssr/ArrowDown';import {List}from'@phosphor-icons/react/dist/ssr/List';import {X}from'@phosphor-icons/react/dist/ssr/X';import {MagnifyingGlass}from'@phosphor-icons/react/dist/ssr/MagnifyingGlass';import {Gear}from'@phosphor-icons/react/dist/ssr/Gear';import {ArrowSquareOut}from'@phosphor-icons/react/dist/ssr/ArrowSquareOut';import {CaretLeft}from'@phosphor-icons/react/dist/ssr/CaretLeft';import {CaretRight}from'@phosphor-icons/react/dist/ssr/CaretRight';import {CaretDown}from'@phosphor-icons/react/dist/ssr/CaretDown';import {CaretUp}from'@phosphor-icons/react/dist/ssr/CaretUp';import {Pencil}from'@phosphor-icons/react/dist/ssr/Pencil';import {Trash}from'@phosphor-icons/react/dist/ssr/Trash';import {Plus}from'@phosphor-icons/react/dist/ssr/Plus';import {Minus}from'@phosphor-icons/react/dist/ssr/Minus';import {Download}from'@phosphor-icons/react/dist/ssr/Download';import {Upload}from'@phosphor-icons/react/dist/ssr/Upload';import {ArrowClockwise}from'@phosphor-icons/react/dist/ssr/ArrowClockwise';import {FloppyDisk}from'@phosphor-icons/react/dist/ssr/FloppyDisk';import {Copy}from'@phosphor-icons/react/dist/ssr/Copy';import {TextB}from'@phosphor-icons/react/dist/ssr/TextB';import {TextItalic}from'@phosphor-icons/react/dist/ssr/TextItalic';import {TextStrikethrough}from'@phosphor-icons/react/dist/ssr/TextStrikethrough';import {TextHOne}from'@phosphor-icons/react/dist/ssr/TextHOne';import {Link}from'@phosphor-icons/react/dist/ssr/Link';import {Code}from'@phosphor-icons/react/dist/ssr/Code';import {FileCode}from'@phosphor-icons/react/dist/ssr/FileCode';import {Quotes}from'@phosphor-icons/react/dist/ssr/Quotes';import {ListNumbers}from'@phosphor-icons/react/dist/ssr/ListNumbers';import {SpinnerGap}from'@phosphor-icons/react/dist/ssr/SpinnerGap';import {CheckCircle}from'@phosphor-icons/react/dist/ssr/CheckCircle';import {XCircle}from'@phosphor-icons/react/dist/ssr/XCircle';import {WarningCircle}from'@phosphor-icons/react/dist/ssr/WarningCircle';import {Info}from'@phosphor-icons/react/dist/ssr/Info';import {Check}from'@phosphor-icons/react/dist/ssr/Check';import {Circle}from'@phosphor-icons/react/dist/ssr/Circle';import {Question}from'@phosphor-icons/react/dist/ssr/Question';import {User}from'@phosphor-icons/react/dist/ssr/User';import {Users}from'@phosphor-icons/react/dist/ssr/Users';import {UserPlus}from'@phosphor-icons/react/dist/ssr/UserPlus';import {SignIn}from'@phosphor-icons/react/dist/ssr/SignIn';import {SignOut}from'@phosphor-icons/react/dist/ssr/SignOut';import {Eye}from'@phosphor-icons/react/dist/ssr/Eye';import {EyeSlash}from'@phosphor-icons/react/dist/ssr/EyeSlash';import {ChartBar}from'@phosphor-icons/react/dist/ssr/ChartBar';import {TrendUp}from'@phosphor-icons/react/dist/ssr/TrendUp';import {Pulse}from'@phosphor-icons/react/dist/ssr/Pulse';import {Database}from'@phosphor-icons/react/dist/ssr/Database';import {Lightning}from'@phosphor-icons/react/dist/ssr/Lightning';import {FileText}from'@phosphor-icons/react/dist/ssr/FileText';import {File}from'@phosphor-icons/react/dist/ssr/File';import {Folder}from'@phosphor-icons/react/dist/ssr/Folder';import {Book}from'@phosphor-icons/react/dist/ssr/Book';import {BookOpen}from'@phosphor-icons/react/dist/ssr/BookOpen';import {Envelope}from'@phosphor-icons/react/dist/ssr/Envelope';import {ChatCircle}from'@phosphor-icons/react/dist/ssr/ChatCircle';import {Phone}from'@phosphor-icons/react/dist/ssr/Phone';import {Image}from'@phosphor-icons/react/dist/ssr/Image';import {Video}from'@phosphor-icons/react/dist/ssr/Video';import {Camera}from'@phosphor-icons/react/dist/ssr/Camera';import {Smiley}from'@phosphor-icons/react/dist/ssr/Smiley';import {SmileySad}from'@phosphor-icons/react/dist/ssr/SmileySad';import {SmileyMeh}from'@phosphor-icons/react/dist/ssr/SmileyMeh';import {Lock}from'@phosphor-icons/react/dist/ssr/Lock';import {LockOpen}from'@phosphor-icons/react/dist/ssr/LockOpen';import {Shield}from'@phosphor-icons/react/dist/ssr/Shield';import {Wallet}from'@phosphor-icons/react/dist/ssr/Wallet';import {Key}from'@phosphor-icons/react/dist/ssr/Key';import {CurrencyDollar}from'@phosphor-icons/react/dist/ssr/CurrencyDollar';import {Clock}from'@phosphor-icons/react/dist/ssr/Clock';import {Calendar}from'@phosphor-icons/react/dist/ssr/Calendar';import {CalendarPlus}from'@phosphor-icons/react/dist/ssr/CalendarPlus';import {Bell}from'@phosphor-icons/react/dist/ssr/Bell';import {Heart}from'@phosphor-icons/react/dist/ssr/Heart';import {Star}from'@phosphor-icons/react/dist/ssr/Star';import {Bookmark}from'@phosphor-icons/react/dist/ssr/Bookmark';import {Share}from'@phosphor-icons/react/dist/ssr/Share';import {Monitor}from'@phosphor-icons/react/dist/ssr/Monitor';import {Sun}from'@phosphor-icons/react/dist/ssr/Sun';import {Moon}from'@phosphor-icons/react/dist/ssr/Moon';import {Lightbulb}from'@phosphor-icons/react/dist/ssr/Lightbulb';import {Brain}from'@phosphor-icons/react/dist/ssr/Brain';import {Flag}from'@phosphor-icons/react/dist/ssr/Flag';import {Square}from'@phosphor-icons/react/dist/ssr/Square';import {Sparkle}from'@phosphor-icons/react/dist/ssr/Sparkle';import {Globe}from'@phosphor-icons/react/dist/ssr/Globe';import {DeviceMobile}from'@phosphor-icons/react/dist/ssr/DeviceMobile';import {Ticket}from'@phosphor-icons/react/dist/ssr/Ticket';import {Clipboard}from'@phosphor-icons/react/dist/ssr/Clipboard';import {WifiHigh}from'@phosphor-icons/react/dist/ssr/WifiHigh';import {WifiSlash}from'@phosphor-icons/react/dist/ssr/WifiSlash';import {Cpu}from'@phosphor-icons/react/dist/ssr/Cpu';import {MaskHappy}from'@phosphor-icons/react/dist/ssr/MaskHappy';import {Rocket}from'@phosphor-icons/react/dist/ssr/Rocket';import {Layout}from'@phosphor-icons/react/dist/ssr/Layout';import {Megaphone}from'@phosphor-icons/react/dist/ssr/Megaphone';import {Stack}from'@phosphor-icons/react/dist/ssr/Stack';import {Prohibit}from'@phosphor-icons/react/dist/ssr/Prohibit';import t,{createContext,useContext}from'react';import {jsx}from'react/jsx-runtime';var $={home:House,arrowLeft:ArrowLeft,arrowRight:ArrowRight,arrowUp:ArrowUp,arrowDown:ArrowDown,menu:List,x:X,close:X,search:MagnifyingGlass,settings:Gear,externalLink:ArrowSquareOut,chevronLeft:CaretLeft,chevronRight:CaretRight,chevronDown:CaretDown,chevronUp:CaretUp,edit:Pencil,delete:Trash,add:Plus,remove:Minus,download:Download,upload:Upload,refresh:ArrowClockwise,save:FloppyDisk,copy:Copy,loader:SpinnerGap,success:CheckCircle,error:XCircle,alertCircle:WarningCircle,warning:WarningCircle,info:Info,check:Check,circle:Circle,helpCircle:Question,user:User,users:Users,userPlus:UserPlus,logIn:SignIn,logOut:SignOut,eye:Eye,eyeOff:EyeSlash,chart:ChartBar,barChart:ChartBar,trendingUp:TrendUp,activity:Pulse,database:Database,zap:Lightning,fileText:FileText,file:File,folder:Folder,book:Book,bookOpen:BookOpen,mail:Envelope,message:ChatCircle,phone:Phone,image:Image,video:Video,camera:Camera,smile:Smiley,frown:SmileySad,meh:SmileyMeh,lock:Lock,unlock:LockOpen,shield:Shield,wallet:Wallet,key:Key,dollar:CurrencyDollar,dollarSign:CurrencyDollar,currency:CurrencyDollar,clock:Clock,calendar:Calendar,calendarPlus:CalendarPlus,bell:Bell,heart:Heart,star:Star,bookmark:Bookmark,share:Share,monitor:Monitor,sun:Sun,moon:Moon,lightbulb:Lightbulb,brain:Brain,flag:Flag,square:Square,sparkle:Sparkle,sparkles:Sparkle,globe:Globe,smartphone:DeviceMobile,deviceMobile:DeviceMobile,floppyDisk:FloppyDisk,ticket:Ticket,clipboard:Clipboard,wifi:WifiHigh,wifiOff:WifiSlash,cpu:Cpu,mask:MaskHappy,rocket:Rocket,layout:Layout,megaphone:Megaphone,layers:Stack,ban:Prohibit,bold:TextB,italic:TextItalic,strikethrough:TextStrikethrough,heading:TextHOne,link:Link,code:Code,fileCode:FileCode,quote:Quotes,list:List,listOrdered:ListNumbers,minus:Minus},Q={happy:"smile",sad:"frown",neutral:"meh",excited:"smile",angry:"frown",love:"heart",like:"heart",dislike:"frown"},Z={loading:"loader",success:"success",error:"error",warning:"warning",info:"info",locked:"lock",unlocked:"unlock",visible:"eye",hidden:"eyeOff"},rt={navigation:["home","arrowLeft","arrowRight","arrowUp","arrowDown","menu","close","search","settings","externalLink","chevronLeft","chevronRight","chevronDown","chevronUp"],actions:["edit","delete","add","remove","download","upload","refresh","save","copy"],status:["loader","success","error","alertCircle","warning","info","check","circle"],user:["user","users","userPlus","logIn","logOut","eye","eyeOff"],data:["chart","barChart","trendingUp","activity","database","zap"],files:["fileText","file","folder","book"],communication:["mail","message","phone"],media:["image","video","camera"],emotions:["smile","frown","meh"],security:["lock","unlock","shield"],time:["clock","calendar"],ui:["bell","heart","star","bookmark","share"],theme:["monitor","sun","moon"]};var g={"arrow-left":"arrowLeft","arrow-right":"arrowRight","arrow-up":"arrowUp","arrow-down":"arrowDown","chevron-left":"chevronLeft","chevron-right":"chevronRight","chevron-up":"chevronUp","chevron-down":"chevronDown","external-link":"externalLink","more-horizontal":"moreHorizontal","more-vertical":"moreVertical","user-plus":"userPlus","log-in":"logIn","log-out":"logOut","check-circle":"checkCircle","check-square":"checkSquare","alert-circle":"alertCircle","eye-off":"eyeOff","file-text":"fileText","book-open":"bookOpen","bar-chart":"barChart","trending-up":"trendingUp","trending-down":"trendingDown","message-square":"messageSquare","calendar-plus":"calendarPlus","refresh-cw":"refreshCw","dollar-sign":"dollarSign","layout-dashboard":"layoutDashboard","device-mobile":"deviceMobile","floppy-disk":"floppyDisk",back:"arrowLeft",prev:"arrowLeft",previous:"arrowLeft",forward:"arrowRight",next:"arrowRight",close:"x",cancel:"x",remove:"delete",trash:"delete",plus:"add",new:"add",pencil:"edit",modify:"edit",store:"save",floppy:"save",magnify:"search",person:"user",account:"user",profile:"user",gear:"settings",config:"settings",preferences:"settings",house:"home",main:"home",done:"check",complete:"check",tick:"check",information:"info",help:"info",alert:"warning",caution:"warning",checkmark:"success",checkCircle:"success",fail:"error",cross:"error",xCircle:"error",spinner:"loader",loading:"loader",wait:"loader",reload:"refresh",update:"refresh",sync:"refresh",show:"eye",view:"eye",hide:"eyeOff",hidden:"eyeOff",secure:"lock",locked:"lock",unsecure:"unlock",unlocked:"unlock",get:"download",fetch:"download",post:"upload",send:"share",export:"share",duplicate:"copy",clone:"copy",email:"mail",envelope:"mail",chat:"message",comment:"message",talk:"message",date:"calendar",schedule:"calendar",time:"clock",watch:"clock",document:"fileText",doc:"fileText",text:"fileText",directory:"folder",dir:"folder",picture:"image",img:"image",movie:"video",film:"video",photo:"camera",capture:"camera",start:"play",run:"play",stop:"pause",halt:"pause",like:"heart",love:"heart",favorite:"star",saveBookmark:"bookmark",notification:"bell",notify:"bell",alarm:"bell",prefs:"settings",lookup:"search",dots:"moreHorizontal",moreMenu:"moreHorizontal",moreOptions:"moreVertical",external:"externalLink",outbound:"externalLink",open:"externalLink",url:"link",hyperlink:"link",graph:"barChart",stats:"barChart",analytics:"barChart",db:"database",storage:"database",pulse:"activity",monitor:"activity",up:"trendingUp",down:"trendingDown",lightning:"zap",bolt:"zap",flash:"zap",security:"shield",protect:"shield",password:"key",secret:"key",signin:"logIn",login:"logIn",enter:"logIn",signout:"logOut",logout:"logOut",exit:"logOut",people:"users",group:"users",team:"users",addUser:"userPlus",invite:"userPlus",read:"book",library:"book",reading:"bookOpen",openBook:"bookOpen",light:"sun",day:"sun",dark:"moon",night:"moon",screen:"monitor",display:"monitor",ai:"brain",intelligence:"brain",think:"brain",idea:"lightbulb",bulb:"lightbulb",inspiration:"lightbulb",magic:"sparkles",stars:"sparkles",glitter:"sparkles"};function tt(o){if(typeof o!="string")throw new TypeError("iconName must be a string");return g[o]||o}function nt(o){if(typeof o!="string")throw new TypeError("iconName must be a string");return Object.entries(g).filter(([e,r])=>r===o).map(([e])=>e)}var s={set:"phosphor",weight:"regular",size:20,color:"currentColor",strokeWidth:1.25,iconsaxVariant:"line"},ir=o=>{switch(o){case "lucide":return 1.25;case "phosphor":return 1.25;case "iconsax":return 1.5;default:return 1.25}};var J=createContext(s);function ar({set:o=s.set,weight:e=s.weight,iconsaxVariant:r=s.iconsaxVariant,size:a=s.size,color:d=s.color,strokeWidth:b=s.strokeWidth,children:S}){let v={set:o,weight:e,iconsaxVariant:r,size:a,color:d,strokeWidth:b};return jsx(J.Provider,{value:v,children:S})}function O(){return useContext(J)}function K(o){return !o||!/[-_]/.test(o)&&/^[a-z]/.test(o)?o:/^[A-Z]+$/.test(o)?o.toLowerCase():/^[A-Z]/.test(o)&&!/[-_]/.test(o)?o.charAt(0).toLowerCase()+o.slice(1):o.split(/[-_]/).map((e,r)=>r===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}var Y={home:{lucide:"Home",phosphor:"House",iconsax:"Home2"},"layout-dashboard":{lucide:"LayoutDashboard",phosphor:"SquaresFour"},folder:{lucide:"Folder",phosphor:"Folder",iconsax:"Folder"},"alert-circle":{lucide:"AlertCircle",phosphor:"WarningCircle",iconsax:"Danger"},alertCircle:{lucide:"AlertCircle",phosphor:"WarningCircle",iconsax:"Danger"},columns:{lucide:"Columns",phosphor:"Columns"},users:{lucide:"Users",phosphor:"Users",iconsax:"People"},settings:{lucide:"Settings",phosphor:"Gear"},menu:{lucide:"Menu",phosphor:"List",iconsax:"Menu"},close:{lucide:"X",phosphor:"X",iconsax:"CloseCircle"},chevronLeft:{lucide:"ChevronLeft",phosphor:"CaretLeft",iconsax:"ArrowLeft2"},chevronRight:{lucide:"ChevronRight",phosphor:"CaretRight",iconsax:"ArrowRight2"},chevronDown:{lucide:"ChevronDown",phosphor:"CaretDown",iconsax:"ArrowDown2"},chevronUp:{lucide:"ChevronUp",phosphor:"CaretUp",iconsax:"ArrowUp2"},arrowLeft:{lucide:"ArrowLeft",phosphor:"ArrowLeft",iconsax:"ArrowLeft"},arrowRight:{lucide:"ArrowRight",phosphor:"ArrowRight",iconsax:"ArrowRight"},arrowUp:{lucide:"ArrowUp",phosphor:"ArrowUp",iconsax:"ArrowUp"},arrowDown:{lucide:"ArrowDown",phosphor:"ArrowDown",iconsax:"ArrowDown"},add:{lucide:"Plus",phosphor:"Plus",iconsax:"Add"},edit:{lucide:"Edit",phosphor:"Pencil"},pencil:{lucide:"Pencil",phosphor:"Pencil"},delete:{lucide:"Trash2",phosphor:"Trash",iconsax:"Trash"},trash:{lucide:"Trash2",phosphor:"Trash",iconsax:"Trash"},upload:{lucide:"Upload",phosphor:"Upload",iconsax:"Upload"},download:{lucide:"Download",phosphor:"Download",iconsax:"Download"},x:{lucide:"X",phosphor:"X"},check:{lucide:"Check",phosphor:"Check",iconsax:"Check"},search:{lucide:"Search",phosphor:"MagnifyingGlass",iconsax:"SearchNormal"},share:{lucide:"Share",phosphor:"Share"},copy:{lucide:"Copy",phosphor:"Copy"},save:{lucide:"Save",phosphor:"FloppyDisk"},loader:{lucide:"Loader2",phosphor:"Spinner"},loader2:{lucide:"Loader2",phosphor:"Spinner"},"check-circle":{lucide:"CheckCircle",phosphor:"CheckCircle",iconsax:"TickCircle"},checkCircle:{lucide:"CheckCircle",phosphor:"CheckCircle",iconsax:"TickCircle"},success:{lucide:"CheckCircle",phosphor:"CheckCircle",iconsax:"TickCircle"},error:{lucide:"XCircle",phosphor:"XCircle",iconsax:"CloseCircle"},warning:{lucide:"AlertCircle",phosphor:"WarningCircle",iconsax:"Warning2"},info:{lucide:"Info",phosphor:"Info",iconsax:"InfoCircle"},refresh:{lucide:"RefreshCw",phosphor:"ArrowClockwise",iconsax:"Refresh"},refreshCw:{lucide:"RefreshCw",phosphor:"ArrowClockwise",iconsax:"Refresh"},bell:{lucide:"Bell",phosphor:"Bell",iconsax:"Bell"},heart:{lucide:"Heart",phosphor:"Heart",iconsax:"Heart"},star:{lucide:"Star",phosphor:"Star",iconsax:"Star"},bookmark:{lucide:"Bookmark",phosphor:"Bookmark"},user:{lucide:"User",phosphor:"User",iconsax:"User"},userPlus:{lucide:"UserPlus",phosphor:"UserPlus",iconsax:"UserAdd"},logIn:{lucide:"LogIn",phosphor:"SignIn",iconsax:"Login"},logOut:{lucide:"LogOut",phosphor:"SignOut",iconsax:"Logout"},chrome:{lucide:"Chrome",phosphor:"ChromeLogo",iconsax:"Chrome"},github:{lucide:"Github",phosphor:"GithubLogo"},message:{lucide:"MessageCircle",phosphor:"ChatCircle"},messageSquare:{lucide:"MessageSquare",phosphor:"ChatSquare"},"message-square":{lucide:"MessageSquare",phosphor:"ChatSquare"},inbox:{lucide:"Inbox",phosphor:"Inbox"},calendar:{lucide:"Calendar",phosphor:"Calendar"},calendarPlus:{lucide:"CalendarPlus",phosphor:"CalendarPlus"},checkSquare:{lucide:"CheckSquare",phosphor:"CheckSquare",iconsax:"TickSquare"},clock:{lucide:"Clock",phosphor:"Clock"},book:{lucide:"Book",phosphor:"Book",iconsax:"Book"},bookOpen:{lucide:"BookOpen",phosphor:"BookOpen",iconsax:"Book"},monitor:{lucide:"Monitor",phosphor:"Monitor",iconsax:"Monitor"},sun:{lucide:"Sun",phosphor:"Sun",iconsax:"Sun"},moon:{lucide:"Moon",phosphor:"Moon",iconsax:"Moon"},sparkle:{lucide:"Sparkle",phosphor:"Sparkle"},sparkles:{lucide:"Sparkles",phosphor:"Sparkle"},lightbulb:{lucide:"Lightbulb",phosphor:"Lightbulb"},brain:{lucide:"Brain",phosphor:"Brain"},zap:{lucide:"Zap",phosphor:"Lightning"},globe:{lucide:"Globe",phosphor:"Globe",iconsax:"Global"},deviceMobile:{lucide:"Smartphone",phosphor:"DeviceMobile"},smartphone:{lucide:"Smartphone",phosphor:"DeviceMobile"},floppyDisk:{lucide:"Save",phosphor:"FloppyDisk"},chart:{lucide:"BarChart3",phosphor:"ChartBar"},barChart:{lucide:"BarChart",phosphor:"ChartBar"},trendingUp:{lucide:"TrendingUp",phosphor:"TrendUp"},trendingDown:{lucide:"TrendingDown",phosphor:"TrendDown"},activity:{lucide:"Activity",phosphor:"Pulse"},database:{lucide:"Database",phosphor:"Database"},dollarSign:{lucide:"DollarSign",phosphor:"CurrencyDollar"},dollar:{lucide:"DollarSign",phosphor:"CurrencyDollar"},currency:{lucide:"DollarSign",phosphor:"CurrencyDollar"},layers:{lucide:"Layers",phosphor:"Stack"},ban:{lucide:"Ban",phosphor:"Prohibit"},lock:{lucide:"Lock",phosphor:"Lock",iconsax:"Lock"},unlock:{lucide:"Unlock",phosphor:"LockOpen",iconsax:"Unlock"},shield:{lucide:"Shield",phosphor:"Shield",iconsax:"Shield"},key:{lucide:"Key",phosphor:"Key"},play:{lucide:"Play",phosphor:"Play",iconsax:"Play"},pause:{lucide:"Pause",phosphor:"Pause",iconsax:"Pause"},image:{lucide:"Image",phosphor:"Image",iconsax:"Image"},video:{lucide:"Video",phosphor:"Video",iconsax:"Video"},camera:{lucide:"Camera",phosphor:"Camera",iconsax:"Camera"},fileText:{lucide:"FileText",phosphor:"FileText"},file:{lucide:"File",phosphor:"File"},externalLink:{lucide:"ExternalLink",phosphor:"ArrowSquareOut"},link:{lucide:"Link",phosphor:"Link",iconsax:"Link"},moreHorizontal:{lucide:"MoreHorizontal",phosphor:"DotsThreeOutline"},moreVertical:{lucide:"MoreVertical",phosphor:"DotsThreeVertical"},remove:{lucide:"Minus",phosphor:"Minus",iconsax:"Minus"},eye:{lucide:"Eye",phosphor:"Eye",iconsax:"Eye"},eyeOff:{lucide:"EyeOff",phosphor:"EyeSlash",iconsax:"EyeSlash"},smile:{lucide:"Smile",phosphor:"Smiley",iconsax:"EmojiHappy"},frown:{lucide:"Frown",phosphor:"SmileySad",iconsax:"EmojiSad"},meh:{lucide:"Meh",phosphor:"SmileyMeh",iconsax:"EmojiNormal"},mail:{lucide:"Mail",phosphor:"Envelope"},phone:{lucide:"Phone",phosphor:"Phone"},flag:{lucide:"Flag",phosphor:"Flag",iconsax:"Flag"},rocket:{lucide:"Rocket",phosphor:"Rocket",iconsax:"Rocket"},ticket:{lucide:"Ticket",phosphor:"Ticket",iconsax:"Ticket"},clipboard:{lucide:"ClipboardList",phosphor:"Clipboard",iconsax:"Sticker"},wifi:{lucide:"Wifi",phosphor:"WifiHigh",iconsax:"Wifi"},wifiOff:{lucide:"WifiOff",phosphor:"WifiSlash"},cpu:{lucide:"Cpu",phosphor:"Cpu",iconsax:"Computing"},mask:{lucide:"Drama",phosphor:"MaskHappy",iconsax:"EmojiHappy"},bold:{lucide:"Bold",phosphor:"TextB"},italic:{lucide:"Italic",phosphor:"TextItalic"},strikethrough:{lucide:"Strikethrough",phosphor:"TextStrikethrough"},heading:{lucide:"Heading",phosphor:"TextHOne"},code:{lucide:"Code",phosphor:"Code",iconsax:"Code"},fileCode:{lucide:"FileCode",phosphor:"FileCode"},quote:{lucide:"Quote",phosphor:"Quotes",iconsax:"QuoteUp"},list:{lucide:"List",phosphor:"List"},listOrdered:{lucide:"ListOrdered",phosphor:"ListNumbers"},minus:{lucide:"Minus",phosphor:"Minus",iconsax:"Minus"}};function U(o,e="phosphor"){return null;}function oo(o,e){let r=Y[o];if(r){let a=r[e];if(a)return a}return o}function eo(o){if(!o||typeof o!="string")return {normalized:o||"",wasAlias:false};let e=K(o),r=g[o]||g[e];return r?{normalized:r,wasAlias:true,originalAlias:o}:{normalized:e,wasAlias:false}}var ro=t.forwardRef(({name:o,size:e,className:r,emotion:a$1,status:d$1,provider:b,weight:S,animated:v=false,pulse:co=false,spin:lo=false,bounce:po=false,variant:p="default","aria-label":k,"aria-hidden":x},E)=>{var W,z;let m=O(),n=b||m.set,i=e!=null?e:m.size,ho=S||m.weight,uo=m.color,mo=(W=m.strokeWidth)!=null?W:1.25,N=(z=m.iconsaxVariant)!=null?z:"line",[L,fo]=t.useState(false);t.useEffect(()=>{fo(true);},[]);let P=t.useMemo(()=>{let y=a$1?Q[a$1]:d$1?Z[d$1]:o,{normalized:B}=eo(y),xo=oo(B,n);return {normalized:B,providerName:xo}},[o,a$1,d$1,n]),h=P.normalized,go=t.useMemo(()=>{return null},[n,P.providerName,L,N]),C=d({"text-current":p==="default","text-primary":p==="primary","text-muted-foreground":p==="secondary"||p==="muted","text-green-600 dark:text-green-400":p==="success","text-yellow-600 dark:text-yellow-400":p==="warning","text-destructive":p==="error"});if(!L)return jsx("span",{style:{width:i,height:i},className:a(C,r),"aria-hidden":x!==void 0?x:true,"aria-label":k});let l=null;if(n==="phosphor"?l=$[h]||null:n==="iconsax"?(l=go,l||(l=U(h,n))):l=U(h,n),!l)return n==="iconsax"&&true?process.env.NODE_ENV==="development"&&console.warn(`Icon "${h}" \u2014 iconsax resolver not registered. Use HuaProvider with icons.set='iconsax', or add: import '@hua-labs/ui/iconsax'`):console.warn(`Icon "${h}" not found for provider "${n}"`),jsx("span",{ref:E,className:a("inline-flex items-center justify-center rounded-full border-2 border-dashed border-border",C,r),style:{width:i,height:i},"aria-label":k||`\uC544\uC774\uCF58\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C: ${h}`,title:`Icon not found: ${h}`,children:jsx("span",{className:"text-xs text-muted-foreground","aria-hidden":"true",children:"?"})});let T={size:typeof i=="number"?i:void 0,width:i,height:i,color:uo};n==="phosphor"?T.weight=ho:T.strokeWidth=mo;let ko=d({"animate-pulse":co,"animate-spin":lo,"animate-bounce":po,"transition-all duration-200 ease-in-out":v}),f={};return k?(f["aria-label"]=k,f["aria-hidden"]=false):x!==void 0?f["aria-hidden"]=x:f["aria-hidden"]=true,jsx("span",{ref:E,className:a("inline-flex items-center justify-center",ko,C,r),style:{width:i,height:i},...f,children:l&&t.createElement(l,{...T,className:C,"aria-hidden":true})})});ro.displayName="Icon";var cr=t.memo(ro,(o,e)=>o.name===e.name&&o.size===e.size&&o.className===e.className&&o.emotion===e.emotion&&o.status===e.status&&o.provider===e.provider&&o.animated===e.animated&&o.pulse===e.pulse&&o.spin===e.spin&&o.bounce===e.bounce&&o.variant===e.variant&&o.weight===e.weight&&o["aria-label"]===e["aria-label"]&&o["aria-hidden"]===e["aria-hidden"]),u=cr;u.displayName="Icon";var io=t.forwardRef((o,e)=>jsx(u,{ref:e,name:"smile",...o}));io.displayName="EmotionIcon";var to=t.forwardRef((o,e)=>jsx(u,{ref:e,name:"info",...o}));to.displayName="StatusIcon";var no=t.forwardRef((o,e)=>jsx(u,{ref:e,name:"loader",status:"loading",spin:true,"aria-label":"\uB85C\uB529 \uC911",...o}));no.displayName="LoadingIcon";var ao=t.forwardRef((o,e)=>jsx(u,{ref:e,name:"check",status:"success",variant:"success","aria-label":"\uC131\uACF5",...o}));ao.displayName="SuccessIcon";var so=t.forwardRef((o,e)=>jsx(u,{ref:e,name:"alertCircle",status:"error",variant:"error","aria-label":"\uC624\uB958",...o}));so.displayName="ErrorIcon";export{Q as a,Z as b,rt as c,Y as d,g as e,tt as f,nt as g,s as h,ir as i,ar as j,O as k,u as l,io as m,to as n,no as o,ao as p,so as q};//# sourceMappingURL=chunk-ZQUMJQYV.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-ZQUMJQYV.mjs.map
|