@kosmas10/portal 0.0.6 → 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.6",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.6",
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",
@@ -3,64 +3,31 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>AI Chat Extensions Portal</title>
6
+ <title>Portal</title>
7
7
  </head>
8
8
  <body>
9
9
  <div id="root"></div>
10
10
  <script>
11
11
  /**
12
- * Portal Bootstrap Loader
12
+ * App Loader Bootstrap v1
13
13
  * Copyright (c) 2025 Nova Science Ventures LLC
14
14
  * Created by Kosmas Karadimitriou
15
15
  *
16
16
  * Licensed under the MIT License
17
17
  * GitHub: https://github.com/kosmas10/ai-chat-extensions
18
18
  *
19
- * Loads app from CDN and injects into current document (preserves Claude's fetch proxy)
20
- *
21
- * NOTE: Do NOT use registry.npmjs.org - Claude Artifacts blocks it.
22
- * Always use cdn.jsdelivr.net for both version lookup and file fetch.
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.
23
22
  */
24
- (async function() {
25
- var APP = '@kosmas10/portal';
26
- var FILE = 'dist/portal.html';
27
-
28
- try {
29
- // Get latest version from CDN (NOT registry.npmjs.org - blocked in Claude Artifacts)
30
- var pkg = await fetch('https://cdn.jsdelivr.net/npm/' + APP + '@latest/package.json?t=' + Date.now()).then(r => r.json());
31
- var html = await fetch('https://cdn.jsdelivr.net/npm/' + APP + '@' + pkg.version + '/' + FILE).then(r => r.text());
32
-
33
- // Inject all styles
34
- var styles = html.matchAll(/<style[^>]*>([\s\S]*?)<\/style>/gi);
35
- for (var m of styles) {
36
- var s = document.createElement('style');
37
- s.textContent = m[1];
38
- document.head.appendChild(s);
39
- }
40
-
41
- // Inject all scripts
42
- var scripts = html.matchAll(/<script[^>]*>([\s\S]*?)<\/script>/gi);
43
- for (var m of scripts) {
44
- var s = document.createElement('script');
45
- s.textContent = m[1];
46
- document.body.appendChild(s);
47
- }
48
- } catch (e) {
49
- document.body.innerHTML = '<div style="max-width:600px;margin:40px auto;padding:30px;font-family:system-ui,sans-serif;background:#fff;border:2px solid #dc3545;border-radius:12px;box-shadow:0 4px 20px rgba(0,0,0,0.1)">' +
50
- '<h1 style="color:#dc3545;margin:0 0 15px 0;font-size:1.5em">⚠️ Unable to Load Portal</h1>' +
51
- '<p style="background:#f8f9fa;padding:10px;border-radius:6px;font-family:monospace;font-size:0.9em;color:#666">' + e.message + '</p>' +
52
- '<h2 style="font-size:1.1em;margin:20px 0 10px 0">What you can try:</h2>' +
53
- '<ul style="margin:0;padding-left:20px;line-height:1.8">' +
54
- '<li><strong>Refresh the page</strong> - Sometimes a simple refresh fixes temporary issues</li>' +
55
- '<li><strong>Check your internet connection</strong> - The app needs to download from the internet</li>' +
56
- '<li><strong>Wait a moment and try again</strong> - The server might be temporarily busy</li>' +
57
- '<li><strong>Try a different browser</strong> - Some browser extensions can interfere</li>' +
58
- '</ul>' +
59
- '<p style="margin-top:20px;padding-top:15px;border-top:1px solid #eee;color:#666;font-size:0.9em">' +
60
- 'If the problem persists, please report it at: ' +
61
- '<a href="https://github.com/kosmas10/ai-chat-extensions/issues" target="_blank" style="color:#0066cc">github.com/kosmas10/ai-chat-extensions</a>' +
62
- '</p></div>';
63
- }
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);
64
31
  })();
65
32
  </script>
66
33
  </body>