@kosmas10/portal 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/portal.html CHANGED
@@ -59,7 +59,7 @@ Error generating stack: `+u.message+`
59
59
  *
60
60
  * This source code is licensed under the ISC license.
61
61
  * See the LICENSE file in the root directory of this source tree.
62
- */const Fd=Id("Folder",[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]),Ql={},Au="https://cdn.jsdelivr.net/npm/@kosmas10/";async function Ud(e){if(Ql[e])return Ql[e];try{const t=Date.now(),n=Au+e+"@latest/package.json?t="+t,r=await fetch(n);if(!r.ok)throw new Error("Failed to fetch package.json: HTTP "+r.status);const l=await r.json();if(!l.version)throw new Error("package.json does not contain version field");return Ql[e]=l.version,l.version}catch(t){return console.error("Portal: Error fetching latest version for",e,":",t),"latest"}}function Ad({app:e,onLaunch:t}){const[n,r]=Fe.useState(!1),[l,u]=Fe.useState(!1),o=Fe.useCallback(async c=>{c.stopPropagation(),u(!0);try{await t(e.packageName)}finally{u(!1)}},[e.packageName,t]),s={green:{accentGradient:"linear-gradient(135deg, #a7f3d0, #6ee7b7)",iconGradient:"linear-gradient(135deg, #a7f3d0, #6ee7b7)",buttonGradient:"linear-gradient(135deg, #a7f3d0, #6ee7b7)",buttonHoverShadow:"0 10px 20px rgba(167, 243, 208, 0.3)"},yellow:{accentGradient:"linear-gradient(135deg, #fde68a, #fbbf24)",iconGradient:"linear-gradient(135deg, #fde68a, #fbbf24)",buttonGradient:"linear-gradient(135deg, #fde68a, #fbbf24)",buttonHoverShadow:"0 10px 20px rgba(253, 230, 138, 0.3)"}}[e.theme];return K.jsxs("div",{className:"relative bg-white transition-all duration-300 cursor-pointer overflow-hidden w-full",onMouseEnter:()=>r(!0),onMouseLeave:()=>r(!1),onClick:o,style:{borderRadius:"15px",padding:"30px",boxShadow:n?"0 20px 40px rgba(0, 0, 0, 0.15)":"0 10px 30px rgba(0, 0, 0, 0.1)",border:"2px solid transparent",borderColor:n?"#d1d5db":"transparent",transform:n?"translateY(-5px) scale(1.02)":"translateY(0) scale(1)"},children:[K.jsx("div",{className:"absolute top-0 left-0 right-0",style:{height:"4px",background:s.accentGradient}}),K.jsx("div",{className:"mx-auto rounded-full flex items-center justify-center",style:{width:"60px",height:"60px",marginBottom:"20px",background:s.iconGradient},children:e.iconType==="checkmark"?K.jsx("div",{className:"relative",style:{width:"8px",height:"16px",borderRight:"4px solid #1f2937",borderBottom:"4px solid #1f2937",transform:"rotate(45deg)",marginTop:"-2px"}}):K.jsx(Fd,{className:"w-6 h-6 text-gray-800"})}),K.jsx("h2",{className:"font-semibold text-center",style:{fontSize:"1.5rem",color:"#333",marginBottom:"15px"},children:e.title}),K.jsx("p",{className:"text-center",style:{color:"#666",lineHeight:1.6,marginBottom:"25px",fontSize:"0.95rem"},children:e.description}),K.jsx("button",{className:"w-full transition-all duration-300 disabled:opacity-50 disabled:cursor-not-allowed",onClick:o,disabled:l,style:{background:s.buttonGradient,color:"#1f2937",border:"none",padding:"12px 30px",borderRadius:"25px",fontSize:"1rem",fontWeight:700,fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',cursor:"pointer"},onMouseEnter:c=>{l||(c.currentTarget.style.transform="translateY(-2px)",c.currentTarget.style.boxShadow=s.buttonHoverShadow)},onMouseLeave:c=>{c.currentTarget.style.transform="translateY(0)",c.currentTarget.style.boxShadow="none"},children:l?"Loading...":e.buttonLabel})]})}const Vd="0.0.5",Bd=[{id:"chat-verify",packageName:"chat-and-verify",title:"Chat & Verify",description:"Chat with citations and highlights in the source document for easy verifications.",iconType:"checkmark",theme:"green",buttonLabel:"Launch Chat & Verify"},{id:"folder-analyzer",packageName:"folder-llm-analyzer",title:"Folder LLM Analyzer",description:"Runs the same LLM query on each file in a folder and displays results in a grid.",iconType:"folder",theme:"yellow",buttonLabel:"Launch Folder Analyzer"}];function Hd(){const e=Fe.useCallback(async t=>{try{const n=await Ud(t),r=Au+t+"@"+n+"/"+t+"-bootstrap.html";window.open(r,"_blank")}catch(n){console.error("Portal: Error opening app",t,":",n);const r=Au+t+"@latest/"+t+"-bootstrap.html";window.open(r,"_blank")}},[]);return K.jsxs("div",{className:"min-h-screen flex items-start justify-center px-5 overflow-x-hidden",style:{background:"linear-gradient(135deg, #d4c4a8 0%, #c4b5a0 100%)",padding:"60px 20px 20px 20px"},children:[K.jsxs("div",{className:"fixed z-50 font-sans",style:{top:"5px",right:"10px",fontSize:"0.7rem",opacity:.5,color:"#6b7280"},children:["v",Vd]}),K.jsxs("div",{className:"bg-white/95 backdrop-blur-sm w-full text-center",style:{borderRadius:"20px",padding:"40px 70px 70px 70px",boxShadow:"0 20px 40px rgba(0, 0, 0, 0.1)",maxWidth:"871px"},children:[K.jsx(Md,{title:"AI Chat Extensions",subtitle:"Tools and extensions to enhance AI chat productivity."}),K.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 w-full",style:{gap:"30px",marginTop:"40px"},children:Bd.map(t=>K.jsx(Ad,{app:t,onLaunch:e},t.id))})]})]})}Kl.createRoot(document.getElementById("root")).render(K.jsx(kc.StrictMode,{children:K.jsx(Hd,{})}));</script>
62
+ */const Fd=Id("Folder",[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]),Ql={},Au="https://cdn.jsdelivr.net/npm/@kosmas10/";async function Ud(e){if(Ql[e])return Ql[e];try{const t=Date.now(),n=Au+e+"@latest/package.json?t="+t,r=await fetch(n);if(!r.ok)throw new Error("Failed to fetch package.json: HTTP "+r.status);const l=await r.json();if(!l.version)throw new Error("package.json does not contain version field");return Ql[e]=l.version,l.version}catch(t){return console.error("Portal: Error fetching latest version for",e,":",t),"latest"}}function Ad({app:e,onLaunch:t}){const[n,r]=Fe.useState(!1),[l,u]=Fe.useState(!1),o=Fe.useCallback(async c=>{c.stopPropagation(),u(!0);try{await t(e.packageName)}finally{u(!1)}},[e.packageName,t]),s={green:{accentGradient:"linear-gradient(135deg, #a7f3d0, #6ee7b7)",iconGradient:"linear-gradient(135deg, #a7f3d0, #6ee7b7)",buttonGradient:"linear-gradient(135deg, #a7f3d0, #6ee7b7)",buttonHoverShadow:"0 10px 20px rgba(167, 243, 208, 0.3)"},yellow:{accentGradient:"linear-gradient(135deg, #fde68a, #fbbf24)",iconGradient:"linear-gradient(135deg, #fde68a, #fbbf24)",buttonGradient:"linear-gradient(135deg, #fde68a, #fbbf24)",buttonHoverShadow:"0 10px 20px rgba(253, 230, 138, 0.3)"}}[e.theme];return K.jsxs("div",{className:"relative bg-white transition-all duration-300 cursor-pointer overflow-hidden w-full",onMouseEnter:()=>r(!0),onMouseLeave:()=>r(!1),onClick:o,style:{borderRadius:"15px",padding:"30px",boxShadow:n?"0 20px 40px rgba(0, 0, 0, 0.15)":"0 10px 30px rgba(0, 0, 0, 0.1)",border:"2px solid transparent",borderColor:n?"#d1d5db":"transparent",transform:n?"translateY(-5px) scale(1.02)":"translateY(0) scale(1)"},children:[K.jsx("div",{className:"absolute top-0 left-0 right-0",style:{height:"4px",background:s.accentGradient}}),K.jsx("div",{className:"mx-auto rounded-full flex items-center justify-center",style:{width:"60px",height:"60px",marginBottom:"20px",background:s.iconGradient},children:e.iconType==="checkmark"?K.jsx("div",{className:"relative",style:{width:"8px",height:"16px",borderRight:"4px solid #1f2937",borderBottom:"4px solid #1f2937",transform:"rotate(45deg)",marginTop:"-2px"}}):K.jsx(Fd,{className:"w-6 h-6 text-gray-800"})}),K.jsx("h2",{className:"font-semibold text-center",style:{fontSize:"1.5rem",color:"#333",marginBottom:"15px"},children:e.title}),K.jsx("p",{className:"text-center",style:{color:"#666",lineHeight:1.6,marginBottom:"25px",fontSize:"0.95rem"},children:e.description}),K.jsx("button",{className:"w-full transition-all duration-300 disabled:opacity-50 disabled:cursor-not-allowed",onClick:o,disabled:l,style:{background:s.buttonGradient,color:"#1f2937",border:"none",padding:"12px 30px",borderRadius:"25px",fontSize:"1rem",fontWeight:700,fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',cursor:"pointer"},onMouseEnter:c=>{l||(c.currentTarget.style.transform="translateY(-2px)",c.currentTarget.style.boxShadow=s.buttonHoverShadow)},onMouseLeave:c=>{c.currentTarget.style.transform="translateY(0)",c.currentTarget.style.boxShadow="none"},children:l?"Loading...":e.buttonLabel})]})}const Vd="0.0.7",Bd=[{id:"chat-verify",packageName:"chat-and-verify",title:"Chat & Verify",description:"Chat with citations and highlights in the source document for easy verifications.",iconType:"checkmark",theme:"green",buttonLabel:"Launch Chat & Verify"},{id:"folder-analyzer",packageName:"folder-llm-analyzer",title:"Folder LLM Analyzer",description:"Runs the same LLM query on each file in a folder and displays results in a grid.",iconType:"folder",theme:"yellow",buttonLabel:"Launch Folder Analyzer"}];function Hd(){const e=Fe.useCallback(async t=>{try{const n=await Ud(t),r=Au+t+"@"+n+"/"+t+"-bootstrap.html";window.open(r,"_blank")}catch(n){console.error("Portal: Error opening app",t,":",n);const r=Au+t+"@latest/"+t+"-bootstrap.html";window.open(r,"_blank")}},[]);return K.jsxs("div",{className:"min-h-screen flex items-start justify-center px-5 overflow-x-hidden",style:{background:"linear-gradient(135deg, #d4c4a8 0%, #c4b5a0 100%)",padding:"60px 20px 20px 20px"},children:[K.jsxs("div",{className:"fixed z-50 font-sans",style:{top:"5px",right:"10px",fontSize:"0.7rem",opacity:.5,color:"#6b7280"},children:["v",Vd]}),K.jsxs("div",{className:"bg-white/95 backdrop-blur-sm w-full text-center",style:{borderRadius:"20px",padding:"40px 70px 70px 70px",boxShadow:"0 20px 40px rgba(0, 0, 0, 0.1)",maxWidth:"871px"},children:[K.jsx(Md,{title:"AI Chat Extensions",subtitle:"Tools and extensions to enhance AI chat productivity."}),K.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 w-full",style:{gap:"30px",marginTop:"40px"},children:Bd.map(t=>K.jsx(Ad,{app:t,onLaunch:e},t.id))})]})]})}Kl.createRoot(document.getElementById("root")).render(K.jsx(kc.StrictMode,{children:K.jsx(Hd,{})}));</script>
63
63
  <style rel="stylesheet" crossorigin>*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.left-0{left:0}.right-0{right:0}.top-0{top:0}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.flex{display:flex}.grid{display:grid}.h-6{height:1.5rem}.min-h-screen{min-height:100vh}.w-6{width:1.5rem}.w-full{width:100%}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.overflow-hidden{overflow:hidden}.overflow-x-hidden{overflow-x:hidden}.rounded-full{border-radius:9999px}.border{border-width:1px}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/95{background-color:#fffffff2}.px-5{padding-left:1.25rem;padding-right:1.25rem}.text-center{text-align:center}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.font-bold{font-weight:700}.font-semibold{font-weight:600}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);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-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}body{margin:0;font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}</style>
64
64
  </head>
65
65
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kosmas10/portal",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "description": "A launcher portal for AI Chat Extensions applications. Provides a unified entry point to access Chat & Verify, Folder LLM Analyzer, and other AI-powered tools. Built with React and bundled for maximum reliability.",
5
5
  "type": "module",
6
6
  "main": "dist/portal.html",
@@ -64,4 +64,3 @@
64
64
  "lucide-react": "^0.344.0"
65
65
  }
66
66
  }
67
-
@@ -1,25 +1,34 @@
1
1
  <!DOCTYPE html>
2
- <html>
2
+ <html lang="en">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
- <title>Loading...</title>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Portal</title>
6
7
  </head>
7
8
  <body>
9
+ <div id="root"></div>
8
10
  <script>
9
- (async function() {
10
- var APP = '@kosmas10/portal';
11
- var FILE = 'dist/portal.html';
12
- try {
13
- var pkg = await fetch('https://cdn.jsdelivr.net/npm/' + APP + '@latest/package.json?t=' + Date.now()).then(r => r.json());
14
- var html = await fetch('https://cdn.jsdelivr.net/npm/' + APP + '@' + pkg.version + '/' + FILE + '?t=' + Date.now()).then(r => r.text());
15
- document.open();
16
- document.write(html);
17
- document.close();
18
- } catch (e) {
19
- document.body.innerHTML = '<div style="padding:40px;font-family:sans-serif;"><h1>Failed to Load</h1><p>' + e.message + '</p></div>';
20
- }
11
+ /**
12
+ * App Loader Bootstrap v1
13
+ * Copyright (c) 2025 Nova Science Ventures LLC
14
+ * Created by Kosmas Karadimitriou
15
+ *
16
+ * Licensed under the MIT License
17
+ * GitHub: https://github.com/kosmas10/ai-chat-extensions
18
+ *
19
+ * DO NOT MODIFY - This is Stage 1 of the two-stage loader.
20
+ * Stage 2 (the actual loader) is fetched from CDN and can be updated
21
+ * without requiring changes to this file.
22
+ */
23
+ (function() {
24
+ window.__LOADER__ = { app: 'portal', v: 1 };
25
+ var s = document.createElement('script');
26
+ s.src = 'https://cdn.jsdelivr.net/npm/@kosmas10/app-loader@latest/dist/app-loader.js';
27
+ s.onerror = function() {
28
+ document.body.innerHTML = '<p style="font-family:system-ui,sans-serif;color:#c00;padding:40px;text-align:center">Unable to load application. Please check your internet connection and refresh the page.</p>';
29
+ };
30
+ document.body.appendChild(s);
21
31
  })();
22
32
  </script>
23
33
  </body>
24
34
  </html>
25
-