b08x commited on
Commit
8467f52
·
verified ·
1 Parent(s): 22e6547

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +683 -279
index.html CHANGED
@@ -1,28 +1,26 @@
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>Syncopated Dashboard</title>
7
- <script src="https://cdn.tailwindcss.com"></script>
8
- <link
9
- rel="stylesheet"
10
- href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"
11
- />
12
- <script>
13
- tailwind.config = {
14
  theme: {
15
  extend: {
16
  colors: {
17
  rustic: {
18
- 900: '#1c1917', // Very dark warm background
19
- 800: '#292524', // Card background
20
- 700: '#44403c', // Borders
21
- 600: '#57534e', // Hover states
22
- 500: '#78716c', // Muted text
23
  },
24
  rust: {
25
- DEFAULT: '#c2410c', // Primary Rust
26
  light: '#ea580c',
27
  dim: 'rgba(194, 65, 12, 0.2)',
28
  }
@@ -33,309 +31,602 @@
33
  }
34
  }
35
  }
36
- </script>
37
- <style>
38
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&display=swap');
39
-
40
- body {
41
- background-color: #1c1917;
42
- color: #e7e5e4;
43
- font-family: 'Inter', sans-serif;
44
- }
45
-
46
- /* Custom Scrollbar */
47
- ::-webkit-scrollbar {
48
- width: 8px;
49
- height: 8px;
50
- }
51
- ::-webkit-scrollbar-track {
52
- background: #1c1917;
53
- }
54
- ::-webkit-scrollbar-thumb {
55
- background: #44403c;
56
- border-radius: 4px;
57
- }
58
- ::-webkit-scrollbar-thumb:hover {
59
- background: #c2410c;
60
- }
61
-
62
- /* Chatbot Popup Animations */
63
- .chatbot-toggle {
64
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
65
- }
66
-
67
- .chatbot-panel {
68
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
69
- transform-origin: bottom right;
70
- }
71
-
72
- .chatbot-panel.closed {
73
- opacity: 0;
74
- transform: scale(0.95) translateY(20px);
75
- pointer-events: none;
76
- }
77
-
78
- /* Link Cards Hover Effects */
79
- .link-card {
80
- transition: all 0.2s ease;
81
- border-left: 3px solid transparent;
82
- }
83
- .link-card:hover {
84
- background-color: #292524;
85
- border-left: 3px solid #c2410c;
86
- transform: translateX(4px);
87
- }
88
-
89
- /* Input Focus Styles */
90
- input:focus, select:focus {
91
- outline: none;
92
- border-color: #c2410c;
93
- box-shadow: 0 0 0 2px rgba(194, 65, 12, 0.2);
94
- }
95
-
96
- .nav-item.active {
97
- background-color: rgba(194, 65, 12, 0.1);
98
- color: #c2410c;
99
- border-right: 3px solid #c2410c;
100
- }
101
-
102
- .iframe-container {
103
- background: #000;
104
- border-radius: 0.5rem;
105
- overflow: hidden;
106
- }
107
- </style>
108
- </head>
109
- <body class="h-screen flex flex-col overflow-hidden">
110
-
111
- <!-- Header -->
112
- <header class="h-16 bg-rustic-800 border-b border-rustic-700 flex items-center justify-between px-6 shrink-0 z-20">
113
- <div class="flex items-center space-x-4">
114
- <div class="w-8 h-8 rounded bg-rust flex items-center justify-center shadow-lg shadow-rust/20">
115
- <i class="fas fa-cube text-white text-sm"></i>
116
- </div>
117
- <h1 class="text-xl font-semibold tracking-wide text-gray-100">SYNCOPATED</h1>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  </div>
 
 
119
 
120
- <div class="flex-1 max-w-2xl mx-8 hidden md:block">
121
- <div class="flex space-x-2">
122
- <form id="meta-search-form" class="relative flex-1">
123
- <input
124
  type="text"
125
  id="search-input"
126
  name="q"
127
  placeholder="Search Global..."
128
  class="w-full bg-rustic-900 border border-rustic-700 rounded-md py-1.5 px-4 pl-9 text-sm text-gray-300 focus:outline-none focus:border-rust transition"
129
  />
130
- <button type="submit" class="absolute left-3 top-2 text-rustic-500">
131
  <i class="fas fa-globe text-xs"></i>
132
  </button>
133
- </form>
134
- <form id="rubygems-search-form" class="relative w-64 hidden lg:block">
135
- <input
136
  type="text"
137
  id="rubygems-search-input"
138
  name="q"
139
  placeholder="RubyGems..."
140
  class="w-full bg-rustic-900 border border-rustic-700 rounded-md py-1.5 px-4 pl-9 text-sm text-gray-300 focus:outline-none focus:border-rust transition"
141
  />
142
- <button type="submit" class="absolute left-3 top-2 text-rustic-500">
143
  <i class="fas fa-gem text-xs text-rust-light"></i>
144
  </button>
145
- </form>
146
- </div>
147
  </div>
 
148
 
149
- <div class="flex items-center space-x-4">
150
- <button class="text-gray-400 hover:text-rust-light transition">
 
151
  <i class="fas fa-bell"></i>
152
  </button>
153
- <div class="w-8 h-8 rounded-full bg-rustic-700 flex items-center justify-center cursor-pointer border border-rustic-600">
154
- <i class="fas fa-user text-gray-400 text-xs"></i>
155
- </div>
156
  </div>
157
- </header>
 
158
 
159
- <!-- Main Layout -->
160
- <div class="flex flex-1 overflow-hidden">
161
-
162
- <!-- Left Column: Link Modals (Prominently Featured) -->
163
- <aside class="w-80 bg-rustic-900 border-r border-rustic-700 flex flex-col overflow-y-auto shrink-0 hidden md:flex">
164
- <div class="p-4">
165
- <h2 class="text-xs font-bold text-rustic-500 uppercase tracking-wider mb-4 pl-2">Launcher</h2>
166
-
167
- <!-- Dashboard View (Link Categories) -->
168
- <div id="dashboard-links-view" class="space-y-6">
169
- <!-- Links will be injected here via JS -->
170
- </div>
171
  </div>
 
172
 
173
- <!-- Secondary Nav for other tabs -->
174
- <div class="mt-auto p-4 border-t border-rustic-700">
175
- <nav class="space-y-1">
176
- <button class="nav-item w-full text-left px-3 py-2 rounded-md text-sm font-medium flex items-center space-x-3 text-gray-400 hover:bg-rustic-800" data-tab="documents">
177
  <i class="fas fa-file-alt w-4"></i>
178
  <span>Documents</span>
179
  </button>
180
- <button class="nav-item w-full text-left px-3 py-2 rounded-md text-sm font-medium flex items-center space-x-3 text-gray-400 hover:bg-rustic-800" data-tab="generate">
181
  <i class="fas fa-code w-4"></i>
182
  <span>Generate</span>
183
  </button>
184
- <button class="nav-item w-full text-left px-3 py-2 rounded-md text-sm font-medium flex items-center space-x-3 text-gray-400 hover:bg-rustic-800" data-tab="settings">
185
  <i class="fas fa-cog w-4"></i>
186
  <span>Settings</span>
187
  </button>
188
- </nav>
189
- </div>
190
- </aside>
191
-
192
- <!-- Right Column: Main Content Area -->
193
- <main class="flex-1 bg-rustic-900 overflow-y-auto relative p-6" id="main-content-area">
194
-
195
- <!-- Tab Content: Documents -->
196
- <div id="documents" class="tab-content hidden">
197
- <div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
198
- <div class="bg-rustic-800 rounded-xl p-1 border border-rustic-700 shadow-lg">
199
- <div class="bg-rustic-900 rounded-t-lg px-4 py-3 border-b border-rustic-700 flex justify-between items-center">
200
- <span class="text-sm font-medium text-gray-300">Document Management</span>
201
- <i class="fas fa-external-link-alt text-xs text-gray-500"></i>
202
- </div>
203
- <div class="h-64 iframe-container">
204
- <iframe src="https://docs.example.com/browse" class="w-full h-full" allowfullscreen></iframe>
205
- </div>
206
  </div>
 
 
 
 
207
 
208
- <div class="bg-rustic-800 rounded-xl p-1 border border-rustic-700 shadow-lg">
209
- <div class="bg-rustic-900 rounded-t-lg px-4 py-3 border-b border-rustic-700 flex justify-between items-center">
210
- <span class="text-sm font-medium text-gray-300">Knowledge Base</span>
211
- <i class="fas fa-external-link-alt text-xs text-gray-500"></i>
212
- </div>
213
- <div class="h-64 iframe-container">
214
- <iframe src="https://wiki.example.com/home" class="w-full h-full" allowfullscreen></iframe>
215
- </div>
216
  </div>
217
  </div>
218
  </div>
 
219
 
220
- <!-- Tab Content: Generate -->
221
- <div id="generate" class="tab-content hidden">
222
- <div class="grid grid-cols-1 gap-6">
223
- <div class="bg-rustic-800 rounded-xl p-1 border border-rustic-700 shadow-lg">
224
- <div class="bg-rustic-900 rounded-t-lg px-4 py-3 border-b border-rustic-700 flex justify-between items-center">
225
- <span class="text-sm font-medium text-gray-300">Code Generator</span>
226
- <i class="fas fa-robot text-rust"></i>
227
- </div>
228
- <div class="h-96 iframe-container">
229
- <iframe src="https://directory.example.com" class="w-full h-full" allowfullscreen></iframe>
230
- </div>
231
  </div>
232
  </div>
233
  </div>
 
234
 
235
- <!-- Tab Content: Settings -->
236
- <div id="settings" class="tab-content hidden">
237
- <div class="max-w-2xl">
238
- <div class="bg-rustic-800 rounded-xl p-6 border border-rustic-700">
239
- <h3 class="text-lg font-medium text-white mb-6">Data Management</h3>
240
- <div class="flex items-center space-x-4">
241
- <button id="exportLinksBtn" class="bg-rust hover:bg-rust-light text-white font-medium py-2 px-4 rounded-lg flex items-center space-x-2 transition shadow-lg shadow-rust/20">
242
  <i class="fas fa-file-export"></i>
243
  <span>Export Config</span>
244
  </button>
245
- <button id="importLinksBtn" class="bg-rustic-700 hover:bg-rustic-600 text-white font-medium py-2 px-4 rounded-lg flex items-center space-x-2 transition">
246
  <i class="fas fa-file-import"></i>
247
  <span>Import Config</span>
248
  </button>
249
- <input type="file" id="importFileInput" class="hidden" accept=".json" />
250
- </div>
251
- <p class="text-sm text-rustic-500 mt-4">
252
- Manage your sidebar link configuration here.
253
- </p>
254
  </div>
 
 
 
255
  </div>
256
  </div>
257
-
258
- <!-- Default View (Welcome / Empty state if needed, but links are in sidebar now) -->
259
- <div id="dashboard" class="tab-content block h-full flex items-center justify-center text-rustic-500 flex-col">
260
- <div class="text-center">
261
- <i class="fas fa-compass text-4xl mb-4 text-rustic-700"></i>
262
- <p>Select a category from the launcher to get started.</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
263
  </div>
264
- </div>
265
 
266
- </main>
267
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
268
 
269
- <!-- Chatbot Popup (Refactored Main View) -->
270
- <div class="fixed bottom-6 right-6 z-50 flex flex-col items-end">
271
- <!-- Chat Panel -->
272
- <div id="chatbot-panel" class="chatbot-panel closed bg-rustic-800 rounded-xl shadow-2xl border border-rustic-700 w-[380px] h-[500px] mb-4 flex flex-col overflow-hidden">
273
- <div class="bg-rust p-3 flex justify-between items-center shrink-0">
274
- <div class="flex items-center space-x-2">
275
- <div class="w-2 h-2 bg-white rounded-full animate-pulse"></div>
276
- <span class="font-medium text-white text-sm">Assistant</span>
 
 
277
  </div>
278
- <button id="closeChatBtn" class="text-white hover:text-gray-200">
279
- <i class="fas fa-times"></i>
280
- </button>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
281
  </div>
282
- <div class="flex-1 bg-black relative">
283
- <iframe
284
- src="http://ninjabot/chatbot/YuXRYou2mbnDqCXc"
285
- class="w-full h-full"
286
- frameborder="0"
287
- allow="microphone">
288
- </iframe>
 
 
 
 
 
 
 
 
 
 
 
289
  </div>
 
 
290
  </div>
 
 
 
 
291
 
292
- <!-- Toggle Button -->
293
- <button id="chatbot-toggle-btn" class="chatbot-toggle w-14 h-14 bg-rust hover:bg-rust-light rounded-full shadow-lg shadow-rust/40 flex items-center justify-center text-white transform hover:scale-110">
294
- <i class="fas fa-comment-dots text-xl"></i>
 
 
 
 
 
 
 
295
  </button>
 
 
 
 
296
  </div>
297
 
298
- <!-- Link Settings Modal -->
299
- <div id="linkSettingsModal" class="fixed inset-0 bg-black/80 backdrop-blur-sm flex items-center justify-center hidden z-[60]">
300
- <div class="bg-rustic-800 border border-rustic-700 rounded-lg p-6 w-full max-w-md shadow-2xl">
301
- <div class="flex justify-between items-center mb-6">
302
- <h3 class="text-xl font-semibold text-white">Edit Launcher</h3>
303
- <button id="modalCloseBtn" class="text-gray-400 hover:text-white transition">
304
- <i class="fas fa-times"></i>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
305
  </button>
306
  </div>
307
- <div class="space-y-4">
308
- <div>
309
- <label class="block text-sm font-medium text-gray-400 mb-1">Category Title</label>
310
- <input type="text" id="categoryName" class="w-full bg-rustic-900 border border-rustic-700 rounded px-3 py-2 text-white" />
311
- </div>
312
- <div>
313
- <label class="block text-sm font-medium text-gray-400 mb-2">Links</label>
314
- <div id="linkItems" class="space-y-3 max-h-64 overflow-y-auto pr-2">
315
- <!-- Links injected here -->
316
- </div>
317
- <button id="addNewLinkBtn" class="mt-3 text-rust text-sm flex items-center space-x-1 hover:text-rust-light transition">
318
- <i class="fas fa-plus"></i>
319
- <span>Add New Link</span>
320
- </button>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
321
  </div>
322
- </div>
323
- <div class="flex justify-end space-x-3 mt-8">
324
- <button id="modalCancelBtn" class="px-4 py-2 rounded-md bg-rustic-900 hover:bg-rustic-700 text-gray-300 transition border border-rustic-700">
325
- Cancel
326
- </button>
327
- <button id="saveChangesBtn" class="px-4 py-2 rounded-md bg-rust hover:bg-rust-light text-white transition shadow-lg shadow-rust/20">
328
- Save Changes
329
  </button>
330
  </div>
 
 
 
 
 
 
 
 
 
331
  </div>
332
  </div>
 
333
 
334
- <script>
335
- document.addEventListener("DOMContentLoaded", () => {
336
  // --- State ---
337
  let currentCategory = "";
338
  const storageKey = "dashboardLinks";
 
339
 
340
  const iconClasses = {
341
  blue: "fa-tachometer-alt text-blue-400",
@@ -348,6 +639,18 @@
348
  gray: "fa-anchor text-gray-400"
349
  };
350
 
 
 
 
 
 
 
 
 
 
 
 
 
351
  const defaultLinks = {
352
  quick: {
353
  title: "Quick Access",
@@ -374,6 +677,15 @@
374
  }
375
  };
376
 
 
 
 
 
 
 
 
 
 
377
  // --- Functions ---
378
  const getStoredLinks = () => {
379
  const links = localStorage.getItem(storageKey);
@@ -384,6 +696,16 @@
384
  localStorage.setItem(storageKey, JSON.stringify(links));
385
  };
386
 
 
 
 
 
 
 
 
 
 
 
387
  const renderSidebarLinks = () => {
388
  const container = document.getElementById("dashboard-links-view");
389
  const allLinks = getStoredLinks();
@@ -396,7 +718,6 @@
396
  const section = document.createElement("div");
397
  section.className = "mb-2";
398
 
399
- // Header with Edit Button
400
  const header = document.createElement("div");
401
  header.className = "flex justify-between items-center mb-2 px-2";
402
  header.innerHTML = `
@@ -406,7 +727,6 @@
406
  </button>
407
  `;
408
 
409
- // Links List
410
  const list = document.createElement("div");
411
  list.className = "space-y-1";
412
 
@@ -428,13 +748,41 @@
428
  container.appendChild(section);
429
  });
430
 
431
- // Re-attach event listeners for edit buttons
432
  document.querySelectorAll("#dashboard-links-view button[data-category]").forEach(btn => {
433
  btn.addEventListener("click", (e) => showLinkSettings(e.currentTarget.dataset.category));
434
  });
435
  };
436
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
437
  const hideLinkSettings = () => document.getElementById("linkSettingsModal").classList.add("hidden");
 
 
 
 
 
438
 
439
  const addNewLink = (name = "", url = "", color = "rust") => {
440
  const linkItems = document.getElementById("linkItems");
@@ -489,6 +837,65 @@
489
  hideLinkSettings();
490
  };
491
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
492
  // --- Chatbot Logic ---
493
  const chatPanel = document.getElementById('chatbot-panel');
494
  const chatBtn = document.getElementById('chatbot-toggle-btn');
@@ -515,18 +922,15 @@
515
  const switchTab = (event) => {
516
  const tabId = event.currentTarget.dataset.tab;
517
 
518
- // Hide all tab contents
519
  document.querySelectorAll('.tab-content').forEach(el => el.classList.add('hidden'));
520
  document.querySelectorAll('.tab-content').forEach(el => el.classList.remove('block'));
521
 
522
- // Show target
523
  const target = document.getElementById(tabId);
524
  if(target) {
525
  target.classList.remove('hidden');
526
  target.classList.add('block');
527
  }
528
 
529
- // Update nav state (if it's a side nav item)
530
  document.querySelectorAll('.nav-item').forEach(el => el.classList.remove('active'));
531
  event.currentTarget.classList.add('active');
532
  };
@@ -570,34 +974,34 @@
570
  e.target.value = '';
571
  };
