NanoBotAIAgent commited on
Commit
86631ec
·
verified ·
1 Parent(s): 9cc61fd

Upload folder using huggingface_hub

Browse files
Files changed (11) hide show
  1. README.md +5 -4
  2. animations.css +370 -0
  3. app.js +524 -0
  4. dashboard.html +211 -0
  5. demo-data.js +132 -0
  6. index.html +214 -19
  7. job.html +323 -0
  8. library.html +264 -0
  9. results.html +257 -0
  10. settings.html +326 -0
  11. upload.html +276 -0
README.md CHANGED
@@ -1,10 +1,11 @@
1
  ---
2
  title: Mod Converter Preview
3
- emoji: 📈
4
- colorFrom: blue
5
- colorTo: green
6
  sdk: static
 
7
  pinned: false
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
  title: Mod Converter Preview
3
+ emoji: 🔧
4
+ colorFrom: green
5
+ colorTo: gray
6
  sdk: static
7
+ app_file: index.html
8
  pinned: false
9
  ---
10
 
11
+ CraftBridge - Minecraft Mod Converter
animations.css ADDED
@@ -0,0 +1,370 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Mod Converter — Shared animation layer + custom components
2
+ * Applied ON TOP of the Tailwind-based Stitch pages.
3
+ * Adds smooth scroll animations, hover lifts, page transitions, and custom MC version selector.
4
+ */
5
+
6
+ /* --- Keyframes --- */
7
+ @keyframes fadeInUp {
8
+ from { opacity: 0; transform: translateY(20px); }
9
+ to { opacity: 1; transform: translateY(0); }
10
+ }
11
+
12
+ @keyframes fadeIn {
13
+ from { opacity: 0; }
14
+ to { opacity: 1; }
15
+ }
16
+
17
+ @keyframes scaleIn {
18
+ from { opacity: 0; transform: scale(0.96); }
19
+ to { opacity: 1; transform: scale(1); }
20
+ }
21
+
22
+ @keyframes slideInRight {
23
+ from { opacity: 0; transform: translateX(16px); }
24
+ to { opacity: 1; transform: translateX(0); }
25
+ }
26
+
27
+ @keyframes pulseGlow {
28
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(74, 222, 128, 0); }
29
+ 50% { box-shadow: 0 0 12px 2px rgba(74, 222, 128, 0.15); }
30
+ }
31
+
32
+ @keyframes progressPulse {
33
+ 0%, 100% { opacity: 1; }
34
+ 50% { opacity: 0.5; }
35
+ }
36
+
37
+ /* --- Page transition --- */
38
+ html {
39
+ scroll-behavior: smooth;
40
+ }
41
+
42
+ body {
43
+ animation: fadeIn 0.25s ease-out;
44
+ }
45
+
46
+ /* --- Scroll-triggered animations --- */
47
+ .reveal {
48
+ opacity: 0;
49
+ transform: translateY(16px);
50
+ transition: opacity 0.4s ease-out, transform 0.4s ease-out;
51
+ }
52
+
53
+ .reveal.visible {
54
+ opacity: 1;
55
+ transform: translateY(0);
56
+ }
57
+
58
+ .reveal-scale {
59
+ opacity: 0;
60
+ transform: scale(0.96);
61
+ transition: opacity 0.35s ease-out, transform 0.35s ease-out;
62
+ }
63
+
64
+ .reveal-scale.visible {
65
+ opacity: 1;
66
+ transform: scale(1);
67
+ }
68
+
69
+ /* Stagger children on reveal */
70
+ .stagger > * {
71
+ opacity: 0;
72
+ transform: translateY(10px);
73
+ transition: opacity 0.3s ease-out, transform 0.3s ease-out;
74
+ }
75
+
76
+ .stagger.visible > *:nth-child(1) { transition-delay: 0ms; opacity: 1; transform: none; }
77
+ .stagger.visible > *:nth-child(2) { transition-delay: 70ms; opacity: 1; transform: none; }
78
+ .stagger.visible > *:nth-child(3) { transition-delay: 140ms; opacity: 1; transform: none; }
79
+ .stagger.visible > *:nth-child(4) { transition-delay: 210ms; opacity: 1; transform: none; }
80
+ .stagger.visible > *:nth-child(5) { transition-delay: 280ms; opacity: 1; transform: none; }
81
+ .stagger.visible > *:nth-child(6) { transition-delay: 350ms; opacity: 1; transform: none; }
82
+
83
+ /* --- Hover lifts --- */
84
+ .lift {
85
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
86
+ }
87
+
88
+ .lift:hover {
89
+ transform: translateY(-2px);
90
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
91
+ }
92
+
93
+ /* --- Interactive states --- */
94
+ button, a {
95
+ transition: all 0.15s ease;
96
+ }
97
+
98
+ button:active {
99
+ transform: scale(0.97);
100
+ }
101
+
102
+ /* --- Progress bar smooth fill --- */
103
+ [class*="bg-emerald"] {
104
+ transition: width 0.5s ease-in-out, background-color 0.3s ease;
105
+ }
106
+
107
+ /* --- Active pulse for running status --- */
108
+ .animate-pulse {
109
+ animation: progressPulse 1.5s ease-in-out infinite;
110
+ }
111
+
112
+ /* --- Terminal auto-scroll --- */
113
+ .terminal-scroll {
114
+ scroll-behavior: smooth;
115
+ }
116
+
117
+ /* --- Dropzone drag feedback --- */
118
+ .dropzone-active {
119
+ border-color: #4ade80 !important;
120
+ background: rgba(74, 222, 128, 0.03) !important;
121
+ }
122
+
123
+ /* --- Responsive sidebar --- */
124
+ @media (max-width: 768px) {
125
+ aside.fixed { display: none !important; }
126
+ div.md\:pl-64 { padding-left: 0 !important; margin-left: 0 !important; }
127
+ }
128
+
129
+ /* --- Fix AI-generated tells --- */
130
+ /* Remove excessive uppercase tracking in footers */
131
+ footer span.tracking-widest {
132
+ letter-spacing: 0.08em;
133
+ font-size: 0.7rem;
134
+ }
135
+
136
+ /* Tone down glow effects */
137
+ .shadow-\[0_0_15px_rgba\(16\,185\,129\,0\.2\)\] {
138
+ box-shadow: 0 0 12px rgba(16, 185, 129, 0.12);
139
+ }
140
+
141
+ .shadow-\[0_0_5px_rgba\(52\,211\,153\,0\.8\)\],
142
+ .shadow-\[0_0_5px_rgba\(251\,191\,36\,0\.8\)\] {
143
+ box-shadow: 0 0 4px currentColor;
144
+ }
145
+
146
+ /* Smoother badge dots */
147
+ .inline-flex span.w-1\.5 {
148
+ transition: opacity 0.2s ease;
149
+ }
150
+
151
+ /* ============================================
152
+ Custom MC Version Selector
153
+ ============================================ */
154
+
155
+ .mc-selector {
156
+ position: relative;
157
+ }
158
+
159
+ /* Trigger button */
160
+ .mc-selector-trigger {
161
+ width: 100%;
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: space-between;
165
+ padding: 12px 16px;
166
+ background: #0f172a;
167
+ border: 1px solid #334155;
168
+ border-radius: 10px;
169
+ color: #e2e8f0;
170
+ font-family: 'Manrope', sans-serif;
171
+ font-size: 0.875rem;
172
+ cursor: pointer;
173
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
174
+ }
175
+
176
+ .mc-selector-trigger:hover {
177
+ border-color: #4ade80;
178
+ }
179
+
180
+ .mc-selector-trigger.open {
181
+ border-color: #4ade80;
182
+ box-shadow: 0 0 0 3px rgba(74, 222, 128, 0.08);
183
+ }
184
+
185
+ .mc-selector-trigger .mc-selector-value {
186
+ color: #94a3b8;
187
+ transition: color 0.2s ease;
188
+ }
189
+
190
+ .mc-selector-trigger.has-value .mc-selector-value {
191
+ color: #e2e8f0;
192
+ font-weight: 600;
193
+ font-family: 'JetBrains Mono', monospace;
194
+ font-size: 0.8125rem;
195
+ letter-spacing: 0.02em;
196
+ }
197
+
198
+ /* Arrow icon rotation */
199
+ .mc-selector-arrow {
200
+ font-size: 20px;
201
+ color: #64748b;
202
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s ease;
203
+ }
204
+
205
+ .mc-selector-trigger.open .mc-selector-arrow {
206
+ transform: rotate(180deg);
207
+ color: #4ade80;
208
+ }
209
+
210
+ /* Dropdown panel */
211
+ .mc-selector-panel {
212
+ position: absolute;
213
+ top: calc(100% + 6px);
214
+ left: 0;
215
+ right: 0;
216
+ z-index: 60;
217
+ background: #0f172a;
218
+ border: 1px solid #1e293b;
219
+ border-radius: 12px;
220
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(74, 222, 128, 0.05);
221
+ overflow: hidden;
222
+
223
+ /* Animation: scale + fade from top */
224
+ opacity: 0;
225
+ transform: translateY(-8px) scale(0.98);
226
+ transform-origin: top center;
227
+ pointer-events: none;
228
+ transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1),
229
+ transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
230
+ }
231
+
232
+ .mc-selector-panel.open {
233
+ opacity: 1;
234
+ transform: translateY(0) scale(1);
235
+ pointer-events: auto;
236
+ }
237
+
238
+ /* Search bar */
239
+ .mc-selector-search {
240
+ display: flex;
241
+ align-items: center;
242
+ gap: 8px;
243
+ padding: 10px 14px;
244
+ border-bottom: 1px solid #1e293b;
245
+ background: #020617;
246
+ }
247
+
248
+ .mc-selector-search .material-symbols-outlined {
249
+ font-size: 18px;
250
+ color: #475569;
251
+ }
252
+
253
+ .mc-selector-search input {
254
+ flex: 1;
255
+ background: transparent;
256
+ border: none;
257
+ outline: none;
258
+ color: #e2e8f0;
259
+ font-family: 'Manrope', sans-serif;
260
+ font-size: 0.8125rem;
261
+ }
262
+
263
+ .mc-selector-search input::placeholder {
264
+ color: #475569;
265
+ }
266
+
267
+ /* Version list */
268
+ .mc-selector-list {
269
+ max-height: 240px;
270
+ overflow-y: auto;
271
+ padding: 6px;
272
+ scroll-behavior: smooth;
273
+ }
274
+
275
+ .mc-selector-list::-webkit-scrollbar {
276
+ width: 4px;
277
+ }
278
+
279
+ .mc-selector-list::-webkit-scrollbar-track {
280
+ background: transparent;
281
+ }
282
+
283
+ .mc-selector-list::-webkit-scrollbar-thumb {
284
+ background: #334155;
285
+ border-radius: 2px;
286
+ }
287
+
288
+ /* Group label */
289
+ .mc-selector-group {
290
+ margin-bottom: 4px;
291
+ }
292
+
293
+ .mc-selector-group-label {
294
+ padding: 8px 12px 4px;
295
+ font-family: 'Plus Jakarta Sans', sans-serif;
296
+ font-size: 0.65rem;
297
+ font-weight: 600;
298
+ text-transform: uppercase;
299
+ letter-spacing: 0.08em;
300
+ color: #475569;
301
+ }
302
+
303
+ /* Option button */
304
+ .mc-selector-option {
305
+ display: flex;
306
+ align-items: center;
307
+ justify-content: space-between;
308
+ width: 100%;
309
+ padding: 10px 12px;
310
+ border: none;
311
+ border-radius: 8px;
312
+ background: transparent;
313
+ color: #cbd5e1;
314
+ font-family: 'JetBrains Mono', monospace;
315
+ font-size: 0.8125rem;
316
+ cursor: pointer;
317
+ transition: background 0.15s ease, color 0.15s ease, transform 0.15s ease;
318
+ }
319
+
320
+ .mc-selector-option:hover {
321
+ background: #1e293b;
322
+ color: #e2e8f0;
323
+ transform: translateX(4px);
324
+ }
325
+
326
+ .mc-selector-option.selected {
327
+ background: rgba(74, 222, 128, 0.08);
328
+ color: #4ade80;
329
+ }
330
+
331
+ .mc-selector-option:active {
332
+ transform: scale(0.98);
333
+ }
334
+
335
+ /* Version name */
336
+ .mc-version-name {
337
+ font-weight: 500;
338
+ }
339
+
340
+ /* Version tag */
341
+ .mc-version-tag {
342
+ font-family: 'Plus Jakarta Sans', sans-serif;
343
+ font-size: 0.6rem;
344
+ font-weight: 700;
345
+ text-transform: uppercase;
346
+ letter-spacing: 0.06em;
347
+ padding: 2px 8px;
348
+ border-radius: 4px;
349
+ }
350
+
351
+ .mc-version-tag.latest {
352
+ background: rgba(74, 222, 128, 0.15);
353
+ color: #4ade80;
354
+ border: 1px solid rgba(74, 222, 128, 0.2);
355
+ }
356
+
357
+ .mc-version-tag.stable {
358
+ background: rgba(99, 102, 241, 0.12);
359
+ color: #818cf8;
360
+ border: 1px solid rgba(99, 102, 241, 0.2);
361
+ }
362
+
363
+ /* Hidden option (filtered out) */
364
+ .mc-selector-option.hidden {
365
+ display: none;
366
+ }
367
+
368
+ .mc-selector-group.hidden {
369
+ display: none;
370
+ }
app.js ADDED
@@ -0,0 +1,524 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* CraftBridge — Demo interaction handler
2
+ * Wires up all buttons, nav, dropzone, tables etc. with fake data.
3
+ */
4
+
5
+ document.addEventListener('DOMContentLoaded', () => {
6
+
7
+ // --- Load demo data ---
8
+ const demoScript = document.createElement('script');
9
+ demoScript.src = 'demo-data.js';
10
+ demoScript.onload = initDemo;
11
+ document.head.appendChild(demoScript);
12
+
13
+ function initDemo() {
14
+ initAnimations();
15
+ initDropzone();
16
+ initTerminal();
17
+ initNav();
18
+ initDashboard();
19
+ initJobDetail();
20
+ initResults();
21
+ initMcSelector();
22
+ initSettingsSelectors();
23
+ }
24
+
25
+ // --- Scroll animations ---
26
+ function initAnimations() {
27
+ const observer = new IntersectionObserver((entries) => {
28
+ entries.forEach(entry => {
29
+ if (entry.isIntersecting) {
30
+ entry.target.classList.add('visible');
31
+ observer.unobserve(entry.target);
32
+ }
33
+ });
34
+ }, { threshold: 0.1, rootMargin: '0px 0px -40px 0px' });
35
+
36
+ document.querySelectorAll('.reveal, .reveal-scale, .stagger').forEach(el => {
37
+ observer.observe(el);
38
+ });
39
+ }
40
+
41
+ // --- Navigation ---
42
+ function initNav() {
43
+ const path = window.location.pathname;
44
+ document.querySelectorAll('aside nav a, .sidebar nav a').forEach(a => {
45
+ const href = a.getAttribute('href') || '';
46
+ a.classList.remove('active');
47
+ if (!a.classList.contains('text-emerald-400') && !a.classList.contains('text-emerald-700') && !a.classList.contains('dark\\:text-emerald-400')) {
48
+ // no-op
49
+ }
50
+ });
51
+ }
52
+
53
+ // --- Dashboard: populate job table ---
54
+ function initDashboard() {
55
+ const tbody = document.querySelector('[data-job-table]');
56
+ if (!tbody) return;
57
+
58
+ const jobs = getJobs();
59
+ tbody.innerHTML = '';
60
+
61
+ jobs.forEach(job => {
62
+ const tr = document.createElement('tr');
63
+ tr.className = 'hover:bg-slate-800/20 transition-colors group cursor-pointer';
64
+ tr.innerHTML = `
65
+ <td class="px-6 py-4 font-mono text-slate-500 text-xs">#${job.job_id.toUpperCase()}</td>
66
+ <td class="px-6 py-4 font-medium text-slate-200">${job.jar_name}</td>
67
+ <td class="px-6 py-4">
68
+ <span class="bg-slate-800 text-slate-300 text-[10px] font-bold px-2 py-1 rounded border border-slate-700">${job.mc_version}</span>
69
+ </td>
70
+ <td class="px-6 py-4">${statusBadge(job.status)}</td>
71
+ <td class="px-6 py-4 text-xs">${timeAgo(job.created_at)}</td>
72
+ <td class="px-6 py-4 text-right">
73
+ <div class="flex justify-end gap-2 opacity-0 group-hover:opacity-100 transition-opacity">
74
+ ${job.status === 'done' ? '<button class="p-1 text-slate-500 hover:text-emerald-400 transition-colors" onclick="window.location.href=\'results.html?job=' + job.job_id + '\'"><span class="material-symbols-outlined text-[18px]">download</span></button>' : ''}
75
+ ${job.status === 'running' ? '<button class="p-1 text-slate-500 hover:text-amber-400 transition-colors" onclick="window.location.href=\'job.html?job=' + job.job_id + '\'"><span class="material-symbols-outlined text-[18px]">visibility</span></button>' : ''}
76
+ <button class="p-1 text-slate-500 hover:text-red-400 transition-colors" onclick="this.closest(\'tr\').remove()"><span class="material-symbols-outlined text-[18px]">delete</span></button>
77
+ </div>
78
+ </td>
79
+ `;
80
+ tr.addEventListener('click', (e) => {
81
+ if (e.target.closest('button')) return;
82
+ if (job.status === 'done') window.location.href = `results.html?job=${job.job_id}`;
83
+ else if (job.status === 'running') window.location.href = `job.html?job=${job.job_id}`;
84
+ else window.location.href = `job.html?job=${job.job_id}`;
85
+ });
86
+ tbody.appendChild(tr);
87
+ });
88
+
89
+ // Update stat numbers
90
+ const totalEl = document.querySelector('[data-stat-total]');
91
+ const successEl = document.querySelector('[data-stat-success]');
92
+ const failedEl = document.querySelector('[data-stat-failed]');
93
+ if (totalEl) totalEl.textContent = jobs.length;
94
+ if (successEl) successEl.textContent = jobs.filter(j => j.status === 'done').length;
95
+ if (failedEl) failedEl.textContent = jobs.filter(j => j.status === 'failed').length;
96
+
97
+ // Show empty state if no jobs
98
+ const emptyState = document.querySelector('[data-empty-state]');
99
+ const tableEl = tbody.closest('table');
100
+ if (emptyState) {
101
+ if (jobs.length === 0) {
102
+ emptyState.classList.remove('hidden');
103
+ if (tableEl) tableEl.classList.add('hidden');
104
+ } else {
105
+ emptyState.classList.add('hidden');
106
+ if (tableEl) tableEl.classList.remove('hidden');
107
+ }
108
+ }
109
+ }
110
+
111
+ // --- Job detail page ---
112
+ function initJobDetail() {
113
+ const params = new URLSearchParams(window.location.search);
114
+ const jobId = params.get('job');
115
+ if (!jobId) return;
116
+
117
+ const job = getJob(jobId);
118
+ if (!job) return;
119
+
120
+ // Update page content with job data
121
+ document.querySelectorAll('[data-job-id]').forEach(el => el.textContent = `#${jobId.toUpperCase()}`);
122
+ document.querySelectorAll('[data-job-name]').forEach(el => el.textContent = job.jar_name);
123
+ document.querySelectorAll('[data-job-version]').forEach(el => el.textContent = job.mc_version);
124
+ document.querySelectorAll('[data-job-status]').forEach(el => { el.innerHTML = statusBadge(job.status); });
125
+ document.querySelectorAll('[data-job-iteration]').forEach(el => { el.textContent = job.current_iteration; });
126
+
127
+ // Progress steps
128
+ const steps = ['Uploaded', 'Analyzing', 'Building', 'Testing', 'Complete'];
129
+ const activeIndex = job.status === 'done' ? 4 : job.status === 'failed' ? 2 : job.status === 'running' ? 2 : 0;
130
+
131
+ document.querySelectorAll('[data-progress-steps]').forEach(container => {
132
+ container.innerHTML = steps.map((step, i) => {
133
+ let cls = 'text-slate-500 border-slate-700';
134
+ let dotCls = 'bg-slate-700';
135
+ if (i < activeIndex) { cls = 'text-emerald-400 border-emerald-500'; dotCls = 'bg-emerald-500'; }
136
+ if (i === activeIndex && job.status === 'running') { cls = 'text-amber-400 border-amber-500'; dotCls = 'bg-amber-400 animate-pulse'; }
137
+ if (i === activeIndex && job.status === 'done') { cls = 'text-emerald-400 border-emerald-500'; dotCls = 'bg-emerald-500'; }
138
+ return `<div class="flex flex-col items-center gap-2 flex-1">
139
+ <div class="w-8 h-8 rounded-full border-2 ${dotCls} ${cls} flex items-center justify-center text-xs font-bold">${i < activeIndex || job.status === 'done' ? '✓' : i + 1}</div>
140
+ <span class="text-xs ${cls} font-label">${step}</span>
141
+ </div>${i < steps.length - 1 ? '<div class="flex-1 h-0.5 mt-4 ' + (i < activeIndex ? 'bg-emerald-500' : 'bg-slate-700') + '"></div>' : ''}`;
142
+ }).join('');
143
+ });
144
+
145
+ // Build iterations table
146
+ const buildTbody = document.querySelector('[data-build-table]');
147
+ if (buildTbody && job.build_run_ids) {
148
+ buildTbody.innerHTML = '';
149
+ job.build_run_ids.forEach((bid, i) => {
150
+ const build = DEMO.builds[bid];
151
+ if (!build) return;
152
+ const tr = document.createElement('tr');
153
+ tr.className = 'hover:bg-slate-800/20 transition-colors';
154
+ const statusIcon = build.status === 'passed' ? '✓' : build.status === 'failed' ? '✗' : '⏳';
155
+ const statusColor = build.status === 'passed' ? 'text-emerald-400' : build.status === 'failed' ? 'text-red-400' : 'text-amber-400';
156
+ tr.innerHTML = `
157
+ <td class="px-4 py-3 text-xs">${build.iteration}</td>
158
+ <td class="px-4 py-3 ${statusColor} font-bold text-sm">${statusIcon} ${build.status}</td>
159
+ <td class="px-4 py-3 text-xs text-slate-500">${build.time}</td>
160
+ <td class="px-4 py-3"><button class="text-xs text-indigo-400 hover:text-indigo-300 transition-colors" onclick="showBuildLog('${bid}')">View Log</button></td>
161
+ `;
162
+ buildTbody.appendChild(tr);
163
+ });
164
+ }
165
+ }
166
+
167
+ // --- Show build log in terminal ---
168
+ window.showBuildLog = function(buildId) {
169
+ const build = DEMO.builds[buildId];
170
+ if (!build) return;
171
+ const terminal = document.querySelector('[data-terminal]');
172
+ if (!terminal) return;
173
+ terminal.innerHTML = build.log.split('\n').map(line => {
174
+ let cls = 'text-slate-400';
175
+ if (line.includes('[ERROR]')) cls = 'text-red-400';
176
+ else if (line.includes('[WARN]')) cls = 'text-amber-400';
177
+ else if (line.includes('[INFO]') && line.includes('SUCCESS')) cls = 'text-emerald-400';
178
+ else if (line.includes('[INFO]')) cls = 'text-slate-500';
179
+ else if (line.includes('>')) cls = 'text-emerald-400';
180
+ return `<div class="${cls}">${line}</div>`;
181
+ }).join('');
182
+ terminal.scrollTop = 0;
183
+ // Highlight the terminal section
184
+ terminal.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
185
+ };
186
+
187
+ // --- Results page ---
188
+ function initResults() {
189
+ const params = new URLSearchParams(window.location.search);
190
+ const jobId = params.get('job');
191
+ if (!jobId) return;
192
+
193
+ const job = getJob(jobId);
194
+ if (!job) return;
195
+
196
+ document.querySelectorAll('[data-result-name]').forEach(el => el.textContent = job.jar_name);
197
+ document.querySelectorAll('[data-result-version]').forEach(el => el.textContent = job.mc_version);
198
+
199
+ // Populate report
200
+ const reportEl = document.querySelector('[data-conversion-report]');
201
+ if (reportEl && jobId === 'cb-892a') {
202
+ reportEl.innerHTML = renderMarkdown(DEMO.conversionReport);
203
+ }
204
+ }
205
+
206
+ // --- Simple markdown renderer ---
207
+ function renderMarkdown(text) {
208
+ return text
209
+ .replace(/^### (.+)$/gm, '<h3 class="text-lg font-bold text-slate-200 mt-4 mb-2">$1</h3>')
210
+ .replace(/^## (.+)$/gm, '<h2 class="text-xl font-bold text-slate-100 mt-6 mb-3">$1</h2>')
211
+ .replace(/^# (.+)$/gm, '<h1 class="text-2xl font-bold text-white mt-8 mb-4">$1</h1>')
212
+ .replace(/^- (.+)$/gm, '<div class="flex gap-2 text-sm text-slate-300 pl-4"><span class="text-slate-500">•</span><span>$1</span></div>')
213
+ .replace(/⚠️/g, '<span class="text-amber-400">⚠️</span>')
214
+ .replace(/✅/g, '<span class="text-emerald-400">✅</span>')
215
+ .replace(/✗/g, '<span class="text-red-400">✗</span>')
216
+ .replace(/\*\*(.+?)\*\*/g, '<strong class="text-slate-200">$1</strong>')
217
+ .replace(/\n\n/g, '<br><br>')
218
+ .replace(/\n/g, '<br>');
219
+ }
220
+
221
+ // --- Dropzone ---
222
+ function initDropzone() {
223
+ const dropzone = document.querySelector('[data-dropzone]');
224
+ if (!dropzone) return;
225
+
226
+ const label = dropzone.querySelector('[data-dropzone-label]');
227
+
228
+ ['dragenter', 'dragover'].forEach(evt => {
229
+ dropzone.addEventListener(evt, (e) => {
230
+ e.preventDefault();
231
+ dropzone.classList.add('dropzone-active', 'border-emerald-500/50');
232
+ });
233
+ });
234
+
235
+ ['dragleave', 'drop'].forEach(evt => {
236
+ dropzone.addEventListener(evt, (e) => {
237
+ e.preventDefault();
238
+ dropzone.classList.remove('dropzone-active', 'border-emerald-500/50');
239
+ });
240
+ });
241
+
242
+ dropzone.addEventListener('drop', (e) => {
243
+ const files = e.dataTransfer.files;
244
+ if (files.length > 0) {
245
+ if (label) label.textContent = files[0].name;
246
+ dropzone.classList.add('has-file', 'border-emerald-500');
247
+ enableConvertBtn(files[0].name);
248
+ }
249
+ });
250
+
251
+ // Click to browse (only on the dropzone area, not the Browse button)
252
+ dropzone.addEventListener('click', (e) => {
253
+ // If clicking the Browse button, let it handle the file picker
254
+ // Otherwise open the file picker from the dropzone
255
+ const input = document.createElement('input');
256
+ input.type = 'file';
257
+ input.accept = '.jar';
258
+ input.onchange = () => {
259
+ if (input.files.length > 0) {
260
+ if (label) label.textContent = input.files[0].name;
261
+ dropzone.classList.add('has-file', 'border-emerald-500');
262
+ enableConvertBtn(input.files[0].name);
263
+ }
264
+ };
265
+ input.click();
266
+ });
267
+ }
268
+
269
+ function enableConvertBtn(filename) {
270
+ const btn = document.querySelector('[data-convert-btn]');
271
+ if (btn) {
272
+ btn.disabled = false;
273
+ btn.classList.remove('opacity-40', 'cursor-not-allowed');
274
+ }
275
+ }
276
+
277
+ // --- Convert button ---
278
+ document.addEventListener('click', (e) => {
279
+ const convertBtn = e.target.closest('[data-convert-btn]');
280
+ if (convertBtn && !convertBtn.disabled) {
281
+ convertBtn.innerHTML = '<span class="material-symbols-outlined animate-spin">progress_activity</span> Starting...';
282
+ convertBtn.disabled = true;
283
+ setTimeout(() => {
284
+ window.location.href = 'job.html?job=cb-892b';
285
+ }, 1500);
286
+ }
287
+
288
+ // Download buttons on results page
289
+ const downloadBtn = e.target.closest('[data-download-plugin], [data-download-rp], [data-download-dp]');
290
+ if (downloadBtn) {
291
+ const original = downloadBtn.innerHTML;
292
+ downloadBtn.innerHTML = '<span class="material-symbols-outlined">check</span> Downloaded!';
293
+ downloadBtn.classList.add('opacity-60');
294
+ setTimeout(() => {
295
+ downloadBtn.innerHTML = original;
296
+ downloadBtn.classList.remove('opacity-60');
297
+ }, 2000);
298
+ }
299
+
300
+ // Sign in button → go to dashboard
301
+ const signInBtn = e.target.closest('[data-sign-in]');
302
+ if (signInBtn) {
303
+ signInBtn.innerHTML = '<span class="material-symbols-outlined animate-spin">progress_activity</span> Signing in...';
304
+ setTimeout(() => {
305
+ window.location.href = 'dashboard.html';
306
+ }, 800);
307
+ }
308
+
309
+ // Start Converting CTA
310
+ const startBtn = e.target.closest('[data-start-converting]');
311
+ if (startBtn) {
312
+ window.location.href = 'upload.html';
313
+ }
314
+
315
+ // Convert Another
316
+ const anotherBtn = e.target.closest('[data-convert-another]');
317
+ if (anotherBtn) {
318
+ window.location.href = 'upload.html';
319
+ }
320
+
321
+ // Cancel job
322
+ const cancelBtn = e.target.closest('[data-cancel-job]');
323
+ if (cancelBtn) {
324
+ cancelBtn.textContent = 'Cancelled';
325
+ cancelBtn.classList.add('opacity-50');
326
+ cancelBtn.disabled = true;
327
+ }
328
+ });
329
+
330
+ // --- Custom MC Version Selector (supports multiple on page) ---
331
+ function initMcSelector() {
332
+ document.querySelectorAll('[data-mc-selector]').forEach(selector => {
333
+ const trigger = selector.querySelector('[data-mc-trigger]');
334
+ const panel = selector.querySelector('[data-mc-panel]');
335
+ const valueEl = selector.querySelector('[data-mc-value]');
336
+ const searchInput = selector.querySelector('[data-mc-search]');
337
+ const options = selector.querySelectorAll('.mc-selector-option');
338
+ const groups = selector.querySelectorAll('[data-mc-list] .mc-selector-group');
339
+
340
+ let isOpen = false;
341
+ let selectedValue = selector.dataset.defaultValue || '';
342
+
343
+ // Set initial value if provided
344
+ if (selectedValue && valueEl) {
345
+ valueEl.textContent = selectedValue;
346
+ trigger.classList.add('has-value');
347
+ options.forEach(o => {
348
+ if (o.dataset.value === selectedValue) o.classList.add('selected');
349
+ });
350
+ }
351
+
352
+ // Toggle open/close
353
+ function toggle(forceClose = false) {
354
+ isOpen = forceClose ? false : !isOpen;
355
+ trigger.classList.toggle('open', isOpen);
356
+ panel.classList.toggle('open', isOpen);
357
+ if (isOpen && searchInput) {
358
+ setTimeout(() => searchInput.focus(), 150);
359
+ }
360
+ if (!isOpen && searchInput) {
361
+ searchInput.value = '';
362
+ filterOptions('');
363
+ }
364
+ }
365
+
366
+ trigger.addEventListener('click', (e) => {
367
+ e.stopPropagation();
368
+ toggle();
369
+ });
370
+
371
+ // Close on outside click
372
+ document.addEventListener('click', (e) => {
373
+ if (!selector.contains(e.target)) {
374
+ toggle(true);
375
+ }
376
+ });
377
+
378
+ // Close on Escape
379
+ document.addEventListener('keydown', (e) => {
380
+ if (e.key === 'Escape' && isOpen) {
381
+ toggle(true);
382
+ trigger.focus();
383
+ }
384
+ });
385
+
386
+ // Select an option
387
+ options.forEach(opt => {
388
+ opt.addEventListener('click', () => {
389
+ selectedValue = opt.dataset.value;
390
+ if (valueEl) valueEl.textContent = selectedValue;
391
+ trigger.classList.add('has-value');
392
+
393
+ // Mark selected
394
+ options.forEach(o => o.classList.remove('selected'));
395
+ opt.classList.add('selected');
396
+
397
+ // Smooth close
398
+ setTimeout(() => toggle(true), 120);
399
+
400
+ // Enable convert button if file is also selected
401
+ updateConvertButton();
402
+ });
403
+ });
404
+
405
+ // Search/filter
406
+ if (searchInput) {
407
+ searchInput.addEventListener('input', () => {
408
+ filterOptions(searchInput.value.toLowerCase());
409
+ });
410
+ }
411
+
412
+ function filterOptions(query) {
413
+ groups.forEach(group => {
414
+ const groupOptions = group.querySelectorAll('.mc-selector-option');
415
+ let anyVisible = false;
416
+ groupOptions.forEach(opt => {
417
+ const name = opt.querySelector('.mc-version-name');
418
+ const matches = !query || (name && name.textContent.toLowerCase().includes(query));
419
+ opt.classList.toggle('hidden', !matches);
420
+ if (matches) anyVisible = true;
421
+ });
422
+ // Hide group label if no options visible
423
+ const label = group.querySelector('.mc-selector-group-label');
424
+ if (label) label.classList.toggle('hidden', !anyVisible);
425
+ });
426
+ }
427
+
428
+ function updateConvertButton() {
429
+ const btn = document.querySelector('[data-convert-btn]');
430
+ if (!btn) return;
431
+ // Enable if both file and version are selected
432
+ const hasFile = document.querySelector('[data-dropzone].has-file');
433
+ if (hasFile && selectedValue) {
434
+ btn.disabled = false;
435
+ btn.classList.remove('opacity-40', 'cursor-not-allowed');
436
+ }
437
+ }
438
+ });
439
+ }
440
+
441
+ // --- Settings page selectors ---
442
+ function initSettingsSelectors() {
443
+ // Iteration selector
444
+ const iterSelector = document.querySelector('[data-iter-selector]');
445
+ if (iterSelector) {
446
+ const trigger = iterSelector.querySelector('[data-mc-trigger]');
447
+ const panel = iterSelector.querySelector('[data-mc-panel]');
448
+ const valueEl = iterSelector.querySelector('[data-mc-value]');
449
+ const options = iterSelector.querySelectorAll('.mc-selector-option');
450
+
451
+ let isOpen = false;
452
+ let selectedValue = iterSelector.dataset.defaultValue || '5';
453
+
454
+ if (selectedValue && valueEl) {
455
+ valueEl.textContent = selectedValue === '0' ? '∞' : selectedValue;
456
+ trigger.classList.add('has-value');
457
+ options.forEach(o => {
458
+ if (o.dataset.value === selectedValue) o.classList.add('selected');
459
+ });
460
+ }
461
+
462
+ function toggle(forceClose = false) {
463
+ isOpen = forceClose ? false : !isOpen;
464
+ trigger.classList.toggle('open', isOpen);
465
+ panel.classList.toggle('open', isOpen);
466
+ }
467
+
468
+ trigger.addEventListener('click', (e) => { e.stopPropagation(); toggle(); });
469
+ document.addEventListener('click', (e) => { if (!iterSelector.contains(e.target)) toggle(true); });
470
+ document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && isOpen) { toggle(true); trigger.focus(); } });
471
+
472
+ options.forEach(opt => {
473
+ opt.addEventListener('click', () => {
474
+ selectedValue = opt.dataset.value;
475
+ if (valueEl) valueEl.textContent = opt.dataset.display || selectedValue;
476
+ trigger.classList.add('has-value');
477
+ options.forEach(o => o.classList.remove('selected'));
478
+ opt.classList.add('selected');
479
+ setTimeout(() => toggle(true), 120);
480
+ });
481
+ });
482
+ }
483
+ }
484
+
485
+ // --- Terminal auto-scroll ---
486
+ function initTerminal() {
487
+ const terminal = document.querySelector('[data-terminal]');
488
+ if (!terminal) return;
489
+ terminal.scrollTop = terminal.scrollHeight;
490
+ }
491
+
492
+ // --- Copy button ---
493
+ document.querySelectorAll('[data-copy]').forEach(btn => {
494
+ btn.addEventListener('click', () => {
495
+ const target = document.querySelector(btn.dataset.copy);
496
+ if (target) {
497
+ navigator.clipboard.writeText(target.textContent).then(() => {
498
+ const original = btn.innerHTML;
499
+ btn.innerHTML = '<span class="material-symbols-outlined text-emerald-400">check</span>';
500
+ setTimeout(() => btn.innerHTML = original, 1500);
501
+ });
502
+ }
503
+ });
504
+ });
505
+
506
+ // --- Copy report as markdown ---
507
+ document.querySelectorAll('[data-copy-report]').forEach(btn => {
508
+ btn.addEventListener('click', () => {
509
+ const reportEl = document.querySelector('[data-conversion-report]');
510
+ if (reportEl) {
511
+ const text = reportEl.innerText || reportEl.textContent;
512
+ navigator.clipboard.writeText(text).then(() => {
513
+ const original = btn.innerHTML;
514
+ btn.innerHTML = '<span class="material-symbols-outlined text-emerald-400 text-[16px]">check</span> Copied!';
515
+ btn.classList.add('text-emerald-400');
516
+ setTimeout(() => {
517
+ btn.innerHTML = original;
518
+ btn.classList.remove('text-emerald-400');
519
+ }, 2000);
520
+ });
521
+ }
522
+ });
523
+ });
524
+ });
dashboard.html ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html class="dark" lang="en"><head>
4
+ <meta charset="utf-8"/>
5
+ <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
6
+ <title>CraftBridge - Dashboard</title>
7
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🔧</text></svg>"/>
8
+ <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
9
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap" rel="stylesheet"/>
10
+ <link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&amp;family=Plus+Jakarta+Sans:wght@500;600;700&amp;family=Space+Grotesk:wght@400;500;600;700;800;900&amp;display=swap" rel="stylesheet"/>
11
+
12
+ <script id="tailwind-config">
13
+ tailwind.config = {
14
+ darkMode: "class",
15
+ theme: {
16
+ extend: {
17
+ "colors": {},
18
+ "borderRadius": {
19
+ "DEFAULT": "0.25rem",
20
+ "lg": "0.5rem",
21
+ "xl": "0.75rem",
22
+ "full": "9999px"
23
+ },
24
+ "spacing": {},
25
+ "fontFamily": {
26
+ "headline": ["Space Grotesk"],
27
+ "display": ["Space Grotesk"],
28
+ "body": ["Manrope"],
29
+ "label": ["Plus Jakarta Sans"]
30
+ },
31
+ "fontSize": {}
32
+ }
33
+ }
34
+ }
35
+ </script>
36
+ <style>
37
+ body { background-color: #020617; color: #f1f5f9; }
38
+ </style>
39
+
40
+ <link rel="stylesheet" href="animations.css"/>
41
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"/>
42
+
43
+ </head>
44
+ <body class="font-body antialiased selection:bg-emerald-500/30 selection:text-emerald-200 min-h-screen flex flex-col md:flex-row">
45
+ <!-- TopNavBar (Mobile Only) -->
46
+ <nav class="md:hidden bg-slate-950/80 backdrop-blur-md font-headline font-bold text-slate-100 fixed top-0 w-full z-50 border-b border-slate-800 shadow-2xl flex items-center justify-between px-6 h-16 transition-colors duration-200">
47
+ <div class="flex items-center gap-4">
48
+ <button class="text-slate-400 hover:text-slate-200" onclick="document.getElementById('mobile-sidebar-dashboard').classList.toggle('hidden')">
49
+ <span class="material-symbols-outlined">menu</span>
50
+ </button>
51
+ <a href="index.html" class="text-xl font-black tracking-tighter text-emerald-400 no-underline">CraftBridge</a>
52
+ </div>
53
+ <a href="settings.html" class="text-slate-400 hover:text-slate-200 cursor-pointer active:scale-95 transition-transform">
54
+ <span class="material-symbols-outlined">settings</span>
55
+ </a>
56
+ </nav>
57
+ <!-- Mobile Sidebar Overlay -->
58
+ <div id="mobile-sidebar-dashboard" class="hidden fixed inset-0 z-50 md:hidden">
59
+ <div class="absolute inset-0 bg-black/60" onclick="document.getElementById('mobile-sidebar-dashboard').classList.add('hidden')"></div>
60
+ <aside class="absolute left-0 top-0 h-full w-64 bg-slate-950 border-r border-slate-800 flex flex-col py-4">
61
+ <div class="px-6 pb-6 border-b border-slate-800 mb-6 flex flex-col gap-4 mt-2">
62
+ <div class="flex items-center justify-between">
63
+ <span class="text-xl font-black tracking-tighter text-emerald-400">CraftBridge</span>
64
+ <button class="text-slate-400 hover:text-slate-200" onclick="document.getElementById('mobile-sidebar-dashboard').classList.add('hidden')">
65
+ <span class="material-symbols-outlined">close</span>
66
+ </button>
67
+ </div>
68
+ </div>
69
+ <div class="flex-1 px-3 space-y-1 overflow-y-auto">
70
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg bg-emerald-500/10 text-emerald-400 border-r-2 border-emerald-400 font-bold group" href="dashboard.html">
71
+ <span class="material-symbols-outlined text-[22px]">dashboard</span>
72
+ Dashboard
73
+ </a>
74
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="upload.html">
75
+ <span class="material-symbols-outlined text-[22px]">upload_file</span>
76
+ Uploads
77
+ </a>
78
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="library.html">
79
+ <span class="material-symbols-outlined text-[22px]">folder_open</span>
80
+ Library
81
+ </a>
82
+ </div>
83
+ </aside>
84
+ </div>
85
+ <!-- SideNavBar (Desktop Only) -->
86
+ <aside class="hidden md:flex bg-slate-950 text-emerald-400 font-body font-medium text-sm fixed left-0 top-0 h-full w-64 pt-16 border-r border-slate-800 flex flex-col h-full py-4 z-40">
87
+ <!-- Header -->
88
+ <div class="px-6 pb-6 border-b border-slate-800 mb-6 flex flex-col gap-4 mt-2">
89
+ <div class="flex items-center gap-3">
90
+ <div class="w-10 h-10 rounded bg-emerald-500/10 flex items-center justify-center border border-emerald-500/20">
91
+ <span class="material-symbols-outlined text-emerald-500" style="font-variation-settings: 'FILL' 1;">build_circle</span>
92
+ </div>
93
+ <div>
94
+ <h1 class="font-headline text-lg font-bold text-emerald-500 tracking-tight">Mod Engine</h1>
95
+ <p class="text-xs text-slate-500">Developer Tools</p>
96
+ </div>
97
+ </div>
98
+ <button class="w-full flex items-center justify-center gap-2 bg-emerald-500 hover:bg-emerald-400 text-slate-950 font-bold py-2.5 px-4 rounded-lg transition-all shadow-[0_0_15px_rgba(16,185,129,0.3)] active:scale-95" onclick="window.location.href='upload.html'">
99
+ <span class="material-symbols-outlined text-[20px]">add</span>
100
+ New Project
101
+ </button>
102
+ </div>
103
+ <!-- Main Navigation -->
104
+ <div class="flex-1 px-3 space-y-1 overflow-y-auto">
105
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg bg-emerald-500/10 text-emerald-400 border-r-2 border-emerald-400 font-bold hover:translate-x-1 duration-200 group" href="dashboard.html">
106
+ <span class="material-symbols-outlined text-[22px]">dashboard</span>
107
+ Dashboard
108
+ </a>
109
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="upload.html">
110
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">upload_file</span>
111
+ Uploads
112
+ </a>
113
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="library.html">
114
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">folder_open</span>
115
+ Library
116
+ </a>
117
+ </div>
118
+ <!-- Footer Navigation -->
119
+ <div class="px-3 pt-6 pb-2 border-t border-slate-800 mt-auto space-y-1">
120
+ <a class="flex items-center gap-3 px-3 py-2 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all text-xs hover:translate-x-1 duration-200 group" href="https://github.com/NanoBotAgent/mod-converter" target="_blank">
121
+ <span class="material-symbols-outlined text-[18px] group-hover:text-slate-300 transition-colors">menu_book</span>
122
+ Documentation
123
+ </a>
124
+ <div class="mt-4 flex items-center justify-between px-3 py-2">
125
+ <div class="flex items-center gap-3">
126
+ <div class="w-8 h-8 rounded-full bg-emerald-500/20 border border-emerald-500/30 flex items-center justify-center text-emerald-400 font-bold text-sm">D</div>
127
+ <span class="text-sm text-slate-400 font-medium truncate max-w-[100px]">Dev User</span>
128
+ </div>
129
+ <a href="settings.html" class="text-slate-500 hover:text-slate-300 cursor-pointer transition-colors no-underline">
130
+ <span class="material-symbols-outlined text-[20px]">settings</span>
131
+ </a>
132
+ </div>
133
+ </div>
134
+ </aside>
135
+ </div>
136
+ <!-- Main Content Canvas -->
137
+ <main class="flex-1 w-full md:ml-64 pt-16 md:pt-0 min-h-screen p-4 sm:p-8 flex flex-col">
138
+ <div class="w-full max-w-5xl mx-auto flex flex-col gap-8 relative">
139
+ <!-- Decorative Glow -->
140
+ <div class="absolute -top-32 -right-32 w-64 h-64 bg-emerald-500/5 rounded-full blur-[80px] pointer-events-none"></div>
141
+ <!-- Header Section -->
142
+ <div class="flex flex-col gap-2 relative z-10">
143
+ <h2 class="font-headline text-3xl sm:text-4xl font-bold text-slate-100 tracking-tight">Dashboard</h2>
144
+ <p class="font-body text-slate-400 text-sm sm:text-base">Overview of your recent mod conversion jobs.</p>
145
+ </div>
146
+ <!-- Stats Grid -->
147
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-4 relative z-10" stagger reveal>
148
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-5 shadow-2xl hover:border-slate-700 transition-colors relative overflow-hidden">
149
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-indigo-500/5 rounded-full blur-[50px] pointer-events-none"></div>
150
+ <div class="flex justify-between items-start mb-2 relative z-10">
151
+ <span class="text-slate-400 text-sm font-medium">Total Conversions</span>
152
+ <span class="material-symbols-outlined text-indigo-400 bg-indigo-500/10 p-1.5 rounded-lg text-sm">data_usage</span>
153
+ </div>
154
+ <div class="text-3xl font-headline font-bold text-slate-100 relative z-10"><span data-stat-total>0</span></div>
155
+ </div>
156
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-5 shadow-2xl hover:border-emerald-500/20 transition-colors relative overflow-hidden">
157
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-emerald-500/5 rounded-full blur-[50px] pointer-events-none"></div>
158
+ <div class="flex justify-between items-start mb-2 relative z-10">
159
+ <span class="text-slate-400 text-sm font-medium">Successful</span>
160
+ <span class="material-symbols-outlined text-emerald-400 bg-emerald-500/10 p-1.5 rounded-lg text-sm">check_circle</span>
161
+ </div>
162
+ <div class="text-3xl font-headline font-bold text-emerald-400 relative z-10"><span data-stat-success>0</span></div>
163
+ </div>
164
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-5 shadow-2xl hover:border-rose-500/20 transition-colors relative overflow-hidden">
165
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-rose-500/5 rounded-full blur-[50px] pointer-events-none"></div>
166
+ <div class="flex justify-between items-start mb-2 relative z-10">
167
+ <span class="text-slate-400 text-sm font-medium">Failed</span>
168
+ <span class="material-symbols-outlined text-rose-400 bg-rose-500/10 p-1.5 rounded-lg text-sm">error</span>
169
+ </div>
170
+ <div class="text-3xl font-headline font-bold text-rose-400 relative z-10"><span data-stat-failed>0</span></div>
171
+ </div>
172
+ </div>
173
+ <!-- Recent Jobs Section -->
174
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl shadow-2xl overflow-hidden relative z-10">
175
+ <div class="p-5 border-b border-slate-800 flex justify-between items-center">
176
+ <h2 class="font-headline font-bold text-slate-200">Recent Jobs</h2>
177
+ <a href="upload.html" class="text-xs font-label font-semibold text-slate-400 hover:text-emerald-400 transition-colors flex items-center gap-1 no-underline">
178
+ New Conversion <span class="material-symbols-outlined text-[16px]">arrow_forward</span>
179
+ </a>
180
+ </div>
181
+ <div class="overflow-x-auto" reveal>
182
+ <table class="w-full text-left text-sm text-slate-400">
183
+ <thead class="text-xs uppercase bg-slate-950/50 border-b border-slate-800 font-label tracking-wider">
184
+ <tr>
185
+ <th class="px-6 py-4 font-semibold text-slate-500" scope="col">Job ID</th>
186
+ <th class="px-6 py-4 font-semibold text-slate-500" scope="col">Mod Name</th>
187
+ <th class="px-6 py-4 font-semibold text-slate-500" scope="col">MC Version</th>
188
+ <th class="px-6 py-4 font-semibold text-slate-500" scope="col">Status</th>
189
+ <th class="px-6 py-4 font-semibold text-slate-500" scope="col">Date</th>
190
+ <th class="px-6 py-4 font-semibold text-slate-500 text-right" scope="col">Actions</th>
191
+ </tr>
192
+ </thead>
193
+ <tbody data-job-table class="divide-y divide-slate-800/50">
194
+ </tbody>
195
+ </table>
196
+ </div>
197
+ <!-- Empty state -->
198
+ <div data-empty-state class="hidden p-12 text-center">
199
+ <span class="material-symbols-outlined text-5xl text-slate-700 mb-4">inbox</span>
200
+ <p class="text-slate-500 font-medium">No conversions yet</p>
201
+ <p class="text-slate-600 text-sm mt-1">Upload a mod JAR to get started</p>
202
+ <a href="upload.html" class="inline-block mt-4 px-5 py-2 bg-emerald-500 hover:bg-emerald-400 text-slate-950 font-bold rounded-lg text-sm transition-colors no-underline">Start Converting</a>
203
+ </div>
204
+ </div>
205
+ </div>
206
+ </main>
207
+
208
+ <script src="demo-data.js"></script>
209
+ <script src="app.js"></script>
210
+
211
+ </body></html>
demo-data.js ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* CraftBridge — Fake backend for demo mode
2
+ * Intercepts all interactions, uses localStorage for state.
3
+ */
4
+
5
+ const DEMO = {
6
+ user: {
7
+ user_id: 'demo_user',
8
+ provider: 'github',
9
+ username: 'DemoUser',
10
+ email: 'demo@craftbridge.io',
11
+ avatar_url: null,
12
+ },
13
+ jobs: [
14
+ {
15
+ job_id: 'cb-892a',
16
+ jar_name: 'better_combat_1.20.1.jar',
17
+ mc_version: '1.20.1',
18
+ status: 'done',
19
+ created_at: Date.now() - 7200000,
20
+ current_iteration: 3,
21
+ build_run_ids: ['build-001', 'build-002', 'build-003'],
22
+ smoke_test_log_ids: ['smoke-001', 'smoke-002'],
23
+ },
24
+ {
25
+ job_id: 'cb-892b',
26
+ jar_name: 'create_infrastructure.jar',
27
+ mc_version: '1.20.4',
28
+ status: 'running',
29
+ created_at: Date.now() - 18000000,
30
+ current_iteration: 2,
31
+ build_run_ids: ['build-004', 'build-005'],
32
+ smoke_test_log_ids: ['smoke-003'],
33
+ },
34
+ {
35
+ job_id: 'cb-892c',
36
+ jar_name: 'thaumcraft_lite.jar',
37
+ mc_version: '1.19.4',
38
+ status: 'failed',
39
+ created_at: Date.now() - 86400000,
40
+ current_iteration: 5,
41
+ build_run_ids: ['build-006', 'build-007', 'build-008', 'build-009', 'build-010'],
42
+ smoke_test_log_ids: [],
43
+ },
44
+ {
45
+ job_id: 'cb-892d',
46
+ jar_name: 'jei_1.21.jar',
47
+ mc_version: '1.21',
48
+ status: 'queued',
49
+ created_at: Date.now() - 3600000,
50
+ current_iteration: 0,
51
+ build_run_ids: [],
52
+ smoke_test_log_ids: [],
53
+ },
54
+ ],
55
+ builds: {
56
+ 'build-001': { iteration: 1, status: 'failed', time: '45s', log: '[ERROR] Missing dependency: bukkit-api\n[ERROR] Compilation failed\n> Task :compileJava FAILED' },
57
+ 'build-002': { iteration: 2, status: 'passed', time: '52s', log: '[INFO] Resolving dependencies...\n[INFO] Compiling 14 source files...\n[INFO] BUILD SUCCESSFUL in 52s' },
58
+ 'build-003': { iteration: 3, status: 'passed', time: '48s', log: '[INFO] Incremental compilation...\n[INFO] Compiling 2 source files...\n[INFO] Running unit tests...\n[INFO] BUILD SUCCESSFUL in 48s' },
59
+ 'build-004': { iteration: 1, status: 'passed', time: '61s', log: '[INFO] Compiling 23 source files...\n[INFO] BUILD SUCCESSFUL in 61s' },
60
+ 'build-005': { iteration: 2, status: 'running', time: '—', log: '[INFO] Compiling 23 source files...\n[INFO] Running tests...' },
61
+ 'build-006': { iteration: 1, status: 'failed', time: '30s', log: '[ERROR] Cannot resolve symbol: ModLoader\n[ERROR] Compilation failed' },
62
+ 'build-007': { iteration: 2, status: 'failed', time: '33s', log: '[ERROR] Missing method: onWorldLoad\n[ERROR] Compilation failed' },
63
+ 'build-008': { iteration: 3, status: 'failed', time: '28s', log: '[ERROR] Incompatible types: EventHandler → Listener\n[ERROR] Compilation failed' },
64
+ 'build-009': { iteration: 4, status: 'failed', time: '35s', log: '[ERROR] Stack overflow in mixin adapter\n[ERROR] Compilation failed' },
65
+ 'build-010': { iteration: 5, status: 'failed', time: '31s', log: '[ERROR] Max iterations reached\n[ERROR] Unable to resolve: ThaumcraftApi → BukkitApi' },
66
+ },
67
+ smokeTests: {
68
+ 'smoke-001': { job_id: 'cb-892a', passed: true, log: '[Server] Starting Paper 1.20.1...\n[Server] Loading plugin: BetterCombat\n[Server] Plugin loaded successfully\n[Server] Running /version BetterCombat\n[Server] ✓ Plugin is enabled and responding\n[Server] All smoke tests passed' },
69
+ 'smoke-002': { job_id: 'cb-892a', passed: true, log: '[Server] Starting Paper 1.20.1...\n[Server] Loading plugin: BetterCombat\n[Server] Testing /bettercombat reload\n[Server] ✓ Reload successful\n[Server] Testing event listeners\n[Server] ✓ 12/12 listeners active' },
70
+ 'smoke-003': { job_id: 'cb-892b', passed: false, log: '[Server] Starting Paper 1.20.4...\n[Server] Loading plugin: CreateInfrastructure\n[Server] [WARN] Missing config defaults\n[Server] [ERROR] Plugin threw exception on enable\n[Server] ✗ Smoke test failed' },
71
+ },
72
+ conversionReport: `# Conversion Report: better_combat_1.20.1.jar
73
+
74
+ ## Summary
75
+ - **Source**: Fabric 1.20.1 mod (better_combat)
76
+ - **Target**: Paper 1.20.1 plugin
77
+ - **Iterations**: 3 (2 AI fix cycles)
78
+ - **Result**: ✅ Success
79
+
80
+ ## Changes Made
81
+ 1. **Mixins → Paper Listeners**: Converted 8 Fabric Mixin handlers to Bukkit EventListeners
82
+ 2. **Fabric API → Paper API**: Replaced 14 Fabric API calls with Paper equivalents
83
+ 3. **Registry Access**: Mapped Fabric Registry to Bukkit Material/EntityType
84
+ 4. **Client-side code**: Stripped 3 client-only classes (render, HUD, keybinds)
85
+
86
+ ## Warnings
87
+ - ⚠️ 2 client-side features removed (HUD overlay, keybind settings)
88
+ - ⚠️ Custom enchantment integration uses placeholder logic
89
+
90
+ ## Resource Pack
91
+ - 12 item models extracted and remapped
92
+ - 4 sound events converted to .ogg format
93
+ - Textures: 16x16 default, no HD variants
94
+
95
+ ## Smoke Test
96
+ - ✅ Plugin loads without errors
97
+ - ✅ All commands register
98
+ - ✅ Event listeners active (12/12)
99
+ `,
100
+ };
101
+
102
+ // --- State management ---
103
+ function getJobs() { return DEMO.jobs; }
104
+ function getJob(id) { return DEMO.jobs.find(j => j.job_id === id); }
105
+ function getUser() { return DEMO.user; }
106
+
107
+ // --- Utility ---
108
+ function timeAgo(ts) {
109
+ const diff = Date.now() - ts;
110
+ if (diff < 60000) return 'just now';
111
+ if (diff < 3600000) return Math.floor(diff / 60000) + 'm ago';
112
+ if (diff < 86400000) return Math.floor(diff / 3600000) + 'h ago';
113
+ return Math.floor(diff / 86400000) + 'd ago';
114
+ }
115
+
116
+ function statusBadge(status) {
117
+ const map = {
118
+ done: '<span class="badge badge-success"><span class="badge-dot"></span>Completed</span>',
119
+ running: '<span class="badge badge-running"><span class="badge-dot"></span>Running</span>',
120
+ failed: '<span class="badge badge-failed"><span class="badge-dot"></span>Failed</span>',
121
+ queued: '<span class="badge badge-queued"><span class="badge-dot"></span>Queued</span>',
122
+ };
123
+ return map[status] || map.queued;
124
+ }
125
+
126
+ // Make globally available
127
+ window.DEMO = DEMO;
128
+ window.getJobs = getJobs;
129
+ window.getJob = getJob;
130
+ window.getUser = getUser;
131
+ window.timeAgo = timeAgo;
132
+ window.statusBadge = statusBadge;
index.html CHANGED
@@ -1,19 +1,214 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html class="dark" lang="en"><head>
4
+ <meta charset="utf-8"/>
5
+ <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
6
+ <title>CraftBridge - Minecraft Mod to Plugin Converter</title>
7
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🔧</text></svg>"/>
8
+ <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
9
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap" rel="stylesheet"/>
10
+ <link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&amp;family=Plus+Jakarta+Sans:wght@500;600;700&amp;family=Space+Grotesk:wght@400;500;600;700;800;900&amp;display=swap" rel="stylesheet"/>
11
+
12
+ <script id="tailwind-config">
13
+ tailwind.config = {
14
+ darkMode: "class",
15
+ theme: {
16
+ extend: {
17
+ "colors": {},
18
+ "borderRadius": {
19
+ "DEFAULT": "0.25rem",
20
+ "lg": "0.5rem",
21
+ "xl": "0.75rem",
22
+ "full": "9999px"
23
+ },
24
+ "spacing": {},
25
+ "fontFamily": {
26
+ "headline": ["Space Grotesk"],
27
+ "display": ["Space Grotesk"],
28
+ "body": ["Manrope"],
29
+ "label": ["Plus Jakarta Sans"]
30
+ },
31
+ "fontSize": {}
32
+ }
33
+ }
34
+ }
35
+ </script>
36
+ <style>
37
+ body {
38
+ background-color: #020617;
39
+ color: #f1f5f9;
40
+ }
41
+ </style>
42
+
43
+ <link rel="stylesheet" href="animations.css"/>
44
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"/>
45
+
46
+ </head>
47
+ <body class="font-body antialiased selection:bg-emerald-500/30 selection:text-emerald-200 min-h-screen flex flex-col">
48
+ <!-- TopNavBar -->
49
+ <header class="bg-slate-950/80 backdrop-blur-md font-headline text-sm tracking-tight sticky top-0 z-50 border-b border-slate-800 shadow-2xl flex justify-between items-center h-16 px-6 w-full transition-colors duration-200">
50
+ <div class="flex items-center gap-3">
51
+ <div class="w-8 h-8 rounded bg-emerald-500/10 flex items-center justify-center border border-emerald-500/20">
52
+ <span class="material-symbols-outlined text-emerald-500" style="font-variation-settings: 'FILL' 1;">build_circle</span>
53
+ </div>
54
+ <a href="index.html" class="text-xl font-black tracking-tighter text-emerald-400 no-underline">CraftBridge</a>
55
+ </div>
56
+ <nav class="hidden md:flex items-center gap-6">
57
+ <a class="text-slate-400 hover:text-slate-200 transition-colors duration-200 no-underline" href="#features">Features</a>
58
+ <a class="text-slate-400 hover:text-slate-200 transition-colors duration-200 no-underline" href="#how-it-works">How It Works</a>
59
+ <a class="text-slate-400 hover:text-slate-200 transition-colors duration-200 no-underline" href="https://github.com/NanoBotAgent/mod-converter" target="_blank">GitHub</a>
60
+ </nav>
61
+ <button data-sign-in class="flex items-center gap-2 bg-slate-900 border border-slate-700 text-slate-200 px-4 py-2 rounded-lg font-body text-sm hover:bg-slate-800 hover:border-slate-600 transition-colors duration-200 active:scale-95">
62
+ <span class="material-symbols-outlined text-[18px]">login</span>
63
+ Sign in with GitHub
64
+ </button>
65
+ </header>
66
+ <main class="flex-grow">
67
+ <!-- Hero Section -->
68
+ <section class="w-full max-w-5xl mx-auto px-6 py-24 reveal flex flex-col items-center text-center mt-8 mb-12 relative overflow-hidden">
69
+ <!-- Decorative Glow -->
70
+ <div class="absolute -top-40 -right-40 w-96 h-96 bg-emerald-500/5 rounded-full blur-[100px] pointer-events-none"></div>
71
+ <div class="absolute -bottom-40 -left-40 w-80 h-80 bg-emerald-500/5 rounded-full blur-[80px] pointer-events-none"></div>
72
+ <h1 class="font-headline text-4xl sm:text-5xl md:text-6xl font-bold text-slate-100 mb-6 max-w-3xl tracking-tight relative z-10">
73
+ Convert Any Mod to a Paper Plugin
74
+ </h1>
75
+ <p class="font-body text-slate-400 text-base sm:text-lg max-w-2xl mb-10 relative z-10">
76
+ Upload a Fabric or Forge mod JAR. Get a working Paper plugin, resource pack, and data pack — powered by AI. No java knowledge required.
77
+ </p>
78
+ <div class="flex flex-col sm:flex-row gap-4 relative z-10">
79
+ <button data-start-converting class="flex items-center justify-center gap-2 bg-emerald-500 hover:bg-emerald-400 text-slate-950 font-headline font-bold px-8 py-4 rounded-lg transition-all shadow-[0_0_15px_rgba(16,185,129,0.3)] active:scale-95">
80
+ <span class="material-symbols-outlined">rocket_launch</span>
81
+ Start Converting
82
+ </button>
83
+ <a href="https://github.com/NanoBotAgent/mod-converter" target="_blank" class="flex items-center justify-center gap-2 bg-slate-900 border border-slate-700 text-slate-200 font-body px-8 py-4 rounded-lg hover:bg-slate-800 hover:border-slate-600 transition-colors no-underline">
84
+ <span class="material-symbols-outlined">code</span>
85
+ View on GitHub
86
+ </a>
87
+ </div>
88
+ </section>
89
+ <!-- Terminal Section -->
90
+ <section class="w-full max-w-5xl mx-auto px-6 mb-24 reveal">
91
+ <div class="bg-slate-900/50 border border-slate-800 rounded-2xl overflow-hidden shadow-2xl backdrop-blur-xl relative">
92
+ <!-- Decorative Glow -->
93
+ <div class="absolute -top-20 -right-20 w-48 h-48 bg-emerald-500/5 rounded-full blur-[60px] pointer-events-none"></div>
94
+ <div class="flex items-center gap-2 px-4 py-3 border-b border-slate-800 bg-slate-950/50">
95
+ <div class="w-3 h-3 rounded-full bg-slate-700"></div>
96
+ <div class="w-3 h-3 rounded-full bg-slate-700"></div>
97
+ <div class="w-3 h-3 rounded-full bg-slate-700"></div>
98
+ <span class="ml-4 font-mono text-xs text-slate-500">conversion_process.log</span>
99
+ </div>
100
+ <div class="p-6 font-mono text-sm text-slate-400 bg-slate-950/50 overflow-x-auto relative z-10">
101
+ <div class="text-slate-500 mb-2">&gt; Uploading better_combat_1.20.1.jar... [Done]</div>
102
+ <div class="text-emerald-400 mb-2">&gt; Analyzing Mixins (42 found)... [Done]</div>
103
+ <div class="mb-2">&gt; Mapping Forge Events to Bukkit Events...</div>
104
+ <div class="text-slate-500 pl-4 mb-1"> - Mapping RenderTickEvent -&gt; None (Client-side)</div>
105
+ <div class="text-slate-500 pl-4 mb-2"> - Mapping EntityDamageEvent -&gt; EntityDamageByEntityEvent</div>
106
+ <div class="text-emerald-400 mb-2">&gt; Extracting assets...</div>
107
+ <div class="text-slate-500 pl-4 mb-2"> - Generated resource_pack.zip (12 models, 4 sounds)</div>
108
+ <div class="mb-2">&gt; Compiling Paper Plugin...</div>
109
+ <div class="text-emerald-400 font-bold mt-4">&gt; Success! Plugin ready for download.</div>
110
+ </div>
111
+ </div>
112
+ </section>
113
+ <!-- Features Section -->
114
+ <section id="features" class="w-full max-w-5xl mx-auto px-6 py-24 reveal border-t border-slate-800">
115
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-8" stagger reveal>
116
+ <!-- Feature 1 -->
117
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-6 sm:p-8 flex flex-col hover:border-slate-700 transition-colors group relative overflow-hidden shadow-2xl">
118
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-emerald-500/5 rounded-full blur-[50px] pointer-events-none"></div>
119
+ <div class="w-12 h-12 rounded-lg bg-slate-950/50 border border-slate-800 flex items-center justify-center text-emerald-400 mb-6 relative z-10">
120
+ <span class="material-symbols-outlined">psychology</span>
121
+ </div>
122
+ <h3 class="font-headline text-xl font-bold text-slate-100 mb-4 relative z-10">AI-Powered Conversion</h3>
123
+ <p class="font-body text-slate-400 text-sm flex-grow relative z-10">
124
+ Our custom fine-tuned LLM translates Fabric/Forge mixins and events into native Paper API calls with high accuracy.
125
+ </p>
126
+ </div>
127
+ <!-- Feature 2 -->
128
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-6 sm:p-8 flex flex-col hover:border-slate-700 transition-colors group relative overflow-hidden shadow-2xl">
129
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-emerald-500/5 rounded-full blur-[50px] pointer-events-none"></div>
130
+ <div class="w-12 h-12 rounded-lg bg-slate-950/50 border border-slate-800 flex items-center justify-center text-indigo-400 mb-6 relative z-10">
131
+ <span class="material-symbols-outlined">category</span>
132
+ </div>
133
+ <h3 class="font-headline text-xl font-bold text-slate-100 mb-4 relative z-10">Automatic Resource Packs</h3>
134
+ <p class="font-body text-slate-400 text-sm flex-grow relative z-10">
135
+ Automatically extracts textures, models, and sounds from the mod JAR, mapping them seamlessly to custom model data.
136
+ </p>
137
+ </div>
138
+ <!-- Feature 3 -->
139
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-6 sm:p-8 flex flex-col hover:border-slate-700 transition-colors group relative overflow-hidden shadow-2xl">
140
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-emerald-500/5 rounded-full blur-[50px] pointer-events-none"></div>
141
+ <div class="w-12 h-12 rounded-lg bg-slate-950/50 border border-slate-800 flex items-center justify-center text-emerald-400 mb-6 relative z-10">
142
+ <span class="material-symbols-outlined">verified</span>
143
+ </div>
144
+ <h3 class="font-headline text-xl font-bold text-slate-100 mb-4 relative z-10">Smoke Tested</h3>
145
+ <p class="font-body text-slate-400 text-sm flex-grow relative z-10">
146
+ Every generated plugin is instantly spun up in an automated Paper environment to verify load integrity.
147
+ </p>
148
+ </div>
149
+ </div>
150
+ </section>
151
+ <!-- How It Works Section -->
152
+ <section id="how-it-works" class="w-full max-w-5xl mx-auto px-6 py-24 reveal border-t border-slate-800">
153
+ <h2 class="font-headline text-3xl font-bold text-slate-100 mb-16 text-center tracking-tight">How It Works</h2>
154
+ <div class="grid grid-cols-1 md:grid-cols-4 gap-6" stagger reveal>
155
+ <!-- Step 1 -->
156
+ <div class="relative flex flex-col">
157
+ <div class="text-emerald-400 font-label text-sm font-bold mb-4">01</div>
158
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-6 flex-grow shadow-2xl relative overflow-hidden">
159
+ <div class="absolute -top-12 -right-12 w-24 h-24 bg-emerald-500/5 rounded-full blur-[40px] pointer-events-none"></div>
160
+ <h3 class="font-headline text-lg font-bold text-slate-100 mb-2 relative z-10">Upload JAR</h3>
161
+ <p class="font-body text-sm text-slate-400 relative z-10">Drag and drop your target Fabric or Forge modification.</p>
162
+ </div>
163
+ </div>
164
+ <!-- Step 2 -->
165
+ <div class="relative flex flex-col">
166
+ <div class="text-emerald-400 font-label text-sm font-bold mb-4">02</div>
167
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-6 flex-grow shadow-2xl relative overflow-hidden">
168
+ <div class="absolute -top-12 -right-12 w-24 h-24 bg-emerald-500/5 rounded-full blur-[40px] pointer-events-none"></div>
169
+ <h3 class="font-headline text-lg font-bold text-slate-100 mb-2 relative z-10">AI Analyzes</h3>
170
+ <p class="font-body text-sm text-slate-400 relative z-10">Our engine maps mixins and structures to Spigot/Paper API.</p>
171
+ </div>
172
+ </div>
173
+ <!-- Step 3 -->
174
+ <div class="relative flex flex-col">
175
+ <div class="text-emerald-400 font-label text-sm font-bold mb-4">03</div>
176
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-6 flex-grow shadow-2xl relative overflow-hidden">
177
+ <div class="absolute -top-12 -right-12 w-24 h-24 bg-emerald-500/5 rounded-full blur-[40px] pointer-events-none"></div>
178
+ <h3 class="font-headline text-lg font-bold text-slate-100 mb-2 relative z-10">Build &amp; Test</h3>
179
+ <p class="font-body text-sm text-slate-400 relative z-10">The code is refactored for Paper API and verified in a sandbox.</p>
180
+ </div>
181
+ </div>
182
+ <!-- Step 4 -->
183
+ <div class="relative flex flex-col">
184
+ <div class="text-emerald-400 font-label text-sm font-bold mb-4">04</div>
185
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-6 flex-grow shadow-2xl relative overflow-hidden">
186
+ <div class="absolute -top-12 -right-12 w-24 h-24 bg-emerald-500/5 rounded-full blur-[40px] pointer-events-none"></div>
187
+ <h3 class="font-headline text-lg font-bold text-slate-100 mb-2 relative z-10">Download Results</h3>
188
+ <p class="font-body text-sm text-slate-400 relative z-10">Get your ready-to-deploy plugin and resource pack.</p>
189
+ </div>
190
+ </div>
191
+ </div>
192
+ </section>
193
+ </main>
194
+ <!-- Footer -->
195
+ <footer class="bg-slate-950 border-t border-slate-800 w-full py-12 px-6 flex flex-col md:flex-row justify-between items-center gap-4 mt-auto">
196
+ <div class="flex items-center gap-3">
197
+ <div class="w-8 h-8 rounded bg-emerald-500/10 flex items-center justify-center border border-emerald-500/20">
198
+ <span class="material-symbols-outlined text-emerald-500 text-[18px]" style="font-variation-settings: 'FILL' 1;">build_circle</span>
199
+ </div>
200
+ <span class="text-lg font-black text-emerald-400 font-headline tracking-tight">CraftBridge</span>
201
+ </div>
202
+ <div class="text-slate-500 text-xs">&copy; 2025 CraftBridge. Built for modders.</div>
203
+ <nav class="flex gap-6">
204
+ <a class="text-slate-500 hover:text-emerald-400 transition-colors text-xs no-underline" href="https://github.com/NanoBotAgent/mod-converter" target="_blank">Documentation</a>
205
+ <a class="text-slate-500 hover:text-emerald-400 transition-colors text-xs no-underline" href="https://github.com/NanoBotAgent/mod-converter" target="_blank">Privacy Policy</a>
206
+ <a class="text-slate-500 hover:text-emerald-400 transition-colors text-xs no-underline" href="https://github.com/NanoBotAgent/mod-converter" target="_blank">Terms of Service</a>
207
+ <a class="text-slate-500 hover:text-emerald-400 transition-colors text-xs no-underline" href="https://github.com/NanoBotAgent/mod-converter/actions" target="_blank">Status</a>
208
+ </nav>
209
+ </footer>
210
+
211
+ <script src="demo-data.js"></script>
212
+ <script src="app.js"></script>
213
+
214
+ </body></html>
job.html ADDED
@@ -0,0 +1,323 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html class="dark" lang="en"><head>
4
+ <meta charset="utf-8"/>
5
+ <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
6
+ <title>CraftBridge - Job Detail</title>
7
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🔧</text></svg>"/>
8
+ <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
9
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap" rel="stylesheet"/>
10
+ <link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&amp;family=Plus+Jakarta+Sans:wght@500;600;700&amp;family=Space+Grotesk:wght@400;500;600;700;800;900&amp;display=swap" rel="stylesheet"/>
11
+
12
+ <script id="tailwind-config">
13
+ tailwind.config = {
14
+ darkMode: "class",
15
+ theme: {
16
+ extend: {
17
+ "colors": {},
18
+ "borderRadius": {
19
+ "DEFAULT": "0.25rem",
20
+ "lg": "0.5rem",
21
+ "xl": "0.75rem",
22
+ "full": "9999px"
23
+ },
24
+ "spacing": {},
25
+ "fontFamily": {
26
+ "headline": ["Space Grotesk"],
27
+ "display": ["Space Grotesk"],
28
+ "body": ["Manrope"],
29
+ "label": ["Plus Jakarta Sans"]
30
+ },
31
+ "fontSize": {}
32
+ }
33
+ }
34
+ }
35
+ </script>
36
+ <style>
37
+ body { background-color: #020617; color: #f1f5f9; }
38
+ @keyframes shimmer { 100% { transform: translateX(100%); } }
39
+ </style>
40
+
41
+ <link rel="stylesheet" href="animations.css"/>
42
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"/>
43
+
44
+ </head>
45
+ <body class="font-body antialiased selection:bg-emerald-500/30 selection:text-emerald-200 min-h-screen flex flex-col md:flex-row">
46
+ <!-- TopNavBar (Mobile Only) -->
47
+ <nav class="md:hidden bg-slate-950/80 backdrop-blur-md font-headline font-bold text-slate-100 fixed top-0 w-full z-50 border-b border-slate-800 shadow-2xl flex items-center justify-between px-6 h-16 transition-colors duration-200">
48
+ <div class="flex items-center gap-4">
49
+ <button class="text-slate-400 hover:text-slate-200" onclick="document.getElementById('mobile-sidebar-job').classList.toggle('hidden')">
50
+ <span class="material-symbols-outlined">menu</span>
51
+ </button>
52
+ <a href="index.html" class="text-xl font-black tracking-tighter text-emerald-400 no-underline">CraftBridge</a>
53
+ </div>
54
+ <a href="settings.html" class="text-slate-400 hover:text-slate-200 cursor-pointer active:scale-95 transition-transform">
55
+ <span class="material-symbols-outlined">settings</span>
56
+ </a>
57
+ </nav>
58
+ <!-- Mobile Sidebar Overlay -->
59
+ <div id="mobile-sidebar-job" class="hidden fixed inset-0 z-50 md:hidden">
60
+ <div class="absolute inset-0 bg-black/60" onclick="document.getElementById('mobile-sidebar-job').classList.add('hidden')"></div>
61
+ <aside class="absolute left-0 top-0 h-full w-64 bg-slate-950 border-r border-slate-800 flex flex-col py-4">
62
+ <div class="px-6 pb-6 border-b border-slate-800 mb-6 flex flex-col gap-4 mt-2">
63
+ <div class="flex items-center justify-between">
64
+ <span class="text-xl font-black tracking-tighter text-emerald-400">CraftBridge</span>
65
+ <button class="text-slate-400 hover:text-slate-200" onclick="document.getElementById('mobile-sidebar-job').classList.add('hidden')">
66
+ <span class="material-symbols-outlined">close</span>
67
+ </button>
68
+ </div>
69
+ </div>
70
+ <div class="flex-1 px-3 space-y-1 overflow-y-auto">
71
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="dashboard.html">
72
+ <span class="material-symbols-outlined text-[22px]">dashboard</span>
73
+ Dashboard
74
+ </a>
75
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="upload.html">
76
+ <span class="material-symbols-outlined text-[22px]">upload_file</span>
77
+ Uploads
78
+ </a>
79
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="library.html">
80
+ <span class="material-symbols-outlined text-[22px]">folder_open</span>
81
+ Library
82
+ </a>
83
+ </div>
84
+ </aside>
85
+ </div>
86
+ <!-- SideNavBar (Desktop Only) -->
87
+ <aside class="hidden md:flex bg-slate-950 text-emerald-400 font-body font-medium text-sm fixed left-0 top-0 h-full w-64 pt-16 border-r border-slate-800 flex flex-col h-full py-4 z-40">
88
+ <!-- Header -->
89
+ <div class="px-6 pb-6 border-b border-slate-800 mb-6 flex flex-col gap-4 mt-2">
90
+ <div class="flex items-center gap-3">
91
+ <div class="w-10 h-10 rounded bg-emerald-500/10 flex items-center justify-center border border-emerald-500/20">
92
+ <span class="material-symbols-outlined text-emerald-500" style="font-variation-settings: 'FILL' 1;">build_circle</span>
93
+ </div>
94
+ <div>
95
+ <h1 class="font-headline text-lg font-bold text-emerald-500 tracking-tight">Mod Engine</h1>
96
+ <p class="text-xs text-slate-500">Developer Tools</p>
97
+ </div>
98
+ </div>
99
+ <button class="w-full flex items-center justify-center gap-2 bg-emerald-500 hover:bg-emerald-400 text-slate-950 font-bold py-2.5 px-4 rounded-lg transition-all shadow-[0_0_15px_rgba(16,185,129,0.3)] active:scale-95" onclick="window.location.href='upload.html'">
100
+ <span class="material-symbols-outlined text-[20px]">add</span>
101
+ New Project
102
+ </button>
103
+ </div>
104
+ <!-- Main Navigation -->
105
+ <div class="flex-1 px-3 space-y-1 overflow-y-auto">
106
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="dashboard.html">
107
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">dashboard</span>
108
+ Dashboard
109
+ </a>
110
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="upload.html">
111
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">upload_file</span>
112
+ Uploads
113
+ </a>
114
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="library.html">
115
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">folder_open</span>
116
+ Library
117
+ </a>
118
+ </div>
119
+ <!-- Footer Navigation -->
120
+ <div class="px-3 pt-6 pb-2 border-t border-slate-800 mt-auto space-y-1">
121
+ <a class="flex items-center gap-3 px-3 py-2 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all text-xs hover:translate-x-1 duration-200 group" href="https://github.com/NanoBotAgent/mod-converter" target="_blank">
122
+ <span class="material-symbols-outlined text-[18px] group-hover:text-slate-300 transition-colors">menu_book</span>
123
+ Documentation
124
+ </a>
125
+ <div class="mt-4 flex items-center justify-between px-3 py-2">
126
+ <div class="flex items-center gap-3">
127
+ <div class="w-8 h-8 rounded-full bg-emerald-500/20 border border-emerald-500/30 flex items-center justify-center text-emerald-400 font-bold text-sm">D</div>
128
+ <span class="text-sm text-slate-400 font-medium truncate max-w-[100px]">Dev User</span>
129
+ </div>
130
+ <a href="settings.html" class="text-slate-500 hover:text-slate-300 cursor-pointer transition-colors no-underline">
131
+ <span class="material-symbols-outlined text-[20px]">settings</span>
132
+ </a>
133
+ </div>
134
+ </div>
135
+ </aside>
136
+ </div>
137
+ <!-- Main Content Canvas -->
138
+ <main class="flex-1 w-full md:ml-64 pt-16 md:pt-0 min-h-screen p-4 sm:p-8 flex flex-col gap-8 overflow-y-auto">
139
+ <div class="w-full max-w-6xl mx-auto flex flex-col gap-8 relative">
140
+ <!-- Decorative Glow -->
141
+ <div class="absolute -top-32 -right-32 w-64 h-64 bg-amber-500/5 rounded-full blur-[80px] pointer-events-none"></div>
142
+
143
+ <!-- Page Header -->
144
+ <div class="flex flex-col md:flex-row md:items-end justify-between gap-4 relative z-10">
145
+ <div class="flex flex-col gap-2">
146
+ <div class="flex items-center gap-3">
147
+ <h2 class="font-headline text-3xl font-bold text-slate-100 tracking-tight">Job <span class="font-mono text-slate-400" data-job-id>#8A2F4C</span></h2>
148
+ <div class="flex items-center gap-2 bg-amber-500/10 border border-amber-500/20 px-2.5 py-1 rounded-full">
149
+ <span class="w-2 h-2 rounded-full bg-amber-500 shadow-[0_0_8px_rgba(245,158,11,0.6)] animate-pulse"></span>
150
+ <span class="text-amber-400 text-xs font-bold uppercase tracking-wider font-label" data-job-status>Running</span>
151
+ </div>
152
+ </div>
153
+ <div class="flex items-center gap-4 text-sm text-slate-500 font-mono">
154
+ <span class="flex items-center gap-1.5"><span class="material-symbols-outlined text-sm">schedule</span> Elapsed: <span class="text-slate-300">04:12</span></span>
155
+ <span class="w-1 h-1 rounded-full bg-slate-700"></span>
156
+ <span class="flex items-center gap-1.5"><span class="material-symbols-outlined text-sm">target</span> Target: <span class="text-indigo-400" data-job-name>core_module.jar</span></span>
157
+ <span class="w-1 h-1 rounded-full bg-slate-700"></span>
158
+ <span class="flex items-center gap-1.5"><span class="material-symbols-outlined text-sm">videogame_asset</span> MC: <span class="text-emerald-400" data-job-version>1.20.4</span></span>
159
+ </div>
160
+ </div>
161
+ <div class="flex items-center gap-3">
162
+ <button data-cancel-job class="px-4 py-2 border border-rose-500/30 text-rose-400 hover:bg-rose-500/10 hover:border-rose-500/50 rounded-lg text-sm font-semibold transition-colors flex items-center gap-2">
163
+ <span class="material-symbols-outlined text-lg">cancel</span>
164
+ Cancel Job
165
+ </button>
166
+ </div>
167
+ </div>
168
+
169
+ <!-- Progress Steps -->
170
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-6 shadow-2xl relative z-10">
171
+ <div data-progress-steps class="relative flex justify-between items-center w-full"></div>
172
+ </div>
173
+
174
+ <!-- Current Step Card -->
175
+ <div class="relative overflow-hidden rounded-2xl border border-amber-500/20 bg-slate-900/50 backdrop-blur-xl p-6 flex flex-col md:flex-row items-center justify-between gap-6 shadow-2xl relative z-10">
176
+ <div class="absolute -left-20 -top-20 w-40 h-40 bg-amber-500/10 blur-[60px] rounded-full pointer-events-none"></div>
177
+ <div class="flex items-center gap-5 relative z-10">
178
+ <div class="w-12 h-12 rounded-xl bg-amber-500/10 border border-amber-500/30 flex items-center justify-center">
179
+ <span class="material-symbols-outlined text-amber-400 text-2xl animate-pulse">precision_manufacturing</span>
180
+ </div>
181
+ <div>
182
+ <h3 class="font-headline text-lg text-amber-400 font-semibold mb-1">Building plugin scaffold...</h3>
183
+ <p class="text-sm text-slate-400 font-body">Generating abstract syntax trees and applying injection hooks.</p>
184
+ </div>
185
+ </div>
186
+ <div class="flex flex-col gap-4 w-full md:w-64 relative z-10">
187
+ <div class="flex justify-between items-center text-xs font-mono">
188
+ <span class="text-slate-400 uppercase tracking-wider">Iteration <span data-job-iteration>2</span>/5</span>
189
+ <span class="text-indigo-300">1.2GB / 4.0GB Mem</span>
190
+ </div>
191
+ <div class="h-2 w-full bg-slate-800 rounded-full overflow-hidden">
192
+ <div class="h-full bg-indigo-500/80 rounded-full w-[30%] relative">
193
+ <div class="absolute top-0 left-0 w-full h-full bg-gradient-to-r from-transparent via-white/20 to-transparent -translate-x-full animate-[shimmer_2s_infinite]"></div>
194
+ </div>
195
+ </div>
196
+ </div>
197
+ </div>
198
+
199
+ <!-- Bottom Grid -->
200
+ <div class="grid grid-cols-1 lg:grid-cols-12 gap-6 h-[400px] relative z-10">
201
+ <!-- Left - Build Iterations -->
202
+ <div class="lg:col-span-5 flex flex-col gap-6 h-full">
203
+ <div class="flex-1 bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl overflow-hidden flex flex-col shadow-2xl">
204
+ <div class="px-5 py-4 border-b border-slate-800 flex items-center justify-between bg-slate-950/50">
205
+ <h4 class="font-headline font-semibold text-slate-200 text-sm">Build Iterations</h4>
206
+ <span class="material-symbols-outlined text-slate-500 text-sm">history</span>
207
+ </div>
208
+ <div class="flex-1 overflow-y-auto p-2">
209
+ <table class="w-full text-left text-sm">
210
+ <tbody data-build-table>
211
+ </tbody>
212
+ </table>
213
+ </div>
214
+ </div>
215
+ <!-- Smoke Tests -->
216
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-5 shadow-2xl">
217
+ <h4 class="font-headline font-semibold text-slate-200 text-sm mb-4">Smoke Tests</h4>
218
+ <div class="flex flex-col gap-3">
219
+ <div class="flex items-center justify-between">
220
+ <div class="flex items-center gap-3">
221
+ <span class="material-symbols-outlined text-emerald-400 text-lg">check_circle</span>
222
+ <span class="text-sm text-slate-300 font-medium">Compatibility Check</span>
223
+ </div>
224
+ <span class="font-mono text-xs text-emerald-400/80">Pass</span>
225
+ </div>
226
+ <div class="flex items-center justify-between opacity-50">
227
+ <div class="flex items-center gap-3">
228
+ <span class="material-symbols-outlined text-slate-500 text-lg">radio_button_unchecked</span>
229
+ <span class="text-sm text-slate-400 font-medium">Bytecode Validation</span>
230
+ </div>
231
+ <span class="font-mono text-xs text-slate-600">Wait</span>
232
+ </div>
233
+ <div class="flex items-center justify-between opacity-50">
234
+ <div class="flex items-center gap-3">
235
+ <span class="material-symbols-outlined text-slate-500 text-lg">radio_button_unchecked</span>
236
+ <span class="text-sm text-slate-400 font-medium">Runtime Entry Point</span>
237
+ </div>
238
+ <span class="font-mono text-xs text-slate-600">Wait</span>
239
+ </div>
240
+ </div>
241
+ </div>
242
+ </div>
243
+ <!-- Right - Terminal -->
244
+ <div class="lg:col-span-7 bg-slate-950/80 border border-slate-800 rounded-2xl flex flex-col overflow-hidden shadow-2xl relative group">
245
+ <div class="flex justify-between items-center px-4 py-2 border-b border-slate-800 bg-slate-950/50">
246
+ <div class="flex items-center gap-2">
247
+ <span class="material-symbols-outlined text-slate-500 text-sm">terminal</span>
248
+ <span class="font-mono text-xs text-slate-500 tracking-wider">Live Logs</span>
249
+ </div>
250
+ <div class="flex gap-1.5">
251
+ <div class="w-2.5 h-2.5 rounded-full bg-slate-700 hover:bg-rose-500 transition-colors cursor-pointer"></div>
252
+ <div class="w-2.5 h-2.5 rounded-full bg-slate-700 hover:bg-amber-500 transition-colors cursor-pointer"></div>
253
+ <div class="w-2.5 h-2.5 rounded-full bg-slate-700 hover:bg-emerald-500 transition-colors cursor-pointer"></div>
254
+ </div>
255
+ </div>
256
+ <div data-terminal class="flex-1 p-4 font-mono text-sm overflow-y-auto leading-relaxed tracking-tight">
257
+ <div class="text-slate-500 mb-2">System booted at 14:02:44 UTC. Connecting to socket...</div>
258
+ <div class="flex gap-3 mt-1 hover:bg-slate-900/30 px-1 -mx-1 rounded">
259
+ <span class="text-slate-600 select-none">14:02</span>
260
+ <span class="text-indigo-400 font-medium w-16 shrink-0">[info]</span>
261
+ <span class="text-slate-300">Initializing build pipeline...</span>
262
+ </div>
263
+ <div class="flex gap-3 mt-1 hover:bg-slate-900/30 px-1 -mx-1 rounded">
264
+ <span class="text-slate-600 select-none">14:02</span>
265
+ <span class="text-indigo-400 font-medium w-16 shrink-0">[info]</span>
266
+ <span class="text-slate-300">Target selected: <span class="text-slate-100">target.jar</span></span>
267
+ </div>
268
+ <div class="flex gap-3 mt-1 hover:bg-slate-900/30 px-1 -mx-1 rounded">
269
+ <span class="text-slate-600 select-none">14:03</span>
270
+ <span class="text-emerald-400 font-medium w-16 shrink-0">[success]</span>
271
+ <span class="text-emerald-300/90">Analysis complete. Discovered 42 injection points.</span>
272
+ </div>
273
+ <div class="flex gap-3 mt-1 hover:bg-slate-900/30 px-1 -mx-1 rounded">
274
+ <span class="text-slate-600 select-none">14:03</span>
275
+ <span class="text-indigo-400 font-medium w-16 shrink-0">[info]</span>
276
+ <span class="text-slate-300">Uploading bytecode definitions...</span>
277
+ </div>
278
+ <div class="flex gap-3 mt-1 hover:bg-slate-900/30 px-1 -mx-1 rounded">
279
+ <span class="text-slate-600 select-none">14:03</span>
280
+ <span class="text-emerald-400 font-medium w-16 shrink-0">[success]</span>
281
+ <span class="text-emerald-300/90">Upload complete (142ms)</span>
282
+ </div>
283
+ <div class="my-3 border-t border-slate-800/50 pt-2 text-slate-600 text-xs uppercase tracking-widest text-center">--- Iteration 1 ---</div>
284
+ <div class="flex gap-3 mt-1 hover:bg-slate-900/30 px-1 -mx-1 rounded bg-amber-500/5">
285
+ <span class="text-slate-600 select-none">14:04</span>
286
+ <span class="text-amber-400 font-medium w-16 shrink-0">[warn]</span>
287
+ <span class="text-amber-200/90">Hook collision detected at 0x4F9A. Attempting resolution.</span>
288
+ </div>
289
+ <div class="flex gap-3 mt-1 hover:bg-slate-900/30 px-1 -mx-1 rounded">
290
+ <span class="text-slate-600 select-none">14:04</span>
291
+ <span class="text-emerald-400 font-medium w-16 shrink-0">[success]</span>
292
+ <span class="text-emerald-300/90">Auto-resolved collision.</span>
293
+ </div>
294
+ <div class="my-3 border-t border-slate-800/50 pt-2 text-amber-500/50 text-xs uppercase tracking-widest text-center">--- Iteration 2 ---</div>
295
+ <div class="flex gap-3 mt-1 hover:bg-slate-900/30 px-1 -mx-1 rounded">
296
+ <span class="text-slate-600 select-none">14:05</span>
297
+ <span class="text-indigo-400 font-medium w-16 shrink-0">[info]</span>
298
+ <span class="text-slate-300">AI generating scaffolding...</span>
299
+ </div>
300
+ <div class="flex gap-3 mt-1 hover:bg-slate-900/30 px-1 -mx-1 rounded">
301
+ <span class="text-slate-600 select-none">14:06</span>
302
+ <span class="text-indigo-400 font-medium w-16 shrink-0">[info]</span>
303
+ <span class="text-slate-300">Applying abstract syntax tree modifications...</span>
304
+ </div>
305
+ <div class="flex gap-3 mt-1 px-1 -mx-1 rounded items-center">
306
+ <span class="text-slate-600 select-none">14:06</span>
307
+ <span class="text-amber-400 font-medium w-16 shrink-0 animate-pulse">Building</span>
308
+ <span class="text-slate-100 flex items-center gap-1">AST nodes<span class="flex gap-0.5"><span class="w-1 h-1 bg-slate-400 rounded-full animate-bounce"></span><span class="w-1 h-1 bg-slate-400 rounded-full animate-bounce" style="animation-delay: 0.1s"></span><span class="w-1 h-1 bg-slate-400 rounded-full animate-bounce" style="animation-delay: 0.2s"></span></span></span>
309
+ </div>
310
+ <!-- Auto-scroll indicator -->
311
+ <div class="sticky bottom-2 left-1/2 -translate-x-1/2 mt-8 w-max px-3 py-1 bg-slate-800/80 backdrop-blur border border-slate-700 rounded-full text-[10px] text-slate-400 uppercase tracking-widest flex items-center gap-2 shadow-lg opacity-0 group-hover:opacity-100 transition-opacity">
312
+ <span class="w-1.5 h-1.5 rounded-full bg-emerald-500 animate-pulse"></span> Tail Mode Active
313
+ </div>
314
+ </div>
315
+ </div>
316
+ </div>
317
+ </div>
318
+ </main>
319
+
320
+ <script src="demo-data.js"></script>
321
+ <script src="app.js"></script>
322
+
323
+ </body></html>
library.html ADDED
@@ -0,0 +1,264 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html class="dark" lang="en"><head>
4
+ <meta charset="utf-8"/>
5
+ <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
6
+ <title>CraftBridge - Library</title>
7
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🔧</text></svg>"/>
8
+ <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
9
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap" rel="stylesheet"/>
10
+ <link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&amp;family=Plus+Jakarta+Sans:wght@500;600;700&amp;family=Space+Grotesk:wght@400;500;600;700;800;900&amp;display=swap" rel="stylesheet"/>
11
+
12
+ <script id="tailwind-config">
13
+ tailwind.config = {
14
+ darkMode: "class",
15
+ theme: {
16
+ extend: {
17
+ "colors": {},
18
+ "borderRadius": {
19
+ "DEFAULT": "0.25rem",
20
+ "lg": "0.5rem",
21
+ "xl": "0.75rem",
22
+ "full": "9999px"
23
+ },
24
+ "spacing": {},
25
+ "fontFamily": {
26
+ "headline": ["Space Grotesk"],
27
+ "display": ["Space Grotesk"],
28
+ "body": ["Manrope"],
29
+ "label": ["Plus Jakarta Sans"]
30
+ },
31
+ "fontSize": {}
32
+ }
33
+ }
34
+ }
35
+ </script>
36
+ <style>
37
+ body { background-color: #020617; color: #f1f5f9; }
38
+ </style>
39
+
40
+ <link rel="stylesheet" href="animations.css"/>
41
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"/>
42
+
43
+ </head>
44
+ <body class="font-body antialiased selection:bg-emerald-500/30 selection:text-emerald-200 min-h-screen flex flex-col md:flex-row">
45
+ <!-- TopNavBar (Mobile Only) -->
46
+ <nav class="md:hidden bg-slate-950/80 backdrop-blur-md font-headline font-bold text-slate-100 fixed top-0 w-full z-50 border-b border-slate-800 shadow-2xl flex items-center justify-between px-6 h-16 transition-colors duration-200">
47
+ <div class="flex items-center gap-4">
48
+ <button class="text-slate-400 hover:text-slate-200" onclick="document.getElementById('mobile-sidebar-library').classList.toggle('hidden')">
49
+ <span class="material-symbols-outlined">menu</span>
50
+ </button>
51
+ <a href="index.html" class="text-xl font-black tracking-tighter text-emerald-400 no-underline">CraftBridge</a>
52
+ </div>
53
+ <a href="settings.html" class="text-slate-400 hover:text-slate-200 cursor-pointer active:scale-95 transition-transform">
54
+ <span class="material-symbols-outlined">settings</span>
55
+ </a>
56
+ </nav>
57
+ <!-- Mobile Sidebar Overlay -->
58
+ <div id="mobile-sidebar-library" class="hidden fixed inset-0 z-50 md:hidden">
59
+ <div class="absolute inset-0 bg-black/60" onclick="document.getElementById('mobile-sidebar-library').classList.add('hidden')"></div>
60
+ <aside class="absolute left-0 top-0 h-full w-64 bg-slate-950 border-r border-slate-800 flex flex-col py-4">
61
+ <div class="px-6 pb-6 border-b border-slate-800 mb-6 flex flex-col gap-4 mt-2">
62
+ <div class="flex items-center justify-between">
63
+ <span class="text-xl font-black tracking-tighter text-emerald-400">CraftBridge</span>
64
+ <button class="text-slate-400 hover:text-slate-200" onclick="document.getElementById('mobile-sidebar-library').classList.add('hidden')">
65
+ <span class="material-symbols-outlined">close</span>
66
+ </button>
67
+ </div>
68
+ </div>
69
+ <div class="flex-1 px-3 space-y-1 overflow-y-auto">
70
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="dashboard.html">
71
+ <span class="material-symbols-outlined text-[22px]">dashboard</span>
72
+ Dashboard
73
+ </a>
74
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="upload.html">
75
+ <span class="material-symbols-outlined text-[22px]">upload_file</span>
76
+ Uploads
77
+ </a>
78
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg bg-emerald-500/10 text-emerald-400 border-r-2 border-emerald-400 font-bold group" href="library.html">
79
+ <span class="material-symbols-outlined text-[22px]">folder_open</span>
80
+ Library
81
+ </a>
82
+ </div>
83
+ </aside>
84
+ </div>
85
+ <!-- SideNavBar (Desktop Only) -->
86
+ <aside class="hidden md:flex bg-slate-950 text-emerald-400 font-body font-medium text-sm fixed left-0 top-0 h-full w-64 pt-16 border-r border-slate-800 flex flex-col h-full py-4 z-40">
87
+ <!-- Header -->
88
+ <div class="px-6 pb-6 border-b border-slate-800 mb-6 flex flex-col gap-4 mt-2">
89
+ <div class="flex items-center gap-3">
90
+ <div class="w-10 h-10 rounded bg-emerald-500/10 flex items-center justify-center border border-emerald-500/20">
91
+ <span class="material-symbols-outlined text-emerald-500" style="font-variation-settings: 'FILL' 1;">build_circle</span>
92
+ </div>
93
+ <div>
94
+ <h1 class="font-headline text-lg font-bold text-emerald-500 tracking-tight">Mod Engine</h1>
95
+ <p class="text-xs text-slate-500">Developer Tools</p>
96
+ </div>
97
+ </div>
98
+ <button class="w-full flex items-center justify-center gap-2 bg-emerald-500 hover:bg-emerald-400 text-slate-950 font-bold py-2.5 px-4 rounded-lg transition-all shadow-[0_0_15px_rgba(16,185,129,0.3)] active:scale-95" onclick="window.location.href='upload.html'">
99
+ <span class="material-symbols-outlined text-[20px]">add</span>
100
+ New Project
101
+ </button>
102
+ </div>
103
+ <!-- Main Navigation -->
104
+ <div class="flex-1 px-3 space-y-1 overflow-y-auto">
105
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="dashboard.html">
106
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">dashboard</span>
107
+ Dashboard
108
+ </a>
109
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="upload.html">
110
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">upload_file</span>
111
+ Uploads
112
+ </a>
113
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg bg-emerald-500/10 text-emerald-400 border-r-2 border-emerald-400 font-bold hover:translate-x-1 duration-200 group" href="library.html">
114
+ <span class="material-symbols-outlined text-[22px]">folder_open</span>
115
+ Library
116
+ </a>
117
+ </div>
118
+ <!-- Footer Navigation -->
119
+ <div class="px-3 pt-6 pb-2 border-t border-slate-800 mt-auto space-y-1">
120
+ <a class="flex items-center gap-3 px-3 py-2 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all text-xs hover:translate-x-1 duration-200 group" href="https://github.com/NanoBotAgent/mod-converter" target="_blank">
121
+ <span class="material-symbols-outlined text-[18px] group-hover:text-slate-300 transition-colors">menu_book</span>
122
+ Documentation
123
+ </a>
124
+ <div class="mt-4 flex items-center justify-between px-3 py-2">
125
+ <div class="flex items-center gap-3">
126
+ <div class="w-8 h-8 rounded-full bg-emerald-500/20 border border-emerald-500/30 flex items-center justify-center text-emerald-400 font-bold text-sm">D</div>
127
+ <span class="text-sm text-slate-400 font-medium truncate max-w-[100px]">Dev User</span>
128
+ </div>
129
+ <a href="settings.html" class="text-slate-500 hover:text-slate-300 cursor-pointer transition-colors no-underline">
130
+ <span class="material-symbols-outlined text-[20px]">settings</span>
131
+ </a>
132
+ </div>
133
+ </div>
134
+ </aside><main class="flex-1 w-full md:ml-64 pt-16 md:pt-0 min-h-screen p-4 sm:p-8 flex flex-col">
135
+ <div class="w-full max-w-5xl mx-auto flex flex-col gap-8 relative">
136
+ <!-- Decorative Glow -->
137
+ <div class="absolute -top-32 -right-32 w-64 h-64 bg-emerald-500/5 rounded-full blur-[80px] pointer-events-none"></div>
138
+
139
+ <!-- Header -->
140
+ <div class="flex flex-col gap-2 relative z-10">
141
+ <h2 class="font-headline text-3xl sm:text-4xl font-bold text-slate-100 tracking-tight">Library</h2>
142
+ <p class="font-body text-slate-400 text-sm sm:text-base">Your converted plugins, resource packs, and data packs.</p>
143
+ </div>
144
+
145
+ <!-- Filter Bar -->
146
+ <div class="flex flex-col sm:flex-row gap-3 relative z-10">
147
+ <div class="relative flex-1">
148
+ <span class="material-symbols-outlined absolute left-3 top-1/2 -translate-y-1/2 text-slate-500 text-[20px]">search</span>
149
+ <input type="text" placeholder="Search your library..." class="w-full bg-slate-950/50 border border-slate-800 rounded-lg py-2.5 pl-10 pr-4 text-sm text-slate-300 placeholder-slate-600 focus:outline-none focus:border-emerald-500/50 focus:ring-1 focus:ring-emerald-500/50 transition-all font-body"/>
150
+ </div>
151
+ <div class="flex gap-2">
152
+ <button class="px-4 py-2.5 bg-emerald-500/10 border border-emerald-500/20 text-emerald-400 rounded-lg text-sm font-label font-semibold transition-colors">All</button>
153
+ <button class="px-4 py-2.5 bg-slate-950/50 border border-slate-800 text-slate-400 rounded-lg text-sm font-label font-medium hover:text-slate-200 hover:border-slate-700 transition-colors">Plugins</button>
154
+ <button class="px-4 py-2.5 bg-slate-950/50 border border-slate-800 text-slate-400 rounded-lg text-sm font-label font-medium hover:text-slate-200 hover:border-slate-700 transition-colors">Resource Packs</button>
155
+ <button class="px-4 py-2.5 bg-slate-950/50 border border-slate-800 text-slate-400 rounded-lg text-sm font-label font-medium hover:text-slate-200 hover:border-slate-700 transition-colors">Data Packs</button>
156
+ </div>
157
+ </div>
158
+
159
+ <!-- Library Grid -->
160
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 relative z-10" id="library-grid">
161
+ <!-- Card 1 -->
162
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-5 shadow-2xl hover:border-slate-700 transition-colors group relative overflow-hidden">
163
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-emerald-500/5 rounded-full blur-[50px] pointer-events-none"></div>
164
+ <div class="flex items-start justify-between mb-3 relative z-10">
165
+ <div class="p-2 bg-emerald-500/10 rounded-lg text-emerald-400">
166
+ <span class="material-symbols-outlined text-[20px]">extension</span>
167
+ </div>
168
+ <span class="text-[10px] font-mono text-slate-600">1.2 MB</span>
169
+ </div>
170
+ <h3 class="font-headline text-sm font-bold text-slate-100 mb-1 relative z-10">better_combat_1.20.1.jar</h3>
171
+ <p class="text-xs text-slate-500 font-mono mb-3 relative z-10">MC 1.20.1 • Plugin</p>
172
+ <div class="flex items-center gap-2 relative z-10">
173
+ <span class="flex items-center gap-1 text-[10px] text-emerald-400 bg-emerald-500/10 px-2 py-0.5 rounded-full"><span class="w-1.5 h-1.5 bg-emerald-500 rounded-full"></span>Complete</span>
174
+ <span class="text-[10px] text-slate-600">2h ago</span>
175
+ </div>
176
+ </div>
177
+ <!-- Card 2 -->
178
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-5 shadow-2xl hover:border-slate-700 transition-colors group relative overflow-hidden">
179
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-indigo-500/5 rounded-full blur-[50px] pointer-events-none"></div>
180
+ <div class="flex items-start justify-between mb-3 relative z-10">
181
+ <div class="p-2 bg-indigo-500/10 rounded-lg text-indigo-400">
182
+ <span class="material-symbols-outlined text-[20px]">inventory_2</span>
183
+ </div>
184
+ <span class="text-[10px] font-mono text-slate-600">4.8 MB</span>
185
+ </div>
186
+ <h3 class="font-headline text-sm font-bold text-slate-100 mb-1 relative z-10">better_combat_resourcepack.zip</h3>
187
+ <p class="text-xs text-slate-500 font-mono mb-3 relative z-10">MC 1.20.1 • Resource Pack</p>
188
+ <div class="flex items-center gap-2 relative z-10">
189
+ <span class="flex items-center gap-1 text-[10px] text-emerald-400 bg-emerald-500/10 px-2 py-0.5 rounded-full"><span class="w-1.5 h-1.5 bg-emerald-500 rounded-full"></span>Complete</span>
190
+ <span class="text-[10px] text-slate-600">2h ago</span>
191
+ </div>
192
+ </div>
193
+ <!-- Card 3 -->
194
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-5 shadow-2xl hover:border-slate-700 transition-colors group relative overflow-hidden">
195
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-amber-500/5 rounded-full blur-[50px] pointer-events-none"></div>
196
+ <div class="flex items-start justify-between mb-3 relative z-10">
197
+ <div class="p-2 bg-amber-500/10 rounded-lg text-amber-400">
198
+ <span class="material-symbols-outlined text-[20px]">folder_zip</span>
199
+ </div>
200
+ <span class="text-[10px] font-mono text-slate-600">124 KB</span>
201
+ </div>
202
+ <h3 class="font-headline text-sm font-bold text-slate-100 mb-1 relative z-10">better_combat_datapack.zip</h3>
203
+ <p class="text-xs text-slate-500 font-mono mb-3 relative z-10">MC 1.20.1 • Data Pack</p>
204
+ <div class="flex items-center gap-2 relative z-10">
205
+ <span class="flex items-center gap-1 text-[10px] text-emerald-400 bg-emerald-500/10 px-2 py-0.5 rounded-full"><span class="w-1.5 h-1.5 bg-emerald-500 rounded-full"></span>Complete</span>
206
+ <span class="text-[10px] text-slate-600">2h ago</span>
207
+ </div>
208
+ </div>
209
+ <!-- Card 4 -->
210
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-5 shadow-2xl hover:border-slate-700 transition-colors group relative overflow-hidden">
211
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-emerald-500/5 rounded-full blur-[50px] pointer-events-none"></div>
212
+ <div class="flex items-start justify-between mb-3 relative z-10">
213
+ <div class="p-2 bg-emerald-500/10 rounded-lg text-emerald-400">
214
+ <span class="material-symbols-outlined text-[20px]">extension</span>
215
+ </div>
216
+ <span class="text-[10px] font-mono text-slate-600">890 KB</span>
217
+ </div>
218
+ <h3 class="font-headline text-sm font-bold text-slate-100 mb-1 relative z-10">create_infrastructure.jar</h3>
219
+ <p class="text-xs text-slate-500 font-mono mb-3 relative z-10">MC 1.20.4 • Plugin</p>
220
+ <div class="flex items-center gap-2 relative z-10">
221
+ <span class="flex items-center gap-1 text-[10px] text-amber-400 bg-amber-500/10 px-2 py-0.5 rounded-full"><span class="w-1.5 h-1.5 bg-amber-500 rounded-full animate-pulse"></span>Building</span>
222
+ <span class="text-[10px] text-slate-600">5h ago</span>
223
+ </div>
224
+ </div>
225
+ <!-- Card 5 -->
226
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-5 shadow-2xl hover:border-slate-700 transition-colors group relative overflow-hidden">
227
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-rose-500/5 rounded-full blur-[50px] pointer-events-none"></div>
228
+ <div class="flex items-start justify-between mb-3 relative z-10">
229
+ <div class="p-2 bg-rose-500/10 rounded-lg text-rose-400">
230
+ <span class="material-symbols-outlined text-[20px]">extension</span>
231
+ </div>
232
+ <span class="text-[10px] font-mono text-slate-600">1.5 MB</span>
233
+ </div>
234
+ <h3 class="font-headline text-sm font-bold text-slate-100 mb-1 relative z-10">thaumcraft_lite.jar</h3>
235
+ <p class="text-xs text-slate-500 font-mono mb-3 relative z-10">MC 1.19.4 • Plugin</p>
236
+ <div class="flex items-center gap-2 relative z-10">
237
+ <span class="flex items-center gap-1 text-[10px] text-rose-400 bg-rose-500/10 px-2 py-0.5 rounded-full"><span class="w-1.5 h-1.5 bg-rose-500 rounded-full"></span>Failed</span>
238
+ <span class="text-[10px] text-slate-600">1d ago</span>
239
+ </div>
240
+ </div>
241
+ <!-- Card 6 - Queued -->
242
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-5 shadow-2xl hover:border-slate-700 transition-colors group relative overflow-hidden opacity-60">
243
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-slate-500/5 rounded-full blur-[50px] pointer-events-none"></div>
244
+ <div class="flex items-start justify-between mb-3 relative z-10">
245
+ <div class="p-2 bg-slate-800 rounded-lg text-slate-500">
246
+ <span class="material-symbols-outlined text-[20px]">extension</span>
247
+ </div>
248
+ <span class="text-[10px] font-mono text-slate-600">2.1 MB</span>
249
+ </div>
250
+ <h3 class="font-headline text-sm font-bold text-slate-100 mb-1 relative z-10">jei_1.21.jar</h3>
251
+ <p class="text-xs text-slate-500 font-mono mb-3 relative z-10">MC 1.21 • Plugin</p>
252
+ <div class="flex items-center gap-2 relative z-10">
253
+ <span class="flex items-center gap-1 text-[10px] text-slate-400 bg-slate-800 px-2 py-0.5 rounded-full"><span class="w-1.5 h-1.5 bg-slate-500 rounded-full"></span>Queued</span>
254
+ <span class="text-[10px] text-slate-600">1h ago</span>
255
+ </div>
256
+ </div>
257
+ </div>
258
+ </div>
259
+ </main>
260
+
261
+ <script src="demo-data.js"></script>
262
+ <script src="app.js"></script>
263
+
264
+ </body></html>
results.html ADDED
@@ -0,0 +1,257 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html class="dark" lang="en"><head>
4
+ <meta charset="utf-8"/>
5
+ <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
6
+ <title>CraftBridge - Conversion Results</title>
7
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🔧</text></svg>"/>
8
+ <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
9
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap" rel="stylesheet"/>
10
+ <link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&amp;family=Plus+Jakarta+Sans:wght@500;600;700&amp;family=Space+Grotesk:wght@400;500;600;700;800;900&amp;display=swap" rel="stylesheet"/>
11
+
12
+ <script id="tailwind-config">
13
+ tailwind.config = {
14
+ darkMode: "class",
15
+ theme: {
16
+ extend: {
17
+ "colors": {},
18
+ "borderRadius": {
19
+ "DEFAULT": "0.25rem",
20
+ "lg": "0.5rem",
21
+ "xl": "0.75rem",
22
+ "full": "9999px"
23
+ },
24
+ "spacing": {},
25
+ "fontFamily": {
26
+ "headline": ["Space Grotesk"],
27
+ "display": ["Space Grotesk"],
28
+ "body": ["Manrope"],
29
+ "label": ["Plus Jakarta Sans"]
30
+ },
31
+ "fontSize": {}
32
+ }
33
+ }
34
+ }
35
+ </script>
36
+ <style>
37
+ body { background-color: #020617; color: #f1f5f9; }
38
+ </style>
39
+
40
+ <link rel="stylesheet" href="animations.css"/>
41
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"/>
42
+
43
+ </head>
44
+ <body class="font-body antialiased selection:bg-emerald-500/30 selection:text-emerald-200 min-h-screen flex flex-col md:flex-row">
45
+ <!-- TopNavBar (Mobile Only) -->
46
+ <nav class="md:hidden bg-slate-950/80 backdrop-blur-md font-headline font-bold text-slate-100 fixed top-0 w-full z-50 border-b border-slate-800 shadow-2xl flex items-center justify-between px-6 h-16 transition-colors duration-200">
47
+ <div class="flex items-center gap-4">
48
+ <button class="text-slate-400 hover:text-slate-200" onclick="document.getElementById('mobile-sidebar-results').classList.toggle('hidden')">
49
+ <span class="material-symbols-outlined">menu</span>
50
+ </button>
51
+ <a href="index.html" class="text-xl font-black tracking-tighter text-emerald-400 no-underline">CraftBridge</a>
52
+ </div>
53
+ <a href="settings.html" class="text-slate-400 hover:text-slate-200 cursor-pointer active:scale-95 transition-transform">
54
+ <span class="material-symbols-outlined">settings</span>
55
+ </a>
56
+ </nav>
57
+ <!-- Mobile Sidebar Overlay -->
58
+ <div id="mobile-sidebar-results" class="hidden fixed inset-0 z-50 md:hidden">
59
+ <div class="absolute inset-0 bg-black/60" onclick="document.getElementById('mobile-sidebar-results').classList.add('hidden')"></div>
60
+ <aside class="absolute left-0 top-0 h-full w-64 bg-slate-950 border-r border-slate-800 flex flex-col py-4">
61
+ <div class="px-6 pb-6 border-b border-slate-800 mb-6 flex flex-col gap-4 mt-2">
62
+ <div class="flex items-center justify-between">
63
+ <span class="text-xl font-black tracking-tighter text-emerald-400">CraftBridge</span>
64
+ <button class="text-slate-400 hover:text-slate-200" onclick="document.getElementById('mobile-sidebar-results').classList.add('hidden')">
65
+ <span class="material-symbols-outlined">close</span>
66
+ </button>
67
+ </div>
68
+ </div>
69
+ <div class="flex-1 px-3 space-y-1 overflow-y-auto">
70
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="dashboard.html">
71
+ <span class="material-symbols-outlined text-[22px]">dashboard</span>
72
+ Dashboard
73
+ </a>
74
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="upload.html">
75
+ <span class="material-symbols-outlined text-[22px]">upload_file</span>
76
+ Uploads
77
+ </a>
78
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="library.html">
79
+ <span class="material-symbols-outlined text-[22px]">folder_open</span>
80
+ Library
81
+ </a>
82
+ </div>
83
+ </aside>
84
+ </div>
85
+ <!-- SideNavBar (Desktop Only) -->
86
+ <aside class="hidden md:flex bg-slate-950 text-emerald-400 font-body font-medium text-sm fixed left-0 top-0 h-full w-64 pt-16 border-r border-slate-800 flex flex-col h-full py-4 z-40">
87
+ <!-- Header -->
88
+ <div class="px-6 pb-6 border-b border-slate-800 mb-6 flex flex-col gap-4 mt-2">
89
+ <div class="flex items-center gap-3">
90
+ <div class="w-10 h-10 rounded bg-emerald-500/10 flex items-center justify-center border border-emerald-500/20">
91
+ <span class="material-symbols-outlined text-emerald-500" style="font-variation-settings: 'FILL' 1;">build_circle</span>
92
+ </div>
93
+ <div>
94
+ <h1 class="font-headline text-lg font-bold text-emerald-500 tracking-tight">Mod Engine</h1>
95
+ <p class="text-xs text-slate-500">Developer Tools</p>
96
+ </div>
97
+ </div>
98
+ <button class="w-full flex items-center justify-center gap-2 bg-emerald-500 hover:bg-emerald-400 text-slate-950 font-bold py-2.5 px-4 rounded-lg transition-all shadow-[0_0_15px_rgba(16,185,129,0.3)] active:scale-95" onclick="window.location.href='upload.html'">
99
+ <span class="material-symbols-outlined text-[20px]">add</span>
100
+ New Project
101
+ </button>
102
+ </div>
103
+ <!-- Main Navigation -->
104
+ <div class="flex-1 px-3 space-y-1 overflow-y-auto">
105
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="dashboard.html">
106
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">dashboard</span>
107
+ Dashboard
108
+ </a>
109
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="upload.html">
110
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">upload_file</span>
111
+ Uploads
112
+ </a>
113
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="library.html">
114
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">folder_open</span>
115
+ Library
116
+ </a>
117
+ </div>
118
+ <!-- Footer Navigation -->
119
+ <div class="px-3 pt-6 pb-2 border-t border-slate-800 mt-auto space-y-1">
120
+ <a class="flex items-center gap-3 px-3 py-2 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all text-xs hover:translate-x-1 duration-200 group" href="https://github.com/NanoBotAgent/mod-converter" target="_blank">
121
+ <span class="material-symbols-outlined text-[18px] group-hover:text-slate-300 transition-colors">menu_book</span>
122
+ Documentation
123
+ </a>
124
+ <div class="mt-4 flex items-center justify-between px-3 py-2">
125
+ <div class="flex items-center gap-3">
126
+ <div class="w-8 h-8 rounded-full bg-emerald-500/20 border border-emerald-500/30 flex items-center justify-center text-emerald-400 font-bold text-sm">D</div>
127
+ <span class="text-sm text-slate-400 font-medium truncate max-w-[100px]">Dev User</span>
128
+ </div>
129
+ <a href="settings.html" class="text-slate-500 hover:text-slate-300 cursor-pointer transition-colors no-underline">
130
+ <span class="material-symbols-outlined text-[20px]">settings</span>
131
+ </a>
132
+ </div>
133
+ </div>
134
+ </aside>
135
+ </div>
136
+ <!-- Main Content Canvas -->
137
+ <main class="flex-1 w-full md:ml-64 pt-16 md:pt-0 min-h-screen p-4 sm:p-8 flex flex-col items-center">
138
+ <div class="w-full max-w-4xl mx-auto flex flex-col gap-8 relative">
139
+ <!-- Decorative Glow -->
140
+ <div class="absolute -top-32 -right-32 w-64 h-64 bg-emerald-500/5 rounded-full blur-[80px] pointer-events-none"></div>
141
+
142
+ <!-- Success Header -->
143
+ <div class="flex flex-col items-center justify-center text-center mb-4 relative z-10">
144
+ <div class="w-20 h-20 rounded-full bg-emerald-500/10 flex items-center justify-center mb-6 border border-emerald-500/20">
145
+ <span class="material-symbols-outlined text-5xl text-emerald-500" style="font-variation-settings: 'FILL' 1;">check_circle</span>
146
+ </div>
147
+ <h1 class="font-headline text-3xl sm:text-4xl font-bold text-slate-100 mb-3">Conversion Complete!</h1>
148
+ <p class="text-slate-400 max-w-lg">Successfully transformed <span data-result-name class="text-slate-200 font-medium">better_combat_1.20.1.jar</span> for MC <span data-result-version class="text-emerald-400 font-mono">1.20.1</span>.</p>
149
+ </div>
150
+
151
+ <!-- Download Cards -->
152
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-6 relative z-10" stagger reveal>
153
+ <!-- Plugin -->
154
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-6 flex flex-col hover:border-emerald-500/30 transition-colors group shadow-2xl relative overflow-hidden">
155
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-emerald-500/5 rounded-full blur-[50px] pointer-events-none"></div>
156
+ <div class="flex justify-between items-start mb-4 relative z-10">
157
+ <div class="p-3 bg-emerald-500/10 rounded-lg text-emerald-400 group-hover:bg-emerald-500/20 transition-colors">
158
+ <span class="material-symbols-outlined">extension</span>
159
+ </div>
160
+ <span class="text-xs font-mono text-slate-500">1.2 MB</span>
161
+ </div>
162
+ <h3 class="font-headline text-lg font-semibold text-slate-100 mb-1 relative z-10">Paper Plugin (.jar)</h3>
163
+ <p class="text-sm text-slate-400 mb-6 flex-grow relative z-10">Core logic, event handlers, and transpiled server code.</p>
164
+ <button data-download-plugin class="w-full py-2.5 bg-emerald-500 hover:bg-emerald-400 text-slate-950 font-medium rounded-lg transition-colors flex items-center justify-center gap-2 font-label text-sm relative z-10 active:scale-95">
165
+ <span class="material-symbols-outlined text-sm">download</span>
166
+ Download
167
+ </button>
168
+ </div>
169
+ <!-- Resource Pack -->
170
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-6 flex flex-col hover:border-slate-700 transition-colors group shadow-2xl relative overflow-hidden">
171
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-indigo-500/5 rounded-full blur-[50px] pointer-events-none"></div>
172
+ <div class="flex justify-between items-start mb-4 relative z-10">
173
+ <div class="p-3 bg-indigo-500/10 rounded-lg text-indigo-400 group-hover:bg-indigo-500/20 transition-colors">
174
+ <span class="material-symbols-outlined">inventory_2</span>
175
+ </div>
176
+ <span class="text-xs font-mono text-slate-500">4.8 MB</span>
177
+ </div>
178
+ <h3 class="font-headline text-lg font-semibold text-slate-100 mb-1 relative z-10">Resource Pack (.zip)</h3>
179
+ <p class="text-sm text-slate-400 mb-6 flex-grow relative z-10">Textures, models, and client-side language files.</p>
180
+ <button data-download-rp class="w-full py-2.5 bg-slate-800 hover:bg-slate-700 border border-slate-700 hover:border-slate-600 text-slate-200 font-medium rounded-lg transition-colors flex items-center justify-center gap-2 font-label text-sm relative z-10 active:scale-95">
181
+ <span class="material-symbols-outlined text-sm">download</span>
182
+ Download
183
+ </button>
184
+ </div>
185
+ <!-- Data Pack -->
186
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl p-6 flex flex-col hover:border-slate-700 transition-colors group shadow-2xl relative overflow-hidden">
187
+ <div class="absolute -top-16 -right-16 w-32 h-32 bg-amber-500/5 rounded-full blur-[50px] pointer-events-none"></div>
188
+ <div class="flex justify-between items-start mb-4 relative z-10">
189
+ <div class="p-3 bg-amber-500/10 rounded-lg text-amber-400 group-hover:bg-amber-500/20 transition-colors">
190
+ <span class="material-symbols-outlined">folder_zip</span>
191
+ </div>
192
+ <span class="text-xs font-mono text-slate-500">124 KB</span>
193
+ </div>
194
+ <h3 class="font-headline text-lg font-semibold text-slate-100 mb-1 relative z-10">Data Pack (.zip)</h3>
195
+ <p class="text-sm text-slate-400 mb-6 flex-grow relative z-10">Loot tables, recipes, and advancement generation.</p>
196
+ <button data-download-dp class="w-full py-2.5 bg-slate-800 hover:bg-slate-700 border border-slate-700 hover:border-slate-600 text-slate-200 font-medium rounded-lg transition-colors flex items-center justify-center gap-2 font-label text-sm relative z-10 active:scale-95">
197
+ <span class="material-symbols-outlined text-sm">download</span>
198
+ Download
199
+ </button>
200
+ </div>
201
+ </div>
202
+
203
+ <!-- Report Section -->
204
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl overflow-hidden shadow-2xl relative z-10">
205
+ <div class="px-6 py-4 border-b border-slate-800 flex justify-between items-center bg-slate-950/50">
206
+ <h3 class="font-headline text-lg font-semibold text-slate-100 flex items-center gap-2">
207
+ <span class="material-symbols-outlined text-slate-500 text-sm">article</span>
208
+ Conversion Report
209
+ </h3>
210
+ <button data-copy-report class="text-sm flex items-center gap-1.5 text-slate-400 hover:text-emerald-400 transition-colors font-label">
211
+ <span class="material-symbols-outlined text-[16px]">content_copy</span>
212
+ Copy as Markdown
213
+ </button>
214
+ </div>
215
+ <div class="p-6" data-conversion-report>
216
+ <ul class="space-y-3 font-mono text-sm text-slate-300">
217
+ <li class="flex items-start gap-3">
218
+ <span class="material-symbols-outlined text-emerald-500 text-[16px] mt-0.5">check</span>
219
+ <span>Transpiled 42 Fabric Mixins to Spigot Events.</span>
220
+ </li>
221
+ <li class="flex items-start gap-3">
222
+ <span class="material-symbols-outlined text-emerald-500 text-[16px] mt-0.5">check</span>
223
+ <span>Generated 12 custom model data mappings for items.</span>
224
+ </li>
225
+ <li class="flex items-start gap-3">
226
+ <span class="material-symbols-outlined text-emerald-500 text-[16px] mt-0.5">check</span>
227
+ <span>Converted 156 BlockStates to block data strings.</span>
228
+ </li>
229
+ <li class="flex items-start gap-3">
230
+ <span class="material-symbols-outlined text-amber-500 text-[16px] mt-0.5">warning</span>
231
+ <span class="text-amber-200/70">Warning: 3 complex NBT parsing methods require manual review (see lines 402-450 in Core.java).</span>
232
+ </li>
233
+ </ul>
234
+ </div>
235
+ </div>
236
+
237
+ <!-- Metadata & Action -->
238
+ <div class="flex flex-col items-center relative z-10">
239
+ <div class="flex gap-6 text-xs text-slate-500 font-mono mb-8 justify-center">
240
+ <span>Job ID: <span data-job-id class="text-slate-400">#CB-892A</span></span>
241
+ <span class="hidden sm:inline">•</span>
242
+ <span>Elapsed: 4m 12s</span>
243
+ <span class="hidden sm:inline">•</span>
244
+ <span>Model: CraftBridge-v1</span>
245
+ </div>
246
+ <button data-convert-another class="px-8 py-4 bg-slate-900 border-2 border-slate-700 hover:border-emerald-500 hover:text-emerald-400 text-slate-200 font-headline font-semibold rounded-lg transition-colors flex items-center gap-2 text-lg active:scale-95">
247
+ <span class="material-symbols-outlined">refresh</span>
248
+ Convert Another Mod
249
+ </button>
250
+ </div>
251
+ </div>
252
+ </main>
253
+
254
+ <script src="demo-data.js"></script>
255
+ <script src="app.js"></script>
256
+
257
+ </body></html>
settings.html ADDED
@@ -0,0 +1,326 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html class="dark" lang="en"><head>
4
+ <meta charset="utf-8"/>
5
+ <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
6
+ <title>CraftBridge - Settings</title>
7
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🔧</text></svg>"/>
8
+ <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
9
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap" rel="stylesheet"/>
10
+ <link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&amp;family=Plus+Jakarta+Sans:wght@500;600;700&amp;family=Space+Grotesk:wght@400;500;600;700;800;900&amp;display=swap" rel="stylesheet"/>
11
+
12
+ <script id="tailwind-config">
13
+ tailwind.config = {
14
+ darkMode: "class",
15
+ theme: {
16
+ extend: {
17
+ "colors": {},
18
+ "borderRadius": {
19
+ "DEFAULT": "0.25rem",
20
+ "lg": "0.5rem",
21
+ "xl": "0.75rem",
22
+ "full": "9999px"
23
+ },
24
+ "spacing": {},
25
+ "fontFamily": {
26
+ "headline": ["Space Grotesk"],
27
+ "display": ["Space Grotesk"],
28
+ "body": ["Manrope"],
29
+ "label": ["Plus Jakarta Sans"]
30
+ },
31
+ "fontSize": {}
32
+ }
33
+ }
34
+ }
35
+ </script>
36
+ <style>
37
+ body { background-color: #020617; color: #f1f5f9; }
38
+ </style>
39
+
40
+ <link rel="stylesheet" href="animations.css"/>
41
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"/>
42
+
43
+ </head>
44
+ <body class="font-body antialiased selection:bg-emerald-500/30 selection:text-emerald-200 min-h-screen flex flex-col md:flex-row">
45
+ <!-- TopNavBar (Mobile Only) -->
46
+ <nav class="md:hidden bg-slate-950/80 backdrop-blur-md font-headline font-bold text-slate-100 fixed top-0 w-full z-50 border-b border-slate-800 shadow-2xl flex items-center justify-between px-6 h-16 transition-colors duration-200">
47
+ <div class="flex items-center gap-4">
48
+ <button class="text-slate-400 hover:text-slate-200" onclick="document.getElementById('mobile-sidebar-settings').classList.toggle('hidden')">
49
+ <span class="material-symbols-outlined">menu</span>
50
+ </button>
51
+ <a href="index.html" class="text-xl font-black tracking-tighter text-emerald-400 no-underline">CraftBridge</a>
52
+ </div>
53
+ <a href="settings.html" class="text-emerald-400 cursor-pointer active:scale-95 transition-transform">
54
+ <span class="material-symbols-outlined" style="font-variation-settings: 'FILL' 1;">settings</span>
55
+ </a>
56
+ </nav>
57
+ <!-- Mobile Sidebar Overlay -->
58
+ <div id="mobile-sidebar-settings" class="hidden fixed inset-0 z-50 md:hidden">
59
+ <div class="absolute inset-0 bg-black/60" onclick="document.getElementById('mobile-sidebar-settings').classList.add('hidden')"></div>
60
+ <aside class="absolute left-0 top-0 h-full w-64 bg-slate-950 border-r border-slate-800 flex flex-col py-4">
61
+ <div class="px-6 pb-6 border-b border-slate-800 mb-6 flex flex-col gap-4 mt-2">
62
+ <div class="flex items-center justify-between">
63
+ <span class="text-xl font-black tracking-tighter text-emerald-400">CraftBridge</span>
64
+ <button class="text-slate-400 hover:text-slate-200" onclick="document.getElementById('mobile-sidebar-settings').classList.add('hidden')">
65
+ <span class="material-symbols-outlined">close</span>
66
+ </button>
67
+ </div>
68
+ </div>
69
+ <div class="flex-1 px-3 space-y-1 overflow-y-auto">
70
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="dashboard.html">
71
+ <span class="material-symbols-outlined text-[22px]">dashboard</span>
72
+ Dashboard
73
+ </a>
74
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="upload.html">
75
+ <span class="material-symbols-outlined text-[22px]">upload_file</span>
76
+ Uploads
77
+ </a>
78
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="library.html">
79
+ <span class="material-symbols-outlined text-[22px]">folder_open</span>
80
+ Library
81
+ </a>
82
+ </div>
83
+ </aside>
84
+ </div>
85
+ <!-- SideNavBar (Desktop Only) -->
86
+ <aside class="hidden md:flex bg-slate-950 text-emerald-400 font-body font-medium text-sm fixed left-0 top-0 h-full w-64 pt-16 border-r border-slate-800 flex flex-col h-full py-4 z-40">
87
+ <!-- Header -->
88
+ <div class="px-6 pb-6 border-b border-slate-800 mb-6 flex flex-col gap-4 mt-2">
89
+ <div class="flex items-center gap-3">
90
+ <div class="w-10 h-10 rounded bg-emerald-500/10 flex items-center justify-center border border-emerald-500/20">
91
+ <span class="material-symbols-outlined text-emerald-500" style="font-variation-settings: 'FILL' 1;">build_circle</span>
92
+ </div>
93
+ <div>
94
+ <h1 class="font-headline text-lg font-bold text-emerald-500 tracking-tight">Mod Engine</h1>
95
+ <p class="text-xs text-slate-500">Developer Tools</p>
96
+ </div>
97
+ </div>
98
+ <button class="w-full flex items-center justify-center gap-2 bg-emerald-500 hover:bg-emerald-400 text-slate-950 font-bold py-2.5 px-4 rounded-lg transition-all shadow-[0_0_15px_rgba(16,185,129,0.3)] active:scale-95" onclick="window.location.href='upload.html'">
99
+ <span class="material-symbols-outlined text-[20px]">add</span>
100
+ New Project
101
+ </button>
102
+ </div>
103
+ <!-- Main Navigation -->
104
+ <div class="flex-1 px-3 space-y-1 overflow-y-auto">
105
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="dashboard.html">
106
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">dashboard</span>
107
+ Dashboard
108
+ </a>
109
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="upload.html">
110
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">upload_file</span>
111
+ Uploads
112
+ </a>
113
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="library.html">
114
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">folder_open</span>
115
+ Library
116
+ </a>
117
+ </div>
118
+ <!-- Footer Navigation -->
119
+ <div class="px-3 pt-6 pb-2 border-t border-slate-800 mt-auto space-y-1">
120
+ <a class="flex items-center gap-3 px-3 py-2 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all text-xs hover:translate-x-1 duration-200 group" href="https://github.com/NanoBotAgent/mod-converter" target="_blank">
121
+ <span class="material-symbols-outlined text-[18px] group-hover:text-slate-300 transition-colors">menu_book</span>
122
+ Documentation
123
+ </a>
124
+ <div class="mt-4 flex items-center justify-between px-3 py-2">
125
+ <div class="flex items-center gap-3">
126
+ <div class="w-8 h-8 rounded-full bg-emerald-500/20 border border-emerald-500/30 flex items-center justify-center text-emerald-400 font-bold text-sm">D</div>
127
+ <span class="text-sm text-slate-400 font-medium truncate max-w-[100px]">Dev User</span>
128
+ </div>
129
+ <a href="settings.html" class="text-emerald-400 cursor-pointer transition-colors no-underline">
130
+ <span class="material-symbols-outlined text-[20px]" style="font-variation-settings: 'FILL' 1;">settings</span>
131
+ </a>
132
+ </div>
133
+ </div>
134
+ </aside>
135
+ <main class="flex-1 w-full md:ml-64 pt-16 md:pt-0 min-h-screen p-4 sm:p-8 flex flex-col">
136
+ <div class="w-full max-w-5xl mx-auto flex flex-col gap-8 relative">
137
+ <!-- Decorative Glow -->
138
+ <div class="absolute -top-32 -right-32 w-64 h-64 bg-emerald-500/5 rounded-full blur-[80px] pointer-events-none"></div>
139
+
140
+ <!-- Header -->
141
+ <div class="flex flex-col gap-2 relative z-10">
142
+ <h2 class="font-headline text-3xl sm:text-4xl font-bold text-slate-100 tracking-tight">Settings</h2>
143
+ <p class="font-body text-slate-400 text-sm sm:text-base">Manage your account and conversion preferences.</p>
144
+ </div>
145
+
146
+ <!-- Profile Section -->
147
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl shadow-2xl p-6 sm:p-8 relative z-10 overflow-hidden">
148
+ <div class="absolute -top-20 -right-20 w-48 h-48 bg-emerald-500/5 rounded-full blur-[60px] pointer-events-none"></div>
149
+ <h3 class="font-headline text-lg font-bold text-slate-100 mb-6 relative z-10 flex items-center gap-2">
150
+ <span class="material-symbols-outlined text-slate-400">person</span>
151
+ Profile
152
+ </h3>
153
+ <div class="flex items-center gap-6 mb-6 relative z-10">
154
+ <div class="w-16 h-16 rounded-full bg-emerald-500/20 border-2 border-emerald-500/30 flex items-center justify-center text-emerald-400 font-bold text-2xl">D</div>
155
+ <div>
156
+ <p class="font-headline font-bold text-slate-100 text-lg">Dev User</p>
157
+ <p class="text-sm text-slate-400">demo@craftbridge.io</p>
158
+ <p class="text-xs text-slate-500 mt-1">Signed in with GitHub</p>
159
+ </div>
160
+ </div>
161
+ <div class="grid grid-cols-1 sm:grid-cols-2 gap-4 relative z-10">
162
+ <div>
163
+ <label class="font-label text-xs font-semibold text-slate-500 mb-1 block">Username</label>
164
+ <input type="text" value="DevUser" class="w-full bg-slate-950/50 border border-slate-800 rounded-lg py-2.5 px-4 text-sm text-slate-300 focus:outline-none focus:border-emerald-500/50 focus:ring-1 focus:ring-emerald-500/50 transition-all font-body"/>
165
+ </div>
166
+ <div>
167
+ <label class="font-label text-xs font-semibold text-slate-500 mb-1 block">Email</label>
168
+ <input type="email" value="demo@craftbridge.io" class="w-full bg-slate-950/50 border border-slate-800 rounded-lg py-2.5 px-4 text-sm text-slate-300 focus:outline-none focus:border-emerald-500/50 focus:ring-1 focus:ring-emerald-500/50 transition-all font-body"/>
169
+ </div>
170
+ </div>
171
+ </div>
172
+
173
+ <!-- API Keys Section -->
174
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl shadow-2xl p-6 sm:p-8 relative z-10 overflow-hidden">
175
+ <div class="absolute -top-20 -right-20 w-48 h-48 bg-indigo-500/5 rounded-full blur-[60px] pointer-events-none"></div>
176
+ <h3 class="font-headline text-lg font-bold text-slate-100 mb-6 relative z-10 flex items-center gap-2">
177
+ <span class="material-symbols-outlined text-slate-400">key</span>
178
+ API Keys
179
+ </h3>
180
+ <div class="flex flex-col gap-4 relative z-10">
181
+ <div class="flex items-center justify-between bg-slate-950/50 border border-slate-800 rounded-lg p-4">
182
+ <div>
183
+ <p class="text-sm text-slate-200 font-medium">CraftBridge API Key</p>
184
+ <p class="text-xs text-slate-500 font-mono mt-1">cb_••••••••••••k4m7</p>
185
+ </div>
186
+ <button class="px-3 py-1.5 bg-slate-800 border border-slate-700 text-slate-300 rounded-lg text-xs font-label hover:bg-slate-700 hover:border-slate-600 transition-colors">Regenerate</button>
187
+ </div>
188
+ </div>
189
+ </div>
190
+
191
+ <!-- Conversion Preferences -->
192
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl shadow-2xl p-6 sm:p-8 relative z-10 overflow-hidden">
193
+ <div class="absolute -top-20 -right-20 w-48 h-48 bg-amber-500/5 rounded-full blur-[60px] pointer-events-none"></div>
194
+ <h3 class="font-headline text-lg font-bold text-slate-100 mb-6 relative z-10 flex items-center gap-2">
195
+ <span class="material-symbols-outlined text-slate-400">tune</span>
196
+ Conversion Preferences
197
+ </h3>
198
+ <div class="flex flex-col gap-5 relative z-10">
199
+ <!-- Auto smoke test -->
200
+ <div class="flex items-center justify-between">
201
+ <div>
202
+ <p class="text-sm text-slate-200 font-medium">Auto smoke test</p>
203
+ <p class="text-xs text-slate-500">Run an automated server test after each build iteration — helps the AI learn from errors and produce better output on the next attempt.</p>
204
+ </div>
205
+ <button class="w-11 h-6 bg-emerald-500 rounded-full relative transition-colors flex-shrink-0" onclick="this.classList.toggle('bg-emerald-500'); this.classList.toggle('bg-slate-700'); this.querySelector('span').classList.toggle('translate-x-5'); this.querySelector('span').classList.toggle('translate-x-0.5');">
206
+ <span class="absolute top-0.5 left-0 w-5 h-5 bg-white rounded-full shadow translate-x-5 transition-transform"></span>
207
+ </button>
208
+ </div>
209
+ <div class="border-t border-slate-800"></div>
210
+ <!-- Max build iterations -->
211
+ <div class="flex items-start justify-between gap-4">
212
+ <div>
213
+ <p class="text-sm text-slate-200 font-medium">Max build iterations</p>
214
+ <p class="text-xs text-slate-500">Maximum AI fix cycles before marking as failed. Use ∞ for unlimited.</p>
215
+ </div>
216
+ <div class="mc-selector flex-shrink-0 w-32" data-iter-selector data-default-value="5">
217
+ <button type="button" class="mc-selector-trigger has-value" data-mc-trigger>
218
+ <span class="mc-selector-value" data-mc-value>5</span>
219
+ <span class="material-symbols-outlined mc-selector-arrow" data-mc-arrow>expand_more</span>
220
+ </button>
221
+ <div class="mc-selector-panel" data-mc-panel>
222
+ <div class="mc-selector-list" data-mc-list>
223
+ <div class="mc-selector-group">
224
+ <button type="button" class="mc-selector-option" data-value="1" data-display="1"><span class="mc-version-name">1</span></button>
225
+ <button type="button" class="mc-selector-option" data-value="3" data-display="3"><span class="mc-version-name">3</span></button>
226
+ <button type="button" class="mc-selector-option selected" data-value="5" data-display="5"><span class="mc-version-name">5</span></button>
227
+ <button type="button" class="mc-selector-option" data-value="10" data-display="10"><span class="mc-version-name">10</span></button>
228
+ <button type="button" class="mc-selector-option" data-value="15" data-display="15"><span class="mc-version-name">15</span></button>
229
+ <button type="button" class="mc-selector-option" data-value="20" data-display="20"><span class="mc-version-name">20</span></button>
230
+ <button type="button" class="mc-selector-option" data-value="0" data-display="∞"><span class="mc-version-name">∞ Unlimited</span></button>
231
+ </div>
232
+ </div>
233
+ </div>
234
+ </div>
235
+ </div>
236
+ <div class="border-t border-slate-800"></div>
237
+ <!-- Default target version -->
238
+ <div class="flex items-start justify-between gap-4">
239
+ <div>
240
+ <p class="text-sm text-slate-200 font-medium">Default target version</p>
241
+ <p class="text-xs text-slate-500">Pre-selected MC version for new conversions.</p>
242
+ </div>
243
+ <div class="mc-selector flex-shrink-0 w-40" data-mc-selector data-default-value="1.21.4">
244
+ <button type="button" class="mc-selector-trigger has-value" data-mc-trigger>
245
+ <span class="mc-selector-value" data-mc-value>1.21.4</span>
246
+ <span class="material-symbols-outlined mc-selector-arrow" data-mc-arrow>expand_more</span>
247
+ </button>
248
+ <div class="mc-selector-panel" data-mc-panel>
249
+ <div class="mc-selector-search">
250
+ <span class="material-symbols-outlined">search</span>
251
+ <input type="text" placeholder="Search versions..." data-mc-search autocomplete="off"/>
252
+ </div>
253
+ <div class="mc-selector-list" data-mc-list>
254
+ <div class="mc-selector-group">
255
+ <div class="mc-selector-group-label">Latest</div>
256
+ <button type="button" class="mc-selector-option" data-value="26.1.2"><span class="mc-version-name">26.1.2</span></button>
257
+ <button type="button" class="mc-selector-option" data-value="26.1.1"><span class="mc-version-name">26.1.1</span></button>
258
+ <button type="button" class="mc-selector-option" data-value="26.1"><span class="mc-version-name">26.1</span></button>
259
+ </div>
260
+ <div class="mc-selector-group">
261
+ <div class="mc-selector-group-label">1.21.x</div>
262
+ <button type="button" class="mc-selector-option" data-value="1.21.11"><span class="mc-version-name">1.21.11</span></button>
263
+ <button type="button" class="mc-selector-option" data-value="1.21.10"><span class="mc-version-name">1.21.10</span></button>
264
+ <button type="button" class="mc-selector-option" data-value="1.21.9"><span class="mc-version-name">1.21.9</span></button>
265
+ <button type="button" class="mc-selector-option" data-value="1.21.8"><span class="mc-version-name">1.21.8</span></button>
266
+ <button type="button" class="mc-selector-option" data-value="1.21.7"><span class="mc-version-name">1.21.7</span></button>
267
+ <button type="button" class="mc-selector-option" data-value="1.21.6"><span class="mc-version-name">1.21.6</span></button>
268
+ <button type="button" class="mc-selector-option" data-value="1.21.5"><span class="mc-version-name">1.21.5</span></button>
269
+ <button type="button" class="mc-selector-option selected" data-value="1.21.4"><span class="mc-version-name">1.21.4</span></button>
270
+ <button type="button" class="mc-selector-option" data-value="1.21.3"><span class="mc-version-name">1.21.3</span></button>
271
+ <button type="button" class="mc-selector-option" data-value="1.21.1"><span class="mc-version-name">1.21.1</span></button>
272
+ </div>
273
+ <div class="mc-selector-group">
274
+ <div class="mc-selector-group-label">1.20.x</div>
275
+ <button type="button" class="mc-selector-option" data-value="1.20.6"><span class="mc-version-name">1.20.6</span></button>
276
+ <button type="button" class="mc-selector-option" data-value="1.20.4"><span class="mc-version-name">1.20.4</span></button>
277
+ <button type="button" class="mc-selector-option" data-value="1.20.2"><span class="mc-version-name">1.20.2</span></button>
278
+ <button type="button" class="mc-selector-option" data-value="1.20.1"><span class="mc-version-name">1.20.1</span></button>
279
+ </div>
280
+ <div class="mc-selector-group">
281
+ <div class="mc-selector-group-label">Legacy</div>
282
+ <button type="button" class="mc-selector-option" data-value="1.19.4"><span class="mc-version-name">1.19.4</span></button>
283
+ <button type="button" class="mc-selector-option" data-value="1.19.2"><span class="mc-version-name">1.19.2</span></button>
284
+ <button type="button" class="mc-selector-option" data-value="1.18.2"><span class="mc-version-name">1.18.2</span></button>
285
+ <button type="button" class="mc-selector-option" data-value="1.17.1"><span class="mc-version-name">1.17.1</span></button>
286
+ <button type="button" class="mc-selector-option" data-value="1.16.5"><span class="mc-version-name">1.16.5</span></button>
287
+ </div>
288
+ </div>
289
+ </div>
290
+ </div>
291
+ </div>
292
+ <div class="border-t border-slate-800"></div>
293
+ <!-- Email notifications -->
294
+ <div class="flex items-center justify-between">
295
+ <div>
296
+ <p class="text-sm text-slate-200 font-medium">Email notifications</p>
297
+ <p class="text-xs text-slate-500">Get notified when conversions complete.</p>
298
+ </div>
299
+ <button class="w-11 h-6 bg-slate-700 rounded-full relative transition-colors flex-shrink-0" onclick="this.classList.toggle('bg-emerald-500'); this.classList.toggle('bg-slate-700'); this.querySelector('span').classList.toggle('translate-x-5'); this.querySelector('span').classList.toggle('translate-x-0.5');">
300
+ <span class="absolute top-0.5 left-0 w-5 h-5 bg-white rounded-full shadow translate-x-0.5 transition-transform"></span>
301
+ </button>
302
+ </div>
303
+ </div>
304
+ </div>
305
+
306
+ <!-- Danger Zone -->
307
+ <div class="bg-slate-900/50 backdrop-blur-xl border border-rose-500/20 rounded-2xl shadow-2xl p-6 sm:p-8 relative z-10 overflow-hidden">
308
+ <h3 class="font-headline text-lg font-bold text-rose-400 mb-4 relative z-10 flex items-center gap-2">
309
+ <span class="material-symbols-outlined text-rose-400">warning</span>
310
+ Danger Zone
311
+ </h3>
312
+ <div class="flex items-center justify-between relative z-10">
313
+ <div>
314
+ <p class="text-sm text-slate-200 font-medium">Delete all conversion history</p>
315
+ <p class="text-xs text-slate-500">This will permanently remove all your jobs and generated files.</p>
316
+ </div>
317
+ <button class="px-4 py-2 bg-rose-500/10 border border-rose-500/20 text-rose-400 rounded-lg text-sm font-label font-semibold hover:bg-rose-500/20 hover:border-rose-500/40 transition-colors">Delete All</button>
318
+ </div>
319
+ </div>
320
+ </div>
321
+ </main>
322
+
323
+ <script src="demo-data.js"></script>
324
+ <script src="app.js"></script>
325
+
326
+ </body></html>
upload.html ADDED
@@ -0,0 +1,276 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html class="dark" lang="en"><head>
4
+ <meta charset="utf-8"/>
5
+ <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
6
+ <title>CraftBridge - Minecraft Mod to Plugin Converter</title>
7
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🔧</text></svg>"/>
8
+ <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
9
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap" rel="stylesheet"/>
10
+ <link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&amp;family=Plus+Jakarta+Sans:wght@500;600;700&amp;family=Space+Grotesk:wght@400;500;600;700;800;900&amp;display=swap" rel="stylesheet"/>
11
+
12
+ <script id="tailwind-config">
13
+ tailwind.config = {
14
+ darkMode: "class",
15
+ theme: {
16
+ extend: {
17
+ "colors": {},
18
+ "borderRadius": {
19
+ "DEFAULT": "0.25rem",
20
+ "lg": "0.5rem",
21
+ "xl": "0.75rem",
22
+ "full": "9999px"
23
+ },
24
+ "spacing": {},
25
+ "fontFamily": {
26
+ "headline": ["Space Grotesk"],
27
+ "display": ["Space Grotesk"],
28
+ "body": ["Manrope"],
29
+ "label": ["Plus Jakarta Sans"]
30
+ },
31
+ "fontSize": {}
32
+ },
33
+ },
34
+ }
35
+ </script>
36
+ <style>
37
+ body {
38
+ background-color: #020617; /* slate-950 */
39
+ color: #f1f5f9; /* slate-100 */
40
+ }
41
+ </style>
42
+
43
+ <link rel="stylesheet" href="animations.css"/>
44
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"/>
45
+
46
+ </head>
47
+ <body class="font-body antialiased selection:bg-emerald-500/30 selection:text-emerald-200 min-h-screen flex flex-col md:flex-row">
48
+ <!-- TopNavBar (Mobile Only) -->
49
+ <nav class="md:hidden bg-slate-950/80 backdrop-blur-md font-headline font-bold text-slate-100 fixed top-0 w-full z-50 border-b border-slate-800 shadow-2xl flex items-center justify-between px-6 h-16 transition-colors duration-200">
50
+ <div class="flex items-center gap-4">
51
+ <button class="text-slate-400 hover:text-slate-200" onclick="document.getElementById('mobile-sidebar-upload').classList.toggle('hidden')">
52
+ <span class="material-symbols-outlined">menu</span>
53
+ </button>
54
+ <a href="index.html" class="text-xl font-black tracking-tighter text-emerald-400 no-underline">CraftBridge</a>
55
+ </div>
56
+ <a href="settings.html" class="text-slate-400 hover:text-slate-200 cursor-pointer active:scale-95 transition-transform">
57
+ <span class="material-symbols-outlined">settings</span>
58
+ </a>
59
+ </nav>
60
+ <!-- Mobile Sidebar Overlay -->
61
+ <div id="mobile-sidebar-upload" class="hidden fixed inset-0 z-50 md:hidden">
62
+ <div class="absolute inset-0 bg-black/60" onclick="document.getElementById('mobile-sidebar-upload').classList.add('hidden')"></div>
63
+ <aside class="absolute left-0 top-0 h-full w-64 bg-slate-950 border-r border-slate-800 flex flex-col py-4">
64
+ <div class="px-6 pb-6 border-b border-slate-800 mb-6 flex flex-col gap-4 mt-2">
65
+ <div class="flex items-center justify-between">
66
+ <span class="text-xl font-black tracking-tighter text-emerald-400">CraftBridge</span>
67
+ <button class="text-slate-400 hover:text-slate-200" onclick="document.getElementById('mobile-sidebar-upload').classList.add('hidden')">
68
+ <span class="material-symbols-outlined">close</span>
69
+ </button>
70
+ </div>
71
+ </div>
72
+ <div class="flex-1 px-3 space-y-1 overflow-y-auto">
73
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="dashboard.html">
74
+ <span class="material-symbols-outlined text-[22px]">dashboard</span>
75
+ Dashboard
76
+ </a>
77
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg bg-emerald-500/10 text-emerald-400 border-r-2 border-emerald-400 font-bold group" href="upload.html">
78
+ <span class="material-symbols-outlined text-[22px]" style="font-variation-settings: 'FILL' 1;">upload_file</span>
79
+ Uploads
80
+ </a>
81
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all group" href="library.html">
82
+ <span class="material-symbols-outlined text-[22px]">folder_open</span>
83
+ Library
84
+ </a>
85
+ </div>
86
+ </aside>
87
+ </div>
88
+ <!-- SideNavBar (Desktop Only) -->
89
+ <aside class="hidden md:flex bg-slate-950 text-emerald-400 font-body font-medium text-sm fixed left-0 top-0 h-full w-64 pt-16 border-r border-slate-800 flex flex-col h-full py-4 z-40">
90
+ <!-- Header -->
91
+ <div class="px-6 pb-6 border-b border-slate-800 mb-6 flex flex-col gap-4 mt-2">
92
+ <div class="flex items-center gap-3">
93
+ <div class="w-10 h-10 rounded bg-emerald-500/10 flex items-center justify-center border border-emerald-500/20">
94
+ <span class="material-symbols-outlined text-emerald-500" style="font-variation-settings: 'FILL' 1;">build_circle</span>
95
+ </div>
96
+ <div>
97
+ <h1 class="font-headline text-lg font-bold text-emerald-500 tracking-tight">Mod Engine</h1>
98
+ <p class="text-xs text-slate-500">Developer Tools</p>
99
+ </div>
100
+ </div>
101
+ <button class="w-full flex items-center justify-center gap-2 bg-emerald-500 hover:bg-emerald-400 text-slate-950 font-bold py-2.5 px-4 rounded-lg transition-all shadow-[0_0_15px_rgba(16,185,129,0.3)] active:scale-95" onclick="window.location.href='upload.html'">
102
+ <span class="material-symbols-outlined text-[20px]">add</span>
103
+ New Project
104
+ </button>
105
+ </div>
106
+ <!-- Main Navigation -->
107
+ <div class="flex-1 px-3 space-y-1 overflow-y-auto">
108
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="dashboard.html">
109
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">dashboard</span>
110
+ Dashboard
111
+ </a>
112
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg bg-emerald-500/10 text-emerald-400 border-r-2 border-emerald-400 font-bold hover:translate-x-1 duration-200 group" href="upload.html">
113
+ <span class="material-symbols-outlined text-[22px]" style="font-variation-settings: 'FILL' 1;">upload_file</span>
114
+ Uploads
115
+ </a>
116
+ <a class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all hover:translate-x-1 duration-200 group" href="library.html">
117
+ <span class="material-symbols-outlined text-[22px] group-hover:text-slate-300 transition-colors">folder_open</span>
118
+ Library
119
+ </a>
120
+ </div>
121
+ <!-- Footer Navigation -->
122
+ <div class="px-3 pt-6 pb-2 border-t border-slate-800 mt-auto space-y-1">
123
+ <a class="flex items-center gap-3 px-3 py-2 rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-900 transition-all text-xs hover:translate-x-1 duration-200 group" href="https://github.com/NanoBotAgent/mod-converter" target="_blank">
124
+ <span class="material-symbols-outlined text-[18px] group-hover:text-slate-300 transition-colors">menu_book</span>
125
+ Documentation
126
+ </a>
127
+ <div class="mt-4 flex items-center justify-between px-3 py-2">
128
+ <div class="flex items-center gap-3">
129
+ <div class="w-8 h-8 rounded-full bg-emerald-500/20 border border-emerald-500/30 flex items-center justify-center text-emerald-400 font-bold text-sm">D</div>
130
+ <span class="text-sm text-slate-400 font-medium truncate max-w-[100px]">Dev User</span>
131
+ </div>
132
+ <a href="settings.html" class="text-slate-500 hover:text-slate-300 cursor-pointer transition-colors no-underline">
133
+ <span class="material-symbols-outlined text-[20px]">settings</span>
134
+ </a>
135
+ </div>
136
+ </div>
137
+ </aside>
138
+ <!-- Main Content Canvas -->
139
+ <main class="flex-1 w-full md:ml-64 pt-16 md:pt-0 min-h-screen bg-[#020617] flex items-center justify-center p-4 sm:p-8">
140
+ <!-- Center Card Container -->
141
+ <div class="w-full max-w-[640px] bg-slate-900/50 backdrop-blur-xl border border-slate-800 rounded-2xl shadow-2xl p-6 sm:p-10 flex flex-col gap-8 relative overflow-hidden">
142
+ <!-- Decorative Glow -->
143
+ <div class="absolute -top-32 -right-32 w-64 h-64 bg-emerald-500/10 rounded-full blur-[80px] pointer-events-none"></div>
144
+ <!-- Header Section -->
145
+ <div class="flex flex-col gap-2">
146
+ <h2 class="font-headline text-3xl sm:text-4xl font-bold text-slate-100 tracking-tight">Convert a Mod</h2>
147
+ <p class="font-body text-slate-400 text-sm sm:text-base">Upload your Fabric or Forge .jar to begin the AI conversion.</p>
148
+ </div>
149
+ <!-- Dropzone Area -->
150
+ <div data-dropzone class="w-full h-64 border-2 border-dashed border-slate-700 rounded-xl bg-slate-950/50 flex flex-col items-center justify-center gap-4 hover:border-emerald-500/50 hover:bg-emerald-950/10 transition-all duration-300 group cursor-pointer relative overflow-hidden">
151
+ <div class="w-16 h-16 rounded-full bg-slate-800/80 flex items-center justify-center group-hover:scale-110 group-hover:bg-emerald-900/50 transition-all duration-300 shadow-lg">
152
+ <span class="material-symbols-outlined text-3xl text-slate-400 group-hover:text-emerald-400 transition-colors">cloud_upload</span>
153
+ </div>
154
+ <div class="text-center px-4">
155
+ <p class="font-label font-medium text-slate-300 mb-1" data-dropzone-label>Drag and drop your .jar file here or browse</p>
156
+ <p class="text-xs text-slate-500">Supports .jar up to 100MB</p>
157
+ </div>
158
+ <button class="mt-2 px-5 py-2 rounded-lg bg-slate-800 border border-slate-700 text-slate-200 font-label text-sm hover:bg-slate-700 hover:border-slate-600 transition-colors active:scale-95">
159
+ Browse Files
160
+ </button>
161
+ </div>
162
+ <!-- Configuration Section -->
163
+ <div class="flex flex-col gap-3">
164
+ <label class="font-label text-sm font-semibold text-slate-300">Target Minecraft Version</label>
165
+ <div class="mc-selector" data-mc-selector>
166
+ <!-- Trigger button -->
167
+ <button type="button" class="mc-selector-trigger" data-mc-trigger>
168
+ <span class="mc-selector-value" data-mc-value>Select target version...</span>
169
+ <span class="material-symbols-outlined mc-selector-arrow" data-mc-arrow>expand_more</span>
170
+ </button>
171
+ <!-- Dropdown panel -->
172
+ <div class="mc-selector-panel" data-mc-panel>
173
+ <div class="mc-selector-search">
174
+ <span class="material-symbols-outlined">search</span>
175
+ <input type="text" placeholder="Search versions..." data-mc-search autocomplete="off"/>
176
+ </div>
177
+ <div class="mc-selector-list" data-mc-list>
178
+ <div class="mc-selector-group">
179
+ <div class="mc-selector-group-label">Latest</div>
180
+ <button type="button" class="mc-selector-option" data-value="26.1.2">
181
+ <span class="mc-version-name">26.1.2</span>
182
+ <span class="mc-version-tag latest">Latest</span>
183
+ </button>
184
+ <button type="button" class="mc-selector-option" data-value="26.1.1">
185
+ <span class="mc-version-name">26.1.1</span>
186
+ </button>
187
+ <button type="button" class="mc-selector-option" data-value="26.1">
188
+ <span class="mc-version-name">26.1</span>
189
+ </button>
190
+ </div>
191
+ <div class="mc-selector-group">
192
+ <div class="mc-selector-group-label">1.21.x</div>
193
+ <button type="button" class="mc-selector-option" data-value="1.21.11">
194
+ <span class="mc-version-name">1.21.11</span>
195
+ <span class="mc-version-tag stable">Stable</span>
196
+ </button>
197
+ <button type="button" class="mc-selector-option" data-value="1.21.10">
198
+ <span class="mc-version-name">1.21.10</span>
199
+ </button>
200
+ <button type="button" class="mc-selector-option" data-value="1.21.9">
201
+ <span class="mc-version-name">1.21.9</span>
202
+ </button>
203
+ <button type="button" class="mc-selector-option" data-value="1.21.8">
204
+ <span class="mc-version-name">1.21.8</span>
205
+ </button>
206
+ <button type="button" class="mc-selector-option" data-value="1.21.7">
207
+ <span class="mc-version-name">1.21.7</span>
208
+ </button>
209
+ <button type="button" class="mc-selector-option" data-value="1.21.6">
210
+ <span class="mc-version-name">1.21.6</span>
211
+ </button>
212
+ <button type="button" class="mc-selector-option" data-value="1.21.5">
213
+ <span class="mc-version-name">1.21.5</span>
214
+ </button>
215
+ <button type="button" class="mc-selector-option" data-value="1.21.4">
216
+ <span class="mc-version-name">1.21.4</span>
217
+ </button>
218
+ <button type="button" class="mc-selector-option" data-value="1.21.3">
219
+ <span class="mc-version-name">1.21.3</span>
220
+ </button>
221
+ <button type="button" class="mc-selector-option" data-value="1.21.1">
222
+ <span class="mc-version-name">1.21.1</span>
223
+ </button>
224
+ </div>
225
+ <div class="mc-selector-group">
226
+ <div class="mc-selector-group-label">1.20.x</div>
227
+ <button type="button" class="mc-selector-option" data-value="1.20.6">
228
+ <span class="mc-version-name">1.20.6</span>
229
+ <span class="mc-version-tag stable">Stable</span>
230
+ </button>
231
+ <button type="button" class="mc-selector-option" data-value="1.20.4">
232
+ <span class="mc-version-name">1.20.4</span>
233
+ </button>
234
+ <button type="button" class="mc-selector-option" data-value="1.20.2">
235
+ <span class="mc-version-name">1.20.2</span>
236
+ </button>
237
+ <button type="button" class="mc-selector-option" data-value="1.20.1">
238
+ <span class="mc-version-name">1.20.1</span>
239
+ </button>
240
+ </div>
241
+ <div class="mc-selector-group">
242
+ <div class="mc-selector-group-label">Legacy</div>
243
+ <button type="button" class="mc-selector-option" data-value="1.19.4">
244
+ <span class="mc-version-name">1.19.4</span>
245
+ </button>
246
+ <button type="button" class="mc-selector-option" data-value="1.19.2">
247
+ <span class="mc-version-name">1.19.2</span>
248
+ </button>
249
+ <button type="button" class="mc-selector-option" data-value="1.18.2">
250
+ <span class="mc-version-name">1.18.2</span>
251
+ </button>
252
+ <button type="button" class="mc-selector-option" data-value="1.17.1">
253
+ <span class="mc-version-name">1.17.1</span>
254
+ </button>
255
+ <button type="button" class="mc-selector-option" data-value="1.16.5">
256
+ <span class="mc-version-name">1.16.5</span>
257
+ </button>
258
+ </div>
259
+ </div>
260
+ </div>
261
+ </div>
262
+ </div>
263
+ <!-- Action Section -->
264
+ <div class="flex flex-col gap-4 mt-2">
265
+ <button data-convert-btn disabled class="w-full py-4 rounded-xl bg-emerald-500/20 text-emerald-500/50 font-headline font-bold text-lg border border-emerald-500/20 cursor-not-allowed opacity-40 transition-all">
266
+ Start Conversion
267
+ </button>
268
+ <p class="text-center text-xs text-slate-500 font-body">Supported formats: .jar files from Fabric or Forge mods. Maximum size: 100MB.</p>
269
+ </div>
270
+ </div>
271
+ </main>
272
+
273
+ <script src="demo-data.js"></script>
274
+ <script src="app.js"></script>
275
+
276
+ </body></html>