@json-to-office/jto 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +234 -49
- package/dist/cli.js.map +1 -1
- package/dist/client/assets/HomePage-BuV1dGoc.js +99 -0
- package/dist/client/assets/HomePage-BuV1dGoc.js.map +1 -0
- package/dist/client/assets/JsonEditorPage-y7DXYaWc.js +3 -0
- package/dist/client/assets/JsonEditorPage-y7DXYaWc.js.map +1 -0
- package/dist/client/assets/MonacoPluginProvider-B4-PgJ0r.js +3 -0
- package/dist/client/assets/MonacoPluginProvider-B4-PgJ0r.js.map +1 -0
- package/dist/client/assets/{button-CMkwEplC.js → button-Bf6x7Zjh.js} +2 -2
- package/dist/client/assets/{button-CMkwEplC.js.map → button-Bf6x7Zjh.js.map} +1 -1
- package/dist/client/assets/{editor-CtwF-qwA.js → editor-Bwuq290w.js} +2 -2
- package/dist/client/assets/{editor-CtwF-qwA.js.map → editor-Bwuq290w.js.map} +1 -1
- package/dist/client/assets/editor-monaco-json-BrfKPhHP.js +6 -0
- package/dist/client/assets/{editor-monaco-json-DHRbpQ-v.js.map → editor-monaco-json-BrfKPhHP.js.map} +1 -1
- package/dist/client/assets/index-Dmrqj1a7.css +1 -0
- package/dist/client/assets/index-uE8YOnrS.js +3 -0
- package/dist/client/assets/index-uE8YOnrS.js.map +1 -0
- package/dist/client/assets/preview-kcqt_5hb.js +3 -0
- package/dist/client/assets/{preview-38guLS86.js.map → preview-kcqt_5hb.js.map} +1 -1
- package/dist/client/assets/{state-vendor-CAMVKh-F.js → state-vendor-DypmJYNT.js} +2 -2
- package/dist/client/assets/{state-vendor-CAMVKh-F.js.map → state-vendor-DypmJYNT.js.map} +1 -1
- package/dist/client/assets/{ui-vendor-C6DsfOoA.js → ui-vendor-BFdEgxEg.js} +2 -2
- package/dist/client/assets/{ui-vendor-C6DsfOoA.js.map → ui-vendor-BFdEgxEg.js.map} +1 -1
- package/dist/client/index.html +3 -4
- package/dist/index.d.ts +8 -3
- package/dist/index.js +110 -19
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/dist/client/assets/HomePage-D9PVR0H8.js +0 -99
- package/dist/client/assets/HomePage-D9PVR0H8.js.map +0 -1
- package/dist/client/assets/JsonEditorPage-bCBt1A49.js +0 -3
- package/dist/client/assets/JsonEditorPage-bCBt1A49.js.map +0 -1
- package/dist/client/assets/editor-monaco-json-DHRbpQ-v.js +0 -6
- package/dist/client/assets/index-B9dV-vCI.css +0 -1
- package/dist/client/assets/index-CGQAncgl.js +0 -3
- package/dist/client/assets/index-CGQAncgl.js.map +0 -1
- package/dist/client/assets/preview-38guLS86.js +0 -3
- package/dist/client/assets/settings-store-provider-BEzje7_o.js +0 -2
- package/dist/client/assets/settings-store-provider-BEzje7_o.js.map +0 -1
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/docx-preview-CUjVWdSJ.js","assets/react-vendor-DhdcN9D5.js","assets/radix-ui-CXavUarI.js","assets/query-vendor-UL64zsGL.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{j as e}from"./query-vendor-UL64zsGL.js";import{a as L,r as d,ar as H,as as re}from"./react-vendor-DhdcN9D5.js";import{S as F,c as S,g as W,F as C,_ as ae,j as ne,A as q}from"./index-uE8YOnrS.js";import{S as E,B as ie,P as oe,b as ce,D as le,c as de,d as me,e as ue}from"./HomePage-BuV1dGoc.js";import{e as xe,T as $,I as fe}from"./ui-vendor-BFdEgxEg.js";import{d as B,b as he,u as G}from"./MonacoPluginProvider-B4-PgJ0r.js";import"./radix-ui-CXavUarI.js";import"./monaco-editor-DzeBDgmk.js";import"./button-Bf6x7Zjh.js";import"./state-vendor-DypmJYNT.js";function pe({className:r,currentStage:t="parsing",message:a}){const n=["parsing","building","rendering","finalizing"],s={parsing:"Validating JSON",building:"Building structure",rendering:"Rendering content",finalizing:"Finalizing document"},c=n.indexOf(t);return e.jsxs("div",{className:S("p-6 space-y-4",r),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(F,{size:"md"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-sm font-medium",children:"Generating Document"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:a||`${s[t]}...`})]})]}),e.jsx("div",{className:"space-y-3",children:n.map((i,o)=>{const l=o===c,u=o<c;return e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex justify-between text-xs",children:[e.jsx("span",{className:S(l?"text-primary font-medium":u?"text-muted-foreground":"text-muted-foreground/60"),children:s[i]}),e.jsx("span",{className:"text-muted-foreground",children:u?"✓":l?"...":"○"})]}),e.jsx("div",{className:"w-full bg-secondary rounded-full h-1.5",children:e.jsx("div",{className:S("h-1.5 rounded-full transition-all duration-300",u?"bg-green-500":l?"bg-primary animate-pulse":"bg-transparent"),style:{width:u||l?"100%":"0%"}})})]},i)})})]})}function ge({renderingLibrary:r,className:t}){const a=c=>{switch(c){case"LibreOffice":return{name:"LibreOffice",description:"Converting PPTX to PDF locally..."};case"Office":return{name:"Microsoft Office",description:"Uploading file and loading Office viewer..."};case"Docs":return{name:"Google Docs",description:"Uploading file and loading Docs viewer..."};default:return{name:"Default",description:"Processing document..."}}},{name:n,description:s}=a(r);return e.jsxs("div",{className:S("flex flex-col items-center justify-center h-full p-8 space-y-4",t),children:[e.jsx(F,{size:"lg"}),e.jsxs("div",{className:"text-center space-y-2",children:[e.jsx("p",{className:"text-sm font-medium",children:"Rendering Preview"}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["Using ",n," renderer"]}),e.jsx("p",{className:"text-xs text-muted-foreground/80",children:s})]}),e.jsxs("div",{className:"w-full max-w-md space-y-3",children:[e.jsx(E,{className:"h-16 w-full"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{className:"h-4 w-full"}),e.jsx(E,{className:"h-4 w-3/4"}),e.jsx(E,{className:"h-4 w-1/2"})]}),e.jsx(E,{className:"h-12 w-full"})]})]})}const J=L.forwardRef(({isLoading:r,iframeSrc:t,iframeSrcDoc:a,isGenerating:n,generationProgress:s},c)=>{const[i,o]=d.useState(!1);d.useEffect(()=>{o(!1)},[t,a]);const l=()=>{o(!0)},u=()=>{console.warn("Iframe failed to load content"),o(!1)},g=a?"allow-scripts allow-popups allow-forms":void 0,h=!!(t||a);return n&&!h?e.jsx("div",{className:"grow",children:e.jsx(pe,{currentStage:s==null?void 0:s.stage,message:s==null?void 0:s.message})}):r&&!h?e.jsx("div",{className:"grow",children:e.jsx(ge,{renderingLibrary:"LibreOffice"})}):h?e.jsxs("div",{className:"h-full w-full relative bg-white",children:[!i&&e.jsx("div",{className:"absolute inset-0 bg-muted/80 flex items-center justify-center z-10",children:e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-foreground mx-auto mb-2"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Loading preview..."})]})}),(n||r)&&e.jsx("div",{className:"absolute inset-0 bg-background/60 backdrop-blur-[2px] flex items-center justify-center z-20 transition-opacity duration-200",children:e.jsxs("div",{className:"flex flex-col items-center gap-2",children:[e.jsx(F,{size:"lg"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:n?"Generating...":"Rendering..."})]})}),e.jsx("iframe",{ref:c,className:"w-full h-full border-0",style:{backgroundColor:"white",opacity:i?1:0,transition:"opacity 0.2s ease-in-out"},src:t,srcDoc:a,onLoad:l,onError:u,sandbox:g,title:"Document preview","aria-label":`Preview of rendered ${W.toLowerCase()}`},a?"srcdoc":"src")]}):null});J.displayName="PreviewFrame";const be=L.memo(J);function je({warnings:r,className:t}){const[a,n]=L.useState(!1);return!r||r.length===0?null:e.jsxs("div",{className:t,children:[e.jsxs("button",{type:"button",onClick:()=>n(!a),className:"flex w-full items-center gap-2 rounded-md border border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-950/50 px-3 py-1.5 text-left transition-colors hover:bg-amber-100 dark:hover:bg-amber-900/50",children:[e.jsx(xe,{className:`h-3.5 w-3.5 text-amber-600 dark:text-amber-400 transition-transform flex-shrink-0 ${a?"rotate-90":""}`}),e.jsx($,{className:"h-3.5 w-3.5 text-amber-500 flex-shrink-0"}),e.jsxs("span",{className:"text-xs font-medium text-amber-700 dark:text-amber-300",children:[r.length," warning",r.length!==1?"s":""]})]}),a&&e.jsx("div",{className:"mt-1.5 space-y-1.5",children:r.map((s,c)=>e.jsxs("div",{className:"flex items-start gap-2 rounded-md border border-amber-100 dark:border-amber-900 bg-white dark:bg-amber-950/30 px-3 py-2",children:[s.severity==="info"?e.jsx(fe,{className:"h-3.5 w-3.5 mt-0.5 text-blue-500 flex-shrink-0"}):e.jsx($,{className:"h-3.5 w-3.5 mt-0.5 text-amber-500 flex-shrink-0"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("code",{className:"text-[11px] font-medium text-amber-700 dark:text-amber-300 bg-amber-50 dark:bg-amber-900/40 px-1 py-0.5 rounded",children:s.component}),s.severity==="info"&&e.jsx("span",{className:"text-[10px] uppercase tracking-wide text-blue-500 font-medium",children:"info"})]}),e.jsx("p",{className:"mt-0.5 text-xs text-gray-600 dark:text-gray-400 leading-relaxed",children:s.message}),s.context&&Object.keys(s.context).length>0&&e.jsxs("details",{className:"mt-1.5",children:[e.jsx("summary",{className:"text-[11px] text-gray-400 dark:text-gray-500 cursor-pointer hover:text-gray-600 dark:hover:text-gray-300",children:"Context"}),e.jsx("pre",{className:"mt-1 text-[11px] bg-gray-50 dark:bg-gray-900/50 p-1.5 rounded overflow-x-auto text-gray-600 dark:text-gray-400",children:JSON.stringify(s.context,null,2)})]})]})]},c))})]})}async function we(r){const t=await ae(()=>import("./docx-preview-CUjVWdSJ.js"),__vite__mapDeps([0,1,2,3])),a=document.createElement("body"),n=document.createElement("head"),s=t.renderAsync(r,a,n,{inWrapper:!0}),c=new Promise((l,u)=>{setTimeout(()=>{u(new Error("DocxJS renderAsync timed out after 10 seconds"))},1e4)});await Promise.race([s,c]);const i=document.createElement("link");i.rel="stylesheet",i.href=`${ne.basePath}/css/preview/docxjs.css`,n.appendChild(i);const o=document.createElement("html");return o.appendChild(n),o.appendChild(a),{iframeSrcDoc:o.outerHTML}}async function ve(r,t){const a=new FormData,n=C==="pptx"?".pptx":".docx";a.append("file",t,`${r}${n}`);const s=await fetch(q.preview.libreoffice,{method:"POST",body:a});if(!s.ok){let o=`LibreOffice preview failed (${s.status})`;try{const l=await s.json();l&&typeof l=="object"&&typeof l.error=="string"&&(o=l.error)}catch{}throw new Error(o)}const c=await s.blob();if(!c.size)throw new Error("LibreOffice preview returned an empty PDF");const i=URL.createObjectURL(c);return{iframeSrc:i,cleanup:()=>URL.revokeObjectURL(i)}}async function Ne(r,t,a=C==="docx"?"docxjs":"LibreOffice",n){try{if(!t||t.size===0)throw new Error("Invalid or empty document blob");let s;return C==="docx"&&a==="docxjs"?s=await we(t):s=await ve(r,t),{status:"success",name:r,payload:s}}catch(s){const c=s instanceof Error?s.message:String(s);return{status:"error",name:r,payload:new Error(c)}}}const I=d.forwardRef(({className:r,value:t,...a},n)=>e.jsx(H,{ref:n,className:S("relative h-4 w-full overflow-hidden rounded-full bg-secondary",r),...a,children:e.jsx(re,{className:"h-full w-full flex-1 bg-primary transition-all",style:{transform:`translateX(-${100-(t||0)}%)`}})}));I.displayName=H.displayName;function K(r){if(r===0)return"0 B";const t=1024,a=["B","KB","MB","GB"],n=Math.floor(Math.log(r)/Math.log(t));return parseFloat((r/Math.pow(t,n)).toFixed(2))+" "+a[n]}function ye(){const[r,t]=d.useState(null),[a,n]=d.useState(!0),[s,c]=d.useState(null);if(d.useEffect(()=>{const l=new AbortController,u=async()=>{try{const f=await fetch(q.cacheStats,{signal:l.signal});if(!f.ok)throw new Error("Failed to fetch cache stats");const w=await f.json();l.signal.aborted||(t(w.data),c(null))}catch(f){l.signal.aborted||(f instanceof Error&&f.name!=="AbortError"?c(f.message):(!(f instanceof Error)||f.name!=="AbortError")&&c("Failed to load cache stats"))}finally{l.signal.aborted||n(!1)}};u();const g=setInterval(u,5e3),h=()=>u();return window.addEventListener("cache:cleared",h),()=>{l.abort(),clearInterval(g),window.removeEventListener("cache:cleared",h)}},[]),a)return e.jsx("div",{className:"flex items-center justify-center p-8",children:e.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-primary"})});if(s)return e.jsxs("div",{className:"text-destructive p-4",children:["Error loading cache metrics: ",s]});if(!r)return null;const{document:i}=r,o=i.hitRate*100;return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-6 text-sm",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Hit Rate"})," ",e.jsxs("span",{className:"font-semibold text-base",children:[o.toFixed(1),"%"]}),e.jsxs("span",{className:"text-muted-foreground ml-1",children:["(",i.hits," hits / ",i.misses," misses)"]})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Size"})," ",e.jsx("span",{className:"font-semibold",children:K(i.size)}),e.jsxs("span",{className:"text-muted-foreground ml-1",children:["(",i.itemCount," items)"]})]}),e.jsx(ie,{variant:i.enabled?"default":"secondary",children:i.enabled?"Enabled":"Disabled"})]}),e.jsx(I,{value:o,className:"h-2","aria-label":"Cache hit rate"}),C==="docx"&&r.components&&e.jsx(Ee,{data:r.components})]})}function Ee({data:r}){return r.componentStats.length===0?null:e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-medium",children:"Module Breakdown"}),e.jsx("div",{className:"space-y-1",children:r.componentStats.map(t=>{const a=(t.hitRate||0)*100,n=t.totalRequests||t.hits+t.misses,s=t.memoryUsage||t.entries*t.avgSize||0;return e.jsxs("div",{className:"px-3 py-1.5 text-sm",children:[e.jsxs("div",{className:"flex items-center justify-between mb-1",children:[e.jsx("span",{className:"font-medium",children:t.type}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsxs("span",{children:[a.toFixed(0),"% hit"]}),e.jsxs("span",{children:[n," req"]}),e.jsx("span",{children:K(s)})]})]}),e.jsx(I,{value:a,className:"h-1.5"})]},t.type)})})]})}const Se=d.memo(function({editTimestamp:t,debounceMs:a}){const[n,s]=d.useState(()=>Math.max(0,t+a-Date.now()));if(d.useEffect(()=>{const o=()=>{const u=Math.max(0,t+a-Date.now());s(u),u<=0&&clearInterval(l)};o();const l=setInterval(o,100);return()=>clearInterval(l)},[t,a]),n<=0)return null;const c=(n/1e3).toFixed(1),i=Math.min(100,n/a*100);return e.jsxs("span",{className:"inline-flex items-center gap-1.5 text-xs text-amber-600 dark:text-amber-400 tabular-nums",children:[e.jsx("span",{className:"h-1 rounded-full bg-amber-500/60 transition-[width] duration-100",style:{width:`${Math.round(i*.4)}px`}}),c,"s"]})});function Ie(){var U,_;const{autoReload:r,renderingLibrary:t,saveDocumentDebounceWait:a,setSettings:n}=B(m=>m),{name:s,text:c,blob:i,isGenerating:o,generationProgress:l,globalError:u,cacheStatus:g,cacheHitRate:h,warnings:f,isRendering:w,isPreviewStale:V,editSequence:X,lastBuiltSequence:Q,editTimestamp:T,setOutput:j}=he(m=>m),b=G(m=>m.activeTab),A=G(m=>m.documentTypes),[v,Y]=d.useState(void 0),[Z,ee]=d.useState(void 0),[se,D]=d.useState(!1),z=L.useRef(null),R=d.useRef(null),M=d.useRef(!1),k=d.useCallback(()=>{R.current&&(R.current(),R.current=null)},[]),N=d.useCallback(async(m,x)=>{j({isRendering:!0,isPreviewStale:!1,globalError:void 0});try{const{status:y,payload:p}=await Ne(m,x,t);if(y!=="success")throw p instanceof Error?p:new Error(String(p));k(),Y(p.iframeSrc||void 0),ee(p.iframeSrcDoc||void 0),R.current=p.cleanup||null}catch(y){const p=y instanceof Error?y.message:String(y);let O=p;p.includes("Failed to fetch")?O="Network error: Unable to load required resources. Check if the server is running properly.":p.includes("timeout")&&(O="Render timeout: The rendering process took too long."),j({globalError:O})}finally{j({isRendering:!1})}},[j,k,t]),te=d.useRef({name:s,blob:i,doRender:N});d.useEffect(()=>{te.current={name:s,blob:i,doRender:N}});const P=d.useCallback(async()=>{M.current=!0,window.dispatchEvent(new CustomEvent("preview:flushAndBuild"))},[]);return d.useEffect(()=>{i&&s&&r&&t==="docxjs"?N(s,i):i&&s&&M.current?(M.current=!1,N(s,i)):i&&s&&j({isPreviewStale:!0})},[i,s,r,t,N,j]),d.useEffect(()=>()=>{k()},[k]),d.useEffect(()=>{const m=()=>P(),x=()=>D(!0);return window.addEventListener("preview:manualRender",m),window.addEventListener("preview:showCacheMetrics",x),()=>{window.removeEventListener("preview:manualRender",m),window.removeEventListener("preview:showCacheMetrics",x)}},[P]),e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex h-full flex-col",children:[B&&((_=(U=B).getState)==null?void 0:_.call(U).useGlobalPreviewHeader)===!1&&e.jsx(oe,{iframeRef:z,displayReloadButton:!!v&&!((v==null?void 0:v.startsWith("blob:"))??!1),name:(s==null?void 0:s.trim())||"Preview",blob:i,autoReload:r,onToggleAutoReload:()=>n({autoReload:!r}),onManualRender:P,isGenerating:o,isRendering:w,onShowCacheMetrics:()=>D(!0),documentText:c,warnings:f,renderingLibrary:t,setRenderingLibrary:m=>n({renderingLibrary:m})}),e.jsx(ce,{}),(()=>{const m=(X??0)>(Q??0),x=(V||m)&&!o&&!w;return(g&&g!=="UNKNOWN"||x)&&e.jsxs("div",{className:`px-3 py-1.5 flex items-center justify-between border-b overflow-hidden ${x?"bg-amber-500/10 border-amber-500/30":"bg-muted/30"}`,children:[e.jsx("div",{className:"flex items-center gap-2 min-w-0 truncate",children:g==="HIT"&&!x?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-1.5 w-1.5 rounded-full bg-green-500 flex-shrink-0"}),e.jsx("span",{className:"text-xs text-muted-foreground truncate",children:"Cached"})]}):g==="MISS"&&!x?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-1.5 w-1.5 rounded-full bg-orange-500 flex-shrink-0"}),e.jsxs("span",{className:"text-xs text-muted-foreground truncate",children:["Fresh ",W.toLowerCase()]})]}):x?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-1.5 w-1.5 rounded-full bg-amber-500 flex-shrink-0"}),e.jsx("span",{className:"text-xs text-amber-600 dark:text-amber-400 truncate",children:"Outdated — click Run"}),T&&m&&!o&&r&&t==="docxjs"&&e.jsx(Se,{editTimestamp:T,debounceMs:a+200})]}):null}),!x&&h&&h!=="0.0%"&&e.jsxs("span",{className:"text-xs text-muted-foreground flex-shrink-0 ml-2",children:[h," hit rate"]})]})})(),e.jsx(je,{warnings:f,className:"mx-3 my-2"}),u&&!o?e.jsx("div",{className:"flex-1 flex items-center justify-center p-6",children:e.jsxs("div",{className:"max-w-md rounded-lg border border-red-400/50 bg-red-400/10 px-4 py-3 text-sm text-red-400",children:[e.jsx("p",{className:"font-medium mb-1",children:"Generation failed"}),e.jsx("p",{className:"text-xs text-red-400/80 break-words",children:u})]})}):e.jsx(be,{ref:z,isLoading:!!w,iframeSrc:v,iframeSrcDoc:Z,isGenerating:(()=>{const m=r&&t==="docxjs",x=b&&s&&b!==s&&A[b]!=="application/json+theme";return!!o||!!(m&&x)})(),generationProgress:(()=>{const m=r&&t==="docxjs",x=b&&s&&b!==s&&A[b]!=="application/json+theme";return m&&x&&!o?{stage:"parsing",message:`Building preview for ${b}...`}:l})()})]}),e.jsx(le,{open:se,onOpenChange:D,children:e.jsxs(de,{className:"max-w-2xl",children:[e.jsx(me,{children:e.jsx(ue,{children:"Cache Performance"})}),e.jsx(ye,{})]})})]})}export{Ie as Preview};
|
|
3
|
+
//# sourceMappingURL=preview-kcqt_5hb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["DocumentGenerationLoader","className","currentStage","message","stages","stageLabels","currentStageIndex","cn","jsxs","jsx","Spinner","stage","index","isActive","isCompleted","PreviewLoading","renderingLibrary","getLibraryInfo","library","name","description","Skeleton","PreviewFrame","React","isLoading","iframeSrc","iframeSrcDoc","isGenerating","generationProgress","ref","iframeLoaded","setIframeLoaded","useState","useEffect","handleIframeLoad","handleIframeError","iframeSandbox","hasContent","FORMAT_LABEL","PreviewFrameMemoized","WarningsPanel","warnings","isExpanded","setIsExpanded","ChevronRight","AlertTriangle","warning","Info","renderDocxWithDocxJS","blob","docx_preview","__vitePreload","bodyEl","headEl","renderPromise","timeoutPromise","_","reject","overrideStyleEl","env","htmlEl","renderWithLibreOffice","formData","ext","FORMAT","response","API_ENDPOINTS","json","pdfBlob","objectUrl","renderDocument","_baseUrl","payload","error","errorMessage","Progress","React.forwardRef","value","props","ProgressPrimitive.Root","ProgressPrimitive.Indicator","formatBytes","bytes","k","sizes","i","CacheMetrics","stats","setStats","loading","setLoading","setError","controller","fetchData","data","err","interval","handleCacheCleared","doc","hitRatePct","Badge","ComponentBreakdown","stat","hitRate","requests","memory","DebounceCountdown","memo","editTimestamp","debounceMs","remaining","setRemaining","tick","r","id","secs","pct","Preview","autoReload","saveDocumentDebounceWait","setSettings","useSettingsStore","state","text","globalError","cacheStatus","cacheHitRate","isRendering","isPreviewStale","editSequence","lastBuiltSequence","setOutput","useOutputStore","activeTab","useDocumentsStore","documentTypes","setIframeSrc","setIframeSrcDoc","showCacheMetrics","setShowCacheMetrics","iframeRef","renderCleanupRef","useRef","pendingManualRenderRef","cleanupRenderedPreview","useCallback","doRender","docName","docBlob","status","displayMessage","manualRenderRef","handleManualRender","onManual","onShowCache","Fragment","_b","_a","PreviewHeaderMemoized","lib","Separator","hasUnsyncedEdits","isStale","willAutoBuild","isSwitchingDoc","Dialog","DialogContent","DialogHeader","DialogTitle"],"ignoreList":[],"sources":["../../../src/client/components/ui/loading-states.tsx","../../../src/client/components/playground/preview-frame.tsx","../../../src/client/components/playground/warnings-panel.tsx","../../../src/client/lib/render.ts","../../../src/client/components/ui/progress.tsx","../../../src/client/components/cache-metrics.tsx","../../../src/client/components/playground/preview.tsx"],"sourcesContent":["import { cn } from '@/lib/utils';\nimport { Spinner } from './spinner';\nimport { Skeleton } from './skeleton';\n\ninterface LoadingOverlayProps {\n isLoading: boolean;\n children: React.ReactNode;\n message?: string;\n className?: string;\n}\n\nexport function LoadingOverlay({\n isLoading,\n children,\n message = 'Loading...',\n className,\n}: LoadingOverlayProps) {\n return (\n <div className={cn('relative', className)}>\n {children}\n {isLoading && (\n <div className=\"absolute inset-0 bg-background/80 backdrop-blur-sm flex items-center justify-center z-50\">\n <div className=\"flex flex-col items-center gap-2\">\n <Spinner size=\"lg\" />\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n\ninterface DocumentGenerationLoaderProps {\n className?: string;\n currentStage?: 'parsing' | 'building' | 'rendering' | 'finalizing';\n message?: string;\n}\n\nexport function DocumentGenerationLoader({\n className,\n currentStage = 'parsing',\n message,\n}: DocumentGenerationLoaderProps) {\n const stages = ['parsing', 'building', 'rendering', 'finalizing'];\n const stageLabels = {\n parsing: 'Validating JSON',\n building: 'Building structure',\n rendering: 'Rendering content',\n finalizing: 'Finalizing document',\n };\n\n const currentStageIndex = stages.indexOf(currentStage);\n\n return (\n <div className={cn('p-6 space-y-4', className)}>\n <div className=\"flex items-center gap-3\">\n <Spinner size=\"md\" />\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium\">Generating Document</p>\n <p className=\"text-xs text-muted-foreground\">\n {message || `${stageLabels[currentStage]}...`}\n </p>\n </div>\n </div>\n\n <div className=\"space-y-3\">\n {stages.map((stage, index) => {\n const isActive = index === currentStageIndex;\n const isCompleted = index < currentStageIndex;\n return (\n <div key={stage} className=\"space-y-2\">\n <div className=\"flex justify-between text-xs\">\n <span\n className={cn(\n isActive\n ? 'text-primary font-medium'\n : isCompleted\n ? 'text-muted-foreground'\n : 'text-muted-foreground/60'\n )}\n >\n {stageLabels[stage as keyof typeof stageLabels]}\n </span>\n <span className=\"text-muted-foreground\">\n {isCompleted ? '✓' : isActive ? '...' : '○'}\n </span>\n </div>\n <div className=\"w-full bg-secondary rounded-full h-1.5\">\n <div\n className={cn(\n 'h-1.5 rounded-full transition-all duration-300',\n isCompleted\n ? 'bg-green-500'\n : isActive\n ? 'bg-primary animate-pulse'\n : 'bg-transparent'\n )}\n style={{ width: isCompleted ? '100%' : isActive ? '100%' : '0%' }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface PreviewLoadingProps {\n renderingLibrary?: string;\n className?: string;\n}\n\nexport function PreviewLoading({\n renderingLibrary,\n className,\n}: PreviewLoadingProps) {\n const getLibraryInfo = (library?: string) => {\n switch (library) {\n case 'LibreOffice':\n return {\n name: 'LibreOffice',\n description: 'Converting PPTX to PDF locally...',\n };\n case 'Office':\n return {\n name: 'Microsoft Office',\n description: 'Uploading file and loading Office viewer...',\n };\n case 'Docs':\n return {\n name: 'Google Docs',\n description: 'Uploading file and loading Docs viewer...',\n };\n default:\n return { name: 'Default', description: 'Processing document...' };\n }\n };\n\n const { name, description } = getLibraryInfo(renderingLibrary);\n\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center h-full p-8 space-y-4',\n className\n )}\n >\n <Spinner size=\"lg\" />\n <div className=\"text-center space-y-2\">\n <p className=\"text-sm font-medium\">Rendering Preview</p>\n <p className=\"text-xs text-muted-foreground\">Using {name} renderer</p>\n <p className=\"text-xs text-muted-foreground/80\">{description}</p>\n </div>\n\n <div className=\"w-full max-w-md space-y-3\">\n <Skeleton className=\"h-16 w-full\" />\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n <Skeleton className=\"h-12 w-full\" />\n </div>\n </div>\n );\n}\n\ninterface InlineLoaderProps {\n message?: string;\n size?: 'sm' | 'md';\n className?: string;\n}\n\nexport function InlineLoader({\n message = 'Loading...',\n size = 'sm',\n className,\n}: InlineLoaderProps) {\n return (\n <div className={cn('flex items-center gap-2', className)}>\n <Spinner size={size} />\n <span className=\"text-sm text-muted-foreground\">{message}</span>\n </div>\n );\n}\n\ninterface FileOperationLoaderProps {\n operation: 'upload' | 'download' | 'save' | 'delete';\n fileName?: string;\n progress?: number;\n className?: string;\n}\n\nexport function FileOperationLoader({\n operation,\n fileName,\n progress,\n className,\n}: FileOperationLoaderProps) {\n const operationLabels = {\n upload: 'Uploading',\n download: 'Downloading',\n save: 'Saving',\n delete: 'Deleting',\n };\n\n return (\n <div\n className={cn(\n 'flex items-center gap-3 p-3 border rounded-lg bg-muted/50',\n className\n )}\n >\n <Spinner size=\"sm\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">\n {operationLabels[operation]} {fileName && `\"${fileName}\"`}\n </p>\n {progress !== undefined && (\n <div className=\"mt-1\">\n <div className=\"flex justify-between text-xs mb-1\">\n <span>{progress}%</span>\n <span className=\"text-muted-foreground\">\n {progress < 100 ? 'In progress...' : 'Complete'}\n </span>\n </div>\n <div className=\"w-full bg-secondary rounded-full h-1.5\">\n <div\n className=\"bg-primary h-1.5 rounded-full transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { DocumentGenerationLoader, PreviewLoading } from '../ui/loading-states';\nimport { Spinner } from '../ui/spinner';\nimport { FORMAT_LABEL } from '../../lib/env';\n\nconst PreviewFrame = React.forwardRef<\n HTMLIFrameElement,\n {\n isLoading: boolean;\n iframeSrc?: string;\n iframeSrcDoc?: string;\n isGenerating?: boolean;\n generationProgress?: {\n stage: 'parsing' | 'building' | 'rendering' | 'finalizing';\n message?: string;\n };\n }\n>(\n (\n {\n isLoading,\n iframeSrc,\n iframeSrcDoc,\n isGenerating,\n generationProgress,\n },\n ref\n ) => {\n const [iframeLoaded, setIframeLoaded] = useState(false);\n\n // Reset iframe loaded state when content changes\n useEffect(() => {\n setIframeLoaded(false);\n }, [iframeSrc, iframeSrcDoc]);\n\n // Handle iframe load event\n const handleIframeLoad = () => {\n setIframeLoaded(true);\n };\n\n // Handle iframe errors\n const handleIframeError = () => {\n console.warn('Iframe failed to load content');\n setIframeLoaded(false);\n };\n\n // PDF blob URLs and remote viewers can be blocked by Chromium-based browsers\n // when loaded in a sandboxed iframe. Keep sandbox only for srcDoc-based preview.\n const iframeSandbox = iframeSrcDoc\n ? 'allow-scripts allow-popups allow-forms'\n : undefined;\n\n const hasContent = Boolean(iframeSrc || iframeSrcDoc);\n\n // Full-screen loaders only when no existing content\n if (isGenerating && !hasContent) {\n return (\n <div className=\"grow\">\n <DocumentGenerationLoader\n currentStage={generationProgress?.stage}\n message={generationProgress?.message}\n />\n </div>\n );\n }\n\n if (isLoading && !hasContent) {\n return (\n <div className=\"grow\">\n <PreviewLoading renderingLibrary=\"LibreOffice\" />\n </div>\n );\n }\n\n if (hasContent) {\n return (\n <div className=\"h-full w-full relative bg-white\">\n {/* Loading overlay */}\n {!iframeLoaded && (\n <div className=\"absolute inset-0 bg-muted/80 flex items-center justify-center z-10\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-foreground mx-auto mb-2\"></div>\n <p className=\"text-sm text-muted-foreground\">\n Loading preview...\n </p>\n </div>\n </div>\n )}\n {/* Generating/Rendering overlay on top of existing content */}\n {(isGenerating || isLoading) && (\n <div className=\"absolute inset-0 bg-background/60 backdrop-blur-[2px] flex items-center justify-center z-20 transition-opacity duration-200\">\n <div className=\"flex flex-col items-center gap-2\">\n <Spinner size=\"lg\" />\n <p className=\"text-sm text-muted-foreground\">\n {isGenerating ? 'Generating...' : 'Rendering...'}\n </p>\n </div>\n </div>\n )}\n {/* Key forces remount when switching between srcDoc (sandboxed) and\n src (blob URL, no sandbox) to avoid stale sandbox race condition */}\n <iframe\n key={iframeSrcDoc ? 'srcdoc' : 'src'}\n ref={ref}\n className=\"w-full h-full border-0\"\n style={{\n backgroundColor: 'white',\n // Fade in after load to prevent flash\n opacity: iframeLoaded ? 1 : 0,\n transition: 'opacity 0.2s ease-in-out',\n }}\n src={iframeSrc}\n srcDoc={iframeSrcDoc}\n onLoad={handleIframeLoad}\n onError={handleIframeError}\n // Security: sandbox srcDoc to prevent XSS from rendered HTML.\n // Blob URLs (src) must NOT be sandboxed without allow-same-origin.\n sandbox={iframeSandbox}\n // Accessibility\n title=\"Document preview\"\n aria-label={`Preview of rendered ${FORMAT_LABEL.toLowerCase()}`}\n />\n </div>\n );\n }\n return null;\n }\n);\n\nPreviewFrame.displayName = 'PreviewFrame';\nexport const PreviewFrameMemoized = React.memo(PreviewFrame);\n","import React from 'react';\nimport { AlertTriangle, Info, ChevronRight } from 'lucide-react';\nimport type { GenerationWarning } from '../../store/output-store';\n\ninterface WarningsPanelProps {\n warnings: GenerationWarning[] | null | undefined;\n className?: string;\n}\n\nexport function WarningsPanel({ warnings, className }: WarningsPanelProps) {\n const [isExpanded, setIsExpanded] = React.useState(false);\n\n if (!warnings || warnings.length === 0) {\n return null;\n }\n\n return (\n <div className={className}>\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"flex w-full items-center gap-2 rounded-md border border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-950/50 px-3 py-1.5 text-left transition-colors hover:bg-amber-100 dark:hover:bg-amber-900/50\"\n >\n <ChevronRight\n className={`h-3.5 w-3.5 text-amber-600 dark:text-amber-400 transition-transform flex-shrink-0 ${isExpanded ? 'rotate-90' : ''}`}\n />\n <AlertTriangle className=\"h-3.5 w-3.5 text-amber-500 flex-shrink-0\" />\n <span className=\"text-xs font-medium text-amber-700 dark:text-amber-300\">\n {warnings.length} warning{warnings.length !== 1 ? 's' : ''}\n </span>\n </button>\n\n {isExpanded && (\n <div className=\"mt-1.5 space-y-1.5\">\n {warnings.map((warning, index) => (\n <div\n key={index}\n className=\"flex items-start gap-2 rounded-md border border-amber-100 dark:border-amber-900 bg-white dark:bg-amber-950/30 px-3 py-2\"\n >\n {warning.severity === 'info' ? (\n <Info className=\"h-3.5 w-3.5 mt-0.5 text-blue-500 flex-shrink-0\" />\n ) : (\n <AlertTriangle className=\"h-3.5 w-3.5 mt-0.5 text-amber-500 flex-shrink-0\" />\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n <code className=\"text-[11px] font-medium text-amber-700 dark:text-amber-300 bg-amber-50 dark:bg-amber-900/40 px-1 py-0.5 rounded\">\n {warning.component}\n </code>\n {warning.severity === 'info' && (\n <span className=\"text-[10px] uppercase tracking-wide text-blue-500 font-medium\">\n info\n </span>\n )}\n </div>\n <p className=\"mt-0.5 text-xs text-gray-600 dark:text-gray-400 leading-relaxed\">\n {warning.message}\n </p>\n {warning.context && Object.keys(warning.context).length > 0 && (\n <details className=\"mt-1.5\">\n <summary className=\"text-[11px] text-gray-400 dark:text-gray-500 cursor-pointer hover:text-gray-600 dark:hover:text-gray-300\">\n Context\n </summary>\n <pre className=\"mt-1 text-[11px] bg-gray-50 dark:bg-gray-900/50 p-1.5 rounded overflow-x-auto text-gray-600 dark:text-gray-400\">\n {JSON.stringify(warning.context, null, 2)}\n </pre>\n </details>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { FORMAT } from './env';\nimport { API_ENDPOINTS } from '../config/api';\nimport { env } from './env';\n\nexport type RenderPayload = {\n iframeSrc?: string;\n iframeSrcDoc?: string;\n cleanup?: () => void;\n};\n\nasync function renderDocxWithDocxJS(blob: Blob): Promise<RenderPayload> {\n const docx_preview = await import('docx-preview');\n\n const bodyEl = document.createElement('body');\n const headEl = document.createElement('head');\n\n const renderPromise = docx_preview.renderAsync(blob, bodyEl, headEl, {\n inWrapper: true,\n });\n\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error('DocxJS renderAsync timed out after 10 seconds'));\n }, 10000);\n });\n\n await Promise.race([renderPromise, timeoutPromise]);\n\n const overrideStyleEl = document.createElement('link');\n overrideStyleEl.rel = 'stylesheet';\n overrideStyleEl.href = `${env.basePath}/css/preview/docxjs.css`;\n headEl.appendChild(overrideStyleEl);\n\n const htmlEl = document.createElement('html');\n htmlEl.appendChild(headEl);\n htmlEl.appendChild(bodyEl);\n\n return {\n iframeSrcDoc: htmlEl.outerHTML,\n };\n}\n\nasync function renderWithLibreOffice(\n name: string,\n blob: Blob\n): Promise<RenderPayload> {\n const formData = new FormData();\n const ext = FORMAT === 'pptx' ? '.pptx' : '.docx';\n formData.append('file', blob, `${name}${ext}`);\n\n const response = await fetch(API_ENDPOINTS.preview.libreoffice, {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n let message = `LibreOffice preview failed (${response.status})`;\n try {\n const json = await response.json();\n if (json && typeof json === 'object' && typeof json.error === 'string') {\n message = json.error;\n }\n } catch {}\n throw new Error(message);\n }\n\n const pdfBlob = await response.blob();\n if (!pdfBlob.size) {\n throw new Error('LibreOffice preview returned an empty PDF');\n }\n\n const objectUrl = URL.createObjectURL(pdfBlob);\n return {\n iframeSrc: objectUrl,\n cleanup: () => URL.revokeObjectURL(objectUrl),\n };\n}\n\nexport function cleanupIframe(iframe: HTMLIFrameElement) {\n try {\n if (iframe.contentWindow) {\n iframe.contentWindow.location.replace('about:blank');\n }\n iframe.src = 'about:blank';\n iframe.srcdoc = '';\n if (iframe.parentNode) {\n iframe.parentNode.removeChild(iframe);\n }\n } catch (error) {\n console.warn('Error cleaning up iframe:', error);\n }\n}\n\nexport type RenderLibrary = 'docxjs' | 'LibreOffice';\n\nexport async function renderDocument(\n name: string,\n blob: Blob,\n library: RenderLibrary = FORMAT === 'docx' ? 'docxjs' : 'LibreOffice',\n _baseUrl?: string,\n) {\n try {\n if (!blob || blob.size === 0) {\n throw new Error('Invalid or empty document blob');\n }\n\n let payload: RenderPayload;\n\n if (FORMAT === 'docx' && library === 'docxjs') {\n payload = await renderDocxWithDocxJS(blob);\n } else {\n payload = await renderWithLibreOffice(name, blob);\n }\n\n return { status: 'success' as const, name, payload };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return { status: 'error' as const, name, payload: new Error(errorMessage) };\n }\n}\n\n// Keep backward compat exports for pptx code\nexport const renderPptx = (name: string, blob: Blob, baseUrl: string) =>\n renderDocument(name, blob, 'LibreOffice', baseUrl);\n","import * as React from 'react';\nimport * as ProgressPrimitive from '@radix-ui/react-progress';\nimport { cn } from '../../lib/utils';\n\nconst Progress = React.forwardRef<\n React.ElementRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\n className={cn(\n 'relative h-4 w-full overflow-hidden rounded-full bg-secondary',\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n));\nProgress.displayName = ProgressPrimitive.Root.displayName;\n\nexport { Progress };\n","import { useEffect, useState } from 'react';\nimport { Badge } from './ui/badge';\nimport { Progress } from './ui/progress';\nimport { API_ENDPOINTS } from '../config/api';\nimport { FORMAT } from '../lib/env';\n\ninterface CacheStats {\n document: {\n hits: number;\n misses: number;\n hitRate: number;\n size: number;\n itemCount: number;\n enabled: boolean;\n };\n components?: ComponentCacheData;\n}\n\ninterface ComponentStatistics {\n type: string;\n hits: number;\n misses: number;\n avgProcessTime: number;\n avgSize: number;\n entries: number;\n hitRate?: number;\n totalRequests?: number;\n memoryUsage?: number;\n}\n\ninterface ComponentCacheData {\n entries: number;\n totalSize: number;\n hitRate: number;\n totalHits: number;\n totalMisses: number;\n avgResponseTime: number;\n evictions: number;\n componentStats: ComponentStatistics[];\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nexport function CacheMetrics() {\n const [stats, setStats] = useState<CacheStats | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const controller = new AbortController();\n\n const fetchData = async () => {\n try {\n const response = await fetch(API_ENDPOINTS.cacheStats, {\n signal: controller.signal,\n });\n if (!response.ok) throw new Error('Failed to fetch cache stats');\n const data = await response.json();\n\n if (!controller.signal.aborted) {\n setStats(data.data);\n setError(null);\n }\n } catch (err) {\n if (!controller.signal.aborted) {\n if (err instanceof Error && err.name !== 'AbortError') {\n setError(err.message);\n } else if (!(err instanceof Error) || err.name !== 'AbortError') {\n setError('Failed to load cache stats');\n }\n }\n } finally {\n if (!controller.signal.aborted) setLoading(false);\n }\n };\n\n fetchData();\n const interval = setInterval(fetchData, 5000);\n\n const handleCacheCleared = () => fetchData();\n window.addEventListener('cache:cleared', handleCacheCleared);\n\n return () => {\n controller.abort();\n clearInterval(interval);\n window.removeEventListener('cache:cleared', handleCacheCleared);\n };\n }, []);\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"text-destructive p-4\">\n Error loading cache metrics: {error}\n </div>\n );\n }\n\n if (!stats) return null;\n\n const { document: doc } = stats;\n const hitRatePct = doc.hitRate * 100;\n\n return (\n <div className=\"space-y-4\">\n {/* Summary row */}\n <div className=\"flex items-center gap-6 text-sm\">\n <div>\n <span className=\"text-muted-foreground\">Hit Rate</span>{' '}\n <span className=\"font-semibold text-base\">{hitRatePct.toFixed(1)}%</span>\n <span className=\"text-muted-foreground ml-1\">\n ({doc.hits} hits / {doc.misses} misses)\n </span>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Size</span>{' '}\n <span className=\"font-semibold\">{formatBytes(doc.size)}</span>\n <span className=\"text-muted-foreground ml-1\">\n ({doc.itemCount} items)\n </span>\n </div>\n <Badge variant={doc.enabled ? 'default' : 'secondary'}>\n {doc.enabled ? 'Enabled' : 'Disabled'}\n </Badge>\n </div>\n\n <Progress value={hitRatePct} className=\"h-2\" aria-label=\"Cache hit rate\" />\n\n {/* Module-level breakdown (docx only) */}\n {FORMAT === 'docx' && stats.components && (\n <ComponentBreakdown data={stats.components} />\n )}\n </div>\n );\n}\n\nfunction ComponentBreakdown({ data }: { data: ComponentCacheData }) {\n if (data.componentStats.length === 0) return null;\n\n return (\n <div className=\"space-y-2\">\n <h4 className=\"text-sm font-medium\">Module Breakdown</h4>\n <div className=\"space-y-1\">\n {data.componentStats.map((stat) => {\n const hitRate = (stat.hitRate || 0) * 100;\n const requests = stat.totalRequests || stat.hits + stat.misses;\n const memory = stat.memoryUsage || stat.entries * stat.avgSize || 0;\n\n return (\n <div key={stat.type} className=\"px-3 py-1.5 text-sm\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"font-medium\">{stat.type}</span>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span>{hitRate.toFixed(0)}% hit</span>\n <span>{requests} req</span>\n <span>{formatBytes(memory)}</span>\n </div>\n </div>\n <Progress value={hitRate} className=\"h-1.5\" />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n memo,\n} from 'react';\nimport { PreviewFrameMemoized } from './preview-frame';\nimport { PreviewHeaderMemoized } from './preview-header';\nimport { WarningsPanel } from './warnings-panel';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog';\nimport { Separator } from '../ui/separator';\nimport { useOutputStore } from '../../store/output-store-provider';\nimport { useSettingsStore } from '../../store/settings-store-provider';\nimport { renderDocument } from '../../lib/render';\nimport { useDocumentsStore } from '../../store/documents-store-provider';\nimport { CacheMetrics } from '../cache-metrics';\nimport { FORMAT_LABEL } from '../../lib/env';\n\n\n/**\n * Tiny live countdown that ticks every 100ms and shows the\n * remaining debounce time before generation starts.\n * Renders nothing once the deadline is reached.\n */\nconst DebounceCountdown = memo(function DebounceCountdown({\n editTimestamp,\n debounceMs,\n}: {\n editTimestamp: number;\n debounceMs: number;\n}) {\n const [remaining, setRemaining] = useState(() =>\n Math.max(0, editTimestamp + debounceMs - Date.now())\n );\n\n useEffect(() => {\n const tick = () => {\n const r = Math.max(0, editTimestamp + debounceMs - Date.now());\n setRemaining(r);\n if (r <= 0) clearInterval(id);\n };\n tick();\n const id = setInterval(tick, 100);\n return () => clearInterval(id);\n }, [editTimestamp, debounceMs]);\n\n if (remaining <= 0) return null;\n\n const secs = (remaining / 1000).toFixed(1);\n const pct = Math.min(100, (remaining / debounceMs) * 100);\n\n return (\n <span className=\"inline-flex items-center gap-1.5 text-xs text-amber-600 dark:text-amber-400 tabular-nums\">\n <span\n className=\"h-1 rounded-full bg-amber-500/60 transition-[width] duration-100\"\n style={{ width: `${Math.round(pct * 0.4)}px` }}\n />\n {secs}s\n </span>\n );\n});\n\nexport function Preview() {\n const { autoReload, renderingLibrary, saveDocumentDebounceWait, setSettings } = useSettingsStore((state) => state);\n const {\n name,\n text,\n blob,\n isGenerating,\n generationProgress,\n globalError,\n cacheStatus,\n cacheHitRate,\n warnings,\n isRendering,\n isPreviewStale,\n editSequence,\n lastBuiltSequence,\n editTimestamp,\n setOutput,\n } = useOutputStore((state) => state);\n const activeTab = useDocumentsStore((state) => state.activeTab);\n const documentTypes = useDocumentsStore((state) => state.documentTypes);\n\n const [iframeSrc, setIframeSrc] = useState<string | undefined>(undefined);\n const [iframeSrcDoc, setIframeSrcDoc] = useState<string | undefined>(\n undefined\n );\n const [showCacheMetrics, setShowCacheMetrics] = useState<boolean>(false);\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n\n const renderCleanupRef = useRef<(() => void) | null>(null);\n const pendingManualRenderRef = useRef(false);\n\n const cleanupRenderedPreview = useCallback(() => {\n if (renderCleanupRef.current) {\n renderCleanupRef.current();\n renderCleanupRef.current = null;\n }\n }, []);\n\n\n // Core render function\n const doRender = useCallback(\n async (docName: string, docBlob: Blob) => {\n setOutput({ isRendering: true, isPreviewStale: false, globalError: undefined });\n\n try {\n const { status, payload } = await renderDocument(\n docName,\n docBlob,\n renderingLibrary,\n );\n\n if (status !== 'success') {\n throw payload instanceof Error ? payload : new Error(String(payload));\n }\n\n cleanupRenderedPreview();\n setIframeSrc(payload.iframeSrc || undefined);\n setIframeSrcDoc(payload.iframeSrcDoc || undefined);\n renderCleanupRef.current = payload.cleanup || null;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n let displayMessage = errorMessage;\n if (errorMessage.includes('Failed to fetch')) {\n displayMessage =\n 'Network error: Unable to load required resources. Check if the server is running properly.';\n } else if (errorMessage.includes('timeout')) {\n displayMessage =\n 'Render timeout: The rendering process took too long.';\n }\n\n setOutput({ globalError: displayMessage });\n } finally {\n setOutput({ isRendering: false });\n }\n },\n [setOutput, cleanupRenderedPreview, renderingLibrary]\n );\n\n // Ref to always hold latest manual-render deps so the event listener never goes stale\n const manualRenderRef = useRef({ name, blob, doRender });\n useEffect(() => {\n manualRenderRef.current = { name, blob, doRender };\n });\n\n const handleManualRender = useCallback(async () => {\n // Set flag so blob-change effect renders the new blob when it arrives\n pendingManualRenderRef.current = true;\n // Flush debounces + trigger build via editor.tsx\n window.dispatchEvent(new CustomEvent('preview:flushAndBuild'));\n }, []); // stable — reads from ref\n\n // Auto-render when blob changes and docxjs + autoReload are active\n // Mark preview stale when blob changes but auto-render is OFF\n // Also render if a manual Run triggered the build (pendingManualRenderRef)\n useEffect(() => {\n if (blob && name && autoReload && renderingLibrary === 'docxjs') {\n doRender(name, blob);\n } else if (blob && name && pendingManualRenderRef.current) {\n pendingManualRenderRef.current = false;\n doRender(name, blob);\n } else if (blob && name) {\n setOutput({ isPreviewStale: true });\n }\n }, [blob, name, autoReload, renderingLibrary, doRender, setOutput]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanupRenderedPreview();\n };\n }, [cleanupRenderedPreview]);\n\n // Listen for global header events (stable — handleManualRender never changes)\n useEffect(() => {\n const onManual = () => handleManualRender();\n const onShowCache = () => setShowCacheMetrics(true);\n\n window.addEventListener('preview:manualRender', onManual);\n window.addEventListener('preview:showCacheMetrics', onShowCache);\n return () => {\n window.removeEventListener('preview:manualRender', onManual);\n window.removeEventListener('preview:showCacheMetrics', onShowCache);\n };\n }, [handleManualRender]);\n\n return (\n <>\n <div className=\"flex h-full flex-col\">\n {(useSettingsStore as any) &&\n (useSettingsStore as any).getState?.().useGlobalPreviewHeader ===\n false && (\n <PreviewHeaderMemoized\n iframeRef={iframeRef}\n displayReloadButton={\n Boolean(iframeSrc) && !(iframeSrc?.startsWith('blob:') ?? false)\n }\n name={name?.trim() || 'Preview'}\n blob={blob}\n autoReload={autoReload}\n onToggleAutoReload={() => setSettings({ autoReload: !autoReload })}\n onManualRender={handleManualRender}\n isGenerating={isGenerating}\n isRendering={isRendering}\n onShowCacheMetrics={() => setShowCacheMetrics(true)}\n documentText={text}\n warnings={warnings}\n renderingLibrary={renderingLibrary}\n setRenderingLibrary={(lib) => setSettings({ renderingLibrary: lib } as any)}\n />\n )}\n <Separator />\n {/* Status Bar: cache + stale combined */}\n {(() => {\n const hasUnsyncedEdits = (editSequence ?? 0) > (lastBuiltSequence ?? 0);\n const isStale = (isPreviewStale || hasUnsyncedEdits) && !isGenerating && !isRendering;\n return ((cacheStatus && cacheStatus !== 'UNKNOWN') || isStale) && (\n <div className={\n `px-3 py-1.5 flex items-center justify-between border-b overflow-hidden ${\n isStale\n ? 'bg-amber-500/10 border-amber-500/30'\n : 'bg-muted/30'\n }`\n }>\n <div className=\"flex items-center gap-2 min-w-0 truncate\">\n {cacheStatus === 'HIT' && !isStale ? (\n <>\n <div className=\"h-1.5 w-1.5 rounded-full bg-green-500 flex-shrink-0\" />\n <span className=\"text-xs text-muted-foreground truncate\">Cached</span>\n </>\n ) : cacheStatus === 'MISS' && !isStale ? (\n <>\n <div className=\"h-1.5 w-1.5 rounded-full bg-orange-500 flex-shrink-0\" />\n <span className=\"text-xs text-muted-foreground truncate\">Fresh {FORMAT_LABEL.toLowerCase()}</span>\n </>\n ) : isStale ? (\n <>\n <div className=\"h-1.5 w-1.5 rounded-full bg-amber-500 flex-shrink-0\" />\n <span className=\"text-xs text-amber-600 dark:text-amber-400 truncate\">Outdated — click Run</span>\n {editTimestamp && hasUnsyncedEdits && !isGenerating && autoReload && renderingLibrary === 'docxjs' && (\n <DebounceCountdown\n editTimestamp={editTimestamp}\n debounceMs={saveDocumentDebounceWait + 200}\n />\n )}\n </>\n ) : null}\n </div>\n {!isStale && cacheHitRate && cacheHitRate !== '0.0%' && (\n <span className=\"text-xs text-muted-foreground flex-shrink-0 ml-2\">{cacheHitRate} hit rate</span>\n )}\n </div>\n );\n })()}\n {/* Warnings Panel */}\n <WarningsPanel warnings={warnings} className=\"mx-3 my-2\" />\n {/* Generation Error — centered in preview area */}\n {globalError && !isGenerating ? (\n <div className=\"flex-1 flex items-center justify-center p-6\">\n <div className=\"max-w-md rounded-lg border border-red-400/50 bg-red-400/10 px-4 py-3 text-sm text-red-400\">\n <p className=\"font-medium mb-1\">Generation failed</p>\n <p className=\"text-xs text-red-400/80 break-words\">{globalError}</p>\n </div>\n </div>\n ) : (\n <PreviewFrameMemoized\n ref={iframeRef}\n isLoading={Boolean(isRendering)}\n iframeSrc={iframeSrc}\n iframeSrcDoc={iframeSrcDoc}\n isGenerating={(() => {\n const willAutoBuild = autoReload && renderingLibrary === 'docxjs';\n const isSwitchingDoc = activeTab && name && activeTab !== name &&\n documentTypes[activeTab] !== 'application/json+theme';\n return Boolean(isGenerating) || Boolean(willAutoBuild && isSwitchingDoc);\n })()}\n generationProgress={(() => {\n const willAutoBuild = autoReload && renderingLibrary === 'docxjs';\n const isSwitchingDoc = activeTab && name && activeTab !== name &&\n documentTypes[activeTab] !== 'application/json+theme';\n return willAutoBuild && isSwitchingDoc && !isGenerating\n ? { stage: 'parsing' as const, message: `Building preview for ${activeTab}...` }\n : generationProgress;\n })()}\n />\n )}\n </div>\n\n {/* Cache Metrics Dialog */}\n <Dialog open={showCacheMetrics} onOpenChange={setShowCacheMetrics}>\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle>Cache Performance</DialogTitle>\n </DialogHeader>\n <CacheMetrics />\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"file":"assets/preview-38guLS86.js"}
|
|
1
|
+
{"version":3,"mappings":"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","names":["DocumentGenerationLoader","className","currentStage","message","stages","stageLabels","currentStageIndex","cn","jsxs","jsx","Spinner","stage","index","isActive","isCompleted","PreviewLoading","renderingLibrary","getLibraryInfo","library","name","description","Skeleton","PreviewFrame","React","isLoading","iframeSrc","iframeSrcDoc","isGenerating","generationProgress","ref","iframeLoaded","setIframeLoaded","useState","useEffect","handleIframeLoad","handleIframeError","iframeSandbox","hasContent","FORMAT_LABEL","PreviewFrameMemoized","WarningsPanel","warnings","isExpanded","setIsExpanded","ChevronRight","AlertTriangle","warning","Info","renderDocxWithDocxJS","blob","docx_preview","__vitePreload","bodyEl","headEl","renderPromise","timeoutPromise","_","reject","overrideStyleEl","env","htmlEl","renderWithLibreOffice","formData","ext","FORMAT","response","API_ENDPOINTS","json","pdfBlob","objectUrl","renderDocument","_baseUrl","payload","error","errorMessage","Progress","React.forwardRef","value","props","ProgressPrimitive.Root","ProgressPrimitive.Indicator","formatBytes","bytes","k","sizes","i","CacheMetrics","stats","setStats","loading","setLoading","setError","controller","fetchData","data","err","interval","handleCacheCleared","doc","hitRatePct","Badge","ComponentBreakdown","stat","hitRate","requests","memory","DebounceCountdown","memo","editTimestamp","debounceMs","remaining","setRemaining","tick","r","id","secs","pct","Preview","autoReload","saveDocumentDebounceWait","setSettings","useSettingsStore","state","text","globalError","cacheStatus","cacheHitRate","isRendering","isPreviewStale","editSequence","lastBuiltSequence","setOutput","useOutputStore","activeTab","useDocumentsStore","documentTypes","setIframeSrc","setIframeSrcDoc","showCacheMetrics","setShowCacheMetrics","iframeRef","renderCleanupRef","useRef","pendingManualRenderRef","cleanupRenderedPreview","useCallback","doRender","docName","docBlob","status","displayMessage","manualRenderRef","handleManualRender","onManual","onShowCache","Fragment","_b","_a","PreviewHeaderMemoized","lib","Separator","hasUnsyncedEdits","isStale","willAutoBuild","isSwitchingDoc","Dialog","DialogContent","DialogHeader","DialogTitle"],"ignoreList":[],"sources":["../../../src/client/components/ui/loading-states.tsx","../../../src/client/components/playground/preview-frame.tsx","../../../src/client/components/playground/warnings-panel.tsx","../../../src/client/lib/render.ts","../../../src/client/components/ui/progress.tsx","../../../src/client/components/cache-metrics.tsx","../../../src/client/components/playground/preview.tsx"],"sourcesContent":["import { cn } from '@/lib/utils';\nimport { Spinner } from './spinner';\nimport { Skeleton } from './skeleton';\n\ninterface LoadingOverlayProps {\n isLoading: boolean;\n children: React.ReactNode;\n message?: string;\n className?: string;\n}\n\nexport function LoadingOverlay({\n isLoading,\n children,\n message = 'Loading...',\n className,\n}: LoadingOverlayProps) {\n return (\n <div className={cn('relative', className)}>\n {children}\n {isLoading && (\n <div className=\"absolute inset-0 bg-background/80 backdrop-blur-sm flex items-center justify-center z-50\">\n <div className=\"flex flex-col items-center gap-2\">\n <Spinner size=\"lg\" />\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n\ninterface DocumentGenerationLoaderProps {\n className?: string;\n currentStage?: 'parsing' | 'building' | 'rendering' | 'finalizing';\n message?: string;\n}\n\nexport function DocumentGenerationLoader({\n className,\n currentStage = 'parsing',\n message,\n}: DocumentGenerationLoaderProps) {\n const stages = ['parsing', 'building', 'rendering', 'finalizing'];\n const stageLabels = {\n parsing: 'Validating JSON',\n building: 'Building structure',\n rendering: 'Rendering content',\n finalizing: 'Finalizing document',\n };\n\n const currentStageIndex = stages.indexOf(currentStage);\n\n return (\n <div className={cn('p-6 space-y-4', className)}>\n <div className=\"flex items-center gap-3\">\n <Spinner size=\"md\" />\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium\">Generating Document</p>\n <p className=\"text-xs text-muted-foreground\">\n {message || `${stageLabels[currentStage]}...`}\n </p>\n </div>\n </div>\n\n <div className=\"space-y-3\">\n {stages.map((stage, index) => {\n const isActive = index === currentStageIndex;\n const isCompleted = index < currentStageIndex;\n return (\n <div key={stage} className=\"space-y-2\">\n <div className=\"flex justify-between text-xs\">\n <span\n className={cn(\n isActive\n ? 'text-primary font-medium'\n : isCompleted\n ? 'text-muted-foreground'\n : 'text-muted-foreground/60'\n )}\n >\n {stageLabels[stage as keyof typeof stageLabels]}\n </span>\n <span className=\"text-muted-foreground\">\n {isCompleted ? '✓' : isActive ? '...' : '○'}\n </span>\n </div>\n <div className=\"w-full bg-secondary rounded-full h-1.5\">\n <div\n className={cn(\n 'h-1.5 rounded-full transition-all duration-300',\n isCompleted\n ? 'bg-green-500'\n : isActive\n ? 'bg-primary animate-pulse'\n : 'bg-transparent'\n )}\n style={{ width: isCompleted ? '100%' : isActive ? '100%' : '0%' }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface PreviewLoadingProps {\n renderingLibrary?: string;\n className?: string;\n}\n\nexport function PreviewLoading({\n renderingLibrary,\n className,\n}: PreviewLoadingProps) {\n const getLibraryInfo = (library?: string) => {\n switch (library) {\n case 'LibreOffice':\n return {\n name: 'LibreOffice',\n description: 'Converting PPTX to PDF locally...',\n };\n case 'Office':\n return {\n name: 'Microsoft Office',\n description: 'Uploading file and loading Office viewer...',\n };\n case 'Docs':\n return {\n name: 'Google Docs',\n description: 'Uploading file and loading Docs viewer...',\n };\n default:\n return { name: 'Default', description: 'Processing document...' };\n }\n };\n\n const { name, description } = getLibraryInfo(renderingLibrary);\n\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center h-full p-8 space-y-4',\n className\n )}\n >\n <Spinner size=\"lg\" />\n <div className=\"text-center space-y-2\">\n <p className=\"text-sm font-medium\">Rendering Preview</p>\n <p className=\"text-xs text-muted-foreground\">Using {name} renderer</p>\n <p className=\"text-xs text-muted-foreground/80\">{description}</p>\n </div>\n\n <div className=\"w-full max-w-md space-y-3\">\n <Skeleton className=\"h-16 w-full\" />\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n <Skeleton className=\"h-12 w-full\" />\n </div>\n </div>\n );\n}\n\ninterface InlineLoaderProps {\n message?: string;\n size?: 'sm' | 'md';\n className?: string;\n}\n\nexport function InlineLoader({\n message = 'Loading...',\n size = 'sm',\n className,\n}: InlineLoaderProps) {\n return (\n <div className={cn('flex items-center gap-2', className)}>\n <Spinner size={size} />\n <span className=\"text-sm text-muted-foreground\">{message}</span>\n </div>\n );\n}\n\ninterface FileOperationLoaderProps {\n operation: 'upload' | 'download' | 'save' | 'delete';\n fileName?: string;\n progress?: number;\n className?: string;\n}\n\nexport function FileOperationLoader({\n operation,\n fileName,\n progress,\n className,\n}: FileOperationLoaderProps) {\n const operationLabels = {\n upload: 'Uploading',\n download: 'Downloading',\n save: 'Saving',\n delete: 'Deleting',\n };\n\n return (\n <div\n className={cn(\n 'flex items-center gap-3 p-3 border rounded-lg bg-muted/50',\n className\n )}\n >\n <Spinner size=\"sm\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">\n {operationLabels[operation]} {fileName && `\"${fileName}\"`}\n </p>\n {progress !== undefined && (\n <div className=\"mt-1\">\n <div className=\"flex justify-between text-xs mb-1\">\n <span>{progress}%</span>\n <span className=\"text-muted-foreground\">\n {progress < 100 ? 'In progress...' : 'Complete'}\n </span>\n </div>\n <div className=\"w-full bg-secondary rounded-full h-1.5\">\n <div\n className=\"bg-primary h-1.5 rounded-full transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { DocumentGenerationLoader, PreviewLoading } from '../ui/loading-states';\nimport { Spinner } from '../ui/spinner';\nimport { FORMAT_LABEL } from '../../lib/env';\n\nconst PreviewFrame = React.forwardRef<\n HTMLIFrameElement,\n {\n isLoading: boolean;\n iframeSrc?: string;\n iframeSrcDoc?: string;\n isGenerating?: boolean;\n generationProgress?: {\n stage: 'parsing' | 'building' | 'rendering' | 'finalizing';\n message?: string;\n };\n }\n>(\n (\n {\n isLoading,\n iframeSrc,\n iframeSrcDoc,\n isGenerating,\n generationProgress,\n },\n ref\n ) => {\n const [iframeLoaded, setIframeLoaded] = useState(false);\n\n // Reset iframe loaded state when content changes\n useEffect(() => {\n setIframeLoaded(false);\n }, [iframeSrc, iframeSrcDoc]);\n\n // Handle iframe load event\n const handleIframeLoad = () => {\n setIframeLoaded(true);\n };\n\n // Handle iframe errors\n const handleIframeError = () => {\n console.warn('Iframe failed to load content');\n setIframeLoaded(false);\n };\n\n // PDF blob URLs and remote viewers can be blocked by Chromium-based browsers\n // when loaded in a sandboxed iframe. Keep sandbox only for srcDoc-based preview.\n const iframeSandbox = iframeSrcDoc\n ? 'allow-scripts allow-popups allow-forms'\n : undefined;\n\n const hasContent = Boolean(iframeSrc || iframeSrcDoc);\n\n // Full-screen loaders only when no existing content\n if (isGenerating && !hasContent) {\n return (\n <div className=\"grow\">\n <DocumentGenerationLoader\n currentStage={generationProgress?.stage}\n message={generationProgress?.message}\n />\n </div>\n );\n }\n\n if (isLoading && !hasContent) {\n return (\n <div className=\"grow\">\n <PreviewLoading renderingLibrary=\"LibreOffice\" />\n </div>\n );\n }\n\n if (hasContent) {\n return (\n <div className=\"h-full w-full relative bg-white\">\n {/* Loading overlay */}\n {!iframeLoaded && (\n <div className=\"absolute inset-0 bg-muted/80 flex items-center justify-center z-10\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-foreground mx-auto mb-2\"></div>\n <p className=\"text-sm text-muted-foreground\">\n Loading preview...\n </p>\n </div>\n </div>\n )}\n {/* Generating/Rendering overlay on top of existing content */}\n {(isGenerating || isLoading) && (\n <div className=\"absolute inset-0 bg-background/60 backdrop-blur-[2px] flex items-center justify-center z-20 transition-opacity duration-200\">\n <div className=\"flex flex-col items-center gap-2\">\n <Spinner size=\"lg\" />\n <p className=\"text-sm text-muted-foreground\">\n {isGenerating ? 'Generating...' : 'Rendering...'}\n </p>\n </div>\n </div>\n )}\n {/* Key forces remount when switching between srcDoc (sandboxed) and\n src (blob URL, no sandbox) to avoid stale sandbox race condition */}\n <iframe\n key={iframeSrcDoc ? 'srcdoc' : 'src'}\n ref={ref}\n className=\"w-full h-full border-0\"\n style={{\n backgroundColor: 'white',\n // Fade in after load to prevent flash\n opacity: iframeLoaded ? 1 : 0,\n transition: 'opacity 0.2s ease-in-out',\n }}\n src={iframeSrc}\n srcDoc={iframeSrcDoc}\n onLoad={handleIframeLoad}\n onError={handleIframeError}\n // Security: sandbox srcDoc to prevent XSS from rendered HTML.\n // Blob URLs (src) must NOT be sandboxed without allow-same-origin.\n sandbox={iframeSandbox}\n // Accessibility\n title=\"Document preview\"\n aria-label={`Preview of rendered ${FORMAT_LABEL.toLowerCase()}`}\n />\n </div>\n );\n }\n return null;\n }\n);\n\nPreviewFrame.displayName = 'PreviewFrame';\nexport const PreviewFrameMemoized = React.memo(PreviewFrame);\n","import React from 'react';\nimport { AlertTriangle, Info, ChevronRight } from 'lucide-react';\nimport type { GenerationWarning } from '../../store/output-store';\n\ninterface WarningsPanelProps {\n warnings: GenerationWarning[] | null | undefined;\n className?: string;\n}\n\nexport function WarningsPanel({ warnings, className }: WarningsPanelProps) {\n const [isExpanded, setIsExpanded] = React.useState(false);\n\n if (!warnings || warnings.length === 0) {\n return null;\n }\n\n return (\n <div className={className}>\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"flex w-full items-center gap-2 rounded-md border border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-950/50 px-3 py-1.5 text-left transition-colors hover:bg-amber-100 dark:hover:bg-amber-900/50\"\n >\n <ChevronRight\n className={`h-3.5 w-3.5 text-amber-600 dark:text-amber-400 transition-transform flex-shrink-0 ${isExpanded ? 'rotate-90' : ''}`}\n />\n <AlertTriangle className=\"h-3.5 w-3.5 text-amber-500 flex-shrink-0\" />\n <span className=\"text-xs font-medium text-amber-700 dark:text-amber-300\">\n {warnings.length} warning{warnings.length !== 1 ? 's' : ''}\n </span>\n </button>\n\n {isExpanded && (\n <div className=\"mt-1.5 space-y-1.5\">\n {warnings.map((warning, index) => (\n <div\n key={index}\n className=\"flex items-start gap-2 rounded-md border border-amber-100 dark:border-amber-900 bg-white dark:bg-amber-950/30 px-3 py-2\"\n >\n {warning.severity === 'info' ? (\n <Info className=\"h-3.5 w-3.5 mt-0.5 text-blue-500 flex-shrink-0\" />\n ) : (\n <AlertTriangle className=\"h-3.5 w-3.5 mt-0.5 text-amber-500 flex-shrink-0\" />\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n <code className=\"text-[11px] font-medium text-amber-700 dark:text-amber-300 bg-amber-50 dark:bg-amber-900/40 px-1 py-0.5 rounded\">\n {warning.component}\n </code>\n {warning.severity === 'info' && (\n <span className=\"text-[10px] uppercase tracking-wide text-blue-500 font-medium\">\n info\n </span>\n )}\n </div>\n <p className=\"mt-0.5 text-xs text-gray-600 dark:text-gray-400 leading-relaxed\">\n {warning.message}\n </p>\n {warning.context && Object.keys(warning.context).length > 0 && (\n <details className=\"mt-1.5\">\n <summary className=\"text-[11px] text-gray-400 dark:text-gray-500 cursor-pointer hover:text-gray-600 dark:hover:text-gray-300\">\n Context\n </summary>\n <pre className=\"mt-1 text-[11px] bg-gray-50 dark:bg-gray-900/50 p-1.5 rounded overflow-x-auto text-gray-600 dark:text-gray-400\">\n {JSON.stringify(warning.context, null, 2)}\n </pre>\n </details>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { FORMAT } from './env';\nimport { API_ENDPOINTS } from '../config/api';\nimport { env } from './env';\n\nexport type RenderPayload = {\n iframeSrc?: string;\n iframeSrcDoc?: string;\n cleanup?: () => void;\n};\n\nasync function renderDocxWithDocxJS(blob: Blob): Promise<RenderPayload> {\n const docx_preview = await import('docx-preview');\n\n const bodyEl = document.createElement('body');\n const headEl = document.createElement('head');\n\n const renderPromise = docx_preview.renderAsync(blob, bodyEl, headEl, {\n inWrapper: true,\n });\n\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error('DocxJS renderAsync timed out after 10 seconds'));\n }, 10000);\n });\n\n await Promise.race([renderPromise, timeoutPromise]);\n\n const overrideStyleEl = document.createElement('link');\n overrideStyleEl.rel = 'stylesheet';\n overrideStyleEl.href = `${env.basePath}/css/preview/docxjs.css`;\n headEl.appendChild(overrideStyleEl);\n\n const htmlEl = document.createElement('html');\n htmlEl.appendChild(headEl);\n htmlEl.appendChild(bodyEl);\n\n return {\n iframeSrcDoc: htmlEl.outerHTML,\n };\n}\n\nasync function renderWithLibreOffice(\n name: string,\n blob: Blob\n): Promise<RenderPayload> {\n const formData = new FormData();\n const ext = FORMAT === 'pptx' ? '.pptx' : '.docx';\n formData.append('file', blob, `${name}${ext}`);\n\n const response = await fetch(API_ENDPOINTS.preview.libreoffice, {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n let message = `LibreOffice preview failed (${response.status})`;\n try {\n const json = await response.json();\n if (json && typeof json === 'object' && typeof json.error === 'string') {\n message = json.error;\n }\n } catch {}\n throw new Error(message);\n }\n\n const pdfBlob = await response.blob();\n if (!pdfBlob.size) {\n throw new Error('LibreOffice preview returned an empty PDF');\n }\n\n const objectUrl = URL.createObjectURL(pdfBlob);\n return {\n iframeSrc: objectUrl,\n cleanup: () => URL.revokeObjectURL(objectUrl),\n };\n}\n\nexport function cleanupIframe(iframe: HTMLIFrameElement) {\n try {\n if (iframe.contentWindow) {\n iframe.contentWindow.location.replace('about:blank');\n }\n iframe.src = 'about:blank';\n iframe.srcdoc = '';\n if (iframe.parentNode) {\n iframe.parentNode.removeChild(iframe);\n }\n } catch (error) {\n console.warn('Error cleaning up iframe:', error);\n }\n}\n\nexport type RenderLibrary = 'docxjs' | 'LibreOffice';\n\nexport async function renderDocument(\n name: string,\n blob: Blob,\n library: RenderLibrary = FORMAT === 'docx' ? 'docxjs' : 'LibreOffice',\n _baseUrl?: string,\n) {\n try {\n if (!blob || blob.size === 0) {\n throw new Error('Invalid or empty document blob');\n }\n\n let payload: RenderPayload;\n\n if (FORMAT === 'docx' && library === 'docxjs') {\n payload = await renderDocxWithDocxJS(blob);\n } else {\n payload = await renderWithLibreOffice(name, blob);\n }\n\n return { status: 'success' as const, name, payload };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return { status: 'error' as const, name, payload: new Error(errorMessage) };\n }\n}\n\n// Keep backward compat exports for pptx code\nexport const renderPptx = (name: string, blob: Blob, baseUrl: string) =>\n renderDocument(name, blob, 'LibreOffice', baseUrl);\n","import * as React from 'react';\nimport * as ProgressPrimitive from '@radix-ui/react-progress';\nimport { cn } from '../../lib/utils';\n\nconst Progress = React.forwardRef<\n React.ElementRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\n className={cn(\n 'relative h-4 w-full overflow-hidden rounded-full bg-secondary',\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n));\nProgress.displayName = ProgressPrimitive.Root.displayName;\n\nexport { Progress };\n","import { useEffect, useState } from 'react';\nimport { Badge } from './ui/badge';\nimport { Progress } from './ui/progress';\nimport { API_ENDPOINTS } from '../config/api';\nimport { FORMAT } from '../lib/env';\n\ninterface CacheStats {\n document: {\n hits: number;\n misses: number;\n hitRate: number;\n size: number;\n itemCount: number;\n enabled: boolean;\n };\n components?: ComponentCacheData;\n}\n\ninterface ComponentStatistics {\n type: string;\n hits: number;\n misses: number;\n avgProcessTime: number;\n avgSize: number;\n entries: number;\n hitRate?: number;\n totalRequests?: number;\n memoryUsage?: number;\n}\n\ninterface ComponentCacheData {\n entries: number;\n totalSize: number;\n hitRate: number;\n totalHits: number;\n totalMisses: number;\n avgResponseTime: number;\n evictions: number;\n componentStats: ComponentStatistics[];\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nexport function CacheMetrics() {\n const [stats, setStats] = useState<CacheStats | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const controller = new AbortController();\n\n const fetchData = async () => {\n try {\n const response = await fetch(API_ENDPOINTS.cacheStats, {\n signal: controller.signal,\n });\n if (!response.ok) throw new Error('Failed to fetch cache stats');\n const data = await response.json();\n\n if (!controller.signal.aborted) {\n setStats(data.data);\n setError(null);\n }\n } catch (err) {\n if (!controller.signal.aborted) {\n if (err instanceof Error && err.name !== 'AbortError') {\n setError(err.message);\n } else if (!(err instanceof Error) || err.name !== 'AbortError') {\n setError('Failed to load cache stats');\n }\n }\n } finally {\n if (!controller.signal.aborted) setLoading(false);\n }\n };\n\n fetchData();\n const interval = setInterval(fetchData, 5000);\n\n const handleCacheCleared = () => fetchData();\n window.addEventListener('cache:cleared', handleCacheCleared);\n\n return () => {\n controller.abort();\n clearInterval(interval);\n window.removeEventListener('cache:cleared', handleCacheCleared);\n };\n }, []);\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"text-destructive p-4\">\n Error loading cache metrics: {error}\n </div>\n );\n }\n\n if (!stats) return null;\n\n const { document: doc } = stats;\n const hitRatePct = doc.hitRate * 100;\n\n return (\n <div className=\"space-y-4\">\n {/* Summary row */}\n <div className=\"flex items-center gap-6 text-sm\">\n <div>\n <span className=\"text-muted-foreground\">Hit Rate</span>{' '}\n <span className=\"font-semibold text-base\">{hitRatePct.toFixed(1)}%</span>\n <span className=\"text-muted-foreground ml-1\">\n ({doc.hits} hits / {doc.misses} misses)\n </span>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Size</span>{' '}\n <span className=\"font-semibold\">{formatBytes(doc.size)}</span>\n <span className=\"text-muted-foreground ml-1\">\n ({doc.itemCount} items)\n </span>\n </div>\n <Badge variant={doc.enabled ? 'default' : 'secondary'}>\n {doc.enabled ? 'Enabled' : 'Disabled'}\n </Badge>\n </div>\n\n <Progress value={hitRatePct} className=\"h-2\" aria-label=\"Cache hit rate\" />\n\n {/* Module-level breakdown (docx only) */}\n {FORMAT === 'docx' && stats.components && (\n <ComponentBreakdown data={stats.components} />\n )}\n </div>\n );\n}\n\nfunction ComponentBreakdown({ data }: { data: ComponentCacheData }) {\n if (data.componentStats.length === 0) return null;\n\n return (\n <div className=\"space-y-2\">\n <h4 className=\"text-sm font-medium\">Module Breakdown</h4>\n <div className=\"space-y-1\">\n {data.componentStats.map((stat) => {\n const hitRate = (stat.hitRate || 0) * 100;\n const requests = stat.totalRequests || stat.hits + stat.misses;\n const memory = stat.memoryUsage || stat.entries * stat.avgSize || 0;\n\n return (\n <div key={stat.type} className=\"px-3 py-1.5 text-sm\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"font-medium\">{stat.type}</span>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span>{hitRate.toFixed(0)}% hit</span>\n <span>{requests} req</span>\n <span>{formatBytes(memory)}</span>\n </div>\n </div>\n <Progress value={hitRate} className=\"h-1.5\" />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n memo,\n} from 'react';\nimport { PreviewFrameMemoized } from './preview-frame';\nimport { PreviewHeaderMemoized } from './preview-header';\nimport { WarningsPanel } from './warnings-panel';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog';\nimport { Separator } from '../ui/separator';\nimport { useOutputStore } from '../../store/output-store-provider';\nimport { useSettingsStore } from '../../store/settings-store-provider';\nimport { renderDocument } from '../../lib/render';\nimport { useDocumentsStore } from '../../store/documents-store-provider';\nimport { CacheMetrics } from '../cache-metrics';\nimport { FORMAT_LABEL } from '../../lib/env';\n\n\n/**\n * Tiny live countdown that ticks every 100ms and shows the\n * remaining debounce time before generation starts.\n * Renders nothing once the deadline is reached.\n */\nconst DebounceCountdown = memo(function DebounceCountdown({\n editTimestamp,\n debounceMs,\n}: {\n editTimestamp: number;\n debounceMs: number;\n}) {\n const [remaining, setRemaining] = useState(() =>\n Math.max(0, editTimestamp + debounceMs - Date.now())\n );\n\n useEffect(() => {\n const tick = () => {\n const r = Math.max(0, editTimestamp + debounceMs - Date.now());\n setRemaining(r);\n if (r <= 0) clearInterval(id);\n };\n tick();\n const id = setInterval(tick, 100);\n return () => clearInterval(id);\n }, [editTimestamp, debounceMs]);\n\n if (remaining <= 0) return null;\n\n const secs = (remaining / 1000).toFixed(1);\n const pct = Math.min(100, (remaining / debounceMs) * 100);\n\n return (\n <span className=\"inline-flex items-center gap-1.5 text-xs text-amber-600 dark:text-amber-400 tabular-nums\">\n <span\n className=\"h-1 rounded-full bg-amber-500/60 transition-[width] duration-100\"\n style={{ width: `${Math.round(pct * 0.4)}px` }}\n />\n {secs}s\n </span>\n );\n});\n\nexport function Preview() {\n const { autoReload, renderingLibrary, saveDocumentDebounceWait, setSettings } = useSettingsStore((state) => state);\n const {\n name,\n text,\n blob,\n isGenerating,\n generationProgress,\n globalError,\n cacheStatus,\n cacheHitRate,\n warnings,\n isRendering,\n isPreviewStale,\n editSequence,\n lastBuiltSequence,\n editTimestamp,\n setOutput,\n } = useOutputStore((state) => state);\n const activeTab = useDocumentsStore((state) => state.activeTab);\n const documentTypes = useDocumentsStore((state) => state.documentTypes);\n\n const [iframeSrc, setIframeSrc] = useState<string | undefined>(undefined);\n const [iframeSrcDoc, setIframeSrcDoc] = useState<string | undefined>(\n undefined\n );\n const [showCacheMetrics, setShowCacheMetrics] = useState<boolean>(false);\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n\n const renderCleanupRef = useRef<(() => void) | null>(null);\n const pendingManualRenderRef = useRef(false);\n\n const cleanupRenderedPreview = useCallback(() => {\n if (renderCleanupRef.current) {\n renderCleanupRef.current();\n renderCleanupRef.current = null;\n }\n }, []);\n\n\n // Core render function\n const doRender = useCallback(\n async (docName: string, docBlob: Blob) => {\n setOutput({ isRendering: true, isPreviewStale: false, globalError: undefined });\n\n try {\n const { status, payload } = await renderDocument(\n docName,\n docBlob,\n renderingLibrary,\n );\n\n if (status !== 'success') {\n throw payload instanceof Error ? payload : new Error(String(payload));\n }\n\n cleanupRenderedPreview();\n setIframeSrc(payload.iframeSrc || undefined);\n setIframeSrcDoc(payload.iframeSrcDoc || undefined);\n renderCleanupRef.current = payload.cleanup || null;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n let displayMessage = errorMessage;\n if (errorMessage.includes('Failed to fetch')) {\n displayMessage =\n 'Network error: Unable to load required resources. Check if the server is running properly.';\n } else if (errorMessage.includes('timeout')) {\n displayMessage =\n 'Render timeout: The rendering process took too long.';\n }\n\n setOutput({ globalError: displayMessage });\n } finally {\n setOutput({ isRendering: false });\n }\n },\n [setOutput, cleanupRenderedPreview, renderingLibrary]\n );\n\n // Ref to always hold latest manual-render deps so the event listener never goes stale\n const manualRenderRef = useRef({ name, blob, doRender });\n useEffect(() => {\n manualRenderRef.current = { name, blob, doRender };\n });\n\n const handleManualRender = useCallback(async () => {\n // Set flag so blob-change effect renders the new blob when it arrives\n pendingManualRenderRef.current = true;\n // Flush debounces + trigger build via editor.tsx\n window.dispatchEvent(new CustomEvent('preview:flushAndBuild'));\n }, []); // stable — reads from ref\n\n // Auto-render when blob changes and docxjs + autoReload are active\n // Mark preview stale when blob changes but auto-render is OFF\n // Also render if a manual Run triggered the build (pendingManualRenderRef)\n useEffect(() => {\n if (blob && name && autoReload && renderingLibrary === 'docxjs') {\n doRender(name, blob);\n } else if (blob && name && pendingManualRenderRef.current) {\n pendingManualRenderRef.current = false;\n doRender(name, blob);\n } else if (blob && name) {\n setOutput({ isPreviewStale: true });\n }\n }, [blob, name, autoReload, renderingLibrary, doRender, setOutput]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanupRenderedPreview();\n };\n }, [cleanupRenderedPreview]);\n\n // Listen for global header events (stable — handleManualRender never changes)\n useEffect(() => {\n const onManual = () => handleManualRender();\n const onShowCache = () => setShowCacheMetrics(true);\n\n window.addEventListener('preview:manualRender', onManual);\n window.addEventListener('preview:showCacheMetrics', onShowCache);\n return () => {\n window.removeEventListener('preview:manualRender', onManual);\n window.removeEventListener('preview:showCacheMetrics', onShowCache);\n };\n }, [handleManualRender]);\n\n return (\n <>\n <div className=\"flex h-full flex-col\">\n {(useSettingsStore as any) &&\n (useSettingsStore as any).getState?.().useGlobalPreviewHeader ===\n false && (\n <PreviewHeaderMemoized\n iframeRef={iframeRef}\n displayReloadButton={\n Boolean(iframeSrc) && !(iframeSrc?.startsWith('blob:') ?? false)\n }\n name={name?.trim() || 'Preview'}\n blob={blob}\n autoReload={autoReload}\n onToggleAutoReload={() => setSettings({ autoReload: !autoReload })}\n onManualRender={handleManualRender}\n isGenerating={isGenerating}\n isRendering={isRendering}\n onShowCacheMetrics={() => setShowCacheMetrics(true)}\n documentText={text}\n warnings={warnings}\n renderingLibrary={renderingLibrary}\n setRenderingLibrary={(lib) => setSettings({ renderingLibrary: lib } as any)}\n />\n )}\n <Separator />\n {/* Status Bar: cache + stale combined */}\n {(() => {\n const hasUnsyncedEdits = (editSequence ?? 0) > (lastBuiltSequence ?? 0);\n const isStale = (isPreviewStale || hasUnsyncedEdits) && !isGenerating && !isRendering;\n return ((cacheStatus && cacheStatus !== 'UNKNOWN') || isStale) && (\n <div className={\n `px-3 py-1.5 flex items-center justify-between border-b overflow-hidden ${\n isStale\n ? 'bg-amber-500/10 border-amber-500/30'\n : 'bg-muted/30'\n }`\n }>\n <div className=\"flex items-center gap-2 min-w-0 truncate\">\n {cacheStatus === 'HIT' && !isStale ? (\n <>\n <div className=\"h-1.5 w-1.5 rounded-full bg-green-500 flex-shrink-0\" />\n <span className=\"text-xs text-muted-foreground truncate\">Cached</span>\n </>\n ) : cacheStatus === 'MISS' && !isStale ? (\n <>\n <div className=\"h-1.5 w-1.5 rounded-full bg-orange-500 flex-shrink-0\" />\n <span className=\"text-xs text-muted-foreground truncate\">Fresh {FORMAT_LABEL.toLowerCase()}</span>\n </>\n ) : isStale ? (\n <>\n <div className=\"h-1.5 w-1.5 rounded-full bg-amber-500 flex-shrink-0\" />\n <span className=\"text-xs text-amber-600 dark:text-amber-400 truncate\">Outdated — click Run</span>\n {editTimestamp && hasUnsyncedEdits && !isGenerating && autoReload && renderingLibrary === 'docxjs' && (\n <DebounceCountdown\n editTimestamp={editTimestamp}\n debounceMs={saveDocumentDebounceWait + 200}\n />\n )}\n </>\n ) : null}\n </div>\n {!isStale && cacheHitRate && cacheHitRate !== '0.0%' && (\n <span className=\"text-xs text-muted-foreground flex-shrink-0 ml-2\">{cacheHitRate} hit rate</span>\n )}\n </div>\n );\n })()}\n {/* Warnings Panel */}\n <WarningsPanel warnings={warnings} className=\"mx-3 my-2\" />\n {/* Generation Error — centered in preview area */}\n {globalError && !isGenerating ? (\n <div className=\"flex-1 flex items-center justify-center p-6\">\n <div className=\"max-w-md rounded-lg border border-red-400/50 bg-red-400/10 px-4 py-3 text-sm text-red-400\">\n <p className=\"font-medium mb-1\">Generation failed</p>\n <p className=\"text-xs text-red-400/80 break-words\">{globalError}</p>\n </div>\n </div>\n ) : (\n <PreviewFrameMemoized\n ref={iframeRef}\n isLoading={Boolean(isRendering)}\n iframeSrc={iframeSrc}\n iframeSrcDoc={iframeSrcDoc}\n isGenerating={(() => {\n const willAutoBuild = autoReload && renderingLibrary === 'docxjs';\n const isSwitchingDoc = activeTab && name && activeTab !== name &&\n documentTypes[activeTab] !== 'application/json+theme';\n return Boolean(isGenerating) || Boolean(willAutoBuild && isSwitchingDoc);\n })()}\n generationProgress={(() => {\n const willAutoBuild = autoReload && renderingLibrary === 'docxjs';\n const isSwitchingDoc = activeTab && name && activeTab !== name &&\n documentTypes[activeTab] !== 'application/json+theme';\n return willAutoBuild && isSwitchingDoc && !isGenerating\n ? { stage: 'parsing' as const, message: `Building preview for ${activeTab}...` }\n : generationProgress;\n })()}\n />\n )}\n </div>\n\n {/* Cache Metrics Dialog */}\n <Dialog open={showCacheMetrics} onOpenChange={setShowCacheMetrics}>\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle>Cache Performance</DialogTitle>\n </DialogHeader>\n <CacheMetrics />\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"file":"assets/preview-kcqt_5hb.js"}
|
|
@@ -2,5 +2,5 @@ import{a as O}from"./react-vendor-DhdcN9D5.js";const j=t=>{let e;const n=new Set
|
|
|
2
2
|
[zustand devtools middleware] Unsupported __setState action format.
|
|
3
3
|
When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),
|
|
4
4
|
and value of this only key should be a state object. Example: { "type": "__setState", "state": { "abc123Store": { "foo": "bar" } } }
|
|
5
|
-
`);const u=c.state[l];if(u==null)return;JSON.stringify(r.getState())!==JSON.stringify(u)&&f(u);return}r.dispatchFromDevtools&&typeof r.dispatch=="function"&&r.dispatch(c)});case"DISPATCH":switch(o.payload.type){case"RESET":return f(g),l===void 0?a==null?void 0:a.init(r.getState()):a==null?void 0:a.init(b(m.name));case"COMMIT":if(l===void 0){a==null||a.init(r.getState());return}return a==null?void 0:a.init(b(m.name));case"ROLLBACK":return I(o.state,c=>{if(l===void 0){f(c),a==null||a.init(r.getState());return}f(c[l]),a==null||a.init(b(m.name))});case"JUMP_TO_STATE":case"JUMP_TO_ACTION":return I(o.state,c=>{if(l===void 0){f(c);return}JSON.stringify(r.getState())!==JSON.stringify(c[l])&&f(c[l])});case"IMPORT_STATE":{const{nextLiftedState:c}=o.payload,u=(S=c.computedStates.slice(-1)[0])==null?void 0:S.state;if(!u)return;f(l===void 0?u:u[l]),a==null||a.send(null,c);return}case"PAUSE_RECORDING":return p=!p}return}}),g},W=U,I=(t,e)=>{let n;try{n=JSON.parse(t)}catch(s){console.error("[zustand devtools middleware] Could not parse the received json",s)}n!==void 0&&e(n)};function F(t,e){let n;try{n=t()}catch{return}return{getItem:r=>{var i;const h=m=>m===null?null:JSON.parse(m,void 0),l=(i=n.getItem(r))!=null?i:null;return l instanceof Promise?l.then(h):h(l)},setItem:(r,i)=>n.setItem(r,JSON.stringify(i,void 0)),removeItem:r=>n.removeItem(r)}}const E=t=>e=>{try{const n=t(e);return n instanceof Promise?n:{then(s){return E(s)(n)},catch(s){return this}}}catch(n){return{then(s){return this},catch(s){return E(s)(n)}}}},H=(t,e)=>(n,s,r)=>{let i={storage:F(()=>localStorage),partialize:o=>o,version:0,merge:(o,S)=>({...S,...o}),...e},h=!1;const l=new Set,m=new Set;let d=i.storage;if(!d)return t((...o)=>{console.warn(`[zustand persist middleware] Unable to update item '${i.name}', the given storage is currently unavailable.`),n(...o)},s,r);const a=()=>{const o=i.partialize({...s()});return d.setItem(i.name,{state:o,version:i.version})},v=r.setState;r.setState=(o,S)=>{v(o,S),a()};const p=t((...o)=>{n(...o),a()},s,r);r.getInitialState=()=>p;let f;const g=()=>{var o,S;if(!d)return;h=!1,l.forEach(u=>{var y;return u((y=s())!=null?y:p)});const c=((S=i.onRehydrateStorage)==null?void 0:S.call(i,(o=s())!=null?o:p))||void 0;return E(d.getItem.bind(d))(i.name).then(u=>{if(u)if(typeof u.version=="number"&&u.version!==i.version){if(i.migrate){const y=i.migrate(u.state,u.version);return y instanceof Promise?y.then(_=>[!0,_]):[!0,y]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,u.state];return[!1,void 0]}).then(u=>{var y;const[_,N]=u;if(f=i.merge(N,(y=s())!=null?y:p),n(f,!0),_)return a()}).then(()=>{c==null||c(f,void 0),f=s(),h=!0,m.forEach(u=>u(f))}).catch(u=>{c==null||c(void 0,u)})};return r.persist={setOptions:o=>{i={...i,...o},o.storage&&(d=o.storage)},clearStorage:()=>{d==null||d.removeItem(i.name)},getOptions:()=>i,rehydrate:()=>g(),hasHydrated:()=>h,onHydrate:o=>(l.add(o),()=>{l.delete(o)}),onFinishHydration:o=>(m.add(o),()=>{m.delete(o)})},i.skipHydration||g(),f||p},X=H,x=t=>Symbol.iterator in t,C=t=>"entries"in t,D=(t,e)=>{const n=t instanceof Map?t:new Map(t.entries()),s=e instanceof Map?e:new Map(e.entries());if(n.size!==s.size)return!1;for(const[r,i]of n)if(!Object.is(i,s.get(r)))return!1;return!0},L=(t,e)=>{const n=t[Symbol.iterator](),s=e[Symbol.iterator]();let r=n.next(),i=s.next();for(;!r.done&&!i.done;){if(!Object.is(r.value,i.value))return!1;r=n.next(),i=s.next()}return!!r.done&&!!i.done};function z(t,e){return Object.is(t,e)?!0:typeof t!="object"||t===null||typeof e!="object"||e===null?!1:!x(t)||!x(e)?D({entries:()=>Object.entries(t)},{entries:()=>Object.entries(e)}):C(t)&&C(e)?D(t,e):L(t,e)}function G(t){const e=O.useRef();return n=>{const s=t(n);return z(e.current,s)?e.current:e.current=s}}export{
|
|
6
|
-
//# sourceMappingURL=state-vendor-
|
|
5
|
+
`);const u=c.state[l];if(u==null)return;JSON.stringify(r.getState())!==JSON.stringify(u)&&f(u);return}r.dispatchFromDevtools&&typeof r.dispatch=="function"&&r.dispatch(c)});case"DISPATCH":switch(o.payload.type){case"RESET":return f(g),l===void 0?a==null?void 0:a.init(r.getState()):a==null?void 0:a.init(b(m.name));case"COMMIT":if(l===void 0){a==null||a.init(r.getState());return}return a==null?void 0:a.init(b(m.name));case"ROLLBACK":return I(o.state,c=>{if(l===void 0){f(c),a==null||a.init(r.getState());return}f(c[l]),a==null||a.init(b(m.name))});case"JUMP_TO_STATE":case"JUMP_TO_ACTION":return I(o.state,c=>{if(l===void 0){f(c);return}JSON.stringify(r.getState())!==JSON.stringify(c[l])&&f(c[l])});case"IMPORT_STATE":{const{nextLiftedState:c}=o.payload,u=(S=c.computedStates.slice(-1)[0])==null?void 0:S.state;if(!u)return;f(l===void 0?u:u[l]),a==null||a.send(null,c);return}case"PAUSE_RECORDING":return p=!p}return}}),g},W=U,I=(t,e)=>{let n;try{n=JSON.parse(t)}catch(s){console.error("[zustand devtools middleware] Could not parse the received json",s)}n!==void 0&&e(n)};function F(t,e){let n;try{n=t()}catch{return}return{getItem:r=>{var i;const h=m=>m===null?null:JSON.parse(m,void 0),l=(i=n.getItem(r))!=null?i:null;return l instanceof Promise?l.then(h):h(l)},setItem:(r,i)=>n.setItem(r,JSON.stringify(i,void 0)),removeItem:r=>n.removeItem(r)}}const E=t=>e=>{try{const n=t(e);return n instanceof Promise?n:{then(s){return E(s)(n)},catch(s){return this}}}catch(n){return{then(s){return this},catch(s){return E(s)(n)}}}},H=(t,e)=>(n,s,r)=>{let i={storage:F(()=>localStorage),partialize:o=>o,version:0,merge:(o,S)=>({...S,...o}),...e},h=!1;const l=new Set,m=new Set;let d=i.storage;if(!d)return t((...o)=>{console.warn(`[zustand persist middleware] Unable to update item '${i.name}', the given storage is currently unavailable.`),n(...o)},s,r);const a=()=>{const o=i.partialize({...s()});return d.setItem(i.name,{state:o,version:i.version})},v=r.setState;r.setState=(o,S)=>{v(o,S),a()};const p=t((...o)=>{n(...o),a()},s,r);r.getInitialState=()=>p;let f;const g=()=>{var o,S;if(!d)return;h=!1,l.forEach(u=>{var y;return u((y=s())!=null?y:p)});const c=((S=i.onRehydrateStorage)==null?void 0:S.call(i,(o=s())!=null?o:p))||void 0;return E(d.getItem.bind(d))(i.name).then(u=>{if(u)if(typeof u.version=="number"&&u.version!==i.version){if(i.migrate){const y=i.migrate(u.state,u.version);return y instanceof Promise?y.then(_=>[!0,_]):[!0,y]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,u.state];return[!1,void 0]}).then(u=>{var y;const[_,N]=u;if(f=i.merge(N,(y=s())!=null?y:p),n(f,!0),_)return a()}).then(()=>{c==null||c(f,void 0),f=s(),h=!0,m.forEach(u=>u(f))}).catch(u=>{c==null||c(void 0,u)})};return r.persist={setOptions:o=>{i={...i,...o},o.storage&&(d=o.storage)},clearStorage:()=>{d==null||d.removeItem(i.name)},getOptions:()=>i,rehydrate:()=>g(),hasHydrated:()=>h,onHydrate:o=>(l.add(o),()=>{l.delete(o)}),onFinishHydration:o=>(m.add(o),()=>{m.delete(o)})},i.skipHydration||g(),f||p},X=H,x=t=>Symbol.iterator in t,C=t=>"entries"in t,D=(t,e)=>{const n=t instanceof Map?t:new Map(t.entries()),s=e instanceof Map?e:new Map(e.entries());if(n.size!==s.size)return!1;for(const[r,i]of n)if(!Object.is(i,s.get(r)))return!1;return!0},L=(t,e)=>{const n=t[Symbol.iterator](),s=e[Symbol.iterator]();let r=n.next(),i=s.next();for(;!r.done&&!i.done;){if(!Object.is(r.value,i.value))return!1;r=n.next(),i=s.next()}return!!r.done&&!!i.done};function z(t,e){return Object.is(t,e)?!0:typeof t!="object"||t===null||typeof e!="object"||e===null?!1:!x(t)||!x(e)?D({entries:()=>Object.entries(t)},{entries:()=>Object.entries(e)}):C(t)&&C(e)?D(t,e):L(t,e)}function G(t){const e=O.useRef();return n=>{const s=t(n);return z(e.current,s)?e.current:e.current=s}}export{F as a,G as b,k as c,W as d,$ as e,X as p,M as u};
|
|
6
|
+
//# sourceMappingURL=state-vendor-DypmJYNT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-vendor-CAMVKh-F.js","sources":["../../../../../node_modules/.pnpm/zustand@5.0.2_@types+react@19.2.14_react@19.2.4_use-sync-external-store@1.6.0_react@19.2.4_/node_modules/zustand/esm/vanilla.mjs","../../../../../node_modules/.pnpm/zustand@5.0.2_@types+react@19.2.14_react@19.2.4_use-sync-external-store@1.6.0_react@19.2.4_/node_modules/zustand/esm/react.mjs","../../../../../node_modules/.pnpm/zustand@5.0.2_@types+react@19.2.14_react@19.2.4_use-sync-external-store@1.6.0_react@19.2.4_/node_modules/zustand/esm/middleware.mjs","../../../../../node_modules/.pnpm/zustand@5.0.2_@types+react@19.2.14_react@19.2.4_use-sync-external-store@1.6.0_react@19.2.4_/node_modules/zustand/esm/vanilla/shallow.mjs","../../../../../node_modules/.pnpm/zustand@5.0.2_@types+react@19.2.14_react@19.2.4_use-sync-external-store@1.6.0_react@19.2.4_/node_modules/zustand/esm/react/shallow.mjs"],"sourcesContent":["const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\n\nexport { createStore };\n","import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n () => selector(api.getState()),\n () => selector(api.getInitialState())\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\n\nexport { create, useStore };\n","const reduxImpl = (reducer, initial) => (set, _get, api) => {\n api.dispatch = (action) => {\n set((state) => reducer(state, action), false, action);\n return action;\n };\n api.dispatchFromDevtools = true;\n return { dispatch: (...a) => api.dispatch(...a), ...initial };\n};\nconst redux = reduxImpl;\n\nconst trackedConnections = /* @__PURE__ */ new Map();\nconst getTrackedConnectionState = (name) => {\n const api = trackedConnections.get(name);\n if (!api) return {};\n return Object.fromEntries(\n Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()])\n );\n};\nconst extractConnectionInformation = (store, extensionConnector, options) => {\n if (store === void 0) {\n return {\n type: \"untracked\",\n connection: extensionConnector.connect(options)\n };\n }\n const existingConnection = trackedConnections.get(options.name);\n if (existingConnection) {\n return { type: \"tracked\", store, ...existingConnection };\n }\n const newConnection = {\n connection: extensionConnector.connect(options),\n stores: {}\n };\n trackedConnections.set(options.name, newConnection);\n return { type: \"tracked\", store, ...newConnection };\n};\nconst devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {\n const { enabled, anonymousActionType, store, ...options } = devtoolsOptions;\n let extensionConnector;\n try {\n extensionConnector = (enabled != null ? enabled : (import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") && window.__REDUX_DEVTOOLS_EXTENSION__;\n } catch (e) {\n }\n if (!extensionConnector) {\n return fn(set, get, api);\n }\n const { connection, ...connectionInformation } = extractConnectionInformation(store, extensionConnector, options);\n let isRecording = true;\n api.setState = (state, replace, nameOrAction) => {\n const r = set(state, replace);\n if (!isRecording) return r;\n const action = nameOrAction === void 0 ? { type: anonymousActionType || \"anonymous\" } : typeof nameOrAction === \"string\" ? { type: nameOrAction } : nameOrAction;\n if (store === void 0) {\n connection == null ? void 0 : connection.send(action, get());\n return r;\n }\n connection == null ? void 0 : connection.send(\n {\n ...action,\n type: `${store}/${action.type}`\n },\n {\n ...getTrackedConnectionState(options.name),\n [store]: api.getState()\n }\n );\n return r;\n };\n const setStateFromDevtools = (...a) => {\n const originalIsRecording = isRecording;\n isRecording = false;\n set(...a);\n isRecording = originalIsRecording;\n };\n const initialState = fn(api.setState, get, api);\n if (connectionInformation.type === \"untracked\") {\n connection == null ? void 0 : connection.init(initialState);\n } else {\n connectionInformation.stores[connectionInformation.store] = api;\n connection == null ? void 0 : connection.init(\n Object.fromEntries(\n Object.entries(connectionInformation.stores).map(([key, store2]) => [\n key,\n key === connectionInformation.store ? initialState : store2.getState()\n ])\n )\n );\n }\n if (api.dispatchFromDevtools && typeof api.dispatch === \"function\") {\n let didWarnAboutReservedActionType = false;\n const originalDispatch = api.dispatch;\n api.dispatch = (...a) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && a[0].type === \"__setState\" && !didWarnAboutReservedActionType) {\n console.warn(\n '[zustand devtools middleware] \"__setState\" action type is reserved to set state from the devtools. Avoid using it.'\n );\n didWarnAboutReservedActionType = true;\n }\n originalDispatch(...a);\n };\n }\n connection.subscribe((message) => {\n var _a;\n switch (message.type) {\n case \"ACTION\":\n if (typeof message.payload !== \"string\") {\n console.error(\n \"[zustand devtools middleware] Unsupported action format\"\n );\n return;\n }\n return parseJsonThen(\n message.payload,\n (action) => {\n if (action.type === \"__setState\") {\n if (store === void 0) {\n setStateFromDevtools(action.state);\n return;\n }\n if (Object.keys(action.state).length !== 1) {\n console.error(\n `\n [zustand devtools middleware] Unsupported __setState action format.\n When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),\n and value of this only key should be a state object. Example: { \"type\": \"__setState\", \"state\": { \"abc123Store\": { \"foo\": \"bar\" } } }\n `\n );\n }\n const stateFromDevtools = action.state[store];\n if (stateFromDevtools === void 0 || stateFromDevtools === null) {\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {\n setStateFromDevtools(stateFromDevtools);\n }\n return;\n }\n if (!api.dispatchFromDevtools) return;\n if (typeof api.dispatch !== \"function\") return;\n api.dispatch(action);\n }\n );\n case \"DISPATCH\":\n switch (message.payload.type) {\n case \"RESET\":\n setStateFromDevtools(initialState);\n if (store === void 0) {\n return connection == null ? void 0 : connection.init(api.getState());\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"COMMIT\":\n if (store === void 0) {\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"ROLLBACK\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n setStateFromDevtools(state[store]);\n connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n });\n case \"JUMP_TO_STATE\":\n case \"JUMP_TO_ACTION\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) {\n setStateFromDevtools(state[store]);\n }\n });\n case \"IMPORT_STATE\": {\n const { nextLiftedState } = message.payload;\n const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;\n if (!lastComputedState) return;\n if (store === void 0) {\n setStateFromDevtools(lastComputedState);\n } else {\n setStateFromDevtools(lastComputedState[store]);\n }\n connection == null ? void 0 : connection.send(\n null,\n // FIXME no-any\n nextLiftedState\n );\n return;\n }\n case \"PAUSE_RECORDING\":\n return isRecording = !isRecording;\n }\n return;\n }\n });\n return initialState;\n};\nconst devtools = devtoolsImpl;\nconst parseJsonThen = (stringified, f) => {\n let parsed;\n try {\n parsed = JSON.parse(stringified);\n } catch (e) {\n console.error(\n \"[zustand devtools middleware] Could not parse the received json\",\n e\n );\n }\n if (parsed !== void 0) f(parsed);\n};\n\nconst subscribeWithSelectorImpl = (fn) => (set, get, api) => {\n const origSubscribe = api.subscribe;\n api.subscribe = (selector, optListener, options) => {\n let listener = selector;\n if (optListener) {\n const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;\n let currentSlice = selector(api.getState());\n listener = (state) => {\n const nextSlice = selector(state);\n if (!equalityFn(currentSlice, nextSlice)) {\n const previousSlice = currentSlice;\n optListener(currentSlice = nextSlice, previousSlice);\n }\n };\n if (options == null ? void 0 : options.fireImmediately) {\n optListener(currentSlice, currentSlice);\n }\n }\n return origSubscribe(listener);\n };\n const initialState = fn(set, get, api);\n return initialState;\n};\nconst subscribeWithSelector = subscribeWithSelectorImpl;\n\nconst combine = (initialState, create) => (...a) => Object.assign({}, initialState, create(...a));\n\nfunction createJSONStorage(getStorage, options) {\n let storage;\n try {\n storage = getStorage();\n } catch (e) {\n return;\n }\n const persistStorage = {\n getItem: (name) => {\n var _a;\n const parse = (str2) => {\n if (str2 === null) {\n return null;\n }\n return JSON.parse(str2, options == null ? void 0 : options.reviver);\n };\n const str = (_a = storage.getItem(name)) != null ? _a : null;\n if (str instanceof Promise) {\n return str.then(parse);\n }\n return parse(str);\n },\n setItem: (name, newValue) => storage.setItem(\n name,\n JSON.stringify(newValue, options == null ? void 0 : options.replacer)\n ),\n removeItem: (name) => storage.removeItem(name)\n };\n return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n try {\n const result = fn(input);\n if (result instanceof Promise) {\n return result;\n }\n return {\n then(onFulfilled) {\n return toThenable(onFulfilled)(result);\n },\n catch(_onRejected) {\n return this;\n }\n };\n } catch (e) {\n return {\n then(_onFulfilled) {\n return this;\n },\n catch(onRejected) {\n return toThenable(onRejected)(e);\n }\n };\n }\n};\nconst persistImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n storage: createJSONStorage(() => localStorage),\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage = options.storage;\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const setItem = () => {\n const state = options.partialize({ ...get() });\n return storage.setItem(options.name, {\n state,\n version: options.version\n });\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n void setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n void setItem();\n },\n get,\n api\n );\n api.getInitialState = () => configResult;\n let stateFromStorage;\n const hydrate = () => {\n var _a, _b;\n if (!storage) return;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => {\n var _a2;\n return cb((_a2 = get()) != null ? _a2 : configResult);\n });\n const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n const migration = options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n if (migration instanceof Promise) {\n return migration.then((result) => [true, result]);\n }\n return [true, migration];\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return [false, deserializedStorageValue.state];\n }\n }\n return [false, void 0];\n }).then((migrationResult) => {\n var _a2;\n const [migrated, migratedState] = migrationResult;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n if (migrated) {\n return setItem();\n }\n }).then(() => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);\n stateFromStorage = get();\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.storage) {\n storage = newOptions.storage;\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n if (!options.skipHydration) {\n hydrate();\n }\n return stateFromStorage || configResult;\n};\nconst persist = persistImpl;\n\nexport { combine, createJSONStorage, devtools, persist, redux, subscribeWithSelector };\n","const isIterable = (obj) => Symbol.iterator in obj;\nconst hasIterableEntries = (value) => (\n // HACK: avoid checking entries type\n \"entries\" in value\n);\nconst compareEntries = (valueA, valueB) => {\n const mapA = valueA instanceof Map ? valueA : new Map(valueA.entries());\n const mapB = valueB instanceof Map ? valueB : new Map(valueB.entries());\n if (mapA.size !== mapB.size) {\n return false;\n }\n for (const [key, value] of mapA) {\n if (!Object.is(value, mapB.get(key))) {\n return false;\n }\n }\n return true;\n};\nconst compareIterables = (valueA, valueB) => {\n const iteratorA = valueA[Symbol.iterator]();\n const iteratorB = valueB[Symbol.iterator]();\n let nextA = iteratorA.next();\n let nextB = iteratorB.next();\n while (!nextA.done && !nextB.done) {\n if (!Object.is(nextA.value, nextB.value)) {\n return false;\n }\n nextA = iteratorA.next();\n nextB = iteratorB.next();\n }\n return !!nextA.done && !!nextB.done;\n};\nfunction shallow(valueA, valueB) {\n if (Object.is(valueA, valueB)) {\n return true;\n }\n if (typeof valueA !== \"object\" || valueA === null || typeof valueB !== \"object\" || valueB === null) {\n return false;\n }\n if (!isIterable(valueA) || !isIterable(valueB)) {\n return compareEntries(\n { entries: () => Object.entries(valueA) },\n { entries: () => Object.entries(valueB) }\n );\n }\n if (hasIterableEntries(valueA) && hasIterableEntries(valueB)) {\n return compareEntries(valueA, valueB);\n }\n return compareIterables(valueA, valueB);\n}\n\nexport { shallow };\n","import React from 'react';\nimport { shallow } from 'zustand/vanilla/shallow';\n\nfunction useShallow(selector) {\n const prev = React.useRef();\n return (state) => {\n const next = selector(state);\n return shallow(prev.current, next) ? prev.current : prev.current = next;\n };\n}\n\nexport { useShallow };\n"],"names":["createStoreImpl","createState","state","listeners","setState","partial","replace","nextState","previousState","listener","getState","api","initialState","createStore","identity","arg","useStore","selector","slice","React","createImpl","useBoundStore","create","trackedConnections","getTrackedConnectionState","name","key","api2","extractConnectionInformation","store","extensionConnector","options","existingConnection","newConnection","devtoolsImpl","fn","devtoolsOptions","set","get","enabled","anonymousActionType","__vite_import_meta_env__","connection","connectionInformation","isRecording","nameOrAction","r","action","setStateFromDevtools","a","originalIsRecording","store2","didWarnAboutReservedActionType","originalDispatch","message","_a","parseJsonThen","stateFromDevtools","nextLiftedState","lastComputedState","devtools","stringified","f","parsed","e","createJSONStorage","getStorage","storage","parse","str2","str","newValue","toThenable","input","result","onFulfilled","_onRejected","_onFulfilled","onRejected","persistImpl","config","baseOptions","persistedState","currentState","hasHydrated","hydrationListeners","finishHydrationListeners","args","setItem","savedSetState","configResult","stateFromStorage","hydrate","_b","cb","_a2","postRehydrationCallback","deserializedStorageValue","migration","migrationResult","migrated","migratedState","newOptions","persist","isIterable","obj","hasIterableEntries","value","compareEntries","valueA","valueB","mapA","mapB","compareIterables","iteratorA","iteratorB","nextA","nextB","shallow","useShallow","prev","next"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4]}
|
|
1
|
+
{"version":3,"file":"state-vendor-DypmJYNT.js","sources":["../../../../../node_modules/.pnpm/zustand@5.0.2_@types+react@19.2.14_react@19.2.4_use-sync-external-store@1.6.0_react@19.2.4_/node_modules/zustand/esm/vanilla.mjs","../../../../../node_modules/.pnpm/zustand@5.0.2_@types+react@19.2.14_react@19.2.4_use-sync-external-store@1.6.0_react@19.2.4_/node_modules/zustand/esm/react.mjs","../../../../../node_modules/.pnpm/zustand@5.0.2_@types+react@19.2.14_react@19.2.4_use-sync-external-store@1.6.0_react@19.2.4_/node_modules/zustand/esm/middleware.mjs","../../../../../node_modules/.pnpm/zustand@5.0.2_@types+react@19.2.14_react@19.2.4_use-sync-external-store@1.6.0_react@19.2.4_/node_modules/zustand/esm/vanilla/shallow.mjs","../../../../../node_modules/.pnpm/zustand@5.0.2_@types+react@19.2.14_react@19.2.4_use-sync-external-store@1.6.0_react@19.2.4_/node_modules/zustand/esm/react/shallow.mjs"],"sourcesContent":["const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\n\nexport { createStore };\n","import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n () => selector(api.getState()),\n () => selector(api.getInitialState())\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\n\nexport { create, useStore };\n","const reduxImpl = (reducer, initial) => (set, _get, api) => {\n api.dispatch = (action) => {\n set((state) => reducer(state, action), false, action);\n return action;\n };\n api.dispatchFromDevtools = true;\n return { dispatch: (...a) => api.dispatch(...a), ...initial };\n};\nconst redux = reduxImpl;\n\nconst trackedConnections = /* @__PURE__ */ new Map();\nconst getTrackedConnectionState = (name) => {\n const api = trackedConnections.get(name);\n if (!api) return {};\n return Object.fromEntries(\n Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()])\n );\n};\nconst extractConnectionInformation = (store, extensionConnector, options) => {\n if (store === void 0) {\n return {\n type: \"untracked\",\n connection: extensionConnector.connect(options)\n };\n }\n const existingConnection = trackedConnections.get(options.name);\n if (existingConnection) {\n return { type: \"tracked\", store, ...existingConnection };\n }\n const newConnection = {\n connection: extensionConnector.connect(options),\n stores: {}\n };\n trackedConnections.set(options.name, newConnection);\n return { type: \"tracked\", store, ...newConnection };\n};\nconst devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {\n const { enabled, anonymousActionType, store, ...options } = devtoolsOptions;\n let extensionConnector;\n try {\n extensionConnector = (enabled != null ? enabled : (import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") && window.__REDUX_DEVTOOLS_EXTENSION__;\n } catch (e) {\n }\n if (!extensionConnector) {\n return fn(set, get, api);\n }\n const { connection, ...connectionInformation } = extractConnectionInformation(store, extensionConnector, options);\n let isRecording = true;\n api.setState = (state, replace, nameOrAction) => {\n const r = set(state, replace);\n if (!isRecording) return r;\n const action = nameOrAction === void 0 ? { type: anonymousActionType || \"anonymous\" } : typeof nameOrAction === \"string\" ? { type: nameOrAction } : nameOrAction;\n if (store === void 0) {\n connection == null ? void 0 : connection.send(action, get());\n return r;\n }\n connection == null ? void 0 : connection.send(\n {\n ...action,\n type: `${store}/${action.type}`\n },\n {\n ...getTrackedConnectionState(options.name),\n [store]: api.getState()\n }\n );\n return r;\n };\n const setStateFromDevtools = (...a) => {\n const originalIsRecording = isRecording;\n isRecording = false;\n set(...a);\n isRecording = originalIsRecording;\n };\n const initialState = fn(api.setState, get, api);\n if (connectionInformation.type === \"untracked\") {\n connection == null ? void 0 : connection.init(initialState);\n } else {\n connectionInformation.stores[connectionInformation.store] = api;\n connection == null ? void 0 : connection.init(\n Object.fromEntries(\n Object.entries(connectionInformation.stores).map(([key, store2]) => [\n key,\n key === connectionInformation.store ? initialState : store2.getState()\n ])\n )\n );\n }\n if (api.dispatchFromDevtools && typeof api.dispatch === \"function\") {\n let didWarnAboutReservedActionType = false;\n const originalDispatch = api.dispatch;\n api.dispatch = (...a) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && a[0].type === \"__setState\" && !didWarnAboutReservedActionType) {\n console.warn(\n '[zustand devtools middleware] \"__setState\" action type is reserved to set state from the devtools. Avoid using it.'\n );\n didWarnAboutReservedActionType = true;\n }\n originalDispatch(...a);\n };\n }\n connection.subscribe((message) => {\n var _a;\n switch (message.type) {\n case \"ACTION\":\n if (typeof message.payload !== \"string\") {\n console.error(\n \"[zustand devtools middleware] Unsupported action format\"\n );\n return;\n }\n return parseJsonThen(\n message.payload,\n (action) => {\n if (action.type === \"__setState\") {\n if (store === void 0) {\n setStateFromDevtools(action.state);\n return;\n }\n if (Object.keys(action.state).length !== 1) {\n console.error(\n `\n [zustand devtools middleware] Unsupported __setState action format.\n When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),\n and value of this only key should be a state object. Example: { \"type\": \"__setState\", \"state\": { \"abc123Store\": { \"foo\": \"bar\" } } }\n `\n );\n }\n const stateFromDevtools = action.state[store];\n if (stateFromDevtools === void 0 || stateFromDevtools === null) {\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {\n setStateFromDevtools(stateFromDevtools);\n }\n return;\n }\n if (!api.dispatchFromDevtools) return;\n if (typeof api.dispatch !== \"function\") return;\n api.dispatch(action);\n }\n );\n case \"DISPATCH\":\n switch (message.payload.type) {\n case \"RESET\":\n setStateFromDevtools(initialState);\n if (store === void 0) {\n return connection == null ? void 0 : connection.init(api.getState());\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"COMMIT\":\n if (store === void 0) {\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"ROLLBACK\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n setStateFromDevtools(state[store]);\n connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n });\n case \"JUMP_TO_STATE\":\n case \"JUMP_TO_ACTION\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) {\n setStateFromDevtools(state[store]);\n }\n });\n case \"IMPORT_STATE\": {\n const { nextLiftedState } = message.payload;\n const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;\n if (!lastComputedState) return;\n if (store === void 0) {\n setStateFromDevtools(lastComputedState);\n } else {\n setStateFromDevtools(lastComputedState[store]);\n }\n connection == null ? void 0 : connection.send(\n null,\n // FIXME no-any\n nextLiftedState\n );\n return;\n }\n case \"PAUSE_RECORDING\":\n return isRecording = !isRecording;\n }\n return;\n }\n });\n return initialState;\n};\nconst devtools = devtoolsImpl;\nconst parseJsonThen = (stringified, f) => {\n let parsed;\n try {\n parsed = JSON.parse(stringified);\n } catch (e) {\n console.error(\n \"[zustand devtools middleware] Could not parse the received json\",\n e\n );\n }\n if (parsed !== void 0) f(parsed);\n};\n\nconst subscribeWithSelectorImpl = (fn) => (set, get, api) => {\n const origSubscribe = api.subscribe;\n api.subscribe = (selector, optListener, options) => {\n let listener = selector;\n if (optListener) {\n const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;\n let currentSlice = selector(api.getState());\n listener = (state) => {\n const nextSlice = selector(state);\n if (!equalityFn(currentSlice, nextSlice)) {\n const previousSlice = currentSlice;\n optListener(currentSlice = nextSlice, previousSlice);\n }\n };\n if (options == null ? void 0 : options.fireImmediately) {\n optListener(currentSlice, currentSlice);\n }\n }\n return origSubscribe(listener);\n };\n const initialState = fn(set, get, api);\n return initialState;\n};\nconst subscribeWithSelector = subscribeWithSelectorImpl;\n\nconst combine = (initialState, create) => (...a) => Object.assign({}, initialState, create(...a));\n\nfunction createJSONStorage(getStorage, options) {\n let storage;\n try {\n storage = getStorage();\n } catch (e) {\n return;\n }\n const persistStorage = {\n getItem: (name) => {\n var _a;\n const parse = (str2) => {\n if (str2 === null) {\n return null;\n }\n return JSON.parse(str2, options == null ? void 0 : options.reviver);\n };\n const str = (_a = storage.getItem(name)) != null ? _a : null;\n if (str instanceof Promise) {\n return str.then(parse);\n }\n return parse(str);\n },\n setItem: (name, newValue) => storage.setItem(\n name,\n JSON.stringify(newValue, options == null ? void 0 : options.replacer)\n ),\n removeItem: (name) => storage.removeItem(name)\n };\n return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n try {\n const result = fn(input);\n if (result instanceof Promise) {\n return result;\n }\n return {\n then(onFulfilled) {\n return toThenable(onFulfilled)(result);\n },\n catch(_onRejected) {\n return this;\n }\n };\n } catch (e) {\n return {\n then(_onFulfilled) {\n return this;\n },\n catch(onRejected) {\n return toThenable(onRejected)(e);\n }\n };\n }\n};\nconst persistImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n storage: createJSONStorage(() => localStorage),\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage = options.storage;\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const setItem = () => {\n const state = options.partialize({ ...get() });\n return storage.setItem(options.name, {\n state,\n version: options.version\n });\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n void setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n void setItem();\n },\n get,\n api\n );\n api.getInitialState = () => configResult;\n let stateFromStorage;\n const hydrate = () => {\n var _a, _b;\n if (!storage) return;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => {\n var _a2;\n return cb((_a2 = get()) != null ? _a2 : configResult);\n });\n const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n const migration = options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n if (migration instanceof Promise) {\n return migration.then((result) => [true, result]);\n }\n return [true, migration];\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return [false, deserializedStorageValue.state];\n }\n }\n return [false, void 0];\n }).then((migrationResult) => {\n var _a2;\n const [migrated, migratedState] = migrationResult;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n if (migrated) {\n return setItem();\n }\n }).then(() => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);\n stateFromStorage = get();\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.storage) {\n storage = newOptions.storage;\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n if (!options.skipHydration) {\n hydrate();\n }\n return stateFromStorage || configResult;\n};\nconst persist = persistImpl;\n\nexport { combine, createJSONStorage, devtools, persist, redux, subscribeWithSelector };\n","const isIterable = (obj) => Symbol.iterator in obj;\nconst hasIterableEntries = (value) => (\n // HACK: avoid checking entries type\n \"entries\" in value\n);\nconst compareEntries = (valueA, valueB) => {\n const mapA = valueA instanceof Map ? valueA : new Map(valueA.entries());\n const mapB = valueB instanceof Map ? valueB : new Map(valueB.entries());\n if (mapA.size !== mapB.size) {\n return false;\n }\n for (const [key, value] of mapA) {\n if (!Object.is(value, mapB.get(key))) {\n return false;\n }\n }\n return true;\n};\nconst compareIterables = (valueA, valueB) => {\n const iteratorA = valueA[Symbol.iterator]();\n const iteratorB = valueB[Symbol.iterator]();\n let nextA = iteratorA.next();\n let nextB = iteratorB.next();\n while (!nextA.done && !nextB.done) {\n if (!Object.is(nextA.value, nextB.value)) {\n return false;\n }\n nextA = iteratorA.next();\n nextB = iteratorB.next();\n }\n return !!nextA.done && !!nextB.done;\n};\nfunction shallow(valueA, valueB) {\n if (Object.is(valueA, valueB)) {\n return true;\n }\n if (typeof valueA !== \"object\" || valueA === null || typeof valueB !== \"object\" || valueB === null) {\n return false;\n }\n if (!isIterable(valueA) || !isIterable(valueB)) {\n return compareEntries(\n { entries: () => Object.entries(valueA) },\n { entries: () => Object.entries(valueB) }\n );\n }\n if (hasIterableEntries(valueA) && hasIterableEntries(valueB)) {\n return compareEntries(valueA, valueB);\n }\n return compareIterables(valueA, valueB);\n}\n\nexport { shallow };\n","import React from 'react';\nimport { shallow } from 'zustand/vanilla/shallow';\n\nfunction useShallow(selector) {\n const prev = React.useRef();\n return (state) => {\n const next = selector(state);\n return shallow(prev.current, next) ? prev.current : prev.current = next;\n };\n}\n\nexport { useShallow };\n"],"names":["createStoreImpl","createState","state","listeners","setState","partial","replace","nextState","previousState","listener","getState","api","initialState","createStore","identity","arg","useStore","selector","slice","React","createImpl","useBoundStore","create","trackedConnections","getTrackedConnectionState","name","key","api2","extractConnectionInformation","store","extensionConnector","options","existingConnection","newConnection","devtoolsImpl","fn","devtoolsOptions","set","get","enabled","anonymousActionType","__vite_import_meta_env__","connection","connectionInformation","isRecording","nameOrAction","r","action","setStateFromDevtools","a","originalIsRecording","store2","didWarnAboutReservedActionType","originalDispatch","message","_a","parseJsonThen","stateFromDevtools","nextLiftedState","lastComputedState","devtools","stringified","f","parsed","e","createJSONStorage","getStorage","storage","parse","str2","str","newValue","toThenable","input","result","onFulfilled","_onRejected","_onFulfilled","onRejected","persistImpl","config","baseOptions","persistedState","currentState","hasHydrated","hydrationListeners","finishHydrationListeners","args","setItem","savedSetState","configResult","stateFromStorage","hydrate","_b","cb","_a2","postRehydrationCallback","deserializedStorageValue","migration","migrationResult","migrated","migratedState","newOptions","persist","isIterable","obj","hasIterableEntries","value","compareEntries","valueA","valueB","mapA","mapB","compareIterables","iteratorA","iteratorB","nextA","nextB","shallow","useShallow","prev","next"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4]}
|
|
@@ -243,5 +243,5 @@ import{r as i}from"./react-vendor-DhdcN9D5.js";function M(t){var c,a,r="";if(typ
|
|
|
243
243
|
*
|
|
244
244
|
* This source code is licensed under the ISC license.
|
|
245
245
|
* See the LICENSE file in the root directory of this source tree.
|
|
246
|
-
*/const m1=e("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),f=t=>typeof t=="boolean"?`${t}`:t===0?"0":t,m=w,M1=(t,c)=>a=>{var r;if((c==null?void 0:c.variants)==null)return m(t,a==null?void 0:a.class,a==null?void 0:a.className);const{variants:n,defaultVariants:y}=c,k=Object.keys(n).map(l=>{const s=a==null?void 0:a[l],o=y==null?void 0:y[l];if(s===null)return null;const h=f(s)||f(o);return n[l][h]}),d=a&&Object.entries(a).reduce((l,s)=>{let[o,h]=s;return h===void 0||(l[o]=h),l},{}),p=c==null||(r=c.compoundVariants)===null||r===void 0?void 0:r.reduce((l,s)=>{let{class:o,className:h,...C}=s;return Object.entries(C).every(g=>{let[u,v]=g;return Array.isArray(v)?v.includes({...y,...d}[u]):{...y,...d}[u]===v})?[...l,o,h]:l},[]);return m(t,k,p,a==null?void 0:a.class,a==null?void 0:a.className)};export{u1 as A,Z as B,V as C,Q as D,$ as E,J as F,K as G,X as H,U as I,y1 as J,d1 as K,W as L,_ as M,l1 as N,p1 as O,r1 as P,E as Q,h1 as R,k1 as S,f1 as T,m1 as X,M1 as a,L as b,w as c,H as d,S as e,N as f,F as g,a1 as h,
|
|
247
|
-
//# sourceMappingURL=ui-vendor-
|
|
246
|
+
*/const m1=e("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),f=t=>typeof t=="boolean"?`${t}`:t===0?"0":t,m=w,M1=(t,c)=>a=>{var r;if((c==null?void 0:c.variants)==null)return m(t,a==null?void 0:a.class,a==null?void 0:a.className);const{variants:n,defaultVariants:y}=c,k=Object.keys(n).map(l=>{const s=a==null?void 0:a[l],o=y==null?void 0:y[l];if(s===null)return null;const h=f(s)||f(o);return n[l][h]}),d=a&&Object.entries(a).reduce((l,s)=>{let[o,h]=s;return h===void 0||(l[o]=h),l},{}),p=c==null||(r=c.compoundVariants)===null||r===void 0?void 0:r.reduce((l,s)=>{let{class:o,className:h,...C}=s;return Object.entries(C).every(g=>{let[u,v]=g;return Array.isArray(v)?v.includes({...y,...d}[u]):{...y,...d}[u]===v})?[...l,o,h]:l},[]);return m(t,k,p,a==null?void 0:a.class,a==null?void 0:a.className)};export{u1 as A,Z as B,V as C,Q as D,$ as E,J as F,K as G,X as H,U as I,y1 as J,d1 as K,W as L,_ as M,l1 as N,p1 as O,r1 as P,E as Q,h1 as R,k1 as S,f1 as T,m1 as X,M1 as a,L as b,w as c,H as d,S as e,N as f,F as g,a1 as h,A as i,D as j,R as k,O as l,B as m,e1 as n,v1 as o,Y as p,c1 as q,t1 as r,G as s,s1 as t,i1 as u,n1 as v,o1 as w,I as x,j as y,T as z};
|
|
247
|
+
//# sourceMappingURL=ui-vendor-BFdEgxEg.js.map
|