572
 
573
- // --- Init ---
574
- renderSidebarLinks();
575
-
576
- // Listeners
577
- document.getElementById('meta-search-form').addEventListener('submit', handleMetaSearch);
578
- document.getElementById('rubygems-search-form').addEventListener('submit', handleRubyGemsSearch);
 
 
 
 
 
 
 
 
 
 
579
 
580
- // Sidebar Navigation
581
- document.querySelectorAll('.nav-item').forEach(item => {
582
- item.addEventListener('click', switchTab);
583
- });
 
 
 
 
 
 
 
584
 
585
- // Modal
586
- document.getElementById('modalCloseBtn').addEventListener('click', hideLinkSettings);
587
- document.getElementById('modalCancelBtn').addEventListener('click', hideLinkSettings);
588
- document.getElementById('saveChangesBtn').addEventListener('click', saveLinkSettings);
589
- document.getElementById('addNewLinkBtn').addEventListener('click', () => addNewLink());
590
-
591
- document.getElementById('linkItems').addEventListener('click', (e) => {
592
- if(e.target.closest('.remove-link-btn')) e.target.closest('.link-item-entry').remove();
593
- });
594
-
595
- // Import/Export
596
- document.getElementById('exportLinksBtn').addEventListener('click', handleExport);
597
- document.getElementById('importLinksBtn').addEventListener('click', () => document.getElementById('importFileInput').click());
598
- document.getElementById('importFileInput').addEventListener('change', handleImport);
599
-
600
- });
601
- </script>
602
- </body>
603
- </html>
 
