| <!doctype html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8" /> |
| <meta |
| name="viewport" |
| content="width=device-width, initial-scale=1.0, user-scalable=no" |
| /> |
| <meta |
| name="description" |
| content="Digital Life Evolution Simulator - An autonomous AI ecosystem demonstration" |
| /> |
| <title>Digital Life Evolution Simulator</title> |
|
|
| <link rel="stylesheet" href="css/main.css" /> |
| <link rel="stylesheet" href="css/animations.css" /> |
| <link rel="stylesheet" href="css/neon-effects.css" /> |
|
|
| <style> |
| html, |
| body { |
| background: #06060f; |
| } |
| #loading { |
| position: fixed; |
| top: 0; |
| left: 0; |
| right: 0; |
| bottom: 0; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| background: #06060f; |
| z-index: 9999; |
| font-family: "Courier New", monospace; |
| color: #00f0ff; |
| font-size: 14px; |
| letter-spacing: 2px; |
| transition: opacity 0.5s ease; |
| } |
| #loading.fade-out { |
| opacity: 0; |
| pointer-events: none; |
| } |
| #loading .pulse { |
| animation: loadPulse 1.5s ease-in-out infinite; |
| } |
| @keyframes loadPulse { |
| 0%, |
| 100% { |
| opacity: 0.4; |
| } |
| 50% { |
| opacity: 1; |
| text-shadow: |
| 0 0 10px #00f0ff, |
| 0 0 20px #00f0ff; |
| } |
| } |
| </style> |
| </head> |
| <body> |
| <div id="loading" role="alert" aria-live="polite"> |
| <span class="pulse">INITIALIZING ECOSYSTEM...</span> |
| </div> |
|
|
| <div |
| id="app" |
| role="application" |
| aria-label="Digital Life Evolution Simulator" |
| > |
| <a |
| href="#panel-stats" |
| class="sr-only" |
| style="position: absolute; z-index: 100" |
| > |
| Skip to simulation stats |
| </a> |
|
|
| <canvas |
| id="simulation-canvas" |
| aria-label="Simulation world with AI entities, resources, and environmental events" |
| role="img" |
| ></canvas> |
|
|
| <canvas id="particle-canvas" aria-hidden="true"></canvas> |
|
|
| <div class="scan-overlay" aria-hidden="true"></div> |
| </div> |
|
|
| <script type="module"> |
| import { bootstrap } from "./js/ecosystem.js"; |
| |
| if (document.readyState === "loading") { |
| document.addEventListener("DOMContentLoaded", start); |
| } else { |
| start(); |
| } |
| |
| function start() { |
| requestAnimationFrame(() => { |
| try { |
| bootstrap(); |
| } catch (err) { |
| console.error("Bootstrap failed:", err); |
| document.getElementById("loading").innerHTML = |
| '<span style="color:#ff3366">ERROR: ' + err.message + "</span>"; |
| return; |
| } |
| |
| const loading = document.getElementById("loading"); |
| if (loading) { |
| loading.classList.add("fade-out"); |
| setTimeout(() => loading.remove(), 600); |
| } |
| }); |
| } |
| </script> |
| </body> |
| </html> |
|
|