@json-to-office/jto 0.5.1 → 0.5.2

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.
Files changed (26) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/client/assets/{HomePage-DDMC2eP4.js → HomePage-BHudJJXa.js} +3 -3
  3. package/dist/client/assets/HomePage-BHudJJXa.js.map +1 -0
  4. package/dist/client/assets/{JsonEditorPage-Bi3qzsic.js → JsonEditorPage-BzytFOIB.js} +3 -3
  5. package/dist/client/assets/{JsonEditorPage-Bi3qzsic.js.map → JsonEditorPage-BzytFOIB.js.map} +1 -1
  6. package/dist/client/assets/MonacoPluginProvider-C6nS0IdH.js +3 -0
  7. package/dist/client/assets/MonacoPluginProvider-C6nS0IdH.js.map +1 -0
  8. package/dist/client/assets/{button-cJfzi3Hb.js → button-jugmEECt.js} +2 -2
  9. package/dist/client/assets/{button-cJfzi3Hb.js.map → button-jugmEECt.js.map} +1 -1
  10. package/dist/client/assets/{editor-BRFvu4pL.js → editor-BYU3Fxpi.js} +2 -2
  11. package/dist/client/assets/{editor-BRFvu4pL.js.map → editor-BYU3Fxpi.js.map} +1 -1
  12. package/dist/client/assets/{editor-monaco-json-CVcLmruk.js → editor-monaco-json-xaZYbzKd.js} +2 -2
  13. package/dist/client/assets/{editor-monaco-json-CVcLmruk.js.map → editor-monaco-json-xaZYbzKd.js.map} +1 -1
  14. package/dist/client/assets/{index-DnOFpa21.js → index--FzAuFyi.js} +3 -3
  15. package/dist/client/assets/{index-DnOFpa21.js.map → index--FzAuFyi.js.map} +1 -1
  16. package/dist/client/assets/index-B0s8Zyy_.css +1 -0
  17. package/dist/client/assets/preview-BZSur397.js +3 -0
  18. package/dist/client/assets/preview-BZSur397.js.map +1 -0
  19. package/dist/client/index.html +2 -2
  20. package/package.json +3 -3
  21. package/dist/client/assets/HomePage-DDMC2eP4.js.map +0 -1
  22. package/dist/client/assets/MonacoPluginProvider-BuruiMGP.js +0 -3
  23. package/dist/client/assets/MonacoPluginProvider-BuruiMGP.js.map +0 -1
  24. package/dist/client/assets/index-CcNw6Q2b.css +0 -1
  25. package/dist/client/assets/preview-CCFdky9H.js +0 -3
  26. package/dist/client/assets/preview-CCFdky9H.js.map +0 -1
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/monaco-editor-BcgxPCqT.js","assets/react-vendor-CTFDOf2G.js","assets/index-DnOFpa21.js","assets/query-vendor-Df8-oete.js","assets/radix-ui-BZ5iKMtq.js","assets/ui-vendor-Dyg3GRT-.js","assets/index-CcNw6Q2b.css"])))=>i.map(i=>d[i]);
2
- var B=Object.defineProperty;var k=(n,e,t)=>e in n?B(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var E=(n,e,t)=>k(n,typeof e!="symbol"?e+"":e,t);import{r as u,j as p}from"./react-vendor-CTFDOf2G.js";import{c as h,d as S,p as v,a as j,u as T,e as G}from"./state-vendor-BDrPu9qj.js";import{_ as C,F as q,i as I}from"./index-DnOFpa21.js";import{loader as $}from"./monaco-editor-BcgxPCqT.js";function P(n){return new Promise((e,t)=>{n.oncomplete=n.onsuccess=()=>e(n.result),n.onabort=n.onerror=()=>t(n.error)})}function H(n,e){let t;const s=()=>{if(t)return t;const r=indexedDB.open(n);return r.onupgradeneeded=()=>r.result.createObjectStore(e),t=P(r),t.then(o=>{o.onclose=()=>t=void 0},()=>{}),t};return(r,o)=>s().then(c=>o(c.transaction(e,r).objectStore(e)))}let w;function D(){return w||(w=H("keyval-store","keyval")),w}function U(n,e=D()){return e("readonly",t=>P(t.get(n)))}function X(n,e,t=D()){return t("readwrite",s=>(s.put(e,n),P(s.transaction)))}function K(n,e=D()){return e("readwrite",t=>(t.delete(n),P(t.transaction)))}const N={getItem:async n=>await U(n)??null,setItem:async(n,e)=>{await X(n,e)},removeItem:async n=>{await K(n)}},Q=3,_=()=>({documents:[],openTabs:[],activeTab:"",buildErrors:{},documentTypes:{},pendingDiffs:{},acceptedApplyIds:[]}),Y={..._()},Z=(n=Y)=>h()(S(v(e=>({...n,createDocument:(t,s)=>e(r=>{if(r.documents.findIndex(c=>c.name===t)===-1){let c="application/json+report";if(t.toLowerCase().includes("theme")||t.toLowerCase().includes(".theme."))c="application/json+theme";else try{const i=JSON.parse(s);i.colors&&i.fonts&&i.styles&&(c="application/json+theme")}catch{}const a={name:t,type:"application/json",text:s,mtime:new Date,ctime:new Date,atime:new Date};return{documents:[...r.documents,a],documentTypes:{...r.documentTypes,[t]:c}}}return r}),deleteDocument:t=>e(s=>{const r={...s.documentTypes};return delete r[t],{documents:s.documents.filter(o=>o.name!==t),documentTypes:r,pendingDiffs:Object.fromEntries(Object.entries(s.pendingDiffs).filter(([o])=>o!==t))}}),saveDocument:(t,s)=>e(r=>{const o=r.documents.findIndex(a=>a.name===t);return o===-1||r.documents[o].text===s?r:{documents:r.documents.map((a,i)=>i===o?{...a,text:s,mtime:new Date}:a)}}),renameDocument:(t,s)=>e(r=>{const o=r.documents.findIndex(i=>i.name===t);if(o===-1)return r;const c=r.documents.map((i,l)=>l===o?{...i,name:s,ctime:new Date}:i),a=r.documentTypes[t];if(a){const i={...r.documentTypes};return delete i[t],i[s]=a,{documents:c,documentTypes:i}}return{documents:c}}),openDocument:t=>e(s=>{const r=s.documents.findIndex(a=>a.name===t);if(r===-1)return s;const o=s.documents.map((a,i)=>i===r?{...a,atime:new Date}:a);let c=s.openTabs;return c.includes(t)||(c=c.length>=Q?[...c.slice(1),t]:[...c,t]),{documents:o,openTabs:c,activeTab:t}}),closeDocument:t=>e(s=>{const r=s.openTabs.indexOf(t);if(r===-1)return s;const o=s.openTabs.filter(a=>a!==t);let c=s.activeTab;return c===t&&(o.length?c=r===0?o[0]:o[r-1]:c=""),{openTabs:o,activeTab:c}}),setActiveTab:t=>e({activeTab:t}),setBuildError:(t,s)=>e(r=>{if(r.buildErrors[t]===s)return r;const o={...r.buildErrors};return s?o[t]=s:delete o[t],{buildErrors:o}}),setPendingDiff:(t,s,r,o)=>e(c=>({pendingDiffs:{...c.pendingDiffs,[t]:{original:s,modified:r,applyId:o}}})),clearPendingDiff:(t,s)=>e(r=>{const o=r.pendingDiffs[t];if(!o)return r;const c={...r.pendingDiffs};delete c[t];const a=r.acceptedApplyIds||[],i=s&&o.applyId?[...a.slice(-199),o.applyId]:a;return{pendingDiffs:c,acceptedApplyIds:i}})}),{name:"documents-storage",version:1,storage:j(()=>N),partialize:e=>({documents:e.documents,openTabs:e.openTabs,activeTab:e.activeTab,documentTypes:e.documentTypes}),onRehydrateStorage:()=>e=>{if(e!=null&&e.documents)for(const t of e.documents)for(const s of["mtime","ctime","atime"])t[s]&&typeof t[s]=="string"&&(t[s]=new Date(t[s]))}}))),F=u.createContext(void 0),Se=({children:n})=>{const e=u.useRef(null);return e.current||(e.current=Z(_())),p.jsx(F.Provider,{value:e.current,children:n})},ve=n=>{const e=u.useContext(F);if(!e)throw new Error("useDocumentsStore must be used within DocumentsStoreProvider");return T(e,n)};function ee(n){try{const e=JSON.parse(n);return!e||typeof e!="object"?{valid:!1,errors:[{message:"Theme must be a JSON object"}]}:typeof e.name!="string"||!e.name.trim()?{valid:!1,errors:[{message:'Theme must have a non-empty "name" property'}]}:{valid:!0}}catch(e){return{valid:!1,errors:[{message:e instanceof SyntaxError?`Invalid JSON: ${e.message}`:"Failed to parse theme JSON"}]}}}function te(n){try{return n&&typeof n=="object"&&"name"in n&&typeof n.name=="string"?n.name:null}catch{return null}}const f=class f extends EventTarget{constructor(){super()}static getInstance(){return f.instance||(f.instance=new f),f.instance}emitThemeChange(e){this.dispatchEvent(new CustomEvent("themechange",{detail:e}))}onThemeChange(e){const t=s=>{e(s.detail)};return this.addEventListener("themechange",t),this._listenerCount=(this._listenerCount||0)+1,()=>{this.removeEventListener("themechange",t),this._listenerCount=Math.max(0,(this._listenerCount||1)-1)}}};E(f,"instance");let b=f;const O=b.getInstance(),L=()=>({customThemes:{}}),ne={...L()},se=(n=ne)=>h()(S(v((e,t)=>({...n,updateTheme:(s,r)=>e(o=>{const c=ee(r);let a,i=s;if(c.valid)try{const x=JSON.parse(r);a=x;const M=te(x);M&&(i=M)}catch{}const l=o.customThemes[s],d=!!l,m=(l==null?void 0:l.content)!==r,g={name:i,content:r,parsed:a,valid:c.valid,lastModified:new Date};return(m||!(l!=null&&l.valid)&&c.valid)&&c.valid&&setTimeout(()=>{O.emitThemeChange({themeName:i,timestamp:Date.now(),changeType:d?"update":"create"})},0),{customThemes:{...o.customThemes,[s]:g}}}),removeTheme:s=>e(r=>{const o=r.customThemes[s],c={...r.customThemes};return delete c[s],o&&setTimeout(()=>{O.emitThemeChange({themeName:o.name,timestamp:Date.now(),changeType:"delete"})},0),{customThemes:c}}),getTheme:s=>{const r=t();for(const o of Object.values(r.customThemes))if(o.valid&&o.name===s&&o.parsed)return o.parsed;return null},getAllThemeNames:()=>{const s=t(),r=[];for(const o of Object.values(s.customThemes))o.valid&&o.name&&r.push(o.name);return r},isThemeValid:s=>{const r=t();for(const o of Object.values(r.customThemes))if(o.name===s)return o.valid;return!1}}),{name:"themes-storage",version:4,storage:j(()=>N),partialize:e=>({customThemes:e.customThemes}),onRehydrateStorage:()=>e=>{e&&e.customThemes&&Object.keys(e.customThemes).forEach(t=>{const s=e.customThemes[t];s.lastModified&&typeof s.lastModified=="string"&&(s.lastModified=new Date(s.lastModified))})}}))),y=u.createContext(void 0),Te=({children:n})=>{const e=u.useRef(void 0);return e.current||(e.current=se(L())),p.jsx(y.Provider,{value:e.current,children:n})},Pe=n=>{const e=u.useContext(y);if(!e)throw new Error("useThemesStore must be used within ThemesStoreProvider");return T(e,n)},V=()=>({name:void 0,text:void 0,blob:void 0,globalError:void 0,isGenerating:!1,generationProgress:void 0,isRendering:!1,isPreviewStale:!1,editSequence:0,lastBuiltSequence:0,hasValidationErrors:!1}),re={...V()},oe=(n=re)=>h()(S(e=>({...n,setOutput:t=>e({...t}),bumpEditSequence:()=>e(t=>({editSequence:(t.editSequence??0)+1,editTimestamp:Date.now()}))}))),W=u.createContext(void 0),ye=({children:n})=>{const e=u.useRef(null);return e.current||(e.current=oe(V())),p.jsx(W.Provider,{value:e.current,children:n})},we=n=>{const e=u.useContext(W);if(!e)throw new Error("useOutputStore must be used within OutputStoreProvider");return T(e,n)},A=G()(v((n,e)=>({selectedPlugins:new Set,selectedPluginMetadata:new Map,isApplyingPlugins:!1,lastApplyError:null,selectPlugin:t=>{n(s=>{const r=new Set(s.selectedPlugins),o=new Map(s.selectedPluginMetadata);return r.add(t.name),o.set(t.name,t),{selectedPlugins:r,selectedPluginMetadata:o}})},deselectPlugin:t=>{n(s=>{const r=new Set(s.selectedPlugins),o=new Map(s.selectedPluginMetadata);return r.delete(t),o.delete(t),{selectedPlugins:r,selectedPluginMetadata:o}})},togglePlugin:t=>{e().isPluginSelected(t.name)?e().deselectPlugin(t.name):e().selectPlugin(t),e().applyPluginsWithValidation().catch(console.error)},clearSelections:()=>{n({selectedPlugins:new Set,selectedPluginMetadata:new Map}),e().applyPluginsWithValidation().catch(console.error)},isPluginSelected:t=>e().selectedPlugins.has(t),getSelectedPluginsList:()=>Array.from(e().selectedPluginMetadata.values()),getSelectedPluginNames:()=>Array.from(e().selectedPlugins),applyPluginsWithValidation:async(t,s)=>{n({isApplyingPlugins:!0,lastApplyError:null});try{const r=Array.from(e().selectedPlugins),{loader:o}=await C(async()=>{const{loader:l}=await import("./monaco-editor-BcgxPCqT.js");return{loader:l}},__vite__mapDeps([0,1])),{updateMonacoWithPlugins:c}=await C(async()=>{const{updateMonacoWithPlugins:l}=await import("./index-DnOFpa21.js").then(d=>d.m);return{updateMonacoWithPlugins:l}},__vite__mapDeps([2,1,3,4,5,0,6])),a=await o.init();if(!await c(a,r))throw new Error("Schema validation failed");return n({isApplyingPlugins:!1,lastApplyError:null}),t&&t(),!0}catch(r){const o=r instanceof Error?r.message:"Failed to apply plugin schemas";return n({isApplyingPlugins:!1,lastApplyError:o}),s&&s(o),console.error("Failed to apply plugins with validation:",r),!1}}}),{name:"jtp-selected-plugins",storage:{getItem:n=>{const e=localStorage.getItem(n);if(!e)return null;const{state:t}=JSON.parse(e);return{state:{...t,selectedPlugins:new Set(t.selectedPlugins||[]),selectedPluginMetadata:new Map(t.selectedPluginMetadata||[])}}},setItem:(n,e)=>{const{state:t}=e,s=JSON.stringify({state:{...t,selectedPlugins:Array.from(t.selectedPlugins),selectedPluginMetadata:Array.from(t.selectedPluginMetadata.entries())}});localStorage.setItem(n,s)},removeItem:n=>localStorage.removeItem(n)}})),z=()=>({saveDocumentDebounceWait:300,autoReload:!0,renderingLibrary:q==="docx"?"docxjs":"LibreOffice",useGlobalPreviewHeader:!0}),ce={...z()},ie=(n=ce)=>h()(S(v(e=>({...n,setSettings:t=>e({...t})}),{name:"settings-storage"}))),J=u.createContext(void 0),be=({children:n})=>{const e=u.useRef(null);return e.current||(e.current=ie(z())),p.jsx(J.Provider,{value:e.current,children:n})},De=n=>{const e=u.useContext(J);if(!e)throw new Error("useSettingsStore must be used within SettingsStoreProvider");return T(e,n)},R=[],ae=()=>()=>{};function ue(){const n=u.useContext(y),e=u.useRef(R),t=n?()=>{const s=n.getState().getAllThemeNames();return(s.length!==e.current.length||s.some((r,o)=>r!==e.current[o]))&&(e.current=s),e.current}:()=>R;return u.useSyncExternalStore(n?n.subscribe:ae,t)}function le(){const n=u.useRef(null),e=A(i=>i.selectedPlugins),t=Array.from(e),s=ue(),r=u.useContext(y),o=u.useRef(r);o.current=r;const c=u.useRef([]),a=u.useRef([]);return u.useEffect(()=>{$.init().then(i=>{var m;n.current=i;const l=Array.from(A.getState().selectedPlugins),d=((m=o.current)==null?void 0:m.getState().getAllThemeNames())??[];I(i,l,d).then(g=>{g?console.log("[useMonacoPlugins] Monaco initialized with plugins:",l):console.warn("[useMonacoPlugins] Monaco initialization completed with warnings")}).catch(g=>{console.error("[useMonacoPlugins] Failed to update Monaco with plugins:",g)}),c.current=[...l],a.current=[...d]}).catch(i=>{console.error("Failed to initialize Monaco:",i)})},[]),u.useEffect(()=>{const i=t.length!==c.current.length||t.some((d,m)=>d!==c.current[m]),l=s.length!==a.current.length||s.some((d,m)=>d!==a.current[m]);!i&&!l||n.current&&(I(n.current,t,s).catch(d=>{console.error("[useMonacoPlugins] Failed to update Monaco schemas:",d)}),c.current=[...t],a.current=[...s])},[t,s]),{monaco:n.current,selectedPlugins:t}}function xe({children:n}){return le(),p.jsx(p.Fragment,{children:n})}export{Se as D,xe as M,ye as O,be as S,y as T,Pe as a,we as b,A as c,De as d,Te as e,W as f,te as g,F as h,N as i,O as t,ve as u,ee as v};
3
- //# sourceMappingURL=MonacoPluginProvider-BuruiMGP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":["promisifyRequest","request","resolve","reject","createStore","dbName","storeName","dbp","getDB","db","txMode","callback","defaultGetStoreFunc","defaultGetStore","get","key","customStore","store","set","value","del","idbStorage","name","MAX_OPEN_TABS","initDocumentsStore","defaultInitDocumentsState","createDocumentsStore","initState","devtools","persist","text","state","doc","docType","parsed","newDoc","newDocumentTypes","k","docIndex","oldName","newName","documents","i","openTabs","index","tab","activeTab","buildError","buildErrors","original","modified","applyId","accepted","diff","next","ids","acceptedApplyIds","createJSONStorage","DocumentsStoreContext","createContext","DocumentsStoreProvider","children","storeRef","useRef","useDocumentsStore","selector","documentsStoreContext","useContext","useStore","validateThemeJson","jsonString","getThemeName","themeJson","_ThemeChangeEmitter","event","handler","e","__publicField","ThemeChangeEmitter","themeChangeEmitter","initThemesStore","defaultInitThemesState","createThemesStore","documentName","content","validation","themeName","parsedContent","extractedName","existingTheme","isUpdate","hasContentChanged","customTheme","removedTheme","newCustomThemes","names","theme","ThemesStoreContext","ThemesStoreProvider","useThemesStore","themesStoreContext","initOutputStore","defaultInitOutputState","createOutputStore","partialState","s","OutputStoreContext","OutputStoreProvider","useOutputStore","outputStoreContext","usePluginsStore","create","plugin","newSelectedPlugins","newMetadata","pluginName","onSuccess","onError","selectedPluginNames","loader","__vitePreload","updateMonacoWithPlugins","n","monaco","error","errorMessage","str","serialized","initSettingsStore","FORMAT","defaultInitSettingsState","createSettingsStore","settings","SettingsStoreContext","SettingsStoreProvider","useSettingsStore","settingsStoreContext","emptyNames","subscribe","useCustomThemeNames","cachedRef","getSnapshot","useSyncExternalStore","useMonacoPlugins","monacoRef","selectedPlugins","customThemeNames","themesStore","themesStoreRef","previousPluginsRef","previousThemesRef","useEffect","currentPlugins","currentThemes","_a","success","pluginsChanged","themesChanged","MonacoPluginProvider"],"ignoreList":[0],"sources":["../../../../../node_modules/.pnpm/idb-keyval@6.2.2/node_modules/idb-keyval/dist/index.js","../../../src/client/lib/idb-storage.ts","../../../src/client/store/documents-store.ts","../../../src/client/store/documents-store-provider.tsx","../../../src/client/lib/theme-validation.ts","../../../src/client/utils/theme-change-emitter.ts","../../../src/client/store/themes-store.ts","../../../src/client/store/themes-store-provider.tsx","../../../src/client/store/output-store.ts","../../../src/client/store/output-store-provider.tsx","../../../src/client/store/plugins-store.ts","../../../src/client/store/settings-store.ts","../../../src/client/store/settings-store-provider.tsx","../../../src/client/hooks/useMonacoPlugins.ts","../../../src/client/components/MonacoPluginProvider.tsx"],"sourcesContent":["function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n let dbp;\n const getDB = () => {\n if (dbp)\n return dbp;\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n dbp = promisifyRequest(request);\n dbp.then((db) => {\n // It seems like Safari sometimes likes to just close the connection.\n // It's supposed to fire this event when that happens. Let's hope it does!\n db.onclose = () => (dbp = undefined);\n }, () => { });\n return dbp;\n };\n return (txMode, callback) => getDB().then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","/**\n * IndexedDB storage adapter for Zustand persist middleware using idb-keyval.\n */\nimport { get, set, del } from 'idb-keyval';\nimport type { StateStorage } from 'zustand/middleware';\n\nexport const idbStorage: StateStorage = {\n getItem: async (name: string): Promise<string | null> => {\n return (await get(name)) ?? null;\n },\n setItem: async (name: string, value: string): Promise<void> => {\n await set(name, value);\n },\n removeItem: async (name: string): Promise<void> => {\n await del(name);\n },\n};\n","import { persist, devtools, createJSONStorage } from 'zustand/middleware';\nimport { createStore } from 'zustand/vanilla';\nimport type { TextFile } from '../lib/types';\nimport { idbStorage } from '../lib/idb-storage';\n\nconst MAX_OPEN_TABS = 3;\n\nexport type DocumentType = 'application/json+report' | 'application/json+theme';\n\nexport type DocumentsState = {\n documents: TextFile[];\n openTabs: string[];\n activeTab: string;\n buildErrors: { [key: string]: string };\n documentTypes: { [key: string]: DocumentType };\n pendingDiffs: { [key: string]: { original: string; modified: string; applyId?: string } };\n acceptedApplyIds: string[];\n};\n\nexport type DocumentsActions = {\n createDocument: (name: string, text: string) => void;\n deleteDocument: (name: string) => void;\n saveDocument: (name: string, text: string) => void;\n renameDocument: (oldName: string, newName: string) => void;\n openDocument: (name: string) => void;\n closeDocument: (name: string) => void;\n setActiveTab: (name: string) => void;\n setBuildError: (name: string, buildError?: string) => void;\n setPendingDiff: (name: string, original: string, modified: string, applyId?: string) => void;\n clearPendingDiff: (name: string, accepted?: boolean) => void;\n};\n\nexport type DocumentsStore = DocumentsState & DocumentsActions;\n\nexport const initDocumentsStore = (): DocumentsState => {\n return {\n documents: [],\n openTabs: [],\n activeTab: '',\n buildErrors: {},\n documentTypes: {},\n pendingDiffs: {},\n acceptedApplyIds: [],\n };\n};\n\nexport const defaultInitDocumentsState: DocumentsState = {\n ...initDocumentsStore(),\n};\n\nexport const createDocumentsStore = (\n initState: DocumentsState = defaultInitDocumentsState\n) => {\n return createStore<DocumentsStore>()(\n devtools(\n persist(\n (set) => ({\n ...initState,\n createDocument: (name, text) =>\n set((state) => {\n const docIndex = state.documents.findIndex(\n (doc) => doc.name === name\n );\n if (docIndex === -1) {\n // if the document does not exist\n // Determine document type based on file name and content\n let docType: DocumentType = 'application/json+report';\n if (\n name.toLowerCase().includes('theme') ||\n name.toLowerCase().includes('.theme.')\n ) {\n docType = 'application/json+theme';\n } else {\n // Try to parse JSON to check if it's a theme\n try {\n const parsed = JSON.parse(text);\n if (parsed.colors && parsed.fonts && parsed.styles) {\n docType = 'application/json+theme';\n }\n } catch {\n // If not valid JSON, default to report\n }\n }\n\n const newDoc = {\n name,\n type: 'application/json',\n text,\n mtime: new Date(),\n ctime: new Date(),\n atime: new Date(),\n };\n return {\n documents: [...state.documents, newDoc],\n documentTypes: { ...state.documentTypes, [name]: docType },\n };\n }\n return state;\n }),\n deleteDocument: (name) =>\n set((state) => {\n const newDocumentTypes = { ...state.documentTypes };\n delete newDocumentTypes[name];\n return {\n documents: state.documents.filter((doc) => doc.name !== name),\n documentTypes: newDocumentTypes,\n pendingDiffs: Object.fromEntries(\n Object.entries(state.pendingDiffs).filter(([k]) => k !== name)\n ),\n };\n }),\n saveDocument: (name, text) =>\n set((state) => {\n const docIndex = state.documents.findIndex(\n (doc) => doc.name === name\n );\n if (docIndex === -1) return state;\n // Skip update if text is unchanged to avoid spurious re-renders\n if (state.documents[docIndex].text === text) return state;\n const documents = state.documents.map((doc, i) =>\n i === docIndex ? { ...doc, text, mtime: new Date() } : doc\n );\n return { documents };\n }),\n renameDocument: (oldName, newName) =>\n set((state) => {\n const docIndex = state.documents.findIndex(\n (doc) => doc.name === oldName\n );\n if (docIndex === -1) return state;\n const documents = state.documents.map((doc, i) =>\n i === docIndex ? { ...doc, name: newName, ctime: new Date() } : doc\n );\n const docType = state.documentTypes[oldName];\n if (docType) {\n const newDocumentTypes = { ...state.documentTypes };\n delete newDocumentTypes[oldName];\n newDocumentTypes[newName] = docType;\n return { documents, documentTypes: newDocumentTypes };\n }\n return { documents };\n }),\n openDocument: (name) =>\n set((state) => {\n const docIndex = state.documents.findIndex(\n (doc) => doc.name === name\n );\n if (docIndex === -1) return state;\n const documents = state.documents.map((doc, i) =>\n i === docIndex ? { ...doc, atime: new Date() } : doc\n );\n let openTabs = state.openTabs;\n if (!openTabs.includes(name)) {\n openTabs = openTabs.length >= MAX_OPEN_TABS\n ? [...openTabs.slice(1), name]\n : [...openTabs, name];\n }\n return { documents, openTabs, activeTab: name };\n }),\n closeDocument: (name) =>\n set((state) => {\n const index = state.openTabs.indexOf(name);\n if (index === -1) return state;\n const openTabs = state.openTabs.filter((tab) => tab !== name);\n let activeTab = state.activeTab;\n if (activeTab === name) {\n if (openTabs.length) {\n activeTab = index === 0 ? openTabs[0] : openTabs[index - 1];\n } else {\n activeTab = '';\n }\n }\n return { openTabs, activeTab };\n }),\n setActiveTab: (name) => set({ activeTab: name }),\n setBuildError: (name, buildError) =>\n set((state) => {\n if (state.buildErrors[name] === buildError) return state;\n const buildErrors = { ...state.buildErrors };\n if (buildError) buildErrors[name] = buildError;\n else delete buildErrors[name];\n return { buildErrors };\n }),\n setPendingDiff: (name, original, modified, applyId) =>\n set((state) => {\n return {\n pendingDiffs: {\n ...state.pendingDiffs,\n [name]: { original, modified, applyId },\n },\n };\n }),\n clearPendingDiff: (name, accepted) =>\n set((state) => {\n const diff = state.pendingDiffs[name];\n if (!diff) return state;\n const next = { ...state.pendingDiffs };\n delete next[name];\n const ids = state.acceptedApplyIds || [];\n const acceptedApplyIds =\n accepted && diff.applyId\n ? [...ids.slice(-(200 - 1)), diff.applyId]\n : ids;\n return { pendingDiffs: next, acceptedApplyIds };\n }),\n }),\n {\n name: 'documents-storage',\n version: 1,\n storage: createJSONStorage(() => idbStorage),\n partialize: (state) => ({\n documents: state.documents,\n openTabs: state.openTabs,\n activeTab: state.activeTab,\n documentTypes: state.documentTypes,\n // buildErrors + pendingDiffs + acceptedApplyIds excluded — transient UI state\n }),\n onRehydrateStorage: () => (state) => {\n if (state?.documents) {\n for (const doc of state.documents) {\n for (const key of ['mtime', 'ctime', 'atime'] as const) {\n if (doc[key] && typeof doc[key] === 'string') {\n (doc as Record<string, unknown>)[key] = new Date(doc[key] as unknown as string);\n }\n }\n }\n }\n },\n }\n )\n )\n );\n};\n","import { type ReactNode, createContext, useRef, useContext } from 'react';\nimport { useStore } from 'zustand';\nimport {\n type DocumentsStore,\n createDocumentsStore,\n initDocumentsStore,\n} from './documents-store';\n\nexport type DocumentsStoreApi = ReturnType<typeof createDocumentsStore>;\n\nexport const DocumentsStoreContext = createContext<\n DocumentsStoreApi | undefined\n>(undefined);\n\nexport interface DocumentsStoreProviderProps {\n children: ReactNode;\n}\n\nexport const DocumentsStoreProvider = ({\n children,\n}: DocumentsStoreProviderProps) => {\n const storeRef = useRef<DocumentsStoreApi | null>(null);\n if (!storeRef.current) {\n storeRef.current = createDocumentsStore(initDocumentsStore());\n }\n\n return (\n <DocumentsStoreContext.Provider value={storeRef.current}>\n {children}\n </DocumentsStoreContext.Provider>\n );\n};\n\nexport const useDocumentsStore = <T,>(\n selector: (store: DocumentsStore) => T\n): T => {\n const documentsStoreContext = useContext(DocumentsStoreContext);\n\n if (!documentsStoreContext) {\n throw new Error(\n 'useDocumentsStore must be used within DocumentsStoreProvider'\n );\n }\n\n return useStore(documentsStoreContext, selector);\n};\n","export interface ThemeValidationError {\n message: string;\n line?: number;\n column?: number;\n path?: string;\n}\n\nexport interface ThemeValidationResult {\n valid: boolean;\n errors?: ThemeValidationError[];\n}\n\n/**\n * Validates a theme JSON string - checks structure without requiring format-specific schemas\n */\nexport function validateThemeJson(jsonString: string): ThemeValidationResult {\n try {\n const parsed = JSON.parse(jsonString);\n\n if (!parsed || typeof parsed !== 'object') {\n return {\n valid: false,\n errors: [{ message: 'Theme must be a JSON object' }],\n };\n }\n\n if (typeof parsed.name !== 'string' || !parsed.name.trim()) {\n return {\n valid: false,\n errors: [{ message: 'Theme must have a non-empty \"name\" property' }],\n };\n }\n\n return { valid: true };\n } catch (e) {\n return {\n valid: false,\n errors: [\n {\n message:\n e instanceof SyntaxError\n ? `Invalid JSON: ${e.message}`\n : 'Failed to parse theme JSON',\n },\n ],\n };\n }\n}\n\n/**\n * Gets theme name from a theme JSON object\n */\nexport function getThemeName(themeJson: unknown): string | null {\n try {\n if (\n themeJson &&\n typeof themeJson === 'object' &&\n 'name' in (themeJson as any) &&\n typeof (themeJson as any).name === 'string'\n ) {\n return (themeJson as any).name as string;\n }\n return null;\n } catch {\n return null;\n }\n}\n","// Theme change event emitter for coordinating theme updates across components\nexport interface ThemeChangeEvent {\n themeName: string;\n timestamp: number;\n changeType: 'create' | 'update' | 'delete';\n}\n\nexport class ThemeChangeEmitter extends EventTarget {\n private static instance: ThemeChangeEmitter;\n\n private constructor() {\n super();\n }\n\n static getInstance(): ThemeChangeEmitter {\n if (!ThemeChangeEmitter.instance) {\n ThemeChangeEmitter.instance = new ThemeChangeEmitter();\n }\n return ThemeChangeEmitter.instance;\n }\n\n emitThemeChange(event: ThemeChangeEvent): void {\n this.dispatchEvent(new CustomEvent('themechange', { detail: event }));\n }\n\n onThemeChange(callback: (event: ThemeChangeEvent) => void): () => void {\n const handler = (e: Event) => {\n const customEvent = e as CustomEvent<ThemeChangeEvent>;\n callback(customEvent.detail);\n };\n\n this.addEventListener('themechange', handler);\n\n // Track listener count\n (this as any)._listenerCount = ((this as any)._listenerCount || 0) + 1;\n\n // Return unsubscribe function\n return () => {\n this.removeEventListener('themechange', handler);\n (this as any)._listenerCount = Math.max(\n 0,\n ((this as any)._listenerCount || 1) - 1\n );\n };\n }\n}\n\nexport const themeChangeEmitter = ThemeChangeEmitter.getInstance();\n","import { persist, devtools, createJSONStorage } from 'zustand/middleware';\nimport { createStore } from 'zustand/vanilla';\nimport type { ThemeConfigJson } from '@json-to-office/shared-pptx';\nimport { validateThemeJson, getThemeName } from '../lib/theme-validation';\nimport { themeChangeEmitter } from '../utils/theme-change-emitter';\nimport { idbStorage } from '../lib/idb-storage';\n\nexport type CustomTheme = {\n name: string;\n content: string;\n parsed?: ThemeConfigJson;\n valid: boolean;\n lastModified: Date;\n};\n\nexport type ThemesState = {\n customThemes: { [name: string]: CustomTheme };\n};\n\nexport type ThemesActions = {\n updateTheme: (documentName: string, content: string) => void;\n removeTheme: (documentName: string) => void;\n getTheme: (themeName: string) => ThemeConfigJson | null;\n getAllThemeNames: () => string[];\n isThemeValid: (themeName: string) => boolean;\n};\n\nexport type ThemesStore = ThemesState & ThemesActions;\n\nexport const initThemesStore = (): ThemesState => {\n return {\n customThemes: {},\n };\n};\n\nexport const defaultInitThemesState: ThemesState = {\n ...initThemesStore(),\n};\n\nexport const createThemesStore = (\n initState: ThemesState = defaultInitThemesState\n) => {\n return createStore<ThemesStore>()(\n devtools(\n persist(\n (set, get) => ({\n ...initState,\n\n updateTheme: (documentName, content) =>\n set((state) => {\n const validation = validateThemeJson(content);\n\n let parsed: ThemeConfigJson | undefined;\n let themeName = documentName;\n\n if (validation.valid) {\n try {\n const parsedContent = JSON.parse(content);\n parsed = parsedContent;\n const extractedName = getThemeName(parsedContent);\n if (extractedName) {\n themeName = extractedName;\n }\n } catch {\n // Keep the document name if parsing fails\n }\n }\n\n const existingTheme = state.customThemes[documentName];\n const isUpdate = !!existingTheme;\n const hasContentChanged = existingTheme?.content !== content;\n\n const customTheme: CustomTheme = {\n name: themeName,\n content,\n parsed,\n valid: validation.valid,\n lastModified: new Date(),\n };\n\n // Emit theme change if content changed OR if this is a newly valid theme\n const shouldEmitEvent =\n (hasContentChanged ||\n (!existingTheme?.valid && validation.valid)) &&\n validation.valid;\n\n if (shouldEmitEvent) {\n // Use setTimeout to ensure state is updated before event is processed\n setTimeout(() => {\n themeChangeEmitter.emitThemeChange({\n themeName,\n timestamp: Date.now(),\n changeType: isUpdate ? 'update' : 'create',\n });\n }, 0);\n }\n\n return {\n customThemes: {\n ...state.customThemes,\n [documentName]: customTheme,\n },\n };\n }),\n\n removeTheme: (documentName) =>\n set((state) => {\n const removedTheme = state.customThemes[documentName];\n const newCustomThemes = { ...state.customThemes };\n delete newCustomThemes[documentName];\n\n // Emit theme deletion event\n if (removedTheme) {\n setTimeout(() => {\n themeChangeEmitter.emitThemeChange({\n themeName: removedTheme.name,\n timestamp: Date.now(),\n changeType: 'delete',\n });\n }, 0);\n }\n\n return {\n customThemes: newCustomThemes,\n };\n }),\n\n getTheme: (themeName) => {\n const state = get();\n\n // First check custom themes by theme name\n for (const customTheme of Object.values(state.customThemes)) {\n if (\n customTheme.valid &&\n customTheme.name === themeName &&\n customTheme.parsed\n ) {\n return customTheme.parsed;\n }\n }\n\n // Theme not found in custom themes\n return null;\n },\n\n getAllThemeNames: () => {\n const state = get();\n const names: string[] = [];\n\n // Add custom theme names\n for (const customTheme of Object.values(state.customThemes)) {\n if (customTheme.valid && customTheme.name) {\n names.push(customTheme.name);\n }\n }\n\n return names;\n },\n\n isThemeValid: (themeName) => {\n const state = get();\n\n // Check custom themes\n for (const customTheme of Object.values(state.customThemes)) {\n if (customTheme.name === themeName) {\n return customTheme.valid;\n }\n }\n\n return false;\n },\n }),\n {\n name: 'themes-storage',\n version: 4, // v4: migrate from localStorage to IndexedDB\n storage: createJSONStorage(() => idbStorage),\n // Only persist the themes data, not the functions\n partialize: (state) => ({ customThemes: state.customThemes }),\n // Handle date deserialization when loading from storage\n onRehydrateStorage: () => (state) => {\n if (state && state.customThemes) {\n // Convert lastModified strings back to Date objects\n Object.keys(state.customThemes).forEach((key) => {\n const theme = state.customThemes[key];\n if (\n theme.lastModified &&\n typeof theme.lastModified === 'string'\n ) {\n theme.lastModified = new Date(theme.lastModified);\n }\n });\n }\n },\n }\n )\n )\n );\n};\n","import { type ReactNode, createContext, useRef, useContext } from 'react';\nimport { useStore } from 'zustand';\n\nimport {\n type ThemesStore,\n createThemesStore,\n initThemesStore,\n} from './themes-store';\n\nexport type ThemesStoreApi = ReturnType<typeof createThemesStore>;\n\nexport const ThemesStoreContext = createContext<ThemesStoreApi | undefined>(\n undefined\n);\n\nexport interface ThemesStoreProviderProps {\n children: ReactNode;\n}\n\nexport const ThemesStoreProvider = ({ children }: ThemesStoreProviderProps) => {\n const storeRef = useRef<ThemesStoreApi>(undefined);\n if (!storeRef.current) {\n storeRef.current = createThemesStore(initThemesStore());\n }\n\n return (\n <ThemesStoreContext.Provider value={storeRef.current}>\n {children}\n </ThemesStoreContext.Provider>\n );\n};\n\nexport const useThemesStore = <T,>(selector: (store: ThemesStore) => T): T => {\n const themesStoreContext = useContext(ThemesStoreContext);\n\n if (!themesStoreContext) {\n throw new Error('useThemesStore must be used within ThemesStoreProvider');\n }\n\n return useStore(themesStoreContext, selector);\n};\n","import { devtools } from 'zustand/middleware';\nimport { createStore } from 'zustand/vanilla';\n\nexport interface GenerationWarning {\n component: string;\n message: string;\n severity?: 'warning' | 'info';\n context?: Record<string, unknown>;\n}\n\nexport type OutputState = {\n name?: string; // last success => document name\n text?: string; // last success => code used to generate the pptx\n blob?: Blob; // last success => generated pptx\n globalError?: string; // last failed => global error message\n isGenerating?: boolean; // presentation generation in progress\n generationProgress?: {\n stage: 'parsing' | 'building' | 'rendering' | 'finalizing';\n message?: string;\n };\n cacheStatus?: 'HIT' | 'MISS' | 'UNKNOWN'; // cache hit/miss status\n cacheHitRate?: string; // cache hit rate percentage\n warnings?: GenerationWarning[] | null; // warnings from custom component processing\n isRendering?: boolean; // preview rendering in progress (iframe/LibreOffice)\n isPreviewStale?: boolean; // preview outdated (new blob generated but not yet rendered)\n editSequence?: number; // incremented on every Monaco keystroke (init 0)\n lastBuiltSequence?: number; // stamped when generation completes (init 0)\n editTimestamp?: number; // Date.now() of the last edit (for debounce countdown)\n hasValidationErrors?: boolean; // true when Monaco reports schema validation errors\n // ⚠️ name doesn't necessarily correspond to the global error message\n};\n\nexport type OutputActions = {\n setOutput: (partialState: OutputState) => void;\n bumpEditSequence: () => void;\n};\n\nexport type OutputStore = OutputState & OutputActions;\n\nexport const initOutputStore = (): OutputState => {\n return {\n name: undefined,\n text: undefined,\n blob: undefined,\n globalError: undefined,\n isGenerating: false,\n generationProgress: undefined,\n isRendering: false,\n isPreviewStale: false,\n editSequence: 0,\n lastBuiltSequence: 0,\n hasValidationErrors: false,\n };\n};\n\nexport const defaultInitOutputState: OutputState = {\n ...initOutputStore(),\n};\n\nexport const createOutputStore = (\n initState: OutputState = defaultInitOutputState\n) => {\n return createStore<OutputStore>()(\n devtools((set) => ({\n ...initState,\n setOutput: (partialState) => set({ ...partialState }),\n bumpEditSequence: () =>\n set((s) => ({\n editSequence: (s.editSequence ?? 0) + 1,\n editTimestamp: Date.now(),\n })),\n }))\n );\n};\n","import { type ReactNode, createContext, useRef, useContext } from 'react';\nimport { useStore } from 'zustand';\nimport {\n type OutputStore,\n createOutputStore,\n initOutputStore,\n} from './output-store';\n\nexport type OutputStoreApi = ReturnType<typeof createOutputStore>;\n\nexport const OutputStoreContext = createContext<OutputStoreApi | undefined>(\n undefined\n);\n\nexport interface OutputStoreProviderProps {\n children: ReactNode;\n}\n\nexport const OutputStoreProvider = ({ children }: OutputStoreProviderProps) => {\n const storeRef = useRef<OutputStoreApi | null>(null);\n if (!storeRef.current) {\n storeRef.current = createOutputStore(initOutputStore());\n }\n\n return (\n <OutputStoreContext.Provider value={storeRef.current}>\n {children}\n </OutputStoreContext.Provider>\n );\n};\n\nexport const useOutputStore = <T,>(selector: (store: OutputStore) => T): T => {\n const outputStoreContext = useContext(OutputStoreContext);\n\n if (!outputStoreContext) {\n throw new Error('useOutputStore must be used within OutputStoreProvider');\n }\n\n return useStore(outputStoreContext, selector);\n};\n","import { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\nimport type { PluginMetadata } from '../hooks/useDiscovery';\n\ninterface PluginsState {\n // Selected plugin names (used for schema generation)\n selectedPlugins: Set<string>;\n\n // Full plugin metadata for selected plugins\n selectedPluginMetadata: Map<string, PluginMetadata>;\n\n // Schema application state\n isApplyingPlugins: boolean;\n lastApplyError: string | null;\n\n // Actions\n selectPlugin: (plugin: PluginMetadata) => void;\n deselectPlugin: (pluginName: string) => void;\n togglePlugin: (plugin: PluginMetadata) => void;\n clearSelections: () => void;\n isPluginSelected: (pluginName: string) => boolean;\n getSelectedPluginsList: () => PluginMetadata[];\n getSelectedPluginNames: () => string[];\n applyPluginsWithValidation: (\n onSuccess?: () => void,\n onError?: (error: string) => void\n ) => Promise<boolean>;\n}\n\nexport const usePluginsStore = create<PluginsState>()(\n persist(\n (set, get) => ({\n selectedPlugins: new Set<string>(),\n selectedPluginMetadata: new Map<string, PluginMetadata>(),\n isApplyingPlugins: false,\n lastApplyError: null,\n\n selectPlugin: (plugin: PluginMetadata) => {\n set((state) => {\n const newSelectedPlugins = new Set(state.selectedPlugins);\n const newMetadata = new Map(state.selectedPluginMetadata);\n\n newSelectedPlugins.add(plugin.name);\n newMetadata.set(plugin.name, plugin);\n\n return {\n selectedPlugins: newSelectedPlugins,\n selectedPluginMetadata: newMetadata,\n };\n });\n },\n\n deselectPlugin: (pluginName: string) => {\n set((state) => {\n const newSelectedPlugins = new Set(state.selectedPlugins);\n const newMetadata = new Map(state.selectedPluginMetadata);\n\n newSelectedPlugins.delete(pluginName);\n newMetadata.delete(pluginName);\n\n return {\n selectedPlugins: newSelectedPlugins,\n selectedPluginMetadata: newMetadata,\n };\n });\n },\n\n togglePlugin: (plugin: PluginMetadata) => {\n const isSelected = get().isPluginSelected(plugin.name);\n if (isSelected) {\n get().deselectPlugin(plugin.name);\n } else {\n get().selectPlugin(plugin);\n }\n // Auto-apply schema changes\n get().applyPluginsWithValidation().catch(console.error);\n },\n\n clearSelections: () => {\n set({\n selectedPlugins: new Set<string>(),\n selectedPluginMetadata: new Map<string, PluginMetadata>(),\n });\n // Auto-apply schema changes\n get().applyPluginsWithValidation().catch(console.error);\n },\n\n isPluginSelected: (pluginName: string) => {\n return get().selectedPlugins.has(pluginName);\n },\n\n getSelectedPluginsList: () => {\n return Array.from(get().selectedPluginMetadata.values());\n },\n\n getSelectedPluginNames: () => {\n return Array.from(get().selectedPlugins);\n },\n\n applyPluginsWithValidation: async (onSuccess, onError) => {\n set({ isApplyingPlugins: true, lastApplyError: null });\n\n try {\n // Get the current selected plugins\n const selectedPluginNames = Array.from(get().selectedPlugins);\n\n // Import Monaco and schema update function dynamically\n const { loader } = await import('@monaco-editor/react');\n const { updateMonacoWithPlugins } = await import(\n '../lib/monaco-config'\n );\n\n // Get Monaco instance\n const monaco = await loader.init();\n\n // Apply the plugins and wait for validation\n const success = await updateMonacoWithPlugins(\n monaco,\n selectedPluginNames\n );\n\n if (!success) {\n throw new Error('Schema validation failed');\n }\n\n // Success - schema has been applied and validated\n set({ isApplyingPlugins: false, lastApplyError: null });\n\n if (onSuccess) {\n onSuccess();\n }\n\n return true;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to apply plugin schemas';\n\n set({\n isApplyingPlugins: false,\n lastApplyError: errorMessage,\n });\n\n if (onError) {\n onError(errorMessage);\n }\n\n console.error('Failed to apply plugins with validation:', error);\n return false;\n }\n },\n }),\n {\n name: 'jtp-selected-plugins',\n // Custom storage to handle Set and Map serialization\n storage: {\n getItem: (name) => {\n const str = localStorage.getItem(name);\n if (!str) return null;\n\n const { state } = JSON.parse(str);\n return {\n state: {\n ...state,\n selectedPlugins: new Set(state.selectedPlugins || []),\n selectedPluginMetadata: new Map(\n state.selectedPluginMetadata || []\n ),\n },\n };\n },\n setItem: (name, value) => {\n const { state } = value as { state: PluginsState };\n const serialized = JSON.stringify({\n state: {\n ...state,\n selectedPlugins: Array.from(state.selectedPlugins),\n selectedPluginMetadata: Array.from(\n state.selectedPluginMetadata.entries()\n ),\n },\n });\n localStorage.setItem(name, serialized);\n },\n removeItem: (name) => localStorage.removeItem(name),\n },\n }\n )\n);\n","import { devtools, persist } from 'zustand/middleware';\nimport { createStore } from 'zustand/vanilla';\nimport type { Settings } from '../lib/types';\nimport { FORMAT } from '../lib/env';\n\nexport type SettingsState = Settings;\n\nexport type SettingsActions = {\n setSettings: (settings: Partial<Settings>) => void;\n};\n\nexport type SettingsStore = SettingsState & SettingsActions;\n\nexport const initSettingsStore = (): SettingsState => {\n return {\n saveDocumentDebounceWait: 300,\n autoReload: true,\n renderingLibrary: FORMAT === 'docx' ? 'docxjs' : 'LibreOffice',\n // UI preference to use a single preview header spanning editor + preview\n useGlobalPreviewHeader: true,\n };\n};\n\nexport const defaultInitSettingsState: SettingsState = {\n ...initSettingsStore(),\n};\n\nexport const createSettingsStore = (\n initState: SettingsState = defaultInitSettingsState\n) => {\n return createStore<SettingsStore>()(\n devtools(\n persist(\n (set) => ({\n ...initState,\n setSettings: (settings) => set({ ...settings }),\n }),\n {\n name: 'settings-storage', // name of the item in the storage (must be unique)\n // (optional) by default, 'localStorage' is used as storage\n }\n )\n )\n );\n};\n","import { type ReactNode, createContext, useRef, useContext } from 'react';\nimport { useStore } from 'zustand';\nimport {\n type SettingsStore,\n createSettingsStore,\n initSettingsStore,\n} from './settings-store';\n\nexport type SettingsStoreApi = ReturnType<typeof createSettingsStore>;\n\nexport const SettingsStoreContext = createContext<SettingsStoreApi | undefined>(\n undefined\n);\n\nexport interface SettingsStoreProviderProps {\n children: ReactNode;\n}\n\nexport const SettingsStoreProvider = ({\n children,\n}: SettingsStoreProviderProps) => {\n const storeRef = useRef<SettingsStoreApi | null>(null);\n if (!storeRef.current) {\n storeRef.current = createSettingsStore(initSettingsStore());\n }\n\n return (\n <SettingsStoreContext.Provider value={storeRef.current}>\n {children}\n </SettingsStoreContext.Provider>\n );\n};\n\nexport const useSettingsStore = <T,>(\n selector: (store: SettingsStore) => T\n): T => {\n const settingsStoreContext = useContext(SettingsStoreContext);\n\n if (!settingsStoreContext) {\n throw new Error(\n 'useSettingsStore must be used within SettingsStoreProvider'\n );\n }\n\n return useStore(settingsStoreContext, selector);\n};\n","import { useEffect, useRef, useContext, useSyncExternalStore } from 'react';\nimport { loader } from '@monaco-editor/react';\nimport type { Monaco } from '@monaco-editor/react';\nimport { usePluginsStore } from '../store/plugins-store';\nimport { ThemesStoreContext } from '../store/themes-store-provider';\nimport { updateMonacoWithPlugins } from '../lib/monaco-config';\n\nconst emptyNames: string[] = [];\nconst subscribe = () => () => {};\n\n/**\n * Read custom theme names from the ThemesStore if available,\n * returning [] when outside a ThemesStoreProvider.\n *\n * getSnapshot must return a referentially stable value to avoid\n * infinite re-renders with useSyncExternalStore.\n */\nfunction useCustomThemeNames(): string[] {\n const store = useContext(ThemesStoreContext);\n const cachedRef = useRef<string[]>(emptyNames);\n\n const getSnapshot = store\n ? () => {\n const next = store.getState().getAllThemeNames();\n // Only update the cached reference when the list actually changes\n if (\n next.length !== cachedRef.current.length ||\n next.some((n, i) => n !== cachedRef.current[i])\n ) {\n cachedRef.current = next;\n }\n return cachedRef.current;\n }\n : () => emptyNames;\n\n return useSyncExternalStore(store ? store.subscribe : subscribe, getSnapshot);\n}\n\n/**\n * Hook to synchronize selected plugins and custom themes with Monaco editor schemas.\n * Ensures real-time validation and autocomplete include plugin-specific schemas\n * and custom theme names.\n */\nexport function useMonacoPlugins() {\n const monacoRef = useRef<Monaco | null>(null);\n const selectedPlugins = usePluginsStore((state) => state.selectedPlugins);\n const selectedPluginNames = Array.from(selectedPlugins);\n const customThemeNames = useCustomThemeNames();\n const themesStore = useContext(ThemesStoreContext);\n const themesStoreRef = useRef(themesStore);\n themesStoreRef.current = themesStore;\n const previousPluginsRef = useRef<string[]>([]);\n const previousThemesRef = useRef<string[]>([]);\n\n useEffect(() => {\n loader\n .init()\n .then((monaco) => {\n monacoRef.current = monaco;\n // Read current state from stores (not stale closure) since\n // zustand persist may have hydrated while loader.init() was pending\n const currentPlugins = Array.from(\n usePluginsStore.getState().selectedPlugins\n );\n const currentThemes =\n themesStoreRef.current?.getState().getAllThemeNames() ?? [];\n updateMonacoWithPlugins(monaco, currentPlugins, currentThemes)\n .then((success) => {\n if (success) {\n console.log(\n '[useMonacoPlugins] Monaco initialized with plugins:',\n currentPlugins\n );\n } else {\n console.warn(\n '[useMonacoPlugins] Monaco initialization completed with warnings'\n );\n }\n })\n .catch((error) => {\n console.error(\n '[useMonacoPlugins] Failed to update Monaco with plugins:',\n error\n );\n });\n previousPluginsRef.current = [...currentPlugins];\n previousThemesRef.current = [...currentThemes];\n })\n .catch((error) => {\n console.error('Failed to initialize Monaco:', error);\n });\n }, []); // Keep empty dependency to run only once\n\n useEffect(() => {\n const pluginsChanged =\n selectedPluginNames.length !== previousPluginsRef.current.length ||\n selectedPluginNames.some(\n (name, index) => name !== previousPluginsRef.current[index]\n );\n\n const themesChanged =\n customThemeNames.length !== previousThemesRef.current.length ||\n customThemeNames.some(\n (name, index) => name !== previousThemesRef.current[index]\n );\n\n if (!pluginsChanged && !themesChanged) {\n return;\n }\n\n if (monacoRef.current) {\n updateMonacoWithPlugins(\n monacoRef.current,\n selectedPluginNames,\n customThemeNames\n ).catch((error) => {\n console.error(\n '[useMonacoPlugins] Failed to update Monaco schemas:',\n error\n );\n });\n previousPluginsRef.current = [...selectedPluginNames];\n previousThemesRef.current = [...customThemeNames];\n }\n }, [selectedPluginNames, customThemeNames]);\n\n return {\n monaco: monacoRef.current,\n selectedPlugins: selectedPluginNames,\n };\n}\n","import { useMonacoPlugins } from '../hooks/useMonacoPlugins';\n\n/**\n * Provider component that manages Monaco plugin synchronization\n * This must be rendered within the app after stores are initialized\n */\nexport function MonacoPluginProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n // Initialize Monaco plugin synchronization\n useMonacoPlugins();\n\n return <>{children}</>;\n}\n"],"file":"assets/MonacoPluginProvider-BuruiMGP.js"}
@@ -1 +0,0 @@
1
- /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Geist",system-ui,-apple-system,sans-serif;--font-mono:"Geist Mono","JetBrains Mono","Fira Code",ui-monospace,monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-900:oklch(39.3% .095 152.535);--color-cyan-500:oklch(71.5% .143 215.221);--color-blue-50:oklch(97% .014 254.604);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-900:oklch(37.9% .146 265.522);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-900:oklch(38.1% .176 304.987);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-sm:calc(var(--radius) - 4px);--radius-md:calc(var(--radius) - 2px);--radius-lg:var(--radius);--radius-xl:.75rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-background:hsl(var(--background));--color-foreground:hsl(var(--foreground));--color-card:hsl(var(--card));--color-card-foreground:hsl(var(--card-foreground));--color-popover:hsl(var(--popover));--color-popover-foreground:hsl(var(--popover-foreground));--color-primary:hsl(var(--primary));--color-primary-foreground:hsl(var(--primary-foreground));--color-secondary:hsl(var(--secondary));--color-secondary-foreground:hsl(var(--secondary-foreground));--color-muted:hsl(var(--muted));--color-muted-foreground:hsl(var(--muted-foreground));--color-accent:hsl(var(--accent));--color-accent-foreground:hsl(var(--accent-foreground));--color-destructive:hsl(var(--destructive));--color-destructive-foreground:hsl(var(--destructive-foreground));--color-border:hsl(var(--border));--color-input:hsl(var(--input));--color-ring:hsl(var(--ring));--color-sidebar:hsl(var(--sidebar-background));--color-sidebar-foreground:hsl(var(--sidebar-foreground));--color-sidebar-accent:hsl(var(--sidebar-accent));--color-sidebar-accent-foreground:hsl(var(--sidebar-accent-foreground));--color-sidebar-border:hsl(var(--sidebar-border));--color-sidebar-ring:hsl(var(--sidebar-ring));--color-surface-editor:hsl(var(--surface-editor));--color-surface-preview:hsl(var(--surface-preview));--color-surface-chat:hsl(var(--surface-chat))}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-gray-200,currentColor)}::file-selector-button{border-color:var(--color-gray-200,currentColor)}:root{--background:220 6% 97%;--foreground:220 9% 12%;--card:220 6% 97%;--card-foreground:220 9% 12%;--popover:0 0% 100%;--popover-foreground:220 9% 12%;--primary:220 9% 20%;--primary-foreground:220 6% 97%;--secondary:220 6% 93%;--secondary-foreground:220 9% 12%;--muted:220 6% 93%;--muted-foreground:220 5% 46%;--accent:220 6% 93%;--accent-foreground:220 9% 12%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:220 6% 87%;--input:220 6% 87%;--ring:220 9% 20%;--chart-1:12 76% 61%;--chart-2:173 58% 39%;--chart-3:197 37% 24%;--chart-4:43 74% 66%;--chart-5:27 87% 67%;--radius:.5rem;--sidebar-background:220 6% 94%;--sidebar-foreground:220 9% 20%;--sidebar-primary:220 9% 20%;--sidebar-primary-foreground:220 6% 97%;--sidebar-accent:220 6% 90%;--sidebar-accent-foreground:220 9% 12%;--sidebar-border:220 6% 87%;--sidebar-ring:220 9% 20%;--surface-editor:220 6% 97%;--surface-preview:220 5% 95%;--surface-chat:220 6% 95%}.dark{--background:220 8% 7%;--foreground:220 6% 93%;--card:220 8% 9%;--card-foreground:220 6% 93%;--popover:220 8% 9%;--popover-foreground:220 6% 93%;--primary:220 6% 90%;--primary-foreground:220 8% 7%;--secondary:220 6% 14%;--secondary-foreground:220 6% 93%;--muted:220 6% 14%;--muted-foreground:220 5% 55%;--accent:220 6% 14%;--accent-foreground:220 6% 93%;--destructive:0 62.8% 30.6%;--destructive-foreground:0 0% 98%;--border:220 6% 17%;--input:220 6% 17%;--ring:220 6% 80%;--chart-1:220 40% 55%;--chart-2:160 35% 50%;--chart-3:30 50% 55%;--chart-4:280 35% 60%;--chart-5:340 40% 55%;--sidebar-background:220 8% 5%;--sidebar-foreground:220 6% 85%;--sidebar-primary:220 6% 85%;--sidebar-primary-foreground:220 8% 5%;--sidebar-accent:220 6% 12%;--sidebar-accent-foreground:220 6% 85%;--sidebar-border:220 6% 13%;--sidebar-ring:220 6% 80%;--surface-editor:220 8% 7%;--surface-preview:220 7% 9%;--surface-chat:220 8% 8%}*{border-color:var(--color-border)}body{background-color:var(--color-background);color:var(--color-foreground)}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.-top-1\.5{top:calc(var(--spacing)*-1.5)}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\.5{top:calc(var(--spacing)*1.5)}.top-2{top:calc(var(--spacing)*2)}.top-3\.5{top:calc(var(--spacing)*3.5)}.top-4{top:calc(var(--spacing)*4)}.top-\[50\%\]{top:50%}.-right-1\.5{right:calc(var(--spacing)*-1.5)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.right-2{right:calc(var(--spacing)*2)}.right-3{right:calc(var(--spacing)*3)}.right-4{right:calc(var(--spacing)*4)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-1{bottom:calc(var(--spacing)*1)}.left-0{left:calc(var(--spacing)*0)}.left-2{left:calc(var(--spacing)*2)}.left-\[50\%\]{left:50%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing)*0)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-3\.5{margin-inline:calc(var(--spacing)*3.5)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-2{margin-block:calc(var(--spacing)*2)}.mt-0{margin-top:calc(var(--spacing)*0)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-5{margin-left:calc(var(--spacing)*5)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-1\.5{width:calc(var(--spacing)*1.5);height:calc(var(--spacing)*1.5)}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-3\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-10{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-48{height:calc(var(--spacing)*48)}.h-64{height:calc(var(--spacing)*64)}.h-\[1\.2rem\]{height:1.2rem}.h-\[1\.15rem\]{height:1.15rem}.h-\[1px\]{height:1px}.h-\[420px\]{height:420px}.h-\[600px\]{height:600px}.h-\[calc\(100\%-2\.5rem\)\]{height:calc(100% - 2.5rem)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.h-svh{height:100svh}.max-h-32{max-height:calc(var(--spacing)*32)}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-80{max-height:calc(var(--spacing)*80)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[300px\]{max-height:300px}.max-h-screen{max-height:100vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[36px\]{min-height:36px}.min-h-\[80px\]{min-height:80px}.min-h-\[200px\]{min-height:200px}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-0\.5{width:calc(var(--spacing)*.5)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-1\/2{width:50%}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-52{width:calc(var(--spacing)*52)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-\[--sidebar-width\]{width:--sidebar-width}.w-\[1\.2rem\]{width:1.2rem}.w-\[1px\]{width:1px}.w-\[140px\]{width:140px}.w-\[240px\]{width:240px}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[--skeleton-width\]{max-width:--skeleton-width}.max-w-\[90\%\]{max-width:90%}.max-w-\[120px\]{max-width:120px}.max-w-\[140px\]{max-width:140px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[280px\]{max-width:280px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-5{min-width:calc(var(--spacing)*5)}.min-w-\[1\.25rem\]{min-width:1.25rem}.min-w-\[8rem\]{min-width:8rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-\[0\.8\]{scale:.8}.-rotate-90{rotate:-90deg}.rotate-0{rotate:none}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize-none{resize:none}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing)*0)}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-0\.5{column-gap:calc(var(--spacing)*.5)}.gap-x-1{column-gap:calc(var(--spacing)*1)}.gap-x-2{column-gap:calc(var(--spacing)*2)}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border\/50>:not(:last-child)){border-color:color-mix(in srgb,hsl(var(--border))50%,transparent)}@supports (color:color-mix(in lab,red,red)){:where(.divide-border\/50>:not(:last-child)){border-color:color-mix(in oklab,var(--color-border)50%,transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-400\/30{border-color:#fcbb004d}@supports (color:color-mix(in lab,red,red)){.border-amber-400\/30{border-color:color-mix(in oklab,var(--color-amber-400)30%,transparent)}}.border-amber-500{border-color:var(--color-amber-500)}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.border-blue-400\/60{border-color:#54a2ff99}@supports (color:color-mix(in lab,red,red)){.border-blue-400\/60{border-color:color-mix(in oklab,var(--color-blue-400)60%,transparent)}}.border-blue-500{border-color:var(--color-blue-500)}.border-border{border-color:var(--color-border)}.border-border\/40{border-color:color-mix(in srgb,hsl(var(--border))40%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-border\/40{border-color:color-mix(in oklab,var(--color-border)40%,transparent)}}.border-border\/60{border-color:color-mix(in srgb,hsl(var(--border))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-border\/60{border-color:color-mix(in oklab,var(--color-border)60%,transparent)}}.border-destructive{border-color:var(--color-destructive)}.border-destructive\/20{border-color:color-mix(in srgb,hsl(var(--destructive))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/20{border-color:color-mix(in oklab,var(--color-destructive)20%,transparent)}}.border-destructive\/30{border-color:color-mix(in srgb,hsl(var(--destructive))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/30{border-color:color-mix(in oklab,var(--color-destructive)30%,transparent)}}.border-destructive\/50{border-color:color-mix(in srgb,hsl(var(--destructive))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/50{border-color:color-mix(in oklab,var(--color-destructive)50%,transparent)}}.border-foreground{border-color:var(--color-foreground)}.border-green-500{border-color:var(--color-green-500)}.border-input{border-color:var(--color-input)}.border-muted-foreground{border-color:var(--color-muted-foreground)}.border-primary{border-color:var(--color-primary)}.border-primary-foreground\/20{border-color:color-mix(in srgb,hsl(var(--primary-foreground))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-primary-foreground\/20{border-color:color-mix(in oklab,var(--color-primary-foreground)20%,transparent)}}.border-primary\/20{border-color:color-mix(in srgb,hsl(var(--primary))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-primary\/20{border-color:color-mix(in oklab,var(--color-primary)20%,transparent)}}.border-purple-400\/60{border-color:#c07eff99}@supports (color:color-mix(in lab,red,red)){.border-purple-400\/60{border-color:color-mix(in oklab,var(--color-purple-400)60%,transparent)}}.border-purple-500{border-color:var(--color-purple-500)}.border-red-400\/50{border-color:#ff656880}@supports (color:color-mix(in lab,red,red)){.border-red-400\/50{border-color:color-mix(in oklab,var(--color-red-400)50%,transparent)}}.border-secondary{border-color:var(--color-secondary)}.border-sidebar-border{border-color:var(--color-sidebar-border)}.border-sidebar-foreground\/20{border-color:color-mix(in srgb,hsl(var(--sidebar-foreground))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-sidebar-foreground\/20{border-color:color-mix(in oklab,var(--color-sidebar-foreground)20%,transparent)}}.border-transparent{border-color:#0000}.border-t-transparent{border-top-color:#0000}.border-l-transparent{border-left-color:#0000}.bg-accent{background-color:var(--color-accent)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-amber-500\/60{background-color:#f99c0099}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/60{background-color:color-mix(in oklab,var(--color-amber-500)60%,transparent)}}.bg-background{background-color:var(--color-background)}.bg-background\/60{background-color:color-mix(in srgb,hsl(var(--background))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-background\/60{background-color:color-mix(in oklab,var(--color-background)60%,transparent)}}.bg-background\/80{background-color:color-mix(in srgb,hsl(var(--background))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,var(--color-background)80%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-border{background-color:var(--color-border)}.bg-border\/60{background-color:color-mix(in srgb,hsl(var(--border))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-border\/60{background-color:color-mix(in oklab,var(--color-border)60%,transparent)}}.bg-card{background-color:var(--color-card)}.bg-destructive{background-color:var(--color-destructive)}.bg-destructive\/10{background-color:color-mix(in srgb,hsl(var(--destructive))10%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--color-destructive)10%,transparent)}}.bg-gray-50{background-color:var(--color-gray-50)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/15{background-color:#00c75826}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/15{background-color:color-mix(in oklab,var(--color-green-500)15%,transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-muted-foreground\/30{background-color:color-mix(in srgb,hsl(var(--muted-foreground))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/30{background-color:color-mix(in oklab,var(--color-muted-foreground)30%,transparent)}}.bg-muted\/10{background-color:color-mix(in srgb,hsl(var(--muted))10%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/10{background-color:color-mix(in oklab,var(--color-muted)10%,transparent)}}.bg-muted\/30{background-color:color-mix(in srgb,hsl(var(--muted))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,var(--color-muted)30%,transparent)}}.bg-muted\/40{background-color:color-mix(in srgb,hsl(var(--muted))40%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,var(--color-muted)40%,transparent)}}.bg-muted\/50{background-color:color-mix(in srgb,hsl(var(--muted))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.bg-muted\/60{background-color:color-mix(in srgb,hsl(var(--muted))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/60{background-color:color-mix(in oklab,var(--color-muted)60%,transparent)}}.bg-muted\/80{background-color:color-mix(in srgb,hsl(var(--muted))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/80{background-color:color-mix(in oklab,var(--color-muted)80%,transparent)}}.bg-orange-500{background-color:var(--color-orange-500)}.bg-popover{background-color:var(--color-popover)}.bg-primary{background-color:var(--color-primary)}.bg-primary-foreground\/10{background-color:color-mix(in srgb,hsl(var(--primary-foreground))10%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-primary-foreground\/10{background-color:color-mix(in oklab,var(--color-primary-foreground)10%,transparent)}}.bg-primary-foreground\/20{background-color:color-mix(in srgb,hsl(var(--primary-foreground))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-primary-foreground\/20{background-color:color-mix(in oklab,var(--color-primary-foreground)20%,transparent)}}.bg-primary\/5{background-color:color-mix(in srgb,hsl(var(--primary))5%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,var(--color-primary)5%,transparent)}}.bg-primary\/10{background-color:color-mix(in srgb,hsl(var(--primary))10%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--color-primary)10%,transparent)}}.bg-primary\/70{background-color:color-mix(in srgb,hsl(var(--primary))70%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/70{background-color:color-mix(in oklab,var(--color-primary)70%,transparent)}}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-400\/10{background-color:#ff65681a}@supports (color:color-mix(in lab,red,red)){.bg-red-400\/10{background-color:color-mix(in oklab,var(--color-red-400)10%,transparent)}}.bg-secondary{background-color:var(--color-secondary)}.bg-sidebar{background-color:var(--color-sidebar)}.bg-sidebar-border{background-color:var(--color-sidebar-border)}.bg-surface-chat{background-color:var(--color-surface-chat)}.bg-surface-editor{background-color:var(--color-surface-editor)}.bg-surface-preview{background-color:var(--color-surface-preview)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.fill-current{fill:currentColor}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.p-\[1px\]{padding:1px}.px-0\.5{padding-inline:calc(var(--spacing)*.5)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-0\.5{padding-top:calc(var(--spacing)*.5)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-0{padding-bottom:calc(var(--spacing)*0)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-8{padding-left:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-foreground{color:var(--color-accent-foreground)}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-card-foreground{color:var(--color-card-foreground)}.text-cyan-500{color:var(--color-cyan-500)}.text-destructive{color:var(--color-destructive)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-foreground{color:var(--color-foreground)}.text-foreground\/50{color:color-mix(in srgb,hsl(var(--foreground))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/50{color:color-mix(in oklab,var(--color-foreground)50%,transparent)}}.text-foreground\/80{color:color-mix(in srgb,hsl(var(--foreground))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,var(--color-foreground)80%,transparent)}}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-muted-foreground\/60{color:color-mix(in srgb,hsl(var(--muted-foreground))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,var(--color-muted-foreground)60%,transparent)}}.text-muted-foreground\/80{color:color-mix(in srgb,hsl(var(--muted-foreground))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,var(--color-muted-foreground)80%,transparent)}}.text-orange-500{color:var(--color-orange-500)}.text-popover-foreground{color:var(--color-popover-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-primary-foreground\/50{color:color-mix(in srgb,hsl(var(--primary-foreground))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-primary-foreground\/50{color:color-mix(in oklab,var(--color-primary-foreground)50%,transparent)}}.text-primary-foreground\/60{color:color-mix(in srgb,hsl(var(--primary-foreground))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-primary-foreground\/60{color:color-mix(in oklab,var(--color-primary-foreground)60%,transparent)}}.text-primary\/60{color:color-mix(in srgb,hsl(var(--primary))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-primary\/60{color:color-mix(in oklab,var(--color-primary)60%,transparent)}}.text-purple-500{color:var(--color-purple-500)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-red-400{color:var(--color-red-400)}.text-red-400\/80{color:#ff6568cc}@supports (color:color-mix(in lab,red,red)){.text-red-400\/80{color:color-mix(in oklab,var(--color-red-400)80%,transparent)}}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-sidebar-accent-foreground{color:var(--color-sidebar-accent-foreground)}.text-sidebar-foreground{color:var(--color-sidebar-foreground)}.text-sidebar-foreground\/70{color:color-mix(in srgb,hsl(var(--sidebar-foreground))70%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/70{color:color-mix(in oklab,var(--color-sidebar-foreground)70%,transparent)}}.text-yellow-500{color:var(--color-yellow-500)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-90{opacity:.9}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-border)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_1px_0_0\]{--tw-shadow:0 1px 0 0 var(--tw-shadow-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-border\/50{--tw-shadow-color:color-mix(in srgb,hsl(var(--border))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.shadow-border\/50{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-border)50%,transparent)var(--tw-shadow-alpha),transparent)}}.ring-primary\/40{--tw-ring-color:color-mix(in srgb,hsl(var(--primary))40%,transparent)}@supports (color:color-mix(in lab,red,red)){.ring-primary\/40{--tw-ring-color:color-mix(in oklab,var(--color-primary)40%,transparent)}}.ring-sidebar-ring{--tw-ring-color:var(--color-sidebar-ring)}.ring-offset-background{--tw-ring-offset-color:var(--color-background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opa\]{transition-property:margin,opa;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-\[cubic-bezier\(0\.16\,1\,0\.3\,1\)\]{--tw-ease:cubic-bezier(.16,1,.3,1);transition-timing-function:cubic-bezier(.16,1,.3,1)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.duration-100{animation-duration:.1s}.duration-150{animation-duration:.15s}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.ease-\[cubic-bezier\(0\.16\,1\,0\.3\,1\)\]{animation-timing-function:cubic-bezier(.16,1,.3,1)}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{animation-timing-function:linear}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.fade-in-0{--tw-enter-opacity:0}.running{animation-play-state:running}.zoom-in-95{--tw-enter-scale:.95}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *),.group-hover\/msg\:opacity-100:is(:where(.group\/msg):hover *){opacity:1}}.group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing)*8)}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing)*-8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:\!size-8:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing)*8)!important;height:calc(var(--spacing)*8)!important}.group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]:is(:where(.group)[data-collapsible=icon] *){width:--sidebar-width-icon}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem)}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:\!p-0:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing)*0)!important}.group-data-\[collapsible\=icon\]\:\!p-2:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing)*2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width)*-1)}.group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width)*-1)}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:calc(var(--spacing)*0)}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing)*-4)}.group-data-\[side\=left\]\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:calc(var(--spacing)*0)}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius-lg)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:border-sidebar-border:is(:where(.group)[data-variant=floating] *){border-color:var(--color-sidebar-border)}.group-data-\[variant\=floating\]\:shadow:is(:where(.group)[data-variant=floating] *){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-\[\.destructive\]\:border-muted\/40:is(:where(.group).destructive *){border-color:color-mix(in srgb,hsl(var(--muted))40%,transparent)}@supports (color:color-mix(in lab,red,red)){.group-\[\.destructive\]\:border-muted\/40:is(:where(.group).destructive *){border-color:color-mix(in oklab,var(--color-muted)40%,transparent)}}.group-\[\.destructive\]\:text-red-300:is(:where(.group).destructive *){color:var(--color-red-300)}@media (hover:hover){.peer-hover\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button):hover~*){color:var(--color-sidebar-accent-foreground)}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[active\=true\]\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button)[data-active=true]~*){color:var(--color-sidebar-accent-foreground)}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing)*1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing)*2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:calc(var(--spacing)*1)}.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-theme\(spacing\.4\)\)\]:is(:where(.peer)[data-variant=inset]~*){min-height:calc(100svh - 1rem)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--color-foreground)}.placeholder\:overflow-hidden::placeholder{overflow:hidden}.placeholder\:text-ellipsis::placeholder{text-overflow:ellipsis}.placeholder\:whitespace-nowrap::placeholder{white-space:nowrap}.placeholder\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing)*-2)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:calc(var(--spacing)*0)}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:calc(var(--spacing)*1)}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}@media (hover:hover){.hover\:border-sidebar-foreground\/40:hover{border-color:color-mix(in srgb,hsl(var(--sidebar-foreground))40%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:border-sidebar-foreground\/40:hover{border-color:color-mix(in oklab,var(--color-sidebar-foreground)40%,transparent)}}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-accent\/50:hover{background-color:color-mix(in srgb,hsl(var(--accent))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,var(--color-accent)50%,transparent)}}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-destructive\/15:hover{background-color:color-mix(in srgb,hsl(var(--destructive))15%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/15:hover{background-color:color-mix(in oklab,var(--color-destructive)15%,transparent)}}.hover\:bg-destructive\/20:hover{background-color:color-mix(in srgb,hsl(var(--destructive))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab,var(--color-destructive)20%,transparent)}}.hover\:bg-destructive\/80:hover{background-color:color-mix(in srgb,hsl(var(--destructive))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/80:hover{background-color:color-mix(in oklab,var(--color-destructive)80%,transparent)}}.hover\:bg-destructive\/90:hover{background-color:color-mix(in srgb,hsl(var(--destructive))90%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--color-destructive)90%,transparent)}}.hover\:bg-muted:hover{background-color:var(--color-muted)}.hover\:bg-muted\/30:hover{background-color:color-mix(in srgb,hsl(var(--muted))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/30:hover{background-color:color-mix(in oklab,var(--color-muted)30%,transparent)}}.hover\:bg-muted\/50:hover{background-color:color-mix(in srgb,hsl(var(--muted))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.hover\:bg-muted\/60:hover{background-color:color-mix(in srgb,hsl(var(--muted))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/60:hover{background-color:color-mix(in oklab,var(--color-muted)60%,transparent)}}.hover\:bg-primary-foreground\/20:hover{background-color:color-mix(in srgb,hsl(var(--primary-foreground))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary-foreground\/20:hover{background-color:color-mix(in oklab,var(--color-primary-foreground)20%,transparent)}}.hover\:bg-primary\/10:hover{background-color:color-mix(in srgb,hsl(var(--primary))10%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab,var(--color-primary)10%,transparent)}}.hover\:bg-primary\/80:hover{background-color:color-mix(in srgb,hsl(var(--primary))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab,var(--color-primary)80%,transparent)}}.hover\:bg-primary\/90:hover{background-color:color-mix(in srgb,hsl(var(--primary))90%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--color-primary)90%,transparent)}}.hover\:bg-secondary:hover{background-color:var(--color-secondary)}.hover\:bg-secondary\/80:hover{background-color:color-mix(in srgb,hsl(var(--secondary))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--color-secondary)80%,transparent)}}.hover\:bg-sidebar-accent:hover{background-color:var(--color-sidebar-accent)}.hover\:text-accent-foreground:hover{color:var(--color-accent-foreground)}.hover\:text-amber-400:hover{color:var(--color-amber-400)}.hover\:text-destructive:hover{color:var(--color-destructive)}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:text-foreground\/80:hover{color:color-mix(in srgb,hsl(var(--foreground))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:text-foreground\/80:hover{color:color-mix(in oklab,var(--color-foreground)80%,transparent)}}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-primary-foreground\/80:hover{color:color-mix(in srgb,hsl(var(--primary-foreground))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary-foreground\/80:hover{color:color-mix(in oklab,var(--color-primary-foreground)80%,transparent)}}.hover\:text-primary\/80:hover{color:color-mix(in srgb,hsl(var(--primary))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,var(--color-primary)80%,transparent)}}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-sidebar-accent-foreground:hover{color:var(--color-sidebar-accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-accent)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-data-\[collapsible\=offcanvas\]\:hover\:bg-sidebar:is(:where(.group)[data-collapsible=offcanvas] *):hover{background-color:var(--color-sidebar)}.group-\[\.destructive\]\:hover\:border-destructive\/30:is(:where(.group).destructive *):hover{border-color:color-mix(in srgb,hsl(var(--destructive))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.group-\[\.destructive\]\:hover\:border-destructive\/30:is(:where(.group).destructive *):hover{border-color:color-mix(in oklab,var(--color-destructive)30%,transparent)}}.group-\[\.destructive\]\:hover\:bg-destructive:is(:where(.group).destructive *):hover{background-color:var(--color-destructive)}.group-\[\.destructive\]\:hover\:text-destructive-foreground:is(:where(.group).destructive *):hover{color:var(--color-destructive-foreground)}.group-\[\.destructive\]\:hover\:text-red-50:is(:where(.group).destructive *):hover{color:var(--color-red-50)}.hover\:after\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:var(--color-sidebar-border)}}.focus\:bg-accent:focus{background-color:var(--color-accent)}.focus\:text-accent-foreground:focus{color:var(--color-accent-foreground)}.focus\:text-destructive:focus{color:var(--color-destructive)}.focus\:opacity-100:focus{opacity:1}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-primary\/40:focus{--tw-ring-color:color-mix(in srgb,hsl(var(--primary))40%,transparent)}@supports (color:color-mix(in lab,red,red)){.focus\:ring-primary\/40:focus{--tw-ring-color:color-mix(in oklab,var(--color-primary)40%,transparent)}}.focus\:ring-ring:focus{--tw-ring-color:var(--color-ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.group-\[\.destructive\]\:focus\:ring-destructive:is(:where(.group).destructive *):focus{--tw-ring-color:var(--color-destructive)}.group-\[\.destructive\]\:focus\:ring-red-400:is(:where(.group).destructive *):focus{--tw-ring-color:var(--color-red-400)}.group-\[\.destructive\]\:focus\:ring-offset-red-600:is(:where(.group).destructive *):focus{--tw-ring-offset-color:var(--color-red-600)}.focus-visible\:h-9:focus-visible{height:calc(var(--spacing)*9)}.focus-visible\:border-primary\/50:focus-visible{border-color:color-mix(in srgb,hsl(var(--primary))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:border-primary\/50:focus-visible{border-color:color-mix(in oklab,var(--color-primary)50%,transparent)}}.focus-visible\:border-ring:focus-visible{border-color:var(--color-ring)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-primary\/30:focus-visible{--tw-ring-color:color-mix(in srgb,hsl(var(--primary))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-primary\/30:focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-primary)30%,transparent)}}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--color-ring)}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in srgb,hsl(var(--ring))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-ring)50%,transparent)}}.focus-visible\:ring-sidebar-ring:focus-visible{--tw-ring-color:var(--color-sidebar-ring)}.focus-visible\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:bg-sidebar-accent:active{background-color:var(--color-sidebar-accent)}.active\:text-sidebar-accent-foreground:active{color:var(--color-sidebar-accent-foreground)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-\[\[data-variant\=inset\]\]\:bg-sidebar:has([data-variant=inset]){background-color:var(--color-sidebar)}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.data-\[active\=true\]\:bg-sidebar-accent[data-active=true]{background-color:var(--color-sidebar-accent)}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[active\=true\]\:text-sidebar-accent-foreground[data-active=true]{color:var(--color-sidebar-accent-foreground)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:calc(var(--spacing)*0)}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:calc(var(--spacing)*1)}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-.5rem}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:.5rem}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-.5rem}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:.5rem}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--color-background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--color-foreground)}.data-\[state\=active\]\:shadow[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--tw-translate-x: calc(100% - 2px) ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--color-primary)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=closed\]\:animate-out[data-state=closed]{--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial;animation-name:exit;animation-duration:.15s}.data-\[state\=closed\]\:duration-300[data-state=closed]{animation-duration:.3s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--color-accent)}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:var(--color-secondary)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--color-accent-foreground)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--color-muted-foreground)}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=open\]\:animate-in[data-state=open]{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.data-\[state\=open\]\:duration-500[data-state=open]{animation-duration:.5s}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}@media (hover:hover){.data-\[state\=open\]\:hover\:bg-sidebar-accent[data-state=open]:hover{background-color:var(--color-sidebar-accent)}.data-\[state\=open\]\:hover\:text-sidebar-accent-foreground[data-state=open]:hover{color:var(--color-sidebar-accent-foreground)}}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--color-input)}@media (min-width:40rem){.sm\:top-auto{top:auto}.sm\:right-0{right:calc(var(--spacing)*0)}.sm\:bottom-0{bottom:calc(var(--spacing)*0)}.sm\:flex{display:flex}.sm\:inline{display:inline}.sm\:max-w-5xl{max-width:var(--container-5xl)}.sm\:max-w-\[425px\]{max-width:425px}.sm\:max-w-\[525px\]{max-width:525px}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:text-left{text-align:left}}@media (min-width:48rem){.md\:block{display:block}.md\:flex{display:flex}.md\:max-w-\[420px\]{max-width:420px}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing)*2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing)*0)}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:var(--radius-xl)}.md\:peer-data-\[variant\=inset\]\:shadow:is(:where(.peer)[data-variant=inset]~*){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2:is(:where(.peer)[data-state=collapsed]~*):is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing)*2)}}.after\:md\:hidden:after{content:var(--tw-content)}@media (min-width:48rem){.after\:md\:hidden:after{display:none}}@media (min-width:64rem){.lg\:flex{display:flex}.lg\:hidden{display:none}}.dark\:block:is(.dark *){display:block}.dark\:hidden:is(.dark *){display:none}.dark\:scale-0:is(.dark *){--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.dark\:scale-100:is(.dark *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.dark\:-rotate-90:is(.dark *){rotate:-90deg}.dark\:rotate-0:is(.dark *){rotate:none}.dark\:border-amber-400:is(.dark *){border-color:var(--color-amber-400)}.dark\:border-amber-500\/20:is(.dark *){border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.dark\:border-amber-500\/20:is(.dark *){border-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.dark\:border-amber-800:is(.dark *){border-color:var(--color-amber-800)}.dark\:border-amber-900:is(.dark *){border-color:var(--color-amber-900)}.dark\:border-blue-400:is(.dark *){border-color:var(--color-blue-400)}.dark\:border-blue-500\/40:is(.dark *){border-color:#3080ff66}@supports (color:color-mix(in lab,red,red)){.dark\:border-blue-500\/40:is(.dark *){border-color:color-mix(in oklab,var(--color-blue-500)40%,transparent)}}.dark\:border-destructive:is(.dark *){border-color:var(--color-destructive)}.dark\:border-green-400:is(.dark *){border-color:var(--color-green-400)}.dark\:border-purple-400:is(.dark *){border-color:var(--color-purple-400)}.dark\:border-purple-500\/40:is(.dark *){border-color:#ac4bff66}@supports (color:color-mix(in lab,red,red)){.dark\:border-purple-500\/40:is(.dark *){border-color:color-mix(in oklab,var(--color-purple-500)40%,transparent)}}.dark\:bg-amber-400:is(.dark *){background-color:var(--color-amber-400)}.dark\:bg-amber-900\/40:is(.dark *){background-color:#7b330666}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-900\/40:is(.dark *){background-color:color-mix(in oklab,var(--color-amber-900)40%,transparent)}}.dark\:bg-amber-950:is(.dark *){background-color:var(--color-amber-950)}.dark\:bg-amber-950\/30:is(.dark *){background-color:#4619014d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-950\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-amber-950)30%,transparent)}}.dark\:bg-amber-950\/50:is(.dark *){background-color:#46190180}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-950\/50:is(.dark *){background-color:color-mix(in oklab,var(--color-amber-950)50%,transparent)}}.dark\:bg-blue-900\/20:is(.dark *){background-color:#1c398e33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-900\/20:is(.dark *){background-color:color-mix(in oklab,var(--color-blue-900)20%,transparent)}}.dark\:bg-gray-900\/50:is(.dark *){background-color:#10182880}@supports (color:color-mix(in lab,red,red)){.dark\:bg-gray-900\/50:is(.dark *){background-color:color-mix(in oklab,var(--color-gray-900)50%,transparent)}}.dark\:bg-green-400:is(.dark *){background-color:var(--color-green-400)}.dark\:bg-green-900\/20:is(.dark *){background-color:#0d542b33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-900\/20:is(.dark *){background-color:color-mix(in oklab,var(--color-green-900)20%,transparent)}}.dark\:bg-green-900\/40:is(.dark *){background-color:#0d542b66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-900\/40:is(.dark *){background-color:color-mix(in oklab,var(--color-green-900)40%,transparent)}}.dark\:bg-purple-400:is(.dark *){background-color:var(--color-purple-400)}.dark\:bg-purple-900\/20:is(.dark *){background-color:#59168b33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-purple-900\/20:is(.dark *){background-color:color-mix(in oklab,var(--color-purple-900)20%,transparent)}}.dark\:bg-purple-900\/40:is(.dark *){background-color:#59168b66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-purple-900\/40:is(.dark *){background-color:color-mix(in oklab,var(--color-purple-900)40%,transparent)}}.dark\:text-amber-300:is(.dark *){color:var(--color-amber-300)}.dark\:text-amber-400:is(.dark *){color:var(--color-amber-400)}.dark\:text-blue-300:is(.dark *){color:var(--color-blue-300)}.dark\:text-blue-400:is(.dark *){color:var(--color-blue-400)}.dark\:text-gray-400:is(.dark *){color:var(--color-gray-400)}.dark\:text-gray-500:is(.dark *){color:var(--color-gray-500)}.dark\:text-green-300:is(.dark *){color:var(--color-green-300)}.dark\:text-green-400:is(.dark *){color:var(--color-green-400)}.dark\:text-purple-300:is(.dark *){color:var(--color-purple-300)}.dark\:text-purple-400:is(.dark *){color:var(--color-purple-400)}@media (hover:hover){.dark\:hover\:bg-amber-900:is(.dark *):hover{background-color:var(--color-amber-900)}.dark\:hover\:bg-amber-900\/50:is(.dark *):hover{background-color:#7b330680}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-amber-900\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--color-amber-900)50%,transparent)}}.dark\:hover\:text-gray-300:is(.dark *):hover{color:var(--color-gray-300)}}.dark\:data-\[state\=checked\]\:bg-primary-foreground:is(.dark *)[data-state=checked]{background-color:var(--color-primary-foreground)}.dark\:data-\[state\=unchecked\]\:bg-foreground:is(.dark *)[data-state=unchecked]{background-color:var(--color-foreground)}.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:color-mix(in srgb,hsl(var(--input))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:color-mix(in oklab,var(--color-input)80%,transparent)}}.\[\&_\[data-radix-scroll-area-viewport\]\>div\]\:\!block [data-radix-scroll-area-viewport]>div{display:block!important}.\[\&_h1\]\:my-2 h1{margin-block:calc(var(--spacing)*2)}.\[\&_h1\]\:text-base h1{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.\[\&_h2\]\:my-1\.5 h2{margin-block:calc(var(--spacing)*1.5)}.\[\&_h2\]\:text-sm h2{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\[\&_h3\]\:my-1 h3{margin-block:calc(var(--spacing)*1)}.\[\&_h3\]\:text-sm h3{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\[\&_li\]\:my-0\.5 li{margin-block:calc(var(--spacing)*.5)}.\[\&_ol\]\:my-1 ol,.\[\&_p\]\:my-1 p{margin-block:calc(var(--spacing)*1)}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_pre\]\:overflow-x-auto pre{overflow-x:auto}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_ul\]\:my-1 ul{margin-block:calc(var(--spacing)*1)}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>div\>div\]\:\!h-full>div>div{height:100%!important}.\[\&\>span\]\:truncate>span,.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing)*4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing)*4)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-destructive>svg{color:var(--color-destructive)}.\[\&\>svg\]\:text-foreground>svg{color:var(--color-foreground)}.\[\&\>svg\]\:text-sidebar-accent-foreground>svg{color:var(--color-sidebar-accent-foreground)}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x)var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing)*7)}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{rotate:90deg}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:calc(var(--spacing)*-2)}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize,[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:calc(var(--spacing)*-2)}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}body{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0))}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/docx-preview-DQa8jhzH.js","assets/react-vendor-CTFDOf2G.js"])))=>i.map(i=>d[i]);
2
- import{j as e,c as L,r as d}from"./react-vendor-CTFDOf2G.js";import{S as F,c as S,g as H,F as C,_ as ae,j as ne,A as W}from"./index-DnOFpa21.js";import{S as E,B as ie,P as oe,b as le,D as ce,c as de,d as me,e as ue}from"./HomePage-DDMC2eP4.js";import{e as xe,T as $,I as fe}from"./ui-vendor-Dyg3GRT-.js";import{d as B,b as he,u as G}from"./MonacoPluginProvider-BuruiMGP.js";import{af as q,ag as pe}from"./radix-ui-BZ5iKMtq.js";import"./query-vendor-Df8-oete.js";import"./monaco-editor-BcgxPCqT.js";import"./button-cJfzi3Hb.js";import"./state-vendor-BDrPu9qj.js";function ge({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"},l=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 c=o===l,u=o<l;return e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex justify-between text-xs",children:[e.jsx("span",{className:S(c?"text-primary font-medium":u?"text-muted-foreground":"text-muted-foreground/60"),children:s[i]}),e.jsx("span",{className:"text-muted-foreground",children:u?"✓":c?"...":"○"})]}),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":c?"bg-primary animate-pulse":"bg-transparent"),style:{width:u||c?"100%":"0%"}})})]},i)})})]})}function be({renderingLibrary:r,className:t}){const a=l=>{switch(l){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},l)=>{const[i,o]=d.useState(!1);d.useEffect(()=>{o(!1)},[t,a]);const c=()=>{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(ge,{currentStage:s==null?void 0:s.stage,message:s==null?void 0:s.message})}):r&&!h?e.jsx("div",{className:"grow",children:e.jsx(be,{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:l,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:c,onError:u,sandbox:g,title:"Document preview","aria-label":`Preview of rendered ${H.toLowerCase()}`},a?"srcdoc":"src")]}):null});J.displayName="PreviewFrame";const je=L.memo(J);function we({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,l)=>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)})]})]})]},l))})]})}async function ve(r){const t=await ae(()=>import("./docx-preview-DQa8jhzH.js"),__vite__mapDeps([0,1])),a=document.createElement("body"),n=document.createElement("head"),s=t.renderAsync(r,a,n,{inWrapper:!0}),l=new Promise((c,u)=>{setTimeout(()=>{u(new Error("DocxJS renderAsync timed out after 10 seconds"))},1e4)});await Promise.race([s,l]);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 Ne(r,t){const a=new FormData,n=C==="pptx"?".pptx":".docx";a.append("file",t,`${r}${n}`);const s=await fetch(W.preview.libreoffice,{method:"POST",body:a});if(!s.ok){let o=`LibreOffice preview failed (${s.status})`;try{const c=await s.json();c&&typeof c=="object"&&typeof c.error=="string"&&(o=c.error)}catch{}throw new Error(o)}const l=await s.blob();if(!l.size)throw new Error("LibreOffice preview returned an empty PDF");const i=URL.createObjectURL(l);return{iframeSrc:i,cleanup:()=>URL.revokeObjectURL(i)}}async function ye(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 ve(t):s=await Ne(r,t),{status:"success",name:r,payload:s}}catch(s){const l=s instanceof Error?s.message:String(s);return{status:"error",name:r,payload:new Error(l)}}}const I=d.forwardRef(({className:r,value:t,...a},n)=>e.jsx(q,{ref:n,className:S("relative h-4 w-full overflow-hidden rounded-full bg-secondary",r),...a,children:e.jsx(pe,{className:"h-full w-full flex-1 bg-primary transition-all",style:{transform:`translateX(-${100-(t||0)}%)`}})}));I.displayName=q.displayName;function V(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 Ee(){const[r,t]=d.useState(null),[a,n]=d.useState(!0),[s,l]=d.useState(null);if(d.useEffect(()=>{const c=new AbortController,u=async()=>{try{const f=await fetch(W.cacheStats,{signal:c.signal});if(!f.ok)throw new Error("Failed to fetch cache stats");const w=await f.json();c.signal.aborted||(t(w.data),l(null))}catch(f){c.signal.aborted||(f instanceof Error&&f.name!=="AbortError"?l(f.message):(!(f instanceof Error)||f.name!=="AbortError")&&l("Failed to load cache stats"))}finally{c.signal.aborted||n(!1)}};u();const g=setInterval(u,5e3),h=()=>u();return window.addEventListener("cache:cleared",h),()=>{c.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:V(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(Se,{data:r.components})]})}function Se({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:V(s)})]})]}),e.jsx(I,{value:a,className:"h-1.5"})]},t.type)})})]})}const Re=d.memo(function({editTimestamp:t,debounceMs:a}){const[n,s]=d.useState(()=>Math.max(0,t+a-Date.now()));if(d.useEffect(()=>{let o;const c=()=>{const u=Math.max(0,t+a-Date.now());s(u),u<=0&&o!=null&&clearInterval(o)};return c(),o=setInterval(c,100),()=>{o!=null&&clearInterval(o)}},[t,a]),n<=0)return null;const l=(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`}}),l,"s"]})});function Te(){var U,_;const{autoReload:r,renderingLibrary:t,saveDocumentDebounceWait:a,setSettings:n}=B(m=>m),{name:s,text:l,blob:i,isGenerating:o,generationProgress:c,globalError:u,cacheStatus:g,cacheHitRate:h,warnings:f,isRendering:w,isPreviewStale:K,editSequence:X,lastBuiltSequence:Q,editTimestamp:T,hasValidationErrors:Y,setOutput:j}=he(m=>m),b=G(m=>m.activeTab),A=G(m=>m.documentTypes),[v,Z]=d.useState(void 0),[ee,se]=d.useState(void 0),[te,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 ye(m,x,t);if(y!=="success")throw p instanceof Error?p:new Error(String(p));k(),Z(p.iframeSrc||void 0),se(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]),re=d.useRef({name:s,blob:i,doRender:N});d.useEffect(()=>{re.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:l,warnings:f,renderingLibrary:t,setRenderingLibrary:m=>n({renderingLibrary:m})}),e.jsx(le,{}),(()=>{const m=(X??0)>(Q??0),x=(K||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 ",H.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&&!Y&&r&&t==="docxjs"&&e.jsx(Re,{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(we,{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(je,{ref:z,isLoading:!!w,iframeSrc:v,iframeSrcDoc:ee,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}...`}:c})()})]}),e.jsx(ce,{open:te,onOpenChange:D,children:e.jsxs(de,{className:"max-w-2xl",children:[e.jsx(me,{children:e.jsx(ue,{children:"Cache Performance"})}),e.jsx(Ee,{})]})})]})}export{Te as Preview};
3
- //# sourceMappingURL=preview-CCFdky9H.js.map