@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 +22 -0
- package/README.md +164 -0
- package/package.json +48 -0
- package/portal-bootstrap.html +67 -0
- package/portal.html +411 -0
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>
|