Files
Learn_System/frontend/textbooks/physics8_electro.html
T
Maxim Dolgolyov dfe26a4771 fix(physics8): добавить /js/api.js в head — без него tracker молча отключается
Tracker проверяет 'LS.getToken()' перед каждым POST'ом. Без api.js
объект LS undefined, и tracker возвращает из syncToServer ничего не
делая. Поэтому в physics8_thermal/electro/optics прогресс не писался
вообще (ни last_para, ни mark_read).

Добавил <script src="/js/api.js" defer> перед xp.js во все 3 файла.

Chemistry-9 и physics-9 не затронуты — у них api.js уже подключён в
конце body перед tracker'ом.
2026-05-27 17:21:06 +03:00

5843 lines
388 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="ru" id="root">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Физика 8 — Электромагнитные явления</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
<script src="/js/api.js" defer></script>
<script src="/js/xp.js" defer></script>
<script src="/js/textbook-tracker.js" defer></script>
<script src="/js/textbook-xp-widget.js" defer></script>
<style>
/* ═══════════ ДИЗАЙН-ТОКЕНЫ v2 ═══════════ */
:root{
/* Палитра — 9 ступеней */
--pri-50:#eff6ff; --pri-100:#dbeafe; --pri-200:#bfdbfe; --pri-300:#93c5fd;
--pri-400:#60a5fa; --pri-500:#3b82f6; --pri-600:#2563eb; --pri-700:#1d4ed8;
--pri-800:#1e40af; --pri-900:#1e3a8a;
--acc-300:#a5b4fc; --acc-400:#818cf8; --acc-500:#6366f1; --acc-600:#4f46e5; --acc-700:#4338ca;
--pri:var(--pri-600); --acc:var(--acc-500);
/* Статусы */
--ok:#16a34a; --ok-bg:#dcfce7; --ok-border:#86efac;
--fail:#dc2626; --fail-bg:#fee2e2; --fail-border:#fca5a5;
--warn:#d97706; --warn-bg:#fef3c7;
/* Поверхности */
--bg:#eff6ff; --card:#fff;
--surface-1:#ffffff; --surface-2:#eff6ff; --surface-3:#dbeafe;
--text:#1e293b; --muted:#64748b; --border:#dbeafe;
--glass-bg:rgba(255,255,255,.65); --glass-border:rgba(255,255,255,.4);
/* Тени и свечение */
--sh:0 2px 10px rgba(37,99,235,.08);
--shadow-sm:0 1px 2px rgba(15,23,42,.06);
--shadow-md:0 4px 14px rgba(15,23,42,.08);
--shadow-lg:0 12px 32px rgba(15,23,42,.10);
--shadow-glow:0 0 24px rgba(37,99,235,.25);
--shadow-pop:0 8px 22px rgba(37,99,235,.16);
/* Радиусы */
--r-sm:8px; --r-md:12px; --r-lg:16px; --r-xl:22px; --r-full:999px;
/* Анимации */
--ease:cubic-bezier(.4,0,.2,1);
--ease-out:cubic-bezier(.16,1,.3,1);
--ease-bounce:cubic-bezier(.34,1.56,.64,1);
--dur-1:.16s; --dur-2:.22s; --dur-3:.36s; --dur-4:.56s;
}
html.dark{
--bg:#0f172a; --card:#1e293b;
--surface-1:#1e293b; --surface-2:#0f172a; --surface-3:#1e3a5f;
--text:#e2e8f0; --muted:#94a3b8; --border:#1e3a5f;
--glass-bg:rgba(30,41,59,.6); --glass-border:rgba(255,255,255,.08);
--ok:#22c55e; --ok-bg:rgba(34,197,94,.12); --ok-border:rgba(34,197,94,.3);
--fail:#f87171; --fail-bg:rgba(248,113,113,.12); --fail-border:rgba(248,113,113,.3);
--shadow-sm:0 1px 2px rgba(0,0,0,.4);
--shadow-md:0 4px 14px rgba(0,0,0,.5);
--shadow-lg:0 12px 32px rgba(0,0,0,.6);
--shadow-glow:0 0 28px rgba(96,165,250,.35);
--shadow-pop:0 8px 22px rgba(37,99,235,.4);
}
@media (prefers-reduced-motion: reduce){
*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}
}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Outfit',system-ui,sans-serif;background:var(--bg);color:var(--text);overflow-x:hidden}
::-webkit-scrollbar{width:5px;height:5px}
::-webkit-scrollbar-thumb{background:var(--border);border-radius:99px}
/* ═══════════ PARA-HERO ═══════════ */
.para-hero{border-radius:18px;padding:22px 24px;margin-bottom:22px;color:#fff;position:relative;overflow:hidden}
.para-hero::after{content:'';position:absolute;right:-30px;top:-30px;width:160px;height:160px;
border-radius:50%;background:rgba(255,255,255,.1);pointer-events:none}
.ph-num{font-size:.72rem;font-weight:700;opacity:.75;letter-spacing:.1em;text-transform:uppercase;margin-bottom:5px}
.ph-title{font-size:1.15rem;font-weight:900;line-height:1.3}
.ph-12{background:linear-gradient(135deg,#b45309,#f59e0b)}
.ph-12::after{background:#fde68a}
.ph-13{background:linear-gradient(135deg,#9d174d,#ec4899)}
.ph-13::after{background:#fbcfe8}
.ph-14{background:linear-gradient(135deg,#0e7490,#22d3ee);color:#1c1917}
.ph-14::after{background:#a5f3fc}
.ph-15{background:linear-gradient(135deg,#3730a3,#818cf8)}
.ph-15::after{background:#c7d2fe}
.ph-16{background:linear-gradient(135deg,#6d28d9,#c4b5fd)}
.ph-16::after{background:#ede9fe}
.ph-17{background:linear-gradient(135deg,#1d4ed8,#60a5fa)}
.ph-17::after{background:#bfdbfe}
.ph-18{background:linear-gradient(135deg,#0369a1,#38bdf8)}
.ph-18::after{background:#bae6fd}
.ph-19{background:linear-gradient(135deg,#92400e,#fbbf24)}
.ph-19::after{background:#fde68a}
.ph-20{background:linear-gradient(135deg,#c2410c,#fb923c)}
.ph-20::after{background:#ffedd5}
.ph-21{background:linear-gradient(135deg,#065f46,#34d399)}
.ph-21::after{background:#a7f3d0}
.ph-22{background:linear-gradient(135deg,#1e3a8a,#3b82f6)}
.ph-22::after{background:#bfdbfe}
.ph-23{background:linear-gradient(135deg,#374151,#9ca3af)}
.ph-23::after{background:#e7e5e4}
.ph-24{background:linear-gradient(135deg,#164e63,#67e8f9);color:#1c1917}
.ph-24::after{background:#cffafe}
.ph-25{background:linear-gradient(135deg,#0c4a6e,#7dd3fc)}
.ph-25::after{background:#e0f2fe}
.ph-26{background:linear-gradient(135deg,#78350f,#d97706)}
.ph-26::after{background:#fde68a}
.ph-27{background:linear-gradient(135deg,#166534,#4ade80)}
.ph-27::after{background:#bbf7d0}
.ph-28{background:linear-gradient(135deg,#0f2027,#2c5364)}
.ph-28::after{background:#a5f3fc}
.ph-29{background:linear-gradient(135deg,#2e1065,#7c3aed)}
.ph-29::after{background:#ede9fe}
.ph-30{background:linear-gradient(135deg,#1e1b4b,#4338ca)}
.ph-30::after{background:#c7d2fe}
.ph-31{background:linear-gradient(135deg,#064e3b,#0891b2)}
.ph-31::after{background:#a7f3d0}
/* ═══════════ ТЕОРИЯ ═══════════ */
.section-title{font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.14em;
color:var(--pri);display:flex;align-items:center;gap:8px;margin-bottom:16px}
.section-title::before{content:'';display:block;width:16px;height:2px;background:var(--pri);border-radius:1px}
.def-box{background:rgba(29,78,216,.05);border-left:4px solid var(--pri);border-radius:10px;
padding:12px 16px;margin-bottom:16px;font-size:.88rem;line-height:1.8}
html.dark .def-box{background:rgba(29,78,216,.09)}
.formula-box{background:var(--card);border:2px solid var(--border);border-radius:14px;
padding:16px 20px;margin-bottom:16px;box-shadow:var(--sh)}
.formula-box .main-f{font-size:1.05rem;font-weight:700;text-align:center;padding:10px;
background:rgba(29,78,216,.06);border-radius:8px;margin:8px 0}
html.dark .formula-box .main-f{background:rgba(29,78,216,.12)}
.info-row{display:flex;gap:10px;align-items:flex-start;padding:10px 14px;
background:var(--card);border:1px solid var(--border);border-radius:10px;margin-bottom:10px;font-size:.85rem;line-height:1.7}
.ovr-card{background:var(--card);border:1px solid var(--border);border-radius:14px;
padding:16px 18px;margin-bottom:14px;box-shadow:var(--sh)}
/* ═══════════ CANVAS ═══════════ */
canvas{width:100%;border-radius:10px;background:var(--card);display:block}
.ctrl-row{display:flex;align-items:center;gap:10px;margin:8px 0;flex-wrap:wrap;font-size:.83rem}
.slider-row{display:flex;align-items:center;gap:10px;margin:8px 0;font-size:.82rem;flex-wrap:wrap}
.slider-lbl{min-width:100px;font-weight:600;color:var(--text);flex-shrink:0}
.slider-val{min-width:72px;font-weight:800;color:var(--pri);font-family:monospace;font-size:.82rem}
input[type=range]{flex:1;min-width:100px;accent-color:var(--pri);cursor:pointer}
/* ═══════════ ЗАДАЧИ: ПИЛЮЛИ ═══════════ */
.para-pills{display:flex;flex-wrap:wrap;gap:6px;padding:14px;background:var(--card);
border-bottom:1px solid var(--border);border-radius:14px 14px 0 0;margin-bottom:0}
.para-pill{padding:6px 13px;border:2px solid var(--border);border-radius:9px;font-size:.72rem;
font-weight:700;cursor:pointer;white-space:nowrap;background:var(--card);color:var(--muted);transition:.16s}
.para-pill:hover{border-color:var(--pri);color:var(--pri)}
.para-pill.active{background:var(--pri);color:#fff;border-color:var(--pri)}
/* ═══════════ ЗАДАЧИ: ДВИЖОК ═══════════ */
.score-bar{display:flex;gap:10px;align-items:center;margin-bottom:12px;font-size:.85rem;font-weight:600;flex-wrap:wrap}
.chip{padding:5px 13px;border-radius:50px;display:inline-flex;align-items:center;gap:5px}
.chip-ok{background:var(--ok-bg);color:#166534}
html.dark .chip-ok{color:#86efac}
.chip-tot{background:var(--card);color:var(--muted);border:1px solid var(--border)}
.prog-wrap{width:100%;height:6px;background:var(--border);border-radius:3px;overflow:hidden;margin-bottom:14px}
.prog-fill{height:100%;background:linear-gradient(90deg,var(--pri),var(--acc));border-radius:3px;transition:width .4s}
.nav-dots{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:14px}
.nav-dot{min-width:30px;height:30px;padding:0 6px;border-radius:7px;border:2px solid var(--border);
background:var(--card);font-size:.72rem;font-weight:700;cursor:pointer;display:grid;place-items:center;
transition:.15s;color:var(--muted);font-family:monospace}
.nav-dot:hover{border-color:var(--pri);color:var(--pri)}
.nav-dot.nd-cur{background:var(--pri);border-color:var(--pri);color:#fff}
.nav-dot.nd-ok{background:var(--ok-bg);border-color:var(--ok);color:#166534}
.nav-dot.nd-fail{background:var(--fail-bg);border-color:var(--fail);color:#991b1b}
.task-card{background:var(--card);border:1px solid var(--border);border-radius:14px;
padding:20px 22px;box-shadow:var(--sh);margin-bottom:12px}
.task-num{font-size:.72rem;font-weight:700;color:var(--acc);text-transform:uppercase;
letter-spacing:.06em;margin-bottom:6px}
.task-text{font-size:.96rem;font-weight:700;line-height:1.85;margin-bottom:14px}
.task-hint{font-size:.8rem;color:var(--muted);margin-bottom:12px;display:flex;align-items:flex-start;gap:6px}
.task-hint i{margin-top:2px;color:var(--warn);flex-shrink:0}
.ans-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.ans-inp{width:120px;padding:11px 10px;border:2px solid var(--border);border-radius:10px;
font-size:1.05rem;font-family:monospace;text-align:center;outline:none;
background:var(--card);color:var(--text);transition:.18s}
.ans-inp:focus{border-color:var(--pri);box-shadow:0 0 0 3px rgba(29,78,216,.12)}
.unit-lbl{font-size:.82rem;color:var(--muted);font-weight:600;white-space:nowrap}
.btn{padding:10px 18px;border:none;border-radius:10px;font-weight:700;font-size:.84rem;
cursor:pointer;transition:.18s;display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.btn:active{transform:scale(.96)}
.btn-pri{background:var(--pri);color:#fff}
.btn-pri:hover{filter:brightness(1.1)}
.btn-ghost{background:transparent;border:2px solid var(--border);color:var(--muted)}
.btn-ghost:hover{border-color:var(--pri);color:var(--pri)}
.btn-next{background:var(--ok);color:#fff}
.btn-next:hover{filter:brightness(1.1)}
.mcq-opts{display:flex;flex-direction:column;gap:8px;margin-top:4px}
.opt-btn{width:100%;text-align:left;padding:11px 16px;border:2px solid var(--border);border-radius:10px;
background:var(--card);color:var(--text);font-size:.9rem;font-weight:500;cursor:pointer;
transition:.18s;line-height:1.5;font-family:inherit}
.opt-btn:hover:not(:disabled){border-color:var(--pri);background:rgba(29,78,216,.05)}
.opt-btn:disabled{cursor:default}
.opt-btn.mcq-cor{border-color:var(--ok)!important;background:var(--ok-bg)!important;color:#166534!important;font-weight:700}
.opt-btn.mcq-wrong{border-color:var(--fail)!important;background:var(--fail-bg)!important;color:#991b1b!important}
.feedback{padding:13px 18px;border-radius:11px;font-size:.87rem;font-weight:600;
display:none;line-height:1.7;margin-top:10px}
.feedback.show{display:block;animation:pop .25s ease}
.fb-ok{background:var(--ok-bg);color:#166534}
html.dark .fb-ok{color:#86efac}
.fb-fail{background:var(--fail-bg);color:#991b1b}
html.dark .fb-fail{color:#fca5a5}
@keyframes pop{from{opacity:0;transform:scale(.94)}to{opacity:1;transform:scale(1)}}
.summary{background:var(--card);border:1px solid var(--border);border-radius:16px;
padding:28px;text-align:center;box-shadow:var(--sh);display:none}
.summary.show{display:block;animation:pop .35s ease}
.summary h2{font-size:1.2rem;font-weight:800;margin-bottom:8px}
.big-score{font-size:3.5rem;font-weight:900;color:var(--pri);line-height:1;margin:10px 0}
.sum-grade{color:var(--muted);font-size:.9rem;margin-bottom:20px}
.sum-btns{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
/* ═══════════ СПРАВОЧНИК (таблица ρ) ═══════════ */
.ref-tbl{width:100%;border-collapse:collapse;font-size:.78rem;margin:4px 0 10px}
.ref-tbl td{padding:4px 8px;border:1px solid var(--border)}
.ref-tbl tr:nth-child(odd) td{background:rgba(37,99,235,.04)}
/* ═══════════ PTAB ═══════════ */
[id^="ptab-"]{display:none;padding:14px}
/* ── Карточки формул ── */
.formula-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:20px}
@media(max-width:560px){.formula-grid{grid-template-columns:1fr}}
.fcard{background:var(--card);border:2px solid var(--border);border-radius:14px;padding:16px 18px;box-shadow:var(--sh);transition:transform .18s,box-shadow .18s}
.fcard:hover{transform:translateY(-2px);box-shadow:0 6px 22px rgba(29,78,216,.1)}
.fcard.highlight{border-color:var(--pri);background:linear-gradient(135deg,rgba(29,78,216,.04),rgba(249,115,22,.04))}
.fcard h3{font-size:.8rem;font-weight:700;color:var(--pri);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px}
.fcard .main-f{font-size:1.05rem;font-weight:700;text-align:center;margin:8px 0;padding:10px;background:rgba(29,78,216,.06);border-radius:9px}
.fcard p{font-size:.83rem;color:var(--muted);line-height:1.7;margin-top:6px}
.fcard ul{font-size:.83rem;color:var(--muted);line-height:1.8;padding-left:18px;margin-top:6px}
/* ── Интерактивные диаграммы ── */
.idiag{background:var(--card);border:2px solid var(--border);border-radius:14px;padding:16px 18px;margin:14px 0;box-shadow:var(--sh)}
.idiag h3{font-size:.79rem;font-weight:700;color:var(--pri);text-transform:uppercase;letter-spacing:.05em;margin-bottom:12px;display:flex;align-items:center;gap:6px}
.idiag-2col{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:14px 0}
@media(max-width:560px){.idiag-2col{grid-template-columns:1fr}}
.idiag-result{background:rgba(29,78,216,.08);border-radius:10px;padding:10px 14px;margin-top:10px;font-size:.9rem;font-weight:700;text-align:center;letter-spacing:.02em;border:1px solid rgba(29,78,216,.15)}
.slider-lbl{min-width:90px;font-weight:600;color:var(--text);flex-shrink:0;font-size:.82rem}
.slider-val{min-width:72px;font-weight:800;color:var(--pri);font-size:.82rem;flex-shrink:0}
/* ── Запомни! ── */
.remember-box{background:linear-gradient(135deg,rgba(29,78,216,.06),rgba(29,78,216,.03));border:2px solid rgba(29,78,216,.3);border-radius:13px;padding:14px 17px;margin:16px 0}
.remember-box-title{font-weight:800;font-size:.82rem;color:#b91c1c;margin-bottom:8px;display:flex;align-items:center;gap:7px}
html.dark .remember-box{border-color:rgba(29,78,216,.4);background:rgba(29,78,216,.07)}
html.dark .remember-box-title{color:#fca5a5}
.remember-box ul,.remember-box p{font-size:.83rem;color:var(--text);line-height:1.9;margin:0}
.remember-box ul{padding-left:18px}
.remember-box li{margin-bottom:3px}
/* ── Частые ошибки ── */
.mistakes-box{background:linear-gradient(135deg,rgba(245,158,11,.06),rgba(251,191,36,.03));border:2px solid rgba(245,158,11,.35);border-radius:13px;padding:14px 17px;margin:16px 0}
.mistakes-box-title{font-weight:800;font-size:.82rem;color:#92400e;margin-bottom:8px;display:flex;align-items:center;gap:7px}
html.dark .mistakes-box-title{color:#fcd34d}
.mistakes-box ul{padding-left:18px;margin:0}
.mistakes-box li{font-size:.83rem;color:var(--text);line-height:1.9}
/* ── Объяснение по-человечески ── */
.student-box{background:linear-gradient(135deg,rgba(254,243,199,.7),rgba(255,237,213,.7));border:1.5px solid #f59e0b;border-radius:14px;padding:16px 18px;margin:16px 0;line-height:1.75}
html.dark .student-box{background:linear-gradient(135deg,rgba(120,80,0,.18),rgba(100,50,0,.18));border-color:#d97706}
.student-box-title{font-weight:800;font-size:.88rem;color:#92400e;margin-bottom:10px;display:flex;align-items:center;gap:7px}
html.dark .student-box-title{color:#fbbf24}
.student-box p{margin:0 0 9px;font-size:.84rem;color:var(--text)}
.student-box p:last-child{margin-bottom:0}
.student-box b{color:#92400e}
html.dark .student-box b{color:#fbbf24}
/* ── Инсайт ── */
.insight-box{background:linear-gradient(135deg,rgba(29,78,216,.07),rgba(249,115,22,.04));border:2px solid rgba(29,78,216,.22);border-radius:13px;padding:14px 17px;margin:16px 0}
.insight-title{font-weight:800;font-size:.82rem;color:var(--pri);margin-bottom:7px;display:flex;align-items:center;gap:7px}
.insight-box p{font-size:.83rem;color:var(--text);line-height:1.8;margin:0 0 6px}
/* ── Примеры из жизни ── */
.life-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:10px;margin:14px 0}
.life-item{background:var(--card);border:1.5px solid var(--border);border-radius:12px;padding:12px 10px;text-align:center}
.life-item .li-icon{font-size:1.9rem;margin-bottom:5px}
.life-item .li-title{font-size:.79rem;font-weight:700;color:var(--text);margin-bottom:3px}
.life-item .li-desc{font-size:.71rem;color:var(--muted);line-height:1.55}
/* ── Para-hero доп. элементы ── */
.para-hero .ph-formula{display:inline-block;font-size:1rem;background:rgba(255,255,255,.17);border-radius:10px;padding:7px 16px;margin:2px 0 8px;font-weight:700;border:1px solid rgba(255,255,255,.22)}
.para-hero .ph-desc{font-size:.79rem;opacity:.87;line-height:1.65;margin-bottom:10px}
.para-hero .ph-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.para-hero .ph-tag{background:rgba(255,255,255,.17);border:1px solid rgba(255,255,255,.25);border-radius:20px;padding:3px 11px;font-size:.7rem;font-weight:700}
.para-hero .ph-label{font-size:.7rem;font-weight:700;opacity:.75;letter-spacing:.1em;text-transform:uppercase;margin-bottom:5px}
.para-hero h2{font-size:1.12rem;font-weight:900;margin-bottom:8px;line-height:1.3}
/* ── Разделитель ── */
hr.divider{border:none;border-top:1px solid var(--border);margin:20px 0}
/* ── Шаги решения ── */
.sol-steps{list-style:none;padding:0;margin:8px 0}
.sol-steps li{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px;font-size:.86rem;line-height:1.75}
.step-n{min-width:24px;height:24px;border-radius:50%;background:var(--pri);color:#fff;font-size:.69rem;font-weight:800;display:grid;place-items:center;margin-top:1px;flex-shrink:0}
/* ═══════════════════════════════════════════════ */
/* ═══════════ PRO MAX UPGRADE ═════════════════ */
/* ═══════════════════════════════════════════════ */
/* ── Body тонкий фоновый градиент ── */
body{background:radial-gradient(1200px 600px at 80% -10%,rgba(99,102,241,.10),transparent 60%),radial-gradient(900px 500px at -10% 30%,rgba(37,99,235,.07),transparent 55%),var(--bg)}
html.dark body{background:radial-gradient(1200px 600px at 80% -10%,rgba(37,99,235,.20),transparent 60%),radial-gradient(900px 500px at -10% 30%,rgba(99,102,241,.12),transparent 55%),var(--bg)}
/* ── A5. Motion: появление секций ── */
.fx-rise{opacity:0;transform:translateY(18px);transition:opacity var(--dur-3) var(--ease-out),transform var(--dur-3) var(--ease-out)}
.fx-rise.is-in{opacity:1;transform:none}
.fx-stagger>*{opacity:0;transform:translateY(12px);transition:opacity var(--dur-3) var(--ease-out),transform var(--dur-3) var(--ease-out)}
.fx-stagger.is-in>*{opacity:1;transform:none}
.fx-stagger.is-in>*:nth-child(1){transition-delay:0ms}
.fx-stagger.is-in>*:nth-child(2){transition-delay:60ms}
.fx-stagger.is-in>*:nth-child(3){transition-delay:120ms}
.fx-stagger.is-in>*:nth-child(4){transition-delay:180ms}
.fx-stagger.is-in>*:nth-child(5){transition-delay:240ms}
.fx-stagger.is-in>*:nth-child(6){transition-delay:300ms}
/* ── A4. Типографика fluid + gradient ── */
.section-title{font-size:clamp(.68rem,.62rem + .25vw,.78rem)}
.fcard h3{font-size:clamp(.78rem,.72rem + .3vw,.92rem)}
.task-text{font-size:clamp(.92rem,.86rem + .35vw,1.05rem)}
.para-hero h2{font-size:clamp(1.1rem,.95rem + .8vw,1.5rem);background:linear-gradient(135deg,#fff,rgba(255,255,255,.78));-webkit-background-clip:text;background-clip:text;color:transparent;text-shadow:0 2px 18px rgba(0,0,0,.18)}
.ph-14 h2,.ph-24 h2{background:linear-gradient(135deg,#1c1917,#3f3f46);-webkit-background-clip:text;background-clip:text;color:transparent;text-shadow:none}
/* KaTeX inline подсветка */
.katex{font-size:1.02em}
.katex-html{padding:0 .15em;border-radius:5px;transition:background var(--dur-1) var(--ease)}
.def-box .katex-html:hover,.task-text .katex-html:hover,.fcard .katex-html:hover{background:rgba(37,99,235,.08)}
/* ── A2. Para-hero v2: SVG-узор + параллакс + glow ── */
.para-hero{box-shadow:var(--shadow-lg),0 0 50px rgba(37,99,235,.18);position:relative;isolation:isolate;transform:translateZ(0);transition:transform var(--dur-2) var(--ease)}
.para-hero::before{content:'';position:absolute;inset:0;z-index:-1;opacity:.32;mix-blend-mode:overlay;
background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='140' height='80' viewBox='0 0 140 80'><g fill='none' stroke='%23ffffff' stroke-width='1.2' opacity='0.55'><path d='M0 20 Q35 0 70 20 T140 20'/><path d='M0 40 Q35 20 70 40 T140 40'/><path d='M0 60 Q35 40 70 60 T140 60'/></g></svg>")}
.para-hero::after{transition:transform .5s var(--ease-out);transform:translate(var(--phx,0),var(--phy,0))}
.para-hero:hover{transform:translateY(-2px)}
.para-hero:hover::after{transform:translate(var(--phx,0),var(--phy,0)) scale(1.1)}
.para-hero .ph-glow{position:absolute;left:-10%;bottom:-40%;width:60%;height:120%;background:radial-gradient(closest-side,rgba(255,255,255,.32),transparent);pointer-events:none;z-index:-1;animation:phPulse 4s ease-in-out infinite alternate}
@keyframes phPulse{from{opacity:.6;transform:scale(.92)}to{opacity:.95;transform:scale(1.06)}}
.ph-badge{position:absolute;top:14px;right:16px;background:rgba(255,255,255,.22);border:1px solid rgba(255,255,255,.4);border-radius:var(--r-full);padding:4px 10px;font-size:.68rem;font-weight:800;letter-spacing:.05em;backdrop-filter:blur(6px);z-index:1}
.ph-14 .ph-badge,.ph-24 .ph-badge{background:rgba(0,0,0,.12);border-color:rgba(0,0,0,.15);color:#1c1917}
/* ── A3. Карточки формул v2 ── */
.fcard{transition:transform var(--dur-2) var(--ease-out),box-shadow var(--dur-2) var(--ease-out),border-color var(--dur-2) var(--ease);position:relative;overflow:hidden;backdrop-filter:blur(8px);background:linear-gradient(180deg,var(--card),color-mix(in srgb,var(--card) 96%,var(--pri-300)))}
.fcard::before{content:'';position:absolute;inset:0;background:radial-gradient(220px circle at var(--mx,50%) var(--my,0%),rgba(37,99,235,.10),transparent 60%);opacity:0;transition:opacity var(--dur-2) var(--ease);pointer-events:none}
.fcard:hover{transform:translateY(-3px) scale(1.005);box-shadow:var(--shadow-pop);border-color:var(--pri-400)}
.fcard:hover::before{opacity:1}
.fcard .main-f{transition:transform var(--dur-2) var(--ease-bounce)}
.fcard:hover .main-f{transform:scale(1.03)}
html.dark .fcard{background:linear-gradient(180deg,var(--card),color-mix(in srgb,var(--card) 92%,var(--pri-700)))}
/* Семантические бордеры для разных типов карточек */
.fcard.is-def{border-color:var(--pri-400)}
.fcard.is-law{border-color:#0891b2}
.fcard.is-formula{border-color:#a16207}
.fcard.is-rule{border-color:#7c3aed}
/* ── Кнопки v2: ripple + улучшенные ── */
.btn{transition:transform var(--dur-1) var(--ease-bounce),box-shadow var(--dur-2) var(--ease),filter var(--dur-2) var(--ease),background var(--dur-2) var(--ease);position:relative;overflow:hidden}
.btn-pri{background:linear-gradient(135deg,var(--pri-500),var(--pri-700));box-shadow:0 4px 14px rgba(37,99,235,.3)}
.btn-pri:hover{box-shadow:0 6px 20px rgba(37,99,235,.45);transform:translateY(-1px)}
.btn-next{background:linear-gradient(135deg,#16a34a,#15803d);box-shadow:0 4px 14px rgba(22,163,74,.3)}
.btn-next:hover{box-shadow:0 6px 20px rgba(22,163,74,.45);transform:translateY(-1px)}
.btn::after{content:'';position:absolute;inset:0;background:radial-gradient(circle at var(--rx,50%) var(--ry,50%),rgba(255,255,255,.6),transparent 40%);opacity:0;transition:opacity var(--dur-3) var(--ease);pointer-events:none}
.btn.is-ripple::after{opacity:1;animation:rippleOut .55s var(--ease-out) forwards}
@keyframes rippleOut{from{opacity:.5;transform:scale(.4)}to{opacity:0;transform:scale(2.2)}}
/* ── Табы v2 (sidebar-only, no hover lift) ── */
.tab{transition:background var(--dur-2) var(--ease),color var(--dur-2) var(--ease);position:relative}
.tab.active{box-shadow:none}
/* Pills параграфов в задачах */
.para-pill{transition:all var(--dur-1) var(--ease)}
.para-pill:hover{transform:translateY(-1px);box-shadow:var(--shadow-sm)}
.para-pill.active{box-shadow:0 3px 10px rgba(37,99,235,.3)}
/* ── Nav-dots v2: пульс активного ── */
.nav-dot{transition:transform var(--dur-1) var(--ease),box-shadow var(--dur-2) var(--ease),background var(--dur-2) var(--ease)}
.nav-dot:hover{transform:scale(1.08)}
.nav-dot.nd-cur{box-shadow:0 0 0 4px rgba(37,99,235,.18),0 4px 12px rgba(37,99,235,.3);animation:dotPulse 2.4s ease-in-out infinite}
@keyframes dotPulse{0%,100%{box-shadow:0 0 0 4px rgba(37,99,235,.18),0 4px 12px rgba(37,99,235,.3)}50%{box-shadow:0 0 0 7px rgba(37,99,235,.08),0 4px 14px rgba(37,99,235,.4)}}
/* ── Task-card v2 ── */
.task-card{transition:box-shadow var(--dur-2) var(--ease);background:linear-gradient(180deg,var(--card),color-mix(in srgb,var(--card) 95%,var(--pri-300)))}
.task-card:focus-within{box-shadow:var(--shadow-pop),0 0 0 3px rgba(37,99,235,.15)}
.ans-inp{transition:border-color var(--dur-2) var(--ease),box-shadow var(--dur-2) var(--ease),transform var(--dur-1) var(--ease)}
.ans-inp:focus{transform:scale(1.02)}
/* ── Feedback v2: с иконкой и slide ── */
.feedback{border-left:4px solid transparent;backdrop-filter:blur(4px)}
.fb-ok{border-left-color:var(--ok);background:linear-gradient(135deg,var(--ok-bg),color-mix(in srgb,var(--ok-bg) 70%,transparent))}
.fb-fail{border-left-color:var(--fail);background:linear-gradient(135deg,var(--fail-bg),color-mix(in srgb,var(--fail-bg) 70%,transparent))}
/* ── Канвас-контейнер v2 ── */
.idiag{transition:border-color var(--dur-2) var(--ease),box-shadow var(--dur-2) var(--ease)}
.idiag:hover{border-color:var(--pri-400);box-shadow:var(--shadow-md)}
canvas{transition:filter var(--dur-2) var(--ease)}
/* Подпись под канвасом */
.cv-cap{font-size:.74rem;color:var(--muted);margin-top:8px;line-height:1.6;display:flex;align-items:flex-start;gap:6px}
.cv-cap i{color:var(--pri);margin-top:2px;flex-shrink:0}
/* ── Чипы значений интерактивов ── */
.val-chip{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:var(--r-full);background:rgba(37,99,235,.1);color:var(--pri-700);font-weight:800;font-family:monospace;font-size:.78rem;border:1px solid rgba(37,99,235,.2);transition:all var(--dur-1) var(--ease)}
html.dark .val-chip{color:var(--pri-300);background:rgba(37,99,235,.18);border-color:rgba(37,99,235,.3)}
/* ── Скролл — плавный ── */
html{scroll-behavior:smooth}
/* ── Hint для канваса при касании/hover ── */
.cv-hint{position:absolute;top:8px;right:8px;background:rgba(0,0,0,.45);color:#fff;padding:3px 9px;border-radius:var(--r-full);font-size:.65rem;font-weight:700;pointer-events:none;backdrop-filter:blur(4px);letter-spacing:.04em;text-transform:uppercase;opacity:.9}
/* ── Hover на iconified элементах ── */
.life-item{transition:transform var(--dur-2) var(--ease-out),box-shadow var(--dur-2) var(--ease),border-color var(--dur-2) var(--ease)}
.life-item:hover{transform:translateY(-3px);box-shadow:var(--shadow-md);border-color:var(--pri-300)}
.life-item .li-icon{transition:transform var(--dur-2) var(--ease-bounce)}
.life-item:hover .li-icon{transform:scale(1.15) rotate(-4deg)}
/* ══════════════════════════════════════════
LAYOUT v2 — Sidebar + Main col
══════════════════════════════════════════ */
/* Base */
html,body{height:100%}
body{display:flex;flex-direction:column;overflow-x:hidden}
/* ── Header/hdr ── */
.hdr{flex-shrink:0;background:linear-gradient(135deg,#1e3a8a 0%,#2563eb 55%,#6366f1 100%);
padding:28px 28px 22px;position:relative;overflow:hidden;
border-bottom:2px solid rgba(99,102,241,.3);text-align:left}
.hdr::before{content:'ЭЛЕКТРО';position:absolute;right:-12px;top:-8%;
font-family:'Outfit',sans-serif;font-size:clamp(4rem,14vw,11rem);
font-weight:900;letter-spacing:-.05em;color:transparent;
-webkit-text-stroke:1.5px rgba(165,180,252,.09);line-height:1;
pointer-events:none;user-select:none;z-index:0}
.hdr::after{content:'';position:absolute;inset:0;pointer-events:none;z-index:0;
background:
radial-gradient(ellipse 55% 90% at 5% 60%,rgba(37,99,235,.18) 0%,transparent 60%),
radial-gradient(ellipse 45% 65% at 90% 20%,rgba(99,102,241,.14) 0%,transparent 55%)}
.hdr h1{font-family:'Outfit',sans-serif;font-size:clamp(1.4rem,4vw,2rem);
font-weight:900;letter-spacing:-.025em;color:#e8eeff;
position:relative;z-index:1;line-height:1.15;margin-bottom:0}
.hdr h1 i{color:#818cf8;margin-right:.25em}
.hdr p{font-family:'Outfit',sans-serif;font-size:.72rem;color:rgba(180,210,255,.8);
margin-top:10px;position:relative;z-index:1;letter-spacing:.07em;
font-weight:500;text-transform:uppercase}
/* ── Page Layout ── */
.page-layout{display:grid;grid-template-columns:230px 1fr;flex:1;min-height:0;overflow:hidden}
/* ── Sidebar ── */
.sidebar{position:static;height:100%;overflow-y:auto;overflow-x:hidden;
background:rgba(8,14,40,.99);border-right:1px solid rgba(99,102,241,.14);
scrollbar-width:thin;scrollbar-color:rgba(99,102,241,.2) transparent}
.sidebar::-webkit-scrollbar{width:3px}
.sidebar::-webkit-scrollbar-thumb{background:rgba(99,102,241,.22);border-radius:99px}
/* Sidebar brand */
.sb-brand{display:flex;align-items:center;gap:11px;padding:18px 14px 14px;
border-bottom:1px solid rgba(99,102,241,.12)}
.sb-logo{width:30px;height:30px;color:#818cf8;flex-shrink:0}
.sb-title{display:block;font-family:'Outfit',sans-serif;font-size:.88rem;
font-weight:800;color:#c7d2fe;letter-spacing:-.02em;line-height:1.1}
.sb-sub{display:block;font-family:'JetBrains Mono',monospace;font-size:.52rem;
color:rgba(129,140,248,.45);margin-top:3px;letter-spacing:.04em}
/* Chapter buttons */
.ch-bar{display:flex;flex-direction:column;padding:12px 10px 6px;gap:1px}
.ch-btn{display:flex;align-items:center;gap:9px;padding:9px 12px;border:none;
border-left:2.5px solid transparent;border-radius:7px;background:transparent;
font-family:'Outfit',sans-serif;font-size:.72rem;font-weight:700;
color:rgba(165,180,252,.7);cursor:pointer;text-align:left;width:100%;
transition:background .18s,color .18s,border-color .18s;letter-spacing:.02em}
.ch-btn:hover{background:rgba(99,102,241,.09);border-left-color:rgba(99,102,241,.25);color:#a5b4fc}
.ch-btn.active{background:rgba(99,102,241,.14);border-left-color:#818cf8;color:#c7d2fe}
.ch-icon-svg{width:14px;height:14px;flex-shrink:0;opacity:.55;transition:opacity .15s,color .15s}
.ch-btn.active .ch-icon-svg{opacity:1;color:#818cf8}
.ch-btn:hover .ch-icon-svg{opacity:.85}
.ch-roman{font-size:.68rem;color:rgba(129,140,248,.4);font-weight:400;font-style:italic;
flex-shrink:0;margin-left:auto}
.ch-btn.active .ch-roman{color:rgba(129,140,248,.55)}
/* Section tabs inside sidebar */
.sec-bar{padding:6px 10px 16px;border-top:1px solid rgba(99,102,241,.1)}
.sec-group{display:none;flex-direction:column;gap:1px}
.sec-group.show{display:flex}
.sidebar .tab{display:flex!important;align-items:baseline;gap:0;
text-align:left;border:none!important;
background:transparent!important;color:rgba(165,200,255,.65)!important;
border-radius:5px;padding:5px 10px;font-size:.73rem;white-space:normal;
line-height:1.3;box-shadow:none!important;cursor:pointer;
transition:background .15s,color .15s;width:100%;border-left:2px solid transparent!important}
.sidebar .tab:hover{background:rgba(99,102,241,.09)!important;color:#c7d2fe!important}
.sidebar .tab.active{background:rgba(99,102,241,.17)!important;color:#e0e7ff!important;
border-left-color:#818cf8!important;padding-left:8px!important;box-shadow:none!important}
.sidebar .tab.active::after{display:none!important}
.tab-num{font-family:'JetBrains Mono',monospace;font-size:.62rem;
color:rgba(129,140,248,.5);flex-shrink:0;min-width:30px;transition:color .15s}
.tab-name{font-family:'Outfit',sans-serif;font-size:.72rem;line-height:1.35;white-space:normal}
.sidebar .tab.active .tab-num{color:#818cf8}
.sidebar .tab:hover .tab-num{color:rgba(129,140,248,.8)}
/* ── Main content column ── */
.main-col{min-width:0;overflow-y:auto;overflow-x:hidden;height:100%}
.content-area{max-width:860px;margin:0 auto;padding:0 4px 40px}
.content{display:none;padding:20px 14px;animation:fadeUp .25s ease}
.content.active{display:block}
@keyframes fadeUp{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
/* ── Floating buttons ── */
.theme-btn{position:fixed;top:12px;right:12px;z-index:80;width:38px;height:38px;
border-radius:10px;background:rgba(255,255,255,.15);border:1px solid rgba(255,255,255,.2);
cursor:pointer;display:grid;place-items:center;font-size:1rem;
color:rgba(224,231,255,.8);box-shadow:none;transition:background .2s,color .2s}
.theme-btn:hover{background:rgba(255,255,255,.22);color:#fbbf24}
.ref-toggle{position:fixed;bottom:16px;right:16px;z-index:80;width:46px;height:46px;
border-radius:14px;background:var(--pri);color:#fff;border:none;cursor:pointer;
display:grid;place-items:center;font-size:1.15rem;
box-shadow:0 6px 18px rgba(37,99,235,.4),0 0 0 4px rgba(37,99,235,.08);
transition:transform var(--dur-2) var(--ease-bounce),box-shadow var(--dur-2) var(--ease)}
.ref-toggle:hover{transform:scale(1.06) rotate(-4deg);
box-shadow:0 10px 26px rgba(37,99,235,.55),0 0 0 6px rgba(37,99,235,.12)}
/* ── Ref-panel popup ── */
.ref-panel{position:fixed;bottom:72px;right:16px;z-index:78;width:310px;
max-height:72vh;overflow-y:auto;background:var(--card);
border:1px solid var(--border);border-radius:16px;padding:16px 18px;
box-shadow:0 12px 40px rgba(0,0,0,.18);display:none;
font-size:.8rem;line-height:1.85;scrollbar-width:thin}
.ref-panel.show{display:block;animation:pop .22s ease}
.ref-panel h3{font-family:'Outfit',sans-serif;font-size:.72rem;font-weight:800;
text-transform:uppercase;letter-spacing:.1em;color:var(--pri);margin:12px 0 5px}
.ref-panel h3:first-child{margin-top:0}
.ref-panel .rf{background:rgba(37,99,235,.07);border:1px solid rgba(37,99,235,.15);
border-radius:8px;padding:7px 12px;margin:3px 0;text-align:center}
html.dark .ref-panel .rf{background:rgba(99,102,241,.1);border-color:rgba(99,102,241,.2)}
@keyframes pop{from{opacity:0;transform:scale(.94)}to{opacity:1;transform:scale(1)}}
/* ── Responsive ── */
@media(max-width:768px){
.page-layout{grid-template-columns:1fr;flex:1;min-height:0;overflow:visible}
.sidebar{height:auto;overflow-y:visible;overflow-x:auto;border-right:none;
border-bottom:1px solid rgba(99,102,241,.15)}
.main-col{height:auto;overflow-y:visible}
.ch-bar{flex-direction:row;flex-wrap:nowrap;overflow-x:auto;padding:0 8px;
scrollbar-width:none;gap:0}
.ch-bar::-webkit-scrollbar{display:none}
.ch-btn{white-space:nowrap;border-left:none!important;width:auto;
border-bottom:2.5px solid transparent!important;padding:11px 12px;border-radius:0}
.ch-btn.active{border-left:none!important;border-bottom-color:#818cf8!important;
background:transparent;color:#a5b4fc}
.sec-bar{border-top:1px solid rgba(99,102,241,.12)}
.sec-group{flex-direction:row;flex-wrap:wrap}
.sidebar .tab{display:inline-flex!important;white-space:nowrap;
border:1px solid rgba(99,102,241,.2)!important;
background:rgba(99,102,241,.07)!important;
color:rgba(165,180,252,.55)!important;border-radius:7px!important;
padding:5px 11px!important;width:auto!important}
.hdr{padding:18px 16px 14px}
.hdr h1{font-size:1.3rem}
}
@media(max-width:480px){
.ref-panel{width:calc(100vw - 32px);right:16px}
}
/* ═══════════ KEY POINTS BLOCK ═══════════ */
.key-points{background:rgba(37,99,235,.08);border-left:4px solid #2563eb;padding:16px;margin:24px 0;border-radius:8px}
html.dark .key-points{background:rgba(37,99,235,.12)}
.key-points-title{font-weight:800;font-size:.85rem;color:var(--pri);margin-bottom:10px;display:flex;align-items:center;gap:6px;text-transform:uppercase;letter-spacing:.04em}
.key-points-list{list-style:none;padding-left:0;margin:0}
.key-points-list li{font-size:.84rem;color:var(--text);line-height:1.75;margin-bottom:7px;padding-left:20px;position:relative}
.key-points-list li:before{content:'▪';position:absolute;left:6px;color:var(--pri);font-weight:700}
/* ═══════════ REF PANEL TABS ═══════════ */
.ref-tabs{display:flex;gap:8px;margin-bottom:12px;border-bottom:1px solid var(--border);padding-bottom:10px}
.ref-tab-btn{padding:6px 12px;border:none;background:transparent;color:var(--muted);font-size:.78rem;font-weight:700;cursor:pointer;border-bottom:2px solid transparent;transition:.18s;text-transform:uppercase;letter-spacing:.04em}
.ref-tab-btn:hover{color:var(--text)}
.ref-tab-btn.active{color:var(--pri);border-bottom-color:var(--pri)}
.ref-tab-content{display:none}
.ref-tab-content.active{display:block}
/* ═══════════ FORMULA TABLE ═══════════ */
.formula-table{width:100%;border-collapse:collapse;font-size:.78rem;margin:10px 0}
.formula-table th{background:rgba(37,99,235,.12);padding:8px;text-align:left;font-weight:700;color:var(--pri);border:1px solid var(--border)}
.formula-table td{padding:8px;border:1px solid var(--border)}
.formula-table tr:nth-child(odd) td{background:rgba(37,99,235,.04)}
.formula-table tr:hover td{background:rgba(37,99,235,.08)}
@media(max-width:768px){
.formula-table{font-size:.7rem}
.formula-table th,.formula-table td{padding:6px}
}
</style>
</head>
<body>
<!-- Плавающие кнопки -->
<button class="theme-btn" id="themeBtn" title="Тема"><i class="fas fa-moon"></i></button>
<button class="ref-toggle" id="refToggle" title="Формулы"><i class="fas fa-bolt"></i></button>
<!-- Popup справочник -->
<div class="ref-panel" id="refPanel">
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid var(--border)">
<span style="font-size:.82rem;font-weight:800;color:var(--pri)">⚡ Справочник · §12–31</span>
<button onclick="document.getElementById('refPanel').classList.remove('show')"
style="background:none;border:none;cursor:pointer;color:var(--muted);font-size:1rem;line-height:1;padding:2px 4px;border-radius:5px" title="Закрыть"></button>
</div>
<!-- Вкладки -->
<div class="ref-tabs">
<button class="ref-tab-btn active" onclick="switchRefTab('para')">Параграф</button>
<button class="ref-tab-btn" onclick="switchRefTab('cheat')">Шпаргалка</button>
<button class="ref-tab-btn" onclick="switchRefTab('tasks')">Задачи</button>
</div>
<!-- Вкладка: Параграф -->
<div class="ref-tab-content active" id="reftab-para">
<h3>Заряд</h3>
<div style="background:rgba(29,78,216,.06);border-radius:9px;padding:10px 12px;margin-bottom:10px">
<div>$q = eN$, $e = 1{,}6 \times 10^{-19}$ Кл</div>
<div style="margin-top:4px">1 мКл=$10^{-3}$Кл; 1нКл=$10^{-9}$Кл; 1пКл=$10^{-12}$Кл</div>
</div>
<h3>Напряжение и работа</h3>
<div style="background:rgba(29,78,216,.06);border-radius:9px;padding:10px 12px;margin-bottom:10px">
<div>$U = A/q$ [В]; &nbsp;$A = qU$ [Дж]</div>
<div>1 В = 1 Дж/Кл</div>
</div>
<h3>Сила тока</h3>
<div style="background:rgba(29,78,216,.06);border-radius:9px;padding:10px 12px;margin-bottom:10px">
<div>$I = q/t$ [А]; &nbsp;$q = It$ [Кл]</div>
</div>
<h3>Закон Ома</h3>
<div style="background:rgba(29,78,216,.06);border-radius:9px;padding:10px 12px;margin-bottom:10px">
<div>$I = U/R$; &nbsp;$R = U/I$; &nbsp;$U = IR$</div>
<div>$R = \rho l/S$ &nbsp;($[\rho]$ = Ом·мм²/м)</div>
</div>
<h3>Последовательное соединение</h3>
<div style="background:rgba(29,78,216,.06);border-radius:9px;padding:10px 12px;margin-bottom:10px">
<div>$I = I_1 = I_2$; &nbsp;$U = U_1 + U_2$; &nbsp;$R = R_1 + R_2$</div>
</div>
<h3>Параллельное соединение</h3>
<div style="background:rgba(29,78,216,.06);border-radius:9px;padding:10px 12px;margin-bottom:10px">
<div>$U = U_1 = U_2$; &nbsp;$I = I_1 + I_2$</div>
<div>$\dfrac{1}{R} = \dfrac{1}{R_1} + \dfrac{1}{R_2}$</div>
</div>
<h3>Работа и мощность тока</h3>
<div style="background:rgba(29,78,216,.06);border-radius:9px;padding:10px 12px;margin-bottom:10px">
<div>$A = IUt = I^2Rt$ [Дж]</div>
<div>$P = IU = I^2R$ [Вт]</div>
<div>1 кВт·ч = $3{,}6 \times 10^6$ Дж</div>
</div>
<h3>Удельное сопротивление $\rho$, Ом·мм²/м</h3>
<table class="ref-tbl">
<thead><tr style="background:rgba(29,78,216,.08)"><th>Материал</th><th>$\rho$</th><th>Материал</th><th>$\rho$</th></tr></thead>
<tr><td>Медь</td><td>0,017</td><td>Алюминий</td><td>0,028</td></tr>
<tr><td>Вольфрам</td><td>0,055</td><td>Железо</td><td>0,10</td></tr>
<tr><td>Константан</td><td>0,50</td><td>Нихром</td><td>1,10</td></tr>
</table>
</div>
<!-- Вкладка: Шпаргалка -->
<div class="ref-tab-content" id="reftab-cheat">
<div style="font-size:.72rem;color:var(--muted);margin-bottom:8px">Все формулы главы — сверь с параграфом</div>
<div style="max-height:65vh;overflow-y:auto;">
<table class="formula-table">
<thead>
<tr><th>§</th><th>Формула</th><th>Описание</th><th>Ед.</th></tr>
</thead>
<tbody>
<tr><td>§15</td><td>$q = eN$</td><td>Заряд тела через элементарный заряд</td><td>Кл</td></tr>
<tr><td>§17</td><td>$U = A/q$</td><td>Напряжение — работа на единицу заряда</td><td>В</td></tr>
<tr><td>§18</td><td>$A = qU$</td><td>Работа электрического поля</td><td>Дж</td></tr>
<tr><td>§20</td><td>$I = q/t$</td><td>Сила тока — заряд в секунду</td><td>А</td></tr>
<tr><td>§22</td><td>$I = U/R$</td><td>Закон Ома для участка цепи</td><td>А</td></tr>
<tr><td>§22</td><td>$R = U/I$</td><td>Сопротивление через ток и напряжение</td><td>Ом</td></tr>
<tr><td>§23</td><td>$R = \rho l/S$</td><td>Сопротивление проводника</td><td>Ом</td></tr>
<tr><td>§24</td><td>$R = R_1 + R_2$</td><td>Последовательное соединение</td><td>Ом</td></tr>
<tr><td>§25</td><td>$\frac{1}{R} = \frac{1}{R_1} + \frac{1}{R_2}$</td><td>Параллельное соединение</td><td>Ом</td></tr>
<tr><td>§26</td><td>$P = UI = I^2R = U^2/R$</td><td>Мощность электрического тока</td><td>Вт</td></tr>
<tr><td>§26</td><td>$A = IUt = I^2Rt$</td><td>Работа тока за время t</td><td>Дж</td></tr>
<tr><td>§26</td><td>$Q = I^2Rt$</td><td>Закон Джоуля-Ленца — теплота</td><td>Дж</td></tr>
<tr><td>§27</td><td>1 кВт·ч = $3{,}6 \times 10^6$ Дж</td><td>Единица электроэнергии на счётчике</td><td>Дж</td></tr>
</tbody>
</table>
</div>
<div style="margin-top:10px">
<h3>Удельное сопротивление $\rho$, Ом·мм²/м</h3>
<table class="ref-tbl">
<thead><tr style="background:rgba(29,78,216,.08)"><th>Материал</th><th>$\rho$</th><th>Материал</th><th>$\rho$</th></tr></thead>
<tr><td>Серебро</td><td>0,016</td><td>Медь</td><td>0,017</td></tr>
<tr><td>Алюминий</td><td>0,028</td><td>Вольфрам</td><td>0,055</td></tr>
<tr><td>Железо</td><td>0,10</td><td>Константан</td><td>0,50</td></tr>
<tr><td colspan="2">Нихром</td><td colspan="2">1,10</td></tr>
</table>
</div>
</div>
<!-- Вкладка: Задачи -->
<div class="ref-tab-content" id="reftab-tasks">
<div style="font-size:.8rem;color:var(--muted);line-height:1.8">
<b style="color:var(--pri)">Алгоритм решения задач:</b>
<ol style="margin:8px 0 0 16px;font-size:.78rem">
<li>Записать условие, перевести единицы в СИ</li>
<li>Выбрать нужную формулу (см. Шпаргалку)</li>
<li>Выразить неизвестную, подставить числа</li>
<li>Проверить единицы измерения</li>
</ol>
<div style="margin-top:10px"><b style="color:var(--pri)">Типичные ошибки:</b></div>
<ul style="margin:6px 0 0 16px;font-size:.78rem">
<li>Путать Ом·мм²/м и Ом·м при $\rho$</li>
<li>Параллельное: $R < R_{min}$ не складывать!</li>
<li>$Q = I^2Rt$, но не $IRt$ — ток в квадрате!</li>
<li>При смешанном соединении: считать поэтапно</li>
</ul>
</div>
</div>
</div>
<!-- Шапка -->
<div class="hdr">
<h1><i class="fas fa-bolt"></i> Физика 8 — Электромагнитные явления</h1>
<p>Электростатика · Электрический ток · Закон Ома · Электромагнетизм</p>
</div>
<div class="page-layout">
<aside class="sidebar">
<!-- Sidebar brand -->
<div class="sb-brand">
<svg class="sb-logo" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round">
<path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/>
</svg>
<div>
<span class="sb-title">Электро</span>
<span class="sb-sub">Физика 8 — §1231</span>
</div>
</div>
<nav>
<div class="ch-bar">
<button class="ch-btn active" data-ch="es">
<svg class="ch-icon-svg" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round">
<circle cx="10" cy="10" r="3"/><path d="M10 1v3M10 16v3M1 10h3M16 10h3"/>
<path d="M3.5 3.5l2 2M14.5 14.5l2 2M3.5 16.5l2-2M14.5 5.5l2-2"/>
</svg>
<span>Электростатика</span>
<span class="ch-roman">§1216</span>
</button>
<button class="ch-btn" data-ch="et">
<svg class="ch-icon-svg" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
<path d="M2 10h4l3-7 4 14 3-7h2"/>
</svg>
<span>Электрический ток</span>
<span class="ch-roman">§1721</span>
</button>
<button class="ch-btn" data-ch="om">
<svg class="ch-icon-svg" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="7" width="14" height="6" rx="3"/>
<path d="M3 10h2M15 10h2"/>
</svg>
<span>Закон Ома и цепи</span>
<span class="ch-roman">§2227</span>
</button>
<button class="ch-btn" data-ch="mg">
<svg class="ch-icon-svg" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round">
<path d="M10 3 Q17 10 10 17 Q3 10 10 3z" fill="currentColor" opacity=".15"/>
<path d="M7 7Q3 10 7 13M13 7Q17 10 13 13"/>
</svg>
<span>Магнетизм</span>
<span class="ch-roman">§2831</span>
</button>
<button class="ch-btn" data-ch="tasks">
<svg class="ch-icon-svg" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="3" width="14" height="14" rx="3"/>
<path d="M7 10l2.5 2.5L13 7"/>
</svg>
<span>Задачи</span>
<span class="ch-roman">VIII</span>
</button>
</div>
<div class="sec-bar">
<!-- Электростатика §12–16 -->
<div class="sec-group show" data-chg="es">
<div class="tab active" data-tab="ref12"><span class="tab-num">§12</span><span class="tab-name">Электризация тел</span></div>
<div class="tab" data-tab="ref13"><span class="tab-num">§13</span><span class="tab-name">Проводники и диэлектрики</span></div>
<div class="tab" data-tab="ref14"><span class="tab-num">§14</span><span class="tab-name">Электризация через влияние</span></div>
<div class="tab" data-tab="ref15"><span class="tab-num">§15</span><span class="tab-name">Электрический заряд</span></div>
<div class="tab" data-tab="ref16"><span class="tab-num">§16</span><span class="tab-name">Строение атома. Ионы</span></div>
</div>
<!-- Электрический ток §17–21 -->
<div class="sec-group" data-chg="et">
<div class="tab" data-tab="ref17"><span class="tab-num">§17</span><span class="tab-name">Электрическое поле. Напряжение</span></div>
<div class="tab" data-tab="ref18"><span class="tab-num">§18</span><span class="tab-name">Единица напряжения. Работа</span></div>
<div class="tab" data-tab="ref19"><span class="tab-num">§19</span><span class="tab-name">Электрический ток. Источники</span></div>
<div class="tab" data-tab="ref20"><span class="tab-num">§20</span><span class="tab-name">Сила и направление тока</span></div>
<div class="tab" data-tab="ref21"><span class="tab-num">§21</span><span class="tab-name">Электрическая цепь. Измерения</span></div>
</div>
<!-- Закон Ома §2227 -->
<div class="sec-group" data-chg="om">
<div class="tab" data-tab="ref22"><span class="tab-num">§22</span><span class="tab-name">Закон Ома</span></div>
<div class="tab" data-tab="ref23"><span class="tab-num">§23</span><span class="tab-name">Единица сопротивления</span></div>
<div class="tab" data-tab="ref24"><span class="tab-num">§24</span><span class="tab-name">Последовательное соединение</span></div>
<div class="tab" data-tab="ref25"><span class="tab-num">§25</span><span class="tab-name">Параллельное соединение</span></div>
<div class="tab" data-tab="ref26"><span class="tab-num">§26</span><span class="tab-name">Работа и мощность тока</span></div>
<div class="tab" data-tab="ref27"><span class="tab-num">§27</span><span class="tab-name">Экономия электроэнергии</span></div>
</div>
<!-- Магнетизм §2831 -->
<div class="sec-group" data-chg="mg">
<div class="tab" data-tab="ref28"><span class="tab-num">§28</span><span class="tab-name">Постоянные магниты</span></div>
<div class="tab" data-tab="ref29"><span class="tab-num">§29</span><span class="tab-name">Магнитное поле</span></div>
<div class="tab" data-tab="ref30"><span class="tab-num">§30</span><span class="tab-name">Магнитное поле тока</span></div>
<div class="tab" data-tab="ref31"><span class="tab-num">§31</span><span class="tab-name">Катушка с током. Электромагнит</span></div>
</div>
<!-- Задачи -->
<div class="sec-group" data-chg="tasks">
<div class="tab" data-tab="tasks"><span class="tab-num">📝</span><span class="tab-name">Все задачи</span></div>
</div>
</div>
</nav>
</aside>
<main class="main-col">
<div class="content-area">
<!-- §12 -->
<div class="content active" id="tab-ref12">
<div class="para-hero ph-12">
<div class="ph-label">§12 · Физика 8 кл</div>
<h2>Электризация тел. Взаимодействие зарядов</h2>
<div class="ph-desc">При трении оба тела заряжаются разноимёнными зарядами. Одноимённые отталкиваются, разноимённые — притягиваются.</div>
<div class="ph-tags"><span class="ph-tag">⚡ трение → 2 заряда</span><span class="ph-tag">↔ одноимённые отталкиваются</span><span class="ph-tag">🔬 электроскоп</span></div>
</div>
<div class="section-title"><i class="fas fa-bolt"></i> §12. Электризация тел. Взаимодействие зарядов</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Электризация трением</h3>
<div class="main-f" style="font-size:.88rem">оба тела → разноимённые заряды</div>
<p>При трении двух тел <b>оба заряжаются</b>. Трение лишь увеличивает площадь соприкосновения — это облегчает переход электронов от одного тела к другому.</p>
<p><b>Стекло о шёлк</b> → стекло «+», шёлк «−»</p>
<p><b>Эбонит о мех</b> → эбонит «−», мех «+»</p>
</div>
<div class="fcard">
<h3>Взаимодействие зарядов</h3>
<div class="main-f" style="font-size:.88rem">«+»«+» и «−»«−» → отталкиваются<br>«+»«−» → притягиваются</div>
<p><b>Одноимённые</b> заряды отталкиваются.</p>
<p><b>Разноимённые</b> заряды притягиваются.</p>
<p>Это — <b>электрическое взаимодействие</b>.</p>
</div>
</div>
<div class="idiag-2col">
<div class="idiag">
<h3>🔬 Электроскоп</h3>
<svg width="100%" viewBox="0 0 180 130" style="display:block">
<ellipse cx="90" cy="50" rx="55" ry="45" fill="rgba(147,197,253,.1)" stroke="#3b82f6" stroke-width="1.5"/>
<line x1="90" y1="5" x2="90" y2="70" stroke="#94a3b8" stroke-width="3"/>
<circle cx="90" cy="5" r="7" fill="#94a3b8" stroke="#64748b" stroke-width="1"/>
<line x1="90" y1="70" x2="75" y2="95" stroke="#fbbf24" stroke-width="2.5" id="svg12leaf1"/>
<line x1="90" y1="70" x2="105" y2="95" stroke="#fbbf24" stroke-width="2.5" id="svg12leaf2"/>
<rect x="60" y="3" width="60" height="5" rx="2" fill="#64748b"/>
<text x="90" y="120" text-anchor="middle" font-size="9" fill="#64748b" font-family="sans-serif">незаряжен: листочки висят</text>
</svg>
</div>
<div class="idiag">
<h3>⚡ Заряженный электроскоп</h3>
<svg width="100%" viewBox="0 0 180 130" style="display:block">
<ellipse cx="90" cy="50" rx="55" ry="45" fill="rgba(147,197,253,.1)" stroke="#3b82f6" stroke-width="1.5"/>
<line x1="90" y1="5" x2="90" y2="70" stroke="#94a3b8" stroke-width="3"/>
<circle cx="90" cy="5" r="7" fill="#ef4444" stroke="#dc2626" stroke-width="1"/>
<text x="90" y="9" text-anchor="middle" font-size="8" fill="#fff" font-family="sans-serif" font-weight="bold"></text>
<line x1="90" y1="70" x2="65" y2="100" stroke="#ef4444" stroke-width="2.5"/>
<line x1="90" y1="70" x2="115" y2="100" stroke="#ef4444" stroke-width="2.5"/>
<text x="65" y="113" text-anchor="middle" font-size="8" fill="#ef4444" font-family="sans-serif"></text>
<text x="115" y="113" text-anchor="middle" font-size="8" fill="#ef4444" font-family="sans-serif"></text>
<rect x="60" y="3" width="60" height="5" rx="2" fill="#64748b"/>
<text x="90" y="125" text-anchor="middle" font-size="9" fill="#ef4444" font-family="sans-serif">заряжен: листочки расходятся</text>
</svg>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>При трении заряжаются <b>оба</b> тела — разноимёнными зарядами.</li>
<li>Одноимённые заряды <b>отталкиваются</b>; разноимённые — <b>притягиваются</b>.</li>
<li>Электроскоп <b>обнаруживает и сравнивает</b> заряды (не измеряет точное значение).</li>
<li>Сумма разноимённых зарядов равна нулю: «+» + «−» = 0.</li>
</ul>
</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon">👕</div><div class="li-title">Свитер и рубашка</div><div class="li-desc">Прилипают при надевании — электризация трением шерсти о ткань</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Молния</div><div class="li-desc">Электрический разряд между разноимённо заряженным облаком и землёй</div></div>
<div class="life-item"><div class="li-icon">🖨️</div><div class="li-title">Принтер/ксерокс</div><div class="li-desc">Тонер притягивается к заряженным участкам барабана — электростатика</div></div>
<div class="life-item"><div class="li-icon">🧹</div><div class="li-title">Пыль на экране</div><div class="li-desc">Экран заряжается → притягивает заряженные пылинки (разноимённо)</div></div>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Электризация и взаимодействие</div>
<div class="idiag">
<h3>⚡ Потри палочки и сближай — наблюдай взаимодействие</h3>
<canvas id="cv12" style="width:100%;height:260px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<button class="btn btn-pri" onclick="rub12()">🧻 Потереть</button>
<button class="btn btn-ghost" onclick="approach12(true)">🔴↔🔵 Разноимённые (сблизить)</button>
<button class="btn btn-ghost" onclick="approach12(false)">🔴↔🔴 Одноимённые (сблизить)</button>
<button class="btn btn-ghost" onclick="reset12()">↺ Сброс</button>
</div>
<p style="font-size:.78rem;color:var(--muted);margin-top:8px">Электроскоп справа: листочки расходятся при поднесении заряженной палочки.</p>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §12</div>
<ul class="key-points-list">
<li>При трении заряжаются <b>оба</b> тела, получая разноимённые заряды — это основное правило электризации трением.</li>
<li>Одноимённые заряды (<b>+/+</b> или <b>/</b>) отталкиваются; разноимённые (<b>+/</b>) притягиваются.</li>
<li>Электроскоп <b>обнаруживает</b> и сравнивает заряды — листочки расходятся, когда заряд есть.</li>
<li>Трение увеличивает площадь соприкосновения и облегчает переход электронов между телами.</li>
<li>Сумма зарядов при электризации равна нулю: заряд не создаётся, а <b>перераспределяется</b>.</li>
</ul>
</div>
</div>
<!-- §13 -->
<div class="content" id="tab-ref13">
<div class="para-hero ph-13">
<div class="ph-label">§13 · Физика 8 кл</div>
<h2>Проводники и диэлектрики</h2>
<div class="ph-desc">Проводники: заряды перемещаются свободно (металлы, растворы). Диэлектрики: перемещение затруднено (стекло, резина).</div>
<div class="ph-tags"><span class="ph-tag">⚙️ металлы — проводники</span><span class="ph-tag">🪟 стекло — диэлектрик</span><span class="ph-tag">💡 полупроводники</span></div>
</div>
<div class="section-title"><i class="fas fa-plug"></i> §13. Проводники и диэлектрики</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Проводники</h3>
<div class="main-f" style="font-size:.88rem">заряды перемещаются свободно</div>
<p>В проводниках есть <b>свободные заряженные частицы</b> (электроны в металлах, ионы в растворах), которые могут перемещаться по всему телу.</p>
<p><b>Примеры:</b> все металлы, растворы солей и кислот, тело человека, питьевая вода.</p>
</div>
<div class="fcard">
<h3>Диэлектрики (изоляторы)</h3>
<div class="main-f" style="font-size:.88rem">заряды не перемещаются</div>
<p>В диэлектриках <b>нет свободных зарядов</b> — все электроны прочно связаны с атомами.</p>
<p><b>Примеры:</b> стекло, резина, пластмасса, сухой воздух, дерево.</p>
<p>Идеальных диэлектриков нет — при высоком напряжении любой изолятор пробивается.</p>
</div>
</div>
<div class="idiag">
<h3>📊 Сравнение проводников и диэлектриков</h3>
<table style="width:100%;border-collapse:collapse;font-size:.8rem">
<thead><tr style="background:rgba(29,78,216,.08)"><th style="padding:6px 8px;border:1px solid var(--border);text-align:left">Свойство</th><th style="padding:6px 8px;border:1px solid var(--border)">Проводники</th><th style="padding:6px 8px;border:1px solid var(--border)">Диэлектрики</th></tr></thead>
<tr><td style="padding:5px 8px;border:1px solid var(--border)">Свободные заряды</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center;color:#059669;font-weight:700">✓ есть</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center;color:#dc2626;font-weight:700">✗ нет</td></tr>
<tr style="background:rgba(29,78,216,.03)"><td style="padding:5px 8px;border:1px solid var(--border)">Передача заряда</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center">да</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center">нет</td></tr>
<tr><td style="padding:5px 8px;border:1px solid var(--border)">Примеры</td><td style="padding:5px 8px;border:1px solid var(--border)">Cu, Fe, Al, Au, Ag; растворы кислот</td><td style="padding:5px 8px;border:1px solid var(--border)">стекло, резина, пластик, воздух</td></tr>
<tr style="background:rgba(29,78,216,.03)"><td style="padding:5px 8px;border:1px solid var(--border)">Применение</td><td style="padding:5px 8px;border:1px solid var(--border)">провода, контакты</td><td style="padding:5px 8px;border:1px solid var(--border)">изоляция проводов, корпуса</td></tr>
</table>
</div>
<div class="insight-box">
<div class="insight-title"><i class="fas fa-lightbulb"></i> Полупроводники — третья группа</div>
<p>Кремний (Si) и германий (Ge) — полупроводники: при нормальных условиях проводят плохо, но их проводимость можно менять нагревом, светом или легированием. Именно полупроводники — основа транзисторов, микросхем, солнечных батарей и смартфонов!</p>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Электрический заряд может перемещаться <b>только в проводниках</b>.</li>
<li>Тело человека — проводник (≈ 60% воды). Поэтому ток опасен!</li>
<li>Идеальных диэлектриков нет — при достаточно высоком напряжении любой изолятор пробивается (молния пробивает воздух).</li>
</ul>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Передача заряда через разные материалы</div>
<div class="idiag">
<h3>🔌 Два электроскопа — выбери материал перемычки</h3>
<canvas id="cv13" style="width:100%;height:240px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<select id="sel13mat" onchange="upd13()" style="padding:6px 10px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text)">
<option value="1">🔩 Медная проволока (проводник)</option>
<option value="1">💧 Солёная вода (проводник)</option>
<option value="0">🪟 Стеклянная палочка (диэлектрик)</option>
<option value="0">🟡 Резиновый шланг (диэлектрик)</option>
<option value="0">🌬️ Воздух (диэлектрик)</option>
</select>
<button class="btn btn-pri" onclick="connect13()">⚡ Соединить</button>
<button class="btn btn-ghost" onclick="reset13()">↺ Сброс</button>
</div>
<p style="font-size:.78rem;color:var(--muted);margin-top:8px">Левый электроскоп заряжен. После соединения: проводник — заряд перетекает; диэлектрик — не перетекает.</p>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §13</div>
<ul class="key-points-list">
<li><b>Проводники</b> содержат свободные заряженные частицы (электроны в металлах, ионы в растворах) — заряд перемещается свободно.</li>
<li><b>Диэлектрики</b> (стекло, резина, пластик) не имеют свободных зарядов — электрический заряд не перемещается.</li>
<li>Тело человека — проводник (60% воды), поэтому ток опасен для жизни.</li>
<li>Полупроводники (Si, Ge) — третья группа: проводимость можно менять нагревом, светом или легированием.</li>
</ul>
</div>
</div>
<!-- §14 -->
<div class="content" id="tab-ref14">
<div class="para-hero ph-14">
<div class="ph-label">§14 · Физика 8 кл</div>
<h2>Электризация через влияние</h2>
<div class="ph-desc">Заряженное тело перераспределяет заряды в соседнем проводнике без контакта. Незаряженные тела притягиваются к заряженным.</div>
<div class="ph-tags"><span class="ph-tag">🔄 перераспределение зарядов</span><span class="ph-tag">🧲 притяжение незаряженных</span><span class="ph-tag">⚡ молния — следствие</span></div>
</div>
<div class="section-title"><i class="fas fa-magnet"></i> §14. Электризация через влияние</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Механизм влияния</h3>
<div class="main-f" style="font-size:.88rem">заряд → перераспределение в проводнике</div>
<p>Поднесённое заряженное тело создаёт электрическое поле. Оно действует на свободные электроны проводника: <b>разноимённые притягиваются</b> к ближней стороне, <b>одноимённые отталкиваются</b> на дальнюю.</p>
<p>Без контакта! Убрали палочку → заряды вернулись в исходное состояние.</p>
</div>
<div class="fcard">
<h3>Как зарядить тело через влияние</h3>
<div class="main-f" style="font-size:.85rem">палочка → перемычку убрать → палочку убрать</div>
<ol style="font-size:.83rem;color:var(--muted);padding-left:18px;line-height:1.9;margin-top:6px">
<li>Поднести заряженную палочку к двум телам, соединённым проводником</li>
<li>Убрать <b>перемычку</b> (пока палочка на месте!)</li>
<li>Убрать палочку</li>
</ol>
<p>Результат: одно тело «+», другое «−».</p>
</div>
</div>
<div class="idiag">
<h3>🌩️ Как образуется молния</h3>
<svg width="100%" viewBox="0 0 300 110" style="display:block">
<ellipse cx="150" cy="25" rx="80" ry="20" fill="rgba(71,85,105,.4)" stroke="#475569" stroke-width="1.5"/>
<text x="100" y="20" font-size="9" fill="#94a3b8" font-family="sans-serif">нижняя часть облака «−»</text>
<text x="105" y="32" font-size="10" fill="#ef4444" font-family="sans-serif"> </text>
<line x1="150" y1="47" x2="150" y2="68" stroke="#f97316" stroke-width="1.5" stroke-dasharray="4,2"/>
<text x="155" y="60" font-size="8" fill="#f97316" font-family="sans-serif">влияние</text>
<rect x="30" y="70" width="240" height="10" rx="3" fill="rgba(120,80,10,.3)" stroke="#92400e" stroke-width="1"/>
<text x="65" y="68" font-size="8" fill="#3b82f6" font-family="sans-serif">+ + + + + + + +</text>
<text x="150" y="90" text-anchor="middle" font-size="8" fill="#94a3b8" font-family="sans-serif">поверхность Земли (индуцированный «+»)</text>
<polyline points="150,47 140,65 155,65 140,90" stroke="#fbbf24" stroke-width="2.5" fill="none"/>
<text x="170" y="75" font-size="9" fill="#fbbf24" font-family="sans-serif">⚡ разряд</text>
</svg>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Заряды, возникающие через влияние, <b>равны по модулю и противоположны по знаку</b>.</li>
<li>Незаряженные тела притягиваются к заряженным именно из-за влияния: ближняя сторона — разноимённая (притяжение сильнее).</li>
<li>Молния — следствие электризации через влияние в атмосфере.</li>
<li>Молниеотвод медленно «разряжает» грозовое облако, предотвращая разряд-молнию.</li>
</ul>
</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon"></div><div class="li-title">Молния</div><div class="li-desc">Заряженное облако → индуцирует противоположный заряд на земле → разряд</div></div>
<div class="life-item"><div class="li-icon">📠</div><div class="li-title">Лазерный принтер</div><div class="li-desc">Заряженный барабан притягивает тонер через влияние в нужных местах</div></div>
<div class="life-item"><div class="li-icon">💧</div><div class="li-title">Струя воды</div><div class="li-desc">Заряженная расчёска притягивает струю воды через влияние</div></div>
<div class="life-item"><div class="li-icon">🪥</div><div class="li-title">Волосы при расчёсывании</div><div class="li-desc">Расчёска заряжается → притягивает незаряженные волосы через влияние</div></div>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Электризация через влияние</div>
<div class="idiag">
<h3>🔄 Перераспределение электронов под действием заряда</h3>
<canvas id="cv14" style="width:100%;height:260px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:220px">
<span class="slider-lbl">📏 Расстояние:</span>
<input type="range" id="sl14d" min="5" max="95" value="80" style="flex:1" oninput="sl14dval=+this.value;upd14();">
<span class="slider-val" id="lbl14d">далеко</span>
</div>
<select id="sel14sign" onchange="upd14()" style="padding:6px 10px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text)">
<option value="1">➕ положительная палочка</option>
<option value="-1">➖ отрицательная палочка</option>
</select>
<button class="btn btn-pri" onclick="approach14()">🤚 Поднести</button>
<button class="btn btn-ghost" onclick="reset14()">↺ Убрать</button>
</div>
<div class="ctrl-row" style="margin-top:8px;gap:8px">
<span class="val-chip" id="chip14L">Левая сторона: 0</span>
<span class="val-chip" id="chip14R">Правая сторона: 0</span>
<span class="val-chip" id="chip14F">Влияние: 0%</span>
</div>
<p class="cv-cap"><i class="fas fa-info-circle"></i> Заряженная палочка создаёт поле — свободные электроны проводника смещаются. На ближней к палочке стороне появляется противоположный заряд, на дальней — одноимённый.</p>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §14</div>
<ul class="key-points-list">
<li>Электризация через <b>влияние</b> (индукцию) происходит без контакта — заряженное тело перераспределяет заряды в проводнике.</li>
<li>Ближняя к заряженному телу сторона проводника приобретает <b>разноимённый</b> заряд, дальняя — одноимённый.</li>
<li>Незаряженные тела <b>притягиваются</b> к заряженным: ближняя разноимённая сторона притягивается сильнее, чем отталкивается дальняя.</li>
<li>Молния — следствие электризации через влияние: заряженное облако индуцирует противоположный заряд на земле.</li>
</ul>
</div>
</div>
<!-- §15 -->
<div class="content" id="tab-ref15">
<div class="para-hero ph-15">
<div class="ph-label">§15 · Физика 8 кл</div>
<h2>Электрический заряд. Элементарный заряд</h2>
<div class="ph-formula">$q = eN$</div>
<div class="ph-desc">Заряд тела кратен элементарному: $q = eN$, $e = 1{,}6 \times 10^{-19}$ Кл.</div>
<div class="ph-tags"><span class="ph-tag">$e = 1{,}6 \times 10^{-19}$ Кл</span><span class="ph-tag">📐 [q] = Кл</span><span class="ph-tag">🔬 опыт Милликена</span></div>
</div>
<div class="section-title"><i class="fas fa-atom"></i> §15. Электрический заряд. Элементарный заряд</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Элементарный заряд</h3>
<div class="main-f">$e = 1{,}6 \times 10^{-19}$ Кл</div>
<p>Наименьшая «порция» электрического заряда. Носители: <b>электрон</b> (заряд $-e$) и <b>протон</b> (заряд $+e$).</p>
<p>Заряд <b>дискретен</b>: любой заряд тела кратен $e$.</p>
</div>
<div class="fcard">
<h3>Формула заряда тела</h3>
<div class="main-f">$q = eN$</div>
<p>$q$ — заряд тела [Кл]; $e = 1{,}6 \times 10^{-19}$ Кл; $N$ — число элементарных зарядов (целое!).</p>
<p><b>Единица:</b> кулон (Кл). Дольные единицы: мКл ($10^{-3}$), мкКл ($10^{-6}$), нКл ($10^{-9}$), пКл ($10^{-12}$).</p>
</div>
</div>
<div class="insight-box">
<div class="insight-title"><i class="fas fa-lightbulb"></i> Опыт Милликена и Иоффе (1910-1913)</div>
<p>Заряженная масляная капля «зависала» между заряженными пластинами, когда электрическая сила уравновешивала силу тяжести. По условию равновесия можно найти заряд капли. Оказалось: он всегда кратен $1{,}6 \times 10^{-19}$ Кл — это и есть элементарный заряд!</p>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Заряд любого тела <b>дискретен</b>: $q = eN$, $N = 1, 2, 3, ...$</li>
<li>При электризации трением переносятся <b>сами частицы</b> (электроны), а не некое «электричество».</li>
<li>1 Кл — очень большой заряд. В бытовых экспериментах — микро- и наноколоны.</li>
<li>Электрон: $q_e = -1{,}6 \times 10^{-19}$ Кл; протон: $q_p = +1{,}6 \times 10^{-19}$ Кл.</li>
</ul>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Элементарный заряд</div>
<div class="idiag">
<h3>⚛️ $q = eN$ — перенос электронов при электризации</h3>
<canvas id="cv15" style="width:100%;height:180px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:200px">
<span class="slider-lbl">Электронов $N$:</span>
<input type="range" id="sl15N" min="0" max="2000" step="100" value="0" style="flex:1" oninput="sl15Nval=+this.value;lbl15N.textContent=this.value;upd15();">
<span class="slider-val"><span id="lbl15N">0</span></span>
</div>
</div>
<div class="idiag-result" id="res15">$q = e \times 0 = 0$ Кл</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §15</div>
<ul class="key-points-list">
<li>Элементарный заряд $e = 1{,}6 \times 10^{-19}$ Кл — наименьшая «порция» заряда в природе (носители: электрон и протон).</li>
<li>Заряд любого тела <b>дискретен</b>: $q = eN$, где $N$ — целое число переданных элементарных зарядов.</li>
<li>Единица заряда — кулон (Кл); дольные: мКл ($10^{-3}$), мкКл ($10^{-6}$), нКл ($10^{-9}$).</li>
<li>1 Кл — очень большой заряд; в бытовых экспериментах работают с микро- и наноколонами.</li>
</ul>
</div>
</div>
<!-- §16 -->
<div class="content" id="tab-ref16">
<div class="para-hero ph-16">
<div class="ph-label">§16 · Физика 8 кл</div>
<h2>Строение атома. Ионы</h2>
<div class="ph-desc">Атом: ядро (протоны+нейтроны) + электронная оболочка. Ион — атом, потерявший или принявший электроны.</div>
<div class="ph-tags"><span class="ph-tag">⊕ ядро = протоны+нейтроны</span><span class="ph-tag">⊖ электроны на оболочках</span><span class="ph-tag">🔬 опыт Резерфорда</span></div>
</div>
<div class="section-title"><i class="fas fa-atom"></i> §16. Строение атома. Ионы</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Строение атома (модель Резерфорда)</h3>
<div class="main-f" style="font-size:.85rem">ядро (p⁺ + n⁰) + электронные оболочки (e⁻)</div>
<p><b>Ядро</b>: протоны (+) и нейтроны (0). Занимает ничтожно малый объём ($10^{-15}$ м).</p>
<p><b>Электроны</b>: движутся вокруг ядра на оболочках. Число электронов = числу протонов у нейтрального атома.</p>
<p>Диаметр атома ≈ $10^{-10}$ м; ядра — в $10^4$–$10^5$ раз меньше!</p>
</div>
<div class="fcard">
<h3>Ионы</h3>
<div class="main-f" style="font-size:.85rem">атом ± e⁻ = ион</div>
<p><b>Катион</b> (+): атом <em>потерял</em> электрон(ы). Протонов больше электронов.</p>
<p><b>Анион</b> (): атом <em>принял</em> лишний электрон. Электронов больше протонов.</p>
<p>В проводниках: электроны могут покидать атомы → свободные электроны → проводимость.</p>
</div>
</div>
<div class="idiag">
<h3>🔬 Опыт Резерфорда (рассеяние α-частиц)</h3>
<svg width="100%" viewBox="0 0 300 100" style="display:block">
<rect x="5" y="35" width="30" height="30" rx="5" fill="rgba(239,68,68,.2)" stroke="#ef4444" stroke-width="1.5"/>
<text x="20" y="53" text-anchor="middle" font-size="7.5" fill="#ef4444" font-family="sans-serif">α</text>
<line x1="35" y1="50" x2="120" y2="50" stroke="rgba(251,191,36,.5)" stroke-width="1" stroke-dasharray="4,2"/>
<rect x="120" y="10" width="8" height="80" rx="2" fill="rgba(234,179,8,.3)" stroke="#ca8a04" stroke-width="1.5"/>
<text x="124" y="8" text-anchor="middle" font-size="7" fill="#ca8a04" font-family="sans-serif">Au</text>
<line x1="128" y1="50" x2="220" y2="50" stroke="rgba(251,191,36,.7)" stroke-width="1.5"/>
<polygon points="220,50 212,46 212,54" fill="#fbbf24"/>
<text x="200" y="45" font-size="7" fill="#fbbf24" font-family="sans-serif">большинство прямо</text>
<line x1="128" y1="47" x2="200" y2="20" stroke="rgba(251,191,36,.5)" stroke-width="1"/>
<polygon points="200,20 194,25 200,27" fill="#fbbf24" opacity=".5"/>
<line x1="128" y1="53" x2="60" y2="30" stroke="#ef4444" stroke-width="1.5"/>
<polygon points="60,30 70,33 68,24" fill="#ef4444"/>
<text x="35" y="25" font-size="7" fill="#ef4444" font-family="sans-serif">единицы — назад</text>
<circle cx="130" cy="50" r="4" fill="#ef4444"/>
<text x="140" y="70" font-size="7.5" fill="#94a3b8" font-family="sans-serif">ядро — крошечное</text>
<text x="130" y="85" text-anchor="middle" font-size="7" fill="#64748b" font-family="sans-serif">Вывод: весь + заряд сосредоточен в маленьком ядре!</text>
</svg>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Нейтральный атом: число <b>протонов = числу электронов</b>.</li>
<li>Катион (+): потерял $e^-$ → протонов больше. Анион (−): принял $e^-$ → электронов больше.</li>
<li>В металлах проводимость обеспечивают <b>свободные электроны</b>, покинувшие атомы.</li>
<li>Опыт Резерфорда: большинство α-частиц проходит насквозь → атом почти «пустой».</li>
</ul>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Модель атома и образование ионов</div>
<div class="idiag">
<h3>⚛️ Нейтральный атом → ион (добавляй/убирай электроны)</h3>
<canvas id="cv16" style="width:100%;height:240px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<button class="btn btn-ghost" onclick="ionize16(-1)">➖ Отнять электрон → катион</button>
<button class="btn btn-ghost" onclick="ionize16(1)">➕ Добавить электрон → анион</button>
<button class="btn btn-pri" onclick="reset16()">↺ Нейтральный атом</button>
<select id="sel16elem" onchange="reset16()" style="padding:6px 10px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text)">
<option value="1,1">Водород H (1p, 1e)</option>
<option value="6,6" selected>Углерод C (6p, 6e)</option>
<option value="8,8">Кислород O (8p, 8e)</option>
<option value="11,11">Натрий Na (11p, 11e)</option>
</select>
</div>
<div class="idiag-result" id="res16">Нейтральный атом: 6 протонов, 6 электронов — заряд 0</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §16</div>
<ul class="key-points-list">
<li>Атом состоит из ядра (протоны + нейтроны) и электронных оболочек; ядро в $10^4$–$10^5$ раз меньше самого атома.</li>
<li><b>Нейтральный</b> атом: число протонов равно числу электронов.</li>
<li><b>Катион</b> (+) — атом потерял электрон(ы); <b>анион</b> (−) — атом принял лишние электроны.</li>
<li>Опыт Резерфорда: большинство альфа-частиц проходит насквозь — атом почти «пустой», весь заряд сосредоточен в крошечном ядре.</li>
</ul>
</div>
</div>
<!-- §17 -->
<div class="content" id="tab-ref17">
<div class="para-hero ph-17">
<div class="ph-label">§17 · Физика 8 кл</div>
<h2>Электрическое поле. Электрическое напряжение</h2>
<div class="ph-desc">Электрическое поле — особая форма материи, создаваемая зарядами. Напряжение $U = A/q$ [В].</div>
<div class="ph-tags"><span class="ph-tag">🌐 особая форма материи</span><span class="ph-tag">$U = A/q$</span><span class="ph-tag">📐 [U] = В</span></div>
</div>
<div class="section-title"><i class="fas fa-broadcast-tower"></i> §17. Электрическое поле. Электрическое напряжение</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Электрическое поле</h3>
<div class="main-f" style="font-size:.85rem">особое состояние пространства вокруг заряда</div>
<p>Электрическое поле — <b>особая форма материи</b>, создаваемая заряженными телами. Оно реально существует независимо от нашего сознания.</p>
<p><b>Доказательство</b>: поле действует на любой внесённый заряд с определённой силой.</p>
<p>Поле распространяется в пространстве и действует без контакта.</p>
</div>
<div class="fcard">
<h3>Электрическое напряжение U</h3>
<div class="main-f">$U_{AC} = U_{AB} + U_{BC}$</div>
<p>Напряжение <b>U</b> между двумя точками поля определяет, сколько работы совершают силы поля при переносе заряда между этими точками.</p>
<p>Чем дальше от заряда — тем меньше напряжение: $U_{AC} > U_{AB}$</p>
<p>Напряжения складываются на последовательных участках.</p>
</div>
</div>
<div class="idiag-2col">
<div class="idiag">
<h3>🌐 Сравнение с полем тяготения</h3>
<svg width="100%" viewBox="0 0 200 120" style="display:block">
<text x="50" y="12" text-anchor="middle" font-size="8.5" fill="#94a3b8" font-family="sans-serif" font-weight="bold">Поле тяготения</text>
<circle cx="50" cy="50" r="15" fill="rgba(71,85,105,.4)" stroke="#475569" stroke-width="1.5"/>
<text x="50" y="54" text-anchor="middle" font-size="7.5" fill="#94a3b8" font-family="sans-serif">Земля</text>
<line x1="50" y1="68" x2="50" y2="90" stroke="#6366f1" stroke-width="1.5"/>
<polygon points="50,92 46,84 54,84" fill="#6366f1"/>
<text x="68" y="82" font-size="7" fill="#6366f1" font-family="sans-serif">сила тяж.</text>
<circle cx="50" cy="103" r="5" fill="#6366f1"/>
<text x="55" y="107" font-size="7" fill="#94a3b8" font-family="sans-serif">m</text>
<text x="105" y="65" text-anchor="middle" font-size="10" fill="#fbbf24" font-family="sans-serif"></text>
<text x="105" y="78" text-anchor="middle" font-size="7" fill="#fbbf24" font-family="sans-serif">аналогия</text>
<text x="158" y="12" text-anchor="middle" font-size="8.5" fill="#94a3b8" font-family="sans-serif" font-weight="bold">Электрическое поле</text>
<circle cx="158" cy="50" r="15" fill="rgba(239,68,68,.25)" stroke="#ef4444" stroke-width="1.5"/>
<text x="158" y="54" text-anchor="middle" font-size="8" fill="#ef4444" font-family="sans-serif">+q</text>
<line x1="158" y1="68" x2="158" y2="90" stroke="#3b82f6" stroke-width="1.5"/>
<polygon points="158,92 154,84 162,84" fill="#3b82f6"/>
<text x="173" y="82" font-size="7" fill="#3b82f6" font-family="sans-serif">сила эл.</text>
<circle cx="158" cy="103" r="5" fill="#3b82f6"/>
<text x="163" y="107" font-size="7" fill="#94a3b8" font-family="sans-serif">+q</text>
</svg>
</div>
<div class="idiag">
<h3>📐 Силовые линии электрического поля</h3>
<svg width="100%" viewBox="0 0 200 120" style="display:block">
<circle cx="50" cy="60" r="14" fill="rgba(239,68,68,.25)" stroke="#ef4444" stroke-width="1.5"/>
<text x="50" y="65" text-anchor="middle" font-size="11" fill="#ef4444" font-family="sans-serif" font-weight="bold">+</text>
<circle cx="150" cy="60" r="14" fill="rgba(59,130,246,.25)" stroke="#3b82f6" stroke-width="1.5"/>
<text x="150" y="65" text-anchor="middle" font-size="11" fill="#3b82f6" font-family="sans-serif" font-weight="bold"></text>
<line x1="64" y1="60" x2="136" y2="60" stroke="#94a3b8" stroke-width="1.5"/>
<polygon points="136,60 128,56 128,64" fill="#94a3b8"/>
<line x1="60" y1="46" x2="140" y2="46" stroke="#94a3b8" stroke-width="1" opacity=".6"/>
<polygon points="140,46 133,43 133,49" fill="#94a3b8" opacity=".6"/>
<line x1="60" y1="74" x2="140" y2="74" stroke="#94a3b8" stroke-width="1" opacity=".6"/>
<polygon points="140,74 133,71 133,77" fill="#94a3b8" opacity=".6"/>
<text x="100" y="50" text-anchor="middle" font-size="7" fill="#94a3b8" font-family="sans-serif">→ направление поля</text>
<text x="100" y="100" text-anchor="middle" font-size="7.5" fill="#64748b" font-family="sans-serif">линии: из + в </text>
<line x1="50" y1="15" x2="150" y2="15" stroke="#fbbf24" stroke-width="1.5" stroke-dasharray="4,2"/>
<text x="100" y="12" text-anchor="middle" font-size="7.5" fill="#fbbf24" font-family="sans-serif">U &gt; 0 между + и </text>
</svg>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Электрическое поле — <b>материально</b>: оно реально существует и действует на заряды.</li>
<li>Источник поля — заряженное тело. Поле существует вокруг него всегда.</li>
<li>Напряжение между точками <b>складывается</b> на последовательных участках.</li>
<li>Силовые линии выходят из «+» и входят в «−». Их гуще — поле сильнее.</li>
</ul>
</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon"></div><div class="li-title">Молния</div><div class="li-desc">Очень сильное электрическое поле между грозовым облаком и землёй</div></div>
<div class="life-item"><div class="li-icon">🖨️</div><div class="li-title">Принтер</div><div class="li-desc">Тонер летит в зоны с другим зарядом под действием электрического поля</div></div>
<div class="life-item"><div class="li-icon">📱</div><div class="li-title">Сенсорный экран</div><div class="li-desc">Палец меняет электрическое поле у экрана — так смартфон «чувствует» касание</div></div>
<div class="life-item"><div class="li-icon">🔋</div><div class="li-title">Батарейка</div><div class="li-desc">Создаёт постоянное напряжение (эл. поле) между «+» и «−» полюсами</div></div>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Силовые линии электрического поля</div>
<div class="idiag">
<h3>🌐 Силовые линии и пробный заряд (живая анимация)</h3>
<canvas id="cv17" style="width:100%;height:300px;border-radius:12px;background:#0f172a;display:block;cursor:crosshair"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<select id="sel17mode" onchange="upd17()" style="padding:6px 10px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text)">
<option value="single_pos"> одиночный заряд</option>
<option value="single_neg"> одиночный заряд</option>
<option value="dipole" selected>➕➖ диполь</option>
<option value="same_pos">➕➕ одноимённые</option>
<option value="quad">⊞ квадруполь (+ − + −)</option>
</select>
<label style="font-size:.82rem;display:flex;align-items:center;gap:6px;cursor:pointer;color:var(--muted)">
<input type="checkbox" id="chk17probe" checked onchange="upd17()"> Пробный заряд (тащи мышью)
</label>
<label style="font-size:.82rem;display:flex;align-items:center;gap:6px;cursor:pointer;color:var(--muted)">
<input type="checkbox" id="chk17flow" checked onchange="upd17()"> Анимация потока
</label>
</div>
<div class="ctrl-row" style="margin-top:8px;gap:8px">
<span class="val-chip" id="chip17F">|F| ≈ 0 у.е.</span>
<span class="val-chip" id="chip17E">E поле ≈ 0 у.е.</span>
<span class="val-chip" id="chip17dir">направление: —</span>
</div>
<p class="cv-cap"><i class="fas fa-info-circle"></i> Силовые линии выходят из «+» и входят в «−». Где линии гуще — там поле сильнее. Перетаскивай жёлтый пробный заряд мышью, чтобы видеть, как меняется сила.</p>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §17</div>
<ul class="key-points-list">
<li>Электрическое поле — <b>особая форма материи</b>, создаваемая заряженными телами; оно реально существует и действует на заряды.</li>
<li>Силовые линии поля выходят из «+» и входят в «−»; чем гуще линии — тем сильнее поле.</li>
<li>Напряжение $U$ между двумя точками характеризует работоспособность поля: $U = A/q$.</li>
<li>Напряжения на последовательных участках складываются: $U_{AC} = U_{AB} + U_{BC}$.</li>
</ul>
</div>
</div>
<!-- §18 -->
<div class="content" id="tab-ref18">
<div class="para-hero ph-18">
<div class="ph-label">§18 · Физика 8 кл</div>
<h2>Единица напряжения. Расчёт работы в электрическом поле</h2>
<div class="ph-formula">$A = qU$</div>
<div class="ph-desc">1 В — напряжение, при котором перенос 1 Кл совершает работу 1 Дж. Формула $A = qU$.</div>
<div class="ph-tags"><span class="ph-tag">$A = qU$ [Дж]</span><span class="ph-tag">$U = A/q$ [В]</span><span class="ph-tag">1 В = 1 Дж/Кл</span></div>
</div>
<div class="section-title"><i class="fas fa-plug-circle-bolt"></i> §18. Единица напряжения. Расчёт работы в электрическом поле</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Определение 1 вольта</h3>
<div class="main-f">1 В = 1 Дж / 1 Кл</div>
<p><b>1 вольт</b> — это напряжение между двумя точками поля, при перемещении заряда 1 Кл между которыми совершается работа 1 Дж.</p>
<p>Назван в честь итальянца <b>А. Вольта</b> (1745–1827) — создателя первого химического источника тока.</p>
</div>
<div class="fcard">
<h3>Работа электрического поля</h3>
<div class="main-f">$A = qU$</div>
<p>Работа сил электрического поля по перемещению заряда $q$ между точками с напряжением $U$.</p>
<p>$A$ [Дж]; $q$ [Кл]; $U$ [В]</p>
<p>Откуда: $U = A/q$ — характеристика «работоспособности» поля.</p>
</div>
</div>
<div class="idiag">
<h3>🔋 Примеры напряжений</h3>
<table style="width:100%;border-collapse:collapse;font-size:.8rem">
<thead><tr style="background:rgba(29,78,216,.08)"><th style="padding:6px 8px;border:1px solid var(--border);text-align:left">Источник</th><th style="padding:6px 8px;border:1px solid var(--border)">U</th><th style="padding:6px 8px;text-align:left;border:1px solid var(--border)">Применение</th></tr></thead>
<tr><td style="padding:5px 8px;border:1px solid var(--border)">Пальчиковая батарейка (AA)</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center;font-weight:700">1,5 В</td><td style="padding:5px 8px;border:1px solid var(--border)">фонарик, пульт</td></tr>
<tr style="background:rgba(29,78,216,.03)"><td style="padding:5px 8px;border:1px solid var(--border)">Автомобильный аккумулятор</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center;font-weight:700">12 В</td><td style="padding:5px 8px;border:1px solid var(--border)">запуск двигателя</td></tr>
<tr><td style="padding:5px 8px;border:1px solid var(--border)">Безопасное напряжение (в воде)</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center;font-weight:700">12 В</td><td style="padding:5px 8px;border:1px solid var(--border)">ванны, бассейны</td></tr>
<tr style="background:rgba(29,78,216,.03)"><td style="padding:5px 8px;border:1px solid var(--border)">Домашняя сеть</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center;font-weight:700;color:#f97316">220 В</td><td style="padding:5px 8px;border:1px solid var(--border)">бытовые приборы</td></tr>
<tr><td style="padding:5px 8px;border:1px solid var(--border)">ЛЭП (высоковольтные)</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center;font-weight:700;color:#dc2626">110 000 В</td><td style="padding:5px 8px;border:1px solid var(--border)">передача эл. энергии</td></tr>
<tr style="background:rgba(29,78,216,.03)"><td style="padding:5px 8px;border:1px solid var(--border)">Молния</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center;font-weight:700;color:#dc2626">~10⁹ В</td><td style="padding:5px 8px;border:1px solid var(--border)">природный разряд</td></tr>
</table>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>$A = qU$: чем больше $q$ или $U$ — тем больше работа.</li>
<li>«Высокое напряжение» ≠ большая работа: работа зависит ещё и от величины переносимого заряда.</li>
<li>Напряжение ≥ 36 В при контакте с влажной кожей опасно для жизни!</li>
<li>Смысл надписи «9 В» на батарейке: при переносе 1 Кл совершается работа 9 Дж.</li>
</ul>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Работа электрического поля $A = qU$</div>
<div class="idiag">
<h3>🔋 Меняй U и q — наблюдай работу и яркость лампы</h3>
<canvas id="cv18" style="width:100%;height:180px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:180px">
<span class="slider-lbl">$U$:</span>
<input type="range" id="sl18U" min="1" max="220" value="12" style="flex:1" oninput="lbl18U.textContent=this.value+' В';upd18();">
<span class="slider-val"><span id="lbl18U">12 В</span></span>
</div>
<div class="slider-row" style="flex:1;min-width:180px">
<span class="slider-lbl">$q$:</span>
<input type="range" id="sl18q" min="0.1" max="10" step="0.1" value="1" style="flex:1" oninput="lbl18q.textContent=(+this.value).toFixed(1)+' Кл';upd18();">
<span class="slider-val"><span id="lbl18q">1.0 Кл</span></span>
</div>
</div>
<div class="idiag-result" id="res18">$A = qU = 1{,}0 \times 12 = 12$ Дж</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §18</div>
<ul class="key-points-list">
<li><b>1 вольт</b> — напряжение, при котором перенос заряда 1 Кл совершает работу 1 Дж: 1 В = 1 Дж/Кл.</li>
<li>Формула работы: $A = qU$ — чем больше заряд или напряжение, тем больше работа.</li>
<li>Безопасное напряжение: ≤ 36 В (сухое помещение), ≤ 12 В (ванна). 220 В в розетке — смертельно опасны!</li>
<li>Запись «9 В» на батарейке означает: при переносе 1 Кл совершается работа 9 Дж.</li>
</ul>
</div>
</div>
<!-- §19 -->
<div class="content" id="tab-ref19">
<div class="para-hero ph-19">
<div class="ph-label">§19 · Физика 8 кл</div>
<h2>Электрический ток. Источники тока</h2>
<div class="ph-desc">Электрический ток — направленное движение заряженных частиц. Источник тока поддерживает напряжение.</div>
<div class="ph-tags"><span class="ph-tag">→ направленное движение</span><span class="ph-tag">🔋 источник тока</span><span class="ph-tag">⚡ виды источников</span></div>
</div>
<div class="section-title"><i class="fas fa-battery-three-quarters"></i> §19. Электрический ток. Источники тока</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Электрический ток</h3>
<div class="main-f" style="font-size:.85rem">направленное движение заряженных частиц</div>
<p>В отличие от хаотического теплового движения, ток — это <b>упорядоченное</b> движение в одном направлении.</p>
<p><b>В металлах</b>: движутся электроны. <b>В растворах</b>: движутся ионы. <b>В газах</b>: движутся ионы и электроны.</p>
</div>
<div class="fcard">
<h3>Условия существования тока</h3>
<div class="main-f" style="font-size:.85rem">проводник + источник тока</div>
<ol style="font-size:.83rem;color:var(--muted);padding-left:18px;line-height:1.9;margin-top:6px">
<li><b>Свободные заряженные частицы</b> (среда — проводник)</li>
<li><b>Электрическое напряжение</b> (источник тока создаёт и поддерживает поле)</li>
</ol>
<p style="margin-top:8px">В источнике тока другой вид энергии → <b>электрическая</b>.</p>
</div>
</div>
<div class="idiag">
<h3>🔋 Виды источников тока</h3>
<table style="width:100%;border-collapse:collapse;font-size:.8rem">
<thead><tr style="background:rgba(29,78,216,.08)"><th style="padding:6px 8px;border:1px solid var(--border);text-align:left">Источник</th><th style="padding:6px 8px;border:1px solid var(--border)">Тип энергии</th><th style="padding:6px 8px;text-align:left;border:1px solid var(--border)">Пример</th></tr></thead>
<tr><td style="padding:5px 8px;border:1px solid var(--border)">🔋 Гальванический элемент</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center">химическая</td><td style="padding:5px 8px;border:1px solid var(--border)">батарейка AA</td></tr>
<tr style="background:rgba(29,78,216,.03)"><td style="padding:5px 8px;border:1px solid var(--border)">🔋 Аккумулятор</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center">химическая (перезар.)</td><td style="padding:5px 8px;border:1px solid var(--border)">автомобиль, смартфон</td></tr>
<tr><td style="padding:5px 8px;border:1px solid var(--border)">⚙️ Генератор</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center">механическая</td><td style="padding:5px 8px;border:1px solid var(--border)">электростанция, велосипед</td></tr>
<tr style="background:rgba(29,78,216,.03)"><td style="padding:5px 8px;border:1px solid var(--border)">☀️ Солнечная батарея</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center">световая</td><td style="padding:5px 8px;border:1px solid var(--border)">калькулятор, спутник</td></tr>
<tr><td style="padding:5px 8px;border:1px solid var(--border)">🌡️ Термоэлемент</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center">тепловая</td><td style="padding:5px 8px;border:1px solid var(--border)">термопара</td></tr>
</table>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Ток — <b>направленное</b> движение зарядов. Хаотическое тепловое движение — это не ток!</li>
<li>Без источника тока ток в проводнике будет кратковременным (быстро исчезнет).</li>
<li>В любом источнике тока: чужой вид энергии → <b>электрическая</b>. «Из ничего» не бывает.</li>
<li>Аккумулятор ≠ батарейка: аккумулятор <b>перезаряжается</b>.</li>
</ul>
</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon">📱</div><div class="li-title">Смартфон</div><div class="li-desc">Аккумулятор → ток → дисплей, процессор, антенна</div></div>
<div class="life-item"><div class="li-icon">🚗</div><div class="li-title">Автомобиль</div><div class="li-desc">Аккумулятор запускает стартер; генератор заряжает аккумулятор при езде</div></div>
<div class="life-item"><div class="li-icon">☀️</div><div class="li-title">Солнечная панель</div><div class="li-desc">Фотоны выбивают электроны в кремнии → электрический ток</div></div>
<div class="life-item"><div class="li-icon">🏭</div><div class="li-title">Электростанция</div><div class="li-desc">Пар вращает турбину → генератор создаёт ток для всей страны</div></div>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Электрический ток в цепи</div>
<div class="idiag">
<h3>⚡ Направление тока и движение электронов</h3>
<canvas id="cv19" style="width:100%;height:220px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<button class="btn btn-pri" id="btn19key" onclick="toggle19()">🔑 Замкнуть цепь</button>
<select id="sel19src" onchange="upd19src()" style="padding:6px 10px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text)">
<option>🔋 Батарейка (1,5 В)</option>
<option>🔋 Аккумулятор (12 В)</option>
<option>⚙️ Генератор</option>
<option>☀️ Солнечная батарея</option>
</select>
</div>
<p style="font-size:.78rem;color:var(--muted);margin-top:8px">Синие точки — электроны (движутся от «−» к «+»). Жёлтая стрелка — традиционное направление тока (от «+» к «−»).</p>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §19</div>
<ul class="key-points-list">
<li>Электрический ток — <b>направленное</b> движение заряженных частиц (хаотическое тепловое движение — не ток).</li>
<li>Для существования тока нужны два условия: <b>свободные заряды</b> (проводник) и <b>источник напряжения</b>.</li>
<li>В источнике тока любой другой вид энергии преобразуется в электрическую (химическая → в батарейке, механическая → в генераторе).</li>
<li>Аккумулятор отличается от батарейки тем, что его можно <b>перезарядить</b>.</li>
</ul>
</div>
</div>
<!-- §20 -->
<div class="content" id="tab-ref20">
<div class="para-hero ph-20">
<div class="ph-label">§20 · Физика 8 кл</div>
<h2>Сила и направление электрического тока</h2>
<div class="ph-formula">$I = q/t$</div>
<div class="ph-desc">Сила тока $I = q/t$ [А]. Направление тока: от «+» к «−» во внешней цепи.</div>
<div class="ph-tags"><span class="ph-tag">$I = q/t$ [А]</span><span class="ph-tag">1 А = 1 Кл/с</span><span class="ph-tag">→ от + к снаружи</span></div>
</div>
<div class="section-title"><i class="fas fa-tachometer-alt"></i> §20. Сила и направление электрического тока</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Сила тока</h3>
<div class="main-f">$I = q/t$</div>
<p>Сила тока — физическая величина, равная <b>заряду</b>, прошедшему через поперечное сечение проводника <b>за единицу времени</b>.</p>
<p>$I$ [А]; $q$ [Кл]; $t$ [с]</p>
<p>Откуда: $q = It$ — заряд через сечение за время $t$.</p>
</div>
<div class="fcard">
<h3>Единица и направление</h3>
<div class="main-f">1 А = 1 Кл / 1 с</div>
<p><b>Ампер</b> (А) — основная единица СИ для силы тока. 1 мА = $10^{-3}$ А.</p>
<p><b>Направление тока</b> (по договорённости): от «+» к «−» во внешней цепи — совпадает с движением положительных зарядов.</p>
<p>В металлах электроны движутся <em>в обратном направлении</em>.</p>
</div>
</div>
<div class="idiag">
<h3>📊 Типичные значения силы тока</h3>
<svg width="100%" viewBox="0 0 300 110" style="display:block">
<line x1="20" y1="85" x2="285" y2="85" stroke="var(--border)" stroke-width="1.5"/>
<rect x="22" y="72" width="8" height="13" rx="2" fill="#22c55e"/>
<text x="26" y="68" font-size="7" fill="#22c55e" font-family="sans-serif" text-anchor="middle">LED</text>
<text x="26" y="100" font-size="6.5" fill="#94a3b8" font-family="sans-serif" text-anchor="middle">0,05А</text>
<rect x="60" y="65" width="12" height="20" rx="2" fill="#f97316"/>
<text x="66" y="61" font-size="7" fill="#f97316" font-family="sans-serif" text-anchor="middle">Утюг</text>
<text x="66" y="100" font-size="6.5" fill="#94a3b8" font-family="sans-serif" text-anchor="middle">3А</text>
<rect x="108" y="57" width="14" height="28" rx="2" fill="#ef4444"/>
<text x="115" y="53" font-size="7" fill="#ef4444" font-family="sans-serif" text-anchor="middle">Чайник</text>
<text x="115" y="100" font-size="6.5" fill="#94a3b8" font-family="sans-serif" text-anchor="middle">9А</text>
<rect x="170" y="30" width="22" height="55" rx="2" fill="#dc2626"/>
<text x="181" y="26" font-size="7" fill="#dc2626" font-family="sans-serif" text-anchor="middle">Стартер</text>
<text x="181" y="100" font-size="6.5" fill="#94a3b8" font-family="sans-serif" text-anchor="middle">200-300А</text>
<rect x="255" y="10" width="22" height="75" rx="2" fill="#7c3aed"/>
<text x="266" y="7" font-size="7" fill="#7c3aed" font-family="sans-serif" text-anchor="middle">Молния</text>
<text x="266" y="100" font-size="6.5" fill="#94a3b8" font-family="sans-serif" text-anchor="middle">30000А</text>
<text x="20" y="109" font-size="6.5" fill="#64748b" font-family="sans-serif">0</text>
<text x="283" y="109" font-size="6.5" fill="#64748b" font-family="sans-serif">I, А (лог. масштаб)</text>
</svg>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>$I = q/t$ — сила тока = заряд ÷ время. Больший заряд за то же время → больший ток.</li>
<li>1 Кл = 1 А × 1 с — отсюда определение кулона через ток!</li>
<li>Направление тока <b>противоположно</b> движению электронов (в металлах).</li>
<li>Мощный ток (свыше 0,1 А через тело человека) — смертельно опасен!</li>
</ul>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Сила тока $I = q/t$</div>
<div class="idiag">
<h3>📊 Поток электронов в проводнике</h3>
<canvas id="cv20" style="width:100%;height:160px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:200px">
<span class="slider-lbl">Сила тока $I$:</span>
<input type="range" id="sl20I" min="0" max="5" step="0.1" value="1" style="flex:1" oninput="lbl20I.textContent=(+this.value).toFixed(1)+' А';upd20();">
<span class="slider-val"><span id="lbl20I">1.0 А</span></span>
</div>
</div>
<div class="idiag-result" id="res20">$N = I/e = 1{,}0/(1{,}6 \times 10^{-19}) \approx 6{,}25 \times 10^{18}$ электронов/с</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §20</div>
<ul class="key-points-list">
<li>Сила тока: $I = q/t$ — заряд, проходящий через сечение проводника за единицу времени. Единица: ампер (А).</li>
<li>1 А = 1 Кл/с; откуда: 1 Кл = 1 А × 1 с (определение кулона через ток).</li>
<li>Направление тока по договорённости — от «+» к «−» во внешней цепи; в металлах электроны движутся в <b>противоположном</b> направлении.</li>
<li>Ток свыше 0,1 А через тело человека — смертельно опасен!</li>
</ul>
</div>
</div>
<!-- §21 -->
<div class="content" id="tab-ref21">
<div class="para-hero ph-21">
<div class="ph-label">§21 · Физика 8 кл</div>
<h2>Электрическая цепь. Измерение силы тока и напряжения</h2>
<div class="ph-desc">Амперметр — последовательно (в разрыв). Вольтметр — параллельно. Соблюдать полярность.</div>
<div class="ph-tags"><span class="ph-tag">Ⓐ последовательно</span><span class="ph-tag">Ⓥ параллельно</span><span class="ph-tag">⚡ соблюдать полярность</span></div>
</div>
<div class="section-title"><i class="fas fa-circle-nodes"></i> §21. Электрическая цепь. Измерение силы тока и напряжения</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Звенья электрической цепи</h3>
<div class="main-f" style="font-size:.82rem">источник + нагрузка + провода + ключ</div>
<ul style="font-size:.83rem;color:var(--muted);line-height:1.9;padding-left:16px;margin-top:6px">
<li><b>Источник тока</b> — создаёт и поддерживает напряжение</li>
<li><b>Нагрузка (потребитель)</b> — лампа, двигатель, нагреватель</li>
<li><b>Провода</b> — соединяют звенья</li>
<li><b>Ключ (выключатель)</b> — замыкает/размыкает цепь</li>
</ul>
</div>
<div class="fcard">
<h3>Измерительные приборы</h3>
<div class="main-f" style="font-size:.82rem">Ⓐ последовательно · Ⓥ параллельно</div>
<p><b>Амперметр (A)</b> — измеряет силу тока. Включается последовательно (в разрыв цепи). Имеет малое сопротивление.</p>
<p><b>Вольтметр (V)</b> — измеряет напряжение. Включается параллельно нужному участку. Имеет большое сопротивление.</p>
<p>⚠️ Оба прибора: соблюдать <b>полярность</b> («+» к «+» источника)!</p>
</div>
</div>
<div class="idiag-2col">
<div class="idiag">
<h3>⚡ Условные обозначения на схемах</h3>
<svg width="100%" viewBox="0 0 200 140" style="display:block">
<line x1="10" y1="15" x2="35" y2="15" stroke="#94a3b8" stroke-width="1.5"/>
<line x1="35" y1="10" x2="35" y2="20" stroke="#94a3b8" stroke-width="2"/>
<line x1="38" y1="7" x2="38" y2="23" stroke="#94a3b8" stroke-width="3"/>
<line x1="38" y1="15" x2="55" y2="15" stroke="#94a3b8" stroke-width="1.5"/>
<text x="34" y="8" font-size="7" fill="#94a3b8" font-family="sans-serif"></text>
<text x="40" y="8" font-size="7" fill="#94a3b8" font-family="sans-serif">+</text>
<text x="30" y="32" text-anchor="middle" font-size="8" fill="#64748b" font-family="sans-serif">источник тока</text>
<line x1="10" y1="55" x2="25" y2="55" stroke="#94a3b8" stroke-width="1.5"/>
<circle cx="25" cy="55" r="2" fill="#94a3b8"/>
<line x1="27" y1="55" x2="42" y2="47" stroke="#94a3b8" stroke-width="1.5"/>
<circle cx="43" cy="55" r="2" fill="#94a3b8"/>
<line x1="43" y1="55" x2="55" y2="55" stroke="#94a3b8" stroke-width="1.5"/>
<text x="30" y="72" text-anchor="middle" font-size="8" fill="#64748b" font-family="sans-serif">ключ (разомкн.)</text>
<line x1="10" y1="95" x2="25" y2="95" stroke="#94a3b8" stroke-width="1.5"/>
<circle cx="35" cy="95" r="10" fill="none" stroke="#fbbf24" stroke-width="1.5"/>
<line x1="29" y1="89" x2="41" y2="101" stroke="#fbbf24" stroke-width="1.5"/>
<line x1="41" y1="89" x2="29" y2="101" stroke="#fbbf24" stroke-width="1.5"/>
<line x1="45" y1="95" x2="55" y2="95" stroke="#94a3b8" stroke-width="1.5"/>
<text x="30" y="115" text-anchor="middle" font-size="8" fill="#64748b" font-family="sans-serif">лампа</text>
<line x1="100" y1="15" x2="115" y2="15" stroke="#94a3b8" stroke-width="1.5"/>
<circle cx="125" cy="15" r="10" fill="none" stroke="#22c55e" stroke-width="1.5"/>
<text x="125" y="19" text-anchor="middle" font-size="9" fill="#22c55e" font-family="sans-serif" font-weight="bold">A</text>
<line x1="135" y1="15" x2="150" y2="15" stroke="#94a3b8" stroke-width="1.5"/>
<text x="125" y="35" text-anchor="middle" font-size="8" fill="#64748b" font-family="sans-serif">амперметр</text>
<text x="125" y="45" text-anchor="middle" font-size="7" fill="#22c55e" font-family="sans-serif">(последовательно)</text>
<line x1="100" y1="75" x2="115" y2="75" stroke="#94a3b8" stroke-width="1.5"/>
<circle cx="125" cy="75" r="10" fill="none" stroke="#f97316" stroke-width="1.5"/>
<text x="125" y="79" text-anchor="middle" font-size="9" fill="#f97316" font-family="sans-serif" font-weight="bold">V</text>
<line x1="135" y1="75" x2="150" y2="75" stroke="#94a3b8" stroke-width="1.5"/>
<text x="125" y="95" text-anchor="middle" font-size="8" fill="#64748b" font-family="sans-serif">вольтметр</text>
<text x="125" y="105" text-anchor="middle" font-size="7" fill="#f97316" font-family="sans-serif">(параллельно)</text>
<line x1="100" y1="125" x2="110" y2="125" stroke="#94a3b8" stroke-width="1.5"/>
<rect x="110" y="120" width="25" height="10" rx="2" fill="none" stroke="#94a3b8" stroke-width="1.5"/>
<line x1="135" y1="125" x2="150" y2="125" stroke="#94a3b8" stroke-width="1.5"/>
<text x="125" y="140" text-anchor="middle" font-size="8" fill="#64748b" font-family="sans-serif">резистор</text>
</svg>
</div>
<div class="idiag">
<h3>💡 Схема простейшей цепи</h3>
<svg width="100%" viewBox="0 0 200 160" style="display:block">
<line x1="30" y1="30" x2="170" y2="30" stroke="#94a3b8" stroke-width="2"/>
<line x1="170" y1="30" x2="170" y2="130" stroke="#94a3b8" stroke-width="2"/>
<line x1="170" y1="130" x2="30" y2="130" stroke="#94a3b8" stroke-width="2"/>
<line x1="30" y1="130" x2="30" y2="30" stroke="#94a3b8" stroke-width="2"/>
<line x1="30" y1="65" x2="30" y2="95" stroke="#94a3b8" stroke-width="1"/>
<line x1="24" y1="70" x2="36" y2="70" stroke="#94a3b8" stroke-width="2.5"/>
<line x1="26" y1="78" x2="34" y2="78" stroke="#94a3b8" stroke-width="1.5"/>
<text x="14" y="68" font-size="7" fill="#fbbf24" font-family="sans-serif">+</text>
<text x="14" y="81" font-size="7" fill="#94a3b8" font-family="sans-serif"></text>
<text x="30" y="145" text-anchor="middle" font-size="8" fill="#64748b" font-family="sans-serif">источник</text>
<circle cx="80" cy="30" r="2.5" fill="#94a3b8"/>
<line x1="82" y1="30" x2="97" y2="22" stroke="#22c55e" stroke-width="2"/>
<circle cx="100" cy="30" r="2.5" fill="#94a3b8"/>
<text x="90" y="17" text-anchor="middle" font-size="7" fill="#22c55e" font-family="sans-serif">К</text>
<circle cx="140" cy="30" r="8" fill="none" stroke="#22c55e" stroke-width="1.5"/>
<text x="140" y="34" text-anchor="middle" font-size="8" fill="#22c55e" font-family="sans-serif" font-weight="bold">A</text>
<circle cx="170" cy="80" r="10" fill="none" stroke="#fbbf24" stroke-width="1.5"/>
<line x1="164" y1="74" x2="176" y2="86" stroke="#fbbf24" stroke-width="1.5"/>
<line x1="176" y1="74" x2="164" y2="86" stroke="#fbbf24" stroke-width="1.5"/>
<line x1="150" y1="90" x2="150" y2="115" stroke="#f97316" stroke-width="1" stroke-dasharray="3,2"/>
<line x1="150" y1="115" x2="190" y2="115" stroke="#f97316" stroke-width="1" stroke-dasharray="3,2"/>
<line x1="190" y1="115" x2="190" y2="70" stroke="#f97316" stroke-width="1" stroke-dasharray="3,2"/>
<line x1="190" y1="70" x2="175" y2="70" stroke="#f97316" stroke-width="1" stroke-dasharray="3,2"/>
<circle cx="170" cy="115" r="7" fill="none" stroke="#f97316" stroke-width="1.5"/>
<text x="170" y="119" text-anchor="middle" font-size="7" fill="#f97316" font-family="sans-serif" font-weight="bold">V</text>
<polygon points="100,27 93,23 93,31" fill="#fbbf24" opacity=".5"/>
<text x="100" y="15" text-anchor="middle" font-size="6.5" fill="#fbbf24" font-family="sans-serif">→ ток</text>
</svg>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li><b>Амперметр</b> — последовательно (в разрыв), малое R, соблюдать полярность.</li>
<li><b>Вольтметр</b> — параллельно участку, большое R, соблюдать полярность.</li>
<li>Нельзя превышать предел измерений прибора!</li>
<li>Амперметр, включённый параллельно — это фактически короткое замыкание.</li>
</ul>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Электрическая цепь с амперметром и вольтметром</div>
<div class="idiag">
<h3>🔌 Замкни цепь и следи за показаниями приборов</h3>
<canvas id="cv21" style="width:100%;height:280px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<button class="btn btn-pri" id="btn21key" onclick="toggle21()">🔑 Замкнуть ключ</button>
<div class="slider-row" style="flex:1;min-width:180px">
<span class="slider-lbl">$U$ источника:</span>
<input type="range" id="sl21U" min="1" max="12" value="6" style="flex:1" oninput="lbl21U.textContent=this.value+' В';upd21();">
<span class="slider-val"><span id="lbl21U">6 В</span></span>
</div>
<div class="slider-row" style="flex:1;min-width:180px">
<span class="slider-lbl">$R$ нагрузки:</span>
<input type="range" id="sl21R" min="2" max="24" value="6" style="flex:1" oninput="lbl21R.textContent=this.value+' Ом';upd21();">
<span class="slider-val"><span id="lbl21R">6 Ом</span></span>
</div>
</div>
<div class="idiag-result" id="res21">Цепь разомкнута: $I = 0$, $U_\text{нагр} = 0$</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §21</div>
<ul class="key-points-list">
<li>Электрическая цепь: источник + нагрузка + провода + ключ. Ток идёт только в <b>замкнутой</b> цепи.</li>
<li><b>Амперметр</b> (А) включается <b>последовательно</b> (в разрыв цепи), имеет малое сопротивление.</li>
<li><b>Вольтметр</b> (V) включается <b>параллельно</b> измеряемому участку, имеет большое сопротивление.</li>
<li>Оба прибора: соблюдать полярность («+» прибора к «+» источника) и не превышать предел измерений!</li>
</ul>
</div>
</div>
<!-- §22 -->
<div class="content" id="tab-ref22">
<div class="para-hero ph-22">
<div class="ph-label">§22 · Физика 8 кл</div>
<h2>Связь силы тока и напряжения. Закон Ома</h2>
<div class="ph-formula">$I = U/R$</div>
<div class="ph-desc">Сила тока прямо пропорциональна напряжению и обратно пропорциональна сопротивлению.</div>
<div class="ph-tags"><span class="ph-tag">$I = U/R$ [А]</span><span class="ph-tag">$R = U/I$ [Ом]</span><span class="ph-tag">📈 ВАХ — прямая</span></div>
</div>
<div class="section-title"><i class="fas fa-wave-square"></i> §22. Закон Ома для участка цепи</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Закон Ома (1826)</h3>
<div class="main-f">$I = U/R$</div>
<p>Сила тока прямо пропорциональна напряжению и обратно пропорциональна сопротивлению участка цепи.</p>
<p>$R = U/I$ — сопротивление проводника. $U = IR$ — напряжение на участке.</p>
<p>Единица: $1\ \text{Ом} = 1\ \text{В}/\text{А}$</p>
</div>
<div class="fcard">
<h3>Сопротивление R</h3>
<div class="main-f">$R = U/I$</div>
<p>Сопротивление — мера противодействия проводника движению зарядов. Зависит от материала, размеров, температуры.</p>
<p><b>Резисторы</b> — элементы с заданным сопротивлением.</p>
<p>⚠️ <b>Короткое замыкание</b>: R→0 → I→∞ → пожар!</p>
</div>
</div>
<div class="idiag">
<h3>📈 Вольт-амперная характеристика (ВАХ)</h3>
<svg width="100%" viewBox="0 0 260 130" style="display:block">
<line x1="30" y1="110" x2="245" y2="110" stroke="var(--border)" stroke-width="1.5"/>
<line x1="30" y1="10" x2="30" y2="110" stroke="var(--border)" stroke-width="1.5"/>
<polygon points="245,110 237,106 237,114" fill="var(--border)"/>
<polygon points="30,10 26,18 34,18" fill="var(--border)"/>
<text x="250" y="114" font-size="9" fill="#64748b" font-family="sans-serif">U, В</text>
<text x="20" y="9" font-size="9" fill="#64748b" font-family="sans-serif">I</text>
<line x1="30" y1="110" x2="220" y2="20" stroke="#1d4ed8" stroke-width="2.5"/>
<text x="165" y="18" font-size="8.5" fill="#1d4ed8" font-family="sans-serif">R₁ малое → крутая линия</text>
<line x1="30" y1="110" x2="220" y2="70" stroke="#6366f1" stroke-width="2" opacity=".7"/>
<text x="195" y="68" font-size="8" fill="#6366f1" font-family="sans-serif">R₂ большое</text>
<text x="27" y="123" font-size="8" fill="#64748b" font-family="sans-serif">0</text>
<text x="10" y="114" font-size="7" fill="#94a3b8" font-family="sans-serif">I=0</text>
<text x="60" y="95" font-size="7.5" fill="#94a3b8" font-family="sans-serif">tg α = 1/R</text>
</svg>
<p style="font-size:.8rem;color:var(--muted)">Угол наклона ВАХ: больший наклон = меньшее сопротивление. Прямая через начало координат = закон Ома выполняется (омический проводник).</p>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>$I = U/R$ — ток растёт при росте $U$ и уменьшается при росте $R$.</li>
<li>Сопротивление проводника — <b>его свойство</b>: не зависит от тока и напряжения (для омических проводников).</li>
<li>Короткое замыкание (КЗ): $R \approx 0$ → ток очень большой → нагрев → пожар. Защита — предохранители!</li>
<li>ВАХ резистора — прямая линия. Уклон = 1/R.</li>
</ul>
</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon">💡</div><div class="li-title">Нить накала лампы</div><div class="li-desc">$R = 440\ \text{Ом}$ при 220 В → $I = 0{,}5\ \text{А}$; $P = 110\ \text{Вт}$</div></div>
<div class="life-item"><div class="li-icon">🔌</div><div class="li-title">Удлинитель</div><div class="li-desc">Малое R проводов → небольшое напряжение теряется в самом проводе</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Предохранитель</div><div class="li-desc">Плавкий металл с низкой t_пл: при КЗ → ток велик → плавится → цепь разрывается</div></div>
<div class="life-item"><div class="li-icon">🎛️</div><div class="li-title">Потенциометр</div><div class="li-desc">Переменный резистор — регулятор громкости, яркости, скорости мотора</div></div>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Закон Ома (виртуальная лаборатория)</div>
<div class="idiag">
<h3>🧪 Виртуальная лаборатория: $I = U/R$ с приборами</h3>
<canvas id="cv22" style="width:100%;height:300px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:200px">
<span class="slider-lbl">🔋 U:</span>
<input type="range" id="sl22U" min="0" max="24" step="0.5" value="12" style="flex:1" oninput="lbl22U.textContent=this.value+' В';upd22();">
<span class="slider-val"><span id="lbl22U">12 В</span></span>
</div>
<div class="slider-row" style="flex:1;min-width:200px">
<span class="slider-lbl">⚙️ R:</span>
<input type="range" id="sl22R" min="1" max="50" value="6" style="flex:1" oninput="lbl22R.textContent=this.value+' Ом';upd22();">
<span class="slider-val"><span id="lbl22R">6 Ом</span></span>
</div>
</div>
<div class="ctrl-row" style="margin-top:8px;gap:8px">
<span class="val-chip" id="chip22I">A: 0.00 А</span>
<span class="val-chip" id="chip22V">V: 0.0 В</span>
<span class="val-chip" id="chip22P">P: 0.0 Вт</span>
</div>
<div class="idiag-result" id="res22">$I = U/R = 12/6 = 2{,}00$ А</div>
<p class="cv-cap"><i class="fas fa-info-circle"></i> Амперметр (A) подключён последовательно — показывает ток I. Вольтметр (V) параллельно резистору — показывает напряжение U на нём. Меняй U и R слайдерами, наблюдай за стрелками!</p>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §22</div>
<ul class="key-points-list">
<li>Закон Ома: $I = U/R$ — ток прямо пропорционален напряжению и обратно пропорционален сопротивлению.</li>
<li>Сопротивление $R = U/I$ — свойство проводника, не зависит от тока и напряжения (для омических проводников).</li>
<li>ВАХ резистора — прямая через начало координат; угол наклона $\tan\alpha = 1/R$.</li>
<li>Короткое замыкание (КЗ): $R \to 0$ → ток очень большой → нагрев → пожар. Защита — предохранители!</li>
</ul>
</div>
</div>
<!-- §23 -->
<div class="content" id="tab-ref23">
<div class="para-hero ph-23">
<div class="ph-label">§23 · Физика 8 кл</div>
<h2>Единица сопротивления. Расчёт сопротивления</h2>
<div class="ph-formula">$R = \rho l/S$</div>
<div class="ph-desc">Сопротивление зависит от материала, длины и площади сечения проводника.</div>
<div class="ph-tags"><span class="ph-tag">$R = \rho l/S$</span><span class="ph-tag">$[\rho]$ = Ом·мм²/м</span><span class="ph-tag">🔬 сверхпроводимость</span></div>
</div>
<div class="section-title"><i class="fas fa-ruler"></i> §23. Единица сопротивления. Расчёт сопротивления</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Формула сопротивления проводника</h3>
<div class="main-f">$R = \rho l/S$</div>
<p>$\rho$ — удельное сопротивление вещества [Ом·мм²/м]</p>
<p>$l$ — длина проводника [м]</p>
<p>$S$ — площадь поперечного сечения [мм²]</p>
<p>↑$l$ → ↑$R$; &nbsp; ↑$S$ → ↓$R$</p>
</div>
<div class="fcard">
<h3>Удельное сопротивление ρ</h3>
<div class="main-f" style="font-size:.82rem">R проводника l=1м, S=1мм²</div>
<table style="width:100%;font-size:.78rem;border-collapse:collapse;margin-top:6px">
<tr><td style="padding:3px">Серебро</td><td style="padding:3px;font-weight:700">0,016</td><td style="padding:3px">Медь</td><td style="padding:3px;font-weight:700">0,017</td></tr>
<tr><td>Алюминий</td><td style="font-weight:700">0,028</td><td>Железо</td><td style="font-weight:700">0,10</td></tr>
<tr><td>Нихром</td><td style="font-weight:700">1,10</td><td>Константан</td><td style="font-weight:700">0,50</td></tr>
</table>
<p style="font-size:.75rem;color:var(--muted);margin-top:4px">Единица ρ: Ом·мм²/м</p>
</div>
</div>
<div class="idiag">
<h3>📊 Визуализация зависимостей сопротивления</h3>
<svg width="100%" viewBox="0 0 300 100" style="display:block">
<text x="60" y="12" text-anchor="middle" font-size="8.5" fill="#94a3b8" font-family="sans-serif" font-weight="bold">R зависит от l</text>
<rect x="10" y="20" width="30" height="15" rx="3" fill="#1d4ed8" opacity=".7"/>
<text x="25" y="50" text-anchor="middle" font-size="7" fill="#94a3b8" font-family="sans-serif">l = 1м</text>
<text x="25" y="60" text-anchor="middle" font-size="8" fill="#1d4ed8" font-family="sans-serif" font-weight="bold">R</text>
<rect x="60" y="20" width="80" height="15" rx="3" fill="#1d4ed8" opacity=".7"/>
<text x="100" y="50" text-anchor="middle" font-size="7" fill="#94a3b8" font-family="sans-serif">l = 4м</text>
<text x="100" y="60" text-anchor="middle" font-size="8" fill="#1d4ed8" font-family="sans-serif" font-weight="bold">4R</text>
<text x="60" y="80" text-anchor="middle" font-size="7.5" fill="#6366f1" font-family="sans-serif">R ∝ l (в 4 раза длиннее → R в 4 раза больше)</text>
<text x="230" y="12" text-anchor="middle" font-size="8.5" fill="#94a3b8" font-family="sans-serif" font-weight="bold">R зависит от S</text>
<rect x="165" y="28" width="30" height="5" rx="2" fill="#0891b2" opacity=".8"/>
<text x="180" y="48" text-anchor="middle" font-size="7" fill="#94a3b8" font-family="sans-serif">S малое</text>
<text x="180" y="58" text-anchor="middle" font-size="8" fill="#0891b2" font-family="sans-serif" font-weight="bold">R большое</text>
<rect x="215" y="22" width="30" height="17" rx="2" fill="#0891b2" opacity=".8"/>
<text x="230" y="48" text-anchor="middle" font-size="7" fill="#94a3b8" font-family="sans-serif">S большое</text>
<text x="230" y="58" text-anchor="middle" font-size="8" fill="#0891b2" font-family="sans-serif" font-weight="bold">R малое</text>
<text x="210" y="80" text-anchor="middle" font-size="7.5" fill="#0369a1" font-family="sans-serif">R ∝ 1/S (шире провод → меньше сопротивление)</text>
</svg>
</div>
<div class="insight-box">
<div class="insight-title"><i class="fas fa-lightbulb"></i> Сверхпроводимость</div>
<p>При очень низких температурах (−269°C для Hg) сопротивление некоторых металлов падает до нуля! Ток в сверхпроводящем кольце течёт годами без потерь. Применение: сверхмощные магниты в МРТ и ускорителях частиц, сверхпроводящие кабели для передачи электроэнергии без потерь.</p>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>$R = \rho l/S$: длиннее → больше сопротивление; толще → меньше сопротивление.</li>
<li>Удельное сопротивление $\rho$ — свойство вещества (не конкретного проводника).</li>
<li>Нихром и константан — специальные сплавы с высоким $\rho$: нагревательные элементы, реостаты.</li>
</ul>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Калькулятор $R = \rho l/S$</div>
<div class="idiag">
<h3>📐 Меняй параметры — наблюдай сопротивление</h3>
<canvas id="cv23" style="width:100%;height:150px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<select id="sel23mat" onchange="upd23()" style="padding:6px 10px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text)">
<option value="0.017">🟤 Медь (ρ=0,017)</option>
<option value="0.028">⚙️ Алюминий (ρ=0,028)</option>
<option value="0.10">🔩 Железо (ρ=0,10)</option>
<option value="0.50">🔵 Константан (ρ=0,50)</option>
<option value="1.10">🌡️ Нихром (ρ=1,10)</option>
</select>
<div class="slider-row" style="flex:1;min-width:160px">
<span class="slider-lbl">$l$:</span>
<input type="range" id="sl23l" min="0.1" max="10" step="0.1" value="1" style="flex:1" oninput="lbl23l.textContent=(+this.value).toFixed(1)+' м';upd23();">
<span class="slider-val"><span id="lbl23l">1.0 м</span></span>
</div>
<div class="slider-row" style="flex:1;min-width:160px">
<span class="slider-lbl">$S$:</span>
<input type="range" id="sl23S" min="0.1" max="5" step="0.1" value="1" style="flex:1" oninput="lbl23S.textContent=(+this.value).toFixed(1)+' мм²';upd23();">
<span class="slider-val"><span id="lbl23S">1.0 мм²</span></span>
</div>
</div>
<div class="idiag-result" id="res23">$R = 0{,}017$ Ом</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §23</div>
<ul class="key-points-list">
<li>Сопротивление проводника: $R = \rho l/S$ — зависит от материала ($\rho$), длины ($l$) и площади сечения ($S$).</li>
<li>Длиннее провод → больше $R$; толще провод (больше $S$) → меньше $R$.</li>
<li>Удельное сопротивление $\rho$ — свойство <b>вещества</b>: для меди $\rho = 0{,}017$ Ом·мм²/м, для нихрома $\rho = 1{,}10$.</li>
<li>Сверхпроводимость: при очень низких температурах сопротивление некоторых металлов падает до нуля.</li>
</ul>
</div>
</div>
<!-- §24 -->
<div class="content" id="tab-ref24">
<div class="para-hero ph-24">
<div class="ph-label">§24 · Физика 8 кл</div>
<h2>Последовательное соединение. Реостат</h2>
<div class="ph-desc">При последовательном: I одинаков, U и R складываются. Реостат — переменный резистор.</div>
<div class="ph-tags"><span class="ph-tag">$I_1 = I_2 = I$</span><span class="ph-tag">$U = U_1+U_2$</span><span class="ph-tag">$R = R_1+R_2$</span></div>
</div>
<div class="section-title"><i class="fas fa-link"></i> §24. Последовательное соединение. Реостат</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Законы последовательного соединения</h3>
<div class="main-f" style="font-size:.82rem">$I_1 = I_2 = I$ &nbsp;·&nbsp; $U = U_1 + U_2$ &nbsp;·&nbsp; $R = R_1 + R_2$</div>
<p><b>Ток одинаков</b> на всех участках (через один участок за одно время проходит одинаковый заряд).</p>
<p><b>Напряжения складываются</b>: $U_i = IR_i$; чем больше $R$ — тем больше доля напряжения.</p>
<p><b>Сопротивления складываются</b>: для N одинаковых $R = NR_1$.</p>
</div>
<div class="fcard">
<h3>Реостат</h3>
<div class="main-f" style="font-size:.85rem">переменный резистор</div>
<p>Реостат — устройство для плавного изменения сопротивления в цепи (и следовательно, тока).</p>
<p>Обмотка из проволоки с высоким $\rho$ (нихром), ползунок выбирает рабочую длину $l$.</p>
<p>Применение: регуляторы яркости, скорости двигателей, зарядные устройства.</p>
</div>
</div>
<div class="idiag">
<h3>📌 Схема последовательного соединения</h3>
<svg width="100%" viewBox="0 0 280 80" style="display:block">
<line x1="10" y1="40" x2="60" y2="40" stroke="#475569" stroke-width="2"/>
<line x1="100" y1="40" x2="140" y2="40" stroke="#475569" stroke-width="2"/>
<line x1="180" y1="40" x2="220" y2="40" stroke="#475569" stroke-width="2"/>
<line x1="260" y1="40" x2="280" y2="40" stroke="#475569" stroke-width="2"/>
<rect x="60" y="32" width="40" height="16" rx="3" fill="none" stroke="#1d4ed8" stroke-width="2"/>
<text x="80" y="44" text-anchor="middle" font-size="9" fill="#1d4ed8" font-family="sans-serif" font-weight="bold">R₁</text>
<rect x="140" y="32" width="40" height="16" rx="3" fill="none" stroke="#6366f1" stroke-width="2"/>
<text x="160" y="44" text-anchor="middle" font-size="9" fill="#6366f1" font-family="sans-serif" font-weight="bold">R₂</text>
<line x1="220" y1="35" x2="220" y2="45" stroke="#94a3b8" stroke-width="2"/>
<line x1="225" y1="32" x2="225" y2="48" stroke="#94a3b8" stroke-width="3"/>
<text x="222" y="28" font-size="7" fill="#94a3b8" font-family="sans-serif"></text>
<text x="227" y="28" font-size="7" fill="#fbbf24" font-family="sans-serif">+</text>
<polygon points="35,37 25,33 25,43" fill="#fbbf24" opacity=".7"/>
<text x="35" y="30" font-size="7.5" fill="#fbbf24" font-family="sans-serif">I</text>
<polygon points="118,37 108,33 108,43" fill="#fbbf24" opacity=".7"/>
<text x="118" y="30" font-size="7.5" fill="#fbbf24" font-family="sans-serif">I</text>
<text x="80" y="68" text-anchor="middle" font-size="7.5" fill="#1d4ed8" font-family="sans-serif">U₁ = IR₁</text>
<text x="160" y="68" text-anchor="middle" font-size="7.5" fill="#6366f1" font-family="sans-serif">U₂ = IR₂</text>
<text x="240" y="70" font-size="7.5" fill="#94a3b8" font-family="sans-serif">U=U₁+U₂</text>
</svg>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Ток одинаков во всей последовательной цепи — это следствие закона сохранения заряда.</li>
<li>Напряжение делится <b>пропорционально сопротивлениям</b>: $U_1/U_2 = R_1/R_2$.</li>
<li>Новогодние лампочки в гирлянде — последовательное соединение. Если одна сгорела — все гаснут!</li>
<li>Реостат включают последовательно с нагрузкой для регулировки тока.</li>
</ul>
</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon">🎄</div><div class="li-title">Гирлянда</div><div class="li-desc">Лампочки последовательно: перегорела одна — гаснет вся гирлянда</div></div>
<div class="life-item"><div class="li-icon">🎛️</div><div class="li-title">Реостат</div><div class="li-desc">Последовательно с нагрузкой: двигает ползунок → меняет R → меняет I</div></div>
<div class="life-item"><div class="li-icon">🔋</div><div class="li-title">Батарейки «в ряд»</div><div class="li-desc">Батарейки последовательно: напряжения складываются (1,5+1,5=3 В)</div></div>
<div class="life-item"><div class="li-icon">💡</div><div class="li-title">Делитель напряжения</div><div class="li-desc">Два резистора последовательно делят напряжение пропорционально R</div></div>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Последовательная цепь</div>
<div class="idiag">
<h3>🔗 Меняй резисторы — наблюдай U₁, U₂, I</h3>
<canvas id="cv24" style="width:100%;height:200px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:160px">
<span class="slider-lbl">$U$:</span>
<input type="range" id="sl24U" min="1" max="12" value="6" style="flex:1" oninput="lbl24U.textContent=this.value+' В';upd24();">
<span class="slider-val"><span id="lbl24U">6 В</span></span>
</div>
<div class="slider-row" style="flex:1;min-width:160px">
<span class="slider-lbl">$R_1$:</span>
<input type="range" id="sl24R1" min="1" max="50" value="10" style="flex:1" oninput="lbl24R1.textContent=this.value+' Ом';upd24();">
<span class="slider-val"><span id="lbl24R1">10 Ом</span></span>
</div>
<div class="slider-row" style="flex:1;min-width:160px">
<span class="slider-lbl">$R_2$:</span>
<input type="range" id="sl24R2" min="1" max="50" value="10" style="flex:1" oninput="lbl24R2.textContent=this.value+' Ом';upd24();">
<span class="slider-val"><span id="lbl24R2">10 Ом</span></span>
</div>
</div>
<div class="idiag-result" id="res24">$R = 20$ Ом; $I = 0{,}30$ А; $U_1 = U_2 = 3{,}0$ В</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §24</div>
<ul class="key-points-list">
<li>При последовательном соединении ток одинаков: $I_1 = I_2 = I$ — следствие закона сохранения заряда.</li>
<li>Напряжения складываются: $U = U_1 + U_2$; они делятся пропорционально сопротивлениям.</li>
<li>Суммарное сопротивление: $R = R_1 + R_2$ — всегда больше каждого из слагаемых.</li>
<li>Реостат — переменный резистор, включается последовательно для регулировки тока в цепи.</li>
</ul>
</div>
</div>
<!-- §25 -->
<div class="content" id="tab-ref25">
<div class="para-hero ph-25">
<div class="ph-label">§25 · Физика 8 кл</div>
<h2>Параллельное соединение проводников</h2>
<div class="ph-desc">При параллельном: U одинаково, токи складываются, R меньше наименьшего.</div>
<div class="ph-tags"><span class="ph-tag">$U_1 = U_2 = U$</span><span class="ph-tag">$I = I_1+I_2$</span><span class="ph-tag">$R < R_{min}$</span></div>
</div>
<div class="section-title"><i class="fas fa-code-branch"></i> §25. Параллельное соединение проводников</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Законы параллельного соединения</h3>
<div class="main-f" style="font-size:.82rem">$U_1 = U_2 = U$ &nbsp;·&nbsp; $I = I_1 + I_2$ &nbsp;·&nbsp; $\dfrac{1}{R} = \dfrac{1}{R_1} + \dfrac{1}{R_2}$</div>
<p><b>Напряжение одинаково</b> на всех параллельных ветвях (подключены к одним точкам).</p>
<p><b>Токи складываются</b>: $I_i = U/R_i$; через меньший $R$ — больший ток.</p>
<p><b>Общее R меньше</b> любого из параллельных: $R < R_{min}$.</p>
</div>
<div class="fcard">
<h3>Частные случаи</h3>
<div class="main-f" style="font-size:.85rem">$R = \dfrac{R_1 R_2}{R_1 + R_2}$</div>
<p>Для двух резисторов: $R = R_1 R_2 / (R_1 + R_2)$.</p>
<p>Для N одинаковых: $R = R_1 / N$.</p>
<p>Параллельное соединение <b>увеличивает суммарный ток</b> при том же напряжении.</p>
</div>
</div>
<div class="idiag">
<h3>📌 Схема параллельного соединения</h3>
<svg width="100%" viewBox="0 0 280 110" style="display:block">
<line x1="30" y1="15" x2="30" y2="95" stroke="#fbbf24" stroke-width="2.5"/>
<line x1="220" y1="15" x2="220" y2="95" stroke="#fbbf24" stroke-width="2.5"/>
<line x1="30" y1="30" x2="80" y2="30" stroke="#475569" stroke-width="2"/>
<rect x="80" y="22" width="50" height="16" rx="3" fill="none" stroke="#1d4ed8" stroke-width="2"/>
<text x="105" y="34" text-anchor="middle" font-size="9" fill="#1d4ed8" font-family="sans-serif" font-weight="bold">R₁</text>
<line x1="130" y1="30" x2="220" y2="30" stroke="#475569" stroke-width="2"/>
<polygon points="55,27 45,23 45,31" fill="#1d4ed8" opacity=".7"/>
<text x="60" y="22" font-size="7" fill="#1d4ed8" font-family="sans-serif">I₁=U/R₁</text>
<line x1="30" y1="80" x2="80" y2="80" stroke="#475569" stroke-width="2"/>
<rect x="80" y="72" width="50" height="16" rx="3" fill="none" stroke="#6366f1" stroke-width="2"/>
<text x="105" y="84" text-anchor="middle" font-size="9" fill="#6366f1" font-family="sans-serif" font-weight="bold">R₂</text>
<line x1="130" y1="80" x2="220" y2="80" stroke="#475569" stroke-width="2"/>
<polygon points="55,77 45,73 45,81" fill="#6366f1" opacity=".7"/>
<text x="60" y="71" font-size="7" fill="#6366f1" font-family="sans-serif">I₂=U/R₂</text>
<line x1="250" y1="30" x2="250" y2="80" stroke="#94a3b8" stroke-width="1.5"/>
<line x1="244" y1="40" x2="256" y2="40" stroke="#94a3b8" stroke-width="2.5"/>
<line x1="247" y1="55" x2="253" y2="55" stroke="#94a3b8" stroke-width="1.5"/>
<line x1="220" y1="30" x2="250" y2="30" stroke="#94a3b8" stroke-width="1.5"/>
<line x1="220" y1="80" x2="250" y2="80" stroke="#94a3b8" stroke-width="1.5"/>
<text x="258" y="38" font-size="7" fill="#fbbf24" font-family="sans-serif">+</text>
<text x="258" y="57" font-size="7" fill="#94a3b8" font-family="sans-serif"></text>
<text x="20" y="60" font-size="7.5" fill="#fbbf24" font-family="sans-serif" text-anchor="middle" transform="rotate(-90,20,55)">I=I₁+I₂</text>
<text x="105" y="105" text-anchor="middle" font-size="7.5" fill="#94a3b8" font-family="sans-serif">U₁ = U₂ = U</text>
</svg>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Параллельное соединение: $R < R_{min}$. Чем больше ветвей тем меньше общее сопротивление.</li>
<li>Ток делится обратно пропорционально сопротивлениям: через меньший $R$ идёт больший ток.</li>
<li>В квартирной сети — <b>параллельное соединение</b>: каждый прибор получает 220 В независимо от других.</li>
<li>При добавлении параллельной ветви: общий ток растёт, напряжение — не меняется.</li>
</ul>
</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon">🏠</div><div class="li-title">Квартирная проводка</div><div class="li-desc">Все розетки — параллельно: каждый прибор получает 220 В, работает независимо</div></div>
<div class="life-item"><div class="li-icon">🚗</div><div class="li-title">Электрика автомобиля</div><div class="li-desc">Всё параллельно аккумулятору: включаешь свет — другие потребители продолжают работать</div></div>
<div class="life-item"><div class="li-icon">🔋</div><div class="li-title">Батарейки «параллельно»</div><div class="li-desc">Параллельно: U то же, но ёмкость растёт — дольше работают</div></div>
<div class="life-item"><div class="li-icon">💻</div><div class="li-title">USB-хаб</div><div class="li-desc">Все USB-порты параллельно: каждое устройство получает 5 В независимо</div></div>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Параллельная цепь</div>
<div class="idiag">
<h3>⚡ Меняй резисторы — наблюдай I₁, I₂ и общий ток</h3>
<canvas id="cv25" style="width:100%;height:220px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:160px">
<span class="slider-lbl">$U$:</span>
<input type="range" id="sl25U" min="1" max="12" value="12" style="flex:1" oninput="lbl25U.textContent=this.value+' В';upd25();">
<span class="slider-val"><span id="lbl25U">12 В</span></span>
</div>
<div class="slider-row" style="flex:1;min-width:160px">
<span class="slider-lbl">$R_1$:</span>
<input type="range" id="sl25R1" min="1" max="50" value="6" style="flex:1" oninput="lbl25R1.textContent=this.value+' Ом';upd25();">
<span class="slider-val"><span id="lbl25R1">6 Ом</span></span>
</div>
<div class="slider-row" style="flex:1;min-width:160px">
<span class="slider-lbl">$R_2$:</span>
<input type="range" id="sl25R2" min="1" max="50" value="12" style="flex:1" oninput="lbl25R2.textContent=this.value+' Ом';upd25();">
<span class="slider-val"><span id="lbl25R2">12 Ом</span></span>
</div>
</div>
<div class="idiag-result" id="res25">$I_1 = 2{,}0$ А; $I_2 = 1{,}0$ А; $I = 3{,}0$ А; $R = 4{,}0$ Ом</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §25</div>
<ul class="key-points-list">
<li>При параллельном соединении напряжение одинаково: $U_1 = U_2 = U$ — ветви подключены к одним и тем же точкам.</li>
<li>Токи складываются: $I = I_1 + I_2$; через меньший $R$ идёт больший ток.</li>
<li>Суммарное сопротивление меньше любого из параллельных: $\frac{1}{R} = \frac{1}{R_1} + \frac{1}{R_2}$, $R < R_{min}$.</li>
<li>Квартирная проводка — параллельное соединение: каждый прибор получает 220 В независимо от других.</li>
</ul>
</div>
</div>
<!-- §26 -->
<div class="content" id="tab-ref26">
<div class="para-hero ph-26">
<div class="ph-label">§26 · Физика 8 кл</div>
<h2>Работа и мощность электрического тока. Закон Джоуля—Ленца</h2>
<div class="ph-formula">$Q = I^2Rt$</div>
<div class="ph-desc">$A = IUt$. $P = IU$. $Q = I^2Rt$ — теплота, выделяемая в проводнике.</div>
<div class="ph-tags"><span class="ph-tag">$A = IUt$</span><span class="ph-tag">$P = IU$</span><span class="ph-tag">$Q = I^2Rt$</span></div>
</div>
<div class="section-title"><i class="fas fa-fire-flame-curved"></i> §26. Работа и мощность электрического тока. Закон Джоуля—Ленца</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Работа и мощность тока</h3>
<div class="main-f">$A = IUt$ &nbsp; $P = IU$</div>
<p>$A = IUt = I^2Rt = U^2t/R$ [Дж]</p>
<p>$P = IU = I^2R = U^2/R$ [Вт]</p>
<p>1 Вт = 1 Дж/с; &nbsp; 1 кВт·ч = $3{,}6 \times 10^6$ Дж</p>
</div>
<div class="fcard">
<h3>Закон Джоуля—Ленца</h3>
<div class="main-f">$Q = I^2Rt$</div>
<p>Количество теплоты, выделяемое в проводнике с током, пропорционально квадрату тока, сопротивлению и времени.</p>
<p>Назван в честь Д. П. Джоуля и Э. X. Ленца (1841).</p>
<p>Применение: нагреватели, лампы накаливания.</p>
</div>
</div>
<div class="idiag">
<h3>💡 Потребляемая мощность бытовых приборов</h3>
<svg width="100%" viewBox="0 0 300 90" style="display:block">
<line x1="20" y1="70" x2="285" y2="70" stroke="var(--border)" stroke-width="1.5"/>
<text x="285" y="75" font-size="7.5" fill="#64748b" font-family="sans-serif">Вт</text>
<rect x="22" y="57" width="7" height="13" rx="2" fill="#22c55e"/>
<text x="25" y="53" font-size="6.5" fill="#22c55e" font-family="sans-serif" text-anchor="middle">LED</text>
<text x="25" y="83" font-size="6.5" fill="#94a3b8" font-family="sans-serif" text-anchor="middle">10</text>
<rect x="55" y="50" width="14" height="20" rx="2" fill="#fbbf24"/>
<text x="62" y="46" font-size="6.5" fill="#fbbf24" font-family="sans-serif" text-anchor="middle">Лампа</text>
<text x="62" y="83" font-size="6.5" fill="#94a3b8" font-family="sans-serif" text-anchor="middle">60</text>
<rect x="95" y="44" width="18" height="26" rx="2" fill="#3b82f6"/>
<text x="104" y="40" font-size="6.5" fill="#3b82f6" font-family="sans-serif" text-anchor="middle">Холод.</text>
<text x="104" y="83" font-size="6.5" fill="#94a3b8" font-family="sans-serif" text-anchor="middle">150</text>
<rect x="140" y="30" width="22" height="40" rx="2" fill="#f97316"/>
<text x="151" y="26" font-size="6.5" fill="#f97316" font-family="sans-serif" text-anchor="middle">Утюг</text>
<text x="151" y="83" font-size="6.5" fill="#94a3b8" font-family="sans-serif" text-anchor="middle">1500</text>
<rect x="185" y="22" width="25" height="48" rx="2" fill="#ef4444"/>
<text x="197" y="18" font-size="6.5" fill="#ef4444" font-family="sans-serif" text-anchor="middle">Чайник</text>
<text x="197" y="83" font-size="6.5" fill="#94a3b8" font-family="sans-serif" text-anchor="middle">2000</text>
<rect x="232" y="12" width="28" height="58" rx="2" fill="#dc2626"/>
<text x="246" y="8" font-size="6.5" fill="#dc2626" font-family="sans-serif" text-anchor="middle">Стир.машина</text>
<text x="246" y="83" font-size="6.5" fill="#94a3b8" font-family="sans-serif" text-anchor="middle">2500</text>
</svg>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>$A = IUt$: чем больше ток, напряжение или время — тем больше работа.</li>
<li>$Q = I^2Rt$: тепло пропорционально <b>квадрату тока</b>! Удвоение тока → тепла в 4 раза больше.</li>
<li>1 кВт·ч = $3{,}6$ МДж — единица электроэнергии на электросчётчике.</li>
<li>КПД электроприбора = $A_{\text{полезная}} / A_{\text{затраченная}}$. У нагревателей ≈ 99%; у ламп накаливания — ≈ 5%.</li>
</ul>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Закон Джоуля-Ленца</div>
<div class="idiag">
<h3>🌡️ Нагрев спирали: $Q = I^2Rt$ — крути ток и наблюдай</h3>
<canvas id="cv26" style="width:100%;height:260px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:160px">
<span class="slider-lbl">⚡ I:</span>
<input type="range" id="sl26I" min="0.1" max="10" step="0.1" value="3" style="flex:1" oninput="lbl26I.textContent=(+this.value).toFixed(1)+' А';upd26();">
<span class="slider-val"><span id="lbl26I">3.0 А</span></span>
</div>
<div class="slider-row" style="flex:1;min-width:160px">
<span class="slider-lbl">⚙️ R:</span>
<input type="range" id="sl26R" min="1" max="50" value="10" style="flex:1" oninput="lbl26R.textContent=this.value+' Ом';upd26();">
<span class="slider-val"><span id="lbl26R">10 Ом</span></span>
</div>
<button class="btn btn-pri" onclick="start26timer()">▶ Старт t</button>
<button class="btn btn-ghost" onclick="reset26timer()">↺ Сброс t</button>
</div>
<div class="ctrl-row" style="margin-top:8px;gap:8px">
<span class="val-chip" id="chip26P">P = 0 Вт</span>
<span class="val-chip" id="chip26Q">Q = 0 Дж</span>
<span class="val-chip" id="chip26T">t = 0 c</span>
<span class="val-chip" id="chip26Temp">θ = 20 °C</span>
</div>
<div class="idiag-result" id="res26">$P = I^2R = 90$ Вт; $Q = I^2Rt$ — нажми «Старт t»</div>
<p class="cv-cap"><i class="fas fa-info-circle"></i> Тепло, выделяемое за время t: $Q = I^2Rt$. Удвоить ток — тепла в 4 раза больше! Включи таймер и смотри, как нагревается спираль (термометр справа).</p>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §26</div>
<ul class="key-points-list">
<li>Мощность тока: $P = IU = I^2R = U^2/R$ [Вт] — энергия, потребляемая за единицу времени.</li>
<li>Работа тока: $A = IUt = I^2Rt$ [Дж] — вся работа может переходить в тепло.</li>
<li>Закон Джоуля-Ленца: $Q = I^2Rt$ — тепло пропорционально <b>квадрату тока</b>; удвоение тока даёт тепла в 4 раза больше!</li>
<li>1 кВт·ч = $3{,}6 \times 10^6$ Дж — единица на электросчётчике; $A_\text{кВт·ч} = P[\text{кВт}] \times t[\text{ч}]$.</li>
</ul>
</div>
</div>
<!-- §27 -->
<div class="content" id="tab-ref27">
<div class="para-hero ph-27">
<div class="ph-label">§27 · Физика 8 кл</div>
<h2>Использование и экономия электроэнергии. Безопасность</h2>
<div class="ph-desc">Предохранители и автоматы защищают цепь. Заземление обеспечивает безопасность.</div>
<div class="ph-tags"><span class="ph-tag">⚠️ КЗ → предохранитель</span><span class="ph-tag">🔧 автоматический выключатель</span><span class="ph-tag">💡 экономия</span></div>
</div>
<div class="section-title"><i class="fas fa-shield-halved"></i> §27. Использование и экономия электроэнергии. Безопасность</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Учёт электроэнергии</h3>
<div class="main-f">1 кВт·ч = $3{,}6$ МДж</div>
<p><b>Киловатт-час</b> — практическая единица электроэнергии (на счётчике).</p>
<p>$A_\text{кВт·ч} = P\text{[кВт]} \times t\text{[ч]}$</p>
<p>Стоимость = $A_\text{кВт·ч} \times \text{тариф}$</p>
</div>
<div class="fcard">
<h3>Защита от КЗ</h3>
<div class="main-f" style="font-size:.85rem">предохранитель · автомат</div>
<p><b>Плавкий предохранитель</b>: при токе выше номинала нить плавится → цепь разрывается.</p>
<p><b>Автоматический выключатель</b>: при КЗ или перегрузке выключается. Можно включить снова.</p>
<p>⚠️ Нельзя заменять предохранитель «жучком» (толстым проводом)!</p>
</div>
</div>
<div class="idiag">
<h3>💡 Сравнение типов ламп (мощность при одинаковой яркости)</h3>
<table style="width:100%;border-collapse:collapse;font-size:.8rem">
<thead><tr style="background:rgba(29,78,216,.08)"><th style="padding:6px 8px;border:1px solid var(--border);text-align:left">Тип лампы</th><th style="padding:6px 8px;border:1px solid var(--border)">Мощность</th><th style="padding:6px 8px;border:1px solid var(--border)">Срок службы</th><th style="padding:6px 8px;text-align:left;border:1px solid var(--border)">КПД</th></tr></thead>
<tr><td style="padding:5px 8px;border:1px solid var(--border)">💡 Накаливания</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center;font-weight:700;color:#dc2626">60 Вт</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center">~1000 ч</td><td style="padding:5px 8px;border:1px solid var(--border);color:#dc2626">~5% (свет)</td></tr>
<tr style="background:rgba(29,78,216,.03)"><td style="padding:5px 8px;border:1px solid var(--border)">🔵 Люминесцентная</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center;font-weight:700;color:#f97316">14 Вт</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center">~10000 ч</td><td style="padding:5px 8px;border:1px solid var(--border);color:#f97316">~20%</td></tr>
<tr><td style="padding:5px 8px;border:1px solid var(--border)">🟢 Светодиодная (LED)</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center;font-weight:700;color:#059669">10 Вт</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center">~50000 ч</td><td style="padding:5px 8px;border:1px solid var(--border);color:#059669">~50%</td></tr>
</table>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни! Правила безопасности</div>
<ul>
<li>Никогда не трогайте оголённые провода под напряжением!</li>
<li>Не перегружайте розетки — общий ток не должен превышать 16 А.</li>
<li>Заземление корпуса прибора — защита от пробоя изоляции на корпус.</li>
<li>Безопасное напряжение: ≤ 36 В (в сухом помещении), ≤ 12 В (в ванной).</li>
<li>LED-лампа экономит 6× по сравнению с лампой накаливания при той же яркости.</li>
</ul>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Виртуальный счётчик электроэнергии</div>
<div class="idiag">
<h3>🏠 Включай приборы — следи за мощностью и расходом</h3>
<canvas id="cv27" style="width:100%;height:240px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<label style="font-size:.82rem;font-weight:700;display:flex;align-items:center;gap:7px;cursor:pointer"><input type="checkbox" id="chk27lamp" onchange="upd27()" checked> 💡 Лампа накал. (60 Вт)</label>
<label style="font-size:.82rem;font-weight:700;display:flex;align-items:center;gap:7px;cursor:pointer"><input type="checkbox" id="chk27led" onchange="upd27()"> 🟢 LED-лампа (10 Вт)</label>
<label style="font-size:.82rem;font-weight:700;display:flex;align-items:center;gap:7px;cursor:pointer"><input type="checkbox" id="chk27kettle" onchange="upd27()"> ☕ Чайник (2000 Вт)</label>
<label style="font-size:.82rem;font-weight:700;display:flex;align-items:center;gap:7px;cursor:pointer"><input type="checkbox" id="chk27fridge" onchange="upd27()" checked> 🧊 Холодильник (150 Вт)</label>
<label style="font-size:.82rem;font-weight:700;display:flex;align-items:center;gap:7px;cursor:pointer"><input type="checkbox" id="chk27tv" onchange="upd27()"> 📺 ТВ (120 Вт)</label>
</div>
<div class="idiag-result" id="res27">Суммарная мощность: 210 Вт | За 8 ч: 1,68 кВт·ч</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §27</div>
<ul class="key-points-list">
<li>Учёт электроэнергии: счётчик считает кВт·ч; стоимость = количество кВт·ч × тариф.</li>
<li>Плавкий предохранитель разрывает цепь при токе выше номинала; автомат можно включить снова.</li>
<li>Нельзя заменять предохранитель «жучком» — это прямой путь к пожару!</li>
<li>LED-лампа потребляет в 6 раз меньше энергии, чем лампа накаливания при той же яркости.</li>
</ul>
</div>
</div>
<!-- §28 -->
<div class="content" id="tab-ref28">
<div class="para-hero ph-28">
<div class="ph-label">§28 · Физика 8 кл</div>
<h2>Постоянные магниты</h2>
<div class="ph-desc">Каждый магнит имеет полюса N и S. Одноимённые отталкиваются, разноимённые — притягиваются.</div>
<div class="ph-tags"><span class="ph-tag">N и S полюса</span><span class="ph-tag">↔ одноимённые отталкиваются</span><span class="ph-tag">🧭 компас</span></div>
</div>
<div class="section-title"><i class="fas fa-magnet"></i> §28. Постоянные магниты</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Свойства магнитов</h3>
<div class="main-f" style="font-size:.85rem">N и S полюса · одноимённые ↔ отталкиваются</div>
<p>Каждый магнит имеет два полюса: <b>северный (N)</b> и <b>южный (S)</b>. Нейтральная зона — в середине.</p>
<p>Нельзя получить монополь: при разрезании каждая часть снова имеет N и S.</p>
<p>Компас: северный конец стрелки притягивается к южному полюсу другого магнита.</p>
</div>
<div class="fcard">
<h3>Магнитное поле Земли</h3>
<div class="main-f" style="font-size:.85rem">Земля — гигантский магнит</div>
<p>Географический Северный полюс Земли соответствует <b>магнитному Южному</b> (именно поэтому северный конец компаса тянется к нему).</p>
<p>Магнитный полюс смещён от географического на несколько градусов — <b>магнитное склонение</b>.</p>
</div>
</div>
<div class="idiag-2col">
<div class="idiag">
<h3>🧲 Взаимодействие полюсов</h3>
<svg width="100%" viewBox="0 0 200 110" style="display:block">
<text x="50" y="12" text-anchor="middle" font-size="8.5" fill="#22c55e" font-family="sans-serif" font-weight="bold">N ←→ S притяжение</text>
<rect x="10" y="20" width="35" height="22" rx="4" fill="rgba(59,130,246,.3)" stroke="#3b82f6" stroke-width="1.5"/>
<text x="27" y="35" text-anchor="middle" font-size="9" fill="#3b82f6" font-family="sans-serif" font-weight="bold">N</text>
<rect x="55" y="20" width="35" height="22" rx="4" fill="rgba(239,68,68,.3)" stroke="#ef4444" stroke-width="1.5"/>
<text x="72" y="35" text-anchor="middle" font-size="9" fill="#ef4444" font-family="sans-serif" font-weight="bold">S</text>
<line x1="45" y1="31" x2="55" y2="31" stroke="#22c55e" stroke-width="2"/>
<polygon points="55,31 48,27 48,35" fill="#22c55e"/>
<polygon points="45,31 52,27 52,35" fill="#22c55e"/>
<text x="150" y="12" text-anchor="middle" font-size="8.5" fill="#ef4444" font-family="sans-serif" font-weight="bold">N ←→ N отталкивание</text>
<rect x="110" y="20" width="35" height="22" rx="4" fill="rgba(59,130,246,.3)" stroke="#3b82f6" stroke-width="1.5"/>
<text x="127" y="35" text-anchor="middle" font-size="9" fill="#3b82f6" font-family="sans-serif" font-weight="bold">N</text>
<rect x="155" y="20" width="35" height="22" rx="4" fill="rgba(59,130,246,.3)" stroke="#3b82f6" stroke-width="1.5"/>
<text x="172" y="35" text-anchor="middle" font-size="9" fill="#3b82f6" font-family="sans-serif" font-weight="bold">N</text>
<line x1="145" y1="31" x2="110" y2="31" stroke="#ef4444" stroke-width="1.5"/>
<polygon points="110,31 120,27 120,35" fill="#ef4444"/>
<line x1="155" y1="31" x2="190" y2="31" stroke="#ef4444" stroke-width="1.5"/>
<polygon points="190,31 180,27 180,35" fill="#ef4444"/>
<text x="100" y="62" text-anchor="middle" font-size="8.5" fill="#fbbf24" font-family="sans-serif" font-weight="bold">Разрезать → два новых магнита</text>
<rect x="10" y="70" width="60" height="18" rx="3" fill="none" stroke="#94a3b8" stroke-width="1.5"/>
<text x="20" y="83" font-size="8" fill="#3b82f6" font-family="sans-serif" font-weight="bold">N</text>
<text x="60" y="83" font-size="8" fill="#ef4444" font-family="sans-serif" font-weight="bold">S</text>
<line x1="40" y1="68" x2="40" y2="90" stroke="#fbbf24" stroke-width="1.5" stroke-dasharray="4,2"/>
<polygon points="100,79 95,70 105,70" fill="#fbbf24"/>
<rect x="115" y="70" width="30" height="18" rx="3" fill="none" stroke="#94a3b8" stroke-width="1.5"/>
<text x="118" y="83" font-size="7" fill="#3b82f6" font-family="sans-serif" font-weight="bold">N</text>
<text x="135" y="83" font-size="7" fill="#ef4444" font-family="sans-serif" font-weight="bold">S</text>
<rect x="152" y="70" width="30" height="18" rx="3" fill="none" stroke="#94a3b8" stroke-width="1.5"/>
<text x="155" y="83" font-size="7" fill="#3b82f6" font-family="sans-serif" font-weight="bold">N</text>
<text x="172" y="83" font-size="7" fill="#ef4444" font-family="sans-serif" font-weight="bold">S</text>
</svg>
</div>
<div class="idiag">
<h3>🧭 Компас и магнитное поле Земли</h3>
<svg width="100%" viewBox="0 0 200 110" style="display:block">
<circle cx="100" cy="55" r="40" fill="rgba(59,130,246,.1)" stroke="#3b82f6" stroke-width="1.5"/>
<text x="100" y="59" text-anchor="middle" font-size="10" fill="#3b82f6" font-family="sans-serif">🌍</text>
<text x="100" y="18" text-anchor="middle" font-size="8" fill="#ef4444" font-family="sans-serif" font-weight="bold">S (маг.) = Сев. гео.</text>
<text x="100" y="102" text-anchor="middle" font-size="8" fill="#3b82f6" font-family="sans-serif" font-weight="bold">N (маг.) = Юж. гео.</text>
<path d="M100,15 Q148,55 100,95" stroke="#94a3b8" stroke-width="1" fill="none" stroke-dasharray="3,2" opacity=".6"/>
<path d="M100,15 Q52,55 100,95" stroke="#94a3b8" stroke-width="1" fill="none" stroke-dasharray="3,2" opacity=".6"/>
<circle cx="160" cy="40" r="12" fill="#1e293b" stroke="#94a3b8" stroke-width="1.5"/>
<line x1="160" y1="33" x2="160" y2="47" stroke="#94a3b8" stroke-width="1" opacity=".4"/>
<line x1="153" y1="40" x2="167" y2="40" stroke="#94a3b8" stroke-width="1" opacity=".4"/>
<polygon points="160,29 157,40 163,40" fill="#3b82f6"/>
<polygon points="160,51 157,40 163,40" fill="#ef4444"/>
<text x="160" y="26" text-anchor="middle" font-size="7" fill="#3b82f6" font-family="sans-serif">N</text>
<text x="160" y="59" text-anchor="middle" font-size="7" fill="#ef4444" font-family="sans-serif">S</text>
<text x="160" y="68" text-anchor="middle" font-size="7" fill="#94a3b8" font-family="sans-serif">компас</text>
</svg>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Магнитных монополей не существует — каждый кусок магнита снова имеет N и S.</li>
<li>Северный конец стрелки компаса притягивается к южному полюсу магнита.</li>
<li>Магнитные полюса Земли не совпадают с географическими — магнитное склонение!</li>
</ul>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Взаимодействие магнитов</div>
<div class="idiag">
<h3>🧲 Силовые линии и взаимодействие полюсов</h3>
<canvas id="cv28" style="width:100%;height:280px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<select id="sel28mode" onchange="startAnim28()" style="padding:6px 10px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text)">
<option value="NS">N–S (разноимённые · притяжение)</option>
<option value="NN">N–N (одноимённые · отталкивание)</option>
<option value="SS">S–S (одноимённые · отталкивание)</option>
</select>
<label style="font-size:.82rem;display:flex;align-items:center;gap:6px;cursor:pointer">
<input type="checkbox" id="chk28compass" onchange="startAnim28()" checked> 🧭 Компас
</label>
</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §28</div>
<ul class="key-points-list">
<li>Каждый магнит имеет два полюса: северный (N) и южный (S); магнитных монополей не существует.</li>
<li>Одноимённые полюса отталкиваются; разноимённые — притягиваются.</li>
<li>При разрезании магнита получаются два новых магнита с N и S — монополь невозможен.</li>
<li>Географический Северный полюс Земли соответствует <b>магнитному Южному</b> — поэтому северный конец стрелки компаса тянется к нему.</li>
</ul>
</div>
</div>
<!-- §29 -->
<div class="content" id="tab-ref29">
<div class="para-hero ph-29">
<div class="ph-label">§29 · Физика 8 кл</div>
<h2>Магнитное поле</h2>
<div class="ph-desc">Магнитное поле изображается силовыми линиями. Выходят из N, входят в S.</div>
<div class="ph-tags"><span class="ph-tag">→ из N к S</span><span class="ph-tag">🧭 силовые линии</span><span class="ph-tag">🔬 железные опилки</span></div>
</div>
<div class="section-title"><i class="fas fa-arrows-to-dot"></i> §29. Магнитное поле</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Магнитное поле</h3>
<div class="main-f" style="font-size:.85rem">особая форма материи · создаётся магнитами и токами</div>
<p>Магнитное поле существует в пространстве вокруг магнитов и проводников с током. Оно действует на другие магниты и движущиеся заряды.</p>
<p>Силовые линии: <b>выходят из N</b>, <b>входят в S</b>. Гуще линии = сильнее поле.</p>
</div>
<div class="fcard">
<h3>Однородное магнитное поле</h3>
<div class="main-f" style="font-size:.85rem">параллельные, равноотстоящие линии</div>
<p>Реализуется в середине зазора между близкими разноимёнными полюсами.</p>
<p>Маленькие компасы в поле поворачиваются вдоль силовых линий.</p>
<p>Железные опилки выстраиваются вдоль линий поля.</p>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Линии поля: из N → в S снаружи магнита; внутри — из S в N.</li>
<li>Силовые линии никогда <b>не пересекаются</b>.</li>
<li>Чем ближе к полюсу — тем гуще линии, тем сильнее поле.</li>
<li>Одноимённые полюса: между ними линии «расходятся» (поле ослабевает до нуля в середине).</li>
</ul>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Магнитные силовые линии</div>
<div class="idiag">
<h3>🧭 Выбери конфигурацию — наблюдай поле</h3>
<canvas id="cv29" style="width:100%;height:290px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<select id="sel29shape" onchange="startAnim29()" style="padding:6px 10px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text)">
<option value="dipole">Полосовой магнит N–S</option>
<option value="horseshoe">Подковообразный магнит</option>
<option value="ns_close">Два близких разноимённых N·S (однородное поле)</option>
<option value="nn_close">Два близких одноимённых N·N</option>
</select>
<label style="font-size:.82rem;display:flex;align-items:center;gap:6px;cursor:pointer">
<input type="checkbox" id="chk29needles" onchange="startAnim29()" checked> 🧭 Компасы
</label>
</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §29</div>
<ul class="key-points-list">
<li>Магнитное поле — особая форма материи, создаваемая магнитами и проводниками с током.</li>
<li>Силовые линии выходят из N и входят в S снаружи магнита; никогда не пересекаются.</li>
<li>Чем ближе к полюсу — тем гуще линии, тем <b>сильнее</b> поле.</li>
<li>Однородное поле (параллельные равноотстоящие линии) создаётся в зазоре между близкими разноимёнными полюсами.</li>
</ul>
</div>
</div>
<!-- §30 -->
<div class="content" id="tab-ref30">
<div class="para-hero ph-30">
<div class="ph-label">§30 · Физика 8 кл</div>
<h2>Магнитное поле тока</h2>
<div class="ph-desc">Электрический ток создаёт магнитное поле (опыт Эрстеда). Правило буравчика.</div>
<div class="ph-tags"><span class="ph-tag">⚡ ток → поле</span><span class="ph-tag">🔩 правило буравчика</span><span class="ph-tag">🔬 Эрстед (1820)</span></div>
</div>
<div class="section-title"><i class="fas fa-circle-notch"></i> §30. Магнитное поле тока</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Опыт Эрстеда (1820)</h3>
<div class="main-f" style="font-size:.85rem">ток → магнитное поле</div>
<p>Ханс Эрстед обнаружил: при прохождении тока через проводник <b>стрелка компаса отклоняется</b>. Электричество и магнетизм связаны!</p>
<p>Поле прямого проводника — <b>концентрические окружности</b> вокруг проводника.</p>
</div>
<div class="fcard">
<h3>Правило буравчика</h3>
<div class="main-f" style="font-size:.85rem">поступательно → ток; вращение → поле</div>
<p>Если буравчик (правый) вращать и ввинчивать в направлении тока, то <b>направление вращения рукоятки</b> совпадает с направлением линий магнитного поля.</p>
<p>При реверсе тока — все линии меняют направление.</p>
</div>
</div>
<div class="idiag-2col">
<div class="idiag">
<h3>🔩 Правило буравчика — визуализация</h3>
<svg width="100%" viewBox="0 0 200 120" style="display:block">
<rect x="85" y="5" width="10" height="110" rx="3" fill="#475569" stroke="#64748b" stroke-width="1"/>
<polygon points="90,105 85,90 95,90" fill="#fbbf24"/>
<text x="105" y="110" font-size="8" fill="#fbbf24" font-family="sans-serif">ток ↓</text>
<circle cx="90" cy="60" r="20" fill="none" stroke="rgba(59,130,246,.5)" stroke-width="1.5" stroke-dasharray="3,2"/>
<circle cx="90" cy="60" r="35" fill="none" stroke="rgba(59,130,246,.3)" stroke-width="1.5" stroke-dasharray="3,2"/>
<polygon points="90,40 85,47 88,47" fill="#3b82f6" opacity=".8"/>
<polygon points="90,80 95,73 92,73" fill="#3b82f6" opacity=".8"/>
<circle cx="55" cy="60" r="7" fill="#1e293b" stroke="#94a3b8" stroke-width="1"/>
<line x1="55" y1="53" x2="55" y2="67" stroke="#ef4444" stroke-width="1.5" transform="rotate(90,55,60)"/>
<text x="45" y="78" font-size="7" fill="#94a3b8" font-family="sans-serif">компас</text>
<circle cx="125" cy="60" r="7" fill="#1e293b" stroke="#94a3b8" stroke-width="1"/>
<line x1="125" y1="53" x2="125" y2="67" stroke="#ef4444" stroke-width="1.5" transform="rotate(270,125,60)"/>
<text x="8" y="20" font-size="7.5" fill="#94a3b8" font-family="sans-serif">↓ tok → ↻ pole (clock.)</text>
</svg>
</div>
<div class="idiag">
<h3>📍 Вид вдоль проводника</h3>
<svg width="100%" viewBox="0 0 200 120" style="display:block">
<circle cx="60" cy="60" r="16" fill="#1e293b" stroke="#475569" stroke-width="2"/>
<line x1="50" y1="50" x2="70" y2="70" stroke="#ef4444" stroke-width="2"/>
<line x1="70" y1="50" x2="50" y2="70" stroke="#ef4444" stroke-width="2"/>
<text x="60" y="85" text-anchor="middle" font-size="7.5" fill="#ef4444" font-family="sans-serif">× ток от нас</text>
<circle cx="60" cy="60" r="28" fill="none" stroke="rgba(59,130,246,.6)" stroke-width="1.5"/>
<polygon points="60,32 55,40 65,40" fill="#3b82f6" opacity=".8"/>
<text x="25" y="50" font-size="7" fill="#3b82f6" font-family="sans-serif">↻ по часовой</text>
<circle cx="150" cy="60" r="16" fill="#1e293b" stroke="#475569" stroke-width="2"/>
<circle cx="150" cy="60" r="4" fill="#22c55e"/>
<text x="150" y="85" text-anchor="middle" font-size="7.5" fill="#22c55e" font-family="sans-serif">· ток к нам</text>
<circle cx="150" cy="60" r="28" fill="none" stroke="rgba(34,197,94,.5)" stroke-width="1.5"/>
<polygon points="150,88 155,80 145,80" fill="#22c55e" opacity=".8"/>
<text x="155" y="40" font-size="7" fill="#22c55e" font-family="sans-serif">↺ против ч.</text>
</svg>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Ток создаёт магнитное поле — связь электричества и магнетизма!</li>
<li>Правило буравчика: поступательно = ток, вращение = линии поля.</li>
<li>При реверсе тока — все силовые линии меняют направление на противоположное.</li>
<li>Гипотеза Ампера: постоянные магниты — это результат токов внутри атомов.</li>
</ul>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Опыт Эрстеда</div>
<div class="idiag">
<h3>🔩 Магнитное поле прямого проводника с током</h3>
<canvas id="cv30" style="width:100%;height:270px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:200px">
<span class="slider-lbl">Сила тока $I$:</span>
<input type="range" id="sl30I" min="0" max="5" step="0.5" value="2" style="flex:1" oninput="lbl30I.textContent=(+this.value).toFixed(1)+' А';startAnim30();">
<span class="slider-val"><span id="lbl30I">2.0 А</span></span>
</div>
<button class="btn btn-ghost" onclick="reverse30()">↩ Реверс тока</button>
<label style="font-size:.82rem;display:flex;align-items:center;gap:6px;cursor:pointer">
<input type="checkbox" id="chk30compass" checked onchange="startAnim30()"> 🧭 Компасы
</label>
</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §30</div>
<ul class="key-points-list">
<li>Опыт Эрстеда (1820): ток в проводнике отклоняет стрелку компаса — электричество и магнетизм взаимосвязаны!</li>
<li>Поле прямого проводника — концентрические окружности вокруг проводника.</li>
<li>Правило буравчика: поступательное движение = направление тока; вращение рукоятки = направление линий поля.</li>
<li>При реверсе тока все силовые линии меняют направление на противоположное.</li>
</ul>
</div>
</div>
<!-- §31 -->
<div class="content" id="tab-ref31">
<div class="para-hero ph-31">
<div class="ph-label">§31 · Физика 8 кл</div>
<h2>Магнитное поле катушки с током. Электромагнит</h2>
<div class="ph-desc">Катушка с током — электромагнит. Поле усиливается сердечником. Применение: реле, краны.</div>
<div class="ph-tags"><span class="ph-tag">N витков × I</span><span class="ph-tag">🔩 железный сердечник</span><span class="ph-tag">⚙️ реле, краны</span></div>
</div>
<div class="section-title"><i class="fas fa-coil"></i> §31. Магнитное поле катушки с током. Электромагнит</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Катушка с током = электромагнит</h3>
<div class="main-f" style="font-size:.85rem">поля витков складываются → сильное поле</div>
<p>Каждый виток создаёт поле. В центре катушки поля от всех витков направлены одинаково → <b>суммируются</b>.</p>
<p>Поле катушки похоже на поле полосового магнита: один конец = N, другой = S.</p>
</div>
<div class="fcard">
<h3>Как усилить поле электромагнита</h3>
<div class="main-f" style="font-size:.85rem">↑N · ↑I · железный сердечник</div>
<ol style="font-size:.83rem;color:var(--muted);padding-left:18px;line-height:1.9;margin-top:6px">
<li>Увеличить число витков $N$</li>
<li>Увеличить ток $I$</li>
<li>Вставить <b>железный сердечник</b> (намагничивается → поле резко растёт)</li>
</ol>
</div>
</div>
<div class="idiag">
<h3>⚙️ Применение электромагнитов</h3>
<table style="width:100%;border-collapse:collapse;font-size:.8rem">
<thead><tr style="background:rgba(29,78,216,.08)"><th style="padding:6px 8px;border:1px solid var(--border);text-align:left">Устройство</th><th style="padding:6px 8px;text-align:left;border:1px solid var(--border)">Принцип работы</th></tr></thead>
<tr><td style="padding:5px 8px;border:1px solid var(--border)">⚙️ Реле</td><td style="padding:5px 8px;border:1px solid var(--border)">Электромагнит притягивает якорь → замыкает/размыкает контакты</td></tr>
<tr style="background:rgba(29,78,216,.03)"><td style="padding:5px 8px;border:1px solid var(--border)">🏗️ Подъёмный кран</td><td style="padding:5px 8px;border:1px solid var(--border)">Огромный электромагнит поднимает стальной лом; выключить ток → груз падает</td></tr>
<tr><td style="padding:5px 8px;border:1px solid var(--border)">🏥 МРТ (MRI)</td><td style="padding:5px 8px;border:1px solid var(--border)">Сверхпроводящие катушки создают мощное поле 1–3 Тл для диагностики</td></tr>
<tr style="background:rgba(29,78,216,.03)"><td style="padding:5px 8px;border:1px solid var(--border)">🔔 Электрический звонок</td><td style="padding:5px 8px;border:1px solid var(--border)">Электромагнит притягивает молоточек → удар → размыкает цепь → отпускает → снова</td></tr>
</table>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Правило правой руки для катушки: пальцы → ток в витках; большой → N-полюс.</li>
<li>Электромагнит управляем: вкл. ток = намагничен; выкл. = размагничен. Это его главное преимущество.</li>
<li>Железный сердечник резко усиливает поле (сталь намагничивается сильнее, чем воздух).</li>
</ul>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Электромагнит</div>
<div class="idiag">
<h3>🔌 Катушка с током — выбери режим</h3>
<canvas id="cv31" style="width:100%;height:290px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:160px">
<span class="slider-lbl">Витков $N$:</span>
<input type="range" id="sl31N" min="1" max="20" value="5" style="flex:1" oninput="lbl31N.textContent=this.value;startAnim31();">
<span class="slider-val"><span id="lbl31N">5</span></span>
</div>
<div class="slider-row" style="flex:1;min-width:160px">
<span class="slider-lbl">Ток $I$:</span>
<input type="range" id="sl31I" min="0" max="5" step="0.5" value="2" style="flex:1" oninput="lbl31I.textContent=(+this.value).toFixed(1)+' А';startAnim31();">
<span class="slider-val"><span id="lbl31I">2.0 А</span></span>
</div>
<label style="font-size:.82rem;display:flex;align-items:center;gap:6px;cursor:pointer">
<input type="checkbox" id="chk31core" onchange="startAnim31()"> 🔩 Железный сердечник
</label>
</div>
<div class="ctrl-row" style="margin-top:6px">
<select id="sel31scene" onchange="startAnim31()" style="padding:6px 10px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text)">
<option value="coil">Катушка (силовые линии)</option>
<option value="relay">Электромагнитное реле</option>
<option value="crane">Подъёмный электромагнит</option>
</select>
</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §31</div>
<ul class="key-points-list">
<li>Катушка с током (соленоид) создаёт поле, похожее на поле полосового магнита: один конец N, другой S.</li>
<li>Поле катушки усиливается: увеличением числа витков $N$, увеличением тока $I$, вставкой железного сердечника.</li>
<li>Главное преимущество электромагнита: управляемость — включил ток → намагничен, выключил → нет.</li>
<li>Правило правой руки для катушки: пальцы указывают направление тока в витках, большой палец — на N-полюс.</li>
</ul>
</div>
</div>
<!-- ЗАДАЧИ -->
<div class="content" id="tab-tasks">
<div class="para-pills">
<button class="para-pill active" data-para="p12" onclick="setParaTab('p12')">§12</button>
<button class="para-pill" data-para="p13" onclick="setParaTab('p13')">§13</button>
<button class="para-pill" data-para="p14" onclick="setParaTab('p14')">§14</button>
<button class="para-pill" data-para="p15" onclick="setParaTab('p15')">§15</button>
<button class="para-pill" data-para="p16" onclick="setParaTab('p16')">§16</button>
<button class="para-pill" data-para="p17" onclick="setParaTab('p17')">§17</button>
<button class="para-pill" data-para="p18" onclick="setParaTab('p18')">§18</button>
<button class="para-pill" data-para="p19" onclick="setParaTab('p19')">§19</button>
<button class="para-pill" data-para="p20" onclick="setParaTab('p20')">§20</button>
<button class="para-pill" data-para="p21" onclick="setParaTab('p21')">§21</button>
<button class="para-pill" data-para="p22" onclick="setParaTab('p22')">§22</button>
<button class="para-pill" data-para="p23" onclick="setParaTab('p23')">§23</button>
<button class="para-pill" data-para="p24" onclick="setParaTab('p24')">§24</button>
<button class="para-pill" data-para="p25" onclick="setParaTab('p25')">§25</button>
<button class="para-pill" data-para="p26" onclick="setParaTab('p26')">§26</button>
<button class="para-pill" data-para="p27" onclick="setParaTab('p27')">§27</button>
<button class="para-pill" data-para="p28" onclick="setParaTab('p28')">§28</button>
<button class="para-pill" data-para="p29" onclick="setParaTab('p29')">§29</button>
<button class="para-pill" data-para="p30" onclick="setParaTab('p30')">§30</button>
<button class="para-pill" data-para="p31" onclick="setParaTab('p31')">§31</button>
<button class="para-pill" data-para="hard" onclick="setParaTab('hard')">⚡ Сложные</button>
</div>
<!-- ptab-p12 -->
<div id="ptab-p12" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp12">0</span></div><div class="chip chip-tot"><span id="curp12">0</span>&nbsp;/&nbsp;<span id="maxp12">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p12')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp12" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp12"></div>
<div id="taskAreap12"></div>
<div class="feedback" id="fbp12"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp12" onclick="nextTask('p12')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump12"><h2>§12 — готово!</h2><div class="big-score" id="sumScorep12">0/0</div><div class="sum-grade" id="sumGradep12"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p12')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p13')">→ §13</button></div></div>
</div>
<!-- ptab-p13 -->
<div id="ptab-p13" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp13">0</span></div><div class="chip chip-tot"><span id="curp13">0</span>&nbsp;/&nbsp;<span id="maxp13">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p13')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp13" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp13"></div>
<div id="taskAreap13"></div>
<div class="feedback" id="fbp13"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp13" onclick="nextTask('p13')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump13"><h2>§13 — готово!</h2><div class="big-score" id="sumScorep13">0/0</div><div class="sum-grade" id="sumGradep13"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p13')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p14')">→ §14</button></div></div>
</div>
<!-- ptab-p14 -->
<div id="ptab-p14" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp14">0</span></div><div class="chip chip-tot"><span id="curp14">0</span>&nbsp;/&nbsp;<span id="maxp14">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p14')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp14" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp14"></div>
<div id="taskAreap14"></div>
<div class="feedback" id="fbp14"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp14" onclick="nextTask('p14')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump14"><h2>§14 — готово!</h2><div class="big-score" id="sumScorep14">0/0</div><div class="sum-grade" id="sumGradep14"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p14')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p15')">→ §15</button></div></div>
</div>
<!-- ptab-p15 -->
<div id="ptab-p15" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp15">0</span></div><div class="chip chip-tot"><span id="curp15">0</span>&nbsp;/&nbsp;<span id="maxp15">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p15')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp15" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp15"></div>
<div id="taskAreap15"></div>
<div class="feedback" id="fbp15"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp15" onclick="nextTask('p15')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump15"><h2>§15 — готово!</h2><div class="big-score" id="sumScorep15">0/0</div><div class="sum-grade" id="sumGradep15"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p15')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p16')">→ §16</button></div></div>
</div>
<!-- ptab-p16 -->
<div id="ptab-p16" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp16">0</span></div><div class="chip chip-tot"><span id="curp16">0</span>&nbsp;/&nbsp;<span id="maxp16">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p16')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp16" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp16"></div>
<div id="taskAreap16"></div>
<div class="feedback" id="fbp16"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp16" onclick="nextTask('p16')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump16"><h2>§16 — готово!</h2><div class="big-score" id="sumScorep16">0/0</div><div class="sum-grade" id="sumGradep16"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p16')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p17')">→ §17</button></div></div>
</div>
<!-- ptab-p17 -->
<div id="ptab-p17" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp17">0</span></div><div class="chip chip-tot"><span id="curp17">0</span>&nbsp;/&nbsp;<span id="maxp17">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p17')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp17" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp17"></div>
<div id="taskAreap17"></div>
<div class="feedback" id="fbp17"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp17" onclick="nextTask('p17')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump17"><h2>§17 — готово!</h2><div class="big-score" id="sumScorep17">0/0</div><div class="sum-grade" id="sumGradep17"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p17')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p18')">→ §18</button></div></div>
</div>
<!-- ptab-p18 -->
<div id="ptab-p18" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp18">0</span></div><div class="chip chip-tot"><span id="curp18">0</span>&nbsp;/&nbsp;<span id="maxp18">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p18')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp18" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp18"></div>
<div id="taskAreap18"></div>
<div class="feedback" id="fbp18"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp18" onclick="nextTask('p18')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump18"><h2>§18 — готово!</h2><div class="big-score" id="sumScorep18">0/0</div><div class="sum-grade" id="sumGradep18"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p18')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p19')">→ §19</button></div></div>
</div>
<!-- ptab-p19 -->
<div id="ptab-p19" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp19">0</span></div><div class="chip chip-tot"><span id="curp19">0</span>&nbsp;/&nbsp;<span id="maxp19">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p19')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp19" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp19"></div>
<div id="taskAreap19"></div>
<div class="feedback" id="fbp19"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp19" onclick="nextTask('p19')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump19"><h2>§19 — готово!</h2><div class="big-score" id="sumScorep19">0/0</div><div class="sum-grade" id="sumGradep19"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p19')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p20')">→ §20</button></div></div>
</div>
<!-- ptab-p20 -->
<div id="ptab-p20" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp20">0</span></div><div class="chip chip-tot"><span id="curp20">0</span>&nbsp;/&nbsp;<span id="maxp20">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p20')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp20" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp20"></div>
<div id="taskAreap20"></div>
<div class="feedback" id="fbp20"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp20" onclick="nextTask('p20')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump20"><h2>§20 — готово!</h2><div class="big-score" id="sumScorep20">0/0</div><div class="sum-grade" id="sumGradep20"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p20')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p21')">→ §21</button></div></div>
</div>
<!-- ptab-p21 -->
<div id="ptab-p21" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp21">0</span></div><div class="chip chip-tot"><span id="curp21">0</span>&nbsp;/&nbsp;<span id="maxp21">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p21')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp21" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp21"></div>
<div id="taskAreap21"></div>
<div class="feedback" id="fbp21"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp21" onclick="nextTask('p21')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump21"><h2>§21 — готово!</h2><div class="big-score" id="sumScorep21">0/0</div><div class="sum-grade" id="sumGradep21"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p21')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p22')">→ §22</button></div></div>
</div>
<!-- ptab-p22 -->
<div id="ptab-p22" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp22">0</span></div><div class="chip chip-tot"><span id="curp22">0</span>&nbsp;/&nbsp;<span id="maxp22">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p22')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp22" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp22"></div>
<div id="taskAreap22"></div>
<div class="feedback" id="fbp22"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp22" onclick="nextTask('p22')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump22"><h2>§22 — готово!</h2><div class="big-score" id="sumScorep22">0/0</div><div class="sum-grade" id="sumGradep22"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p22')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p23')">→ §23</button></div></div>
</div>
<!-- ptab-p23 -->
<div id="ptab-p23" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp23">0</span></div><div class="chip chip-tot"><span id="curp23">0</span>&nbsp;/&nbsp;<span id="maxp23">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p23')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp23" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp23"></div>
<div id="taskAreap23"></div>
<div class="feedback" id="fbp23"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp23" onclick="nextTask('p23')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump23"><h2>§23 — готово!</h2><div class="big-score" id="sumScorep23">0/0</div><div class="sum-grade" id="sumGradep23"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p23')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p24')">→ §24</button></div></div>
</div>
<!-- ptab-p24 -->
<div id="ptab-p24" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp24">0</span></div><div class="chip chip-tot"><span id="curp24">0</span>&nbsp;/&nbsp;<span id="maxp24">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p24')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp24" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp24"></div>
<div id="taskAreap24"></div>
<div class="feedback" id="fbp24"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp24" onclick="nextTask('p24')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump24"><h2>§24 — готово!</h2><div class="big-score" id="sumScorep24">0/0</div><div class="sum-grade" id="sumGradep24"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p24')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p25')">→ §25</button></div></div>
</div>
<!-- ptab-p25 -->
<div id="ptab-p25" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp25">0</span></div><div class="chip chip-tot"><span id="curp25">0</span>&nbsp;/&nbsp;<span id="maxp25">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p25')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp25" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp25"></div>
<div id="taskAreap25"></div>
<div class="feedback" id="fbp25"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp25" onclick="nextTask('p25')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump25"><h2>§25 — готово!</h2><div class="big-score" id="sumScorep25">0/0</div><div class="sum-grade" id="sumGradep25"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p25')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p26')">→ §26</button></div></div>
</div>
<!-- ptab-p26 -->
<div id="ptab-p26" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp26">0</span></div><div class="chip chip-tot"><span id="curp26">0</span>&nbsp;/&nbsp;<span id="maxp26">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p26')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp26" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp26"></div>
<div id="taskAreap26"></div>
<div class="feedback" id="fbp26"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp26" onclick="nextTask('p26')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump26"><h2>§26 — готово!</h2><div class="big-score" id="sumScorep26">0/0</div><div class="sum-grade" id="sumGradep26"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p26')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p27')">→ §27</button></div></div>
</div>
<!-- ptab-p27 -->
<div id="ptab-p27" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp27">0</span></div><div class="chip chip-tot"><span id="curp27">0</span>&nbsp;/&nbsp;<span id="maxp27">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p27')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp27" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp27"></div>
<div id="taskAreap27"></div>
<div class="feedback" id="fbp27"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp27" onclick="nextTask('p27')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump27"><h2>§27 — готово!</h2><div class="big-score" id="sumScorep27">0/0</div><div class="sum-grade" id="sumGradep27"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p27')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p28')">→ §28</button></div></div>
</div>
<!-- ptab-p28 -->
<div id="ptab-p28" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp28">0</span></div><div class="chip chip-tot"><span id="curp28">0</span>&nbsp;/&nbsp;<span id="maxp28">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p28')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp28" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp28"></div>
<div id="taskAreap28"></div>
<div class="feedback" id="fbp28"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp28" onclick="nextTask('p28')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump28"><h2>§28 — готово!</h2><div class="big-score" id="sumScorep28">0/0</div><div class="sum-grade" id="sumGradep28"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p28')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p29')">→ §29</button></div></div>
</div>
<!-- ptab-p29 -->
<div id="ptab-p29" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp29">0</span></div><div class="chip chip-tot"><span id="curp29">0</span>&nbsp;/&nbsp;<span id="maxp29">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p29')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp29" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp29"></div>
<div id="taskAreap29"></div>
<div class="feedback" id="fbp29"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp29" onclick="nextTask('p29')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump29"><h2>§29 — готово!</h2><div class="big-score" id="sumScorep29">0/0</div><div class="sum-grade" id="sumGradep29"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p29')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p30')">→ §30</button></div></div>
</div>
<!-- ptab-p30 -->
<div id="ptab-p30" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp30">0</span></div><div class="chip chip-tot"><span id="curp30">0</span>&nbsp;/&nbsp;<span id="maxp30">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p30')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp30" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp30"></div>
<div id="taskAreap30"></div>
<div class="feedback" id="fbp30"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp30" onclick="nextTask('p30')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump30"><h2>§30 — готово!</h2><div class="big-score" id="sumScorep30">0/0</div><div class="sum-grade" id="sumGradep30"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p30')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('p31')">→ §31</button></div></div>
</div>
<!-- ptab-p31 -->
<div id="ptab-p31" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp31">0</span></div><div class="chip chip-tot"><span id="curp31">0</span>&nbsp;/&nbsp;<span id="maxp31">0</span></div><button class="btn btn-ghost" onclick="resetTasks('p31')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="progp31" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp31"></div>
<div id="taskAreap31"></div>
<div class="feedback" id="fbp31"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnp31" onclick="nextTask('p31')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sump31"><h2>§31 — готово!</h2><div class="big-score" id="sumScorep31">0/0</div><div class="sum-grade" id="sumGradep31"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('p31')"><i class="fas fa-rotate-right"></i> Ещё раз</button><button class="btn btn-ghost" onclick="setParaTab('hard')">→ §hard</button></div></div>
</div>
<!-- ptab-hard -->
<div id="ptab-hard" style="display:none">
<div class="score-bar"><div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okhard">0</span></div><div class="chip chip-tot"><span id="curhard">0</span>&nbsp;/&nbsp;<span id="maxhard">0</span></div><button class="btn btn-ghost" onclick="resetTasks('hard')" style="padding:6px 13px;font-size:.74rem"><i class="fas fa-rotate-right"></i> Заново</button></div>
<div class="prog-wrap"><div class="prog-fill" id="proghard" style="width:0%"></div></div>
<div class="nav-dots" id="navDotshard"></div>
<div id="taskAreahard"></div>
<div class="feedback" id="fbhard"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn btn-next" id="nextBtnhard" onclick="nextTask('hard')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button></div>
<div class="summary" id="sumhard"><h2>Сложные — готово!</h2><div class="big-score" id="sumScorehard">0/0</div><div class="sum-grade" id="sumGradehard"></div><div class="sum-btns"><button class="btn btn-pri" onclick="resetTasks('hard')"><i class="fas fa-rotate-right"></i> Ещё раз</button></div></div>
</div>
</div><!-- /tab-tasks -->
</div><!-- /content-area -->
</main><!-- /main-col -->
</div><!-- /page-layout -->
<script>
// ═══════════════════════════════════════
// ВКЛАДКИ СПРАВОЧНИКА
// ═══════════════════════════════════════
function switchRefTab(tab) {
document.querySelectorAll('.ref-tab-btn').forEach(function(b) { b.classList.remove('active'); });
document.querySelectorAll('.ref-tab-content').forEach(function(c) { c.classList.remove('active'); });
var btn = document.querySelector('.ref-tab-btn[onclick*="' + tab + '"]');
var cnt = document.getElementById('reftab-' + tab);
if (btn) btn.classList.add('active');
if (cnt) {
cnt.classList.add('active');
// Рендерим KaTeX при первом открытии Шпаргалки
if (tab === 'cheat' && !cnt.dataset.katexDone) {
cnt.dataset.katexDone = '1';
if (window.renderMathInElement) {
renderMathInElement(cnt, {delimiters:[{left:'$',right:'$',display:false},{left:'$$',right:'$$',display:true}]});
}
}
}
}
window.switchRefTab = switchRefTab;
// ═══════════════════════════════════════
// ДАННЫЕ ЗАДАЧ
// ═══════════════════════════════════════
var TASKS_P12 = [
{q:"Что происходит при электризации трением?",opts:["Электризуется только натираемое тело","Оба тела заряжаются разноимёнными зарядами","Трение уничтожает заряды","Зависит от скорости трения"],a:1,ex:"При трении электризуются оба тела, получая разноимённые заряды. Трение лишь увеличивает площадь соприкосновения для перехода электронов."},
{q:"Как взаимодействуют два отрицательно заряженных тела?",opts:["Притягиваются","Отталкиваются","Не взаимодействуют","Зависит от их массы"],a:1,ex:"Одноимённые заряды (оба отрицательные) отталкиваются. Разноимённые — притягиваются."},
{q:"Для чего служит электроскоп?",opts:["Для измерения напряжения","Для обнаружения и сравнения электрических зарядов","Для измерения силы тока","Для зарядки тел"],a:1,ex:"Электроскоп обнаруживает заряд: одноимённо заряженные листочки отталкиваются. Чем больше заряд — тем шире расходятся."},
{q:"Заряженная палочка поднесена к шарику на шёлковой нити — шарик притянулся. Что можно сказать о заряде шарика?",opts:["Шарик заряжен одноимённо","Шарик незаряжен или заряжен разноимённо — притяжение в обоих случаях","Шарик обязательно заряжен разноимённо","Шарик тяжелее палочки"],a:1,ex:"Притяжение возможно: 1) при разноимённом заряде; 2) если шарик незаряжен (электризация через влияние)."}
];
var TASKS_P13 = [
{q:"Почему при надевании шерстяного свитера он прилипает к рубашке?",opts:["Из-за клейкости шерсти","Электризация трением: оба тела получают разноимённые заряды и притягиваются","Из-за статического тока","Шерсть намагничена"],a:1,ex:"Электризация трением: свитер и рубашка приобретают разноимённые заряды и притягиваются."},
{q:"Коснуться пальцем шарика заряженного электроскопа — заряд исчезает. Почему?",opts:["Заряд поглощается пальцем навсегда","Тело человека — проводник; заряд утекает через руку в землю","Заряд нейтрализуется теплом пальца","Заряд становится невидимым"],a:1,ex:"Тело человека — проводник, соединённый с Землёй. Заряд уходит в Землю."},
{q:"Два проводящих шара с зарядами +q и -q соединили проводником. Что произойдёт?",opts:["Оба останутся заряженными","Оба станут нейтральными","Весь заряд перейдёт на один шар","Заряды увеличатся"],a:1,ex:"+q + (-q) = 0. Электроны перейдут с отрицательного на положительный — оба нейтральны."},
{q:"Почему на прядильных производствах поддерживают высокую влажность воздуха?",opts:["Для смачивания тканей","Влажный воздух — проводник; заряды стекают, предотвращая накопление статики","Для снижения температуры","Для вентиляции"],a:1,ex:"Влажный воздух проводит ток. Накапливающиеся заряды быстро утекают в атмосферу, предотвращая искры."}
];
var TASKS_P14 = [
{q:"Чем объясняется перераспределение зарядов в проводнике при поднесении заряженного тела?",opts:["Перераспределение невозможно","Свободные электроны в проводнике смещаются под действием поля внешнего заряда","Нейтральные атомы перемещаются","Происходит химическая реакция"],a:1,ex:"Свободные электроны в проводнике реагируют на внешнее электрическое поле: перераспределяются по объёму проводника."},
{q:"Лёгкая незаряженная гильза притянулась к отрицательной палочке, коснулась её и тут же оттолкнулась. Почему?",opts:["Гильза зарядилась отрицательно и теперь отталкивается","Сила превратилась в отталкивание из-за удара","Гильза нейтрализовала палочку","Температура изменилась"],a:0,ex:"До касания: притяжение из-за индуцированных зарядов. При касании: часть отрицательного заряда перешла на гильзу — теперь оба отрицательны → отталкивание."},
{q:"Почему незаряженные тела притягиваются к заряженной палочке?",opts:["Они тоже заряжены","Электризация через влияние: ближняя сторона получает разноимённый заряд — притяжение сильнее отталкивания","Из-за гравитации","Из-за магнитных свойств"],a:1,ex:"Индуцированные заряды: ближняя сторона разноимённа (притяжение сильнее, т.к. ближе), дальняя одноимённа (отталкивание слабее). Итог — притяжение."}
];
var TASKS_P15 = [
{q:"Выразите в кулонах заряд $q = 0{,}12$ мКл.",opts:["$1{,}2 \times 10^{-4}$ Кл","$1{,}2 \times 10^{-2}$ Кл","$0{,}12$ Кл","$1{,}2 \times 10^{-7}$ Кл"],a:0,ex:"1 мКл = $10^{-3}$ Кл; $0{,}12 \times 10^{-3} = 1{,}2 \times 10^{-4}$ Кл."},
{q:"Расчёска получила заряд $q = 6{,}4 \times 10^{-11}$ Кл. Сколько электронов перешло? $e = 1{,}6 \times 10^{-19}$ Кл.",hint:"$N = |q|/e$",unit:"электронов",a:400,ex:"$N = 6{,}4 \times 10^{-11} / 1{,}6 \times 10^{-19} = 400$ электронов."},
{q:"Эбонитовая палочка: $q = -736$ нКл. Сколько элементарных зарядов? $e = 1{,}6 \times 10^{-19}$ Кл.",hint:"$N = |q|/e$; $q = 7{,}36 \times 10^{-7}$ Кл",unit:"×10¹²",a:4.6,ex:"$N = 7{,}36 \times 10^{-7} / 1{,}6 \times 10^{-19} = 4{,}6 \times 10^{12}$."},
{q:"При электризации масса шарика уменьшилась на $2{,}73 \times 10^{-27}$ кг. Какой заряд? $m_e = 9{,}1 \times 10^{-31}$ кг.",hint:"$N = \Delta m/m_e$; $q = eN$",unit:"×10⁻¹⁶ Кл",a:4.8,ex:"$N = 3000$ электронов; $q = 1{,}6 \times 10^{-19} \times 3000 = 4{,}8 \times 10^{-16}$ Кл (положительный)."}
];
var TASKS_P16 = [
{q:"Где в атоме сосредоточен положительный заряд?",opts:["Равномерно по всему атому","В ядре — там находятся протоны","На электронных оболочках","В нейтронах"],a:1,ex:"Ядро атома содержит протоны (+). Размер ядра в $10^4$-$10^5$ раз меньше атома (опыт Резерфорда)."},
{q:"Ядро нейтрального атома азота: 7 протонов. Сколько электронов?",hint:"Нейтральный атом: $N_e = N_p$",unit:"электронов",a:7,ex:"У нейтрального атома $N_e = N_p = 7$."},
{q:"Атом меди потерял 2 электрона. Что образовалось?",opts:["Анион $\text{Cu}^{2-}$","Катион $\text{Cu}^{2+}$, заряд $+2e$","Нейтральный атом","Нейтрон"],a:1,ex:"Потеря 2 электронов → протонов больше → катион $\text{Cu}^{2+}$ с зарядом $+2e$."},
{q:"Атом хлора присоединил один электрон. Что образовалось?",opts:["Катион $\text{Cl}^+$","Анион $\text{Cl}^-$, заряд $-e$","Нейтральный атом","Протон"],a:1,ex:"Лишний электрон → электронов больше → анион $\text{Cl}^-$ с зарядом $-e$."}
];
var TASKS_P17 = [
{q:"Что является источником электрического поля?",opts:["Любое движущееся тело","Заряженное тело (частица с электрическим зарядом)","Только проводники с током","Только магниты"],a:1,ex:"Электрическое поле создаётся заряженными телами. Оно существует вокруг заряда и действует на любой внесённый заряд."},
{q:"Чем подтверждается реальность электрического поля?",opts:["Его можно увидеть","Его действием на внесённый заряд — на него действует сила","Поле создаёт тепло","Поле изменяет массу тел"],a:1,ex:"Поле действует на внесённый заряд с силой — это объективное доказательство его существования."},
{q:"Что характеризует электрическое напряжение между двумя точками?",opts:["Силу поля в точке","Работу поля при переносе единичного заряда: $U = A/q$","Количество поля","Скорость поля"],a:1,ex:"$U = A/q$ — работа на единицу заряда. Единица: 1 В = 1 Дж/Кл."},
{q:"Верно ли, что $U_{AC} = U_{AB} + U_{BC}$?",opts:["Нет","Да: работа по пути A→C = A→B + B→C","Только если B между A и C","Нет, надо умножать"],a:1,ex:"Работа из A в C = работа A→B + работа B→C, поэтому $U_{AC} = U_{AB} + U_{BC}$."}
];
var TASKS_P18 = [
{q:"При перемещении $q = 2$ нКл совершена работа $A = 8$ нДж. Определите напряжение.",hint:"$U = A/q$",unit:"В",a:4,ex:"$U = 8 \times 10^{-9} / 2 \times 10^{-9} = 4$ В"},
{q:"При перемещении $q = 5{,}0$ Кл совершена работа $A = 150$ Дж. Напряжение?",hint:"$U = A/q$",unit:"В",a:30,ex:"$U = 150/5 = 30$ В"},
{q:"Определите работу при переносе $q = 3{,}0$ Кл при $U = 40$ В.",hint:"$A = qU$",unit:"Дж",a:120,ex:"$A = 3{,}0 \times 40 = 120$ Дж"},
{q:"В электронных часах $q = 17$ мКл, $A = 0{,}26$ Дж. Напряжение?",hint:"$U = A/q$",unit:"В",a:15.3,ex:"$U = 0{,}26 / (17 \times 10^{-3}) = 15{,}3$ В"},
{q:"Силы поля совершили $A_1 = 120$ Дж и $A_2 = 360$ Дж при одинаковом заряде. Во сколько раз отличаются напряжения?",hint:"$U_2/U_1 = A_2/A_1$",unit:"раза",a:3,ex:"$U_2/U_1 = 360/120 = 3$."}
];
var TASKS_P19 = [
{q:"Что называют электрическим током?",opts:["Накопление зарядов на поверхности","Направленное движение заряженных частиц","Хаотическое движение молекул","Перенос вещества"],a:1,ex:"Электрический ток — направленное движение заряженных частиц. Ключевое слово: «направленное»."},
{q:"Каковы два необходимых условия существования тока?",opts:["Высокая T и P","Свободные заряженные частицы + электрическое напряжение","Только высокое напряжение","Только свободные заряды"],a:1,ex:"1) Свободные заряженные частицы (проводник). 2) Электрическое поле (напряжение) для направленного движения."},
{q:"Что такое источник тока?",opts:["Прибор для измерения тока","Устройство, преобразующее энергию в электрическую и создающее напряжение","Тело с большим зарядом","Устройство для хранения тока"],a:1,ex:"Источник тока создаёт напряжение, преобразуя другой вид энергии в электрическую (батарейка, генератор, солнечная батарея)."}
];
var TASKS_P20 = [
{q:"Через сечение проводника за $t = 5{,}0$ мин проходит $q = 90$ Кл. Определите силу тока.",hint:"$I = q/t$; $t = 300$ с",unit:"А",a:0.3,ex:"$I = 90/300 = 0{,}3$ А"},
{q:"За какое время пройдёт $q = 300$ Кл при $I = 0{,}50$ А?",hint:"$t = q/I$",unit:"с",a:600,ex:"$t = 300/0{,}5 = 600$ с"},
{q:"Какой заряд пройдёт через спираль утюга за $t = 10$ мин при $I = 3{,}0$ А?",hint:"$q = It$; $t = 600$ с",unit:"Кл",a:1800,ex:"$q = 3{,}0 \times 600 = 1800$ Кл"},
{q:"Что принято за направление электрического тока?",opts:["Направление движения электронов","Направление движения положительных зарядов (от + к − во внешней цепи)","От большего к меньшему сопротивлению","Зависит от типа проводника"],a:1,ex:"По договорённости: ток течёт от + к − через внешнюю цепь. Электроны движутся в обратном направлении."}
];
var TASKS_P21 = [
{q:"Как правильно включить амперметр?",opts:["Параллельно потребителю","Последовательно (в разрыв цепи), соблюдая полярность","Параллельно источнику","Последовательно, без полярности"],a:1,ex:"Амперметр — последовательно. Он должен пропускать весь ток. Клемму + → к + источника."},
{q:"Как правильно включить вольтметр?",opts:["Последовательно","Параллельно измеряемому участку (без разрыва цепи)","В разрыв","Последовательно с источником"],a:1,ex:"Вольтметр — параллельно. Сопротивление вольтметра очень велико — он почти не влияет на ток."},
{q:"Какой заряд пройдёт за $t = 2{,}0$ мин при $I = 75$ А?",hint:"$q = It$; $t = 120$ с",unit:"Кл",a:9000,ex:"$q = 75 \times 120 = 9000$ Кл"},
{q:"Сила тока при $N = 1{,}0 \times 10^{18}$ электронах за $t = 1{,}0$ с?",hint:"$q = Ne$; $I = q/t$",unit:"А",a:0.16,ex:"$q = 10^{18} \times 1{,}6 \times 10^{-19} = 0{,}16$ Кл; $I = 0{,}16$ А"}
];
var TASKS_P22 = [
{q:"Как формулируется закон Ома?",opts:["I прямо пропорционален R","$I = U/R$: I прямо пропорционален U и обратно R","U прямо пропорционально R","R не зависит от I"],a:1,ex:"Закон Ома (1826): $I = U/R$. Чем больше U — тем больше I. Чем больше R — тем меньше I."},
{q:"Проводник $R = 40$ Ом, $I = 0{,}30$ А. Определите напряжение.",hint:"$U = IR$",unit:"В",a:12,ex:"$U = 0{,}30 \times 40 = 12$ В"},
{q:"Лампочка: $U = 220$ В, $I = 0{,}50$ А. Определите сопротивление.",hint:"$R = U/I$",unit:"Ом",a:440,ex:"$R = 220/0{,}5 = 440$ Ом"},
{q:"Спираль плитки: $U = 220$ В, $R = 80$ Ом. Определите ток.",hint:"$I = U/R$",unit:"А",a:2.75,ex:"$I = 220/80 = 2{,}75$ А"},
{q:"Участок: $I = 75$ мА, $U = 0{,}12$ кВ. Определите R.",hint:"$R = U/I$; $I = 0{,}075$ А, $U = 120$ В",unit:"Ом",a:1600,ex:"$R = 120/0{,}075 = 1600$ Ом"}
];
var TASKS_P23 = [
{q:"Что означает $\rho_\text{константана} = 0{,}50$ Ом·мм²/м?",opts:["Константан длиной 0,50 м имеет R=1 Ом","Проводник из константана l=1 м, S=1 мм² имеет R=0,50 Ом","Константан плохо проводит ток","Константан нагревается до 0,50°C"],a:1,ex:"Удельное сопротивление — это R проводника l=1 м, S=1 мм². По формуле $R = \rho l/S$."},
{q:"Алюминиевый проводник $l = 1{,}0$ м, $S = 1{,}0$ мм². R? $\rho = 0{,}028$ Ом·мм²/м.",hint:"$R = \rho l/S$",unit:"Ом",a:0.028,ex:"$R = 0{,}028 \times 1{,}0/1{,}0 = 0{,}028$ Ом"},
{q:"Медная проволока: $S = 0{,}765$ мм², $R = 1{,}60$ Ом. Длина? $\rho = 0{,}017$ Ом·мм²/м.",hint:"$l = RS/\rho$",unit:"м",a:72,ex:"$l = 1{,}60 \times 0{,}765/0{,}017 = 72{,}0$ м"},
{q:"У какого из двух мотков алюминиевой проволоки больше R, если длина одного в 4 раза больше, сечения равны?",opts:["У более короткого","У более длинного: $R \propto l$ при одинаковых $\rho$ и $S$","Одинаковое","Зависит от T"],a:1,ex:"$R = \rho l/S$. При одинаковых $\rho, S$: $R_2/R_1 = l_2/l_1 = 4$."}
];
var TASKS_P24 = [
{q:"При последовательном соединении сила тока в элементах...",opts:["Разная в каждом","Одинакова: $I_1 = I_2 = I$","Больше в элементе с меньшим R","Зависит от порядка"],a:1,ex:"При последовательном соединении через все элементы проходит одинаковый заряд за одно время → $I = I_1 = I_2$."},
{q:"$R_1 = 3{,}5$ Ом, $R_2 = 10$ Ом, последовательно. Определите R.",hint:"$R = R_1 + R_2$",unit:"Ом",a:13.5,ex:"$R = 3{,}5 + 10 = 13{,}5$ Ом"},
{q:"Последовательно: $R_1 = 4{,}0$ Ом, $R_2 = 10$ Ом; $U_1 = 28$ В. Напряжение на всём участке?",hint:"$I = U_1/R_1$; $U = I(R_1+R_2)$",unit:"В",a:98,ex:"$I = 28/4 = 7$ А; $U = 7 \times 14 = 98$ В"},
{q:"4 лампочки по $U_1 = 3{,}0$ В соединены последовательно. При каком U сети можно включить гирлянду?",hint:"$U = N \times U_1$",unit:"В",a:12,ex:"$U = 4 \times 3{,}0 = 12$ В"}
];
var TASKS_P25 = [
{q:"При параллельном соединении напряжение на элементах...",opts:["Разное","Одинаково: $U_1 = U_2 = U$","Больше на элементе с большим R","Зависит от порядка"],a:1,ex:"Параллельно подключённые элементы присоединены к одним точкам → одинаковое напряжение."},
{q:"$R_1 = 6{,}0$ Ом, $R_2 = 12$ Ом параллельно. R?",hint:"$R = R_1 R_2/(R_1+R_2)$",unit:"Ом",a:4,ex:"$R = 6 \times 12/18 = 4$ Ом. Параллельное соединение: $R < R_{min}$."},
{q:"$R_1 = 6$ Ом, $R_2 = 4$ Ом параллельно, $U = 12$ В. Ток в неразветвлённой части?",hint:"$I_1 = U/R_1$; $I_2 = U/R_2$; $I = I_1+I_2$",unit:"А",a:5,ex:"$I_1 = 2$ А; $I_2 = 3$ А; $I = 5$ А"},
{q:"Почему в квартирной сети используют параллельное соединение?",opts:["Дешевле","Каждый прибор работает при одинаковом напряжении 220 В независимо от других","Безопаснее","Меньше ток"],a:1,ex:"Параллельно: одинаковое U на каждом приборе (220 В). Можно включать/выключать независимо."}
];
var TASKS_P26 = [
{q:"Нагреватель: $R = 20$ Ом, $I = 5{,}0$ А, $t = 2{,}0$ мин. Теплота?",hint:"$Q = I^2Rt$; $t = 120$ с",unit:"кДж",a:60,ex:"$Q = 25 \times 20 \times 120 = 60\,000$ Дж = 60 кДж"},
{q:"Лампочка: $U = 220$ В, $R = 968$ Ом. Мощность?",hint:"$P = U^2/R$",unit:"Вт",a:50,ex:"$P = 220^2/968 = 50$ Вт"},
{q:"Электрочайник $P = 2{,}0$ кВт, $U = 220$ В. Ток?",hint:"$I = P/U$",unit:"А",a:9.09,tol:0.02,ex:"$I = 2000/220 \approx 9{,}09$ А"},
{q:"Нагреватель $U = 120$ В, $I = 2{,}0$ А, $t = 10$ мин. Q?",hint:"$Q = IUt$; $t = 600$ с",unit:"кДж",a:144,ex:"$Q = 2{,}0 \times 120 \times 600 = 144\,000$ Дж = 144 кДж"}
];
var TASKS_P27 = [
{q:"Что произойдёт при коротком замыкании?",opts:["Ток упадёт до нуля","Ток резко возрастёт, провода могут перегреться → пожар","Напряжение исчезнет","Ничего особенного"],a:1,ex:"КЗ: $R \to 0$ → $I = U/R \to \infty$. Реальный ток очень большой → быстрый нагрев → пожар. Защита: предохранители."},
{q:"Светодиодная лампа 10 Вт и лампа накаливания 60 Вт дают одинаковую яркость. Во сколько раз светодиодная экономичнее?",hint:"$P_2/P_1$",unit:"раза",a:6,ex:"$60/10 = 6$ раз. Светодиодная потребляет в 6 раз меньше."},
{q:"Почему провода заземления нужно присоединять к корпусам приборов?",opts:["Для красоты","При пробое изоляции заряд стечёт в землю, не ударив человека","Для улучшения проводимости","Только для телевизоров"],a:1,ex:"Заземление создаёт путь с малым R → ток идёт в землю. Также срабатывает автоматический выключатель."}
];
var TASKS_P28 = [
{q:"Как взаимодействуют одноимённые полюса магнитов?",opts:["Притягиваются","Отталкиваются","Не взаимодействуют","Зависит от расстояния"],a:1,ex:"Одноимённые полюса (N–N, S–S) отталкиваются. Разноимённые (N–S) — притягиваются."},
{q:"Что произойдёт, если разрезать постоянный магнит пополам?",opts:["Получится два магнита: один с полюсом N, другой с S","Каждая половина снова станет магнитом с двумя полюсами N и S","Магниты размагнитятся","Полюса исчезнут"],a:1,ex:"Магнитные полюса неотделимы. Каждый кусок — снова замкнутый магнит с N и S. 'Магнитных монополей' не существует."},
{q:"Как экспериментально обнаружить полюса магнита?",opts:["По цвету металла","Поднести компас: северный полюс стрелки притягивается к южному полюсу магнита","Нагреть магнит","По форме"],a:1,ex:"Компас лучший индикатор: северный полюс стрелки (+) притягивается к южному полюсу магнита (−)."},
{q:"Что такое нейтральная зона магнита?",opts:["Место безопасного хранения","Область между полюсами, где магнитное действие минимально","Зона, где магнит не притягивает железо","Место для подписи маркером"],a:1,ex:"Нейтральная зона — средняя часть между полюсами. Там магнитное поле наименее выражено."}
];
var TASKS_P29 = [
{q:"Что такое линии магнитного поля?",opts:["Реальные нити","Воображаемые линии, наглядно изображающие поле; касательная к ним совпадает с направлением поля","Траектории опилок","Линии поверхности магнита"],a:1,ex:"Линии поля — вспомогательный инструмент. Направление поля в точке = направление ориентации N-полюса стрелки."},
{q:"Из какого полюса выходят линии магнитного поля?",opts:["Из S","Из N — входят в S снаружи магнита","Из обоих","Линии не выходят"],a:1,ex:"По договорённости: линии выходят из N, входят в S снаружи магнита. Внутри магнита — от S к N."},
{q:"Чем характеризуется плотность силовых линий?",opts:["Цветом поля","Интенсивностью поля: чем гуще линии — тем сильнее поле","Направлением","Температурой"],a:1,ex:"Гуще линии = сильнее поле. У полюсов — густые, вдали — редкие."},
{q:"Где поле однородно (линии параллельны и равноотстоящие)?",opts:["Вблизи одного полюса","В середине зазора между близкими разноимёнными полюсами","Вокруг прямого проводника","На конце магнита"],a:1,ex:"Однородное поле: силовые линии параллельны. Реализуется в середине зазора между близкими разноимёнными полюсами."}
];
var TASKS_P30 = [
{q:"Кто первым обнаружил магнитное поле тока?",opts:["Ампер","Эрстед (1820) — стрелка компаса отклонялась при прохождении тока","Фарадей","Ом"],a:1,ex:"Ханс Кристиан Эрстед в 1820 г. случайно заметил: при включении тока стрелка компаса отклоняется. Связь электричества и магнетизма!"},
{q:"Как определить направление линий поля вокруг прямого проводника с током?",opts:["По направлению тока","Правило буравчика: поступательно — как ток; вращение рукоятки — направление линий поля","Правило правой руки (другое)","По закону Ома"],a:1,ex:"Буравчик вращается → направление силовых линий (охватывают проводник окружностями)."},
{q:"Что произойдёт с магнитным полем при реверсе тока?",opts:["Поле исчезнет","Направление силовых линий изменится на противоположное","Интенсивность уменьшится","Ничего"],a:1,ex:"Реверс тока → правило буравчика даёт противоположное вращение → все линии меняют направление."}
];
var TASKS_P31 = [
{q:"Чем катушка с током отличается от прямого проводника по магнитному полю?",opts:["Ничем","Катушка усиливает поле: поля от витков складываются в одном направлении","Катушка уменьшает поле","Поле перпендикулярно току"],a:1,ex:"Каждый виток создаёт поле. В центре катушки поля от витков направлены одинаково и складываются."},
{q:"Как определить N-полюс электромагнита (катушки с током)?",opts:["По материалу сердечника","Правило правой руки для катушки: пальцы — в направлении тока в витках; большой палец — к N-полюсу","По цвету проводов","По закону Ома"],a:1,ex:"Охватить катушку правой рукой: пальцы → направление тока, большой палец → северный полюс N."},
{q:"Как усилить магнитное поле катушки?",opts:["Уменьшить витки","Увеличить витки, увеличить ток или вставить железный сердечник","Увеличить R обмотки","Уменьшить ток"],a:1,ex:"Три способа: 1) больше витков; 2) больше ток; 3) железный сердечник (намагничивается и резко усиливает поле)."},
{q:"Главное отличие электромагнита от постоянного магнита?",opts:["Электромагнит тяжелее","Электромагнит управляемый: вкл. ток → намагничен; выкл. → размагничен","Электромагнит слабее","Нет отличий"],a:1,ex:"Можно включать и выключать — главное преимущество. Подъёмные краны, реле, MRI — везде нужно управляемое поле."}
];
var TASKS_HARD = [
{para:"§15",q:"Расчёска получила $q = 6{,}4 \times 10^{-11}$ Кл потерей электронов. На сколько изменилась масса? $m_e = 9{,}1 \times 10^{-31}$ кг.",hint:"$N = q/e$; $\Delta m = Nm_e$",unit:"×10⁻²⁸ кг",a:3.64,ex:"$N = 400$ электронов; $\Delta m = 400 \times 9{,}1 \times 10^{-31} = 3{,}64 \times 10^{-28}$ кг. Ничтожно мало!"},
{para:"§18",q:"Электроприбор: $U = 220$ В, за 1 мин перемещается $q = 0{,}16$ кКл. Мощность?",hint:"$A = qU$; $P = A/t$",unit:"Вт",a:587,ex:"$A = 160 \times 220 = 35200$ Дж; $P = 35200/60 \approx 587$ Вт"},
{para:"§20",q:"По проводнику $I = 1{,}2$ А, $t = 1{,}0$ ч. Масса электронов? $m_e = 9{,}1 \times 10^{-31}$ кг.",hint:"$q = It$; $N = q/e$; $m = Nm_e$",unit:"×10⁻⁸ кг",a:2.46,ex:"$q = 4320$ Кл; $N = 2{,}7 \times 10^{22}$; $m \approx 2{,}46 \times 10^{-8}$ кг"},
{para:"§22",q:"Проволока $l = 0{,}80$ км, $R = 4{,}8$ Ом, $I = 9{,}0$ мА. Напряжение на участке $l_1 = 50$ м?",hint:"$R_1 = R \cdot l_1/l$; $U_1 = IR_1$",unit:"мВ",a:2.7,ex:"$R_1 = 4{,}8 \times 50/800 = 0{,}30$ Ом; $U_1 = 0{,}009 \times 0{,}30 = 2{,}7$ мВ"},
{para:"§26",q:"Проводник $R = 4{,}0$ Ом, $U = 12$ В, $t = 5{,}0$ мин. Теплота?",hint:"$I = U/R$; $Q = I^2Rt$",unit:"кДж",a:10.8,ex:"$I = 3$ А; $Q = 9 \times 4 \times 300 = 10800$ Дж = 10,8 кДж"},
{para:"§25",q:"$R_1 = 30$ Ом, $R_2 = 60$ Ом параллельно, $U = 120$ В. Общий ток?",hint:"$I_1 = U/R_1$; $I_2 = U/R_2$; $I = I_1+I_2$",unit:"А",a:6,ex:"$I_1 = 4$ А; $I_2 = 2$ А; $I = 6$ А"},
{para:"§23",q:"Реостат: нихром $l = 50$ м, $S = 1{,}0$ мм², $I = 2{,}5$ А. Напряжение? $\rho = 1{,}10$ Ом·мм²/м.",hint:"$R = \rho l/S$; $U = IR$",unit:"В",a:137.5,ex:"$R = 1{,}10 \times 50/1 = 55$ Ом; $U = 2{,}5 \times 55 = 137{,}5$ В"}
];
// ═══════════════════════════════════════
// ПУЛЫ И СОСТОЯНИЯ
// ═══════════════════════════════════════
var POOLS = {
p12:TASKS_P12, p13:TASKS_P13, p14:TASKS_P14, p15:TASKS_P15, p16:TASKS_P16,
p17:TASKS_P17, p18:TASKS_P18, p19:TASKS_P19, p20:TASKS_P20, p21:TASKS_P21,
p22:TASKS_P22, p23:TASKS_P23, p24:TASKS_P24, p25:TASKS_P25, p26:TASKS_P26,
p27:TASKS_P27, p28:TASKS_P28, p29:TASKS_P29, p30:TASKS_P30, p31:TASKS_P31,
hard:TASKS_HARD
};
function mkState(pool) {
return {idx:0, answered:false, results:Array(pool.length).fill(null), selections:Array(pool.length).fill(null)};
}
var STATE = {
p12:mkState(TASKS_P12), p13:mkState(TASKS_P13), p14:mkState(TASKS_P14),
p15:mkState(TASKS_P15), p16:mkState(TASKS_P16), p17:mkState(TASKS_P17),
p18:mkState(TASKS_P18), p19:mkState(TASKS_P19), p20:mkState(TASKS_P20),
p21:mkState(TASKS_P21), p22:mkState(TASKS_P22), p23:mkState(TASKS_P23),
p24:mkState(TASKS_P24), p25:mkState(TASKS_P25), p26:mkState(TASKS_P26),
p27:mkState(TASKS_P27), p28:mkState(TASKS_P28), p29:mkState(TASKS_P29),
p30:mkState(TASKS_P30), p31:mkState(TASKS_P31), hard:mkState(TASKS_HARD)
};
// ═══════════════════════════════════════
// KaTeX рендеринг
// ═══════════════════════════════════════
function doRender(el) {
if (!window.renderMathInElement) return;
renderMathInElement(el, {
delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false}],
throwOnError:false
});
}
// ═══════════════════════════════════════
// ПЕРЕКЛЮЧАТЕЛЬ ПАРАГРАФОВ
// ═══════════════════════════════════════
function setParaTab(para) {
['p12','p13','p14','p15','p16','p17','p18','p19','p20','p21','p22','p23','p24','p25','p26','p27','p28','p29','p30','p31','hard'].forEach(function(p) {
var el = document.getElementById('ptab-'+p);
if (el) el.style.display = (p===para) ? 'block' : 'none';
document.querySelectorAll('.para-pill[data-para="'+p+'"]').forEach(function(b) {
b.classList.toggle('active', p===para);
});
});
}
// ═══════════════════════════════════════
// НАВИГАЦИЯ
// ═══════════════════════════════════════
function renderNav(sec) {
var pool = POOLS[sec], s = STATE[sec];
var el = document.getElementById('navDots'+sec);
if (!el) return;
el.innerHTML = pool.map(function(_, i) {
var cls = 'nav-dot';
if (i===s.idx) cls += ' nd-cur';
else if (s.results[i]===true) cls += ' nd-ok';
else if (s.results[i]===false) cls += ' nd-fail';
return '<button class="'+cls+'" onclick="goToTask(\''+sec+'\','+i+')" title="Задача '+(i+1)+'">'+(i+1)+'</button>';
}).join('');
}
function goToTask(sec, idx) {
var s = STATE[sec];
s.idx = idx;
s.answered = s.results[idx]!==null;
renderTask(sec);
}
// ═══════════════════════════════════════
// ОТРИСОВКА ЗАДАЧИ
// ═══════════════════════════════════════
function renderTask(sec) {
var pool = POOLS[sec], s = STATE[sec];
var area = document.getElementById('taskArea'+sec);
var fb = document.getElementById('fb'+sec);
document.getElementById('sum'+sec).classList.remove('show');
var q = pool[s.idx];
var done = s.results[s.idx]!==null;
s.answered = done;
var isMcq = !!q.opts;
// Бейдж параграфа для раздела hard
var paraBadge = q.para ? '<span style="display:inline-flex;align-items:center;padding:2px 8px;background:rgba(29,78,216,.12);color:var(--pri);border-radius:6px;font-size:.68rem;font-weight:800;margin-left:7px">'+q.para+'</span>' : '';
if (isMcq) {
var selIdx = s.selections[s.idx];
area.innerHTML = '<div class="task-card">' +
'<div class="task-num">Задача '+(s.idx+1)+' из '+pool.length+' · Тест'+paraBadge+'</div>' +
'<div class="task-text">'+q.q+'</div>' +
'<div class="mcq-opts">' +
q.opts.map(function(opt, i) {
var cls = 'opt-btn';
if (done) {
if (i===q.a) cls += ' mcq-cor';
else if (i===selIdx) cls += ' mcq-wrong';
}
return '<button class="'+cls+'" id="mcqOpt'+sec+'_'+i+'" '+
'onclick="'+(done?'':'selectMcq(\''+sec+'\','+i+')')+'" '+
(done?'disabled':'')+'>'+
'<span style="font-weight:800;margin-right:6px">'+String.fromCharCode(65+i)+'.</span>'+opt+
'</button>';
}).join('') +
'</div></div>';
} else {
area.innerHTML = '<div class="task-card">' +
'<div class="task-num">Задача '+(s.idx+1)+' из '+pool.length+paraBadge+'</div>' +
'<div class="task-text">'+q.q+'</div>' +
'<div class="task-hint"><i class="fas fa-lightbulb"></i><span>'+q.hint+'</span></div>' +
'<div class="ans-row">' +
'<label style="font-weight:700;font-size:.88rem">Ответ:</label>' +
'<input class="ans-inp" type="text" id="ainp'+sec+'" placeholder="?" autocomplete="off"' +
(done?' disabled style="border-color:var(--'+(s.results[s.idx]?'ok':'fail')+')"':'')+'>'+
'<span class="unit-lbl">'+q.unit+'</span>' +
(done?'':'<button class="btn btn-pri" onclick="checkNum(\''+sec+'\')"><i class="fas fa-check"></i> Проверить</button>') +
'</div></div>';
}
if (done) {
var ok = s.results[s.idx];
fb.className = 'feedback show '+(ok?'fb-ok':'fb-fail');
if (isMcq) {
fb.innerHTML = ok
? '✓ Верно!&ensp;'+(q.ex||'')
: '✗ Неверно. Правильный ответ: <strong>'+q.opts[q.a]+'</strong>&ensp;'+(q.ex||'');
} else {
fb.innerHTML = ok
? '✓ Верно!&ensp;'+q.ex
: '✗ Неверно. Правильный ответ: <strong>'+q.a+'&nbsp;'+q.unit+'</strong>&ensp;'+q.ex;
}
document.getElementById('nextBtn'+sec).style.display = 'inline-flex';
doRender(fb);
} else {
fb.className = 'feedback';
document.getElementById('nextBtn'+sec).style.display = 'none';
}
updateScoreBar(sec);
renderNav(sec);
doRender(area);
if (!done && !isMcq) {
var inp = document.getElementById('ainp'+sec);
setTimeout(function(){ if(inp) inp.focus(); }, 80);
if (inp) inp.addEventListener('keydown', function(e){ if(e.key==='Enter') checkNum(sec); });
}
}
// ═══════════════════════════════════════
// ПРОВЕРКА MCQ
// ═══════════════════════════════════════
function selectMcq(sec, i) {
var s = STATE[sec];
if (s.answered) return;
var pool = POOLS[sec], q = pool[s.idx];
var ok = (i===q.a);
s.results[s.idx] = ok;
s.selections[s.idx] = i;
s.answered = true;
updateScoreBar(sec);
renderNav(sec);
q.opts.forEach(function(_, j) {
var btn = document.getElementById('mcqOpt'+sec+'_'+j);
if (!btn) return;
btn.disabled = true;
if (j===q.a) btn.classList.add('mcq-cor');
else if (j===i && !ok) btn.classList.add('mcq-wrong');
});
var fb = document.getElementById('fb'+sec);
fb.className = 'feedback show '+(ok?'fb-ok':'fb-fail');
fb.innerHTML = ok
? '✓ Верно!&ensp;'+(q.ex||'')
: '✗ Неверно. Правильный ответ: <strong>'+q.opts[q.a]+'</strong>&ensp;'+(q.ex||'');
doRender(fb);
document.getElementById('nextBtn'+sec).style.display = 'inline-flex';
if (s.results.every(function(r){ return r!==null; })) {
setTimeout(function(){ showSummary(sec); }, 2200);
}
}
// ═══════════════════════════════════════
// ПРОВЕРКА ЧИСЛОВЫХ
// ═══════════════════════════════════════
function checkNum(sec) {
var s = STATE[sec];
if (s.answered) return;
var pool = POOLS[sec], q = pool[s.idx];
var inp = document.getElementById('ainp'+sec);
var fb = document.getElementById('fb'+sec);
var val = inp.value.trim().replace(',','.');
var num = parseFloat(val);
if (!val || isNaN(num)) {
fb.className = 'feedback show fb-fail';
fb.innerHTML = 'Введите числовой ответ!';
return;
}
s.answered = true;
var tol = (q.tol !== undefined) ? q.tol : 0.03;
var ok = (q.a===0) ? (Math.abs(num)<0.05) : (Math.abs((num-q.a)/q.a)<tol);
s.results[s.idx] = ok;
updateScoreBar(sec);
renderNav(sec);
inp.disabled = true;
inp.style.borderColor = ok ? 'var(--ok)' : 'var(--fail)';
fb.className = 'feedback show '+(ok?'fb-ok':'fb-fail');
fb.innerHTML = ok
? '✓ Верно!&ensp;'+q.ex
: '✗ Неверно. Правильный ответ: <strong>'+q.a+'&nbsp;'+q.unit+'</strong>&ensp;'+q.ex;
doRender(fb);
document.getElementById('nextBtn'+sec).style.display = 'inline-flex';
if (s.results.every(function(r){ return r!==null; })) {
setTimeout(function(){ showSummary(sec); }, 2200);
}
}
// ═══════════════════════════════════════
// СЛЕДУЮЩАЯ / СБРОС
// ═══════════════════════════════════════
function nextTask(sec) {
var pool = POOLS[sec], s = STATE[sec];
var next = -1;
for (var i=s.idx+1; i<pool.length; i++) {
if (s.results[i]===null) { next=i; break; }
}
if (next===-1) {
for (var j=0; j<s.idx; j++) {
if (s.results[j]===null) { next=j; break; }
}
}
if (next===-1) { showSummary(sec); return; }
s.idx = next;
s.answered = false;
renderTask(sec);
}
function resetTasks(sec) {
STATE[sec] = mkState(POOLS[sec]);
document.getElementById('sum'+sec).classList.remove('show');
renderTask(sec);
}
// ═══════════════════════════════════════
// SCORE BAR
// ═══════════════════════════════════════
function updateScoreBar(sec) {
var pool = POOLS[sec], s = STATE[sec];
var okCnt = s.results.filter(function(r){ return r===true; }).length;
var doneCnt = s.results.filter(function(r){ return r!==null; }).length;
document.getElementById('ok'+sec).textContent = okCnt;
document.getElementById('cur'+sec).textContent = doneCnt;
document.getElementById('max'+sec).textContent = pool.length;
document.getElementById('prog'+sec).style.width = (doneCnt/pool.length*100)+'%';
}
// ═══════════════════════════════════════
// SUMMARY
// ═══════════════════════════════════════
function showSummary(sec) {
var pool = POOLS[sec], s = STATE[sec];
document.getElementById('prog'+sec).style.width = '100%';
document.getElementById('sum'+sec).classList.add('show');
var okCnt = s.results.filter(function(r){ return r===true; }).length;
document.getElementById('sumScore'+sec).textContent = okCnt+' / '+pool.length;
var p = okCnt/pool.length;
document.getElementById('sumGrade'+sec).textContent =
p>=.9 ? 'Отлично — тема освоена!' :
p>=.75 ? 'Хорошо! Разбери пропущенные задачи.' :
p>=.5 ? 'Неплохо. Повтори формулы и попробуй ещё раз.' :
'Прочитай теорию и реши снова.';
}
// ═══════════════════════════════════════
// ИНТЕРАКТИВЫ §12-§16
// ═══════════════════════════════════════
// ═══ §12: Электризация и взаимодействие ═══
var ch12rubbed = false, ch12approaching = false, ch12same = false, ch12dist = 1.0;
var anim12Id = null;
function rub12() {
ch12rubbed = true; ch12approaching = false; ch12dist = 1.0;
startAnim12();
}
function approach12(diff) {
if (!ch12rubbed) { alert('Сначала потри палочки!'); return; }
ch12approaching = true; ch12same = !diff; ch12dist = 1.0;
startAnim12();
}
function reset12() {
ch12rubbed = false; ch12approaching = false; ch12dist = 1.0;
if (anim12Id) { cancelAnimationFrame(anim12Id); anim12Id = null; }
draw12static();
}
function upd12() { draw12static(); }
function startAnim12() {
var cv = document.getElementById('cv12');
if (!cv || cv.offsetWidth === 0) return;
if (anim12Id) { cancelAnimationFrame(anim12Id); anim12Id = null; }
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 260;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
var t = 0;
function frame() {
ctx.clearRect(0, 0, W, H);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
t += 0.03;
if (ch12approaching && ch12dist > 0.25) ch12dist -= 0.012;
draw12scene(ctx, W, H, t);
anim12Id = requestAnimationFrame(frame);
}
anim12Id = requestAnimationFrame(frame);
}
function draw12static() {
var cv = document.getElementById('cv12');
if (!cv || cv.offsetWidth === 0) return;
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 260;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
draw12scene(ctx, W, H, 0);
}
function draw12scene(ctx, W, H, t) {
var mid = W / 2;
var s1x = ch12approaching ? mid - 70 - (ch12same ? 0 : ch12dist * 60) : mid - 110;
var s1y = H / 2;
ctx.fillStyle = ch12rubbed ? '#f97316' : '#94a3b8';
ctx.fillRect(s1x - 40, s1y - 8, 80, 16);
ctx.fillStyle = '#64748b'; ctx.font = '10px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('Стекло', s1x, s1y + 26);
if (ch12rubbed) {
var sign1 = ch12same ? '-' : '+';
ctx.fillStyle = sign1 === '+' ? '#ef4444' : '#3b82f6';
ctx.font = 'bold 12px sans-serif';
for (var i = -3; i <= 3; i++) ctx.fillText(sign1, s1x + i * 10, s1y - 14);
}
var s2x = ch12approaching ? mid + 70 + ch12dist * 60 : mid + 110;
ctx.fillStyle = ch12rubbed ? '#8b5cf6' : '#94a3b8';
ctx.fillRect(s2x - 40, s1y - 8, 80, 16);
ctx.fillStyle = '#64748b'; ctx.font = '10px sans-serif';
ctx.fillText('Эбонит', s2x, s1y + 26);
if (ch12rubbed) {
ctx.fillStyle = '#3b82f6'; ctx.font = 'bold 12px sans-serif';
for (var i = -3; i <= 3; i++) ctx.fillText('-', s2x + i * 10, s1y - 14);
}
if (ch12approaching) {
var color = ch12same ? '#ef4444' : '#22c55e';
var label = ch12same ? '↔ ОТТАЛКИВАЮТСЯ' : '↔ ПРИТЯГИВАЮТСЯ';
ctx.strokeStyle = color; ctx.lineWidth = 2;
ctx.beginPath(); ctx.moveTo(s1x + 42, s1y); ctx.lineTo(s2x - 42, s1y); ctx.stroke();
ctx.fillStyle = color; ctx.font = 'bold 11px sans-serif';
ctx.fillText(label, mid, s1y - 42);
}
var ex = W - 55, ey = H / 2 - 10;
ctx.strokeStyle = '#3b82f6'; ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.ellipse(ex, ey, 35, 42, 0, 0, Math.PI * 2); ctx.stroke();
ctx.strokeStyle = '#94a3b8'; ctx.lineWidth = 2.5;
ctx.beginPath(); ctx.moveTo(ex, ey - 55); ctx.lineTo(ex, ey + 5); ctx.stroke();
ctx.fillStyle = ch12rubbed ? '#ef4444' : '#94a3b8';
ctx.beginPath(); ctx.arc(ex, ey - 57, 7, 0, Math.PI * 2); ctx.fill();
var leafAngle = 0;
if (ch12rubbed && ch12approaching) leafAngle = Math.min(35, (1 - ch12dist) * 45 + 10) * Math.PI / 180;
else if (ch12rubbed) leafAngle = 5 * Math.PI / 180;
var lx1 = ex + Math.sin(-leafAngle) * 28, ly1 = ey + 5 + Math.cos(leafAngle) * 28;
var lx2 = ex + Math.sin(leafAngle) * 28, ly2 = ey + 5 + Math.cos(leafAngle) * 28;
ctx.strokeStyle = '#fbbf24'; ctx.lineWidth = 2;
ctx.beginPath(); ctx.moveTo(ex, ey + 5); ctx.lineTo(lx1, ly1); ctx.stroke();
ctx.beginPath(); ctx.moveTo(ex, ey + 5); ctx.lineTo(lx2, ly2); ctx.stroke();
ctx.fillStyle = '#94a3b8'; ctx.font = '9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('Электроскоп', ex, H - 8);
if (!ch12rubbed) { ctx.fillText('Незаряжен', mid, H - 8); }
else {
ctx.fillStyle = '#fbbf24';
ctx.fillText(ch12approaching
? (ch12same ? 'Одноимённые → отталкивание' : 'Разноимённые → притяжение')
: 'Потёрты! Приближай палочки', mid, H - 8);
}
}
// ═══ §13: Проводники и диэлектрики ═══
var ch13state = 0, ch13anim = null, ch13progress = 0;
function connect13() {
var sel = document.getElementById('sel13mat');
var isCond = sel && +sel.value === 1;
ch13state = 1; ch13progress = 0;
startAnim13(isCond);
}
function reset13() {
ch13state = 0; ch13progress = 0;
if (ch13anim) { cancelAnimationFrame(ch13anim); ch13anim = null; }
upd13();
}
function upd13() {
var cv = document.getElementById('cv13');
if (!cv || cv.offsetWidth === 0) return;
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 240;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
draw13(ctx, W, H, false, 0);
}
function startAnim13(isCond) {
var cv = document.getElementById('cv13');
if (!cv) return;
if (ch13anim) { cancelAnimationFrame(ch13anim); ch13anim = null; }
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 240;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
var electrons = [];
function frame() {
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
ch13progress = Math.min(1, ch13progress + 0.02);
if (isCond && ch13progress < 0.9 && Math.random() < 0.3)
electrons.push({ x: W * 0.35, y: H / 2 + (Math.random() - 0.5) * 20, vx: 1.5, alpha: 1 });
electrons.forEach(function(e) { e.x += e.vx; e.alpha = Math.max(0, e.alpha - 0.02); });
electrons = electrons.filter(function(e) { return e.alpha > 0 && e.x < W * 0.65; });
draw13(ctx, W, H, isCond, ch13progress);
electrons.forEach(function(e) {
ctx.globalAlpha = e.alpha;
ctx.fillStyle = '#3b82f6';
ctx.beginPath(); ctx.arc(e.x, e.y, 3, 0, Math.PI * 2); ctx.fill();
ctx.globalAlpha = 1;
});
if (ch13progress < 1) ch13anim = requestAnimationFrame(frame);
else { ch13state = 2; ch13anim = null; }
}
ch13anim = requestAnimationFrame(frame);
}
function draw13(ctx, W, H, isCond, progress) {
var e1x = W * 0.2, e2x = W * 0.8, ey = H / 2;
function drawScope(cx, charged, label) {
ctx.strokeStyle = '#3b82f6'; ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.ellipse(cx, ey, 30, 35, 0, 0, Math.PI * 2); ctx.stroke();
ctx.strokeStyle = '#94a3b8'; ctx.lineWidth = 2.5;
ctx.beginPath(); ctx.moveTo(cx, ey - 45); ctx.lineTo(cx, ey + 5); ctx.stroke();
ctx.fillStyle = charged ? '#ef4444' : '#94a3b8';
ctx.beginPath(); ctx.arc(cx, ey - 47, 6, 0, Math.PI * 2); ctx.fill();
if (charged) {
ctx.fillStyle = '#fff'; ctx.font = 'bold 7px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('', cx, ey - 45);
}
var angle = charged ? 0.35 : 0.02;
ctx.strokeStyle = '#fbbf24'; ctx.lineWidth = 2;
ctx.beginPath(); ctx.moveTo(cx, ey + 5);
ctx.lineTo(cx - Math.sin(angle) * 25, ey + 5 + Math.cos(angle) * 25); ctx.stroke();
ctx.beginPath(); ctx.moveTo(cx, ey + 5);
ctx.lineTo(cx + Math.sin(angle) * 25, ey + 5 + Math.cos(angle) * 25); ctx.stroke();
ctx.fillStyle = '#64748b'; ctx.font = '9px sans-serif';
ctx.fillText(label, cx, H - 10);
}
var e2charged = isCond && progress > 0.5;
drawScope(e1x, true, 'Заряжен ()');
drawScope(e2x, e2charged, e2charged ? 'Получил заряд!' : 'Незаряжен');
var sel = document.getElementById('sel13mat');
var matName = sel ? sel.options[sel.selectedIndex].text.split('(')[0].trim() : 'Материал';
ctx.strokeStyle = isCond ? '#22c55e' : '#ef4444'; ctx.lineWidth = isCond ? 3 : 2;
if (!isCond) ctx.setLineDash([6, 4]);
ctx.beginPath(); ctx.moveTo(e1x + 32, ey - 47); ctx.lineTo(e2x - 32, ey - 47); ctx.stroke();
ctx.setLineDash([]);
ctx.fillStyle = isCond ? '#22c55e' : '#ef4444'; ctx.font = '9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText(matName, W / 2, ey - 57);
if (progress > 0.5) {
ctx.fillStyle = isCond ? '#22c55e' : '#f97316'; ctx.font = 'bold 11px sans-serif';
ctx.fillText(isCond ? '✓ Заряд перешёл — проводник!' : '✗ Заряд не перешёл — диэлектрик!', W / 2, H - 28);
}
}
// ═══ §14: Электризация через влияние (Pro Max) ═══
var sl14dval = 80;
var anim14Id = null;
var electrons14 = null;
var target14d = 80; // целевое положение слайдера для плавных анимаций "поднести/убрать"
function initElectrons14(){
electrons14 = [];
for (var i = 0; i < 14; i++){
electrons14.push({ x: 0.1 + Math.random()*0.8, y: 0.2 + Math.random()*0.6, vx: 0, vy: 0 });
}
}
function approach14(){
target14d = 12;
var sl = document.getElementById('sl14d'); if(sl) sl.value = 12;
}
function reset14(){
target14d = 80;
var sl = document.getElementById('sl14d'); if(sl) sl.value = 80;
}
function upd14() {
var cv = document.getElementById('cv14');
if (!cv || cv.offsetWidth === 0) return;
if (!electrons14) initElectrons14();
if (anim14Id) { cancelAnimationFrame(anim14Id); anim14Id = null; }
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 260;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
function frame(now){
var W2 = cv.offsetWidth, H2 = cv.offsetHeight || 260;
if (W2 !== W){ W = W2; cv.width = Math.round(W*dpr); cv.height = Math.round(H2*dpr); ctx.setTransform(dpr,0,0,dpr,0,0); }
H = H2;
// плавное приближение sl14dval к target14d
sl14dval += (target14d - sl14dval) * 0.12;
var sl = document.getElementById('sl14d');
if (sl && Math.abs(+sl.value - sl14dval) > 0.5) sl.value = Math.round(sl14dval);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
// фоновая сетка
ctx.strokeStyle = 'rgba(148,163,184,.04)'; ctx.lineWidth = 1;
for (var gx = 20; gx < W; gx += 30){ ctx.beginPath(); ctx.moveTo(gx,0); ctx.lineTo(gx,H); ctx.stroke(); }
var d = sl14dval / 100;
var lbl = document.getElementById('lbl14d');
if (lbl) lbl.textContent = d < 0.25 ? '🔥 очень близко' : d < 0.5 ? 'близко' : d < 0.75 ? 'среднее' : 'далеко';
var sel = document.getElementById('sel14sign');
var sign = sel ? +sel.value : 1;
var cx = W/2, cy = H/2 - 10;
// Проводник (металлический брусок) с градиентом
var condX = cx - 90, condY = cy - 30, condW = 180, condH = 60;
var mgrd = ctx.createLinearGradient(condX, condY, condX, condY + condH);
mgrd.addColorStop(0, 'rgba(148,163,184,.35)');
mgrd.addColorStop(0.5,'rgba(203,213,225,.5)');
mgrd.addColorStop(1, 'rgba(100,116,139,.4)');
ctx.fillStyle = mgrd;
ctx.fillRect(condX, condY, condW, condH);
ctx.strokeStyle = '#94a3b8'; ctx.lineWidth = 2; ctx.strokeRect(condX, condY, condW, condH);
ctx.fillStyle = '#cbd5e1'; ctx.font = 'bold 10px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('Проводник (металл)', cx, condY + condH + 14);
var influence = Math.max(0, 1 - d * 1.25);
// Силовое влияние палочки: электроны притягиваются к + (или отталкиваются от −)
// sign>0 (+ палочка) → электроны идут влево; sign<0 (− палочка) → электроны идут вправо
var pullDir = sign > 0 ? -1 : 1; // направление дрейфа
var pull = influence * 0.0035 * pullDir; // ускорение
// Анимация электронов внутри проводника
var leftCount = 0, rightCount = 0;
electrons14.forEach(function(e){
e.vx += pull;
e.vx *= 0.85;
e.vy *= 0.85;
e.vy += (Math.random() - 0.5) * 0.0015; // лёгкое броуновское
e.x += e.vx;
e.y += e.vy;
// мягкие стенки
if (e.x < 0.06){ e.x = 0.06; e.vx = -e.vx*0.4; }
if (e.x > 0.94){ e.x = 0.94; e.vx = -e.vx*0.4; }
if (e.y < 0.12){ e.y = 0.12; e.vy = -e.vy*0.4; }
if (e.y > 0.88){ e.y = 0.88; e.vy = -e.vy*0.4; }
// отрисовка
var ex = condX + e.x * condW;
var ey = condY + e.y * condH;
ctx.fillStyle = 'rgba(59,130,246,.9)'; ctx.shadowColor = '#3b82f6'; ctx.shadowBlur = 6;
ctx.beginPath(); ctx.arc(ex, ey, 3.5, 0, Math.PI*2); ctx.fill();
ctx.shadowBlur = 0;
ctx.fillStyle = '#dbeafe'; ctx.font = 'bold 7px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('', ex, ey + 2);
if (e.x < 0.5) leftCount++; else rightCount++;
});
// Метки заряда на боковых гранях проводника (избыток/недостаток)
var balance = 7; // равновесное число электронов в каждой половине (всего 14)
var leftExcess = leftCount - balance; // >0: избыток e- слева → "−" сильнее
var rightExcess = rightCount - balance; // >0: избыток e- справа → "−" сильнее
// Левая грань
var leftSign = leftExcess > 0 ? '' : leftExcess < 0 ? '+' : '·';
var leftCol = leftExcess > 0 ? '#3b82f6' : leftExcess < 0 ? '#ef4444' : '#64748b';
ctx.fillStyle = leftCol; ctx.font = 'bold 11px sans-serif'; ctx.textAlign = 'center';
for (var k = 0; k < 4; k++) ctx.fillText(leftSign, condX - 8, condY + 14 + k*14);
// Правая грань
var rightSign = rightExcess > 0 ? '' : rightExcess < 0 ? '+' : '·';
var rightCol = rightExcess > 0 ? '#3b82f6' : rightExcess < 0 ? '#ef4444' : '#64748b';
ctx.fillStyle = rightCol;
for (var k = 0; k < 4; k++) ctx.fillText(rightSign, condX + condW + 8, condY + 14 + k*14);
// Палочка
var stickX = condX - 30 - d * 100;
var stickW = 70, stickH = 22;
var sgrd = ctx.createLinearGradient(stickX - stickW, cy - stickH/2, stickX, cy + stickH/2);
if (sign > 0){ sgrd.addColorStop(0,'#fca5a5'); sgrd.addColorStop(1,'#dc2626'); }
else { sgrd.addColorStop(0,'#93c5fd'); sgrd.addColorStop(1,'#1d4ed8'); }
ctx.fillStyle = sgrd; ctx.fillRect(stickX - stickW, cy - stickH/2, stickW, stickH);
ctx.strokeStyle = sign > 0 ? '#ef4444' : '#3b82f6'; ctx.lineWidth = 1.5;
ctx.strokeRect(stickX - stickW, cy - stickH/2, stickW, stickH);
ctx.fillStyle = '#fff'; ctx.font = 'bold 11px sans-serif'; ctx.textAlign = 'center';
var symb = sign > 0 ? '+' : '';
for (var i = 0; i < 5; i++) ctx.fillText(symb, stickX - stickW + 8 + i*14, cy + 4);
ctx.fillStyle = sign > 0 ? '#fca5a5' : '#93c5fd'; ctx.font = '9px sans-serif';
ctx.fillText((sign > 0 ? '+' : '') + ' заряж. палочка', stickX - stickW/2, cy + stickH/2 + 14);
// Силовые линии поля от палочки к проводнику (когда близко)
if (influence > 0.05){
ctx.strokeStyle = 'rgba(251,191,36,' + (influence * 0.6).toFixed(2) + ')';
ctx.lineWidth = 1.2; ctx.setLineDash([4, 3]);
for (var ln = 0; ln < 4; ln++){
var y0 = cy - 14 + ln * 10;
ctx.beginPath();
ctx.moveTo(stickX + 2, y0);
ctx.lineTo(condX - 2, y0);
ctx.stroke();
}
ctx.setLineDash([]);
// стрелочки направления
ctx.fillStyle = 'rgba(251,191,36,' + (influence * 0.8).toFixed(2) + ')';
ctx.font = 'bold 9px sans-serif'; ctx.textAlign = 'center';
var arrowDir = sign > 0 ? '→' : '→'; // поле направлено от + к −, для отображения тока электронов:
// подпись e- движение
ctx.fillStyle = 'rgba(147,197,253,0.9)';
ctx.fillText('e⁻ дрейф ' + (sign > 0 ? '←' : '→'), (stickX + condX)/2, cy - 22);
}
// Чипы (обновляем DOM)
var chipL = document.getElementById('chip14L');
var chipR = document.getElementById('chip14R');
var chipF = document.getElementById('chip14F');
if (chipL) chipL.textContent = 'Левая: ' + (leftExcess > 0 ? '' + leftExcess : leftExcess < 0 ? '+' + (-leftExcess) : '0') + ' e';
if (chipR) chipR.textContent = 'Правая: ' + (rightExcess > 0 ? '' + rightExcess : rightExcess < 0 ? '+' + (-rightExcess) : '0') + ' e';
if (chipF) chipF.textContent = 'Влияние: ' + Math.round(influence * 100) + '%';
anim14Id = requestAnimationFrame(frame);
}
anim14Id = requestAnimationFrame(frame);
}
// ═══ §15: Элементарный заряд q=eN ═══
var sl15Nval = 0;
function upd15() {
var cv = document.getElementById('cv15');
if (!cv || cv.offsetWidth === 0) return;
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 180;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var N = sl15Nval || 0;
var e = 1.6e-19;
ctx.fillStyle = 'rgba(239,68,68,.15)'; ctx.fillRect(20, 30, 100, 80);
ctx.strokeStyle = '#ef4444'; ctx.lineWidth = 1.5; ctx.strokeRect(20, 30, 100, 80);
ctx.fillStyle = '#ef4444'; ctx.font = 'bold 9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('Тело 1', 70, 20);
ctx.fillStyle = '#94a3b8'; ctx.font = '8px sans-serif';
ctx.fillText('Потеряло ' + N + ' e⁻', 70, 120);
ctx.fillStyle = 'rgba(59,130,246,.15)'; ctx.fillRect(W - 120, 30, 100, 80);
ctx.strokeStyle = '#3b82f6'; ctx.lineWidth = 1.5; ctx.strokeRect(W - 120, 30, 100, 80);
ctx.fillStyle = '#3b82f6'; ctx.font = 'bold 9px sans-serif';
ctx.fillText('Тело 2', W - 70, 20);
ctx.fillStyle = '#94a3b8'; ctx.font = '8px sans-serif';
ctx.fillText('Получило ' + N + ' e⁻', W - 70, 120);
if (N > 0) {
var eCount = Math.min(N / 100, 15);
for (var i = 0; i < eCount; i++) {
var ex2 = 130 + (i / eCount) * (W - 250);
var ey2 = 60 + Math.sin(i * 1.2) * 15;
ctx.fillStyle = '#3b82f6'; ctx.beginPath(); ctx.arc(ex2, ey2, 3, 0, Math.PI * 2); ctx.fill();
ctx.fillStyle = '#93c5fd'; ctx.font = '7px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('e⁻', ex2, ey2 - 6);
}
ctx.strokeStyle = '#3b82f6'; ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.moveTo(122, 70); ctx.lineTo(W - 122, 70); ctx.stroke();
ctx.fillStyle = '#3b82f6'; ctx.font = 'bold 8px sans-serif';
ctx.fillText('→ ' + N + ' электронов', W / 2, 65);
}
var qStr = N === 0 ? '0' : (N * e).toExponential(2);
var res = document.getElementById('res15');
if (res) {
res.innerHTML = '$q = e \\times ' + N + ' = ' + qStr + '$ Кл' +
(N > 0 ? ' &nbsp;|&nbsp; Тело 1: <b>+' + qStr + '</b> Кл &nbsp; Тело 2: <b>' + qStr + '</b> Кл' : '');
if (window.doRender) doRender(res);
}
}
// ═══ §16: Модель атома и ионы ═══
var atom16state = { protons: 6, electrons: 6, name: 'C' };
var anim16Id = null;
function reset16() {
var sel = document.getElementById('sel16elem');
if (sel) {
var parts = sel.value.split(',');
atom16state.protons = +parts[0];
atom16state.electrons = +parts[1];
atom16state.name = sel.options[sel.selectedIndex].text.split(' ')[0];
}
if (anim16Id) { cancelAnimationFrame(anim16Id); anim16Id = null; }
startAnim16();
}
function ionize16(delta) {
atom16state.electrons = Math.max(0, Math.min(atom16state.protons + 3, atom16state.electrons + delta));
if (!anim16Id) startAnim16();
updateRes16();
}
function updateRes16() {
var res = document.getElementById('res16');
if (!res) return;
var p = atom16state.protons, e = atom16state.electrons;
var charge = p - e;
var type = charge === 0 ? 'Нейтральный атом' : charge > 0 ? 'Катион (+' + charge + ')' : 'Анион (' + charge + ')';
res.textContent = type + ': ' + p + ' протонов, ' + e + ' электронов — заряд ' + (charge > 0 ? '+' : '') + charge + 'e';
}
function startAnim16() {
var cv = document.getElementById('cv16');
if (!cv || cv.offsetWidth === 0) return;
if (anim16Id) { cancelAnimationFrame(anim16Id); anim16Id = null; }
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 240;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
var t0 = performance.now();
function frame(now) {
ctx.clearRect(0, 0, W, H);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var t = (now - t0) / 1000;
var cx = W / 2, cy = H / 2;
var p = atom16state.protons, e = atom16state.electrons;
var nucR = 18 + Math.min(p, 8);
var grd = ctx.createRadialGradient(cx, cy, 0, cx, cy, nucR);
grd.addColorStop(0, '#fca5a5'); grd.addColorStop(1, '#dc2626');
ctx.fillStyle = grd;
ctx.beginPath(); ctx.arc(cx, cy, nucR, 0, Math.PI * 2); ctx.fill();
ctx.fillStyle = '#fff'; ctx.font = 'bold 9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText(atom16state.name, cx, cy + 4);
var shells = [2, 8, 8, 2];
var remainE = e, shell = 0;
while (remainE > 0 && shell < 4) {
var count = Math.min(remainE, shells[shell]);
var r = nucR + 25 + shell * 28;
ctx.strokeStyle = 'rgba(148,163,184,.2)'; ctx.lineWidth = 1;
ctx.beginPath(); ctx.arc(cx, cy, r, 0, Math.PI * 2); ctx.stroke();
for (var i = 0; i < count; i++) {
var angle = t * (1.5 - shell * 0.3) + (i / count) * Math.PI * 2;
var ex2 = cx + Math.cos(angle) * r, ey2 = cy + Math.sin(angle) * r;
ctx.fillStyle = '#3b82f6'; ctx.shadowColor = '#3b82f6'; ctx.shadowBlur = 5;
ctx.beginPath(); ctx.arc(ex2, ey2, 4, 0, Math.PI * 2); ctx.fill();
ctx.shadowBlur = 0;
ctx.fillStyle = '#93c5fd'; ctx.font = '7px sans-serif';
ctx.fillText('e⁻', ex2, ey2 - 7);
}
remainE -= count; shell++;
}
var charge = p - e;
var color = charge === 0 ? '#94a3b8' : charge > 0 ? '#ef4444' : '#3b82f6';
var label = charge === 0 ? 'Нейтральный атом'
: charge > 0 ? 'Катион ' + atom16state.name + '+'.repeat(charge)
: 'Анион ' + atom16state.name + '-'.repeat(-charge);
ctx.fillStyle = color; ctx.font = 'bold 11px sans-serif'; ctx.textAlign = 'center';
ctx.fillText(label, cx, H - 12);
updateRes16();
anim16Id = requestAnimationFrame(frame);
}
anim16Id = requestAnimationFrame(frame);
}
// ═══ Заглушки §17-§31 (не изменены) ═══
var anim17Id=null,anim19Id=null,anim20Id=null,anim22Id=null;
var anim28Id=null,anim29Id=null,anim30Id=null,anim31Id=null;
// ═══ §17: Силовые линии электрического поля (Pro Max) ═══
var probe17 = { x: 0.65, y: 0.35 }; // относительные координаты
var probe17Init = false;
var anim17DragId = null;
var dragging17 = false;
function upd17() {
var cv = document.getElementById('cv17');
if (!cv || cv.offsetWidth === 0) return;
if (anim17Id) { cancelAnimationFrame(anim17Id); anim17Id = null; }
if (!probe17Init) {
probe17Init = true;
// mouse / touch обработка
cv.addEventListener('mousedown', function(ev){
var rect = cv.getBoundingClientRect();
var mx = (ev.clientX - rect.left) / rect.width;
var my = (ev.clientY - rect.top) / rect.height;
// если клик возле пробного заряда (или включён showProbe) — начать drag
var dx = mx - probe17.x, dy = my - probe17.y;
if (Math.hypot(dx*rect.width, dy*rect.height) < 30 || true){
dragging17 = true;
probe17.x = mx; probe17.y = my;
}
});
cv.addEventListener('mousemove', function(ev){
if (!dragging17) return;
var rect = cv.getBoundingClientRect();
probe17.x = Math.max(0.02, Math.min(0.98, (ev.clientX - rect.left) / rect.width));
probe17.y = Math.max(0.05, Math.min(0.95, (ev.clientY - rect.top) / rect.height));
});
window.addEventListener('mouseup', function(){ dragging17 = false; });
cv.addEventListener('touchstart', function(ev){
if (!ev.touches[0]) return;
var rect = cv.getBoundingClientRect();
probe17.x = (ev.touches[0].clientX - rect.left) / rect.width;
probe17.y = (ev.touches[0].clientY - rect.top) / rect.height;
dragging17 = true;
ev.preventDefault();
}, {passive:false});
cv.addEventListener('touchmove', function(ev){
if (!dragging17 || !ev.touches[0]) return;
var rect = cv.getBoundingClientRect();
probe17.x = Math.max(0.02, Math.min(0.98, (ev.touches[0].clientX - rect.left) / rect.width));
probe17.y = Math.max(0.05, Math.min(0.95, (ev.touches[0].clientY - rect.top) / rect.height));
ev.preventDefault();
}, {passive:false});
cv.addEventListener('touchend', function(){ dragging17 = false; });
}
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 300;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
var flowOffset = 0;
function frame(now){
var W2 = cv.offsetWidth, H2 = cv.offsetHeight || 300;
if (W2 !== W){ W = W2; H = H2; cv.width = Math.round(W*dpr); cv.height = Math.round(H*dpr); ctx.setTransform(dpr,0,0,dpr,0,0); }
H = H2;
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var sel = document.getElementById('sel17mode');
var mode = sel ? sel.value : 'dipole';
var showProbe = document.getElementById('chk17probe') && document.getElementById('chk17probe').checked;
var flowOn = document.getElementById('chk17flow') && document.getElementById('chk17flow').checked;
var charges = [];
if (mode === 'single_pos') charges = [{x: W/2, y: H/2, q: 1}];
else if (mode === 'single_neg') charges = [{x: W/2, y: H/2, q: -1}];
else if (mode === 'dipole') charges = [{x: W/3, y: H/2, q: 1}, {x: 2*W/3, y: H/2, q: -1}];
else if (mode === 'same_pos') charges = [{x: W/3, y: H/2, q: 1}, {x: 2*W/3, y: H/2, q: 1}];
else charges = [{x: W*0.30, y: H*0.32, q: 1}, {x: W*0.70, y: H*0.32, q: -1}, {x: W*0.30, y: H*0.68, q: -1}, {x: W*0.70, y: H*0.68, q: 1}];
// Силовые линии (вычисляем линию точками для анимации потока)
var nLines = 14;
var allLines = [];
function tracePositive(ch){
for (var i = 0; i < nLines; i++) {
var angle = (i / nLines) * Math.PI * 2;
var x = ch.x + Math.cos(angle) * 20;
var y = ch.y + Math.sin(angle) * 20;
var pts = [{x:x, y:y}];
for (var step = 0; step < 220; step++) {
var fx = 0, fy = 0;
charges.forEach(function(c) {
var dx = x - c.x, dy = y - c.y;
var r2 = dx*dx + dy*dy;
if (r2 < 9) return;
var f = c.q / r2;
fx += f * dx / Math.sqrt(r2);
fy += f * dy / Math.sqrt(r2);
});
var len = Math.sqrt(fx*fx + fy*fy);
if (len < 1e-6) break;
x += fx/len * 3; y += fy/len * 3;
pts.push({x:x, y:y});
if (x < -10 || x > W+10 || y < -10 || y > H+10) break;
var nearNeg = charges.some(function(c) { return c.q < 0 && Math.hypot(x-c.x, y-c.y) < 18; });
if (nearNeg) break;
}
allLines.push(pts);
}
}
function traceNegativeOnly(ch){
// если есть только отрицательные — рисуем линии вокруг с обратным шагом
for (var i = 0; i < nLines; i++) {
var angle = (i / nLines) * Math.PI * 2;
var x = ch.x + Math.cos(angle) * 70;
var y = ch.y + Math.sin(angle) * 70;
var pts = [{x:x, y:y}];
for (var step = 0; step < 220; step++) {
var fx = 0, fy = 0;
charges.forEach(function(c) {
var dx = x - c.x, dy = y - c.y;
var r2 = dx*dx + dy*dy;
if (r2 < 9) return;
var f = c.q / r2;
fx += f * dx / Math.sqrt(r2);
fy += f * dy / Math.sqrt(r2);
});
var len = Math.sqrt(fx*fx + fy*fy);
if (len < 1e-6) break;
x += fx/len * 3; y += fy/len * 3;
pts.push({x:x, y:y});
if (Math.hypot(x - ch.x, y - ch.y) < 22) break;
if (x < -10 || x > W+10 || y < -10 || y > H+10) break;
}
allLines.push(pts);
}
}
var hasPos = charges.some(function(c){return c.q>0;});
if (hasPos) charges.forEach(function(c){ if (c.q>0) tracePositive(c); });
else charges.forEach(function(c){ if (c.q<0) traceNegativeOnly(c); });
// Отрисовка линий (бледных)
ctx.strokeStyle = 'rgba(147,197,253,.35)'; ctx.lineWidth = 1.4;
allLines.forEach(function(pts){
ctx.beginPath();
pts.forEach(function(p, idx){ if (idx===0) ctx.moveTo(p.x, p.y); else ctx.lineTo(p.x, p.y); });
ctx.stroke();
});
// Анимированный поток - яркие точки бегут по линиям
if (flowOn) {
flowOffset = (flowOffset + 0.4) % 12;
allLines.forEach(function(pts){
for (var t = 0; t < pts.length; t += 12){
var idx = Math.floor((t + flowOffset) % pts.length);
var p = pts[idx]; if (!p) continue;
ctx.fillStyle = 'rgba(252,211,77,0.85)';
ctx.beginPath(); ctx.arc(p.x, p.y, 2, 0, Math.PI*2); ctx.fill();
}
});
}
// Заряды
charges.forEach(function(ch) {
var grd = ctx.createRadialGradient(ch.x, ch.y, 0, ch.x, ch.y, 22);
if (ch.q > 0) { grd.addColorStop(0, 'rgba(254,202,202,1)'); grd.addColorStop(1, 'rgba(220,38,38,.2)'); }
else { grd.addColorStop(0, 'rgba(191,219,254,1)'); grd.addColorStop(1, 'rgba(37,99,235,.2)'); }
ctx.fillStyle = grd;
ctx.shadowColor = ch.q > 0 ? '#ef4444' : '#3b82f6'; ctx.shadowBlur = 12;
ctx.beginPath(); ctx.arc(ch.x, ch.y, 22, 0, Math.PI * 2); ctx.fill();
ctx.shadowBlur = 0;
ctx.fillStyle = '#fff'; ctx.font = 'bold 20px sans-serif'; ctx.textAlign = 'center';
ctx.fillText(ch.q > 0 ? '+' : '', ch.x, ch.y + 7);
});
// Пробный заряд
var px = probe17.x * W, py = probe17.y * H;
var fx = 0, fy = 0;
charges.forEach(function(c) {
var dx = px - c.x, dy = py - c.y;
var r = Math.sqrt(dx*dx+dy*dy);
if (r < 1) return;
fx += c.q * dx / (r*r*r); fy += c.q * dy / (r*r*r);
});
var flen = Math.sqrt(fx*fx+fy*fy);
if (showProbe) {
// вектор силы
if (flen > 0) {
var scale = Math.min(60, 200 * Math.sqrt(flen));
var ax = px + fx/flen * scale, ay = py + fy/flen * scale;
ctx.strokeStyle = '#fbbf24'; ctx.lineWidth = 2.5;
ctx.beginPath(); ctx.moveTo(px, py); ctx.lineTo(ax, ay); ctx.stroke();
var ang = Math.atan2(ay-py, ax-px);
ctx.fillStyle = '#fbbf24';
ctx.beginPath();
ctx.moveTo(ax, ay);
ctx.lineTo(ax - 10*Math.cos(ang-0.4), ay - 10*Math.sin(ang-0.4));
ctx.lineTo(ax - 10*Math.cos(ang+0.4), ay - 10*Math.sin(ang+0.4));
ctx.fill();
}
// сам заряд (жёлтый кружок)
ctx.fillStyle = '#fbbf24'; ctx.shadowColor = '#fbbf24'; ctx.shadowBlur = 8;
ctx.beginPath(); ctx.arc(px, py, 10, 0, Math.PI * 2); ctx.fill();
ctx.shadowBlur = 0;
ctx.strokeStyle = '#92400e'; ctx.lineWidth = 1.5; ctx.stroke();
ctx.fillStyle = '#1c1917'; ctx.font = 'bold 11px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('+', px, py + 4);
ctx.fillStyle = '#fbbf24'; ctx.font = '9px sans-serif';
ctx.fillText('пробный q', px, py + 24);
}
// Чипы
var chipF = document.getElementById('chip17F');
var chipE = document.getElementById('chip17E');
var chipD = document.getElementById('chip17dir');
var Fmag = flen * 1000; // условные у.е.
var Emag = Fmag; // F = qE; при q=1 у.е. F=E
if (chipF) chipF.textContent = '|F| ≈ ' + (Fmag < 0.01 ? '0' : Fmag < 1 ? Fmag.toFixed(2) : Fmag.toFixed(1)) + ' у.е.';
if (chipE) chipE.textContent = 'E ≈ ' + (Emag < 0.01 ? '0' : Emag < 1 ? Emag.toFixed(2) : Emag.toFixed(1)) + ' у.е.';
if (chipD) {
var deg = Math.round(Math.atan2(fy, fx) * 180 / Math.PI);
chipD.textContent = flen > 1e-4 ? ('направление: ' + (deg >= 0 ? '+' : '') + deg + '°') : 'направление: —';
}
anim17Id = requestAnimationFrame(frame);
}
anim17Id = requestAnimationFrame(frame);
}
// ═══ §18: A = qU ═══
function upd18() {
var cv = document.getElementById('cv18');
if (!cv || cv.offsetWidth === 0) return;
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 180;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var U = parseFloat((document.getElementById('sl18U') || {}).value) || 12;
var q = parseFloat((document.getElementById('sl18q') || {}).value) || 1;
var A = q * U;
ctx.fillStyle = '#374151'; ctx.fillRect(20, H/2-30, 60, 60);
ctx.strokeStyle = '#6366f1'; ctx.lineWidth = 1.5; ctx.strokeRect(20, H/2-30, 60, 60);
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText(U + ' В', 50, H/2+5);
ctx.fillStyle = '#94a3b8'; ctx.font = '8px sans-serif';
ctx.fillText('Источник', 50, H/2+18);
var bright = Math.min(1, A / 500);
var lampX = W - 80, lampY = H/2;
if (bright > 0.05) {
var grd = ctx.createRadialGradient(lampX, lampY, 0, lampX, lampY, 40*bright+10);
grd.addColorStop(0, 'rgba(253,224,71,' + (bright*0.8) + ')');
grd.addColorStop(1, 'transparent');
ctx.fillStyle = grd;
ctx.beginPath(); ctx.arc(lampX, lampY, 40*bright+10, 0, Math.PI*2); ctx.fill();
}
ctx.strokeStyle = '#fbbf24'; ctx.lineWidth = 2;
ctx.beginPath(); ctx.arc(lampX, lampY, 18, 0, Math.PI*2); ctx.stroke();
ctx.beginPath(); ctx.moveTo(lampX-10, lampY-10); ctx.lineTo(lampX+10, lampY+10); ctx.stroke();
ctx.beginPath(); ctx.moveTo(lampX+10, lampY-10); ctx.lineTo(lampX-10, lampY+10); ctx.stroke();
ctx.strokeStyle = '#475569'; ctx.lineWidth = 2;
ctx.beginPath(); ctx.moveTo(80, H/2-15); ctx.lineTo(W-98, H/2-15); ctx.stroke();
ctx.beginPath(); ctx.moveTo(80, H/2+15); ctx.lineTo(W-98, H/2+15); ctx.stroke();
var nDots = Math.min(8, Math.round(q * 2 + 1));
for (var i = 0; i < nDots; i++) {
var t2 = (Date.now()/1500 + i/nDots) % 1;
var dotX = 80 + t2 * (W - 178);
ctx.fillStyle = 'rgba(99,102,241,0.8)';
ctx.beginPath(); ctx.arc(dotX, H/2-15, 3, 0, Math.PI*2); ctx.fill();
}
var barW = Math.min(W-40, A / 1000 * (W-40));
ctx.fillStyle = 'rgba(99,102,241,.15)'; ctx.fillRect(20, H-28, W-40, 16);
ctx.fillStyle = 'rgba(99,102,241,.8)'; ctx.fillRect(20, H-28, Math.min(W-40, barW), 16);
ctx.fillStyle = '#e2e8f0'; ctx.font = '9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('A = ' + (A >= 1000 ? (A/1000).toFixed(1) + ' кДж' : A.toFixed(1) + ' Дж'), W/2, H-16);
var res = document.getElementById('res18');
if (res) res.textContent = 'A = qU = ' + q.toFixed(1) + ' x ' + U + ' = ' + A.toFixed(1) + ' Дж';
anim18Id = requestAnimationFrame(upd18);
}
var anim18Id = null;
function startAnim18() {
var cv = document.getElementById('cv18');
if (!cv || cv.offsetWidth === 0) return;
anim18Id = requestAnimationFrame(upd18);
}
// ═══ §19: Электрический ток в цепи ═══
var anim19Id = null, key19 = false, src19label = 'Батарейка (1,5 В)';
function toggle19() {
key19 = !key19;
var btn = document.getElementById('btn19key');
if (btn) btn.textContent = key19 ? '🔑 Разомкнуть цепь' : '🔑 Замкнуть цепь';
if (key19) startAnim19(); else { if (anim19Id) { cancelAnimationFrame(anim19Id); anim19Id = null; } draw19frame(false); }
}
function upd19src() {
var sel = document.getElementById('sel19src');
if (sel) src19label = sel.options[sel.selectedIndex].text;
}
function startAnim19() {
var cv = document.getElementById('cv19');
if (!cv || cv.offsetWidth === 0) return;
if (anim19Id) { cancelAnimationFrame(anim19Id); anim19Id = null; }
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 220;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
var electrons = [];
for (var i = 0; i < 12; i++) electrons.push({ pos: i / 12, speed: 0.005 + Math.random() * 0.002 });
function frame() {
draw19frame(true, ctx, W, H, electrons);
electrons.forEach(function(e) { e.pos = (e.pos + e.speed) % 1; });
anim19Id = requestAnimationFrame(frame);
}
anim19Id = requestAnimationFrame(frame);
}
function draw19frame(closed, ctx2, W2, H2, electrons) {
var cv = document.getElementById('cv19');
if (!cv) return;
var dpr = window.devicePixelRatio || 1;
if (!ctx2) {
W2 = cv.offsetWidth; H2 = cv.offsetHeight || 220;
cv.width = Math.round(W2*dpr); cv.height = Math.round(H2*dpr);
ctx2 = cv.getContext('2d');
ctx2.setTransform(dpr, 0, 0, dpr, 0, 0);
}
var ctx = ctx2, W = W2, H = H2;
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var pad = 30, cw = W - pad*2, ch = H - pad*2;
var path = [{x:pad,y:pad},{x:pad+cw,y:pad},{x:pad+cw,y:pad+ch},{x:pad,y:pad+ch}];
ctx.strokeStyle = '#475569'; ctx.lineWidth = 3;
ctx.beginPath();
ctx.moveTo(path[0].x, path[0].y);
path.forEach(function(p) { ctx.lineTo(p.x, p.y); });
ctx.closePath(); ctx.stroke();
var sx = pad, sy = H/2;
ctx.fillStyle = '#1e293b'; ctx.fillRect(sx-15, sy-25, 30, 50);
ctx.strokeStyle = '#6366f1'; ctx.lineWidth = 1.5; ctx.strokeRect(sx-15, sy-25, 30, 50);
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 8px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('+', sx, sy-8); ctx.fillStyle = '#94a3b8';
ctx.fillText('-', sx, sy+14);
ctx.font = '7px sans-serif'; ctx.fillText(src19label.split(' ')[0], sx, sy+36);
var lx = pad+cw, ly = H/2;
if (closed) {
var grd = ctx.createRadialGradient(lx, ly, 0, lx, ly, 30);
grd.addColorStop(0, 'rgba(253,224,71,.6)'); grd.addColorStop(1, 'transparent');
ctx.fillStyle = grd; ctx.beginPath(); ctx.arc(lx, ly, 30, 0, Math.PI*2); ctx.fill();
}
ctx.strokeStyle = '#fbbf24'; ctx.lineWidth = 2;
ctx.beginPath(); ctx.arc(lx, ly, 14, 0, Math.PI*2); ctx.stroke();
ctx.beginPath(); ctx.moveTo(lx-8, ly-8); ctx.lineTo(lx+8, ly+8); ctx.stroke();
ctx.beginPath(); ctx.moveTo(lx+8, ly-8); ctx.lineTo(lx-8, ly+8); ctx.stroke();
ctx.fillStyle = '#94a3b8'; ctx.font = '7px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('Лампа', lx, ly+26);
var kx = W/2, ky = pad;
ctx.fillStyle = '#475569'; ctx.beginPath(); ctx.arc(kx-12, ky, 4, 0, Math.PI*2); ctx.fill();
ctx.fillStyle = '#475569'; ctx.beginPath(); ctx.arc(kx+12, ky, 4, 0, Math.PI*2); ctx.fill();
ctx.strokeStyle = closed ? '#22c55e' : '#f97316'; ctx.lineWidth = 2.5;
ctx.beginPath(); ctx.moveTo(kx-12, ky); ctx.lineTo(kx+12, closed ? ky : ky-12); ctx.stroke();
ctx.fillStyle = closed ? '#22c55e' : '#f97316'; ctx.font = '8px sans-serif'; ctx.textAlign = 'center';
ctx.fillText(closed ? 'Замкнут' : 'Разомкнут', kx, ky-16);
if (closed) {
ctx.fillStyle = 'rgba(251,191,36,.7)'; ctx.font = 'bold 11px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('→', W/2, pad - 12);
ctx.fillText('↓', pad+cw+18, H/2);
ctx.fillText('←', W/2, pad+ch+18);
ctx.fillText('↑', pad-18, H/2);
ctx.fillStyle = '#fbbf24'; ctx.font = '8px sans-serif';
ctx.fillText('→ ток (от + к -)', W/2, pad-22);
}
if (closed && electrons) {
var loop = [{x:pad,y:pad},{x:pad+cw,y:pad},{x:pad+cw,y:pad+ch},{x:pad,y:pad+ch},{x:pad,y:pad}];
var totalLen = 0;
var segs = [];
for (var i = 0; i < loop.length-1; i++) {
var dx = loop[i+1].x - loop[i].x, dy = loop[i+1].y - loop[i].y;
var len = Math.sqrt(dx*dx+dy*dy);
segs.push({x0:loop[i].x, y0:loop[i].y, dx:dx/len, dy:dy/len, len:len, start:totalLen});
totalLen += len;
}
electrons.forEach(function(e) {
var dist = (1 - e.pos) * totalLen;
var seg = null;
for (var s = 0; s < segs.length; s++) {
if (dist >= segs[s].start && dist < segs[s].start + segs[s].len) { seg = segs[s]; break; }
}
if (!seg) return;
var t = dist - seg.start;
var ex = seg.x0 + seg.dx * t, ey = seg.y0 + seg.dy * t;
ctx.fillStyle = '#3b82f6';
ctx.beginPath(); ctx.arc(ex, ey, 4, 0, Math.PI*2); ctx.fill();
ctx.fillStyle = '#93c5fd'; ctx.font = '6px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('e-', ex, ey-7);
});
}
if (!closed) {
ctx.fillStyle = '#64748b'; ctx.font = '11px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('Цепь разомкнута — тока нет', W/2, H/2 + 5);
}
}
// ═══ §20: Сила тока ═══
var anim20Id = null;
function upd20() {
if (anim20Id) { cancelAnimationFrame(anim20Id); anim20Id = null; }
startAnim20();
}
function startAnim20() {
var cv = document.getElementById('cv20');
if (!cv || cv.offsetWidth === 0) return;
if (anim20Id) { cancelAnimationFrame(anim20Id); anim20Id = null; }
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 160;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
var electrons20 = [];
for (var i = 0; i < 20; i++) electrons20.push({ x: Math.random() * W, y: H/2 + (Math.random()-0.5)*40 });
function frame() {
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var I = parseFloat((document.getElementById('sl20I') || {}).value) || 1;
ctx.fillStyle = 'rgba(71,85,105,.3)'; ctx.fillRect(0, H/2-22, W, 44);
ctx.strokeStyle = '#475569'; ctx.lineWidth = 1; ctx.strokeRect(0, H/2-22, W, 44);
var nE = Math.round(I * 4);
electrons20.forEach(function(e, idx) {
if (idx >= nE) return;
e.x -= I * 1.5;
if (e.x < -5) { e.x = W + 5; e.y = H/2 + (Math.random()-0.5)*36; }
ctx.fillStyle = 'rgba(59,130,246,.85)';
ctx.beginPath(); ctx.arc(e.x, e.y, 3.5, 0, Math.PI*2); ctx.fill();
ctx.fillStyle = '#93c5fd'; ctx.font = '7px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('e-', e.x, e.y-6);
});
var arrY = H/2 + 35;
ctx.strokeStyle = '#fbbf24'; ctx.lineWidth = 2;
ctx.beginPath(); ctx.moveTo(20, arrY); ctx.lineTo(W-20, arrY); ctx.stroke();
ctx.fillStyle = '#fbbf24';
ctx.beginPath(); ctx.moveTo(W-18, arrY); ctx.lineTo(W-28, arrY-5); ctx.lineTo(W-28, arrY+5); ctx.closePath(); ctx.fill();
ctx.font = '8px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('→ ток I', W/2, arrY - 6);
ctx.fillStyle = '#e2e8f0'; ctx.font = 'bold 11px sans-serif'; ctx.textAlign = 'left';
ctx.fillText('I = ' + I.toFixed(1) + ' А', 10, 20);
var N_per_sec = (I / 1.6e-19).toExponential(2);
var res = document.getElementById('res20');
if (res) res.textContent = 'N = I/e = ' + I.toFixed(1) + '/(1.6 x 10^-19) ≈ ' + N_per_sec + ' электронов/с';
anim20Id = requestAnimationFrame(frame);
}
anim20Id = requestAnimationFrame(frame);
}
// ═══ §21: Электрическая цепь с амперметром ═══
var key21 = false, anim21Id = null;
function toggle21() {
key21 = !key21;
var btn = document.getElementById('btn21key');
if (btn) btn.textContent = key21 ? '🔑 Разомкнуть ключ' : '🔑 Замкнуть ключ';
if (key21) startAnim21(); else { if(anim21Id){cancelAnimationFrame(anim21Id);anim21Id=null;} draw21(false); }
}
function upd21() { if (key21) { if(anim21Id){cancelAnimationFrame(anim21Id);anim21Id=null;} startAnim21(); } else draw21(false); }
function startAnim21() {
var cv = document.getElementById('cv21');
if (!cv || cv.offsetWidth === 0) return;
if (anim21Id) { cancelAnimationFrame(anim21Id); anim21Id = null; }
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 280;
cv.width = Math.round(W*dpr); cv.height = Math.round(H*dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
var ePos = 0;
function frame() {
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
ePos = (ePos + 0.005) % 1;
draw21core(ctx, W, H, true, ePos);
anim21Id = requestAnimationFrame(frame);
}
anim21Id = requestAnimationFrame(frame);
}
function draw21(closed) {
var cv = document.getElementById('cv21');
if (!cv || cv.offsetWidth === 0) return;
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 280;
cv.width = Math.round(W*dpr); cv.height = Math.round(H*dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
draw21core(ctx, W, H, closed, 0);
}
function draw21core(ctx, W, H, closed, ePos) {
var U = parseFloat((document.getElementById('sl21U')||{}).value)||6;
var R = parseFloat((document.getElementById('sl21R')||{}).value)||6;
var I = closed ? U/R : 0;
var pad = 35, cw = W-pad*2, ch = H-pad*2-20;
ctx.strokeStyle = '#475569'; ctx.lineWidth = 2.5;
ctx.beginPath();
ctx.moveTo(pad, pad); ctx.lineTo(pad+cw, pad);
ctx.lineTo(pad+cw, pad+ch); ctx.lineTo(pad, pad+ch); ctx.lineTo(pad, pad);
ctx.stroke();
var srcY = pad + ch/2;
ctx.fillStyle = '#1e293b'; ctx.fillRect(pad-18, srcY-28, 36, 56);
ctx.strokeStyle = '#6366f1'; ctx.lineWidth = 1.5; ctx.strokeRect(pad-18, srcY-28, 36, 56);
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 10px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('+', pad, srcY-10);
ctx.fillStyle = '#94a3b8'; ctx.fillText('-', pad, srcY+14);
ctx.font = '8px sans-serif'; ctx.fillText(U+'В', pad, srcY+30);
var amX = W/2, amY = pad;
ctx.beginPath(); ctx.arc(amX, amY, 14, 0, Math.PI*2);
ctx.fillStyle = '#0f2027'; ctx.fill();
ctx.strokeStyle = '#22c55e'; ctx.lineWidth = 2; ctx.stroke();
ctx.fillStyle = '#22c55e'; ctx.font = 'bold 11px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('A', amX, amY+4);
if (closed) {
ctx.fillStyle = '#86efac'; ctx.font = 'bold 8px sans-serif';
ctx.fillText(I.toFixed(2)+'А', amX, amY-18);
}
var lx = pad+cw, ly = pad + ch/2;
if (closed && I > 0) {
var bright = Math.min(1, I * R / 50);
var grd = ctx.createRadialGradient(lx, ly, 0, lx, ly, 28*bright+8);
grd.addColorStop(0, 'rgba(253,224,71,' + (bright*0.7) + ')');
grd.addColorStop(1, 'transparent');
ctx.fillStyle = grd; ctx.beginPath(); ctx.arc(lx, ly, 28*bright+8, 0, Math.PI*2); ctx.fill();
}
ctx.strokeStyle = '#fbbf24'; ctx.lineWidth = 2;
ctx.beginPath(); ctx.arc(lx, ly, 14, 0, Math.PI*2); ctx.stroke();
ctx.beginPath(); ctx.moveTo(lx-8, ly-8); ctx.lineTo(lx+8, ly+8); ctx.stroke();
ctx.beginPath(); ctx.moveTo(lx+8, ly-8); ctx.lineTo(lx-8, ly+8); ctx.stroke();
var vmX = pad+cw+30, vmY = ly;
ctx.strokeStyle = 'rgba(249,115,22,.6)'; ctx.lineWidth = 1.5; ctx.setLineDash([5,3]);
ctx.beginPath();
ctx.moveTo(lx, ly-14); ctx.lineTo(vmX, ly-45); ctx.lineTo(vmX, ly-14); ctx.stroke();
ctx.beginPath();
ctx.moveTo(lx, ly+14); ctx.lineTo(vmX, ly+45); ctx.lineTo(vmX, ly+14); ctx.stroke();
ctx.setLineDash([]);
ctx.beginPath(); ctx.arc(vmX, vmY, 12, 0, Math.PI*2);
ctx.fillStyle = '#0f2027'; ctx.fill();
ctx.strokeStyle = '#f97316'; ctx.lineWidth = 1.5; ctx.stroke();
ctx.fillStyle = '#f97316'; ctx.font = 'bold 10px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('V', vmX, vmY+4);
if (closed) {
ctx.fillStyle = '#fed7aa'; ctx.font = 'bold 8px sans-serif';
ctx.fillText(U.toFixed(1)+'В', vmX, vmY-18);
}
var kx = W/2, ky = pad+ch;
ctx.fillStyle = '#475569'; ctx.beginPath(); ctx.arc(kx-14, ky, 3.5, 0, Math.PI*2); ctx.fill();
ctx.fillStyle = '#475569'; ctx.beginPath(); ctx.arc(kx+14, ky, 3.5, 0, Math.PI*2); ctx.fill();
ctx.strokeStyle = closed ? '#22c55e' : '#f97316'; ctx.lineWidth = 2.5;
ctx.beginPath(); ctx.moveTo(kx-14, ky); ctx.lineTo(kx+14, closed ? ky : ky-14); ctx.stroke();
ctx.fillStyle = closed ? '#22c55e' : '#f97316'; ctx.font = '8px sans-serif'; ctx.textAlign = 'center';
ctx.fillText(closed ? 'Замкнут' : 'Разомкнут', kx, ky+18);
if (closed) {
var loop = [{x:pad,y:pad},{x:pad+cw,y:pad},{x:pad+cw,y:pad+ch},{x:pad,y:pad+ch}];
var totalLen = 0;
var segs = [];
for (var i = 0; i < loop.length; i++) {
var nx = loop[(i+1)%loop.length];
var dx = nx.x - loop[i].x, dy = nx.y - loop[i].y;
var len = Math.sqrt(dx*dx+dy*dy);
segs.push({x0:loop[i].x, y0:loop[i].y, dx:dx/len, dy:dy/len, len:len, start:totalLen});
totalLen += len;
}
var nE = Math.min(10, Math.round(I * 2 + 2));
for (var j = 0; j < nE; j++) {
var dist = ((1 - ePos - j/nE) % 1 + 1) % 1 * totalLen;
var seg = null;
for (var s = 0; s < segs.length; s++) {
if (dist >= segs[s].start && dist < segs[s].start + segs[s].len) { seg = segs[s]; break; }
}
if (!seg) continue;
var t = dist - seg.start;
var ex = seg.x0 + seg.dx * t, ey = seg.y0 + seg.dy * t;
ctx.fillStyle = 'rgba(59,130,246,.85)';
ctx.beginPath(); ctx.arc(ex, ey, 4, 0, Math.PI*2); ctx.fill();
}
}
var res = document.getElementById('res21');
if (res) {
if (closed) res.textContent = 'I = U/R = ' + U + '/' + R + ' = ' + I.toFixed(2) + ' А; U нагр = ' + U + ' В';
else res.textContent = 'Цепь разомкнута: I = 0, U нагр = 0';
}
}
// ═══ §22: Закон Ома (Pro Max — виртуальная лаборатория) ═══
var needle22A = 0, needle22V = 0; // плавно анимируемые стрелки
var flow22 = 0; // фазовый сдвиг потока электронов
var anim22Frame = null;
function drawMeter22(ctx, cx, cy, R0, value, maxV, label, color, unit){
// Стрелочный прибор: полукруг сверху
ctx.fillStyle = '#f8fafc';
ctx.beginPath(); ctx.arc(cx, cy, R0, 0, Math.PI*2); ctx.fill();
ctx.strokeStyle = color; ctx.lineWidth = 2.5;
ctx.stroke();
// шкала-дуга
ctx.strokeStyle = '#94a3b8'; ctx.lineWidth = 1.2;
ctx.beginPath(); ctx.arc(cx, cy + 5, R0 - 8, Math.PI + 0.3, 2*Math.PI - 0.3); ctx.stroke();
// деления
for (var t = 0; t <= 5; t++){
var ang = Math.PI + 0.3 + (t/5) * (Math.PI - 0.6);
var x1 = cx + Math.cos(ang) * (R0 - 8);
var y1 = (cy + 5) + Math.sin(ang) * (R0 - 8);
var x2 = cx + Math.cos(ang) * (R0 - 14);
var y2 = (cy + 5) + Math.sin(ang) * (R0 - 14);
ctx.strokeStyle = '#475569'; ctx.lineWidth = 1.2;
ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.stroke();
}
// стрелка
var frac = Math.max(0, Math.min(1, value / maxV));
var angN = Math.PI + 0.3 + frac * (Math.PI - 0.6);
var nx = cx + Math.cos(angN) * (R0 - 10);
var ny = (cy + 5) + Math.sin(angN) * (R0 - 10);
ctx.strokeStyle = '#dc2626'; ctx.lineWidth = 2.2;
ctx.beginPath(); ctx.moveTo(cx, cy + 5); ctx.lineTo(nx, ny); ctx.stroke();
ctx.fillStyle = '#1e293b';
ctx.beginPath(); ctx.arc(cx, cy + 5, 3, 0, Math.PI*2); ctx.fill();
// буква в центре сверху
ctx.fillStyle = color; ctx.font = 'bold 14px sans-serif'; ctx.textAlign = 'center';
ctx.fillText(label, cx, cy - R0/2 + 4);
// цифровое значение снизу
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 10px monospace';
ctx.fillText(value.toFixed(2) + ' ' + unit, cx, cy + R0 + 12);
}
function upd22() {
var cv = document.getElementById('cv22');
if (!cv || cv.offsetWidth === 0) return;
if (anim22Id) { cancelAnimationFrame(anim22Id); anim22Id = null; }
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 300;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
function frame(){
var W2 = cv.offsetWidth, H2 = cv.offsetHeight || 300;
if (W2 !== W){ W = W2; H = H2; cv.width = Math.round(W*dpr); cv.height = Math.round(H*dpr); ctx.setTransform(dpr,0,0,dpr,0,0); }
H = H2;
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var U = parseFloat((document.getElementById('sl22U') || {}).value) || 12;
var R = parseFloat((document.getElementById('sl22R') || {}).value) || 6;
var I = U / R;
var P = U * I;
// плавное движение стрелок
needle22A += (I - needle22A) * 0.12;
needle22V += (U - needle22V) * 0.12;
// === Геометрия схемы (прямоугольный контур) ===
var padX = 60, padY = 50;
var rectX = padX, rectY = padY, rectW = W - padX*2, rectH = H - padY*2 - 30;
// фон схемы (светлая подложка)
ctx.fillStyle = 'rgba(30,41,59,.4)'; ctx.fillRect(rectX-6, rectY-6, rectW+12, rectH+12);
ctx.strokeStyle = '#1e293b'; ctx.lineWidth = 1; ctx.strokeRect(rectX-6, rectY-6, rectW+12, rectH+12);
// провода (контур)
ctx.strokeStyle = '#64748b'; ctx.lineWidth = 3;
ctx.beginPath();
ctx.moveTo(rectX, rectY); ctx.lineTo(rectX + rectW, rectY); // верх
ctx.lineTo(rectX + rectW, rectY + rectH); // правая
ctx.lineTo(rectX, rectY + rectH); ctx.lineTo(rectX, rectY); // низ + левая
ctx.stroke();
// === Батарея (слева на вертикальном проводе) ===
var batCY = rectY + rectH/2;
ctx.fillStyle = '#0f172a';
ctx.fillRect(rectX - 12, batCY - 24, 24, 48); // фон чтобы перекрыть провод
// длинная черта (+) — снизу
ctx.strokeStyle = '#ef4444'; ctx.lineWidth = 3;
ctx.beginPath(); ctx.moveTo(rectX - 14, batCY + 6); ctx.lineTo(rectX + 14, batCY + 6); ctx.stroke();
// короткая черта (-) — сверху
ctx.strokeStyle = '#3b82f6'; ctx.lineWidth = 3;
ctx.beginPath(); ctx.moveTo(rectX - 8, batCY - 6); ctx.lineTo(rectX + 8, batCY - 6); ctx.stroke();
ctx.fillStyle = '#ef4444'; ctx.font = 'bold 11px sans-serif'; ctx.textAlign = 'right';
ctx.fillText('+', rectX - 18, batCY + 10);
ctx.fillStyle = '#3b82f6'; ctx.textAlign = 'right';
ctx.fillText('', rectX - 18, batCY - 2);
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 10px monospace'; ctx.textAlign = 'left';
ctx.fillText(U.toFixed(1) + ' В', rectX + 16, batCY + 3);
// === Резистор (на верхнем проводе по центру) ===
var resCX = rectX + rectW * 0.55, resCY = rectY;
ctx.fillStyle = '#0f172a';
ctx.fillRect(resCX - 35, resCY - 11, 70, 22);
ctx.strokeStyle = '#1d4ed8'; ctx.lineWidth = 2.5;
ctx.strokeRect(resCX - 32, resCY - 9, 64, 18);
// зигзаг внутри резистора
ctx.strokeStyle = '#60a5fa'; ctx.lineWidth = 1.5;
ctx.beginPath();
ctx.moveTo(resCX - 28, resCY);
for (var z = 0; z < 8; z++){
ctx.lineTo(resCX - 24 + z*7, resCY + (z%2===0 ? -6 : 6));
}
ctx.lineTo(resCX + 28, resCY);
ctx.stroke();
ctx.fillStyle = '#60a5fa'; ctx.font = 'bold 9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('R = ' + R + ' Ом', resCX, resCY - 16);
// === Амперметр (на верхнем проводе слева) ===
var ampCX = rectX + rectW * 0.22, ampCY = rectY;
ctx.fillStyle = '#0f172a';
ctx.fillRect(ampCX - 28, ampCY - 28, 56, 56);
drawMeter22(ctx, ampCX, ampCY, 24, needle22A, Math.max(8, U / 1.5), 'A', '#22c55e', 'А');
// === Вольтметр (параллельно резистору, выводы вверх к проводу) ===
var voltCX = resCX, voltCY = rectY - 60;
// выводы вольтметра
ctx.strokeStyle = '#64748b'; ctx.lineWidth = 2;
ctx.beginPath();
ctx.moveTo(voltCX - 30, voltCY + 22); ctx.lineTo(resCX - 30, resCY - 9);
ctx.moveTo(voltCX + 30, voltCY + 22); ctx.lineTo(resCX + 30, resCY - 9);
ctx.stroke();
drawMeter22(ctx, voltCX, voltCY, 22, needle22V, 26, 'V', '#f97316', 'В');
// === Поток электронов по проводам (от − батареи против часовой) ===
if (I > 0.01){
flow22 = (flow22 + Math.min(I * 0.6, 3)) % 60;
// путь идёт: батарея верх (rectX, batCY-6) → верхний-левый → верх-вправо → правый-вверх → правая вниз → низ влево → батарея низ (-)
// упрощённо: бегаем по периметру против часовой
// точки на пути:
var perim = [
{x: rectX, y: batCY - 6}, // верх батареи (−)
{x: rectX, y: rectY}, // левый верхний угол
{x: rectX + rectW, y: rectY}, // правый верхний
{x: rectX + rectW, y: rectY + rectH}, // правый нижний
{x: rectX, y: rectY + rectH}, // левый нижний
{x: rectX, y: batCY + 6} // низ батареи (+)
];
// длины сегментов
var lens = [];
var total = 0;
for (var s = 0; s < perim.length - 1; s++){
var dx = perim[s+1].x - perim[s].x, dy = perim[s+1].y - perim[s].y;
var l = Math.hypot(dx, dy);
lens.push(l); total += l;
}
var nDots = 16;
for (var d2 = 0; d2 < nDots; d2++){
var t = ((d2/nDots) * total + flow22 * total/60) % total;
var acc = 0;
for (var s = 0; s < lens.length; s++){
if (t < acc + lens[s]){
var f = (t - acc) / lens[s];
var ex = perim[s].x + (perim[s+1].x - perim[s].x) * f;
var ey = perim[s].y + (perim[s+1].y - perim[s].y) * f;
ctx.fillStyle = 'rgba(96,165,250,.9)'; ctx.shadowColor = '#3b82f6'; ctx.shadowBlur = 5;
ctx.beginPath(); ctx.arc(ex, ey, 2.8, 0, Math.PI*2); ctx.fill();
ctx.shadowBlur = 0;
break;
}
acc += lens[s];
}
}
}
// === Формула крупно внизу ===
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 13px monospace'; ctx.textAlign = 'center';
ctx.fillText('I = U/R = ' + U.toFixed(1) + '/' + R + ' = ' + I.toFixed(2) + ' А',
W/2, H - 12);
// Чипы
var chipI = document.getElementById('chip22I');
var chipV = document.getElementById('chip22V');
var chipP = document.getElementById('chip22P');
if (chipI) chipI.textContent = 'A: ' + I.toFixed(2) + ' А';
if (chipV) chipV.textContent = 'V: ' + U.toFixed(1) + ' В';
if (chipP) chipP.textContent = 'P: ' + P.toFixed(1) + ' Вт';
var res = document.getElementById('res22');
if (res) res.innerHTML = '$I = U/R = ' + U + '/' + R + ' = ' + I.toFixed(2) + '$ А &nbsp;|&nbsp; $P = UI = ' + P.toFixed(1) + '$ Вт';
if (window.doRender && res) doRender(res);
anim22Id = requestAnimationFrame(frame);
}
anim22Id = requestAnimationFrame(frame);
}
// ═══ §23: R = ρl/S ═══
function upd23() {
var cv = document.getElementById('cv23');
if (!cv || cv.offsetWidth === 0) return;
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 150;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var sel = document.getElementById('sel23mat');
var rho = sel ? parseFloat(sel.value) : 0.017;
var matName = sel ? sel.options[sel.selectedIndex].text.split(' ')[0] : 'Медь';
var l = parseFloat((document.getElementById('sl23l') || {}).value) || 1;
var S = parseFloat((document.getElementById('sl23S') || {}).value) || 1;
var R = (rho * l / S);
var Rstr = R < 1 ? R.toFixed(4) : R < 10 ? R.toFixed(3) : R.toFixed(2);
var wireH = Math.max(8, Math.min(40, S * 10));
var wireW = Math.min(W - 80, l * 25 + 30);
var wx = 30, wy = H / 2 - wireH / 2;
var heatColor = Math.min(1, rho / 1.1);
var wgrd = ctx.createLinearGradient(wx, wy, wx + wireW, wy);
wgrd.addColorStop(0, 'rgba(59,130,246,' + (0.3 + heatColor * 0.5) + ')');
wgrd.addColorStop(1, 'rgba(' + Math.round(30 + heatColor * 200) + ',' + Math.round(130 - heatColor * 100) + ',' + Math.round(246 - heatColor * 200) + ',0.8)');
ctx.fillStyle = wgrd;
ctx.fillRect(wx, wy, wireW, wireH);
ctx.strokeStyle = '#64748b'; ctx.lineWidth = 1.5;
ctx.strokeRect(wx, wy, wireW, wireH);
ctx.fillStyle = '#94a3b8'; ctx.font = '9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('← l = ' + l.toFixed(1) + ' м →', wx + wireW / 2, H - 18);
ctx.textAlign = 'left';
ctx.fillText('S = ' + S.toFixed(1) + ' мм²', wx + wireW + 8, H / 2 + 4);
ctx.fillText(matName, wx + wireW + 8, H / 2 + 16);
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 9px sans-serif';
ctx.fillText('R = ' + Rstr + ' Ом', wx + wireW + 8, H / 2 - 8);
var res = document.getElementById('res23');
if (res) res.innerHTML = '$R = \\rho l/S = ' + rho + ' \\times ' + l.toFixed(1) + '/' + S.toFixed(1) + ' = ' + Rstr + '$ Ом';
if (window.doRender && res) doRender(res);
}
// ═══ §24: Последовательное соединение ═══
function upd24() {
var cv = document.getElementById('cv24');
if (!cv || cv.offsetWidth === 0) return;
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 200;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var U = parseFloat((document.getElementById('sl24U') || {}).value) || 6;
var R1 = parseFloat((document.getElementById('sl24R1') || {}).value) || 10;
var R2 = parseFloat((document.getElementById('sl24R2') || {}).value) || 10;
var R = R1 + R2;
var I = U / R;
var U1 = I * R1, U2 = I * R2;
var pad = 25, cw = W - pad * 2, ch = H - pad * 2 - 20;
ctx.strokeStyle = '#475569'; ctx.lineWidth = 2;
ctx.beginPath();
ctx.moveTo(pad, pad); ctx.lineTo(pad + cw, pad);
ctx.lineTo(pad + cw, pad + ch); ctx.lineTo(pad, pad + ch); ctx.lineTo(pad, pad);
ctx.stroke();
var srcY = pad + ch / 2;
ctx.fillStyle = '#1e293b'; ctx.fillRect(pad - 14, srcY - 22, 28, 44);
ctx.strokeStyle = '#6366f1'; ctx.lineWidth = 1.5; ctx.strokeRect(pad - 14, srcY - 22, 28, 44);
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText(U + 'В', pad, srcY + 5);
var r1x = pad + cw * 0.25, r1y = pad;
ctx.fillStyle = '#1e293b'; ctx.fillRect(r1x - 25, r1y - 10, 50, 20);
ctx.strokeStyle = '#1d4ed8'; ctx.lineWidth = 2; ctx.strokeRect(r1x - 25, r1y - 10, 50, 20);
ctx.fillStyle = '#1d4ed8'; ctx.font = 'bold 9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('R₁=' + R1, r1x, r1y + 4);
var barMaxW = 60;
var b1W = (U1 / U) * barMaxW;
ctx.fillStyle = 'rgba(29,78,216,.3)'; ctx.fillRect(r1x - 30, r1y + 14, barMaxW, 8);
ctx.fillStyle = '#3b82f6'; ctx.fillRect(r1x - 30, r1y + 14, b1W, 8);
ctx.fillStyle = '#93c5fd'; ctx.font = '8px sans-serif';
ctx.fillText('U₁=' + U1.toFixed(2) + 'В', r1x, r1y + 30);
var r2x = pad + cw * 0.7, r2y = pad;
ctx.fillStyle = '#1e293b'; ctx.fillRect(r2x - 25, r2y - 10, 50, 20);
ctx.strokeStyle = '#6366f1'; ctx.lineWidth = 2; ctx.strokeRect(r2x - 25, r2y - 10, 50, 20);
ctx.fillStyle = '#6366f1'; ctx.font = 'bold 9px sans-serif';
ctx.fillText('R₂=' + R2, r2x, r2y + 4);
var b2W = (U2 / U) * barMaxW;
ctx.fillStyle = 'rgba(99,102,241,.3)'; ctx.fillRect(r2x - 30, r2y + 14, barMaxW, 8);
ctx.fillStyle = '#6366f1'; ctx.fillRect(r2x - 30, r2y + 14, b2W, 8);
ctx.fillStyle = '#a5b4fc'; ctx.font = '8px sans-serif';
ctx.fillText('U₂=' + U2.toFixed(2) + 'В', r2x, r2y + 30);
ctx.fillStyle = '#fbbf24'; ctx.font = '9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('I = ' + I.toFixed(3) + ' А', pad + cw / 2, pad + ch + 20);
var res = document.getElementById('res24');
if (res) res.innerHTML = '$R = ' + R + '$ Ом; $I = ' + I.toFixed(3) + '$ А; $U_1 = ' + U1.toFixed(2) + '$ В; $U_2 = ' + U2.toFixed(2) + '$ В';
if (window.doRender && res) doRender(res);
}
// ═══ §25: Параллельное соединение ═══
function upd25() {
var cv = document.getElementById('cv25');
if (!cv || cv.offsetWidth === 0) return;
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 220;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var U = parseFloat((document.getElementById('sl25U') || {}).value) || 12;
var R1 = parseFloat((document.getElementById('sl25R1') || {}).value) || 6;
var R2 = parseFloat((document.getElementById('sl25R2') || {}).value) || 12;
var I1 = U / R1, I2 = U / R2, I = I1 + I2;
var R = U / I;
var pad = 30, busH = H - pad * 2;
ctx.strokeStyle = '#fbbf24'; ctx.lineWidth = 3;
ctx.beginPath(); ctx.moveTo(pad, pad); ctx.lineTo(pad, pad + busH); ctx.stroke();
ctx.beginPath(); ctx.moveTo(W - pad, pad); ctx.lineTo(W - pad, pad + busH); ctx.stroke();
ctx.fillStyle = '#1e293b'; ctx.fillRect(pad - 15, H / 2 - 20, 30, 40);
ctx.strokeStyle = '#6366f1'; ctx.lineWidth = 1.5; ctx.strokeRect(pad - 15, H / 2 - 20, 30, 40);
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText(U + 'В', pad, H / 2 + 4);
var branchY = [pad + busH * 0.25, pad + busH * 0.7];
var R_arr = [R1, R2], I_arr = [I1, I2];
var cols = ['#1d4ed8', '#6366f1'];
branchY.forEach(function(by, idx) {
ctx.strokeStyle = '#475569'; ctx.lineWidth = 2;
ctx.beginPath(); ctx.moveTo(pad + 2, by); ctx.lineTo(W - pad - 2, by); ctx.stroke();
var rx = W / 2;
ctx.fillStyle = '#1e293b'; ctx.fillRect(rx - 28, by - 10, 56, 20);
ctx.strokeStyle = cols[idx]; ctx.lineWidth = 2; ctx.strokeRect(rx - 28, by - 10, 56, 20);
ctx.fillStyle = cols[idx]; ctx.font = 'bold 9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('R' + (idx + 1) + '=' + R_arr[idx] + 'Ом', rx, by + 4);
var flowW = Math.min(4, I_arr[idx] * 1.5) + 1;
ctx.strokeStyle = cols[idx]; ctx.lineWidth = flowW; ctx.globalAlpha = 0.5;
ctx.beginPath(); ctx.moveTo(pad + 35, by); ctx.lineTo(rx - 30, by); ctx.stroke();
ctx.beginPath(); ctx.moveTo(rx + 30, by); ctx.lineTo(W - pad - 35, by); ctx.stroke();
ctx.globalAlpha = 1;
ctx.fillStyle = cols[idx]; ctx.font = '8px sans-serif';
ctx.fillText('I' + (idx + 1) + '=' + I_arr[idx].toFixed(2) + 'А', rx, by - 16);
});
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 9px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('I = ' + I.toFixed(2) + ' А', pad, pad - 10);
ctx.fillText('R = ' + R.toFixed(2) + ' Ом', W / 2, H - 10);
var res = document.getElementById('res25');
if (res) res.innerHTML = '$I_1 = ' + I1.toFixed(2) + '$ А; $I_2 = ' + I2.toFixed(2) + '$ А; $I = ' + I.toFixed(2) + '$ А; $R = ' + R.toFixed(2) + '$ Ом';
if (window.doRender && res) doRender(res);
}
// ═══ §26: Закон Джоуля-Ленца (Pro Max) ═══
var timer26 = { t: 0, Q: 0, running: false, last: 0, temp: 20 };
var anim26Id = null;
function start26timer(){
timer26.running = true;
timer26.last = performance.now();
}
function reset26timer(){
timer26.running = false;
timer26.t = 0; timer26.Q = 0; timer26.temp = 20;
}
function upd26() {
var cv = document.getElementById('cv26');
if (!cv || cv.offsetWidth === 0) return;
if (anim26Id) { cancelAnimationFrame(anim26Id); anim26Id = null; }
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 260;
cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
var flowPhase26 = 0;
function frame(now){
var W2 = cv.offsetWidth, H2 = cv.offsetHeight || 260;
if (W2 !== W){ W = W2; H = H2; cv.width = Math.round(W*dpr); cv.height = Math.round(H*dpr); ctx.setTransform(dpr,0,0,dpr,0,0); }
H = H2;
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var I = parseFloat((document.getElementById('sl26I') || {}).value) || 3;
var R = parseFloat((document.getElementById('sl26R') || {}).value) || 10;
var P = I * I * R;
var U = I * R;
// таймер
if (timer26.running){
var dt = (now - timer26.last) / 1000;
timer26.last = now;
timer26.t += dt;
timer26.Q += P * dt;
// упрощённая модель температуры: dT = P*dt / C - охлаждение
var C = 25; // удельная "ёмкость" сцены
timer26.temp += (P/C - (timer26.temp - 20) * 0.04) * dt;
} else {
timer26.last = now;
}
var heat = Math.min(1, P / 400);
var tempK = Math.min(1, (timer26.temp - 20) / 800);
var glow = Math.max(heat * 0.4, tempK);
// === Спираль (нагреватель) ===
var spX = W * 0.45, spY = H * 0.55;
var sw = 130;
// ореол тепла
if (glow > 0.05){
var grd = ctx.createRadialGradient(spX, spY, 0, spX, spY, 90 * glow + 20);
var rCol = Math.round(255);
var gCol = Math.round(220 - glow * 180);
var bCol = Math.round(50 - glow * 50);
grd.addColorStop(0, 'rgba(' + rCol + ',' + gCol + ',' + bCol + ',' + (glow * 0.65).toFixed(2) + ')');
grd.addColorStop(1, 'transparent');
ctx.fillStyle = grd;
ctx.beginPath(); ctx.arc(spX, spY, 90 * glow + 20, 0, Math.PI * 2); ctx.fill();
}
var spiralColor = glow < 0.15 ? '#94a3b8' : glow < 0.4 ? '#f97316' : glow < 0.75 ? '#ef4444' : '#fde047';
// зигзаг спирали
ctx.strokeStyle = spiralColor; ctx.lineWidth = 4;
ctx.shadowColor = spiralColor; ctx.shadowBlur = glow * 15;
ctx.beginPath();
var steps = 10;
for (var s = 0; s <= steps; s++){
var sx = spX - sw/2 + s * (sw / steps);
var sy = spY + (s % 2 === 0 ? -10 : 10);
if (s === 0) ctx.moveTo(sx, spY); else ctx.lineTo(sx, sy);
}
ctx.lineTo(spX + sw/2, spY);
ctx.stroke();
ctx.shadowBlur = 0;
// подводящие провода
ctx.strokeStyle = '#64748b'; ctx.lineWidth = 3;
ctx.beginPath();
ctx.moveTo(30, spY); ctx.lineTo(spX - sw/2, spY);
ctx.moveTo(spX + sw/2, spY); ctx.lineTo(W - 80, spY);
ctx.stroke();
// батарея слева
ctx.fillStyle = '#0f172a'; ctx.fillRect(20, spY - 22, 22, 44);
ctx.strokeStyle = '#ef4444'; ctx.lineWidth = 3;
ctx.beginPath(); ctx.moveTo(14, spY + 6); ctx.lineTo(46, spY + 6); ctx.stroke();
ctx.strokeStyle = '#3b82f6'; ctx.lineWidth = 3;
ctx.beginPath(); ctx.moveTo(22, spY - 6); ctx.lineTo(38, spY - 6); ctx.stroke();
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 9px monospace'; ctx.textAlign = 'center';
ctx.fillText(U.toFixed(1) + 'В', 30, spY + 22);
// поток электронов
if (I > 0.05){
flowPhase26 = (flowPhase26 + Math.min(I * 0.4, 2)) % 30;
var pathLen = (W - 110) + sw + 20;
var nDots = Math.round(Math.min(20, I * 2 + 4));
for (var di = 0; di < nDots; di++){
var t = ((di / nDots) * pathLen + flowPhase26 * pathLen / 30) % pathLen;
var ex, ey;
if (t < (spX - sw/2 - 50)){ ex = 50 + t; ey = spY - 8; }
else if (t < (spX - sw/2 - 50) + sw + 20){ ex = spX - sw/2 + (t - (spX - sw/2 - 50)); ey = spY - 4; }
else { var rem = t - ((spX - sw/2 - 50) + sw + 20); ex = spX + sw/2 + rem; ey = spY - 8; }
ctx.fillStyle = 'rgba(96,165,250,.9)';
ctx.beginPath(); ctx.arc(ex, ey, 2.5, 0, Math.PI*2); ctx.fill();
}
}
// === Термометр справа ===
var tmX = W - 50, tmY0 = 40, tmH = H - 90;
ctx.fillStyle = '#1e293b'; ctx.fillRect(tmX - 8, tmY0, 16, tmH);
ctx.strokeStyle = '#64748b'; ctx.lineWidth = 1.2; ctx.strokeRect(tmX - 8, tmY0, 16, tmH);
// bulb
ctx.fillStyle = '#1e293b';
ctx.beginPath(); ctx.arc(tmX, tmY0 + tmH + 8, 14, 0, Math.PI*2); ctx.fill();
ctx.strokeStyle = '#64748b'; ctx.stroke();
// заполнение
var tFrac = Math.max(0, Math.min(1, (timer26.temp - 20) / 800));
var fillCol = tFrac < 0.3 ? '#3b82f6' : tFrac < 0.6 ? '#f97316' : '#ef4444';
var fillH = tFrac * (tmH - 4);
ctx.fillStyle = fillCol; ctx.fillRect(tmX - 6, tmY0 + tmH - 2 - fillH, 12, fillH);
ctx.beginPath(); ctx.arc(tmX, tmY0 + tmH + 8, 12, 0, Math.PI*2); ctx.fill();
// деления
ctx.strokeStyle = '#475569'; ctx.lineWidth = 1;
for (var k = 0; k <= 4; k++){
var y = tmY0 + 4 + k * (tmH - 8) / 4;
ctx.beginPath(); ctx.moveTo(tmX + 8, y); ctx.lineTo(tmX + 12, y); ctx.stroke();
}
ctx.fillStyle = '#cbd5e1'; ctx.font = '8px sans-serif'; ctx.textAlign = 'center';
ctx.fillText('°C', tmX, tmY0 - 6);
ctx.font = 'bold 10px monospace';
ctx.fillStyle = fillCol;
ctx.fillText(Math.round(timer26.temp), tmX, tmY0 + tmH + 32);
// === Информационные подписи ===
ctx.fillStyle = '#e2e8f0'; ctx.font = 'bold 11px monospace'; ctx.textAlign = 'left';
ctx.fillText('P = I²R = ' + I.toFixed(1) + × ' + R + ' = ' + P.toFixed(1) + ' Вт', 20, 20);
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 11px monospace';
ctx.fillText('Q = P·t = ' + timer26.Q.toFixed(0) + ' Дж', 20, 38);
// подсказка-сравнение (I×2 → Q×4)
if (I > 1){
ctx.fillStyle = 'rgba(251,191,36,0.55)'; ctx.font = '9px sans-serif';
ctx.fillText('×2 ток → ×4 тепла', 20, H - 14);
}
// Чипы
var c1 = document.getElementById('chip26P');
var c2 = document.getElementById('chip26Q');
var c3 = document.getElementById('chip26T');
var c4 = document.getElementById('chip26Temp');
if (c1) c1.textContent = 'P = ' + P.toFixed(1) + ' Вт';
if (c2) c2.textContent = 'Q = ' + timer26.Q.toFixed(0) + ' Дж';
if (c3) c3.textContent = 't = ' + timer26.t.toFixed(1) + ' с';
if (c4) c4.textContent = 'θ = ' + Math.round(timer26.temp) + ' °C';
var res = document.getElementById('res26');
if (res) res.innerHTML = '$P = I^2R = ' + I.toFixed(1) + '^2 \\times ' + R + ' = ' + P.toFixed(1) + '$ Вт; $Q = ' + P.toFixed(1) + 't = ' + timer26.Q.toFixed(0) + '$ Дж за ' + timer26.t.toFixed(1) + ' с';
if (window.doRender && res) doRender(res);
anim26Id = requestAnimationFrame(frame);
}
anim26Id = requestAnimationFrame(frame);
}
// ═══ §27: Счётчик электроэнергии ═══
function upd27() {
var cv = document.getElementById('cv27');
if (!cv || cv.offsetWidth === 0) return;
var dpr = window.devicePixelRatio || 1;
var W = cv.offsetWidth, H = cv.offsetHeight || 240;
cv.width = Math.round(W*dpr); cv.height = Math.round(H*dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr,0,0,dpr,0,0);
ctx.fillStyle='#0f172a'; ctx.fillRect(0,0,W,H);
var devices=[
{id:'chk27lamp',name:'Лампа накал.',p:60,color:'#fbbf24'},
{id:'chk27led',name:'LED-лампа',p:10,color:'#22c55e'},
{id:'chk27kettle',name:'Чайник',p:2000,color:'#ef4444'},
{id:'chk27fridge',name:'Холодильник',p:150,color:'#3b82f6'},
{id:'chk27tv',name:'ТВ',p:120,color:'#8b5cf6'}
];
var totalP=0, active=[];
devices.forEach(function(d){
var el=document.getElementById(d.id);
if(el&&el.checked){totalP+=d.p;active.push(d);}
});
var maxP=5000;
var barH=30, barY=20, barMax=W-80;
ctx.fillStyle='rgba(29,78,216,.1)'; ctx.fillRect(30,barY,barMax,barH);
var fillW=Math.min(barMax,(totalP/maxP)*barMax);
var barColor=totalP>3500?'#ef4444':totalP>2000?'#f97316':'#3b82f6';
ctx.fillStyle=barColor; ctx.fillRect(30,barY,fillW,barH);
ctx.strokeStyle='#475569'; ctx.lineWidth=1.5; ctx.strokeRect(30,barY,barMax,barH);
var fuseX=30+(3520/maxP)*barMax;
ctx.strokeStyle='#ef4444'; ctx.lineWidth=2; ctx.setLineDash([4,3]);
ctx.beginPath(); ctx.moveTo(fuseX,barY-5); ctx.lineTo(fuseX,barY+barH+5); ctx.stroke();
ctx.setLineDash([]);
ctx.fillStyle='#ef4444'; ctx.font='8px sans-serif'; ctx.textAlign='center';
ctx.fillText('⚡ предохр. 16А',fuseX,barY-8);
ctx.fillStyle=barColor; ctx.font='bold 12px sans-serif'; ctx.textAlign='left';
ctx.fillText(totalP+' Вт',30+fillW+5,barY+20);
if(totalP>3520){
ctx.fillStyle='#ef4444'; ctx.font='bold 11px sans-serif';
ctx.fillText('⚠️ ПЕРЕГРУЗКА! Предохранитель сработает',30,barY+50);
}
var gx=30, gy=80, gw=(W-60)/5, gh=80;
devices.forEach(function(d,i){
var on=document.getElementById(d.id)&&document.getElementById(d.id).checked;
ctx.fillStyle=on?d.color+'33':'rgba(30,41,59,0.5)';
ctx.fillRect(gx+i*gw+3,gy,gw-6,gh);
ctx.strokeStyle=on?d.color:'#475569'; ctx.lineWidth=on?2:1;
ctx.strokeRect(gx+i*gw+3,gy,gw-6,gh);
if(on){
var grd=ctx.createRadialGradient(gx+i*gw+gw/2,gy+gh/3,0,gx+i*gw+gw/2,gy+gh/3,gw/2);
grd.addColorStop(0,'rgba(255,255,200,0.3)'); grd.addColorStop(1,'transparent');
ctx.fillStyle=grd; ctx.fillRect(gx+i*gw+3,gy,gw-6,gh);
}
ctx.fillStyle=on?d.color:'#475569'; ctx.font='8px sans-serif'; ctx.textAlign='center';
ctx.fillText(d.name,gx+i*gw+gw/2,gy+gh+12);
ctx.fillText(d.p+'Вт',gx+i*gw+gw/2,gy+gh/2+5);
ctx.fillText(on?'ВКЛ':'ВЫКЛ',gx+i*gw+gw/2,gy+gh/2+18);
});
var kwh=(totalP*8/1000).toFixed(2);
ctx.fillStyle='#e2e8f0'; ctx.font='10px sans-serif'; ctx.textAlign='center';
ctx.fillText('За 8 ч: '+kwh+' кВт·ч = '+(kwh*3600000/1000000).toFixed(2)+' МДж',W/2,H-8);
var res=document.getElementById('res27');
if(res) res.textContent='Мощность: '+totalP+' Вт | За 8 ч: '+kwh+' кВт·ч'+(totalP>3520?' | ⚠️ ПЕРЕГРУЗКА':'');
}
// ═══ §28: Постоянные магниты ═══
var anim28Id=null, dir28=1;
function startAnim28(){
var cv=document.getElementById('cv28');
if(!cv||cv.offsetWidth===0) return;
if(anim28Id){cancelAnimationFrame(anim28Id);anim28Id=null;}
var dpr=window.devicePixelRatio||1;
var W=cv.offsetWidth,H=cv.offsetHeight||280;
cv.width=Math.round(W*dpr);cv.height=Math.round(H*dpr);
var ctx=cv.getContext('2d');ctx.setTransform(dpr,0,0,dpr,0,0);
var sel=document.getElementById('sel28mode');
var mode=sel?sel.value:'NS';
var showCompass=document.getElementById('chk28compass')&&document.getElementById('chk28compass').checked;
var t=0;
function frame(){
ctx.fillStyle='#0f172a';ctx.fillRect(0,0,W,H);
t+=0.02;
var cx=W/2,cy=H/2;
var charges=[];
var d=70;
if(mode==='NS') charges=[{x:cx-d,y:cy,q:1,lbl:'N'},{x:cx+d,y:cy,q:-1,lbl:'S'}];
else if(mode==='NN') charges=[{x:cx-d,y:cy,q:1,lbl:'N'},{x:cx+d,y:cy,q:1,lbl:'N'}];
else charges=[{x:cx-d,y:cy,q:-1,lbl:'S'},{x:cx+d,y:cy,q:-1,lbl:'S'}];
charges.forEach(function(ch){
if(ch.q<=0) return;
for(var i=0;i<12;i++){
var ang=(i/12)*Math.PI*2;
var x=ch.x+Math.cos(ang)*18,y=ch.y+Math.sin(ang)*18;
ctx.beginPath();ctx.moveTo(x,y);
for(var s=0;s<200;s++){
var fx=0,fy=0;
charges.forEach(function(c){
var dx=x-c.x,dy=y-c.y,r2=dx*dx+dy*dy;
if(r2<9) return;
var f=c.q/r2;fx+=f*dx/Math.sqrt(r2);fy+=f*dy/Math.sqrt(r2);
});
var len=Math.sqrt(fx*fx+fy*fy);if(len<1e-6)break;
x+=fx/len*3;y+=fy/len*3;ctx.lineTo(x,y);
if(x<5||x>W-5||y<5||y>H-5)break;
if(charges.some(function(c){return c.q<0&&Math.hypot(x-c.x,y-c.y)<16;}))break;
}
ctx.strokeStyle='rgba(147,197,253,0.4)';ctx.lineWidth=1.5;ctx.stroke();
}
});
charges.forEach(function(ch){
var col=ch.q>0?'#3b82f6':'#ef4444';
var grd=ctx.createRadialGradient(ch.x,ch.y,0,ch.x,ch.y,22);
grd.addColorStop(0,col+'99');grd.addColorStop(1,col+'33');
ctx.fillStyle=grd;
ctx.fillRect(ch.x-22,ch.y-18,44,36);
ctx.strokeStyle=col;ctx.lineWidth=2;ctx.strokeRect(ch.x-22,ch.y-18,44,36);
ctx.fillStyle='#fff';ctx.font='bold 14px sans-serif';ctx.textAlign='center';
ctx.fillText(ch.lbl,ch.x,ch.y+6);
});
if(showCompass){
var positions=[[cx,cy-70],[cx,cy+70],[cx-110,cy],[cx+110,cy],[cx-80,cy-50],[cx+80,cy-50],[cx-80,cy+50],[cx+80,cy+50]];
positions.forEach(function(pos){
var bx=pos[0],by=pos[1];
var fx=0,fy=0;
charges.forEach(function(c){
var dx=bx-c.x,dy=by-c.y,r2=dx*dx+dy*dy;
if(r2<100)return;
var f=c.q/(r2);fx+=f*dx/Math.sqrt(r2);fy+=f*dy/Math.sqrt(r2);
});
var angle=Math.atan2(fy,fx);
ctx.save();ctx.translate(bx,by);ctx.rotate(angle);
ctx.beginPath();ctx.arc(0,0,7,0,Math.PI*2);
ctx.strokeStyle='#475569';ctx.lineWidth=1;ctx.fillStyle='#1e293b';ctx.fill();ctx.stroke();
ctx.fillStyle='#3b82f6';ctx.beginPath();ctx.moveTo(0,-7);ctx.lineTo(-2.5,0);ctx.lineTo(2.5,0);ctx.fill();
ctx.fillStyle='#ef4444';ctx.beginPath();ctx.moveTo(0,7);ctx.lineTo(-2.5,0);ctx.lineTo(2.5,0);ctx.fill();
ctx.restore();
});
}
var f1=charges[0],f2=charges[1];
var dx=f2.x-f1.x,dy=f2.y-f1.y,dist=Math.sqrt(dx*dx+dy*dy);
var attract=f1.q*f2.q<0;
var arrowColor=attract?'#22c55e':'#ef4444';
var dir=attract?1:-1;
ctx.strokeStyle=arrowColor;ctx.lineWidth=2;
var ax1=f1.x+dir*dx/dist*28,ay1=f1.y+dir*dy/dist*28;
ctx.beginPath();ctx.moveTo(f1.x+dir*dx/dist*22,f1.y+dir*dy/dist*22);ctx.lineTo(ax1,ay1);ctx.stroke();
ctx.fillStyle=arrowColor;ctx.beginPath();ctx.arc(ax1,ay1,3.5,0,Math.PI*2);ctx.fill();
var ax2=f2.x-dir*dx/dist*28,ay2=f2.y-dir*dy/dist*28;
ctx.beginPath();ctx.moveTo(f2.x-dir*dx/dist*22,f2.y-dir*dy/dist*22);ctx.lineTo(ax2,ay2);ctx.stroke();
ctx.beginPath();ctx.arc(ax2,ay2,3.5,0,Math.PI*2);ctx.fill();
ctx.fillStyle=arrowColor;ctx.font='bold 10px sans-serif';ctx.textAlign='center';
ctx.fillText(attract?'← ПРИТЯЖЕНИЕ →':'→ ОТТАЛКИВАНИЕ ←',cx,H-12);
anim28Id=requestAnimationFrame(frame);
}
anim28Id=requestAnimationFrame(frame);
}
// ═══ §29: Силовые линии магнитного поля ═══
var anim29Id=null;
function startAnim29(){
var cv=document.getElementById('cv29');
if(!cv||cv.offsetWidth===0) return;
if(anim29Id){cancelAnimationFrame(anim29Id);anim29Id=null;}
var dpr=window.devicePixelRatio||1;
var W=cv.offsetWidth,H=cv.offsetHeight||290;
cv.width=Math.round(W*dpr);cv.height=Math.round(H*dpr);
var ctx=cv.getContext('2d');ctx.setTransform(dpr,0,0,dpr,0,0);
var sel=document.getElementById('sel29shape');
var shape=sel?sel.value:'dipole';
var showNeedles=document.getElementById('chk29needles')&&document.getElementById('chk29needles').checked;
var t=0;
function getCharges(){
var cx=W/2,cy=H/2;
if(shape==='dipole') return [{x:cx-60,y:cy,q:1,lbl:'N'},{x:cx+60,y:cy,q:-1,lbl:'S'}];
if(shape==='horseshoe') return [{x:cx-50,y:cy-40,q:1,lbl:'N'},{x:cx+50,y:cy-40,q:-1,lbl:'S'}];
if(shape==='ns_close') return [{x:cx-30,y:cy,q:1,lbl:'N'},{x:cx+30,y:cy,q:-1,lbl:'S'}];
return [{x:cx-50,y:cy,q:1,lbl:'N'},{x:cx+50,y:cy,q:1,lbl:'N'}];
}
function frame(){
ctx.fillStyle='#0f172a';ctx.fillRect(0,0,W,H);
t+=0.01;
var charges=getCharges();
charges.forEach(function(ch){
if(ch.q<=0) return;
for(var i=0;i<16;i++){
var ang=(i/16)*Math.PI*2;
var x=ch.x+Math.cos(ang)*15,y=ch.y+Math.sin(ang)*15;
ctx.beginPath();ctx.moveTo(x,y);
for(var s=0;s<300;s++){
var fx=0,fy=0;
charges.forEach(function(c){
var dx=x-c.x,dy=y-c.y,r2=dx*dx+dy*dy;
if(r2<4) return;
var f=c.q/r2;fx+=f*dx/Math.sqrt(r2);fy+=f*dy/Math.sqrt(r2);
});
var len=Math.sqrt(fx*fx+fy*fy);if(len<1e-6)break;
x+=fx/len*2.5;y+=fy/len*2.5;ctx.lineTo(x,y);
if(x<2||x>W-2||y<2||y>H-2)break;
if(charges.some(function(c){return c.q<0&&Math.hypot(x-c.x,y-c.y)<14;}))break;
}
ctx.strokeStyle='rgba(147,197,253,0.45)';ctx.lineWidth=1.5;ctx.stroke();
}
});
charges.forEach(function(ch){
var col=ch.q>0?'#3b82f6':'#ef4444';
ctx.fillStyle=col+'44';ctx.fillRect(ch.x-20,ch.y-15,40,30);
ctx.strokeStyle=col;ctx.lineWidth=2;ctx.strokeRect(ch.x-20,ch.y-15,40,30);
ctx.fillStyle='#fff';ctx.font='bold 13px sans-serif';ctx.textAlign='center';
ctx.fillText(ch.lbl,ch.x,ch.y+5);
});
if(showNeedles){
var nx=Math.floor(W/50)+1,ny=Math.floor(H/50)+1;
for(var ix=0;ix<nx;ix++){for(var iy=0;iy<ny;iy++){
var bx=25+ix*50,by=25+iy*50;
var fx=0,fy=0;
charges.forEach(function(c){
var dx=bx-c.x,dy=by-c.y,r2=dx*dx+dy*dy;
if(r2<200)return;
var f=c.q/r2;fx+=f*dx/Math.sqrt(r2);fy+=f*dy/Math.sqrt(r2);
});
var angle=Math.atan2(fy,fx);
ctx.save();ctx.translate(bx,by);ctx.rotate(angle);
ctx.fillStyle='#3b82f6';ctx.beginPath();ctx.moveTo(0,-6);ctx.lineTo(-2,0);ctx.lineTo(2,0);ctx.fill();
ctx.fillStyle='#ef4444';ctx.beginPath();ctx.moveTo(0,6);ctx.lineTo(-2,0);ctx.lineTo(2,0);ctx.fill();
ctx.restore();
}}
}
anim29Id=requestAnimationFrame(frame);
}
anim29Id=requestAnimationFrame(frame);
}
// ═══ §30: Поле тока (Эрстед) ═══
var anim30Id=null, dir30=1;
function reverse30(){ dir30*=-1; startAnim30(); }
function startAnim30(){
var cv=document.getElementById('cv30');
if(!cv||cv.offsetWidth===0) return;
if(anim30Id){cancelAnimationFrame(anim30Id);anim30Id=null;}
var dpr=window.devicePixelRatio||1;
var W=cv.offsetWidth,H=cv.offsetHeight||270;
cv.width=Math.round(W*dpr);cv.height=Math.round(H*dpr);
var ctx=cv.getContext('2d');ctx.setTransform(dpr,0,0,dpr,0,0);
var showCompass=document.getElementById('chk30compass')&&document.getElementById('chk30compass').checked;
var I=parseFloat((document.getElementById('sl30I')||{}).value)||2;
var t=0;
function frame(){
ctx.fillStyle='#0f172a';ctx.fillRect(0,0,W,H);
t+=0.02;
var cx=W/2,cy=H/2;
var r=16;
ctx.fillStyle='#475569';ctx.beginPath();ctx.arc(cx,cy,r,0,Math.PI*2);ctx.fill();
ctx.strokeStyle='#94a3b8';ctx.lineWidth=2;ctx.stroke();
ctx.strokeStyle='#fbbf24';ctx.lineWidth=2.5;
if(dir30>0){
ctx.beginPath();ctx.moveTo(cx-8,cy-8);ctx.lineTo(cx+8,cy+8);ctx.stroke();
ctx.beginPath();ctx.moveTo(cx+8,cy-8);ctx.lineTo(cx-8,cy+8);ctx.stroke();
ctx.fillStyle='#fbbf24';ctx.font='8px sans-serif';ctx.textAlign='center';
ctx.fillText('× ток от нас',cx,cy+30);
} else {
ctx.fillStyle='#fbbf24';ctx.beginPath();ctx.arc(cx,cy,5,0,Math.PI*2);ctx.fill();
ctx.fillStyle='#fbbf24';ctx.font='8px sans-serif';ctx.textAlign='center';
ctx.fillText('· ток к нам',cx,cy+30);
}
var maxR=Math.min(W,H)*0.45;
for(var ri=1;ri<=4;ri++){
var linR=r+15*ri+I*5;
if(linR>maxR) break;
ctx.strokeStyle='rgba(59,130,246,'+(0.6-ri*0.1)+')';ctx.lineWidth=1.5;
ctx.beginPath();ctx.arc(cx,cy,linR,0,Math.PI*2);ctx.stroke();
var arrowAngle=t*dir30*1.5+ri*Math.PI/2;
var ax=cx+Math.cos(arrowAngle)*linR,ay=cy+Math.sin(arrowAngle)*linR;
var tang=arrowAngle+Math.PI/2*dir30;
ctx.fillStyle='rgba(59,130,246,0.9)';
ctx.save();ctx.translate(ax,ay);ctx.rotate(tang);
ctx.beginPath();ctx.moveTo(0,-6);ctx.lineTo(-3,3);ctx.lineTo(3,3);ctx.closePath();ctx.fill();
ctx.restore();
}
if(showCompass){
var positions=[[cx+80,cy],[cx-80,cy],[cx,cy+80],[cx,cy-80],[cx+56,cy+56],[cx-56,cy-56],[cx+56,cy-56],[cx-56,cy+56]];
positions.forEach(function(pos){
var bx=pos[0],by=pos[1];
var dx=bx-cx,dy=by-cy;
var angle=Math.atan2(dy,dx)+Math.PI/2*dir30;
ctx.save();ctx.translate(bx,by);ctx.rotate(angle);
ctx.beginPath();ctx.arc(0,0,7,0,Math.PI*2);
ctx.fillStyle='#1e293b';ctx.fill();ctx.strokeStyle='#475569';ctx.lineWidth=1;ctx.stroke();
ctx.fillStyle='#3b82f6';ctx.beginPath();ctx.moveTo(0,-7);ctx.lineTo(-2.5,0);ctx.lineTo(2.5,0);ctx.fill();
ctx.fillStyle='#ef4444';ctx.beginPath();ctx.moveTo(0,7);ctx.lineTo(-2.5,0);ctx.lineTo(2.5,0);ctx.fill();
ctx.restore();
});
}
ctx.fillStyle='#e2e8f0';ctx.font='9px sans-serif';ctx.textAlign='right';
ctx.fillText('I = '+I.toFixed(1)+' А '+(dir30>0?'↓ вниз':'↑ вверх'),W-10,H-10);
ctx.textAlign='center';
ctx.fillStyle='#64748b';ctx.font='9px sans-serif';
ctx.fillText(dir30>0?'Поле — по часовой ↻':'Поле — против часовой ↺',cx,H-24);
anim30Id=requestAnimationFrame(frame);
}
anim30Id=requestAnimationFrame(frame);
}
// ═══ §31: Электромагнит ═══
var anim31Id=null;
function startAnim31(){
var cv=document.getElementById('cv31');
if(!cv||cv.offsetWidth===0) return;
if(anim31Id){cancelAnimationFrame(anim31Id);anim31Id=null;}
var dpr=window.devicePixelRatio||1;
var W=cv.offsetWidth,H=cv.offsetHeight||290;
cv.width=Math.round(W*dpr);cv.height=Math.round(H*dpr);
var ctx=cv.getContext('2d');ctx.setTransform(dpr,0,0,dpr,0,0);
var N=parseInt((document.getElementById('sl31N')||{}).value)||5;
var I31=parseFloat((document.getElementById('sl31I')||{}).value)||2;
var core=document.getElementById('chk31core')&&document.getElementById('chk31core').checked;
var sel=document.getElementById('sel31scene');
var scene=sel?sel.value:'coil';
var power=N*I31*(core?3:1);
var t=0;
function frame(){
ctx.fillStyle='#0f172a';ctx.fillRect(0,0,W,H);
t+=0.025;
if(scene==='coil'){
var cx=W/2,cy=H/2;
if(core){
ctx.fillStyle='rgba(148,163,184,.3)';
ctx.fillRect(cx-70,cy-12,140,24);
ctx.strokeStyle='#94a3b8';ctx.lineWidth=1.5;ctx.strokeRect(cx-70,cy-12,140,24);
ctx.fillStyle='#94a3b8';ctx.font='8px sans-serif';ctx.textAlign='center';
ctx.fillText('Железный сердечник',cx,cy+20);
}
ctx.strokeStyle='#f97316';ctx.lineWidth=2.5;
var spacing=Math.max(4,Math.min(12,100/N));
for(var vi=0;vi<Math.min(N,16);vi++){
var vx=cx-60+vi*(120/Math.min(N,15));
ctx.beginPath();
ctx.ellipse(vx,cy,5,12+(core?3:0),0,0,Math.PI*2);
ctx.stroke();
}
var lines=3+Math.round(power/15);
for(var li=0;li<Math.min(lines,8);li++){
var ly=cy+(li-(Math.min(lines,8)/2-0.5))*18;
var ext=20+power*2;
var a='rgba(59,130,246,'+(0.5-Math.abs(ly-cy)/100)+')';
ctx.strokeStyle=a;ctx.lineWidth=1.5;
ctx.beginPath();
ctx.moveTo(cx-65,ly);ctx.lineTo(cx-65-ext,ly);
ctx.quadraticCurveTo(cx-65-ext-20,ly,cx-65-ext-20,cy);
ctx.quadraticCurveTo(cx-65-ext-20,cy-50,cx,cy-50-(power*0.5));
ctx.quadraticCurveTo(cx+65+ext+20,cy-50,cx+65+ext+20,cy);
ctx.quadraticCurveTo(cx+65+ext+20,ly,cx+65+ext,ly);
ctx.lineTo(cx+65,ly);
ctx.stroke();
var arrowX=cx-65-ext/2-Math.sin(t*2+li)*3;
ctx.fillStyle=a;
ctx.beginPath();ctx.moveTo(arrowX,ly-4);ctx.lineTo(arrowX-8,ly);ctx.lineTo(arrowX,ly+4);ctx.fill();
}
ctx.fillStyle='#3b82f6';ctx.font='bold 13px sans-serif';ctx.textAlign='center';
ctx.fillText('N',cx-70,cy+5);
ctx.fillStyle='#ef4444';ctx.fillText('S',cx+70,cy+5);
ctx.fillStyle='#fbbf24';ctx.font='9px sans-serif';
ctx.fillText('Мощность поля: '+power.toFixed(0)+' (N×I'+(core?'×3':'')+' = '+N+'×'+I31.toFixed(1)+(core?'×3':'')+' = '+power.toFixed(0)+')',cx,H-12);
} else if(scene==='relay'){
var cx=W/2,cy=H*0.4;
ctx.strokeStyle='#f97316';ctx.lineWidth=2.5;
for(var vi=0;vi<8;vi++){
var vx=cx-40+vi*11;
ctx.beginPath();ctx.ellipse(vx,cy,4,10,0,0,Math.PI*2);ctx.stroke();
}
if(core){ctx.fillStyle='rgba(148,163,184,.4)';ctx.fillRect(cx-42,cy-7,84,14);}
ctx.fillStyle='#64748b';ctx.font='9px sans-serif';ctx.textAlign='center';
ctx.fillText('Катушка электромагнита',cx,cy+25);
var attracted=I31>0;
var yakX=cx-50,yakY=attracted?cy-22:cy-35;
ctx.fillStyle=attracted?'rgba(239,68,68,.4)':'rgba(148,163,184,.3)';
ctx.fillRect(yakX,yakY,100,8);
ctx.strokeStyle=attracted?'#ef4444':'#94a3b8';ctx.lineWidth=2;
ctx.strokeRect(yakX,yakY,100,8);
ctx.fillStyle='#94a3b8';ctx.font='8px sans-serif';ctx.textAlign='center';
ctx.fillText(attracted?'Якорь притянут ↓ → контакт замкнут':'Якорь отпущен ↑ → контакт разомкнут',cx,yakY-10);
var contY=cy+40;
ctx.strokeStyle=attracted?'#22c55e':'#ef4444';ctx.lineWidth=2;
ctx.beginPath();ctx.moveTo(cx-30,contY);ctx.lineTo(cx-5,contY);ctx.stroke();
ctx.beginPath();ctx.moveTo(cx+5,contY+(attracted?0:15));ctx.lineTo(cx+30,contY+(attracted?0:15));ctx.stroke();
if(attracted){
ctx.beginPath();ctx.moveTo(cx-5,contY);ctx.lineTo(cx+5,contY);ctx.stroke();
ctx.fillStyle='#22c55e';ctx.font='9px sans-serif';ctx.fillText('Цепь замкнута!',cx,contY+20);
} else {
ctx.fillStyle='#ef4444';ctx.font='9px sans-serif';ctx.fillText('Цепь разомкнута',cx,contY+25);
}
} else {
var cx=W/2,cy=H*0.3;
var attracted=I31>0;
ctx.fillStyle='rgba(148,163,184,.3)';ctx.fillRect(cx-40,cy,80,25);
ctx.strokeStyle='#94a3b8';ctx.lineWidth=2;ctx.strokeRect(cx-40,cy,80,25);
if(I31>0){
var grd=ctx.createRadialGradient(cx,cy+12,0,cx,cy+12,30);
grd.addColorStop(0,'rgba(59,130,246,0.3)');grd.addColorStop(1,'transparent');
ctx.fillStyle=grd;ctx.beginPath();ctx.arc(cx,cy+12,30,0,Math.PI*2);ctx.fill();
}
ctx.fillStyle='#e2e8f0';ctx.font='8px sans-serif';ctx.textAlign='center';
ctx.fillText(I31>0?'⚡ ВКЛЮЧЁН':'○ ВЫКЛЮЧЕН',cx,cy+16);
var grY=attracted?cy+30:cy+80;
ctx.fillStyle=attracted?'#374151':'#4b5563';
ctx.fillRect(cx-25,grY,50,30);
ctx.strokeStyle='#9ca3af';ctx.lineWidth=2;ctx.strokeRect(cx-25,grY,50,30);
ctx.fillStyle='#94a3b8';ctx.font='8px sans-serif';
ctx.fillText('Стальной',cx,grY+13);
ctx.fillText('груз',cx,grY+24);
if(!attracted){
ctx.fillStyle='#64748b';ctx.font='9px sans-serif';
ctx.fillText('↓ падает (ток выключен)',cx,grY+50);
}
}
anim31Id=requestAnimationFrame(frame);
}
anim31Id=requestAnimationFrame(frame);
}
// ═══════════════════════════════════════
// ИНИЦИАЛИЗАЦИЯ
// ═══════════════════════════════════════
document.addEventListener('DOMContentLoaded', function() {
// тема
if (localStorage.getItem('phys8_e_theme')==='dark') document.documentElement.classList.add('dark');
document.getElementById('themeBtn').onclick = function() {
document.documentElement.classList.toggle('dark');
localStorage.setItem('phys8_e_theme', document.documentElement.classList.contains('dark')?'dark':'light');
};
// ── Маппинг таб → группа ──
var tabToGroup = {
'ref12':'es','ref13':'es','ref14':'es','ref15':'es','ref16':'es',
'ref17':'et','ref18':'et','ref19':'et','ref20':'et','ref21':'et',
'ref22':'om','ref23':'om','ref24':'om','ref25':'om','ref26':'om','ref27':'om',
'ref28':'mg','ref29':'mg','ref30':'mg','ref31':'mg',
'tasks':'tasks'
};
// ── Активация таба ──
function activateTab(tn){
// снимаем активность со всех табов и контента
document.querySelectorAll('.tab').forEach(function(t){ t.classList.remove('active'); });
document.querySelectorAll('.content').forEach(function(c){ c.classList.remove('active'); });
// показываем нужный контент
var cont = document.getElementById('tab-'+tn);
if (cont) cont.classList.add('active');
// ставим active на таб в сайдбаре
var tabEl = document.querySelector('.tab[data-tab="'+tn+'"]');
if (tabEl) tabEl.classList.add('active');
// переключаем ch-btn и sec-group
var grp = tabToGroup[tn] || 'es';
document.querySelectorAll('.ch-btn').forEach(function(b){ b.classList.remove('active'); });
document.querySelectorAll('.sec-group').forEach(function(g){ g.classList.remove('show'); });
var chBtn = document.querySelector('.ch-btn[data-ch="'+grp+'"]');
if (chBtn) chBtn.classList.add('active');
var secGrp = document.querySelector('.sec-group[data-chg="'+grp+'"]');
if (secGrp) secGrp.classList.add('show');
// scroll sidebar tab into view
if (tabEl) tabEl.scrollIntoView({block:'nearest'});
// запуск интерактива при переключении таба
var tabFns = {
'ref12': function(){ setTimeout(function(){ draw12static(); }, 60); },
'ref13': function(){ setTimeout(upd13, 60); },
'ref14': function(){ setTimeout(upd14, 60); },
'ref15': function(){ setTimeout(upd15, 60); },
'ref16': function(){ setTimeout(function(){ if(!anim16Id) startAnim16(); }, 60); },
'ref17': function(){ setTimeout(upd17, 60); },
'ref18': function(){ setTimeout(function(){ if(!anim18Id) startAnim18(); }, 60); },
'ref19': function(){ setTimeout(function(){ draw19frame(key19); }, 60); },
'ref20': function(){ setTimeout(function(){ if(!anim20Id) startAnim20(); }, 60); },
'ref21': function(){ setTimeout(function(){ if(key21) startAnim21(); else draw21(false); }, 60); },
'ref22': function(){ setTimeout(upd22, 60); },
'ref23': function(){ setTimeout(upd23, 60); },
'ref24': function(){ setTimeout(upd24, 60); },
'ref25': function(){ setTimeout(upd25, 60); },
'ref26': function(){ setTimeout(upd26, 60); },
'ref27': function(){ setTimeout(upd27, 60); },
'ref28': function(){ setTimeout(function(){ startAnim28(); }, 60); },
'ref29': function(){ setTimeout(function(){ startAnim29(); }, 60); },
'ref30': function(){ setTimeout(function(){ startAnim30(); }, 60); },
'ref31': function(){ setTimeout(function(){ startAnim31(); }, 60); }
};
if (tabFns[tn]) tabFns[tn]();
// scroll main-col to top
var mc = document.querySelector('.main-col');
if (mc) mc.scrollTop = 0;
}
// ── Клики по табам в сайдбаре ──
document.querySelectorAll('.tab[data-tab]').forEach(function(tab) {
tab.onclick = function(e) {
e.stopPropagation();
activateTab(this.dataset.tab);
};
});
// ── Клики по ch-btn (разделам) ──
document.querySelectorAll('.ch-btn[data-ch]').forEach(function(btn) {
btn.onclick = function() {
var ch = this.dataset.ch;
// показываем sec-group
document.querySelectorAll('.ch-btn').forEach(function(b){ b.classList.remove('active'); });
document.querySelectorAll('.sec-group').forEach(function(g){ g.classList.remove('show'); });
this.classList.add('active');
var sg = document.querySelector('.sec-group[data-chg="'+ch+'"]');
if (sg) sg.classList.add('show');
// активируем первый таб этой группы
if (sg) {
var firstTab = sg.querySelector('.tab[data-tab]');
if (firstTab) activateTab(firstTab.dataset.tab);
}
};
});
// ── refPanel popup ──
var refRendered = false;
document.getElementById('refToggle').onclick = function() {
var rp = document.getElementById('refPanel');
rp.classList.toggle('show');
if (!refRendered && rp.classList.contains('show')) {
refRendered = true;
if (window.renderMathInElement) renderMathInElement(rp, {
delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false}],
throwOnError:false
});
}
};
// Закрыть по клику снаружи
document.addEventListener('click', function(e){
var rp = document.getElementById('refPanel');
var toggle = document.getElementById('refToggle');
if (rp.classList.contains('show') && !rp.contains(e.target) && !toggle.contains(e.target)){
rp.classList.remove('show');
}
});
// ── задачи — инит ──
['p12','p13','p14','p15','p16','p17','p18','p19','p20','p21','p22','p23','p24','p25','p26','p27','p28','p29','p30','p31','hard'].forEach(function(sec) {
renderTask(sec);
});
setParaTab('p12');
// KaTeX
if (window.renderMathInElement) {
renderMathInElement(document.body, {
delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false}],
throwOnError:false
});
}
// §12: инициализация интерактивов (активный таб при загрузке)
setTimeout(function(){ draw12static(); }, 150);
setTimeout(upd17, 200);
setTimeout(upd22, 200);
setTimeout(upd23, 200);
setTimeout(upd24, 200);
setTimeout(upd25, 200);
setTimeout(upd26, 200);
// ═══════════ PRO MAX UPGRADE ИНИЦИАЛИЗАЦИЯ ═══════════
initProMaxUpgrade();
});
// ═══════════════════════════════════════
// PRO MAX UPGRADE: инфра motion + UX
// ═══════════════════════════════════════
function initProMaxUpgrade(){
// 0. Авто-инжекция ph-glow и ph-badge в каждый hero
document.querySelectorAll('.para-hero').forEach(function(hero, i){
if(!hero.querySelector('.ph-glow')){
var g = document.createElement('span');
g.className = 'ph-glow';
hero.appendChild(g);
}
if(!hero.querySelector('.ph-badge')){
var n = '';
hero.classList.forEach(function(c){ var m=/^ph-(\d+)$/.exec(c); if(m) n='§'+m[1]; });
if(!n) n='§'+(i+1);
var b = document.createElement('div');
b.className = 'ph-badge';
b.innerHTML = '<i class="fas fa-bookmark" style="font-size:.6rem;margin-right:4px"></i>'+n;
hero.appendChild(b);
}
});
// 1. IntersectionObserver — fade-up для секций при скролле
try{
var io = new IntersectionObserver(function(entries){
entries.forEach(function(e){
if(e.isIntersecting){ e.target.classList.add('is-in'); io.unobserve(e.target); }
});
},{threshold:.12,rootMargin:'0px 0px -40px 0px'});
document.querySelectorAll('.content > *').forEach(function(el){
if(el.classList.contains('para-hero')) return;
el.classList.add('fx-rise');
io.observe(el);
});
document.querySelectorAll('.formula-grid, .life-grid, .idiag-2col').forEach(function(el){
el.classList.add('fx-stagger');
io.observe(el);
});
}catch(_){/* no-op */}
// 2. Mousemove параллакс на ::after шар у hero
document.querySelectorAll('.para-hero').forEach(function(hero){
hero.addEventListener('mousemove', function(e){
var r = hero.getBoundingClientRect();
var dx = (e.clientX - r.left - r.width/2) / r.width;
var dy = (e.clientY - r.top - r.height/2) / r.height;
hero.style.setProperty('--phx', (dx*12).toFixed(2)+'px');
hero.style.setProperty('--phy', (dy*8).toFixed(2)+'px');
});
});
// 3. Карточки формул: glow-курсор
document.querySelectorAll('.fcard').forEach(function(card){
card.addEventListener('mousemove', function(e){
var r = card.getBoundingClientRect();
card.style.setProperty('--mx', ((e.clientX-r.left)/r.width*100)+'%');
card.style.setProperty('--my', ((e.clientY-r.top)/r.height*100)+'%');
});
});
// 4. Ripple на всех кнопках
document.addEventListener('click', function(e){
var btn = e.target.closest('.btn, .para-pill, .opt-btn');
if(!btn) return;
var r = btn.getBoundingClientRect();
btn.style.setProperty('--rx', ((e.clientX-r.left)/r.width*100)+'%');
btn.style.setProperty('--ry', ((e.clientY-r.top)/r.height*100)+'%');
btn.classList.remove('is-ripple');
void btn.offsetWidth;
btn.classList.add('is-ripple');
setTimeout(function(){ btn.classList.remove('is-ripple'); }, 600);
});
}
// no-op stubs для совместимости
function buildMiniToc(){}
function markMiniTocActive(){}
function updateChapterProgress(){}
// ═══ B1. setupCanvas — утилита для новых интерактивов ═══
function setupCanvas(id, opts){
opts = opts || {};
var cv = document.getElementById(id);
if(!cv) return null;
var dpr = Math.min(window.devicePixelRatio||1, 2);
function resize(){
var W = cv.offsetWidth, H = cv.offsetHeight || (opts.height||220);
cv.width = Math.round(W*dpr); cv.height = Math.round(H*dpr);
var ctx = cv.getContext('2d');
ctx.setTransform(dpr,0,0,dpr,0,0);
return {ctx:ctx, W:W, H:H};
}
var rid = null, paused = false, lastFrame = 0;
var io = null;
if(opts.draw){
var loop = function(now){
if(paused){ rid=null; return; }
var dt = lastFrame ? (now-lastFrame)/1000 : 0.016;
lastFrame = now;
var dims = resize();
opts.draw(dims.ctx, dims.W, dims.H, dt, now);
rid = requestAnimationFrame(loop);
};
// auto-pause when off-screen
try{
io = new IntersectionObserver(function(entries){
entries.forEach(function(e){
if(e.isIntersecting){
if(!rid){ paused=false; lastFrame=0; rid=requestAnimationFrame(loop); }
} else {
paused=true; if(rid){cancelAnimationFrame(rid); rid=null;}
}
});
},{threshold:.05});
io.observe(cv);
}catch(_){}
// initial
paused=false; lastFrame=0; rid=requestAnimationFrame(loop);
} else if(opts.onResize){
var dims = resize();
opts.onResize(dims.ctx, dims.W, dims.H);
}
window.addEventListener('resize', function(){ if(opts.onResize){ var d=resize(); opts.onResize(d.ctx,d.W,d.H);} });
return {
canvas:cv,
stop:function(){ paused=true; if(rid){cancelAnimationFrame(rid); rid=null;} if(io)io.disconnect(); }
};
}
</script>
</body>
</html>