@kosmas10/portal 0.0.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.
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Kosmas Karadimitriou
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md ADDED
@@ -0,0 +1,164 @@
1
+ # Portal
2
+
3
+ **Version:** 0.0.1
4
+ **Package:** `@kosmas10/portal`
5
+
6
+ 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.
7
+
8
+ ## 🎯 Key Features
9
+
10
+ - **🚀 Unified Launcher**: Single entry point for all AI Chat Extensions apps
11
+ - **📱 Responsive Design**: Works on desktop and mobile devices
12
+ - **⚡ Fast Loading**: 3-stage architecture for reliable, efficient loading
13
+ - **🔄 Auto-Updates**: Always loads the latest version of apps
14
+ - **💻 No Installation Required**: Single HTML file that runs in any modern browser
15
+
16
+ ## 🏗️ Architecture: 3-Stage Loading System
17
+
18
+ This application uses an innovative **3-stage loading architecture** designed for maximum reliability and flexibility:
19
+
20
+ ### Stage 1: Bootstrap (User Installs This)
21
+ - **File**: `portal-bootstrap.html`
22
+ - **Purpose**: Ultra-minimal loader that NEVER changes
23
+ - **Size**: ~2KB
24
+ - **What it does**: Loads Stage 2 from npm/CDN
25
+
26
+ ### Stage 2: Loader (Auto-Updates)
27
+ - **Package**: `@kosmas10/html-app-loader`
28
+ - **Purpose**: Sophisticated HTML app loader
29
+ - **What it does**: Handles complex loading logic, can be updated via npm
30
+
31
+ ### Stage 3: Application (Auto-Updates)
32
+ - **Package**: `@kosmas10/portal` (this package)
33
+ - **Purpose**: The actual Portal application
34
+ - **What it does**: Provides the launcher interface
35
+
36
+ ### Why This Architecture?
37
+
38
+ 1. **🛡️ Future-Proof**: Stage 1 never changes, so users never need to update their local file
39
+ 2. **🔄 Auto-Updates**: Stages 2 & 3 update automatically via npm/CDN
40
+ 3. **🐛 Bug Fixes**: Loader bugs can be fixed without user intervention
41
+ 4. **📦 Flexible**: Can adapt to new requirements without breaking existing installations
42
+
43
+ ## 🚀 Quick Start
44
+
45
+ ### Option A: Using the Bootstrap (Recommended)
46
+
47
+ 1. **Download the bootstrap file** (one time only):
48
+ ```bash
49
+ curl -O https://cdn.jsdelivr.net/npm/@kosmas10/portal@latest/portal-bootstrap.html
50
+ ```
51
+
52
+ 2. **Open it in your browser**:
53
+ - Double-click the file, or
54
+ - Open it from your browser's File menu
55
+
56
+ 3. **That's it!** The application will load automatically and stay up-to-date.
57
+
58
+ ### Option B: Direct CDN Link
59
+
60
+ Simply navigate to:
61
+ ```
62
+ https://cdn.jsdelivr.net/npm/@kosmas10/portal@latest/portal-bootstrap.html
63
+ ```
64
+
65
+ ### Option C: Load Specific Version
66
+
67
+ Use URL parameters to control versions:
68
+ ```
69
+ https://cdn.jsdelivr.net/npm/@kosmas10/portal@latest/portal-bootstrap.html?appVersion=0.0.1
70
+ ```
71
+
72
+ ## 📖 Available Applications
73
+
74
+ The Portal provides access to:
75
+
76
+ ### Chat & Verify
77
+ A chatbot with citations and highlights in source documents for easy verification of answers. Supports PDF and Word documents.
78
+
79
+ ### Folder LLM Analyzer
80
+ Analyze entire folders of files using Large Language Models. Upload a folder, ask questions, and get AI-powered insights.
81
+
82
+ ## 🔧 Advanced Configuration
83
+
84
+ ### URL Parameters
85
+
86
+ Control the loading behavior with URL parameters:
87
+
88
+ ```
89
+ ?loader=@kosmas10/html-app-loader # Use different Stage 2 loader
90
+ ?loaderVersion=1.0.0 # Pin Stage 2 version
91
+ ?app=@kosmas10/portal # Load different app
92
+ ?appVersion=0.0.1 # Pin app version
93
+ ?appFile=portal.html # Load specific file
94
+ ```
95
+
96
+ ### Example: Pin All Versions
97
+ ```
98
+ portal-bootstrap.html?loaderVersion=1.0.0&appVersion=0.0.1
99
+ ```
100
+
101
+ ## 📦 Package Structure
102
+
103
+ ```
104
+ @kosmas10/portal/
105
+ ├── portal.html # Main application (Stage 3)
106
+ ├── portal-bootstrap.html # Bootstrap loader (Stage 1)
107
+ ├── README.md # This file
108
+ └── LICENSE # MIT License
109
+ ```
110
+
111
+ ## 🌐 Browser Compatibility
112
+
113
+ - ✅ Chrome/Chromium 90+
114
+ - ✅ Firefox 88+
115
+ - ✅ Safari 14+
116
+ - ✅ Edge 90+
117
+
118
+ ## 🔒 Privacy & Security
119
+
120
+ - **No Tracking**: No analytics or tracking code
121
+ - **Open Source**: Full source code available for inspection
122
+ - **Local Storage**: Any settings stored locally in browser
123
+
124
+ ## 🐛 Troubleshooting
125
+
126
+ ### Application Won't Load
127
+
128
+ 1. Check your internet connection
129
+ 2. Ensure cdn.jsdelivr.net is accessible (not blocked by firewall)
130
+ 3. Try clearing browser cache
131
+ 4. Check browser console for errors (F12)
132
+
133
+ ## 📝 Version History
134
+
135
+ ### 0.0.1 (Current)
136
+ - Initial release
137
+ - Launcher interface for AI Chat Extensions apps
138
+ - 3-stage loading architecture
139
+
140
+ ## 🤝 Contributing
141
+
142
+ Contributions are welcome! Please visit:
143
+ https://github.com/kosmas10/ai-chat-extensions
144
+
145
+ ## 📄 License
146
+
147
+ MIT License - See LICENSE file for details
148
+
149
+ ## 🆘 Support
150
+
151
+ For issues, questions, or feature requests:
152
+ - **GitHub Issues**: https://github.com/kosmas10/ai-chat-extensions/issues
153
+ - **Package**: https://www.npmjs.com/package/@kosmas10/portal
154
+
155
+ ## 🔗 Related Packages
156
+
157
+ - **Stage 2 Loader**: [@kosmas10/html-app-loader](https://www.npmjs.com/package/@kosmas10/html-app-loader)
158
+ - **Chat & Verify**: [@kosmas10/chat-and-verify](https://www.npmjs.com/package/@kosmas10/chat-and-verify)
159
+ - **Folder LLM Analyzer**: [@kosmas10/folder-llm-analyzer](https://www.npmjs.com/package/@kosmas10/folder-llm-analyzer)
160
+
161
+ ---
162
+
163
+ **Made with ❤️ as a unified gateway to AI-powered tools**
164
+
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@kosmas10/portal",
3
+ "version": "0.0.2",
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. Part of a 3-stage loading architecture for maximum reliability.",
5
+ "main": "portal.html",
6
+ "files": [
7
+ "portal.html",
8
+ "portal-bootstrap.html",
9
+ "README.md",
10
+ "LICENSE"
11
+ ],
12
+ "scripts": {
13
+ "test": "echo \"No tests specified\" && exit 0",
14
+ "purge-cdn": "bash purge-cdn.sh"
15
+ },
16
+ "keywords": [
17
+ "portal",
18
+ "launcher",
19
+ "ai",
20
+ "llm",
21
+ "claude",
22
+ "openai",
23
+ "gpt",
24
+ "chat",
25
+ "document-analysis",
26
+ "folder-analyzer",
27
+ "claude-artifacts",
28
+ "ai-tools"
29
+ ],
30
+ "author": "Kosmas Karadimitriou",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/kosmas10/ai-chat-extensions.git",
35
+ "directory": "portal"
36
+ },
37
+ "bugs": {
38
+ "url": "https://github.com/kosmas10/ai-chat-extensions/issues"
39
+ },
40
+ "homepage": "https://github.com/kosmas10/ai-chat-extensions/tree/main/portal#readme",
41
+ "engines": {
42
+ "node": ">=12.0.0"
43
+ },
44
+ "publishConfig": {
45
+ "access": "public"
46
+ }
47
+ }
48
+
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Loading...</title>
7
+ </head>
8
+ <body>
9
+ <script>
10
+ /**
11
+ * Portal Bootstrap Loader
12
+ * Copyright (c) 2025 Nova Science Ventures LLC
13
+ * Created by Kosmas Karadimitriou
14
+ *
15
+ * Licensed under the MIT License
16
+ * GitHub: https://github.com/kosmas10/ai-chat-extensions
17
+ */
18
+
19
+ // ============================================================================
20
+ // STAGE 1 BOOTSTRAP - IMMUTABLE
21
+ // ============================================================================
22
+ // This file should NEVER be modified after deployment.
23
+ // Always uses @latest to automatically get loader updates.
24
+ // Only change: the app package name (@kosmas10/portal)
25
+ // ============================================================================
26
+ (function() {
27
+ var script = document.createElement('script');
28
+ // Add timestamp to force cache refresh (helps with CDN caching issues)
29
+ script.src = 'https://cdn.jsdelivr.net/npm/@kosmas10/html-app-loader@latest/loader.js?app=@kosmas10/portal&_=' + Date.now();
30
+ script.onerror = function() {
31
+ document.body.innerHTML =
32
+ '<!DOCTYPE html>' +
33
+ '<html><head><meta charset="UTF-8"><style>' +
34
+ 'body{margin:0;padding:40px;font-family:system-ui,sans-serif;line-height:1.6}' +
35
+ '.error{max-width:600px;margin:0 auto;padding:30px;background:#fee;border:2px solid #c33;border-radius:8px}' +
36
+ 'h1{color:#c33;margin-top:0}' +
37
+ 'code{background:#f5f5f5;padding:2px 6px;border-radius:3px;font-size:0.9em}' +
38
+ 'ul{margin:15px 0}li{margin:8px 0}' +
39
+ '</style></head><body>' +
40
+ '<div class="error">' +
41
+ '<h1>Failed to Load Application</h1>' +
42
+ '<p>The application loader could not be loaded from:</p>' +
43
+ '<p><code>' + script.src + '</code></p>' +
44
+ '<p><strong>Possible causes:</strong></p>' +
45
+ '<ul>' +
46
+ '<li>No internet connection</li>' +
47
+ '<li>CDN (cdn.jsdelivr.net) is blocked by firewall or proxy</li>' +
48
+ '<li>NPM registry is inaccessible</li>' +
49
+ '<li>Corporate network restrictions</li>' +
50
+ '<li>Browser extensions blocking the request</li>' +
51
+ '</ul>' +
52
+ '<p><strong>What to try:</strong></p>' +
53
+ '<ul>' +
54
+ '<li>Check your internet connection</li>' +
55
+ '<li>Try accessing <a href="https://cdn.jsdelivr.net" target="_blank">cdn.jsdelivr.net</a> directly</li>' +
56
+ '<li>Disable VPN or proxy temporarily</li>' +
57
+ '<li>Check firewall settings</li>' +
58
+ '<li>Try a different network</li>' +
59
+ '<li>Contact your IT department if on a corporate network</li>' +
60
+ '</ul>' +
61
+ '</div></body></html>';
62
+ };
63
+ document.head.appendChild(script);
64
+ })();
65
+ </script>
66
+ </body>
67
+ </html>
package/portal.html ADDED
@@ -0,0 +1,411 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>AI Chat Extensions</title>
7
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><rect x='0' y='0' width='50' height='50' fill='%236ee7b7'/><rect x='50' y='0' width='50' height='50' fill='%23fbbf24'/><rect x='0' y='50' width='50' height='50' fill='%23764ba2'/><rect x='50' y='50' width='50' height='50' fill='%23ffffff'/></svg>">
8
+ <style>
9
+ * {
10
+ margin: 0;
11
+ padding: 0;
12
+ box-sizing: border-box;
13
+ }
14
+
15
+ body {
16
+ font-family: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
17
+ background: linear-gradient(135deg, #d4c4a8 0%, #c4b5a0 100%);
18
+ min-height: 100vh;
19
+ display: flex;
20
+ align-items: flex-start;
21
+ justify-content: center;
22
+ padding: 60px 20px 20px 20px;
23
+ overflow-x: hidden;
24
+ }
25
+
26
+ .container {
27
+ background: rgba(255, 255, 255, 0.95);
28
+ backdrop-filter: blur(10px);
29
+ border-radius: 20px;
30
+ padding: 40px 70px 70px 70px;
31
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
32
+ max-width: 871px;
33
+ width: 100%;
34
+ text-align: center;
35
+ box-sizing: border-box;
36
+ }
37
+
38
+ .version {
39
+ position: absolute;
40
+ top: 5px;
41
+ right: 10px;
42
+ font-size: 0.7rem;
43
+ opacity: 0.5;
44
+ color: #6b7280;
45
+ font-family: Arial, Helvetica, sans-serif;
46
+ z-index: 1000;
47
+ }
48
+
49
+ .header {
50
+ margin-bottom: 40px;
51
+ }
52
+
53
+ .header h1 {
54
+ color: #333;
55
+ font-size: 2.5rem;
56
+ margin-bottom: 10px;
57
+ font-family: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
58
+ background: linear-gradient(135deg, #000000, #333333);
59
+ -webkit-background-clip: text;
60
+ -webkit-text-fill-color: transparent;
61
+ background-clip: text;
62
+ }
63
+
64
+ .header p {
65
+ color: #666;
66
+ font-size: 1.1rem;
67
+ line-height: 1.6;
68
+ }
69
+
70
+ .apps-grid {
71
+ display: grid;
72
+ grid-template-columns: repeat(auto-fit, minmax(305px, 1fr));
73
+ gap: 30px;
74
+ margin-top: 40px;
75
+ width: 100%;
76
+ }
77
+
78
+ .app-card {
79
+ background: white;
80
+ border-radius: 15px;
81
+ padding: 30px;
82
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
83
+ transition: all 0.3s ease;
84
+ border: 2px solid transparent;
85
+ position: relative;
86
+ overflow: hidden;
87
+ box-sizing: border-box;
88
+ width: 100%;
89
+ }
90
+
91
+ .app-card::before {
92
+ content: '';
93
+ position: absolute;
94
+ top: 0;
95
+ left: 0;
96
+ right: 0;
97
+ height: 4px;
98
+ background: linear-gradient(135deg, #667eea, #764ba2);
99
+ }
100
+
101
+ /* Chat & Verify Card - Green Theme */
102
+ .chat-verify-card::before {
103
+ background: linear-gradient(135deg, #a7f3d0, #6ee7b7);
104
+ }
105
+
106
+ .chat-verify-card:hover {
107
+ border-color: #a7f3d0;
108
+ }
109
+
110
+ .chat-verify-button {
111
+ background: linear-gradient(135deg, #a7f3d0, #6ee7b7);
112
+ color: #1f2937;
113
+ }
114
+
115
+ .chat-verify-button:hover {
116
+ transform: translateY(-2px);
117
+ box-shadow: 0 10px 20px rgba(167, 243, 208, 0.3);
118
+ }
119
+
120
+ /* Folder Analyzer Card - Yellow Theme */
121
+ .folder-analyzer-card::before {
122
+ background: linear-gradient(135deg, #fde68a, #fbbf24);
123
+ }
124
+
125
+ .folder-analyzer-card:hover {
126
+ border-color: #fde68a;
127
+ }
128
+
129
+ .folder-analyzer-button {
130
+ background: linear-gradient(135deg, #fde68a, #fbbf24);
131
+ color: #1f2937;
132
+ }
133
+
134
+ .folder-analyzer-button:hover {
135
+ transform: translateY(-2px);
136
+ box-shadow: 0 10px 20px rgba(253, 230, 138, 0.3);
137
+ }
138
+
139
+ .app-card:hover {
140
+ transform: translateY(-5px);
141
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
142
+ }
143
+
144
+ /* Chat & Verify hover effects */
145
+ .chat-verify-card:hover {
146
+ border-color: #d1d5db;
147
+ box-shadow: 0 20px 40px rgba(209, 213, 219, 0.2);
148
+ }
149
+
150
+ /* Folder Analyzer hover effects */
151
+ .folder-analyzer-card:hover {
152
+ border-color: #d1d5db;
153
+ box-shadow: 0 20px 40px rgba(209, 213, 219, 0.2);
154
+ }
155
+
156
+ .app-icon {
157
+ width: 60px;
158
+ height: 60px;
159
+ margin: 0 auto 20px;
160
+ background: linear-gradient(135deg, #667eea, #764ba2);
161
+ border-radius: 50%;
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: center;
165
+ font-size: 24px;
166
+ color: white;
167
+ }
168
+
169
+ /* Chat & Verify Icon - Green Theme */
170
+ .chat-verify-card .app-icon {
171
+ background: linear-gradient(135deg, #a7f3d0, #6ee7b7);
172
+ color: #1f2937;
173
+ position: relative;
174
+ }
175
+
176
+ /* Custom thick checkmark for Chat & Verify */
177
+ .chat-verify-card .app-icon::before {
178
+ content: '';
179
+ position: absolute;
180
+ width: 8px;
181
+ height: 16px;
182
+ border: solid #1f2937;
183
+ border-width: 0 4px 4px 0;
184
+ transform: rotate(45deg);
185
+ margin-top: -2px;
186
+ }
187
+
188
+ /* Folder Analyzer Icon - Yellow Theme */
189
+ .folder-analyzer-card .app-icon {
190
+ background: linear-gradient(135deg, #fde68a, #fbbf24);
191
+ color: #1f2937;
192
+ }
193
+
194
+ .app-title {
195
+ font-size: 1.5rem;
196
+ color: #333;
197
+ margin-bottom: 15px;
198
+ font-weight: 600;
199
+ }
200
+
201
+ .app-description {
202
+ color: #666;
203
+ line-height: 1.6;
204
+ margin-bottom: 25px;
205
+ font-size: 0.95rem;
206
+ }
207
+
208
+ .app-features {
209
+ list-style: none;
210
+ margin-bottom: 25px;
211
+ text-align: left;
212
+ }
213
+
214
+ .app-features li {
215
+ color: #555;
216
+ margin-bottom: 8px;
217
+ padding-left: 20px;
218
+ position: relative;
219
+ font-size: 0.9rem;
220
+ }
221
+
222
+ .app-features li::before {
223
+ content: '✓';
224
+ position: absolute;
225
+ left: 0;
226
+ color: #667eea;
227
+ font-weight: bold;
228
+ }
229
+
230
+ .app-button {
231
+ background: linear-gradient(135deg, #667eea, #764ba2);
232
+ color: white;
233
+ border: none;
234
+ padding: 12px 30px;
235
+ border-radius: 25px;
236
+ font-size: 1rem;
237
+ font-weight: 600;
238
+ cursor: pointer;
239
+ transition: all 0.3s ease;
240
+ text-decoration: none;
241
+ display: inline-block;
242
+ width: 100%;
243
+ }
244
+
245
+ .app-button:hover {
246
+ transform: translateY(-2px);
247
+ box-shadow: 0 10px 20px rgba(102, 126, 234, 0.3);
248
+ }
249
+
250
+ /* Themed button styles */
251
+ .chat-verify-button {
252
+ background: linear-gradient(135deg, #a7f3d0, #6ee7b7);
253
+ color: #1f2937;
254
+ }
255
+
256
+ .chat-verify-button:hover {
257
+ transform: translateY(-2px);
258
+ box-shadow: 0 10px 20px rgba(167, 243, 208, 0.3);
259
+ }
260
+
261
+ .folder-analyzer-button {
262
+ background: linear-gradient(135deg, #fde68a, #fbbf24);
263
+ color: #1f2937;
264
+ }
265
+
266
+ .folder-analyzer-button:hover {
267
+ transform: translateY(-2px);
268
+ box-shadow: 0 10px 20px rgba(253, 230, 138, 0.3);
269
+ }
270
+
271
+ .footer {
272
+ margin-top: 40px;
273
+ padding-top: 20px;
274
+ border-top: 1px solid #eee;
275
+ color: #666;
276
+ font-size: 0.9rem;
277
+ font-family: Arial, Helvetica, sans-serif;
278
+ }
279
+
280
+ @media (max-width: 768px) {
281
+ body {
282
+ padding: 40px 10px 10px 10px;
283
+ }
284
+
285
+ .container {
286
+ padding: 20px;
287
+ margin: 0;
288
+ }
289
+
290
+ .header h1 {
291
+ font-size: 2rem;
292
+ }
293
+
294
+ .apps-grid {
295
+ grid-template-columns: 1fr;
296
+ gap: 20px;
297
+ }
298
+
299
+ .app-card {
300
+ padding: 20px;
301
+ }
302
+ }
303
+
304
+ @media (max-width: 480px) {
305
+ body {
306
+ padding: 20px 5px 5px 5px;
307
+ }
308
+
309
+ .container {
310
+ padding: 15px;
311
+ }
312
+
313
+ .header h1 {
314
+ font-size: 1.8rem;
315
+ }
316
+
317
+ .app-card {
318
+ padding: 15px;
319
+ }
320
+ }
321
+ </style>
322
+ </head>
323
+ <body>
324
+ <div class="version">v<span id="app-version"></span></div>
325
+
326
+ <div class="container">
327
+ <div class="header">
328
+ <h1>AI Chat Extensions</h1>
329
+ <p>Tools and extensions to enhance AI chat productivity.</p>
330
+ </div>
331
+
332
+ <div class="apps-grid">
333
+ <div class="app-card chat-verify-card">
334
+ <div class="app-icon"></div>
335
+ <h2 class="app-title">Chat & Verify</h2>
336
+ <p class="app-description">
337
+ Chat with citations and highlights in the source document for easy verifications.
338
+ </p>
339
+ <button class="app-button chat-verify-button" onclick="openApp('chat-and-verify')">
340
+ Launch Chat & Verify
341
+ </button>
342
+ </div>
343
+
344
+ <div class="app-card folder-analyzer-card">
345
+ <div class="app-icon">📁</div>
346
+ <h2 class="app-title">Folder LLM Analyzer</h2>
347
+ <p class="app-description">
348
+ Runs the same LLM query on each file in a folder and displays results in a grid.
349
+ </p>
350
+ <button class="app-button folder-analyzer-button" onclick="openApp('folder-llm-analyzer')">
351
+ Launch Folder Analyzer
352
+ </button>
353
+ </div>
354
+ </div>
355
+
356
+ </div>
357
+
358
+ <script>
359
+ // App version - keep in sync with package.json
360
+ const APP_VERSION = '0.0.2';
361
+ console.log('Portal v' + APP_VERSION + ' loaded');
362
+
363
+ // CDN base URL for loading apps
364
+ const CDN_BASE = 'https://cdn.jsdelivr.net/npm/@kosmas10/';
365
+
366
+ function openApp(packageName) {
367
+ // Open the application bootstrap from CDN in a new tab/window
368
+ const url = CDN_BASE + packageName + '@latest/' + packageName + '-bootstrap.html';
369
+ window.open(url, '_blank');
370
+ }
371
+
372
+ // Add some interactive effects
373
+ document.addEventListener('DOMContentLoaded', function() {
374
+ // Set the version display from the constant
375
+ const versionElement = document.getElementById('app-version');
376
+ if (versionElement) {
377
+ versionElement.textContent = APP_VERSION;
378
+ }
379
+
380
+ const cards = document.querySelectorAll('.app-card');
381
+
382
+ cards.forEach(card => {
383
+ card.addEventListener('mouseenter', function() {
384
+ this.style.transform = 'translateY(-5px) scale(1.02)';
385
+ });
386
+
387
+ card.addEventListener('mouseleave', function() {
388
+ this.style.transform = 'translateY(0) scale(1)';
389
+ });
390
+
391
+ // Make entire card clickable
392
+ card.addEventListener('click', function(e) {
393
+ // Don't trigger if clicking on the button (to avoid double-triggering)
394
+ if (e.target.classList.contains('app-button')) {
395
+ return;
396
+ }
397
+
398
+ // Find the button in this card and trigger its click
399
+ const button = this.querySelector('.app-button');
400
+ if (button) {
401
+ button.click();
402
+ }
403
+ });
404
+
405
+ // Add cursor pointer to indicate clickability
406
+ card.style.cursor = 'pointer';
407
+ });
408
+ });
409
+ </script>
410
+ </body>
411
+ </html>