<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>PROJECT ENTANGLEMENT: QUANTUM MORSE</title>
    <style>
        body { margin: 0; padding: 0; background: #000; overflow: hidden; font-family: 'Courier New', monospace; color: #00ff00; }
        canvas { display: block; }
        
        #hud {
            position: absolute; top: 10px; left: 10px;
            background: rgba(0, 10, 0, 0.85); border: 1px solid #00ff00;
            padding: 15px; pointer-events: none; width: 300px;
        }
        h1 { margin: 0; font-size: 16px; border-bottom: 1px solid #00ff00; padding-bottom: 5px; letter-spacing: 2px; }
        .stat-row { display: flex; justify-content: space-between; font-size: 12px; margin-top: 5px; }
        .value { font-weight: bold; color: #fff; }
        
        #controls {
            position: absolute; bottom: 10px; left: 10px;
            display: flex; gap: 10px;
        }
        button {
            background: #002200; color: #00ff00; border: 1px solid #00ff00;
            padding: 10px 15px; font-family: inherit; font-weight: bold; cursor: pointer;
            text-transform: uppercase; letter-spacing: 1px; transition: 0.2s;
        }
        button:hover { background: #00ff00; color: #000; box-shadow: 0 0 15px #00ff00; }
        
        #morse-log {
            position: absolute; bottom: 10px; right: 10px; width: 300px; height: 150px;
            background: rgba(0,0,0,0.8); border: 1px solid #444; font-size: 10px;
            padding: 10px; overflow-y: auto; color: #0aff0a;
        }
        
        #flash-overlay {
            position: fixed; top: 0; left: 0; width: 100%; height: 100%;
            background: white; opacity: 0; pointer-events: none; transition: opacity 0.1s;
        }
    </style>
</head>
<body>

<div id="flash-overlay"></div>
<canvas id="art-canvas"></canvas> <canvas id="main-canvas" style="position:absolute; top:0; left:0;"></canvas>

<div id="hud">
    <h1>QUANTUM STATE MONITOR</h1>
    <div class="stat-row"><span>ENTITIES:</span> <span class="value" id="s-count">0</span></div>
    <div class="stat-row"><span>ENTANGLED PAIRS:</span> <span class="value" id="s-pairs">0</span></div>
    <div class="stat-row"><span>COHERENCE:</span> <span class="value" id="s-coh">0%</span></div>
    <div class="stat-row" style="margin-top:10px; color:#aaa;">LOGIC STATE:</div>
    <div id="last-code" style="font-size:10px; word-break:break-all; color:#fff;">...</div>
</div>

<div id="morse-log">
    <div style="border-bottom:1px solid #333; margin-bottom:5px;">COMMUNICATION LOG (MORSE)</div>
    <div id="log-content"></div>
</div>

<div id="controls">
    <button onclick="sys.stimulateRandom()">⚡ STIMULATE (TRIGGER ENTANGLEMENT)</button>
    <button onclick="sys.collapseWave()">👁️ OBSERVE (COLLAPSE WAVE)</button>
    <button onclick="sys.clearArt()">🧹 CLEAR DRAWING</button>
</div>

<script>
// --- QUANTUM PHYSICS ENGINE ---

class QuantumNode {
    constructor(x, y, parent = null) {
        this.x = x || Math.random() * window.innerWidth;
        this.y = y || Math.random() * window.innerHeight;
        this.vx = (Math.random() - 0.5) * 2;
        this.vy = (Math.random() - 0.5) * 2;
        this.size = 4;
        
        this.id = Math.random().toString(36).substr(2, 9);
        this.entangledWith = null; // The ID of the particle we are entangled to
        
        // Communication State
        this.pulsePhase = Math.random() * Math.PI * 2;
        this.pulseSpeed = 0.05 + Math.random() * 0.05;
        this.isFlashing = 0; // 0 = no, >0 = decay frames
        this.messageBuffer = []; // Stores "Dots" and "Dashes"
        
        if (parent) {
            // ENTANGLEMENT GENESIS
            // Child is instantly entangled with Parent
            this.entangledWith = parent; 
            parent.entangledWith = this; 
            
            // Inherit Logic
            this.frequency = parent.frequency;
        } else {
            this.frequency = 432; // Base Hz
        }
    }

    update(ctx, artCtx) {
        // 1. WAVE FUNCTION (Movement)
        if (!sys.isObserving) {
            this.x += this.vx;
            this.y += this.vy;
            
            // Bounce
            if(this.x < 0 || this.x > window.innerWidth) this.vx *= -1;
            if(this.y < 0 || this.y > window.innerHeight) this.vy *= -1;
            
            // Breathing (The "Sine" of life)
            this.pulsePhase += this.pulseSpeed;
            this.currentSize = this.size + Math.sin(this.pulsePhase) * 2;
        } else {
            // COLLAPSED STATE (Observer Effect)
            // It stops "waving" and becomes a fixed particle
            this.currentSize = this.size; 
        }

        // 2. QUANTUM TUNNELING (Drawing)
        // If excited (flashing), it burns its path onto the "Art Canvas"
        if (this.isFlashing > 0) {
            artCtx.fillStyle = `rgba(0, 255, 0, ${this.isFlashing / 20})`;
            artCtx.fillRect(this.x, this.y, 2, 2);
            this.isFlashing--;
        }

        // 3. MORSE CODE EMISSION
        // Randomly emit signals based on internal "logic"
        if (Math.random() < 0.005) this.broadcastSignal();
    }