1
  <!DOCTYPE html>
2
  <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Syncopated Dashboard</title>
8
+ <script src="https://cdn.tailwindcss.com"></script>
9
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" />
10
+ <script>
11
+ tailwind.config = {
 
 
12
  theme: {
13
  extend: {
14
  colors: {
15
  rustic: {
16
+ 900: '#1c1917',
17
+ 800: '#292524',
18
+ 700: '#44403c',
19
+ 600: '#57534e',
20
+ 500: '#78716c',
21
  },
22
  rust: {
23
+ DEFAULT: '#c2410c',
24
  light: '#ea580c',
25
  dim: 'rgba(194, 65, 12, 0.2)',
26
  }
 
31
  }
32
  }
33
  }
34
+ </script>
35
+ <style>
36
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&display=swap');
37
+
38
+ body {
39
+ background-color: #1c1917;
40
+ color: #e7e5e4;
41
+ font-family: 'Inter', sans-serif;
42
+ }
43
+
44
+ ::-webkit-scrollbar {
45
+ width: 8px;
46
+ height: 8px;
47
+ }
48
+
49
+ ::-webkit-scrollbar-track {
50
+ background: #1c1917;
51
+ }
52
+
53
+ ::-webkit-scrollbar-thumb {
54
+ background: #44403c;
55
+ border-radius: 4px;
56
+ }
57
+
58
+ ::-webkit-scrollbar-thumb:hover {
59
+ background: #c2410c;
60
+ }
61
+
62
+ /* Chatbot Popup Animations */
63
+ .chatbot-toggle {
64
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
65
+ }
66
+
67
+ .chatbot-panel {
68
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
69
+ transform-origin: bottom right;
70
+ }
71
+
72
+ .chatbot-panel.closed {
73
+ opacity: 0;
74
+ transform: scale(0.95) translateY(20px);
75
+ pointer-events: none;
76
+ }
77
+
78
+ /* Link Cards Hover Effects */
79
+ .link-card {
80
+ transition: all 0.2s ease;
81
+ border-left: 3px solid transparent;
82
+ }
83
+
84
+ .link-card:hover {
85
+ background-color: #292524;
86
+ border-left: 3px solid #c2410c;
87
+ transform: translateX(4px);
88
+ }
89
+
90
+ input:focus,
91
+ select:focus {
92
+ outline: none;
93
+ border-color: #c2410c;
94
+ box-shadow: 0 0 0 2px rgba(194, 65, 12, 0.2);
95
+ }
96
+
97
+ .nav-item.active {
98
+ background-color: rgba(194, 65, 12, 0.1);
99
+ color: #c2410c;
100
+ border-right: 3px solid #c2410c;
101
+ }
102
+
103
+ .iframe-container {
104
+ background: #000;
105
+ border-radius: 0.5rem;
106
+ overflow: hidden;
107
+ }
108
+
109
+ /* Dashboard Split Pane */
110
+ .dashboard-split {
111
+ display: flex;
112
+ flex-direction: column;
113
+ height: calc(100vh - 4rem - 3rem);
114
+ gap: 1rem;
115
+ }
116
+
117
+ .top-pane {
118
+ flex: 1;
119
+ min-height: 0;
120
+ overflow: hidden;
121
+ }
122
+
123
+ .bottom-pane {
124
+ flex: 0 0 280px;
125
+ min-height: 280px;
126
+ display: flex;
127
+ flex-direction: column;
128
+ }
129
+
130
+ /* Shortcuts Grid */
131
+ .shortcuts-grid {
132
+ display: grid;
133
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
134
+ gap: 0.75rem;
135
+ }
136
+
137
+ .shortcut-item {
138
+ background: #1c1917;
139
+ border: 1px solid #44403c;
140
+ border-radius: 0.5rem;
141
+ padding: 1rem;
142
+ display: flex;
143
+ flex-direction: column;
144
+ align-items: center;
145
+ justify-content: center;
146
+ gap: 0.5rem;
147
+ cursor: pointer;
148
+ transition: all 0.2s ease;
149
+ min-height: 90px;
150
+ }
151
+
152
+ .shortcut-item:hover {
153
+ background: #292524;
154
+ border-color: #c2410c;
155
+ transform: translateY(-2px);
156
+ }
157
+
158
+ .shortcut-item i {
159
+ font-size: 1.5rem;
160
+ }
161
+
162
+ .shortcut-item span {
163
+ font-size: 0.75rem;
164
+ text-align: center;
165
+ color: #a8a29e;
166
+ }
167
+
168
+ /* Pane resize handle */
169
+ .resize-handle {
170
+ height: 6px;
171
+ background: #44403c;
172
+ border-radius: 3px;
173
+ cursor: ns-resize;
174
+ margin: 0.25rem 0;
175
+ position: relative;
176
+ }
177
+
178
+ .resize-handle:hover {
179
+ background: #c2410c;
180
+ }
181
+
182
+ /* Pane header */
183
+ .pane-header {
184
+ display: flex;
185
+ justify-content: space-between;
186
+ align-items: center;
187
+ padding: 0.5rem 0;
188
+ margin-bottom: 0.5rem;
189
+ }
190
+
191
+ .pane-title {
192
+ font-size: 0.875rem;
193
+ font-weight: 600;
194
+ color: #d6d3d1;
195
+ text-transform: uppercase;
196
+ letter-spacing: 0.05em;
197
+ }
198
+
199
+ /* Modal backdrop */
200
+ .modal-backdrop {
201
+ background: rgba(0, 0, 0, 0.7);
202
+ backdrop-filter: blur(4px);
203
+ }
204
+
205
+ /* Quick action buttons */
206
+ .quick-action-btn {
207
+ transition: all 0.2s ease;
208
+ }
209
+
210
+ .quick-action-btn:hover {
211
+ background: #c2410c;
212
+ transform: scale(1.05);
213
+ }
214
+
215
+ /* Activity feed styling */
216
+ .activity-item {
217
+ display: flex;
218
+ align-items: flex-start;
219
+ gap: 0.75rem;
220
+ padding: 0.5rem 0;
221
+ border-bottom: 1px solid #44403c;
222
+ }
223
+
224
+ .activity-item:last-child {
225
+ border-bottom: none;
226
+ }
227
+
228
+ .activity-dot {
229
+ width: 8px;
230
+ height: 8px;
231
+ border-radius: 50%;
232
+ margin-top: 6px;
233
+ }
234
+ </style>
235
+ </head>
236
+
237
+ <body class="h-screen flex flex-col overflow-hidden">
238
+
239
+ <!-- Header -->
240
+ <header class="h-16 bg-rustic-800 border-b border-rustic-700 flex items-center justify-between px-6 shrink-0 z-20">
241
+ <div class="flex items-center space-x-4">
242
+ <div class="w-8 h-8 rounded bg-rust flex items-center justify-center shadow-lg shadow-rust/20">
243
+ <i class="fas fa-cube text-white text-sm"></i>
244
  </div>
245
+ <h1 class="text-xl font-semibold tracking-wide text-gray-100">SYNCOPATED</h1>
246
+ </div>
247
 
248
+ <div class="flex-1 max-w-2xl mx-8 hidden md:block">
249
+ <div class="flex space-x-2">
250
+ <form id="meta-search-form" class="relative flex-1">
251
+ <input
252
  type="text"
253
  id="search-input"
254
  name="q"
255
  placeholder="Search Global..."
256
  class="w-full bg-rustic-900 border border-rustic-700 rounded-md py-1.5 px-4 pl-9 text-sm text-gray-300 focus:outline-none focus:border-rust transition"
257
  />
258
+ <button type="submit" class="absolute left-3 top-2 text-rustic-500">
259
  <i class="fas fa-globe text-xs"></i>
260
  </button>
261
+ </form>
262
+ <form id="rubygems-search-form" class="relative w-64 hidden lg:block">
263
+ <input
264
  type="text"
265
  id="rubygems-search-input"
266
  name="q"
267
  placeholder="RubyGems..."
268
  class="w-full bg-rustic-900 border border-rustic-700 rounded-md py-1.5 px-4 pl-9 text-sm text-gray-300 focus:outline-none focus:border-rust transition"
269
  />
270
+ <button type="submit" class="absolute left-3 top-2 text-rustic-500">
271
  <i class="fas fa-gem text-xs text-rust-light"></i>
272
  </button>
273
+ </form>
 
274
  </div>
275
+ </div>
276
 
277
+ <div class="flex items-center space-x-4">
278
+ <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" class="text-xs text-rustic-500 hover:text-rust transition">Built with anycoder</a>
279
+ <button class="text-gray-400 hover:text-rust-light transition">
280
  <i class="fas fa-bell"></i>
281
  </button>
282
+ <div
283
+ class="w-8 h-8 rounded-full bg-rustic-700 flex items-center justify-center cursor-pointer border border-rustic-600">
284
+ <i class="fas fa-user text-gray-400 text-xs"></i>
285
  </div>
286
+ </div>
287
+ </header>
288
 
289
+ <!-- Main Layout -->
290
+ <div class="flex flex-1 overflow-hidden">
291
+
292
+ <!-- Left Column: Link Modals (Prominently Featured) -->
293
+ <aside class="w-80 bg-rustic-900 border-r border-rustic-700 flex flex-col overflow-y-auto shrink-0 hidden md:flex">
294
+ <div class="p-4">
295
+ <h2 class="text-xs font-bold text-rustic-500 uppercase tracking-wider mb-4 pl-2">Launcher</h2>
296
+
297
+ <!-- Dashboard View (Link Categories) -->
298
+ <div id="dashboard-links-view" class="">
299
+ <!-- Linksspace-y-6 will be injected here via JS -->
 
300
  </div>
301
+ </div>
302
 
303
+ <!-- Secondary Nav for other tabs -->
304
+ <div class="mt-auto p-4 border-t border-rustic-700">
305
+ <nav class="space-y-1">
306
+ <button class="nav-item w-full text-left px-3 py-2 rounded-md text-sm font-medium flex items-center space-x-3 text-gray-400 hover:bg-rustic-800" data-tab="documents">
307
  <i class="fas fa-file-alt w-4"></i>
308
  <span>Documents</span>
309
  </button>
310
+ <button class="nav-item w-full text-left px-3 py-2 rounded-md text-sm font-medium flex items-center space-x-3 text-gray-400 hover:bg-rustic-800" data-tab="generate">
311
  <i class="fas fa-code w-4"></i>
312
  <span>Generate</span>
313
  </button>
314
+ <button class="nav-item w-full text-left px-3 py-2 rounded-md text-sm font-medium flex items-center space-x-3 text-gray-400 hover:bg-rustic-800" data-tab="settings">
315
  <i class="fas fa-cog w-4"></i>
316
  <span>Settings</span>
317
  </button>
318
+ </nav>
319
+ </div>
320
+ </aside>
321
+
322
+ <!-- Right Column: Main Content Area -->
323
+ <main class="flex-1 bg-rustic-900 overflow-y-auto relative p-6" id="main-content-area">
324
+
325
+ <!-- Tab Content: Documents -->
326
+ <div id="documents" class="tab-content hidden">
327
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
328
+ <div class="bg-rustic-800 rounded-xl p-1 border border-rustic-700 shadow-lg">
329
+ <div
330
+ class="bg-rustic-900 rounded-t-lg px-4 py-3 border-b border-rustic-700 flex justify-between items-center">
331
+ <span class="text-sm font-medium text-gray-300">Document Management</span>
332
+ <i class="fas fa-external-link-alt text-xs text-gray-500"></i>
 
 
 
333
  </div>
334
+ <div class="h-64 iframe-container">
335
+ <iframe src="https://docs.example.com/browse" class="w-full h-full" allowfullscreen></iframe>
336
+ </div>
337
+ </div>
338
 
339
+ <div class="bg-rustic-800 rounded-xl p-1 border border-rustic-700 shadow-lg">
340
+ <div
341
+ class="bg-rustic-900 rounded-t-lg px-4 py-3 border-b border-rustic-700 flex justify-between items-center">
342
+ <span class="text-sm font-medium text-gray-300">Knowledge Base</span>
343
+ <i class="fas fa-external-link-alt text-xs text-gray-500"></i>
344
+ </div>
345
+ <div class="h-64 iframe-container">
346
+ <iframe src="https://wiki.example.com/home" class="w-full h-full" allowfullscreen></iframe>
347
  </div>
348
  </div>
349
  </div>
350
+ </div>
351
 
352
+ <!-- Tab Content: Generate -->
353
+ <div id="generate" class="tab-content hidden">
354
+ <div class="grid grid-cols-1 gap-6">
355
+ <div class="bg-rustic-800 rounded-xl p-1 border border-rustic-700 shadow-lg">
356
+ <div
357
+ class="bg-rustic-900 rounded-t-lg px-4 py-3 border-b border-rustic-700 flex justify-between items-center">
358
+ <span class="text-sm font-medium text-gray-300">Code Generator</span>
359
+ <i class="fas fa-robot text-rust"></i>
360
+ </div>
361
+ <div class="h-96 iframe-container">
362
+ <iframe src="https://directory.example.com" class="w-full h-full" allowfullscreen></iframe>
363
  </div>
364
  </div>
365
  </div>
366
+ </div>
367
 
368
+ <!-- Tab Content: Settings -->
369
+ <div id="settings" class="tab-content hidden">
370
+ <div class="max-w-2xl">
371
+ <div class="bg-rustic-800 rounded-xl p-6 border border-rustic-700">
372
+ <h3 class="text-lg font-medium text-white mb-6">Data Management</h3>
373
+ <div class="flex items-center space-x-4">
374
+ <button id="exportLinksBtn" class="bg-rust hover:bg-rust-light text-white font-medium py-2 px-4 rounded-lg flex items-center space-x-2 transition shadow-lg shadow-rust/20">
375
  <i class="fas fa-file-export"></i>
376
  <span>Export Config</span>
377
  </button>
378
+ <button id="importLinksBtn" class="bg-rustic-700 hover:bg-rustic-600 text-white font-medium py-2 px-4 rounded-lg flex items-center space-x-2 transition">
379
  <i class="fas fa-file-import"></i>
380
  <span>Import Config</span>
381
  </button>
382
+ <input type="file" id="importFileInput" class="hidden" accept=".json" />
 
 
 
 
383
  </div>
384
+ <p class="text-sm text-rustic-500 mt-4">
385
+ Manage your sidebar link configuration here.
386
+ </p>
387
  </div>
388
  </div>
389
+ </div>
390
+
391
+ <!-- Default View: Dashboard with Split Panes -->
392
+ <div id="dashboard" class="tab-content block h-full">
393
+ <!-- Split Dashboard Layout -->
394
+ <div class="dashboard-split">
395
+
396
+ <!-- Top Pane: Welcome & Activity -->
397
+ <div class="top-pane bg-rustic-800 rounded-xl border border-rustic-700 p-4 overflow-y-auto">
398
+ <div class="pane-header">
399
+ <span class="pane-title">Dashboard Overview</span>
400
+ <div class="flex items-center space-x-2">
401
+ <span class="text-xs text-rustic-500" id="currentDate"></span>
402
+ <div class="w-2 h-2 bg-green-500 rounded-full animate-pulse"></div>
403
+ </div>
404
+ </div>
405
+
406
+ <!-- Welcome Section -->
407
+ <div class="mb-6">
408
+ <h2 class="text-2xl font-semibold text-white mb-1">Welcome back!</h2>
409
+ <p class="text-rustic-500 text-sm">Here's what's happening with your projects today.</p>
410
  </div>
 
411
 
412
+ <!-- Stats Cards -->
413
+ <div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-6">
414
+ <div class="bg-rustic-900 rounded-lg p-4 border border-rustic-700">
415
+ <div class="flex items-center justify-between mb-2">
416
+ <i class="fas fa-project-diagram text-blue-400"></i>
417
+ <span class="text-xs text-green-400">+12%</span>
418
+ </div>
419
+ <div class="text-xl font-semibold text-white">24</div>
420
+ <div class="text-xs text-rustic-500">Active Projects</div>
421
+ </div>
422
+ <div class="bg-rustic-900 rounded-lg p-4 border border-rustic-700">
423
+ <div class="flex items-center justify-between mb-2">
424
+ <i class="fas fa-users text-purple-400"></i>
425
+ <span class="text-xs text-green-400">+5%</span>
426
+ </div>
427
+ <div class="text-xl font-semibold text-white">156</div>
428
+ <div class="text-xs text-rustic-500">Team Members</div>
429
+ </div>
430
+ <div class="bg-rustic-900 rounded-lg p-4 border border-rustic-700">
431
+ <div class="flex items-center justify-between mb-2">
432
+ <i class="fas fa-ticket-alt text-yellow-400"></i>
433
+ <span class="text-xs text-red-400">-3%</span>
434
+ </div>
435
+ <div class="text-xl font-semibold text-white">18</div>
436
+ <div class="text-xs text-rustic-500">Open Tickets</div>
437
+ </div>
438
+ <div class="bg-rustic-900 rounded-lg p-4 border border-rustic-700">
439
+ <div class="flex items-center justify-between mb-2">
440
+ <i class="fas fa-check-circle text-green-400"></i>
441
+ <span class="text-xs text-green-400">+8%</span>
442
+ </div>
443
+ <div class="text-xl font-semibold text-white">142</div>
444
+ <div class="text-xs text-rustic-500">Completed</div>
445
+ </div>
446
+ </div>
447
 
448
+ <!-- Recent Activity Feed -->
449
+ <div class="bg-rustic-900 rounded-lg p-4 border border-rustic-700">
450
+ <h3 class="text-sm font-semibold text-gray-300 mb-4">Recent Activity</h3>
451
+ <div class="space-y-3" id="activityFeed">
452
+ <div class="activity-item">
453
+ <div class="activity-dot bg-blue-400"></div>
454
+ <div>
455
+ <p class="text-sm text-gray-300">New project <span class="text-white font-medium">"Mobile App v2"</span> created</p>
456
+ <p class="text-xs text-rustic-500">2 hours ago</p>
457
+ </div>
458
  </div>
459
+ <div class="activity-item">
460
+ <div class="activity-dot bg-green-400"></div>
461
+ <div>
462
+ <p class="text-sm text-gray-300"><span class="text-white font-medium">Sarah Chen</span> completed task "API Integration"</p>
463
+ <p class="text-xs text-rustic-500">4 hours ago</p>
464
+ </div>
465
+ </div>
466
+ <div class="activity-item">
467
+ <div class="activity-dot bg-yellow-400"></div>
468
+ <p>
469
+ <div class="text-sm text-gray-300">Ticket #2847 assigned to <span class="text-white font-medium">Support Team</span></p>
470
+ <p class="text-xs text-rustic-500">6 hours ago</p>
471
+ </div>
472
+ </div>
473
+ <div class="activity-item">
474
+ <div class="activity-dot bg-purple-400"></div>
475
+ <div>
476
+ <p class="text-sm text-gray-300"><span class="text-white font-medium">Weekly Report</span> generated successfully</p>
477
+ <p class="text-xs text-rustic-500">Yesterday</p>
478
+ </div>
479
+ </div>
480
+ </div>
481
  </div>
482
+ </div>
483
+
484
+ <!-- Resize Handle -->
485
+ <div class="resize-handle" id="resizeHandle"></div>
486
+
487
+ <!-- Bottom Pane: Quick Shortcuts -->
488
+ <div class="bottom-pane bg-rustic-800 rounded-xl border border-rustic-700 p-4 overflow-hidden">
489
+ <div class="pane-header">
490
+ <span class="pane-title">Quick Shortcuts</span>
491
+ <button id="openShortcutsModal" class="text-rust hover:text-rust-light transition text-sm flex items-center space-x-1">
492
+ <i class="fas fa-edit"></i>
493
+ <span>Customize</span>
494
+ </button>
495
+ </div>
496
+
497
+ <!-- Shortcuts Grid -->
498
+ <div class="shortcuts-grid flex-1 overflow-y-auto" id="shortcutsGrid">
499
+ <!-- Shortcuts will be injected here -->
500
  </div>
501
+ </div>
502
+
503
  </div>
504
+ </div>
505
+
506
+ </main>
507
+ </div>
508
 
509
+ <!-- Chatbot Popup -->
510
+ <div class="fixed bottom-6 right-6 z-50 flex flex-col items-end">
511
+ <div id="chatbot-panel" class="chatbot-panel closed bg-rustic-800 rounded-xl shadow-2xl border border-rustic-700 w-[380px] h-[500px] mb-4 flex flex-col overflow-hidden">
512
+ <div class="bg-rust p-3 flex justify-between items-center shrink-0">
513
+ <div class="flex items-center space-x-2">
514
+ <div class="w-2 h-2 bg-white rounded-full animate-pulse"></div>
515
+ <span class="font-medium text-white text-sm">Assistant</span>
516
+ </div>
517
+ <button id="closeChatBtn" class="text-white hover:text-gray-200">
518
+ <i class="fas fa-times"></i>
519
  </button>
520
+ </div>
521
+ <div class="flex-1 bg-black relative">
522
+ <iframe src="http://ninjabot/chatbot/YuXRYou2mbnDqCXc" class="w-full h-full" frameborder="0" allow="microphone"></iframe>
523
+ </div>
524
  </div>
525
 
526
+ <button id="chatbot-toggle-btn" class="chatbot-toggle w-14 h-14 bg-rust hover:bg-rust-light rounded-full shadow-lg shadow-rust/40 flex items-center justify-center text-white transform hover:scale-110">
527
+ <i class="fas fa-comment-dots text-xl"></i>
528
+ </button>
529
+ </div>
530
+
531
+ <!-- Link Settings Modal -->
532
+ <div id="linkSettingsModal" class="fixed inset-0 bg-black/80 backdrop-blur-sm flex items-center justify-center hidden z-[60]">
533
+ <div class="bg-rustic-800 border border-rustic-700 rounded-lg p-6 w-full max-w-md shadow-2xl">
534
+ <div class="flex justify-between items-center mb-6">
535
+ <h3 class="text-xl font-semibold text-white">Edit Launcher</h3>
536
+ <button id="modalCloseBtn" class="text-gray-400 hover:text-white transition">
537
+ <i class="fas fa-times"></i>
538
+ </button>
539
+ </div>
540
+ <div class="space-y-4">
541
+ <div>
542
+ <label class="block text-sm font-medium text-gray-400 mb-1">Category Title</label>
543
+ <input type="text" id="categoryName" class="w-full bg-rustic-900 border border-rustic-700 rounded px-3 py-2 text-white" />
544
+ </div>
545
+ <div>
546
+ <label class="block text-sm font-medium text-gray-400 mb-2">Links</label>
547
+ <div id="linkItems" class="space-y-3 max-h-64 overflow-y-auto pr-2"></div>
548
+ <button id="addNewLinkBtn" class="mt-3 text-rust text-sm flex items-center space-x-1 hover:text-rust-light transition">
549
+ <i class="fas fa-plus"></i>
550
+ <span>Add New Link</span>
551
  </button>
552
  </div>
553
+ </div>
554
+ <div class="flex justify-end space-x-3 mt-8">
555
+ <button id="modalCancelBtn" class="px-4 py-2 rounded-md bg-rustic-900 hover:bg-rustic-700 text-gray-300 transition border border-rustic-700">Cancel</button>
556
+ <button id="saveChangesBtn" class="px-4 py-2 rounded-md bg-rust hover:bg-rust-light text-white transition shadow-lg shadow-rust/20">Save Changes</button>
557
+ </div>
558
+ </div>
559
+ </div>
560
+
561
+ <!-- Shortcuts Modal -->
562
+ <div id="shortcutsModal" class="fixed inset-0 modal-backdrop flex items-center justify-center hidden z-[70]">
563
+ <div class="bg-rustic-800 border border-rustic-700 rounded-xl p-6 w-full max-w-lg shadow-2xl max-h-[80vh] flex flex-col">
564
+ <div class="flex justify-between items-center mb-6">
565
+ <h3 class="text-xl font-semibold text-white">Customize Shortcuts</h3>
566
+ <button id="shortcutsModalClose" class="text-gray-400 hover:text-white transition">
567
+ <i class="fas fa-times"></i>
568
+ </button>
569
+ </div>
570
+
571
+ <div class="space-y-4 flex-1 overflow-y-auto pr-2">
572
+ <div>
573
+ <label class="block text-sm font-medium text-gray-400 mb-2">Add New Shortcut</label>
574
+ <div class="flex space-x-2 mb-4">
575
+ <input type="text" id="shortcutName" placeholder="Name" class="flex-1 bg-rustic-900 border border-rustic-700 rounded px-3 py-2 text-white text-sm" />
576
+ <input type="text" id="shortcutUrl" placeholder="URL" class="flex-1 bg-rustic-900 border border-rustic-700 rounded px-3 py-2 text-white text-sm" />
577
+ <select id="shortcutIcon" class="bg-rustic-900 border border-rustic-700 rounded px-2 py-2 text-white text-sm">
578
+ <option value="fa-link">🔗</option>
579
+ <option value="fa-globe">🌐</option>
580
+ <option value="fa-tasks">✓</option>
581
+ <option value="fa-chart-line">📈</option>
582
+ <option value="fa-cog">⚙️</option>
583
+ <option value="fa-envelope">✉️</option>
584
+ <option value="fa-calendar">📅</option>
585
+ <option value="fa-bell">🔔</option>
586
+ <option value="fa-star">⭐</option>
587
+ <option value="fa-heart">❤️</option>
588
+ <option value="fa-user">👤</option>
589
+ <option value="fa-users">👥</option>
590
+ <option value="fa-folder">📁</option>
591
+ <option value="fa-file">📄</option>
592
+ <option value="fa-image">🖼️</option>
593
+ <option value="fa-play">▶️</option>
594
+ </select>
595
+ <select id="shortcutColor" class="bg-rustic-900 border border-rustic-700 rounded px-2 py-2 text-white text-sm">
596
+ <option value="blue">Blue</option>
597
+ <option value="green">Green</option>
598
+ <option value="purple">Purple</option>
599
+ <option value="yellow">Yellow</option>
600
+ <option value="red">Red</option>
601
+ <option value="teal">Teal</option>
602
+ <option value="rust">Rust</option>
603
+ <option value="gray">Gray</option>
604
+ </select>
605
  </div>
606
+ <button id="addShortcutBtn" class="w-full bg-rustic-700 hover:bg-rustic-600 text-white py-2 rounded-lg transition flex items-center justify-center space-x-2">
607
+ <i class="fas fa-plus"></i>
608
+ <span>Add Shortcut</span>
 
 
 
 
609
  </button>
610
  </div>
611
+
612
+ <div class="border-t border-rustic-700 pt-4">
613
+ <label class="block text-sm font-medium text-gray-400 mb-3">Current Shortcuts</label>
614
+ <div id="shortcutItems" class="space-y-2 max-h-48 overflow-y-auto"></div>
615
+ </div>
616
+ </div>
617
+
618
+ <div class="flex justify-end space-x-3 mt-6 pt-4 border-t border-rustic-700">
619
+ <button id="shortcutsModalCancel" class="px-4 py-2 rounded-md bg-rustic-900 hover:bg-rustic-700 text-gray-300 transition border border-rustic-700">Close</button>
620
  </div>
621
  </div>
622
+ </div>
623
 
624
+ <script>
625
+ document.addEventListener("DOMContentLoaded", () => {
626
  // --- State ---
627
  let currentCategory = "";
628
  const storageKey = "dashboardLinks";
629
+ const shortcutsStorageKey = "dashboardShortcuts";
630
 
631
  const iconClasses = {
632
  blue: "fa-tachometer-alt text-blue-400",
 
639
  gray: "fa-anchor text-gray-400"
640
  };
641
 
642
+ // Shortcut colors mapping
643
+ const shortcutColors = {
644
+ blue: "text-blue-400",
645
+ green: "text-green-400",
646
+ purple: "text-purple-400",
647
+ yellow: "text-yellow-400",
648
+ red: "text-red-400",
649
+ teal: "text-teal-400",
650
+ rust: "text-rust-light",
651
+ gray: "text-gray-400"
652
+ };
653
+
654
  const defaultLinks = {
655
  quick: {
656
  title: "Quick Access",
 
677
  }
678
  };
679
 
680
+ const defaultShortcuts = [
681
+ { name: "Dashboard", url: "#", icon: "fa-tachometer-alt", color: "blue" },
682
+ { name: "Analytics", url: "#", icon: "fa-chart-line", color: "green" },
683
+ { name: "Messages", url: "#", icon: "fa-envelope", color: "purple" },
684
+ { name: "Calendar", url: "#", icon: "fa-calendar", color: "yellow" },
685
+ { name: "Settings", url: "#", icon: "fa-cog", color: "gray" },
686
+ { name: "Support", url: "#", icon: "fa-life-ring", color: "red" },
687
+ ];
688
+
689
  // --- Functions ---
690
  const getStoredLinks = () => {
691
  const links = localStorage.getItem(storageKey);
 
696
  localStorage.setItem(storageKey, JSON.stringify(links));
697
  };
698
 
699
+ // Shortcuts functions
700
+ const getStoredShortcuts = () => {
701
+ const shortcuts = localStorage.getItem(shortcutsStorageKey);
702
+ return shortcuts ? JSON.parse(shortcuts) : defaultShortcuts;
703
+ };
704
+
705
+ const saveShortcutsToStorage = (shortcuts) => {
706
+ localStorage.setItem(shortcutsStorageKey, JSON.stringify(shortcuts));
707
+ };
708
+
709
  const renderSidebarLinks = () => {
710
  const container = document.getElementById("dashboard-links-view");
711
  const allLinks = getStoredLinks();
 
718
  const section = document.createElement("div");
719
  section.className = "mb-2";
720
 
 
721
  const header = document.createElement("div");
722
  header.className = "flex justify-between items-center mb-2 px-2";
723
  header.innerHTML = `
 
727
  </button>
728
  `;
729
 
 
730
  const list = document.createElement("div");
731
  list.className = "space-y-1";
732
 
 
748
  container.appendChild(section);
749
  });
750
 
 
751
  document.querySelectorAll("#dashboard-links-view button[data-category]").forEach(btn => {
752
  btn.addEventListener("click", (e) => showLinkSettings(e.currentTarget.dataset.category));
753
  });
754
  };
755
 
756
+ // Render shortcuts in bottom pane
757
+ const renderShortcuts = () => {
758
+ const container = document.getElementById("shortcutsGrid");
759
+ const shortcuts = getStoredShortcuts();
760
+
761
+ container.innerHTML = "";
762
+
763
+ shortcuts.forEach((shortcut, index) => {
764
+ const iconColor = shortcutColors[shortcut.color] || "text-gray-400";
765
+ const div = document.createElement("div");
766
+ div.className = "shortcut-item";
767
+ div.innerHTML = `
768
+ <i class="fas ${shortcut.icon} ${iconColor}"></i>
769
+ <span class="truncate w-full">${shortcut.name}</span>
770
+ `;
771
+ div.addEventListener("click", () => {
772
+ if(shortcut.url && shortcut.url !== "#") {
773
+ window.open(shortcut.url, "_blank");
774
+ }
775
+ });
776
+ container.appendChild(div);
777
+ });
778
+ };
779
+
780
  const hideLinkSettings = () => document.getElementById("linkSettingsModal").classList.add("hidden");
781
+ const hideShortcutsModal = () => document.getElementById("shortcutsModal").classList.add("hidden");
782
+ const showShortcutsModal = () => {
783
+ renderShortcutItems();
784
+ document.getElementById("shortcutsModal").classList.remove("hidden");
785
+ };
786
 
787
  const addNewLink = (name = "", url = "", color = "rust") => {
788
  const linkItems = document.getElementById("linkItems");
 
837
  hideLinkSettings();
838
  };
839
 
840
+ // Render shortcut items in modal
841
+ const renderShortcutItems = () => {
842
+ const container = document.getElementById("shortcutItems");
843
+ const shortcuts = getStoredShortcuts();
844
+
845
+ container.innerHTML = "";
846
+
847
+ shortcuts.forEach((shortcut, index) => {
848
+ const iconColor = shortcutColors[shortcut.color] || "text-gray-400";
849
+ const div = document.createElement("div");
850
+ div.className = "flex items-center justify-between bg-rustic-900 rounded px-3 py-2";
851
+ div.innerHTML = `
852
+ <div class="flex items-center space-x-3">
853
+ <i class="fas ${shortcut.icon} ${iconColor}"></i>
854
+ <span class="text-sm text-white">${shortcut.name}</span>
855
+ </div>
856
+ <button class="text-red-500 hover:text-red-400 remove-shortcut-btn" data-index="${index}">
857
+ <i class="fas fa-trash"></i>
858
+ </button>
859
+ `;
860
+ container.appendChild(div);
861
+ });
862
+
863
+ // Attach remove listeners
864
+ document.querySelectorAll(".remove-shortcut-btn").forEach(btn => {
865
+ btn.addEventListener("click", (e) => {
866
+ const idx = parseInt(e.currentTarget.dataset.index);
867
+ const shortcuts = getStoredShortcuts();
868
+ shortcuts.splice(idx, 1);
869
+ saveShortcutsToStorage(shortcuts);
870
+ renderShortcutItems();
871
+ renderShortcuts();
872
+ });
873
+ });
874
+ };
875
+
876
+ const addNewShortcut = () => {
877
+ const name = document.getElementById("shortcutName").value.trim();
878
+ const url = document.getElementById("shortcutUrl").value.trim();
879
+ const icon = document.getElementById("shortcutIcon").value;
880
+ const color = document.getElementById("shortcutColor").value;
881
+
882
+ if (!name) {
883
+ alert("Please enter a shortcut name");
884
+ return;
885
+ }
886
+
887
+ const shortcuts = getStoredShortcuts();
888
+ shortcuts.push({ name, url: url || "#", icon, color });
889
+ saveShortcutsToStorage(shortcuts);
890
+
891
+ // Clear inputs
892
+ document.getElementById("shortcutName").value = "";
893
+ document.getElementById("shortcutUrl").value = "";
894
+
895
+ renderShortcutItems();
896
+ renderShortcuts();
897
+ };
898
+
899
  // --- Chatbot Logic ---
900
  const chatPanel = document.getElementById('chatbot-panel');
901
  const chatBtn = document.getElementById('chatbot-toggle-btn');
 
922
  const switchTab = (event) => {
923
  const tabId = event.currentTarget.dataset.tab;
924
 
 
925
  document.querySelectorAll('.tab-content').forEach(el => el.classList.add('hidden'));
926
  document.querySelectorAll('.tab-content').forEach(el => el.classList.remove('block'));
927
 
 
928
  const target = document.getElementById(tabId);
929
  if(target) {
930
  target.classList.remove('hidden');
931
  target.classList.add('block');
932
  }
933
 
 
934
  document.querySelectorAll('.nav-item').forEach(el => el.classList.remove('active'));
935
  event.currentTarget.classList.add('active');
936
  };
 
974
  e.target.value = '';
975
  };
