@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
package/dist/advanced.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/styles/system/tokens.ts","../src/advanced/Logo.tsx","../src/components/Bookmark.tsx","../src/components/ChatMessage.tsx","../src/components/EmotionMeter.tsx","../src/components/EmotionAnalysis.tsx","../src/components/EmotionButton.tsx","../src/components/EmotionSelector.tsx","../src/components/LanguageToggle.tsx","../src/components/ScrollIndicator.tsx","../src/components/scrollbar/scrollbar.tsx","../src/components/InfoCard.tsx","../src/components/Timeline.tsx"],"names":["defaultTokens","EMBLEM_PATH","WORDMARK_PATH","getSizeInRem","size","Logo","variant","animated","className","props","sizeInRem","useEffect","styleId","style","existingStyle","jsx","merge","wordmarkRatio","jsxs","Bookmark","React","id","storageKey","defaultBookmarked","onBookmarkChange","ref","isBookmarked","setIsBookmarked","useState","savedBookmarks","bookmarks","toggleBookmark","newBookmarked","index","sizeClasses","variantClasses","Icon","ChatMessage","message","user","assistant","showAvatar","showTimestamp","showEmotion","theme","_a","_b","_c","isUser","getEmotionColor","emotion","formatTime","date","Avatar","AvatarImage","AvatarFallback","Badge","Card","CardContent","EmotionMeter","value","max","color","emotionColors","percentage","EmotionAnalysis","primaryEmotion","emotionDistribution","keywords","intensity","positivity","energy","showMeter","showDistribution","showKeywords","showMetrics","layout","getIntensityLabel","getPositivityLabel","getEnergyLabel","Fragment","keyword","CardHeader","CardTitle","CardDescription","item","EmotionButton","isSelected","defaultEmotions","EmotionSelector","selectedEmotion","onEmotionSelect","showIntensity","onIntensityChange","emotions","handleEmotionClick","emotionKey","renderEmotionItem","layoutClasses","e","LanguageToggle","showLabel","languages","currentLanguage","onLanguageChange","_ref","isOpen","setIsOpen","dropdownRef","currentLang","lang","handleClickOutside","event","handleLanguageChange","languageCode","renderIcon","language","nextIndex","ScrollIndicator","targetId","text","iconName","iconSize","position","autoHide","hideThreshold","isVisible","setIsVisible","handleScroll","scrollTop","scrollToTarget","targetElement","currentSection","nextSection","positionClasses","Button","Scrollbar","orientation","smooth","children","getVariantClasses","getSizeClasses","getOrientationClasses","baseClasses","toneClasses","InfoCard","title","icon","tone","t","STATUS_CONFIG","SIZE_CONFIG","formatDate","locale","parsed","Timeline","items","align","highlightedId","emptyState","showConnector","hasItems","sizeConfig","status","statusConfig","isHighlighted","showLine","isAlternateRight","isRight","itemContent"],"mappings":"k+CAoEO,IAAMA,CAAAA,CAA8B,CA+CzC,OAAA,CAAS,CAEP,GAAI,MAAA,CACJ,EAAA,CAAI,QAAA,CACJ,EAAA,CAAI,MACN,CA6BF,CAAA,CCrGA,IAAMC,CAAAA,CACJ,w0BAAA,CAKIC,EAAAA,CACJ,o3PAAA,CAKF,SAASC,EAAAA,CAAaC,CAAAA,CAAwB,CAC5C,OAAI,OAAOA,CAAAA,EAAS,QAAA,CACX,CAAA,EAAGA,CAAI,CAAA,GAAA,CAAA,CAIoC,CAClD,EAAA,CAAIJ,CAAAA,CAAc,OAAA,CAAQ,EAAA,CAC1B,EAAA,CAAIA,CAAAA,CAAc,OAAA,CAAQ,GAC1B,EAAA,CAAIA,CAAAA,CAAc,OAAA,CAAQ,EAC5B,CAAA,CAEeI,CAAI,CACrB,CAuBO,SAASC,EAAAA,CAAK,CACnB,OAAA,CAAAC,CAAAA,CAAU,QAAA,CACV,IAAA,CAAAF,CAAAA,CAAO,IAAA,CACP,QAAA,CAAAG,CAAAA,CAAW,KAAA,CACX,SAAA,CAAAC,CAAAA,CACA,GAAGC,CACL,CAAA,CAAc,CACZ,IAAMC,CAAAA,CAAYP,EAAAA,CAAaC,CAAI,EAoDnC,GAjDAO,SAAAA,CAAU,IAAM,CACd,GAAI,CAACJ,CAAAA,CAAU,OAEf,IAAMK,CAAAA,CAAU,oBAAA,CAChB,GAAI,QAAA,CAAS,cAAA,CAAeA,CAAO,CAAA,CAAG,OAEtC,IAAMC,CAAAA,CAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA,CAC5C,OAAAA,CAAAA,CAAM,EAAA,CAAKD,CAAAA,CACXC,CAAAA,CAAM,WAAA,CAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA,CA8BpB,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYA,CAAK,CAAA,CAExB,IAAM,CACX,IAAMC,CAAAA,CAAgB,QAAA,CAAS,cAAA,CAAeF,CAAO,CAAA,CACjDE,CAAAA,EACFA,CAAAA,CAAc,MAAA,GAElB,CACF,CAAA,CAAG,CAACP,CAAQ,CAAC,CAAA,CAGTD,CAAAA,GAAY,QAAA,CACd,OACES,GAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAOL,EACP,MAAA,CAAQA,CAAAA,CACR,OAAA,CAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CACL,KAAA,CAAM,4BAAA,CACN,SAAA,CAAWM,CAAAA,CAAM,iBAAA,CAAmBR,CAAS,CAAA,CAE7C,QAAA,CAAAO,GAAAA,CAAC,MAAA,CAAA,CACC,CAAA,CAAGd,CAAAA,CACH,IAAA,CAAMM,CAAAA,CAAW,MAAA,CAAS,cAAA,CAC1B,MAAA,CAAQA,CAAAA,CAAW,cAAA,CAAiB,MAAA,CACpC,WAAA,CAAaA,CAAAA,CAAW,KAAA,CAAQ,MAAA,CAChC,cAAc,OAAA,CACd,cAAA,CAAe,OAAA,CACf,SAAA,CAAWA,CAAAA,CAAW,eAAA,CAAkB,MAAA,CAC1C,CAAA,CACF,CAAA,CAMJ,IAAMU,CAAAA,CAAgB,GAAA,CAAM,EAAA,CAE5B,OACEC,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWF,CAAAA,CAAM,wDAAA,CAA0DR,CAAS,CAAA,CACnF,GAAIC,CAAAA,CAGL,QAAA,CAAA,CAAAM,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CACL,MAAM,4BAAA,CACN,SAAA,CAAU,eAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAOL,CAAAA,CAAW,MAAA,CAAQA,CAAU,CAAA,CAE7C,QAAA,CAAAK,GAAAA,CAAC,MAAA,CAAA,CACC,CAAA,CAAGd,CAAAA,CACH,IAAA,CAAMM,CAAAA,CAAW,MAAA,CAAS,cAAA,CAC1B,MAAA,CAAQA,CAAAA,CAAW,cAAA,CAAiB,MAAA,CACpC,WAAA,CAAaA,CAAAA,CAAW,KAAA,CAAQ,MAAA,CAChC,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,QACf,SAAA,CAAWA,CAAAA,CAAW,eAAA,CAAkB,MAAA,CAC1C,CAAA,CACF,CAAA,CAEAQ,GAAAA,CAAC,KAAA,CAAA,CACC,OAAA,CAAQ,aAAA,CACR,IAAA,CAAK,MAAA,CACL,KAAA,CAAM,4BAAA,CACN,SAAA,CAAU,eAAA,CACV,KAAA,CAAO,CACL,MAAA,CAAQL,CAAAA,CACR,KAAA,CAAO,CAAA,KAAA,EAAQA,CAAS,CAAA,GAAA,EAAMO,CAAa,CAAA,CAAA,CAC7C,CAAA,CAEA,QAAA,CAAAF,GAAAA,CAAC,MAAA,CAAA,CACC,EAAGb,EAAAA,CACH,IAAA,CAAMK,CAAAA,CAAW,MAAA,CAAS,cAAA,CAC1B,MAAA,CAAQA,CAAAA,CAAW,cAAA,CAAiB,MAAA,CACpC,WAAA,CAAaA,CAAAA,CAAW,KAAA,CAAQ,MAAA,CAChC,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CACf,SAAA,CAAWA,CAAAA,CAAW,mBAAA,CAAsB,MAAA,CAC9C,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CChLA,IAAMY,EAAAA,CAAWC,CAAAA,CAAM,UAAA,CACrB,CAAC,CACC,SAAA,CAAAZ,CAAAA,CACA,EAAA,CAAAa,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAAa,WAAA,CACb,iBAAA,CAAAC,CAAAA,CAAoB,KAAA,CACpB,gBAAA,CAAAC,CAAAA,CACA,IAAA,CAAApB,CAAAA,CAAO,IAAA,CACP,OAAA,CAAAE,CAAAA,CAAU,SAAA,CACV,GAAGG,CACL,EAAGgB,CAAAA,GAAQ,CACT,GAAM,CAACC,CAAAA,CAAcC,CAAe,CAAA,CAAIC,QAAAA,CAASL,CAAiB,CAAA,CAGlEZ,SAAAA,CAAU,IAAM,CACd,IAAMkB,CAAAA,CAAiB,YAAA,CAAa,OAAA,CAAQP,CAAU,CAAA,CACtD,GAAIO,CAAAA,CAAgB,CAClB,IAAMC,CAAAA,CAAY,IAAA,CAAK,KAAA,CAAMD,CAAc,CAAA,CAC3CF,CAAAA,CAAgBG,CAAAA,CAAU,SAAST,CAAE,CAAC,EACxC,CACF,CAAA,CAAG,CAACA,CAAAA,CAAIC,CAAU,CAAC,CAAA,CAGnB,IAAMS,GAAAA,CAAiB,IAAM,CAC3B,IAAMC,CAAAA,CAAgB,CAACN,CAAAA,CACvBC,CAAAA,CAAgBK,CAAa,CAAA,CAG7B,IAAMH,CAAAA,CAAiB,YAAA,CAAa,OAAA,CAAQP,CAAU,CAAA,CAChDQ,CAAAA,CAAYD,CAAAA,CAAiB,IAAA,CAAK,MAAMA,CAAc,CAAA,CAAI,EAAC,CAEjE,GAAIG,CAAAA,CACGF,CAAAA,CAAU,QAAA,CAAST,CAAE,CAAA,EACxBS,CAAAA,CAAU,IAAA,CAAKT,CAAE,CAAA,CAAA,KAEd,CACL,IAAMY,CAAAA,CAAQH,CAAAA,CAAU,OAAA,CAAQT,CAAE,CAAA,CAC9BY,CAAAA,CAAQ,EAAA,EACVH,CAAAA,CAAU,MAAA,CAAOG,CAAAA,CAAO,CAAC,EAE7B,CAEA,YAAA,CAAa,QAAQX,CAAAA,CAAY,IAAA,CAAK,SAAA,CAAUQ,CAAS,CAAC,CAAA,CAC1DN,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAmBQ,CAAAA,EACrB,CAAA,CAEME,CAAAA,CAAc,CAClB,EAAA,CAAI,SAAA,CACJ,EAAA,CAAI,SAAA,CACJ,EAAA,CAAI,WACN,CAAA,CAEMC,CAAAA,CAAiB,CACrB,OAAA,CAAS,+DAAA,CACT,MAAA,CAAQ,yDAAA,CACR,OAAA,CAAS,oHACX,CAAA,CAEA,OACEpB,IAAC,QAAA,CAAA,CACC,GAAA,CAAKU,CAAAA,CACL,OAAA,CAASM,GAAAA,CACT,SAAA,CAAWf,CAAAA,CACT,uLAAA,CACAkB,CAAAA,CAAY9B,CAAI,CAAA,CAChB+B,CAAAA,CAAe7B,CAAO,CAAA,CACtBE,CACF,CAAA,CACC,GAAGC,CAAAA,CAEJ,QAAA,CAAAM,GAAAA,CAACqB,CAAAA,CAAA,CACC,IAAA,CAAK,MAAA,CACL,SAAA,CAAWpB,CAAAA,CACT,6BAAA,CACAU,CAAAA,EAAgB,cAClB,CAAA,CACF,EACF,CAEJ,CACF,EAEAP,EAAAA,CAAS,WAAA,CAAc,UAAA,CC5BvB,IAAMkB,EAAAA,CAAcjB,CAAAA,CAAM,UAAA,CACxB,CAAC,CACC,SAAA,CAAAZ,CAAAA,CACA,OAAA,CAAA8B,GAAAA,CACA,IAAA,CAAAC,CAAAA,CAAO,CAAE,IAAA,CAAM,oBAAA,CAAO,MAAO,SAAU,CAAA,CACvC,SAAA,CAAAC,CAAAA,CAAY,CAAE,IAAA,CAAM,IAAA,CAAM,KAAA,CAAO,SAAU,CAAA,CAC3C,UAAA,CAAAC,GAAAA,CAAa,IAAA,CACb,aAAA,CAAAC,CAAAA,CAAgB,IAAA,CAChB,WAAA,CAAAC,CAAAA,CAAc,IAAA,CACd,OAAA,CAAArC,CAAAA,CAAU,SAAA,CACV,KAAA,CAAAsC,CAAAA,CAAQ,CACN,YAAA,CAAc,SAAA,CACd,cAAA,CAAgB,SAAA,CAChB,UAAA,CAAY,UACZ,YAAA,CAAc,SAChB,CAAA,CACA,GAAGnC,CACL,CAAA,CAAGgB,CAAAA,GAAQ,CA3Hb,IAAAoB,CAAAA,CAAAC,CAAAA,CAAAC,CAAAA,CA4HI,IAAMC,CAAAA,CAASV,GAAAA,CAAQ,IAAA,GAAS,MAAA,CACXA,GAAAA,CAAQ,IAAA,GAAS,WAAA,CACpBA,GAAAA,CAAQ,IAAA,GAAS,QAAA,KAE7BW,CAAAA,CAAmBC,CAAAA,EAClBA,CAAAA,CAEiB,CACpB,GAAA,CAAK,+BAAA,CACL,OAAA,CAAS,6BAAA,CACT,KAAA,CAAO,yBAAA,CACP,IAAA,CAAM,6BAAA,CACN,UAAA,CAAY,2BAAA,CACZ,KAAA,CAAO,2BAAA,CACP,SAAA,CAAW,+BAAA,CACX,UAAA,CAAY,+BACd,CAAA,CAEqBA,CAAqC,CAAA,EAAK,2BAAA,CAb1C,aAAA,CAgBjBC,CAAAA,CAAcC,CAAAA,EACXA,CAAAA,CAAK,kBAAA,CAAmB,OAAA,CAAS,CACtC,IAAA,CAAM,SAAA,CACN,MAAA,CAAQ,SACV,CAAC,EAGH,OAAI9C,CAAAA,GAAY,QAAA,CAEZS,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKU,CAAAA,CACL,SAAA,CAAWT,CAAAA,CACT,aAAA,CACAgC,CAAAA,CAAS,aAAA,CAAgB,eAAA,CACzBxC,CACF,CAAA,CACC,GAAGC,CAAAA,CAEJ,QAAA,CAAAS,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWF,CAAAA,CACd,4BAAA,CACAgC,CAAAA,CAAS,kCAAA,CAAqC,UAChD,CAAA,CACG,QAAA,CAAA,CAAAP,GAAAA,EACCvB,IAAAA,CAACmC,CAAAA,CAAA,CAAO,SAAA,CAAU,uBAAA,CAChB,QAAA,CAAA,CAAAtC,GAAAA,CAACuC,GAAAA,CAAA,CACC,GAAA,CAAKN,CAAAA,CAAST,CAAAA,CAAK,MAAA,CAASC,CAAAA,CAAU,MAAA,CACtC,GAAA,CAAKQ,CAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,CAAAA,CAAU,IAAA,CACtC,CAAA,CACAzB,GAAAA,CAACwC,CAAAA,CAAA,CACC,KAAA,CAAO,CACL,eAAA,CAAiBP,CAAAA,CAAST,CAAAA,CAAK,KAAA,CAAQC,CAAAA,CAAU,KACnD,EAEE,QAAA,CAAA,CAAAK,CAAAA,CAAAG,CAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,CAAAA,CAAU,IAAA,GAA/B,IAAA,CAAA,MAAA,CAAAK,CAAAA,CAAsC,MAAA,CAAO,CAAA,CAAA,CACjD,CAAA,CAAA,CACF,CAAA,CAGF3B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWC,CAAAA,CACT,8CAAA,CACAgC,CAAAA,CACI,eAAA,CACA,eACN,CAAA,CACA,KAAA,CAAO,CACL,eAAA,CAAiBA,EAASJ,CAAAA,CAAM,YAAA,CAAeA,CAAAA,CAAM,UAAA,CACrD,KAAA,CAAOI,CAAAA,CAASJ,CAAAA,CAAM,cAAA,CAAiBA,CAAAA,CAAM,YAC/C,CAAA,CAEC,QAAA,CAAAN,GAAAA,CAAQ,QAAA,CACPpB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CAAiD,CAAA,CAChEA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0DAAA,CAA2D,CAAA,CAC1EA,GAAAA,CAAC,OAAI,SAAA,CAAU,0DAAA,CAA2D,CAAA,CAAA,CAC5E,CAAA,CAEAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAuB,QAAA,CAAAuB,GAAAA,CAAQ,OAAA,CAAQ,CAAA,CAE1D,CAAA,CAEApB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWF,CAAAA,CACd,2DAAA,CACAgC,CAAAA,CAAS,aAAA,CAAgB,eAC3B,CAAA,CACG,QAAA,CAAA,CAAAN,CAAAA,EACC3B,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAoC,CAAAA,CAAWb,GAAAA,CAAQ,SAAS,EAAE,CAAA,CAEtCK,CAAAA,EAAeL,GAAAA,CAAQ,OAAA,EACtBvB,GAAAA,CAACyC,GAAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,SAAA,CAAWxC,CAAAA,CAAM,SAAA,CAAWiC,CAAAA,CAAgBX,GAAAA,CAAQ,OAAO,CAAC,CAAA,CAE3D,QAAA,CAAAA,GAAAA,CAAQ,OAAA,CACX,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAIAhC,CAAAA,GAAY,SAAA,CAEZY,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKO,EACL,SAAA,CAAWT,CAAAA,CACT,iCAAA,CACAR,CACF,CAAA,CACC,GAAGC,CAAAA,CAEH,QAAA,CAAA,CAAAgC,GAAAA,EACCvB,IAAAA,CAACmC,CAAAA,CAAA,CAAO,SAAA,CAAU,uBAAA,CAChB,QAAA,CAAA,CAAAtC,GAAAA,CAACuC,GAAAA,CAAA,CACC,GAAA,CAAKN,CAAAA,CAAST,CAAAA,CAAK,MAAA,CAASC,CAAAA,CAAU,MAAA,CACtC,GAAA,CAAKQ,CAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,CAAAA,CAAU,IAAA,CACtC,CAAA,CACAzB,GAAAA,CAACwC,CAAAA,CAAA,CACC,KAAA,CAAO,CACL,eAAA,CAAiBP,CAAAA,CAAST,CAAAA,CAAK,KAAA,CAAQC,CAAAA,CAAU,KACnD,CAAA,CAEE,QAAA,CAAA,CAAAM,CAAAA,CAAAE,CAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,CAAAA,CAAU,IAAA,GAA/B,IAAA,CAAA,MAAA,CAAAM,CAAAA,CAAsC,MAAA,CAAO,CAAA,CAAA,CACjD,CAAA,CAAA,CACF,CAAA,CAGF5B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,OAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CACb,QAAA,CAAAiC,CAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,CAAAA,CAAU,IAAA,CAClC,CAAA,CACCE,CAAAA,EACC3B,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAAoC,CAAAA,CAAWb,GAAAA,CAAQ,SAAS,CAAA,CAC/B,CAAA,CAEDK,CAAAA,EAAeL,GAAAA,CAAQ,OAAA,EACtBvB,GAAAA,CAACyC,GAAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,SAAA,CAAWxC,CAAAA,CAAM,SAAA,CAAWiC,CAAAA,CAAgBX,GAAAA,CAAQ,OAAO,CAAC,CAAA,CAE3D,QAAA,CAAAA,GAAAA,CAAQ,OAAA,CACX,CAAA,CAAA,CAEJ,CAAA,CAEAvB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACZ,QAAA,CAAAuB,GAAAA,CAAQ,QAAA,CACPpB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8DAA8D,CAAA,CAC7EA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CAAwE,CAAA,CACvFA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CAAwE,CAAA,CAAA,CACzF,CAAA,CAEAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAuB,QAAA,CAAAuB,GAAAA,CAAQ,OAAA,CAAQ,CAAA,CAE1D,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAMFpB,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKO,CAAAA,CACL,SAAA,CAAWT,CAAAA,CACT,iCAAA,CACAR,CACF,CAAA,CACC,GAAGC,CAAAA,CAEH,QAAA,CAAA,CAAAgC,GAAAA,EACCvB,IAAAA,CAACmC,CAAAA,CAAA,CAAO,SAAA,CAAU,yBAAA,CAChB,QAAA,CAAA,CAAAtC,GAAAA,CAACuC,GAAAA,CAAA,CACC,GAAA,CAAKN,CAAAA,CAAST,CAAAA,CAAK,MAAA,CAASC,CAAAA,CAAU,MAAA,CACtC,GAAA,CAAKQ,CAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,CAAAA,CAAU,IAAA,CACtC,CAAA,CACAzB,GAAAA,CAACwC,CAAAA,CAAA,CACC,MAAO,CACL,eAAA,CAAiBP,CAAAA,CAAST,CAAAA,CAAK,KAAA,CAAQC,CAAAA,CAAU,KACnD,CAAA,CAEE,QAAA,CAAA,CAAAO,CAAAA,CAAAC,CAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,CAAAA,CAAU,IAAA,GAA/B,IAAA,CAAA,MAAA,CAAAO,CAAAA,CAAsC,MAAA,CAAO,CAAA,CAAA,CACjD,CAAA,CAAA,CACF,CAAA,CAGF7B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,UAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CACb,QAAA,CAAAiC,CAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,CAAAA,CAAU,IAAA,CAClC,CAAA,CACCE,CAAAA,EACC3B,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAAoC,CAAAA,CAAWb,GAAAA,CAAQ,SAAS,CAAA,CAC/B,CAAA,CAEDK,CAAAA,EAAeL,GAAAA,CAAQ,OAAA,EACtBvB,GAAAA,CAACyC,GAAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,UAAWxC,CAAAA,CAAM,SAAA,CAAWiC,CAAAA,CAAgBX,GAAAA,CAAQ,OAAO,CAAC,CAAA,CAE3D,QAAA,CAAAA,GAAAA,CAAQ,OAAA,CACX,CAAA,CAAA,CAEJ,CAAA,CAEAvB,GAAAA,CAAC0C,GAAAA,CAAA,CAAK,SAAA,CAAWzC,CAAAA,CACf,cAAA,CACAgC,CAAAA,CAAS,oCAAA,CAAuC,UAClD,CAAA,CACE,QAAA,CAAAjC,GAAAA,CAAC2C,CAAAA,CAAA,CAAY,SAAA,CAAU,KAAA,CACpB,QAAA,CAAApB,GAAAA,CAAQ,QAAA,CACPpB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CAAiD,CAAA,CAChEA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0DAAA,CAA2D,CAAA,CAC1EA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0DAAA,CAA2D,CAAA,CAAA,CAC5E,CAAA,CAEAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAuB,QAAA,CAAAuB,GAAAA,CAAQ,OAAA,CAAQ,CAAA,CAE1D,CAAA,CACF,CAAA,CAAA,CACF,GACF,CAEJ,CACF,EAEAD,EAAAA,CAAY,WAAA,CAAc,aAAA,CCvT1B,IAAMsB,CAAAA,CAAevC,CAAAA,CAAM,UAAA,CACzB,CAAC,CAAE,SAAA,CAAAZ,CAAAA,CAAW,KAAA,CAAAoD,CAAAA,CAAO,GAAA,CAAAC,CAAAA,CAAM,GAAA,CAAK,IAAA,CAAAzD,CAAAA,CAAO,KAAM,KAAA,CAAA0D,CAAAA,CAAQ,MAAA,CAAQ,GAAGrD,CAAM,CAAA,CAAGgB,CAAAA,GAAQ,CAC/E,IAAMS,CAAAA,CAAc,CAClB,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KACN,CAAA,CAGM6B,CAAAA,CAAwC,CAC5C,IAAA,CAAM,eAAA,CACN,KAAA,CAAO,cAAA,CACP,MAAA,CAAQ,eAAA,CACR,GAAA,CAAK,YAAA,CAEL,MAAA,CAAQ,eAAA,CACR,OAAQ,eAAA,CACR,MAAA,CAAQ,eAAA,CACR,IAAA,CAAM,aAAA,CACN,IAAA,CAAM,aACR,CAAA,CAEMC,CAAAA,CAAa,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAKJ,CAAAA,CAAQC,CAAAA,CAAO,GAAA,CAAK,CAAC,CAAA,CAAG,GAAG,CAAA,CAEjE,OACE9C,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKU,CAAAA,CACL,SAAA,CAAWT,CAAAA,CACT,kDAAA,CACAkB,CAAAA,CAAY9B,CAAI,EAChBI,CACF,CAAA,CACC,GAAGC,CAAAA,CAEJ,QAAA,CAAAM,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWC,CAAAA,CACT,iDAAA,CACA+C,CAAAA,CAAcD,CAAK,CAAA,EAAKC,CAAAA,CAAc,IACxC,CAAA,CACA,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGC,CAAU,CAAA,CAAA,CAAI,CAAA,CACnC,CAAA,CACF,CAEJ,CACF,EACAL,CAAAA,CAAa,WAAA,CAAc,cAAA,CCL3B,IAAMM,EAAAA,CAAkB7C,CAAAA,CAAM,UAAA,CAC5B,CAAC,CACC,SAAA,CAAAZ,GAAAA,CACA,cAAA,CAAA0D,GAAAA,CACA,mBAAA,CAAAC,CAAAA,CAAsB,EAAC,CACvB,QAAA,CAAAC,CAAAA,CAAW,EAAC,CACZ,SAAA,CAAAC,CAAAA,CAAY,EAAA,CACZ,UAAA,CAAAC,CAAAA,CAAa,GACb,MAAA,CAAAC,CAAAA,CAAS,EAAA,CACT,SAAA,CAAAC,CAAAA,CAAY,IAAA,CACZ,gBAAA,CAAAC,CAAAA,CAAmB,IAAA,CACnB,YAAA,CAAAC,CAAAA,CAAe,IAAA,CACf,WAAA,CAAAC,CAAAA,CAAc,IAAA,CACd,MAAA,CAAAC,CAAAA,CAAS,UAAA,CACT,GAAGnE,CACL,CAAA,CAAGgB,CAAAA,GAAQ,CACT,IAAMoD,CAAAA,CAAqBjB,CAAAA,EACrBA,CAAAA,CAAQ,EAAA,CAAW,cAAA,CACnBA,CAAAA,CAAQ,GAAW,cAAA,CAChB,cAAA,CAGHkB,CAAAA,CAAsBlB,CAAAA,EACtBA,CAAAA,CAAQ,EAAA,CAAW,oBAAA,CACnBA,CAAAA,CAAQ,EAAA,CAAW,oBAAA,CAChB,oBAAA,CAGHmB,CAAAA,CAAkBnB,CAAAA,EAClBA,CAAAA,CAAQ,EAAA,CAAW,cAAA,CACnBA,CAAAA,CAAQ,EAAA,CAAW,cAAA,CAChB,cAAA,CAGT,OAAIgB,CAAAA,GAAW,SAAA,CAEX1D,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKO,CAAAA,CACL,SAAA,CAAWT,CAAAA,CAAM,WAAA,CAAaR,GAAS,CAAA,CACtC,GAAGC,CAAAA,CAEH,QAAA,CAAA,CAAAyD,GAAAA,EACChD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,4BAAA,CAAM,CAAA,CAC5CG,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAA,CAAAgD,GAAAA,CAAe,IAAA,CAAK,IAAA,CAAGA,GAAAA,CAAe,SAAA,CAAU,MACnD,CAAA,CACCM,CAAAA,EACCzD,GAAAA,CAAC4C,CAAAA,CAAA,CACC,KAAA,CAAOO,GAAAA,CAAe,SAAA,CACtB,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,MAAA,CACR,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAGDS,CAAAA,EACCzD,IAAAA,CAAA8D,QAAAA,CAAA,CACE,QAAA,CAAA,CAAA9D,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,4BAAA,CAAM,EAC5CA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAA8D,CAAAA,CAAkBR,CAAS,CAAA,CAC9B,CAAA,CAAA,CACF,CAAA,CACAnD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,qBAAA,CAAI,CAAA,CAC1CA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAA+D,CAAAA,CAAmBR,CAAU,CAAA,CAChC,CAAA,CAAA,CACF,EACApD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,qBAAA,CAAI,CAAA,CAC1CA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAAgE,CAAAA,CAAeR,CAAM,CAAA,CACxB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGDG,CAAAA,EAAgBN,CAAAA,CAAS,MAAA,CAAS,CAAA,EACjClD,IAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAH,GAAAA,CAAC,QAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,qBAAA,CAAI,CAAA,CAC1CA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACZ,QAAA,CAAAqD,CAAAA,CAAS,GAAA,CAAKa,CAAAA,EACblE,GAAAA,CAACyC,GAAAA,CAAA,CAAoB,OAAA,CAAQ,WAAA,CAAY,SAAA,CAAU,SAAA,CAChD,QAAA,CAAAyB,CAAAA,CAAAA,CADSA,CAEZ,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAIAL,CAAAA,GAAW,MAAA,CAEX1D,IAAAA,CAACuC,IAAA,CACC,GAAA,CAAKhC,CAAAA,CACL,SAAA,CAAWT,CAAAA,CAAM,EAAA,CAAIR,GAAS,CAAA,CAC7B,GAAGC,CAAAA,CAEJ,QAAA,CAAA,CAAAS,IAAAA,CAACgE,GAAAA,CAAA,CACC,QAAA,CAAA,CAAAhE,IAAAA,CAACiE,GAAAA,CAAA,CAAU,SAAA,CAAU,mBAAA,CACnB,QAAA,CAAA,CAAApE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,QAAA,CAAC,CAAA,CAAO,iBAAA,CAAA,CAE1C,CAAA,CACAA,GAAAA,CAACqE,EAAA,CAAgB,QAAA,CAAA,wCAAA,CAEjB,CAAA,CAAA,CACF,CAAA,CACAlE,IAAAA,CAACwC,CAAAA,CAAA,CAAY,SAAA,CAAU,WAAA,CACpB,QAAA,CAAA,CAAAQ,GAAAA,EACChD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,4BAAA,CAAM,CAAA,CACpCG,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,6BACb,QAAA,CAAA,CAAAgD,GAAAA,CAAe,IAAA,CAAK,IAAA,CAAGA,GAAAA,CAAe,SAAA,CAAU,IAAA,CAAA,CACnD,CAAA,CAAA,CACF,CAAA,CACCM,CAAAA,EACCzD,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,QAAA,CAAAA,GAAAA,CAAC4C,CAAAA,CAAA,CACC,KAAA,CAAOO,GAAAA,CAAe,SAAA,CACtB,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,MAAA,CACR,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAGDS,CAAAA,EACCzD,IAAAA,CAAA8D,QAAAA,CAAA,CACE,QAAA,CAAA,CAAA9D,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,4BAAA,CAAM,CAAA,CACpCA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4BAAA,CACb,QAAA,CAAA8D,CAAAA,CAAkBR,CAAS,CAAA,CAC9B,CAAA,CAAA,CACF,CAAA,CACAnD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAc,QAAA,CAAA,qBAAA,CAAI,CAAA,CAClCA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4BAAA,CACb,QAAA,CAAA+D,CAAAA,CAAmBR,CAAU,CAAA,CAChC,CAAA,CAAA,CACF,CAAA,CACApD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,qBAAA,CAAI,CAAA,CAClCA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4BAAA,CACb,QAAA,CAAAgE,CAAAA,CAAeR,CAAM,EACxB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGDG,CAAAA,EAAgBN,CAAAA,CAAS,MAAA,CAAS,CAAA,EACjClD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,qBAAA,CAAI,CAAA,CAClCA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACZ,QAAA,CAAAqD,CAAAA,CAAS,GAAA,CAAKa,CAAAA,EACblE,GAAAA,CAACyC,GAAAA,CAAA,CAAoB,OAAA,CAAQ,YAAY,SAAA,CAAU,SAAA,CAChD,QAAA,CAAAyB,CAAAA,CAAAA,CADSA,CAEZ,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAMF/D,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKO,CAAAA,CACL,SAAA,CAAWT,CAAAA,CAAM,WAAA,CAAaR,GAAS,CAAA,CACtC,GAAGC,CAAAA,CAEH,QAAA,CAAA,CAAAyD,GAAAA,EACChD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAG,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,2BAAA,CAAK,CAAA,CAC3CG,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACZ,QAAA,CAAAmD,GAAAA,CAAe,IAAA,CAClB,CAAA,CACAhD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+BAAA,CACZ,QAAA,CAAA,CAAAgD,GAAAA,CAAe,SAAA,CAAU,gBAAA,CAAA,CAC5B,GACF,CAAA,CACCM,CAAAA,EACmBzD,GAAAA,CAAC4C,CAAAA,CAAA,CACf,KAAA,CAAOO,GAAAA,CAAe,SAAA,CACtB,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,MAAA,CACR,CAAA,CAAA,CAEN,CAAA,CAAA,CACF,CAAA,CAGDO,CAAAA,EAAoBN,CAAAA,CAAoB,MAAA,CAAS,CAAA,EAChDjD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,2BAAA,CAAK,CAAA,CAC3CA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACZ,QAAA,CAAAoD,CAAAA,CAAoB,GAAA,CAAI,CAACkB,CAAAA,CAAMpD,CAAAA,GAC9Bf,IAAAA,CAAC,KAAA,CAAA,CAAgB,SAAA,CAAU,WAAA,CACzB,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAuB,QAAA,CAAAsE,CAAAA,CAAK,OAAA,CAAQ,CAAA,CACpDnE,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gCACb,QAAA,CAAA,CAAAmE,CAAAA,CAAK,UAAA,CAAW,GAAA,CAAA,CACnB,CAAA,CAAA,CACF,CAAA,CACAtE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,EAAGsE,CAAAA,CAAK,KAAK,CAAA,6CAAA,CAAA,CACxB,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGA,CAAAA,CAAK,UAAU,CAAA,CAAA,CAAI,CAAA,CACxC,CAAA,CACF,CAAA,CAAA,CAAA,CAZQpD,CAaV,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAGD0C,CAAAA,EACCzD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,2BAAA,CAAK,CAAA,CAC3CG,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uCAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,2BAAA,CAAK,CAAA,CAC1CA,GAAAA,CAAC,OAAI,SAAA,CAAU,iCAAA,CACZ,QAAA,CAAA8D,CAAAA,CAAkBR,CAAS,CAAA,CAC9B,CAAA,CACAtD,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,yDAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGsD,CAAS,CAAA,CAAA,CAAI,CAAA,CAClC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACAnD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,UAAAH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,oBAAA,CAAG,CAAA,CACxCA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACZ,QAAA,CAAA+D,CAAAA,CAAmBR,CAAU,CAAA,CAChC,CAAA,CACAvD,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,2DAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGuD,CAAU,CAAA,CAAA,CAAI,EACnC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACApD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,oBAAA,CAAG,CAAA,CACxCA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCAAA,CACZ,QAAA,CAAAgE,CAAAA,CAAeR,CAAM,CAAA,CACxB,CAAA,CACAxD,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CACC,UAAU,4DAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGwD,CAAM,CAAA,CAAA,CAAI,CAAA,CAC/B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGDG,CAAAA,EAAgBN,CAAAA,CAAS,MAAA,CAAS,CAAA,EACjClD,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,iCAAA,CAAM,CAAA,CAC5CA,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,sBAAA,CACZ,QAAA,CAAAqD,CAAAA,CAAS,GAAA,CAAKa,CAAAA,EACblE,GAAAA,CAACyC,GAAAA,CAAA,CAAoB,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAU,SAAA,CAC9C,QAAA,CAAAyB,CAAAA,CAAAA,CADSA,CAEZ,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CACF,EAEAhB,EAAAA,CAAgB,WAAA,CAAc,iBAAA,CC7U9B,IAAMqB,CAAAA,CAAgBlE,CAAAA,CAAM,UAAA,CAC1B,CAAC,CAAE,SAAA,CAAAZ,CAAAA,CAAW,OAAA,CAAA0C,CAAAA,CAAS,UAAA,CAAAqC,CAAAA,CAAa,KAAA,CAAO,IAAA,CAAAnF,CAAAA,CAAO,IAAA,CAAM,GAAGK,CAAM,CAAA,CAAGgB,CAAAA,GAQhEV,GAAAA,CAAC,QAAA,CAAA,CACC,GAAA,CAAKU,CAAAA,CACL,SAAA,CAAWT,CAAAA,CACT,mHAAA,CAVc,CAClB,EAAA,CAAI,iBAAA,CACJ,GAAI,mBAAA,CACJ,EAAA,CAAI,mBACN,CAAA,CAOkBZ,CAAI,CAAA,CAChBmF,CAAAA,CACI,sDAAA,CACA,gEAAA,CACJ/E,CACF,CAAA,CACC,GAAGC,CAAAA,CAEH,QAAA,CAAAyC,CAAAA,CACH,CAGN,EACAoC,CAAAA,CAAc,WAAA,CAAc,eAAA,CC7B5B,IAAME,EAAAA,CAAkB,CACtB,CAAE,GAAA,CAAK,KAAA,CAAO,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,QAAS,CAAA,CAC1D,CAAE,GAAA,CAAK,SAAA,CAAW,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,MAAO,CAAA,CAC5D,CAAE,GAAA,CAAK,OAAA,CAAS,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,KAAM,CAAA,CACzD,CAAE,IAAK,MAAA,CAAQ,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,OAAQ,CAAA,CAC1D,CAAE,GAAA,CAAK,YAAA,CAAc,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,MAAA,CAAQ,KAAA,CAAO,MAAO,CAAA,CAC9D,CAAE,GAAA,CAAK,OAAA,CAAS,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,KAAA,CAAO,KAAA,CAAO,MAAO,CAAA,CACxD,CAAE,GAAA,CAAK,YAAa,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,QAAS,CAAA,CAChE,CAAE,GAAA,CAAK,YAAA,CAAc,KAAA,CAAO,oBAAA,CAAO,IAAA,CAAM,MAAA,CAAQ,KAAA,CAAO,QAAS,CACnE,CAAA,CAkCMC,EAAAA,CAAkBrE,CAAAA,CAAM,UAAA,CAC5B,CAAC,CACC,SAAA,CAAAZ,CAAAA,CACA,eAAA,CAAAkF,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,MAAA,CAAAf,EAAS,MAAA,CACT,aAAA,CAAAgB,CAAAA,CAAgB,KAAA,CAChB,SAAA,CAAAvB,CAAAA,CAAY,EAAA,CACZ,iBAAA,CAAAwB,CAAAA,CACA,QAAA,CAAAC,CAAAA,CAAWN,EAAAA,CACX,IAAA,CAAApF,CAAAA,CAAO,IAAA,CACP,OAAA,CAAAE,CAAAA,CAAU,QAAA,CACV,GAAGG,CACL,CAAA,CAAGgB,CAAAA,GAAQ,CACT,IAAMsE,CAAAA,CAAsBC,CAAAA,EAAuB,CACjDL,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAkBK,GACpB,CAAA,CAEMC,CAAAA,CAAqB/C,CAAAA,EAAgC,CACzD,IAAMqC,CAAAA,CAAaG,CAAAA,GAAoBxC,CAAAA,CAAQ,GAAA,CAE/C,OAAI5C,CAAAA,GAAY,QAAA,CAEZS,GAAAA,CAACuE,CAAAA,CAAA,CAEC,OAAA,CAASpC,CAAAA,CAAQ,GAAA,CACjB,UAAA,CAAYqC,CAAAA,CACZ,IAAA,CAAMnF,CAAAA,CACN,OAAA,CAAS,IAAM2F,CAAAA,CAAmB7C,CAAAA,CAAQ,GAAG,CAAA,CAC7C,SAAA,CAAWlC,CAAAA,CACT,8BACAuE,CAAAA,EAAc,mCAChB,CAAA,CAEC,QAAA,CAAArC,CAAAA,CAAQ,KAAA,CAAA,CAVJA,CAAAA,CAAQ,GAWf,CAAA,CAIA5C,CAAAA,GAAY,MAAA,CAEZS,GAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAWC,CAAAA,CACT,oFAAA,CACAuE,CAAAA,CACI,6BAAA,CACA,uCACN,CAAA,CACA,OAAA,CAAS,IAAMQ,CAAAA,CAAmB7C,CAAAA,CAAQ,GAAG,CAAA,CAE7C,QAAA,CAAAhC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8BACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,CAAAA,CACd,uDAAA,CACAuE,CAAAA,CAAa,oCAAA,CAAuC,UACtD,CAAA,CACG,QAAA,CAAArC,CAAAA,CAAQ,IAAA,EACPhC,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAgC,CAAAA,CAAQ,IAAA,GAAS,OAAA,EAAW,WAAA,CAC5BA,CAAAA,CAAQ,IAAA,GAAS,OAAA,EAAW,WAAA,CAC5BA,CAAAA,CAAQ,IAAA,GAAS,OAAA,EAAW,WAAA,CAC5BA,EAAQ,IAAA,GAAS,OAAA,EAAW,cAAA,CAC5BA,CAAAA,CAAQ,IAAA,GAAS,MAAA,EAAU,QAAA,CAC3BA,CAAAA,CAAQ,IAAA,GAAS,KAAA,EAAS,WAAA,CAC1BA,CAAAA,CAAQ,IAAA,GAAS,MAAA,EAAU,WAAA,CAAA,CAC9B,CAAA,CAEJ,CAAA,CACAnC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oCAAA,CAAsC,QAAA,CAAAmC,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAA,CACtE,CAAA,CAAA,CA3BKA,CAAAA,CAAQ,GA4Bf,CAAA,CAIA5C,CAAAA,GAAY,MAAA,CAEZS,GAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAWC,CAAAA,CACT,uFAAA,CACAuE,CAAAA,CACI,oCAAA,CACA,4BACN,CAAA,CACA,OAAA,CAAS,IAAMQ,CAAAA,CAAmB7C,CAAAA,CAAQ,GAAG,CAAA,CAE7C,QAAA,CAAAnC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,wBAAA,CAA0B,QAAA,CAAAmC,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAA,CATnDA,CAAAA,CAAQ,GAUf,CAAA,CAIG,IACT,CAAA,CAEMgD,CAAAA,CAAgB,CACpB,KAAM,+DAAA,CACN,IAAA,CAAM,WAAA,CACN,OAAA,CAAS,sBACX,CAAA,CAEA,OACEhF,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKO,CAAAA,CACL,SAAA,CAAWT,CAAAA,CAAM,WAAA,CAAaR,CAAS,CAAA,CACtC,GAAGC,CAAAA,CAEJ,QAAA,CAAA,CAAAM,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWmF,CAAAA,CAActB,CAAM,CAAA,CACjC,QAAA,CAAAkB,CAAAA,CAAS,GAAA,CAAIG,CAAiB,CAAA,CACjC,EAECL,CAAAA,EAAiBF,CAAAA,EAChBxE,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,2BAAA,CAAK,CAAA,CAC3CG,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CAAiC,QAAA,CAAA,CAAAmD,CAAAA,CAAU,GAAA,CAAA,CAAC,CAAA,CAAA,CAC9D,CAAA,CACAtD,GAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,QACL,GAAA,CAAI,GAAA,CACJ,GAAA,CAAI,KAAA,CACJ,KAAA,CAAOsD,CAAAA,CACP,QAAA,CAAW8B,CAAAA,EAAMN,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAoB,MAAA,CAAOM,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAA,CAC1D,SAAA,CAAU,sEAAA,CACZ,CAAA,CACAjF,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oDAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,cAAA,CAAE,CAAA,CACRA,GAAAA,CAAC,MAAA,CAAA,CAAK,wBAAE,CAAA,CACRA,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,cAAA,CAAE,CAAA,CAAA,CACV,CAAA,CAAA,CACF,CAAA,CAGD2E,CAAAA,EAAmBE,CAAAA,EAClB7E,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,QAAA,CAAAA,GAAAA,CAAC4C,CAAAA,CAAA,CACC,KAAA,CAAOU,CAAAA,CACP,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,MAAA,CACR,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CACF,EAEAoB,EAAAA,CAAgB,WAAA,CAAc,kBC5K9B,IAAMW,EAAAA,CAAiBhF,CAAAA,CAAM,UAAA,CAC3B,CAAC,CACC,SAAA,CAAAZ,CAAAA,CACA,IAAA,CAAAJ,CAAAA,CAAO,IAAA,CACP,OAAA,CAAAE,CAAAA,CAAU,QAAA,CACV,SAAA,CAAA+F,CAAAA,CAAY,KAAA,CACZ,SAAA,CAAAC,CAAAA,CAAY,CACV,CAAE,IAAA,CAAM,KAAM,IAAA,CAAM,oBAAA,CAAO,IAAA,CAAM,oBAAO,CAAA,CACxC,CAAE,IAAA,CAAM,IAAA,CAAM,IAAA,CAAM,SAAA,CAAW,IAAA,CAAM,oBAAO,CAAA,CAC5C,CAAE,IAAA,CAAM,IAAA,CAAM,IAAA,CAAM,oBAAA,CAAO,IAAA,CAAM,oBAAO,CAAA,CACxC,CAAE,IAAA,CAAM,IAAA,CAAM,IAAA,CAAM,cAAA,CAAM,IAAA,CAAM,oBAAO,CACzC,CAAA,CACA,gBAAAC,CAAAA,CAAkB,IAAA,CAClB,gBAAA,CAAAC,CAAAA,CACA,GAAG/F,CACL,CAAA,CAAGgG,CAAAA,GAAS,CACV,IAAM,CAACC,CAAAA,CAAQC,CAAS,CAAA,CAAIvF,CAAAA,CAAM,QAAA,CAAS,KAAK,CAAA,CAC1CwF,CAAAA,CAAcxF,CAAAA,CAAM,MAAA,CAAuB,IAAI,CAAA,CAE/CyF,CAAAA,CAAcP,CAAAA,CAAU,IAAA,CAAKQ,CAAAA,EAAQA,CAAAA,CAAK,IAAA,GAASP,CAAe,CAAA,EAAKD,CAAAA,CAAU,CAAC,CAAA,CAElFpE,CAAAA,CAAc,CAClB,EAAA,CAAI,WAAA,CACJ,EAAA,CAAI,WAAA,CACJ,EAAA,CAAI,WACN,CAAA,CASAd,CAAAA,CAAM,SAAA,CAAU,IAAM,CACpB,IAAM2F,CAAAA,CAAsBC,CAAAA,EAAsB,CAC5CJ,CAAAA,CAAY,OAAA,EAAW,CAACA,CAAAA,CAAY,OAAA,CAAQ,QAAA,CAASI,CAAAA,CAAM,MAAc,CAAA,EAC3EL,CAAAA,CAAU,KAAK,EAEnB,CAAA,CAEA,OAAID,CAAAA,EACF,QAAA,CAAS,gBAAA,CAAiB,WAAA,CAAaK,CAAkB,CAAA,CAGpD,IAAM,CACX,QAAA,CAAS,mBAAA,CAAoB,WAAA,CAAaA,CAAkB,EAC9D,CACF,CAAA,CAAG,CAACL,CAAM,CAAC,CAAA,CAEX,IAAMO,CAAAA,CAAwBC,CAAAA,EAAyB,CACrDV,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAmBU,CAAAA,CAAAA,CACnBP,CAAAA,CAAU,KAAK,EACjB,CAAA,CAEMQ,CAAAA,CAAa,IACjBpG,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAA8F,CAAAA,CAAY,IAAA,CAAK,CAAA,CAC9C,CAAA,CAGF,OAAIvG,CAAAA,GAAY,MAAA,CAEZY,KAAC,KAAA,CAAA,CAAI,GAAA,CAAK0F,CAAAA,CAAa,SAAA,CAAU,UAAA,CAC/B,QAAA,CAAA,CAAA7F,GAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAM4F,CAAAA,CAAU,CAACD,CAAM,CAAA,CAChC,SAAA,CAAW1F,CAAAA,CACT,sMAAA,CACAkB,CAAAA,CAAY9B,CAAI,CAAA,CAChBI,CACF,CAAA,CACC,GAAGC,CAAAA,CAEH,QAAA,CAAA0G,CAAAA,EAAW,CACd,CAAA,CAECT,CAAAA,EACC3F,GAAAA,CAAC,OAAI,SAAA,CAAU,uGAAA,CACZ,QAAA,CAAAuF,CAAAA,CAAU,GAAA,CAAKc,CAAAA,EACdlG,IAAAA,CAAC,QAAA,CAAA,CAEC,OAAA,CAAS,IAAM+F,CAAAA,CAAqBG,CAAAA,CAAS,IAAI,CAAA,CACjD,SAAA,CAAWpG,CAAAA,CACT,kGAAA,CACAuF,CAAAA,GAAoBa,CAAAA,CAAS,IAAA,EAAQ,yEACvC,CAAA,CAEA,QAAA,CAAA,CAAArG,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAAqG,CAAAA,CAAS,IAAA,CAAK,EACzCrG,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAuB,QAAA,CAAAqG,CAAAA,CAAS,IAAA,CAAK,CAAA,CAAA,CAAA,CARhDA,CAAAA,CAAS,IAShB,CACD,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAIA9G,CAAAA,GAAY,UAAA,CAEZY,IAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAK0F,CAAAA,CAAa,SAAA,CAAU,UAAA,CAC/B,QAAA,CAAA,CAAA1F,IAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAMyF,CAAAA,CAAU,CAACD,CAAM,EAChC,SAAA,CAAW1F,CAAAA,CACT,2NAAA,CACAR,CACF,CAAA,CACC,GAAGC,CAAAA,CAEJ,QAAA,CAAA,CAAAM,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAA8F,CAAAA,CAAY,IAAA,CAAK,CAAA,CAC3CR,CAAAA,EAAatF,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CAAmB,QAAA,CAAA8F,CAAAA,CAAY,IAAA,CAAK,CAAA,CAClE9F,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWC,CAAAA,CACT,2CAAA,CACA0F,GAAU,YACZ,CAAA,CACA,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,OAAA,CAAQ,WAAA,CAER,QAAA,CAAA3F,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,gBAAA,CAAiB,CAAA,CACxF,CAAA,CAAA,CACF,CAAA,CAEC2F,CAAAA,EACC3F,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uGAAA,CACZ,QAAA,CAAAuF,CAAAA,CAAU,GAAA,CAAKc,CAAAA,EACdlG,IAAAA,CAAC,QAAA,CAAA,CAEC,OAAA,CAAS,IAAM+F,CAAAA,CAAqBG,CAAAA,CAAS,IAAI,CAAA,CACjD,SAAA,CAAWpG,CAAAA,CACT,kGAAA,CACAuF,CAAAA,GAAoBa,CAAAA,CAAS,IAAA,EAAQ,yEACvC,CAAA,CAEA,QAAA,CAAA,CAAArG,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAAqG,CAAAA,CAAS,IAAA,CAAK,CAAA,CACzCrG,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAuB,QAAA,CAAAqG,CAAAA,CAAS,KAAK,CAAA,CAAA,CAAA,CARhDA,CAAAA,CAAS,IAShB,CACD,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAMFlG,IAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAM,CAEb,IAAMmG,CAAAA,CAAAA,CADef,CAAAA,CAAU,SAAA,CAAUQ,CAAAA,EAAQA,CAAAA,CAAK,IAAA,GAASP,CAAe,CAAA,CAC5C,CAAA,EAAKD,CAAAA,CAAU,MAAA,CACjDE,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAmBF,CAAAA,CAAUe,CAAS,CAAA,CAAE,MAC1C,CAAA,CACA,SAAA,CAAWrG,CAAAA,CACT,2NAAA,CACAR,CACF,CAAA,CACC,GAAGC,CAAAA,CAEJ,QAAA,CAAA,CAAAM,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAA8F,CAAAA,CAAY,IAAA,CAAK,CAAA,CAC3CR,CAAAA,EAAatF,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CAAmB,QAAA,CAAA8F,CAAAA,CAAY,IAAA,CAAK,CAAA,CAAA,CACpE,CAEJ,CACF,EACAT,EAAAA,CAAe,YAAc,gBAAA,CChK7B,IAAMkB,EAAAA,CAAkBlG,CAAAA,CAAM,UAAA,CAAiD,CAAC,CAC9E,SAAA,CAAAZ,CAAAA,CACA,QAAA,CAAA+G,CAAAA,CACA,IAAA,CAAAC,CAAAA,CAAO,aAAA,CACP,QAAA,CAAAC,CAAAA,CAAW,WAAA,CACX,SAAAC,CAAAA,CAAW,EAAA,CACX,QAAA,CAAAC,CAAAA,CAAW,eAAA,CACX,OAAA,CAAArH,CAAAA,CAAU,SAAA,CACV,IAAA,CAAAF,CAAAA,CAAO,IAAA,CACP,QAAA,CAAAG,CAAAA,CAAW,IAAA,CACX,QAAA,CAAAqH,CAAAA,CAAW,IAAA,CACX,aAAA,CAAAC,CAAAA,CAAgB,GAAA,CAChB,GAAGpH,GACL,CAAA,CAAGgB,CAAAA,GAAQ,CACT,GAAM,CAACqG,CAAAA,CAAWC,CAAY,CAAA,CAAInG,SAAS,IAAI,CAAA,CAE/CjB,SAAAA,CAAU,IAAM,CACd,GAAI,CAACiH,CAAAA,CAAU,OAEf,IAAMI,CAAAA,CAAe,IAAM,CACzB,IAAMC,CAAAA,CAAY,MAAA,CAAO,OAAA,CACzBF,CAAAA,CAAaE,CAAAA,CAAYJ,CAAa,EACxC,CAAA,CAGA,OAAAG,CAAAA,EAAa,CAEb,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAUA,CAAAA,CAAc,CAAE,QAAS,IAAK,CAAC,CAAA,CAC1D,IAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,CAAUA,CAAY,CAChE,CAAA,CAAG,CAACJ,CAAAA,CAAUC,CAAa,CAAC,CAAA,CAE5B,IAAMK,CAAAA,CAAiB,IAAM,CAC3B,GAAIX,CAAAA,CAAU,CACZ,IAAMY,CAAAA,CAAgB,QAAA,CAAS,cAAA,CAAeZ,CAAQ,CAAA,CAClDY,CAAAA,EACFA,CAAAA,CAAc,eAAe,CAAE,QAAA,CAAU,QAAS,CAAC,EAEvD,CAAA,KAAO,CAEL,IAAMC,CAAAA,CAAiB3G,CAAAA,CACvB,GAAI2G,CAAAA,CAAe,OAAA,CAAS,CAC1B,IAAMC,CAAAA,CAAcD,CAAAA,CAAe,OAAA,CAAQ,kBAAA,CACvCC,CAAAA,EACFA,CAAAA,CAAY,cAAA,CAAe,CAAE,QAAA,CAAU,QAAS,CAAC,EAErD,CACF,CACF,CAAA,CAEMC,CAAAA,CAAkB,CACtB,eAAA,CAAiB,8CAAA,CACjB,aAAA,CAAe,iBAAA,CACf,cAAA,CAAgB,kBAClB,CAAA,CAEMpG,CAAAA,CAAc,CAClB,EAAA,CAAI,SAAA,CACJ,EAAA,CAAI,WAAA,CACJ,EAAA,CAAI,SACN,CAAA,CAEMC,CAAAA,CAAiB,CACrB,OAAA,CAAS,6CAAA,CACT,OAAA,CAAS,oCAAA,CACT,SAAA,CAAW,8DAAA,CACX,OAAA,CAAS,uCACX,CAAA,CAEA,OAAK2F,CAAAA,CAGH/G,GAAAA,CAAC,OACC,GAAA,CAAKU,CAAAA,CACL,SAAA,CAAWT,CAAAA,CACT,eAAA,CACAsH,CAAAA,CAAgBX,CAAQ,CAAA,CACxBnH,CACF,CAAA,CACC,GAAGC,GAAAA,CAEJ,QAAA,CAAAS,IAAAA,CAACqH,GAAAA,CAAA,CACC,OAAA,CAASL,CAAAA,CACT,OAAA,CAAQ,OAAA,CACR,IAAA,CAAK,IAAA,CACL,SAAA,CAAWlH,CAAAA,CACT,kEAAA,CACAkB,CAAAA,CAAY9B,CAAI,CAAA,CAChB+B,CAAAA,CAAe7B,CAAO,EACtBC,CAAAA,EAAY,0DACd,CAAA,CACA,YAAA,CAAYiH,CAAAA,CAEZ,QAAA,CAAA,CAAAzG,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oBAAA,CAAsB,QAAA,CAAAyG,CAAAA,CAAK,CAAA,CAC3CzG,GAAAA,CAACqB,CAAAA,CAAA,CACC,IAAA,CAAMqF,CAAAA,CACN,IAAA,CAAMC,CAAAA,CACN,SAAA,CAAW1G,CAAAA,CACTT,CAAAA,EAAY,gBACd,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAjCqB,IAmCzB,CAAC,EAED+G,EAAAA,CAAgB,WAAA,CAAc,iBAAA,CC5J9B,IAAMkB,EAAAA,CAAYpH,CAAAA,CAAM,UAAA,CACtB,CAAC,CACC,SAAA,CAAAZ,CAAAA,CACA,OAAA,CAAAF,CAAAA,CAAU,SAAA,CACV,IAAA,CAAAF,CAAAA,CAAO,IAAA,CACP,WAAA,CAAAqI,CAAAA,CAAc,MAAA,CACd,QAAA,CAAAb,CAAAA,CAAW,IAAA,CACX,MAAA,CAAAc,EAAS,IAAA,CACT,QAAA,CAAAC,CAAAA,CACA,GAAGlI,CACL,CAAA,CAAGgB,CAAAA,GAAQ,CAET,IAAMmH,CAAAA,CAAoB,IAAM,CAC9B,OAAQtI,CAAAA,EACN,KAAK,OAAA,CACH,OAAO,0EAAA,CACT,KAAK,UAAA,CACH,OAAO,qKAAA,CACT,KAAK,SAAA,CACH,OAAO,2IAAA,CACT,KAAK,MAAA,CACH,OAAO,6HACT,QACE,OAAO,+HACX,CACF,CAAA,CAEMuI,CAAAA,CAAiB,IAAM,CAC3B,OAAQzI,CAAAA,EACN,KAAK,IAAA,CACH,OAAO,eAAA,CACT,KAAK,IAAA,CACH,OAAO,eAAA,CACT,KAAK,IAAA,CACH,OAAO,eAAA,CACT,QACE,OAAO,eACX,CACF,CAAA,CAEM0I,CAAAA,CAAwB,IAAM,CAClC,OAAQL,CAAAA,EACN,KAAK,UAAA,CACH,OAAO,mCAAA,CACT,KAAK,YAAA,CACH,OAAO,mCAAA,CACT,QACE,OAAO,eACX,CACF,CAAA,CAEMM,CAAAA,CAAc/H,CAAAA,CAClB,qGAAA,CACA4H,CAAAA,EAAkB,CAClBC,CAAAA,EAAe,CACfC,CAAAA,EAAsB,CACtBlB,CAAAA,EAAY,gBAAA,CACZc,CAAAA,EAAU,eAAA,CACVlI,CACF,EAEA,OACEO,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWgI,CAAAA,CACX,GAAA,CAAKtH,CAAAA,CACJ,GAAGhB,CAAAA,CAEH,QAAA,CAAAkI,CAAAA,CACH,CAEJ,CACF,EACAH,EAAAA,CAAU,WAAA,CAAc,WAAA,CC/DxB,IAAMQ,EAAAA,CAA4H,CAChI,IAAA,CAAM,CACJ,SAAA,CAAW,2JAAA,CACX,IAAA,CAAM,wEAAA,CACN,KAAA,CAAO,qEAAA,CACP,IAAA,CAAM,yCACR,CAAA,CACA,MAAA,CAAQ,CACN,SAAA,CAAW,uJAAA,CACX,IAAA,CAAM,wEAAA,CACN,KAAA,CAAO,qEAAA,CACP,IAAA,CAAM,yCACR,CAAA,CACA,KAAA,CAAO,CACL,SAAA,CAAW,yJAAA,CACX,IAAA,CAAM,sEAAA,CACN,KAAA,CAAO,mEAAA,CACP,IAAA,CAAM,yCACR,CAAA,CACA,MAAA,CAAQ,CACN,SAAA,CAAW,uJAAA,CACX,IAAA,CAAM,wEAAA,CACN,KAAA,CAAO,qEAAA,CACP,IAAA,CAAM,yCACR,CACF,CAAA,CAgCaC,EAAAA,CAAW7H,CAAAA,CAAM,UAAA,CAA0C,CAAC,CAAE,SAAA,CAAAZ,CAAAA,CAAW,KAAA,CAAA0I,CAAAA,CAAO,IAAA,CAAAC,CAAAA,CAAM,IAAA,CAAAC,CAAAA,CAAO,MAAA,CAAQ,QAAA,CAAAT,CAAAA,CAAU,GAAGlI,CAAM,CAAA,CAAGgB,CAAAA,GAAQ,CAC9I,IAAM4H,CAAAA,CAAIL,EAAAA,CAAYI,CAAI,CAAA,CAC1B,OACErI,GAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKU,CAAAA,CAAK,SAAA,CAAWT,CAAAA,CAAMqI,CAAAA,CAAE,SAAA,CAAW7I,CAAS,CAAA,CAAI,GAAGC,CAAAA,CAC3D,QAAA,CAAAS,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAACqB,CAAAA,CAAA,CAAK,IAAA,CAAM+G,CAAAA,CAAM,SAAA,CAAWE,EAAE,IAAA,CAAM,CAAA,CACrCnI,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,QAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAWsI,CAAAA,CAAE,KAAA,CAAQ,QAAA,CAAAH,CAAAA,CAAM,CAAA,CACjCnI,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWsI,CAAAA,CAAE,IAAA,CAAO,QAAA,CAAAV,CAAAA,CAAS,CAAA,CAAA,CACpC,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CAAC,EAEDM,EAAAA,CAAS,WAAA,CAAc,WCjCvB,IAAMK,EAAAA,CAGF,CACF,SAAA,CAAW,CACT,GAAA,CAAK,yEAAA,CACL,MAAA,CAAQ,+CAAA,CACR,IAAA,CAAM,6EAAA,CACN,KAAA,CAAO,cAAA,CACP,OAAA,CAAS,WACX,CAAA,CACA,MAAA,CAAQ,CACN,GAAA,CAAK,+EAAA,CACL,MAAA,CAAQ,uCAAA,CACR,IAAA,CAAM,6DAAA,CACN,MAAO,qBAAA,CACP,OAAA,CAAS,QACX,CAAA,CACA,OAAA,CAAS,CACP,GAAA,CAAK,mDAAA,CACL,MAAA,CAAQ,eAAA,CACR,IAAA,CAAM,gCAAA,CACN,KAAA,CAAO,cAAA,CACP,OAAA,CAAS,SACX,CAAA,CACA,KAAA,CAAO,CACL,GAAA,CAAK,kEAAA,CACL,MAAA,CAAQ,yCAAA,CACR,IAAA,CAAM,iEAAA,CACN,KAAA,CAAO,cAAA,CACP,OAAA,CAAS,OACX,CAAA,CACA,QAAS,CACP,GAAA,CAAK,qEAAA,CACL,MAAA,CAAQ,2CAAA,CACR,IAAA,CAAM,qEAAA,CACN,KAAA,CAAO,cAAA,CACP,OAAA,CAAS,SACX,CAAA,CACA,IAAA,CAAM,CACJ,GAAA,CAAK,uEAAA,CACL,MAAA,CAAQ,6CAAA,CACR,IAAA,CAAM,yEAAA,CACN,KAAA,CAAO,cAAA,CACP,OAAA,CAAS,MACX,CACF,CAAA,CAEMC,EAAAA,CAAc,CAClB,EAAA,CAAI,CAAE,IAAK,aAAA,CAAe,GAAA,CAAK,OAAA,CAAS,OAAA,CAAS,KAAA,CAAO,IAAA,CAAM,SAAU,CAAA,CACxE,EAAA,CAAI,CAAE,GAAA,CAAK,aAAA,CAAe,GAAA,CAAK,OAAA,CAAS,OAAA,CAAS,KAAA,CAAO,IAAA,CAAM,SAAU,CAAA,CACxE,EAAA,CAAI,CAAE,GAAA,CAAK,SAAA,CAAW,GAAA,CAAK,OAAA,CAAS,OAAA,CAAS,KAAA,CAAO,IAAA,CAAM,WAAY,CACxE,CAAA,CAEMC,EAAAA,CAAa,CAAC5F,CAAAA,CAAuB6F,CAAAA,CAAS,OAAA,GAAY,CAC9D,GAAI,CAAC7F,CAAAA,CAAO,OACZ,IAAM8F,CAAAA,CAAS9F,CAAAA,YAAiB,IAAA,CAAOA,CAAAA,CAAQ,IAAI,IAAA,CAAKA,CAAK,CAAA,CAC7D,GAAI,CAAA,MAAA,CAAO,KAAA,CAAM8F,CAAAA,CAAO,OAAA,EAAS,CAAA,CACjC,OAAOA,CAAAA,CAAO,cAAA,CAAeD,CAAAA,CAAQ,CAAE,UAAW,QAAA,CAAU,SAAA,CAAW,OAAQ,CAAC,CAClF,CAAA,CA6CaE,EAAAA,CAAoC,CAAC,CAChD,KAAA,CAAAC,CAAAA,CACA,WAAA,CAAAnB,CAAAA,CAAc,UAAA,CACd,KAAA,CAAAoB,CAAAA,CAAQ,MAAA,CACR,aAAA,CAAAC,CAAAA,CACA,MAAA,CAAAL,CAAAA,CAAS,OAAA,CACT,UAAA,CAAAM,CAAAA,CACA,aAAA,CAAAC,CAAAA,CAAgB,IAAA,CAChB,IAAA,CAAA5J,CAAAA,CAAO,IAAA,CACP,UAAAI,CAAAA,CACA,GAAGC,CACL,CAAA,GAAM,CACJ,IAAMwJ,CAAAA,CAAWL,CAAAA,CAAM,MAAA,CAAS,CAAA,CAC1BM,GAAAA,CAAaX,EAAAA,CAAYnJ,CAAI,CAAA,CAEnC,OAAK6J,CAAAA,CAeDxB,CAAAA,GAAgB,YAAA,CAEhB1H,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,CAAAA,CAAM,iBAAA,CAAmBR,CAAS,CAAA,CAAI,GAAGC,CAAAA,CACvD,QAAA,CAAAM,GAAAA,CAAC,IAAA,CAAA,CAAG,UAAU,gBAAA,CAAiB,IAAA,CAAK,MAAA,CAAO,YAAA,CAAW,0BAAA,CACnD,QAAA,CAAA6I,CAAAA,CAAM,GAAA,CAAI,CAACvE,CAAAA,CAAMpD,CAAAA,GAAU,CAtMtC,IAAAY,CAAAA,CAuMY,IAAMsH,CAAAA,CAAAA,CAAStH,CAAAA,CAAAwC,CAAAA,CAAK,MAAA,GAAL,IAAA,CAAAxC,CAAAA,CAAe,SAAA,CACxBuH,CAAAA,CAAed,EAAAA,CAAca,CAAM,CAAA,CACnC/G,CAAAA,CAAOoG,EAAAA,CAAWnE,CAAAA,CAAK,IAAA,CAAMoE,CAAM,CAAA,CACnCY,CAAAA,CAAgBP,CAAAA,GAAkBzE,CAAAA,CAAK,EAAA,CACvCiF,CAAAA,CAAWN,CAAAA,EAAiB/H,CAAAA,GAAU2H,CAAAA,CAAM,MAAA,CAAS,CAAA,CAE3D,OACE1I,IAAAA,CAAC,IAAA,CAAA,CAAiB,SAAA,CAAU,kBAAA,CAAmB,IAAA,CAAK,UAAA,CAClD,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CAEb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAWC,CAAAA,CACT,gCAAA,CACAkJ,GAAAA,CAAW,IACXE,CAAAA,CAAa,GAAA,CACbC,CAAAA,EAAiB,4CACnB,CAAA,CACA,YAAA,CAAYD,CAAAA,CAAa,KAAA,CAC3B,CAAA,CAEAlJ,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWF,CAAAA,CAAM,gCAAA,CAAkCkJ,GAAAA,CAAW,IAAI,CAAA,CACrE,QAAA,CAAA,CAAAnJ,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,wCAAA,CAA0C,QAAA,CAAAsE,CAAAA,CAAK,KAAA,CAAM,CAAA,CACjEA,CAAAA,CAAK,WAAA,EACJtE,GAAAA,CAAC,GAAA,CAAA,CAAE,UAAU,2CAAA,CAA6C,QAAA,CAAAsE,CAAAA,CAAK,WAAA,CAAY,CAAA,CAE5EjC,CAAAA,EACCrC,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0CAAA,CAA2C,QAAA,CAAUsE,CAAAA,CAAK,IAAA,YAAgB,IAAA,CAAOA,CAAAA,CAAK,IAAA,CAAK,WAAA,EAAY,CAAIA,CAAAA,CAAK,IAAA,CAC7H,QAAA,CAAAjC,CAAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAECkH,CAAAA,EACCvJ,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0CAAA,CAA2C,cAAY,MAAA,CAAO,CAAA,CAAA,CAAA,CA3BzEsE,CAAAA,CAAK,EA6Bd,CAEJ,CAAC,CAAA,CACH,CAAA,CACF,CAAA,CAMFtE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,CAAAA,CAAM,EAAA,CAAIR,CAAS,CAAA,CAAI,GAAGC,CAAAA,CACxC,QAAA,CAAAM,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,WAAA,CAAY,IAAA,CAAK,MAAA,CAAO,YAAA,CAAW,0BAAA,CAC9C,QAAA,CAAA6I,CAAAA,CAAM,GAAA,CAAI,CAACvE,CAAAA,CAAMpD,CAAAA,GAAU,CAvPpC,IAAAY,CAAAA,CAwPU,IAAMsH,CAAAA,CAAAA,CAAStH,CAAAA,CAAAwC,CAAAA,CAAK,MAAA,GAAL,IAAA,CAAAxC,CAAAA,CAAe,SAAA,CACxBuH,CAAAA,CAAed,EAAAA,CAAca,CAAM,CAAA,CACnC/G,CAAAA,CAAOoG,EAAAA,CAAWnE,CAAAA,CAAK,IAAA,CAAMoE,CAAM,CAAA,CACnCY,CAAAA,CAAgBP,CAAAA,GAAkBzE,CAAAA,CAAK,EAAA,CACvCiF,CAAAA,CAAWN,CAAAA,EAAiB/H,CAAAA,GAAU2H,CAAAA,CAAM,OAAS,CAAA,CACrDW,CAAAA,CAAmBV,CAAAA,GAAU,WAAA,EAAe5H,CAAAA,CAAQ,CAAA,GAAM,CAAA,CAC1DuI,CAAAA,CAAUX,CAAAA,GAAU,OAAA,EAAWU,CAAAA,CAE/BpD,CAAAA,CAAa,IACZ9B,CAAAA,CAAK,IAAA,CACN,OAAOA,CAAAA,CAAK,IAAA,EAAS,QAAA,CAChBtE,GAAAA,CAACqB,CAAAA,CAAA,CAAK,IAAA,CAAMiD,CAAAA,CAAK,IAAA,CAAkB,SAAA,CAAU,SAAA,CAAU,CAAA,CAEzDA,CAAAA,CAAK,IAAA,CAJW,KAOnBoF,EAAAA,CACJvJ,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWF,CAAAA,CACT,yCAAA,CACAkJ,GAAAA,CAAW,OAAA,CACXE,CAAAA,CAAa,MAAA,CACbC,CAAAA,EAAiB,uCACnB,CAAA,CAEA,QAAA,CAAA,CAAAnJ,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACZ,QAAA,CAAA,CAAAiG,CAAAA,EAAW,EACVpG,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uBAAA,CAAyB,QAAA,CAAAoG,CAAAA,EAAW,CAAE,CAAA,CAExDpG,GAAAA,CAAC,QAAK,SAAA,CAAWC,CAAAA,CAAM,+BAAA,CAAiCkJ,GAAAA,CAAW,IAAI,CAAA,CACpE,QAAA,CAAA7E,CAAAA,CAAK,KAAA,CACR,CAAA,CACAtE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAWC,CAAAA,CAAM,8CAAA,CAAgDoJ,CAAAA,CAAa,IAAI,CAAA,CACrF,QAAA,CAAAA,CAAAA,CAAa,KAAA,CAChB,CAAA,CACC/E,CAAAA,CAAK,IAAA,EACJtE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CAAiC,QAAA,CAAAsE,CAAAA,CAAK,KAAK,CAAA,CAAA,CAE/D,CAAA,CAECA,CAAAA,CAAK,WAAA,EACJtE,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAWC,CAAAA,CAAM,4BAAA,CAA8BkJ,GAAAA,CAAW,IAAI,CAAA,CAC9D,QAAA,CAAA7E,CAAAA,CAAK,WAAA,CACR,CAAA,CAGDA,CAAAA,CAAK,OAAA,EAAWtE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CAAQ,QAAA,CAAAsE,CAAAA,CAAK,OAAA,CAAQ,CAAA,CAEpDjC,CAAAA,EACClC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6DACb,QAAA,CAAA,CAAAH,GAAAA,CAACqB,CAAAA,CAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAU,aAAA,CAAa,IAAA,CAAM,CAAA,CAC1DrB,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAUsE,CAAAA,CAAK,IAAA,YAAgB,IAAA,CAAOA,CAAAA,CAAK,IAAA,CAAK,WAAA,EAAY,CAAIA,CAAAA,CAAK,IAAA,CACxE,QAAA,CAAAjC,CAAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAGF,OACElC,IAAAA,CAAC,MAEC,IAAA,CAAK,UAAA,CACL,SAAA,CAAWF,CAAAA,CACT,eAAA,CACAkJ,GAAAA,CAAW,GAAA,CACXM,CAAAA,EAAW,kBACb,CAAA,CAGA,QAAA,CAAA,CAAAtJ,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAWC,CAAAA,CACT,qCAAA,CACAkJ,GAAAA,CAAW,GAAA,CACXE,CAAAA,CAAa,GAAA,CACbC,CAAAA,EAAiB,WACnB,CAAA,CACA,YAAA,CAAYD,CAAAA,CAAa,MAC3B,CAAA,CACCE,CAAAA,EACCvJ,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4BAAA,CAA6B,aAAA,CAAY,MAAA,CAAO,CAAA,CAAA,CAEpE,CAAA,CAGC0J,EAAAA,CAAAA,CAAAA,CAzBIpF,CAAAA,CAAK,EA0BZ,CAEJ,CAAC,CAAA,CACH,CAAA,CACF,CAAA,CA9JEtE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,CAAAA,CAAM,EAAA,CAAIR,CAAS,CAAA,CAAI,GAAGC,CAAAA,CACvC,QAAA,CAAAsJ,CAAAA,EAAA,IAAA,CAAAA,CAAAA,CACC7I,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4DAAA,CACb,QAAA,CAAA,CAAAH,GAAAA,CAACqB,CAAAA,CAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,yCAAA,CAA0C,CAAA,CACvErB,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,2CAAA,CAA4C,QAAA,CAAA,sEAAA,CAAa,CAAA,CACtEA,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,oCAAA,CAAqC,QAAA,CAAA,sGAAA,CAAoB,CAAA,CAAA,CACxE,CAAA,CAEJ,CAwJN,EAEA4I,EAAAA,CAAS,WAAA,CAAc,UAAA","file":"advanced.mjs","sourcesContent":["/**\n * HUA UI 디자인 토큰 시스템\n * 중앙화된 디자인 토큰 정의\n */\n\nimport type { Size } from \"../../types/common\";\n\n/**\n * 색상 스케일 타입\n * light/dark 테마별 색상 정의\n */\nexport interface ColorScale {\n light: string;\n dark: string;\n}\n\n/**\n * 디자인 토큰 인터페이스\n */\nexport interface DesignTokens {\n colors: {\n primary: ColorScale;\n secondary: ColorScale;\n accent: ColorScale;\n destructive: ColorScale;\n success: ColorScale;\n warning: ColorScale;\n info: ColorScale;\n muted: ColorScale;\n background: ColorScale;\n foreground: ColorScale;\n border: ColorScale;\n };\n spacing: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n };\n typography: {\n fontFamily: string[];\n fontSize: Record<Size, string>;\n fontWeight: {\n normal: string;\n medium: string;\n semibold: string;\n bold: string;\n };\n };\n borderRadius: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n full: string;\n };\n shadows: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n };\n}\n\n/**\n * 기본 디자인 토큰\n * Tailwind CSS 클래스 기반\n */\nexport const defaultTokens: DesignTokens = {\n colors: {\n primary: {\n light: \"primary\",\n dark: \"primary\",\n },\n secondary: {\n light: \"secondary\",\n dark: \"secondary\",\n },\n accent: {\n light: \"accent\",\n dark: \"accent\",\n },\n destructive: {\n light: \"destructive\",\n dark: \"destructive\",\n },\n success: {\n light: \"green-600\",\n dark: \"green-500\",\n },\n warning: {\n light: \"yellow-600\",\n dark: \"yellow-500\",\n },\n info: {\n light: \"blue-600\",\n dark: \"blue-400\",\n },\n muted: {\n light: \"muted-foreground\",\n dark: \"muted-foreground\",\n },\n background: {\n light: \"background\",\n dark: \"background\",\n },\n foreground: {\n light: \"foreground\",\n dark: \"foreground\",\n },\n border: {\n light: \"border\",\n dark: \"border\",\n },\n },\n spacing: {\n sm: \"0.5rem\", // 8px\n md: \"1rem\", // 16px\n lg: \"1.5rem\", // 24px\n xl: \"2rem\", // 32px\n },\n typography: {\n fontFamily: [\"system-ui\", \"-apple-system\", \"sans-serif\"],\n fontSize: {\n sm: \"text-sm\", // 14px\n md: \"text-base\", // 16px\n lg: \"text-lg\", // 18px\n xl: \"text-xl\", // 20px\n },\n fontWeight: {\n normal: \"font-normal\",\n medium: \"font-medium\",\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n },\n },\n borderRadius: {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n },\n shadows: {\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n xl: \"shadow-xl\",\n },\n};\n\n/**\n * 테마별 토큰 가져오기\n * \n * @param theme - 테마 ('light' | 'dark')\n * @param tokens - 디자인 토큰 (기본값: defaultTokens)\n * @returns 테마별 토큰 값\n */\nexport function getThemeTokenValue<T extends keyof DesignTokens>(\n theme: \"light\" | \"dark\",\n tokenPath: T,\n tokens: DesignTokens = defaultTokens\n): DesignTokens[T] {\n const token = tokens[tokenPath];\n \n // 색상 토큰인 경우 light/dark 값 반환\n if (tokenPath === \"colors\") {\n const colorToken = token as DesignTokens[\"colors\"];\n return Object.fromEntries(\n Object.entries(colorToken).map(([key, value]) => [\n key,\n value[theme],\n ])\n ) as DesignTokens[T];\n }\n \n return token;\n}\n\n/**\n * 색상 토큰 가져오기\n * \n * @param theme - 테마\n * @param colorKey - 색상 키\n * @param tokens - 디자인 토큰\n * @returns 색상 클래스 문자열\n */\nexport function getColorToken(\n theme: \"light\" | \"dark\",\n colorKey: keyof DesignTokens[\"colors\"],\n tokens: DesignTokens = defaultTokens\n): string {\n const color = tokens.colors[colorKey];\n return color[theme];\n}\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { defaultTokens } from \"../lib/styles/system/tokens\";\n\n/**\n * Logo variant 타입\n * - symbol: 엠블럼만 (기본값)\n * - full: 엠블럼 + 워드마크\n */\nexport type LogoVariant = \"symbol\" | \"full\";\n\n/**\n * Logo size 타입\n * - sm, md, lg: 디자인 토큰 기반 크기\n * - number: 직접 rem 값 지정\n */\nexport type LogoSize = \"sm\" | \"md\" | \"lg\" | number;\n\n/**\n * Logo 컴포넌트 Props\n */\nexport interface LogoProps extends Omit<React.HTMLAttributes<HTMLElement>, \"width\" | \"height\"> {\n /**\n * 로고 변형\n * @default \"symbol\"\n */\n variant?: LogoVariant;\n /**\n * 로고 크기\n * @default \"md\"\n */\n size?: LogoSize;\n /**\n * 애니메이션 활성화 (Path Drawing 효과)\n * @default false\n */\n animated?: boolean;\n /**\n * 추가 className\n */\n className?: string;\n}\n\n/**\n * 엠블럼 SVG Path (viewBox: 0 0 40 40)\n */\nconst EMBLEM_PATH =\n \"M1.83795 0.0849609C3.16041 -0.269391 4.51968 0.515459 4.87408 1.83789L11.7335 27.4395L17.8184 21.3545L13.9464 6.90332C13.5921 5.58102 14.3771 4.22171 15.6993 3.86719C16.2369 3.72314 16.78 3.76987 17.2598 3.96191C17.3834 3.97561 17.5081 3.99515 17.6319 4.02832L38.1182 9.51855C39.4407 9.87293 40.2255 11.2322 39.8712 12.5547C39.5166 13.8769 38.1574 14.6619 36.835 14.3076L32.9249 13.2598L23.3487 22.8359L24.4893 27.0908C24.8437 28.4133 24.0588 29.7735 22.7364 30.1279C21.4141 30.4822 20.0548 29.6972 19.7003 28.375L19.3008 26.8838L13.3506 32.835C13.3068 32.8789 13.2592 32.9181 13.213 32.958L14.2637 36.8789C14.6179 38.2012 13.8331 39.5606 12.5108 39.915C11.1884 40.2694 9.82913 39.4845 9.47467 38.1621L0.085022 3.12109C-0.269246 1.79868 0.515578 0.439365 1.83795 0.0849609ZM21.8672 17.3057L27.3946 11.7773L19.8438 9.75488L21.8672 17.3057Z\";\n\n/**\n * 워드마크 SVG Path (viewBox: 0 0 192 37, x=40부터 시작)\n */\nconst WORDMARK_PATH =\n \"M40.8865 0.0761719C41.2577 0.0762268 41.5614 0.211458 41.7976 0.481445C42.0507 0.751482 42.1605 1.08058 42.1267 1.46875L39.823 23.165C39.5361 25.933 40.042 28.0937 41.3416 29.6465C42.658 31.1823 44.5825 31.9502 47.114 31.9502C49.8482 31.9502 51.9919 31.1984 53.5447 29.6963C55.1142 28.1942 56.059 25.9832 56.3796 23.0635L58.6833 1.19043C58.7171 0.886659 58.8524 0.624671 59.0886 0.405273C59.3418 0.185863 59.6293 0.0761719 59.95 0.0761719H62.6589C63.0132 0.0762861 63.3085 0.211518 63.5447 0.481445C63.7978 0.751463 63.899 1.07211 63.8484 1.44336L61.4685 24.0254C61.0466 28.0084 59.5278 31.1565 56.9119 33.4688C54.2958 35.7641 50.9029 36.9121 46.7341 36.9121C42.6667 36.9121 39.5025 35.7215 37.241 33.3418C34.9794 30.962 34.0593 27.7639 34.4812 23.7471L36.8865 1.21582C36.9034 0.912022 37.0301 0.650074 37.2664 0.430664C37.5195 0.194523 37.8061 0.0761804 38.1267 0.0761719H40.8865ZM157.419 0.0761719C157.756 0.0762579 158.026 0.203032 158.228 0.456055C158.448 0.709181 158.532 1.01283 158.481 1.36719L156.502 12.4541C157.226 11.6092 158.164 10.9091 159.317 10.3545C160.667 9.71319 162.127 9.39258 163.697 9.39258C166.279 9.39262 168.355 10.3468 169.925 12.2539C171.494 14.1611 172.01 16.6756 171.469 19.7979L170.33 26.2539C169.756 29.5448 168.439 32.1437 166.381 34.0508C164.322 35.958 161.941 36.9121 159.241 36.9121C157.553 36.9121 156.102 36.5404 154.886 35.7979C153.815 35.1281 153.052 34.2874 152.597 33.2764L152.127 35.7979C152.093 36.0004 151.983 36.1857 151.798 36.3545C151.612 36.5063 151.393 36.583 151.139 36.583H148.861C148.524 36.5829 148.245 36.4561 148.026 36.2031C147.824 35.9501 147.756 35.6547 147.823 35.3174L153.899 1.0127C153.933 0.75964 154.06 0.540084 154.279 0.354492C154.498 0.168895 154.735 0.0761719 154.988 0.0761719H157.419ZM139.621 9.39258C142.203 9.39258 144.178 10.135 145.545 11.6201C146.929 13.1053 147.401 15.0885 146.963 17.5693L143.748 35.6455C143.714 35.8986 143.587 36.1181 143.368 36.3037C143.165 36.4894 142.92 36.582 142.634 36.582H140.33C140.026 36.582 139.773 36.4723 139.57 36.2529C139.368 36.0336 139.292 35.7723 139.343 35.4688L139.753 33.2568C138.858 34.4755 137.845 35.3911 136.71 36C135.562 36.6076 134.279 36.9111 132.861 36.9111C130.684 36.9111 128.987 36.27 127.772 34.9873C126.574 33.7047 126.161 31.9917 126.532 29.8486L127.09 26.6582C127.478 24.4306 128.515 22.6923 130.203 21.4434C131.891 20.1945 133.992 19.5694 136.507 19.5693C137.452 19.5693 138.389 19.6961 139.317 19.9492C140.245 20.1855 141.047 20.5316 141.722 20.9873L142.304 17.5947C142.541 16.2448 142.296 15.2156 141.57 14.5068C140.844 13.798 139.883 13.4434 138.684 13.4434C137.959 13.4434 137.3 13.5616 136.71 13.7979C136.136 14.0341 135.603 14.3547 135.114 14.7598C134.625 15.1479 134.161 15.6209 133.722 16.1777C133.301 16.7174 132.98 17.004 132.76 17.0381C132.541 17.0718 132.329 17.0293 132.127 16.9111L130.456 15.8486C130.27 15.7305 130.144 15.5527 130.077 15.3164C130.026 15.0801 130.254 14.5742 130.76 13.7979C131.284 13.0046 131.983 12.2613 132.861 11.5693C133.739 10.8605 134.726 10.3205 135.823 9.94922C136.937 9.57791 138.203 9.39258 139.621 9.39258ZM184.457 9.39258C185.587 9.39262 186.592 9.57795 187.469 9.94922C188.347 10.3205 189.064 10.8862 189.621 11.6455C190.195 12.405 190.566 13.1142 190.735 13.7725C190.921 14.4305 190.962 14.878 190.861 15.1143C190.76 15.3503 190.6 15.5104 190.381 15.5947L188.431 16.4307C188.178 16.5319 187.942 16.5489 187.722 16.4814C187.52 16.3971 187.318 16.1181 187.115 15.6455C186.912 15.173 186.659 14.7512 186.355 14.3799C186.068 13.9917 185.714 13.7127 185.292 13.5439C184.87 13.3584 184.355 13.2656 183.748 13.2656C182.803 13.2656 181.975 13.5105 181.266 14C180.574 14.4726 180.144 15.1818 179.975 16.127L179.899 16.5312C179.747 17.4931 179.866 18.2782 180.254 18.8857C180.659 19.4764 181.882 20.3124 183.925 21.3926C186.22 22.5065 187.74 23.6375 188.482 24.7852C189.225 25.9328 189.41 27.5113 189.039 29.5195L189.013 29.6963C188.558 32.2279 187.478 34.0681 185.773 35.2158C184.085 36.3466 182.119 36.9111 179.874 36.9111C178.406 36.9111 177.132 36.6671 176.052 36.1777C174.988 35.6714 174.169 34.9962 173.595 34.1523C173.038 33.3085 172.692 32.4981 172.557 31.7217C172.422 30.9453 172.422 30.4555 172.557 30.2529C172.692 30.0336 172.879 29.8822 173.115 29.7979L175.14 29.0381C175.377 28.9707 175.596 28.9791 175.799 29.0635C176.018 29.1481 176.22 29.4943 176.406 30.1016C176.609 30.6922 176.853 31.2067 177.14 31.6455C177.444 32.0843 177.857 32.4304 178.381 32.6836C178.921 32.9199 179.604 33.0381 180.431 33.0381C181.427 33.038 182.296 32.7761 183.039 32.2529C183.798 31.7297 184.263 30.9788 184.431 30L184.507 29.6709C184.692 28.6584 184.625 27.8232 184.304 27.165C183.984 26.4899 182.954 25.671 181.216 24.709C178.684 23.477 177.004 22.2532 176.177 21.0381C175.367 19.8061 175.115 18.3884 175.419 16.7852L175.545 16.1523C175.916 13.9751 176.879 12.3042 178.431 11.1396C180.001 9.97511 182.01 9.39258 184.457 9.39258ZM7.92456 0.0507812C8.3294 0.0508971 8.6588 0.202195 8.91187 0.505859C9.16494 0.792681 9.26609 1.13054 9.21558 1.51855L7.72632 15.5439H25.7742L27.2917 1.24023C27.3255 0.936656 27.4685 0.666822 27.7214 0.430664C27.9746 0.177499 28.2706 0.0507812 28.6082 0.0507812H31.4685C31.8566 0.0507849 32.1773 0.202255 32.4304 0.505859C32.7004 0.792695 32.81 1.13051 32.7595 1.51855L29.1648 35.418C29.131 35.7217 28.9872 35.9998 28.7341 36.2529C28.481 36.4892 28.1859 36.6074 27.8484 36.6074H24.9871C24.5822 36.6073 24.2528 36.4645 23.9998 36.1777C23.7467 35.874 23.6455 35.5277 23.696 35.1396L25.2371 20.6074H7.18921L5.61987 35.3926C5.60297 35.7131 5.46 35.9999 5.19019 36.2529C4.93702 36.4892 4.64953 36.6074 4.32886 36.6074H1.44312C1.05506 36.6074 0.725803 36.4645 0.455811 36.1777C0.202712 35.874 0.10156 35.5277 0.1521 35.1396L3.74683 1.26562C3.7806 0.945022 3.92439 0.666913 4.17749 0.430664C4.43063 0.177522 4.72572 0.0508046 5.06323 0.0507812H7.92456ZM81.2156 0.0507812C81.57 0.050791 81.8821 0.168994 82.1521 0.405273C82.4389 0.624614 82.6328 0.902832 82.7341 1.24023L92.4304 34.9111C92.5654 35.3837 92.5068 35.7894 92.2537 36.127C92.0005 36.4475 91.6458 36.6074 91.1902 36.6074H88.2283C87.9414 36.6074 87.6709 36.5148 87.4177 36.3291C87.1816 36.1266 87.0301 35.8986 86.9626 35.6455L84.6492 27.3418H69.4958L65.3171 35.8232C65.2159 36.0426 65.055 36.228 64.8357 36.3799C64.6163 36.5149 64.3799 36.582 64.1267 36.582H61.1394C60.6838 36.582 60.3376 36.3967 60.1013 36.0254C59.8651 35.6542 59.8652 35.2407 60.1013 34.7852L77.0632 1.0127C77.2151 0.708897 77.4185 0.472488 77.6716 0.303711C77.9416 0.135061 78.2453 0.0507812 78.5828 0.0507812H81.2156ZM111.368 0.0507812C111.773 0.050882 112.102 0.210697 112.355 0.53125C112.608 0.835009 112.692 1.18973 112.608 1.59473L107.368 31.3672H122.634C123.039 31.3672 123.359 31.511 123.595 31.7979C123.832 32.0847 123.916 32.4139 123.848 32.7852L123.368 35.418C123.334 35.7048 123.19 35.9498 122.937 36.1523C122.701 36.3548 122.439 36.4561 122.152 36.4561H102.405C102.017 36.456 101.696 36.3207 101.443 36.0508C101.207 35.7639 101.123 35.4177 101.19 35.0127L107.19 1.13965C107.241 0.869608 107.393 0.624683 107.646 0.405273C107.899 0.169049 108.177 0.0508458 108.481 0.0507812H111.368ZM136.81 23.0889C135.41 23.0889 134.254 23.384 133.343 23.9746C132.431 24.5653 131.883 25.4346 131.697 26.582L131.165 29.5947C130.979 30.6747 131.182 31.4938 131.772 32.0508C132.363 32.6077 133.283 32.8867 134.532 32.8867C136.085 32.8867 137.418 32.3295 138.532 31.2158C139.663 30.085 140.304 28.9115 140.456 27.6963L141.013 24.6328C140.676 24.1266 140.127 23.7473 139.368 23.4941C138.608 23.2241 137.755 23.0889 136.81 23.0889ZM162.052 13.8232C160.364 13.8232 158.853 14.3972 157.519 15.5449C156.186 16.6757 155.351 18.1946 155.013 20.1016L153.925 26.2793C153.604 28.085 153.857 29.5784 154.684 30.7598C155.511 31.9243 156.836 32.5068 158.659 32.5068C160.296 32.5068 161.782 31.9584 163.115 30.8613C164.465 29.7475 165.3 28.2115 165.621 26.2539L166.71 20.0762C167.047 18.1353 166.785 16.608 165.925 15.4941C165.064 14.3803 163.773 13.8233 162.052 13.8232ZM79.0134 8.02539L71.5916 23.0889H83.4636L79.2664 8.02539L79.1902 7.64551L79.0134 8.02539Z\";\n\n/**\n * size prop을 rem 값으로 변환\n */\nfunction getSizeInRem(size: LogoSize): string {\n if (typeof size === \"number\") {\n return `${size}rem`;\n }\n\n // 디자인 토큰 기반 크기 매핑\n const sizeMap: Record<\"sm\" | \"md\" | \"lg\", string> = {\n sm: defaultTokens.spacing.md, // 1rem (16px)\n md: defaultTokens.spacing.lg, // 1.5rem (24px)\n lg: defaultTokens.spacing.xl, // 2rem (32px)\n };\n\n return sizeMap[size];\n}\n\n/**\n * Logo 컴포넌트\n *\n * HUA Labs 공식 로고 컴포넌트\n *\n * @example\n * ```tsx\n * // 기본 (엠블럼만)\n * <Logo />\n *\n * // 워드마크 포함\n * <Logo variant=\"full\" />\n *\n * // 크기 조정\n * <Logo size=\"lg\" />\n * <Logo size={3} /> // 3rem\n *\n * // 애니메이션\n * <Logo animated />\n * ```\n */\nexport function Logo({\n variant = \"symbol\",\n size = \"md\",\n animated = false,\n className,\n ...props\n}: LogoProps) {\n const sizeInRem = getSizeInRem(size);\n\n // 애니메이션용 스타일 시트 주입 (한 번만)\n useEffect(() => {\n if (!animated) return;\n\n const styleId = \"hua-logo-animation\";\n if (document.getElementById(styleId)) return;\n\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = `\n @keyframes hua-logo-draw {\n from {\n stroke-dashoffset: 1000;\n }\n to {\n stroke-dashoffset: 0;\n }\n }\n @keyframes hua-logo-draw-wordmark {\n from {\n stroke-dashoffset: 2000;\n }\n to {\n stroke-dashoffset: 0;\n }\n }\n .hua-logo-path {\n stroke: currentColor;\n stroke-width: 0.5;\n fill: none;\n animation: hua-logo-draw 2s ease-in-out forwards;\n }\n .hua-logo-wordmark {\n stroke: currentColor;\n stroke-width: 0.5;\n fill: none;\n animation: hua-logo-draw-wordmark 2s ease-in-out 0.5s forwards;\n }\n `;\n document.head.appendChild(style);\n\n return () => {\n const existingStyle = document.getElementById(styleId);\n if (existingStyle) {\n existingStyle.remove();\n }\n };\n }, [animated]);\n\n // Symbol only (엠블럼만)\n if (variant === \"symbol\") {\n return (\n <svg\n width={sizeInRem}\n height={sizeInRem}\n viewBox=\"0 0 40 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={merge(\"text-foreground\", className)}\n >\n <path\n d={EMBLEM_PATH}\n fill={animated ? \"none\" : \"currentColor\"}\n stroke={animated ? \"currentColor\" : \"none\"}\n strokeWidth={animated ? \"0.5\" : undefined}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={animated ? \"hua-logo-path\" : undefined}\n />\n </svg>\n );\n }\n\n // Full variant (엠블럼 + 워드마크 flex 배치)\n // 워드마크 원본: 152x37, 비율 152/37 ≈ 4.1\n const wordmarkRatio = 152 / 37;\n\n return (\n <div\n className={merge(\"inline-flex items-center gap-1 flex-shrink-0 min-w-max\", className)}\n {...(props as React.HTMLAttributes<HTMLDivElement>)}\n >\n {/* 엠블럼 */}\n <svg\n viewBox=\"0 0 40 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"flex-shrink-0\"\n style={{ width: sizeInRem, height: sizeInRem }}\n >\n <path\n d={EMBLEM_PATH}\n fill={animated ? \"none\" : \"currentColor\"}\n stroke={animated ? \"currentColor\" : \"none\"}\n strokeWidth={animated ? \"0.5\" : undefined}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={animated ? \"hua-logo-path\" : undefined}\n />\n </svg>\n {/* 워드마크 */}\n <svg\n viewBox=\"40 0 152 37\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"flex-shrink-0\"\n style={{ \n height: sizeInRem,\n width: `calc(${sizeInRem} * ${wordmarkRatio})`,\n }}\n >\n <path\n d={WORDMARK_PATH}\n fill={animated ? \"none\" : \"currentColor\"}\n stroke={animated ? \"currentColor\" : \"none\"}\n strokeWidth={animated ? \"0.5\" : undefined}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={animated ? \"hua-logo-wordmark\" : undefined}\n />\n </svg>\n </div>\n );\n}\n","\"use client\"\n\nimport React, { useState, useEffect } from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Bookmark 컴포넌트의 props / Bookmark component props\n * @typedef {Object} BookmarkProps\n * @property {string} id - 북마크 고유 ID / Bookmark unique ID\n * @property {string} [storageKey='bookmarks'] - localStorage 키 / localStorage key\n * @property {boolean} [defaultBookmarked=false] - 기본 북마크 상태 / Default bookmarked state\n * @property {(bookmarked: boolean) => void} [onBookmarkChange] - 북마크 상태 변경 콜백 / Bookmark state change callback\n * @property {'sm' | 'md' | 'lg'} [size='md'] - Bookmark 크기 / Bookmark size\n * @property {'default' | 'filled' | 'outline'} [variant='default'] - Bookmark 스타일 변형 / Bookmark style variant\n * @extends {React.HTMLAttributes<HTMLButtonElement>}\n */\nexport interface BookmarkProps extends React.HTMLAttributes<HTMLButtonElement> {\n id: string\n storageKey?: string\n defaultBookmarked?: boolean\n onBookmarkChange?: (bookmarked: boolean) => void\n size?: 'sm' | 'md' | 'lg'\n variant?: 'default' | 'filled' | 'outline'\n}\n\n/**\n * Bookmark 컴포넌트 / Bookmark component\n * \n * 북마크 기능을 제공하는 버튼 컴포넌트입니다.\n * localStorage에 북마크 상태를 저장하며, 여러 항목의 북마크를 관리할 수 있습니다.\n * \n * Button component that provides bookmark functionality.\n * Saves bookmark state to localStorage and can manage bookmarks for multiple items.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Bookmark id=\"article-1\" />\n * \n * @example\n * // 상태 변경 감지 / State change detection\n * <Bookmark \n * id=\"article-1\"\n * onBookmarkChange={(bookmarked) => console.log(bookmarked)}\n * variant=\"filled\"\n * />\n * \n * @param {BookmarkProps} props - Bookmark 컴포넌트의 props / Bookmark component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} Bookmark 컴포넌트 / Bookmark component\n */\nconst Bookmark = React.forwardRef<HTMLButtonElement, BookmarkProps>(\n ({ \n className, \n id, \n storageKey = 'bookmarks',\n defaultBookmarked = false,\n onBookmarkChange,\n size = 'md',\n variant = 'default',\n ...props \n }, ref) => {\n const [isBookmarked, setIsBookmarked] = useState(defaultBookmarked)\n\n // 로컬 스토리지에서 북마크 상태 불러오기\n useEffect(() => {\n const savedBookmarks = localStorage.getItem(storageKey)\n if (savedBookmarks) {\n const bookmarks = JSON.parse(savedBookmarks)\n setIsBookmarked(bookmarks.includes(id))\n }\n }, [id, storageKey])\n\n // 북마크 토글\n const toggleBookmark = () => {\n const newBookmarked = !isBookmarked\n setIsBookmarked(newBookmarked)\n \n // 로컬 스토리지 업데이트\n const savedBookmarks = localStorage.getItem(storageKey)\n const bookmarks = savedBookmarks ? JSON.parse(savedBookmarks) : []\n \n if (newBookmarked) {\n if (!bookmarks.includes(id)) {\n bookmarks.push(id)\n }\n } else {\n const index = bookmarks.indexOf(id)\n if (index > -1) {\n bookmarks.splice(index, 1)\n }\n }\n \n localStorage.setItem(storageKey, JSON.stringify(bookmarks))\n onBookmarkChange?.(newBookmarked)\n }\n\n const sizeClasses = {\n sm: \"w-6 h-6\",\n md: \"w-8 h-8\", \n lg: \"w-10 h-10\"\n }\n\n const variantClasses = {\n default: \"text-muted-foreground hover:text-yellow-500 transition-colors\",\n filled: \"text-yellow-500 hover:text-yellow-600 transition-colors\",\n outline: \"border border-border text-muted-foreground hover:text-yellow-500 hover:border-yellow-500 transition-colors rounded\"\n }\n\n return (\n <button\n ref={ref}\n onClick={toggleBookmark}\n className={merge(\n \"flex items-center justify-center transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-yellow-500 focus-visible:ring-offset-2\",\n sizeClasses[size],\n variantClasses[variant],\n className\n )}\n {...props}\n >\n <Icon \n name=\"star\" \n className={merge(\n \"transition-all duration-200\",\n isBookmarked && \"fill-current\"\n )}\n />\n </button>\n )\n }\n)\n\nBookmark.displayName = \"Bookmark\"\n\nexport { Bookmark } ","'use client'\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Avatar, AvatarImage, AvatarFallback } from \"./Avatar\"\nimport { Badge } from \"./Badge\"\nimport { Card, CardContent } from \"./Card\"\n\n/**\n * ChatMessage 컴포넌트의 props / ChatMessage component props\n * @typedef {Object} ChatMessageProps\n * @property {Object} message - 메시지 데이터 / Message data\n * @property {string} message.id - 메시지 ID / Message ID\n * @property {string} message.content - 메시지 내용 / Message content\n * @property {\"user\" | \"assistant\" | \"system\"} message.role - 메시지 역할 / Message role\n * @property {Date} message.timestamp - 메시지 타임스탬프 / Message timestamp\n * @property {string} [message.emotion] - 감정 정보 / Emotion information\n * @property {number} [message.intensity] - 감정 강도 / Emotion intensity\n * @property {boolean} [message.isTyping] - 타이핑 중 여부 / Typing state\n * @property {Object} [user] - 사용자 정보 / User information\n * @property {string} [user.name=\"사용자\"] - 사용자 이름 / User name\n * @property {string} [user.avatar] - 사용자 아바타 URL / User avatar URL\n * @property {string} [user.color=\"#3b82f6\"] - 사용자 색상 / User color\n * @property {Object} [assistant] - AI 어시스턴트 정보 / AI assistant information\n * @property {string} [assistant.name=\"AI\"] - AI 이름 / AI name\n * @property {string} [assistant.avatar] - AI 아바타 URL / AI avatar URL\n * @property {string} [assistant.color=\"#10b981\"] - AI 색상 / AI color\n * @property {boolean} [showAvatar=true] - 아바타 표시 여부 / Show avatar\n * @property {boolean} [showTimestamp=true] - 타임스탬프 표시 여부 / Show timestamp\n * @property {boolean} [showEmotion=true] - 감정 표시 여부 / Show emotion\n * @property {\"default\" | \"compact\" | \"bubble\"} [variant=\"default\"] - ChatMessage 스타일 변형 / ChatMessage style variant\n * @property {Object} [theme] - 커스텀 테마 / Custom theme\n * @property {string} [theme.userBubbleBg] - 사용자 버블 배경색 / User bubble background color\n * @property {string} [theme.userBubbleText] - 사용자 버블 텍스트 색상 / User bubble text color\n * @property {string} [theme.aiBubbleBg] - AI 버블 배경색 / AI bubble background color\n * @property {string} [theme.aiBubbleText] - AI 버블 텍스트 색상 / AI bubble text color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface ChatMessageProps extends React.HTMLAttributes<HTMLDivElement> {\n message: {\n id: string\n content: string\n role: \"user\" | \"assistant\" | \"system\"\n timestamp: Date\n emotion?: string\n intensity?: number\n isTyping?: boolean\n }\n user?: {\n name?: string\n avatar?: string\n color?: string\n }\n assistant?: {\n name?: string\n avatar?: string\n color?: string\n }\n showAvatar?: boolean\n showTimestamp?: boolean\n showEmotion?: boolean\n variant?: \"default\" | \"compact\" | \"bubble\"\n theme?: {\n userBubbleBg?: string\n userBubbleText?: string\n aiBubbleBg?: string\n aiBubbleText?: string\n }\n}\n\n/**\n * ChatMessage 컴포넌트\n * \n * 채팅 메시지를 표시하는 컴포넌트입니다.\n * 사용자, AI 어시스턴트, 시스템 메시지를 지원하며, 감정 정보를 표시할 수 있습니다.\n * \n * @component\n * @example\n * // 기본 사용\n * <ChatMessage\n * message={{\n * id: \"1\",\n * content: \"안녕하세요!\",\n * role: \"user\",\n * timestamp: new Date()\n * }}\n * />\n * \n * @example\n * // AI 메시지, 감정 정보 포함\n * <ChatMessage\n * message={{\n * id: \"2\",\n * content: \"안녕하세요! 도와드릴까요?\",\n * role: \"assistant\",\n * timestamp: new Date(),\n * emotion: \"joy\",\n * intensity: 0.8\n * }}\n * variant=\"bubble\"\n * />\n * \n * @param {ChatMessageProps} props - ChatMessage 컴포넌트의 props / ChatMessage component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ChatMessage 컴포넌트 / ChatMessage component\n */\nconst ChatMessage = React.forwardRef<HTMLDivElement, ChatMessageProps>(\n ({ \n className, \n message,\n user = { name: \"사용자\", color: \"#3b82f6\" },\n assistant = { name: \"AI\", color: \"#10b981\" },\n showAvatar = true,\n showTimestamp = true,\n showEmotion = true,\n variant = \"default\",\n theme = {\n userBubbleBg: \"#3b82f6\",\n userBubbleText: \"#ffffff\",\n aiBubbleBg: \"#f3f4f6\",\n aiBubbleText: \"#1f2937\"\n },\n ...props \n }, ref) => {\n const isUser = message.role === \"user\"\n const _isAssistant = message.role === \"assistant\"\n const _isSystem = message.role === \"system\"\n\n const getEmotionColor = (emotion?: string) => {\n if (!emotion) return \"bg-gray-100\"\n \n const emotionColors = {\n joy: \"bg-yellow-100 text-yellow-800\",\n sadness: \"bg-indigo-100 text-cyan-800\",\n anger: \"bg-red-100 text-red-800\",\n calm: \"bg-green-100 text-green-800\",\n excitement: \"bg-pink-100 text-pink-800\",\n worry: \"bg-gray-100 text-gray-800\",\n gratitude: \"bg-purple-100 text-purple-800\",\n loneliness: \"bg-indigo-100 text-indigo-800\"\n }\n \n return emotionColors[emotion as keyof typeof emotionColors] || \"bg-gray-100 text-gray-800\"\n }\n\n const formatTime = (date: Date) => {\n return date.toLocaleTimeString('ko-KR', { \n hour: '2-digit', \n minute: '2-digit' \n })\n }\n\n if (variant === \"bubble\") {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex w-full\",\n isUser ? \"justify-end\" : \"justify-start\",\n className\n )}\n {...props}\n >\n <div className={merge(\n \"flex max-w-[80%] space-x-2\",\n isUser ? \"flex-row-reverse space-x-reverse\" : \"flex-row\"\n )}>\n {showAvatar && (\n <Avatar className=\"w-8 h-8 flex-shrink-0\">\n <AvatarImage\n src={isUser ? user.avatar : assistant.avatar}\n alt={isUser ? user.name : assistant.name}\n />\n <AvatarFallback\n style={{\n backgroundColor: isUser ? user.color : assistant.color\n }}\n >\n {(isUser ? user.name : assistant.name)?.charAt(0)}\n </AvatarFallback>\n </Avatar>\n )}\n \n <div className=\"space-y-1\">\n <div\n className={merge(\n \"px-4 py-2 rounded-2xl max-w-full break-words\",\n isUser \n ? \"rounded-br-md\" \n : \"rounded-bl-md\"\n )}\n style={{\n backgroundColor: isUser ? theme.userBubbleBg : theme.aiBubbleBg,\n color: isUser ? theme.userBubbleText : theme.aiBubbleText\n }}\n >\n {message.isTyping ? (\n <div className=\"flex space-x-1\">\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-100\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-200\" />\n </div>\n ) : (\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\n )}\n </div>\n \n <div className={merge(\n \"flex items-center space-x-2 text-xs text-muted-foreground\",\n isUser ? \"justify-end\" : \"justify-start\"\n )}>\n {showTimestamp && (\n <span>{formatTime(message.timestamp)}</span>\n )}\n {showEmotion && message.emotion && (\n <Badge \n variant=\"secondary\" \n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\n >\n {message.emotion}\n </Badge>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n }\n\n if (variant === \"compact\") {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-start space-x-3 py-2\",\n className\n )}\n {...props}\n >\n {showAvatar && (\n <Avatar className=\"w-6 h-6 flex-shrink-0\">\n <AvatarImage\n src={isUser ? user.avatar : assistant.avatar}\n alt={isUser ? user.name : assistant.name}\n />\n <AvatarFallback\n style={{\n backgroundColor: isUser ? user.color : assistant.color\n }}\n >\n {(isUser ? user.name : assistant.name)?.charAt(0)}\n </AvatarFallback>\n </Avatar>\n )}\n \n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center space-x-2 mb-1\">\n <span className=\"text-sm font-medium\">\n {isUser ? user.name : assistant.name}\n </span>\n {showTimestamp && (\n <span className=\"text-xs text-muted-foreground\">\n {formatTime(message.timestamp)}\n </span>\n )}\n {showEmotion && message.emotion && (\n <Badge \n variant=\"secondary\" \n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\n >\n {message.emotion}\n </Badge>\n )}\n </div>\n \n <div className=\"text-sm\">\n {message.isTyping ? (\n <div className=\"flex space-x-1\">\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce\" />\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce delay-100\" />\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce delay-200\" />\n </div>\n ) : (\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\n )}\n </div>\n </div>\n </div>\n )\n }\n\n // default variant\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-start space-x-3 py-4\",\n className\n )}\n {...props}\n >\n {showAvatar && (\n <Avatar className=\"w-10 h-10 flex-shrink-0\">\n <AvatarImage\n src={isUser ? user.avatar : assistant.avatar}\n alt={isUser ? user.name : assistant.name}\n />\n <AvatarFallback\n style={{\n backgroundColor: isUser ? user.color : assistant.color\n }}\n >\n {(isUser ? user.name : assistant.name)?.charAt(0)}\n </AvatarFallback>\n </Avatar>\n )}\n \n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center space-x-2 mb-2\">\n <span className=\"font-medium\">\n {isUser ? user.name : assistant.name}\n </span>\n {showTimestamp && (\n <span className=\"text-sm text-muted-foreground\">\n {formatTime(message.timestamp)}\n </span>\n )}\n {showEmotion && message.emotion && (\n <Badge \n variant=\"secondary\" \n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\n >\n {message.emotion}\n </Badge>\n )}\n </div>\n \n <Card className={merge(\n \"inline-block\",\n isUser ? \"bg-primary text-primary-foreground\" : \"bg-muted\"\n )}>\n <CardContent className=\"p-3\">\n {message.isTyping ? (\n <div className=\"flex space-x-1\">\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-100\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-200\" />\n </div>\n ) : (\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n )\n }\n)\n\nChatMessage.displayName = \"ChatMessage\"\n\nexport { ChatMessage } ","\"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-gray-200 rounded-full dark:bg-gray-700\",\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 } ","'use client'\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"./Card\"\nimport { Badge } from \"./Badge\"\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 } ","\"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-gray-200 bg-white dark:border-gray-700 dark:bg-gray-800\",\n className\n )}\n {...props}\n >\n {emotion}\n </button>\n )\n }\n)\nEmotionButton.displayName = \"EmotionButton\"\n\nexport { EmotionButton } ","'use client'\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { EmotionButton } from \"./EmotionButton\"\nimport { EmotionMeter } from \"./EmotionMeter\"\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 } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * LanguageToggle 컴포넌트의 props / LanguageToggle component props\n * @typedef {Object} LanguageToggleProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Toggle 크기 / Toggle size\n * @property {\"button\" | \"icon\" | \"dropdown\"} [variant=\"button\"] - Toggle 스타일 변형 / Toggle style variant\n * @property {boolean} [showLabel=false] - 라벨 표시 여부 / Show label\n * @property {Array<Object>} [languages] - 언어 목록 / Language list\n * @property {string} languages[].code - 언어 코드 / Language code\n * @property {string} languages[].name - 언어 이름 / Language name\n * @property {string} [languages[].flag] - 언어 플래그 이모지 / Language flag emoji\n * @property {string} [currentLanguage=\"ko\"] - 현재 선택된 언어 코드 / Currently selected language code\n * @property {(language: string) => void} [onLanguageChange] - 언어 변경 콜백 / Language change callback\n */\nexport interface LanguageToggleProps {\n className?: string\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"button\" | \"icon\" | \"dropdown\"\n showLabel?: boolean\n languages?: Array<{\n code: string\n name: string\n flag?: string\n }>\n currentLanguage?: string\n onLanguageChange?: (language: string) => void\n}\n\n/**\n * LanguageToggle 컴포넌트 / LanguageToggle component\n * \n * 언어를 전환하는 토글 컴포넌트입니다.\n * 여러 언어를 지원하며, 버튼, 아이콘, 드롭다운 형태로 표시할 수 있습니다.\n * \n * Toggle component for switching languages.\n * Supports multiple languages and can be displayed as button, icon, or dropdown.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <LanguageToggle />\n * \n * @example\n * // 드롭다운 형태 / Dropdown variant\n * <LanguageToggle \n * variant=\"dropdown\"\n * currentLanguage=\"en\"\n * onLanguageChange={(lang) => console.log(lang)}\n * />\n * \n * @param {LanguageToggleProps} props - LanguageToggle 컴포넌트의 props / LanguageToggle component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} LanguageToggle 컴포넌트 / LanguageToggle component\n */\nconst LanguageToggle = React.forwardRef<HTMLDivElement, LanguageToggleProps>(\n ({ \n className,\n size = \"md\",\n variant = \"button\",\n showLabel = false,\n languages = [\n { code: \"ko\", name: \"한국어\", flag: \"🇰🇷\" },\n { code: \"en\", name: \"English\", flag: \"🇺🇸\" },\n { code: \"ja\", name: \"日本語\", flag: \"🇯🇵\" },\n { code: \"zh\", name: \"中文\", flag: \"🇨🇳\" }\n ],\n currentLanguage = \"ko\",\n onLanguageChange,\n ...props\n }, _ref) => {\n const [isOpen, setIsOpen] = React.useState(false)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n\n const currentLang = languages.find(lang => lang.code === currentLanguage) || languages[0]\n\n const sizeClasses = {\n sm: \"h-10 w-10\", // 40px - 더 넉넉한 크기\n md: \"h-12 w-12\", // 48px - 더 넉넉한 크기\n lg: \"h-14 w-14\" // 56px - 더 넉넉한 크기\n }\n\n const _iconSizes = {\n sm: 16,\n md: 20,\n lg: 24\n }\n\n // 외부 클릭 시 드롭다운 닫기\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside)\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [isOpen])\n\n const handleLanguageChange = (languageCode: string) => {\n onLanguageChange?.(languageCode)\n setIsOpen(false)\n }\n\n const renderIcon = () => (\n <div className=\"flex items-center justify-center\">\n <span className=\"text-lg\">{currentLang.flag}</span>\n </div>\n )\n\n if (variant === \"icon\") {\n return (\n <div ref={dropdownRef} className=\"relative\">\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={merge(\n \"inline-flex items-center justify-center rounded-lg transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n {renderIcon()}\n </button>\n\n {isOpen && (\n <div className=\"absolute top-full right-0 mt-2 w-48 bg-background rounded-lg shadow-lg border border-border py-2 z-50\">\n {languages.map((language) => (\n <button\n key={language.code}\n onClick={() => handleLanguageChange(language.code)}\n className={merge(\n \"w-full px-4 py-3 text-left hover:bg-muted transition-colors duration-200 flex items-center gap-3\", // 16px, 12px 패딩, 12px 간격\n currentLanguage === language.code && \"bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 dark:text-indigo-400\"\n )}\n >\n <span className=\"text-lg\">{language.flag}</span>\n <span className=\"text-sm font-medium\">{language.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n\n if (variant === \"dropdown\") {\n return (\n <div ref={dropdownRef} className=\"relative\">\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={merge(\n \"inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\", // 12px 간격, 16px, 12px 패딩\n className\n )}\n {...props}\n >\n <span className=\"text-lg\">{currentLang.flag}</span>\n {showLabel && <span className=\"text-foreground\">{currentLang.name}</span>}\n <svg\n className={merge(\n \"w-4 h-4 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {isOpen && (\n <div className=\"absolute top-full right-0 mt-2 w-48 bg-background rounded-lg shadow-lg border border-border py-2 z-50\">\n {languages.map((language) => (\n <button\n key={language.code}\n onClick={() => handleLanguageChange(language.code)}\n className={merge(\n \"w-full px-4 py-3 text-left hover:bg-muted transition-colors duration-200 flex items-center gap-3\", // 16px, 12px 패딩, 12px 간격\n currentLanguage === language.code && \"bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 dark:text-indigo-400\"\n )}\n >\n <span className=\"text-lg\">{language.flag}</span>\n <span className=\"text-sm font-medium\">{language.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n\n // 기본 버튼 형태\n return (\n <button\n onClick={() => {\n const currentIndex = languages.findIndex(lang => lang.code === currentLanguage)\n const nextIndex = (currentIndex + 1) % languages.length\n onLanguageChange?.(languages[nextIndex].code)\n }}\n className={merge(\n \"inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\", // 12px 간격, 16px, 12px 패딩\n className\n )}\n {...props}\n >\n <span className=\"text-lg\">{currentLang.flag}</span>\n {showLabel && <span className=\"text-foreground\">{currentLang.name}</span>}\n </button>\n )\n }\n)\nLanguageToggle.displayName = \"LanguageToggle\"\n\nexport { LanguageToggle } ","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { Button } from './Button'\nimport { Icon } from './Icon'\nimport { merge } from '../lib/utils'\nimport type { IconName } from '../lib/icons'\n\n/**\n * ScrollIndicator 컴포넌트의 props / ScrollIndicator component props\n * @typedef {Object} ScrollIndicatorProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {string} [targetId] - 스크롤 대상 요소 ID / Target element ID to scroll to\n * @property {string} [text='Scroll down'] - 표시 텍스트 / Display text\n * @property {IconName} [iconName='arrowDown'] - 아이콘 이름 / Icon name\n * @property {number} [iconSize=20] - 아이콘 크기 / Icon size\n * @property {'bottom-center' | 'bottom-left' | 'bottom-right'} [position='bottom-center'] - 표시 위치 / Display position\n * @property {'default' | 'primary' | 'secondary' | 'outline'} [variant='default'] - ScrollIndicator 스타일 변형 / ScrollIndicator style variant\n * @property {'sm' | 'md' | 'lg'} [size='md'] - ScrollIndicator 크기 / ScrollIndicator size\n * @property {boolean} [animated=true] - 애니메이션 활성화 여부 / Enable animation\n * @property {boolean} [autoHide=true] - 자동 숨김 여부 / Auto hide\n * @property {number} [hideThreshold=100] - 숨김 임계값 (px) / Hide threshold (px)\n */\nexport interface ScrollIndicatorProps {\n className?: string\n targetId?: string\n text?: string\n iconName?: IconName\n iconSize?: number\n position?: 'bottom-center' | 'bottom-left' | 'bottom-right'\n variant?: 'default' | 'primary' | 'secondary' | 'outline'\n size?: 'sm' | 'md' | 'lg'\n animated?: boolean\n autoHide?: boolean\n hideThreshold?: number\n}\n\n/**\n * ScrollIndicator 컴포넌트 / ScrollIndicator component\n * \n * 스크롤 가능함을 나타내는 인디케이터 컴포넌트입니다.\n * 클릭 시 지정된 요소로 스크롤하거나 다음 섹션으로 스크롤합니다.\n * \n * Indicator component that shows scrollability.\n * Scrolls to specified element or next section on click.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ScrollIndicator />\n * \n * @example\n * // 특정 요소로 스크롤 / Scroll to specific element\n * <ScrollIndicator \n * targetId=\"section-2\"\n * text=\"다음 섹션으로\"\n * position=\"bottom-right\"\n * />\n * \n * @param {ScrollIndicatorProps} props - ScrollIndicator 컴포넌트의 props / ScrollIndicator component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ScrollIndicator 컴포넌트 / ScrollIndicator component\n */\nconst ScrollIndicator = React.forwardRef<HTMLDivElement, ScrollIndicatorProps>(({\n className,\n targetId,\n text = 'Scroll down',\n iconName = 'arrowDown',\n iconSize = 20,\n position = 'bottom-center',\n variant = 'default',\n size = 'md',\n animated = true,\n autoHide = true,\n hideThreshold = 100,\n ...props\n}, ref) => {\n const [isVisible, setIsVisible] = useState(true)\n\n useEffect(() => {\n if (!autoHide) return\n\n const handleScroll = () => {\n const scrollTop = window.scrollY\n setIsVisible(scrollTop < hideThreshold)\n }\n\n // 초기 실행\n handleScroll()\n\n window.addEventListener('scroll', handleScroll, { passive: true })\n return () => window.removeEventListener('scroll', handleScroll)\n }, [autoHide, hideThreshold])\n\n const scrollToTarget = () => {\n if (targetId) {\n const targetElement = document.getElementById(targetId)\n if (targetElement) {\n targetElement.scrollIntoView({ behavior: 'smooth' })\n }\n } else {\n // 기본적으로 다음 섹션으로 스크롤\n const currentSection = ref as React.RefObject<HTMLDivElement>\n if (currentSection.current) {\n const nextSection = currentSection.current.nextElementSibling\n if (nextSection) {\n nextSection.scrollIntoView({ behavior: 'smooth' })\n }\n }\n }\n }\n\n const positionClasses = {\n 'bottom-center': 'bottom-8 left-1/2 transform -translate-x-1/2',\n 'bottom-left': 'bottom-8 left-8',\n 'bottom-right': 'bottom-8 right-8'\n }\n\n const sizeClasses = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg'\n }\n\n const variantClasses = {\n default: 'text-muted-foreground hover:text-foreground',\n primary: 'text-primary hover:text-primary/80',\n secondary: 'text-secondary-foreground hover:text-secondary-foreground/80',\n outline: 'text-foreground hover:text-foreground'\n }\n\n if (!isVisible) return null\n\n return (\n <div\n ref={ref}\n className={merge(\n 'absolute z-10',\n positionClasses[position],\n className\n )}\n {...props}\n >\n <Button\n onClick={scrollToTarget}\n variant=\"ghost\"\n size=\"sm\"\n className={merge(\n 'flex flex-col items-center space-y-2 transition-all duration-300',\n sizeClasses[size],\n variantClasses[variant],\n animated && 'animate-in fade-in-0 slide-in-from-bottom-2 duration-500'\n )}\n aria-label={text}\n >\n <span className=\"text-xs opacity-80\">{text}</span>\n <Icon\n name={iconName}\n size={iconSize}\n className={merge(\n animated && 'animate-bounce'\n )}\n />\n </Button>\n </div>\n )\n})\n\nScrollIndicator.displayName = 'ScrollIndicator'\n\nexport { ScrollIndicator } ","import React from \"react\"\nimport { merge } from \"../../lib/utils\"\n\nexport interface ScrollbarProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n variant?: \"default\" | \"glass\" | \"colorful\" | \"minimal\" | \"neon\"\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n orientation?: \"vertical\" | \"horizontal\" | \"both\"\n autoHide?: boolean\n smooth?: boolean\n}\n\nconst Scrollbar = React.forwardRef<HTMLDivElement, ScrollbarProps>(\n ({ \n className, \n variant = \"default\", \n size = \"md\", \n orientation = \"both\", \n autoHide = true, \n smooth = true, \n children, \n ...props \n }, ref) => {\n \n const getVariantClasses = () => {\n switch (variant) {\n case \"glass\":\n return \"scrollbar-thumb-white/20 hover:scrollbar-thumb-white/30 backdrop-blur-sm\"\n case \"colorful\":\n return \"scrollbar-thumb-gradient-to-b scrollbar-thumb-from-indigo-500 scrollbar-thumb-to-purple-500 hover:scrollbar-thumb-from-cyan-600 hover:scrollbar-thumb-to-purple-600\"\n case \"minimal\":\n return \"scrollbar-thumb-slate-200/50 hover:scrollbar-thumb-slate-300/70 dark:scrollbar-thumb-slate-700/50 dark:hover:scrollbar-thumb-slate-600/70\"\n case \"neon\":\n return \"scrollbar-thumb-cyan-400/60 hover:scrollbar-thumb-cyan-300/80 scrollbar-thumb-shadow-lg scrollbar-thumb-shadow-cyan-500/25\"\n default:\n return \"scrollbar-thumb-slate-300 hover:scrollbar-thumb-slate-400 dark:scrollbar-thumb-slate-600 dark:hover:scrollbar-thumb-slate-500\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"scrollbar-w-1\"\n case \"lg\":\n return \"scrollbar-w-3\"\n case \"xl\":\n return \"scrollbar-w-4\"\n default:\n return \"scrollbar-w-2\"\n }\n }\n\n const getOrientationClasses = () => {\n switch (orientation) {\n case \"vertical\":\n return \"overflow-y-auto overflow-x-hidden\"\n case \"horizontal\":\n return \"overflow-x-auto overflow-y-hidden\"\n default:\n return \"overflow-auto\"\n }\n }\n\n const baseClasses = merge(\n \"scrollbar-thin scrollbar-track-transparent scrollbar-thumb-rounded-full transition-all duration-200\",\n getVariantClasses(),\n getSizeClasses(),\n getOrientationClasses(),\n autoHide && \"scrollbar-hide\",\n smooth && \"scroll-smooth\",\n className\n )\n\n return (\n <div\n className={baseClasses}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nScrollbar.displayName = \"Scrollbar\"\n\nexport { Scrollbar } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * InfoCard 컴포넌트의 props / InfoCard component props\n * @typedef {Object} InfoCardProps\n * @property {string} title - 카드 제목 / Card title\n * @property {IconName} icon - 카드 아이콘 / Card icon\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\"} [tone=\"blue\"] - InfoCard 톤 색상 / InfoCard tone color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface InfoCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string\n icon: IconName\n tone?: \"blue\" | \"purple\" | \"green\" | \"orange\"\n}\n\nconst toneClasses: Record<NonNullable<InfoCardProps[\"tone\"]>, { container: string; icon: string; title: string; body: string }> = {\n blue: {\n container: \"bg-gradient-to-r from-indigo-50 to-indigo-50 dark:from-indigo-900/20 dark:to-indigo-900/20 rounded-lg p-4 border border-indigo-200 dark:border-indigo-700\",\n icon: \"h-5 w-5 text-indigo-600 dark:text-indigo-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-indigo-900 dark:text-indigo-100 mb-2 block\",\n body: \"text-foreground text-sm leading-relaxed\",\n },\n purple: {\n container: \"bg-gradient-to-r from-purple-50 to-pink-50 dark:from-purple-900/20 dark:to-pink-900/20 rounded-lg p-4 border border-purple-200 dark:border-purple-700\",\n icon: \"h-5 w-5 text-purple-600 dark:text-purple-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-purple-900 dark:text-purple-100 mb-2 block\",\n body: \"text-foreground text-sm leading-relaxed\",\n },\n green: {\n container: \"bg-gradient-to-r from-green-50 to-emerald-50 dark:from-green-900/20 dark:to-emerald-900/20 rounded-lg p-4 border border-green-200 dark:border-green-700\",\n icon: \"h-5 w-5 text-green-600 dark:text-green-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-green-900 dark:text-green-100 mb-2 block\",\n body: \"text-foreground text-sm leading-relaxed\",\n },\n orange: {\n container: \"bg-gradient-to-r from-orange-50 to-rose-50 dark:from-orange-900/20 dark:to-rose-900/20 rounded-lg p-4 border border-orange-200 dark:border-orange-700\",\n icon: \"h-5 w-5 text-orange-600 dark:text-orange-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-orange-900 dark:text-orange-100 mb-2 block\",\n body: \"text-foreground text-sm leading-relaxed\",\n },\n}\n\n/**\n * InfoCard 컴포넌트 / InfoCard component\n * \n * 정보를 표시하는 카드 컴포넌트입니다.\n * 아이콘, 제목, 내용을 포함하며, 다양한 톤 색상을 지원합니다.\n * \n * Card component that displays information.\n * Includes icon, title, and content, supports various tone colors.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <InfoCard\n * icon=\"info\"\n * title=\"정보\"\n * tone=\"blue\"\n * >\n * 이것은 정보 카드입니다.\n * </InfoCard>\n * \n * @example\n * // 다양한 톤 / Various tones\n * <InfoCard icon=\"check\" title=\"성공\" tone=\"green\">\n * 작업이 완료되었습니다.\n * </InfoCard>\n * \n * @param {InfoCardProps} props - InfoCard 컴포넌트의 props / InfoCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} InfoCard 컴포넌트 / InfoCard component\n */\nexport const InfoCard = React.forwardRef<HTMLDivElement, InfoCardProps>(({ className, title, icon, tone = \"blue\", children, ...props }, ref) => {\n const t = toneClasses[tone]\n return (\n <div ref={ref} className={merge(t.container, className)} {...props}>\n <div className=\"flex items-start mb-2\">\n <Icon name={icon} className={t.icon} />\n <div className=\"flex-1\">\n <span className={t.title}>{title}</span>\n <div className={t.body}>{children}</div>\n </div>\n </div>\n </div>\n )\n})\n\nInfoCard.displayName = \"InfoCard\"\n\nexport default InfoCard\n\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { Icon } from \"./Icon\";\nimport type { IconName } from \"../lib/icons\";\n\n/**\n * 타임라인 아이템 상태 타입 / Timeline item status type\n * @typedef {\"pending\" | \"active\" | \"completed\" | \"error\" | \"warning\" | \"info\"} TimelineStatus\n */\nexport type TimelineStatus = \"pending\" | \"active\" | \"completed\" | \"error\" | \"warning\" | \"info\";\n\n/**\n * 타임라인 아이템 인터페이스 / TimelineItem interface\n * @typedef {Object} TimelineItem\n * @property {string} id - 아이템 고유 ID / Item unique ID\n * @property {string} title - 제목 / Title\n * @property {string} [description] - 설명 / Description\n * @property {TimelineStatus} [status=\"pending\"] - 상태 / Status\n * @property {string | Date} [date] - 날짜 / Date\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {string} [meta] - 메타 정보 / Meta information\n * @property {React.ReactNode} [content] - 추가 컨텐츠 / Additional content\n */\nexport interface TimelineItem {\n id: string;\n title: string;\n description?: string;\n status?: TimelineStatus;\n date?: string | Date;\n icon?: IconName | React.ReactNode;\n meta?: string;\n content?: React.ReactNode;\n}\n\n/**\n * Timeline 컴포넌트의 props / Timeline component props\n * @typedef {Object} TimelineProps\n * @property {TimelineItem[]} items - 타임라인 아이템 배열 / Timeline items array\n * @property {\"vertical\" | \"horizontal\"} [orientation=\"vertical\"] - 방향 / Orientation\n * @property {\"left\" | \"right\" | \"alternate\"} [align=\"left\"] - 정렬 / Alignment\n * @property {string} [highlightedId] - 강조할 아이템 ID / Highlighted item ID\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @property {boolean} [showConnector=true] - 연결선 표시 / Show connector\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TimelineProps extends React.HTMLAttributes<HTMLDivElement> {\n items: TimelineItem[];\n orientation?: \"vertical\" | \"horizontal\";\n align?: \"left\" | \"right\" | \"alternate\";\n highlightedId?: string;\n locale?: string;\n emptyState?: React.ReactNode;\n showConnector?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst STATUS_CONFIG: Record<\n TimelineStatus,\n { dot: string; border: string; text: string; label: string; labelEn: string }\n> = {\n completed: {\n dot: \"bg-emerald-500 border-emerald-500 shadow-[0_0_8px_rgba(16,185,129,0.4)]\",\n border: \"border-emerald-200 dark:border-emerald-500/40\",\n text: \"text-emerald-700 dark:text-emerald-300 bg-emerald-50 dark:bg-emerald-500/10\",\n label: \"완료\",\n labelEn: \"Completed\",\n },\n active: {\n dot: \"bg-sky-500 border-sky-500 shadow-[0_0_8px_rgba(14,165,233,0.4)] animate-pulse\",\n border: \"border-sky-200 dark:border-sky-500/40\",\n text: \"text-sky-700 dark:text-sky-200 bg-sky-50 dark:bg-sky-500/10\",\n label: \"진행 중\",\n labelEn: \"Active\",\n },\n pending: {\n dot: \"bg-muted-foreground/40 border-muted-foreground/40\",\n border: \"border-border\",\n text: \"text-muted-foreground bg-muted\",\n label: \"대기\",\n labelEn: \"Pending\",\n },\n error: {\n dot: \"bg-rose-500 border-rose-500 shadow-[0_0_8px_rgba(244,63,94,0.4)]\",\n border: \"border-rose-200 dark:border-rose-500/40\",\n text: \"text-rose-700 dark:text-rose-300 bg-rose-50 dark:bg-rose-500/10\",\n label: \"오류\",\n labelEn: \"Error\",\n },\n warning: {\n dot: \"bg-amber-500 border-amber-500 shadow-[0_0_8px_rgba(245,158,11,0.4)]\",\n border: \"border-amber-200 dark:border-amber-500/40\",\n text: \"text-amber-700 dark:text-amber-300 bg-amber-50 dark:bg-amber-500/10\",\n label: \"경고\",\n labelEn: \"Warning\",\n },\n info: {\n dot: \"bg-violet-500 border-violet-500 shadow-[0_0_8px_rgba(139,92,246,0.4)]\",\n border: \"border-violet-200 dark:border-violet-500/40\",\n text: \"text-violet-700 dark:text-violet-300 bg-violet-50 dark:bg-violet-500/10\",\n label: \"정보\",\n labelEn: \"Info\",\n },\n};\n\nconst SIZE_CONFIG = {\n sm: { dot: \"h-2.5 w-2.5\", gap: \"gap-3\", padding: \"p-3\", text: \"text-xs\" },\n md: { dot: \"h-3.5 w-3.5\", gap: \"gap-4\", padding: \"p-4\", text: \"text-sm\" },\n lg: { dot: \"h-4 w-4\", gap: \"gap-5\", padding: \"p-5\", text: \"text-base\" },\n};\n\nconst formatDate = (value?: string | Date, locale = \"ko-KR\") => {\n if (!value) return undefined;\n const parsed = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(parsed.getTime())) return undefined;\n return parsed.toLocaleString(locale, { dateStyle: \"medium\", timeStyle: \"short\" });\n};\n\n/**\n * Timeline 컴포넌트\n *\n * 이벤트나 단계를 시간순으로 표시하는 범용 타임라인 컴포넌트입니다.\n * 활동 로그, 진행 단계, 히스토리 등 다양한 용도로 사용할 수 있습니다.\n *\n * Generic timeline component that displays events or steps chronologically.\n * Can be used for activity logs, progress steps, history, and more.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Timeline\n * items={[\n * { id: \"1\", title: \"작업 시작\", status: \"completed\", date: new Date() },\n * { id: \"2\", title: \"검토 중\", status: \"active\" },\n * { id: \"3\", title: \"완료 예정\", status: \"pending\" }\n * ]}\n * />\n *\n * @example\n * // 아이콘과 커스텀 컨텐츠 / With icons and custom content\n * <Timeline\n * items={[\n * {\n * id: \"1\",\n * title: \"커밋 생성\",\n * description: \"feature/timeline 브랜치에 커밋\",\n * icon: \"git-commit\",\n * status: \"completed\",\n * content: <CodeBlock code=\"git commit -m 'Add timeline'\" />\n * }\n * ]}\n * size=\"lg\"\n * />\n *\n * @example\n * // 교차 정렬 / Alternate alignment\n * <Timeline items={items} align=\"alternate\" />\n *\n * @param {TimelineProps} props - Timeline 컴포넌트의 props / Timeline component props\n * @returns {JSX.Element} Timeline 컴포넌트 / Timeline component\n */\nexport const Timeline: React.FC<TimelineProps> = ({\n items,\n orientation = \"vertical\",\n align = \"left\",\n highlightedId,\n locale = \"ko-KR\",\n emptyState,\n showConnector = true,\n size = \"md\",\n className,\n ...props\n}) => {\n const hasItems = items.length > 0;\n const sizeConfig = SIZE_CONFIG[size];\n\n if (!hasItems) {\n return (\n <div className={merge(\"\", className)} {...props}>\n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\n <Icon name=\"clock\" className=\"h-10 w-10 text-muted-foreground/50 mb-3\" />\n <p className=\"text-sm font-medium text-muted-foreground\">타임라인이 비어 있습니다</p>\n <p className=\"text-xs text-muted-foreground mt-1\">이벤트가 추가되면 여기에 표시됩니다.</p>\n </div>\n )}\n </div>\n );\n }\n\n // Horizontal layout\n if (orientation === \"horizontal\") {\n return (\n <div className={merge(\"overflow-x-auto\", className)} {...props}>\n <ol className=\"flex min-w-max\" role=\"list\" aria-label=\"타임라인\">\n {items.map((item, index) => {\n const status = item.status ?? \"pending\";\n const statusConfig = STATUS_CONFIG[status];\n const date = formatDate(item.date, locale);\n const isHighlighted = highlightedId === item.id;\n const showLine = showConnector && index !== items.length - 1;\n\n return (\n <li key={item.id} className=\"flex items-start\" role=\"listitem\">\n <div className=\"flex flex-col items-center\">\n {/* Dot */}\n <span\n className={merge(\n \"rounded-full border-2 shrink-0\",\n sizeConfig.dot,\n statusConfig.dot,\n isHighlighted && \"scale-125 ring-1 ring-offset-2 ring-border\"\n )}\n aria-label={statusConfig.label}\n />\n {/* Content below dot */}\n <div className={merge(\"mt-3 text-center max-w-[160px]\", sizeConfig.text)}>\n <p className=\"font-semibold text-foreground truncate\">{item.title}</p>\n {item.description && (\n <p className=\"text-muted-foreground mt-0.5 line-clamp-2\">{item.description}</p>\n )}\n {date && (\n <time className=\"text-xs text-muted-foreground mt-1 block\" dateTime={item.date instanceof Date ? item.date.toISOString() : item.date}>\n {date}\n </time>\n )}\n </div>\n </div>\n {/* Connector */}\n {showLine && (\n <span className=\"h-0.5 w-16 bg-border mt-[0.4375rem] mx-2\" aria-hidden=\"true\" />\n )}\n </li>\n );\n })}\n </ol>\n </div>\n );\n }\n\n // Vertical layout\n return (\n <div className={merge(\"\", className)} {...props}>\n <ol className=\"space-y-4\" role=\"list\" aria-label=\"타임라인\">\n {items.map((item, index) => {\n const status = item.status ?? \"pending\";\n const statusConfig = STATUS_CONFIG[status];\n const date = formatDate(item.date, locale);\n const isHighlighted = highlightedId === item.id;\n const showLine = showConnector && index !== items.length - 1;\n const isAlternateRight = align === \"alternate\" && index % 2 === 1;\n const isRight = align === \"right\" || isAlternateRight;\n\n const renderIcon = () => {\n if (!item.icon) return null;\n if (typeof item.icon === \"string\") {\n return <Icon name={item.icon as IconName} className=\"h-4 w-4\" />;\n }\n return item.icon;\n };\n\n const itemContent = (\n <div\n className={merge(\n \"flex-1 rounded-xl border transition-all\",\n sizeConfig.padding,\n statusConfig.border,\n isHighlighted && \"border-2 shadow-md ring-1 ring-border\"\n )}\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n {renderIcon() && (\n <span className=\"text-muted-foreground\">{renderIcon()}</span>\n )}\n <span className={merge(\"font-semibold text-foreground\", sizeConfig.text)}>\n {item.title}\n </span>\n <span className={merge(\"text-xs font-medium rounded-full px-2 py-0.5\", statusConfig.text)}>\n {statusConfig.label}\n </span>\n {item.meta && (\n <span className=\"text-xs text-muted-foreground\">{item.meta}</span>\n )}\n </div>\n\n {item.description && (\n <p className={merge(\"mt-1 text-muted-foreground\", sizeConfig.text)}>\n {item.description}\n </p>\n )}\n\n {item.content && <div className=\"mt-3\">{item.content}</div>}\n\n {date && (\n <div className=\"mt-3 flex items-center gap-1 text-xs text-muted-foreground\">\n <Icon name=\"clock\" className=\"h-3 w-3\" aria-hidden={true} />\n <time dateTime={item.date instanceof Date ? item.date.toISOString() : item.date}>\n {date}\n </time>\n </div>\n )}\n </div>\n );\n\n return (\n <li\n key={item.id}\n role=\"listitem\"\n className={merge(\n \"relative flex\",\n sizeConfig.gap,\n isRight && \"flex-row-reverse\"\n )}\n >\n {/* Dot and Connector */}\n <div className=\"flex flex-col items-center\">\n <span\n className={merge(\n \"z-10 rounded-full border-2 shrink-0\",\n sizeConfig.dot,\n statusConfig.dot,\n isHighlighted && \"scale-110\"\n )}\n aria-label={statusConfig.label}\n />\n {showLine && (\n <span className=\"mt-1 flex-1 w-px bg-border\" aria-hidden=\"true\" />\n )}\n </div>\n\n {/* Content */}\n {itemContent}\n </li>\n );\n })}\n </ol>\n </div>\n );\n};\n\nTimeline.displayName = \"Timeline\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/styles/system/tokens.ts","../src/advanced/Logo.tsx","../src/components/Bookmark.tsx","../src/components/ChatMessage.tsx","../src/components/EmotionMeter.tsx","../src/components/EmotionAnalysis.tsx","../src/components/EmotionButton.tsx","../src/components/EmotionSelector.tsx","../src/components/LanguageToggle.tsx","../src/components/ScrollIndicator.tsx","../src/components/scrollbar/scrollbar.tsx","../src/components/InfoCard.tsx","../src/components/Timeline.tsx"],"names":["defaultTokens","EMBLEM_PATH","WORDMARK_PATH","getSizeInRem","size","Logo","variant","animated","className","props","sizeInRem","useEffect","styleId","style","existingStyle","jsx","merge","wordmarkRatio","jsxs","Bookmark","React","id","storageKey","defaultBookmarked","onBookmarkChange","ref","isBookmarked","setIsBookmarked","useState","savedBookmarks","bookmarks","toggleBookmark","newBookmarked","index","sizeClasses","variantClasses","Icon","ChatMessage","message","user","assistant","showAvatar","showTimestamp","showEmotion","theme","_a","_b","_c","isUser","getEmotionColor","emotion","formatTime","date","Avatar","AvatarImage","AvatarFallback","Badge","Card","CardContent","EmotionMeter","value","max","color","emotionColors","percentage","EmotionAnalysis","primaryEmotion","emotionDistribution","keywords","intensity","positivity","energy","showMeter","showDistribution","showKeywords","showMetrics","layout","getIntensityLabel","getPositivityLabel","getEnergyLabel","Fragment","keyword","CardHeader","CardTitle","CardDescription","item","EmotionButton","isSelected","defaultEmotions","EmotionSelector","selectedEmotion","onEmotionSelect","showIntensity","onIntensityChange","emotions","handleEmotionClick","emotionKey","renderEmotionItem","layoutClasses","e","LanguageToggle","showLabel","languages","currentLanguage","onLanguageChange","_ref","isOpen","setIsOpen","dropdownRef","currentLang","lang","handleClickOutside","event","handleLanguageChange","languageCode","renderIcon","language","nextIndex","ScrollIndicator","targetId","text","iconName","iconSize","position","autoHide","hideThreshold","isVisible","setIsVisible","handleScroll","scrollTop","scrollToTarget","targetElement","currentSection","nextSection","positionClasses","Button","Scrollbar","orientation","smooth","children","getVariantClasses","getSizeClasses","getOrientationClasses","baseClasses","toneClasses","InfoCard","title","icon","tone","t","STATUS_CONFIG","SIZE_CONFIG","formatDate","locale","parsed","Timeline","items","align","highlightedId","emptyState","showConnector","hasItems","sizeConfig","status","statusConfig","isHighlighted","showLine","isAlternateRight","isRight","itemContent"],"mappings":"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","file":"advanced.mjs","sourcesContent":["/**\n * HUA UI 디자인 토큰 시스템\n * 중앙화된 디자인 토큰 정의\n */\n\nimport type { Size } from \"../../types/common\";\n\n/**\n * 색상 스케일 타입\n * light/dark 테마별 색상 정의\n */\nexport interface ColorScale {\n light: string;\n dark: string;\n}\n\n/**\n * 디자인 토큰 인터페이스\n */\nexport interface DesignTokens {\n colors: {\n primary: ColorScale;\n secondary: ColorScale;\n accent: ColorScale;\n destructive: ColorScale;\n success: ColorScale;\n warning: ColorScale;\n info: ColorScale;\n muted: ColorScale;\n background: ColorScale;\n foreground: ColorScale;\n border: ColorScale;\n };\n spacing: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n };\n typography: {\n fontFamily: string[];\n fontSize: Record<Size, string>;\n fontWeight: {\n normal: string;\n medium: string;\n semibold: string;\n bold: string;\n };\n };\n borderRadius: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n full: string;\n };\n shadows: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n };\n}\n\n/**\n * 기본 디자인 토큰\n * Tailwind CSS 클래스 기반\n */\nexport const defaultTokens: DesignTokens = {\n colors: {\n primary: {\n light: \"primary\",\n dark: \"primary\",\n },\n secondary: {\n light: \"secondary\",\n dark: \"secondary\",\n },\n accent: {\n light: \"accent\",\n dark: \"accent\",\n },\n destructive: {\n light: \"destructive\",\n dark: \"destructive\",\n },\n success: {\n light: \"green-600\",\n dark: \"green-500\",\n },\n warning: {\n light: \"yellow-600\",\n dark: \"yellow-500\",\n },\n info: {\n light: \"blue-600\",\n dark: \"blue-400\",\n },\n muted: {\n light: \"muted-foreground\",\n dark: \"muted-foreground\",\n },\n background: {\n light: \"background\",\n dark: \"background\",\n },\n foreground: {\n light: \"foreground\",\n dark: \"foreground\",\n },\n border: {\n light: \"border\",\n dark: \"border\",\n },\n },\n spacing: {\n sm: \"0.5rem\", // 8px\n md: \"1rem\", // 16px\n lg: \"1.5rem\", // 24px\n xl: \"2rem\", // 32px\n },\n typography: {\n fontFamily: [\"system-ui\", \"-apple-system\", \"sans-serif\"],\n fontSize: {\n sm: \"text-sm\", // 14px\n md: \"text-base\", // 16px\n lg: \"text-lg\", // 18px\n xl: \"text-xl\", // 20px\n },\n fontWeight: {\n normal: \"font-normal\",\n medium: \"font-medium\",\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n },\n },\n borderRadius: {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n },\n shadows: {\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n xl: \"shadow-xl\",\n },\n};\n\n/**\n * 테마별 토큰 가져오기\n * \n * @param theme - 테마 ('light' | 'dark')\n * @param tokens - 디자인 토큰 (기본값: defaultTokens)\n * @returns 테마별 토큰 값\n */\nexport function getThemeTokenValue<T extends keyof DesignTokens>(\n theme: \"light\" | \"dark\",\n tokenPath: T,\n tokens: DesignTokens = defaultTokens\n): DesignTokens[T] {\n const token = tokens[tokenPath];\n \n // 색상 토큰인 경우 light/dark 값 반환\n if (tokenPath === \"colors\") {\n const colorToken = token as DesignTokens[\"colors\"];\n return Object.fromEntries(\n Object.entries(colorToken).map(([key, value]) => [\n key,\n value[theme],\n ])\n ) as DesignTokens[T];\n }\n \n return token;\n}\n\n/**\n * 색상 토큰 가져오기\n * \n * @param theme - 테마\n * @param colorKey - 색상 키\n * @param tokens - 디자인 토큰\n * @returns 색상 클래스 문자열\n */\nexport function getColorToken(\n theme: \"light\" | \"dark\",\n colorKey: keyof DesignTokens[\"colors\"],\n tokens: DesignTokens = defaultTokens\n): string {\n const color = tokens.colors[colorKey];\n return color[theme];\n}\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { defaultTokens } from \"../lib/styles/system/tokens\";\n\n/**\n * Logo variant 타입\n * - symbol: 엠블럼만 (기본값)\n * - full: 엠블럼 + 워드마크\n */\nexport type LogoVariant = \"symbol\" | \"full\";\n\n/**\n * Logo size 타입\n * - sm, md, lg: 디자인 토큰 기반 크기\n * - number: 직접 rem 값 지정\n */\nexport type LogoSize = \"sm\" | \"md\" | \"lg\" | number;\n\n/**\n * Logo 컴포넌트 Props\n */\nexport interface LogoProps extends Omit<React.HTMLAttributes<HTMLElement>, \"width\" | \"height\"> {\n /**\n * 로고 변형\n * @default \"symbol\"\n */\n variant?: LogoVariant;\n /**\n * 로고 크기\n * @default \"md\"\n */\n size?: LogoSize;\n /**\n * 애니메이션 활성화 (Path Drawing 효과)\n * @default false\n */\n animated?: boolean;\n /**\n * 추가 className\n */\n className?: string;\n}\n\n/**\n * 엠블럼 SVG Path (viewBox: 0 0 40 40)\n */\nconst EMBLEM_PATH =\n \"M1.83795 0.0849609C3.16041 -0.269391 4.51968 0.515459 4.87408 1.83789L11.7335 27.4395L17.8184 21.3545L13.9464 6.90332C13.5921 5.58102 14.3771 4.22171 15.6993 3.86719C16.2369 3.72314 16.78 3.76987 17.2598 3.96191C17.3834 3.97561 17.5081 3.99515 17.6319 4.02832L38.1182 9.51855C39.4407 9.87293 40.2255 11.2322 39.8712 12.5547C39.5166 13.8769 38.1574 14.6619 36.835 14.3076L32.9249 13.2598L23.3487 22.8359L24.4893 27.0908C24.8437 28.4133 24.0588 29.7735 22.7364 30.1279C21.4141 30.4822 20.0548 29.6972 19.7003 28.375L19.3008 26.8838L13.3506 32.835C13.3068 32.8789 13.2592 32.9181 13.213 32.958L14.2637 36.8789C14.6179 38.2012 13.8331 39.5606 12.5108 39.915C11.1884 40.2694 9.82913 39.4845 9.47467 38.1621L0.085022 3.12109C-0.269246 1.79868 0.515578 0.439365 1.83795 0.0849609ZM21.8672 17.3057L27.3946 11.7773L19.8438 9.75488L21.8672 17.3057Z\";\n\n/**\n * 워드마크 SVG Path (viewBox: 0 0 192 37, x=40부터 시작)\n */\nconst WORDMARK_PATH =\n \"M40.8865 0.0761719C41.2577 0.0762268 41.5614 0.211458 41.7976 0.481445C42.0507 0.751482 42.1605 1.08058 42.1267 1.46875L39.823 23.165C39.5361 25.933 40.042 28.0937 41.3416 29.6465C42.658 31.1823 44.5825 31.9502 47.114 31.9502C49.8482 31.9502 51.9919 31.1984 53.5447 29.6963C55.1142 28.1942 56.059 25.9832 56.3796 23.0635L58.6833 1.19043C58.7171 0.886659 58.8524 0.624671 59.0886 0.405273C59.3418 0.185863 59.6293 0.0761719 59.95 0.0761719H62.6589C63.0132 0.0762861 63.3085 0.211518 63.5447 0.481445C63.7978 0.751463 63.899 1.07211 63.8484 1.44336L61.4685 24.0254C61.0466 28.0084 59.5278 31.1565 56.9119 33.4688C54.2958 35.7641 50.9029 36.9121 46.7341 36.9121C42.6667 36.9121 39.5025 35.7215 37.241 33.3418C34.9794 30.962 34.0593 27.7639 34.4812 23.7471L36.8865 1.21582C36.9034 0.912022 37.0301 0.650074 37.2664 0.430664C37.5195 0.194523 37.8061 0.0761804 38.1267 0.0761719H40.8865ZM157.419 0.0761719C157.756 0.0762579 158.026 0.203032 158.228 0.456055C158.448 0.709181 158.532 1.01283 158.481 1.36719L156.502 12.4541C157.226 11.6092 158.164 10.9091 159.317 10.3545C160.667 9.71319 162.127 9.39258 163.697 9.39258C166.279 9.39262 168.355 10.3468 169.925 12.2539C171.494 14.1611 172.01 16.6756 171.469 19.7979L170.33 26.2539C169.756 29.5448 168.439 32.1437 166.381 34.0508C164.322 35.958 161.941 36.9121 159.241 36.9121C157.553 36.9121 156.102 36.5404 154.886 35.7979C153.815 35.1281 153.052 34.2874 152.597 33.2764L152.127 35.7979C152.093 36.0004 151.983 36.1857 151.798 36.3545C151.612 36.5063 151.393 36.583 151.139 36.583H148.861C148.524 36.5829 148.245 36.4561 148.026 36.2031C147.824 35.9501 147.756 35.6547 147.823 35.3174L153.899 1.0127C153.933 0.75964 154.06 0.540084 154.279 0.354492C154.498 0.168895 154.735 0.0761719 154.988 0.0761719H157.419ZM139.621 9.39258C142.203 9.39258 144.178 10.135 145.545 11.6201C146.929 13.1053 147.401 15.0885 146.963 17.5693L143.748 35.6455C143.714 35.8986 143.587 36.1181 143.368 36.3037C143.165 36.4894 142.92 36.582 142.634 36.582H140.33C140.026 36.582 139.773 36.4723 139.57 36.2529C139.368 36.0336 139.292 35.7723 139.343 35.4688L139.753 33.2568C138.858 34.4755 137.845 35.3911 136.71 36C135.562 36.6076 134.279 36.9111 132.861 36.9111C130.684 36.9111 128.987 36.27 127.772 34.9873C126.574 33.7047 126.161 31.9917 126.532 29.8486L127.09 26.6582C127.478 24.4306 128.515 22.6923 130.203 21.4434C131.891 20.1945 133.992 19.5694 136.507 19.5693C137.452 19.5693 138.389 19.6961 139.317 19.9492C140.245 20.1855 141.047 20.5316 141.722 20.9873L142.304 17.5947C142.541 16.2448 142.296 15.2156 141.57 14.5068C140.844 13.798 139.883 13.4434 138.684 13.4434C137.959 13.4434 137.3 13.5616 136.71 13.7979C136.136 14.0341 135.603 14.3547 135.114 14.7598C134.625 15.1479 134.161 15.6209 133.722 16.1777C133.301 16.7174 132.98 17.004 132.76 17.0381C132.541 17.0718 132.329 17.0293 132.127 16.9111L130.456 15.8486C130.27 15.7305 130.144 15.5527 130.077 15.3164C130.026 15.0801 130.254 14.5742 130.76 13.7979C131.284 13.0046 131.983 12.2613 132.861 11.5693C133.739 10.8605 134.726 10.3205 135.823 9.94922C136.937 9.57791 138.203 9.39258 139.621 9.39258ZM184.457 9.39258C185.587 9.39262 186.592 9.57795 187.469 9.94922C188.347 10.3205 189.064 10.8862 189.621 11.6455C190.195 12.405 190.566 13.1142 190.735 13.7725C190.921 14.4305 190.962 14.878 190.861 15.1143C190.76 15.3503 190.6 15.5104 190.381 15.5947L188.431 16.4307C188.178 16.5319 187.942 16.5489 187.722 16.4814C187.52 16.3971 187.318 16.1181 187.115 15.6455C186.912 15.173 186.659 14.7512 186.355 14.3799C186.068 13.9917 185.714 13.7127 185.292 13.5439C184.87 13.3584 184.355 13.2656 183.748 13.2656C182.803 13.2656 181.975 13.5105 181.266 14C180.574 14.4726 180.144 15.1818 179.975 16.127L179.899 16.5312C179.747 17.4931 179.866 18.2782 180.254 18.8857C180.659 19.4764 181.882 20.3124 183.925 21.3926C186.22 22.5065 187.74 23.6375 188.482 24.7852C189.225 25.9328 189.41 27.5113 189.039 29.5195L189.013 29.6963C188.558 32.2279 187.478 34.0681 185.773 35.2158C184.085 36.3466 182.119 36.9111 179.874 36.9111C178.406 36.9111 177.132 36.6671 176.052 36.1777C174.988 35.6714 174.169 34.9962 173.595 34.1523C173.038 33.3085 172.692 32.4981 172.557 31.7217C172.422 30.9453 172.422 30.4555 172.557 30.2529C172.692 30.0336 172.879 29.8822 173.115 29.7979L175.14 29.0381C175.377 28.9707 175.596 28.9791 175.799 29.0635C176.018 29.1481 176.22 29.4943 176.406 30.1016C176.609 30.6922 176.853 31.2067 177.14 31.6455C177.444 32.0843 177.857 32.4304 178.381 32.6836C178.921 32.9199 179.604 33.0381 180.431 33.0381C181.427 33.038 182.296 32.7761 183.039 32.2529C183.798 31.7297 184.263 30.9788 184.431 30L184.507 29.6709C184.692 28.6584 184.625 27.8232 184.304 27.165C183.984 26.4899 182.954 25.671 181.216 24.709C178.684 23.477 177.004 22.2532 176.177 21.0381C175.367 19.8061 175.115 18.3884 175.419 16.7852L175.545 16.1523C175.916 13.9751 176.879 12.3042 178.431 11.1396C180.001 9.97511 182.01 9.39258 184.457 9.39258ZM7.92456 0.0507812C8.3294 0.0508971 8.6588 0.202195 8.91187 0.505859C9.16494 0.792681 9.26609 1.13054 9.21558 1.51855L7.72632 15.5439H25.7742L27.2917 1.24023C27.3255 0.936656 27.4685 0.666822 27.7214 0.430664C27.9746 0.177499 28.2706 0.0507812 28.6082 0.0507812H31.4685C31.8566 0.0507849 32.1773 0.202255 32.4304 0.505859C32.7004 0.792695 32.81 1.13051 32.7595 1.51855L29.1648 35.418C29.131 35.7217 28.9872 35.9998 28.7341 36.2529C28.481 36.4892 28.1859 36.6074 27.8484 36.6074H24.9871C24.5822 36.6073 24.2528 36.4645 23.9998 36.1777C23.7467 35.874 23.6455 35.5277 23.696 35.1396L25.2371 20.6074H7.18921L5.61987 35.3926C5.60297 35.7131 5.46 35.9999 5.19019 36.2529C4.93702 36.4892 4.64953 36.6074 4.32886 36.6074H1.44312C1.05506 36.6074 0.725803 36.4645 0.455811 36.1777C0.202712 35.874 0.10156 35.5277 0.1521 35.1396L3.74683 1.26562C3.7806 0.945022 3.92439 0.666913 4.17749 0.430664C4.43063 0.177522 4.72572 0.0508046 5.06323 0.0507812H7.92456ZM81.2156 0.0507812C81.57 0.050791 81.8821 0.168994 82.1521 0.405273C82.4389 0.624614 82.6328 0.902832 82.7341 1.24023L92.4304 34.9111C92.5654 35.3837 92.5068 35.7894 92.2537 36.127C92.0005 36.4475 91.6458 36.6074 91.1902 36.6074H88.2283C87.9414 36.6074 87.6709 36.5148 87.4177 36.3291C87.1816 36.1266 87.0301 35.8986 86.9626 35.6455L84.6492 27.3418H69.4958L65.3171 35.8232C65.2159 36.0426 65.055 36.228 64.8357 36.3799C64.6163 36.5149 64.3799 36.582 64.1267 36.582H61.1394C60.6838 36.582 60.3376 36.3967 60.1013 36.0254C59.8651 35.6542 59.8652 35.2407 60.1013 34.7852L77.0632 1.0127C77.2151 0.708897 77.4185 0.472488 77.6716 0.303711C77.9416 0.135061 78.2453 0.0507812 78.5828 0.0507812H81.2156ZM111.368 0.0507812C111.773 0.050882 112.102 0.210697 112.355 0.53125C112.608 0.835009 112.692 1.18973 112.608 1.59473L107.368 31.3672H122.634C123.039 31.3672 123.359 31.511 123.595 31.7979C123.832 32.0847 123.916 32.4139 123.848 32.7852L123.368 35.418C123.334 35.7048 123.19 35.9498 122.937 36.1523C122.701 36.3548 122.439 36.4561 122.152 36.4561H102.405C102.017 36.456 101.696 36.3207 101.443 36.0508C101.207 35.7639 101.123 35.4177 101.19 35.0127L107.19 1.13965C107.241 0.869608 107.393 0.624683 107.646 0.405273C107.899 0.169049 108.177 0.0508458 108.481 0.0507812H111.368ZM136.81 23.0889C135.41 23.0889 134.254 23.384 133.343 23.9746C132.431 24.5653 131.883 25.4346 131.697 26.582L131.165 29.5947C130.979 30.6747 131.182 31.4938 131.772 32.0508C132.363 32.6077 133.283 32.8867 134.532 32.8867C136.085 32.8867 137.418 32.3295 138.532 31.2158C139.663 30.085 140.304 28.9115 140.456 27.6963L141.013 24.6328C140.676 24.1266 140.127 23.7473 139.368 23.4941C138.608 23.2241 137.755 23.0889 136.81 23.0889ZM162.052 13.8232C160.364 13.8232 158.853 14.3972 157.519 15.5449C156.186 16.6757 155.351 18.1946 155.013 20.1016L153.925 26.2793C153.604 28.085 153.857 29.5784 154.684 30.7598C155.511 31.9243 156.836 32.5068 158.659 32.5068C160.296 32.5068 161.782 31.9584 163.115 30.8613C164.465 29.7475 165.3 28.2115 165.621 26.2539L166.71 20.0762C167.047 18.1353 166.785 16.608 165.925 15.4941C165.064 14.3803 163.773 13.8233 162.052 13.8232ZM79.0134 8.02539L71.5916 23.0889H83.4636L79.2664 8.02539L79.1902 7.64551L79.0134 8.02539Z\";\n\n/**\n * size prop을 rem 값으로 변환\n */\nfunction getSizeInRem(size: LogoSize): string {\n if (typeof size === \"number\") {\n return `${size}rem`;\n }\n\n // 디자인 토큰 기반 크기 매핑\n const sizeMap: Record<\"sm\" | \"md\" | \"lg\", string> = {\n sm: defaultTokens.spacing.md, // 1rem (16px)\n md: defaultTokens.spacing.lg, // 1.5rem (24px)\n lg: defaultTokens.spacing.xl, // 2rem (32px)\n };\n\n return sizeMap[size];\n}\n\n/**\n * Logo 컴포넌트\n *\n * HUA Labs 공식 로고 컴포넌트\n *\n * @example\n * ```tsx\n * // 기본 (엠블럼만)\n * <Logo />\n *\n * // 워드마크 포함\n * <Logo variant=\"full\" />\n *\n * // 크기 조정\n * <Logo size=\"lg\" />\n * <Logo size={3} /> // 3rem\n *\n * // 애니메이션\n * <Logo animated />\n * ```\n */\nexport function Logo({\n variant = \"symbol\",\n size = \"md\",\n animated = false,\n className,\n ...props\n}: LogoProps) {\n const sizeInRem = getSizeInRem(size);\n\n // 애니메이션용 스타일 시트 주입 (한 번만)\n useEffect(() => {\n if (!animated) return;\n\n const styleId = \"hua-logo-animation\";\n if (document.getElementById(styleId)) return;\n\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = `\n @keyframes hua-logo-draw {\n from {\n stroke-dashoffset: 1000;\n }\n to {\n stroke-dashoffset: 0;\n }\n }\n @keyframes hua-logo-draw-wordmark {\n from {\n stroke-dashoffset: 2000;\n }\n to {\n stroke-dashoffset: 0;\n }\n }\n .hua-logo-path {\n stroke: currentColor;\n stroke-width: 0.5;\n fill: none;\n animation: hua-logo-draw 2s ease-in-out forwards;\n }\n .hua-logo-wordmark {\n stroke: currentColor;\n stroke-width: 0.5;\n fill: none;\n animation: hua-logo-draw-wordmark 2s ease-in-out 0.5s forwards;\n }\n `;\n document.head.appendChild(style);\n\n return () => {\n const existingStyle = document.getElementById(styleId);\n if (existingStyle) {\n existingStyle.remove();\n }\n };\n }, [animated]);\n\n // Symbol only (엠블럼만)\n if (variant === \"symbol\") {\n return (\n <svg\n width={sizeInRem}\n height={sizeInRem}\n viewBox=\"0 0 40 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={merge(\"text-foreground\", className)}\n >\n <path\n d={EMBLEM_PATH}\n fill={animated ? \"none\" : \"currentColor\"}\n stroke={animated ? \"currentColor\" : \"none\"}\n strokeWidth={animated ? \"0.5\" : undefined}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={animated ? \"hua-logo-path\" : undefined}\n />\n </svg>\n );\n }\n\n // Full variant (엠블럼 + 워드마크 flex 배치)\n // 워드마크 원본: 152x37, 비율 152/37 ≈ 4.1\n const wordmarkRatio = 152 / 37;\n\n return (\n <div\n className={merge(\"inline-flex items-center gap-1 flex-shrink-0 min-w-max\", className)}\n {...(props as React.HTMLAttributes<HTMLDivElement>)}\n >\n {/* 엠블럼 */}\n <svg\n viewBox=\"0 0 40 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"flex-shrink-0\"\n style={{ width: sizeInRem, height: sizeInRem }}\n >\n <path\n d={EMBLEM_PATH}\n fill={animated ? \"none\" : \"currentColor\"}\n stroke={animated ? \"currentColor\" : \"none\"}\n strokeWidth={animated ? \"0.5\" : undefined}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={animated ? \"hua-logo-path\" : undefined}\n />\n </svg>\n {/* 워드마크 */}\n <svg\n viewBox=\"40 0 152 37\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"flex-shrink-0\"\n style={{ \n height: sizeInRem,\n width: `calc(${sizeInRem} * ${wordmarkRatio})`,\n }}\n >\n <path\n d={WORDMARK_PATH}\n fill={animated ? \"none\" : \"currentColor\"}\n stroke={animated ? \"currentColor\" : \"none\"}\n strokeWidth={animated ? \"0.5\" : undefined}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={animated ? \"hua-logo-wordmark\" : undefined}\n />\n </svg>\n </div>\n );\n}\n","\"use client\"\n\nimport React, { useState, useEffect } from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Bookmark 컴포넌트의 props / Bookmark component props\n * @typedef {Object} BookmarkProps\n * @property {string} id - 북마크 고유 ID / Bookmark unique ID\n * @property {string} [storageKey='bookmarks'] - localStorage 키 / localStorage key\n * @property {boolean} [defaultBookmarked=false] - 기본 북마크 상태 / Default bookmarked state\n * @property {(bookmarked: boolean) => void} [onBookmarkChange] - 북마크 상태 변경 콜백 / Bookmark state change callback\n * @property {'sm' | 'md' | 'lg'} [size='md'] - Bookmark 크기 / Bookmark size\n * @property {'default' | 'filled' | 'outline'} [variant='default'] - Bookmark 스타일 변형 / Bookmark style variant\n * @extends {React.HTMLAttributes<HTMLButtonElement>}\n */\nexport interface BookmarkProps extends React.HTMLAttributes<HTMLButtonElement> {\n id: string\n storageKey?: string\n defaultBookmarked?: boolean\n onBookmarkChange?: (bookmarked: boolean) => void\n size?: 'sm' | 'md' | 'lg'\n variant?: 'default' | 'filled' | 'outline'\n}\n\n/**\n * Bookmark 컴포넌트 / Bookmark component\n * \n * 북마크 기능을 제공하는 버튼 컴포넌트입니다.\n * localStorage에 북마크 상태를 저장하며, 여러 항목의 북마크를 관리할 수 있습니다.\n * \n * Button component that provides bookmark functionality.\n * Saves bookmark state to localStorage and can manage bookmarks for multiple items.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Bookmark id=\"article-1\" />\n * \n * @example\n * // 상태 변경 감지 / State change detection\n * <Bookmark \n * id=\"article-1\"\n * onBookmarkChange={(bookmarked) => console.log(bookmarked)}\n * variant=\"filled\"\n * />\n * \n * @param {BookmarkProps} props - Bookmark 컴포넌트의 props / Bookmark component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} Bookmark 컴포넌트 / Bookmark component\n */\nconst Bookmark = React.forwardRef<HTMLButtonElement, BookmarkProps>(\n ({ \n className, \n id, \n storageKey = 'bookmarks',\n defaultBookmarked = false,\n onBookmarkChange,\n size = 'md',\n variant = 'default',\n ...props \n }, ref) => {\n const [isBookmarked, setIsBookmarked] = useState(defaultBookmarked)\n\n // 로컬 스토리지에서 북마크 상태 불러오기\n useEffect(() => {\n const savedBookmarks = localStorage.getItem(storageKey)\n if (savedBookmarks) {\n const bookmarks = JSON.parse(savedBookmarks)\n setIsBookmarked(bookmarks.includes(id))\n }\n }, [id, storageKey])\n\n // 북마크 토글\n const toggleBookmark = () => {\n const newBookmarked = !isBookmarked\n setIsBookmarked(newBookmarked)\n \n // 로컬 스토리지 업데이트\n const savedBookmarks = localStorage.getItem(storageKey)\n const bookmarks = savedBookmarks ? JSON.parse(savedBookmarks) : []\n \n if (newBookmarked) {\n if (!bookmarks.includes(id)) {\n bookmarks.push(id)\n }\n } else {\n const index = bookmarks.indexOf(id)\n if (index > -1) {\n bookmarks.splice(index, 1)\n }\n }\n \n localStorage.setItem(storageKey, JSON.stringify(bookmarks))\n onBookmarkChange?.(newBookmarked)\n }\n\n const sizeClasses = {\n sm: \"w-6 h-6\",\n md: \"w-8 h-8\", \n lg: \"w-10 h-10\"\n }\n\n const variantClasses = {\n default: \"text-muted-foreground hover:text-yellow-500 transition-colors\",\n filled: \"text-yellow-500 hover:text-yellow-600 transition-colors\",\n outline: \"border border-border text-muted-foreground hover:text-yellow-500 hover:border-yellow-500 transition-colors rounded\"\n }\n\n return (\n <button\n ref={ref}\n onClick={toggleBookmark}\n className={merge(\n \"flex items-center justify-center transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-yellow-500 focus-visible:ring-offset-2\",\n sizeClasses[size],\n variantClasses[variant],\n className\n )}\n {...props}\n >\n <Icon \n name=\"star\" \n className={merge(\n \"transition-all duration-200\",\n isBookmarked && \"fill-current\"\n )}\n />\n </button>\n )\n }\n)\n\nBookmark.displayName = \"Bookmark\"\n\nexport { Bookmark } ","'use client'\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Avatar, AvatarImage, AvatarFallback } from \"./Avatar\"\nimport { Badge } from \"./Badge\"\nimport { Card, CardContent } from \"./Card\"\n\n/**\n * ChatMessage 컴포넌트의 props / ChatMessage component props\n * @typedef {Object} ChatMessageProps\n * @property {Object} message - 메시지 데이터 / Message data\n * @property {string} message.id - 메시지 ID / Message ID\n * @property {string} message.content - 메시지 내용 / Message content\n * @property {\"user\" | \"assistant\" | \"system\"} message.role - 메시지 역할 / Message role\n * @property {Date} message.timestamp - 메시지 타임스탬프 / Message timestamp\n * @property {string} [message.emotion] - 감정 정보 / Emotion information\n * @property {number} [message.intensity] - 감정 강도 / Emotion intensity\n * @property {boolean} [message.isTyping] - 타이핑 중 여부 / Typing state\n * @property {Object} [user] - 사용자 정보 / User information\n * @property {string} [user.name=\"사용자\"] - 사용자 이름 / User name\n * @property {string} [user.avatar] - 사용자 아바타 URL / User avatar URL\n * @property {string} [user.color=\"#3b82f6\"] - 사용자 색상 / User color\n * @property {Object} [assistant] - AI 어시스턴트 정보 / AI assistant information\n * @property {string} [assistant.name=\"AI\"] - AI 이름 / AI name\n * @property {string} [assistant.avatar] - AI 아바타 URL / AI avatar URL\n * @property {string} [assistant.color=\"#10b981\"] - AI 색상 / AI color\n * @property {boolean} [showAvatar=true] - 아바타 표시 여부 / Show avatar\n * @property {boolean} [showTimestamp=true] - 타임스탬프 표시 여부 / Show timestamp\n * @property {boolean} [showEmotion=true] - 감정 표시 여부 / Show emotion\n * @property {\"default\" | \"compact\" | \"bubble\"} [variant=\"default\"] - ChatMessage 스타일 변형 / ChatMessage style variant\n * @property {Object} [theme] - 커스텀 테마 / Custom theme\n * @property {string} [theme.userBubbleBg] - 사용자 버블 배경색 / User bubble background color\n * @property {string} [theme.userBubbleText] - 사용자 버블 텍스트 색상 / User bubble text color\n * @property {string} [theme.aiBubbleBg] - AI 버블 배경색 / AI bubble background color\n * @property {string} [theme.aiBubbleText] - AI 버블 텍스트 색상 / AI bubble text color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface ChatMessageProps extends React.HTMLAttributes<HTMLDivElement> {\n message: {\n id: string\n content: string\n role: \"user\" | \"assistant\" | \"system\"\n timestamp: Date\n emotion?: string\n intensity?: number\n isTyping?: boolean\n }\n user?: {\n name?: string\n avatar?: string\n color?: string\n }\n assistant?: {\n name?: string\n avatar?: string\n color?: string\n }\n showAvatar?: boolean\n showTimestamp?: boolean\n showEmotion?: boolean\n variant?: \"default\" | \"compact\" | \"bubble\"\n theme?: {\n userBubbleBg?: string\n userBubbleText?: string\n aiBubbleBg?: string\n aiBubbleText?: string\n }\n}\n\n/**\n * ChatMessage 컴포넌트\n * \n * 채팅 메시지를 표시하는 컴포넌트입니다.\n * 사용자, AI 어시스턴트, 시스템 메시지를 지원하며, 감정 정보를 표시할 수 있습니다.\n * \n * @component\n * @example\n * // 기본 사용\n * <ChatMessage\n * message={{\n * id: \"1\",\n * content: \"안녕하세요!\",\n * role: \"user\",\n * timestamp: new Date()\n * }}\n * />\n * \n * @example\n * // AI 메시지, 감정 정보 포함\n * <ChatMessage\n * message={{\n * id: \"2\",\n * content: \"안녕하세요! 도와드릴까요?\",\n * role: \"assistant\",\n * timestamp: new Date(),\n * emotion: \"joy\",\n * intensity: 0.8\n * }}\n * variant=\"bubble\"\n * />\n * \n * @param {ChatMessageProps} props - ChatMessage 컴포넌트의 props / ChatMessage component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ChatMessage 컴포넌트 / ChatMessage component\n */\nconst ChatMessage = React.forwardRef<HTMLDivElement, ChatMessageProps>(\n ({ \n className, \n message,\n user = { name: \"사용자\", color: \"#3b82f6\" },\n assistant = { name: \"AI\", color: \"#10b981\" },\n showAvatar = true,\n showTimestamp = true,\n showEmotion = true,\n variant = \"default\",\n theme = {\n userBubbleBg: \"#3b82f6\",\n userBubbleText: \"#ffffff\",\n aiBubbleBg: \"#f3f4f6\",\n aiBubbleText: \"#1f2937\"\n },\n ...props \n }, ref) => {\n const isUser = message.role === \"user\"\n const _isAssistant = message.role === \"assistant\"\n const _isSystem = message.role === \"system\"\n\n const getEmotionColor = (emotion?: string) => {\n if (!emotion) return \"bg-gray-100\"\n \n const emotionColors = {\n joy: \"bg-yellow-100 text-yellow-800\",\n sadness: \"bg-indigo-100 text-cyan-800\",\n anger: \"bg-red-100 text-red-800\",\n calm: \"bg-green-100 text-green-800\",\n excitement: \"bg-pink-100 text-pink-800\",\n worry: \"bg-gray-100 text-gray-800\",\n gratitude: \"bg-purple-100 text-purple-800\",\n loneliness: \"bg-indigo-100 text-indigo-800\"\n }\n \n return emotionColors[emotion as keyof typeof emotionColors] || \"bg-gray-100 text-gray-800\"\n }\n\n const formatTime = (date: Date) => {\n return date.toLocaleTimeString('ko-KR', { \n hour: '2-digit', \n minute: '2-digit' \n })\n }\n\n if (variant === \"bubble\") {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex w-full\",\n isUser ? \"justify-end\" : \"justify-start\",\n className\n )}\n {...props}\n >\n <div className={merge(\n \"flex max-w-[80%] space-x-2\",\n isUser ? \"flex-row-reverse space-x-reverse\" : \"flex-row\"\n )}>\n {showAvatar && (\n <Avatar className=\"w-8 h-8 flex-shrink-0\">\n <AvatarImage\n src={isUser ? user.avatar : assistant.avatar}\n alt={isUser ? user.name : assistant.name}\n />\n <AvatarFallback\n style={{\n backgroundColor: isUser ? user.color : assistant.color\n }}\n >\n {(isUser ? user.name : assistant.name)?.charAt(0)}\n </AvatarFallback>\n </Avatar>\n )}\n \n <div className=\"space-y-1\">\n <div\n className={merge(\n \"px-4 py-2 rounded-2xl max-w-full break-words\",\n isUser \n ? \"rounded-br-md\" \n : \"rounded-bl-md\"\n )}\n style={{\n backgroundColor: isUser ? theme.userBubbleBg : theme.aiBubbleBg,\n color: isUser ? theme.userBubbleText : theme.aiBubbleText\n }}\n >\n {message.isTyping ? (\n <div className=\"flex space-x-1\">\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-100\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-200\" />\n </div>\n ) : (\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\n )}\n </div>\n \n <div className={merge(\n \"flex items-center space-x-2 text-xs text-muted-foreground\",\n isUser ? \"justify-end\" : \"justify-start\"\n )}>\n {showTimestamp && (\n <span>{formatTime(message.timestamp)}</span>\n )}\n {showEmotion && message.emotion && (\n <Badge \n variant=\"secondary\" \n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\n >\n {message.emotion}\n </Badge>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n }\n\n if (variant === \"compact\") {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-start space-x-3 py-2\",\n className\n )}\n {...props}\n >\n {showAvatar && (\n <Avatar className=\"w-6 h-6 flex-shrink-0\">\n <AvatarImage\n src={isUser ? user.avatar : assistant.avatar}\n alt={isUser ? user.name : assistant.name}\n />\n <AvatarFallback\n style={{\n backgroundColor: isUser ? user.color : assistant.color\n }}\n >\n {(isUser ? user.name : assistant.name)?.charAt(0)}\n </AvatarFallback>\n </Avatar>\n )}\n \n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center space-x-2 mb-1\">\n <span className=\"text-sm font-medium\">\n {isUser ? user.name : assistant.name}\n </span>\n {showTimestamp && (\n <span className=\"text-xs text-muted-foreground\">\n {formatTime(message.timestamp)}\n </span>\n )}\n {showEmotion && message.emotion && (\n <Badge \n variant=\"secondary\" \n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\n >\n {message.emotion}\n </Badge>\n )}\n </div>\n \n <div className=\"text-sm\">\n {message.isTyping ? (\n <div className=\"flex space-x-1\">\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce\" />\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce delay-100\" />\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce delay-200\" />\n </div>\n ) : (\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\n )}\n </div>\n </div>\n </div>\n )\n }\n\n // default variant\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-start space-x-3 py-4\",\n className\n )}\n {...props}\n >\n {showAvatar && (\n <Avatar className=\"w-10 h-10 flex-shrink-0\">\n <AvatarImage\n src={isUser ? user.avatar : assistant.avatar}\n alt={isUser ? user.name : assistant.name}\n />\n <AvatarFallback\n style={{\n backgroundColor: isUser ? user.color : assistant.color\n }}\n >\n {(isUser ? user.name : assistant.name)?.charAt(0)}\n </AvatarFallback>\n </Avatar>\n )}\n \n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center space-x-2 mb-2\">\n <span className=\"font-medium\">\n {isUser ? user.name : assistant.name}\n </span>\n {showTimestamp && (\n <span className=\"text-sm text-muted-foreground\">\n {formatTime(message.timestamp)}\n </span>\n )}\n {showEmotion && message.emotion && (\n <Badge \n variant=\"secondary\" \n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\n >\n {message.emotion}\n </Badge>\n )}\n </div>\n \n <Card className={merge(\n \"inline-block\",\n isUser ? \"bg-primary text-primary-foreground\" : \"bg-muted\"\n )}>\n <CardContent className=\"p-3\">\n {message.isTyping ? (\n <div className=\"flex space-x-1\">\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-100\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-200\" />\n </div>\n ) : (\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n )\n }\n)\n\nChatMessage.displayName = \"ChatMessage\"\n\nexport { ChatMessage } ","\"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-gray-200 rounded-full dark:bg-gray-700\",\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 } ","'use client'\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"./Card\"\nimport { Badge } from \"./Badge\"\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 } ","\"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-gray-200 bg-white dark:border-gray-700 dark:bg-gray-800\",\n className\n )}\n {...props}\n >\n {emotion}\n </button>\n )\n }\n)\nEmotionButton.displayName = \"EmotionButton\"\n\nexport { EmotionButton } ","'use client'\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { EmotionButton } from \"./EmotionButton\"\nimport { EmotionMeter } from \"./EmotionMeter\"\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 } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * LanguageToggle 컴포넌트의 props / LanguageToggle component props\n * @typedef {Object} LanguageToggleProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Toggle 크기 / Toggle size\n * @property {\"button\" | \"icon\" | \"dropdown\"} [variant=\"button\"] - Toggle 스타일 변형 / Toggle style variant\n * @property {boolean} [showLabel=false] - 라벨 표시 여부 / Show label\n * @property {Array<Object>} [languages] - 언어 목록 / Language list\n * @property {string} languages[].code - 언어 코드 / Language code\n * @property {string} languages[].name - 언어 이름 / Language name\n * @property {string} [languages[].flag] - 언어 플래그 이모지 / Language flag emoji\n * @property {string} [currentLanguage=\"ko\"] - 현재 선택된 언어 코드 / Currently selected language code\n * @property {(language: string) => void} [onLanguageChange] - 언어 변경 콜백 / Language change callback\n */\nexport interface LanguageToggleProps {\n className?: string\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"button\" | \"icon\" | \"dropdown\"\n showLabel?: boolean\n languages?: Array<{\n code: string\n name: string\n flag?: string\n }>\n currentLanguage?: string\n onLanguageChange?: (language: string) => void\n}\n\n/**\n * LanguageToggle 컴포넌트 / LanguageToggle component\n * \n * 언어를 전환하는 토글 컴포넌트입니다.\n * 여러 언어를 지원하며, 버튼, 아이콘, 드롭다운 형태로 표시할 수 있습니다.\n * \n * Toggle component for switching languages.\n * Supports multiple languages and can be displayed as button, icon, or dropdown.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <LanguageToggle />\n * \n * @example\n * // 드롭다운 형태 / Dropdown variant\n * <LanguageToggle \n * variant=\"dropdown\"\n * currentLanguage=\"en\"\n * onLanguageChange={(lang) => console.log(lang)}\n * />\n * \n * @param {LanguageToggleProps} props - LanguageToggle 컴포넌트의 props / LanguageToggle component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} LanguageToggle 컴포넌트 / LanguageToggle component\n */\nconst LanguageToggle = React.forwardRef<HTMLDivElement, LanguageToggleProps>(\n ({ \n className,\n size = \"md\",\n variant = \"button\",\n showLabel = false,\n languages = [\n { code: \"ko\", name: \"한국어\", flag: \"🇰🇷\" },\n { code: \"en\", name: \"English\", flag: \"🇺🇸\" },\n { code: \"ja\", name: \"日本語\", flag: \"🇯🇵\" },\n { code: \"zh\", name: \"中文\", flag: \"🇨🇳\" }\n ],\n currentLanguage = \"ko\",\n onLanguageChange,\n ...props\n }, _ref) => {\n const [isOpen, setIsOpen] = React.useState(false)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n\n const currentLang = languages.find(lang => lang.code === currentLanguage) || languages[0]\n\n const sizeClasses = {\n sm: \"h-10 w-10\", // 40px - 더 넉넉한 크기\n md: \"h-12 w-12\", // 48px - 더 넉넉한 크기\n lg: \"h-14 w-14\" // 56px - 더 넉넉한 크기\n }\n\n const _iconSizes = {\n sm: 16,\n md: 20,\n lg: 24\n }\n\n // 외부 클릭 시 드롭다운 닫기\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside)\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [isOpen])\n\n const handleLanguageChange = (languageCode: string) => {\n onLanguageChange?.(languageCode)\n setIsOpen(false)\n }\n\n const renderIcon = () => (\n <div className=\"flex items-center justify-center\">\n <span className=\"text-lg\">{currentLang.flag}</span>\n </div>\n )\n\n if (variant === \"icon\") {\n return (\n <div ref={dropdownRef} className=\"relative\">\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={merge(\n \"inline-flex items-center justify-center rounded-lg transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n {renderIcon()}\n </button>\n\n {isOpen && (\n <div className=\"absolute top-full right-0 mt-2 w-48 bg-background rounded-lg shadow-lg border border-border py-2 z-50\">\n {languages.map((language) => (\n <button\n key={language.code}\n onClick={() => handleLanguageChange(language.code)}\n className={merge(\n \"w-full px-4 py-3 text-left hover:bg-muted transition-colors duration-200 flex items-center gap-3\", // 16px, 12px 패딩, 12px 간격\n currentLanguage === language.code && \"bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 dark:text-indigo-400\"\n )}\n >\n <span className=\"text-lg\">{language.flag}</span>\n <span className=\"text-sm font-medium\">{language.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n\n if (variant === \"dropdown\") {\n return (\n <div ref={dropdownRef} className=\"relative\">\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={merge(\n \"inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\", // 12px 간격, 16px, 12px 패딩\n className\n )}\n {...props}\n >\n <span className=\"text-lg\">{currentLang.flag}</span>\n {showLabel && <span className=\"text-foreground\">{currentLang.name}</span>}\n <svg\n className={merge(\n \"w-4 h-4 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {isOpen && (\n <div className=\"absolute top-full right-0 mt-2 w-48 bg-background rounded-lg shadow-lg border border-border py-2 z-50\">\n {languages.map((language) => (\n <button\n key={language.code}\n onClick={() => handleLanguageChange(language.code)}\n className={merge(\n \"w-full px-4 py-3 text-left hover:bg-muted transition-colors duration-200 flex items-center gap-3\", // 16px, 12px 패딩, 12px 간격\n currentLanguage === language.code && \"bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 dark:text-indigo-400\"\n )}\n >\n <span className=\"text-lg\">{language.flag}</span>\n <span className=\"text-sm font-medium\">{language.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n\n // 기본 버튼 형태\n return (\n <button\n onClick={() => {\n const currentIndex = languages.findIndex(lang => lang.code === currentLanguage)\n const nextIndex = (currentIndex + 1) % languages.length\n onLanguageChange?.(languages[nextIndex].code)\n }}\n className={merge(\n \"inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\", // 12px 간격, 16px, 12px 패딩\n className\n )}\n {...props}\n >\n <span className=\"text-lg\">{currentLang.flag}</span>\n {showLabel && <span className=\"text-foreground\">{currentLang.name}</span>}\n </button>\n )\n }\n)\nLanguageToggle.displayName = \"LanguageToggle\"\n\nexport { LanguageToggle } ","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { Button } from './Button'\nimport { Icon } from './Icon'\nimport { merge } from '../lib/utils'\nimport type { IconName } from '../lib/icons'\n\n/**\n * ScrollIndicator 컴포넌트의 props / ScrollIndicator component props\n * @typedef {Object} ScrollIndicatorProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {string} [targetId] - 스크롤 대상 요소 ID / Target element ID to scroll to\n * @property {string} [text='Scroll down'] - 표시 텍스트 / Display text\n * @property {IconName} [iconName='arrowDown'] - 아이콘 이름 / Icon name\n * @property {number} [iconSize=20] - 아이콘 크기 / Icon size\n * @property {'bottom-center' | 'bottom-left' | 'bottom-right'} [position='bottom-center'] - 표시 위치 / Display position\n * @property {'default' | 'primary' | 'secondary' | 'outline'} [variant='default'] - ScrollIndicator 스타일 변형 / ScrollIndicator style variant\n * @property {'sm' | 'md' | 'lg'} [size='md'] - ScrollIndicator 크기 / ScrollIndicator size\n * @property {boolean} [animated=true] - 애니메이션 활성화 여부 / Enable animation\n * @property {boolean} [autoHide=true] - 자동 숨김 여부 / Auto hide\n * @property {number} [hideThreshold=100] - 숨김 임계값 (px) / Hide threshold (px)\n */\nexport interface ScrollIndicatorProps {\n className?: string\n targetId?: string\n text?: string\n iconName?: IconName\n iconSize?: number\n position?: 'bottom-center' | 'bottom-left' | 'bottom-right'\n variant?: 'default' | 'primary' | 'secondary' | 'outline'\n size?: 'sm' | 'md' | 'lg'\n animated?: boolean\n autoHide?: boolean\n hideThreshold?: number\n}\n\n/**\n * ScrollIndicator 컴포넌트 / ScrollIndicator component\n * \n * 스크롤 가능함을 나타내는 인디케이터 컴포넌트입니다.\n * 클릭 시 지정된 요소로 스크롤하거나 다음 섹션으로 스크롤합니다.\n * \n * Indicator component that shows scrollability.\n * Scrolls to specified element or next section on click.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ScrollIndicator />\n * \n * @example\n * // 특정 요소로 스크롤 / Scroll to specific element\n * <ScrollIndicator \n * targetId=\"section-2\"\n * text=\"다음 섹션으로\"\n * position=\"bottom-right\"\n * />\n * \n * @param {ScrollIndicatorProps} props - ScrollIndicator 컴포넌트의 props / ScrollIndicator component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ScrollIndicator 컴포넌트 / ScrollIndicator component\n */\nconst ScrollIndicator = React.forwardRef<HTMLDivElement, ScrollIndicatorProps>(({\n className,\n targetId,\n text = 'Scroll down',\n iconName = 'arrowDown',\n iconSize = 20,\n position = 'bottom-center',\n variant = 'default',\n size = 'md',\n animated = true,\n autoHide = true,\n hideThreshold = 100,\n ...props\n}, ref) => {\n const [isVisible, setIsVisible] = useState(true)\n\n useEffect(() => {\n if (!autoHide) return\n\n const handleScroll = () => {\n const scrollTop = window.scrollY\n setIsVisible(scrollTop < hideThreshold)\n }\n\n // 초기 실행\n handleScroll()\n\n window.addEventListener('scroll', handleScroll, { passive: true })\n return () => window.removeEventListener('scroll', handleScroll)\n }, [autoHide, hideThreshold])\n\n const scrollToTarget = () => {\n if (targetId) {\n const targetElement = document.getElementById(targetId)\n if (targetElement) {\n targetElement.scrollIntoView({ behavior: 'smooth' })\n }\n } else {\n // 기본적으로 다음 섹션으로 스크롤\n const currentSection = ref as React.RefObject<HTMLDivElement>\n if (currentSection.current) {\n const nextSection = currentSection.current.nextElementSibling\n if (nextSection) {\n nextSection.scrollIntoView({ behavior: 'smooth' })\n }\n }\n }\n }\n\n const positionClasses = {\n 'bottom-center': 'bottom-8 left-1/2 transform -translate-x-1/2',\n 'bottom-left': 'bottom-8 left-8',\n 'bottom-right': 'bottom-8 right-8'\n }\n\n const sizeClasses = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg'\n }\n\n const variantClasses = {\n default: 'text-muted-foreground hover:text-foreground',\n primary: 'text-primary hover:text-primary/80',\n secondary: 'text-secondary-foreground hover:text-secondary-foreground/80',\n outline: 'text-foreground hover:text-foreground'\n }\n\n if (!isVisible) return null\n\n return (\n <div\n ref={ref}\n className={merge(\n 'absolute z-10',\n positionClasses[position],\n className\n )}\n {...props}\n >\n <Button\n onClick={scrollToTarget}\n variant=\"ghost\"\n size=\"sm\"\n className={merge(\n 'flex flex-col items-center space-y-2 transition-all duration-300',\n sizeClasses[size],\n variantClasses[variant],\n animated && 'animate-in fade-in-0 slide-in-from-bottom-2 duration-500'\n )}\n aria-label={text}\n >\n <span className=\"text-xs opacity-80\">{text}</span>\n <Icon\n name={iconName}\n size={iconSize}\n className={merge(\n animated && 'animate-bounce'\n )}\n />\n </Button>\n </div>\n )\n})\n\nScrollIndicator.displayName = 'ScrollIndicator'\n\nexport { ScrollIndicator } ","import React from \"react\"\nimport { merge } from \"../../lib/utils\"\n\nexport interface ScrollbarProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n variant?: \"default\" | \"glass\" | \"colorful\" | \"minimal\" | \"neon\"\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n orientation?: \"vertical\" | \"horizontal\" | \"both\"\n autoHide?: boolean\n smooth?: boolean\n}\n\nconst Scrollbar = React.forwardRef<HTMLDivElement, ScrollbarProps>(\n ({ \n className, \n variant = \"default\", \n size = \"md\", \n orientation = \"both\", \n autoHide = true, \n smooth = true, \n children, \n ...props \n }, ref) => {\n \n const getVariantClasses = () => {\n switch (variant) {\n case \"glass\":\n return \"scrollbar-thumb-white/20 hover:scrollbar-thumb-white/30 backdrop-blur-sm\"\n case \"colorful\":\n return \"scrollbar-thumb-gradient-to-b scrollbar-thumb-from-indigo-500 scrollbar-thumb-to-purple-500 hover:scrollbar-thumb-from-cyan-600 hover:scrollbar-thumb-to-purple-600\"\n case \"minimal\":\n return \"scrollbar-thumb-slate-200/50 hover:scrollbar-thumb-slate-300/70 dark:scrollbar-thumb-slate-700/50 dark:hover:scrollbar-thumb-slate-600/70\"\n case \"neon\":\n return \"scrollbar-thumb-cyan-400/60 hover:scrollbar-thumb-cyan-300/80 scrollbar-thumb-shadow-lg scrollbar-thumb-shadow-cyan-500/25\"\n default:\n return \"scrollbar-thumb-slate-300 hover:scrollbar-thumb-slate-400 dark:scrollbar-thumb-slate-600 dark:hover:scrollbar-thumb-slate-500\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"scrollbar-w-1\"\n case \"lg\":\n return \"scrollbar-w-3\"\n case \"xl\":\n return \"scrollbar-w-4\"\n default:\n return \"scrollbar-w-2\"\n }\n }\n\n const getOrientationClasses = () => {\n switch (orientation) {\n case \"vertical\":\n return \"overflow-y-auto overflow-x-hidden\"\n case \"horizontal\":\n return \"overflow-x-auto overflow-y-hidden\"\n default:\n return \"overflow-auto\"\n }\n }\n\n const baseClasses = merge(\n \"scrollbar-thin scrollbar-track-transparent scrollbar-thumb-rounded-full transition-all duration-200\",\n getVariantClasses(),\n getSizeClasses(),\n getOrientationClasses(),\n autoHide && \"scrollbar-hide\",\n smooth && \"scroll-smooth\",\n className\n )\n\n return (\n <div\n className={baseClasses}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nScrollbar.displayName = \"Scrollbar\"\n\nexport { Scrollbar } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * InfoCard 컴포넌트의 props / InfoCard component props\n * @typedef {Object} InfoCardProps\n * @property {string} title - 카드 제목 / Card title\n * @property {IconName} icon - 카드 아이콘 / Card icon\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\"} [tone=\"blue\"] - InfoCard 톤 색상 / InfoCard tone color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface InfoCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string\n icon: IconName\n tone?: \"blue\" | \"purple\" | \"green\" | \"orange\"\n}\n\nconst toneClasses: Record<NonNullable<InfoCardProps[\"tone\"]>, { container: string; icon: string; title: string; body: string }> = {\n blue: {\n container: \"bg-gradient-to-r from-indigo-50 to-indigo-50 dark:from-indigo-900/20 dark:to-indigo-900/20 rounded-lg p-4 border border-indigo-200 dark:border-indigo-700\",\n icon: \"h-5 w-5 text-indigo-600 dark:text-indigo-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-indigo-900 dark:text-indigo-100 mb-2 block\",\n body: \"text-foreground text-sm leading-relaxed\",\n },\n purple: {\n container: \"bg-gradient-to-r from-purple-50 to-pink-50 dark:from-purple-900/20 dark:to-pink-900/20 rounded-lg p-4 border border-purple-200 dark:border-purple-700\",\n icon: \"h-5 w-5 text-purple-600 dark:text-purple-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-purple-900 dark:text-purple-100 mb-2 block\",\n body: \"text-foreground text-sm leading-relaxed\",\n },\n green: {\n container: \"bg-gradient-to-r from-green-50 to-emerald-50 dark:from-green-900/20 dark:to-emerald-900/20 rounded-lg p-4 border border-green-200 dark:border-green-700\",\n icon: \"h-5 w-5 text-green-600 dark:text-green-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-green-900 dark:text-green-100 mb-2 block\",\n body: \"text-foreground text-sm leading-relaxed\",\n },\n orange: {\n container: \"bg-gradient-to-r from-orange-50 to-rose-50 dark:from-orange-900/20 dark:to-rose-900/20 rounded-lg p-4 border border-orange-200 dark:border-orange-700\",\n icon: \"h-5 w-5 text-orange-600 dark:text-orange-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-orange-900 dark:text-orange-100 mb-2 block\",\n body: \"text-foreground text-sm leading-relaxed\",\n },\n}\n\n/**\n * InfoCard 컴포넌트 / InfoCard component\n * \n * 정보를 표시하는 카드 컴포넌트입니다.\n * 아이콘, 제목, 내용을 포함하며, 다양한 톤 색상을 지원합니다.\n * \n * Card component that displays information.\n * Includes icon, title, and content, supports various tone colors.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <InfoCard\n * icon=\"info\"\n * title=\"정보\"\n * tone=\"blue\"\n * >\n * 이것은 정보 카드입니다.\n * </InfoCard>\n * \n * @example\n * // 다양한 톤 / Various tones\n * <InfoCard icon=\"check\" title=\"성공\" tone=\"green\">\n * 작업이 완료되었습니다.\n * </InfoCard>\n * \n * @param {InfoCardProps} props - InfoCard 컴포넌트의 props / InfoCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} InfoCard 컴포넌트 / InfoCard component\n */\nexport const InfoCard = React.forwardRef<HTMLDivElement, InfoCardProps>(({ className, title, icon, tone = \"blue\", children, ...props }, ref) => {\n const t = toneClasses[tone]\n return (\n <div ref={ref} className={merge(t.container, className)} {...props}>\n <div className=\"flex items-start mb-2\">\n <Icon name={icon} className={t.icon} />\n <div className=\"flex-1\">\n <span className={t.title}>{title}</span>\n <div className={t.body}>{children}</div>\n </div>\n </div>\n </div>\n )\n})\n\nInfoCard.displayName = \"InfoCard\"\n\nexport default InfoCard\n\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { Icon } from \"./Icon\";\nimport type { IconName } from \"../lib/icons\";\n\n/**\n * 타임라인 아이템 상태 타입 / Timeline item status type\n * @typedef {\"pending\" | \"active\" | \"completed\" | \"error\" | \"warning\" | \"info\"} TimelineStatus\n */\nexport type TimelineStatus = \"pending\" | \"active\" | \"completed\" | \"error\" | \"warning\" | \"info\";\n\n/**\n * 타임라인 아이템 인터페이스 / TimelineItem interface\n * @typedef {Object} TimelineItem\n * @property {string} id - 아이템 고유 ID / Item unique ID\n * @property {string} title - 제목 / Title\n * @property {string} [description] - 설명 / Description\n * @property {TimelineStatus} [status=\"pending\"] - 상태 / Status\n * @property {string | Date} [date] - 날짜 / Date\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {string} [meta] - 메타 정보 / Meta information\n * @property {React.ReactNode} [content] - 추가 컨텐츠 / Additional content\n */\nexport interface TimelineItem {\n id: string;\n title: string;\n description?: string;\n status?: TimelineStatus;\n date?: string | Date;\n icon?: IconName | React.ReactNode;\n meta?: string;\n content?: React.ReactNode;\n}\n\n/**\n * Timeline 컴포넌트의 props / Timeline component props\n * @typedef {Object} TimelineProps\n * @property {TimelineItem[]} items - 타임라인 아이템 배열 / Timeline items array\n * @property {\"vertical\" | \"horizontal\"} [orientation=\"vertical\"] - 방향 / Orientation\n * @property {\"left\" | \"right\" | \"alternate\"} [align=\"left\"] - 정렬 / Alignment\n * @property {string} [highlightedId] - 강조할 아이템 ID / Highlighted item ID\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @property {boolean} [showConnector=true] - 연결선 표시 / Show connector\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TimelineProps extends React.HTMLAttributes<HTMLDivElement> {\n items: TimelineItem[];\n orientation?: \"vertical\" | \"horizontal\";\n align?: \"left\" | \"right\" | \"alternate\";\n highlightedId?: string;\n locale?: string;\n emptyState?: React.ReactNode;\n showConnector?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst STATUS_CONFIG: Record<\n TimelineStatus,\n { dot: string; border: string; text: string; label: string; labelEn: string }\n> = {\n completed: {\n dot: \"bg-emerald-500 border-emerald-500 shadow-[0_0_8px_rgba(16,185,129,0.4)]\",\n border: \"border-emerald-200 dark:border-emerald-500/40\",\n text: \"text-emerald-700 dark:text-emerald-300 bg-emerald-50 dark:bg-emerald-500/10\",\n label: \"완료\",\n labelEn: \"Completed\",\n },\n active: {\n dot: \"bg-sky-500 border-sky-500 shadow-[0_0_8px_rgba(14,165,233,0.4)] animate-pulse\",\n border: \"border-sky-200 dark:border-sky-500/40\",\n text: \"text-sky-700 dark:text-sky-200 bg-sky-50 dark:bg-sky-500/10\",\n label: \"진행 중\",\n labelEn: \"Active\",\n },\n pending: {\n dot: \"bg-muted-foreground/40 border-muted-foreground/40\",\n border: \"border-border\",\n text: \"text-muted-foreground bg-muted\",\n label: \"대기\",\n labelEn: \"Pending\",\n },\n error: {\n dot: \"bg-rose-500 border-rose-500 shadow-[0_0_8px_rgba(244,63,94,0.4)]\",\n border: \"border-rose-200 dark:border-rose-500/40\",\n text: \"text-rose-700 dark:text-rose-300 bg-rose-50 dark:bg-rose-500/10\",\n label: \"오류\",\n labelEn: \"Error\",\n },\n warning: {\n dot: \"bg-amber-500 border-amber-500 shadow-[0_0_8px_rgba(245,158,11,0.4)]\",\n border: \"border-amber-200 dark:border-amber-500/40\",\n text: \"text-amber-700 dark:text-amber-300 bg-amber-50 dark:bg-amber-500/10\",\n label: \"경고\",\n labelEn: \"Warning\",\n },\n info: {\n dot: \"bg-violet-500 border-violet-500 shadow-[0_0_8px_rgba(139,92,246,0.4)]\",\n border: \"border-violet-200 dark:border-violet-500/40\",\n text: \"text-violet-700 dark:text-violet-300 bg-violet-50 dark:bg-violet-500/10\",\n label: \"정보\",\n labelEn: \"Info\",\n },\n};\n\nconst SIZE_CONFIG = {\n sm: { dot: \"h-2.5 w-2.5\", gap: \"gap-3\", padding: \"p-3\", text: \"text-xs\" },\n md: { dot: \"h-3.5 w-3.5\", gap: \"gap-4\", padding: \"p-4\", text: \"text-sm\" },\n lg: { dot: \"h-4 w-4\", gap: \"gap-5\", padding: \"p-5\", text: \"text-base\" },\n};\n\nconst formatDate = (value?: string | Date, locale = \"ko-KR\") => {\n if (!value) return undefined;\n const parsed = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(parsed.getTime())) return undefined;\n return parsed.toLocaleString(locale, { dateStyle: \"medium\", timeStyle: \"short\" });\n};\n\n/**\n * Timeline 컴포넌트\n *\n * 이벤트나 단계를 시간순으로 표시하는 범용 타임라인 컴포넌트입니다.\n * 활동 로그, 진행 단계, 히스토리 등 다양한 용도로 사용할 수 있습니다.\n *\n * Generic timeline component that displays events or steps chronologically.\n * Can be used for activity logs, progress steps, history, and more.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Timeline\n * items={[\n * { id: \"1\", title: \"작업 시작\", status: \"completed\", date: new Date() },\n * { id: \"2\", title: \"검토 중\", status: \"active\" },\n * { id: \"3\", title: \"완료 예정\", status: \"pending\" }\n * ]}\n * />\n *\n * @example\n * // 아이콘과 커스텀 컨텐츠 / With icons and custom content\n * <Timeline\n * items={[\n * {\n * id: \"1\",\n * title: \"커밋 생성\",\n * description: \"feature/timeline 브랜치에 커밋\",\n * icon: \"git-commit\",\n * status: \"completed\",\n * content: <CodeBlock code=\"git commit -m 'Add timeline'\" />\n * }\n * ]}\n * size=\"lg\"\n * />\n *\n * @example\n * // 교차 정렬 / Alternate alignment\n * <Timeline items={items} align=\"alternate\" />\n *\n * @param {TimelineProps} props - Timeline 컴포넌트의 props / Timeline component props\n * @returns {JSX.Element} Timeline 컴포넌트 / Timeline component\n */\nexport const Timeline: React.FC<TimelineProps> = ({\n items,\n orientation = \"vertical\",\n align = \"left\",\n highlightedId,\n locale = \"ko-KR\",\n emptyState,\n showConnector = true,\n size = \"md\",\n className,\n ...props\n}) => {\n const hasItems = items.length > 0;\n const sizeConfig = SIZE_CONFIG[size];\n\n if (!hasItems) {\n return (\n <div className={merge(\"\", className)} {...props}>\n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\n <Icon name=\"clock\" className=\"h-10 w-10 text-muted-foreground/50 mb-3\" />\n <p className=\"text-sm font-medium text-muted-foreground\">타임라인이 비어 있습니다</p>\n <p className=\"text-xs text-muted-foreground mt-1\">이벤트가 추가되면 여기에 표시됩니다.</p>\n </div>\n )}\n </div>\n );\n }\n\n // Horizontal layout\n if (orientation === \"horizontal\") {\n return (\n <div className={merge(\"overflow-x-auto\", className)} {...props}>\n <ol className=\"flex min-w-max\" role=\"list\" aria-label=\"타임라인\">\n {items.map((item, index) => {\n const status = item.status ?? \"pending\";\n const statusConfig = STATUS_CONFIG[status];\n const date = formatDate(item.date, locale);\n const isHighlighted = highlightedId === item.id;\n const showLine = showConnector && index !== items.length - 1;\n\n return (\n <li key={item.id} className=\"flex items-start\" role=\"listitem\">\n <div className=\"flex flex-col items-center\">\n {/* Dot */}\n <span\n className={merge(\n \"rounded-full border-2 shrink-0\",\n sizeConfig.dot,\n statusConfig.dot,\n isHighlighted && \"scale-125 ring-1 ring-offset-2 ring-border\"\n )}\n aria-label={statusConfig.label}\n />\n {/* Content below dot */}\n <div className={merge(\"mt-3 text-center max-w-[160px]\", sizeConfig.text)}>\n <p className=\"font-semibold text-foreground truncate\">{item.title}</p>\n {item.description && (\n <p className=\"text-muted-foreground mt-0.5 line-clamp-2\">{item.description}</p>\n )}\n {date && (\n <time className=\"text-xs text-muted-foreground mt-1 block\" dateTime={item.date instanceof Date ? item.date.toISOString() : item.date}>\n {date}\n </time>\n )}\n </div>\n </div>\n {/* Connector */}\n {showLine && (\n <span className=\"h-0.5 w-16 bg-border mt-[0.4375rem] mx-2\" aria-hidden=\"true\" />\n )}\n </li>\n );\n })}\n </ol>\n </div>\n );\n }\n\n // Vertical layout\n return (\n <div className={merge(\"\", className)} {...props}>\n <ol className=\"space-y-4\" role=\"list\" aria-label=\"타임라인\">\n {items.map((item, index) => {\n const status = item.status ?? \"pending\";\n const statusConfig = STATUS_CONFIG[status];\n const date = formatDate(item.date, locale);\n const isHighlighted = highlightedId === item.id;\n const showLine = showConnector && index !== items.length - 1;\n const isAlternateRight = align === \"alternate\" && index % 2 === 1;\n const isRight = align === \"right\" || isAlternateRight;\n\n const renderIcon = () => {\n if (!item.icon) return null;\n if (typeof item.icon === \"string\") {\n return <Icon name={item.icon as IconName} className=\"h-4 w-4\" />;\n }\n return item.icon;\n };\n\n const itemContent = (\n <div\n className={merge(\n \"flex-1 rounded-xl border transition-all\",\n sizeConfig.padding,\n statusConfig.border,\n isHighlighted && \"border-2 shadow-md ring-1 ring-border\"\n )}\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n {renderIcon() && (\n <span className=\"text-muted-foreground\">{renderIcon()}</span>\n )}\n <span className={merge(\"font-semibold text-foreground\", sizeConfig.text)}>\n {item.title}\n </span>\n <span className={merge(\"text-xs font-medium rounded-full px-2 py-0.5\", statusConfig.text)}>\n {statusConfig.label}\n </span>\n {item.meta && (\n <span className=\"text-xs text-muted-foreground\">{item.meta}</span>\n )}\n </div>\n\n {item.description && (\n <p className={merge(\"mt-1 text-muted-foreground\", sizeConfig.text)}>\n {item.description}\n </p>\n )}\n\n {item.content && <div className=\"mt-3\">{item.content}</div>}\n\n {date && (\n <div className=\"mt-3 flex items-center gap-1 text-xs text-muted-foreground\">\n <Icon name=\"clock\" className=\"h-3 w-3\" aria-hidden={true} />\n <time dateTime={item.date instanceof Date ? item.date.toISOString() : item.date}>\n {date}\n </time>\n </div>\n )}\n </div>\n );\n\n return (\n <li\n key={item.id}\n role=\"listitem\"\n className={merge(\n \"relative flex\",\n sizeConfig.gap,\n isRight && \"flex-row-reverse\"\n )}\n >\n {/* Dot and Connector */}\n <div className=\"flex flex-col items-center\">\n <span\n className={merge(\n \"z-10 rounded-full border-2 shrink-0\",\n sizeConfig.dot,\n statusConfig.dot,\n isHighlighted && \"scale-110\"\n )}\n aria-label={statusConfig.label}\n />\n {showLine && (\n <span className=\"mt-1 flex-1 w-px bg-border\" aria-hidden=\"true\" />\n )}\n </div>\n\n {/* Content */}\n {itemContent}\n </li>\n );\n })}\n </ol>\n </div>\n );\n};\n\nTimeline.displayName = \"Timeline\";\n"]}
|