Kaynağa Gözat

v.0.1 [style.css] [3]

ypv 1 gün önce
ebeveyn
işleme
40c87fe7fa
2 değiştirilmiş dosya ile 430 ekleme ve 0 silme
  1. 3 0
      docs/issues.md
  2. 427 0
      index.html

+ 3 - 0
docs/issues.md

@@ -1,3 +1,6 @@
+создай файл css/style.css
+v.0.1 [style.css] [3]
+
 создай файл index.html
 v.0.1 [index] [2]
 

+ 427 - 0
index.html

@@ -0,0 +1,427 @@
+<!DOCTYPE html>
+<html lang="ru">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta name="description" content="Интерактивная образовательная схема устройства самого массового кодового замка СССР — ЗКЭ-4-10">
+    <meta name="theme-color" content="#2a2a2a">
+
+    <title>ЗКЭ-4-10 — Кодовый замок СССР | Интерактивная схема</title>
+
+    <!-- PWA -->
+    <link rel="manifest" href="manifest.json">
+    <link rel="icon" type="image/png" href="images/lock-icon.png">
+    <link rel="apple-touch-icon" href="images/lock-icon.png">
+
+    <!-- Шрифты -->
+    <link rel="preconnect" href="https://fonts.googleapis.com">
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+    <link href="https://fonts.googleapis.com/css2?family=PT+Serif:wght@400;700&family=Roboto+Slab:wght@300;500;700&family=Share+Tech+Mono&display=swap" rel="stylesheet">
+
+    <!-- Стили -->
+    <link rel="stylesheet" href="css/style.css">
+</head>
+<body>
+
+<!-- ============ ШАПКА ============ -->
+<header class="app-header">
+    <div class="header-content">
+        <div class="header-title">
+            <h1>ЗКЭ-4-10</h1>
+            <p class="subtitle">Кодовый электронный замок · СССР · 1980-е</p>
+        </div>
+        <nav class="header-nav">
+            <button id="btn-help" class="nav-btn" title="Справка">?</button>
+            <button id="btn-sound" class="nav-btn" title="Звук">🔊</button>
+            <button id="btn-reset" class="nav-btn" title="Сбросить">⟲</button>
+        </nav>
+    </div>
+    <div class="progress-line">
+        <div id="progress-fill" class="progress-fill"></div>
+    </div>
+</header>
+
+<!-- ============ ОСНОВНОЙ ЭКРАН ============ -->
+<main class="app-main">
+
+    <!-- ЛЕВАЯ ПАНЕЛЬ: ЗАЩЁЛКА -->
+    <section class="panel panel-lock" id="panel-lock">
+        <div class="panel-header">
+            <span class="panel-tag">01</span>
+            <h2>Электромеханическая защёлка</h2>
+        </div>
+
+        <div class="lock-scene" id="lock-scene">
+            <!-- SVG-защёлка рисуется здесь -->
+            <svg id="lock-svg" viewBox="0 0 400 500" xmlns="http://www.w3.org/2000/svg" aria-label="Схема защёлки замка">
+                <defs>
+                    <linearGradient id="metalGrad" x1="0%" y1="0%" x2="100%" y2="100%">
+                        <stop offset="0%" stop-color="#8b8b8b"/>
+                        <stop offset="50%" stop-color="#c9c9c9"/>
+                        <stop offset="100%" stop-color="#6b6b6b"/>
+                    </linearGradient>
+                    <linearGradient id="doorGrad" x1="0%" y1="0%" x2="0%" y2="100%">
+                        <stop offset="0%" stop-color="#4a3a2a"/>
+                        <stop offset="100%" stop-color="#2e2419"/>
+                    </linearGradient>
+                    <radialGradient id="coilGlow" cx="50%" cy="50%" r="50%">
+                        <stop offset="0%" stop-color="#ffcc00" stop-opacity="0.9"/>
+                        <stop offset="70%" stop-color="#ff8800" stop-opacity="0.4"/>
+                        <stop offset="100%" stop-color="#ff6600" stop-opacity="0"/>
+                    </radialGradient>
+                    <filter id="softGlow" x="-50%" y="-50%" width="200%" height="200%">
+                        <feGaussianBlur stdDeviation="6" result="blur"/>
+                        <feMerge>
+                            <feMergeNode in="blur"/>
+                            <feMergeNode in="SourceGraphic"/>
+                        </feMerge>
+                    </filter>
+                </defs>
+
+                <!-- Дверное полотно -->
+                <rect x="20" y="20" width="360" height="460" fill="url(#doorGrad)" stroke="#1a140c" stroke-width="3" rx="4"/>
+
+                <!-- Дверная коробка (ответная планка) -->
+                <rect x="330" y="180" width="60" height="140" fill="url(#metalGrad)" stroke="#3a3a3a" stroke-width="2" rx="3"/>
+                <rect x="345" y="220" width="30" height="60" fill="#1a1a1a" rx="2"/>
+
+                <!-- Корпус замка -->
+                <rect x="60" y="200" width="200" height="120" fill="url(#metalGrad)" stroke="#3a3a3a" stroke-width="2" rx="4"/>
+                <circle cx="85" cy="225" r="4" fill="#444"/>
+                <circle cx="85" cy="295" r="4" fill="#444"/>
+                <circle cx="235" cy="225" r="4" fill="#444"/>
+                <circle cx="235" cy="295" r="4" fill="#444"/>
+
+                <!-- Электромагнит (катушка) -->
+                <g id="magnet-group">
+                    <ellipse id="magnet-glow" cx="110" cy="260" rx="45" ry="35" fill="url(#coilGlow)" opacity="0" filter="url(#softGlow)"/>
+                    <rect x="85" y="240" width="50" height="40" fill="#2a2a2a" stroke="#555" stroke-width="2" rx="3"/>
+                    <!-- Витки катушки -->
+                    <line x1="88" y1="248" x2="132" y2="248" stroke="#c9a227" stroke-width="1.5"/>
+                    <line x1="88" y1="254" x2="132" y2="254" stroke="#c9a227" stroke-width="1.5"/>
+                    <line x1="88" y1="260" x2="132" y2="260" stroke="#c9a227" stroke-width="1.5"/>
+                    <line x1="88" y1="266" x2="132" y2="266" stroke="#c9a227" stroke-width="1.5"/>
+                    <line x1="88" y1="272" x2="132" y2="272" stroke="#c9a227" stroke-width="1.5"/>
+                    <text x="110" y="234" text-anchor="middle" font-family="Share Tech Mono" font-size="10" fill="#c9a227">КА-ТУШ-КА</text>
+                </g>
+
+                <!-- Подвижный сердечник защёлки -->
+                <g id="bolt-group">
+                    <rect id="bolt" x="155" y="245" width="180" height="30" fill="#d9d9d9" stroke="#4a4a4a" stroke-width="2" rx="2"/>
+                    <rect x="300" y="252" width="40" height="16" fill="#b0b0b0" stroke="#4a4a4a" stroke-width="1.5" rx="1"/>
+                </g>
+
+                <!-- Пружина возврата -->
+                <g id="spring-group">
+                    <path id="spring" d="M 165 285 l 8 8 l -8 8 l 8 8 l -8 8" stroke="#888" stroke-width="2" fill="none"/>
+                </g>
+
+                <!-- Резервный ключ -->
+                <g id="key-group">
+                    <circle cx="100" cy="400" r="14" fill="#8b6f47" stroke="#3a2a1a" stroke-width="2"/>
+                    <circle cx="100" cy="400" r="5" fill="#2a1a0a"/>
+                    <rect x="96" y="414" width="8" height="35" fill="#8b6f47" stroke="#3a2a1a" stroke-width="1.5"/>
+                    <text x="100" y="465" text-anchor="middle" font-family="Roboto Slab" font-size="11" fill="#c9c9c9">Резервный ключ</text>
+                </g>
+
+                <!-- Подписи -->
+                <text x="110" y="310" text-anchor="middle" font-family="Roboto Slab" font-size="11" fill="#c9c9c9">Электромагнит</text>
+                <text x="250" y="240" text-anchor="middle" font-family="Roboto Slab" font-size="11" fill="#c9c9c9">Ригель (защёлка)</text>
+                <text x="350" y="175" text-anchor="middle" font-family="Roboto Slab" font-size="11" fill="#c9c9c9">Ответная планка</text>
+            </svg>
+
+            <!-- Индикатор состояния -->
+            <div class="lock-status" id="lock-status">
+                <span class="status-dot" id="status-dot"></span>
+                <span class="status-text" id="status-text">Замок закрыт</span>
+            </div>
+        </div>
+
+        <div class="lock-info">
+            <p><strong>Электромагнит</strong> — при подаче напряжения втягивает сердечник, который сдвигает ригель вправо, освобождая дверь.</p>
+        </div>
+    </section>
+
+    <!-- ПРАВАЯ ВЕРХНЯЯ ПАНЕЛЬ: ПРИНЦИПИАЛЬНАЯ СХЕМА -->
+    <section class="panel panel-circuit" id="panel-circuit">
+        <div class="panel-header">
+            <span class="panel-tag">02</span>
+            <h2>Принципиальная схема</h2>
+            <div class="circuit-legend">
+                <span class="legend-item"><i class="dot dot-off"></i>не активен</span>
+                <span class="legend-item"><i class="dot dot-on"></i>активен</span>
+            </div>
+        </div>
+
+        <div class="circuit-wrap">
+            <svg id="circuit-svg" viewBox="0 0 700 380" xmlns="http://www.w3.org/2000/svg" aria-label="Принципиальная схема замка ЗКЭ-4-10">
+                <defs>
+                    <marker id="arrow" markerWidth="8" markerHeight="8" refX="6" refY="3" orient="auto">
+                        <path d="M0,0 L6,3 L0,6 Z" fill="#5a5a5a"/>
+                    </marker>
+                </defs>
+
+                <!-- Рамка схемы -->
+                <rect x="5" y="5" width="690" height="370" fill="#0e1419" stroke="#2a3a45" stroke-width="1.5" rx="6"/>
+
+                <!-- ===== Блок питания (трансформатор) ===== -->
+                <g id="node-psu" class="circuit-node" data-node="psu">
+                    <rect x="30" y="150" width="90" height="80" fill="#1a2530" stroke="#3a5050" stroke-width="2" rx="4"/>
+                    <text x="75" y="185" text-anchor="middle" font-family="Share Tech Mono" font-size="11" fill="#7fbfbf">220V</text>
+                    <text x="75" y="200" text-anchor="middle" font-family="Share Tech Mono" font-size="10" fill="#5a8f8f">ТР-1</text>
+                    <text x="75" y="218" text-anchor="middle" font-family="Roboto Slab" font-size="9" fill="#8fbcbc">Трансформатор</text>
+                    <!-- Волна переменного тока -->
+                    <path d="M 40 165 q 5 -8 10 0 q 5 8 10 0 q 5 -8 10 0 q 5 8 10 0" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+                </g>
+
+                <!-- ===== Диодный мост 1 ===== -->
+                <g id="node-bridge1" class="circuit-node" data-node="bridge1">
+                    <rect x="160" y="90" width="70" height="70" fill="#1a2530" stroke="#3a5050" stroke-width="1.5" rx="4"/>
+                    <!-- Ромб диодного моста -->
+                    <path d="M 195 100 L 215 120 L 195 140 L 175 120 Z" fill="none" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <path d="M 195 100 L 195 120 M 195 120 L 195 140" stroke="#7fbfbf" stroke-width="1"/>
+                    <text x="195" y="124" text-anchor="middle" font-family="Share Tech Mono" font-size="8" fill="#7fbfbf">VD1</text>
+                    <text x="195" y="80" text-anchor="middle" font-family="Roboto Slab" font-size="9" fill="#8fbcbc">Мост питания</text>
+                </g>
+
+                <!-- ===== Диодный мост 2 ===== -->
+                <g id="node-bridge2" class="circuit-node" data-node="bridge2">
+                    <rect x="160" y="200" width="70" height="70" fill="#1a2530" stroke="#3a5050" stroke-width="1.5" rx="4"/>
+                    <path d="M 195 210 L 215 230 L 195 250 L 175 230 Z" fill="none" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <path d="M 195 210 L 195 230 M 195 230 L 195 250" stroke="#7fbfbf" stroke-width="1"/>
+                    <text x="195" y="234" text-anchor="middle" font-family="Share Tech Mono" font-size="8" fill="#7fbfbf">VD2</text>
+                    <text x="195" y="195" text-anchor="middle" font-family="Roboto Slab" font-size="9" fill="#8fbcbc">Мост замка</text>
+                </g>
+
+                <!-- Провода от трансформатора к мостам -->
+                <path d="M 120 175 L 140 175 L 140 120 L 160 120" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+                <path d="M 120 205 L 140 205 L 140 230 L 160 230" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+                <path d="M 120 175 L 140 175 L 140 120 L 160 120" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+
+                <!-- ===== Тиристоры (4 шт.) ===== -->
+                <!-- VS1 -->
+                <g id="node-vs1" class="circuit-node" data-node="vs1">
+                    <rect x="270" y="60" width="80" height="50" fill="#1a2530" stroke="#3a5050" stroke-width="1.5" rx="4"/>
+                    <polygon points="290,75 305,85 290,95" fill="none" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <line x1="305" y1="85" x2="330" y2="85" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <line x1="295" y1="70" x2="295" y2="85" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <text x="310" y="105" text-anchor="middle" font-family="Share Tech Mono" font-size="9" fill="#7fbfbf">VS1</text>
+                </g>
+                <!-- VS2 -->
+                <g id="node-vs2" class="circuit-node" data-node="vs2">
+                    <rect x="270" y="120" width="80" height="50" fill="#1a2530" stroke="#3a5050" stroke-width="1.5" rx="4"/>
+                    <polygon points="290,135 305,145 290,155" fill="none" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <line x1="305" y1="145" x2="330" y2="145" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <line x1="295" y1="130" x2="295" y2="145" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <text x="310" y="165" text-anchor="middle" font-family="Share Tech Mono" font-size="9" fill="#7fbfbf">VS2</text>
+                </g>
+                <!-- VS3 -->
+                <g id="node-vs3" class="circuit-node" data-node="vs3">
+                    <rect x="270" y="180" width="80" height="50" fill="#1a2530" stroke="#3a5050" stroke-width="1.5" rx="4"/>
+                    <polygon points="290,195 305,205 290,215" fill="none" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <line x1="305" y1="205" x2="330" y2="205" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <line x1="295" y1="190" x2="295" y2="205" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <text x="310" y="225" text-anchor="middle" font-family="Share Tech Mono" font-size="9" fill="#7fbfbf">VS3</text>
+                </g>
+                <!-- VS4 -->
+                <g id="node-vs4" class="circuit-node" data-node="vs4">
+                    <rect x="270" y="240" width="80" height="50" fill="#1a2530" stroke="#3a5050" stroke-width="1.5" rx="4"/>
+                    <polygon points="290,255 305,265 290,275" fill="none" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <line x1="305" y1="265" x2="330" y2="265" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <line x1="295" y1="250" x2="295" y2="265" stroke="#7fbfbf" stroke-width="1.5"/>
+                    <text x="310" y="285" text-anchor="middle" font-family="Share Tech Mono" font-size="9" fill="#7fbfbf">VS4</text>
+                </g>
+
+                <!-- Провода от моста питания к тиристорам -->
+                <path d="M 230 110 L 250 110 L 250 85 L 270 85" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+                <path d="M 250 110 L 250 145 L 270 145" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+                <path d="M 230 130 L 250 130 L 250 205 L 270 205" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+                <path d="M 250 130 L 250 265 L 270 265" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+
+                <!-- ===== Кнопки клавиатуры (входные) ===== -->
+                <g id="node-keys" class="circuit-node" data-node="keys">
+                    <rect x="270" y="305" width="80" height="45" fill="#1a2530" stroke="#3a5050" stroke-width="1.5" rx="4"/>
+                    <text x="310" y="325" text-anchor="middle" font-family="Roboto Slab" font-size="9" fill="#8fbcbc">Клавиатура</text>
+                    <text x="310" y="340" text-anchor="middle" font-family="Share Tech Mono" font-size="9" fill="#7fbfbf">КЛ-1</text>
+                </g>
+                <path d="M 310 305 L 310 290" stroke="#4fc3f7" stroke-width="1" fill="none" stroke-dasharray="3,2"/>
+                <path d="M 310 290 L 350 290" stroke="#4fc3f7" stroke-width="1" fill="none" stroke-dasharray="3,2"/>
+
+                <!-- ===== Реле времени ===== -->
+                <g id="node-relay" class="circuit-node" data-node="relay">
+                    <rect x="400" y="130" width="90" height="80" fill="#1a2530" stroke="#3a5050" stroke-width="2" rx="4"/>
+                    <text x="445" y="160" text-anchor="middle" font-family="Share Tech Mono" font-size="11" fill="#7fbfbf">КТ</text>
+                    <text x="445" y="178" text-anchor="middle" font-family="Roboto Slab" font-size="9" fill="#8fbcbc">Реле времени</text>
+                    <text x="445" y="195" text-anchor="middle" font-family="Share Tech Mono" font-size="9" fill="#5a8f8f">~1.5 сек</text>
+                </g>
+                <path d="M 350 85 L 380 85 L 380 170 L 400 170" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+                <path d="M 350 145 L 380 145 L 380 170" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+                <path d="M 350 205 L 380 205 L 380 170" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+                <path d="M 350 265 L 380 265 L 380 170" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+
+                <!-- ===== Электромагнит замка ===== -->
+                <g id="node-magnet" class="circuit-node" data-node="magnet">
+                    <rect x="550" y="140" width="110" height="70" fill="#1a2530" stroke="#3a5050" stroke-width="2" rx="4"/>
+                    <!-- Катушка -->
+                    <line x1="565" y1="160" x2="645" y2="160" stroke="#c9a227" stroke-width="2"/>
+                    <line x1="565" y1="168" x2="645" y2="168" stroke="#c9a227" stroke-width="2"/>
+                    <line x1="565" y1="176" x2="645" y2="176" stroke="#c9a227" stroke-width="2"/>
+                    <line x1="565" y1="184" x2="645" y2="184" stroke="#c9a227" stroke-width="2"/>
+                    <text x="605" y="200" text-anchor="middle" font-family="Share Tech Mono" font-size="9" fill="#c9a227">ЭМ-1</text>
+                    <text x="605" y="130" text-anchor="middle" font-family="Roboto Slab" font-size="10" fill="#8fbcbc">Электромагнит</text>
+                </g>
+                <path d="M 490 170 L 550 170" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+                <path d="M 660 175 L 680 175 L 680 30 L 75 30 L 75 150" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+
+                <!-- ===== Лампа индикации ===== -->
+                <g id="node-lamp" class="circuit-node" data-node="lamp">
+                    <circle cx="500" cy="280" r="18" fill="#1a2530" stroke="#3a5050" stroke-width="1.5"/>
+                    <line x1="492" y1="272" x2="508" y2="288" stroke="#5a8f8f" stroke-width="1.5"/>
+                    <line x1="508" y1="272" x2="492" y2="288" stroke="#5a8f8f" stroke-width="1.5"/>
+                    <text x="500" y="315" text-anchor="middle" font-family="Share Tech Mono" font-size="9" fill="#7fbfbf">HL1</text>
+                    <text x="500" y="250" text-anchor="middle" font-family="Roboto Slab" font-size="9" fill="#8fbcbc">Лампа</text>
+                </g>
+                <path d="M 445 210 L 445 280 L 482 280" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+                <path d="M 518 280 L 550 280 L 550 210" stroke="#4fc3f7" stroke-width="1.5" fill="none"/>
+
+                <!-- Подпись -->
+                <text x="350" y="360" text-anchor="middle" font-family="Share Tech Mono" font-size="10" fill="#3a5050">Принципиальная схема ЗКЭ-4-10 (упрощённо)</text>
+            </svg>
+
+            <!-- Информационное окно о выбранном элементе -->
+            <div class="circuit-info" id="circuit-info">
+                <p class="circuit-info-hint">Наведите или нажмите на элемент схемы, чтобы узнать о нём больше</p>
+            </div>
+        </div>
+    </section>
+
+    <!-- ПРАВАЯ НИЖНЯЯ ПАНЕЛЬ: КЛАВИАТУРА -->
+    <section class="panel panel-keyboard" id="panel-keyboard">
+        <div class="panel-header">
+            <span class="panel-tag">03</span>
+            <h2>Клавиатура</h2>
+            <div class="kbd-indicators">
+                <div class="kbd-ind" id="ind-code" title="Набрано цифр кода">0 / 4</div>
+                <div class="kbd-ind" id="ind-err" title="Ошибок набора">✕ 0</div>
+            </div>
+        </div>
+
+        <div class="keyboard-scene">
+            <div class="keyboard-device">
+                <!-- Верхняя часть корпуса -->
+                <div class="kbd-top">
+                    <div class="kbd-lamp" id="kbd-lamp" title="Сигнальная лампа открытия"></div>
+                    <div class="kbd-brand">ЗКЭ-4-10</div>
+                    <div class="kbd-led" id="kbd-led" title="Индикатор питания"></div>
+                </div>
+
+                <!-- Кнопки -->
+                <div class="keyboard-grid" id="keyboard-grid">
+                    <button class="key" data-key="1"><span>1</span></button>
+                    <button class="key" data-key="2"><span>2</span></button>
+                    <button class="key" data-key="3"><span>3</span></button>
+                    <button class="key" data-key="4"><span>4</span></button>
+                    <button class="key" data-key="5"><span>5</span></button>
+                    <button class="key" data-key="6"><span>6</span></button>
+                    <button class="key" data-key="7"><span>7</span></button>
+                    <button class="key" data-key="8"><span>8</span></button>
+                    <button class="key" data-key="9"><span>9</span></button>
+                    <button class="key key-disabled" data-key="." disabled><span>·</span></button>
+                    <button class="key" data-key="0"><span>0</span></button>
+                    <button class="key key-reset" id="key-reset" title="Сброс"><span>СБРОС</span></button>
+                </div>
+            </div>
+        </div>
+
+        <div class="keyboard-footer">
+            <div class="code-display" id="code-display">
+                <span class="code-cell" data-slot="0">_</span>
+                <span class="code-cell" data-slot="1">_</span>
+                <span class="code-cell" data-slot="2">_</span>
+                <span class="code-cell" data-slot="3">_</span>
+            </div>
+            <p class="kbd-hint">Введите 4-значный код. Неверный код сбрасывает набор.</p>
+        </div>
+    </section>
+
+</main>
+
+<!-- ============ НИЖНЯЯ ПАНЕЛЬ / ЛОГ СОБЫТИЙ ============ -->
+<footer class="app-footer">
+    <div class="log-panel" id="log-panel">
+        <div class="log-header">
+            <span>Журнал событий</span>
+            <button id="btn-clear-log" class="log-clear">Очистить</button>
+        </div>
+        <ul class="log-list" id="log-list">
+            <li class="log-item log-info">Система готова. Введите код.</li>
+        </ul>
+    </div>
+
+    <div class="footer-actions">
+        <button id="btn-quiz" class="btn btn-primary btn-quiz">Итоговое тестирование</button>
+    </div>
+</footer>
+
+<!-- ============ МОДАЛЬНОЕ ОКНО: СПРАВКА ============ -->
+<div class="modal" id="modal-help" aria-hidden="true">
+    <div class="modal-backdrop" data-close></div>
+    <div class="modal-content">
+        <button class="modal-close" data-close aria-label="Закрыть">✕</button>
+        <h2>Справка: замок ЗКЭ-4-10</h2>
+        <div class="modal-body">
+            <p><strong>ЗКЭ-4-10</strong> — кодовый электронный замок, выпускавшийся в СССР в 1980-е годы. Устанавливался на дверях лабораторий, НИИ и административных помещений.</p>
+            <h3>Основные характеристики</h3>
+            <ul>
+                <li>Длина кода — <strong>4 цифры</strong></li>
+                <li>Элементная база — <strong>тиристоры</strong> (а не реле)</li>
+                <li>Питание — сеть <strong>220 В</strong> через трансформатор</li>
+                <li>Исполнительный механизм — <strong>электромагнит</strong></li>
+                <li>Резервное открытие — <strong>механический ключ</strong></li>
+            </ul>
+            <h3>Как играть</h3>
+            <ol>
+                <li>Введите 4-значный код на клавиатуре (код задаётся в начале — по умолчанию <strong>1·2·3·4</strong>).</li>
+                <li>Следите за подсветкой схемы: активные элементы выделяются цветом.</li>
+                <li>При верном коде срабатывает реле времени, и электромагнит отодвигает защёлку.</li>
+                <li>При неверной цифре — сброс и сигнал ошибки.</li>
+            </ol>
+            <p class="modal-note">Кнопка <strong>·</strong> на клавиатуре не задействована — так было и в оригинале.</p>
+        </div>
+    </div>
+</div>
+
+<!-- ============ МОДАЛЬНОЕ ОКНО: ТЕСТ ============ -->
+<div class="modal modal-quiz" id="modal-quiz" aria-hidden="true">
+    <div class="modal-backdrop" data-close-quiz></div>
+    <div class="modal-content modal-content-quiz">
+        <button class="modal-close" data-close-quiz aria-label="Закрыть">✕</button>
+        <div id="quiz-container">
+            <!-- Quiz рендерится из JS -->
+        </div>
+    </div>
+</div>
+
+<!-- ============ МОДАЛЬНОЕ ОКНО: ПОБЕДА ============ -->
+<div class="toast" id="toast" aria-live="polite"></div>
+
+<!-- ============ СКРИПТЫ ============ -->
+<script src="js/audio.js"></script>
+<script src="js/circuit.js"></script>
+<script src="js/keyboard.js"></script>
+<script src="js/quiz.js"></script>
+<script src="js/app.js"></script>
+
+<!-- Регистрация Service Worker -->
+<script>
+    if ('serviceWorker' in navigator) {
+        window.addEventListener('load', () => {
+            navigator.serviceWorker.register('sw.js')
+                .then(reg => console.log('[PWA] Service Worker зарегистрирован:', reg.scope))
+                .catch(err => console.warn('[PWA] Ошибка регистрации SW:', err));
+        });
+    }
+</script>
+
+</body>
+</html>