@hua-labs/ui 2.0.2 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -161
- package/dist/{ComponentLayout-btJq4TjA.d.mts → ComponentLayout-DrZpz0yv.d.mts} +1 -1
- package/dist/Section-BWzyshgX.d.mts +67 -0
- package/dist/advanced/dashboard.d.ts.map +1 -1
- package/dist/advanced-dashboard.d.mts +1 -1
- package/dist/advanced-dashboard.js +4 -4
- package/dist/advanced-dashboard.js.map +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 +65 -1
- package/dist/advanced-motion.js +14 -14
- package/dist/advanced-motion.js.map +1 -1
- package/dist/advanced-motion.mjs +1 -1
- package/dist/advanced.d.mts +4 -4
- package/dist/advanced.js +16 -16
- package/dist/advanced.js.map +1 -1
- package/dist/advanced.mjs +3 -3
- package/dist/advanced.mjs.map +1 -1
- package/dist/chunk-3CCF7U3P.mjs +3 -0
- package/dist/{chunk-IFSEJVOR.mjs.map → chunk-3CCF7U3P.mjs.map} +1 -1
- package/dist/chunk-3GAUTZXQ.mjs +3 -0
- package/dist/{chunk-X7ZIWYRC.mjs.map → chunk-3GAUTZXQ.mjs.map} +1 -1
- package/dist/chunk-42RGFEL2.mjs +3 -0
- package/dist/chunk-42RGFEL2.mjs.map +1 -0
- package/dist/chunk-4NJE7D6X.mjs +3 -0
- package/dist/chunk-4NJE7D6X.mjs.map +1 -0
- package/dist/chunk-6HVJFEDA.mjs +3 -0
- package/dist/{chunk-FSL373O6.mjs.map → chunk-6HVJFEDA.mjs.map} +1 -1
- package/dist/chunk-7OYT3QSY.mjs +3 -0
- package/dist/chunk-7OYT3QSY.mjs.map +1 -0
- package/dist/chunk-ANYZ56VB.mjs +3 -0
- package/dist/{chunk-QQCELXFD.mjs.map → chunk-ANYZ56VB.mjs.map} +1 -1
- package/dist/chunk-AOSXB5JJ.mjs +4 -0
- package/dist/{chunk-GLZKT7JN.mjs.map → chunk-AOSXB5JJ.mjs.map} +1 -1
- package/dist/chunk-B544MRF7.mjs +3 -0
- package/dist/{chunk-SDFHJ4GB.mjs.map → chunk-B544MRF7.mjs.map} +1 -1
- package/dist/chunk-CVWWS25A.mjs +3 -0
- package/dist/chunk-CVWWS25A.mjs.map +1 -0
- package/dist/chunk-DYNBM24D.mjs +3 -0
- package/dist/{chunk-OSCMSA2Q.mjs.map → chunk-DYNBM24D.mjs.map} +1 -1
- package/dist/{chunk-NBJUE7NR.mjs → chunk-FX57OSYG.mjs} +2 -2
- package/dist/{chunk-NBJUE7NR.mjs.map → chunk-FX57OSYG.mjs.map} +1 -1
- package/dist/chunk-IJSYSNM5.mjs +3 -0
- package/dist/{chunk-IN7RWQCJ.mjs.map → chunk-IJSYSNM5.mjs.map} +1 -1
- package/dist/chunk-KJZGOL2Z.mjs +3 -0
- package/dist/{chunk-LOYAJIWO.mjs.map → chunk-KJZGOL2Z.mjs.map} +1 -1
- package/dist/chunk-KYRIUUQP.mjs +3 -0
- package/dist/{chunk-PAEKNQWW.mjs.map → chunk-KYRIUUQP.mjs.map} +1 -1
- package/dist/chunk-LSA7DU3N.mjs +73 -0
- package/dist/chunk-LSA7DU3N.mjs.map +1 -0
- package/dist/chunk-MDLCJASB.mjs +3 -0
- package/dist/{chunk-LH77I6HO.mjs.map → chunk-MDLCJASB.mjs.map} +1 -1
- package/dist/chunk-N56BUOCD.mjs +3 -0
- package/dist/{chunk-XV3Y7QVU.mjs.map → chunk-N56BUOCD.mjs.map} +1 -1
- package/dist/chunk-OFYITQXI.mjs +13 -0
- package/dist/chunk-OFYITQXI.mjs.map +1 -0
- package/dist/chunk-OZNST3EZ.mjs +3 -0
- package/dist/{chunk-SGEP3CQE.mjs.map → chunk-OZNST3EZ.mjs.map} +1 -1
- package/dist/chunk-RS6RKW5U.mjs +13 -0
- package/dist/{chunk-6KTHJ3EL.mjs.map → chunk-RS6RKW5U.mjs.map} +1 -1
- package/dist/{chunk-C4OACMTB.mjs → chunk-TXBZZJNR.mjs} +2 -2
- package/dist/{chunk-C4OACMTB.mjs.map → chunk-TXBZZJNR.mjs.map} +1 -1
- package/dist/chunk-TZ4YSHMC.mjs +3 -0
- package/dist/{chunk-UWHCM3S6.mjs.map → chunk-TZ4YSHMC.mjs.map} +1 -1
- package/dist/chunk-U6CTBZ2U.mjs +3 -0
- package/dist/chunk-U6CTBZ2U.mjs.map +1 -0
- package/dist/{chunk-5BMH7223.mjs → chunk-WP7VFE77.mjs} +2 -2
- package/dist/{chunk-5BMH7223.mjs.map → chunk-WP7VFE77.mjs.map} +1 -1
- package/dist/{chunk-FFH4ZFKS.mjs → chunk-XCZMLKPK.mjs} +2 -2
- package/dist/{chunk-FFH4ZFKS.mjs.map → chunk-XCZMLKPK.mjs.map} +1 -1
- package/dist/chunk-XGHT7WMO.mjs +3 -0
- package/dist/chunk-XGHT7WMO.mjs.map +1 -0
- package/dist/chunk-XL4KTJ4L.mjs +3 -0
- package/dist/{chunk-VWSBJUNI.mjs.map → chunk-XL4KTJ4L.mjs.map} +1 -1
- package/dist/chunk-Z74YUUVT.mjs +3 -0
- package/dist/chunk-Z74YUUVT.mjs.map +1 -0
- package/dist/chunk-ZXZIHU7J.mjs +8 -0
- package/dist/{chunk-N7M6RIN4.mjs.map → chunk-ZXZIHU7J.mjs.map} +1 -1
- package/dist/components/DatePicker.d.ts.map +1 -1
- package/dist/components/Modal.d.ts.map +1 -1
- package/dist/components/Popover.d.ts +2 -0
- package/dist/components/Popover.d.ts.map +1 -1
- package/dist/components/Progress.d.ts +1 -0
- package/dist/components/Progress.d.ts.map +1 -1
- package/dist/components/Section.d.ts +44 -0
- package/dist/components/Section.d.ts.map +1 -0
- package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
- package/dist/components/advanced/DotNav.d.ts +26 -0
- package/dist/components/advanced/DotNav.d.ts.map +1 -0
- package/dist/components/advanced/HorizontalScroll.d.ts +20 -0
- package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -0
- package/dist/components/advanced/ImageReveal.d.ts +24 -0
- package/dist/components/advanced/ImageReveal.d.ts.map +1 -0
- package/dist/components/advanced/index.d.ts +6 -0
- package/dist/components/advanced/index.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.js +3 -3
- package/dist/form.js.map +1 -1
- package/dist/form.mjs +4 -4
- package/dist/form.mjs.map +1 -1
- package/dist/{icons-Bj_nr8Ba.d.mts → icons-DmhQEH_E.d.mts} +6 -1
- package/dist/index.d.mts +9 -27
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/interactive.js +1 -1
- package/dist/interactive.js.map +1 -1
- package/dist/interactive.mjs +1 -1
- package/dist/interactive.mjs.map +1 -1
- package/dist/landing/LandingAbout.d.ts +3 -0
- package/dist/landing/LandingAbout.d.ts.map +1 -0
- package/dist/landing/LandingCTA.d.ts +3 -0
- package/dist/landing/LandingCTA.d.ts.map +1 -0
- package/dist/landing/LandingContact.d.ts +3 -0
- package/dist/landing/LandingContact.d.ts.map +1 -0
- package/dist/landing/LandingExperience.d.ts +3 -0
- package/dist/landing/LandingExperience.d.ts.map +1 -0
- package/dist/landing/LandingFeatures.d.ts +3 -0
- package/dist/landing/LandingFeatures.d.ts.map +1 -0
- package/dist/landing/LandingHero.d.ts +3 -0
- package/dist/landing/LandingHero.d.ts.map +1 -0
- package/dist/landing/LandingLogoCloud.d.ts +3 -0
- package/dist/landing/LandingLogoCloud.d.ts.map +1 -0
- package/dist/landing/LandingMetrics.d.ts +3 -0
- package/dist/landing/LandingMetrics.d.ts.map +1 -0
- package/dist/landing/LandingProjects.d.ts +3 -0
- package/dist/landing/LandingProjects.d.ts.map +1 -0
- package/dist/landing/LandingProvider.d.ts +4 -0
- package/dist/landing/LandingProvider.d.ts.map +1 -0
- package/dist/landing/LandingShowcase.d.ts +3 -0
- package/dist/landing/LandingShowcase.d.ts.map +1 -0
- package/dist/landing/LandingSkills.d.ts +3 -0
- package/dist/landing/LandingSkills.d.ts.map +1 -0
- package/dist/landing/LandingStats.d.ts +3 -0
- package/dist/landing/LandingStats.d.ts.map +1 -0
- package/dist/landing/LandingTestimonials.d.ts +3 -0
- package/dist/landing/LandingTestimonials.d.ts.map +1 -0
- package/dist/landing/index.d.ts +47 -0
- package/dist/landing/index.d.ts.map +1 -0
- package/dist/landing/themes/app.d.ts +3 -0
- package/dist/landing/themes/app.d.ts.map +1 -0
- package/dist/landing/themes/corporate.d.ts +3 -0
- package/dist/landing/themes/corporate.d.ts.map +1 -0
- package/dist/landing/themes/dashboard.d.ts +3 -0
- package/dist/landing/themes/dashboard.d.ts.map +1 -0
- package/dist/landing/themes/immersive.d.ts +3 -0
- package/dist/landing/themes/immersive.d.ts.map +1 -0
- package/dist/landing/themes/index.d.ts +15 -0
- package/dist/landing/themes/index.d.ts.map +1 -0
- package/dist/landing/themes/marketing.d.ts +3 -0
- package/dist/landing/themes/marketing.d.ts.map +1 -0
- package/dist/landing/themes/portfolio.d.ts +3 -0
- package/dist/landing/themes/portfolio.d.ts.map +1 -0
- package/dist/landing/themes/product.d.ts +3 -0
- package/dist/landing/themes/product.d.ts.map +1 -0
- package/dist/landing/types.d.ts +346 -0
- package/dist/landing/types.d.ts.map +1 -0
- package/dist/landing.d.mts +417 -0
- package/dist/landing.js +100 -0
- package/dist/landing.js.map +1 -0
- package/dist/landing.mjs +31 -0
- package/dist/landing.mjs.map +1 -0
- package/dist/lib/icons.d.ts +6 -1
- package/dist/lib/icons.d.ts.map +1 -1
- package/dist/navigation.d.mts +1 -1
- package/dist/navigation.js +2 -2
- package/dist/navigation.js.map +1 -1
- package/dist/navigation.mjs +1 -1
- package/dist/navigation.mjs.map +1 -1
- package/dist/overlay.d.mts +2 -0
- package/dist/overlay.js +1 -1
- package/dist/overlay.js.map +1 -1
- package/dist/overlay.mjs +1 -1
- package/dist/overlay.mjs.map +1 -1
- package/dist/sdui.js +4 -4
- package/dist/sdui.js.map +1 -1
- package/dist/sdui.mjs +1 -1
- package/dist/sdui.mjs.map +1 -1
- package/package.json +18 -7
- package/src/styles/landing.css +107 -0
- package/src/styles/utilities.css +58 -0
- package/dist/chunk-6KTHJ3EL.mjs +0 -13
- package/dist/chunk-COR6CDMA.mjs +0 -83
- package/dist/chunk-COR6CDMA.mjs.map +0 -1
- package/dist/chunk-FSL373O6.mjs +0 -3
- package/dist/chunk-GLZKT7JN.mjs +0 -4
- package/dist/chunk-HN5LSP6L.mjs +0 -3
- package/dist/chunk-HN5LSP6L.mjs.map +0 -1
- package/dist/chunk-IFSEJVOR.mjs +0 -3
- package/dist/chunk-IN7RWQCJ.mjs +0 -3
- package/dist/chunk-LH77I6HO.mjs +0 -3
- package/dist/chunk-LOYAJIWO.mjs +0 -3
- package/dist/chunk-LPAG7DCA.mjs +0 -3
- package/dist/chunk-LPAG7DCA.mjs.map +0 -1
- package/dist/chunk-N7M6RIN4.mjs +0 -8
- package/dist/chunk-OSCMSA2Q.mjs +0 -3
- package/dist/chunk-PAEKNQWW.mjs +0 -3
- package/dist/chunk-QQCELXFD.mjs +0 -3
- package/dist/chunk-RPUS7G7Q.mjs +0 -3
- package/dist/chunk-RPUS7G7Q.mjs.map +0 -1
- package/dist/chunk-SDFHJ4GB.mjs +0 -3
- package/dist/chunk-SGEP3CQE.mjs +0 -3
- package/dist/chunk-UUHAXGMO.mjs +0 -3
- package/dist/chunk-UUHAXGMO.mjs.map +0 -1
- package/dist/chunk-UWHCM3S6.mjs +0 -3
- package/dist/chunk-VWSBJUNI.mjs +0 -3
- package/dist/chunk-X7ZIWYRC.mjs +0 -3
- package/dist/chunk-XV3Y7QVU.mjs +0 -3
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {b as b$1}from'./chunk-U6CTBZ2U.mjs';import r from'react';import {cva}from'class-variance-authority';import {jsx}from'react/jsx-runtime';var d=cva("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2",{variants:{variant:{default:"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80",secondary:"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80",destructive:"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80",error:"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80",outline:"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]",glass:"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80"}},defaultVariants:{variant:"default"}}),b=r.memo(r.forwardRef(({className:t,variant:a="default",...o},i)=>jsx("div",{ref:i,className:b$1(d({variant:a}),t),...o})));b.displayName="Badge";export{b as a};//# sourceMappingURL=chunk-3CCF7U3P.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-3CCF7U3P.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Badge.tsx"],"names":["badgeVariants","cva","Badge","React","className","variant","props","ref","jsx","merge"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/components/Badge.tsx"],"names":["badgeVariants","cva","Badge","React","className","variant","props","ref","jsx","merge"],"mappings":"oJAMaA,CAAAA,CAAgBC,GAAAA,CAC3B,iOAAA,CACA,CACE,SAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,iFACT,SAAA,CAAW,oFAAA,CACX,WAAA,CAAa,iEAAA,CACb,MAAO,iEAAA,CACP,OAAA,CAAS,sIAAA,CACT,KAAA,CAAO,uIACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,QAAS,SACX,CACF,CACF,CAAA,CAmBMC,EAAQC,CAAAA,CAAM,IAAA,CAAKA,CAAAA,CAAM,UAAA,CAC7B,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,OAAA,CAAAC,EAAU,SAAA,CAAW,GAAGC,CAAM,CAAA,CAAGC,IAE3CC,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKD,CAAAA,CACL,UAAWE,GAAAA,CAAMT,CAAAA,CAAc,CAAE,OAAA,CAAAK,CAAQ,CAAC,CAAA,CAAGD,CAAS,CAAA,CACrD,GAAGE,CAAAA,CACN,CAGN,CAAC,EACDJ,EAAM,WAAA,CAAc,OAAA","file":"chunk-3CCF7U3P.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80\",\n secondary: \"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80\",\n destructive: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n error: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n outline: \"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]\",\n glass: \"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n *\n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge }\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {b}from'./chunk-U6CTBZ2U.mjs';import e from'react';import {jsxs,jsx}from'react/jsx-runtime';var c=e.forwardRef(({className:r,content:o,children:a,position:d="top",variant:h="default",delay:y=300,disabled:T=false,...v},w)=>{let[x,f]=e.useState(false),[p,k]=e.useState({x:0,y:0}),l=e.useRef(void 0),g=e.useRef(null),R=E=>{var b;if(T)return;let t=E.currentTarget.getBoundingClientRect();(b=g.current)==null?void 0:b.getBoundingClientRect();let s=0,n=0;switch(d){case "top":s=t.left+t.width/2,n=t.top-8;break;case "bottom":s=t.left+t.width/2,n=t.bottom+8;break;case "left":s=t.left-8,n=t.top+t.height/2;break;case "right":s=t.right+8,n=t.top+t.height/2;break}k({x:s,y:n}),l.current=window.setTimeout(()=>{f(true);},y);},L=()=>{l.current&&clearTimeout(l.current),f(false);};e.useEffect(()=>()=>{l.current&&clearTimeout(l.current);},[]);let M=()=>{switch(h){case "light":return "bg-popover text-popover-foreground border border-border shadow-lg";case "dark":return "bg-gray-900 text-white shadow-lg";default:return "bg-gray-800 text-white shadow-lg"}},N=()=>{switch(d){case "top":return "top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800";case "bottom":return "bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800";case "left":return "left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800";case "right":return "right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800";default:return "top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800"}};return jsxs("div",{ref:w,className:b("relative inline-block",r),onMouseEnter:R,onMouseLeave:L,...v,children:[a,x&&jsxs("div",{ref:g,className:b("fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none",M()),style:{left:`${p.x}px`,top:`${p.y}px`,transform:"translate(-50%, -50%)"},children:[o,jsx("div",{className:b("absolute w-0 h-0 border-4 border-transparent",N())})]})]})});c.displayName="Tooltip";var D=e.forwardRef(({className:r,...o},a)=>jsx(c,{ref:a,variant:"light",className:r,...o}));D.displayName="TooltipLight";var C=e.forwardRef(({className:r,...o},a)=>jsx(c,{ref:a,variant:"dark",className:r,...o}));C.displayName="TooltipDark";export{c as a,D as b,C as c};//# sourceMappingURL=chunk-3GAUTZXQ.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-3GAUTZXQ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Tooltip.tsx"],"names":["Tooltip","React","className","content","children","position","variant","delay","disabled","props","ref","isVisible","setIsVisible","coords","setCoords","timeoutRef","tooltipRef","showTooltip","e","_a","rect","x","y","hideTooltip","getVariantClasses","getArrowClasses","jsxs","merge","jsx","TooltipLight","TooltipDark"],"mappings":"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","file":"chunk-X7ZIWYRC.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Tooltip 컴포넌트의 props / Tooltip component props\n * @typedef {Object} TooltipProps\n * @property {string} content - Tooltip 내용 / Tooltip content\n * @property {React.ReactNode} children - Tooltip이 연결될 요소 / Element to attach tooltip to\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [position=\"top\"] - Tooltip 표시 위치 / Tooltip display position\n * @property {\"default\" | \"light\" | \"dark\"} [variant=\"default\"] - Tooltip 스타일 변형 / Tooltip style variant\n * @property {number} [delay=300] - Tooltip 표시 지연 시간(ms) / Tooltip display delay (ms)\n * @property {boolean} [disabled=false] - Tooltip 비활성화 여부 / Disable tooltip\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\n content: string\n children: React.ReactNode\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\n variant?: \"default\" | \"light\" | \"dark\"\n delay?: number\n disabled?: boolean\n}\n\n/**\n * Tooltip 컴포넌트 / Tooltip component\n * \n * 호버 시 추가 정보를 표시하는 툴팁 컴포넌트입니다.\n * 마우스 호버 시 지연 시간 후 표시됩니다.\n * \n * Tooltip component that displays additional information on hover.\n * Appears after a delay when the mouse hovers over the element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Tooltip content=\"이것은 도움말입니다\">\n * <Button>호버하세요</Button>\n * </Tooltip>\n * \n * @example\n * // 다양한 위치 / Different positions\n * <Tooltip content=\"위치 변경\" position=\"bottom\">\n * <Icon name=\"info\" />\n * </Tooltip>\n * \n * @example\n * // 커스텀 스타일 / Custom styles\n * <Tooltip content=\"라이트 스타일\" variant=\"light\" delay={500}>\n * <span>호버</span>\n * </Tooltip>\n * \n * @param {TooltipProps} props - Tooltip 컴포넌트의 props / Tooltip component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Tooltip 컴포넌트 / Tooltip component\n * \n * @todo 접근성 개선: role=\"tooltip\" 추가 필요 / Accessibility: Add role=\"tooltip\"\n * @todo 접근성 개선: aria-describedby 연결 필요 / Accessibility: Connect aria-describedby\n * @todo 접근성 개선: 키보드 포커스 시 Tooltip 표시 필요 / Accessibility: Show tooltip on keyboard focus\n */\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n ({ \n className, \n content,\n children,\n position = \"top\",\n variant = \"default\",\n delay = 300,\n disabled = false,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const timeoutRef = React.useRef<number | undefined>(undefined)\n const tooltipRef = React.useRef<HTMLDivElement>(null)\n\n const showTooltip = (e: React.MouseEvent) => {\n if (disabled) return\n \n const rect = e.currentTarget.getBoundingClientRect()\n const _tooltipRect = tooltipRef.current?.getBoundingClientRect()\n \n let x = 0\n let y = 0\n \n switch (position) {\n case \"top\":\n x = rect.left + rect.width / 2\n y = rect.top - 8 // 8px 간격\n break\n case \"bottom\":\n x = rect.left + rect.width / 2\n y = rect.bottom + 8 // 8px 간격\n break\n case \"left\":\n x = rect.left - 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n case \"right\":\n x = rect.right + 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n }\n \n setCoords({ x, y })\n \n timeoutRef.current = window.setTimeout(() => {\n setIsVisible(true)\n }, delay)\n }\n\n const hideTooltip = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n setIsVisible(false)\n }\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n const getVariantClasses = () => {\n switch (variant) {\n case \"light\":\n return \"bg-popover text-popover-foreground border border-border shadow-lg\"\n case \"dark\":\n return \"bg-gray-900 text-white shadow-lg\"\n default:\n return \"bg-gray-800 text-white shadow-lg\"\n }\n }\n\n const _getPositionClasses = () => {\n switch (position) {\n case \"top\":\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-1/2 -translate-x-1/2 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-1/2 -translate-y-1/2 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-1/2 -translate-y-1/2 ml-2\" // 8px 간격\n default:\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (position) {\n case \"top\":\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800\"\n default:\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"relative inline-block\", className)}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n {...props}\n >\n {children}\n \n {isVisible && (\n <div\n ref={tooltipRef}\n className={merge(\n \"fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none\", // 12px, 8px 패딩\n getVariantClasses()\n )}\n style={{\n left: `${coords.x}px`,\n top: `${coords.y}px`,\n transform: 'translate(-50%, -50%)'\n }}\n >\n {content}\n {/* 화살표 */}\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n </div>\n )}\n </div>\n )\n }\n)\nTooltip.displayName = \"Tooltip\"\n\n// 편의 컴포넌트들\nexport const TooltipLight = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"light\" className={className} {...props} />\n )\n)\nTooltipLight.displayName = \"TooltipLight\"\n\nexport const TooltipDark = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"dark\" className={className} {...props} />\n )\n)\nTooltipDark.displayName = \"TooltipDark\"\n\nexport { Tooltip } "]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Tooltip.tsx"],"names":["Tooltip","React","className","content","children","position","variant","delay","disabled","props","ref","isVisible","setIsVisible","coords","setCoords","timeoutRef","tooltipRef","showTooltip","e","_a","rect","x","y","hideTooltip","getVariantClasses","getArrowClasses","jsxs","merge","jsx","TooltipLight","TooltipDark"],"mappings":"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","file":"chunk-3GAUTZXQ.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Tooltip 컴포넌트의 props / Tooltip component props\n * @typedef {Object} TooltipProps\n * @property {string} content - Tooltip 내용 / Tooltip content\n * @property {React.ReactNode} children - Tooltip이 연결될 요소 / Element to attach tooltip to\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [position=\"top\"] - Tooltip 표시 위치 / Tooltip display position\n * @property {\"default\" | \"light\" | \"dark\"} [variant=\"default\"] - Tooltip 스타일 변형 / Tooltip style variant\n * @property {number} [delay=300] - Tooltip 표시 지연 시간(ms) / Tooltip display delay (ms)\n * @property {boolean} [disabled=false] - Tooltip 비활성화 여부 / Disable tooltip\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\n content: string\n children: React.ReactNode\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\n variant?: \"default\" | \"light\" | \"dark\"\n delay?: number\n disabled?: boolean\n}\n\n/**\n * Tooltip 컴포넌트 / Tooltip component\n * \n * 호버 시 추가 정보를 표시하는 툴팁 컴포넌트입니다.\n * 마우스 호버 시 지연 시간 후 표시됩니다.\n * \n * Tooltip component that displays additional information on hover.\n * Appears after a delay when the mouse hovers over the element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Tooltip content=\"이것은 도움말입니다\">\n * <Button>호버하세요</Button>\n * </Tooltip>\n * \n * @example\n * // 다양한 위치 / Different positions\n * <Tooltip content=\"위치 변경\" position=\"bottom\">\n * <Icon name=\"info\" />\n * </Tooltip>\n * \n * @example\n * // 커스텀 스타일 / Custom styles\n * <Tooltip content=\"라이트 스타일\" variant=\"light\" delay={500}>\n * <span>호버</span>\n * </Tooltip>\n * \n * @param {TooltipProps} props - Tooltip 컴포넌트의 props / Tooltip component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Tooltip 컴포넌트 / Tooltip component\n * \n * @todo 접근성 개선: role=\"tooltip\" 추가 필요 / Accessibility: Add role=\"tooltip\"\n * @todo 접근성 개선: aria-describedby 연결 필요 / Accessibility: Connect aria-describedby\n * @todo 접근성 개선: 키보드 포커스 시 Tooltip 표시 필요 / Accessibility: Show tooltip on keyboard focus\n */\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n ({ \n className, \n content,\n children,\n position = \"top\",\n variant = \"default\",\n delay = 300,\n disabled = false,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const timeoutRef = React.useRef<number | undefined>(undefined)\n const tooltipRef = React.useRef<HTMLDivElement>(null)\n\n const showTooltip = (e: React.MouseEvent) => {\n if (disabled) return\n \n const rect = e.currentTarget.getBoundingClientRect()\n const _tooltipRect = tooltipRef.current?.getBoundingClientRect()\n \n let x = 0\n let y = 0\n \n switch (position) {\n case \"top\":\n x = rect.left + rect.width / 2\n y = rect.top - 8 // 8px 간격\n break\n case \"bottom\":\n x = rect.left + rect.width / 2\n y = rect.bottom + 8 // 8px 간격\n break\n case \"left\":\n x = rect.left - 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n case \"right\":\n x = rect.right + 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n }\n \n setCoords({ x, y })\n \n timeoutRef.current = window.setTimeout(() => {\n setIsVisible(true)\n }, delay)\n }\n\n const hideTooltip = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n setIsVisible(false)\n }\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n const getVariantClasses = () => {\n switch (variant) {\n case \"light\":\n return \"bg-popover text-popover-foreground border border-border shadow-lg\"\n case \"dark\":\n return \"bg-gray-900 text-white shadow-lg\"\n default:\n return \"bg-gray-800 text-white shadow-lg\"\n }\n }\n\n const _getPositionClasses = () => {\n switch (position) {\n case \"top\":\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-1/2 -translate-x-1/2 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-1/2 -translate-y-1/2 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-1/2 -translate-y-1/2 ml-2\" // 8px 간격\n default:\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (position) {\n case \"top\":\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800\"\n default:\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"relative inline-block\", className)}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n {...props}\n >\n {children}\n \n {isVisible && (\n <div\n ref={tooltipRef}\n className={merge(\n \"fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none\", // 12px, 8px 패딩\n getVariantClasses()\n )}\n style={{\n left: `${coords.x}px`,\n top: `${coords.y}px`,\n transform: 'translate(-50%, -50%)'\n }}\n >\n {content}\n {/* 화살표 */}\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n </div>\n )}\n </div>\n )\n }\n)\nTooltip.displayName = \"Tooltip\"\n\n// 편의 컴포넌트들\nexport const TooltipLight = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"light\" className={className} {...props} />\n )\n)\nTooltipLight.displayName = \"TooltipLight\"\n\nexport const TooltipDark = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"dark\" className={className} {...props} />\n )\n)\nTooltipDark.displayName = \"TooltipDark\"\n\nexport { Tooltip } "]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {b}from'./chunk-U6CTBZ2U.mjs';import t from'react';import {cva}from'class-variance-authority';import {jsxs,jsx}from'react/jsx-runtime';var k=cva("h-full rounded-full transition-all duration-300 ease-out",{variants:{variant:{default:"bg-foreground",success:"bg-[var(--progress-success)]",warning:"bg-[var(--progress-warning)]",error:"bg-[var(--progress-error)]",info:"bg-[var(--progress-info)]",glass:"bg-white/50 backdrop-blur-sm"}},defaultVariants:{variant:"default"}}),h=cva("relative w-full overflow-hidden rounded-full",{variants:{variant:{default:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",success:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",warning:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",error:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",info:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",glass:"bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/10 dark:border-slate-700/50"},size:{sm:"h-2",md:"h-3",lg:"h-4"}},defaultVariants:{variant:"default",size:"md"}}),o=t.forwardRef(({className:r,value:e=0,max:s=100,size:n="md",variant:b$1="default",showValue:l=false,animated:m=true,striped:P=false,label:d,description:p,autoVariant:w=false,...x},N)=>{let c=Math.min(Math.max(e/s*100,0),100),f=(()=>{if(!w)return b$1;let v=e/s;return v>.5?"success":v>.25?"warning":"error"})();return jsxs("div",{className:b("w-full",r),...x,children:[(d||l)&&jsxs("div",{className:"flex items-center justify-between mb-2",children:[d&&jsx("span",{className:"text-sm font-medium text-foreground",children:d}),l&&jsxs("span",{className:"text-sm text-muted-foreground",children:[Math.round(c),"%"]})]}),jsx("div",{ref:N,className:h({variant:f,size:n}),children:jsx("div",{className:b(k({variant:f}),P&&"bg-gradient-to-r from-transparent via-white/20 to-transparent bg-[length:20px_100%] animate-pulse",m&&"animate-pulse"),style:{width:`${c}%`,transition:m?"width 0.3s ease-out":"none"}})}),p&&jsx("p",{className:"mt-2 text-xs text-muted-foreground",children:p})]})});o.displayName="Progress";var M=t.forwardRef(({className:r,...e},s)=>jsx(o,{ref:s,variant:"success",className:r,...e}));M.displayName="ProgressSuccess";var T=t.forwardRef(({className:r,...e},s)=>jsx(o,{ref:s,variant:"warning",className:r,...e}));T.displayName="ProgressWarning";var E=t.forwardRef(({className:r,...e},s)=>jsx(o,{ref:s,variant:"error",className:r,...e}));E.displayName="ProgressError";var H=t.forwardRef(({className:r,...e},s)=>jsx(o,{ref:s,variant:"info",className:r,...e}));H.displayName="ProgressInfo";var L=t.forwardRef(({title:r,className:e,...s},n)=>jsxs("div",{className:b("p-4 bg-card rounded-lg border border-border",e),children:[r&&jsx("h3",{className:"text-sm font-semibold text-foreground mb-3",children:r}),jsx(o,{ref:n,...s})]}));L.displayName="ProgressWrapper";var y=t.forwardRef(({className:r,children:e,...s},n)=>jsx("div",{ref:n,className:b("space-y-4",r),...s,children:e}));y.displayName="ProgressGroup";export{o as a,M as b,T as c,E as d,H as e,y as f};//# sourceMappingURL=chunk-42RGFEL2.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-42RGFEL2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Progress.tsx"],"names":["progressBarVariants","cva","progressTrackVariants","Progress","React","className","value","max","size","variant","showValue","animated","striped","label","description","autoVariant","props","ref","percentage","resolvedVariant","ratio","jsxs","merge","jsx","ProgressSuccess","ProgressWarning","ProgressError","ProgressInfo","ProgressWrapper","title","ProgressGroup","children"],"mappings":"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","file":"chunk-42RGFEL2.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const progressBarVariants = cva(\n \"h-full rounded-full transition-all duration-300 ease-out\",\n {\n variants: {\n variant: {\n default: \"bg-foreground\",\n success: \"bg-[var(--progress-success)]\",\n warning: \"bg-[var(--progress-warning)]\",\n error: \"bg-[var(--progress-error)]\",\n info: \"bg-[var(--progress-info)]\",\n glass: \"bg-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport const progressTrackVariants = cva(\n \"relative w-full overflow-hidden rounded-full\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n success: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n warning: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n error: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n info: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n glass: \"bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/10 dark:border-slate-700/50\",\n },\n size: {\n sm: \"h-2\",\n md: \"h-3\",\n lg: \"h-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n }\n)\n\n/**\n * Progress 컴포넌트의 props\n */\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: number\n max?: number\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\" | \"glass\"\n showValue?: boolean\n animated?: boolean\n striped?: boolean\n label?: string\n description?: string\n autoVariant?: boolean\n}\n\n/**\n * Progress 컴포넌트 / Progress component\n *\n * 진행률을 표시하는 프로그레스 바 컴포넌트입니다.\n *\n * @example\n * <Progress value={50} />\n * <Progress value={75} variant=\"success\" label=\"업로드\" showValue />\n * <Progress value={90} variant=\"warning\" striped animated />\n */\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n ({\n className,\n value = 0,\n max = 100,\n size = \"md\",\n variant = \"default\",\n showValue = false,\n animated = true,\n striped = false,\n label,\n description,\n autoVariant = false,\n ...props\n }, ref) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n const resolvedVariant = (() => {\n if (!autoVariant) return variant;\n const ratio = value / max;\n if (ratio > 0.5) return 'success';\n if (ratio > 0.25) return 'warning';\n return 'error';\n })();\n\n return (\n <div className={merge(\"w-full\", className)} {...props}>\n {(label || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n {label && (\n <span className=\"text-sm font-medium text-foreground\">\n {label}\n </span>\n )}\n {showValue && (\n <span className=\"text-sm text-muted-foreground\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n\n <div\n ref={ref}\n className={progressTrackVariants({ variant: resolvedVariant, size })}\n >\n <div\n className={merge(\n progressBarVariants({ variant: resolvedVariant }),\n striped && \"bg-gradient-to-r from-transparent via-white/20 to-transparent bg-[length:20px_100%] animate-pulse\",\n animated && \"animate-pulse\"\n )}\n style={{\n width: `${percentage}%`,\n transition: animated ? \"width 0.3s ease-out\" : \"none\"\n }}\n />\n </div>\n\n {description && (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )\n }\n)\nProgress.displayName = \"Progress\"\n\n// 편의 컴포넌트들\nexport const ProgressSuccess = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nProgressSuccess.displayName = \"ProgressSuccess\"\n\nexport const ProgressWarning = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nProgressWarning.displayName = \"ProgressWarning\"\n\nexport const ProgressError = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nProgressError.displayName = \"ProgressError\"\n\nexport const ProgressInfo = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nProgressInfo.displayName = \"ProgressInfo\"\n\n// 복합 Progress 컴포넌트들\nexport const ProgressWrapper = React.forwardRef<HTMLDivElement, ProgressProps & { title?: string }>(\n ({ title, className, ...props }, ref) => (\n <div className={merge(\"p-4 bg-card rounded-lg border border-border\", className)}>\n {title && (\n <h3 className=\"text-sm font-semibold text-foreground mb-3\">\n {title}\n </h3>\n )}\n <Progress ref={ref} {...props} />\n </div>\n )\n)\nProgressWrapper.displayName = \"ProgressWrapper\"\n\nexport const ProgressGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nProgressGroup.displayName = \"ProgressGroup\"\n\nexport { Progress }\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {l}from'./chunk-7OYT3QSY.mjs';import {b}from'./chunk-U6CTBZ2U.mjs';import x from'react';import {jsxs,jsx}from'react/jsx-runtime';var y=x.forwardRef(({className:n,icon:e,title:s,description:d,variant:a="default",size:r="md",hover:i="scale",gradient:g="blue",customGradient:m,...c},p)=>{let u={sm:"p-4",md:"p-6",lg:"p-8"},b$1={default:"bg-background/90 backdrop-blur-sm border border-border/50",gradient:`bg-gradient-to-br ${m||v(g)}`,glass:"bg-white/10 dark:bg-gray-800/10 backdrop-blur-md border border-white/20 dark:border-gray-700/20",neon:"bg-gray-900/90 dark:bg-gray-900/90 border border-cyan-400/30 dark:border-cyan-400/30 shadow-lg shadow-cyan-400/20"},f={scale:"hover:scale-105 transition-transform duration-300",glow:"hover:shadow-2xl hover:shadow-cyan-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300",slide:"hover:-translate-y-2 transition-transform duration-300",none:""},h=r==="lg"?"text-5xl":r==="md"?"text-4xl":"text-3xl";return jsxs("div",{ref:p,className:b("rounded-2xl shadow-lg transition-all duration-300 flex flex-col items-center text-center",u[r],b$1[a],f[i],n),...c,children:[e&&jsx("div",{className:`mb-4 ${h} ${a==="neon"?"text-cyan-400":""}`,children:typeof e=="string"&&e.startsWith("http")?jsx("img",{src:e,alt:s,className:"w-full h-full object-contain"}):jsx(l,{name:e,className:"w-full h-full"})}),jsx("h3",{className:b("font-bold mb-2",r==="lg"?"text-2xl":r==="md"?"text-xl":"text-lg",a==="gradient"?"text-white":"text-foreground"),children:s}),jsx("p",{className:b(r==="lg"?"text-base":"text-sm",a==="gradient"?"text-white/90":"text-muted-foreground"),children:d})]})});y.displayName="FeatureCard";function v(n){let e={blue:"from-indigo-500 via-cyan-500 to-cyan-600",purple:"from-purple-500 via-pink-500 to-purple-600",green:"from-green-500 via-emerald-500 to-green-600",orange:"from-orange-500 via-red-500 to-orange-600",pink:"from-pink-500 via-rose-500 to-pink-600"};return e[n]||e.blue}export{y as a};//# sourceMappingURL=chunk-4NJE7D6X.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-4NJE7D6X.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/FeatureCard.tsx"],"names":["FeatureCard","React","className","icon","title","description","variant","size","hover","gradient","customGradient","props","ref","sizeClasses","variantClasses","getGradientClass","hoverClasses","iconSize","jsxs","merge","jsx","Icon","gradients"],"mappings":"wIAuEA,IAAMA,CAAAA,CAAcC,CAAAA,CAAM,WACxB,CAAC,CACC,UAAAC,CAAAA,CACA,IAAA,CAAAC,EACA,KAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CAAU,UACV,IAAA,CAAAC,CAAAA,CAAO,KACP,KAAA,CAAAC,CAAAA,CAAQ,QACR,QAAA,CAAAC,CAAAA,CAAW,MAAA,CACX,cAAA,CAAAC,CAAAA,CACA,GAAGC,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMC,CAAAA,CAAc,CAClB,GAAI,KAAA,CACJ,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KACN,CAAA,CAEMC,IAAiB,CACrB,OAAA,CAAS,4DACT,QAAA,CAAU,CAAA,kBAAA,EAAqBJ,GAAkBK,CAAAA,CAAiBN,CAAQ,CAAC,CAAA,CAAA,CAC3E,KAAA,CAAO,iGAAA,CACP,KAAM,mHACR,CAAA,CAEMO,CAAAA,CAAe,CACnB,KAAA,CAAO,mDAAA,CACP,KAAM,wGAAA,CACN,KAAA,CAAO,wDAAA,CACP,IAAA,CAAM,EACR,CAAA,CAEMC,EAAWV,CAAAA,GAAS,IAAA,CAAO,WAAaA,CAAAA,GAAS,IAAA,CAAO,WAAa,UAAA,CAE3E,OACEW,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKN,CAAAA,CACL,UAAWO,CAAAA,CACT,0FAAA,CACAN,CAAAA,CAAYN,CAAI,CAAA,CAChBO,GAAAA,CAAeR,CAAO,CAAA,CACtBU,CAAAA,CAAaR,CAAK,CAAA,CAClBN,CACF,CAAA,CACC,GAAGS,CAAAA,CAEH,QAAA,CAAA,CAAAR,GACCiB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAW,CAAA,KAAA,EAAQH,CAAQ,CAAA,CAAA,EAAIX,CAAAA,GAAY,MAAA,CAAS,eAAA,CAAkB,EAAE,CAAA,CAAA,CAC1E,QAAA,CAAA,OAAOH,GAAS,QAAA,EAAYA,CAAAA,CAAK,WAAW,MAAM,CAAA,CACjDiB,GAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKjB,CAAAA,CAAM,IAAKC,CAAAA,CAAO,SAAA,CAAU,+BAA+B,CAAA,CAErEgB,GAAAA,CAACC,EAAA,CAAK,IAAA,CAAMlB,CAAAA,CAAqB,SAAA,CAAU,eAAA,CAAgB,CAAA,CAE/D,EAGFiB,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAWD,CAAAA,CACb,gBAAA,CACAZ,CAAAA,GAAS,KAAO,UAAA,CAAaA,CAAAA,GAAS,IAAA,CAAO,SAAA,CAAY,SAAA,CACzDD,CAAAA,GAAY,WAAa,YAAA,CAAe,iBAC1C,EACG,QAAA,CAAAF,CAAAA,CACH,EAEAgB,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAWD,CAAAA,CACZZ,CAAAA,GAAS,IAAA,CAAO,YAAc,SAAA,CAC9BD,CAAAA,GAAY,UAAA,CAAa,eAAA,CAAkB,uBAC7C,CAAA,CACG,SAAAD,CAAAA,CACH,CAAA,CAAA,CACF,CAEJ,CACF,EAEAL,CAAAA,CAAY,YAAc,aAAA,CAE1B,SAASe,EAAiBN,CAAAA,CAA0B,CAClD,IAAMa,CAAAA,CAAY,CAChB,IAAA,CAAM,0CAAA,CACN,MAAA,CAAQ,4CAAA,CACR,MAAO,6CAAA,CACP,MAAA,CAAQ,2CAAA,CACR,IAAA,CAAM,wCACR,CAAA,CACA,OAAOA,CAAAA,CAAUb,CAAkC,CAAA,EAAKa,CAAAA,CAAU,IACpE","file":"chunk-4NJE7D6X.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { AllIconName } from \"../lib/icon-names\"\n\n/**\n * FeatureCard 아이콘 타입 / FeatureCard icon type\n * - AllIconName: icons.ts + PROJECT_ICONS의 모든 아이콘 / All icons from icons.ts + PROJECT_ICONS\n * - `http${string}`: 이미지 URL / Image URL\n */\ntype FeatureCardIconType = AllIconName | `http${string}`\n\n/**\n * FeatureCard 컴포넌트의 props / FeatureCard component props\n * @typedef {Object} FeatureCardProps\n * @property {FeatureCardIconType} [icon] - 아이콘 (IconName, ProjectIconName 또는 이미지 URL) / Icon (IconName, ProjectIconName or image URL)\n * @property {string} title - 카드 제목 / Card title\n * @property {string} description - 카드 설명 / Card description\n * @property {\"default\" | \"gradient\" | \"glass\" | \"neon\"} [variant=\"default\"] - FeatureCard 스타일 변형 / FeatureCard style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - FeatureCard 크기 / FeatureCard size\n * @property {\"scale\" | \"glow\" | \"slide\" | \"none\"} [hover=\"scale\"] - 호버 효과 / Hover effect\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"} [gradient=\"blue\"] - 그라디언트 색상 / Gradient color\n * @property {string} [customGradient] - 커스텀 그라디언트 클래스 / Custom gradient class\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface FeatureCardProps extends React.HTMLAttributes<HTMLDivElement> {\n icon?: FeatureCardIconType\n title: string\n description: string\n variant?: \"default\" | \"gradient\" | \"glass\" | \"neon\"\n size?: \"sm\" | \"md\" | \"lg\"\n hover?: \"scale\" | \"glow\" | \"slide\" | \"none\"\n gradient?: \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"\n customGradient?: string\n}\n\n/**\n * FeatureCard 컴포넌트 / FeatureCard component\n * \n * 기능을 소개하는 카드 컴포넌트입니다.\n * 아이콘, 제목, 설명을 포함하며, 다양한 스타일과 호버 효과를 지원합니다.\n * \n * Card component that introduces features.\n * Includes icon, title, and description, supports various styles and hover effects.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <FeatureCard\n * icon=\"star\"\n * title=\"고급 기능\"\n * description=\"강력한 기능을 제공합니다\"\n * />\n * \n * @example\n * // Gradient 스타일 / Gradient style\n * <FeatureCard\n * icon=\"zap\"\n * title=\"빠른 성능\"\n * description=\"최적화된 성능\"\n * variant=\"gradient\"\n * gradient=\"purple\"\n * hover=\"glow\"\n * />\n * \n * @param {FeatureCardProps} props - FeatureCard 컴포넌트의 props / FeatureCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} FeatureCard 컴포넌트 / FeatureCard component\n */\nconst FeatureCard = React.forwardRef<HTMLDivElement, FeatureCardProps>(\n ({ \n className, \n icon, \n title, \n description, \n variant = \"default\", \n size = \"md\",\n hover = \"scale\",\n gradient = \"blue\",\n customGradient,\n ...props \n }, ref) => {\n const sizeClasses = {\n sm: \"p-4\",\n md: \"p-6\",\n lg: \"p-8\"\n }\n\n const variantClasses = {\n default: \"bg-background/90 backdrop-blur-sm border border-border/50\",\n gradient: `bg-gradient-to-br ${customGradient || getGradientClass(gradient)}`,\n glass: \"bg-white/10 dark:bg-gray-800/10 backdrop-blur-md border border-white/20 dark:border-gray-700/20\",\n neon: \"bg-gray-900/90 dark:bg-gray-900/90 border border-cyan-400/30 dark:border-cyan-400/30 shadow-lg shadow-cyan-400/20\"\n }\n\n const hoverClasses = {\n scale: \"hover:scale-105 transition-transform duration-300\",\n glow: \"hover:shadow-2xl hover:shadow-cyan-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300\",\n slide: \"hover:-translate-y-2 transition-transform duration-300\",\n none: \"\"\n }\n\n const iconSize = size === \"lg\" ? \"text-5xl\" : size === \"md\" ? \"text-4xl\" : \"text-3xl\"\n\n return (\n <div\n ref={ref}\n className={merge(\n \"rounded-2xl shadow-lg transition-all duration-300 flex flex-col items-center text-center\",\n sizeClasses[size],\n variantClasses[variant],\n hoverClasses[hover],\n className\n )}\n {...props}\n >\n {icon && (\n <div className={`mb-4 ${iconSize} ${variant === \"neon\" ? \"text-cyan-400\" : \"\"}`}>\n {typeof icon === \"string\" && icon.startsWith(\"http\") ? (\n <img src={icon} alt={title} className=\"w-full h-full object-contain\" />\n ) : (\n <Icon name={icon as AllIconName} className=\"w-full h-full\" />\n )}\n </div>\n )}\n \n <h3 className={merge(\n \"font-bold mb-2\",\n size === \"lg\" ? \"text-2xl\" : size === \"md\" ? \"text-xl\" : \"text-lg\",\n variant === \"gradient\" ? \"text-white\" : \"text-foreground\"\n )}>\n {title}\n </h3>\n \n <p className={merge(\n size === \"lg\" ? \"text-base\" : \"text-sm\",\n variant === \"gradient\" ? \"text-white/90\" : \"text-muted-foreground\"\n )}>\n {description}\n </p>\n </div>\n )\n }\n)\n\nFeatureCard.displayName = \"FeatureCard\"\n\nfunction getGradientClass(gradient: string): string {\n const gradients = {\n blue: \"from-indigo-500 via-cyan-500 to-cyan-600\",\n purple: \"from-purple-500 via-pink-500 to-purple-600\",\n green: \"from-green-500 via-emerald-500 to-green-600\",\n orange: \"from-orange-500 via-red-500 to-orange-600\",\n pink: \"from-pink-500 via-rose-500 to-pink-600\"\n }\n return gradients[gradient as keyof typeof gradients] || gradients.blue\n}\n\nexport { FeatureCard } "]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {b as b$1}from'./chunk-U6CTBZ2U.mjs';import d from'react';import {cva}from'class-variance-authority';import {jsx}from'react/jsx-runtime';var m=cva("rounded-lg",{variants:{variant:{default:"bg-card text-card-foreground border border-border",outline:"bg-transparent border-2 border-border",elevated:"bg-card text-card-foreground shadow-lg border border-border"},shadow:{none:"shadow-none",sm:"shadow-sm",md:"shadow-md",lg:"shadow-lg"},padding:{none:"",sm:"p-3",md:"p-4",lg:"p-6"}},defaultVariants:{variant:"default",padding:"none"}}),c=d.forwardRef(({className:e,variant:r="default",shadow:t,padding:n="none",hoverable:s,...i},l)=>jsx("div",{ref:l,className:b$1(m({variant:r,shadow:t,padding:n}),s&&"transition-shadow hover:shadow-lg cursor-pointer",e),...i}));c.displayName="Card";var f=d.forwardRef(({className:e,...r},t)=>jsx("div",{ref:t,className:b$1("flex flex-col space-y-1 p-3",e),...r}));f.displayName="CardHeader";var C=d.forwardRef(({className:e,...r},t)=>jsx("h3",{ref:t,className:b$1("text-base md:text-lg font-semibold leading-tight tracking-tight",e),...r}));C.displayName="CardTitle";var g=d.forwardRef(({className:e,...r},t)=>jsx("p",{ref:t,className:b$1("text-sm text-muted-foreground",e),...r}));g.displayName="CardDescription";var b=d.forwardRef(({className:e,...r},t)=>jsx("div",{ref:t,className:b$1("px-3 pb-3",e),...r}));b.displayName="CardContent";var x=d.forwardRef(({className:e,...r},t)=>jsx("div",{ref:t,className:b$1("flex items-center px-3 pb-3",e),...r}));x.displayName="CardFooter";export{c as a,f as b,C as c,g as d,b as e,x as f};//# sourceMappingURL=chunk-6HVJFEDA.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-6HVJFEDA.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Card.tsx"],"names":["cardVariants","cva","Card","React","className","variant","shadow","padding","hoverable","props","ref","jsx","merge","CardHeader","CardTitle","CardDescription","CardContent","CardFooter"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/components/Card.tsx"],"names":["cardVariants","cva","Card","React","className","variant","shadow","padding","hoverable","props","ref","jsx","merge","CardHeader","CardTitle","CardDescription","CardContent","CardFooter"],"mappings":"gJAMO,IAAMA,CAAAA,CAAeC,GAAAA,CAC1B,YAAA,CACA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,mDAAA,CACT,OAAA,CAAS,uCAAA,CACT,QAAA,CAAU,6DACZ,CAAA,CACA,MAAA,CAAQ,CACN,IAAA,CAAM,cACN,EAAA,CAAI,WAAA,CACJ,EAAA,CAAI,WAAA,CACJ,EAAA,CAAI,WACN,CAAA,CACA,OAAA,CAAS,CACP,IAAA,CAAM,EAAA,CACN,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KACN,CACF,CAAA,CACA,eAAA,CAAiB,CACf,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,MACX,CACF,CACF,CAAA,CAuBMC,CAAAA,CAAOC,CAAAA,CAAM,WACjB,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,OAAA,CAAAC,CAAAA,CAAU,SAAA,CAAW,MAAA,CAAAC,CAAAA,CAAQ,OAAA,CAAAC,CAAAA,CAAU,MAAA,CAAQ,SAAA,CAAAC,CAAAA,CAAW,GAAGC,CAAM,CAAA,CAAGC,CAAAA,GAEhFC,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKD,CAAAA,CACL,SAAA,CAAWE,GAAAA,CACTZ,CAAAA,CAAa,CAAE,OAAA,CAAAK,CAAAA,CAAS,MAAA,CAAAC,CAAAA,CAAQ,QAAAC,CAAQ,CAAC,CAAA,CACzCC,CAAAA,EAAa,kDAAA,CACbJ,CACF,CAAA,CACC,GAAGK,CAAAA,CACN,CAGN,EAEAP,CAAAA,CAAK,WAAA,CAAc,MAAA,CAInB,IAAMW,CAAAA,CAAaV,CAAAA,CAAM,UAAA,CACvB,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,GAAGK,CAAM,CAAA,CAAGC,CAAAA,GACxBC,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKD,CAAAA,CACL,UAAWE,GAAAA,CAAM,6BAAA,CAA+BR,CAAS,CAAA,CACxD,GAAGK,CAAAA,CACN,CAEJ,EAEAI,CAAAA,CAAW,WAAA,CAAc,YAAA,CAIzB,IAAMC,CAAAA,CAAYX,CAAAA,CAAM,UAAA,CACtB,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,GAAGK,CAAM,CAAA,CAAGC,CAAAA,GACxBC,GAAAA,CAAC,IAAA,CAAA,CACC,GAAA,CAAKD,CAAAA,CACL,SAAA,CAAWE,GAAAA,CACT,iEAAA,CACAR,CACF,CAAA,CACC,GAAGK,CAAAA,CACN,CAEJ,EAEAK,CAAAA,CAAU,WAAA,CAAc,WAAA,CAIxB,IAAMC,CAAAA,CAAkBZ,CAAAA,CAAM,UAAA,CAC5B,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,GAAGK,CAAM,CAAA,CAAGC,CAAAA,GACxBC,GAAAA,CAAC,GAAA,CAAA,CACC,GAAA,CAAKD,CAAAA,CACL,SAAA,CAAWE,GAAAA,CAAM,+BAAA,CAAiCR,CAAS,CAAA,CAC1D,GAAGK,EACN,CAEJ,EAEAM,CAAAA,CAAgB,WAAA,CAAc,iBAAA,CAI9B,IAAMC,CAAAA,CAAcb,CAAAA,CAAM,UAAA,CACxB,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,GAAGK,CAAM,CAAA,CAAGC,CAAAA,GACxBC,GAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKD,CAAAA,CAAK,SAAA,CAAWE,GAAAA,CAAM,WAAA,CAAaR,CAAS,CAAA,CAAI,GAAGK,CAAAA,CAAO,CAExE,EAEAO,EAAY,WAAA,CAAc,aAAA,CAI1B,IAAMC,CAAAA,CAAad,CAAAA,CAAM,UAAA,CACvB,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,GAAGK,CAAM,CAAA,CAAGC,CAAAA,GACxBC,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKD,CAAAA,CACL,SAAA,CAAWE,GAAAA,CAAM,6BAAA,CAA+BR,CAAS,CAAA,CACxD,GAAGK,CAAAA,CACN,CAEJ,EAEAQ,CAAAA,CAAW,WAAA,CAAc,YAAA","file":"chunk-6HVJFEDA.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const cardVariants = cva(\n \"rounded-lg\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground border border-border\",\n outline: \"bg-transparent border-2 border-border\",\n elevated: \"bg-card text-card-foreground shadow-lg border border-border\",\n },\n shadow: {\n none: \"shadow-none\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n },\n padding: {\n none: \"\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n padding: \"none\",\n },\n }\n)\n\n/**\n * Card 컴포넌트의 props / Card component props\n */\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"outline\" | \"elevated\"\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\"\n hoverable?: boolean\n}\n\n/**\n * Card 컴포넌트 / Card component\n *\n * 콘텐츠를 카드 형태로 표시하는 컴포넌트입니다.\n *\n * @example\n * <Card>\n * <CardHeader><CardTitle>제목</CardTitle></CardHeader>\n * <CardContent><p>내용</p></CardContent>\n * </Card>\n */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant = \"default\", shadow, padding = \"none\", hoverable, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n cardVariants({ variant, shadow, padding }),\n hoverable && \"transition-shadow hover:shadow-lg cursor-pointer\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nCard.displayName = \"Card\"\n\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex flex-col space-y-1 p-3\", className)}\n {...props}\n />\n )\n)\n\nCardHeader.displayName = \"CardHeader\"\n\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, CardTitleProps>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={merge(\n \"text-base md:text-lg font-semibold leading-tight tracking-tight\",\n className\n )}\n {...props}\n />\n )\n)\n\nCardTitle.displayName = \"CardTitle\"\n\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={merge(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\n\nCardDescription.displayName = \"CardDescription\"\n\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={merge(\"px-3 pb-3\", className)} {...props} />\n )\n)\n\nCardContent.displayName = \"CardContent\"\n\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center px-3 pb-3\", className)}\n {...props}\n />\n )\n)\n\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {e,b}from'./chunk-U6CTBZ2U.mjs';import {Minus,ListNumbers,List,Quotes,FileCode,Code,Link,TextHOne,TextStrikethrough,TextItalic,TextB,Prohibit,Stack,Megaphone,Layout,Rocket,MaskHappy,Cpu,WifiSlash,WifiHigh,Clipboard,Ticket,FloppyDisk,DeviceMobile,Globe,Sparkle,Square,Flag,Brain,Lightbulb,Moon,Sun,Monitor,Share,Bookmark,Star,Heart,Bell,CalendarPlus,Calendar,Clock,Key,Wallet,Shield,LockOpen,Lock,SmileyMeh,SmileySad,Smiley,Camera,Video,Image,Phone,ChatCircle,Envelope,BookOpen,Book,Folder,File,FileText,Lightning,Database,Pulse,TrendUp,ChartBar,EyeSlash,Eye,SignOut,SignIn,UserPlus,Users,User,Question,Circle,Check,Info,WarningCircle,XCircle,CheckCircle,SpinnerGap,Copy,ArrowClockwise,Upload,Download,Plus,Trash,Pencil,CaretUp,CaretDown,CaretRight,CaretLeft,ArrowSquareOut,Gear,MagnifyingGlass,X,ArrowDown,ArrowUp,ArrowRight,ArrowLeft,House}from'@phosphor-icons/react/dist/ssr';import c,{createContext,useContext}from'react';import {jsx}from'react/jsx-runtime';var Z={home:House,arrowLeft:ArrowLeft,arrowRight:ArrowRight,arrowUp:ArrowUp,arrowDown:ArrowDown,menu:List,close:X,search:MagnifyingGlass,settings:Gear,externalLink:ArrowSquareOut,chevronLeft:CaretLeft,chevronRight:CaretRight,chevronDown:CaretDown,chevronUp:CaretUp,edit:Pencil,delete:Trash,add:Plus,remove:Minus,download:Download,upload:Upload,refresh:ArrowClockwise,save:FloppyDisk,copy:Copy,loader:SpinnerGap,success:CheckCircle,error:XCircle,alertCircle:WarningCircle,warning:WarningCircle,info:Info,check:Check,circle:Circle,helpCircle:Question,user:User,users:Users,userPlus:UserPlus,logIn:SignIn,logOut:SignOut,eye:Eye,eyeOff:EyeSlash,chart:ChartBar,barChart:ChartBar,trendingUp:TrendUp,activity:Pulse,database:Database,zap:Lightning,fileText:FileText,file:File,folder:Folder,book:Book,bookOpen:BookOpen,mail:Envelope,message:ChatCircle,phone:Phone,image:Image,video:Video,camera:Camera,smile:Smiley,frown:SmileySad,meh:SmileyMeh,lock:Lock,unlock:LockOpen,shield:Shield,wallet:Wallet,key:Key,clock:Clock,calendar:Calendar,calendarPlus:CalendarPlus,bell:Bell,heart:Heart,star:Star,bookmark:Bookmark,share:Share,monitor:Monitor,sun:Sun,moon:Moon,lightbulb:Lightbulb,brain:Brain,flag:Flag,square:Square,sparkle:Sparkle,sparkles:Sparkle,globe:Globe,smartphone:DeviceMobile,deviceMobile:DeviceMobile,floppyDisk:FloppyDisk,ticket:Ticket,clipboard:Clipboard,wifi:WifiHigh,wifiOff:WifiSlash,cpu:Cpu,mask:MaskHappy,rocket:Rocket,layout:Layout,megaphone:Megaphone,layers:Stack,ban:Prohibit,bold:TextB,italic:TextItalic,strikethrough:TextStrikethrough,heading:TextHOne,link:Link,code:Code,fileCode:FileCode,quote:Quotes,list:List,listOrdered:ListNumbers,minus:Minus},$={happy:"smile",sad:"frown",neutral:"meh",excited:"smile",angry:"frown",love:"heart",like:"heart",dislike:"frown"},Q={loading:"loader",success:"success",error:"error",warning:"warning",info:"info",locked:"lock",unlocked:"unlock",visible:"eye",hidden:"eyeOff"},kr={navigation:["home","arrowLeft","arrowRight","arrowUp","arrowDown","menu","close","search","settings","externalLink","chevronLeft","chevronRight","chevronDown","chevronUp"],actions:["edit","delete","add","remove","download","upload","refresh","save","copy"],status:["loader","success","error","alertCircle","warning","info","check","circle"],user:["user","users","userPlus","logIn","logOut","eye","eyeOff"],data:["chart","barChart","trendingUp","activity","database","zap"],files:["fileText","file","folder","book"],communication:["mail","message","phone"],media:["image","video","camera"],emotions:["smile","frown","meh"],security:["lock","unlock","shield"],time:["clock","calendar"],ui:["bell","heart","star","bookmark","share"],theme:["monitor","sun","moon"]};var x={"arrow-left":"arrowLeft","arrow-right":"arrowRight","arrow-up":"arrowUp","arrow-down":"arrowDown","chevron-left":"chevronLeft","chevron-right":"chevronRight","chevron-up":"chevronUp","chevron-down":"chevronDown","external-link":"externalLink","more-horizontal":"moreHorizontal","more-vertical":"moreVertical","user-plus":"userPlus","log-in":"logIn","log-out":"logOut","check-circle":"checkCircle","check-square":"checkSquare","alert-circle":"alertCircle","eye-off":"eyeOff","file-text":"fileText","book-open":"bookOpen","bar-chart":"barChart","trending-up":"trendingUp","trending-down":"trendingDown","message-square":"messageSquare","calendar-plus":"calendarPlus","refresh-cw":"refreshCw","dollar-sign":"dollarSign","layout-dashboard":"layoutDashboard","device-mobile":"deviceMobile","floppy-disk":"floppyDisk",back:"arrowLeft",prev:"arrowLeft",previous:"arrowLeft",forward:"arrowRight",next:"arrowRight",close:"x",cancel:"x",remove:"delete",trash:"delete",plus:"add",new:"add",pencil:"edit",modify:"edit",store:"save",floppy:"save",magnify:"search",person:"user",account:"user",profile:"user",gear:"settings",config:"settings",preferences:"settings",house:"home",main:"home",done:"check",complete:"check",tick:"check",information:"info",help:"info",alert:"warning",caution:"warning",checkmark:"success",checkCircle:"success",fail:"error",cross:"error",xCircle:"error",spinner:"loader",loading:"loader",wait:"loader",reload:"refresh",update:"refresh",sync:"refresh",show:"eye",view:"eye",hide:"eyeOff",hidden:"eyeOff",secure:"lock",locked:"lock",unsecure:"unlock",unlocked:"unlock",get:"download",fetch:"download",post:"upload",send:"share",export:"share",duplicate:"copy",clone:"copy",email:"mail",envelope:"mail",chat:"message",comment:"message",talk:"message",date:"calendar",schedule:"calendar",time:"clock",watch:"clock",document:"fileText",doc:"fileText",text:"fileText",directory:"folder",dir:"folder",picture:"image",img:"image",movie:"video",film:"video",photo:"camera",capture:"camera",start:"play",run:"play",stop:"pause",halt:"pause",like:"heart",love:"heart",favorite:"star",saveBookmark:"bookmark",notification:"bell",notify:"bell",alarm:"bell",prefs:"settings",lookup:"search",dots:"moreHorizontal",moreMenu:"moreHorizontal",moreOptions:"moreVertical",external:"externalLink",outbound:"externalLink",open:"externalLink",url:"link",hyperlink:"link",graph:"barChart",stats:"barChart",analytics:"barChart",db:"database",storage:"database",pulse:"activity",monitor:"activity",up:"trendingUp",down:"trendingDown",lightning:"zap",bolt:"zap",flash:"zap",security:"shield",protect:"shield",password:"key",secret:"key",signin:"logIn",login:"logIn",enter:"logIn",signout:"logOut",logout:"logOut",exit:"logOut",people:"users",group:"users",team:"users",addUser:"userPlus",invite:"userPlus",read:"book",library:"book",reading:"bookOpen",openBook:"bookOpen",light:"sun",day:"sun",dark:"moon",night:"moon",screen:"monitor",display:"monitor",ai:"brain",intelligence:"brain",think:"brain",idea:"lightbulb",bulb:"lightbulb",inspiration:"lightbulb",magic:"sparkles",stars:"sparkles",glitter:"sparkles"};function Cr(e){if(typeof e!="string")throw new TypeError("iconName must be a string");return x[e]||e}function yr(e){if(typeof e!="string")throw new TypeError("iconName must be a string");return Object.entries(x).filter(([o,r])=>r===e).map(([o])=>o)}var h={set:"phosphor",weight:"regular",size:20,color:"currentColor",strokeWidth:1.25,iconsaxVariant:"line"},cr=e=>{switch(e){case "lucide":return 1.25;case "phosphor":return 1.25;case "iconsax":return 1.5;default:return 1.25}};var J=createContext(h);function ur({set:e=h.set,weight:o=h.weight,iconsaxVariant:r=h.iconsaxVariant,size:i=h.size,color:s=h.color,strokeWidth:P=h.strokeWidth,children:T}){let R={set:e,weight:o,iconsaxVariant:r,size:i,color:s,strokeWidth:P};return jsx(J.Provider,{value:R,children:T})}function E(){return useContext(J)}function K(e){return !e||!/[-_]/.test(e)&&/^[a-z]/.test(e)?e:/^[A-Z]+$/.test(e)?e.toLowerCase():/^[A-Z]/.test(e)&&!/[-_]/.test(e)?e.charAt(0).toLowerCase()+e.slice(1):e.split(/[-_]/).map((o,r)=>r===0?o.toLowerCase():o.charAt(0).toUpperCase()+o.slice(1).toLowerCase()).join("")}var n=null,t=null;var Y={home:{lucide:"Home",phosphor:"House",iconsax:"Home2"},"layout-dashboard":{lucide:"LayoutDashboard",phosphor:"SquaresFour"},folder:{lucide:"Folder",phosphor:"Folder",iconsax:"Folder"},"alert-circle":{lucide:"AlertCircle",phosphor:"WarningCircle",iconsax:"Danger"},alertCircle:{lucide:"AlertCircle",phosphor:"WarningCircle",iconsax:"Danger"},columns:{lucide:"Columns",phosphor:"Columns"},users:{lucide:"Users",phosphor:"Users",iconsax:"People"},settings:{lucide:"Settings",phosphor:"Gear"},menu:{lucide:"Menu",phosphor:"List",iconsax:"Menu"},close:{lucide:"X",phosphor:"X",iconsax:"CloseCircle"},chevronLeft:{lucide:"ChevronLeft",phosphor:"CaretLeft",iconsax:"ArrowLeft2"},chevronRight:{lucide:"ChevronRight",phosphor:"CaretRight",iconsax:"ArrowRight2"},chevronDown:{lucide:"ChevronDown",phosphor:"CaretDown",iconsax:"ArrowDown2"},chevronUp:{lucide:"ChevronUp",phosphor:"CaretUp",iconsax:"ArrowUp2"},arrowLeft:{lucide:"ArrowLeft",phosphor:"ArrowLeft",iconsax:"ArrowLeft"},arrowRight:{lucide:"ArrowRight",phosphor:"ArrowRight",iconsax:"ArrowRight"},arrowUp:{lucide:"ArrowUp",phosphor:"ArrowUp",iconsax:"ArrowUp"},arrowDown:{lucide:"ArrowDown",phosphor:"ArrowDown",iconsax:"ArrowDown"},add:{lucide:"Plus",phosphor:"Plus",iconsax:"Add"},edit:{lucide:"Edit",phosphor:"Pencil"},pencil:{lucide:"Pencil",phosphor:"Pencil"},delete:{lucide:"Trash2",phosphor:"Trash",iconsax:"Trash"},trash:{lucide:"Trash2",phosphor:"Trash",iconsax:"Trash"},upload:{lucide:"Upload",phosphor:"Upload",iconsax:"Upload"},download:{lucide:"Download",phosphor:"Download",iconsax:"Download"},x:{lucide:"X",phosphor:"X"},check:{lucide:"Check",phosphor:"Check",iconsax:"Check"},search:{lucide:"Search",phosphor:"MagnifyingGlass",iconsax:"SearchNormal"},share:{lucide:"Share",phosphor:"Share"},copy:{lucide:"Copy",phosphor:"Copy"},save:{lucide:"Save",phosphor:"FloppyDisk"},loader:{lucide:"Loader2",phosphor:"Spinner"},loader2:{lucide:"Loader2",phosphor:"Spinner"},"check-circle":{lucide:"CheckCircle",phosphor:"CheckCircle",iconsax:"TickCircle"},checkCircle:{lucide:"CheckCircle",phosphor:"CheckCircle",iconsax:"TickCircle"},success:{lucide:"CheckCircle",phosphor:"CheckCircle",iconsax:"TickCircle"},error:{lucide:"XCircle",phosphor:"XCircle",iconsax:"CloseCircle"},warning:{lucide:"AlertCircle",phosphor:"WarningCircle",iconsax:"Warning2"},info:{lucide:"Info",phosphor:"Info",iconsax:"InfoCircle"},refresh:{lucide:"RefreshCw",phosphor:"ArrowClockwise",iconsax:"Refresh"},refreshCw:{lucide:"RefreshCw",phosphor:"ArrowClockwise",iconsax:"Refresh"},bell:{lucide:"Bell",phosphor:"Bell",iconsax:"Bell"},heart:{lucide:"Heart",phosphor:"Heart",iconsax:"Heart"},star:{lucide:"Star",phosphor:"Star",iconsax:"Star"},bookmark:{lucide:"Bookmark",phosphor:"Bookmark"},user:{lucide:"User",phosphor:"User",iconsax:"User"},userPlus:{lucide:"UserPlus",phosphor:"UserPlus",iconsax:"UserAdd"},logIn:{lucide:"LogIn",phosphor:"SignIn",iconsax:"Login"},logOut:{lucide:"LogOut",phosphor:"SignOut",iconsax:"Logout"},chrome:{lucide:"Chrome",phosphor:"ChromeLogo",iconsax:"Chrome"},github:{lucide:"Github",phosphor:"GithubLogo"},message:{lucide:"MessageCircle",phosphor:"ChatCircle"},messageSquare:{lucide:"MessageSquare",phosphor:"ChatSquare"},"message-square":{lucide:"MessageSquare",phosphor:"ChatSquare"},inbox:{lucide:"Inbox",phosphor:"Inbox"},calendar:{lucide:"Calendar",phosphor:"Calendar"},calendarPlus:{lucide:"CalendarPlus",phosphor:"CalendarPlus"},checkSquare:{lucide:"CheckSquare",phosphor:"CheckSquare",iconsax:"TickSquare"},clock:{lucide:"Clock",phosphor:"Clock"},book:{lucide:"Book",phosphor:"Book",iconsax:"Book"},bookOpen:{lucide:"BookOpen",phosphor:"BookOpen",iconsax:"Book"},monitor:{lucide:"Monitor",phosphor:"Monitor",iconsax:"Monitor"},sun:{lucide:"Sun",phosphor:"Sun",iconsax:"Sun"},moon:{lucide:"Moon",phosphor:"Moon",iconsax:"Moon"},sparkle:{lucide:"Sparkle",phosphor:"Sparkle"},sparkles:{lucide:"Sparkles",phosphor:"Sparkle"},lightbulb:{lucide:"Lightbulb",phosphor:"Lightbulb"},brain:{lucide:"Brain",phosphor:"Brain"},zap:{lucide:"Zap",phosphor:"Lightning"},globe:{lucide:"Globe",phosphor:"Globe",iconsax:"Global"},deviceMobile:{lucide:"Smartphone",phosphor:"DeviceMobile"},smartphone:{lucide:"Smartphone",phosphor:"DeviceMobile"},floppyDisk:{lucide:"Save",phosphor:"FloppyDisk"},chart:{lucide:"BarChart3",phosphor:"ChartBar"},barChart:{lucide:"BarChart",phosphor:"ChartBar"},trendingUp:{lucide:"TrendingUp",phosphor:"TrendUp"},trendingDown:{lucide:"TrendingDown",phosphor:"TrendDown"},activity:{lucide:"Activity",phosphor:"Pulse"},database:{lucide:"Database",phosphor:"Database"},dollarSign:{lucide:"DollarSign",phosphor:"CurrencyDollar"},dollar:{lucide:"DollarSign",phosphor:"CurrencyDollar"},currency:{lucide:"DollarSign",phosphor:"CurrencyDollar"},layers:{lucide:"Layers",phosphor:"Stack"},ban:{lucide:"Ban",phosphor:"Prohibit"},lock:{lucide:"Lock",phosphor:"Lock",iconsax:"Lock"},unlock:{lucide:"Unlock",phosphor:"LockOpen",iconsax:"Unlock"},shield:{lucide:"Shield",phosphor:"Shield",iconsax:"Shield"},key:{lucide:"Key",phosphor:"Key"},play:{lucide:"Play",phosphor:"Play",iconsax:"Play"},pause:{lucide:"Pause",phosphor:"Pause",iconsax:"Pause"},image:{lucide:"Image",phosphor:"Image",iconsax:"Image"},video:{lucide:"Video",phosphor:"Video",iconsax:"Video"},camera:{lucide:"Camera",phosphor:"Camera",iconsax:"Camera"},fileText:{lucide:"FileText",phosphor:"FileText"},file:{lucide:"File",phosphor:"File"},externalLink:{lucide:"ExternalLink",phosphor:"ArrowSquareOut"},link:{lucide:"Link",phosphor:"Link",iconsax:"Link"},moreHorizontal:{lucide:"MoreHorizontal",phosphor:"DotsThreeOutline"},moreVertical:{lucide:"MoreVertical",phosphor:"DotsThreeVertical"},remove:{lucide:"Minus",phosphor:"Minus",iconsax:"Minus"},eye:{lucide:"Eye",phosphor:"Eye",iconsax:"Eye"},eyeOff:{lucide:"EyeOff",phosphor:"EyeSlash",iconsax:"EyeSlash"},smile:{lucide:"Smile",phosphor:"Smiley",iconsax:"EmojiHappy"},frown:{lucide:"Frown",phosphor:"SmileySad",iconsax:"EmojiSad"},meh:{lucide:"Meh",phosphor:"SmileyMeh",iconsax:"EmojiNormal"},mail:{lucide:"Mail",phosphor:"Envelope"},phone:{lucide:"Phone",phosphor:"Phone"},flag:{lucide:"Flag",phosphor:"Flag",iconsax:"Flag"},rocket:{lucide:"Rocket",phosphor:"Rocket",iconsax:"Rocket"},ticket:{lucide:"Ticket",phosphor:"Ticket",iconsax:"Ticket"},clipboard:{lucide:"ClipboardList",phosphor:"Clipboard",iconsax:"Sticker"},wifi:{lucide:"Wifi",phosphor:"WifiHigh",iconsax:"Wifi"},wifiOff:{lucide:"WifiOff",phosphor:"WifiSlash"},cpu:{lucide:"Cpu",phosphor:"Cpu",iconsax:"Computing"},mask:{lucide:"Drama",phosphor:"MaskHappy",iconsax:"EmojiHappy"},bold:{lucide:"Bold",phosphor:"TextB"},italic:{lucide:"Italic",phosphor:"TextItalic"},strikethrough:{lucide:"Strikethrough",phosphor:"TextStrikethrough"},heading:{lucide:"Heading",phosphor:"TextHOne"},code:{lucide:"Code",phosphor:"Code",iconsax:"Code"},fileCode:{lucide:"FileCode",phosphor:"FileCode"},quote:{lucide:"Quote",phosphor:"Quotes",iconsax:"QuoteUp"},list:{lucide:"List",phosphor:"List"},listOrdered:{lucide:"ListOrdered",phosphor:"ListNumbers"},minus:{lucide:"Minus",phosphor:"Minus",iconsax:"Minus"}};async function ee(){if(typeof window=="undefined")return null;if(!n)try{n=await import('@phosphor-icons/react');}catch{return console.warn("Phosphor Icons not available. Install @phosphor-icons/react to use."),null}return n}async function oe(){if(typeof window=="undefined")return null;if(!t)try{t=await import('lucide-react');}catch{return console.warn("Lucide Icons not available. Install lucide-react to use lucide provider."),null}return t}function L(e,o="phosphor"){let r=Y[e];if(!r)return fr(e,o);let i=r[o];switch(o){case "phosphor":return !i||!n?null:(n==null?void 0:n[i])||null;case "lucide":return !i||!t?null:(t==null?void 0:t[i])||null;case "iconsax":{return null;}default:return null}}function fr(e,o){switch(o){case "phosphor":{if(!n)return null;let r=e.charAt(0).toUpperCase()+e.slice(1),i=e.split(/(?=[A-Z])/).map(s=>s.charAt(0).toUpperCase()+s.slice(1)).join("");return (n==null?void 0:n[r])||(n==null?void 0:n[i])||(n==null?void 0:n[e])||null}case "lucide":{if(!t)return null;let r=e.charAt(0).toUpperCase()+e.slice(1),i=e.replace(/([A-Z])/g,s=>s===e[0]?s.toLowerCase():s);return (t==null?void 0:t[r])||(t==null?void 0:t[e])||(t==null?void 0:t[i])||null}case "iconsax":{return null;}default:return null}}function re(e,o){let r=Y[e];if(r){let i=r[o];if(i)return i}return e}function ie(e){if(!e||typeof e!="string")return {normalized:e||"",wasAlias:false};let o=K(e),r=x[e]||x[o];return r?{normalized:r,wasAlias:true,originalAlias:e}:{normalized:o,wasAlias:false}}var ne=c.forwardRef(({name:e$1,size:o,className:r,emotion:i,status:s,provider:P,weight:T,animated:R=false,pulse:pe=false,spin:he=false,bounce:ue=false,variant:f="default","aria-label":y,"aria-hidden":w},N)=>{var B,V;let g=E(),a=P||g.set,l=o!=null?o:g.size,de=T||g.weight,fe=g.color,me=(B=g.strokeWidth)!=null?B:1.25,z=(V=g.iconsaxVariant)!=null?V:"line",[A,ge]=c.useState(false),[ke,D]=c.useState(false);c.useEffect(()=>{ge(true),a==="lucide"?oe().then(()=>D(true)):a==="phosphor"?ee().then(()=>D(true)):D(true);},[a]);let O=c.useMemo(()=>{let b=i?$[i]:s?Q[s]:e$1,{normalized:F}=ie(b),ye=re(F,a);return {normalized:F,providerName:ye}},[e$1,i,s,a]),d=O.normalized,xe=c.useMemo(()=>{return null},[a,O.providerName,A,z]),I=e({"text-current":f==="default","text-primary":f==="primary","text-muted-foreground":f==="secondary"||f==="muted","text-green-600 dark:text-green-400":f==="success","text-yellow-600 dark:text-yellow-400":f==="warning","text-destructive":f==="error"});if(!A)return jsx("span",{style:{width:l,height:l},className:b(I,r),"aria-hidden":w!==void 0?w:true,"aria-label":y});let p=null;if(a==="phosphor"?(p=Z[d]||null,!p&&ke&&(p=L(d,a))):a==="iconsax"?(p=xe,p||(p=L(d,a))):p=L(d,a),!p)return a==="iconsax"&&true?process.env.NODE_ENV==="development"&&console.warn(`Icon "${d}" \u2014 iconsax resolver not registered. Use HuaProvider with icons.set='iconsax', or add: import '@hua-labs/ui/iconsax'`):console.warn(`Icon "${d}" not found for provider "${a}"`),jsx("span",{ref:N,className:b("inline-flex items-center justify-center rounded-full border-2 border-dashed border-border",I,r),style:{width:l,height:l},"aria-label":y||`\uC544\uC774\uCF58\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C: ${d}`,title:`Icon not found: ${d}`,children:jsx("span",{className:"text-xs text-muted-foreground","aria-hidden":"true",children:"?"})});let M={size:typeof l=="number"?l:void 0,width:l,height:l,color:fe};a==="phosphor"?M.weight=de:M.strokeWidth=me;let Ce=e({"animate-pulse":pe,"animate-spin":he,"animate-bounce":ue,"transition-all duration-200 ease-in-out":R}),k={};return y?(k["aria-label"]=y,k["aria-hidden"]=false):w!==void 0?k["aria-hidden"]=w:k["aria-hidden"]=true,jsx("span",{ref:N,className:b("inline-flex items-center justify-center",Ce,I,r),style:{width:l,height:l},...k,children:p&&c.createElement(p,{...M,className:I,"aria-hidden":true})})});ne.displayName="Icon";var mr=c.memo(ne,(e,o)=>e.name===o.name&&e.size===o.size&&e.className===o.className&&e.emotion===o.emotion&&e.status===o.status&&e.provider===o.provider&&e.animated===o.animated&&e.pulse===o.pulse&&e.spin===o.spin&&e.bounce===o.bounce&&e.variant===o.variant&&e.weight===o.weight&&e["aria-label"]===o["aria-label"]&&e["aria-hidden"]===o["aria-hidden"]),m=mr;m.displayName="Icon";var te=c.forwardRef((e,o)=>jsx(m,{ref:o,name:"smile",...e}));te.displayName="EmotionIcon";var ae=c.forwardRef((e,o)=>jsx(m,{ref:o,name:"info",...e}));ae.displayName="StatusIcon";var se=c.forwardRef((e,o)=>jsx(m,{ref:o,name:"loader",status:"loading",spin:true,"aria-label":"\uB85C\uB529 \uC911",...e}));se.displayName="LoadingIcon";var le=c.forwardRef((e,o)=>jsx(m,{ref:o,name:"check",status:"success",variant:"success","aria-label":"\uC131\uACF5",...e}));le.displayName="SuccessIcon";var ce=c.forwardRef((e,o)=>jsx(m,{ref:o,name:"alertCircle",status:"error",variant:"error","aria-label":"\uC624\uB958",...e}));ce.displayName="ErrorIcon";export{$ as a,Q as b,kr as c,Y as d,x as e,Cr as f,yr as g,h,cr as i,ur as j,E as k,m as l,te as m,ae as n,se as o,le as p,ce as q};//# sourceMappingURL=chunk-7OYT3QSY.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-7OYT3QSY.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/icons.ts","../src/lib/icon-aliases.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/lib/case-utils.ts","../src/lib/icon-providers.ts","../src/lib/normalize-icon-name.ts","../src/components/Icon/Icon.tsx"],"names":["icons","House","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","ListIcon","X","MagnifyingGlass","Gear","ArrowSquareOut","CaretLeft","CaretRight","CaretDown","CaretUp","Pencil","Trash","Plus","Minus","Download","Upload","ArrowClockwise","FloppyDisk","Copy","SpinnerGap","CheckCircle","XCircle","WarningCircle","Info","Check","Circle","Question","User","Users","UserPlus","SignIn","SignOut","Eye","EyeSlash","ChartBar","TrendUp","Pulse","Database","Lightning","FileText","File","Folder","Book","BookOpen","Envelope","ChatCircle","Phone","Image","Video","Camera","Smiley","SmileySad","SmileyMeh","Lock","LockOpen","Shield","Wallet","Key","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","Sparkle","Globe","DeviceMobile","Ticket","Clipboard","WifiHigh","WifiSlash","Cpu","MaskHappy","Rocket","Layout","Megaphone","Stack","Prohibit","TextB","TextItalic","TextStrikethrough","TextHOne","Link","Code","FileCode","Quotes","List","ListNumbers","emotionIcons","statusIcons","iconCategories","ICON_ALIASES","resolveIconAlias","iconName","getIconAliases","_","target","alias","defaultIconConfig","getDefaultStrokeWidth","set","IconContext","createContext","IconProvider","weight","iconsaxVariant","size","color","strokeWidth","children","value","jsx","useIconContext","useContext","toCamelCase","str","word","index","PhosphorIcons","LucideIcons","PROJECT_ICONS","initPhosphorIcons","initLucideIcons","getIconFromProvider","provider","iconMapping","getIconDirect","mappedName","phosphorName1","phosphorName2","lucideName","camelCaseName","match","getIconNameForProvider","normalizeIconName","camelCased","aliasTarget","IconComponent","React","name","className","emotion","status","animated","pulse","spin","bounce","variant","ariaLabel","ariaHidden","ref","_a","_b","config","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","isClient","setIsClient","providerReady","setProviderReady","resolvedIcon","baseName","normalized","providerName","iconsaxIcon","variantClasses","mergeMap","merge","ResolvedIcon","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","props","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon"],"mappings":"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","file":"chunk-7OYT3QSY.mjs","sourcesContent":["/**\n * Core Icons (Phosphor Icons)\n *\n * 핵심 아이콘만 포함하여 번들 크기를 최적화합니다.\n * 나머지 아이콘은 동적 fallback으로 처리됩니다.\n *\n * 포함 기준:\n * 1. my-app에서 실제 사용 중인 아이콘\n * 2. UI 컴포넌트에서 자주 사용되는 아이콘\n * 3. 각 카테고리의 대표 아이콘\n *\n * 새로운 아이콘이 필요하면 동적 fallback이 자동으로 처리합니다.\n */\n\nimport {\n // Navigation\n House,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowDown,\n List as ListIcon,\n X,\n MagnifyingGlass,\n Gear,\n ArrowSquareOut,\n CaretLeft,\n CaretRight,\n CaretDown,\n CaretUp,\n\n // Actions\n Pencil,\n Trash,\n Plus,\n Minus,\n Download,\n Upload,\n ArrowClockwise,\n FloppyDisk,\n Copy,\n\n // Text Formatting (Markdown Toolbar)\n TextB,\n TextItalic,\n TextStrikethrough,\n TextHOne,\n Link,\n Code,\n FileCode,\n Quotes,\n List,\n ListNumbers,\n\n // Status & Feedback\n SpinnerGap,\n CheckCircle,\n XCircle,\n WarningCircle,\n Info,\n Check,\n Circle,\n Question,\n\n // User & Auth\n User,\n Users,\n UserPlus,\n SignIn,\n SignOut,\n Eye,\n EyeSlash,\n\n // Data & Analytics\n ChartBar,\n TrendUp,\n Pulse,\n Database,\n Lightning,\n\n // Files & Content\n FileText,\n File,\n Folder,\n Book,\n BookOpen,\n\n // Communication\n Envelope,\n ChatCircle,\n Phone,\n\n // Media\n Image,\n Video,\n Camera,\n\n // Emotions\n Smiley,\n SmileySad,\n SmileyMeh,\n\n // Security\n Lock,\n LockOpen,\n Shield,\n Wallet,\n Key,\n\n // Time & Date\n Clock,\n Calendar,\n CalendarPlus,\n\n // UI Elements\n Bell,\n Heart,\n Star,\n Bookmark,\n Share,\n\n // Theme\n Monitor,\n Sun,\n Moon,\n\n // Additional\n Lightbulb,\n Brain,\n Flag,\n Square,\n Sparkle,\n Globe,\n DeviceMobile,\n Ticket,\n Clipboard,\n WifiHigh,\n WifiSlash,\n Cpu,\n MaskHappy,\n Rocket,\n\n // Admin\n Layout,\n Megaphone,\n Stack,\n Prohibit,\n} from '@phosphor-icons/react/dist/ssr'\n\n// 핵심 아이콘 객체 (키는 기존과 동일, 값만 Phosphor로 교체)\nexport const icons = {\n // Navigation\n home: House,\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n arrowUp: ArrowUp,\n arrowDown: ArrowDown,\n menu: ListIcon,\n close: X,\n search: MagnifyingGlass,\n settings: Gear,\n externalLink: ArrowSquareOut,\n chevronLeft: CaretLeft,\n chevronRight: CaretRight,\n chevronDown: CaretDown,\n chevronUp: CaretUp,\n\n // Actions\n edit: Pencil,\n delete: Trash,\n add: Plus,\n remove: Minus,\n download: Download,\n upload: Upload,\n refresh: ArrowClockwise,\n save: FloppyDisk,\n copy: Copy,\n\n // Status & Feedback\n loader: SpinnerGap,\n success: CheckCircle,\n error: XCircle,\n alertCircle: WarningCircle,\n warning: WarningCircle,\n info: Info,\n check: Check,\n circle: Circle,\n helpCircle: Question,\n\n // User & Auth\n user: User,\n users: Users,\n userPlus: UserPlus,\n logIn: SignIn,\n logOut: SignOut,\n eye: Eye,\n eyeOff: EyeSlash,\n\n // Data & Analytics\n chart: ChartBar,\n barChart: ChartBar,\n trendingUp: TrendUp,\n activity: Pulse,\n database: Database,\n zap: Lightning,\n\n // Files & Content\n fileText: FileText,\n file: File,\n folder: Folder,\n book: Book,\n bookOpen: BookOpen,\n\n // Communication\n mail: Envelope,\n message: ChatCircle,\n phone: Phone,\n\n // Media\n image: Image,\n video: Video,\n camera: Camera,\n\n // Emotions\n smile: Smiley,\n frown: SmileySad,\n meh: SmileyMeh,\n\n // Security\n lock: Lock,\n unlock: LockOpen,\n shield: Shield,\n wallet: Wallet,\n key: Key,\n\n // Time & Date\n clock: Clock,\n calendar: Calendar,\n calendarPlus: CalendarPlus,\n\n // UI Elements\n bell: Bell,\n heart: Heart,\n star: Star,\n bookmark: Bookmark,\n share: Share,\n\n // Theme\n monitor: Monitor,\n sun: Sun,\n moon: Moon,\n\n // Additional\n lightbulb: Lightbulb,\n brain: Brain,\n flag: Flag,\n square: Square,\n sparkle: Sparkle,\n sparkles: Sparkle,\n globe: Globe,\n smartphone: DeviceMobile,\n deviceMobile: DeviceMobile,\n floppyDisk: FloppyDisk,\n\n // Connectivity\n ticket: Ticket,\n clipboard: Clipboard,\n wifi: WifiHigh,\n wifiOff: WifiSlash,\n cpu: Cpu,\n mask: MaskHappy,\n rocket: Rocket,\n\n // Admin\n layout: Layout,\n megaphone: Megaphone,\n layers: Stack,\n ban: Prohibit,\n\n // Text Formatting (Markdown Toolbar)\n bold: TextB,\n italic: TextItalic,\n strikethrough: TextStrikethrough,\n heading: TextHOne,\n link: Link,\n code: Code,\n fileCode: FileCode,\n quote: Quotes,\n list: List,\n listOrdered: ListNumbers,\n minus: Minus,\n} as const\n\n// 아이콘 이름 타입\nexport type IconName = keyof typeof icons\n\n// 감정별 아이콘 매핑\nexport const emotionIcons = {\n happy: 'smile',\n sad: 'frown',\n neutral: 'meh',\n excited: 'smile',\n angry: 'frown',\n love: 'heart',\n like: 'heart',\n dislike: 'frown',\n} as const\n\n// 상태별 아이콘 매핑\nexport const statusIcons = {\n loading: 'loader',\n success: 'success',\n error: 'error',\n warning: 'warning',\n info: 'info',\n locked: 'lock',\n unlocked: 'unlock',\n visible: 'eye',\n hidden: 'eyeOff',\n} as const\n\n// 아이콘 카테고리별 그룹화 (참고용)\nexport const iconCategories = {\n navigation: ['home', 'arrowLeft', 'arrowRight', 'arrowUp', 'arrowDown', 'menu', 'close', 'search', 'settings', 'externalLink', 'chevronLeft', 'chevronRight', 'chevronDown', 'chevronUp'],\n actions: ['edit', 'delete', 'add', 'remove', 'download', 'upload', 'refresh', 'save', 'copy'],\n status: ['loader', 'success', 'error', 'alertCircle', 'warning', 'info', 'check', 'circle'],\n user: ['user', 'users', 'userPlus', 'logIn', 'logOut', 'eye', 'eyeOff'],\n data: ['chart', 'barChart', 'trendingUp', 'activity', 'database', 'zap'],\n files: ['fileText', 'file', 'folder', 'book'],\n communication: ['mail', 'message', 'phone'],\n media: ['image', 'video', 'camera'],\n emotions: ['smile', 'frown', 'meh'],\n security: ['lock', 'unlock', 'shield'],\n time: ['clock', 'calendar'],\n ui: ['bell', 'heart', 'star', 'bookmark', 'share'],\n theme: ['monitor', 'sun', 'moon'],\n} as const\n","/**\n * Icon Aliases\n * \n * 여러 이름이 같은 아이콘을 가리키도록 하는 alias 시스템\n * DX 향상을 위해 직관적인 이름들을 지원합니다.\n */\n\nexport const ICON_ALIASES: Record<string, string> = {\n // kebab-case → camelCase mappings (자동 변환 지원)\n 'arrow-left': 'arrowLeft',\n 'arrow-right': 'arrowRight',\n 'arrow-up': 'arrowUp',\n 'arrow-down': 'arrowDown',\n 'chevron-left': 'chevronLeft',\n 'chevron-right': 'chevronRight',\n 'chevron-up': 'chevronUp',\n 'chevron-down': 'chevronDown',\n 'external-link': 'externalLink',\n 'more-horizontal': 'moreHorizontal',\n 'more-vertical': 'moreVertical',\n 'user-plus': 'userPlus',\n 'log-in': 'logIn',\n 'log-out': 'logOut',\n 'check-circle': 'checkCircle',\n 'check-square': 'checkSquare',\n 'alert-circle': 'alertCircle',\n 'eye-off': 'eyeOff',\n 'file-text': 'fileText',\n 'book-open': 'bookOpen',\n 'bar-chart': 'barChart',\n 'trending-up': 'trendingUp',\n 'trending-down': 'trendingDown',\n 'message-square': 'messageSquare',\n 'calendar-plus': 'calendarPlus',\n 'refresh-cw': 'refreshCw',\n 'dollar-sign': 'dollarSign',\n 'layout-dashboard': 'layoutDashboard',\n 'device-mobile': 'deviceMobile',\n 'floppy-disk': 'floppyDisk',\n\n // Navigation aliases\n 'back': 'arrowLeft',\n 'prev': 'arrowLeft',\n 'previous': 'arrowLeft',\n 'forward': 'arrowRight',\n 'next': 'arrowRight',\n \n // Close aliases\n 'close': 'x',\n 'cancel': 'x',\n \n // Delete aliases\n 'remove': 'delete',\n 'trash': 'delete',\n \n // Add aliases\n 'plus': 'add',\n 'new': 'add',\n \n // Edit aliases\n 'pencil': 'edit',\n 'modify': 'edit',\n \n // Save aliases\n 'store': 'save',\n 'floppy': 'save',\n \n // Search aliases\n 'magnify': 'search',\n \n // User aliases\n 'person': 'user',\n 'account': 'user',\n 'profile': 'user',\n \n // Settings aliases\n 'gear': 'settings',\n 'config': 'settings',\n 'preferences': 'settings',\n \n // Home aliases\n 'house': 'home',\n 'main': 'home',\n \n // Check aliases\n 'done': 'check',\n 'complete': 'check',\n 'tick': 'check',\n \n // Info aliases\n 'information': 'info',\n 'help': 'info',\n \n // Warning aliases\n 'alert': 'warning',\n 'caution': 'warning',\n \n // Success aliases\n 'checkmark': 'success',\n 'checkCircle': 'success',\n \n // Error aliases\n 'fail': 'error',\n 'cross': 'error',\n 'xCircle': 'error',\n \n // Loading aliases\n 'spinner': 'loader',\n 'loading': 'loader',\n 'wait': 'loader',\n \n // Refresh aliases\n 'reload': 'refresh',\n 'update': 'refresh',\n 'sync': 'refresh',\n \n // Eye aliases\n 'show': 'eye',\n 'view': 'eye',\n 'hide': 'eyeOff',\n 'hidden': 'eyeOff',\n \n // Lock aliases\n 'secure': 'lock',\n 'locked': 'lock',\n 'unsecure': 'unlock',\n 'unlocked': 'unlock',\n \n // Download aliases\n 'get': 'download',\n 'fetch': 'download',\n \n // Upload aliases\n 'post': 'upload',\n \n // Share aliases\n 'send': 'share',\n 'export': 'share',\n \n // Copy aliases\n 'duplicate': 'copy',\n 'clone': 'copy',\n \n // Mail aliases\n 'email': 'mail',\n 'envelope': 'mail',\n \n // Message aliases\n 'chat': 'message',\n 'comment': 'message',\n 'talk': 'message',\n \n // Calendar aliases\n 'date': 'calendar',\n 'schedule': 'calendar',\n \n // Clock aliases\n 'time': 'clock',\n 'watch': 'clock',\n \n // File aliases\n 'document': 'fileText',\n 'doc': 'fileText',\n 'text': 'fileText',\n \n // Folder aliases\n 'directory': 'folder',\n 'dir': 'folder',\n \n // Image aliases\n 'picture': 'image',\n 'img': 'image',\n \n // Video aliases\n 'movie': 'video',\n 'film': 'video',\n \n // Camera aliases\n 'photo': 'camera',\n 'capture': 'camera',\n \n // Play aliases\n 'start': 'play',\n 'run': 'play',\n \n // Pause aliases\n 'stop': 'pause',\n 'halt': 'pause',\n \n // Heart aliases\n 'like': 'heart',\n 'love': 'heart',\n \n // Star aliases\n 'favorite': 'star',\n \n // Bookmark aliases\n 'saveBookmark': 'bookmark',\n \n // Bell aliases\n 'notification': 'bell',\n 'notify': 'bell',\n 'alarm': 'bell',\n \n // Settings aliases\n 'prefs': 'settings',\n \n // Search aliases (duplicate removed - see line 37)\n 'lookup': 'search',\n \n // More aliases\n 'dots': 'moreHorizontal',\n 'moreMenu': 'moreHorizontal',\n 'moreOptions': 'moreVertical',\n \n // External link aliases\n 'external': 'externalLink',\n 'outbound': 'externalLink',\n 'open': 'externalLink',\n \n // Link aliases\n 'url': 'link',\n 'hyperlink': 'link',\n \n // Chart aliases\n 'graph': 'barChart',\n 'stats': 'barChart',\n 'analytics': 'barChart',\n \n // Database aliases\n 'db': 'database',\n 'storage': 'database',\n \n // Activity aliases\n 'pulse': 'activity',\n 'monitor': 'activity',\n \n // Trending aliases\n 'up': 'trendingUp',\n 'down': 'trendingDown',\n \n // Zap aliases\n 'lightning': 'zap',\n 'bolt': 'zap',\n 'flash': 'zap',\n \n // Shield aliases\n 'security': 'shield',\n 'protect': 'shield',\n \n // Key aliases\n 'password': 'key',\n 'secret': 'key',\n \n // Log in aliases\n 'signin': 'logIn',\n 'login': 'logIn',\n 'enter': 'logIn',\n \n // Log out aliases\n 'signout': 'logOut',\n 'logout': 'logOut',\n 'exit': 'logOut',\n \n // Users aliases\n 'people': 'users',\n 'group': 'users',\n 'team': 'users',\n \n // User plus aliases\n 'addUser': 'userPlus',\n 'invite': 'userPlus',\n \n // Book aliases\n 'read': 'book',\n 'library': 'book',\n \n // Book open aliases\n 'reading': 'bookOpen',\n 'openBook': 'bookOpen',\n \n // Sun aliases\n 'light': 'sun',\n 'day': 'sun',\n \n // Moon aliases\n 'dark': 'moon',\n 'night': 'moon',\n \n // Monitor aliases\n 'screen': 'monitor',\n 'display': 'monitor',\n \n // Brain aliases\n 'ai': 'brain',\n 'intelligence': 'brain',\n 'think': 'brain',\n \n // Lightbulb aliases\n 'idea': 'lightbulb',\n 'bulb': 'lightbulb',\n 'inspiration': 'lightbulb',\n \n // Sparkles aliases\n 'magic': 'sparkles',\n 'stars': 'sparkles',\n 'glitter': 'sparkles',\n} as const\n\n/**\n * Resolve icon alias to actual icon name\n * \n * @param iconName - 아이콘 이름 또는 별칭 / Icon name or alias\n * @returns 실제 아이콘 이름 / Actual icon name\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function resolveIconAlias(iconName: string): string {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return ICON_ALIASES[iconName] || iconName;\n}\n\n/**\n * Get all aliases for an icon name\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @returns 해당 아이콘의 모든 별칭 배열 / Array of all aliases for the icon\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function getIconAliases(iconName: string): string[] {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return Object.entries(ICON_ALIASES)\n .filter(([_, target]) => target === iconName)\n .map(([alias]) => alias);\n}\n\n\n","/**\n * Icon Config Types\n *\n * Icon 시스템의 설정 타입 정의\n * 상태관리는 서비스 레벨에서 관리 (Zustand 등)\n */\n\nexport type IconSet = 'lucide' | 'phosphor' | 'iconsax'\n\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'duotone' | 'fill'\n\nexport type IconsaxVariant = 'line' | 'bold'\n\nexport interface IconConfig {\n set: IconSet\n weight: PhosphorWeight\n size: number\n color: string\n strokeWidth?: number // Lucide용\n iconsaxVariant?: IconsaxVariant // Iconsax용 (line | bold)\n}\n\nexport const defaultIconConfig: IconConfig = {\n set: 'phosphor',\n weight: 'regular',\n size: 20,\n color: 'currentColor',\n strokeWidth: 1.25,\n iconsaxVariant: 'line',\n}\n\n/**\n * 세트별 기본 strokeWidth\n */\nexport const getDefaultStrokeWidth = (set: IconSet): number => {\n switch (set) {\n case 'lucide':\n return 1.25\n case 'phosphor':\n return 1.25 // Phosphor는 weight 사용\n case 'iconsax':\n return 1.5\n default:\n return 1.25\n }\n}\n","'use client'\n\n/**\n * IconProvider - Icon 시스템 전역 설정 Provider\n *\n * React Context를 사용하여 전역 아이콘 설정을 제공합니다.\n *\n * @example\n * ```tsx\n * <IconProvider set=\"phosphor\" weight=\"regular\" size={20}>\n * <App />\n * </IconProvider>\n * ```\n */\n\nimport React, { createContext, useContext } from 'react'\nimport { type IconConfig, type IconSet, type PhosphorWeight, type IconsaxVariant, defaultIconConfig } from './icon-store'\n\n/**\n * IconProvider 컴포넌트 Props\n */\nexport interface IconProviderProps {\n /** 아이콘 세트 (lucide, phosphor, iconsax) */\n set?: IconSet\n /** Phosphor 아이콘 weight */\n weight?: PhosphorWeight\n /** Iconsax 아이콘 변형 (line, bold) */\n iconsaxVariant?: IconsaxVariant\n /** 기본 아이콘 크기 */\n size?: number\n /** 기본 아이콘 색상 */\n color?: string\n /** Lucide/Iconsax 아이콘 stroke width */\n strokeWidth?: number\n /** 자식 컴포넌트 */\n children: React.ReactNode\n}\n\ninterface IconContextValue extends IconConfig {}\n\nconst IconContext = createContext<IconContextValue>(defaultIconConfig)\n\nexport function IconProvider({\n set = defaultIconConfig.set,\n weight = defaultIconConfig.weight,\n iconsaxVariant = defaultIconConfig.iconsaxVariant,\n size = defaultIconConfig.size,\n color = defaultIconConfig.color,\n strokeWidth = defaultIconConfig.strokeWidth,\n children,\n}: IconProviderProps) {\n const value: IconContextValue = {\n set,\n weight,\n iconsaxVariant,\n size,\n color,\n strokeWidth,\n }\n\n return (\n <IconContext.Provider value={value}>\n {children}\n </IconContext.Provider>\n )\n}\n\nexport function useIconContext(): IconContextValue {\n return useContext(IconContext)\n}\n\n// Re-export types for convenience\nexport type { IconSet, PhosphorWeight, IconsaxVariant, IconConfig } from './icon-store'\nexport { defaultIconConfig, getDefaultStrokeWidth } from './icon-store'\n","/**\n * Case Conversion Utilities\n *\n * 문자열 케이스 변환 유틸리티 함수들입니다.\n * Utility functions for string case conversion.\n */\n\n/**\n * 문자열을 camelCase로 변환합니다.\n * Converts a string to camelCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns camelCase 문자열 / camelCase string\n *\n * @example\n * toCamelCase('arrow-left') // 'arrowLeft'\n * toCamelCase('arrow_left') // 'arrowLeft'\n * toCamelCase('ArrowLeft') // 'arrowLeft'\n * toCamelCase('arrowLeft') // 'arrowLeft'\n * toCamelCase('HEART') // 'heart'\n */\nexport function toCamelCase(str: string): string {\n if (!str) return str\n\n // 이미 camelCase인지 확인 (kebab/snake가 아니고 첫 글자가 소문자)\n if (!/[-_]/.test(str) && /^[a-z]/.test(str)) {\n return str\n }\n\n // 전체가 대문자인 경우 (HEART, USER 등) → 전체 소문자로\n if (/^[A-Z]+$/.test(str)) {\n return str.toLowerCase()\n }\n\n // PascalCase를 camelCase로 변환 (ArrowLeft → arrowLeft)\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str.charAt(0).toLowerCase() + str.slice(1)\n }\n\n // kebab-case 또는 snake_case를 camelCase로 변환\n return str\n .split(/[-_]/)\n .map((word, index) => {\n if (index === 0) {\n return word.toLowerCase()\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n })\n .join('')\n}\n\n/**\n * 문자열을 PascalCase로 변환합니다.\n * Converts a string to PascalCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns PascalCase 문자열 / PascalCase string\n *\n * @example\n * toPascalCase('arrow-left') // 'ArrowLeft'\n * toPascalCase('arrow_left') // 'ArrowLeft'\n * toPascalCase('arrowLeft') // 'ArrowLeft'\n * toPascalCase('ArrowLeft') // 'ArrowLeft'\n */\nexport function toPascalCase(str: string): string {\n if (!str) return str\n\n // 이미 PascalCase인지 확인\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str\n }\n\n // kebab-case 또는 snake_case가 포함된 경우\n if (/[-_]/.test(str)) {\n return str\n .split(/[-_]/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n }\n\n // camelCase를 PascalCase로 변환\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n","/**\n * Icon Provider System\n *\n * 각 프로바이더별 로딩 전략 / Loading strategies per provider:\n *\n * 1. Phosphor Icons (https://phosphoricons.com) - default\n * - Official package: @phosphor-icons/react (MIT License)\n * - icons.ts에서 정적 import (SSR-safe /dist/ssr)\n * - PROJECT_ICONS 매핑으로 통합 이름 지원\n * - 폴백: initPhosphorIcons()로 동적 namespace 조회\n *\n * 2. Lucide Icons (https://lucide.dev) - deprecated, backward compat\n * - initLucideIcons() 호출 시에만 로드 / Lazy loaded on demand\n * - 향후 제거 예정 / Will be removed in future\n *\n * 3. Iconsax Icons (https://iconsax.io) - separate entry\n * - '@hua-labs/ui/iconsax'에서 import 시 자동 등록\n * - 코어 번들에 포함되지 않음 / Not in core bundle\n * - registerIconsaxResolver()로 lazy 연결\n */\n\nimport { toPascalCase } from './case-utils'\n\n// Phosphor Icons - lazy loaded (전체 namespace import 방지, createContext SSR 이슈)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet PhosphorIcons: any = null\n\n// Lucide Icons - lazy loaded (하위호환, deprecated)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet LucideIcons: any = null\n\n// Iconsax resolver - registered lazily when iconsax entry is loaded\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet iconsaxResolver: ((name: string, variant?: string) => any) | null = null\n\n/**\n * Register iconsax resolver (called from iconsax entry point).\n * Allows the core Icon component to resolve iconsax icons\n * without statically importing the iconsax bundle.\n */\nexport function registerIconsaxResolver(resolver: typeof iconsaxResolver) {\n iconsaxResolver = resolver\n}\n\n/**\n * Get registered iconsax resolver\n */\nexport function getIconsaxResolver() {\n return iconsaxResolver\n}\n\n// Icon Provider Type\nexport type IconProvider = 'lucide' | 'phosphor' | 'iconsax'\n\n// Icon Provider Configuration\nexport interface IconProviderConfig {\n provider: IconProvider\n prefix?: string\n}\n\n/**\n * Project-specific icon list\n * These are the icons actually used in SumUp project\n * Only these icons will be loaded for optimal bundle size\n */\nexport const PROJECT_ICONS = {\n // Navigation & Layout\n 'home': { lucide: 'Home', phosphor: 'House', iconsax: 'Home2' },\n 'layout-dashboard': { lucide: 'LayoutDashboard', phosphor: 'SquaresFour' },\n 'folder': { lucide: 'Folder', phosphor: 'Folder', iconsax: 'Folder' },\n 'alert-circle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'alertCircle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'columns': { lucide: 'Columns', phosphor: 'Columns' },\n 'users': { lucide: 'Users', phosphor: 'Users', iconsax: 'People' },\n 'settings': { lucide: 'Settings', phosphor: 'Gear' },\n 'menu': { lucide: 'Menu', phosphor: 'List', iconsax: 'Menu' },\n 'close': { lucide: 'X', phosphor: 'X', iconsax: 'CloseCircle' },\n 'chevronLeft': { lucide: 'ChevronLeft', phosphor: 'CaretLeft', iconsax: 'ArrowLeft2' },\n 'chevronRight': { lucide: 'ChevronRight', phosphor: 'CaretRight', iconsax: 'ArrowRight2' },\n 'chevronDown': { lucide: 'ChevronDown', phosphor: 'CaretDown', iconsax: 'ArrowDown2' },\n 'chevronUp': { lucide: 'ChevronUp', phosphor: 'CaretUp', iconsax: 'ArrowUp2' },\n 'arrowLeft': { lucide: 'ArrowLeft', phosphor: 'ArrowLeft', iconsax: 'ArrowLeft' },\n 'arrowRight': { lucide: 'ArrowRight', phosphor: 'ArrowRight', iconsax: 'ArrowRight' },\n 'arrowUp': { lucide: 'ArrowUp', phosphor: 'ArrowUp', iconsax: 'ArrowUp' },\n 'arrowDown': { lucide: 'ArrowDown', phosphor: 'ArrowDown', iconsax: 'ArrowDown' },\n\n // Actions\n 'add': { lucide: 'Plus', phosphor: 'Plus', iconsax: 'Add' },\n 'edit': { lucide: 'Edit', phosphor: 'Pencil' },\n 'pencil': { lucide: 'Pencil', phosphor: 'Pencil' },\n 'delete': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'trash': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'upload': { lucide: 'Upload', phosphor: 'Upload', iconsax: 'Upload' },\n 'download': { lucide: 'Download', phosphor: 'Download', iconsax: 'Download' },\n 'x': { lucide: 'X', phosphor: 'X' },\n 'check': { lucide: 'Check', phosphor: 'Check', iconsax: 'Check' },\n 'search': { lucide: 'Search', phosphor: 'MagnifyingGlass', iconsax: 'SearchNormal' },\n 'share': { lucide: 'Share', phosphor: 'Share' },\n 'copy': { lucide: 'Copy', phosphor: 'Copy' },\n 'save': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Status & Feedback\n 'loader': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'loader2': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'check-circle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'checkCircle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'success': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'error': { lucide: 'XCircle', phosphor: 'XCircle', iconsax: 'CloseCircle' },\n 'warning': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Warning2' },\n 'info': { lucide: 'Info', phosphor: 'Info', iconsax: 'InfoCircle' },\n 'refresh': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'refreshCw': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'bell': { lucide: 'Bell', phosphor: 'Bell', iconsax: 'Bell' },\n 'heart': { lucide: 'Heart', phosphor: 'Heart', iconsax: 'Heart' },\n 'star': { lucide: 'Star', phosphor: 'Star', iconsax: 'Star' },\n 'bookmark': { lucide: 'Bookmark', phosphor: 'Bookmark' },\n\n // User & Auth\n 'user': { lucide: 'User', phosphor: 'User', iconsax: 'User' },\n 'userPlus': { lucide: 'UserPlus', phosphor: 'UserPlus', iconsax: 'UserAdd' },\n 'logIn': { lucide: 'LogIn', phosphor: 'SignIn', iconsax: 'Login' },\n 'logOut': { lucide: 'LogOut', phosphor: 'SignOut', iconsax: 'Logout' },\n 'chrome': { lucide: 'Chrome', phosphor: 'ChromeLogo', iconsax: 'Chrome' },\n 'github': { lucide: 'Github', phosphor: 'GithubLogo' },\n 'message': { lucide: 'MessageCircle', phosphor: 'ChatCircle' },\n\n // Content\n 'messageSquare': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'message-square': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'inbox': { lucide: 'Inbox', phosphor: 'Inbox' },\n 'calendar': { lucide: 'Calendar', phosphor: 'Calendar' },\n 'calendarPlus': { lucide: 'CalendarPlus', phosphor: 'CalendarPlus' },\n 'checkSquare': { lucide: 'CheckSquare', phosphor: 'CheckSquare', iconsax: 'TickSquare' },\n 'clock': { lucide: 'Clock', phosphor: 'Clock' },\n 'book': { lucide: 'Book', phosphor: 'Book', iconsax: 'Book' },\n 'bookOpen': { lucide: 'BookOpen', phosphor: 'BookOpen', iconsax: 'Book' },\n\n // Theme & UI\n 'monitor': { lucide: 'Monitor', phosphor: 'Monitor', iconsax: 'Monitor' },\n 'sun': { lucide: 'Sun', phosphor: 'Sun', iconsax: 'Sun' },\n 'moon': { lucide: 'Moon', phosphor: 'Moon', iconsax: 'Moon' },\n\n // AI & Features\n 'sparkle': { lucide: 'Sparkle', phosphor: 'Sparkle' },\n 'sparkles': { lucide: 'Sparkles', phosphor: 'Sparkle' },\n 'lightbulb': { lucide: 'Lightbulb', phosphor: 'Lightbulb' },\n 'brain': { lucide: 'Brain', phosphor: 'Brain' },\n 'zap': { lucide: 'Zap', phosphor: 'Lightning' },\n\n // Device & Platform\n 'globe': { lucide: 'Globe', phosphor: 'Globe', iconsax: 'Global' },\n 'deviceMobile': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'smartphone': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'floppyDisk': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Data & Analytics\n 'chart': { lucide: 'BarChart3', phosphor: 'ChartBar' },\n 'barChart': { lucide: 'BarChart', phosphor: 'ChartBar' },\n 'trendingUp': { lucide: 'TrendingUp', phosphor: 'TrendUp' },\n 'trendingDown': { lucide: 'TrendingDown', phosphor: 'TrendDown' },\n 'activity': { lucide: 'Activity', phosphor: 'Pulse' },\n 'database': { lucide: 'Database', phosphor: 'Database' },\n 'dollarSign': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'dollar': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'currency': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n\n 'layers': { lucide: 'Layers', phosphor: 'Stack' },\n 'ban': { lucide: 'Ban', phosphor: 'Prohibit' },\n\n // Security\n 'lock': { lucide: 'Lock', phosphor: 'Lock', iconsax: 'Lock' },\n 'unlock': { lucide: 'Unlock', phosphor: 'LockOpen', iconsax: 'Unlock' },\n 'shield': { lucide: 'Shield', phosphor: 'Shield', iconsax: 'Shield' },\n 'key': { lucide: 'Key', phosphor: 'Key' },\n\n // Media\n 'play': { lucide: 'Play', phosphor: 'Play', iconsax: 'Play' },\n 'pause': { lucide: 'Pause', phosphor: 'Pause', iconsax: 'Pause' },\n 'image': { lucide: 'Image', phosphor: 'Image', iconsax: 'Image' },\n 'video': { lucide: 'Video', phosphor: 'Video', iconsax: 'Video' },\n 'camera': { lucide: 'Camera', phosphor: 'Camera', iconsax: 'Camera' },\n\n // Files\n 'fileText': { lucide: 'FileText', phosphor: 'FileText' },\n 'file': { lucide: 'File', phosphor: 'File' },\n\n // Navigation\n 'externalLink': { lucide: 'ExternalLink', phosphor: 'ArrowSquareOut' },\n 'link': { lucide: 'Link', phosphor: 'Link', iconsax: 'Link' },\n 'moreHorizontal': { lucide: 'MoreHorizontal', phosphor: 'DotsThreeOutline' },\n 'moreVertical': { lucide: 'MoreVertical', phosphor: 'DotsThreeVertical' },\n\n // Priority\n 'remove': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n\n // Eye (password)\n 'eye': { lucide: 'Eye', phosphor: 'Eye', iconsax: 'Eye' },\n 'eyeOff': { lucide: 'EyeOff', phosphor: 'EyeSlash', iconsax: 'EyeSlash' },\n\n // Emotions\n 'smile': { lucide: 'Smile', phosphor: 'Smiley', iconsax: 'EmojiHappy' },\n 'frown': { lucide: 'Frown', phosphor: 'SmileySad', iconsax: 'EmojiSad' },\n 'meh': { lucide: 'Meh', phosphor: 'SmileyMeh', iconsax: 'EmojiNormal' },\n\n // Social\n 'mail': { lucide: 'Mail', phosphor: 'Envelope' },\n 'phone': { lucide: 'Phone', phosphor: 'Phone' },\n\n // Additional\n 'flag': { lucide: 'Flag', phosphor: 'Flag', iconsax: 'Flag' },\n 'rocket': { lucide: 'Rocket', phosphor: 'Rocket', iconsax: 'Rocket' },\n\n // Connectivity & Misc\n 'ticket': { lucide: 'Ticket', phosphor: 'Ticket', iconsax: 'Ticket' },\n 'clipboard': { lucide: 'ClipboardList', phosphor: 'Clipboard', iconsax: 'Sticker' },\n 'wifi': { lucide: 'Wifi', phosphor: 'WifiHigh', iconsax: 'Wifi' },\n 'wifiOff': { lucide: 'WifiOff', phosphor: 'WifiSlash' },\n 'cpu': { lucide: 'Cpu', phosphor: 'Cpu', iconsax: 'Computing' },\n 'mask': { lucide: 'Drama', phosphor: 'MaskHappy', iconsax: 'EmojiHappy' },\n\n // Text Formatting (Markdown Toolbar)\n 'bold': { lucide: 'Bold', phosphor: 'TextB' },\n 'italic': { lucide: 'Italic', phosphor: 'TextItalic' },\n 'strikethrough': { lucide: 'Strikethrough', phosphor: 'TextStrikethrough' },\n 'heading': { lucide: 'Heading', phosphor: 'TextHOne' },\n 'code': { lucide: 'Code', phosphor: 'Code', iconsax: 'Code' },\n 'fileCode': { lucide: 'FileCode', phosphor: 'FileCode' },\n 'quote': { lucide: 'Quote', phosphor: 'Quotes', iconsax: 'QuoteUp' },\n 'list': { lucide: 'List', phosphor: 'List' },\n 'listOrdered': { lucide: 'ListOrdered', phosphor: 'ListNumbers' },\n 'minus': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n} as const\n\n/**\n * Initialize Phosphor Icons (lazy load for fallback/dynamic lookup)\n * icons.ts의 개별 import와 별개로, PROJECT_ICONS fallback용\n */\nexport async function initPhosphorIcons() {\n if (typeof window === 'undefined') return null\n\n if (!PhosphorIcons) {\n try {\n const phosphorModule = await import('@phosphor-icons/react')\n PhosphorIcons = phosphorModule\n } catch {\n console.warn('Phosphor Icons not available. Install @phosphor-icons/react to use.')\n return null\n }\n }\n return PhosphorIcons\n}\n\n/**\n * Initialize Lucide Icons (lazy load)\n */\nexport async function initLucideIcons() {\n if (typeof window === 'undefined') return null\n\n if (!LucideIcons) {\n try {\n const lucideModule = await import('lucide-react')\n LucideIcons = lucideModule\n } catch {\n console.warn('Lucide Icons not available. Install lucide-react to use lucide provider.')\n return null\n }\n }\n return LucideIcons\n}\n\n/**\n * Get icon from provider\n * Only resolves icons that are in PROJECT_ICONS for optimal bundle size\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nexport function getIconFromProvider(\n iconName: string,\n provider: IconProvider = 'phosphor'\n): React.ComponentType<Record<string, unknown>> | null {\n // Check if icon is in project icon list\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n\n if (!iconMapping) {\n // Fallback to direct lookup for backward compatibility\n return getIconDirect(iconName, provider)\n }\n\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n\n switch (provider) {\n case 'phosphor':\n if (!mappedName || !PhosphorIcons) return null\n return PhosphorIcons?.[mappedName] || null\n\n case 'lucide':\n if (!mappedName || !LucideIcons) {\n return null\n }\n return LucideIcons?.[mappedName] || null\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = mappedName || toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Direct icon lookup (fallback for icons not in PROJECT_ICONS)\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nfunction getIconDirect(\n iconName: string,\n provider: IconProvider\n): React.ComponentType<Record<string, unknown>> | null {\n switch (provider) {\n case 'phosphor': {\n if (!PhosphorIcons) return null\n const phosphorName1 = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const phosphorName2 = iconName\n .split(/(?=[A-Z])/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n return PhosphorIcons?.[phosphorName1] ||\n PhosphorIcons?.[phosphorName2] ||\n PhosphorIcons?.[iconName] ||\n null\n }\n\n case 'lucide': {\n if (!LucideIcons) {\n return null\n }\n const lucideName = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const camelCaseName = iconName.replace(/([A-Z])/g, (match) =>\n match === iconName[0] ? match.toLowerCase() : match\n )\n return LucideIcons?.[lucideName] ||\n LucideIcons?.[iconName] ||\n LucideIcons?.[camelCaseName] ||\n null\n }\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Get icon name for provider\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 프로바이더별 아이콘 이름 / Icon name for provider\n */\nexport function getIconNameForProvider(\n iconName: string,\n provider: IconProvider\n): string {\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (iconMapping) {\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n if (mappedName) {\n return mappedName\n }\n }\n return iconName\n}\n\n/**\n * Get all project icon names\n */\nexport function getProjectIconNames(): string[] {\n return Object.keys(PROJECT_ICONS)\n}\n","/**\n * Icon Name Normalization System\n *\n * 아이콘 이름 정규화를 위한 통합 시스템입니다.\n *\n * Features:\n * - kebab-case → camelCase conversion\n * - snake_case → camelCase conversion\n * - PascalCase → camelCase conversion\n * - Alias resolution\n * - Provider-specific name mapping\n */\n\nimport { ICON_ALIASES } from './icon-aliases'\nimport { toCamelCase, toPascalCase } from './case-utils'\n\n// Re-export case utils for backward compatibility\nexport { toCamelCase, toPascalCase } from './case-utils'\n\n// IconProvider type (avoid circular dependency with icon-providers.ts)\nexport type IconProviderType = 'lucide' | 'phosphor' | 'iconsax'\n\n/**\n * 정규화 결과 인터페이스\n */\nexport interface NormalizeResult {\n /** 정규화된 아이콘 이름 (camelCase) */\n normalized: string\n /** 원본 이름이 alias였는지 여부 */\n wasAlias: boolean\n /** 원본 alias 이름 (alias였던 경우) */\n originalAlias?: string\n}\n\n/**\n * 아이콘 이름을 정규화합니다.\n *\n * @example\n * normalizeIconName('arrow-left') // { normalized: 'arrowLeft', wasAlias: false }\n * normalizeIconName('back') // { normalized: 'arrowLeft', wasAlias: true, originalAlias: 'back' }\n * normalizeIconName('ArrowLeft') // { normalized: 'arrowLeft', wasAlias: false }\n */\nexport function normalizeIconName(iconName: string): NormalizeResult {\n if (!iconName || typeof iconName !== 'string') {\n return { normalized: iconName || '', wasAlias: false }\n }\n\n const camelCased = toCamelCase(iconName)\n const aliasTarget = ICON_ALIASES[iconName] || ICON_ALIASES[camelCased]\n\n if (aliasTarget) {\n return {\n normalized: aliasTarget,\n wasAlias: true,\n originalAlias: iconName\n }\n }\n\n return {\n normalized: camelCased,\n wasAlias: false\n }\n}\n\n/**\n * 프로바이더별 아이콘 이름을 반환합니다.\n *\n * @example\n * getProviderIconName('arrowLeft', 'lucide') // 'ArrowLeft'\n * getProviderIconName('heart', 'iconsax') // 'Heart'\n */\nexport function getProviderIconName(\n normalizedName: string,\n provider: IconProviderType\n): string {\n switch (provider) {\n case 'lucide':\n case 'phosphor':\n case 'iconsax':\n return toPascalCase(normalizedName)\n default:\n return normalizedName\n }\n}\n","import React from 'react'\nimport type { IconProps as PhosphorIconProps } from '@phosphor-icons/react'\nimport { merge, mergeMap } from '../../lib/utils'\nimport { icons, IconName, emotionIcons, statusIcons } from '../../lib/icons'\nimport { getIconFromProvider, getIconsaxResolver, initPhosphorIcons, initLucideIcons, getIconNameForProvider } from '../../lib/icon-providers'\nimport { normalizeIconName } from '../../lib/normalize-icon-name'\nimport { useIconContext, type IconSet } from './IconProvider'\nimport { type PhosphorWeight } from './icon-store'\nimport type { AllIconName } from '../../lib/icon-names'\n\n/**\n * Icon 컴포넌트 Props\n */\nexport interface IconProps {\n /** 아이콘 이름 / Icon name */\n name: AllIconName\n /** 아이콘 크기 (숫자 또는 문자열) / Icon size (number or string) */\n size?: number | string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 감정 아이콘 타입 / Emotion icon type */\n emotion?: keyof typeof emotionIcons\n /** 상태 아이콘 타입 / Status icon type */\n status?: keyof typeof statusIcons\n /** 아이콘 프로바이더 오버라이드 / Icon provider override */\n provider?: IconSet\n /** 부드러운 애니메이션 효과 / Smooth animation effect */\n animated?: boolean\n /** 펄스 애니메이션 / Pulse animation */\n pulse?: boolean\n /** 회전 애니메이션 / Spin animation */\n spin?: boolean\n /** 바운스 애니메이션 / Bounce animation */\n bounce?: boolean\n /** 색상 변형 / Color variant */\n variant?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'muted' | 'inherit'\n /** Phosphor 아이콘 weight 오버라이드 / Phosphor icon weight override */\n weight?: PhosphorWeight\n /** 스크린 리더용 라벨 / Screen reader label */\n 'aria-label'?: string\n /** 장식용 아이콘 / Decorative icon (hidden from screen readers) */\n 'aria-hidden'?: boolean\n}\n\n/**\n * Icon 컴포넌트\n *\n * 다중 아이콘 라이브러리(Phosphor, Lucide, Iconsax)를 지원하는 통합 아이콘 컴포넌트.\n * IconProvider를 통해 전역 설정을 관리하며, 개별 아이콘에서도 오버라이드 가능.\n *\n * Iconsax는 별도 entry('@hua-labs/ui/iconsax')를 import해야 동작합니다.\n *\n * @example\n * ```tsx\n * <Icon name=\"heart\" />\n * <Icon name=\"user\" size={24} />\n * <Icon name=\"check\" variant=\"success\" />\n * <Icon name=\"loader\" spin />\n * ```\n */\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(({\n name,\n size,\n className,\n emotion,\n status,\n provider,\n weight,\n animated = false,\n pulse = false,\n spin = false,\n bounce = false,\n variant = 'default',\n 'aria-label': ariaLabel,\n 'aria-hidden': ariaHidden\n}, ref) => {\n const config = useIconContext()\n\n const iconSet = provider || config.set\n const iconSize = size ?? config.size\n const iconWeight = weight || config.weight\n const iconColor = config.color\n const iconStrokeWidth = config.strokeWidth ?? 1.25\n const iconsaxVariant = config.iconsaxVariant ?? 'line'\n\n const [isClient, setIsClient] = React.useState(false)\n const [providerReady, setProviderReady] = React.useState(false)\n\n React.useEffect(() => {\n setIsClient(true)\n\n // Provider별 lazy load 초기화\n if (iconSet === 'lucide') {\n initLucideIcons().then(() => setProviderReady(true))\n } else if (iconSet === 'phosphor') {\n initPhosphorIcons().then(() => setProviderReady(true))\n } else {\n setProviderReady(true)\n }\n }, [iconSet])\n\n // 통합 정규화\n const resolvedIcon = React.useMemo(() => {\n const baseName = emotion ? emotionIcons[emotion] :\n status ? statusIcons[status] : name\n const { normalized } = normalizeIconName(baseName)\n const providerName = getIconNameForProvider(normalized, iconSet)\n return { normalized, providerName }\n }, [name, emotion, status, iconSet])\n\n const iconName = resolvedIcon.normalized as AllIconName\n\n // Iconsax: resolver를 통해 가져오기 (iconsax entry import 시 자동 등록됨)\n const iconsaxIcon = React.useMemo(() => {\n if (iconSet === 'iconsax' && isClient) {\n const resolver = getIconsaxResolver()\n if (resolver) {\n return resolver(resolvedIcon.providerName, iconsaxVariant)\n }\n }\n return null\n }, [iconSet, resolvedIcon.providerName, isClient, iconsaxVariant])\n\n // 색상 변형 클래스\n const variantClasses = mergeMap({\n 'text-current': variant === 'default',\n 'text-primary': variant === 'primary',\n 'text-muted-foreground': variant === 'secondary' || variant === 'muted',\n 'text-green-600 dark:text-green-400': variant === 'success',\n 'text-yellow-600 dark:text-yellow-400': variant === 'warning',\n 'text-destructive': variant === 'error',\n })\n\n // 서버사이드에서는 빈 span 반환\n if (!isClient) {\n return (\n <span\n style={{ width: iconSize, height: iconSize }}\n className={merge(variantClasses, className)}\n aria-hidden={ariaHidden !== undefined ? ariaHidden : true}\n aria-label={ariaLabel}\n />\n )\n }\n\n // Provider에 따라 아이콘 가져오기\n type IconComponentType = React.ComponentType<PhosphorIconProps | React.SVGProps<SVGSVGElement> | Record<string, unknown>>\n let ResolvedIcon: IconComponentType | null = null\n\n if (iconSet === 'phosphor') {\n // 1. icons.ts에서 먼저 찾기 (Phosphor 아이콘이 기본, 정적 import)\n ResolvedIcon = (icons[iconName as IconName] || null) as IconComponentType | null\n // 2. 없으면 동적으로 Phosphor namespace에서 가져오기 (fallback, providerReady 필요)\n if (!ResolvedIcon && providerReady) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else if (iconSet === 'iconsax') {\n ResolvedIcon = iconsaxIcon as IconComponentType | null\n if (!ResolvedIcon) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else {\n // Lucide나 다른 provider\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n\n if (!ResolvedIcon) {\n if (iconSet === 'iconsax' && !getIconsaxResolver()) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `Icon \"${iconName}\" — iconsax resolver not registered. ` +\n `Use HuaProvider with icons.set='iconsax', or add: import '@hua-labs/ui/iconsax'`\n )\n }\n } else {\n console.warn(`Icon \"${iconName}\" not found for provider \"${iconSet}\"`)\n }\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center rounded-full border-2 border-dashed border-border',\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n aria-label={ariaLabel || `아이콘을 찾을 수 없음: ${iconName}`}\n title={`Icon not found: ${iconName}`}\n >\n <span className=\"text-xs text-muted-foreground\" aria-hidden=\"true\">\n ?\n </span>\n </span>\n )\n }\n\n // 세트별 props 준비\n type IconPropsType = PhosphorIconProps & {\n size?: number\n width?: number | string\n height?: number | string\n color?: string\n weight?: PhosphorWeight\n strokeWidth?: number\n }\n\n const iconProps: IconPropsType = {\n size: typeof iconSize === 'number' ? iconSize : undefined,\n width: typeof iconSize === 'string' ? iconSize : iconSize,\n height: typeof iconSize === 'string' ? iconSize : iconSize,\n color: iconColor,\n } as IconPropsType\n\n if (iconSet === 'phosphor') {\n iconProps.weight = iconWeight\n } else {\n iconProps.strokeWidth = iconStrokeWidth\n }\n\n const animationClasses = mergeMap({\n 'animate-pulse': pulse,\n 'animate-spin': spin,\n 'animate-bounce': bounce,\n 'transition-all duration-200 ease-in-out': animated,\n })\n\n const accessibilityProps: React.AriaAttributes = {}\n\n if (ariaLabel) {\n accessibilityProps['aria-label'] = ariaLabel\n accessibilityProps['aria-hidden'] = false\n } else if (ariaHidden !== undefined) {\n accessibilityProps['aria-hidden'] = ariaHidden\n } else {\n accessibilityProps['aria-hidden'] = true\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center',\n animationClasses,\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n {...accessibilityProps}\n >\n {ResolvedIcon && React.createElement(ResolvedIcon, {\n ...iconProps,\n className: variantClasses,\n 'aria-hidden': true\n } as React.ComponentProps<typeof ResolvedIcon>)}\n </span>\n )\n})\n\nIconComponent.displayName = 'Icon'\n\nconst MemoizedIcon = React.memo(IconComponent, (prevProps, nextProps) => {\n return (\n prevProps.name === nextProps.name &&\n prevProps.size === nextProps.size &&\n prevProps.className === nextProps.className &&\n prevProps.emotion === nextProps.emotion &&\n prevProps.status === nextProps.status &&\n prevProps.provider === nextProps.provider &&\n prevProps.animated === nextProps.animated &&\n prevProps.pulse === nextProps.pulse &&\n prevProps.spin === nextProps.spin &&\n prevProps.bounce === nextProps.bounce &&\n prevProps.variant === nextProps.variant &&\n prevProps.weight === nextProps.weight &&\n prevProps['aria-label'] === nextProps['aria-label'] &&\n prevProps['aria-hidden'] === nextProps['aria-hidden']\n )\n})\n\nexport const Icon = MemoizedIcon as typeof IconComponent\nIcon.displayName = 'Icon'\n\nexport const EmotionIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { emotion: keyof typeof emotionIcons }>(\n (props, ref) => <Icon ref={ref} name=\"smile\" {...props} />\n)\nEmotionIcon.displayName = 'EmotionIcon'\n\nexport const StatusIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { status: keyof typeof statusIcons }>(\n (props, ref) => <Icon ref={ref} name=\"info\" {...props} />\n)\nStatusIcon.displayName = 'StatusIcon'\n\nexport const LoadingIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"loader\" status=\"loading\" spin aria-label=\"로딩 중\" {...props} />\n )\n)\nLoadingIcon.displayName = 'LoadingIcon'\n\nexport const SuccessIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"check\" status=\"success\" variant=\"success\" aria-label=\"성공\" {...props} />\n )\n)\nSuccessIcon.displayName = 'SuccessIcon'\n\nexport const ErrorIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"alertCircle\" status=\"error\" variant=\"error\" aria-label=\"오류\" {...props} />\n )\n)\nErrorIcon.displayName = 'ErrorIcon'\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {l}from'./chunk-7OYT3QSY.mjs';import {b}from'./chunk-U6CTBZ2U.mjs';import i from'react';import {jsxs,jsx}from'react/jsx-runtime';var V=i.forwardRef(({className:t,trigger:e,children:o,open:s,onOpenChange:r,placement:l="bottom",align:y="start",offset:b$1=8,disabled:L=false,showArrow:k=true,...A},E)=>{let[H,c]=i.useState(false),[N,T]=i.useState({x:0,y:0}),w=i.useRef(null),x=i.useRef(null),g=s!==void 0,v=g?s:H,R=i.useCallback(a=>{L||(g||c(a),r==null||r(a));},[L,g,r]),M=()=>{R(!v);},d=i.useCallback(()=>{if(!w.current||!x.current)return;let a=w.current.getBoundingClientRect(),u=x.current.getBoundingClientRect(),S=window.innerWidth,z=window.innerHeight,f=0,m=0;switch(l){case "top":f=a.left,m=a.top-b$1;break;case "bottom":f=a.left,m=a.bottom+b$1;break;case "left":f=a.left-b$1,m=a.top;break;case "right":f=a.right+b$1,m=a.top;break}switch(y){case "center":l==="top"||l==="bottom"?f=a.left+a.width/2-u.width/2:m=a.top+a.height/2-u.height/2;break;case "end":l==="top"||l==="bottom"?f=a.right-u.width:m=a.bottom-u.height;break;}f<8&&(f=8),f+u.width>S-8&&(f=S-u.width-8),m<8&&(m=8),m+u.height>z-8&&(m=z-u.height-8),T({x:f,y:m});},[l,y,b$1]);i.useEffect(()=>{if(v)return d(),window.addEventListener("resize",d),window.addEventListener("scroll",d),()=>{window.removeEventListener("resize",d),window.removeEventListener("scroll",d);}},[v,d]),i.useEffect(()=>{let a=u=>{w.current&&x.current&&!w.current.contains(u.target)&&!x.current.contains(u.target)&&R(false);};if(v)return document.addEventListener("mousedown",a),()=>{document.removeEventListener("mousedown",a);}},[v,R]);let C=()=>{switch(l){case "top":return "bottom-full left-0 mb-2";case "bottom":return "top-full left-0 mt-2";case "left":return "right-full top-0 mr-2";case "right":return "left-full top-0 ml-2";default:return "top-full left-0 mt-2"}},F=()=>{switch(l){case "top":return "top-full left-4 -translate-x-1/2 border-t-gray-100 dark:border-t-gray-800";case "bottom":return "bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800";case "left":return "left-full top-4 -translate-y-1/2 border-l-gray-100 dark:border-l-gray-800";case "right":return "right-full top-4 -translate-y-1/2 border-r-gray-100 dark:border-r-gray-800";default:return "bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800"}};return jsxs("div",{ref:E,className:b("relative",t),...A,children:[jsx("div",{ref:w,onClick:M,className:"inline-block cursor-pointer",children:e}),v&&jsxs("div",{ref:x,className:b("absolute z-50 bg-[var(--dropdown-bg)] rounded-lg shadow-xl backdrop-blur-sm","min-w-[200px] py-2",C()),style:{transform:`translate(${N.x}px, ${N.y}px)`,boxShadow:"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)"},children:[k&&jsx("div",{className:b("absolute w-0 h-0 border-4 border-transparent",F())}),jsx("div",{className:"relative z-10",children:o})]})]})});V.displayName="Dropdown";var G=i.forwardRef(({className:t,icon:e,variant:o="default",children:s,disabled:r,...l},y)=>jsxs("button",{ref:y,className:b("w-full flex items-center gap-3 px-4 py-3 text-sm font-medium transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:bg-muted",(()=>{switch(o){case "destructive":return "text-destructive hover:bg-destructive/10";case "disabled":return "text-muted-foreground cursor-not-allowed";default:return "text-foreground hover:bg-muted"}})(),t),disabled:r||o==="disabled",...l,children:[e&&jsx("div",{className:"flex-shrink-0 w-4 h-4",children:e}),jsx("span",{className:"flex-1 text-left",children:s})]}));G.displayName="DropdownItem";var K=i.forwardRef(({className:t,...e},o)=>jsx("div",{ref:o,className:b("h-px bg-border my-2",t),...e}));K.displayName="DropdownSeparator";var W=i.forwardRef(({className:t,children:e,...o},s)=>jsx("div",{ref:s,className:b("px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide",t),...o,children:e}));W.displayName="DropdownLabel";var $=i.forwardRef(({className:t,children:e,...o},s)=>jsx("div",{ref:s,className:b("py-1",t),...o,children:e}));$.displayName="DropdownMenu";var _=i.forwardRef(({className:t,children:e,...o},s)=>jsx("div",{ref:s,className:b("space-y-1",t),...o,children:e}));_.displayName="DropdownGroup";var j=i.forwardRef(({isOpen:t,onClose:e,children:o,className:s,side:r="right",size:l="md",showBackdrop:y=true,backdropClassName:b$1,closeOnBackdropClick:L=true,closeOnEscape:k=true,closable:A=true,...E},H)=>{let c=t!=null?t:false,N=()=>{e==null||e();},[T,w]=i.useState(false),[x,g]=i.useState(false);if(i.useEffect(()=>{if(c){w(true),g(true);let d=setTimeout(()=>g(false),50);return ()=>clearTimeout(d)}else {g(true);let d=setTimeout(()=>{w(false),g(false);},300);return ()=>clearTimeout(d)}},[c]),i.useEffect(()=>{if(!k)return;let d=C=>{C.key==="Escape"&&c&&N();};return c&&(document.addEventListener("keydown",d),document.body.style.overflow="hidden"),()=>{document.removeEventListener("keydown",d),document.body.style.overflow="";}},[c,k]),!T)return null;let v={sm:r==="left"||r==="right"?"w-80":"h-64",md:r==="left"||r==="right"?"w-96":"h-96",lg:r==="left"||r==="right"?"w-[28rem]":"h-[32rem]",xl:r==="left"||r==="right"?"w-[32rem]":"h-[40rem]",full:r==="left"||r==="right"?"w-full":"h-full"},R={left:"left-0 top-0 h-full",right:"right-0 top-0 h-full",top:"top-0 left-0 w-full",bottom:"bottom-0 left-0 w-full"},M={left:c?"translate-x-0":"-translate-x-full",right:c?"translate-x-0":"translate-x-full",top:c?"translate-y-0":"-translate-y-full",bottom:c?"translate-y-0":"translate-y-full"};return jsxs("div",{className:"fixed inset-0 z-50",children:[y&&jsx("div",{className:b("absolute inset-0 bg-black/85 backdrop-blur-md transition-opacity duration-300",x?c?"opacity-100":"opacity-0":"",b$1),onClick:L?N:void 0}),jsx("div",{ref:H,className:b("absolute bg-background/95 backdrop-blur-xl border border-border/50 shadow-2xl transition-transform duration-300 ease-out",v[l],R[r],M[r],s),...E,children:o})]})});j.displayName="Drawer";var q=i.forwardRef(({children:t,className:e,showCloseButton:o=true,onClose:s,...r},l$1)=>jsxs("div",{ref:l$1,className:b("flex items-center justify-between p-6 border-b border-border/50",e),...r,children:[jsx("div",{className:"flex-1",children:t}),o&&jsx("button",{onClick:s,className:"p-2 rounded-lg hover:bg-muted transition-colors",children:jsx(l,{name:"close",size:20})})]}));q.displayName="DrawerHeader";var J=i.forwardRef(({children:t,className:e,...o},s)=>jsx("div",{ref:s,className:b("flex-1 p-6 overflow-y-auto",e),...o,children:t}));J.displayName="DrawerContent";var Q=i.forwardRef(({children:t,className:e,...o},s)=>jsx("div",{ref:s,className:b("flex items-center justify-end gap-3 p-6 border-t border-border/50",e),...o,children:t}));Q.displayName="DrawerFooter";export{V as a,G as b,K as c,W as d,$ as e,_ as f,j as g,q as h,J as i,Q as j};//# sourceMappingURL=chunk-ANYZ56VB.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-ANYZ56VB.mjs.map
|