Upload folder using huggingface_hub
Browse files- README.md +5 -4
- animations.css +370 -0
- app.js +524 -0
- dashboard.html +211 -0
- demo-data.js +132 -0
- index.html +214 -19
- job.html +323 -0
- library.html +264 -0
- results.html +257 -0
- settings.html +326 -0
- upload.html +276 -0
README.md
CHANGED
|
@@ -1,10 +1,11 @@
|
|
| 1 |
---
|
| 2 |
title: Mod Converter Preview
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: static
|
|
|
|
| 7 |
pinned: false
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
| 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&display=swap" rel="stylesheet"/>
|
| 10 |
+
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&family=Plus+Jakarta+Sans:wght@500;600;700&family=Space+Grotesk:wght@400;500;600;700;800;900&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 |
-
<!
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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&display=swap" rel="stylesheet"/>
|
| 10 |
+
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&family=Plus+Jakarta+Sans:wght@500;600;700&family=Space+Grotesk:wght@400;500;600;700;800;900&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">> Uploading better_combat_1.20.1.jar... [Done]</div>
|
| 102 |
+
<div class="text-emerald-400 mb-2">> Analyzing Mixins (42 found)... [Done]</div>
|
| 103 |
+
<div class="mb-2">> Mapping Forge Events to Bukkit Events...</div>
|
| 104 |
+
<div class="text-slate-500 pl-4 mb-1"> - Mapping RenderTickEvent -> None (Client-side)</div>
|
| 105 |
+
<div class="text-slate-500 pl-4 mb-2"> - Mapping EntityDamageEvent -> EntityDamageByEntityEvent</div>
|
| 106 |
+
<div class="text-emerald-400 mb-2">> 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">> Compiling Paper Plugin...</div>
|
| 109 |
+
<div class="text-emerald-400 font-bold mt-4">> 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 & 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">© 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&display=swap" rel="stylesheet"/>
|
| 10 |
+
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&family=Plus+Jakarta+Sans:wght@500;600;700&family=Space+Grotesk:wght@400;500;600;700;800;900&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&display=swap" rel="stylesheet"/>
|
| 10 |
+
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&family=Plus+Jakarta+Sans:wght@500;600;700&family=Space+Grotesk:wght@400;500;600;700;800;900&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&display=swap" rel="stylesheet"/>
|
| 10 |
+
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&family=Plus+Jakarta+Sans:wght@500;600;700&family=Space+Grotesk:wght@400;500;600;700;800;900&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&display=swap" rel="stylesheet"/>
|
| 10 |
+
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&family=Plus+Jakarta+Sans:wght@500;600;700&family=Space+Grotesk:wght@400;500;600;700;800;900&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&display=swap" rel="stylesheet"/>
|
| 10 |
+
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&family=Plus+Jakarta+Sans:wght@500;600;700&family=Space+Grotesk:wght@400;500;600;700;800;900&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>
|