|
|
@@ -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>
|