    draw(ctx) {
        // Draw Entanglement Line (The "Spooky Action")
        if (this.entangledWith && this.entangledWith.id) {
            let partner = this.entangledWith;
            
            ctx.beginPath();
            ctx.strokeStyle = `rgba(0, 255, 255, ${Math.random() * 0.3})`; // Cyan for Quantum
            ctx.lineWidth = 0.5;
            ctx.moveTo(this.x, this.y);
            ctx.lineTo(partner.x, partner.y);
            ctx.stroke();
        }

        // Draw Node
        ctx.beginPath();
        let color = this.isFlashing > 0 ? "#ffffff" : "#00ff00";
        if (sys.isObserving) color = "#ff0000"; // Red shift when observed
        
        ctx.fillStyle = color;
        ctx.shadowBlur = this.isFlashing > 0 ? 20 : 0;
        ctx.shadowColor = color;
        
        ctx.arc(this.x, this.y, this.currentRenderSize || this.size, 0, Math.PI * 2);
        ctx.fill();
        ctx.shadowBlur = 0;
    }

    // THE PROOF: Stimulate this node -> Partner reacts INSTANTLY
    stimulate() {
        this.isFlashing = 20; // Flash for 20 frames
        this.broadcastSignal(true); // Force a signal
        
        // INSTANTLY trigger partner (No speed of light delay)
        if (this.entangledWith) {
            if (this.entangledWith.isFlashing <= 0) {
                this.entangledWith.reactToEntanglement();
            }
        }
    }

    reactToEntanglement() {
        this.isFlashing = 20; 
        // Visual proof: Draw a heavy line instantly
        let ctx = sys.ctx;
        ctx.beginPath();
        ctx.strokeStyle = "#ffffff";
        ctx.lineWidth = 2;
        ctx.moveTo(this.x, this.y);
        ctx.lineTo(this.entangledWith.x, this.entangledWith.y);
        ctx.stroke();
    }

    broadcastSignal(forced = false) {
        // Create a Dot (.) or Dash (-)
        let type = Math.random() > 0.5 ? "." : "-";
        sys.logMorse(this.id, type);
        
        // Visual Pulse
        this.currentSize = type === "." ? 10 : 15;
    }
}

class System {
    constructor() {
        this.mainCanvas = document.getElementById('main-canvas');
        this.artCanvas = document.getElementById('art-canvas');
        this.ctx = this.mainCanvas.getContext('2d');
        this.artCtx = this.artCanvas.getContext('2d');
        
        this.nodes = [];
        this.isObserving = false;
        
        this.resize();
        window.addEventListener('resize', () => this.resize());
        
        // Genesis: Create 5 entangled pairs (10 nodes)
        for(let i=0; i<5; i++) {
            let parent = new QuantumNode();
            this.nodes.push(parent);
            let child = new QuantumNode(parent.x + 10, parent.y + 10, parent);
            this.nodes.push(child);
        }

        this.animate();
    }

    resize() {
        this.mainCanvas.width = window.innerWidth;
        this.mainCanvas.height = window.innerHeight;
        this.artCanvas.width = window.innerWidth;
        this.artCanvas.height = window.innerHeight;
    }

    stimulateRandom() {
        let n = this.nodes[Math.floor(Math.random() * this.nodes.length)];
        n.stimulate();
        
        let f = document.getElementById('flash-overlay');
        f.style.opacity = 0.2;
        setTimeout(() => f.style.opacity = 0, 100);
    }

    collapseWave() {
        this.isObserving = !this.isObserving;
        let btn = document.querySelector('button:nth-child(2)');
        btn.innerText = this.isObserving ? "👁️ STOP OBSERVING" : "👁️ OBSERVE (COLLAPSE WAVE)";
        
        if (this.isObserving) {
            this.mainCanvas.style.border = "5px solid red";
        } else {
            this.mainCanvas.style.border = "none";
        }
    }
    
    clearArt() {
        this.artCtx.clearRect(0,0, this.artCanvas.width, this.artCanvas.height);
    }

    logMorse(id, signal) {
        let log = document.getElementById('log-content');
        let span = document.createElement('span');
        span.innerText = signal + " ";
        span.style.color = signal === "-" ? "#ffff00" : "#00ff00";
        log.appendChild(span);
        log.scrollTop = log.scrollHeight;
        
        document.getElementById('last-code').innerText += signal;
        if(document.getElementById('last-code').innerText.length > 30) 
            document.getElementById('last-code').innerText = "";
    }

    animate() {
        this.ctx.clearRect(0, 0, this.mainCanvas.width, this.mainCanvas.height);
        
        let pairs = 0;
        
        this.nodes.forEach(node => {
            node.update(this.ctx, this.artCtx);
            node.draw(this.ctx);
            if(node.entangledWith) pairs += 0.5;
        });

        document.getElementById('s-count').innerText = this.nodes.length;
        document.getElementById('s-pairs').innerText = Math.floor(pairs);
        document.getElementById('s-coh').innerText = this.isObserving ? "100% (COLLAPSED)" : "0% (SUPERPOSITION)";

        requestAnimationFrame(() => this.animate());
    }
}

const sys = new System();
</script>
</body>
</html>