976
 
977
+ // --- Pane Resize Logic ---
978
+ const setupPaneResize = () => {
979
+ const handle = document.getElementById("resizeHandle");
980
+ const topPane = document.querySelector(".top-pane");
981
+ const bottomPane = document.querySelector(".bottom-pane");
982
+ let isResizing = false;
983
+ let startY = 0;
984
+ let startTopHeight = 0;
985
+
986
+ handle.addEventListener("mousedown", (e) => {
987
+ isResizing = true;
988
+ startY = e.clientY;
989
+ startTopHeight = topPane.offsetHeight;
990
+ document.body.style.cursor = "ns-resize";
991
+ document.body.style.userSelect = "none";
992
+ });
993
 
994
+ document.addEventListener("mousemove", (e) => {
995
+ if (!isResizing) return;
996
+ const deltaY = e.clientY - startY;
997
+ const newTopHeight = startTopHeight + deltaY;
998
+ const totalHeight = topPane.parentElement.offsetHeight - 16; // Account for gap
999
+
1000
+ if (newTopHeight > 100 && newTopHeight < totalHeight - 150) {
1001
+ topPane.style.flex = `0 0 ${newTopHeight}px`;
1002
+ bottomPane.style.flex = `0 0 ${totalHeight - newTopHeight}px`;
1003
+ }
1004
+ });
1005
 
1006
+ document.addEventListener("mouseup", () => {
1007
+ if