@leanmcp/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/decorator/UIApp.ts","../src/mcp/AppProvider.tsx","../src/mcp/useTool.ts","../src/mcp/useToolResult.ts","../src/mcp/useToolInput.ts","../src/mcp/useToolInputPartial.ts","../src/mcp/useHostContext.ts","../src/core/Button.tsx","../src/mcp/ActionButton.tsx","../src/core/Input.tsx","../src/mcp/ToolForm.tsx","../src/core/Card.tsx","../src/data/DataGrid.tsx","../src/data/Chart.tsx","../src/layout/AppShell.tsx","../src/media/CodeBlock.tsx"],"names":["UI_APP_COMPONENT_KEY","UI_APP_URI_KEY","UI_APP_OPTIONS_KEY","UIApp","options","target","propertyKey","descriptor","methodName","String","className","name","toLowerCase","replace","uri","Reflect","defineMetadata","component","value","existingMeta","getMetadata","getUIAppMetadata","undefined","getUIAppUri","McpAppContext","AppProvider","appInfo","capabilities","autoResize","children","app","setApp","useState","isConnected","setIsConnected","error","setError","hostContext","setHostContext","toolInput","setToolInput","toolInputPartial","setToolInputPartial","toolResult","setToolResult","useEffect","mounted","appInstance","connect","transport","PostMessageTransport","window","parent","App","ontoolinput","params","arguments","ontoolinputpartial","ontoolresult","onhostcontextchanged","prev","err","Error","close","version","callTool","useCallback","args","result","callServerTool","sendMessage","text","console","warn","role","content","type","sendLog","level","data","log","openLink","url","open","sendOpenLink","theme","React","Provider","div","data-theme","ssrDefaultContext","useMcpApp","context","useContext","useTool","toolName","loading","setLoading","setResult","call","response","structuredContent","reset","useToolResult","textContent","textItem","find","c","JSON","parse","rawResult","hasResult","useToolInput","input","hasInput","useToolInputPartial","partialArgs","isStreaming","useHostContext","displayMode","viewport","locale","timeZone","platform","rawContext","Button","variant","size","disabled","asChild","leftIcon","rightIcon","props","ref","Comp","Slot","clsx","span","aria-hidden","svg","viewBox","fill","circle","cx","cy","r","stroke","strokeWidth","strokeLinecap","strokeDasharray","strokeDashoffset","displayName","ActionButton","toolArgs","onToolSuccess","onToolError","showResult","renderResult","buttonProps","setHasResult","handleClick","res","onClick","pre","stringify","message","Input","forwardRef","label","helperText","leftElement","rightElement","fullWidth","id","inputId","Math","random","toString","substr","hasError","Boolean","htmlFor","aria-invalid","aria-describedby","p","ToolForm","fields","submitText","onSuccess","onError","formData","setFormData","initial","forEach","field","defaultValue","handleSubmit","e","preventDefault","Number","handleChange","form","onSubmit","map","key","textarea","placeholder","required","onChange","Card","padding","interactive","CardHeader","title","description","action","h3","CardContent","CardFooter","DataGrid","columns","searchable","searchPlaceholder","onRowClick","emptyMessage","sorting","setSorting","globalFilter","setGlobalFilter","tableColumns","useMemo","col","accessorKey","header","cell","getValue","row","original","enableSorting","sortable","width","table","useReactTable","state","onSortingChange","onGlobalFilterChange","getCoreRowModel","getSortedRowModel","getFilteredRowModel","thead","getHeaderGroups","headerGroup","tr","headers","th","column","getCanSort","getToggleSortingHandler","style","getSize","flexRender","columnDef","getContext","getIsSorted","tbody","td","colSpan","length","getRowModel","rows","getVisibleCells","ChartJS","register","CategoryScale","LinearScale","PointElement","LineElement","BarElement","ArcElement","Title","Tooltip","Legend","Chart","height","defaultOptions","responsive","maintainAspectRatio","plugins","legend","display","position","labels","usePointStyle","tooltip","mode","intersect","backgroundColor","titleColor","bodyColor","borderColor","borderWidth","cornerRadius","scales","x","grid","color","ticks","y","mergedOptions","ReactChart","AppShell","sidebar","footer","sidebarPosition","sidebarWidth","containerRef","useRef","current","resizeObserver","ResizeObserver","entries","entry","contentRect","postMessage","ceil","observe","disconnect","sidebarStyle","flexShrink","aside","main","CodeBlock","code","language","showLineNumbers","copyable","copied","setCopied","handleCopy","navigator","clipboard","writeText","setTimeout","button","aria-label","polyline","points","rect","rx","ry","path","d","Highlight","themes","nightOwl","trim","hlClassName","tokens","getLineProps","getTokenProps","line","i","token"],"mappings":";;;;;;;;;;;;;;;;;;AAcO,IAAMA,oBAAAA,GAAuB,kBAAA;AAC7B,IAAMC,cAAAA,GAAiB,YAAA;AACvB,IAAMC,kBAAAA,GAAqB,gBAAA;AAqC3B,SAASC,MAAMC,OAAAA,EAAqB;AACvC,EAAA,OAAO,CAACC,MAAAA,EAAgBC,WAAAA,EAA8BC,UAAAA,KAAAA;AAClD,IAAA,MAAMC,UAAAA,GAAaC,OAAOH,WAAAA,CAAAA;AAE1B,IAAA,MAAMI,SAAAA,GAAYL,OAAO,WAAA,CAAYM,IAAAA,CAAKC,aAAW,CAAGC,OAAAA,CAAQ,WAAW,EAAA,CAAA;AAG3E,IAAA,MAAMC,MAAMV,OAAAA,CAAQU,GAAAA,IAAO,CAAA,KAAA,EAAQJ,SAAAA,IAAaF,UAAAA,CAAAA,CAAAA;AAGhDO,IAAAA,OAAAA,CAAQC,cAAAA,CAAehB,oBAAAA,EAAsBI,OAAAA,CAAQa,SAAAA,EAAWV,WAAWW,KAAK,CAAA;AAChFH,IAAAA,OAAAA,CAAQC,cAAAA,CAAef,cAAAA,EAAgBa,GAAAA,EAAKP,UAAAA,CAAWW,KAAK,CAAA;AAC5DH,IAAAA,OAAAA,CAAQC,cAAAA,CAAed,kBAAAA,EAAoBE,OAAAA,EAASG,UAAAA,CAAWW,KAAK,CAAA;AAIpE,IAAA,MAAMC,eAAeJ,OAAAA,CAAQK,WAAAA,CAAY,aAAab,UAAAA,CAAWW,KAAK,KAAK,EAAC;AAC5EH,IAAAA,OAAAA,CAAQC,eAAe,WAAA,EAAa;MAChC,GAAGG,YAAAA;MACH,gBAAA,EAAkBL;AACtB,KAAA,EAAGP,WAAWW,KAAK,CAAA;AAEnB,IAAA,OAAOX,UAAAA;AACX,EAAA,CAAA;AACJ;AAxBgBJ,MAAAA,CAAAA,KAAAA,EAAAA,OAAAA,CAAAA;AA6BT,SAASkB,iBAAiBhB,MAAAA,EAAgB;AAC7C,EAAA,MAAMY,SAAAA,GAAYF,OAAAA,CAAQK,WAAAA,CAAYpB,oBAAAA,EAAsBK,MAAAA,CAAAA;AAC5D,EAAA,IAAI,CAACY,WAAW,OAAOK,MAAAA;AAEvB,EAAA,OAAO;AACHL,IAAAA,SAAAA;IACAH,GAAAA,EAAKC,OAAAA,CAAQK,WAAAA,CAAYnB,cAAAA,EAAgBI,MAAAA,CAAAA;IACzC,GAAGU,OAAAA,CAAQK,WAAAA,CAAYlB,kBAAAA,EAAoBG,MAAAA;AAC/C,GAAA;AACJ;AATgBgB,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AAcT,SAASE,YAAYlB,MAAAA,EAAgB;AACxC,EAAA,OAAOU,OAAAA,CAAQK,WAAAA,CAAYnB,cAAAA,EAAgBI,MAAAA,CAAAA;AAC/C;AAFgBkB,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;ACzBhB,IAAMC,aAAAA,wCAAyD,IAAA,CAAA;AAkCxD,SAASC,YAAY,EAAEC,OAAAA,EAASC,YAAAA,GAAe,IAAIvB,OAAAA,GAAU;EAAEwB,UAAAA,EAAY;AAAK,CAAA,EAAGC,UAAQ,EAAoB;AAClH,EAAA,MAAM,CAACC,GAAAA,EAAKC,MAAAA,CAAAA,GAAUC,gBAAqB,IAAA,CAAA;AAC3C,EAAA,MAAM,CAACC,WAAAA,EAAaC,cAAAA,CAAAA,GAAkBF,gBAAS,KAAA,CAAA;AAC/C,EAAA,MAAM,CAACG,KAAAA,EAAOC,QAAAA,CAAAA,GAAYJ,gBAAuB,IAAA,CAAA;AACjD,EAAA,MAAM,CAACK,WAAAA,EAAaC,cAAAA,CAAAA,GAAkBN,eAAAA,CAA2B,EAAC,CAAA;AAClE,EAAA,MAAM,CAACO,SAAAA,EAAWC,YAAAA,CAAAA,GAAgBR,gBAAyC,IAAA,CAAA;AAC3E,EAAA,MAAM,CAACS,gBAAAA,EAAkBC,mBAAAA,CAAAA,GAAuBV,gBAAyC,IAAA,CAAA;AACzF,EAAA,MAAM,CAACW,UAAAA,EAAYC,aAAAA,CAAAA,GAAiBZ,gBAAgC,IAAA,CAAA;AAGpEa,EAAAA,gBAAAA,CAAU,MAAA;AACN,IAAA,IAAIC,OAAAA,GAAU,IAAA;AACd,IAAA,IAAIC,WAAAA,GAA0B,IAAA;AAE9B,IAAA,eAAeC,OAAAA,GAAAA;AACX,MAAA,IAAI;AACA,QAAA,MAAMC,SAAAA,GAAY,IAAIC,4BAAAA,CAAqBC,MAAAA,CAAOC,MAAM,CAAA;AAGxDL,QAAAA,WAAAA,GAAc,IAAIM,WAAAA,CACd3B,OAAAA,EACAC,YAAAA,EACAvB,OAAAA,CAAAA;AAIJ2C,QAAAA,WAAAA,CAAYO,WAAAA,GAAc,CAACC,MAAAA,KAAAA;AACvB,UAAA,IAAIT,OAAAA,EAAS;AACTN,YAAAA,YAAAA,CAAae,OAAOC,SAAS,CAAA;AACjC,UAAA;AACJ,QAAA,CAAA;AAGAT,QAAAA,WAAAA,CAAYU,kBAAAA,GAAqB,CAACF,MAAAA,KAAAA;AAC9B,UAAA,IAAIT,OAAAA,EAAS;AACTJ,YAAAA,mBAAAA,CAAoBa,OAAOC,SAAS,CAAA;AACxC,UAAA;AACJ,QAAA,CAAA;AAEAT,QAAAA,WAAAA,CAAYW,YAAAA,GAAe,CAACH,MAAAA,KAAAA;AACxB,UAAA,IAAIT,OAAAA,EAAS;AACTF,YAAAA,aAAAA,CAAcW,MAAAA,CAAAA;AAClB,UAAA;AACJ,QAAA,CAAA;AAEAR,QAAAA,WAAAA,CAAYY,oBAAAA,GAAuB,CAACJ,MAAAA,KAAAA;AAChC,UAAA,IAAIT,OAAAA,EAAS;AACTR,YAAAA,cAAAA,CAAesB,CAAAA,IAAAA,MAAS;cAAE,GAAGA,IAAAA;cAAM,GAAGL;aAAO,CAAA,CAAA;AACjD,UAAA;AACJ,QAAA,CAAA;AAEA,QAAA,MAAMR,WAAAA,CAAYC,QAAQC,SAAAA,CAAAA;AAE1B,QAAA,IAAIH,OAAAA,EAAS;AACTf,UAAAA,MAAAA,CAAOgB,WAAAA,CAAAA;AACPb,UAAAA,cAAAA,CAAe,IAAA,CAAA;AACfE,UAAAA,QAAAA,CAAS,IAAA,CAAA;AAKb,QAAA;AACJ,MAAA,CAAA,CAAA,OAASyB,GAAAA,EAAK;AACV,QAAA,IAAIf,OAAAA,EAAS;AACTV,UAAAA,QAAAA,CAASyB,GAAAA,YAAeC,QAAQD,GAAAA,GAAM,IAAIC,MAAMrD,MAAAA,CAAOoD,GAAAA,CAAAA,CAAAA,CAAAA;AACvD3B,UAAAA,cAAAA,CAAe,KAAA,CAAA;AACnB,QAAA;AACJ,MAAA;AACJ,IAAA;AAtDec,IAAAA,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAwDfA,IAAAA,OAAAA,EAAAA;AAEA,IAAA,OAAO,MAAA;AACHF,MAAAA,OAAAA,GAAU,KAAA;AACV,MAAA,IAAIC,WAAAA,EAAa;AACbA,QAAAA,WAAAA,CAAYgB,KAAAA,EAAK;AACrB,MAAA;AACJ,IAAA,CAAA;EACJ,CAAA,EAAG;IAACrC,OAAAA,CAAQf,IAAAA;IAAMe,OAAAA,CAAQsC;AAAQ,GAAA,CAAA;AAGlC,EAAA,MAAMC,WAAWC,kBAAAA,CACb,OAAOvD,IAAAA,EAAcwD,IAAAA,GAAgC,EAAC,KAAC;AACnD,IAAA,IAAI,CAACrC,GAAAA,EAAK;AACN,MAAA,MAAM,IAAIgC,MAAM,uBAAA,CAAA;AACpB,IAAA;AACA,IAAA,MAAMM,MAAAA,GAAS,MAAMtC,GAAAA,CAAIuC,cAAAA,CAAe;AAAE1D,MAAAA,IAAAA;MAAM6C,SAAAA,EAAWW;KAAK,CAAA;AAEhEvB,IAAAA,aAAAA,CAAcwB,MAAAA,CAAAA;AACd,IAAA,OAAOA,MAAAA;EACX,CAAA,EACA;AAACtC,IAAAA;AAAI,GAAA,CAAA;AAGT,EAAA,MAAMwC,WAAAA,GAAcJ,kBAAAA,CAChB,OAAOK,IAAAA,KAAAA;AACH,IAAA,IAAI,CAACzC,GAAAA,EAAK;AACN0C,MAAAA,OAAAA,CAAQC,KAAK,mDAAA,CAAA;AACb,MAAA;AACJ,IAAA;AACA,IAAA,MAAM3C,IAAIwC,WAAAA,CAAY;MAClBI,IAAAA,EAAM,MAAA;MACNC,OAAAA,EAAS;AAAC,QAAA;UAAEC,IAAAA,EAAM,MAAA;AAAQL,UAAAA;AAAK;;KACnC,CAAA;EACJ,CAAA,EACA;AAACzC,IAAAA;AAAI,GAAA,CAAA;AAGT,EAAA,MAAM+C,OAAAA,GAAUX,kBAAAA,CACZ,OAAOY,KAAAA,EAA+CC,IAAAA,KAAAA;AAClD,IAAA,IAAI,CAACjD,GAAAA,EAAK;AACN0C,MAAAA,OAAAA,CAAQQ,GAAAA,CAAI,CAAA,UAAA,EAAaF,KAAAA,CAAAA,CAAAA,CAAAA,EAAUC,IAAAA,CAAAA;AACnC,MAAA;AACJ,IAAA;AACA,IAAA,MAAMjD,IAAI+C,OAAAA,CAAQ;AAAEC,MAAAA,KAAAA;AAAOC,MAAAA;KAAK,CAAA;EACpC,CAAA,EACA;AAACjD,IAAAA;AAAI,GAAA,CAAA;AAGT,EAAA,MAAMmD,QAAAA,GAAWf,kBAAAA,CACb,OAAOgB,GAAAA,KAAAA;AACH,IAAA,IAAI,CAACpD,GAAAA,EAAK;AAENqB,MAAAA,MAAAA,CAAOgC,IAAAA,CAAKD,GAAAA,EAAK,QAAA,EAAU,qBAAA,CAAA;AAC3B,MAAA;AACJ,IAAA;AACA,IAAA,MAAMpD,IAAIsD,YAAAA,CAAa;AAAEF,MAAAA;KAAI,CAAA;EACjC,CAAA,EACA;AAACpD,IAAAA;AAAI,GAAA,CAAA;AAGT,EAAA,MAAMZ,KAAAA,GAA4B;AAC9BY,IAAAA,GAAAA;AACAG,IAAAA,WAAAA;AACAE,IAAAA,KAAAA;AACAE,IAAAA,WAAAA;AACAE,IAAAA,SAAAA;AACAE,IAAAA,gBAAAA;AACAE,IAAAA,UAAAA;AACAsB,IAAAA,QAAAA;AACAK,IAAAA,WAAAA;AACAO,IAAAA,OAAAA;AACAI,IAAAA;AACJ,GAAA;AAIA,EAAA,MAAMI,KAAAA,GAAQhD,YAAYgD,KAAAA,IAAS,OAAA;AAEnC,EAAA,uBACIC,uBAAA,CAAA,aAAA,CAAC9D,aAAAA,CAAc+D,QAAAA,EAAQ;AAACrE,IAAAA;AACpB,GAAA,kBAAAoE,uBAAA,CAAA,cAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU,UAAA;IAAW+E,YAAAA,EAAYJ;AACjCxD,GAAAA,EAAAA,QAAAA,CAAAA,CAAAA;AAIjB;AA5JgBJ,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;AAiKhB,IAAMiE,iBAAAA,GAAwC;EAC1C5D,GAAAA,EAAK,IAAA;EACLG,WAAAA,EAAa,KAAA;EACbE,KAAAA,EAAO,IAAA;AACPE,EAAAA,WAAAA,EAAa,EAAC;EACdE,SAAAA,EAAW,IAAA;EACXE,gBAAAA,EAAkB,IAAA;EAClBE,UAAAA,EAAY,IAAA;AACZsB,EAAAA,QAAAA,kBAAU,MAAA,CAAA,YAAA;AAAc,IAAA,MAAM,IAAIH,MAAM,mCAAA,CAAA;EAAsC,CAAA,EAApE,UAAA,CAAA;AACVQ,EAAAA,WAAAA,kBAAa,MAAA,CAAA,YAAA;AAAcE,IAAAA,OAAAA,CAAQC,KAAK,sCAAA,CAAA;EAAyC,CAAA,EAApE,aAAA,CAAA;AACbI,EAAAA,OAAAA,kBAAS,MAAA,CAAA,YAAA;AAAcL,IAAAA,OAAAA,CAAQC,KAAK,kCAAA,CAAA;EAAqC,CAAA,EAAhE,SAAA,CAAA;AACTQ,EAAAA,QAAAA,kBAAU,MAAA,CAAA,YAAA;AAAcT,IAAAA,OAAAA,CAAQC,KAAK,mCAAA,CAAA;EAAsC,CAAA,EAAjE,UAAA;AACd,CAAA;AAMO,SAASkB,SAAAA,GAAAA;AACZ,EAAA,MAAMC,OAAAA,GAAUC,kBAAWrE,aAAAA,CAAAA;AAE3B,EAAA,IAAI,CAACoE,OAAAA,EAAS;AACV,IAAA,OAAOF,iBAAAA;AACX,EAAA;AACA,EAAA,OAAOE,OAAAA;AACX;AAPgBD,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA;ACxPT,SAASG,QAAqBC,QAAAA,EAAgB;AACjD,EAAA,MAAM,EAAE9B,QAAAA,EAAQ,GAAK0B,SAAAA,EAAAA;AACrB,EAAA,MAAM,CAACK,OAAAA,EAASC,UAAAA,CAAAA,GAAcjE,gBAAS,KAAA,CAAA;AACvC,EAAA,MAAM,CAACoC,MAAAA,EAAQ8B,SAAAA,CAAAA,GAAalE,gBAAmB,IAAA,CAAA;AAC/C,EAAA,MAAM,CAACG,KAAAA,EAAOC,QAAAA,CAAAA,GAAYJ,gBAAuB,IAAA,CAAA;AAEjD,EAAA,MAAMmE,IAAAA,GAAOjC,kBAAAA,CACT,OAAOC,IAAAA,GAAgC,EAAC,KAAC;AACrC8B,IAAAA,UAAAA,CAAW,IAAA,CAAA;AACX7D,IAAAA,QAAAA,CAAS,IAAA,CAAA;AACT,IAAA,IAAI;AACA,MAAA,MAAMgE,QAAAA,GAAW,MAAMnC,QAAAA,CAAS8B,QAAAA,EAAU5B,IAAAA,CAAAA;AAC1C,MAAA,MAAMY,IAAAA,GAAQqB,UAAwCC,iBAAAA,IAAqBD,QAAAA;AAC3EF,MAAAA,SAAAA,CAAUnB,IAAAA,CAAAA;AACV,MAAA,OAAOA,IAAAA;AACX,IAAA,CAAA,CAAA,OAASlB,GAAAA,EAAK;AACV,MAAA,MAAM1B,MAAAA,GAAQ0B,eAAeC,KAAAA,GAAQD,GAAAA,GAAM,IAAIC,KAAAA,CAAMrD,MAAAA,CAAOoD,GAAAA,CAAAA,CAAAA;AAC5DzB,MAAAA,QAAAA,CAASD,MAAAA,CAAAA;AACT,MAAA,MAAMA,MAAAA;IACV,CAAA,SAAA;AACI8D,MAAAA,UAAAA,CAAW,KAAA,CAAA;AACf,IAAA;EACJ,CAAA,EACA;AAAChC,IAAAA,QAAAA;AAAU8B,IAAAA;AAAS,GAAA,CAAA;AAGxB,EAAA,MAAMO,KAAAA,GAAQpC,mBAAY,MAAA;AACtBgC,IAAAA,SAAAA,CAAU,IAAA,CAAA;AACV9D,IAAAA,QAAAA,CAAS,IAAA,CAAA;AACb,EAAA,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAE+D,IAAAA,IAAAA;AAAMH,IAAAA,OAAAA;AAAS5B,IAAAA,MAAAA;AAAQjC,IAAAA,KAAAA;AAAOmE,IAAAA;AAAM,GAAA;AACjD;AAhCgBR,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;;;ACFT,SAASS,aAAAA,GAAAA;AACZ,EAAA,MAAM,EAAE5D,UAAAA,EAAU,GAAKgD,SAAAA,EAAAA;AAGvB,EAAA,IAAIvB,MAAAA,GAAmB,IAAA;AACvB,EAAA,IAAIoC,WAAAA,GAA6B,IAAA;AAEjC,EAAA,IAAI7D,UAAAA,EAAY;AAEZ,IAAA,IAAI,mBAAA,IAAuBA,UAAAA,IAAcA,UAAAA,CAAW0D,iBAAAA,EAAmB;AACnEjC,MAAAA,MAAAA,GAASzB,UAAAA,CAAW0D,iBAAAA;AACxB,IAAA;AAGA,IAAA,IAAI,CAACjC,MAAAA,IAAUzB,UAAAA,CAAWgC,OAAAA,EAAS;AAC/B,MAAA,MAAM8B,QAAAA,GAAW9D,WAAWgC,OAAAA,CAAQ+B,IAAAA,CAChC,CAACC,CAAAA,KAA2CA,CAAAA,CAAE/B,SAAS,MAAA,CAAA;AAE3D,MAAA,IAAI6B,QAAAA,EAAU;AACVD,QAAAA,WAAAA,GAAcC,QAAAA,CAASlC,IAAAA;AACvB,QAAA,IAAI;AACAH,UAAAA,MAAAA,GAASwC,IAAAA,CAAKC,KAAAA,CAAMJ,QAAAA,CAASlC,IAAI,CAAA;QACrC,CAAA,CAAA,MAAQ;AAER,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,EAAA;AAEA,EAAA,OAAO;AACHH,IAAAA,MAAAA;IACA0C,SAAAA,EAAWnE,UAAAA;AACXoE,IAAAA,SAAAA,EAAWpE,UAAAA,KAAe,IAAA;AAC1B6D,IAAAA;AACJ,GAAA;AACJ;AAnCgBD,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;;;ACLT,SAASS,YAAAA,GAAAA;AACZ,EAAA,MAAM,EAAEzE,SAAAA,EAAS,GAAKoD,SAAAA,EAAAA;AAEtB,EAAA,OAAO;IACHsB,KAAAA,EAAO1E,SAAAA;AACP2E,IAAAA,QAAAA,EAAU3E,SAAAA,KAAc;AAC5B,GAAA;AACJ;AAPgByE,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;;;ACET,SAASG,mBAAAA,GAAAA;AACZ,EAAA,MAAM,EAAE1E,gBAAAA,EAAgB,GAAKkD,SAAAA,EAAAA;AAE7B,EAAA,OAAO;IACHyB,WAAAA,EAAa3E,gBAAAA;AACb4E,IAAAA,WAAAA,EAAa5E,gBAAAA,KAAqB;AACtC,GAAA;AACJ;AAPgB0E,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;;;ACWT,SAASG,cAAAA,GAAAA;AACZ,EAAA,MAAM,EAAEjF,WAAAA,EAAW,GAAKsD,SAAAA,EAAAA;AAExB,EAAA,OAAO;AACHN,IAAAA,KAAAA,EAAQhD,YAAYgD,KAAAA,IAA8B,OAAA;AAClDkC,IAAAA,WAAAA,EAAclF,YAAYkF,WAAAA,IAAmD,QAAA;AAC7EC,IAAAA,QAAAA,EAAUnF,YAAYmF,QAAAA,IAAY,IAAA;AAClCC,IAAAA,MAAAA,EAAQpF,YAAYoF,MAAAA,IAAU,IAAA;AAC9BC,IAAAA,QAAAA,EAAUrF,YAAYqF,QAAAA,IAAY,IAAA;AAClCC,IAAAA,QAAAA,EAAWtF,YAAYsF,QAAAA,IAA6C,IAAA;IACpEC,UAAAA,EAAYvF;AAChB,GAAA;AACJ;AAZgBiF,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;ACRT,IAAMO,MAAAA,qCACT,CACI,EACInH,WACAoH,OAAAA,GAAU,SAAA,EACVC,OAAO,IAAA,EACP/B,OAAAA,GAAU,OACVgC,QAAAA,EACAC,OAAAA,GAAU,OACVC,QAAAA,EACAC,SAAAA,EACAtG,UACA,GAAGuG,KAAAA,IAEPC,GAAAA,KAAAA;AAEA,EAAA,MAAMC,IAAAA,GAAOL,UAAUM,cAAAA,GAAO,QAAA;AAE9B,EAAA,uBACIjD,uBAAAA,CAAA,aAAA,CAACgD,IAAAA,EAAAA;AACGD,IAAAA,GAAAA;IACA3H,SAAAA,EAAW8H,SAAAA,CACP,YAAA,EACA,CAAA,YAAA,EAAeV,OAAAA,CAAAA,CAAAA,EACf,eAAeC,IAAAA,CAAAA,CAAAA,EACf/B,OAAAA,IAAW,qBAAA,EACXtF,SAAAA,CAAAA;AAEJsH,IAAAA,QAAAA,EAAUA,QAAAA,IAAYhC,OAAAA;IACrB,GAAGoC;KAEHpC,OAAAA,oBACGV,uBAAAA,CAAA,aAAA,CAACmD,MAAAA,EAAAA;IAAK/H,SAAAA,EAAU,qBAAA;IAAsBgI,aAAAA,EAAY;qBAC9CpD,uBAAAA,CAAA,cAACqD,KAAAA,EAAAA;IAAIC,OAAAA,EAAQ,WAAA;IAAYC,IAAAA,EAAK,MAAA;IAAOnI,SAAAA,EAAU;qBAC3C4E,uBAAAA,CAAA,cAACwD,QAAAA,EAAAA;IACGC,EAAAA,EAAG,IAAA;IACHC,EAAAA,EAAG,IAAA;IACHC,CAAAA,EAAE,IAAA;IACFC,MAAAA,EAAO,cAAA;IACPC,WAAAA,EAAY,GAAA;IACZC,aAAAA,EAAc,OAAA;IACdC,eAAAA,EAAgB,IAAA;IAChBC,gBAAAA,EAAiB;AAKhCpB,GAAAA,CAAAA,CAAAA,CAAAA,EAAAA,QAAAA,IAAY,CAAClC,OAAAA,oBAAWV,uBAAAA,CAAA,cAACmD,MAAAA,EAAAA;IAAK/H,SAAAA,EAAU;AAAoBwH,GAAAA,EAAAA,QAAAA,CAAAA,kBAC7D5C,uBAAAA,CAAA,aAAA,CAACmD,MAAAA,EAAAA;IAAK/H,SAAAA,EAAU;AAAuBmB,GAAAA,EAAAA,QAAAA,CAAAA,EACtCsG,SAAAA,oBAAa7C,uBAAAA,CAAA,cAACmD,MAAAA,EAAAA;IAAK/H,SAAAA,EAAU;AAAoByH,GAAAA,EAAAA,SAAAA,CAAAA,CAAAA;AAG9D,CAAA;AAGJN,MAAAA,CAAO0B,WAAAA,GAAc,QAAA;;;ACxDd,SAASC,YAAAA,CAAa,EACzBzD,QAAAA,EACA0D,QAAAA,GAAW,EAAC,EACZC,aAAAA,EACAC,WAAAA,EACAC,UAAAA,GAAa,KAAA,EACbC,YAAAA,EACAhI,QAAAA,EACA,GAAGiI,aAAAA,EACa;AAChB,EAAA,MAAM,EAAE3D,IAAAA,EAAMH,OAAAA,EAAS5B,QAAQjC,KAAAA,EAAK,GAAK2D,QAAQC,QAAAA,CAAAA;AACjD,EAAA,MAAM,CAACgB,SAAAA,EAAWgD,YAAAA,CAAAA,GAAgB/H,gBAAS,KAAA,CAAA;AAE3C,EAAA,MAAMgI,8BAAc,MAAA,CAAA,YAAA;AAChB,IAAA,IAAI;AACA,MAAA,MAAMC,GAAAA,GAAM,MAAM9D,IAAAA,CAAKsD,QAAAA,CAAAA;AACvBM,MAAAA,YAAAA,CAAa,IAAA,CAAA;AACbL,MAAAA,aAAAA,GAAgBO,GAAAA,CAAAA;AACpB,IAAA,CAAA,CAAA,OAASpG,GAAAA,EAAK;AACV8F,MAAAA,WAAAA,GAAc9F,GAAAA,YAAeC,QAAQD,GAAAA,GAAM,IAAIC,MAAMrD,MAAAA,CAAOoD,GAAAA,CAAAA,CAAAA,CAAAA;AAChE,IAAA;EACJ,CAAA,EARoB,aAAA,CAAA;AAUpB,EAAA,uBACIyB,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;qBACX4E,uBAAAA,CAAA,cAACuC,MAAAA,EAAAA;IAAQ,GAAGiC,WAAAA;AAAa9D,IAAAA,OAAAA;IAAkBkE,OAAAA,EAASF;KAC/CnI,QAAAA,CAAAA,EAEJ+H,cAAc7C,SAAAA,IAAa3C,MAAAA,KAAW,wBACnCkB,uBAAAA,CAAA,cAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;KACVmJ,YAAAA,GAAeA,YAAAA,CAAazF,MAAAA,CAAAA,mBACzBkB,wBAAA,aAAA,CAAC6E,KAAAA,EAAAA,MAAKvD,IAAAA,CAAKwD,SAAAA,CAAUhG,QAAQ,IAAA,EAAM,CAAA,CAAA,CAAA,CAAA,EAI9CjC,yBACGmD,uBAAAA,CAAA,cAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;AACVyB,GAAAA,EAAAA,KAAAA,CAAMkI,OAAO,CAAA,CAAA;AAKlC;AA1CgBb,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;ACCT,IAAMc,wBAAQC,iBAAAA,CACjB,CACI,EACI7J,SAAAA,EACA8J,OACAC,UAAAA,EACAtI,KAAAA,EACA4F,OAAO,IAAA,EACP2C,WAAAA,EACAC,cACAC,SAAAA,GAAY,KAAA,EACZC,IACA,GAAGzC,KAAAA,IAEPC,GAAAA,KAAAA;AAEA,EAAA,MAAMyC,OAAAA,GAAUD,EAAAA,IAAM,CAAA,MAAA,EAASE,IAAAA,CAAKC,MAAAA,EAAM,CAAGC,QAAAA,CAAS,EAAA,CAAA,CAAIC,MAAAA,CAAO,CAAA,EAAG,CAAA,CAAA,CAAA,CAAA;AACpE,EAAA,MAAMC,QAAAA,GAAWC,QAAQjJ,KAAAA,CAAAA;AAEzB,EAAA,uBACImD,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;AACG9E,IAAAA,SAAAA,EAAW8H,SAAAA,CACP,mBAAA,EACAoC,SAAAA,IAAa,+BAAA,EACblK,SAAAA;KAGH8J,KAAAA,oBACGlF,uBAAAA,CAAA,aAAA,CAACkF,OAAAA,EAAAA;IAAMa,OAAAA,EAASP,OAAAA;IAASpK,SAAAA,EAAU;AAC9B8J,GAAAA,EAAAA,KAAAA,CAAAA,kBAGTlF,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;IACG9E,SAAAA,EAAW8H,SAAAA,CACP,qBAAA,EACA,CAAA,qBAAA,EAAwBT,IAAAA,CAAAA,CAAAA,EACxBoD,YAAY,4BAAA,EACZT,WAAAA,IAAe,+BAAA,EACfC,YAAAA,IAAgB,gCAAA;KAGnBD,WAAAA,oBAAepF,uBAAAA,CAAA,aAAA,CAACmD,MAAAA,EAAAA;IAAK/H,SAAAA,EAAU;AAA6CgK,GAAAA,EAAAA,WAAAA,CAAAA,kBAC7EpF,uBAAAA,CAAA,aAAA,CAAC2B,OAAAA,EAAAA;AACGoB,IAAAA,GAAAA;IACAwC,EAAAA,EAAIC,OAAAA;IACJpK,SAAAA,EAAU,WAAA;IACV4K,cAAAA,EAAcH,QAAAA;AACdI,IAAAA,kBAAAA,EAAkBpJ,QAAQ,CAAA,EAAG2I,OAAAA,WAAkBL,UAAAA,GAAa,CAAA,EAAGK,OAAAA,CAAAA,OAAAA,CAAAA,GAAmBxJ,MAAAA;IACjF,GAAG8G;MAEPuC,YAAAA,oBAAgBrF,uBAAAA,CAAA,aAAA,CAACmD,MAAAA,EAAAA;IAAK/H,SAAAA,EAAU;AAA8CiK,GAAAA,EAAAA,YAAAA,CAAAA,CAAAA,EAAAA,CAEjFxI,KAAAA,IAASsI,+BACPnF,uBAAAA,CAAA,cAACkG,GAAAA,EAAAA;AACGX,IAAAA,EAAAA,EAAI1I,KAAAA,GAAQ,CAAA,EAAG2I,OAAAA,CAAAA,MAAAA,CAAAA,GAAkB,GAAGA,OAAAA,CAAAA,OAAAA,CAAAA;IACpCpK,SAAAA,EAAW8H,SAAAA,CAAK,mBAAA,EAAqBrG,KAAAA,IAAS,0BAAA;AAE7CA,GAAAA,EAAAA,KAAAA,IAASsI,UAAAA,CAAAA,CAAAA;AAK9B,CAAA;AAGJH,KAAAA,CAAMf,WAAAA,GAAc,OAAA;AC1Cb,SAASkC,QAAAA,CAAS,EACrB1F,QAAAA,EACA2F,MAAAA,EACAC,UAAAA,GAAa,QAAA,EACbC,SAAAA,EACAC,OAAAA,EACAjC,UAAAA,GAAa,KAAA,EACblJ,SAAAA,EAAS,EACG;AACZ,EAAA,MAAM,EAAEyF,IAAAA,EAAMH,OAAAA,EAAS5B,QAAQjC,KAAAA,EAAK,GAAK2D,QAAQC,QAAAA,CAAAA;AACjD,EAAA,MAAM,CAAC+F,QAAAA,EAAUC,WAAAA,CAAAA,GAAe/J,gBAA0C,MAAA;AACtE,IAAA,MAAMgK,UAA2C,EAAC;AAClDN,IAAAA,MAAAA,CAAOO,OAAAA,CAAQ,CAACC,KAAAA,KAAAA;AACZ,MAAA,IAAIA,KAAAA,CAAMC,iBAAiB7K,MAAAA,EAAW;AAClC0K,QAAAA,OAAAA,CAAQE,KAAAA,CAAMvL,IAAI,CAAA,GAAIuL,KAAAA,CAAMC,YAAAA;AAChC,MAAA;IACJ,CAAA,CAAA;AACA,IAAA,OAAOH,OAAAA;EACX,CAAA,CAAA;AAEA,EAAA,MAAMI,YAAAA,iCAAsBC,CAAAA,KAAAA;AACxBA,IAAAA,CAAAA,CAAEC,cAAAA,EAAc;AAGhB,IAAA,MAAMnI,OAAgC,EAAC;AACvCuH,IAAAA,MAAAA,CAAOO,OAAAA,CAAQ,CAACC,KAAAA,KAAAA;AACZ,MAAA,MAAMhL,KAAAA,GAAQ4K,QAAAA,CAASI,KAAAA,CAAMvL,IAAI,CAAA;AACjC,MAAA,IAAIuL,KAAAA,CAAMtH,IAAAA,KAAS,QAAA,IAAY1D,KAAAA,KAAUI,MAAAA,EAAW;AAChD6C,QAAAA,IAAAA,CAAK+H,KAAAA,CAAMvL,IAAI,CAAA,GAAI4L,MAAAA,CAAOrL,KAAAA,CAAAA;MAC9B,CAAA,MAAO;AACHiD,QAAAA,IAAAA,CAAK+H,KAAAA,CAAMvL,IAAI,CAAA,GAAIO,KAAAA;AACvB,MAAA;IACJ,CAAA,CAAA;AAEA,IAAA,IAAI;AACA,MAAA,MAAM+I,GAAAA,GAAM,MAAM9D,IAAAA,CAAKhC,IAAAA,CAAAA;AACvByH,MAAAA,SAAAA,GAAY3B,GAAAA,CAAAA;AAChB,IAAA,CAAA,CAAA,OAASpG,GAAAA,EAAK;AACVgI,MAAAA,OAAAA,GAAUhI,GAAAA,YAAeC,QAAQD,GAAAA,GAAM,IAAIC,MAAMrD,MAAAA,CAAOoD,GAAAA,CAAAA,CAAAA,CAAAA;AAC5D,IAAA;EACJ,CAAA,EApBqB,cAAA,CAAA;AAsBrB,EAAA,MAAM2I,YAAAA,mBAAe,MAAA,CAAA,CAAC7L,IAAAA,EAAcO,KAAAA,KAAAA;AAChC6K,IAAAA,WAAAA,CAAY,CAACnI,IAAAA,MAAU;MAAE,GAAGA,IAAAA;AAAM,MAAA,CAACjD,IAAAA,GAAOO;KAAM,CAAA,CAAA;EACpD,CAAA,EAFqB,cAAA,CAAA;AAIrB,EAAA,uBACIoE,uBAAAA,CAAA,aAAA,CAACmH,MAAAA,EAAAA;IAAK/L,SAAAA,EAAW8H,SAAAA,CAAK,iBAAiB9H,SAAAA,CAAAA;IAAYgM,QAAAA,EAAUN;qBACzD9G,uBAAAA,CAAA,cAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;AACVgL,GAAAA,EAAAA,MAAAA,CAAOiB,IAAI,CAACT,KAAAA,qBACT5G,uBAAAA,CAAA,cAACE,KAAAA,EAAAA;AAAIoH,IAAAA,GAAAA,EAAKV,KAAAA,CAAMvL,IAAAA;IAAMD,SAAAA,EAAU;AAC3BwL,GAAAA,EAAAA,KAAAA,CAAMtH,IAAAA,KAAS,UAAA,mBACZU,uBAAAA,CAAA,cAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;qBACX4E,uBAAAA,CAAA,cAACkF,OAAAA,EAAAA;IAAM9J,SAAAA,EAAU;AAAmBwL,GAAAA,EAAAA,KAAAA,CAAM1B,KAAK,CAAA,kBAC/ClF,uBAAAA,CAAA,cAACuH,UAAAA,EAAAA;IACGnM,SAAAA,EAAU,wBAAA;AACVC,IAAAA,IAAAA,EAAMuL,KAAAA,CAAMvL,IAAAA;AACZmM,IAAAA,WAAAA,EAAaZ,KAAAA,CAAMY,WAAAA;AACnBC,IAAAA,QAAAA,EAAUb,KAAAA,CAAMa,QAAAA;IAChB7L,KAAAA,EAAO4K,QAAAA,CAASI,KAAAA,CAAMvL,IAAI,CAAA,IAAK,EAAA;IAC/BqM,QAAAA,kBAAU,MAAA,CAAA,CAACX,MAAMG,YAAAA,CAAaN,KAAAA,CAAMvL,MAAM0L,CAAAA,CAAEhM,MAAAA,CAAOa,KAAK,CAAA,EAA9C,UAAA;AAEbgL,GAAAA,CAAAA,EAAAA,KAAAA,CAAMzB,UAAAA,oBACHnF,uBAAAA,CAAA,aAAA,CAACkG,GAAAA,EAAAA;IAAE9K,SAAAA,EAAU;AAAqBwL,GAAAA,EAAAA,KAAAA,CAAMzB,UAAU,CAAA,CAAA,mBAI1DnF,uBAAAA,CAAA,cAACgF,KAAAA,EAAAA;IACGM,SAAAA,EAAAA,IAAAA;AACAJ,IAAAA,KAAAA,EAAO0B,KAAAA,CAAM1B,KAAAA;AACb5F,IAAAA,IAAAA,EAAMsH,MAAMtH,IAAAA,IAAQ,MAAA;AACpBjE,IAAAA,IAAAA,EAAMuL,KAAAA,CAAMvL,IAAAA;AACZmM,IAAAA,WAAAA,EAAaZ,KAAAA,CAAMY,WAAAA;AACnBC,IAAAA,QAAAA,EAAUb,KAAAA,CAAMa,QAAAA;AAChBtC,IAAAA,UAAAA,EAAYyB,KAAAA,CAAMzB,UAAAA;IAClBvJ,KAAAA,EAAO4K,QAAAA,CAASI,KAAAA,CAAMvL,IAAI,CAAA,IAAK,EAAA;IAC/BqM,QAAAA,kBAAU,MAAA,CAAA,CAACX,MAAMG,YAAAA,CAAaN,KAAAA,CAAMvL,MAAM0L,CAAAA,CAAEhM,MAAAA,CAAOa,KAAK,CAAA,EAA9C,UAAA;yBAO9BoE,uBAAAA,CAAA,cAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;qBACX4E,uBAAAA,CAAA,cAACuC,MAAAA,EAAAA;IAAOjD,IAAAA,EAAK,QAAA;AAASoB,IAAAA;AACjB2F,GAAAA,EAAAA,UAAAA,CAAAA,CAAAA,EAIRxJ,KAAAA,oBACGmD,uBAAAA,CAAA,cAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;KACVyB,KAAAA,CAAMkI,OAAO,GAIrBT,UAAAA,IAAcxF,MAAAA,KAAW,wBACtBkB,uBAAAA,CAAA,cAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;qBACX4E,uBAAAA,CAAA,aAAA,CAAC6E,KAAAA,EAAAA,IAAAA,EAAKvD,IAAAA,CAAKwD,SAAAA,CAAUhG,MAAAA,EAAQ,IAAA,EAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AAKvD;AAtGgBqH,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;ACzCT,IAAMwB,uBAAO1C,iBAAAA,CAChB,CACI,EACI7J,WACAoH,OAAAA,GAAU,SAAA,EACVoF,OAAAA,GAAU,IAAA,EACVC,cAAc,KAAA,EACdtL,QAAAA,EACA,GAAGuG,KAAAA,IAEPC,GAAAA,KAAAA;AAEA,EAAA,uBACI/C,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;AACG6C,IAAAA,GAAAA;IACA3H,SAAAA,EAAW8H,SAAAA,CACP,UAAA,EACA,CAAA,UAAA,EAAaV,OAAAA,CAAAA,CAAAA,EACb,qBAAqBoF,OAAAA,CAAAA,CAAAA,EACrBC,WAAAA,IAAe,uBAAA,EACfzM,SAAAA,CAAAA;IAEH,GAAG0H;KAEHvG,QAAAA,CAAAA;AAGb,CAAA;AAGJoL,IAAAA,CAAK1D,WAAAA,GAAc,MAAA;AAWZ,IAAM6D,UAAAA,mBAAa7C,iBAAAA,CACtB,CAAC,EAAE7J,SAAAA,EAAW2M,KAAAA,EAAOC,WAAAA,EAAaC,MAAAA,EAAQ1L,QAAAA,EAAU,GAAGuG,KAAAA,IAASC,GAAAA,KAAAA;AAC5D,EAAA,uBACI/C,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;AAAI6C,IAAAA,GAAAA;IAAU3H,SAAAA,EAAW8H,SAAAA,CAAK,mBAAmB9H,SAAAA,CAAAA;IAAa,GAAG0H;AAC5DiF,GAAAA,EAAAA,CAAAA,KAAAA,IAASC,WAAAA,qBACPhI,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;KACV2M,KAAAA,oBAAS/H,uBAAAA,CAAA,aAAA,CAACkI,IAAAA,EAAAA;IAAG9M,SAAAA,EAAU;AAA0B2M,GAAAA,EAAAA,KAAAA,CAAAA,EACjDC,WAAAA,oBAAehI,uBAAAA,CAAA,cAACkG,GAAAA,EAAAA;IAAE9K,SAAAA,EAAU;AAAgC4M,GAAAA,EAAAA,WAAAA,CAAAA,CAAAA,EAGpEC,MAAAA,oBAAUjI,uBAAAA,CAAA,cAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;AAA2B6M,GAAAA,EAAAA,MAAAA,GACpD1L,QAAAA,CAAAA;AAGb,CAAA;AAGJuL,UAAAA,CAAW7D,WAAAA,GAAc,YAAA;AAIlB,IAAMkE,WAAAA,mBAAclD,iBAAAA,CACvB,CAAC,EAAE7J,WAAWmB,QAAAA,EAAU,GAAGuG,KAAAA,EAAAA,EAASC,GAAAA,KAAAA;AAChC,EAAA,uBACI/C,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;AAAI6C,IAAAA,GAAAA;IAAU3H,SAAAA,EAAW8H,SAAAA,CAAK,oBAAoB9H,SAAAA,CAAAA;IAAa,GAAG0H;KAC9DvG,QAAAA,CAAAA;AAGb,CAAA;AAGJ4L,WAAAA,CAAYlE,WAAAA,GAAc,aAAA;AAInB,IAAMmE,UAAAA,mBAAanD,iBAAAA,CACtB,CAAC,EAAE7J,WAAWmB,QAAAA,EAAU,GAAGuG,KAAAA,EAAAA,EAASC,GAAAA,KAAAA;AAChC,EAAA,uBACI/C,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;AAAI6C,IAAAA,GAAAA;IAAU3H,SAAAA,EAAW8H,SAAAA,CAAK,mBAAmB9H,SAAAA,CAAAA;IAAa,GAAG0H;KAC7DvG,QAAAA,CAAAA;AAGb,CAAA;AAGJ6L,UAAAA,CAAWnE,WAAAA,GAAc,YAAA;ACxClB,SAASoE,QAAAA,CAA4C,EACxD5I,IAAAA,EACA6I,OAAAA,EACAC,aAAa,KAAA,EACbC,iBAAAA,GAAoB,WAAA,EACpBC,UAAAA,EACA/H,OAAAA,GAAU,KAAA,EACVgI,YAAAA,GAAe,SAAA,EACftN,WAAS,EACM;AACf,EAAA,MAAM,CAACuN,OAAAA,EAASC,UAAAA,CAAAA,GAAclM,eAAAA,CAAuB,EAAE,CAAA;AACvD,EAAA,MAAM,CAACmM,YAAAA,EAAcC,eAAAA,CAAAA,GAAmBpM,gBAAS,EAAA,CAAA;AAEjD,EAAA,MAAMqM,eAAeC,cAAAA,CACjB,MACIV,OAAAA,CAAQjB,GAAAA,CAAI,CAAC4B,GAAAA,MAAS;IAClB1D,EAAAA,EAAIpK,MAAAA,CAAO8N,IAAI3B,GAAG,CAAA;AAClB4B,IAAAA,WAAAA,EAAaD,GAAAA,CAAI3B,GAAAA;AACjB6B,IAAAA,MAAAA,EAAQF,GAAAA,CAAIE,MAAAA;IACZC,IAAAA,EAAMH,GAAAA,CAAIG,OACJ,CAAC,EAAEC,UAAUC,GAAAA,EAAG,KAAOL,IAAIG,IAAAA,CAAMC,QAAAA,IAAYC,GAAAA,CAAIC,QAAQ,IACzD,CAAC,EAAEF,UAAQ,KAAOlO,MAAAA,CAAOkO,QAAAA,EAAAA,IAAc,EAAA,CAAA;AAC7CG,IAAAA,aAAAA,EAAeP,IAAIQ,QAAAA,IAAY,IAAA;AAC/BhH,IAAAA,IAAAA,EAAM,OAAOwG,GAAAA,CAAIS,KAAAA,KAAU,QAAA,GAAWT,IAAIS,KAAAA,GAAQ1N;AACtD,GAAA,CAAA,CAAA,EACJ;AAACsM,IAAAA;AAAQ,GAAA,CAAA;AAGb,EAAA,MAAMqB,QAAQC,wBAAAA,CAAc;AACxBnK,IAAAA,IAAAA;IACA6I,OAAAA,EAASS,YAAAA;IACTc,KAAAA,EAAO;AAAElB,MAAAA,OAAAA;AAASE,MAAAA;AAAa,KAAA;IAC/BiB,eAAAA,EAAiBlB,UAAAA;IACjBmB,oBAAAA,EAAsBjB,eAAAA;AACtBkB,IAAAA,eAAAA,EAAiBA,0BAAAA,EAAAA;AACjBC,IAAAA,iBAAAA,EAAmBA,4BAAAA,EAAAA;AACnBC,IAAAA,mBAAAA,EAAqBA,8BAAAA;GACzB,CAAA;AAEA,EAAA,uBACIlK,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAW8H,SAAAA,CAAK,gBAAgB9H,SAAAA;KAChCmN,UAAAA,oBACGvI,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;qBACX4E,uBAAAA,CAAA,cAAC2B,OAAAA,EAAAA;IACGrC,IAAAA,EAAK,MAAA;IACL1D,KAAAA,EAAOiN,YAAAA;AACPnB,IAAAA,QAAAA,0BAAWX,CAAAA,KAAM+B,eAAAA,CAAgB/B,CAAAA,CAAEhM,MAAAA,CAAOa,KAAK,CAAA,EAArC,UAAA,CAAA;IACV4L,WAAAA,EAAagB,iBAAAA;IACbpN,SAAAA,EAAU;uBAItB4E,uBAAAA,CAAA,cAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;qBACX4E,uBAAAA,CAAA,cAAC2J,OAAAA,EAAAA;IAAMvO,SAAAA,EAAU;AACb,GAAA,kBAAA4E,uBAAAA,CAAA,aAAA,CAACmK,OAAAA,EAAAA,IAAAA,EACIR,KAAAA,CAAMS,eAAAA,EAAe,CAAG/C,GAAAA,CAAI,CAACgD,WAAAA,qBAC1BrK,uBAAAA,CAAA,cAACsK,IAAAA,EAAAA;AAAGhD,IAAAA,GAAAA,EAAK+C,WAAAA,CAAY9E;AAChB8E,GAAAA,EAAAA,WAAAA,CAAYE,QAAQlD,GAAAA,CAAI,CAAC8B,2BACtBnJ,uBAAAA,CAAA,cAACwK,IAAAA,EAAAA;AACGlD,IAAAA,GAAAA,EAAK6B,MAAAA,CAAO5D,EAAAA;AACZnK,IAAAA,SAAAA,EAAW8H,UACP,iBAAA,EACAiG,MAAAA,CAAOsB,MAAAA,CAAOC,UAAAA,MAAgB,2BAAA,CAAA;IAElC9F,OAAAA,EAASuE,MAAAA,CAAOsB,OAAOE,uBAAAA,EAAuB;IAC9CC,KAAAA,EAAO;MAAElB,KAAAA,EAAOP,MAAAA,CAAOsB,OAAOI,OAAAA;AAAU;qBAExC7K,uBAAAA,CAAA,cAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;AACV0P,GAAAA,EAAAA,qBAAAA,CAAW3B,MAAAA,CAAOsB,MAAAA,CAAOM,SAAAA,CAAU5B,MAAAA,EAAQA,OAAO6B,UAAAA,EAAU,CAAA,EAC5D7B,MAAAA,CAAOsB,OAAOQ,WAAAA,EAAW,oBACtBjL,uBAAAA,CAAA,cAACmD,MAAAA,EAAAA;IAAK/H,SAAAA,EAAU;KACX+N,MAAAA,CAAOsB,MAAAA,CAAOQ,WAAAA,EAAW,KAAO,KAAA,GAAQ,QAAA,GAAM,QAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAS/EjL,uBAAAA,CAAA,aAAA,CAACkL,OAAAA,EAAAA,IAAAA,EACIxK,OAAAA,mBACGV,uBAAAA,CAAA,aAAA,CAACsK,IAAAA,EAAAA,IAAAA,kBACGtK,uBAAAA,CAAA,aAAA,CAACmL,IAAAA,EAAAA;AAAGC,IAAAA,OAAAA,EAAS9C,OAAAA,CAAQ+C,MAAAA;IAAQjQ,SAAAA,EAAU;AAAuB,GAAA,EAAA,YAAA,CAAA,CAAA,GAIlEuO,KAAAA,CAAM2B,WAAAA,EAAW,CAAGC,KAAKF,MAAAA,KAAW,CAAA,mBACpCrL,uBAAAA,CAAA,cAACsK,IAAAA,EAAAA,IAAAA,kBACGtK,uBAAAA,CAAA,cAACmL,IAAAA,EAAAA;AAAGC,IAAAA,OAAAA,EAAS9C,OAAAA,CAAQ+C,MAAAA;IAAQjQ,SAAAA,EAAU;AAClCsN,GAAAA,EAAAA,YAAAA,CAAAA,CAAAA,GAITiB,KAAAA,CAAM2B,WAAAA,EAAW,CAAGC,IAAAA,CAAKlE,GAAAA,CAAI,CAACiC,GAAAA,qBAC1BtJ,uBAAAA,CAAA,aAAA,CAACsK,IAAAA,EAAAA;AACGhD,IAAAA,GAAAA,EAAKgC,GAAAA,CAAI/D,EAAAA;IACTnK,SAAAA,EAAW8H,SAAAA,CACP,kBAAA,EACAuF,UAAAA,IAAc,6BAAA,CAAA;AAElB7D,IAAAA,OAAAA,kBAAS,MAAA,CAAA,MAAM6D,UAAAA,GAAaa,GAAAA,CAAIC,QAAQ,CAAA,EAA/B,SAAA;KAERD,GAAAA,CAAIkC,eAAAA,GAAkBnE,GAAAA,CAAI,CAAC+B,yBACxBpJ,uBAAAA,CAAA,cAACmL,IAAAA,EAAAA;AAAG7D,IAAAA,GAAAA,EAAK8B,IAAAA,CAAK7D,EAAAA;IAAInK,SAAAA,EAAU;AACvB0P,GAAAA,EAAAA,qBAAAA,CAAW1B,IAAAA,CAAKqB,MAAAA,CAAOM,SAAAA,CAAU3B,IAAAA,EAAMA,KAAK4B,UAAAA,EAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAWnG;AApHgB3C,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;ACzChBoD,cAAAA,CAAQC,QAAAA,CACJC,wBACAC,oBAAAA,EACAC,qBAAAA,EACAC,sBACAC,mBAAAA,EACAC,mBAAAA,EACAC,cAAAA,EACAC,gBAAAA,EACAC,eAAAA,CAAAA;AA0CG,SAASC,KAAAA,CAAM,EAClB9M,IAAAA,EACAG,IAAAA,EACA3E,OAAAA,EACAuR,SAAS,GAAA,EACT3C,KAAAA,GAAQ,MAAA,EACRtO,SAAAA,EAAS,EACA;AACT,EAAA,MAAMkR,cAAAA,GAA4C;IAC9CC,UAAAA,EAAY,IAAA;IACZC,mBAAAA,EAAqB,KAAA;IACrBC,OAAAA,EAAS;MACLC,MAAAA,EAAQ;QACJC,OAAAA,EAAS,IAAA;QACTC,QAAAA,EAAU,KAAA;QACVC,MAAAA,EAAQ;UACJC,aAAAA,EAAe,IAAA;UACflF,OAAAA,EAAS;AACb;AACJ,OAAA;MACAmF,OAAAA,EAAS;QACLC,IAAAA,EAAM,OAAA;QACNC,SAAAA,EAAW,KAAA;QACXC,eAAAA,EAAiB,uBAAA;QACjBC,UAAAA,EAAY,SAAA;QACZC,SAAAA,EAAW,SAAA;QACXC,WAAAA,EAAa,SAAA;QACbC,WAAAA,EAAa,CAAA;QACbC,YAAAA,EAAc,CAAA;QACd3F,OAAAA,EAAS;AACb;AACJ,KAAA;IACA4F,MAAAA,EAAQlO,IAAAA,KAAS,KAAA,IAASA,IAAAA,KAAS,UAAA,GAAa;MAC5CmO,CAAAA,EAAG;QACCC,IAAAA,EAAM;UACFC,KAAAA,EAAO;AACX,SAAA;QACAC,KAAAA,EAAO;UACHD,KAAAA,EAAO;AACX;AACJ,OAAA;MACAE,CAAAA,EAAG;QACCH,IAAAA,EAAM;UACFC,KAAAA,EAAO;AACX,SAAA;QACAC,KAAAA,EAAO;UACHD,KAAAA,EAAO;AACX;AACJ;KACJ,GAAI3R;AACR,GAAA;AAEA,EAAA,MAAM8R,aAAAA,GAAgB;IAClB,GAAGxB,cAAAA;IACH,GAAGxR,OAAAA;IACH2R,OAAAA,EAAS;AACL,MAAA,GAAGH,cAAAA,CAAeG,OAAAA;AAClB,MAAA,GAAG3R,OAAAA,EAAS2R;AAChB;AACJ,GAAA;AAEA,EAAA,uBACIzM,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;IACG9E,SAAAA,EAAW8H,SAAAA,CAAK,aAAa9H,SAAAA,CAAAA;IAC7BwP,KAAAA,EAAO;AAAEyB,MAAAA,MAAAA;AAAQ3C,MAAAA;AAAM;qBAEvB1J,uBAAAA,CAAA,cAAC+N,mBAAAA,EAAAA;AACGzO,IAAAA,IAAAA;AACAG,IAAAA,IAAAA;IACA3E,OAAAA,EAASgT;;AAIzB;AAzEgB1B,MAAAA,CAAAA,KAAAA,EAAAA,OAAAA,CAAAA;ACnCT,SAAS4B,SAAS,EACrB7E,MAAAA,EACA8E,OAAAA,EACAC,MAAAA,EACAC,kBAAkB,MAAA,EAClBC,YAAAA,GAAe,GAAA,EACf9R,UAAAA,GAAa,MACbsL,OAAAA,GAAU,IAAA,EACVxM,WACAmB,QAAAA,EACA,GAAGuG,OAAAA,EACS;AACZ,EAAA,MAAMuL,YAAAA,GAAeC,cAAuB,IAAA,CAAA;AAG5C/Q,EAAAA,iBAAU,MAAA;AACN,IAAA,IAAI,CAACjB,UAAAA,IAAc,CAAC+R,YAAAA,CAAaE,OAAAA,EAAS;AAE1C,IAAA,MAAMC,cAAAA,GAAiB,IAAIC,cAAAA,CAAe,CAACC,OAAAA,KAAAA;AACvC,MAAA,KAAA,MAAWC,SAASD,OAAAA,EAAS;AACzB,QAAA,MAAM,EAAErC,MAAAA,EAAM,GAAKsC,KAAAA,CAAMC,WAAAA;AAEzB/Q,QAAAA,MAAAA,CAAOC,OAAO+Q,WAAAA,CACV;UACIvP,IAAAA,EAAM,QAAA;UACN+M,MAAAA,EAAQ5G,IAAAA,CAAKqJ,KAAKzC,MAAAA;AACtB,SAAA,EACA,GAAA,CAAA;AAER,MAAA;IACJ,CAAA,CAAA;AAEAmC,IAAAA,cAAAA,CAAeO,OAAAA,CAAQV,aAAaE,OAAO,CAAA;AAE3C,IAAA,OAAO,MAAA;AACHC,MAAAA,cAAAA,CAAeQ,UAAAA,EAAU;AAC7B,IAAA,CAAA;EACJ,CAAA,EAAG;AAAC1S,IAAAA;AAAW,GAAA,CAAA;AAEf,EAAA,MAAM2S,YAAAA,GAAe;AACjBvF,IAAAA,KAAAA,EAAO,OAAO0E,YAAAA,KAAiB,QAAA,GAAW,CAAA,EAAGA,YAAAA,CAAAA,EAAAA,CAAAA,GAAmBA,YAAAA;IAChEc,UAAAA,EAAY;AAChB,GAAA;AAEA,EAAA,uBACIlP,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;IACG6C,GAAAA,EAAKsL,YAAAA;AACLjT,IAAAA,SAAAA,EAAW8H,SAAAA,CACP,eAAA,EACA,CAAA,uBAAA,EAA0B0E,OAAAA,IAC1BxM,SAAAA,CAAAA;IAEH,GAAG0H;KAEHqG,MAAAA,oBAAUnJ,uBAAAA,CAAA,aAAA,CAACmJ,QAAAA,EAAAA;IAAO/N,SAAAA,EAAU;AAAwB+N,GAAAA,EAAAA,MAAAA,CAAAA,kBAErDnJ,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAU;AACV6S,GAAAA,EAAAA,OAAAA,IAAWE,eAAAA,KAAoB,MAAA,oBAC5BnO,uBAAAA,CAAA,cAACmP,OAAAA,EAAAA;IAAM/T,SAAAA,EAAU,uBAAA;IAAwBwP,KAAAA,EAAOqE;AAC3ChB,GAAAA,EAAAA,OAAAA,CAAAA,kBAITjO,uBAAAA,CAAA,aAAA,CAACoP,MAAAA,EAAAA;IAAKhU,SAAAA,EAAU;AAAsBmB,GAAAA,EAAAA,QAAAA,GAErC0R,OAAAA,IAAWE,eAAAA,KAAoB,2BAC5BnO,uBAAAA,CAAA,cAACmP,OAAAA,EAAAA;IAAM/T,SAAAA,EAAU,uBAAA;IAAwBwP,KAAAA,EAAOqE;AAC3ChB,GAAAA,EAAAA,OAAAA,CAAAA,CAAAA,EAKZC,MAAAA,oBAAUlO,uBAAAA,CAAA,cAACkO,QAAAA,EAAAA;IAAO9S,SAAAA,EAAU;AAAwB8S,GAAAA,EAAAA,MAAAA,CAAAA,CAAAA;AAGjE;AA3EgBF,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;ACPT,SAASqB,SAAAA,CAAU,EACtBC,IAAAA,EACAC,QAAAA,GAAW,MAAA,EACXC,kBAAkB,KAAA,EAClBC,QAAAA,GAAW,IAAA,EACXrU,SAAAA,EAAS,EACI;AACb,EAAA,MAAM,CAACsU,MAAAA,EAAQC,SAAAA,CAAAA,GAAa3P,uBAAAA,CAAMtD,SAAS,KAAA,CAAA;AAE3C,EAAA,MAAMkT,6BAAa,MAAA,CAAA,YAAA;AACf,IAAA,MAAMC,SAAAA,CAAUC,SAAAA,CAAUC,SAAAA,CAAUT,IAAAA,CAAAA;AACpCK,IAAAA,SAAAA,CAAU,IAAA,CAAA;AACVK,IAAAA,UAAAA,CAAW,MAAML,SAAAA,CAAU,KAAA,CAAA,EAAQ,GAAA,CAAA;EACvC,CAAA,EAJmB,YAAA,CAAA;AAMnB,EAAA,uBACI3P,uBAAAA,CAAA,aAAA,CAACE,KAAAA,EAAAA;IAAI9E,SAAAA,EAAW8H,SAAAA,CAAK,kBAAkB9H,SAAAA;KAClCqU,QAAAA,oBACGzP,uBAAAA,CAAA,aAAA,CAACiQ,QAAAA,EAAAA;IACG3Q,IAAAA,EAAK,QAAA;IACLlE,SAAAA,EAAU,qBAAA;IACVwJ,OAAAA,EAASgL,UAAAA;AACTM,IAAAA,YAAAA,EAAYR,SAAS,SAAA,GAAY;KAEhCA,MAAAA,mBACG1P,uBAAAA,CAAA,aAAA,CAACqD,KAAAA,EAAAA;IAAIC,OAAAA,EAAQ,WAAA;IAAYC,IAAAA,EAAK,MAAA;IAAOK,MAAAA,EAAO,cAAA;IAAeC,WAAAA,EAAY;qBACnE7D,uBAAAA,CAAA,cAACmQ,UAAAA,EAAAA;IAASC,MAAAA,EAAO;wBAGrBpQ,uBAAAA,CAAA,cAACqD,KAAAA,EAAAA;IAAIC,OAAAA,EAAQ,WAAA;IAAYC,IAAAA,EAAK,MAAA;IAAOK,MAAAA,EAAO,cAAA;IAAeC,WAAAA,EAAY;qBACnE7D,uBAAAA,CAAA,cAACqQ,MAAAA,EAAAA;IAAK5C,CAAAA,EAAE,GAAA;IAAII,CAAAA,EAAE,GAAA;IAAInE,KAAAA,EAAM,IAAA;IAAK2C,MAAAA,EAAO,IAAA;IAAKiE,EAAAA,EAAG,GAAA;IAAIC,EAAAA,EAAG;sBACnDvQ,uBAAAA,CAAA,cAACwQ,MAAAA,EAAAA;IAAKC,CAAAA,EAAE;wBAKxBzQ,uBAAAA,CAAA,cAAC0Q,4BAAAA,EAAAA;AAAU3Q,IAAAA,KAAAA,EAAO4Q,yBAAAA,CAAOC,QAAAA;AAAUtB,IAAAA,IAAAA,EAAMA,KAAKuB,IAAAA,EAAI;AAAItB,IAAAA;KACjD,CAAC,EAAEnU,SAAAA,EAAW0V,WAAAA,EAAalG,KAAAA,EAAOmG,MAAAA,EAAQC,YAAAA,EAAcC,aAAAA,EAAa,qBAClEjR,uBAAAA,CAAA,aAAA,CAAC6E,KAAAA,EAAAA;IAAIzJ,SAAAA,EAAW8H,SAAAA,CAAK,sBAAsB4N,WAAAA,CAAAA;AAAclG,IAAAA;AACpDmG,GAAAA,EAAAA,MAAAA,CAAO1J,IAAI,CAAC6J,IAAAA,EAAMC,sBACfnR,uBAAAA,CAAA,cAACE,KAAAA,EAAAA;IAAIoH,GAAAA,EAAK6J,CAAAA;AAAI,IAAA,GAAGH,YAAAA,CAAa;AAAEE,MAAAA;KAAK;KAChC1B,eAAAA,oBACGxP,uBAAAA,CAAA,aAAA,CAACmD,MAAAA,EAAAA;IAAK/H,SAAAA,EAAU;KAA8B+V,CAAAA,GAAI,CAAA,CAAA,EAErDD,IAAAA,CAAK7J,GAAAA,CAAI,CAAC+J,OAAO9J,GAAAA,qBACdtH,uBAAAA,CAAA,aAAA,CAACmD,MAAAA,EAAAA;AAAKmE,IAAAA,GAAAA;AAAW,IAAA,GAAG2J,aAAAA,CAAc;AAAEG,MAAAA;KAAM;;AAS9E;AAtDgB/B,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA","file":"index.js","sourcesContent":["/**\r\n * @UIApp Decorator\r\n * \r\n * Links an MCP tool to a React UI component.\r\n * When applied to a tool method, it:\r\n * 1. Adds _meta.ui/resourceUri to the tool definition\r\n * 2. Auto-registers a resource that renders the component to HTML\r\n * \r\n * This decorator is designed to work with @leanmcp/core decorators.\r\n */\r\nimport 'reflect-metadata';\r\nimport type React from 'react';\r\n\r\n// Metadata keys\r\nexport const UI_APP_COMPONENT_KEY = 'ui:app:component';\r\nexport const UI_APP_URI_KEY = 'ui:app:uri';\r\nexport const UI_APP_OPTIONS_KEY = 'ui:app:options';\r\n\r\n/**\r\n * Options for @UIApp decorator\r\n */\r\nexport interface UIAppOptions {\r\n /** React component to render for this tool's UI */\r\n component: React.ComponentType<any>;\r\n /** Custom resource URI (auto-generated if not provided) */\r\n uri?: string;\r\n /** HTML document title */\r\n title?: string;\r\n /** Additional CSS styles */\r\n styles?: string;\r\n}\r\n\r\n/**\r\n * Decorator that links a tool to a UI component.\r\n * \r\n * When the tool is called, the host will fetch the UI resource\r\n * which returns the component rendered as HTML.\r\n * \r\n * @example\r\n * ```typescript\r\n * import { Tool } from '@leanmcp/core';\r\n * import { UIApp } from '@leanmcp/ui';\r\n * import { WeatherCard } from './WeatherCard';\r\n * \r\n * class WeatherService {\r\n * @Tool({ description: 'Get weather for a city' })\r\n * @UIApp({ component: WeatherCard })\r\n * async getWeather(args: { city: string }) {\r\n * return { city: args.city, temp: 22 };\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport function UIApp(options: UIAppOptions): MethodDecorator {\r\n return (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\r\n const methodName = String(propertyKey);\r\n // Use same pattern as @Resource in @leanmcp/core: className without 'service' suffix\r\n const className = target.constructor.name.toLowerCase().replace('service', '');\r\n\r\n // Generate URI using ui:// scheme (required by ext-apps hosts)\r\n const uri = options.uri ?? `ui://${className}/${methodName}`;\r\n\r\n // Store metadata on the method\r\n Reflect.defineMetadata(UI_APP_COMPONENT_KEY, options.component, descriptor.value!);\r\n Reflect.defineMetadata(UI_APP_URI_KEY, uri, descriptor.value!);\r\n Reflect.defineMetadata(UI_APP_OPTIONS_KEY, options, descriptor.value!);\r\n\r\n // Also store the resource URI for the @Tool decorator to pick up\r\n // The @Tool decorator in @leanmcp/core should check for this\r\n const existingMeta = Reflect.getMetadata('tool:meta', descriptor.value) || {};\r\n Reflect.defineMetadata('tool:meta', {\r\n ...existingMeta,\r\n 'ui/resourceUri': uri,\r\n }, descriptor.value!);\r\n\r\n return descriptor;\r\n };\r\n}\r\n\r\n/**\r\n * Helper to get UIApp metadata from a method\r\n */\r\nexport function getUIAppMetadata(target: Function): UIAppOptions | undefined {\r\n const component = Reflect.getMetadata(UI_APP_COMPONENT_KEY, target);\r\n if (!component) return undefined;\r\n\r\n return {\r\n component,\r\n uri: Reflect.getMetadata(UI_APP_URI_KEY, target),\r\n ...Reflect.getMetadata(UI_APP_OPTIONS_KEY, target),\r\n };\r\n}\r\n\r\n/**\r\n * Helper to get the resource URI from a method\r\n */\r\nexport function getUIAppUri(target: Function): string | undefined {\r\n return Reflect.getMetadata(UI_APP_URI_KEY, target);\r\n}\r\n","/**\r\n * AppProvider - MCP Apps context provider\r\n * \r\n * Uses @modelcontextprotocol/ext-apps for communication with the host.\r\n * This is the root provider for all MCP App components.\r\n */\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useState,\r\n useCallback,\r\n type ReactNode,\r\n} from 'react';\r\nimport { App, PostMessageTransport } from '@modelcontextprotocol/ext-apps';\r\nimport type {\r\n McpUiHostContext,\r\n McpUiToolResultNotification,\r\n McpUiToolInputNotification,\r\n McpUiToolInputPartialNotification,\r\n McpUiAppCapabilities,\r\n} from '@modelcontextprotocol/ext-apps';\r\nimport type { CallToolResult, Implementation } from '@modelcontextprotocol/sdk/types.js';\r\n\r\n/**\r\n * App information (same as ext-apps Implementation)\r\n */\r\nexport interface AppInfo {\r\n name: string;\r\n version: string;\r\n}\r\n\r\n/**\r\n * Options for App behavior\r\n */\r\nexport interface AppOptions {\r\n /**\r\n * Automatically report size changes to the host using ResizeObserver.\r\n * @default true\r\n */\r\n autoResize?: boolean;\r\n}\r\n\r\n/**\r\n * MCP App context value - available via useMcpApp()\r\n */\r\nexport interface McpAppContextValue {\r\n /** The ext-apps App instance */\r\n app: App | null;\r\n /** Whether connected to host */\r\n isConnected: boolean;\r\n /** Connection error, if any */\r\n error: Error | null;\r\n /** Host context (theme, viewport, etc.) */\r\n hostContext: McpUiHostContext;\r\n /** Tool input arguments received from host */\r\n toolInput: Record<string, unknown> | null;\r\n /** Partial tool input (streaming) */\r\n toolInputPartial: Record<string, unknown> | null;\r\n /** Tool result received from host */\r\n toolResult: CallToolResult | null;\r\n /** Call a server tool */\r\n callTool: (name: string, args?: Record<string, unknown>) => Promise<CallToolResult>;\r\n /** Send a message to the host chat */\r\n sendMessage: (text: string) => Promise<void>;\r\n /** Send a log message */\r\n sendLog: (level: 'debug' | 'info' | 'warning' | 'error', data: unknown) => Promise<void>;\r\n /** Open a link in the host */\r\n openLink: (url: string) => Promise<void>;\r\n}\r\n\r\nconst McpAppContext = createContext<McpAppContextValue | null>(null);\r\n\r\nexport interface AppProviderProps {\r\n /** App name and version */\r\n appInfo: AppInfo;\r\n /** App capabilities (tools, experimental features) */\r\n capabilities?: McpUiAppCapabilities;\r\n /** App options (autoResize, etc.) */\r\n options?: AppOptions;\r\n /** React children */\r\n children: ReactNode;\r\n}\r\n\r\n/**\r\n * AppProvider - Root context for MCP Apps\r\n * \r\n * Provides connection management and hooks for MCP App components.\r\n * Uses PostMessage transport for iframe communication.\r\n * \r\n * @example\r\n * ```tsx\r\n * function MyApp() {\r\n * return (\r\n * <AppProvider \r\n * appInfo={{ name: \"MyApp\", version: \"1.0.0\" }}\r\n * capabilities={{ tools: { listChanged: true } }}\r\n * options={{ autoResize: true }}\r\n * >\r\n * <MyContent />\r\n * </AppProvider>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function AppProvider({ appInfo, capabilities = {}, options = { autoResize: true }, children }: AppProviderProps) {\r\n const [app, setApp] = useState<App | null>(null);\r\n const [isConnected, setIsConnected] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n const [hostContext, setHostContext] = useState<McpUiHostContext>({});\r\n const [toolInput, setToolInput] = useState<Record<string, unknown> | null>(null);\r\n const [toolInputPartial, setToolInputPartial] = useState<Record<string, unknown> | null>(null);\r\n const [toolResult, setToolResult] = useState<CallToolResult | null>(null);\r\n\r\n // Connect to host on mount\r\n useEffect(() => {\r\n let mounted = true;\r\n let appInstance: App | null = null;\r\n\r\n async function connect() {\r\n try {\r\n const transport = new PostMessageTransport(window.parent);\r\n\r\n // Create App with all parameters\r\n appInstance = new App(\r\n appInfo as Implementation,\r\n capabilities,\r\n options\r\n );\r\n\r\n // Register handlers BEFORE connecting\r\n appInstance.ontoolinput = (params: McpUiToolInputNotification['params']) => {\r\n if (mounted) {\r\n setToolInput(params.arguments as Record<string, unknown>);\r\n }\r\n };\r\n\r\n // Handle partial/streaming tool input\r\n appInstance.ontoolinputpartial = (params: McpUiToolInputPartialNotification['params']) => {\r\n if (mounted) {\r\n setToolInputPartial(params.arguments as Record<string, unknown>);\r\n }\r\n };\r\n\r\n appInstance.ontoolresult = (params: McpUiToolResultNotification['params']) => {\r\n if (mounted) {\r\n setToolResult(params as CallToolResult);\r\n }\r\n };\r\n\r\n appInstance.onhostcontextchanged = (params: Partial<McpUiHostContext>) => {\r\n if (mounted) {\r\n setHostContext(prev => ({ ...prev, ...params }));\r\n }\r\n };\r\n\r\n await appInstance.connect(transport);\r\n\r\n if (mounted) {\r\n setApp(appInstance);\r\n setIsConnected(true);\r\n setError(null);\r\n\r\n // Get host context from initialization (if available via capabilities)\r\n // Note: ext-apps stores hostInfo and hostCapabilities but not hostContext\r\n // hostContext comes via onhostcontextchanged notifications\r\n }\r\n } catch (err) {\r\n if (mounted) {\r\n setError(err instanceof Error ? err : new Error(String(err)));\r\n setIsConnected(false);\r\n }\r\n }\r\n }\r\n\r\n connect();\r\n\r\n return () => {\r\n mounted = false;\r\n if (appInstance) {\r\n appInstance.close();\r\n }\r\n };\r\n }, [appInfo.name, appInfo.version]);\r\n\r\n // Context methods\r\n const callTool = useCallback(\r\n async (name: string, args: Record<string, unknown> = {}): Promise<CallToolResult> => {\r\n if (!app) {\r\n throw new Error('Not connected to host');\r\n }\r\n const result = await app.callServerTool({ name, arguments: args });\r\n // Also update toolResult so useToolResult() sees the new data\r\n setToolResult(result);\r\n return result;\r\n },\r\n [app]\r\n );\r\n\r\n const sendMessage = useCallback(\r\n async (text: string) => {\r\n if (!app) {\r\n console.warn('[AppProvider] Not connected - cannot send message');\r\n return;\r\n }\r\n await app.sendMessage({\r\n role: 'user',\r\n content: [{ type: 'text', text }],\r\n });\r\n },\r\n [app]\r\n );\r\n\r\n const sendLog = useCallback(\r\n async (level: 'debug' | 'info' | 'warning' | 'error', data: unknown) => {\r\n if (!app) {\r\n console.log(`[MCP App] ${level}:`, data);\r\n return;\r\n }\r\n await app.sendLog({ level, data });\r\n },\r\n [app]\r\n );\r\n\r\n const openLink = useCallback(\r\n async (url: string) => {\r\n if (!app) {\r\n // Fallback: open in new tab\r\n window.open(url, '_blank', 'noopener,noreferrer');\r\n return;\r\n }\r\n await app.sendOpenLink({ url });\r\n },\r\n [app]\r\n );\r\n\r\n const value: McpAppContextValue = {\r\n app,\r\n isConnected,\r\n error,\r\n hostContext,\r\n toolInput,\r\n toolInputPartial,\r\n toolResult,\r\n callTool,\r\n sendMessage,\r\n sendLog,\r\n openLink,\r\n };\r\n\r\n // Theme is applied via CSS custom properties, not imperative DOM manipulation\r\n // Users can use hostContext.theme to style their components\r\n const theme = hostContext.theme ?? 'light';\r\n\r\n return (\r\n <McpAppContext.Provider value={value}>\r\n <div className=\"lui-root\" data-theme={theme}>\r\n {children}\r\n </div>\r\n </McpAppContext.Provider>\r\n );\r\n}\r\n\r\n/**\r\n * Default context for SSR (no AppProvider available)\r\n */\r\nconst ssrDefaultContext: McpAppContextValue = {\r\n app: null,\r\n isConnected: false,\r\n error: null,\r\n hostContext: {},\r\n toolInput: null,\r\n toolInputPartial: null,\r\n toolResult: null,\r\n callTool: async () => { throw new Error('callTool not available during SSR'); },\r\n sendMessage: async () => { console.warn('sendMessage not available during SSR'); },\r\n sendLog: async () => { console.warn('sendLog not available during SSR'); },\r\n openLink: async () => { console.warn('openLink not available during SSR'); },\r\n};\r\n\r\n/**\r\n * Hook to access the MCP App context\r\n * Returns SSR-safe defaults when no provider is available (during server rendering)\r\n */\r\nexport function useMcpApp(): McpAppContextValue {\r\n const context = useContext(McpAppContext);\r\n // Return SSR defaults if no context (during server-side rendering)\r\n if (!context) {\r\n return ssrDefaultContext;\r\n }\r\n return context;\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport { useMcpApp } from './AppProvider';\r\n\r\nexport interface UseToolResult<T = unknown> {\r\n /** Call the tool with arguments */\r\n call: (args?: Record<string, unknown>) => Promise<T>;\r\n /** Whether the tool is currently being called */\r\n loading: boolean;\r\n /** The result of the last tool call */\r\n result: T | null;\r\n /** Error from the last tool call */\r\n error: Error | null;\r\n /** Reset the result and error state */\r\n reset: () => void;\r\n}\r\n\r\n/**\r\n * Hook for calling an MCP tool with loading and error state\r\n * \r\n * @example\r\n * ```tsx\r\n * function WeatherWidget() {\r\n * const { call, loading, result, error } = useTool<WeatherData>('get-weather');\r\n * \r\n * return (\r\n * <div>\r\n * <button onClick={() => call({ city: 'London' })} disabled={loading}>\r\n * {loading ? 'Loading...' : 'Get Weather'}\r\n * </button>\r\n * {result && <div>Temperature: {result.temperature}°C</div>}\r\n * {error && <div>Error: {error.message}</div>}\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useTool<T = unknown>(toolName: string): UseToolResult<T> {\r\n const { callTool } = useMcpApp();\r\n const [loading, setLoading] = useState(false);\r\n const [result, setResult] = useState<T | null>(null);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const call = useCallback(\r\n async (args: Record<string, unknown> = {}) => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const response = await callTool(toolName, args);\r\n const data = (response as { structuredContent?: T })?.structuredContent ?? response as T;\r\n setResult(data);\r\n return data;\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error(String(err));\r\n setError(error);\r\n throw error;\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n [callTool, toolName]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setResult(null);\r\n setError(null);\r\n }, []);\r\n\r\n return { call, loading, result, error, reset };\r\n}\r\n","/**\r\n * useToolResult - Access the tool result from the host\r\n * \r\n * Returns the result of the tool call that spawned this MCP App.\r\n * The host sends this via ui/notifications/tool-result after tool execution.\r\n */\r\nimport { useMcpApp } from './AppProvider';\r\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\r\n\r\nexport interface UseToolResultReturn<T = unknown> {\r\n /** The tool result, typed as T */\r\n result: T | null;\r\n /** Raw CallToolResult from MCP */\r\n rawResult: CallToolResult | null;\r\n /** Whether a result has been received */\r\n hasResult: boolean;\r\n /** Extract text content from result */\r\n textContent: string | null;\r\n}\r\n\r\n/**\r\n * Hook to access tool result from host\r\n * \r\n * @example\r\n * ```tsx\r\n * function WeatherCard() {\r\n * const { result } = useToolResult<{ city: string; temp: number }>();\r\n * \r\n * if (!result) return <div>Loading...</div>;\r\n * \r\n * return <div>{result.city}: {result.temp}°C</div>;\r\n * }\r\n * ```\r\n */\r\nexport function useToolResult<T = unknown>(): UseToolResultReturn<T> {\r\n const { toolResult } = useMcpApp();\r\n\r\n // Extract structured content if available\r\n let result: T | null = null;\r\n let textContent: string | null = null;\r\n\r\n if (toolResult) {\r\n // Try structuredContent first (MCP 2024-11-05+)\r\n if ('structuredContent' in toolResult && toolResult.structuredContent) {\r\n result = toolResult.structuredContent as T;\r\n }\r\n\r\n // Fall back to parsing text content as JSON\r\n if (!result && toolResult.content) {\r\n const textItem = toolResult.content.find(\r\n (c): c is { type: 'text'; text: string } => c.type === 'text'\r\n );\r\n if (textItem) {\r\n textContent = textItem.text;\r\n try {\r\n result = JSON.parse(textItem.text) as T;\r\n } catch {\r\n // Not JSON, leave as null\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n result,\r\n rawResult: toolResult,\r\n hasResult: toolResult !== null,\r\n textContent,\r\n };\r\n}\r\n","/**\r\n * useToolInput - Access tool input arguments from the host\r\n * \r\n * Returns the arguments passed to the tool that spawned this MCP App.\r\n * The host sends this via ui/notifications/tool-input after initialization.\r\n */\r\nimport { useMcpApp } from './AppProvider';\r\n\r\nexport interface UseToolInputReturn<T = Record<string, unknown>> {\r\n /** The tool input arguments, typed as T */\r\n input: T | null;\r\n /** Whether input has been received */\r\n hasInput: boolean;\r\n}\r\n\r\n/**\r\n * Hook to access tool input arguments from host\r\n * \r\n * @example\r\n * ```tsx\r\n * function WeatherCard() {\r\n * const { input } = useToolInput<{ city: string }>();\r\n * \r\n * if (!input) return <div>Loading...</div>;\r\n * \r\n * return <div>Weather for: {input.city}</div>;\r\n * }\r\n * ```\r\n */\r\nexport function useToolInput<T = Record<string, unknown>>(): UseToolInputReturn<T> {\r\n const { toolInput } = useMcpApp();\r\n\r\n return {\r\n input: toolInput as T | null,\r\n hasInput: toolInput !== null,\r\n };\r\n}\r\n","/**\r\n * useToolInputPartial - Access streaming partial tool input\r\n * \r\n * This hook provides access to partial/streaming tool input arguments\r\n * as they are being typed or generated. Useful for progressive rendering\r\n * during tool call initialization.\r\n */\r\nimport { useMcpApp } from './AppProvider';\r\n\r\nexport interface UseToolInputPartialReturn {\r\n /** Partial arguments currently available */\r\n partialArgs: Record<string, unknown> | null;\r\n /** Whether partial args are being received */\r\n isStreaming: boolean;\r\n}\r\n\r\n/**\r\n * Hook to access streaming partial tool input\r\n * \r\n * @example\r\n * ```tsx\r\n * function MyComponent() {\r\n * const { partialArgs, isStreaming } = useToolInputPartial();\r\n * \r\n * if (isStreaming) {\r\n * return <div>Receiving: {JSON.stringify(partialArgs)}</div>;\r\n * }\r\n * return <div>Ready for input</div>;\r\n * }\r\n * ```\r\n */\r\nexport function useToolInputPartial(): UseToolInputPartialReturn {\r\n const { toolInputPartial } = useMcpApp();\r\n\r\n return {\r\n partialArgs: toolInputPartial,\r\n isStreaming: toolInputPartial !== null,\r\n };\r\n}\r\n","/**\r\n * useHostContext - Access host context (theme, viewport, locale, etc.)\r\n * \r\n * Returns the host context provided during initialization and updates.\r\n * The host sends this via ui/notifications/host-context-changed.\r\n */\r\nimport { useMcpApp } from './AppProvider';\r\nimport type { McpUiHostContext } from '@modelcontextprotocol/ext-apps';\r\n\r\nexport interface UseHostContextReturn {\r\n /** Current theme: 'light' or 'dark' */\r\n theme: 'light' | 'dark';\r\n /** Display mode: 'inline', 'fullscreen', 'pip' */\r\n displayMode: 'inline' | 'fullscreen' | 'pip';\r\n /** Viewport dimensions */\r\n viewport: { width: number; height: number } | null;\r\n /** User locale (e.g., 'en-US') */\r\n locale: string | null;\r\n /** User timezone (e.g., 'America/New_York') */\r\n timeZone: string | null;\r\n /** Platform type */\r\n platform: 'web' | 'desktop' | 'mobile' | null;\r\n /** Full raw context */\r\n rawContext: McpUiHostContext;\r\n}\r\n\r\n/**\r\n * Hook to access host context\r\n * \r\n * @example\r\n * ```tsx\r\n * function ThemedCard() {\r\n * const { theme, locale } = useHostContext();\r\n * \r\n * return (\r\n * <div className={theme === 'dark' ? 'dark-mode' : 'light-mode'}>\r\n * Locale: {locale}\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useHostContext(): UseHostContextReturn {\r\n const { hostContext } = useMcpApp();\r\n\r\n return {\r\n theme: (hostContext.theme as 'light' | 'dark') ?? 'light',\r\n displayMode: (hostContext.displayMode as 'inline' | 'fullscreen' | 'pip') ?? 'inline',\r\n viewport: hostContext.viewport ?? null,\r\n locale: hostContext.locale ?? null,\r\n timeZone: hostContext.timeZone ?? null,\r\n platform: (hostContext.platform as 'web' | 'desktop' | 'mobile') ?? null,\r\n rawContext: hostContext,\r\n };\r\n}\r\n","import React, { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\r\nimport { Slot } from '@radix-ui/react-slot';\r\nimport { clsx } from 'clsx';\r\nimport './Button.css';\r\n\r\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\r\n /** Button variant */\r\n variant?: 'primary' | 'secondary' | 'ghost' | 'destructive' | 'outline';\r\n /** Button size */\r\n size?: 'sm' | 'md' | 'lg' | 'icon';\r\n /** Loading state */\r\n loading?: boolean;\r\n /** Render as child component (Radix Slot) */\r\n asChild?: boolean;\r\n /** Left icon */\r\n leftIcon?: ReactNode;\r\n /** Right icon */\r\n rightIcon?: ReactNode;\r\n}\r\n\r\n/**\r\n * Button component with multiple variants and loading state\r\n * \r\n * @example\r\n * ```tsx\r\n * <Button variant=\"primary\" onClick={handleClick}>\r\n * Click Me\r\n * </Button>\r\n * \r\n * <Button variant=\"ghost\" loading>\r\n * Loading...\r\n * </Button>\r\n * ```\r\n */\r\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\r\n (\r\n {\r\n className,\r\n variant = 'primary',\r\n size = 'md',\r\n loading = false,\r\n disabled,\r\n asChild = false,\r\n leftIcon,\r\n rightIcon,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const Comp = asChild ? Slot : 'button';\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n className={clsx(\r\n 'lui-button',\r\n `lui-button--${variant}`,\r\n `lui-button--${size}`,\r\n loading && 'lui-button--loading',\r\n className\r\n )}\r\n disabled={disabled || loading}\r\n {...props}\r\n >\r\n {loading && (\r\n <span className=\"lui-button__spinner\" aria-hidden=\"true\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" className=\"lui-spinner-icon\">\r\n <circle\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"3\"\r\n strokeLinecap=\"round\"\r\n strokeDasharray=\"32\"\r\n strokeDashoffset=\"12\"\r\n />\r\n </svg>\r\n </span>\r\n )}\r\n {leftIcon && !loading && <span className=\"lui-button__icon\">{leftIcon}</span>}\r\n <span className=\"lui-button__content\">{children}</span>\r\n {rightIcon && <span className=\"lui-button__icon\">{rightIcon}</span>}\r\n </Comp>\r\n );\r\n }\r\n);\r\n\r\nButton.displayName = 'Button';\r\n","import React, { useState, type ReactNode } from 'react';\r\nimport { Button, type ButtonProps } from '../core/Button';\r\nimport { useTool } from './useTool';\r\n\r\nexport interface ActionButtonProps extends Omit<ButtonProps, 'onClick' | 'loading' | 'onError'> {\r\n /** Tool name to call */\r\n toolName: string;\r\n /** Arguments to pass to the tool */\r\n toolArgs?: Record<string, unknown>;\r\n /** Callback when tool call succeeds */\r\n onToolSuccess?: (result: unknown) => void;\r\n /** Callback when tool call fails */\r\n onToolError?: (error: Error) => void;\r\n /** Show result inline after success */\r\n showResult?: boolean;\r\n /** Custom result renderer */\r\n renderResult?: (result: unknown) => ReactNode;\r\n}\r\n\r\n/**\r\n * ActionButton - Button that calls an MCP tool with loading state\r\n * \r\n * @example\r\n * ```tsx\r\n * <ActionButton\r\n * toolName=\"get-weather\"\r\n * toolArgs={{ city: 'London' }}\r\n * onToolSuccess={(data) => console.log(data)}\r\n * >\r\n * Get Weather\r\n * </ActionButton>\r\n * ```\r\n */\r\nexport function ActionButton({\r\n toolName,\r\n toolArgs = {},\r\n onToolSuccess,\r\n onToolError,\r\n showResult = false,\r\n renderResult,\r\n children,\r\n ...buttonProps\r\n}: ActionButtonProps) {\r\n const { call, loading, result, error } = useTool(toolName);\r\n const [hasResult, setHasResult] = useState(false);\r\n\r\n const handleClick = async () => {\r\n try {\r\n const res = await call(toolArgs);\r\n setHasResult(true);\r\n onToolSuccess?.(res);\r\n } catch (err) {\r\n onToolError?.(err instanceof Error ? err : new Error(String(err)));\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"lui-action-button-wrapper\">\r\n <Button {...buttonProps} loading={loading} onClick={handleClick}>\r\n {children}\r\n </Button>\r\n {showResult && hasResult && result !== null && (\r\n <div className=\"lui-action-button-result\">\r\n {renderResult ? renderResult(result) : (\r\n <pre>{JSON.stringify(result, null, 2)}</pre>\r\n )}\r\n </div>\r\n )}\r\n {error && (\r\n <div className=\"lui-action-button-error\">\r\n {error.message}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React, { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react';\r\nimport { clsx } from 'clsx';\r\nimport './Input.css';\r\n\r\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\r\n /** Input label */\r\n label?: string;\r\n /** Helper text */\r\n helperText?: string;\r\n /** Error message */\r\n error?: string;\r\n /** Input size */\r\n size?: 'sm' | 'md' | 'lg';\r\n /** Left icon or element */\r\n leftElement?: ReactNode;\r\n /** Right icon or element */\r\n rightElement?: ReactNode;\r\n /** Full width */\r\n fullWidth?: boolean;\r\n}\r\n\r\n/**\r\n * Input component with label, validation, and icon support\r\n * \r\n * @example\r\n * ```tsx\r\n * <Input\r\n * label=\"Email\"\r\n * type=\"email\"\r\n * placeholder=\"Enter your email\"\r\n * error={errors.email}\r\n * />\r\n * ```\r\n */\r\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\r\n (\r\n {\r\n className,\r\n label,\r\n helperText,\r\n error,\r\n size = 'md',\r\n leftElement,\r\n rightElement,\r\n fullWidth = false,\r\n id,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const inputId = id || `input-${Math.random().toString(36).substr(2, 9)}`;\r\n const hasError = Boolean(error);\r\n\r\n return (\r\n <div\r\n className={clsx(\r\n 'lui-input-wrapper',\r\n fullWidth && 'lui-input-wrapper--full-width',\r\n className\r\n )}\r\n >\r\n {label && (\r\n <label htmlFor={inputId} className=\"lui-input-label\">\r\n {label}\r\n </label>\r\n )}\r\n <div\r\n className={clsx(\r\n 'lui-input-container',\r\n `lui-input-container--${size}`,\r\n hasError && 'lui-input-container--error',\r\n leftElement && 'lui-input-container--has-left',\r\n rightElement && 'lui-input-container--has-right'\r\n )}\r\n >\r\n {leftElement && <span className=\"lui-input-element lui-input-element--left\">{leftElement}</span>}\r\n <input\r\n ref={ref}\r\n id={inputId}\r\n className=\"lui-input\"\r\n aria-invalid={hasError}\r\n aria-describedby={error ? `${inputId}-error` : helperText ? `${inputId}-helper` : undefined}\r\n {...props}\r\n />\r\n {rightElement && <span className=\"lui-input-element lui-input-element--right\">{rightElement}</span>}\r\n </div>\r\n {(error || helperText) && (\r\n <p\r\n id={error ? `${inputId}-error` : `${inputId}-helper`}\r\n className={clsx('lui-input-message', error && 'lui-input-message--error')}\r\n >\r\n {error || helperText}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nInput.displayName = 'Input';\r\n","import React, { useState, type FormEvent } from 'react';\r\nimport { Button } from '../core/Button';\r\nimport { Input } from '../core/Input';\r\nimport { useTool } from './useTool';\r\nimport { clsx } from 'clsx';\r\nimport './ToolForm.css';\r\n\r\nexport interface ToolFormField {\r\n /** Field name (matches tool input schema) */\r\n name: string;\r\n /** Display label */\r\n label: string;\r\n /** Input type */\r\n type?: 'text' | 'number' | 'email' | 'password' | 'textarea';\r\n /** Placeholder text */\r\n placeholder?: string;\r\n /** Default value */\r\n defaultValue?: string | number;\r\n /** Required field */\r\n required?: boolean;\r\n /** Helper text */\r\n helperText?: string;\r\n}\r\n\r\nexport interface ToolFormProps {\r\n /** Tool name to call on submit */\r\n toolName: string;\r\n /** Form fields */\r\n fields: ToolFormField[];\r\n /** Submit button text */\r\n submitText?: string;\r\n /** Callback when tool call succeeds */\r\n onSuccess?: (result: unknown) => void;\r\n /** Callback when tool call fails */\r\n onError?: (error: Error) => void;\r\n /** Show result after success */\r\n showResult?: boolean;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * ToolForm - Auto-generates a form that submits to an MCP tool\r\n * \r\n * @example\r\n * ```tsx\r\n * <ToolForm\r\n * toolName=\"create-user\"\r\n * fields={[\r\n * { name: 'name', label: 'Name', required: true },\r\n * { name: 'email', label: 'Email', type: 'email', required: true },\r\n * ]}\r\n * submitText=\"Create User\"\r\n * onSuccess={(user) => console.log('Created:', user)}\r\n * />\r\n * ```\r\n */\r\nexport function ToolForm({\r\n toolName,\r\n fields,\r\n submitText = 'Submit',\r\n onSuccess,\r\n onError,\r\n showResult = false,\r\n className,\r\n}: ToolFormProps) {\r\n const { call, loading, result, error } = useTool(toolName);\r\n const [formData, setFormData] = useState<Record<string, string | number>>(() => {\r\n const initial: Record<string, string | number> = {};\r\n fields.forEach((field) => {\r\n if (field.defaultValue !== undefined) {\r\n initial[field.name] = field.defaultValue;\r\n }\r\n });\r\n return initial;\r\n });\r\n\r\n const handleSubmit = async (e: FormEvent) => {\r\n e.preventDefault();\r\n\r\n // Convert number types\r\n const args: Record<string, unknown> = {};\r\n fields.forEach((field) => {\r\n const value = formData[field.name];\r\n if (field.type === 'number' && value !== undefined) {\r\n args[field.name] = Number(value);\r\n } else {\r\n args[field.name] = value;\r\n }\r\n });\r\n\r\n try {\r\n const res = await call(args);\r\n onSuccess?.(res);\r\n } catch (err) {\r\n onError?.(err instanceof Error ? err : new Error(String(err)));\r\n }\r\n };\r\n\r\n const handleChange = (name: string, value: string) => {\r\n setFormData((prev) => ({ ...prev, [name]: value }));\r\n };\r\n\r\n return (\r\n <form className={clsx('lui-tool-form', className)} onSubmit={handleSubmit}>\r\n <div className=\"lui-tool-form-fields\">\r\n {fields.map((field) => (\r\n <div key={field.name} className=\"lui-tool-form-field\">\r\n {field.type === 'textarea' ? (\r\n <div className=\"lui-input-wrapper lui-input-wrapper--full-width\">\r\n <label className=\"lui-input-label\">{field.label}</label>\r\n <textarea\r\n className=\"lui-tool-form-textarea\"\r\n name={field.name}\r\n placeholder={field.placeholder}\r\n required={field.required}\r\n value={formData[field.name] ?? ''}\r\n onChange={(e) => handleChange(field.name, e.target.value)}\r\n />\r\n {field.helperText && (\r\n <p className=\"lui-input-message\">{field.helperText}</p>\r\n )}\r\n </div>\r\n ) : (\r\n <Input\r\n fullWidth\r\n label={field.label}\r\n type={field.type ?? 'text'}\r\n name={field.name}\r\n placeholder={field.placeholder}\r\n required={field.required}\r\n helperText={field.helperText}\r\n value={formData[field.name] ?? ''}\r\n onChange={(e) => handleChange(field.name, e.target.value)}\r\n />\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"lui-tool-form-actions\">\r\n <Button type=\"submit\" loading={loading}>\r\n {submitText}\r\n </Button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"lui-tool-form-error\">\r\n {error.message}\r\n </div>\r\n )}\r\n\r\n {showResult && result !== null && (\r\n <div className=\"lui-tool-form-result\">\r\n <pre>{JSON.stringify(result, null, 2)}</pre>\r\n </div>\r\n )}\r\n </form>\r\n );\r\n}\r\n","import React, { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\r\nimport { clsx } from 'clsx';\r\nimport './Card.css';\r\n\r\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\r\n /** Card variant */\r\n variant?: 'default' | 'outline' | 'elevated';\r\n /** Padding size */\r\n padding?: 'none' | 'sm' | 'md' | 'lg';\r\n /** Make card interactive (hover effects) */\r\n interactive?: boolean;\r\n}\r\n\r\n/**\r\n * Card container component\r\n */\r\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\r\n (\r\n {\r\n className,\r\n variant = 'default',\r\n padding = 'md',\r\n interactive = false,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n return (\r\n <div\r\n ref={ref}\r\n className={clsx(\r\n 'lui-card',\r\n `lui-card--${variant}`,\r\n `lui-card--padding-${padding}`,\r\n interactive && 'lui-card--interactive',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nCard.displayName = 'Card';\r\n\r\nexport interface CardHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\r\n /** Header title */\r\n title?: ReactNode;\r\n /** Header description */\r\n description?: ReactNode;\r\n /** Right-side action */\r\n action?: ReactNode;\r\n}\r\n\r\nexport const CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(\r\n ({ className, title, description, action, children, ...props }, ref) => {\r\n return (\r\n <div ref={ref} className={clsx('lui-card-header', className)} {...props}>\r\n {(title || description) && (\r\n <div className=\"lui-card-header__text\">\r\n {title && <h3 className=\"lui-card-header__title\">{title}</h3>}\r\n {description && <p className=\"lui-card-header__description\">{description}</p>}\r\n </div>\r\n )}\r\n {action && <div className=\"lui-card-header__action\">{action}</div>}\r\n {children}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nCardHeader.displayName = 'CardHeader';\r\n\r\nexport interface CardContentProps extends HTMLAttributes<HTMLDivElement> { }\r\n\r\nexport const CardContent = forwardRef<HTMLDivElement, CardContentProps>(\r\n ({ className, children, ...props }, ref) => {\r\n return (\r\n <div ref={ref} className={clsx('lui-card-content', className)} {...props}>\r\n {children}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nCardContent.displayName = 'CardContent';\r\n\r\nexport interface CardFooterProps extends HTMLAttributes<HTMLDivElement> { }\r\n\r\nexport const CardFooter = forwardRef<HTMLDivElement, CardFooterProps>(\r\n ({ className, children, ...props }, ref) => {\r\n return (\r\n <div ref={ref} className={clsx('lui-card-footer', className)} {...props}>\r\n {children}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nCardFooter.displayName = 'CardFooter';\r\n","import React, { useMemo, useState, type ReactNode } from 'react';\r\nimport {\r\n useReactTable,\r\n getCoreRowModel,\r\n getSortedRowModel,\r\n getFilteredRowModel,\r\n flexRender,\r\n type ColumnDef,\r\n type SortingState,\r\n} from '@tanstack/react-table';\r\nimport { clsx } from 'clsx';\r\nimport './DataGrid.css';\r\n\r\nexport interface DataGridColumn<T> {\r\n /** Column key (accessor) */\r\n key: keyof T | string;\r\n /** Column header */\r\n header: string;\r\n /** Custom cell renderer */\r\n cell?: (value: unknown, row: T) => ReactNode;\r\n /** Enable sorting */\r\n sortable?: boolean;\r\n /** Column width */\r\n width?: number | string;\r\n}\r\n\r\nexport interface DataGridProps<T extends Record<string, unknown>> {\r\n /** Data array */\r\n data: T[];\r\n /** Column definitions */\r\n columns: DataGridColumn<T>[];\r\n /** Enable global search */\r\n searchable?: boolean;\r\n /** Search placeholder */\r\n searchPlaceholder?: string;\r\n /** Row click handler */\r\n onRowClick?: (row: T) => void;\r\n /** Loading state */\r\n loading?: boolean;\r\n /** Empty state message */\r\n emptyMessage?: string;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * DataGrid - Sortable, filterable data table for tool results\r\n * \r\n * @example\r\n * ```tsx\r\n * const { result } = useTool<{ items: Item[] }>('get-items');\r\n * \r\n * <DataGrid\r\n * data={result?.items ?? []}\r\n * columns={[\r\n * { key: 'name', header: 'Name', sortable: true },\r\n * { key: 'price', header: 'Price', cell: (v) => `$${v}` },\r\n * ]}\r\n * searchable\r\n * />\r\n * ```\r\n */\r\nexport function DataGrid<T extends Record<string, unknown>>({\r\n data,\r\n columns,\r\n searchable = false,\r\n searchPlaceholder = 'Search...',\r\n onRowClick,\r\n loading = false,\r\n emptyMessage = 'No data',\r\n className,\r\n}: DataGridProps<T>) {\r\n const [sorting, setSorting] = useState<SortingState>([]);\r\n const [globalFilter, setGlobalFilter] = useState('');\r\n\r\n const tableColumns = useMemo<ColumnDef<T>[]>(\r\n () =>\r\n columns.map((col) => ({\r\n id: String(col.key),\r\n accessorKey: col.key,\r\n header: col.header,\r\n cell: col.cell\r\n ? ({ getValue, row }) => col.cell!(getValue(), row.original)\r\n : ({ getValue }) => String(getValue() ?? ''),\r\n enableSorting: col.sortable ?? true,\r\n size: typeof col.width === 'number' ? col.width : undefined,\r\n })),\r\n [columns]\r\n );\r\n\r\n const table = useReactTable({\r\n data,\r\n columns: tableColumns,\r\n state: { sorting, globalFilter },\r\n onSortingChange: setSorting,\r\n onGlobalFilterChange: setGlobalFilter,\r\n getCoreRowModel: getCoreRowModel(),\r\n getSortedRowModel: getSortedRowModel(),\r\n getFilteredRowModel: getFilteredRowModel(),\r\n });\r\n\r\n return (\r\n <div className={clsx('lui-datagrid', className)}>\r\n {searchable && (\r\n <div className=\"lui-datagrid-search\">\r\n <input\r\n type=\"text\"\r\n value={globalFilter}\r\n onChange={(e) => setGlobalFilter(e.target.value)}\r\n placeholder={searchPlaceholder}\r\n className=\"lui-datagrid-search-input\"\r\n />\r\n </div>\r\n )}\r\n <div className=\"lui-datagrid-container\">\r\n <table className=\"lui-datagrid-table\">\r\n <thead>\r\n {table.getHeaderGroups().map((headerGroup) => (\r\n <tr key={headerGroup.id}>\r\n {headerGroup.headers.map((header) => (\r\n <th\r\n key={header.id}\r\n className={clsx(\r\n 'lui-datagrid-th',\r\n header.column.getCanSort() && 'lui-datagrid-th--sortable'\r\n )}\r\n onClick={header.column.getToggleSortingHandler()}\r\n style={{ width: header.column.getSize() }}\r\n >\r\n <div className=\"lui-datagrid-th-content\">\r\n {flexRender(header.column.columnDef.header, header.getContext())}\r\n {header.column.getIsSorted() && (\r\n <span className=\"lui-datagrid-sort-icon\">\r\n {header.column.getIsSorted() === 'asc' ? '↑' : '↓'}\r\n </span>\r\n )}\r\n </div>\r\n </th>\r\n ))}\r\n </tr>\r\n ))}\r\n </thead>\r\n <tbody>\r\n {loading ? (\r\n <tr>\r\n <td colSpan={columns.length} className=\"lui-datagrid-loading\">\r\n Loading...\r\n </td>\r\n </tr>\r\n ) : table.getRowModel().rows.length === 0 ? (\r\n <tr>\r\n <td colSpan={columns.length} className=\"lui-datagrid-empty\">\r\n {emptyMessage}\r\n </td>\r\n </tr>\r\n ) : (\r\n table.getRowModel().rows.map((row) => (\r\n <tr\r\n key={row.id}\r\n className={clsx(\r\n 'lui-datagrid-row',\r\n onRowClick && 'lui-datagrid-row--clickable'\r\n )}\r\n onClick={() => onRowClick?.(row.original)}\r\n >\r\n {row.getVisibleCells().map((cell) => (\r\n <td key={cell.id} className=\"lui-datagrid-td\">\r\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n </td>\r\n ))}\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { useEffect, useRef } from 'react';\r\nimport {\r\n Chart as ChartJS,\r\n CategoryScale,\r\n LinearScale,\r\n PointElement,\r\n LineElement,\r\n BarElement,\r\n ArcElement,\r\n Title,\r\n Tooltip,\r\n Legend,\r\n type ChartData,\r\n type ChartOptions,\r\n type ChartType as ChartJSType,\r\n} from 'chart.js';\r\nimport { Chart as ReactChart } from 'react-chartjs-2';\r\nimport { clsx } from 'clsx';\r\nimport './Chart.css';\r\n\r\n// Register Chart.js components\r\nChartJS.register(\r\n CategoryScale,\r\n LinearScale,\r\n PointElement,\r\n LineElement,\r\n BarElement,\r\n ArcElement,\r\n Title,\r\n Tooltip,\r\n Legend\r\n);\r\n\r\nexport type ChartType = 'line' | 'bar' | 'pie' | 'doughnut';\r\n\r\nexport interface ChartProps {\r\n /** Chart type */\r\n type: ChartType;\r\n /** Chart data */\r\n data: ChartData<ChartJSType>;\r\n /** Chart options */\r\n options?: ChartOptions<ChartJSType>;\r\n /** Chart height */\r\n height?: number | string;\r\n /** Chart width */\r\n width?: number | string;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Chart component for data visualization\r\n * \r\n * @example\r\n * ```tsx\r\n * const { result } = useTool<{ prices: number[], labels: string[] }>('get-stock-data');\r\n * \r\n * <Chart\r\n * type=\"line\"\r\n * data={{\r\n * labels: result?.labels ?? [],\r\n * datasets: [{\r\n * label: 'Price',\r\n * data: result?.prices ?? [],\r\n * borderColor: '#6366f1',\r\n * tension: 0.4,\r\n * }],\r\n * }}\r\n * height={300}\r\n * />\r\n * ```\r\n */\r\nexport function Chart({\r\n type,\r\n data,\r\n options,\r\n height = 300,\r\n width = '100%',\r\n className,\r\n}: ChartProps) {\r\n const defaultOptions: ChartOptions<ChartJSType> = {\r\n responsive: true,\r\n maintainAspectRatio: false,\r\n plugins: {\r\n legend: {\r\n display: true,\r\n position: 'top' as const,\r\n labels: {\r\n usePointStyle: true,\r\n padding: 16,\r\n },\r\n },\r\n tooltip: {\r\n mode: 'index',\r\n intersect: false,\r\n backgroundColor: 'rgba(15, 23, 42, 0.9)',\r\n titleColor: '#f1f5f9',\r\n bodyColor: '#cbd5e1',\r\n borderColor: '#334155',\r\n borderWidth: 1,\r\n cornerRadius: 8,\r\n padding: 12,\r\n },\r\n },\r\n scales: type !== 'pie' && type !== 'doughnut' ? {\r\n x: {\r\n grid: {\r\n color: 'rgba(226, 232, 240, 0.5)',\r\n },\r\n ticks: {\r\n color: '#64748b',\r\n },\r\n },\r\n y: {\r\n grid: {\r\n color: 'rgba(226, 232, 240, 0.5)',\r\n },\r\n ticks: {\r\n color: '#64748b',\r\n },\r\n },\r\n } : undefined,\r\n };\r\n\r\n const mergedOptions = {\r\n ...defaultOptions,\r\n ...options,\r\n plugins: {\r\n ...defaultOptions.plugins,\r\n ...options?.plugins,\r\n },\r\n };\r\n\r\n return (\r\n <div\r\n className={clsx('lui-chart', className)}\r\n style={{ height, width }}\r\n >\r\n <ReactChart\r\n type={type}\r\n data={data}\r\n options={mergedOptions as ChartOptions<ChartJSType>}\r\n />\r\n </div>\r\n );\r\n}\r\n","import React, { useEffect, useRef, type ReactNode, type HTMLAttributes } from 'react';\r\nimport { clsx } from 'clsx';\r\nimport './AppShell.css';\r\n\r\nexport interface AppShellProps extends HTMLAttributes<HTMLDivElement> {\r\n /** Header content */\r\n header?: ReactNode;\r\n /** Sidebar content */\r\n sidebar?: ReactNode;\r\n /** Footer content */\r\n footer?: ReactNode;\r\n /** Sidebar position */\r\n sidebarPosition?: 'left' | 'right';\r\n /** Sidebar width */\r\n sidebarWidth?: number | string;\r\n /** Enable auto-resize to content */\r\n autoResize?: boolean;\r\n /** Padding */\r\n padding?: 'none' | 'sm' | 'md' | 'lg';\r\n}\r\n\r\n/**\r\n * AppShell - Root layout container for MCP Apps\r\n * \r\n * Provides header, sidebar, main content, and footer areas with auto-resize support.\r\n * \r\n * @example\r\n * ```tsx\r\n * <AppShell\r\n * header={<h1>My App</h1>}\r\n * sidebar={<Navigation />}\r\n * autoResize\r\n * >\r\n * <MainContent />\r\n * </AppShell>\r\n * ```\r\n */\r\nexport function AppShell({\r\n header,\r\n sidebar,\r\n footer,\r\n sidebarPosition = 'left',\r\n sidebarWidth = 240,\r\n autoResize = true,\r\n padding = 'md',\r\n className,\r\n children,\r\n ...props\r\n}: AppShellProps) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Auto-resize effect\r\n useEffect(() => {\r\n if (!autoResize || !containerRef.current) return;\r\n\r\n const resizeObserver = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n const { height } = entry.contentRect;\r\n // Send resize message to parent (host)\r\n window.parent.postMessage(\r\n {\r\n type: 'resize',\r\n height: Math.ceil(height),\r\n },\r\n '*'\r\n );\r\n }\r\n });\r\n\r\n resizeObserver.observe(containerRef.current);\r\n\r\n return () => {\r\n resizeObserver.disconnect();\r\n };\r\n }, [autoResize]);\r\n\r\n const sidebarStyle = {\r\n width: typeof sidebarWidth === 'number' ? `${sidebarWidth}px` : sidebarWidth,\r\n flexShrink: 0,\r\n };\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={clsx(\r\n 'lui-app-shell',\r\n `lui-app-shell--padding-${padding}`,\r\n className\r\n )}\r\n {...props}\r\n >\r\n {header && <header className=\"lui-app-shell-header\">{header}</header>}\r\n\r\n <div className=\"lui-app-shell-body\">\r\n {sidebar && sidebarPosition === 'left' && (\r\n <aside className=\"lui-app-shell-sidebar\" style={sidebarStyle}>\r\n {sidebar}\r\n </aside>\r\n )}\r\n\r\n <main className=\"lui-app-shell-main\">{children}</main>\r\n\r\n {sidebar && sidebarPosition === 'right' && (\r\n <aside className=\"lui-app-shell-sidebar\" style={sidebarStyle}>\r\n {sidebar}\r\n </aside>\r\n )}\r\n </div>\r\n\r\n {footer && <footer className=\"lui-app-shell-footer\">{footer}</footer>}\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\nimport { Highlight, themes } from 'prism-react-renderer';\r\nimport { clsx } from 'clsx';\r\nimport './CodeBlock.css';\r\n\r\nexport interface CodeBlockProps {\r\n /** Code content */\r\n code: string;\r\n /** Programming language */\r\n language?: string;\r\n /** Show line numbers */\r\n showLineNumbers?: boolean;\r\n /** Enable copy button */\r\n copyable?: boolean;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * CodeBlock - Syntax highlighted code display\r\n * \r\n * @example\r\n * ```tsx\r\n * <CodeBlock\r\n * code={`const greeting = \"Hello, World!\";`}\r\n * language=\"javascript\"\r\n * copyable\r\n * />\r\n * ```\r\n */\r\nexport function CodeBlock({\r\n code,\r\n language = 'text',\r\n showLineNumbers = false,\r\n copyable = true,\r\n className,\r\n}: CodeBlockProps) {\r\n const [copied, setCopied] = React.useState(false);\r\n\r\n const handleCopy = async () => {\r\n await navigator.clipboard.writeText(code);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n };\r\n\r\n return (\r\n <div className={clsx('lui-code-block', className)}>\r\n {copyable && (\r\n <button\r\n type=\"button\"\r\n className=\"lui-code-block-copy\"\r\n onClick={handleCopy}\r\n aria-label={copied ? 'Copied!' : 'Copy code'}\r\n >\r\n {copied ? (\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <polyline points=\"20,6 9,17 4,12\" />\r\n </svg>\r\n ) : (\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\r\n </svg>\r\n )}\r\n </button>\r\n )}\r\n <Highlight theme={themes.nightOwl} code={code.trim()} language={language}>\r\n {({ className: hlClassName, style, tokens, getLineProps, getTokenProps }) => (\r\n <pre className={clsx('lui-code-block-pre', hlClassName)} style={style}>\r\n {tokens.map((line, i) => (\r\n <div key={i} {...getLineProps({ line })}>\r\n {showLineNumbers && (\r\n <span className=\"lui-code-block-line-number\">{i + 1}</span>\r\n )}\r\n {line.map((token, key) => (\r\n <span key={key} {...getTokenProps({ token })} />\r\n ))}\r\n </div>\r\n ))}\r\n </pre>\r\n )}\r\n </Highlight>\r\n </div>\r\n );\r\n}\r\n"]}