@hua-labs/ui 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -67
- package/dist/{ComponentLayout-btJq4TjA.d.mts → ComponentLayout-BhM4VSoq.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.mjs +3 -3
- package/dist/advanced-dashboard.mjs.map +1 -1
- package/dist/advanced-emotion.mjs +1 -1
- package/dist/advanced-motion.d.mts +74 -7
- package/dist/advanced-motion.mjs +1 -1
- package/dist/advanced.d.mts +4 -4
- package/dist/advanced.mjs +3 -3
- package/dist/advanced.mjs.map +1 -1
- package/dist/{chunk-GLZKT7JN.mjs → chunk-5DPW7SVD.mjs} +3 -3
- package/dist/{chunk-GLZKT7JN.mjs.map → chunk-5DPW7SVD.mjs.map} +1 -1
- package/dist/{chunk-X7ZIWYRC.mjs → chunk-5L5HIPKA.mjs} +2 -2
- package/dist/{chunk-X7ZIWYRC.mjs.map → chunk-5L5HIPKA.mjs.map} +1 -1
- package/dist/chunk-A5YOVVM5.mjs +3 -0
- package/dist/chunk-A5YOVVM5.mjs.map +1 -0
- package/dist/chunk-CNW22G24.mjs +13 -0
- package/dist/chunk-CNW22G24.mjs.map +1 -0
- package/dist/chunk-CW66UBQG.mjs +3 -0
- package/dist/chunk-CW66UBQG.mjs.map +1 -0
- package/dist/chunk-EAZEI74V.mjs +3 -0
- package/dist/chunk-EAZEI74V.mjs.map +1 -0
- package/dist/{chunk-LH77I6HO.mjs → chunk-EPY3432E.mjs} +2 -2
- package/dist/{chunk-LH77I6HO.mjs.map → chunk-EPY3432E.mjs.map} +1 -1
- package/dist/{chunk-SGEP3CQE.mjs → chunk-F2M4YDDQ.mjs} +2 -2
- package/dist/{chunk-SGEP3CQE.mjs.map → chunk-F2M4YDDQ.mjs.map} +1 -1
- package/dist/chunk-FHMFDCX2.mjs +3 -0
- package/dist/chunk-FHMFDCX2.mjs.map +1 -0
- package/dist/chunk-HBIUCLFL.mjs +3 -0
- package/dist/chunk-HBIUCLFL.mjs.map +1 -0
- package/dist/{chunk-LOYAJIWO.mjs → chunk-HEBXAFRY.mjs} +2 -2
- package/dist/{chunk-LOYAJIWO.mjs.map → chunk-HEBXAFRY.mjs.map} +1 -1
- package/dist/chunk-IG47LMOD.mjs +3 -0
- package/dist/chunk-IG47LMOD.mjs.map +1 -0
- package/dist/{chunk-IFSEJVOR.mjs → chunk-J47ZEXEL.mjs} +2 -2
- package/dist/{chunk-IFSEJVOR.mjs.map → chunk-J47ZEXEL.mjs.map} +1 -1
- package/dist/{chunk-IN7RWQCJ.mjs → chunk-K2FOFIST.mjs} +2 -2
- package/dist/{chunk-IN7RWQCJ.mjs.map → chunk-K2FOFIST.mjs.map} +1 -1
- package/dist/{chunk-UWHCM3S6.mjs → chunk-LL6QPRD7.mjs} +2 -2
- package/dist/{chunk-UWHCM3S6.mjs.map → chunk-LL6QPRD7.mjs.map} +1 -1
- package/dist/{chunk-PAEKNQWW.mjs → chunk-NMJLOK6M.mjs} +2 -2
- package/dist/{chunk-PAEKNQWW.mjs.map → chunk-NMJLOK6M.mjs.map} +1 -1
- package/dist/chunk-O24K56OS.mjs +3 -0
- package/dist/chunk-O24K56OS.mjs.map +1 -0
- package/dist/chunk-OIWG3IJ7.mjs +3 -0
- package/dist/chunk-OIWG3IJ7.mjs.map +1 -0
- package/dist/{chunk-VWSBJUNI.mjs → chunk-OLLU7ZFH.mjs} +2 -2
- package/dist/{chunk-VWSBJUNI.mjs.map → chunk-OLLU7ZFH.mjs.map} +1 -1
- package/dist/chunk-Q76JW7X5.mjs +73 -0
- package/dist/chunk-Q76JW7X5.mjs.map +1 -0
- package/dist/chunk-QEMPERUK.mjs +3 -0
- package/dist/chunk-QEMPERUK.mjs.map +1 -0
- package/dist/{chunk-XV3Y7QVU.mjs → chunk-QRM66RQG.mjs} +2 -2
- package/dist/{chunk-XV3Y7QVU.mjs.map → chunk-QRM66RQG.mjs.map} +1 -1
- package/dist/{chunk-6KTHJ3EL.mjs → chunk-QRRP7TGF.mjs} +3 -3
- package/dist/{chunk-6KTHJ3EL.mjs.map → chunk-QRRP7TGF.mjs.map} +1 -1
- package/dist/chunk-SD6XGDAC.mjs +3 -0
- package/dist/chunk-SD6XGDAC.mjs.map +1 -0
- package/dist/chunk-SDFVGFXT.mjs +3 -0
- package/dist/chunk-SDFVGFXT.mjs.map +1 -0
- package/dist/{chunk-N7M6RIN4.mjs → chunk-SMLDNOV3.mjs} +3 -3
- package/dist/{chunk-N7M6RIN4.mjs.map → chunk-SMLDNOV3.mjs.map} +1 -1
- package/dist/{chunk-NBJUE7NR.mjs → chunk-TAP6MYDW.mjs} +2 -2
- package/dist/{chunk-NBJUE7NR.mjs.map → chunk-TAP6MYDW.mjs.map} +1 -1
- package/dist/{chunk-PYBYZVSL.mjs → chunk-TBZ645BI.mjs} +2 -2
- package/dist/{chunk-PYBYZVSL.mjs.map → chunk-TBZ645BI.mjs.map} +1 -1
- package/dist/{chunk-C4OACMTB.mjs → chunk-V2DNYJR6.mjs} +2 -2
- package/dist/{chunk-C4OACMTB.mjs.map → chunk-V2DNYJR6.mjs.map} +1 -1
- package/dist/chunk-VBABZXL7.mjs +3 -0
- package/dist/chunk-VBABZXL7.mjs.map +1 -0
- package/dist/{chunk-OSCMSA2Q.mjs → chunk-WYBSHTGY.mjs} +2 -2
- package/dist/{chunk-OSCMSA2Q.mjs.map → chunk-WYBSHTGY.mjs.map} +1 -1
- package/dist/chunk-ZQUMJQYV.mjs +3 -0
- package/dist/chunk-ZQUMJQYV.mjs.map +1 -0
- package/dist/chunk-ZY23NOT4.mjs +3 -0
- package/dist/chunk-ZY23NOT4.mjs.map +1 -0
- package/dist/components/Action.d.ts.map +1 -1
- package/dist/components/Badge.d.ts +1 -1
- package/dist/components/Button.d.ts.map +1 -1
- package/dist/components/Card.d.ts.map +1 -1
- package/dist/components/DatePicker.d.ts.map +1 -1
- package/dist/components/Dropdown.d.ts +0 -50
- package/dist/components/Dropdown.d.ts.map +1 -1
- package/dist/components/Icon/Icon.d.ts.map +1 -1
- package/dist/components/Modal.d.ts.map +1 -1
- package/dist/components/Popover.d.ts +2 -0
- package/dist/components/Popover.d.ts.map +1 -1
- package/dist/components/Progress.d.ts +3 -2
- 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/Carousel.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/Parallax.d.ts +9 -6
- package/dist/components/advanced/Parallax.d.ts.map +1 -1
- package/dist/components/advanced/TextReveal.d.ts.map +1 -1
- package/dist/components/advanced/index.d.ts +6 -0
- package/dist/components/advanced/index.d.ts.map +1 -1
- package/dist/data.mjs +1 -1
- package/dist/data.mjs.map +1 -1
- package/dist/feedback.mjs +1 -1
- package/dist/form.mjs +3 -3
- package/dist/form.mjs.map +1 -1
- package/dist/{icons-Bj_nr8Ba.d.mts → icons-DcOBy9Hf.d.mts} +10 -1
- package/dist/iconsax-extended.mjs +2 -2
- package/dist/iconsax-extended.mjs.map +1 -1
- package/dist/index.d.mts +10 -109
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +14 -14
- package/dist/index.mjs.map +1 -1
- package/dist/interactive.mjs +1 -1
- package/dist/interactive.mjs.map +1 -1
- package/dist/landing/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.mjs +31 -0
- package/dist/landing.mjs.map +1 -0
- package/dist/lib/icon-providers.d.ts +9 -25
- package/dist/lib/icon-providers.d.ts.map +1 -1
- package/dist/lib/icons.d.ts +10 -1
- package/dist/lib/icons.d.ts.map +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/navigation.d.mts +1 -1
- package/dist/navigation.mjs +1 -1
- package/dist/navigation.mjs.map +1 -1
- package/dist/overlay.d.mts +2 -50
- package/dist/overlay.mjs +1 -1
- package/dist/overlay.mjs.map +1 -1
- package/dist/sdui.mjs +1 -1
- package/dist/sdui.mjs.map +1 -1
- package/dist/theme.d.mts +85 -0
- package/dist/theme.d.ts +14 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.mjs +3 -0
- package/dist/theme.mjs.map +1 -0
- package/package.json +30 -20
- package/src/styles/landing.css +107 -0
- package/src/styles/utilities.css +58 -0
- package/dist/advanced-dashboard.js +0 -39
- package/dist/advanced-dashboard.js.map +0 -1
- package/dist/advanced-emotion.js +0 -2
- package/dist/advanced-emotion.js.map +0 -1
- package/dist/advanced-motion.js +0 -82
- package/dist/advanced-motion.js.map +0 -1
- package/dist/advanced.js +0 -112
- package/dist/advanced.js.map +0 -1
- package/dist/chunk-BXX2TZUB.mjs +0 -3
- package/dist/chunk-BXX2TZUB.mjs.map +0 -1
- package/dist/chunk-COR6CDMA.mjs +0 -83
- package/dist/chunk-COR6CDMA.mjs.map +0 -1
- package/dist/chunk-FFH4ZFKS.mjs +0 -3
- package/dist/chunk-FFH4ZFKS.mjs.map +0 -1
- package/dist/chunk-HN5LSP6L.mjs +0 -3
- package/dist/chunk-HN5LSP6L.mjs.map +0 -1
- package/dist/chunk-LPAG7DCA.mjs +0 -3
- package/dist/chunk-LPAG7DCA.mjs.map +0 -1
- package/dist/chunk-QQCELXFD.mjs +0 -3
- package/dist/chunk-QQCELXFD.mjs.map +0 -1
- 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-SDFHJ4GB.mjs.map +0 -1
- package/dist/chunk-UUHAXGMO.mjs +0 -3
- package/dist/chunk-UUHAXGMO.mjs.map +0 -1
- package/dist/data.js +0 -3
- package/dist/data.js.map +0 -1
- package/dist/feedback.js +0 -12
- package/dist/feedback.js.map +0 -1
- package/dist/form.js +0 -8
- package/dist/form.js.map +0 -1
- package/dist/iconsax-extended.js +0 -3
- package/dist/iconsax-extended.js.map +0 -1
- package/dist/iconsax.js +0 -3
- package/dist/iconsax.js.map +0 -1
- package/dist/index.js +0 -51
- package/dist/index.js.map +0 -1
- package/dist/interactive.js +0 -2
- package/dist/interactive.js.map +0 -1
- package/dist/lib/phosphor-icons.d.ts +0 -6
- package/dist/lib/phosphor-icons.d.ts.map +0 -1
- package/dist/navigation.js +0 -12
- package/dist/navigation.js.map +0 -1
- package/dist/overlay.js +0 -3
- package/dist/overlay.js.map +0 -1
- package/dist/sdui.js +0 -9
- package/dist/sdui.js.map +0 -1
package/dist/interactive.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export{a as Accordion,d as AccordionContent,b as AccordionItem,c as AccordionTrigger,f as Tabs,k as TabsCards,e as TabsContent,g as TabsList,i as TabsPills,h as TabsTrigger,j as TabsUnderline}from'./chunk-XV3Y7QVU.mjs';import'./chunk-HN5LSP6L.mjs';import {a}from'./chunk-UUHAXGMO.mjs';import l from'react';import {jsx,jsxs}from'react/jsx-runtime';var z=l.forwardRef(({className:n,children:e,variant:t="default",size:o="md",...m},d)=>{let c=()=>{switch(t){case "horizontal":return "flex items-center space-x-1";case "vertical":return "flex flex-col space-y-1";case "compact":return "flex flex-col space-y-0.5";default:return "flex flex-col space-y-1"}},p=()=>{switch(o){case "sm":return "text-sm";case "lg":return "text-base";default:return "text-sm"}};return jsx("div",{ref:d,className:a(c(),p(),n),...m,children:l.Children.map(e,f=>l.isValidElement(f)?l.cloneElement(f,{variant:t,size:o}):f)})});z.displayName="Menu";var K=l.forwardRef(({className:n,icon:e,variant:t="default",size:o="md",active:m=false,disabled:d=false,children:c,...p},f)=>{let S=()=>{switch(t){case "horizontal":return a("flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors",m?"bg-primary/10 text-primary":"text-foreground hover:text-foreground hover:bg-muted");case "vertical":return a("flex items-center gap-3 px-4 py-3 rounded-md text-sm font-medium transition-colors",m?"bg-primary/10 text-primary":"text-foreground hover:text-foreground hover:bg-muted");case "compact":return a("flex items-center gap-2 px-2 py-1.5 rounded text-sm font-medium transition-colors",m?"bg-primary/10 text-primary":"text-foreground hover:text-foreground hover:bg-muted");default:return a("flex items-center gap-3 px-4 py-3 rounded-md text-sm font-medium transition-colors",m?"bg-primary/10 text-primary":"text-foreground hover:text-foreground hover:bg-muted")}},k=()=>{switch(o){case "sm":return "text-xs";case "lg":return "text-base";default:return "text-sm"}};return jsxs("button",{ref:f,className:a(S(),k(),d&&"opacity-50 cursor-not-allowed",n),disabled:d,...p,children:[e&&jsx("div",{className:"flex-shrink-0 w-4 h-4",children:e}),jsx("span",{className:"flex-1 text-left",children:c})]})});K.displayName="MenuItem";var _=l.forwardRef(({className:n,variant:e="default",...t},o)=>jsx("div",{ref:o,className:a(e==="horizontal"?"w-px h-4 bg-border mx-1":"h-px bg-border my-2",n),...t}));_.displayName="MenuSeparator";var q=l.forwardRef(({className:n,variant:e="default",size:t="md",children:o,...m},d)=>{let c=()=>e==="horizontal"?"px-3 py-1 text-xs font-semibold text-muted-foreground uppercase tracking-wide":"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide",p=()=>{switch(t){case "sm":return "text-xs";case "lg":return "text-sm";default:return "text-xs"}};return jsx("div",{ref:d,className:a(c(),p(),n),...m,children:o})});q.displayName="MenuLabel";var U=l.forwardRef(({className:n,...e},t)=>jsx(z,{ref:t,variant:"horizontal",className:n,...e}));U.displayName="MenuHorizontal";var W=l.forwardRef(({className:n,...e},t)=>jsx(z,{ref:t,variant:"vertical",className:n,...e}));W.displayName="MenuVertical";var F=l.forwardRef(({className:n,...e},t)=>jsx(z,{ref:t,variant:"compact",className:n,...e}));F.displayName="MenuCompact";var X=l.forwardRef(({className:n,children:e,open:t,onOpenChange:o,trigger:m,placement:d="bottom",align:c="start",offset:p=8,disabled:f=false,...S},k)=>{let[V,B]=l.useState(false),[M,R]=l.useState({x:0,y:0}),g=l.useRef(null),T=l.useRef(null),H=t!==void 0,b=H?t:V,y=l.useCallback(i=>{f||(H||B(i),o==null||o(i));},[f,H,o]),C=i=>{if(i.preventDefault(),f)return;i.currentTarget.getBoundingClientRect();let D=i.clientX,r=i.clientY;R({x:D,y:r}),y(true);},L=l.useCallback(()=>{if(!T.current)return;let i=T.current.getBoundingClientRect(),w=window.innerWidth,D=window.innerHeight,r=M.x,s=M.y;r+i.width>w-8&&(r=w-i.width-8),s+i.height>D-8&&(s=D-i.height-8),r<8&&(r=8),s<8&&(s=8),R({x:r,y:s});},[M.x,M.y]);return l.useEffect(()=>{if(b)return L(),window.addEventListener("resize",L),window.addEventListener("scroll",L),()=>{window.removeEventListener("resize",L),window.removeEventListener("scroll",L);}},[b,L]),l.useEffect(()=>{let i=w=>{g.current&&T.current&&!g.current.contains(w.target)&&!T.current.contains(w.target)&&y(false);};if(b)return document.addEventListener("mousedown",i),()=>{document.removeEventListener("mousedown",i);}},[b,y]),jsxs("div",{ref:k,className:a("relative",n),...S,children:[m&&jsx("div",{ref:g,onContextMenu:C,className:"inline-block",children:m}),b&&jsx("div",{ref:T,className:a("fixed z-50 bg-popover text-popover-foreground rounded-lg shadow-xl backdrop-blur-sm","min-w-[200px] py-2","border-0"),style:{left:M.x,top:M.y,boxShadow:"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)"},children:e})]})});X.displayName="ContextMenu";var Y=l.forwardRef(({className:n,icon:e,variant:t="default",children:o,disabled:m,...d},c)=>jsxs("button",{ref:c,className:a("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(t){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"}})(),n),disabled:m||t==="disabled",...d,children:[e&&jsx("div",{className:"flex-shrink-0 w-4 h-4",children:e}),jsx("span",{className:"flex-1 text-left",children:o})]}));Y.displayName="ContextMenuItem";var $=l.forwardRef(({className:n,...e},t)=>jsx("div",{ref:t,className:a("h-px bg-border my-2",n),...e}));$.displayName="ContextMenuSeparator";var J=l.forwardRef(({className:n,children:e,...t},o)=>jsx("div",{ref:o,className:a("px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide",n),...t,children:e}));J.displayName="ContextMenuLabel";var O=l.forwardRef(({className:n,children:e,...t},o)=>jsx("div",{ref:o,className:a("py-1",n),...t,children:e}));O.displayName="ContextMenuGroup";var G=l.forwardRef(({className:n,children:e,open:t,onOpenChange:o,placeholder:m="\uBA85\uB839\uC5B4\uB97C \uAC80\uC0C9\uD558\uC138\uC694...",searchValue:d,onSearchChange:c,disabled:p=false,...f},S)=>{let[k,V]=l.useState(false),[B,M]=l.useState(""),[R,g]=l.useState(0),T=l.useRef(null),H=l.useRef(null),b=l.useRef(null),y=t!==void 0,C=y?t:k,L=d!==void 0?d:B,i=l.useCallback(r=>{p||(y||V(r),o==null||o(r));},[p,y,o]),w=r=>{y||M(r),c==null||c(r),g(0);},D=r=>{var A;if(p)return;let s=(A=b.current)==null?void 0:A.querySelectorAll("[data-command-item]"),P=(s==null?void 0:s.length)||0;switch(r.key){case "ArrowDown":r.preventDefault(),g(N=>(N+1)%P);break;case "ArrowUp":r.preventDefault(),g(N=>(N-1+P)%P);break;case "Enter":{r.preventDefault();let N=s==null?void 0:s[R];N==null||N.click();break}case "Escape":r.preventDefault(),i(false);break}};return l.useEffect(()=>{var r;C&&((r=H.current)==null||r.focus(),g(0));},[C]),l.useEffect(()=>{let r=s=>{s.key==="k"&&(s.metaKey||s.ctrlKey)&&(s.preventDefault(),i(!C)),s.key==="Escape"&&C&&(s.preventDefault(),i(false));};return document.addEventListener("keydown",r),()=>{document.removeEventListener("keydown",r);}},[C,i]),l.useEffect(()=>{var s;let r=(s=b.current)==null?void 0:s.querySelector(`[data-command-item]:nth-child(${R+1})`);r==null||r.scrollIntoView({block:"nearest"});},[R]),jsx("div",{ref:S,className:a("relative",n),...f,children:C&&jsx("div",{ref:T,className:a("fixed inset-0 z-50 bg-black/50 backdrop-blur-sm","flex items-start justify-center pt-16"),onClick:()=>i(false),children:jsxs("div",{className:a("w-full max-w-2xl mx-4 bg-popover text-popover-foreground rounded-lg shadow-2xl","border-0 overflow-hidden"),onClick:r=>r.stopPropagation(),style:{boxShadow:"0 25px 50px -12px rgba(0, 0, 0, 0.25)"},children:[jsxs("div",{className:"p-4 border-b border-border",children:[" ",jsx("input",{ref:H,type:"text",placeholder:m,value:L,onChange:r=>w(r.target.value),onKeyDown:D,className:a("w-full bg-transparent text-lg font-medium outline-none","placeholder:text-muted-foreground","text-foreground")})]}),jsx("div",{ref:b,className:"max-h-96 overflow-y-auto py-2",children:l.Children.map(e,(r,s)=>l.isValidElement(r)?r.type===l.Fragment||typeof r.type=="symbol"?r:l.cloneElement(r,{selected:s===R,onSelect:()=>{var P,A;(A=(P=r.props).onSelect)==null||A.call(P),i(false);}}):r)})]})})})});G.displayName="Command";var Z=l.forwardRef(({className:n,...e},t)=>jsx("input",{ref:t,className:a("flex h-10 w-full rounded-md bg-transparent px-3 py-2 text-sm outline-none","placeholder:text-muted-foreground","disabled:cursor-not-allowed disabled:opacity-50",n),...e}));Z.displayName="CommandInput";var j=l.forwardRef(({className:n,...e},t)=>jsx("div",{ref:t,className:a("max-h-96 overflow-y-auto py-2",n),...e}));j.displayName="CommandList";var ee=l.forwardRef(({className:n,icon:e,selected:t=false,onSelect:o,children:m,...d},c)=>jsxs("button",{ref:c,"data-command-item":true,className:a("relative flex w-full items-center gap-3 rounded-sm px-4 py-3 text-sm","text-foreground","hover:bg-muted","focus:bg-muted","focus:outline-none",t&&"bg-muted","transition-colors",n),onClick:o,...d,children:[e&&jsx("div",{className:"flex-shrink-0 w-4 h-4 text-muted-foreground",children:e}),jsx("span",{className:"flex-1 text-left",children:m})]}));ee.displayName="CommandItem";var te=l.forwardRef(({className:n,heading:e,children:t,...o},m)=>jsxs("div",{ref:m,className:a("py-2",n),...o,children:[" ",e&&jsxs("div",{className:"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide",children:[" ",e]}),jsxs("div",{className:"space-y-1",children:[" ",t]})]}));te.displayName="CommandGroup";var re=l.forwardRef(({className:n,...e},t)=>jsx("div",{ref:t,className:a("h-px bg-border my-2",n),...e}));re.displayName="CommandSeparator";var ne=l.forwardRef(({className:n,children:e="\uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",...t},o)=>jsx("div",{ref:o,className:a("py-8 text-center text-sm text-muted-foreground",n),...t,children:e}));ne.displayName="CommandEmpty";var oe=l.forwardRef(({className:n,...e},t)=>jsx(G,{ref:t,className:n,...e}));oe.displayName="CommandDialog";export{G as Command,oe as CommandDialog,ne as CommandEmpty,te as CommandGroup,Z as CommandInput,ee as CommandItem,j as CommandList,re as CommandSeparator,X as ContextMenu,O as ContextMenuGroup,Y as ContextMenuItem,J as ContextMenuLabel,$ as ContextMenuSeparator,z as Menu,F as MenuCompact,U as MenuHorizontal,K as MenuItem,q as MenuLabel,_ as MenuSeparator,W as MenuVertical};//# sourceMappingURL=interactive.mjs.map
|
|
2
|
+
export{a as Accordion,d as AccordionContent,b as AccordionItem,c as AccordionTrigger,f as Tabs,k as TabsCards,e as TabsContent,g as TabsList,i as TabsPills,h as TabsTrigger,j as TabsUnderline}from'./chunk-QRM66RQG.mjs';import'./chunk-ZQUMJQYV.mjs';import {a}from'./chunk-QEMPERUK.mjs';import'./chunk-EAZEI74V.mjs';import l from'react';import {jsx,jsxs}from'react/jsx-runtime';var z=l.forwardRef(({className:n,children:e,variant:t="default",size:o="md",...m},d)=>{let c=()=>{switch(t){case "horizontal":return "flex items-center space-x-1";case "vertical":return "flex flex-col space-y-1";case "compact":return "flex flex-col space-y-0.5";default:return "flex flex-col space-y-1"}},p=()=>{switch(o){case "sm":return "text-sm";case "lg":return "text-base";default:return "text-sm"}};return jsx("div",{ref:d,className:a(c(),p(),n),...m,children:l.Children.map(e,f=>l.isValidElement(f)?l.cloneElement(f,{variant:t,size:o}):f)})});z.displayName="Menu";var K=l.forwardRef(({className:n,icon:e,variant:t="default",size:o="md",active:m=false,disabled:d=false,children:c,...p},f)=>{let S=()=>{switch(t){case "horizontal":return a("flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors",m?"bg-primary/10 text-primary":"text-foreground hover:text-foreground hover:bg-muted");case "vertical":return a("flex items-center gap-3 px-4 py-3 rounded-md text-sm font-medium transition-colors",m?"bg-primary/10 text-primary":"text-foreground hover:text-foreground hover:bg-muted");case "compact":return a("flex items-center gap-2 px-2 py-1.5 rounded text-sm font-medium transition-colors",m?"bg-primary/10 text-primary":"text-foreground hover:text-foreground hover:bg-muted");default:return a("flex items-center gap-3 px-4 py-3 rounded-md text-sm font-medium transition-colors",m?"bg-primary/10 text-primary":"text-foreground hover:text-foreground hover:bg-muted")}},k=()=>{switch(o){case "sm":return "text-xs";case "lg":return "text-base";default:return "text-sm"}};return jsxs("button",{ref:f,className:a(S(),k(),d&&"opacity-50 cursor-not-allowed",n),disabled:d,...p,children:[e&&jsx("div",{className:"flex-shrink-0 w-4 h-4",children:e}),jsx("span",{className:"flex-1 text-left",children:c})]})});K.displayName="MenuItem";var _=l.forwardRef(({className:n,variant:e="default",...t},o)=>jsx("div",{ref:o,className:a(e==="horizontal"?"w-px h-4 bg-border mx-1":"h-px bg-border my-2",n),...t}));_.displayName="MenuSeparator";var q=l.forwardRef(({className:n,variant:e="default",size:t="md",children:o,...m},d)=>{let c=()=>e==="horizontal"?"px-3 py-1 text-xs font-semibold text-muted-foreground uppercase tracking-wide":"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide",p=()=>{switch(t){case "sm":return "text-xs";case "lg":return "text-sm";default:return "text-xs"}};return jsx("div",{ref:d,className:a(c(),p(),n),...m,children:o})});q.displayName="MenuLabel";var U=l.forwardRef(({className:n,...e},t)=>jsx(z,{ref:t,variant:"horizontal",className:n,...e}));U.displayName="MenuHorizontal";var W=l.forwardRef(({className:n,...e},t)=>jsx(z,{ref:t,variant:"vertical",className:n,...e}));W.displayName="MenuVertical";var F=l.forwardRef(({className:n,...e},t)=>jsx(z,{ref:t,variant:"compact",className:n,...e}));F.displayName="MenuCompact";var X=l.forwardRef(({className:n,children:e,open:t,onOpenChange:o,trigger:m,placement:d="bottom",align:c="start",offset:p=8,disabled:f=false,...S},k)=>{let[V,B]=l.useState(false),[M,R]=l.useState({x:0,y:0}),g=l.useRef(null),T=l.useRef(null),H=t!==void 0,b=H?t:V,y=l.useCallback(i=>{f||(H||B(i),o==null||o(i));},[f,H,o]),C=i=>{if(i.preventDefault(),f)return;i.currentTarget.getBoundingClientRect();let D=i.clientX,r=i.clientY;R({x:D,y:r}),y(true);},L=l.useCallback(()=>{if(!T.current)return;let i=T.current.getBoundingClientRect(),w=window.innerWidth,D=window.innerHeight,r=M.x,s=M.y;r+i.width>w-8&&(r=w-i.width-8),s+i.height>D-8&&(s=D-i.height-8),r<8&&(r=8),s<8&&(s=8),R({x:r,y:s});},[M.x,M.y]);return l.useEffect(()=>{if(b)return L(),window.addEventListener("resize",L),window.addEventListener("scroll",L),()=>{window.removeEventListener("resize",L),window.removeEventListener("scroll",L);}},[b,L]),l.useEffect(()=>{let i=w=>{g.current&&T.current&&!g.current.contains(w.target)&&!T.current.contains(w.target)&&y(false);};if(b)return document.addEventListener("mousedown",i),()=>{document.removeEventListener("mousedown",i);}},[b,y]),jsxs("div",{ref:k,className:a("relative",n),...S,children:[m&&jsx("div",{ref:g,onContextMenu:C,className:"inline-block",children:m}),b&&jsx("div",{ref:T,className:a("fixed z-50 bg-popover text-popover-foreground rounded-lg shadow-xl backdrop-blur-sm","min-w-[200px] py-2","border-0"),style:{left:M.x,top:M.y,boxShadow:"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)"},children:e})]})});X.displayName="ContextMenu";var Y=l.forwardRef(({className:n,icon:e,variant:t="default",children:o,disabled:m,...d},c)=>jsxs("button",{ref:c,className:a("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(t){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"}})(),n),disabled:m||t==="disabled",...d,children:[e&&jsx("div",{className:"flex-shrink-0 w-4 h-4",children:e}),jsx("span",{className:"flex-1 text-left",children:o})]}));Y.displayName="ContextMenuItem";var $=l.forwardRef(({className:n,...e},t)=>jsx("div",{ref:t,className:a("h-px bg-border my-2",n),...e}));$.displayName="ContextMenuSeparator";var J=l.forwardRef(({className:n,children:e,...t},o)=>jsx("div",{ref:o,className:a("px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide",n),...t,children:e}));J.displayName="ContextMenuLabel";var O=l.forwardRef(({className:n,children:e,...t},o)=>jsx("div",{ref:o,className:a("py-1",n),...t,children:e}));O.displayName="ContextMenuGroup";var G=l.forwardRef(({className:n,children:e,open:t,onOpenChange:o,placeholder:m="\uBA85\uB839\uC5B4\uB97C \uAC80\uC0C9\uD558\uC138\uC694...",searchValue:d,onSearchChange:c,disabled:p=false,...f},S)=>{let[k,V]=l.useState(false),[B,M]=l.useState(""),[R,g]=l.useState(0),T=l.useRef(null),H=l.useRef(null),b=l.useRef(null),y=t!==void 0,C=y?t:k,L=d!==void 0?d:B,i=l.useCallback(r=>{p||(y||V(r),o==null||o(r));},[p,y,o]),w=r=>{y||M(r),c==null||c(r),g(0);},D=r=>{var A;if(p)return;let s=(A=b.current)==null?void 0:A.querySelectorAll("[data-command-item]"),P=(s==null?void 0:s.length)||0;switch(r.key){case "ArrowDown":r.preventDefault(),g(N=>(N+1)%P);break;case "ArrowUp":r.preventDefault(),g(N=>(N-1+P)%P);break;case "Enter":{r.preventDefault();let N=s==null?void 0:s[R];N==null||N.click();break}case "Escape":r.preventDefault(),i(false);break}};return l.useEffect(()=>{var r;C&&((r=H.current)==null||r.focus(),g(0));},[C]),l.useEffect(()=>{let r=s=>{s.key==="k"&&(s.metaKey||s.ctrlKey)&&(s.preventDefault(),i(!C)),s.key==="Escape"&&C&&(s.preventDefault(),i(false));};return document.addEventListener("keydown",r),()=>{document.removeEventListener("keydown",r);}},[C,i]),l.useEffect(()=>{var s;let r=(s=b.current)==null?void 0:s.querySelector(`[data-command-item]:nth-child(${R+1})`);r==null||r.scrollIntoView({block:"nearest"});},[R]),jsx("div",{ref:S,className:a("relative",n),...f,children:C&&jsx("div",{ref:T,className:a("fixed inset-0 z-50 bg-black/50 backdrop-blur-sm","flex items-start justify-center pt-16"),onClick:()=>i(false),children:jsxs("div",{className:a("w-full max-w-2xl mx-4 bg-popover text-popover-foreground rounded-lg shadow-2xl","border-0 overflow-hidden"),onClick:r=>r.stopPropagation(),style:{boxShadow:"0 25px 50px -12px rgba(0, 0, 0, 0.25)"},children:[jsxs("div",{className:"p-4 border-b border-border",children:[" ",jsx("input",{ref:H,type:"text",placeholder:m,value:L,onChange:r=>w(r.target.value),onKeyDown:D,className:a("w-full bg-transparent text-lg font-medium outline-none","placeholder:text-muted-foreground","text-foreground")})]}),jsx("div",{ref:b,className:"max-h-96 overflow-y-auto py-2",children:l.Children.map(e,(r,s)=>l.isValidElement(r)?r.type===l.Fragment||typeof r.type=="symbol"?r:l.cloneElement(r,{selected:s===R,onSelect:()=>{var P,A;(A=(P=r.props).onSelect)==null||A.call(P),i(false);}}):r)})]})})})});G.displayName="Command";var Z=l.forwardRef(({className:n,...e},t)=>jsx("input",{ref:t,className:a("flex h-10 w-full rounded-md bg-transparent px-3 py-2 text-sm outline-none","placeholder:text-muted-foreground","disabled:cursor-not-allowed disabled:opacity-50",n),...e}));Z.displayName="CommandInput";var j=l.forwardRef(({className:n,...e},t)=>jsx("div",{ref:t,className:a("max-h-96 overflow-y-auto py-2",n),...e}));j.displayName="CommandList";var ee=l.forwardRef(({className:n,icon:e,selected:t=false,onSelect:o,children:m,...d},c)=>jsxs("button",{ref:c,"data-command-item":true,className:a("relative flex w-full items-center gap-3 rounded-sm px-4 py-3 text-sm","text-foreground","hover:bg-muted","focus:bg-muted","focus:outline-none",t&&"bg-muted","transition-colors",n),onClick:o,...d,children:[e&&jsx("div",{className:"flex-shrink-0 w-4 h-4 text-muted-foreground",children:e}),jsx("span",{className:"flex-1 text-left",children:m})]}));ee.displayName="CommandItem";var te=l.forwardRef(({className:n,heading:e,children:t,...o},m)=>jsxs("div",{ref:m,className:a("py-2",n),...o,children:[" ",e&&jsxs("div",{className:"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide",children:[" ",e]}),jsxs("div",{className:"space-y-1",children:[" ",t]})]}));te.displayName="CommandGroup";var re=l.forwardRef(({className:n,...e},t)=>jsx("div",{ref:t,className:a("h-px bg-border my-2",n),...e}));re.displayName="CommandSeparator";var ne=l.forwardRef(({className:n,children:e="\uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",...t},o)=>jsx("div",{ref:o,className:a("py-8 text-center text-sm text-muted-foreground",n),...t,children:e}));ne.displayName="CommandEmpty";var oe=l.forwardRef(({className:n,...e},t)=>jsx(G,{ref:t,className:n,...e}));oe.displayName="CommandDialog";export{G as Command,oe as CommandDialog,ne as CommandEmpty,te as CommandGroup,Z as CommandInput,ee as CommandItem,j as CommandList,re as CommandSeparator,X as ContextMenu,O as ContextMenuGroup,Y as ContextMenuItem,J as ContextMenuLabel,$ as ContextMenuSeparator,z as Menu,F as MenuCompact,U as MenuHorizontal,K as MenuItem,q as MenuLabel,_ as MenuSeparator,W as MenuVertical};//# sourceMappingURL=interactive.mjs.map
|
|
3
3
|
//# sourceMappingURL=interactive.mjs.map
|
package/dist/interactive.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Menu.tsx","../src/components/ContextMenu.tsx","../src/components/Command.tsx"],"names":["Menu","React","className","children","variant","size","props","ref","getVariantClasses","getSizeClasses","jsx","merge","child","MenuItem","icon","active","disabled","jsxs","MenuSeparator","MenuLabel","MenuHorizontal","MenuVertical","MenuCompact","ContextMenu","controlledOpen","onOpenChange","trigger","_placement","_align","_offset","internalOpen","setInternalOpen","coords","setCoords","triggerRef","menuRef","isControlled","isOpen","handleOpenChange","newOpen","handleContextMenu","event","x","y","updatePosition","menuRect","viewportWidth","viewportHeight","handleClickOutside","ContextMenuItem","ContextMenuSeparator","ContextMenuLabel","ContextMenuGroup","Command","placeholder","controlledSearchValue","onSearchChange","internalSearchValue","setInternalSearchValue","selectedIndex","setSelectedIndex","commandRef","inputRef","listRef","searchValue","handleSearchChange","value","handleKeyDown","_a","items","itemCount","prev","selectedItem","e","index","_b","CommandInput","CommandList","CommandItem","selected","onSelect","CommandGroup","heading","CommandSeparator","CommandEmpty","CommandDialog"],"mappings":"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","file":"interactive.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Menu 컴포넌트의 props / Menu component props\n * @typedef {Object} MenuProps\n * @property {React.ReactNode} children - MenuItem, MenuSeparator, MenuLabel 컴포넌트들 / MenuItem, MenuSeparator, MenuLabel components\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant=\"default\"] - 메뉴 방향 및 스타일 / Menu direction and style\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 메뉴 아이템 크기 / Menu item size\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MenuProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * Menu 컴포넌트 / Menu component\n * \n * 메뉴 리스트를 제공하는 컴포넌트입니다.\n * MenuItem, MenuSeparator, MenuLabel과 함께 사용합니다.\n * \n * Component that provides menu lists.\n * Used with MenuItem, MenuSeparator, and MenuLabel.\n * \n * @component\n * @example\n * // 기본 수직 메뉴 / Basic vertical menu\n * <Menu>\n * <MenuItem icon={<Icon name=\"home\" />}>홈</MenuItem>\n * <MenuItem icon={<Icon name=\"settings\" />}>설정</MenuItem>\n * <MenuSeparator />\n * <MenuItem>로그아웃</MenuItem>\n * </Menu>\n * \n * @example\n * // 수평 메뉴 / Horizontal menu\n * <Menu variant=\"horizontal\">\n * <MenuItem>메뉴 1</MenuItem>\n * <MenuItem>메뉴 2</MenuItem>\n * </Menu>\n * \n * @param {MenuProps} props - Menu 컴포넌트의 props / Menu component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Menu 컴포넌트 / Menu component\n */\nconst Menu = React.forwardRef<HTMLDivElement, MenuProps>(\n ({ \n className, \n children,\n variant = \"default\",\n size = \"md\",\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return \"flex items-center space-x-1\" // 4px 간격\n case \"vertical\":\n return \"flex flex-col space-y-1\" // 4px 간격\n case \"compact\":\n return \"flex flex-col space-y-0.5\" // 2px 간격\n default:\n return \"flex flex-col space-y-1\" // 4px 간격\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-sm\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n variant,\n size\n } as Partial<MenuItemProps | MenuSeparatorProps | MenuLabelProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nMenu.displayName = \"Menu\"\n\n/**\n * MenuItem 컴포넌트의 props / MenuItem component props\n * @typedef {Object} MenuItemProps\n * @property {React.ReactNode} [icon] - 메뉴 아이템 아이콘 / Menu item icon\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant] - 메뉴 변형 (Menu에서 자동 전달) / Menu variant (auto-passed from Menu)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 메뉴 크기 (Menu에서 자동 전달) / Menu size (auto-passed from Menu)\n * @property {boolean} [active=false] - 활성화 상태 / Active state\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface MenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n size?: \"sm\" | \"md\" | \"lg\"\n active?: boolean\n disabled?: boolean\n}\n\n/**\n * MenuItem 컴포넌트 / MenuItem component\n * 메뉴의 개별 아이템을 표시합니다.\n * Displays an individual menu item.\n * \n * @component\n * @param {MenuItemProps} props - MenuItem 컴포넌트의 props / MenuItem component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} MenuItem 컴포넌트 / MenuItem component\n */\nconst MenuItem = React.forwardRef<HTMLButtonElement, MenuItemProps>(\n ({ \n className, \n icon,\n variant = \"default\",\n size = \"md\",\n active = false,\n disabled = false,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return merge(\n \"flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors\", // 12px, 8px 패딩\n active \n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n case \"vertical\":\n return merge(\n \"flex items-center gap-3 px-4 py-3 rounded-md text-sm font-medium transition-colors\", // 16px, 12px 패딩\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n case \"compact\":\n return merge(\n \"flex items-center gap-2 px-2 py-1.5 rounded text-sm font-medium transition-colors\", // 8px, 6px 패딩\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n default:\n return merge(\n \"flex items-center gap-3 px-4 py-3 rounded-md text-sm font-medium transition-colors\", // 16px, 12px 패딩\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-xs\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n disabled={disabled}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nMenuItem.displayName = \"MenuItem\"\n\n/**\n * MenuSeparator 컴포넌트의 props / MenuSeparator component props\n * @typedef {Object} MenuSeparatorProps\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant] - 메뉴 변형 (Menu에서 자동 전달) / Menu variant (auto-passed from Menu)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MenuSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n}\n\n/**\n * MenuSeparator 컴포넌트 / MenuSeparator component\n * 메뉴 아이템들을 구분하는 구분선을 표시합니다.\n * Displays a separator line between menu items.\n * \n * @component\n * @param {MenuSeparatorProps} props - MenuSeparator 컴포넌트의 props / MenuSeparator component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} MenuSeparator 컴포넌트 / MenuSeparator component\n */\nconst MenuSeparator = React.forwardRef<HTMLDivElement, MenuSeparatorProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return \"w-px h-4 bg-border mx-1\" // 4px 여백\n case \"vertical\":\n case \"compact\":\n default:\n return \"h-px bg-border my-2\" // 8px 여백\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(getVariantClasses(), className)}\n {...props}\n />\n )\n }\n)\nMenuSeparator.displayName = \"MenuSeparator\"\n\n/**\n * MenuLabel 컴포넌트의 props / MenuLabel component props\n * @typedef {Object} MenuLabelProps\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant] - 메뉴 변형 (Menu에서 자동 전달) / Menu variant (auto-passed from Menu)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 메뉴 크기 (Menu에서 자동 전달) / Menu size (auto-passed from Menu)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MenuLabelProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * MenuLabel 컴포넌트 / MenuLabel component\n * 메뉴 섹션의 레이블을 표시합니다.\n * Displays a label for a menu section.\n * \n * @component\n * @param {MenuLabelProps} props - MenuLabel 컴포넌트의 props / MenuLabel component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} MenuLabel 컴포넌트 / MenuLabel component\n */\nconst MenuLabel = React.forwardRef<HTMLDivElement, MenuLabelProps>(\n ({ className, variant = \"default\", size = \"md\", children, ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return \"px-3 py-1 text-xs font-semibold text-muted-foreground uppercase tracking-wide\" // 12px, 4px 패딩\n case \"vertical\":\n case \"compact\":\n default:\n return \"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\" // 16px, 8px 패딩\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-xs\"\n case \"lg\":\n return \"text-sm\"\n default:\n return \"text-xs\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nMenuLabel.displayName = \"MenuLabel\"\n\n// 편의 컴포넌트들\nexport const MenuHorizontal = React.forwardRef<HTMLDivElement, Omit<MenuProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Menu ref={ref} variant=\"horizontal\" className={className} {...props} />\n )\n)\nMenuHorizontal.displayName = \"MenuHorizontal\"\n\nexport const MenuVertical = React.forwardRef<HTMLDivElement, Omit<MenuProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Menu ref={ref} variant=\"vertical\" className={className} {...props} />\n )\n)\nMenuVertical.displayName = \"MenuVertical\"\n\nexport const MenuCompact = React.forwardRef<HTMLDivElement, Omit<MenuProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Menu ref={ref} variant=\"compact\" className={className} {...props} />\n )\n)\nMenuCompact.displayName = \"MenuCompact\"\n\nexport { Menu, MenuItem, MenuSeparator, MenuLabel } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * ContextMenu 컴포넌트의 props / ContextMenu component props\n * @typedef {Object} ContextMenuProps\n * @property {React.ReactNode} children - ContextMenu 내용 / ContextMenu content\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {React.ReactNode} [trigger] - ContextMenu를 열기 위한 트리거 요소 (우클릭 이벤트) / Trigger element to open context menu (right-click event)\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [placement=\"bottom\"] - ContextMenu 표시 위치 / ContextMenu display position\n * @property {\"start\" | \"center\" | \"end\"} [align=\"start\"] - ContextMenu 정렬 / ContextMenu alignment\n * @property {number} [offset=8] - 트리거와 ContextMenu 사이 간격 (px) / Spacing between trigger and context menu (px)\n * @property {boolean} [disabled=false] - ContextMenu 비활성화 여부 / Disable context menu\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ContextMenuProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n trigger?: React.ReactNode\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\"\n align?: \"start\" | \"center\" | \"end\"\n offset?: number\n disabled?: boolean\n}\n\n/**\n * ContextMenu 컴포넌트 / ContextMenu component\n * \n * 우클릭 시 표시되는 컨텍스트 메뉴 컴포넌트입니다.\n * 트리거 요소에 우클릭 이벤트를 자동으로 연결합니다.\n * \n * Context menu component that appears on right-click.\n * Automatically connects right-click events to the trigger element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ContextMenu trigger={<div>우클릭하세요</div>}>\n * <div className=\"p-2\">\n * <button>항목 1</button>\n * <button>항목 2</button>\n * </div>\n * </ContextMenu>\n * \n * @example\n * // 제어 모드 / Controlled mode\n * const [open, setOpen] = useState(false)\n * <ContextMenu \n * open={open}\n * onOpenChange={setOpen}\n * trigger={<div>우클릭</div>}\n * >\n * <Menu>\n * <MenuItem>복사</MenuItem>\n * <MenuItem>삭제</MenuItem>\n * </Menu>\n * </ContextMenu>\n * \n * @param {ContextMenuProps} props - ContextMenu 컴포넌트의 props / ContextMenu component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ContextMenu 컴포넌트 / ContextMenu component\n */\nconst ContextMenu = React.forwardRef<HTMLDivElement, ContextMenuProps>(\n ({ \n className, \n children,\n open: controlledOpen,\n onOpenChange,\n trigger,\n placement: _placement = \"bottom\",\n align: _align = \"start\",\n offset: _offset = 8,\n disabled = false,\n ...props \n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const triggerRef = React.useRef<HTMLDivElement>(null)\n const menuRef = React.useRef<HTMLDivElement>(null)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const handleOpenChange = React.useCallback((newOpen: boolean) => {\n if (disabled) return\n\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }, [disabled, isControlled, onOpenChange])\n\n const handleContextMenu = (event: React.MouseEvent) => {\n event.preventDefault()\n if (disabled) return\n\n const _rect = event.currentTarget.getBoundingClientRect()\n const x = event.clientX\n const y = event.clientY\n\n setCoords({ x, y })\n handleOpenChange(true)\n }\n\n const updatePosition = React.useCallback(() => {\n if (!menuRef.current) return\n\n const menuRect = menuRef.current.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let x = coords.x\n let y = coords.y\n\n // 뷰포트 경계 확인 및 조정\n if (x + menuRect.width > viewportWidth - 8) {\n x = viewportWidth - menuRect.width - 8 // 8px 여백\n }\n if (y + menuRect.height > viewportHeight - 8) {\n y = viewportHeight - menuRect.height - 8 // 8px 여백\n }\n if (x < 8) x = 8 // 8px 여백\n if (y < 8) y = 8 // 8px 여백\n\n setCoords({ x, y })\n }, [coords.x, coords.y])\n\n React.useEffect(() => {\n if (isOpen) {\n updatePosition()\n window.addEventListener('resize', updatePosition)\n window.addEventListener('scroll', updatePosition)\n \n return () => {\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('scroll', updatePosition)\n }\n }\n }, [isOpen, updatePosition])\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current &&\n menuRef.current &&\n !triggerRef.current.contains(event.target as Node) &&\n !menuRef.current.contains(event.target as Node)\n ) {\n handleOpenChange(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }\n }, [isOpen, handleOpenChange])\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {/* 트리거 */}\n {trigger && (\n <div\n ref={triggerRef}\n onContextMenu={handleContextMenu}\n className=\"inline-block\"\n >\n {trigger}\n </div>\n )}\n\n {/* 컨텍스트 메뉴 */}\n {isOpen && (\n <div\n ref={menuRef}\n className={merge(\n \"fixed z-50 bg-popover text-popover-foreground rounded-lg shadow-xl backdrop-blur-sm\", // 보더 대신 섀도우 사용\n \"min-w-[200px] py-2\", // 16px 패딩\n \"border-0\" // 보더 제거\n )}\n style={{\n left: coords.x,\n top: coords.y,\n boxShadow: \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n }}\n >\n {children}\n </div>\n )}\n </div>\n )\n }\n)\nContextMenu.displayName = \"ContextMenu\"\n\nexport interface ContextMenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"destructive\" | \"disabled\"\n}\n\nconst ContextMenuItem = React.forwardRef<HTMLButtonElement, ContextMenuItemProps>(\n ({ \n className, \n icon,\n variant = \"default\",\n children,\n disabled,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"destructive\":\n return \"text-destructive hover:bg-destructive/10\"\n case \"disabled\":\n return \"text-muted-foreground cursor-not-allowed\"\n default:\n return \"text-foreground hover:bg-muted\"\n }\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"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\", // 16px, 12px 패딩\n getVariantClasses(),\n className\n )}\n disabled={disabled || variant === \"disabled\"}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nContextMenuItem.displayName = \"ContextMenuItem\"\n\nexport interface ContextMenuSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst ContextMenuSeparator = React.forwardRef<HTMLDivElement, ContextMenuSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-border my-2\", className)} // 8px 여백\n {...props}\n />\n )\n)\nContextMenuSeparator.displayName = \"ContextMenuSeparator\"\n\nexport interface ContextMenuLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst ContextMenuLabel = React.forwardRef<HTMLDivElement, ContextMenuLabelProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\", className)} // 16px, 8px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nContextMenuLabel.displayName = \"ContextMenuLabel\"\n\n// 편의 컴포넌트들\nconst ContextMenuGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"py-1\", className)} // 4px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nContextMenuGroup.displayName = \"ContextMenuGroup\"\n\nexport { ContextMenu, ContextMenuItem, ContextMenuSeparator, ContextMenuLabel, ContextMenuGroup } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Command 컴포넌트의 props / Command component props\n * @typedef {Object} CommandProps\n * @property {React.ReactNode} children - CommandList, CommandItem 등 / CommandList, CommandItem, etc.\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {string} [placeholder=\"명령어를 검색하세요...\"] - 검색 입력 플레이스홀더 / Search input placeholder\n * @property {string} [searchValue] - 제어 모드에서 검색 값 / Search value in controlled mode\n * @property {(value: string) => void} [onSearchChange] - 검색 값 변경 콜백 / Search value change callback\n * @property {boolean} [disabled=false] - Command 비활성화 여부 / Disable command\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n placeholder?: string\n searchValue?: string\n onSearchChange?: (value: string) => void\n disabled?: boolean\n}\n\n/**\n * Command 컴포넌트 / Command component\n * \n * 명령 팔레트(Command Palette) 컴포넌트입니다.\n * Cmd+K (Mac) 또는 Ctrl+K (Windows)로 열 수 있습니다.\n * 키보드 네비게이션(Arrow keys, Enter, Escape)을 지원합니다.\n * \n * Command Palette component.\n * Can be opened with Cmd+K (Mac) or Ctrl+K (Windows).\n * Supports keyboard navigation (Arrow keys, Enter, Escape).\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Command>\n * <CommandInput placeholder=\"검색...\" />\n * <CommandList>\n * <CommandItem>항목 1</CommandItem>\n * <CommandItem>항목 2</CommandItem>\n * </CommandList>\n * </Command>\n * \n * @example\n * // 제어 모드 / Controlled mode\n * const [open, setOpen] = useState(false)\n * <Command \n * open={open}\n * onOpenChange={setOpen}\n * >\n * <CommandList>\n * <CommandGroup heading=\"파일\">\n * <CommandItem>새 파일</CommandItem>\n * </CommandGroup>\n * </CommandList>\n * </Command>\n * \n * @param {CommandProps} props - Command 컴포넌트의 props / Command component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Command 컴포넌트 / Command component\n */\nconst Command = React.forwardRef<HTMLDivElement, CommandProps>(\n ({ \n className, \n children,\n open: controlledOpen,\n onOpenChange,\n placeholder = \"명령어를 검색하세요...\",\n searchValue: controlledSearchValue,\n onSearchChange,\n disabled = false,\n ...props \n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const [internalSearchValue, setInternalSearchValue] = React.useState(\"\")\n const [selectedIndex, setSelectedIndex] = React.useState(0)\n const commandRef = React.useRef<HTMLDivElement>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const listRef = React.useRef<HTMLDivElement>(null)\n \n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n const searchValue = controlledSearchValue !== undefined ? controlledSearchValue : internalSearchValue\n\n const handleOpenChange = React.useCallback((newOpen: boolean) => {\n if (disabled) return\n\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }, [disabled, isControlled, onOpenChange])\n\n const handleSearchChange = (value: string) => {\n if (!isControlled) {\n setInternalSearchValue(value)\n }\n onSearchChange?.(value)\n setSelectedIndex(0)\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return\n\n const items = listRef.current?.querySelectorAll('[data-command-item]')\n const itemCount = items?.length || 0\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setSelectedIndex((prev) => (prev + 1) % itemCount)\n break\n case 'ArrowUp':\n event.preventDefault()\n setSelectedIndex((prev) => (prev - 1 + itemCount) % itemCount)\n break\n case 'Enter': {\n event.preventDefault()\n const selectedItem = items?.[selectedIndex] as HTMLElement\n selectedItem?.click()\n break\n }\n case 'Escape':\n event.preventDefault()\n handleOpenChange(false)\n break\n }\n }\n\n React.useEffect(() => {\n if (isOpen) {\n inputRef.current?.focus()\n setSelectedIndex(0)\n }\n }, [isOpen])\n\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'k' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n handleOpenChange(!isOpen)\n }\n // 전역 ESC 키 처리\n if (event.key === 'Escape' && isOpen) {\n event.preventDefault()\n handleOpenChange(false)\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [isOpen, handleOpenChange])\n\n React.useEffect(() => {\n const selectedItem = listRef.current?.querySelector(`[data-command-item]:nth-child(${selectedIndex + 1})`) as HTMLElement\n selectedItem?.scrollIntoView({ block: 'nearest' })\n }, [selectedIndex])\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {isOpen && (\n <div\n ref={commandRef}\n className={merge(\n \"fixed inset-0 z-50 bg-black/50 backdrop-blur-sm\", // 50% 투명도\n \"flex items-start justify-center pt-16\" // 64px 상단 여백\n )}\n onClick={() => handleOpenChange(false)}\n >\n <div\n className={merge(\n \"w-full max-w-2xl mx-4 bg-popover text-popover-foreground rounded-lg shadow-2xl\", // 보더 대신 섀도우\n \"border-0 overflow-hidden\" // 보더 제거\n )}\n onClick={(e) => e.stopPropagation()}\n style={{\n boxShadow: \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\"\n }}\n >\n <div className=\"p-4 border-b border-border\"> {/* 16px 패딩 */}\n <input\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n value={searchValue}\n onChange={(e) => handleSearchChange(e.target.value)}\n onKeyDown={handleKeyDown}\n className={merge(\n \"w-full bg-transparent text-lg font-medium outline-none\", // 18px 텍스트\n \"placeholder:text-muted-foreground\",\n \"text-foreground\"\n )}\n />\n </div>\n \n <div\n ref={listRef}\n className=\"max-h-96 overflow-y-auto py-2\" // 384px 최대 높이, 8px 패딩\n >\n {React.Children.map(children, (child, index) => {\n if (React.isValidElement<CommandItemProps>(child)) {\n // Fragment나 다른 컴포넌트에 selected prop 전달 방지\n if (child.type === React.Fragment || typeof child.type === 'symbol') {\n return child\n }\n return React.cloneElement(child, {\n selected: index === selectedIndex,\n onSelect: () => {\n child.props.onSelect?.()\n handleOpenChange(false)\n }\n })\n }\n return child\n })}\n </div>\n </div>\n </div>\n )}\n </div>\n )\n }\n)\nCommand.displayName = \"Command\"\n\n/**\n * CommandInput 컴포넌트의 props / CommandInput component props\n * @typedef {Object} CommandInputProps\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\n */\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst CommandInput = React.forwardRef<HTMLInputElement, CommandInputProps>(\n ({ className, ...props }, ref) => (\n <input\n ref={ref}\n className={merge(\n \"flex h-10 w-full rounded-md bg-transparent px-3 py-2 text-sm outline-none\", // 40px 높이, 12px, 8px 패딩\n \"placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n)\nCommandInput.displayName = \"CommandInput\"\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CommandList = React.forwardRef<HTMLDivElement, CommandListProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"max-h-96 overflow-y-auto py-2\", className)} // 384px 최대 높이, 8px 패딩\n {...props}\n />\n )\n)\nCommandList.displayName = \"CommandList\"\n\n/**\n * CommandItem 컴포넌트의 props / CommandItem component props\n * @typedef {Object} CommandItemProps\n * @property {React.ReactNode} [icon] - 항목 아이콘 / Item icon\n * @property {boolean} [selected=false] - 선택 상태 / Selected state\n * @property {() => void} [onSelect] - 선택 시 콜백 / Selection callback\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface CommandItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n selected?: boolean\n onSelect?: () => void\n}\n\nconst CommandItem = React.forwardRef<HTMLButtonElement, CommandItemProps>(\n ({ \n className, \n icon,\n selected = false,\n onSelect,\n children,\n ...props \n }, ref) => {\n return (\n <button\n ref={ref}\n data-command-item\n className={merge(\n \"relative flex w-full items-center gap-3 rounded-sm px-4 py-3 text-sm\", // 16px, 12px 패딩\n \"text-foreground\",\n \"hover:bg-muted\",\n \"focus:bg-muted\",\n \"focus:outline-none\",\n selected && \"bg-muted\",\n \"transition-colors\",\n className\n )}\n onClick={onSelect}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4 text-muted-foreground\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nCommandItem.displayName = \"CommandItem\"\n\n/**\n * CommandGroup 컴포넌트의 props / CommandGroup component props\n * @typedef {Object} CommandGroupProps\n * @property {React.ReactNode} [heading] - 그룹 제목 / Group heading\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n heading?: React.ReactNode\n}\n\nconst CommandGroup = React.forwardRef<HTMLDivElement, CommandGroupProps>(\n ({ className, heading, children, ...props }, ref) => (\n <div ref={ref} className={merge(\"py-2\", className)} {...props}> {/* 8px 패딩 */}\n {heading && (\n <div className=\"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\"> {/* 16px, 8px 패딩 */}\n {heading}\n </div>\n )}\n <div className=\"space-y-1\"> {/* 4px 간격 */}\n {children}\n </div>\n </div>\n )\n)\nCommandGroup.displayName = \"CommandGroup\"\n\n/**\n * CommandSeparator 컴포넌트의 props / CommandSeparator component props\n * @typedef {Object} CommandSeparatorProps\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CommandSeparator = React.forwardRef<HTMLDivElement, CommandSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-border my-2\", className)} // 8px 여백\n {...props}\n />\n )\n)\nCommandSeparator.displayName = \"CommandSeparator\"\n\n/**\n * CommandEmpty 컴포넌트의 props / CommandEmpty component props\n * @typedef {Object} CommandEmptyProps\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CommandEmpty = React.forwardRef<HTMLDivElement, CommandEmptyProps>(\n ({ className, children = \"결과가 없습니다.\", ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\n \"py-8 text-center text-sm text-muted-foreground\", // 32px 패딩\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n)\nCommandEmpty.displayName = \"CommandEmpty\"\n\n// 편의 컴포넌트들\nexport const CommandDialog = React.forwardRef<HTMLDivElement, CommandProps>(\n ({ className, ...props }, ref) => (\n <Command ref={ref} className={className} {...props} />\n )\n)\nCommandDialog.displayName = \"CommandDialog\"\n\nexport { Command, CommandInput, CommandList, CommandItem, CommandGroup, CommandSeparator, CommandEmpty } "]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Menu.tsx","../src/components/ContextMenu.tsx","../src/components/Command.tsx"],"names":["Menu","React","className","children","variant","size","props","ref","getVariantClasses","getSizeClasses","jsx","merge","child","MenuItem","icon","active","disabled","jsxs","MenuSeparator","MenuLabel","MenuHorizontal","MenuVertical","MenuCompact","ContextMenu","controlledOpen","onOpenChange","trigger","_placement","_align","_offset","internalOpen","setInternalOpen","coords","setCoords","triggerRef","menuRef","isControlled","isOpen","handleOpenChange","newOpen","handleContextMenu","event","x","y","updatePosition","menuRect","viewportWidth","viewportHeight","handleClickOutside","ContextMenuItem","ContextMenuSeparator","ContextMenuLabel","ContextMenuGroup","Command","placeholder","controlledSearchValue","onSearchChange","internalSearchValue","setInternalSearchValue","selectedIndex","setSelectedIndex","commandRef","inputRef","listRef","searchValue","handleSearchChange","value","handleKeyDown","_a","items","itemCount","prev","selectedItem","e","index","_b","CommandInput","CommandList","CommandItem","selected","onSelect","CommandGroup","heading","CommandSeparator","CommandEmpty","CommandDialog"],"mappings":"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","file":"interactive.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Menu 컴포넌트의 props / Menu component props\n * @typedef {Object} MenuProps\n * @property {React.ReactNode} children - MenuItem, MenuSeparator, MenuLabel 컴포넌트들 / MenuItem, MenuSeparator, MenuLabel components\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant=\"default\"] - 메뉴 방향 및 스타일 / Menu direction and style\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 메뉴 아이템 크기 / Menu item size\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MenuProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * Menu 컴포넌트 / Menu component\n * \n * 메뉴 리스트를 제공하는 컴포넌트입니다.\n * MenuItem, MenuSeparator, MenuLabel과 함께 사용합니다.\n * \n * Component that provides menu lists.\n * Used with MenuItem, MenuSeparator, and MenuLabel.\n * \n * @component\n * @example\n * // 기본 수직 메뉴 / Basic vertical menu\n * <Menu>\n * <MenuItem icon={<Icon name=\"home\" />}>홈</MenuItem>\n * <MenuItem icon={<Icon name=\"settings\" />}>설정</MenuItem>\n * <MenuSeparator />\n * <MenuItem>로그아웃</MenuItem>\n * </Menu>\n * \n * @example\n * // 수평 메뉴 / Horizontal menu\n * <Menu variant=\"horizontal\">\n * <MenuItem>메뉴 1</MenuItem>\n * <MenuItem>메뉴 2</MenuItem>\n * </Menu>\n * \n * @param {MenuProps} props - Menu 컴포넌트의 props / Menu component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Menu 컴포넌트 / Menu component\n */\nconst Menu = React.forwardRef<HTMLDivElement, MenuProps>(\n ({ \n className, \n children,\n variant = \"default\",\n size = \"md\",\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return \"flex items-center space-x-1\" // 4px 간격\n case \"vertical\":\n return \"flex flex-col space-y-1\" // 4px 간격\n case \"compact\":\n return \"flex flex-col space-y-0.5\" // 2px 간격\n default:\n return \"flex flex-col space-y-1\" // 4px 간격\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-sm\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n variant,\n size\n } as Partial<MenuItemProps | MenuSeparatorProps | MenuLabelProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nMenu.displayName = \"Menu\"\n\n/**\n * MenuItem 컴포넌트의 props / MenuItem component props\n * @typedef {Object} MenuItemProps\n * @property {React.ReactNode} [icon] - 메뉴 아이템 아이콘 / Menu item icon\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant] - 메뉴 변형 (Menu에서 자동 전달) / Menu variant (auto-passed from Menu)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 메뉴 크기 (Menu에서 자동 전달) / Menu size (auto-passed from Menu)\n * @property {boolean} [active=false] - 활성화 상태 / Active state\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface MenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n size?: \"sm\" | \"md\" | \"lg\"\n active?: boolean\n disabled?: boolean\n}\n\n/**\n * MenuItem 컴포넌트 / MenuItem component\n * 메뉴의 개별 아이템을 표시합니다.\n * Displays an individual menu item.\n * \n * @component\n * @param {MenuItemProps} props - MenuItem 컴포넌트의 props / MenuItem component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} MenuItem 컴포넌트 / MenuItem component\n */\nconst MenuItem = React.forwardRef<HTMLButtonElement, MenuItemProps>(\n ({ \n className, \n icon,\n variant = \"default\",\n size = \"md\",\n active = false,\n disabled = false,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return merge(\n \"flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors\", // 12px, 8px 패딩\n active \n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n case \"vertical\":\n return merge(\n \"flex items-center gap-3 px-4 py-3 rounded-md text-sm font-medium transition-colors\", // 16px, 12px 패딩\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n case \"compact\":\n return merge(\n \"flex items-center gap-2 px-2 py-1.5 rounded text-sm font-medium transition-colors\", // 8px, 6px 패딩\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n default:\n return merge(\n \"flex items-center gap-3 px-4 py-3 rounded-md text-sm font-medium transition-colors\", // 16px, 12px 패딩\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:text-foreground hover:bg-muted\"\n )\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-xs\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n disabled={disabled}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nMenuItem.displayName = \"MenuItem\"\n\n/**\n * MenuSeparator 컴포넌트의 props / MenuSeparator component props\n * @typedef {Object} MenuSeparatorProps\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant] - 메뉴 변형 (Menu에서 자동 전달) / Menu variant (auto-passed from Menu)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MenuSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n}\n\n/**\n * MenuSeparator 컴포넌트 / MenuSeparator component\n * 메뉴 아이템들을 구분하는 구분선을 표시합니다.\n * Displays a separator line between menu items.\n * \n * @component\n * @param {MenuSeparatorProps} props - MenuSeparator 컴포넌트의 props / MenuSeparator component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} MenuSeparator 컴포넌트 / MenuSeparator component\n */\nconst MenuSeparator = React.forwardRef<HTMLDivElement, MenuSeparatorProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return \"w-px h-4 bg-border mx-1\" // 4px 여백\n case \"vertical\":\n case \"compact\":\n default:\n return \"h-px bg-border my-2\" // 8px 여백\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(getVariantClasses(), className)}\n {...props}\n />\n )\n }\n)\nMenuSeparator.displayName = \"MenuSeparator\"\n\n/**\n * MenuLabel 컴포넌트의 props / MenuLabel component props\n * @typedef {Object} MenuLabelProps\n * @property {\"default\" | \"horizontal\" | \"vertical\" | \"compact\"} [variant] - 메뉴 변형 (Menu에서 자동 전달) / Menu variant (auto-passed from Menu)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 메뉴 크기 (Menu에서 자동 전달) / Menu size (auto-passed from Menu)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MenuLabelProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"horizontal\" | \"vertical\" | \"compact\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * MenuLabel 컴포넌트 / MenuLabel component\n * 메뉴 섹션의 레이블을 표시합니다.\n * Displays a label for a menu section.\n * \n * @component\n * @param {MenuLabelProps} props - MenuLabel 컴포넌트의 props / MenuLabel component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} MenuLabel 컴포넌트 / MenuLabel component\n */\nconst MenuLabel = React.forwardRef<HTMLDivElement, MenuLabelProps>(\n ({ className, variant = \"default\", size = \"md\", children, ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"horizontal\":\n return \"px-3 py-1 text-xs font-semibold text-muted-foreground uppercase tracking-wide\" // 12px, 4px 패딩\n case \"vertical\":\n case \"compact\":\n default:\n return \"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\" // 16px, 8px 패딩\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-xs\"\n case \"lg\":\n return \"text-sm\"\n default:\n return \"text-xs\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nMenuLabel.displayName = \"MenuLabel\"\n\n// 편의 컴포넌트들\nexport const MenuHorizontal = React.forwardRef<HTMLDivElement, Omit<MenuProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Menu ref={ref} variant=\"horizontal\" className={className} {...props} />\n )\n)\nMenuHorizontal.displayName = \"MenuHorizontal\"\n\nexport const MenuVertical = React.forwardRef<HTMLDivElement, Omit<MenuProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Menu ref={ref} variant=\"vertical\" className={className} {...props} />\n )\n)\nMenuVertical.displayName = \"MenuVertical\"\n\nexport const MenuCompact = React.forwardRef<HTMLDivElement, Omit<MenuProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Menu ref={ref} variant=\"compact\" className={className} {...props} />\n )\n)\nMenuCompact.displayName = \"MenuCompact\"\n\nexport { Menu, MenuItem, MenuSeparator, MenuLabel } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * ContextMenu 컴포넌트의 props / ContextMenu component props\n * @typedef {Object} ContextMenuProps\n * @property {React.ReactNode} children - ContextMenu 내용 / ContextMenu content\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {React.ReactNode} [trigger] - ContextMenu를 열기 위한 트리거 요소 (우클릭 이벤트) / Trigger element to open context menu (right-click event)\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [placement=\"bottom\"] - ContextMenu 표시 위치 / ContextMenu display position\n * @property {\"start\" | \"center\" | \"end\"} [align=\"start\"] - ContextMenu 정렬 / ContextMenu alignment\n * @property {number} [offset=8] - 트리거와 ContextMenu 사이 간격 (px) / Spacing between trigger and context menu (px)\n * @property {boolean} [disabled=false] - ContextMenu 비활성화 여부 / Disable context menu\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ContextMenuProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n trigger?: React.ReactNode\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\"\n align?: \"start\" | \"center\" | \"end\"\n offset?: number\n disabled?: boolean\n}\n\n/**\n * ContextMenu 컴포넌트 / ContextMenu component\n * \n * 우클릭 시 표시되는 컨텍스트 메뉴 컴포넌트입니다.\n * 트리거 요소에 우클릭 이벤트를 자동으로 연결합니다.\n * \n * Context menu component that appears on right-click.\n * Automatically connects right-click events to the trigger element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ContextMenu trigger={<div>우클릭하세요</div>}>\n * <div className=\"p-2\">\n * <button>항목 1</button>\n * <button>항목 2</button>\n * </div>\n * </ContextMenu>\n * \n * @example\n * // 제어 모드 / Controlled mode\n * const [open, setOpen] = useState(false)\n * <ContextMenu \n * open={open}\n * onOpenChange={setOpen}\n * trigger={<div>우클릭</div>}\n * >\n * <Menu>\n * <MenuItem>복사</MenuItem>\n * <MenuItem>삭제</MenuItem>\n * </Menu>\n * </ContextMenu>\n * \n * @param {ContextMenuProps} props - ContextMenu 컴포넌트의 props / ContextMenu component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ContextMenu 컴포넌트 / ContextMenu component\n */\nconst ContextMenu = React.forwardRef<HTMLDivElement, ContextMenuProps>(\n ({ \n className, \n children,\n open: controlledOpen,\n onOpenChange,\n trigger,\n placement: _placement = \"bottom\",\n align: _align = \"start\",\n offset: _offset = 8,\n disabled = false,\n ...props \n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const triggerRef = React.useRef<HTMLDivElement>(null)\n const menuRef = React.useRef<HTMLDivElement>(null)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const handleOpenChange = React.useCallback((newOpen: boolean) => {\n if (disabled) return\n\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }, [disabled, isControlled, onOpenChange])\n\n const handleContextMenu = (event: React.MouseEvent) => {\n event.preventDefault()\n if (disabled) return\n\n const _rect = event.currentTarget.getBoundingClientRect()\n const x = event.clientX\n const y = event.clientY\n\n setCoords({ x, y })\n handleOpenChange(true)\n }\n\n const updatePosition = React.useCallback(() => {\n if (!menuRef.current) return\n\n const menuRect = menuRef.current.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let x = coords.x\n let y = coords.y\n\n // 뷰포트 경계 확인 및 조정\n if (x + menuRect.width > viewportWidth - 8) {\n x = viewportWidth - menuRect.width - 8 // 8px 여백\n }\n if (y + menuRect.height > viewportHeight - 8) {\n y = viewportHeight - menuRect.height - 8 // 8px 여백\n }\n if (x < 8) x = 8 // 8px 여백\n if (y < 8) y = 8 // 8px 여백\n\n setCoords({ x, y })\n }, [coords.x, coords.y])\n\n React.useEffect(() => {\n if (isOpen) {\n updatePosition()\n window.addEventListener('resize', updatePosition)\n window.addEventListener('scroll', updatePosition)\n \n return () => {\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('scroll', updatePosition)\n }\n }\n }, [isOpen, updatePosition])\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current &&\n menuRef.current &&\n !triggerRef.current.contains(event.target as Node) &&\n !menuRef.current.contains(event.target as Node)\n ) {\n handleOpenChange(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }\n }, [isOpen, handleOpenChange])\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {/* 트리거 */}\n {trigger && (\n <div\n ref={triggerRef}\n onContextMenu={handleContextMenu}\n className=\"inline-block\"\n >\n {trigger}\n </div>\n )}\n\n {/* 컨텍스트 메뉴 */}\n {isOpen && (\n <div\n ref={menuRef}\n className={merge(\n \"fixed z-50 bg-popover text-popover-foreground rounded-lg shadow-xl backdrop-blur-sm\", // 보더 대신 섀도우 사용\n \"min-w-[200px] py-2\", // 16px 패딩\n \"border-0\" // 보더 제거\n )}\n style={{\n left: coords.x,\n top: coords.y,\n boxShadow: \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n }}\n >\n {children}\n </div>\n )}\n </div>\n )\n }\n)\nContextMenu.displayName = \"ContextMenu\"\n\nexport interface ContextMenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"destructive\" | \"disabled\"\n}\n\nconst ContextMenuItem = React.forwardRef<HTMLButtonElement, ContextMenuItemProps>(\n ({ \n className, \n icon,\n variant = \"default\",\n children,\n disabled,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"destructive\":\n return \"text-destructive hover:bg-destructive/10\"\n case \"disabled\":\n return \"text-muted-foreground cursor-not-allowed\"\n default:\n return \"text-foreground hover:bg-muted\"\n }\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"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\", // 16px, 12px 패딩\n getVariantClasses(),\n className\n )}\n disabled={disabled || variant === \"disabled\"}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nContextMenuItem.displayName = \"ContextMenuItem\"\n\nexport interface ContextMenuSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst ContextMenuSeparator = React.forwardRef<HTMLDivElement, ContextMenuSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-border my-2\", className)} // 8px 여백\n {...props}\n />\n )\n)\nContextMenuSeparator.displayName = \"ContextMenuSeparator\"\n\nexport interface ContextMenuLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst ContextMenuLabel = React.forwardRef<HTMLDivElement, ContextMenuLabelProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\", className)} // 16px, 8px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nContextMenuLabel.displayName = \"ContextMenuLabel\"\n\n// 편의 컴포넌트들\nconst ContextMenuGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"py-1\", className)} // 4px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nContextMenuGroup.displayName = \"ContextMenuGroup\"\n\nexport { ContextMenu, ContextMenuItem, ContextMenuSeparator, ContextMenuLabel, ContextMenuGroup } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Command 컴포넌트의 props / Command component props\n * @typedef {Object} CommandProps\n * @property {React.ReactNode} children - CommandList, CommandItem 등 / CommandList, CommandItem, etc.\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {string} [placeholder=\"명령어를 검색하세요...\"] - 검색 입력 플레이스홀더 / Search input placeholder\n * @property {string} [searchValue] - 제어 모드에서 검색 값 / Search value in controlled mode\n * @property {(value: string) => void} [onSearchChange] - 검색 값 변경 콜백 / Search value change callback\n * @property {boolean} [disabled=false] - Command 비활성화 여부 / Disable command\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n placeholder?: string\n searchValue?: string\n onSearchChange?: (value: string) => void\n disabled?: boolean\n}\n\n/**\n * Command 컴포넌트 / Command component\n * \n * 명령 팔레트(Command Palette) 컴포넌트입니다.\n * Cmd+K (Mac) 또는 Ctrl+K (Windows)로 열 수 있습니다.\n * 키보드 네비게이션(Arrow keys, Enter, Escape)을 지원합니다.\n * \n * Command Palette component.\n * Can be opened with Cmd+K (Mac) or Ctrl+K (Windows).\n * Supports keyboard navigation (Arrow keys, Enter, Escape).\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Command>\n * <CommandInput placeholder=\"검색...\" />\n * <CommandList>\n * <CommandItem>항목 1</CommandItem>\n * <CommandItem>항목 2</CommandItem>\n * </CommandList>\n * </Command>\n * \n * @example\n * // 제어 모드 / Controlled mode\n * const [open, setOpen] = useState(false)\n * <Command \n * open={open}\n * onOpenChange={setOpen}\n * >\n * <CommandList>\n * <CommandGroup heading=\"파일\">\n * <CommandItem>새 파일</CommandItem>\n * </CommandGroup>\n * </CommandList>\n * </Command>\n * \n * @param {CommandProps} props - Command 컴포넌트의 props / Command component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Command 컴포넌트 / Command component\n */\nconst Command = React.forwardRef<HTMLDivElement, CommandProps>(\n ({ \n className, \n children,\n open: controlledOpen,\n onOpenChange,\n placeholder = \"명령어를 검색하세요...\",\n searchValue: controlledSearchValue,\n onSearchChange,\n disabled = false,\n ...props \n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const [internalSearchValue, setInternalSearchValue] = React.useState(\"\")\n const [selectedIndex, setSelectedIndex] = React.useState(0)\n const commandRef = React.useRef<HTMLDivElement>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const listRef = React.useRef<HTMLDivElement>(null)\n \n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n const searchValue = controlledSearchValue !== undefined ? controlledSearchValue : internalSearchValue\n\n const handleOpenChange = React.useCallback((newOpen: boolean) => {\n if (disabled) return\n\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }, [disabled, isControlled, onOpenChange])\n\n const handleSearchChange = (value: string) => {\n if (!isControlled) {\n setInternalSearchValue(value)\n }\n onSearchChange?.(value)\n setSelectedIndex(0)\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return\n\n const items = listRef.current?.querySelectorAll('[data-command-item]')\n const itemCount = items?.length || 0\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setSelectedIndex((prev) => (prev + 1) % itemCount)\n break\n case 'ArrowUp':\n event.preventDefault()\n setSelectedIndex((prev) => (prev - 1 + itemCount) % itemCount)\n break\n case 'Enter': {\n event.preventDefault()\n const selectedItem = items?.[selectedIndex] as HTMLElement\n selectedItem?.click()\n break\n }\n case 'Escape':\n event.preventDefault()\n handleOpenChange(false)\n break\n }\n }\n\n React.useEffect(() => {\n if (isOpen) {\n inputRef.current?.focus()\n setSelectedIndex(0)\n }\n }, [isOpen])\n\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'k' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n handleOpenChange(!isOpen)\n }\n // 전역 ESC 키 처리\n if (event.key === 'Escape' && isOpen) {\n event.preventDefault()\n handleOpenChange(false)\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [isOpen, handleOpenChange])\n\n React.useEffect(() => {\n const selectedItem = listRef.current?.querySelector(`[data-command-item]:nth-child(${selectedIndex + 1})`) as HTMLElement\n selectedItem?.scrollIntoView({ block: 'nearest' })\n }, [selectedIndex])\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {isOpen && (\n <div\n ref={commandRef}\n className={merge(\n \"fixed inset-0 z-50 bg-black/50 backdrop-blur-sm\", // 50% 투명도\n \"flex items-start justify-center pt-16\" // 64px 상단 여백\n )}\n onClick={() => handleOpenChange(false)}\n >\n <div\n className={merge(\n \"w-full max-w-2xl mx-4 bg-popover text-popover-foreground rounded-lg shadow-2xl\", // 보더 대신 섀도우\n \"border-0 overflow-hidden\" // 보더 제거\n )}\n onClick={(e) => e.stopPropagation()}\n style={{\n boxShadow: \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\"\n }}\n >\n <div className=\"p-4 border-b border-border\"> {/* 16px 패딩 */}\n <input\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n value={searchValue}\n onChange={(e) => handleSearchChange(e.target.value)}\n onKeyDown={handleKeyDown}\n className={merge(\n \"w-full bg-transparent text-lg font-medium outline-none\", // 18px 텍스트\n \"placeholder:text-muted-foreground\",\n \"text-foreground\"\n )}\n />\n </div>\n \n <div\n ref={listRef}\n className=\"max-h-96 overflow-y-auto py-2\" // 384px 최대 높이, 8px 패딩\n >\n {React.Children.map(children, (child, index) => {\n if (React.isValidElement<CommandItemProps>(child)) {\n // Fragment나 다른 컴포넌트에 selected prop 전달 방지\n if (child.type === React.Fragment || typeof child.type === 'symbol') {\n return child\n }\n return React.cloneElement(child, {\n selected: index === selectedIndex,\n onSelect: () => {\n child.props.onSelect?.()\n handleOpenChange(false)\n }\n })\n }\n return child\n })}\n </div>\n </div>\n </div>\n )}\n </div>\n )\n }\n)\nCommand.displayName = \"Command\"\n\n/**\n * CommandInput 컴포넌트의 props / CommandInput component props\n * @typedef {Object} CommandInputProps\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\n */\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst CommandInput = React.forwardRef<HTMLInputElement, CommandInputProps>(\n ({ className, ...props }, ref) => (\n <input\n ref={ref}\n className={merge(\n \"flex h-10 w-full rounded-md bg-transparent px-3 py-2 text-sm outline-none\", // 40px 높이, 12px, 8px 패딩\n \"placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n)\nCommandInput.displayName = \"CommandInput\"\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CommandList = React.forwardRef<HTMLDivElement, CommandListProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"max-h-96 overflow-y-auto py-2\", className)} // 384px 최대 높이, 8px 패딩\n {...props}\n />\n )\n)\nCommandList.displayName = \"CommandList\"\n\n/**\n * CommandItem 컴포넌트의 props / CommandItem component props\n * @typedef {Object} CommandItemProps\n * @property {React.ReactNode} [icon] - 항목 아이콘 / Item icon\n * @property {boolean} [selected=false] - 선택 상태 / Selected state\n * @property {() => void} [onSelect] - 선택 시 콜백 / Selection callback\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface CommandItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n selected?: boolean\n onSelect?: () => void\n}\n\nconst CommandItem = React.forwardRef<HTMLButtonElement, CommandItemProps>(\n ({ \n className, \n icon,\n selected = false,\n onSelect,\n children,\n ...props \n }, ref) => {\n return (\n <button\n ref={ref}\n data-command-item\n className={merge(\n \"relative flex w-full items-center gap-3 rounded-sm px-4 py-3 text-sm\", // 16px, 12px 패딩\n \"text-foreground\",\n \"hover:bg-muted\",\n \"focus:bg-muted\",\n \"focus:outline-none\",\n selected && \"bg-muted\",\n \"transition-colors\",\n className\n )}\n onClick={onSelect}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4 text-muted-foreground\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nCommandItem.displayName = \"CommandItem\"\n\n/**\n * CommandGroup 컴포넌트의 props / CommandGroup component props\n * @typedef {Object} CommandGroupProps\n * @property {React.ReactNode} [heading] - 그룹 제목 / Group heading\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n heading?: React.ReactNode\n}\n\nconst CommandGroup = React.forwardRef<HTMLDivElement, CommandGroupProps>(\n ({ className, heading, children, ...props }, ref) => (\n <div ref={ref} className={merge(\"py-2\", className)} {...props}> {/* 8px 패딩 */}\n {heading && (\n <div className=\"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\"> {/* 16px, 8px 패딩 */}\n {heading}\n </div>\n )}\n <div className=\"space-y-1\"> {/* 4px 간격 */}\n {children}\n </div>\n </div>\n )\n)\nCommandGroup.displayName = \"CommandGroup\"\n\n/**\n * CommandSeparator 컴포넌트의 props / CommandSeparator component props\n * @typedef {Object} CommandSeparatorProps\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CommandSeparator = React.forwardRef<HTMLDivElement, CommandSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-border my-2\", className)} // 8px 여백\n {...props}\n />\n )\n)\nCommandSeparator.displayName = \"CommandSeparator\"\n\n/**\n * CommandEmpty 컴포넌트의 props / CommandEmpty component props\n * @typedef {Object} CommandEmptyProps\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CommandEmpty = React.forwardRef<HTMLDivElement, CommandEmptyProps>(\n ({ className, children = \"결과가 없습니다.\", ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\n \"py-8 text-center text-sm text-muted-foreground\", // 32px 패딩\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n)\nCommandEmpty.displayName = \"CommandEmpty\"\n\n// 편의 컴포넌트들\nexport const CommandDialog = React.forwardRef<HTMLDivElement, CommandProps>(\n ({ className, ...props }, ref) => (\n <Command ref={ref} className={className} {...props} />\n )\n)\nCommandDialog.displayName = \"CommandDialog\"\n\nexport { Command, CommandInput, CommandList, CommandItem, CommandGroup, CommandSeparator, CommandEmpty } "]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LandingAboutProps } from './types';
|
|
2
|
+
export declare function LandingAbout({ name, role, bio, avatar, socialLinks, motion: motionOverride, className, ...rest }: LandingAboutProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=LandingAbout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingAbout.d.ts","sourceRoot":"","sources":["../../src/landing/LandingAbout.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAyB,MAAM,SAAS,CAAA;AAqBvE,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,MAAM,EACN,WAAW,EACX,MAAM,EAAE,cAAc,EACtB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,iBAAiB,2CA0EnB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LandingCTAProps } from './types';
|
|
2
|
+
export declare function LandingCTA({ title, subtitle, primaryAction, secondaryAction, background: bgProp, gradientColors, motion: motionOverride, className, ...rest }: LandingCTAProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=LandingCTA.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingCTA.d.ts","sourceRoot":"","sources":["../../src/landing/LandingCTA.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAyB,MAAM,SAAS,CAAA;AAiCrE,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,aAAa,EACb,eAAe,EACf,UAAU,EAAE,MAAM,EAClB,cAAc,EACd,MAAM,EAAE,cAAc,EACtB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,eAAe,2CAqFjB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LandingContactProps } from './types';
|
|
2
|
+
export declare function LandingContact({ title, subtitle, email, socialLinks, motion: motionOverride, className, ...rest }: LandingContactProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=LandingContact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingContact.d.ts","sourceRoot":"","sources":["../../src/landing/LandingContact.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAyB,MAAM,SAAS,CAAA;AAqBzE,wBAAgB,cAAc,CAAC,EAC7B,KAAsB,EACtB,QAAQ,EACR,KAAK,EACL,WAAW,EACX,MAAM,EAAE,cAAc,EACtB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,mBAAmB,2CAmErB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LandingExperienceProps } from './types';
|
|
2
|
+
export declare function LandingExperience({ items, title, subtitle, motion: motionOverride, staggerDelay: staggerProp, className, ...rest }: LandingExperienceProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=LandingExperience.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingExperience.d.ts","sourceRoot":"","sources":["../../src/landing/LandingExperience.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,sBAAsB,EAAgD,MAAM,SAAS,CAAA;AA4DnG,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,WAAW,EACzB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,sBAAsB,2CAgCxB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LandingFeaturesProps } from './types';
|
|
2
|
+
export declare function LandingFeatures({ items, title, subtitle, columns: columnsProp, card: cardProp, sectionProps, motion: motionOverride, staggerDelay: staggerDelayProp, decorator: decoratorProp, className, ...rest }: LandingFeaturesProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=LandingFeatures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingFeatures.d.ts","sourceRoot":"","sources":["../../src/landing/LandingFeatures.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,oBAAoB,EAAoC,MAAM,SAAS,CAAA;AAsErF,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,QAAQ,EACd,YAAY,EACZ,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,gBAAgB,EAC9B,SAAS,EAAE,aAAa,EACxB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,oBAAoB,2CA0CtB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LandingHeroProps } from './types';
|
|
2
|
+
export declare function LandingHero({ title, subtitle, description, primaryAction, secondaryAction, size: sizeProp, background: bgProp, gradientColors, scrollIndicator, motion: motionOverride, className, ...rest }: LandingHeroProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=LandingHero.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingHero.d.ts","sourceRoot":"","sources":["../../src/landing/LandingHero.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,SAAS,CAAA;AAqBtE,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,aAAa,EACb,eAAe,EACf,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,MAAM,EAClB,cAAc,EACd,eAAuB,EACvB,MAAM,EAAE,cAAc,EACtB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,gBAAgB,2CAyFlB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LandingLogoCloudProps } from './types';
|
|
2
|
+
export declare function LandingLogoCloud({ logos, title, variant: variantProp, speed: speedProp, logoHeight, motion: motionOverride, className, ...rest }: LandingLogoCloudProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=LandingLogoCloud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingLogoCloud.d.ts","sourceRoot":"","sources":["../../src/landing/LandingLogoCloud.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAyB,MAAM,SAAS,CAAA;AAgC3E,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,KAAK,EACL,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,SAAS,EAChB,UAAe,EACf,MAAM,EAAE,cAAc,EACtB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,qBAAqB,2CAuEvB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LandingMetricsProps } from './types';
|
|
2
|
+
export declare function LandingMetrics({ items, title, subtitle, tabs, motion: motionOverride, className, ...rest }: LandingMetricsProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=LandingMetrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingMetrics.d.ts","sourceRoot":"","sources":["../../src/landing/LandingMetrics.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAA4C,MAAM,SAAS,CAAA;AA2D5F,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,MAAM,EAAE,cAAc,EACtB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,mBAAmB,2CAoErB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LandingProjectsProps } from './types';
|
|
2
|
+
export declare function LandingProjects({ items, title, subtitle, columns, filter, motion: motionOverride, staggerDelay: staggerProp, className, ...rest }: LandingProjectsProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=LandingProjects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingProjects.d.ts","sourceRoot":"","sources":["../../src/landing/LandingProjects.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAA6C,MAAM,SAAS,CAAA;AAgG9F,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAW,EACX,MAAc,EACd,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,WAAW,EACzB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,oBAAoB,2CAkFtB"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { LandingProviderProps, LandingTheme } from './types';
|
|
2
|
+
export declare function useLandingTheme(): LandingTheme;
|
|
3
|
+
export declare function LandingProvider({ theme, children }: LandingProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
//# sourceMappingURL=LandingProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingProvider.d.ts","sourceRoot":"","sources":["../../src/landing/LandingProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAsB,MAAM,SAAS,CAAA;AAIrF,wBAAgB,eAAe,IAAI,YAAY,CAM9C;AAqCD,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAgBxE"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LandingShowcaseProps } from './types';
|
|
2
|
+
export declare function LandingShowcase({ items, title, subtitle, motion: motionOverride, staggerDelay: staggerProp, className, ...rest }: LandingShowcaseProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=LandingShowcase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingShowcase.d.ts","sourceRoot":"","sources":["../../src/landing/LandingShowcase.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAyB,MAAM,SAAS,CAAA;AAuB1E,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,WAAW,EACzB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,oBAAoB,2CA6DtB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LandingSkillsProps } from './types';
|
|
2
|
+
export declare function LandingSkills({ items, title, subtitle, variant, motion: motionOverride, staggerDelay: staggerProp, className, ...rest }: LandingSkillsProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=LandingSkills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingSkills.d.ts","sourceRoot":"","sources":["../../src/landing/LandingSkills.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAA2C,MAAM,SAAS,CAAA;AA8B1F,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAgB,EAChB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,WAAW,EACzB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,kBAAkB,2CAsGpB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LandingStatsProps } from './types';
|
|
2
|
+
export declare function LandingStats({ items, title, subtitle, countUp: countUpProp, numberSize: numberSizeProp, sectionProps, motion: motionOverride, staggerDelay: staggerDelayProp, className, ...rest }: LandingStatsProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=LandingStats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingStats.d.ts","sourceRoot":"","sources":["../../src/landing/LandingStats.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,SAAS,CAAA;AAwGjE,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,cAAc,EAC1B,YAAY,EACZ,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,gBAAgB,EAC9B,SAAS,EACT,GAAG,IAAI,EACR,EAAE,iBAAiB,2CAkDnB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LandingTestimonialsProps } from './types';
|
|
2
|
+
export declare function LandingTestimonials({ items, title, subtitle, variant: variantProp, columns: colsProp, autoPlay, interval, motion: motionOverride, staggerDelay: staggerProp, className, ...rest }: LandingTestimonialsProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=LandingTestimonials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LandingTestimonials.d.ts","sourceRoot":"","sources":["../../src/landing/LandingTestimonials.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,wBAAwB,EAAiD,MAAM,SAAS,CAAA;AAsDtG,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,QAAQ,EACjB,QAAe,EACf,QAAe,EACf,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,WAAW,EACzB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,wBAAwB,2CA0E1B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export { LandingProvider, useLandingTheme } from './LandingProvider';
|
|
2
|
+
export { LandingHero } from './LandingHero';
|
|
3
|
+
export { LandingFeatures } from './LandingFeatures';
|
|
4
|
+
export { LandingStats } from './LandingStats';
|
|
5
|
+
export { LandingCTA } from './LandingCTA';
|
|
6
|
+
export { LandingTestimonials } from './LandingTestimonials';
|
|
7
|
+
export { LandingLogoCloud } from './LandingLogoCloud';
|
|
8
|
+
export { LandingShowcase } from './LandingShowcase';
|
|
9
|
+
export { LandingAbout } from './LandingAbout';
|
|
10
|
+
export { LandingProjects } from './LandingProjects';
|
|
11
|
+
export { LandingSkills } from './LandingSkills';
|
|
12
|
+
export { LandingExperience } from './LandingExperience';
|
|
13
|
+
export { LandingMetrics } from './LandingMetrics';
|
|
14
|
+
export { LandingContact } from './LandingContact';
|
|
15
|
+
export { createLandingTheme, resolveTheme, corporate, marketing, product, dashboard, app, immersive, portfolio } from './themes';
|
|
16
|
+
export type { LandingThemeName, LandingTheme, LandingColorTokens, LandingMotionOverride, LandingProviderProps, LandingHeroProps, LandingFeaturesProps, LandingFeatureItem, LandingStatsProps, LandingStatItem, LandingCTAProps, LandingTestimonialsProps, LandingTestimonialItem, LandingLogoCloudProps, LandingLogoItem, LandingShowcaseProps, LandingShowcaseItem, LandingAboutProps, LandingSocialLink, LandingProjectsProps, LandingProjectItem, LandingSkillsProps, LandingSkillItem, LandingExperienceProps, LandingExperienceItem, LandingMetricsProps, LandingMetricItem, LandingMetricsTab, LandingContactProps, DeepPartial, } from './types';
|
|
17
|
+
import { LandingProvider } from './LandingProvider';
|
|
18
|
+
import { LandingHero } from './LandingHero';
|
|
19
|
+
import { LandingFeatures } from './LandingFeatures';
|
|
20
|
+
import { LandingStats } from './LandingStats';
|
|
21
|
+
import { LandingCTA } from './LandingCTA';
|
|
22
|
+
import { LandingTestimonials } from './LandingTestimonials';
|
|
23
|
+
import { LandingLogoCloud } from './LandingLogoCloud';
|
|
24
|
+
import { LandingShowcase } from './LandingShowcase';
|
|
25
|
+
import { LandingAbout } from './LandingAbout';
|
|
26
|
+
import { LandingProjects } from './LandingProjects';
|
|
27
|
+
import { LandingSkills } from './LandingSkills';
|
|
28
|
+
import { LandingExperience } from './LandingExperience';
|
|
29
|
+
import { LandingMetrics } from './LandingMetrics';
|
|
30
|
+
import { LandingContact } from './LandingContact';
|
|
31
|
+
export declare const Landing: {
|
|
32
|
+
readonly Provider: typeof LandingProvider;
|
|
33
|
+
readonly Hero: typeof LandingHero;
|
|
34
|
+
readonly Features: typeof LandingFeatures;
|
|
35
|
+
readonly Stats: typeof LandingStats;
|
|
36
|
+
readonly CTA: typeof LandingCTA;
|
|
37
|
+
readonly Testimonials: typeof LandingTestimonials;
|
|
38
|
+
readonly LogoCloud: typeof LandingLogoCloud;
|
|
39
|
+
readonly Showcase: typeof LandingShowcase;
|
|
40
|
+
readonly About: typeof LandingAbout;
|
|
41
|
+
readonly Projects: typeof LandingProjects;
|
|
42
|
+
readonly Skills: typeof LandingSkills;
|
|
43
|
+
readonly Experience: typeof LandingExperience;
|
|
44
|
+
readonly Metrics: typeof LandingMetrics;
|
|
45
|
+
readonly Contact: typeof LandingContact;
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/landing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhI,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,GACZ,MAAM,SAAS,CAAA;AAIhB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;CAeV,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/landing/themes/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,eAAO,MAAM,GAAG,EAAE,YAkDjB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corporate.d.ts","sourceRoot":"","sources":["../../../src/landing/themes/corporate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,eAAO,MAAM,SAAS,EAAE,YAkDvB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/landing/themes/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,eAAO,MAAM,SAAS,EAAE,YAkDvB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"immersive.d.ts","sourceRoot":"","sources":["../../../src/landing/themes/immersive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,eAAO,MAAM,SAAS,EAAE,YAkDvB,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { LandingTheme, LandingThemeName, DeepPartial } from '../types';
|
|
2
|
+
import { corporate } from './corporate';
|
|
3
|
+
import { marketing } from './marketing';
|
|
4
|
+
import { product } from './product';
|
|
5
|
+
import { dashboard } from './dashboard';
|
|
6
|
+
import { app } from './app';
|
|
7
|
+
import { immersive } from './immersive';
|
|
8
|
+
import { portfolio } from './portfolio';
|
|
9
|
+
export declare function resolveTheme(theme: LandingThemeName | LandingTheme): LandingTheme;
|
|
10
|
+
/** 기존 테마를 기반으로 커스텀 테마 생성 */
|
|
11
|
+
export declare function createLandingTheme(base: LandingThemeName, overrides: DeepPartial<Omit<LandingTheme, 'name'>> & {
|
|
12
|
+
name: string;
|
|
13
|
+
}): LandingTheme;
|
|
14
|
+
export { corporate, marketing, product, dashboard, app, immersive, portfolio };
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/landing/themes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAYvC,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,GAAG,YAAY,CAKjF;AAED,4BAA4B;AAC5B,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GACpE,YAAY,CAcd;AAED,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketing.d.ts","sourceRoot":"","sources":["../../../src/landing/themes/marketing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,eAAO,MAAM,SAAS,EAAE,YAkDvB,CAAA"}
|