@hua-labs/ui 2.1.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -67
- package/dist/{ComponentLayout-btJq4TjA.d.mts → ComponentLayout-DrZpz0yv.d.mts} +1 -1
- package/dist/Section-BWzyshgX.d.mts +67 -0
- package/dist/advanced/dashboard.d.ts.map +1 -1
- package/dist/advanced-dashboard.d.mts +1 -1
- package/dist/advanced-dashboard.js +4 -4
- package/dist/advanced-dashboard.js.map +1 -1
- package/dist/advanced-dashboard.mjs +3 -3
- package/dist/advanced-dashboard.mjs.map +1 -1
- package/dist/advanced-emotion.js +1 -1
- package/dist/advanced-emotion.js.map +1 -1
- package/dist/advanced-emotion.mjs +1 -1
- package/dist/advanced-motion.d.mts +65 -1
- package/dist/advanced-motion.js +14 -14
- package/dist/advanced-motion.js.map +1 -1
- package/dist/advanced-motion.mjs +1 -1
- package/dist/advanced.d.mts +4 -4
- package/dist/advanced.js +16 -16
- package/dist/advanced.js.map +1 -1
- package/dist/advanced.mjs +3 -3
- package/dist/advanced.mjs.map +1 -1
- package/dist/chunk-3CCF7U3P.mjs +3 -0
- package/dist/{chunk-IFSEJVOR.mjs.map → chunk-3CCF7U3P.mjs.map} +1 -1
- package/dist/chunk-3GAUTZXQ.mjs +3 -0
- package/dist/{chunk-X7ZIWYRC.mjs.map → chunk-3GAUTZXQ.mjs.map} +1 -1
- package/dist/chunk-42RGFEL2.mjs +3 -0
- package/dist/chunk-42RGFEL2.mjs.map +1 -0
- package/dist/chunk-4NJE7D6X.mjs +3 -0
- package/dist/chunk-4NJE7D6X.mjs.map +1 -0
- package/dist/chunk-6HVJFEDA.mjs +3 -0
- package/dist/chunk-6HVJFEDA.mjs.map +1 -0
- package/dist/chunk-7OYT3QSY.mjs +3 -0
- package/dist/chunk-7OYT3QSY.mjs.map +1 -0
- package/dist/chunk-ANYZ56VB.mjs +3 -0
- package/dist/{chunk-QQCELXFD.mjs.map → chunk-ANYZ56VB.mjs.map} +1 -1
- package/dist/chunk-AOSXB5JJ.mjs +4 -0
- package/dist/{chunk-GLZKT7JN.mjs.map → chunk-AOSXB5JJ.mjs.map} +1 -1
- package/dist/chunk-B544MRF7.mjs +3 -0
- package/dist/{chunk-SDFHJ4GB.mjs.map → chunk-B544MRF7.mjs.map} +1 -1
- package/dist/chunk-CVWWS25A.mjs +3 -0
- package/dist/chunk-CVWWS25A.mjs.map +1 -0
- package/dist/chunk-DYNBM24D.mjs +3 -0
- package/dist/{chunk-OSCMSA2Q.mjs.map → chunk-DYNBM24D.mjs.map} +1 -1
- package/dist/{chunk-NBJUE7NR.mjs → chunk-FX57OSYG.mjs} +2 -2
- package/dist/{chunk-NBJUE7NR.mjs.map → chunk-FX57OSYG.mjs.map} +1 -1
- package/dist/chunk-IJSYSNM5.mjs +3 -0
- package/dist/{chunk-IN7RWQCJ.mjs.map → chunk-IJSYSNM5.mjs.map} +1 -1
- package/dist/chunk-KJZGOL2Z.mjs +3 -0
- package/dist/{chunk-LOYAJIWO.mjs.map → chunk-KJZGOL2Z.mjs.map} +1 -1
- package/dist/chunk-KYRIUUQP.mjs +3 -0
- package/dist/{chunk-PAEKNQWW.mjs.map → chunk-KYRIUUQP.mjs.map} +1 -1
- package/dist/chunk-LSA7DU3N.mjs +73 -0
- package/dist/chunk-LSA7DU3N.mjs.map +1 -0
- package/dist/chunk-MDLCJASB.mjs +3 -0
- package/dist/{chunk-LH77I6HO.mjs.map → chunk-MDLCJASB.mjs.map} +1 -1
- package/dist/chunk-N56BUOCD.mjs +3 -0
- package/dist/{chunk-XV3Y7QVU.mjs.map → chunk-N56BUOCD.mjs.map} +1 -1
- package/dist/chunk-OFYITQXI.mjs +13 -0
- package/dist/chunk-OFYITQXI.mjs.map +1 -0
- package/dist/chunk-OZNST3EZ.mjs +3 -0
- package/dist/{chunk-SGEP3CQE.mjs.map → chunk-OZNST3EZ.mjs.map} +1 -1
- package/dist/chunk-RS6RKW5U.mjs +13 -0
- package/dist/{chunk-6KTHJ3EL.mjs.map → chunk-RS6RKW5U.mjs.map} +1 -1
- package/dist/{chunk-C4OACMTB.mjs → chunk-TXBZZJNR.mjs} +2 -2
- package/dist/{chunk-C4OACMTB.mjs.map → chunk-TXBZZJNR.mjs.map} +1 -1
- package/dist/chunk-TZ4YSHMC.mjs +3 -0
- package/dist/{chunk-UWHCM3S6.mjs.map → chunk-TZ4YSHMC.mjs.map} +1 -1
- package/dist/chunk-U6CTBZ2U.mjs +3 -0
- package/dist/chunk-U6CTBZ2U.mjs.map +1 -0
- package/dist/{chunk-PYBYZVSL.mjs → chunk-WP7VFE77.mjs} +2 -2
- package/dist/{chunk-PYBYZVSL.mjs.map → chunk-WP7VFE77.mjs.map} +1 -1
- package/dist/{chunk-FFH4ZFKS.mjs → chunk-XCZMLKPK.mjs} +2 -2
- package/dist/{chunk-FFH4ZFKS.mjs.map → chunk-XCZMLKPK.mjs.map} +1 -1
- package/dist/chunk-XGHT7WMO.mjs +3 -0
- package/dist/chunk-XGHT7WMO.mjs.map +1 -0
- package/dist/chunk-XL4KTJ4L.mjs +3 -0
- package/dist/{chunk-VWSBJUNI.mjs.map → chunk-XL4KTJ4L.mjs.map} +1 -1
- package/dist/chunk-Z74YUUVT.mjs +3 -0
- package/dist/chunk-Z74YUUVT.mjs.map +1 -0
- package/dist/chunk-ZXZIHU7J.mjs +8 -0
- package/dist/{chunk-N7M6RIN4.mjs.map → chunk-ZXZIHU7J.mjs.map} +1 -1
- package/dist/components/Card.d.ts.map +1 -1
- package/dist/components/DatePicker.d.ts.map +1 -1
- package/dist/components/Modal.d.ts.map +1 -1
- package/dist/components/Popover.d.ts +2 -0
- package/dist/components/Popover.d.ts.map +1 -1
- package/dist/components/Progress.d.ts +1 -0
- package/dist/components/Progress.d.ts.map +1 -1
- package/dist/components/Section.d.ts +44 -0
- package/dist/components/Section.d.ts.map +1 -0
- package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
- package/dist/components/advanced/DotNav.d.ts +26 -0
- package/dist/components/advanced/DotNav.d.ts.map +1 -0
- package/dist/components/advanced/HorizontalScroll.d.ts +20 -0
- package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -0
- package/dist/components/advanced/ImageReveal.d.ts +24 -0
- package/dist/components/advanced/ImageReveal.d.ts.map +1 -0
- package/dist/components/advanced/index.d.ts +6 -0
- package/dist/components/advanced/index.d.ts.map +1 -1
- package/dist/data.mjs +2 -2
- package/dist/data.mjs.map +1 -1
- package/dist/feedback.mjs +1 -1
- package/dist/form.js +3 -3
- package/dist/form.js.map +1 -1
- package/dist/form.mjs +4 -4
- package/dist/form.mjs.map +1 -1
- package/dist/{icons-Bj_nr8Ba.d.mts → icons-DmhQEH_E.d.mts} +6 -1
- package/dist/iconsax-extended.js +1 -1
- package/dist/iconsax-extended.js.map +1 -1
- package/dist/iconsax-extended.mjs +1 -1
- package/dist/iconsax-extended.mjs.map +1 -1
- package/dist/index.d.mts +9 -27
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/interactive.js +1 -1
- package/dist/interactive.js.map +1 -1
- package/dist/interactive.mjs +1 -1
- package/dist/interactive.mjs.map +1 -1
- package/dist/landing/LandingAbout.d.ts +3 -0
- package/dist/landing/LandingAbout.d.ts.map +1 -0
- package/dist/landing/LandingCTA.d.ts +3 -0
- package/dist/landing/LandingCTA.d.ts.map +1 -0
- package/dist/landing/LandingContact.d.ts +3 -0
- package/dist/landing/LandingContact.d.ts.map +1 -0
- package/dist/landing/LandingExperience.d.ts +3 -0
- package/dist/landing/LandingExperience.d.ts.map +1 -0
- package/dist/landing/LandingFeatures.d.ts +3 -0
- package/dist/landing/LandingFeatures.d.ts.map +1 -0
- package/dist/landing/LandingHero.d.ts +3 -0
- package/dist/landing/LandingHero.d.ts.map +1 -0
- package/dist/landing/LandingLogoCloud.d.ts +3 -0
- package/dist/landing/LandingLogoCloud.d.ts.map +1 -0
- package/dist/landing/LandingMetrics.d.ts +3 -0
- package/dist/landing/LandingMetrics.d.ts.map +1 -0
- package/dist/landing/LandingProjects.d.ts +3 -0
- package/dist/landing/LandingProjects.d.ts.map +1 -0
- package/dist/landing/LandingProvider.d.ts +4 -0
- package/dist/landing/LandingProvider.d.ts.map +1 -0
- package/dist/landing/LandingShowcase.d.ts +3 -0
- package/dist/landing/LandingShowcase.d.ts.map +1 -0
- package/dist/landing/LandingSkills.d.ts +3 -0
- package/dist/landing/LandingSkills.d.ts.map +1 -0
- package/dist/landing/LandingStats.d.ts +3 -0
- package/dist/landing/LandingStats.d.ts.map +1 -0
- package/dist/landing/LandingTestimonials.d.ts +3 -0
- package/dist/landing/LandingTestimonials.d.ts.map +1 -0
- package/dist/landing/index.d.ts +47 -0
- package/dist/landing/index.d.ts.map +1 -0
- package/dist/landing/themes/app.d.ts +3 -0
- package/dist/landing/themes/app.d.ts.map +1 -0
- package/dist/landing/themes/corporate.d.ts +3 -0
- package/dist/landing/themes/corporate.d.ts.map +1 -0
- package/dist/landing/themes/dashboard.d.ts +3 -0
- package/dist/landing/themes/dashboard.d.ts.map +1 -0
- package/dist/landing/themes/immersive.d.ts +3 -0
- package/dist/landing/themes/immersive.d.ts.map +1 -0
- package/dist/landing/themes/index.d.ts +15 -0
- package/dist/landing/themes/index.d.ts.map +1 -0
- package/dist/landing/themes/marketing.d.ts +3 -0
- package/dist/landing/themes/marketing.d.ts.map +1 -0
- package/dist/landing/themes/portfolio.d.ts +3 -0
- package/dist/landing/themes/portfolio.d.ts.map +1 -0
- package/dist/landing/themes/product.d.ts +3 -0
- package/dist/landing/themes/product.d.ts.map +1 -0
- package/dist/landing/types.d.ts +346 -0
- package/dist/landing/types.d.ts.map +1 -0
- package/dist/landing.d.mts +417 -0
- package/dist/landing.js +100 -0
- package/dist/landing.js.map +1 -0
- package/dist/landing.mjs +31 -0
- package/dist/landing.mjs.map +1 -0
- package/dist/lib/icons.d.ts +6 -1
- package/dist/lib/icons.d.ts.map +1 -1
- package/dist/navigation.d.mts +1 -1
- package/dist/navigation.js +2 -2
- package/dist/navigation.js.map +1 -1
- package/dist/navigation.mjs +1 -1
- package/dist/navigation.mjs.map +1 -1
- package/dist/overlay.d.mts +2 -0
- package/dist/overlay.js +1 -1
- package/dist/overlay.js.map +1 -1
- package/dist/overlay.mjs +1 -1
- package/dist/overlay.mjs.map +1 -1
- package/dist/sdui.js +4 -4
- package/dist/sdui.js.map +1 -1
- package/dist/sdui.mjs +1 -1
- package/dist/sdui.mjs.map +1 -1
- package/package.json +16 -10
- package/src/styles/landing.css +107 -0
- package/src/styles/utilities.css +58 -0
- package/dist/chunk-6KTHJ3EL.mjs +0 -13
- 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-GLZKT7JN.mjs +0 -4
- package/dist/chunk-HN5LSP6L.mjs +0 -3
- package/dist/chunk-HN5LSP6L.mjs.map +0 -1
- package/dist/chunk-IFSEJVOR.mjs +0 -3
- package/dist/chunk-IN7RWQCJ.mjs +0 -3
- package/dist/chunk-LH77I6HO.mjs +0 -3
- package/dist/chunk-LOYAJIWO.mjs +0 -3
- package/dist/chunk-LPAG7DCA.mjs +0 -3
- package/dist/chunk-LPAG7DCA.mjs.map +0 -1
- package/dist/chunk-N7M6RIN4.mjs +0 -8
- package/dist/chunk-OSCMSA2Q.mjs +0 -3
- package/dist/chunk-PAEKNQWW.mjs +0 -3
- package/dist/chunk-QQCELXFD.mjs +0 -3
- package/dist/chunk-RPUS7G7Q.mjs +0 -3
- package/dist/chunk-RPUS7G7Q.mjs.map +0 -1
- package/dist/chunk-SDFHJ4GB.mjs +0 -3
- package/dist/chunk-SGEP3CQE.mjs +0 -3
- package/dist/chunk-UUHAXGMO.mjs +0 -3
- package/dist/chunk-UUHAXGMO.mjs.map +0 -1
- package/dist/chunk-UWHCM3S6.mjs +0 -3
- package/dist/chunk-VWSBJUNI.mjs +0 -3
- package/dist/chunk-X7ZIWYRC.mjs +0 -3
- package/dist/chunk-XV3Y7QVU.mjs +0 -3
package/dist/sdui.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {a as a$8,b as b$6,c as c$3,d as d$3,f as f$1,g,h,e as e$2}from'./chunk-XV3Y7QVU.mjs';import {b as b$2,a as a$6}from'./chunk-RPUS7G7Q.mjs';import {a,b}from'./chunk-GLZKT7JN.mjs';import {c as c$2,b as b$3,a as a$4}from'./chunk-IN7RWQCJ.mjs';import {a as a$3}from'./chunk-N7M6RIN4.mjs';import {f,e,d,c,b as b$1,a as a$2}from'./chunk-BXX2TZUB.mjs';import {a as a$5}from'./chunk-IFSEJVOR.mjs';import {b as b$4,a as a$7}from'./chunk-UWHCM3S6.mjs';import {c as c$1,d as d$2,b as b$5}from'./chunk-SGEP3CQE.mjs';import {d as d$1}from'./chunk-FFH4ZFKS.mjs';import {l}from'./chunk-HN5LSP6L.mjs';import {a as a$1}from'./chunk-C4OACMTB.mjs';import {e as e$1}from'./chunk-UUHAXGMO.mjs';import {createContext,useState,useContext,useMemo,useCallback}from'react';import {jsx,jsxs}from'react/jsx-runtime';var fe=({children:e,justify:t,align:r,className:n="",style:o,backgroundColor:s,padding:a,margin:c,borderRadius:i,border:u,...m})=>{let d={...o,...s&&{backgroundColor:s},...a!==void 0&&{padding:typeof a=="number"?`${a}px`:a},...c!==void 0&&{margin:typeof c=="number"?`${c}px`:c},...i!==void 0&&{borderRadius:typeof i=="number"?`${i}px`:i},...u&&{border:u}};return jsx("div",{className:e$1((t||r)&&"flex",t&&oe[t],r&&ae[r],n),style:Object.keys(d).length>0?d:void 0,...m,children:e})},ye=({size:e=16,className:t=""})=>jsx("div",{className:t,style:{width:e,height:e,flexShrink:0}}),oe={start:"justify-start",center:"justify-center",end:"justify-end",between:"justify-between"},ae={start:"items-start",center:"items-center",end:"items-end",stretch:"items-stretch"},Se=({children:e,direction:t="row",gap:r=0,justify:n="start",align:o="stretch",className:s="",style:a,backgroundColor:c,padding:i,...u})=>{let m={gap:`${r*4}px`,...a,...c&&{backgroundColor:c},...i!==void 0&&{padding:typeof i=="number"?`${i}px`:i}};return jsx("div",{className:`flex ${t==="column"?"flex-col":"flex-row"} ${oe[n]} ${ae[o]} ${s}`,style:m,...u,children:e})},be=({children:e,cols:t=1,gap:r=4,className:n="",style:o,backgroundColor:s,padding:a,...c})=>{let i={gridTemplateColumns:`repeat(${t}, 1fr)`,gap:`${r*4}px`,...o,...s&&{backgroundColor:s},...a!==void 0&&{padding:typeof a=="number"?`${a}px`:a}};return jsx("div",{className:`grid ${n}`,style:i,...c,children:e})},y={left:"text-left",center:"text-center",right:"text-right"};function S(e){let t={};return e.fontSize&&(t.fontSize=e.fontSize),e.lineHeight&&(t.lineHeight=e.lineHeight),e.fontWeight&&(t.fontWeight=e.fontWeight),e.letterSpacing&&(t.letterSpacing=e.letterSpacing),t}var he=({children:e,variant:t="body",align:r="center",className:n="",style:o,fontSize:s,lineHeight:a,fontWeight:c,letterSpacing:i,...u})=>{let m={body:"text-foreground",muted:"text-muted-foreground text-sm",lead:"text-xl text-muted-foreground"},d=S({fontSize:s,lineHeight:a,fontWeight:c,letterSpacing:i}),g=Object.keys(d).length>0?{...o,...d}:o;return jsx("p",{className:`${m[t]} ${y[r]} ${n}`,style:g,...u,children:e})},xe=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h1",{className:`text-4xl md:text-5xl font-bold ${y[t]} ${r}`,style:m,...i,children:e})},Re=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h2",{className:`text-3xl md:text-4xl font-bold ${y[t]} ${r}`,style:m,...i,children:e})},ve=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h3",{className:`text-2xl md:text-3xl font-semibold ${y[t]} ${r}`,style:m,...i,children:e})},Ie=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h4",{className:`text-xl md:text-2xl font-semibold ${y[t]} ${r}`,style:m,...i,children:e})},ke=({children:e,href:t="#",className:r="",...n})=>{let o=t.startsWith("http://")||t.startsWith("https://");return jsx("a",{href:t,className:`text-primary hover:underline ${r}`,...o?{target:"_blank",rel:"noopener noreferrer"}:{},...n,children:e})},Ce=({className:e="",alt:t="",...r})=>jsx("img",{className:`max-w-full h-auto ${e}`,alt:t,...r}),De=({name:e="star",size:t=24,className:r=""})=>jsx(l,{name:e,size:t,className:r}),Ue=({children:e,className:t="",...r})=>jsx("section",{className:`py-10 ${t}`,...r,children:e}),we=({className:e="",...t})=>jsx("hr",{className:`border-border ${e}`,...t}),Te=({children:e,sticky:t=true,transparent:r=false,blur:n=true,overlay:o=false,className:s="",...a})=>jsx("header",{className:e$1("w-full px-4 py-3 z-50",o?"absolute top-0 left-0 right-0":t&&"sticky top-0",r?"bg-transparent":"bg-background/80",n&&!r&&"backdrop-blur-md",!r&&"border-b border-border",s),...a,children:jsx("div",{className:"max-w-7xl mx-auto",children:e})}),Pe=({defaultChecked:e=false,onChange:t,...r})=>{let[n,o]=useState(e);return jsx(b$4,{...r,checked:n,onChange:s=>{o(s.target.checked),t==null||t(s);}})},He=({defaultChecked:e=false,onChange:t,...r})=>{let[n,o]=useState(e);return jsx(d$2,{...r,checked:n,onChange:s=>{o(s.target.checked),t==null||t(s);}})},Ne=({defaultValue:e="",onChange:t,...r})=>{let[n,o]=useState(e);return jsx(b$5,{...r,value:n,onChange:s=>{o(s.target.value),t==null||t(s);}})},$e=({defaultValue:e="",onChange:t,resize:r="vertical",...n})=>{let[o,s]=useState(e);return jsx(a$7,{...n,resize:r,value:o,onChange:a=>{s(a.target.value),t==null||t(a);}})},Fe=({items:e=[],type:t="single",collapsible:r=true,defaultValue:n,className:o=""})=>jsx(a$8,{type:t,collapsible:r,defaultValue:n,className:o,children:e.map((s,a)=>{let c=s.value||`item-${a}`;return jsxs(b$6,{value:c,children:[jsx(c$3,{children:s.title}),jsx(d$3,{children:s.content})]},c)})}),Me=({tabs:e=[],defaultValue:t,variant:r="default",className:n=""})=>{var s;let o=((s=e[0])==null?void 0:s.value)||"tab-0";return jsxs(f$1,{defaultValue:t||o,variant:r,className:n,children:[jsx(g,{children:e.map((a,c)=>{let i=a.value||`tab-${c}`;return jsx(h,{value:i,children:a.label},i)})}),e.map((a,c)=>{let i=a.value||`tab-${c}`;return jsx(e$2,{value:i,children:a.content},i)})]})},R={Box:fe,Spacer:ye,Flex:Se,Grid:be,Section:Ue,Container:a$6,Divider:we,Text:he,H1:xe,H2:Re,H3:ve,H4:Ie,Link:ke,Image:Ce,Icon:De,Button:d$1,Badge:a$5,Avatar:a$4,AvatarImage:b$3,AvatarFallback:c$2,Input:Ne,Textarea:$e,Label:c$1,Checkbox:Pe,Switch:He,Skeleton:a$3,Progress:b$2,Card:a$2,CardHeader:b$1,CardTitle:c,CardDescription:d,CardContent:e,CardFooter:f,Alert:a$1,Header:Te,HeroSection:b,ScrollProgress:a,Accordion:Fe,Tabs:Me};function Le(e){return {...R,...e}}function Ae(e,t){return t in e}var le=createContext(null);function ue(){let e=useContext(le);if(!e)throw new Error("useSDUI must be used within SDUIRenderer");return e}function v(e,t){return t.split(".").reduce((r,n)=>{if(r&&typeof r=="object"&&n in r)return r[n]},e)}function Ve(e,t,r){let n=t.split("."),o={...e},s=o;for(let a=0;a<n.length-1;a++){let c=n[a];s[c]={...s[c]||{}},s=s[c];}return s[n[n.length-1]]=r,o}function ze(e,t){let r=v(t,e.path);switch(e.operator){case "eq":return r===e.value;case "neq":return r!==e.value;case "gt":return typeof r=="number"&&r>e.value;case "lt":return typeof r=="number"&&r<e.value;case "gte":return typeof r=="number"&&r>=e.value;case "lte":return typeof r=="number"&&r<=e.value;case "exists":return r!=null;case "notExists":return r==null;default:return true}}function C(e,t){let r={};for(let[n,o]of Object.entries(e))if(typeof o=="string"){let s=o.match(/^\{\{\s*(.+?)\s*\}\}$/);s?r[n]=v(t,s[1]):r[n]=o.replace(/\{\{\s*(.+?)\s*\}\}/g,(a,c)=>{let i=v(t,c);return i!==void 0?String(i):""});}else Array.isArray(o)?r[n]=o.map(s=>typeof s=="object"&&s!==null?C(s,t):s):typeof o=="object"&&o!==null?r[n]=C(o,t):r[n]=o;return r}function me({node:e,registry:t}){let{data:r,handleAction:n}=ue();if(e.when&&!ze(e.when,r))return null;let o=t[e.type];if(!o)return console.warn(`[SDUI] Unknown component type: ${e.type}`),jsxs("div",{className:"p-4 border border-destructive/50 bg-destructive/10 rounded text-sm text-destructive",children:["Unknown component: ",e.type]});let s=e.props?C(e.props,r):{},a={};e.on&&(e.on.click&&(a.onClick=()=>n(e.on.click)),e.on.submit&&(a.onSubmit=m=>{m.preventDefault(),n(e.on.submit);}));let c=null;return e.children&&(typeof e.children=="string"?c=e.children.replace(/\{\{\s*(.+?)\s*\}\}/g,(m,d)=>{let g=v(r,d);return g!==void 0?String(g):""}):Array.isArray(e.children)&&(c=e.children.map((m,d)=>jsx(me,{node:m,registry:t},m.key||`child-${d}`)))),["Divider","Input","Textarea","Checkbox","Switch","Progress","Skeleton","Image","ScrollProgress"].includes(e.type)||c===null?jsx(o,{...s,...a}):jsx(o,{...s,...a,children:c})}function de({schema:e,components:t,data:r={},onAction:n,onNavigate:o}){let s="root"in e,a=s?e.root:e,c=s?e.data:{},[i,u]=useState({...c,...r}),m=useMemo(()=>({...R,...t}),[t]),d=useCallback((p,b)=>{u(h=>Ve(h,p,b));},[]),g=useCallback(p=>{o?o(p):typeof window!="undefined"&&(window.location.href=p);},[o]),D=useCallback(p=>{var b,h,U;switch(p.type){case "navigate":g((b=p.payload)==null?void 0:b.path);break;case "setState":(h=p.payload)!=null&&h.path&&((U=p.payload)==null?void 0:U.value)!==void 0&&d(p.payload.path,p.payload.value);break;case "api":n==null||n(p);break;case "custom":n==null||n(p);break;default:n==null||n(p);}},[g,d,n]),ge=useMemo(()=>({data:i,setData:d,handleAction:D,navigate:g}),[i,d,D,g]);return jsx(le.Provider,{value:ge,children:jsx(me,{node:a,registry:m})})}function We({json:e,...t}){try{let r=JSON.parse(e);return jsx(de,{schema:r,...t})}catch(r){return jsxs("div",{className:"p-4 border border-destructive bg-destructive/10 rounded",children:[jsx("p",{className:"font-semibold text-destructive",children:"SDUI Parse Error"}),jsx("pre",{className:"text-sm mt-2 text-destructive/80",children:r.message})]})}}
|
|
2
|
+
import {a as a$9,b as b$5,c as c$3,d as d$3,f as f$2,g,h,e as e$1}from'./chunk-N56BUOCD.mjs';import {a as a$3}from'./chunk-42RGFEL2.mjs';import {a as a$7}from'./chunk-CVWWS25A.mjs';import {a,b}from'./chunk-AOSXB5JJ.mjs';import {c as c$2,b as b$2,a as a$5}from'./chunk-IJSYSNM5.mjs';import {a as a$4}from'./chunk-ZXZIHU7J.mjs';import {f,e,d,c,b as b$1,a as a$2}from'./chunk-6HVJFEDA.mjs';import {a as a$6}from'./chunk-3CCF7U3P.mjs';import {b as b$3,a as a$8}from'./chunk-TZ4YSHMC.mjs';import {c as c$1,d as d$2,b as b$4}from'./chunk-OZNST3EZ.mjs';import {d as d$1}from'./chunk-XCZMLKPK.mjs';import {l}from'./chunk-7OYT3QSY.mjs';import {a as a$1}from'./chunk-TXBZZJNR.mjs';import {f as f$1}from'./chunk-U6CTBZ2U.mjs';import {createContext,useState,useContext,useMemo,useCallback}from'react';import {jsx,jsxs}from'react/jsx-runtime';var fe=({children:e,justify:t,align:r,className:n="",style:o,backgroundColor:s,padding:a,margin:c,borderRadius:i,border:u,...m})=>{let d={...o,...s&&{backgroundColor:s},...a!==void 0&&{padding:typeof a=="number"?`${a}px`:a},...c!==void 0&&{margin:typeof c=="number"?`${c}px`:c},...i!==void 0&&{borderRadius:typeof i=="number"?`${i}px`:i},...u&&{border:u}};return jsx("div",{className:f$1((t||r)&&"flex",t&&oe[t],r&&ae[r],n),style:Object.keys(d).length>0?d:void 0,...m,children:e})},ye=({size:e=16,className:t=""})=>jsx("div",{className:t,style:{width:e,height:e,flexShrink:0}}),oe={start:"justify-start",center:"justify-center",end:"justify-end",between:"justify-between"},ae={start:"items-start",center:"items-center",end:"items-end",stretch:"items-stretch"},Se=({children:e,direction:t="row",gap:r=0,justify:n="start",align:o="stretch",className:s="",style:a,backgroundColor:c,padding:i,...u})=>{let m={gap:`${r*4}px`,...a,...c&&{backgroundColor:c},...i!==void 0&&{padding:typeof i=="number"?`${i}px`:i}};return jsx("div",{className:`flex ${t==="column"?"flex-col":"flex-row"} ${oe[n]} ${ae[o]} ${s}`,style:m,...u,children:e})},be=({children:e,cols:t=1,gap:r=4,className:n="",style:o,backgroundColor:s,padding:a,...c})=>{let i={gridTemplateColumns:`repeat(${t}, 1fr)`,gap:`${r*4}px`,...o,...s&&{backgroundColor:s},...a!==void 0&&{padding:typeof a=="number"?`${a}px`:a}};return jsx("div",{className:`grid ${n}`,style:i,...c,children:e})},y={left:"text-left",center:"text-center",right:"text-right"};function S(e){let t={};return e.fontSize&&(t.fontSize=e.fontSize),e.lineHeight&&(t.lineHeight=e.lineHeight),e.fontWeight&&(t.fontWeight=e.fontWeight),e.letterSpacing&&(t.letterSpacing=e.letterSpacing),t}var he=({children:e,variant:t="body",align:r="center",className:n="",style:o,fontSize:s,lineHeight:a,fontWeight:c,letterSpacing:i,...u})=>{let m={body:"text-foreground",muted:"text-muted-foreground text-sm",lead:"text-xl text-muted-foreground"},d=S({fontSize:s,lineHeight:a,fontWeight:c,letterSpacing:i}),g=Object.keys(d).length>0?{...o,...d}:o;return jsx("p",{className:`${m[t]} ${y[r]} ${n}`,style:g,...u,children:e})},xe=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h1",{className:`text-4xl md:text-5xl font-bold ${y[t]} ${r}`,style:m,...i,children:e})},Re=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h2",{className:`text-3xl md:text-4xl font-bold ${y[t]} ${r}`,style:m,...i,children:e})},ve=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h3",{className:`text-2xl md:text-3xl font-semibold ${y[t]} ${r}`,style:m,...i,children:e})},Ie=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h4",{className:`text-xl md:text-2xl font-semibold ${y[t]} ${r}`,style:m,...i,children:e})},ke=({children:e,href:t="#",className:r="",...n})=>{let o=t.startsWith("http://")||t.startsWith("https://");return jsx("a",{href:t,className:`text-primary hover:underline ${r}`,...o?{target:"_blank",rel:"noopener noreferrer"}:{},...n,children:e})},Ce=({className:e="",alt:t="",...r})=>jsx("img",{className:`max-w-full h-auto ${e}`,alt:t,...r}),De=({name:e="star",size:t=24,className:r=""})=>jsx(l,{name:e,size:t,className:r}),Ue=({children:e,className:t="",...r})=>jsx("section",{className:`py-10 ${t}`,...r,children:e}),we=({className:e="",...t})=>jsx("hr",{className:`border-border ${e}`,...t}),Te=({children:e,sticky:t=true,transparent:r=false,blur:n=true,overlay:o=false,className:s="",...a})=>jsx("header",{className:f$1("w-full px-4 py-3 z-50",o?"absolute top-0 left-0 right-0":t&&"sticky top-0",r?"bg-transparent":"bg-background/80",n&&!r&&"backdrop-blur-md",!r&&"border-b border-border",s),...a,children:jsx("div",{className:"max-w-7xl mx-auto",children:e})}),Pe=({defaultChecked:e=false,onChange:t,...r})=>{let[n,o]=useState(e);return jsx(b$3,{...r,checked:n,onChange:s=>{o(s.target.checked),t==null||t(s);}})},He=({defaultChecked:e=false,onChange:t,...r})=>{let[n,o]=useState(e);return jsx(d$2,{...r,checked:n,onChange:s=>{o(s.target.checked),t==null||t(s);}})},Ne=({defaultValue:e="",onChange:t,...r})=>{let[n,o]=useState(e);return jsx(b$4,{...r,value:n,onChange:s=>{o(s.target.value),t==null||t(s);}})},$e=({defaultValue:e="",onChange:t,resize:r="vertical",...n})=>{let[o,s]=useState(e);return jsx(a$8,{...n,resize:r,value:o,onChange:a=>{s(a.target.value),t==null||t(a);}})},Fe=({items:e=[],type:t="single",collapsible:r=true,defaultValue:n,className:o=""})=>jsx(a$9,{type:t,collapsible:r,defaultValue:n,className:o,children:e.map((s,a)=>{let c=s.value||`item-${a}`;return jsxs(b$5,{value:c,children:[jsx(c$3,{children:s.title}),jsx(d$3,{children:s.content})]},c)})}),Me=({tabs:e=[],defaultValue:t,variant:r="default",className:n=""})=>{var s;let o=((s=e[0])==null?void 0:s.value)||"tab-0";return jsxs(f$2,{defaultValue:t||o,variant:r,className:n,children:[jsx(g,{children:e.map((a,c)=>{let i=a.value||`tab-${c}`;return jsx(h,{value:i,children:a.label},i)})}),e.map((a,c)=>{let i=a.value||`tab-${c}`;return jsx(e$1,{value:i,children:a.content},i)})]})},R={Box:fe,Spacer:ye,Flex:Se,Grid:be,Section:Ue,Container:a$7,Divider:we,Text:he,H1:xe,H2:Re,H3:ve,H4:Ie,Link:ke,Image:Ce,Icon:De,Button:d$1,Badge:a$6,Avatar:a$5,AvatarImage:b$2,AvatarFallback:c$2,Input:Ne,Textarea:$e,Label:c$1,Checkbox:Pe,Switch:He,Skeleton:a$4,Progress:a$3,Card:a$2,CardHeader:b$1,CardTitle:c,CardDescription:d,CardContent:e,CardFooter:f,Alert:a$1,Header:Te,HeroSection:b,ScrollProgress:a,Accordion:Fe,Tabs:Me};function Le(e){return {...R,...e}}function Ae(e,t){return t in e}var le=createContext(null);function ue(){let e=useContext(le);if(!e)throw new Error("useSDUI must be used within SDUIRenderer");return e}function v(e,t){return t.split(".").reduce((r,n)=>{if(r&&typeof r=="object"&&n in r)return r[n]},e)}function Ve(e,t,r){let n=t.split("."),o={...e},s=o;for(let a=0;a<n.length-1;a++){let c=n[a];s[c]={...s[c]||{}},s=s[c];}return s[n[n.length-1]]=r,o}function ze(e,t){let r=v(t,e.path);switch(e.operator){case "eq":return r===e.value;case "neq":return r!==e.value;case "gt":return typeof r=="number"&&r>e.value;case "lt":return typeof r=="number"&&r<e.value;case "gte":return typeof r=="number"&&r>=e.value;case "lte":return typeof r=="number"&&r<=e.value;case "exists":return r!=null;case "notExists":return r==null;default:return true}}function C(e,t){let r={};for(let[n,o]of Object.entries(e))if(typeof o=="string"){let s=o.match(/^\{\{\s*(.+?)\s*\}\}$/);s?r[n]=v(t,s[1]):r[n]=o.replace(/\{\{\s*(.+?)\s*\}\}/g,(a,c)=>{let i=v(t,c);return i!==void 0?String(i):""});}else Array.isArray(o)?r[n]=o.map(s=>typeof s=="object"&&s!==null?C(s,t):s):typeof o=="object"&&o!==null?r[n]=C(o,t):r[n]=o;return r}function me({node:e,registry:t}){let{data:r,handleAction:n}=ue();if(e.when&&!ze(e.when,r))return null;let o=t[e.type];if(!o)return console.warn(`[SDUI] Unknown component type: ${e.type}`),jsxs("div",{className:"p-4 border border-destructive/50 bg-destructive/10 rounded text-sm text-destructive",children:["Unknown component: ",e.type]});let s=e.props?C(e.props,r):{},a={};e.on&&(e.on.click&&(a.onClick=()=>n(e.on.click)),e.on.submit&&(a.onSubmit=m=>{m.preventDefault(),n(e.on.submit);}));let c=null;return e.children&&(typeof e.children=="string"?c=e.children.replace(/\{\{\s*(.+?)\s*\}\}/g,(m,d)=>{let g=v(r,d);return g!==void 0?String(g):""}):Array.isArray(e.children)&&(c=e.children.map((m,d)=>jsx(me,{node:m,registry:t},m.key||`child-${d}`)))),["Divider","Input","Textarea","Checkbox","Switch","Progress","Skeleton","Image","ScrollProgress"].includes(e.type)||c===null?jsx(o,{...s,...a}):jsx(o,{...s,...a,children:c})}function de({schema:e,components:t,data:r={},onAction:n,onNavigate:o}){let s="root"in e,a=s?e.root:e,c=s?e.data:{},[i,u]=useState({...c,...r}),m=useMemo(()=>({...R,...t}),[t]),d=useCallback((p,b)=>{u(h=>Ve(h,p,b));},[]),g=useCallback(p=>{o?o(p):typeof window!="undefined"&&(window.location.href=p);},[o]),D=useCallback(p=>{var b,h,U;switch(p.type){case "navigate":g((b=p.payload)==null?void 0:b.path);break;case "setState":(h=p.payload)!=null&&h.path&&((U=p.payload)==null?void 0:U.value)!==void 0&&d(p.payload.path,p.payload.value);break;case "api":n==null||n(p);break;case "custom":n==null||n(p);break;default:n==null||n(p);}},[g,d,n]),ge=useMemo(()=>({data:i,setData:d,handleAction:D,navigate:g}),[i,d,D,g]);return jsx(le.Provider,{value:ge,children:jsx(me,{node:a,registry:m})})}function We({json:e,...t}){try{let r=JSON.parse(e);return jsx(de,{schema:r,...t})}catch(r){return jsxs("div",{className:"p-4 border border-destructive bg-destructive/10 rounded",children:[jsx("p",{className:"font-semibold text-destructive",children:"SDUI Parse Error"}),jsx("pre",{className:"text-sm mt-2 text-destructive/80",children:r.message})]})}}
|
|
3
3
|
export{We as SDUIFromJSON,de as SDUIRenderer,R as defaultRegistry,Le as extendRegistry,Ae as hasComponent,ue as useSDUI};//# sourceMappingURL=sdui.mjs.map
|
|
4
4
|
//# sourceMappingURL=sdui.mjs.map
|
package/dist/sdui.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sdui/registry.tsx","../src/sdui/SDUIRenderer.tsx"],"names":["Box","children","justify","align","className","style","backgroundColor","padding","margin","borderRadius","border","props","customStyle","jsx","cn","justifyMap","alignMap","Spacer","size","Flex","direction","gap","Grid","cols","textAlignMap","getTypographyStyle","Text","variant","fontSize","lineHeight","fontWeight","letterSpacing","variantClasses","typoStyle","mergedStyle","H1","H2","H3","H4","Link","href","isExternal","Image","alt","SDUIIcon","name","Icon","Section","Divider","Header","sticky","transparent","blur","overlay","SDUICheckbox","defaultChecked","onChange","checked","setChecked","useState","Checkbox","e","SDUISwitch","Switch","SDUIInput","defaultValue","value","setValue","Input","SDUITextarea","resize","Textarea","SDUIAccordion","items","type","collapsible","Accordion","item","index","jsxs","AccordionItem","AccordionTrigger","AccordionContent","SDUITabs","tabs","_a","firstValue","Tabs","TabsList","tab","TabsTrigger","TabsContent","defaultRegistry","Container","Button","Badge","Avatar","AvatarImage","AvatarFallback","Label","Skeleton","Progress","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Alert","HeroSection","ScrollProgress","extendRegistry","customComponents","hasComponent","registry","SDUIContextInternal","createContext","useSDUI","context","useContext","getByPath","obj","path","acc","key","setByPath","keys","result","current","i","evaluateCondition","condition","data","resolveProps","resolved","bindingMatch","_","val","NodeRenderer","node","handleAction","Component","resolvedProps","eventProps","child","SDUIRenderer","schema","components","initialData","onAction","onNavigate","isPageSchema","rootNode","schemaData","setDataState","useMemo","setData","useCallback","prev","navigate","action","_b","_c","contextValue","SDUIFromJSON","json","error"],"mappings":"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","file":"sdui.mjs","sourcesContent":["\"use client\";\n\n/**\n * SDUI Component Registry\n *\n * 컴포넌트 타입 문자열 → 실제 React 컴포넌트 매핑\n */\n\nimport React, { useState } from \"react\";\nimport type { SDUIComponentRegistry } from \"./types\";\nimport { cn } from \"../lib/utils\";\n\n// 기본 컴포넌트들\nimport { Button } from \"../components/Button\";\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from \"../components/Card\";\nimport { Badge } from \"../components/Badge\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../components/Avatar\";\nimport { Container } from \"../components/Container\";\nimport { Input } from \"../components/Input\";\nimport { Textarea } from \"../components/Textarea\";\nimport { Label } from \"../components/Label\";\nimport { Checkbox, type CheckboxProps } from \"../components/Checkbox\";\nimport { Switch, type SwitchProps } from \"../components/Switch\";\nimport { type InputProps } from \"../components/Input\";\nimport { type TextareaProps } from \"../components/Textarea\";\nimport { Skeleton } from \"../components/Skeleton\";\nimport { Progress } from \"../components/Progress\";\nimport { Alert } from \"../components/Alert\";\nimport { Icon } from \"../components/Icon\";\nimport type { IconName } from \"../lib/icons\";\n\n// Advanced 컴포넌트들\nimport { HeroSection } from \"../components/HeroSection\";\nimport { ScrollProgress } from \"../components/ScrollProgress\";\n\n// Interactive 컴포넌트들\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from \"../components/Accordion\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"../components/Tabs\";\n\n// 레이아웃 프리미티브\nconst Box: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n // 커스텀 스타일 props (DOM에 직접 전달하지 않음)\n backgroundColor?: string;\n padding?: string | number;\n margin?: string | number;\n borderRadius?: string | number;\n border?: string;\n}> = ({\n children,\n justify,\n align,\n className = \"\",\n style,\n // 커스텀 props 분리 (DOM에 전달 X)\n backgroundColor,\n padding,\n margin,\n borderRadius,\n border,\n ...props\n}) => {\n // 커스텀 props를 style 객체로 병합\n const customStyle: React.CSSProperties = {\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n ...(margin !== undefined && { margin: typeof margin === 'number' ? `${margin}px` : margin }),\n ...(borderRadius !== undefined && { borderRadius: typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius }),\n ...(border && { border }),\n };\n\n return (\n <div\n className={cn(\n (justify || align) && \"flex\",\n justify && justifyMap[justify],\n align && alignMap[align],\n className\n )}\n style={Object.keys(customStyle).length > 0 ? customStyle : undefined}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// Spacer - 공백용 void 컴포넌트\nconst Spacer: React.FC<{ size?: number; className?: string }> = ({ size = 16, className = \"\" }) => (\n <div className={className} style={{ width: size, height: size, flexShrink: 0 }} />\n);\n\n// 정렬 매핑\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n};\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n};\n\nconst Flex: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n direction?: \"row\" | \"column\";\n gap?: number;\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n direction = \"row\",\n gap = 0,\n justify = \"start\",\n align = \"stretch\",\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`flex ${direction === \"column\" ? \"flex-col\" : \"flex-row\"} ${justifyMap[justify]} ${alignMap[align]} ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\nconst Grid: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n cols?: number;\n gap?: number;\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n cols = 1,\n gap = 4,\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`grid ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// 텍스트 정렬 매핑\nconst textAlignMap = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n\n// 타이포그래피 스타일 props 타입\ninterface TypographyStyleProps {\n fontSize?: string;\n lineHeight?: string;\n fontWeight?: string;\n letterSpacing?: string;\n}\n\n// 타이포그래피 스타일 props를 style 객체로 변환\nfunction getTypographyStyle(props: TypographyStyleProps): React.CSSProperties {\n const style: React.CSSProperties = {};\n if (props.fontSize) style.fontSize = props.fontSize;\n if (props.lineHeight) style.lineHeight = props.lineHeight;\n if (props.fontWeight) style.fontWeight = props.fontWeight;\n if (props.letterSpacing) style.letterSpacing = props.letterSpacing;\n return style;\n}\n\nconst Text: React.FC<React.HTMLAttributes<HTMLParagraphElement> & {\n variant?: \"body\" | \"muted\" | \"lead\";\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps> = ({\n children,\n variant = \"body\",\n align = \"center\",\n className = \"\",\n style,\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n ...props\n}) => {\n const variantClasses = {\n body: \"text-foreground\",\n muted: \"text-muted-foreground text-sm\",\n lead: \"text-xl text-muted-foreground\",\n };\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n\n return (\n <p\n className={`${variantClasses[variant]} ${textAlignMap[align]} ${className}`}\n style={mergedStyle}\n {...props}\n >\n {children}\n </p>\n );\n};\n\n// Heading 컴포넌트들 (정렬 + 타이포그래피 스타일 지원)\ntype HeadingProps = React.HTMLAttributes<HTMLHeadingElement> & {\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps;\n\nconst H1: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h1 className={`text-4xl md:text-5xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h1>\n );\n};\n\nconst H2: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h2 className={`text-3xl md:text-4xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h2>\n );\n};\n\nconst H3: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h3 className={`text-2xl md:text-3xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h3>\n );\n};\n\nconst H4: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h4 className={`text-xl md:text-2xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h4>\n );\n};\n\nconst Link: React.FC<React.AnchorHTMLAttributes<HTMLAnchorElement>> = ({\n children,\n href = \"#\",\n className = \"\",\n ...props\n}) => {\n // 절대 경로 처리: http/https로 시작하지 않으면 그대로, 시작하면 외부 링크\n const isExternal = href.startsWith(\"http://\") || href.startsWith(\"https://\");\n\n return (\n <a\n href={href}\n className={`text-primary hover:underline ${className}`}\n {...(isExternal ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n {...props}\n >\n {children}\n </a>\n );\n};\n\nconst Image: React.FC<React.ImgHTMLAttributes<HTMLImageElement>> = ({ className = \"\", alt = \"\", ...props }) => (\n <img className={`max-w-full h-auto ${className}`} alt={alt} {...props} />\n);\n\n// SDUI용 Icon 래퍼 (name을 string으로 받음)\nconst SDUIIcon: React.FC<{ name?: string; size?: number; className?: string }> = ({\n name = \"star\",\n size = 24,\n className = \"\",\n}) => <Icon name={name as IconName} size={size} className={className} />;\n\nconst Section: React.FC<React.HTMLAttributes<HTMLElement>> = ({\n children,\n className = \"\",\n ...props\n}) => (\n <section className={`py-10 ${className}`} {...props}>\n {children}\n </section>\n);\n\nconst Divider: React.FC<React.HTMLAttributes<HTMLHRElement>> = ({ className = \"\", ...props }) => (\n <hr className={`border-border ${className}`} {...props} />\n);\n\n// Header - 네비게이션 헤더 (GNB)\nconst Header: React.FC<React.HTMLAttributes<HTMLElement> & {\n sticky?: boolean;\n transparent?: boolean;\n blur?: boolean;\n overlay?: boolean;\n}> = ({\n children,\n sticky = true,\n transparent = false,\n blur = true,\n overlay = false,\n className = \"\",\n ...props\n}) => (\n <header\n className={cn(\n \"w-full px-4 py-3 z-50\",\n overlay ? \"absolute top-0 left-0 right-0\" : sticky && \"sticky top-0\",\n transparent ? \"bg-transparent\" : \"bg-background/80\",\n blur && !transparent && \"backdrop-blur-md\",\n !transparent && \"border-b border-border\",\n className\n )}\n {...props}\n >\n <div className=\"max-w-7xl mx-auto\">\n {children}\n </div>\n </header>\n);\n\n/**\n * SDUI용 Uncontrolled 래퍼 컴포넌트들\n * 프리뷰에서 인터랙션이 동작하도록 자체 상태 관리\n */\n\n// Uncontrolled Checkbox - 클릭하면 상태 토글\nconst SDUICheckbox: React.FC<CheckboxProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Checkbox\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Switch - 클릭하면 상태 토글\nconst SDUISwitch: React.FC<SwitchProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Switch\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Input - 자체 상태 관리\nconst SDUIInput: React.FC<InputProps> = ({ defaultValue = \"\", onChange, ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Input\n {...props}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Textarea - 자체 상태 관리 + resize 지원\nconst SDUITextarea: React.FC<TextareaProps> = ({ defaultValue = \"\", onChange, resize = \"vertical\", ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Textarea\n {...props}\n resize={resize}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n/**\n * SDUI용 간단한 Accordion - 데이터 기반\n * items 배열로 아코디언 생성\n */\ninterface SimpleAccordionItem {\n title: string;\n content: string;\n value?: string;\n}\n\nconst SDUIAccordion: React.FC<{\n items?: SimpleAccordionItem[];\n type?: \"single\" | \"multiple\";\n collapsible?: boolean;\n defaultValue?: string;\n className?: string;\n}> = ({\n items = [],\n type = \"single\",\n collapsible = true,\n defaultValue,\n className = \"\",\n}) => {\n return (\n <Accordion\n type={type}\n collapsible={collapsible}\n defaultValue={defaultValue}\n className={className}\n >\n {items.map((item, index) => {\n const value = item.value || `item-${index}`;\n return (\n <AccordionItem key={value} value={value}>\n <AccordionTrigger>{item.title}</AccordionTrigger>\n <AccordionContent>{item.content}</AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordion>\n );\n};\n\n/**\n * SDUI용 간단한 Tabs - 데이터 기반\n * tabs 배열로 탭 생성\n */\ninterface SimpleTabItem {\n label: string;\n content: string;\n value?: string;\n}\n\nconst SDUITabs: React.FC<{\n tabs?: SimpleTabItem[];\n defaultValue?: string;\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\";\n className?: string;\n}> = ({\n tabs = [],\n defaultValue,\n variant = \"default\",\n className = \"\",\n}) => {\n const firstValue = tabs[0]?.value || \"tab-0\";\n\n return (\n <Tabs\n defaultValue={defaultValue || firstValue}\n variant={variant}\n className={className}\n >\n <TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsTrigger key={value} value={value}>\n {tab.label}\n </TabsTrigger>\n );\n })}\n </TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsContent key={value} value={value}>\n {tab.content}\n </TabsContent>\n );\n })}\n </Tabs>\n );\n};\n\n/**\n * 기본 컴포넌트 레지스트리\n */\nexport const defaultRegistry: SDUIComponentRegistry = {\n // 레이아웃\n Box,\n Spacer,\n Flex,\n Grid,\n Section,\n Container,\n Divider,\n\n // 타이포그래피\n Text,\n H1,\n H2,\n H3,\n H4,\n Link,\n\n // 미디어\n Image,\n Icon: SDUIIcon,\n\n // 기본 UI\n Button,\n Badge,\n Avatar,\n AvatarImage,\n AvatarFallback,\n Input: SDUIInput,\n Textarea: SDUITextarea,\n Label,\n Checkbox: SDUICheckbox,\n Switch: SDUISwitch,\n Skeleton,\n Progress,\n\n // 카드\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n\n // 피드백\n Alert,\n\n // Advanced (Pro)\n Header,\n HeroSection,\n ScrollProgress,\n\n // Interactive (Pro)\n Accordion: SDUIAccordion,\n Tabs: SDUITabs,\n};\n\n/**\n * 레지스트리 확장 헬퍼\n */\nexport function extendRegistry(\n customComponents: SDUIComponentRegistry\n): SDUIComponentRegistry {\n return {\n ...defaultRegistry,\n ...customComponents,\n };\n}\n\n/**\n * 컴포넌트 존재 여부 확인\n */\nexport function hasComponent(registry: SDUIComponentRegistry, type: string): boolean {\n return type in registry;\n}\n","\"use client\";\n\n/**\n * SDUI Renderer\n *\n * JSON 스키마를 받아서 실제 React 컴포넌트로 렌더링\n */\n\nimport React, { createContext, useContext, useState, useCallback, useMemo } from \"react\";\nimport type {\n SDUINode,\n SDUIPageSchema,\n SDUIRendererProps,\n SDUIContext,\n SDUIAction,\n SDUICondition,\n SDUIComponentRegistry,\n} from \"./types\";\nimport { defaultRegistry } from \"./registry\";\n\n// SDUI Context\nconst SDUIContextInternal = createContext<SDUIContext | null>(null);\n\n/**\n * SDUI Context Hook\n */\nexport function useSDUI(): SDUIContext {\n const context = useContext(SDUIContextInternal);\n if (!context) {\n throw new Error(\"useSDUI must be used within SDUIRenderer\");\n }\n return context;\n}\n\n/**\n * 데이터 경로로 값 가져오기\n * 예: \"user.profile.name\" → data.user.profile.name\n */\nfunction getByPath(obj: Record<string, unknown>, path: string): unknown {\n return path.split(\".\").reduce((acc: unknown, key) => {\n if (acc && typeof acc === \"object\" && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * 데이터 경로로 값 설정하기\n */\nfunction setByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): Record<string, unknown> {\n const keys = path.split(\".\");\n const result = { ...obj };\n let current: Record<string, unknown> = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n current[key] = { ...(current[key] as Record<string, unknown> || {}) };\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result;\n}\n\n/**\n * 조건 평가\n */\nfunction evaluateCondition(\n condition: SDUICondition,\n data: Record<string, unknown>\n): boolean {\n const value = getByPath(data, condition.path);\n\n switch (condition.operator) {\n case \"eq\":\n return value === condition.value;\n case \"neq\":\n return value !== condition.value;\n case \"gt\":\n return typeof value === \"number\" && value > (condition.value as number);\n case \"lt\":\n return typeof value === \"number\" && value < (condition.value as number);\n case \"gte\":\n return typeof value === \"number\" && value >= (condition.value as number);\n case \"lte\":\n return typeof value === \"number\" && value <= (condition.value as number);\n case \"exists\":\n return value !== undefined && value !== null;\n case \"notExists\":\n return value === undefined || value === null;\n default:\n return true;\n }\n}\n\n/**\n * Props에서 데이터 바인딩 처리\n * {{ path }} 형식을 실제 데이터로 치환\n */\nfunction resolveProps(\n props: Record<string, unknown>,\n data: Record<string, unknown>\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === \"string\") {\n // {{ path }} 패턴 처리\n const bindingMatch = value.match(/^\\{\\{\\s*(.+?)\\s*\\}\\}$/);\n if (bindingMatch) {\n resolved[key] = getByPath(data, bindingMatch[1]);\n } else {\n // 문자열 내 부분 바인딩: \"Hello, {{ user.name }}!\"\n resolved[key] = value.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n }\n } else if (Array.isArray(value)) {\n resolved[key] = value.map((item) =>\n typeof item === \"object\" && item !== null\n ? resolveProps(item as Record<string, unknown>, data)\n : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n resolved[key] = resolveProps(value as Record<string, unknown>, data);\n } else {\n resolved[key] = value;\n }\n }\n\n return resolved;\n}\n\n/**\n * 단일 노드 렌더러\n */\ninterface NodeRendererProps {\n node: SDUINode;\n registry: SDUIComponentRegistry;\n}\n\nfunction NodeRenderer({ node, registry }: NodeRendererProps) {\n const { data, handleAction } = useSDUI();\n\n // 조건부 렌더링 체크\n if (node.when && !evaluateCondition(node.when, data)) {\n return null;\n }\n\n // 컴포넌트 찾기\n const Component = registry[node.type];\n if (!Component) {\n console.warn(`[SDUI] Unknown component type: ${node.type}`);\n return (\n <div className=\"p-4 border border-destructive/50 bg-destructive/10 rounded text-sm text-destructive\">\n Unknown component: {node.type}\n </div>\n );\n }\n\n // Props 처리\n const resolvedProps = node.props ? resolveProps(node.props, data) : {};\n\n // 이벤트 핸들러 처리\n const eventProps: Record<string, unknown> = {};\n if (node.on) {\n if (node.on.click) {\n eventProps.onClick = () => handleAction(node.on!.click!);\n }\n if (node.on.submit) {\n eventProps.onSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n handleAction(node.on!.submit!);\n };\n }\n }\n\n // Children 처리\n let children: React.ReactNode = null;\n if (node.children) {\n if (typeof node.children === \"string\") {\n // 문자열 바인딩 처리\n children = node.children.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n } else if (Array.isArray(node.children)) {\n children = node.children.map((child, index) => (\n <NodeRenderer\n key={child.key || `child-${index}`}\n node={child}\n registry={registry}\n />\n ));\n }\n }\n\n // void 엘리먼트는 children을 받지 않음\n const voidElements = ['Divider', 'Input', 'Textarea', 'Checkbox', 'Switch', 'Progress', 'Skeleton', 'Image', 'ScrollProgress'];\n const isVoidElement = voidElements.includes(node.type);\n\n if (isVoidElement || children === null) {\n return <Component {...resolvedProps} {...eventProps} />;\n }\n\n return (\n <Component {...resolvedProps} {...eventProps}>\n {children}\n </Component>\n );\n}\n\n/**\n * SDUI Renderer 메인 컴포넌트\n */\nexport function SDUIRenderer({\n schema,\n components,\n data: initialData = {},\n onAction,\n onNavigate,\n}: SDUIRendererProps) {\n // 페이지 스키마인지 노드인지 확인\n const isPageSchema = \"root\" in schema;\n const rootNode = isPageSchema ? (schema as SDUIPageSchema).root : (schema as SDUINode);\n const schemaData = isPageSchema ? (schema as SDUIPageSchema).data : {};\n\n // 데이터 상태\n const [data, setDataState] = useState<Record<string, unknown>>({\n ...schemaData,\n ...initialData,\n });\n\n // 레지스트리 병합\n const registry = useMemo(\n () => ({ ...defaultRegistry, ...components }),\n [components]\n );\n\n // 데이터 업데이트\n const setData = useCallback((path: string, value: unknown) => {\n setDataState((prev) => setByPath(prev, path, value));\n }, []);\n\n // 네비게이션\n const navigate = useCallback(\n (path: string) => {\n if (onNavigate) {\n onNavigate(path);\n } else if (typeof window !== \"undefined\") {\n window.location.href = path;\n }\n },\n [onNavigate]\n );\n\n // 액션 핸들러\n const handleAction = useCallback(\n (action: SDUIAction) => {\n switch (action.type) {\n case \"navigate\":\n navigate(action.payload?.path as string);\n break;\n case \"setState\":\n if (action.payload?.path && action.payload?.value !== undefined) {\n setData(action.payload.path as string, action.payload.value);\n }\n break;\n case \"api\":\n // API 호출은 외부에서 처리\n onAction?.(action);\n break;\n case \"custom\":\n onAction?.(action);\n break;\n default:\n onAction?.(action);\n }\n },\n [navigate, setData, onAction]\n );\n\n // Context 값\n const contextValue: SDUIContext = useMemo(\n () => ({\n data,\n setData,\n handleAction,\n navigate,\n }),\n [data, setData, handleAction, navigate]\n );\n\n return (\n <SDUIContextInternal.Provider value={contextValue}>\n <NodeRenderer node={rootNode} registry={registry} />\n </SDUIContextInternal.Provider>\n );\n}\n\n/**\n * JSON 문자열에서 렌더링 (편의용)\n */\nexport function SDUIFromJSON({\n json,\n ...props\n}: Omit<SDUIRendererProps, \"schema\"> & { json: string }) {\n try {\n const schema = JSON.parse(json);\n return <SDUIRenderer schema={schema} {...props} />;\n } catch (error) {\n return (\n <div className=\"p-4 border border-destructive bg-destructive/10 rounded\">\n <p className=\"font-semibold text-destructive\">SDUI Parse Error</p>\n <pre className=\"text-sm mt-2 text-destructive/80\">\n {(error as Error).message}\n </pre>\n </div>\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/sdui/registry.tsx","../src/sdui/SDUIRenderer.tsx"],"names":["Box","children","justify","align","className","style","backgroundColor","padding","margin","borderRadius","border","props","customStyle","jsx","cn","justifyMap","alignMap","Spacer","size","Flex","direction","gap","Grid","cols","textAlignMap","getTypographyStyle","Text","variant","fontSize","lineHeight","fontWeight","letterSpacing","variantClasses","typoStyle","mergedStyle","H1","H2","H3","H4","Link","href","isExternal","Image","alt","SDUIIcon","name","Icon","Section","Divider","Header","sticky","transparent","blur","overlay","SDUICheckbox","defaultChecked","onChange","checked","setChecked","useState","Checkbox","e","SDUISwitch","Switch","SDUIInput","defaultValue","value","setValue","Input","SDUITextarea","resize","Textarea","SDUIAccordion","items","type","collapsible","Accordion","item","index","jsxs","AccordionItem","AccordionTrigger","AccordionContent","SDUITabs","tabs","_a","firstValue","Tabs","TabsList","tab","TabsTrigger","TabsContent","defaultRegistry","Container","Button","Badge","Avatar","AvatarImage","AvatarFallback","Label","Skeleton","Progress","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Alert","HeroSection","ScrollProgress","extendRegistry","customComponents","hasComponent","registry","SDUIContextInternal","createContext","useSDUI","context","useContext","getByPath","obj","path","acc","key","setByPath","keys","result","current","i","evaluateCondition","condition","data","resolveProps","resolved","bindingMatch","_","val","NodeRenderer","node","handleAction","Component","resolvedProps","eventProps","child","SDUIRenderer","schema","components","initialData","onAction","onNavigate","isPageSchema","rootNode","schemaData","setDataState","useMemo","setData","useCallback","prev","navigate","action","_b","_c","contextValue","SDUIFromJSON","json","error"],"mappings":"8zBA6CA,IAAMA,EAAAA,CASD,CAAC,CACJ,QAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CAAY,EAAA,CACZ,KAAA,CAAAC,CAAAA,CAEA,eAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,EACA,YAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,GAAGC,CACL,CAAA,GAAM,CAEJ,IAAMC,CAAAA,CAAmC,CACvC,GAAGP,CAAAA,CACH,GAAIC,CAAAA,EAAmB,CAAE,gBAAAA,CAAgB,CAAA,CACzC,GAAIC,CAAAA,GAAY,MAAA,EAAa,CAAE,OAAA,CAAS,OAAOA,CAAAA,EAAY,QAAA,CAAW,CAAA,EAAGA,CAAO,CAAA,EAAA,CAAA,CAAOA,CAAQ,CAAA,CAC/F,GAAIC,IAAW,MAAA,EAAa,CAAE,MAAA,CAAQ,OAAOA,CAAAA,EAAW,QAAA,CAAW,CAAA,EAAGA,CAAM,CAAA,EAAA,CAAA,CAAOA,CAAO,CAAA,CAC1F,GAAIC,CAAAA,GAAiB,MAAA,EAAa,CAAE,YAAA,CAAc,OAAOA,CAAAA,EAAiB,QAAA,CAAW,CAAA,EAAGA,CAAY,CAAA,EAAA,CAAA,CAAOA,CAAa,CAAA,CACxH,GAAIC,CAAAA,EAAU,CAAE,MAAA,CAAAA,CAAO,CACzB,CAAA,CAEA,OACEG,GAAAA,CAAC,OACC,SAAA,CAAWC,GAAAA,CAAAA,CACRZ,CAAAA,EAAWC,CAAAA,GAAU,MAAA,CACtBD,CAAAA,EAAWa,EAAAA,CAAWb,CAAO,CAAA,CAC7BC,CAAAA,EAASa,EAAAA,CAASb,CAAK,CAAA,CACvBC,CACF,CAAA,CACA,KAAA,CAAO,OAAO,IAAA,CAAKQ,CAAW,CAAA,CAAE,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAc,MAAA,CAC1D,GAAGD,CAAAA,CAEH,QAAA,CAAAV,CAAAA,CACH,CAEJ,CAAA,CAGMgB,EAAAA,CAA0D,CAAC,CAAE,KAAAC,CAAAA,CAAO,EAAA,CAAI,SAAA,CAAAd,CAAAA,CAAY,EAAG,CAAA,GAC3FS,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWT,CAAAA,CAAW,KAAA,CAAO,CAAE,KAAA,CAAOc,CAAAA,CAAM,MAAA,CAAQA,CAAAA,CAAM,UAAA,CAAY,CAAE,CAAA,CAAG,CAAA,CAI5EH,EAAAA,CAAa,CACjB,KAAA,CAAO,eAAA,CACP,MAAA,CAAQ,gBAAA,CACR,GAAA,CAAK,aAAA,CACL,OAAA,CAAS,iBACX,CAAA,CACMC,EAAAA,CAAW,CACf,KAAA,CAAO,aAAA,CACP,MAAA,CAAQ,cAAA,CACR,GAAA,CAAK,WAAA,CACL,OAAA,CAAS,eACX,CAAA,CAEMG,EAAAA,CAOD,CAAC,CACJ,QAAA,CAAAlB,CAAAA,CACA,SAAA,CAAAmB,CAAAA,CAAY,MACZ,GAAA,CAAAC,CAAAA,CAAM,CAAA,CACN,OAAA,CAAAnB,CAAAA,CAAU,OAAA,CACV,KAAA,CAAAC,CAAAA,CAAQ,SAAA,CACR,SAAA,CAAAC,CAAAA,CAAY,EAAA,CACZ,KAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,QAAAC,CAAAA,CACA,GAAGI,CACL,CAAA,GAAM,CACJ,IAAMC,CAAAA,CAAmC,CACvC,GAAA,CAAK,CAAA,EAAGS,CAAAA,CAAM,CAAC,CAAA,EAAA,CAAA,CACf,GAAGhB,CAAAA,CACH,GAAIC,GAAmB,CAAE,eAAA,CAAAA,CAAgB,CAAA,CACzC,GAAIC,CAAAA,GAAY,MAAA,EAAa,CAAE,OAAA,CAAS,OAAOA,CAAAA,EAAY,QAAA,CAAW,CAAA,EAAGA,CAAO,CAAA,EAAA,CAAA,CAAOA,CAAQ,CACjG,CAAA,CAEA,OACEM,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,KAAA,EAAQO,CAAAA,GAAc,QAAA,CAAW,UAAA,CAAa,UAAU,CAAA,CAAA,EAAIL,EAAAA,CAAWb,CAAO,CAAC,CAAA,CAAA,EAAIc,EAAAA,CAASb,CAAK,CAAC,CAAA,CAAA,EAAIC,CAAS,CAAA,CAAA,CAC1H,KAAA,CAAOQ,CAAAA,CACN,GAAGD,CAAAA,CAEH,QAAA,CAAAV,CAAAA,CACH,CAEJ,CAAA,CAEMqB,EAAAA,CAKD,CAAC,CACJ,QAAA,CAAArB,EACA,IAAA,CAAAsB,CAAAA,CAAO,CAAA,CACP,GAAA,CAAAF,CAAAA,CAAM,CAAA,CACN,SAAA,CAAAjB,CAAAA,CAAY,EAAA,CACZ,KAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,GAAGI,CACL,CAAA,GAAM,CACJ,IAAMC,CAAAA,CAAmC,CACvC,mBAAA,CAAqB,CAAA,OAAA,EAAUW,CAAI,CAAA,MAAA,CAAA,CACnC,GAAA,CAAK,CAAA,EAAGF,CAAAA,CAAM,CAAC,CAAA,EAAA,CAAA,CACf,GAAGhB,EACH,GAAIC,CAAAA,EAAmB,CAAE,eAAA,CAAAA,CAAgB,CAAA,CACzC,GAAIC,CAAAA,GAAY,MAAA,EAAa,CAAE,OAAA,CAAS,OAAOA,CAAAA,EAAY,QAAA,CAAW,CAAA,EAAGA,CAAO,KAAOA,CAAQ,CACjG,CAAA,CAEA,OACEM,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,KAAA,EAAQT,CAAS,CAAA,CAAA,CAC5B,KAAA,CAAOQ,CAAAA,CACN,GAAGD,CAAAA,CAEH,QAAA,CAAAV,CAAAA,CACH,CAEJ,CAAA,CAGMuB,CAAAA,CAAe,CACnB,IAAA,CAAM,WAAA,CACN,MAAA,CAAQ,aAAA,CACR,KAAA,CAAO,YACT,CAAA,CAWA,SAASC,CAAAA,CAAmBd,CAAAA,CAAkD,CAC5E,IAAMN,CAAAA,CAA6B,EAAC,CACpC,OAAIM,CAAAA,CAAM,QAAA,GAAUN,CAAAA,CAAM,QAAA,CAAWM,CAAAA,CAAM,QAAA,CAAA,CACvCA,CAAAA,CAAM,UAAA,GAAYN,CAAAA,CAAM,UAAA,CAAaM,CAAAA,CAAM,UAAA,CAAA,CAC3CA,CAAAA,CAAM,UAAA,GAAYN,EAAM,UAAA,CAAaM,CAAAA,CAAM,UAAA,CAAA,CAC3CA,CAAAA,CAAM,aAAA,GAAeN,CAAAA,CAAM,aAAA,CAAgBM,CAAAA,CAAM,aAAA,CAAA,CAC9CN,CACT,CAEA,IAAMqB,EAAAA,CAGsB,CAAC,CAC3B,QAAA,CAAAzB,EACA,OAAA,CAAA0B,CAAAA,CAAU,MAAA,CACV,KAAA,CAAAxB,CAAAA,CAAQ,QAAA,CACR,SAAA,CAAAC,CAAAA,CAAY,EAAA,CACZ,KAAA,CAAAC,CAAAA,CACA,QAAA,CAAAuB,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,EACA,aAAA,CAAAC,CAAAA,CACA,GAAGpB,CACL,CAAA,GAAM,CACJ,IAAMqB,CAAAA,CAAiB,CACrB,IAAA,CAAM,iBAAA,CACN,KAAA,CAAO,+BAAA,CACP,IAAA,CAAM,+BACR,CAAA,CACMC,EAAYR,CAAAA,CAAmB,CAAE,QAAA,CAAAG,CAAAA,CAAU,UAAA,CAAAC,CAAAA,CAAY,UAAA,CAAAC,CAAAA,CAAY,aAAA,CAAAC,CAAc,CAAC,CAAA,CAClFG,CAAAA,CAAc,MAAA,CAAO,IAAA,CAAKD,CAAS,EAAE,MAAA,CAAS,CAAA,CAAI,CAAE,GAAG5B,CAAAA,CAAO,GAAG4B,CAAU,CAAA,CAAI5B,CAAAA,CAErF,OACEQ,GAAAA,CAAC,GAAA,CAAA,CACC,SAAA,CAAW,CAAA,EAAGmB,CAAAA,CAAeL,CAAO,CAAC,CAAA,CAAA,EAAIH,CAAAA,CAAarB,CAAK,CAAC,CAAA,CAAA,EAAIC,CAAS,CAAA,CAAA,CACzE,KAAA,CAAO8B,CAAAA,CACN,GAAGvB,CAAAA,CAEH,QAAA,CAAAV,CAAAA,CACH,CAEJ,CAAA,CAOMkC,EAAAA,CAA6B,CAAC,CAClC,QAAA,CAAAlC,CAAAA,CAAU,KAAA,CAAAE,CAAAA,CAAQ,QAAA,CAAU,SAAA,CAAAC,CAAAA,CAAY,EAAA,CAAI,KAAA,CAAAC,CAAAA,CAC5C,QAAA,CAAAuB,CAAAA,CAAU,UAAA,CAAAC,CAAAA,CAAY,UAAA,CAAAC,EAAY,aAAA,CAAAC,CAAAA,CAClC,GAAGpB,CACL,CAAA,GAAM,CACJ,IAAMsB,CAAAA,CAAYR,CAAAA,CAAmB,CAAE,QAAA,CAAAG,CAAAA,CAAU,UAAA,CAAAC,CAAAA,CAAY,UAAA,CAAAC,CAAAA,CAAY,cAAAC,CAAc,CAAC,CAAA,CAClFG,CAAAA,CAAc,MAAA,CAAO,IAAA,CAAKD,CAAS,CAAA,CAAE,MAAA,CAAS,CAAA,CAAI,CAAE,GAAG5B,CAAAA,CAAO,GAAG4B,CAAU,CAAA,CAAI5B,EACrF,OACEQ,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAW,CAAA,+BAAA,EAAkCW,CAAAA,CAAarB,CAAK,CAAC,CAAA,CAAA,EAAIC,CAAS,CAAA,CAAA,CAAI,KAAA,CAAO8B,CAAAA,CAAc,GAAGvB,CAAAA,CAAQ,QAAA,CAAAV,EAAS,CAElI,CAAA,CAEMmC,EAAAA,CAA6B,CAAC,CAClC,QAAA,CAAAnC,CAAAA,CAAU,KAAA,CAAAE,CAAAA,CAAQ,QAAA,CAAU,SAAA,CAAAC,CAAAA,CAAY,EAAA,CAAI,KAAA,CAAAC,CAAAA,CAC5C,QAAA,CAAAuB,CAAAA,CAAU,UAAA,CAAAC,CAAAA,CAAY,UAAA,CAAAC,CAAAA,CAAY,aAAA,CAAAC,CAAAA,CAClC,GAAGpB,CACL,CAAA,GAAM,CACJ,IAAMsB,CAAAA,CAAYR,CAAAA,CAAmB,CAAE,QAAA,CAAAG,EAAU,UAAA,CAAAC,CAAAA,CAAY,UAAA,CAAAC,CAAAA,CAAY,aAAA,CAAAC,CAAc,CAAC,CAAA,CAClFG,CAAAA,CAAc,MAAA,CAAO,IAAA,CAAKD,CAAS,CAAA,CAAE,MAAA,CAAS,CAAA,CAAI,CAAE,GAAG5B,CAAAA,CAAO,GAAG4B,CAAU,CAAA,CAAI5B,CAAAA,CACrF,OACEQ,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAW,CAAA,+BAAA,EAAkCW,CAAAA,CAAarB,CAAK,CAAC,CAAA,CAAA,EAAIC,CAAS,CAAA,CAAA,CAAI,MAAO8B,CAAAA,CAAc,GAAGvB,CAAAA,CAAQ,QAAA,CAAAV,CAAAA,CAAS,CAElI,CAAA,CAEMoC,EAAAA,CAA6B,CAAC,CAClC,QAAA,CAAApC,CAAAA,CAAU,KAAA,CAAAE,CAAAA,CAAQ,QAAA,CAAU,SAAA,CAAAC,EAAY,EAAA,CAAI,KAAA,CAAAC,CAAAA,CAC5C,QAAA,CAAAuB,CAAAA,CAAU,UAAA,CAAAC,CAAAA,CAAY,UAAA,CAAAC,CAAAA,CAAY,aAAA,CAAAC,CAAAA,CAClC,GAAGpB,CACL,CAAA,GAAM,CACJ,IAAMsB,EAAYR,CAAAA,CAAmB,CAAE,QAAA,CAAAG,CAAAA,CAAU,UAAA,CAAAC,CAAAA,CAAY,UAAA,CAAAC,CAAAA,CAAY,aAAA,CAAAC,CAAc,CAAC,CAAA,CAClFG,CAAAA,CAAc,MAAA,CAAO,IAAA,CAAKD,CAAS,EAAE,MAAA,CAAS,CAAA,CAAI,CAAE,GAAG5B,CAAAA,CAAO,GAAG4B,CAAU,CAAA,CAAI5B,CAAAA,CACrF,OACEQ,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAW,CAAA,mCAAA,EAAsCW,CAAAA,CAAarB,CAAK,CAAC,CAAA,CAAA,EAAIC,CAAS,CAAA,CAAA,CAAI,KAAA,CAAO8B,CAAAA,CAAc,GAAGvB,CAAAA,CAAQ,QAAA,CAAAV,CAAAA,CAAS,CAEtI,CAAA,CAEMqC,EAAAA,CAA6B,CAAC,CAClC,QAAA,CAAArC,CAAAA,CAAU,KAAA,CAAAE,CAAAA,CAAQ,QAAA,CAAU,SAAA,CAAAC,CAAAA,CAAY,EAAA,CAAI,KAAA,CAAAC,CAAAA,CAC5C,QAAA,CAAAuB,CAAAA,CAAU,UAAA,CAAAC,CAAAA,CAAY,UAAA,CAAAC,CAAAA,CAAY,aAAA,CAAAC,CAAAA,CAClC,GAAGpB,CACL,CAAA,GAAM,CACJ,IAAMsB,CAAAA,CAAYR,CAAAA,CAAmB,CAAE,QAAA,CAAAG,CAAAA,CAAU,UAAA,CAAAC,CAAAA,CAAY,UAAA,CAAAC,CAAAA,CAAY,aAAA,CAAAC,CAAc,CAAC,EAClFG,CAAAA,CAAc,MAAA,CAAO,IAAA,CAAKD,CAAS,CAAA,CAAE,MAAA,CAAS,CAAA,CAAI,CAAE,GAAG5B,CAAAA,CAAO,GAAG4B,CAAU,CAAA,CAAI5B,CAAAA,CACrF,OACEQ,GAAAA,CAAC,MAAG,SAAA,CAAW,CAAA,kCAAA,EAAqCW,CAAAA,CAAarB,CAAK,CAAC,CAAA,CAAA,EAAIC,CAAS,CAAA,CAAA,CAAI,KAAA,CAAO8B,CAAAA,CAAc,GAAGvB,CAAAA,CAAQ,QAAA,CAAAV,CAAAA,CAAS,CAErI,CAAA,CAEMsC,GAAgE,CAAC,CACrE,QAAA,CAAAtC,CAAAA,CACA,IAAA,CAAAuC,CAAAA,CAAO,GAAA,CACP,SAAA,CAAApC,CAAAA,CAAY,EAAA,CACZ,GAAGO,CACL,CAAA,GAAM,CAEJ,IAAM8B,CAAAA,CAAaD,EAAK,UAAA,CAAW,SAAS,CAAA,EAAKA,CAAAA,CAAK,UAAA,CAAW,UAAU,CAAA,CAE3E,OACE3B,GAAAA,CAAC,GAAA,CAAA,CACC,IAAA,CAAM2B,CAAAA,CACN,SAAA,CAAW,CAAA,6BAAA,EAAgCpC,CAAS,CAAA,CAAA,CACnD,GAAIqC,CAAAA,CAAa,CAAE,MAAA,CAAQ,QAAA,CAAU,GAAA,CAAK,qBAAsB,CAAA,CAAI,EAAC,CACrE,GAAG9B,CAAAA,CAEH,QAAA,CAAAV,CAAAA,CACH,CAEJ,CAAA,CAEMyC,EAAAA,CAA6D,CAAC,CAAE,SAAA,CAAAtC,CAAAA,CAAY,EAAA,CAAI,GAAA,CAAAuC,CAAAA,CAAM,EAAA,CAAI,GAAGhC,CAAM,CAAA,GACvGE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW,CAAA,kBAAA,EAAqBT,CAAS,CAAA,CAAA,CAAI,GAAA,CAAKuC,CAAAA,CAAM,GAAGhC,CAAAA,CAAO,CAAA,CAInEiC,EAAAA,CAA2E,CAAC,CAChF,IAAA,CAAAC,CAAAA,CAAO,MAAA,CACP,IAAA,CAAA3B,CAAAA,CAAO,EAAA,CACP,SAAA,CAAAd,CAAAA,CAAY,EACd,CAAA,GAAMS,GAAAA,CAACiC,CAAAA,CAAA,CAAK,IAAA,CAAMD,CAAAA,CAAkB,IAAA,CAAM3B,CAAAA,CAAM,SAAA,CAAWd,CAAAA,CAAW,CAAA,CAEhE2C,EAAAA,CAAuD,CAAC,CAC5D,QAAA,CAAA9C,CAAAA,CACA,UAAAG,CAAAA,CAAY,EAAA,CACZ,GAAGO,CACL,CAAA,GACEE,GAAAA,CAAC,SAAA,CAAA,CAAQ,SAAA,CAAW,CAAA,MAAA,EAAST,CAAS,CAAA,CAAA,CAAK,GAAGO,CAAAA,CAC3C,QAAA,CAAAV,CAAAA,CACH,CAAA,CAGI+C,GAAyD,CAAC,CAAE,SAAA,CAAA5C,CAAAA,CAAY,EAAA,CAAI,GAAGO,CAAM,CAAA,GACzFE,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAW,CAAA,cAAA,EAAiBT,CAAS,CAAA,CAAA,CAAK,GAAGO,CAAAA,CAAO,EAIpDsC,EAAAA,CAKD,CAAC,CACJ,QAAA,CAAAhD,CAAAA,CACA,MAAA,CAAAiD,CAAAA,CAAS,IAAA,CACT,WAAA,CAAAC,CAAAA,CAAc,KAAA,CACd,IAAA,CAAAC,CAAAA,CAAO,IAAA,CACP,OAAA,CAAAC,CAAAA,CAAU,MACV,SAAA,CAAAjD,CAAAA,CAAY,EAAA,CACZ,GAAGO,CACL,CAAA,GACEE,GAAAA,CAAC,QAAA,CAAA,CACC,SAAA,CAAWC,GAAAA,CACT,uBAAA,CACAuC,CAAAA,CAAU,+BAAA,CAAkCH,CAAAA,EAAU,cAAA,CACtDC,CAAAA,CAAc,iBAAmB,kBAAA,CACjCC,CAAAA,EAAQ,CAACD,CAAAA,EAAe,kBAAA,CACxB,CAACA,CAAAA,EAAe,wBAAA,CAChB/C,CACF,CAAA,CACC,GAAGO,CAAAA,CAEJ,QAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oBACZ,QAAA,CAAAZ,CAAAA,CACH,CAAA,CACF,CAAA,CASIqD,EAAAA,CAAwC,CAAC,CAAE,cAAA,CAAAC,CAAAA,CAAiB,KAAA,CAAO,QAAA,CAAAC,CAAAA,CAAU,GAAG7C,CAAM,CAAA,GAAM,CAChG,GAAM,CAAC8C,CAAAA,CAASC,CAAU,CAAA,CAAIC,QAAAA,CAASJ,CAAc,CAAA,CACrD,OACE1C,GAAAA,CAAC+C,GAAAA,CAAA,CACE,GAAGjD,CAAAA,CACJ,OAAA,CAAS8C,CAAAA,CACT,QAAA,CAAWI,GAAM,CACfH,CAAAA,CAAWG,CAAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAC3BL,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAWK,CAAAA,EACb,CAAA,CACF,CAEJ,CAAA,CAGMC,EAAAA,CAAoC,CAAC,CAAE,eAAAP,CAAAA,CAAiB,KAAA,CAAO,QAAA,CAAAC,CAAAA,CAAU,GAAG7C,CAAM,CAAA,GAAM,CAC5F,GAAM,CAAC8C,CAAAA,CAASC,CAAU,CAAA,CAAIC,QAAAA,CAASJ,CAAc,CAAA,CACrD,OACE1C,GAAAA,CAACkD,GAAAA,CAAA,CACE,GAAGpD,CAAAA,CACJ,OAAA,CAAS8C,CAAAA,CACT,QAAA,CAAWI,CAAAA,EAAM,CACfH,CAAAA,CAAWG,CAAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAC3BL,CAAAA,EAAA,MAAAA,CAAAA,CAAWK,CAAAA,EACb,CAAA,CACF,CAEJ,CAAA,CAGMG,EAAAA,CAAkC,CAAC,CAAE,YAAA,CAAAC,CAAAA,CAAe,EAAA,CAAI,QAAA,CAAAT,CAAAA,CAAU,GAAG7C,CAAM,CAAA,GAAM,CACrF,GAAM,CAACuD,CAAAA,CAAOC,CAAQ,CAAA,CAAIR,QAAAA,CAASM,CAAY,CAAA,CAC/C,OACEpD,GAAAA,CAACuD,GAAAA,CAAA,CACE,GAAGzD,CAAAA,CACJ,KAAA,CAAOuD,CAAAA,CACP,SAAWL,CAAAA,EAAM,CACfM,CAAAA,CAASN,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CACvBL,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAWK,CAAAA,EACb,CAAA,CACF,CAEJ,CAAA,CAGMQ,EAAAA,CAAwC,CAAC,CAAE,YAAA,CAAAJ,CAAAA,CAAe,EAAA,CAAI,QAAA,CAAAT,CAAAA,CAAU,MAAA,CAAAc,CAAAA,CAAS,UAAA,CAAY,GAAG3D,CAAM,CAAA,GAAM,CAChH,GAAM,CAACuD,CAAAA,CAAOC,CAAQ,CAAA,CAAIR,QAAAA,CAASM,CAAY,CAAA,CAC/C,OACEpD,GAAAA,CAAC0D,GAAAA,CAAA,CACE,GAAG5D,CAAAA,CACJ,MAAA,CAAQ2D,CAAAA,CACR,KAAA,CAAOJ,CAAAA,CACP,QAAA,CAAWL,CAAAA,EAAM,CACfM,CAAAA,CAASN,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CACvBL,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAWK,CAAAA,EACb,CAAA,CACF,CAEJ,CAAA,CAYMW,EAAAA,CAMD,CAAC,CACJ,KAAA,CAAAC,EAAQ,EAAC,CACT,IAAA,CAAAC,CAAAA,CAAO,QAAA,CACP,WAAA,CAAAC,CAAAA,CAAc,IAAA,CACd,YAAA,CAAAV,CAAAA,CACA,SAAA,CAAA7D,CAAAA,CAAY,EACd,CAAA,GAEIS,GAAAA,CAAC+D,GAAAA,CAAA,CACC,IAAA,CAAMF,CAAAA,CACN,WAAA,CAAaC,CAAAA,CACb,YAAA,CAAcV,CAAAA,CACd,SAAA,CAAW7D,CAAAA,CAEV,QAAA,CAAAqE,CAAAA,CAAM,GAAA,CAAI,CAACI,CAAAA,CAAMC,CAAAA,GAAU,CAC1B,IAAMZ,EAAQW,CAAAA,CAAK,KAAA,EAAS,CAAA,KAAA,EAAQC,CAAK,CAAA,CAAA,CACzC,OACEC,IAAAA,CAACC,GAAAA,CAAA,CAA0B,KAAA,CAAOd,CAAAA,CAChC,QAAA,CAAA,CAAArD,GAAAA,CAACoE,GAAAA,CAAA,CAAkB,QAAA,CAAAJ,EAAK,KAAA,CAAM,CAAA,CAC9BhE,GAAAA,CAACqE,GAAAA,CAAA,CAAkB,QAAA,CAAAL,CAAAA,CAAK,OAAA,CAAQ,CAAA,CAAA,CAAA,CAFdX,CAGpB,CAEJ,CAAC,CAAA,CACH,CAAA,CAcEiB,EAAAA,CAKD,CAAC,CACJ,IAAA,CAAAC,CAAAA,CAAO,EAAC,CACR,YAAA,CAAAnB,CAAAA,CACA,OAAA,CAAAtC,CAAAA,CAAU,SAAA,CACV,SAAA,CAAAvB,CAAAA,CAAY,EACd,CAAA,GAAM,CAvfN,IAAAiF,CAAAA,CAwfE,IAAMC,CAAAA,CAAAA,CAAAA,CAAaD,CAAAA,CAAAD,CAAAA,CAAK,CAAC,CAAA,GAAN,IAAA,CAAA,MAAA,CAAAC,CAAAA,CAAS,KAAA,GAAS,OAAA,CAErC,OACEN,IAAAA,CAACQ,GAAAA,CAAA,CACC,YAAA,CAActB,CAAAA,EAAgBqB,CAAAA,CAC9B,OAAA,CAAS3D,CAAAA,CACT,SAAA,CAAWvB,CAAAA,CAEX,QAAA,CAAA,CAAAS,GAAAA,CAAC2E,CAAAA,CAAA,CACE,QAAA,CAAAJ,CAAAA,CAAK,GAAA,CAAI,CAACK,CAAAA,CAAKX,CAAAA,GAAU,CACxB,IAAMZ,EAAQuB,CAAAA,CAAI,KAAA,EAAS,CAAA,IAAA,EAAOX,CAAK,CAAA,CAAA,CACvC,OACEjE,GAAAA,CAAC6E,CAAAA,CAAA,CAAwB,KAAA,CAAOxB,CAAAA,CAC7B,QAAA,CAAAuB,CAAAA,CAAI,KAAA,CAAA,CADWvB,CAElB,CAEJ,CAAC,CAAA,CACH,CAAA,CACCkB,CAAAA,CAAK,GAAA,CAAI,CAACK,CAAAA,CAAKX,CAAAA,GAAU,CACxB,IAAMZ,CAAAA,CAAQuB,CAAAA,CAAI,KAAA,EAAS,CAAA,IAAA,EAAOX,CAAK,CAAA,CAAA,CACvC,OACEjE,IAAC8E,GAAAA,CAAA,CAAwB,KAAA,CAAOzB,CAAAA,CAC7B,QAAA,CAAAuB,CAAAA,CAAI,OAAA,CAAA,CADWvB,CAElB,CAEJ,CAAC,CAAA,CAAA,CACH,CAEJ,CAAA,CAKa0B,CAAAA,CAAyC,CAEpD,GAAA,CAAA5F,GACA,MAAA,CAAAiB,EAAAA,CACA,IAAA,CAAAE,EAAAA,CACA,IAAA,CAAAG,EAAAA,CACA,OAAA,CAAAyB,EAAAA,CACA,SAAA,CAAA8C,GAAAA,CACA,OAAA,CAAA7C,EAAAA,CAGA,IAAA,CAAAtB,EAAAA,CACA,EAAA,CAAAS,EAAAA,CACA,GAAAC,EAAAA,CACA,EAAA,CAAAC,EAAAA,CACA,EAAA,CAAAC,EAAAA,CACA,IAAA,CAAAC,EAAAA,CAGA,KAAA,CAAAG,EAAAA,CACA,IAAA,CAAME,EAAAA,CAGN,MAAA,CAAAkD,GAAAA,CACA,KAAA,CAAAC,GAAAA,CACA,MAAA,CAAAC,IACA,WAAA,CAAAC,GAAAA,CACA,cAAA,CAAAC,GAAAA,CACA,KAAA,CAAOlC,EAAAA,CACP,QAAA,CAAUK,EAAAA,CACV,KAAA,CAAA8B,GAAAA,CACA,QAAA,CAAU7C,EAAAA,CACV,MAAA,CAAQQ,EAAAA,CACR,QAAA,CAAAsC,GAAAA,CACA,SAAAC,GAAAA,CAGA,IAAA,CAAAC,GAAAA,CACA,UAAA,CAAAC,GAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAGA,KAAA,CAAAC,GAAAA,CAGA,MAAA,CAAA3D,EAAAA,CACA,WAAA,CAAA4D,CAAAA,CACA,cAAA,CAAAC,CAAAA,CAGA,SAAA,CAAWtC,EAAAA,CACX,IAAA,CAAMW,EACR,EAKO,SAAS4B,EAAAA,CACdC,CAAAA,CACuB,CACvB,OAAO,CACL,GAAGpB,CAAAA,CACH,GAAGoB,CACL,CACF,CAKO,SAASC,EAAAA,CAAaC,CAAAA,CAAiCxC,CAAAA,CAAuB,CACnF,OAAOA,CAAAA,IAAQwC,CACjB,CC9kBA,IAAMC,GAAsBC,aAAAA,CAAkC,IAAI,CAAA,CAK3D,SAASC,EAAAA,EAAuB,CACrC,IAAMC,CAAAA,CAAUC,UAAAA,CAAWJ,EAAmB,CAAA,CAC9C,GAAI,CAACG,CAAAA,CACH,MAAM,IAAI,MAAM,0CAA0C,CAAA,CAE5D,OAAOA,CACT,CAMA,SAASE,CAAAA,CAAUC,CAAAA,CAA8BC,CAAAA,CAAuB,CACtE,OAAOA,CAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAACC,CAAAA,CAAcC,CAAAA,GAAQ,CACnD,GAAID,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,EAAYC,CAAAA,IAAOD,CAAAA,CAC3C,OAAQA,CAAAA,CAAgCC,CAAG,CAG/C,CAAA,CAAGH,CAAG,CACR,CAKA,SAASI,EAAAA,CACPJ,CAAAA,CACAC,CAAAA,CACAxD,CAAAA,CACyB,CACzB,IAAM4D,CAAAA,CAAOJ,CAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CACrBK,CAAAA,CAAS,CAAE,GAAGN,CAAI,CAAA,CACpBO,CAAAA,CAAmCD,CAAAA,CAEvC,IAAA,IAASE,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIH,CAAAA,CAAK,MAAA,CAAS,CAAA,CAAGG,CAAAA,EAAAA,CAAK,CACxC,IAAML,CAAAA,CAAME,CAAAA,CAAKG,CAAC,EAClBD,CAAAA,CAAQJ,CAAG,CAAA,CAAI,CAAE,GAAII,CAAAA,CAAQJ,CAAG,CAAA,EAAgC,EAAI,CAAA,CACpEI,CAAAA,CAAUA,CAAAA,CAAQJ,CAAG,EACvB,CAEA,OAAAI,CAAAA,CAAQF,CAAAA,CAAKA,CAAAA,CAAK,MAAA,CAAS,CAAC,CAAC,CAAA,CAAI5D,CAAAA,CAC1B6D,CACT,CAKA,SAASG,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACS,CACT,IAAMlE,EAAQsD,CAAAA,CAAUY,CAAAA,CAAMD,CAAAA,CAAU,IAAI,CAAA,CAE5C,OAAQA,CAAAA,CAAU,QAAA,EAChB,KAAK,IAAA,CACH,OAAOjE,CAAAA,GAAUiE,CAAAA,CAAU,KAAA,CAC7B,KAAK,MACH,OAAOjE,CAAAA,GAAUiE,CAAAA,CAAU,KAAA,CAC7B,KAAK,IAAA,CACH,OAAO,OAAOjE,CAAAA,EAAU,QAAA,EAAYA,CAAAA,CAASiE,CAAAA,CAAU,KAAA,CACzD,KAAK,IAAA,CACH,OAAO,OAAOjE,CAAAA,EAAU,QAAA,EAAYA,CAAAA,CAASiE,CAAAA,CAAU,KAAA,CACzD,KAAK,KAAA,CACH,OAAO,OAAOjE,CAAAA,EAAU,QAAA,EAAYA,CAAAA,EAAUiE,CAAAA,CAAU,KAAA,CAC1D,KAAK,KAAA,CACH,OAAO,OAAOjE,CAAAA,EAAU,QAAA,EAAYA,CAAAA,EAAUiE,CAAAA,CAAU,KAAA,CAC1D,KAAK,QAAA,CACH,OAA8BjE,CAAAA,EAAU,IAAA,CAC1C,KAAK,WAAA,CACH,OAA8BA,CAAAA,EAAU,IAAA,CAC1C,QACE,OAAO,KACX,CACF,CAMA,SAASmE,CAAAA,CACP1H,CAAAA,CACAyH,CAAAA,CACyB,CACzB,IAAME,CAAAA,CAAoC,EAAC,CAE3C,IAAA,GAAW,CAACV,CAAAA,CAAK1D,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQvD,CAAK,CAAA,CAC7C,GAAI,OAAOuD,CAAAA,EAAU,QAAA,CAAU,CAE7B,IAAMqE,CAAAA,CAAerE,CAAAA,CAAM,KAAA,CAAM,uBAAuB,CAAA,CACpDqE,CAAAA,CACFD,CAAAA,CAASV,CAAG,CAAA,CAAIJ,CAAAA,CAAUY,CAAAA,CAAMG,CAAAA,CAAa,CAAC,CAAC,CAAA,CAG/CD,CAAAA,CAASV,CAAG,CAAA,CAAI1D,CAAAA,CAAM,OAAA,CAAQ,sBAAA,CAAwB,CAACsE,CAAAA,CAAGd,CAAAA,GAAS,CACjE,IAAMe,CAAAA,CAAMjB,CAAAA,CAAUY,CAAAA,CAAMV,CAAI,CAAA,CAChC,OAAOe,CAAAA,GAAQ,MAAA,CAAY,MAAA,CAAOA,CAAG,CAAA,CAAI,EAC3C,CAAC,EAEL,CAAA,KAAW,KAAA,CAAM,OAAA,CAAQvE,CAAK,CAAA,CAC5BoE,CAAAA,CAASV,CAAG,CAAA,CAAI1D,CAAAA,CAAM,GAAA,CAAKW,CAAAA,EACzB,OAAOA,CAAAA,EAAS,QAAA,EAAYA,CAAAA,GAAS,KACjCwD,CAAAA,CAAaxD,CAAAA,CAAiCuD,CAAI,CAAA,CAClDvD,CACN,CAAA,CACS,OAAOX,CAAAA,EAAU,QAAA,EAAYA,CAAAA,GAAU,IAAA,CAChDoE,CAAAA,CAASV,CAAG,CAAA,CAAIS,CAAAA,CAAanE,CAAAA,CAAkCkE,CAAI,CAAA,CAEnEE,CAAAA,CAASV,CAAG,CAAA,CAAI1D,CAAAA,CAIpB,OAAOoE,CACT,CAUA,SAASI,EAAAA,CAAa,CAAE,IAAA,CAAAC,CAAAA,CAAM,QAAA,CAAAzB,CAAS,CAAA,CAAsB,CAC3D,GAAM,CAAE,IAAA,CAAAkB,CAAAA,CAAM,YAAA,CAAAQ,CAAa,CAAA,CAAIvB,EAAAA,EAAQ,CAGvC,GAAIsB,CAAAA,CAAK,IAAA,EAAQ,CAACT,EAAAA,CAAkBS,CAAAA,CAAK,IAAA,CAAMP,CAAI,CAAA,CACjD,OAAO,IAAA,CAIT,IAAMS,CAAAA,CAAY3B,CAAAA,CAASyB,CAAAA,CAAK,IAAI,CAAA,CACpC,GAAI,CAACE,CAAAA,CACH,OAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkCF,CAAAA,CAAK,IAAI,CAAA,CAAE,CAAA,CAExD5D,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qFAAA,CAAsF,QAAA,CAAA,CAAA,qBAAA,CAC/E4D,CAAAA,CAAK,IAAA,CAAA,CAC3B,CAAA,CAKJ,IAAMG,CAAAA,CAAgBH,CAAAA,CAAK,KAAA,CAAQN,CAAAA,CAAaM,CAAAA,CAAK,KAAA,CAAOP,CAAI,CAAA,CAAI,EAAC,CAG/DW,CAAAA,CAAsC,EAAC,CACzCJ,CAAAA,CAAK,EAAA,GACHA,CAAAA,CAAK,EAAA,CAAG,KAAA,GACVI,CAAAA,CAAW,OAAA,CAAU,IAAMH,EAAaD,CAAAA,CAAK,EAAA,CAAI,KAAM,CAAA,CAAA,CAErDA,CAAAA,CAAK,EAAA,CAAG,MAAA,GACVI,CAAAA,CAAW,QAAA,CAAYlF,CAAAA,EAAuB,CAC5CA,CAAAA,CAAE,cAAA,EAAe,CACjB+E,CAAAA,CAAaD,CAAAA,CAAK,GAAI,MAAO,EAC/B,CAAA,CAAA,CAAA,CAKJ,IAAI1I,CAAAA,CAA4B,IAAA,CAuBhC,OAtBI0I,CAAAA,CAAK,QAAA,GACH,OAAOA,CAAAA,CAAK,QAAA,EAAa,QAAA,CAE3B1I,CAAAA,CAAW0I,CAAAA,CAAK,QAAA,CAAS,QAAQ,sBAAA,CAAwB,CAACH,CAAAA,CAAGd,CAAAA,GAAS,CACpE,IAAMe,CAAAA,CAAMjB,CAAAA,CAAUY,CAAAA,CAAMV,CAAI,CAAA,CAChC,OAAOe,CAAAA,GAAQ,MAAA,CAAY,MAAA,CAAOA,CAAG,EAAI,EAC3C,CAAC,CAAA,CACQ,KAAA,CAAM,OAAA,CAAQE,CAAAA,CAAK,QAAQ,CAAA,GACpC1I,CAAAA,CAAW0I,CAAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAACK,CAAAA,CAAOlE,CAAAA,GACnCjE,GAAAA,CAAC6H,GAAA,CAEC,IAAA,CAAMM,CAAAA,CACN,QAAA,CAAU9B,CAAAA,CAAAA,CAFL8B,CAAAA,CAAM,GAAA,EAAO,CAAA,MAAA,EAASlE,CAAK,CAAA,CAGlC,CACD,CAAA,CAAA,CAAA,CAKgB,CAAC,SAAA,CAAW,OAAA,CAAS,UAAA,CAAY,WAAY,QAAA,CAAU,UAAA,CAAY,UAAA,CAAY,OAAA,CAAS,gBAAgB,CAAA,CAC1F,QAAA,CAAS6D,CAAAA,CAAK,IAAI,CAAA,EAEhC1I,CAAAA,GAAa,IAAA,CACzBY,GAAAA,CAACgI,CAAAA,CAAA,CAAW,GAAGC,EAAgB,GAAGC,CAAAA,CAAY,CAAA,CAIrDlI,GAAAA,CAACgI,CAAAA,CAAA,CAAW,GAAGC,CAAAA,CAAgB,GAAGC,CAAAA,CAC/B,QAAA,CAAA9I,CAAAA,CACH,CAEJ,CAKO,SAASgJ,EAAAA,CAAa,CAC3B,MAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,IAAA,CAAMC,CAAAA,CAAc,EAAC,CACrB,QAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CACF,CAAA,CAAsB,CAEpB,IAAMC,EAAe,MAAA,GAAUL,CAAAA,CACzBM,CAAAA,CAAWD,CAAAA,CAAgBL,CAAAA,CAA0B,IAAA,CAAQA,CAAAA,CAC7DO,CAAAA,CAAaF,CAAAA,CAAgBL,CAAAA,CAA0B,IAAA,CAAO,EAAC,CAG/D,CAACd,CAAAA,CAAMsB,CAAY,EAAI/F,QAAAA,CAAkC,CAC7D,GAAG8F,CAAAA,CACH,GAAGL,CACL,CAAC,CAAA,CAGKlC,CAAAA,CAAWyC,OAAAA,CACf,KAAO,CAAE,GAAG/D,CAAAA,CAAiB,GAAGuD,CAAW,GAC3C,CAACA,CAAU,CACb,CAAA,CAGMS,CAAAA,CAAUC,WAAAA,CAAY,CAACnC,CAAAA,CAAcxD,CAAAA,GAAmB,CAC5DwF,CAAAA,CAAcI,CAAAA,EAASjC,EAAAA,CAAUiC,CAAAA,CAAMpC,CAAAA,CAAMxD,CAAK,CAAC,EACrD,CAAA,CAAG,EAAE,CAAA,CAGC6F,CAAAA,CAAWF,WAAAA,CACdnC,CAAAA,EAAiB,CACZ4B,CAAAA,CACFA,CAAAA,CAAW5B,CAAI,CAAA,CACN,OAAO,MAAA,EAAW,WAAA,GAC3B,OAAO,QAAA,CAAS,IAAA,CAAOA,CAAAA,EAE3B,CAAA,CACA,CAAC4B,CAAU,CACb,CAAA,CAGMV,CAAAA,CAAeiB,WAAAA,CAClBG,CAAAA,EAAuB,CAxQ5B,IAAA3E,CAAAA,CAAA4E,CAAAA,CAAAC,CAAAA,CAyQM,OAAQF,CAAAA,CAAO,IAAA,EACb,KAAK,UAAA,CACHD,CAAAA,CAAAA,CAAS1E,CAAAA,CAAA2E,CAAAA,CAAO,OAAA,GAAP,IAAA,CAAA,MAAA,CAAA3E,CAAAA,CAAgB,IAAc,CAAA,CACvC,MACF,KAAK,UAAA,CAAA,CACC4E,EAAAD,CAAAA,CAAO,OAAA,GAAP,IAAA,EAAAC,CAAAA,CAAgB,IAAA,EAAA,CAAA,CAAQC,CAAAA,CAAAF,CAAAA,CAAO,OAAA,GAAP,IAAA,CAAA,MAAA,CAAAE,CAAAA,CAAgB,KAAA,IAAU,MAAA,EACpDN,CAAAA,CAAQI,CAAAA,CAAO,OAAA,CAAQ,IAAA,CAAgBA,EAAO,OAAA,CAAQ,KAAK,CAAA,CAE7D,MACF,KAAK,KAAA,CAEHX,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAWW,CAAAA,CAAAA,CACX,MACF,KAAK,QAAA,CACHX,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAWW,GACX,MACF,QACEX,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAWW,CAAAA,EACf,CACF,CAAA,CACA,CAACD,CAAAA,CAAUH,CAAAA,CAASP,CAAQ,CAC9B,CAAA,CAGMc,EAAAA,CAA4BR,OAAAA,CAChC,KAAO,CACL,IAAA,CAAAvB,CAAAA,CACA,OAAA,CAAAwB,CAAAA,CACA,YAAA,CAAAhB,CAAAA,CACA,QAAA,CAAAmB,CACF,CAAA,CAAA,CACA,CAAC3B,CAAAA,CAAMwB,CAAAA,CAAShB,CAAAA,CAAcmB,CAAQ,CACxC,EAEA,OACElJ,GAAAA,CAACsG,EAAAA,CAAoB,QAAA,CAApB,CAA6B,KAAA,CAAOgD,EAAAA,CACnC,QAAA,CAAAtJ,GAAAA,CAAC6H,EAAAA,CAAA,CAAa,IAAA,CAAMc,CAAAA,CAAU,QAAA,CAAUtC,CAAAA,CAAU,CAAA,CACpD,CAEJ,CAKO,SAASkD,EAAAA,CAAa,CAC3B,IAAA,CAAAC,CAAAA,CACA,GAAG1J,CACL,CAAA,CAAyD,CACvD,GAAI,CACF,IAAMuI,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAMmB,CAAI,CAAA,CAC9B,OAAOxJ,GAAAA,CAACoI,EAAAA,CAAA,CAAa,MAAA,CAAQC,CAAAA,CAAS,GAAGvI,CAAAA,CAAO,CAClD,CAAA,MAAS2J,CAAAA,CAAO,CACd,OACEvF,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,yDAAA,CACb,QAAA,CAAA,CAAAlE,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,gCAAA,CAAiC,QAAA,CAAA,kBAAA,CAAgB,CAAA,CAC9DA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACX,QAAA,CAAAyJ,CAAAA,CAAgB,OAAA,CACpB,CAAA,CAAA,CACF,CAEJ,CACF","file":"sdui.mjs","sourcesContent":["\"use client\";\n\n/**\n * SDUI Component Registry\n *\n * 컴포넌트 타입 문자열 → 실제 React 컴포넌트 매핑\n */\n\nimport React, { useState } from \"react\";\nimport type { SDUIComponentRegistry } from \"./types\";\nimport { cn } from \"../lib/utils\";\n\n// 기본 컴포넌트들\nimport { Button } from \"../components/Button\";\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from \"../components/Card\";\nimport { Badge } from \"../components/Badge\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../components/Avatar\";\nimport { Container } from \"../components/Container\";\nimport { Input } from \"../components/Input\";\nimport { Textarea } from \"../components/Textarea\";\nimport { Label } from \"../components/Label\";\nimport { Checkbox, type CheckboxProps } from \"../components/Checkbox\";\nimport { Switch, type SwitchProps } from \"../components/Switch\";\nimport { type InputProps } from \"../components/Input\";\nimport { type TextareaProps } from \"../components/Textarea\";\nimport { Skeleton } from \"../components/Skeleton\";\nimport { Progress } from \"../components/Progress\";\nimport { Alert } from \"../components/Alert\";\nimport { Icon } from \"../components/Icon\";\nimport type { IconName } from \"../lib/icons\";\n\n// Advanced 컴포넌트들\nimport { HeroSection } from \"../components/HeroSection\";\nimport { ScrollProgress } from \"../components/ScrollProgress\";\n\n// Interactive 컴포넌트들\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from \"../components/Accordion\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"../components/Tabs\";\n\n// 레이아웃 프리미티브\nconst Box: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n // 커스텀 스타일 props (DOM에 직접 전달하지 않음)\n backgroundColor?: string;\n padding?: string | number;\n margin?: string | number;\n borderRadius?: string | number;\n border?: string;\n}> = ({\n children,\n justify,\n align,\n className = \"\",\n style,\n // 커스텀 props 분리 (DOM에 전달 X)\n backgroundColor,\n padding,\n margin,\n borderRadius,\n border,\n ...props\n}) => {\n // 커스텀 props를 style 객체로 병합\n const customStyle: React.CSSProperties = {\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n ...(margin !== undefined && { margin: typeof margin === 'number' ? `${margin}px` : margin }),\n ...(borderRadius !== undefined && { borderRadius: typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius }),\n ...(border && { border }),\n };\n\n return (\n <div\n className={cn(\n (justify || align) && \"flex\",\n justify && justifyMap[justify],\n align && alignMap[align],\n className\n )}\n style={Object.keys(customStyle).length > 0 ? customStyle : undefined}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// Spacer - 공백용 void 컴포넌트\nconst Spacer: React.FC<{ size?: number; className?: string }> = ({ size = 16, className = \"\" }) => (\n <div className={className} style={{ width: size, height: size, flexShrink: 0 }} />\n);\n\n// 정렬 매핑\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n};\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n};\n\nconst Flex: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n direction?: \"row\" | \"column\";\n gap?: number;\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n direction = \"row\",\n gap = 0,\n justify = \"start\",\n align = \"stretch\",\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`flex ${direction === \"column\" ? \"flex-col\" : \"flex-row\"} ${justifyMap[justify]} ${alignMap[align]} ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\nconst Grid: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n cols?: number;\n gap?: number;\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n cols = 1,\n gap = 4,\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`grid ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// 텍스트 정렬 매핑\nconst textAlignMap = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n\n// 타이포그래피 스타일 props 타입\ninterface TypographyStyleProps {\n fontSize?: string;\n lineHeight?: string;\n fontWeight?: string;\n letterSpacing?: string;\n}\n\n// 타이포그래피 스타일 props를 style 객체로 변환\nfunction getTypographyStyle(props: TypographyStyleProps): React.CSSProperties {\n const style: React.CSSProperties = {};\n if (props.fontSize) style.fontSize = props.fontSize;\n if (props.lineHeight) style.lineHeight = props.lineHeight;\n if (props.fontWeight) style.fontWeight = props.fontWeight;\n if (props.letterSpacing) style.letterSpacing = props.letterSpacing;\n return style;\n}\n\nconst Text: React.FC<React.HTMLAttributes<HTMLParagraphElement> & {\n variant?: \"body\" | \"muted\" | \"lead\";\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps> = ({\n children,\n variant = \"body\",\n align = \"center\",\n className = \"\",\n style,\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n ...props\n}) => {\n const variantClasses = {\n body: \"text-foreground\",\n muted: \"text-muted-foreground text-sm\",\n lead: \"text-xl text-muted-foreground\",\n };\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n\n return (\n <p\n className={`${variantClasses[variant]} ${textAlignMap[align]} ${className}`}\n style={mergedStyle}\n {...props}\n >\n {children}\n </p>\n );\n};\n\n// Heading 컴포넌트들 (정렬 + 타이포그래피 스타일 지원)\ntype HeadingProps = React.HTMLAttributes<HTMLHeadingElement> & {\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps;\n\nconst H1: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h1 className={`text-4xl md:text-5xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h1>\n );\n};\n\nconst H2: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h2 className={`text-3xl md:text-4xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h2>\n );\n};\n\nconst H3: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h3 className={`text-2xl md:text-3xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h3>\n );\n};\n\nconst H4: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h4 className={`text-xl md:text-2xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h4>\n );\n};\n\nconst Link: React.FC<React.AnchorHTMLAttributes<HTMLAnchorElement>> = ({\n children,\n href = \"#\",\n className = \"\",\n ...props\n}) => {\n // 절대 경로 처리: http/https로 시작하지 않으면 그대로, 시작하면 외부 링크\n const isExternal = href.startsWith(\"http://\") || href.startsWith(\"https://\");\n\n return (\n <a\n href={href}\n className={`text-primary hover:underline ${className}`}\n {...(isExternal ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n {...props}\n >\n {children}\n </a>\n );\n};\n\nconst Image: React.FC<React.ImgHTMLAttributes<HTMLImageElement>> = ({ className = \"\", alt = \"\", ...props }) => (\n <img className={`max-w-full h-auto ${className}`} alt={alt} {...props} />\n);\n\n// SDUI용 Icon 래퍼 (name을 string으로 받음)\nconst SDUIIcon: React.FC<{ name?: string; size?: number; className?: string }> = ({\n name = \"star\",\n size = 24,\n className = \"\",\n}) => <Icon name={name as IconName} size={size} className={className} />;\n\nconst Section: React.FC<React.HTMLAttributes<HTMLElement>> = ({\n children,\n className = \"\",\n ...props\n}) => (\n <section className={`py-10 ${className}`} {...props}>\n {children}\n </section>\n);\n\nconst Divider: React.FC<React.HTMLAttributes<HTMLHRElement>> = ({ className = \"\", ...props }) => (\n <hr className={`border-border ${className}`} {...props} />\n);\n\n// Header - 네비게이션 헤더 (GNB)\nconst Header: React.FC<React.HTMLAttributes<HTMLElement> & {\n sticky?: boolean;\n transparent?: boolean;\n blur?: boolean;\n overlay?: boolean;\n}> = ({\n children,\n sticky = true,\n transparent = false,\n blur = true,\n overlay = false,\n className = \"\",\n ...props\n}) => (\n <header\n className={cn(\n \"w-full px-4 py-3 z-50\",\n overlay ? \"absolute top-0 left-0 right-0\" : sticky && \"sticky top-0\",\n transparent ? \"bg-transparent\" : \"bg-background/80\",\n blur && !transparent && \"backdrop-blur-md\",\n !transparent && \"border-b border-border\",\n className\n )}\n {...props}\n >\n <div className=\"max-w-7xl mx-auto\">\n {children}\n </div>\n </header>\n);\n\n/**\n * SDUI용 Uncontrolled 래퍼 컴포넌트들\n * 프리뷰에서 인터랙션이 동작하도록 자체 상태 관리\n */\n\n// Uncontrolled Checkbox - 클릭하면 상태 토글\nconst SDUICheckbox: React.FC<CheckboxProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Checkbox\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Switch - 클릭하면 상태 토글\nconst SDUISwitch: React.FC<SwitchProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Switch\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Input - 자체 상태 관리\nconst SDUIInput: React.FC<InputProps> = ({ defaultValue = \"\", onChange, ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Input\n {...props}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Textarea - 자체 상태 관리 + resize 지원\nconst SDUITextarea: React.FC<TextareaProps> = ({ defaultValue = \"\", onChange, resize = \"vertical\", ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Textarea\n {...props}\n resize={resize}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n/**\n * SDUI용 간단한 Accordion - 데이터 기반\n * items 배열로 아코디언 생성\n */\ninterface SimpleAccordionItem {\n title: string;\n content: string;\n value?: string;\n}\n\nconst SDUIAccordion: React.FC<{\n items?: SimpleAccordionItem[];\n type?: \"single\" | \"multiple\";\n collapsible?: boolean;\n defaultValue?: string;\n className?: string;\n}> = ({\n items = [],\n type = \"single\",\n collapsible = true,\n defaultValue,\n className = \"\",\n}) => {\n return (\n <Accordion\n type={type}\n collapsible={collapsible}\n defaultValue={defaultValue}\n className={className}\n >\n {items.map((item, index) => {\n const value = item.value || `item-${index}`;\n return (\n <AccordionItem key={value} value={value}>\n <AccordionTrigger>{item.title}</AccordionTrigger>\n <AccordionContent>{item.content}</AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordion>\n );\n};\n\n/**\n * SDUI용 간단한 Tabs - 데이터 기반\n * tabs 배열로 탭 생성\n */\ninterface SimpleTabItem {\n label: string;\n content: string;\n value?: string;\n}\n\nconst SDUITabs: React.FC<{\n tabs?: SimpleTabItem[];\n defaultValue?: string;\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\";\n className?: string;\n}> = ({\n tabs = [],\n defaultValue,\n variant = \"default\",\n className = \"\",\n}) => {\n const firstValue = tabs[0]?.value || \"tab-0\";\n\n return (\n <Tabs\n defaultValue={defaultValue || firstValue}\n variant={variant}\n className={className}\n >\n <TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsTrigger key={value} value={value}>\n {tab.label}\n </TabsTrigger>\n );\n })}\n </TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsContent key={value} value={value}>\n {tab.content}\n </TabsContent>\n );\n })}\n </Tabs>\n );\n};\n\n/**\n * 기본 컴포넌트 레지스트리\n */\nexport const defaultRegistry: SDUIComponentRegistry = {\n // 레이아웃\n Box,\n Spacer,\n Flex,\n Grid,\n Section,\n Container,\n Divider,\n\n // 타이포그래피\n Text,\n H1,\n H2,\n H3,\n H4,\n Link,\n\n // 미디어\n Image,\n Icon: SDUIIcon,\n\n // 기본 UI\n Button,\n Badge,\n Avatar,\n AvatarImage,\n AvatarFallback,\n Input: SDUIInput,\n Textarea: SDUITextarea,\n Label,\n Checkbox: SDUICheckbox,\n Switch: SDUISwitch,\n Skeleton,\n Progress,\n\n // 카드\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n\n // 피드백\n Alert,\n\n // Advanced (Pro)\n Header,\n HeroSection,\n ScrollProgress,\n\n // Interactive (Pro)\n Accordion: SDUIAccordion,\n Tabs: SDUITabs,\n};\n\n/**\n * 레지스트리 확장 헬퍼\n */\nexport function extendRegistry(\n customComponents: SDUIComponentRegistry\n): SDUIComponentRegistry {\n return {\n ...defaultRegistry,\n ...customComponents,\n };\n}\n\n/**\n * 컴포넌트 존재 여부 확인\n */\nexport function hasComponent(registry: SDUIComponentRegistry, type: string): boolean {\n return type in registry;\n}\n","\"use client\";\n\n/**\n * SDUI Renderer\n *\n * JSON 스키마를 받아서 실제 React 컴포넌트로 렌더링\n */\n\nimport React, { createContext, useContext, useState, useCallback, useMemo } from \"react\";\nimport type {\n SDUINode,\n SDUIPageSchema,\n SDUIRendererProps,\n SDUIContext,\n SDUIAction,\n SDUICondition,\n SDUIComponentRegistry,\n} from \"./types\";\nimport { defaultRegistry } from \"./registry\";\n\n// SDUI Context\nconst SDUIContextInternal = createContext<SDUIContext | null>(null);\n\n/**\n * SDUI Context Hook\n */\nexport function useSDUI(): SDUIContext {\n const context = useContext(SDUIContextInternal);\n if (!context) {\n throw new Error(\"useSDUI must be used within SDUIRenderer\");\n }\n return context;\n}\n\n/**\n * 데이터 경로로 값 가져오기\n * 예: \"user.profile.name\" → data.user.profile.name\n */\nfunction getByPath(obj: Record<string, unknown>, path: string): unknown {\n return path.split(\".\").reduce((acc: unknown, key) => {\n if (acc && typeof acc === \"object\" && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * 데이터 경로로 값 설정하기\n */\nfunction setByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): Record<string, unknown> {\n const keys = path.split(\".\");\n const result = { ...obj };\n let current: Record<string, unknown> = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n current[key] = { ...(current[key] as Record<string, unknown> || {}) };\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result;\n}\n\n/**\n * 조건 평가\n */\nfunction evaluateCondition(\n condition: SDUICondition,\n data: Record<string, unknown>\n): boolean {\n const value = getByPath(data, condition.path);\n\n switch (condition.operator) {\n case \"eq\":\n return value === condition.value;\n case \"neq\":\n return value !== condition.value;\n case \"gt\":\n return typeof value === \"number\" && value > (condition.value as number);\n case \"lt\":\n return typeof value === \"number\" && value < (condition.value as number);\n case \"gte\":\n return typeof value === \"number\" && value >= (condition.value as number);\n case \"lte\":\n return typeof value === \"number\" && value <= (condition.value as number);\n case \"exists\":\n return value !== undefined && value !== null;\n case \"notExists\":\n return value === undefined || value === null;\n default:\n return true;\n }\n}\n\n/**\n * Props에서 데이터 바인딩 처리\n * {{ path }} 형식을 실제 데이터로 치환\n */\nfunction resolveProps(\n props: Record<string, unknown>,\n data: Record<string, unknown>\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === \"string\") {\n // {{ path }} 패턴 처리\n const bindingMatch = value.match(/^\\{\\{\\s*(.+?)\\s*\\}\\}$/);\n if (bindingMatch) {\n resolved[key] = getByPath(data, bindingMatch[1]);\n } else {\n // 문자열 내 부분 바인딩: \"Hello, {{ user.name }}!\"\n resolved[key] = value.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n }\n } else if (Array.isArray(value)) {\n resolved[key] = value.map((item) =>\n typeof item === \"object\" && item !== null\n ? resolveProps(item as Record<string, unknown>, data)\n : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n resolved[key] = resolveProps(value as Record<string, unknown>, data);\n } else {\n resolved[key] = value;\n }\n }\n\n return resolved;\n}\n\n/**\n * 단일 노드 렌더러\n */\ninterface NodeRendererProps {\n node: SDUINode;\n registry: SDUIComponentRegistry;\n}\n\nfunction NodeRenderer({ node, registry }: NodeRendererProps) {\n const { data, handleAction } = useSDUI();\n\n // 조건부 렌더링 체크\n if (node.when && !evaluateCondition(node.when, data)) {\n return null;\n }\n\n // 컴포넌트 찾기\n const Component = registry[node.type];\n if (!Component) {\n console.warn(`[SDUI] Unknown component type: ${node.type}`);\n return (\n <div className=\"p-4 border border-destructive/50 bg-destructive/10 rounded text-sm text-destructive\">\n Unknown component: {node.type}\n </div>\n );\n }\n\n // Props 처리\n const resolvedProps = node.props ? resolveProps(node.props, data) : {};\n\n // 이벤트 핸들러 처리\n const eventProps: Record<string, unknown> = {};\n if (node.on) {\n if (node.on.click) {\n eventProps.onClick = () => handleAction(node.on!.click!);\n }\n if (node.on.submit) {\n eventProps.onSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n handleAction(node.on!.submit!);\n };\n }\n }\n\n // Children 처리\n let children: React.ReactNode = null;\n if (node.children) {\n if (typeof node.children === \"string\") {\n // 문자열 바인딩 처리\n children = node.children.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n } else if (Array.isArray(node.children)) {\n children = node.children.map((child, index) => (\n <NodeRenderer\n key={child.key || `child-${index}`}\n node={child}\n registry={registry}\n />\n ));\n }\n }\n\n // void 엘리먼트는 children을 받지 않음\n const voidElements = ['Divider', 'Input', 'Textarea', 'Checkbox', 'Switch', 'Progress', 'Skeleton', 'Image', 'ScrollProgress'];\n const isVoidElement = voidElements.includes(node.type);\n\n if (isVoidElement || children === null) {\n return <Component {...resolvedProps} {...eventProps} />;\n }\n\n return (\n <Component {...resolvedProps} {...eventProps}>\n {children}\n </Component>\n );\n}\n\n/**\n * SDUI Renderer 메인 컴포넌트\n */\nexport function SDUIRenderer({\n schema,\n components,\n data: initialData = {},\n onAction,\n onNavigate,\n}: SDUIRendererProps) {\n // 페이지 스키마인지 노드인지 확인\n const isPageSchema = \"root\" in schema;\n const rootNode = isPageSchema ? (schema as SDUIPageSchema).root : (schema as SDUINode);\n const schemaData = isPageSchema ? (schema as SDUIPageSchema).data : {};\n\n // 데이터 상태\n const [data, setDataState] = useState<Record<string, unknown>>({\n ...schemaData,\n ...initialData,\n });\n\n // 레지스트리 병합\n const registry = useMemo(\n () => ({ ...defaultRegistry, ...components }),\n [components]\n );\n\n // 데이터 업데이트\n const setData = useCallback((path: string, value: unknown) => {\n setDataState((prev) => setByPath(prev, path, value));\n }, []);\n\n // 네비게이션\n const navigate = useCallback(\n (path: string) => {\n if (onNavigate) {\n onNavigate(path);\n } else if (typeof window !== \"undefined\") {\n window.location.href = path;\n }\n },\n [onNavigate]\n );\n\n // 액션 핸들러\n const handleAction = useCallback(\n (action: SDUIAction) => {\n switch (action.type) {\n case \"navigate\":\n navigate(action.payload?.path as string);\n break;\n case \"setState\":\n if (action.payload?.path && action.payload?.value !== undefined) {\n setData(action.payload.path as string, action.payload.value);\n }\n break;\n case \"api\":\n // API 호출은 외부에서 처리\n onAction?.(action);\n break;\n case \"custom\":\n onAction?.(action);\n break;\n default:\n onAction?.(action);\n }\n },\n [navigate, setData, onAction]\n );\n\n // Context 값\n const contextValue: SDUIContext = useMemo(\n () => ({\n data,\n setData,\n handleAction,\n navigate,\n }),\n [data, setData, handleAction, navigate]\n );\n\n return (\n <SDUIContextInternal.Provider value={contextValue}>\n <NodeRenderer node={rootNode} registry={registry} />\n </SDUIContextInternal.Provider>\n );\n}\n\n/**\n * JSON 문자열에서 렌더링 (편의용)\n */\nexport function SDUIFromJSON({\n json,\n ...props\n}: Omit<SDUIRendererProps, \"schema\"> & { json: string }) {\n try {\n const schema = JSON.parse(json);\n return <SDUIRenderer schema={schema} {...props} />;\n } catch (error) {\n return (\n <div className=\"p-4 border border-destructive bg-destructive/10 rounded\">\n <p className=\"font-semibold text-destructive\">SDUI Parse Error</p>\n <pre className=\"text-sm mt-2 text-destructive/80\">\n {(error as Error).message}\n </pre>\n </div>\n );\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hua-labs/ui",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "HUA Labs - Modern React UI Component Library - Beautiful, accessible, and customizable components for React applications",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -66,11 +66,17 @@
|
|
|
66
66
|
"import": "./dist/sdui.mjs",
|
|
67
67
|
"default": "./dist/sdui.mjs"
|
|
68
68
|
},
|
|
69
|
+
"./landing": {
|
|
70
|
+
"types": "./dist/landing.d.ts",
|
|
71
|
+
"import": "./dist/landing.mjs",
|
|
72
|
+
"default": "./dist/landing.mjs"
|
|
73
|
+
},
|
|
69
74
|
"./styles/base.css": "./src/styles/base.css",
|
|
70
75
|
"./styles/toast.css": "./src/styles/toast.css",
|
|
71
76
|
"./styles/codeblock.css": "./src/styles/codeblock.css",
|
|
72
77
|
"./styles/recommended-theme.css": "./src/styles/recommended-theme.css",
|
|
73
|
-
"./styles/
|
|
78
|
+
"./styles/utilities.css": "./src/styles/utilities.css",
|
|
79
|
+
"./styles/landing.css": "./src/styles/landing.css",
|
|
74
80
|
"./icons": {
|
|
75
81
|
"types": "./src/components/icons/index.ts",
|
|
76
82
|
"import": "./src/components/icons/index.ts",
|
|
@@ -103,7 +109,7 @@
|
|
|
103
109
|
"class-variance-authority": "^0.7.1",
|
|
104
110
|
"clsx": "^2.0.0",
|
|
105
111
|
"sugar-high": "^0.9.5",
|
|
106
|
-
"tailwind-merge": "^
|
|
112
|
+
"tailwind-merge": "^3.4.1"
|
|
107
113
|
},
|
|
108
114
|
"devDependencies": {
|
|
109
115
|
"@eslint/js": "^9.39.2",
|
|
@@ -111,28 +117,28 @@
|
|
|
111
117
|
"@testing-library/react": "^16.3.2",
|
|
112
118
|
"@testing-library/user-event": "^14.6.1",
|
|
113
119
|
"@types/node": "^25.2.0",
|
|
114
|
-
"@types/react": "^19.2.
|
|
120
|
+
"@types/react": "^19.2.14",
|
|
115
121
|
"@types/react-dom": "^19.2.3",
|
|
116
|
-
"@vitejs/plugin-react": "^5.1.
|
|
122
|
+
"@vitejs/plugin-react": "^5.1.4",
|
|
117
123
|
"eslint": "^10.0.0",
|
|
118
124
|
"eslint-plugin-react-hooks": "^5.2.0",
|
|
119
|
-
"globals": "^
|
|
125
|
+
"globals": "^17.3.0",
|
|
120
126
|
"jsdom": "^27.4.0",
|
|
121
|
-
"lucide-react": "^0.
|
|
127
|
+
"lucide-react": "^0.570.0",
|
|
122
128
|
"react": "^19.2.4",
|
|
123
129
|
"react-dom": "^19.2.4",
|
|
124
130
|
"rollup-plugin-visualizer": "^6.0.5",
|
|
125
131
|
"tsup": "^8.5.1",
|
|
126
132
|
"tsx": "^4.21.0",
|
|
127
133
|
"typescript": "^5.9.3",
|
|
128
|
-
"typescript-eslint": "^8.
|
|
134
|
+
"typescript-eslint": "^8.56.0",
|
|
129
135
|
"vitest": "^4.0.18"
|
|
130
136
|
},
|
|
131
137
|
"peerDependencies": {
|
|
132
138
|
"@dnd-kit/core": "^6.3.1",
|
|
133
139
|
"@dnd-kit/sortable": "^10.0.0",
|
|
134
140
|
"@dnd-kit/utilities": "^3.2.2",
|
|
135
|
-
"
|
|
141
|
+
"@hua-labs/motion-core": "*",
|
|
136
142
|
"react": ">=19.0.0",
|
|
137
143
|
"react-dom": ">=19.0.0"
|
|
138
144
|
},
|
|
@@ -146,7 +152,7 @@
|
|
|
146
152
|
"@dnd-kit/utilities": {
|
|
147
153
|
"optional": true
|
|
148
154
|
},
|
|
149
|
-
"
|
|
155
|
+
"@hua-labs/motion-core": {
|
|
150
156
|
"optional": true
|
|
151
157
|
}
|
|
152
158
|
},
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HUA-UI Landing Page Utilities
|
|
3
|
+
*
|
|
4
|
+
* Usage: @import "@hua-labs/ui/styles/landing.css";
|
|
5
|
+
*
|
|
6
|
+
* Opt-in CSS utilities for landing pages.
|
|
7
|
+
* All values use CSS custom properties — works with any theme.
|
|
8
|
+
*
|
|
9
|
+
* Provides: .gradient-bg, .gradient-bg-soft, .section-line, .section-line-left,
|
|
10
|
+
* .mesh-primary, .mesh-accent, .stat-number, .card-hover-lift
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/* ── Gradient backgrounds ─────────────────────────── */
|
|
14
|
+
|
|
15
|
+
.gradient-bg {
|
|
16
|
+
background: linear-gradient(
|
|
17
|
+
135deg,
|
|
18
|
+
var(--color-primary, hsl(var(--primary))) 0%,
|
|
19
|
+
var(--color-accent, hsl(var(--accent-foreground))) 100%
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.gradient-bg-soft {
|
|
24
|
+
background: linear-gradient(
|
|
25
|
+
135deg,
|
|
26
|
+
color-mix(in srgb, var(--color-primary, hsl(var(--primary))) 15%, transparent) 0%,
|
|
27
|
+
color-mix(in srgb, var(--color-accent, hsl(var(--accent-foreground))) 10%, transparent) 100%
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* ── Section decorator ────────────────────────────── */
|
|
32
|
+
|
|
33
|
+
.section-line {
|
|
34
|
+
width: 80px;
|
|
35
|
+
height: 3px;
|
|
36
|
+
border-radius: 9999px;
|
|
37
|
+
background: linear-gradient(
|
|
38
|
+
90deg,
|
|
39
|
+
var(--color-primary, hsl(var(--primary))),
|
|
40
|
+
var(--color-accent, hsl(var(--accent-foreground)))
|
|
41
|
+
);
|
|
42
|
+
margin-bottom: 1.5rem;
|
|
43
|
+
margin-left: auto;
|
|
44
|
+
margin-right: auto;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.section-line-left {
|
|
48
|
+
width: 80px;
|
|
49
|
+
height: 3px;
|
|
50
|
+
border-radius: 9999px;
|
|
51
|
+
background: linear-gradient(
|
|
52
|
+
90deg,
|
|
53
|
+
var(--color-primary, hsl(var(--primary))),
|
|
54
|
+
var(--color-accent, hsl(var(--accent-foreground)))
|
|
55
|
+
);
|
|
56
|
+
margin-bottom: 1.5rem;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* ── Mesh backgrounds ─────────────────────────────── */
|
|
60
|
+
|
|
61
|
+
.mesh-primary {
|
|
62
|
+
background:
|
|
63
|
+
radial-gradient(
|
|
64
|
+
ellipse 80% 60% at 20% 40%,
|
|
65
|
+
color-mix(in srgb, var(--color-primary, hsl(var(--primary))) 8%, transparent),
|
|
66
|
+
transparent
|
|
67
|
+
),
|
|
68
|
+
radial-gradient(
|
|
69
|
+
ellipse 60% 80% at 80% 60%,
|
|
70
|
+
color-mix(in srgb, var(--color-primary, hsl(var(--primary))) 5%, transparent),
|
|
71
|
+
transparent
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.mesh-accent {
|
|
76
|
+
background:
|
|
77
|
+
radial-gradient(
|
|
78
|
+
ellipse 80% 60% at 80% 30%,
|
|
79
|
+
color-mix(in srgb, var(--color-accent, hsl(var(--accent-foreground))) 8%, transparent),
|
|
80
|
+
transparent
|
|
81
|
+
),
|
|
82
|
+
radial-gradient(
|
|
83
|
+
ellipse 60% 80% at 20% 70%,
|
|
84
|
+
color-mix(in srgb, var(--color-accent, hsl(var(--accent-foreground))) 5%, transparent),
|
|
85
|
+
transparent
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* ── Stat number ──────────────────────────────────── */
|
|
90
|
+
|
|
91
|
+
.stat-number {
|
|
92
|
+
font-variant-numeric: tabular-nums;
|
|
93
|
+
letter-spacing: -0.02em;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* ── Card hover lift ──────────────────────────────── */
|
|
97
|
+
|
|
98
|
+
.card-hover-lift {
|
|
99
|
+
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.card-hover-lift:hover {
|
|
103
|
+
transform: translateY(-8px);
|
|
104
|
+
box-shadow:
|
|
105
|
+
0 20px 40px -12px rgba(0, 0, 0, 0.15),
|
|
106
|
+
0 8px 16px -8px rgba(0, 0, 0, 0.1);
|
|
107
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HUA-UI CSS Utilities
|
|
3
|
+
*
|
|
4
|
+
* Usage: @import "@hua-labs/ui/styles/utilities.css";
|
|
5
|
+
*
|
|
6
|
+
* Provides: .glass, .gradient-text, .sr-only
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* Glass effect — theme-aware backdrop blur */
|
|
10
|
+
.glass {
|
|
11
|
+
background: rgba(255, 255, 255, 0.7);
|
|
12
|
+
backdrop-filter: blur(10px);
|
|
13
|
+
-webkit-backdrop-filter: blur(10px);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.dark .glass {
|
|
17
|
+
background: rgba(0, 0, 0, 0.7);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Gradient text — CSS variable based */
|
|
21
|
+
.gradient-text {
|
|
22
|
+
background: linear-gradient(135deg, var(--gradient-from, hsl(var(--primary))) 0%, var(--gradient-to, hsl(var(--accent-foreground))) 100%);
|
|
23
|
+
-webkit-background-clip: text;
|
|
24
|
+
-webkit-text-fill-color: transparent;
|
|
25
|
+
background-clip: text;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* Screen reader only — accessibility */
|
|
29
|
+
.sr-only {
|
|
30
|
+
position: absolute;
|
|
31
|
+
width: 1px;
|
|
32
|
+
height: 1px;
|
|
33
|
+
padding: 0;
|
|
34
|
+
margin: -1px;
|
|
35
|
+
overflow: hidden;
|
|
36
|
+
clip: rect(0, 0, 0, 0);
|
|
37
|
+
white-space: nowrap;
|
|
38
|
+
border-width: 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.sr-only:focus,
|
|
42
|
+
.sr-only:focus-visible {
|
|
43
|
+
position: absolute;
|
|
44
|
+
width: auto;
|
|
45
|
+
height: auto;
|
|
46
|
+
padding: 0.5rem 1rem;
|
|
47
|
+
margin: 0;
|
|
48
|
+
overflow: visible;
|
|
49
|
+
clip: auto;
|
|
50
|
+
white-space: normal;
|
|
51
|
+
top: 1rem;
|
|
52
|
+
left: 1rem;
|
|
53
|
+
z-index: 50;
|
|
54
|
+
background: hsl(var(--primary));
|
|
55
|
+
color: hsl(var(--primary-foreground));
|
|
56
|
+
border-radius: 0.375rem;
|
|
57
|
+
font-weight: 500;
|
|
58
|
+
}
|
package/dist/chunk-6KTHJ3EL.mjs
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import {a}from'./chunk-UUHAXGMO.mjs';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function b({className:s,size:n="md",variant:l="default",text:o,color:d="default"}){let u={sm:"w-6 h-6",md:"w-8 h-8",lg:"w-12 h-12",xl:"w-16 h-16"},r={default:"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80",primary:"border-primary/30 border-t-primary dark:border-primary/20 dark:border-t-primary/80",secondary:"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80",success:"border-green-300 border-t-green-600 dark:border-green-500/50 dark:border-t-green-300",warning:"border-yellow-300 border-t-yellow-600 dark:border-yellow-500/50 dark:border-t-yellow-300",error:"border-red-300 border-t-red-600 dark:border-red-500/50 dark:border-t-red-300",glass:"border-white/50 border-t-white/90 dark:border-slate-400/60 dark:border-t-slate-100"},m=()=>{switch(l){case "dots":return jsxs(Fragment,{children:[jsx("style",{children:`
|
|
3
|
-
@keyframes dotPulse {
|
|
4
|
-
0%, 80%, 100% { opacity: 0.3; }
|
|
5
|
-
40% { opacity: 1; }
|
|
6
|
-
}
|
|
7
|
-
`}),jsxs("div",{className:"flex space-x-1 items-center",children:[jsx("div",{className:"w-2 h-2 bg-current rounded-full",style:{animation:"dotPulse 1.4s ease-in-out infinite",animationDelay:"0ms"}}),jsx("div",{className:"w-2 h-2 bg-current rounded-full",style:{animation:"dotPulse 1.4s ease-in-out infinite",animationDelay:"200ms"}}),jsx("div",{className:"w-2 h-2 bg-current rounded-full",style:{animation:"dotPulse 1.4s ease-in-out infinite",animationDelay:"400ms"}})]})]});case "bars":return jsxs(Fragment,{children:[jsx("style",{children:`
|
|
8
|
-
@keyframes barWave {
|
|
9
|
-
0%, 40%, 100% { transform: scaleY(0.4); }
|
|
10
|
-
20% { transform: scaleY(1); }
|
|
11
|
-
}
|
|
12
|
-
`}),jsxs("div",{className:"flex space-x-0.5 h-full items-center",children:[jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"0ms"}}),jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"100ms"}}),jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"200ms"}}),jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"300ms"}}),jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"400ms"}})]})]});case "ring":return jsx("div",{className:a("w-full h-full animate-spin rounded-full",n==="xl"?"border-[3px]":n==="lg"?"border-[2.5px]":"border-2",r[d]||r.default)});case "ripple":return jsxs("div",{className:"relative w-full h-full",children:[jsx("div",{className:a("absolute inset-0 rounded-full border-2 animate-ping",r[d]||r.default)}),jsx("div",{className:a("w-full h-full rounded-full border-2",r[d]||r.default)})]});default:return jsx("div",{className:a("w-full h-full animate-spin rounded-full",n==="xl"?"border-[3px]":n==="lg"?"border-[2.5px]":"border-2",r[d]||r.default)})}};return jsxs("div",{className:a("flex flex-col items-center justify-center",s),children:[jsx("div",{className:a(u[n],"text-muted-foreground"),children:m()}),o&&jsx("p",{className:"mt-3 text-sm text-muted-foreground text-center",children:o})]})}export{b as a};//# sourceMappingURL=chunk-6KTHJ3EL.mjs.map
|
|
13
|
-
//# sourceMappingURL=chunk-6KTHJ3EL.mjs.map
|
package/dist/chunk-BXX2TZUB.mjs
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import {a}from'./chunk-UUHAXGMO.mjs';import o from'react';import {cva}from'class-variance-authority';import {jsx}from'react/jsx-runtime';var m=cva("rounded-lg",{variants:{variant:{default:"bg-card text-card-foreground border border-border",outline:"bg-transparent border-2 border-border",elevated:"bg-card text-card-foreground shadow-lg border border-border"},shadow:{none:"shadow-none",sm:"shadow-sm",md:"shadow-md",lg:"shadow-lg"},padding:{none:"",sm:"p-3",md:"p-4",lg:"p-6"}},defaultVariants:{variant:"default",padding:"none"}}),c=o.forwardRef(({className:e,variant:r="default",shadow:a$1,padding:n="none",hoverable:s,...i},l)=>jsx("div",{ref:l,className:a(m({variant:r,shadow:a$1,padding:n}),"transition-[transform,box-shadow,border-color] duration-200 ease-out",s&&"hover:-translate-y-0.5 hover:shadow-lg hover:border-primary/30 cursor-pointer active:translate-y-0 active:shadow-md",e),...i}));c.displayName="Card";var f=o.forwardRef(({className:e,...r},a$1)=>jsx("div",{ref:a$1,className:a("flex flex-col space-y-1 p-3",e),...r}));f.displayName="CardHeader";var C=o.forwardRef(({className:e,...r},a$1)=>jsx("h3",{ref:a$1,className:a("text-base md:text-lg font-semibold leading-tight tracking-tight",e),...r}));C.displayName="CardTitle";var b=o.forwardRef(({className:e,...r},a$1)=>jsx("p",{ref:a$1,className:a("text-sm text-muted-foreground",e),...r}));b.displayName="CardDescription";var g=o.forwardRef(({className:e,...r},a$1)=>jsx("div",{ref:a$1,className:a("px-3 pb-3",e),...r}));g.displayName="CardContent";var v=o.forwardRef(({className:e,...r},a$1)=>jsx("div",{ref:a$1,className:a("flex items-center px-3 pb-3",e),...r}));v.displayName="CardFooter";export{c as a,f as b,C as c,b as d,g as e,v as f};//# sourceMappingURL=chunk-BXX2TZUB.mjs.map
|
|
3
|
-
//# sourceMappingURL=chunk-BXX2TZUB.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Card.tsx"],"names":["cardVariants","cva","Card","React","className","variant","shadow","padding","hoverable","props","ref","jsx","merge","CardHeader","CardTitle","CardDescription","CardContent","CardFooter"],"mappings":"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","file":"chunk-BXX2TZUB.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const cardVariants = cva(\n \"rounded-lg\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground border border-border\",\n outline: \"bg-transparent border-2 border-border\",\n elevated: \"bg-card text-card-foreground shadow-lg border border-border\",\n },\n shadow: {\n none: \"shadow-none\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n },\n padding: {\n none: \"\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n padding: \"none\",\n },\n }\n)\n\n/**\n * Card 컴포넌트의 props / Card component props\n */\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"outline\" | \"elevated\"\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\"\n hoverable?: boolean\n}\n\n/**\n * Card 컴포넌트 / Card component\n *\n * 콘텐츠를 카드 형태로 표시하는 컴포넌트입니다.\n *\n * @example\n * <Card>\n * <CardHeader><CardTitle>제목</CardTitle></CardHeader>\n * <CardContent><p>내용</p></CardContent>\n * </Card>\n */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant = \"default\", shadow, padding = \"none\", hoverable, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n cardVariants({ variant, shadow, padding }),\n \"transition-[transform,box-shadow,border-color] duration-200 ease-out\",\n hoverable && \"hover:-translate-y-0.5 hover:shadow-lg hover:border-primary/30 cursor-pointer active:translate-y-0 active:shadow-md\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nCard.displayName = \"Card\"\n\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex flex-col space-y-1 p-3\", className)}\n {...props}\n />\n )\n)\n\nCardHeader.displayName = \"CardHeader\"\n\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, CardTitleProps>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={merge(\n \"text-base md:text-lg font-semibold leading-tight tracking-tight\",\n className\n )}\n {...props}\n />\n )\n)\n\nCardTitle.displayName = \"CardTitle\"\n\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={merge(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\n\nCardDescription.displayName = \"CardDescription\"\n\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={merge(\"px-3 pb-3\", className)} {...props} />\n )\n)\n\nCardContent.displayName = \"CardContent\"\n\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center px-3 pb-3\", className)}\n {...props}\n />\n )\n)\n\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n"]}
|