feat(ui): expand homepage with ML stacking architecture diagrams, data pipeline visualizer, and feature importance breakdown
Browse files- frontend/index.html +161 -16
- frontend/style.css +264 -0
frontend/index.html
CHANGED
|
@@ -214,31 +214,176 @@
|
|
| 214 |
|
| 215 |
<!-- Sumber Data & Akuntabilitas -->
|
| 216 |
<section class="container data-sources-section">
|
| 217 |
-
<h2 class="section-title">TRANSPARANSI
|
| 218 |
-
<div class="panel sources-panel">
|
| 219 |
-
<
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 223 |
</div>
|
| 224 |
-
<div class="
|
| 225 |
-
|
| 226 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 227 |
</div>
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 231 |
</div>
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 235 |
</div>
|
| 236 |
</div>
|
| 237 |
</div>
|
| 238 |
</section>
|
| 239 |
|
| 240 |
<!-- Development Author Section -->
|
| 241 |
-
<section class="container developers-section">
|
| 242 |
<h2 class="section-title">AETERNA AI LEAD DEVELOPER</h2>
|
| 243 |
<div class="developers-grid" style="display: flex; justify-content: center;">
|
| 244 |
<div class="panel developer-card" style="max-width: 600px; width: 100%;">
|
|
|
|
| 214 |
|
| 215 |
<!-- Sumber Data & Akuntabilitas -->
|
| 216 |
<section class="container data-sources-section">
|
| 217 |
+
<h2 class="section-title">TRANSPARANSI DATA & METODE PENGUMPULAN</h2>
|
| 218 |
+
<div class="panel sources-panel" style="margin-bottom: 2rem;">
|
| 219 |
+
<p style="color:var(--text-muted); font-size:0.95rem; margin-bottom: 1.5rem; font-family:var(--font-body); line-height: 1.6;">
|
| 220 |
+
Aeterna AI mengintegrasikan berbagai macam data sekunder dan primer untuk menghasilkan prediksi pembuangan sampah yang presisi secara harian bagi wilayah administrasi DKI Jakarta.
|
| 221 |
+
</p>
|
| 222 |
+
<div class="sources-grid" style="display:grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap:1.5rem;">
|
| 223 |
+
<div class="source-item panel" style="background:var(--soft-surface); border: 2px solid var(--border-color); padding: 1.2rem; border-radius: 12px;">
|
| 224 |
+
<span style="font-size: 1.8rem; display:block; margin-bottom: 8px;">🏛️</span>
|
| 225 |
+
<h4 style="color:var(--primary); margin-bottom:0.5rem; font-family:var(--font-display); font-weight: 800;">1. SIPSN & DLH DKI Jakarta</h4>
|
| 226 |
+
<p style="font-size:0.85rem; color:var(--text-muted); line-height:1.5;">Data baseline disesuaikan dengan volume total **9.059 Ton/hari** dari Dinas Lingkungan Hidup DKI Jakarta tahun 2026.</p>
|
| 227 |
+
</div>
|
| 228 |
+
<div class="source-item panel" style="background:var(--soft-surface); border: 2px solid var(--border-color); padding: 1.2rem; border-radius: 12px;">
|
| 229 |
+
<span style="font-size: 1.8rem; display:block; margin-bottom: 8px;">🌧️</span>
|
| 230 |
+
<h4 style="color:var(--primary); margin-bottom:0.5rem; font-family:var(--font-display); font-weight: 800;">2. BMKG & Open-Meteo API</h4>
|
| 231 |
+
<p style="font-size:0.85rem; color:var(--text-muted); line-height:1.5;">Data curah hujan ditarik live menggunakan koordinat geografis presisi masing-masing kecamatan (resolusi 11 km).</p>
|
| 232 |
+
</div>
|
| 233 |
+
<div class="source-item panel" style="background:var(--soft-surface); border: 2px solid var(--border-color); padding: 1.2rem; border-radius: 12px;">
|
| 234 |
+
<span style="font-size: 1.8rem; display:block; margin-bottom: 8px;">👥</span>
|
| 235 |
+
<h4 style="color:var(--primary); margin-bottom:0.5rem; font-family:var(--font-display); font-weight: 800;">3. Proyeksi BPS & MRT Jakarta</h4>
|
| 236 |
+
<p style="font-size:0.85rem; color:var(--text-muted); line-height:1.5;">Simulasi volume mobilitas disesuaikan dengan populasi registrasi BPS dan ridership transit harian.</p>
|
| 237 |
+
</div>
|
| 238 |
+
<div class="source-item panel" style="background:var(--soft-surface); border: 2px solid var(--border-color); padding: 1.2rem; border-radius: 12px;">
|
| 239 |
+
<span style="font-size: 1.8rem; display:block; margin-bottom: 8px;">🛣️</span>
|
| 240 |
+
<h4 style="color:var(--primary); margin-bottom:0.5rem; font-family:var(--font-display); font-weight: 800;">4. Haversine & Winding Routing</h4>
|
| 241 |
+
<p style="font-size:0.85rem; color:var(--text-muted); line-height:1.5;">Jarak logistik dihitung dari koordinat pusat kecamatan ke TPST Bantargebang dengan faktor winding jalan raya sebesar 1.35x.</p>
|
| 242 |
+
</div>
|
| 243 |
+
</div>
|
| 244 |
+
</div>
|
| 245 |
+
|
| 246 |
+
<!-- Ingestion Pipeline Flow Visual -->
|
| 247 |
+
<div class="panel flow-visual-panel" style="margin-bottom: 2rem;">
|
| 248 |
+
<h3 class="panel-subtitle" style="margin-bottom: 1.5rem;">ALIRAN PENGOLAHAN DATA (DATA PIPELINE FLOW)</h3>
|
| 249 |
+
<div class="pipeline-flow-container">
|
| 250 |
+
<div class="flow-step">
|
| 251 |
+
<div class="flow-icon">📥 Ingest</div>
|
| 252 |
+
<div class="flow-title">Data Ingestion</div>
|
| 253 |
+
<div class="flow-desc">Ditarik dari API Cuaca, BPS Jumlah Jiwa, & Kalender Acara Jakarta</div>
|
| 254 |
+
</div>
|
| 255 |
+
<div class="flow-arrow">➡️</div>
|
| 256 |
+
<div class="flow-step">
|
| 257 |
+
<div class="flow-icon">⚙️ Process</div>
|
| 258 |
+
<div class="flow-title">Feature Engineering</div>
|
| 259 |
+
<div class="flow-desc">Ekstraksi Lag Hujan, Is_Weekend, Is_Mudik, & Skala Crowd Event</div>
|
| 260 |
</div>
|
| 261 |
+
<div class="flow-arrow">➡️</div>
|
| 262 |
+
<div class="flow-step">
|
| 263 |
+
<div class="flow-icon">🧠 Predict</div>
|
| 264 |
+
<div class="flow-title">Stacking Inference</div>
|
| 265 |
+
<div class="flow-desc">Evaluasi prediksi spasial ensembles harian 44 Kecamatan</div>
|
| 266 |
+
</div>
|
| 267 |
+
<div class="flow-arrow">➡️</div>
|
| 268 |
+
<div class="flow-step">
|
| 269 |
+
<div class="flow-icon">🚛 Dispatch</div>
|
| 270 |
+
<div class="flow-title">Logistics Planning</div>
|
| 271 |
+
<div class="flow-desc">Hasil tonase & rekomendasi armada truk dikirim ke dashboard</div>
|
| 272 |
+
</div>
|
| 273 |
+
</div>
|
| 274 |
+
</div>
|
| 275 |
+
</section>
|
| 276 |
+
|
| 277 |
+
<!-- Metodologi & Arsitektur ML -->
|
| 278 |
+
<section class="container ml-architecture-section" style="margin-bottom: 2.5rem;">
|
| 279 |
+
<h2 class="section-title">METODOLOGI & ARSITEKTUR MACHINE LEARNING</h2>
|
| 280 |
+
<div class="ml-grid-layout">
|
| 281 |
+
<!-- Stack diagram panel -->
|
| 282 |
+
<div class="panel diagram-panel">
|
| 283 |
+
<h3 class="panel-subtitle" style="margin-bottom: 1.5rem;">STRUKTUR MODEL ENSEMBLE STACKING REGRESSOR</h3>
|
| 284 |
+
<div class="stacking-diagram">
|
| 285 |
+
<div class="diagram-layer input-layer">
|
| 286 |
+
<span class="layer-title">Input Features</span>
|
| 287 |
+
<div class="layer-nodes">
|
| 288 |
+
<span class="node-tag">Population</span>
|
| 289 |
+
<span class="node-tag">Rainfall</span>
|
| 290 |
+
<span class="node-tag">Rain Lag 1</span>
|
| 291 |
+
<span class="node-tag">Is_Weekend</span>
|
| 292 |
+
<span class="node-tag">Normal_Avg</span>
|
| 293 |
+
<span class="node-tag">Is_Mudik</span>
|
| 294 |
+
</div>
|
| 295 |
+
</div>
|
| 296 |
+
|
| 297 |
+
<div class="diagram-connector">⬇️</div>
|
| 298 |
+
|
| 299 |
+
<div class="diagram-layer base-layer">
|
| 300 |
+
<span class="layer-title">Base Estimators (Ensemble)</span>
|
| 301 |
+
<div class="layer-estimators">
|
| 302 |
+
<div class="estimator-card">
|
| 303 |
+
<span class="est-name">Decision Tree</span>
|
| 304 |
+
<span class="est-desc">Deteksi relasi non-linear & percabangan fitur cuaca</span>
|
| 305 |
+
</div>
|
| 306 |
+
<div class="estimator-card">
|
| 307 |
+
<span class="est-name">Random Forest</span>
|
| 308 |
+
<span class="est-desc">Ensemble bagging mengurangi varians prediksi outlier</span>
|
| 309 |
+
</div>
|
| 310 |
+
<div class="estimator-card">
|
| 311 |
+
<span class="est-name">Gradient Boosting (GBR)</span>
|
| 312 |
+
<span class="est-desc">Optimasi boosting linier memperbaiki residu eror</span>
|
| 313 |
+
</div>
|
| 314 |
+
</div>
|
| 315 |
+
</div>
|
| 316 |
+
|
| 317 |
+
<div class="diagram-connector">⬇️</div>
|
| 318 |
+
|
| 319 |
+
<div class="diagram-layer meta-layer">
|
| 320 |
+
<span class="layer-title">Meta-Estimator</span>
|
| 321 |
+
<div class="estimator-card meta-card">
|
| 322 |
+
<span class="est-name">Ridge Regressor (L2 Penalty)</span>
|
| 323 |
+
<span class="est-desc">Menggabungkan tebakan base model untuk mencegah overfitting</span>
|
| 324 |
+
</div>
|
| 325 |
+
</div>
|
| 326 |
</div>
|
| 327 |
+
</div>
|
| 328 |
+
|
| 329 |
+
<!-- Model Performance Panel -->
|
| 330 |
+
<div class="panel metrics-panel">
|
| 331 |
+
<h3 class="panel-subtitle" style="margin-bottom: 1.5rem;">METRIK PERFORMA MODEL (EVALUASI KRONOLOGIS)</h3>
|
| 332 |
+
<div class="metrics-dashboard-grid">
|
| 333 |
+
<div class="metric-score-card">
|
| 334 |
+
<span class="score-num" style="color:var(--primary);">96.41%</span>
|
| 335 |
+
<span class="score-label">R² Score (Akurasi Varian)</span>
|
| 336 |
+
</div>
|
| 337 |
+
<div class="metric-score-card">
|
| 338 |
+
<span class="score-num" style="color:var(--secondary);">6.01%</span>
|
| 339 |
+
<span class="score-label">MAPE (Error Persentase)</span>
|
| 340 |
+
</div>
|
| 341 |
+
<div class="metric-score-card">
|
| 342 |
+
<span class="score-num" style="color:var(--red);">12.63 T</span>
|
| 343 |
+
<span class="score-label">MAE (Absolute Error harian)</span>
|
| 344 |
+
</div>
|
| 345 |
+
<div class="metric-score-card">
|
| 346 |
+
<span class="score-num" style="color:var(--text-main);">16.97 T</span>
|
| 347 |
+
<span class="score-label">RMSE (Penalti Deviasi)</span>
|
| 348 |
+
</div>
|
| 349 |
</div>
|
| 350 |
+
|
| 351 |
+
<div class="divider" style="margin:1rem 0;"></div>
|
| 352 |
+
|
| 353 |
+
<h4 style="color:var(--primary); margin-bottom:0.8rem; font-family:var(--font-display); font-size:0.9rem; text-transform:uppercase;">Feature Importance Breakdown:</h4>
|
| 354 |
+
<div class="features-importance-list">
|
| 355 |
+
<div class="feat-importance-item">
|
| 356 |
+
<span class="feat-name">Normal Average</span>
|
| 357 |
+
<div class="bar-container"><div class="bar" style="width: 92.2%; background: var(--primary);"></div></div>
|
| 358 |
+
<span class="feat-percent">92.24%</span>
|
| 359 |
+
</div>
|
| 360 |
+
<div class="feat-importance-item">
|
| 361 |
+
<span class="feat-name">Zona Wilayah</span>
|
| 362 |
+
<div class="bar-container"><div class="bar" style="width: 15%; background: var(--secondary-container);"></div></div>
|
| 363 |
+
<span class="feat-percent">2.32%</span>
|
| 364 |
+
</div>
|
| 365 |
+
<div class="feat-importance-item">
|
| 366 |
+
<span class="feat-name">Populasi Jiwa</span>
|
| 367 |
+
<div class="bar-container"><div class="bar" style="width: 13%; background: var(--sky-blue);"></div></div>
|
| 368 |
+
<span class="feat-percent">2.19%</span>
|
| 369 |
+
</div>
|
| 370 |
+
<div class="feat-importance-item">
|
| 371 |
+
<span class="feat-name">Lebaran (Is_Mudik)</span>
|
| 372 |
+
<div class="bar-container"><div class="bar" style="width: 11%; background: var(--red);"></div></div>
|
| 373 |
+
<span class="feat-percent">1.92%</span>
|
| 374 |
+
</div>
|
| 375 |
+
<div class="feat-importance-item">
|
| 376 |
+
<span class="feat-name">Curah Hujan</span>
|
| 377 |
+
<div class="bar-container"><div class="bar" style="width: 6%; background: var(--leaf-green);"></div></div>
|
| 378 |
+
<span class="feat-percent">0.66%</span>
|
| 379 |
+
</div>
|
| 380 |
</div>
|
| 381 |
</div>
|
| 382 |
</div>
|
| 383 |
</section>
|
| 384 |
|
| 385 |
<!-- Development Author Section -->
|
| 386 |
+
<section class="container developers-section" style="margin-bottom: 2.5rem;">
|
| 387 |
<h2 class="section-title">AETERNA AI LEAD DEVELOPER</h2>
|
| 388 |
<div class="developers-grid" style="display: flex; justify-content: center;">
|
| 389 |
<div class="panel developer-card" style="max-width: 600px; width: 100%;">
|
frontend/style.css
CHANGED
|
@@ -1527,3 +1527,267 @@ footer {
|
|
| 1527 |
45% { transform: rotate(-15deg) scale(1.1); }
|
| 1528 |
}
|
| 1529 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1527 |
45% { transform: rotate(-15deg) scale(1.1); }
|
| 1528 |
}
|
| 1529 |
|
| 1530 |
+
/* ==========================================
|
| 1531 |
+
HOMEPAGE EXPANDED PIPELINE & ARCHITECTURE
|
| 1532 |
+
========================================== */
|
| 1533 |
+
.pipeline-flow-container {
|
| 1534 |
+
display: flex;
|
| 1535 |
+
justify-content: space-between;
|
| 1536 |
+
align-items: center;
|
| 1537 |
+
gap: 12px;
|
| 1538 |
+
margin-top: 1rem;
|
| 1539 |
+
flex-wrap: wrap;
|
| 1540 |
+
}
|
| 1541 |
+
|
| 1542 |
+
.flow-step {
|
| 1543 |
+
background: #ffffff;
|
| 1544 |
+
border: 2px solid var(--border-color);
|
| 1545 |
+
border-radius: 12px;
|
| 1546 |
+
padding: 1.2rem;
|
| 1547 |
+
flex: 1;
|
| 1548 |
+
min-width: 200px;
|
| 1549 |
+
display: flex;
|
| 1550 |
+
flex-direction: column;
|
| 1551 |
+
align-items: center;
|
| 1552 |
+
text-align: center;
|
| 1553 |
+
box-shadow: 0 4px 12px rgba(0, 107, 95, 0.01);
|
| 1554 |
+
transition: transform 0.25s cubic-bezier(0.25, 0.8, 0.25, 1), border-color 0.25s;
|
| 1555 |
+
}
|
| 1556 |
+
|
| 1557 |
+
.flow-step:hover {
|
| 1558 |
+
transform: translateY(-4px);
|
| 1559 |
+
border-color: var(--primary);
|
| 1560 |
+
box-shadow: 0 8px 20px rgba(0, 107, 95, 0.05);
|
| 1561 |
+
}
|
| 1562 |
+
|
| 1563 |
+
.flow-icon {
|
| 1564 |
+
font-size: 1.6rem;
|
| 1565 |
+
margin-bottom: 8px;
|
| 1566 |
+
}
|
| 1567 |
+
|
| 1568 |
+
.flow-title {
|
| 1569 |
+
font-family: var(--font-display);
|
| 1570 |
+
font-weight: 800;
|
| 1571 |
+
color: var(--primary);
|
| 1572 |
+
font-size: 0.95rem;
|
| 1573 |
+
margin-bottom: 6px;
|
| 1574 |
+
}
|
| 1575 |
+
|
| 1576 |
+
.flow-desc {
|
| 1577 |
+
font-size: 0.8rem;
|
| 1578 |
+
color: var(--text-muted);
|
| 1579 |
+
line-height: 1.4;
|
| 1580 |
+
}
|
| 1581 |
+
|
| 1582 |
+
.flow-arrow {
|
| 1583 |
+
font-size: 1.5rem;
|
| 1584 |
+
color: var(--border-color);
|
| 1585 |
+
user-select: none;
|
| 1586 |
+
}
|
| 1587 |
+
|
| 1588 |
+
@media (max-width: 768px) {
|
| 1589 |
+
.pipeline-flow-container {
|
| 1590 |
+
flex-direction: column;
|
| 1591 |
+
align-items: stretch;
|
| 1592 |
+
}
|
| 1593 |
+
.flow-arrow {
|
| 1594 |
+
text-align: center;
|
| 1595 |
+
transform: rotate(90deg);
|
| 1596 |
+
margin: 6px 0;
|
| 1597 |
+
}
|
| 1598 |
+
}
|
| 1599 |
+
|
| 1600 |
+
/* Stacking Architecture Grid */
|
| 1601 |
+
.ml-grid-layout {
|
| 1602 |
+
display: grid;
|
| 1603 |
+
grid-template-columns: 1.25fr 0.75fr;
|
| 1604 |
+
gap: 24px;
|
| 1605 |
+
margin-top: 1.5rem;
|
| 1606 |
+
}
|
| 1607 |
+
|
| 1608 |
+
@media (max-width: 992px) {
|
| 1609 |
+
.ml-grid-layout {
|
| 1610 |
+
grid-template-columns: 1fr;
|
| 1611 |
+
}
|
| 1612 |
+
}
|
| 1613 |
+
|
| 1614 |
+
.stacking-diagram {
|
| 1615 |
+
display: flex;
|
| 1616 |
+
flex-direction: column;
|
| 1617 |
+
align-items: center;
|
| 1618 |
+
gap: 8px;
|
| 1619 |
+
width: 100%;
|
| 1620 |
+
}
|
| 1621 |
+
|
| 1622 |
+
.diagram-layer {
|
| 1623 |
+
width: 100%;
|
| 1624 |
+
background: var(--soft-surface);
|
| 1625 |
+
border: 2px solid var(--border-color);
|
| 1626 |
+
border-radius: 12px;
|
| 1627 |
+
padding: 1.2rem;
|
| 1628 |
+
text-align: center;
|
| 1629 |
+
}
|
| 1630 |
+
|
| 1631 |
+
.layer-title {
|
| 1632 |
+
display: block;
|
| 1633 |
+
font-family: var(--font-display);
|
| 1634 |
+
font-size: 0.8rem;
|
| 1635 |
+
font-weight: 800;
|
| 1636 |
+
text-transform: uppercase;
|
| 1637 |
+
color: var(--text-muted);
|
| 1638 |
+
margin-bottom: 10px;
|
| 1639 |
+
letter-spacing: 0.05em;
|
| 1640 |
+
}
|
| 1641 |
+
|
| 1642 |
+
.layer-nodes {
|
| 1643 |
+
display: flex;
|
| 1644 |
+
justify-content: center;
|
| 1645 |
+
gap: 8px;
|
| 1646 |
+
flex-wrap: wrap;
|
| 1647 |
+
}
|
| 1648 |
+
|
| 1649 |
+
.node-tag {
|
| 1650 |
+
background: #ffffff;
|
| 1651 |
+
border: 2px solid var(--border-color);
|
| 1652 |
+
border-radius: 20px;
|
| 1653 |
+
padding: 4px 12px;
|
| 1654 |
+
font-size: 0.75rem;
|
| 1655 |
+
font-weight: 700;
|
| 1656 |
+
color: var(--text-main);
|
| 1657 |
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.02);
|
| 1658 |
+
}
|
| 1659 |
+
|
| 1660 |
+
.diagram-connector {
|
| 1661 |
+
font-size: 1.2rem;
|
| 1662 |
+
color: var(--border-color);
|
| 1663 |
+
user-select: none;
|
| 1664 |
+
}
|
| 1665 |
+
|
| 1666 |
+
.layer-estimators {
|
| 1667 |
+
display: grid;
|
| 1668 |
+
grid-template-columns: repeat(3, 1fr);
|
| 1669 |
+
gap: 12px;
|
| 1670 |
+
width: 100%;
|
| 1671 |
+
}
|
| 1672 |
+
|
| 1673 |
+
@media (max-width: 576px) {
|
| 1674 |
+
.layer-estimators {
|
| 1675 |
+
grid-template-columns: 1fr;
|
| 1676 |
+
}
|
| 1677 |
+
}
|
| 1678 |
+
|
| 1679 |
+
.estimator-card {
|
| 1680 |
+
background: #ffffff;
|
| 1681 |
+
border: 2px solid var(--border-color);
|
| 1682 |
+
border-radius: 8px;
|
| 1683 |
+
padding: 10px;
|
| 1684 |
+
display: flex;
|
| 1685 |
+
flex-direction: column;
|
| 1686 |
+
gap: 4px;
|
| 1687 |
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.02);
|
| 1688 |
+
}
|
| 1689 |
+
|
| 1690 |
+
.estimator-card .est-name {
|
| 1691 |
+
font-family: var(--font-display);
|
| 1692 |
+
font-weight: 800;
|
| 1693 |
+
color: var(--primary);
|
| 1694 |
+
font-size: 0.85rem;
|
| 1695 |
+
}
|
| 1696 |
+
|
| 1697 |
+
.estimator-card .est-desc {
|
| 1698 |
+
font-size: 0.7rem;
|
| 1699 |
+
color: var(--text-muted);
|
| 1700 |
+
line-height: 1.3;
|
| 1701 |
+
}
|
| 1702 |
+
|
| 1703 |
+
.meta-card {
|
| 1704 |
+
max-width: 320px;
|
| 1705 |
+
margin: 0 auto;
|
| 1706 |
+
background: var(--bg-panel);
|
| 1707 |
+
border-color: var(--primary);
|
| 1708 |
+
box-shadow: 0 4px 10px rgba(0, 107, 95, 0.08);
|
| 1709 |
+
}
|
| 1710 |
+
|
| 1711 |
+
/* Metrics Dashboard Cards */
|
| 1712 |
+
.metrics-dashboard-grid {
|
| 1713 |
+
display: grid;
|
| 1714 |
+
grid-template-columns: 1fr 1fr;
|
| 1715 |
+
gap: 12px;
|
| 1716 |
+
}
|
| 1717 |
+
|
| 1718 |
+
.metric-score-card {
|
| 1719 |
+
background: var(--soft-surface);
|
| 1720 |
+
border: 2px solid var(--border-color);
|
| 1721 |
+
border-radius: 12px;
|
| 1722 |
+
padding: 1.2rem;
|
| 1723 |
+
text-align: center;
|
| 1724 |
+
display: flex;
|
| 1725 |
+
flex-direction: column;
|
| 1726 |
+
justify-content: center;
|
| 1727 |
+
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.01);
|
| 1728 |
+
}
|
| 1729 |
+
|
| 1730 |
+
.metric-score-card .score-num {
|
| 1731 |
+
font-family: var(--font-display);
|
| 1732 |
+
font-size: 1.8rem;
|
| 1733 |
+
font-weight: 800;
|
| 1734 |
+
line-height: 1.1;
|
| 1735 |
+
margin-bottom: 4px;
|
| 1736 |
+
}
|
| 1737 |
+
|
| 1738 |
+
.metric-score-card .score-label {
|
| 1739 |
+
font-size: 0.75rem;
|
| 1740 |
+
color: var(--text-muted);
|
| 1741 |
+
font-weight: 700;
|
| 1742 |
+
text-transform: uppercase;
|
| 1743 |
+
}
|
| 1744 |
+
|
| 1745 |
+
/* Feature Importance Horizontal Chart */
|
| 1746 |
+
.features-importance-list {
|
| 1747 |
+
display: flex;
|
| 1748 |
+
flex-direction: column;
|
| 1749 |
+
gap: 10px;
|
| 1750 |
+
margin-top: 0.5rem;
|
| 1751 |
+
}
|
| 1752 |
+
|
| 1753 |
+
.feat-importance-item {
|
| 1754 |
+
display: flex;
|
| 1755 |
+
align-items: center;
|
| 1756 |
+
justify-content: space-between;
|
| 1757 |
+
gap: 12px;
|
| 1758 |
+
font-size: 0.8rem;
|
| 1759 |
+
}
|
| 1760 |
+
|
| 1761 |
+
.feat-importance-item .feat-name {
|
| 1762 |
+
flex: 1.8;
|
| 1763 |
+
font-weight: 700;
|
| 1764 |
+
color: var(--text-main);
|
| 1765 |
+
white-space: nowrap;
|
| 1766 |
+
overflow: hidden;
|
| 1767 |
+
text-overflow: ellipsis;
|
| 1768 |
+
}
|
| 1769 |
+
|
| 1770 |
+
.feat-importance-item .bar-container {
|
| 1771 |
+
flex: 3;
|
| 1772 |
+
background: var(--border-color);
|
| 1773 |
+
height: 8px;
|
| 1774 |
+
border-radius: 4px;
|
| 1775 |
+
overflow: hidden;
|
| 1776 |
+
opacity: 0.85;
|
| 1777 |
+
}
|
| 1778 |
+
|
| 1779 |
+
.feat-importance-item .bar {
|
| 1780 |
+
height: 100%;
|
| 1781 |
+
border-radius: 4px;
|
| 1782 |
+
transition: width 1s ease-out;
|
| 1783 |
+
}
|
| 1784 |
+
|
| 1785 |
+
.feat-importance-item .feat-percent {
|
| 1786 |
+
flex: 0.8;
|
| 1787 |
+
font-family: var(--font-mono);
|
| 1788 |
+
font-weight: 700;
|
| 1789 |
+
color: var(--text-main);
|
| 1790 |
+
text-align: right;
|
| 1791 |
+
}
|
| 1792 |
+
|
| 1793 |
+
|