Files
Learn_System/frontend/textbooks/physics8_thermal.html
T
Maxim Dolgolyov ea753cf5b0 chore(textbooks): убрать упоминания авторов — учебники теперь как внутренние работы
- Миграция 011: UPDATE textbooks SET author='' (все 4 записи)
- algebra_8.html: убрано из <title> и футера
- physics_8.html (hub): убрано из title/header/intro/footer, заменено на LearnSpace
- physics8_*.html (3 файла): убраны все вхождения '· Исаченкова' в подписях §
- physics_9.html: убраны все вхождения '· Исаченкова' в подписях §
- chemistry_9.html: убраны 3 упоминания '· Шиманович' в подписях

В каталоге /textbooks автор больше не отображается под названием (так как поле пустое).
2026-05-27 11:03:25 +03:00

4515 lines
302 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>
<style>
/* ═══════════ ДИЗАЙН-ТОКЕНЫ v2 ═══════════ */
:root{
/* Палитра — 9 ступеней */
--pri-50:#fef2f2; --pri-100:#fee2e2; --pri-200:#fecaca; --pri-300:#fca5a5;
--pri-400:#f87171; --pri-500:#ef4444; --pri-600:#dc2626; --pri-700:#b91c1c;
--pri-800:#991b1b; --pri-900:#7f1d1d;
--acc-300:#fdba74; --acc-400:#fb923c; --acc-500:#f97316; --acc-600:#ea580c; --acc-700:#c2410c;
--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:#fff7ed; --card:#fff;
--surface-1:#ffffff; --surface-2:#fff7ed; --surface-3:#ffedd5;
--text:#1c1917; --muted:#78716c; --border:#e7e5e4;
--glass-bg:rgba(255,255,255,.65); --glass-border:rgba(255,255,255,.4);
/* Тени и свечение */
--sh:0 2px 10px rgba(220,38,38,.07);
--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(220,38,38,.25);
--shadow-pop:0 8px 22px rgba(220,38,38,.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:#1c0a00; --card:#2c1a0e;
--surface-1:#2c1a0e; --surface-2:#3a2114; --surface-3:#4a2a1a;
--text:#fafaf9; --muted:#a8a29e; --border:#44403c;
--glass-bg:rgba(44,26,14,.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(248,113,113,.35);
--shadow-pop:0 8px 22px rgba(220,38,38,.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}
/* ═══════════ FLOATING BUTTONS ═══════════ */
.theme-btn{position:fixed;top:12px;right:12px;z-index:80;width:38px;height:38px;border-radius:10px;
background:var(--card);border:1px solid var(--border);cursor:pointer;display:grid;place-items:center;
font-size:1rem;box-shadow:var(--sh);color:var(--text);transition:.2s}
.theme-btn:hover{transform:rotate(-12deg) scale(1.06)}
.theme-btn:active{transform:rotate(8deg) scale(.94)}
/* ═══════════ REF TOGGLE & POPUP ═══════════ */
.ref-toggle{position:fixed;bottom:16px;right:16px;z-index:70;width:46px;height:46px;
border-radius:13px;background:var(--pri);color:#fff;border:none;cursor:pointer;
display:grid;place-items:center;font-size:1.1rem;
box-shadow:0 6px 18px rgba(220,38,38,.4),0 0 0 4px rgba(220,38,38,.08);transition:.2s}
.ref-toggle:hover{transform:scale(1.06) rotate(-4deg);box-shadow:0 10px 26px rgba(220,38,38,.55),0 0 0 6px rgba(220,38,38,.12)}
.ref-panel{position:fixed;bottom:72px;right:16px;z-index:65;width:300px;max-height:72vh;
overflow-y:auto;background:var(--card);border:1px solid var(--border);border-radius:16px;
padding:16px 18px;box-shadow:0 8px 30px rgba(0,0,0,.15);display:none;font-size:.8rem;
line-height:1.85;scrollbar-width:thin}
.ref-panel.show{display:block;animation:pop .2s ease}
.ref-panel h3{font-size:.84rem;font-weight:700;color:var(--pri);margin:12px 0 4px}
.ref-panel h3:first-child{margin-top:0}
.ref-panel .rf{background:rgba(220,38,38,.06);border-radius:8px;padding:6px 10px;margin:3px 0;text-align:center}
/* ═══════════ ШАПКА (hdr) ═══════════ */
.hdr{background:linear-gradient(135deg,#7f1d1d 0%,#dc2626 55%,#ea580c 100%);color:#fff;
padding:22px 20px 18px;text-align:center}
.hdr h1{font-size:1.4rem;font-weight:900;display:flex;align-items:center;justify-content:center;gap:10px}
.hdr p{font-size:.82rem;opacity:.87;margin-top:5px}
/* ═══════════ PAGE LAYOUT: sidebar + main ═══════════ */
.page-layout{display:grid;grid-template-columns:230px 1fr;min-height:calc(100vh - 80px);overflow:hidden}
.sidebar{position:sticky;top:0;height:100vh;overflow-y:auto;overflow-x:hidden;
background:var(--card);border-right:1px solid var(--border);scrollbar-width:thin}
html.dark .sidebar{background:var(--surface-1);border-right-color:var(--border)}
.sidebar::-webkit-scrollbar{width:3px}
.sidebar::-webkit-scrollbar-thumb{background:rgba(220,38,38,.2);border-radius:99px}
.main-col{min-width:0;overflow-y:auto;overflow-x:hidden;padding:0}
/* ── Sidebar brand ── */
.sb-brand{display:flex;align-items:center;gap:10px;padding:16px 14px 14px;
border-bottom:1px solid var(--border);background:linear-gradient(135deg,rgba(220,38,38,.06),rgba(249,115,22,.04))}
html.dark .sb-brand{background:rgba(220,38,38,.08)}
.sb-logo{width:30px;height:30px;color:var(--pri);flex-shrink:0}
.sb-title{display:block;font-size:.9rem;font-weight:900;color:var(--text);letter-spacing:-.02em;line-height:1.1}
.sb-sub{display:block;font-size:.55rem;color:var(--muted);margin-top:2px;letter-spacing:.04em;text-transform:uppercase}
/* ── Sidebar nav ── */
.sb-nav{padding:10px 8px 18px;display:flex;flex-direction:column;gap:2px}
.ch-btn{display:flex;align-items:center;gap:8px;width:100%;padding:9px 10px;
border:none;border-left:2.5px solid transparent;border-radius:0 7px 7px 0;background:transparent;
font-family:'Outfit',system-ui,sans-serif;font-size:.74rem;font-weight:700;color:var(--muted);
cursor:pointer;text-align:left;transition:.18s;white-space:nowrap}
.ch-btn:hover{background:rgba(220,38,38,.07);border-left-color:rgba(220,38,38,.25);color:var(--text)}
.ch-btn.active{background:rgba(220,38,38,.1);border-left-color:var(--pri);color:var(--pri)}
html.dark .ch-btn:hover{background:rgba(220,38,38,.12)}
html.dark .ch-btn.active{background:rgba(220,38,38,.18);color:#f87171}
.ch-icon{width:14px;height:14px;flex-shrink:0;opacity:.5;transition:opacity .15s,color .15s}
.ch-btn:hover .ch-icon{opacity:.8}
.ch-btn.active .ch-icon{opacity:1;color:var(--pri)}
html.dark .ch-btn.active .ch-icon{color:#f87171}
.ch-num{font-family:monospace;font-size:.64rem;color:rgba(220,38,38,.5);min-width:26px;flex-shrink:0;transition:color .15s}
.ch-btn.active .ch-num{color:rgba(220,38,38,.75)}
html.dark .ch-btn.active .ch-num{color:rgba(248,113,113,.7)}
.ch-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}
.ch-count{font-family:monospace;font-size:.5rem;background:rgba(220,38,38,.1);color:rgba(180,60,30,.7);
border-radius:4px;padding:1px 5px;flex-shrink:0;line-height:1.6}
.ch-btn.active .ch-count{background:rgba(220,38,38,.18);color:var(--pri)}
html.dark .ch-count{background:rgba(220,38,38,.15);color:rgba(248,113,113,.6)}
.sb-divider{height:1px;background:var(--border);margin:6px 10px}
/* ═══════════ КОНТЕНТ ═══════════ */
.content-area{max-width:820px;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}}
/* ═══════════ ТАБЫ (legacy — скрыть) ═══════════ */
.tab-wrap{display:none!important}
#miniToc{display:none!important}
.chapter-prog{display:none!important}
.top-bar{display:none!important}
.tab{padding:7px 13px;border:2px solid var(--border);border-radius:9px;font-size:.73rem;font-weight:700;
cursor:pointer;white-space:nowrap;background:var(--card);color:var(--muted);transition:.16s;flex-shrink:0}
.tab:hover{border-color:var(--pri);color:var(--pri)}
.tab.active{background:var(--pri);color:#fff;border-color:var(--pri)}
/* ═══════════ АДАПТИВНОСТЬ ═══════════ */
@media(max-width:768px){
.page-layout{grid-template-columns:1fr;overflow:visible}
.sidebar{position:static;height:auto;overflow-y:visible;border-right:none;
border-bottom:1px solid var(--border)}
.sidebar .sb-nav{flex-direction:row;flex-wrap:nowrap;overflow-x:auto;padding:6px 8px;gap:2px;
scrollbar-width:none}
.sidebar .sb-nav::-webkit-scrollbar{display:none}
.sidebar .ch-btn{border-left:none!important;border-bottom:2.5px solid transparent;
border-radius:0;padding:9px 12px;white-space:nowrap;width:auto;flex-shrink:0}
.sidebar .ch-btn:hover{border-bottom-color:rgba(220,38,38,.3);background:rgba(220,38,38,.05)}
.sidebar .ch-btn.active{border-left:none!important;border-bottom-color:var(--pri)!important;
background:transparent;color:var(--pri)}
.sidebar .ch-num,.sidebar .ch-count,.sidebar .ch-icon{display:none}
.hdr h1{font-size:1.1rem}
}
/* ═══════════ 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-1{background:linear-gradient(135deg,#dc2626,#f97316)}
.ph-2{background:linear-gradient(135deg,#ea580c,#fbbf24)}
.ph-3{background:linear-gradient(135deg,#d97706,#fef08a);color:#1c1917}
.ph-4{background:linear-gradient(135deg,#0891b2,#67e8f9);color:#1c1917}
.ph-5{background:linear-gradient(135deg,#ca8a04,#fde047);color:#1c1917}
.ph-6{background:linear-gradient(135deg,#16a34a,#86efac);color:#1c1917}
.ph-7{background:linear-gradient(135deg,#b45309,#fb923c)}
.ph-8{background:linear-gradient(135deg,#1d4ed8,#93c5fd)}
.ph-9{background:linear-gradient(135deg,#4f46e5,#a5b4fc)}
.ph-10{background:linear-gradient(135deg,#0284c7,#7dd3fc)}
.ph-11{background:linear-gradient(135deg,#7c3aed,#c4b5fd)}
/* ═══════════ ТЕОРИЯ ═══════════ */
.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(220,38,38,.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(220,38,38,.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(220,38,38,.06);border-radius:8px;margin:8px 0}
html.dark .formula-box .main-f{background:rgba(220,38,38,.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(220,38,38,.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(220,38,38,.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}
/* ═══════════ СПРАВОЧНИК (таблицы в popup) ═══════════ */
.ref-tbl{width:100%;border-collapse:collapse;font-size:.78rem;margin:4px 0 10px}
.ref-tbl td,.ref-tbl th{padding:4px 8px;border:1px solid var(--border)}
.ref-tbl tr:nth-child(odd) td{background:rgba(220,38,38,.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(220,38,38,.1)}
.fcard.highlight{border-color:var(--pri);background:linear-gradient(135deg,rgba(220,38,38,.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(220,38,38,.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(220,38,38,.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(220,38,38,.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(220,38,38,.06),rgba(220,38,38,.03));border:2px solid rgba(220,38,38,.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(220,38,38,.4);background:rgba(220,38,38,.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(220,38,38,.07),rgba(249,115,22,.04));border:2px solid rgba(220,38,38,.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(249,115,22,.08),transparent 60%),radial-gradient(900px 500px at -10% 30%,rgba(220,38,38,.06),transparent 55%),var(--bg);min-height:100vh}
html.dark body{background:radial-gradient(1200px 600px at 80% -10%,rgba(220,38,38,.18),transparent 60%),radial-gradient(900px 500px at -10% 30%,rgba(249,115,22,.10),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-3 h2,.ph-4 h2,.ph-5 h2,.ph-6 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(220,38,38,.08)}
/* ── A2. Para-hero v2: SVG-узор + параллакс + glow ── */
.para-hero{box-shadow:var(--shadow-lg),0 0 50px rgba(220,38,38,.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-3 .ph-badge,.ph-4 .ph-badge,.ph-5 .ph-badge,.ph-6 .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(220,38,38,.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(220,38,38,.3)}
.btn-pri:hover{box-shadow:0 6px 20px rgba(220,38,38,.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 ── */
.tab{transition:transform var(--dur-1) var(--ease),border-color var(--dur-1) var(--ease),background var(--dur-2) var(--ease),color var(--dur-2) var(--ease);position:relative}
.tab:hover{transform:translateY(-1px)}
.tab.active{box-shadow:0 4px 14px rgba(220,38,38,.32)}
.tab.active::after{content:'';position:absolute;left:50%;bottom:-9px;width:6px;height:6px;background:var(--pri);border-radius:50%;transform:translateX(-50%);box-shadow:0 0 8px var(--pri)}
/* 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(220,38,38,.3)}
/* ── Nav-dots v2: пульс активного ── */
/* ═══════════ KEY POINTS (ГЛАВНОЕ) ═══════════ */
.key-points{background:rgba(220,38,38,.08);border-left:4px solid var(--pri);padding:16px;margin:24px 0;border-radius:8px}
html.dark .key-points{background:rgba(220,38,38,.12)}
.key-points-title{font-weight:800;font-size:.9rem;color:var(--pri);margin-bottom:12px;display:flex;align-items:center;gap:7px}
.key-points-list{list-style:none;padding:0;margin:0}
.key-points-list li{font-size:.88rem;color:var(--text);line-height:1.6;padding-left:24px;position:relative;margin-bottom:8px}
.key-points-list li::before{content:'✓';position:absolute;left:0;color:var(--pri);font-weight:800}
/* ═══════════ REF-PANEL TABS ═══════════ */
.ref-tabs{display:flex;gap:0;border-bottom:2px solid var(--border);margin-bottom:16px}
.ref-tab-btn{flex:1;padding:10px 12px;border:none;background:transparent;cursor:pointer;font-size:.76rem;font-weight:700;color:var(--muted);transition:.18s;border-bottom:2px solid transparent;margin-bottom:-2px}
.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 в ref-panel */
.ref-formula-table{width:100%;font-size:.75rem;margin:8px 0;border-collapse:collapse;max-height:65vh;overflow-y:auto}
.ref-formula-table th,.ref-formula-table td{padding:8px 10px;border:1px solid var(--border);text-align:left}
.ref-formula-table th{background:rgba(220,38,38,.08);font-weight:700;color:var(--pri);position:sticky;top:0;z-index:1}
.ref-formula-table tr:nth-child(odd) td{background:rgba(220,38,38,.04)}
.ref-formula-table tr:nth-child(even) td{background:var(--card)}
/* Mobile: formulas as accordion */
@media(max-width:768px){
.ref-formula-table{max-height:none}
}
.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(220,38,38,.18),0 4px 12px rgba(220,38,38,.3);animation:dotPulse 2.4s ease-in-out infinite}
@keyframes dotPulse{0%,100%{box-shadow:0 0 0 4px rgba(220,38,38,.18),0 4px 12px rgba(220,38,38,.3)}50%{box-shadow:0 0 0 7px rgba(220,38,38,.08),0 4px 14px rgba(220,38,38,.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(220,38,38,.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(220,38,38,.1);color:var(--pri-700);font-weight:800;font-family:monospace;font-size:.78rem;border:1px solid rgba(220,38,38,.2);transition:all var(--dur-1) var(--ease)}
html.dark .val-chip{color:var(--pri-300);background:rgba(220,38,38,.18);border-color:rgba(220,38,38,.3)}
/* ── mini-TOC — не используется в новом layout ── */
#miniToc{display:none!important}
/* ── chapter-prog — не используется в новом layout ── */
.chapter-prog{display:none!important}
.top-bar{display:none!important}
/* ── Скролл — плавный ── */
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}
/* ── Wide layout: content-area без отступа (sidebar в grid) ── */
@media(min-width:1180px){
.content-area{padding-left:0}
}
/* ── 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)}
/* ── Tab v2: совместимость с активным ch-btn ── */
.ch-btn.active{box-shadow:none}
/* Ref-toggle глоу */
.ref-toggle{transition:transform var(--dur-2) var(--ease-bounce),box-shadow var(--dur-2) var(--ease)}
</style>
</head>
<body>
<!-- Floating buttons -->
<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-fire"></i></button>
<!-- Справочник: popup-карточка -->
<div class="ref-panel" id="refPanel">
<!-- Вкладки -->
<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 class="rf">$Q = cm\Delta t$ &nbsp;— §6 нагрев</div>
<div class="rf">$Q = qm$ &nbsp;— §7 сгорание</div>
<div class="rf">$Q = \lambda m$ &nbsp;— §9 плавление</div>
<div class="rf">$Q = Lm$ &nbsp;— §11 кипение</div>
<div class="rf">$Q_{\text{отд}} = Q_{\text{погл}}$ &nbsp;— тепловой баланс</div>
<h3>Уд. теплоёмкость <i>c</i>, Дж/(кг·°C)</h3>
<table class="ref-tbl">
<tr><td>Вода</td><td><b>4200</b></td><td>Алюминий</td><td>900</td></tr>
<tr><td>Лёд</td><td>2090</td><td>Железо/сталь</td><td>460</td></tr>
<tr><td>Стекло</td><td>840</td><td>Медь</td><td>385</td></tr>
<tr><td>Серебро</td><td>235</td><td>Свинец</td><td>128</td></tr>
</table>
<h3>Уд. теплота сгорания <i>q</i>, МДж/кг</h3>
<table class="ref-tbl">
<tr><td>Водород</td><td><b>120</b></td><td>Бензин</td><td>47</td></tr>
<tr><td>Газ природный</td><td>44</td><td>Дизель</td><td>43</td></tr>
<tr><td>Кокс</td><td>30</td><td>Уголь кам.</td><td>27</td></tr>
<tr><td>Торф</td><td>19</td><td>Дрова</td><td>10</td></tr>
</table>
<h3>Теплота плавления <i>λ</i>, кДж/кг · t<sub>пл</sub>, °C</h3>
<table class="ref-tbl">
<tr><td>Вода (лёд)</td><td><b>333</b></td><td>0°C</td></tr>
<tr><td>Алюминий</td><td>390</td><td>660°C</td></tr>
<tr><td>Железо</td><td>270</td><td>1539°C</td></tr>
<tr><td>Медь</td><td>205</td><td>1084°C</td></tr>
<tr><td>Серебро</td><td>88</td><td>962°C</td></tr>
<tr><td>Свинец</td><td>25</td><td>327°C</td></tr>
</table>
<h3>Теплота парообразования <i>L</i>, кДж/кг · t<sub>кип</sub>, °C</h3>
<table class="ref-tbl">
<tr><td>Вода</td><td><b>2260</b></td><td>100°C</td></tr>
<tr><td>Спирт этил.</td><td>857</td><td>78°C</td></tr>
<tr><td>Ацетон</td><td>520</td><td>56°C</td></tr>
<tr><td>Ртуть</td><td>285</td><td>357°C</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="ref-formula-table">
<thead>
<tr><th>§</th><th>Формула</th><th>Описание</th><th>Единицы</th></tr>
</thead>
<tbody>
<tr><td>§6</td><td>$Q = cm\Delta t$</td><td>Количество теплоты при нагреве/охлаждении</td><td>Дж</td></tr>
<tr><td>§6</td><td>$Q_{\text{отд}} = Q_{\text{погл}}$</td><td>Тепловой баланс (изолированная система)</td><td>Дж</td></tr>
<tr><td>§6</td><td>$c = \frac{Q}{m\Delta t}$</td><td>Удельная теплоёмкость</td><td>Дж/(кг·°C)</td></tr>
<tr><td>§7</td><td>$Q = qm$</td><td>Теплота при полном сгорании топлива</td><td>Дж</td></tr>
<tr><td>§7</td><td>$\eta = \frac{Q_\text{п}}{Q_\text{з}}\cdot100\%$</td><td>КПД нагревательного устройства</td><td>%</td></tr>
<tr><td>§9</td><td>$Q = \lambda m$</td><td>Теплота плавления/кристаллизации</td><td>Дж</td></tr>
<tr><td>§11</td><td>$Q = Lm$</td><td>Теплота парообразования/конденсации</td><td>Дж</td></tr>
<tr><td>§111</td><td>$\Delta U = Q + A$</td><td>Изменение внутренней энергии</td><td>Дж</td></tr>
</tbody>
</table>
</div>
<div style="margin-top:10px">
<h3>Удельные теплоёмкости <i>c</i>, Дж/(кг·°C)</h3>
<table class="ref-tbl">
<tr><td>Вода</td><td><b>4200</b></td><td>Алюминий</td><td>900</td></tr>
<tr><td>Лёд</td><td>2090</td><td>Железо</td><td>460</td></tr>
<tr><td>Медь</td><td>385</td><td>Свинец</td><td>128</td></tr>
</table>
<h3>Теплота плавления λ, кДж/кг</h3>
<table class="ref-tbl">
<tr><td>Лёд</td><td><b>333</b></td><td>Алюминий</td><td>390</td></tr>
<tr><td>Железо</td><td>270</td><td>Медь</td><td>205</td></tr>
</table>
<h3>Теплота парообразования L, кДж/кг</h3>
<table class="ref-tbl">
<tr><td>Вода</td><td><b>2260</b></td><td>Спирт</td><td>857</td></tr>
<tr><td>Ацетон</td><td>520</td><td>Ртуть</td><td>285</td></tr>
</table>
</div>
</div>
<!-- Вкладка: Задачи -->
<div class="ref-tab-content" id="reftab-tasks">
<div style="font-size:.72rem;color:var(--muted);margin-bottom:10px">Быстрый переход к задачам параграфа</div>
<div style="display:flex;flex-direction:column;gap:4px">
<button class="btn btn-ghost" onclick="switchTab('tasks');setParaTab('p1');document.getElementById('refPanel').classList.remove('show')" style="font-size:.72rem;text-align:left;padding:7px 10px">§1 Внутренняя энергия</button>
<button class="btn btn-ghost" onclick="switchTab('tasks');setParaTab('p2');document.getElementById('refPanel').classList.remove('show')" style="font-size:.72rem;text-align:left;padding:7px 10px">§2 Способы изменения U</button>
<button class="btn btn-ghost" onclick="switchTab('tasks');setParaTab('p3');document.getElementById('refPanel').classList.remove('show')" style="font-size:.72rem;text-align:left;padding:7px 10px">§3 Теплопроводность</button>
<button class="btn btn-ghost" onclick="switchTab('tasks');setParaTab('p4');document.getElementById('refPanel').classList.remove('show')" style="font-size:.72rem;text-align:left;padding:7px 10px">§4 Конвекция</button>
<button class="btn btn-ghost" onclick="switchTab('tasks');setParaTab('p5');document.getElementById('refPanel').classList.remove('show')" style="font-size:.72rem;text-align:left;padding:7px 10px">§5 Излучение</button>
<button class="btn btn-ghost" onclick="switchTab('tasks');setParaTab('p6');document.getElementById('refPanel').classList.remove('show')" style="font-size:.72rem;text-align:left;padding:7px 10px">§6 Удельная теплоёмкость</button>
<button class="btn btn-ghost" onclick="switchTab('tasks');setParaTab('p7');document.getElementById('refPanel').classList.remove('show')" style="font-size:.72rem;text-align:left;padding:7px 10px">§7 Горение</button>
<button class="btn btn-ghost" onclick="switchTab('tasks');setParaTab('p8');document.getElementById('refPanel').classList.remove('show')" style="font-size:.72rem;text-align:left;padding:7px 10px">§8 Плавление</button>
<button class="btn btn-ghost" onclick="switchTab('tasks');setParaTab('p9');document.getElementById('refPanel').classList.remove('show')" style="font-size:.72rem;text-align:left;padding:7px 10px">§9 Теплота плавления</button>
<button class="btn btn-ghost" onclick="switchTab('tasks');setParaTab('p10');document.getElementById('refPanel').classList.remove('show')" style="font-size:.72rem;text-align:left;padding:7px 10px">§10 Испарение</button>
<button class="btn btn-ghost" onclick="switchTab('tasks');setParaTab('p11');document.getElementById('refPanel').classList.remove('show')" style="font-size:.72rem;text-align:left;padding:7px 10px">§11 Кипение</button>
</div>
</div>
</div>
<!-- Шапка -->
<div class="hdr">
<h1><i class="fas fa-fire"></i> Физика 8 — Тепловые явления</h1>
<p>Внутренняя энергия · Теплопередача · Тепловые расчёты · Фазовые переходы</p>
</div>
<!-- Двухколоночный layout -->
<div class="page-layout">
<!-- Боковая панель -->
<aside class="sidebar">
<div class="sb-brand">
<svg class="sb-logo" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 2C8 8 5 11 5 15a7 7 0 0014 0c0-4-3-7-7-13z"/>
<path d="M9 15c0-2 1.5-3.5 3-5 1.5 1.5 3 3 3 5a3 3 0 01-6 0z" fill="currentColor" opacity=".3"/>
</svg>
<div>
<span class="sb-title">Физика 8</span>
<span class="sb-sub">Тепловые явления</span>
</div>
</div>
<nav class="sb-nav">
<button class="ch-btn active" data-tab="ref1">
<svg class="ch-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><circle cx="10" cy="10" r="3" fill="currentColor" opacity=".3"/><path d="M10 4v2M10 14v2M4 10h2M14 10h2"/></svg>
<span class="ch-num">§1</span>
<span class="ch-label">Внутренняя энергия</span>
<span class="ch-count">7</span>
</button>
<button class="ch-btn" data-tab="ref2">
<svg class="ch-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M4 16l4-8 4 8"/><path d="M14 8c1.5 0 3 1 3 4s-1.5 4-3 4"/></svg>
<span class="ch-num">§2</span>
<span class="ch-label">Изменение энергии</span>
<span class="ch-count">6</span>
</button>
<button class="ch-btn" data-tab="ref3">
<svg class="ch-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M3 10h14"/><circle cx="6" cy="10" r="2.5"/><circle cx="14" cy="10" r="2.5"/></svg>
<span class="ch-num">§3</span>
<span class="ch-label">Теплопроводность</span>
<span class="ch-count">6</span>
</button>
<button class="ch-btn" data-tab="ref4">
<svg class="ch-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M10 16V8"/><path d="M6 12l4-8 4 8"/><path d="M5 17h10"/></svg>
<span class="ch-num">§4</span>
<span class="ch-label">Конвекция</span>
<span class="ch-count">5</span>
</button>
<button class="ch-btn" data-tab="ref5">
<svg class="ch-icon" 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 3v1.5M10 15.5V17M3 10h1.5M15.5 10H17M5.6 5.6l1 1M13.4 13.4l1 1M14.4 5.6l-1 1M6.6 13.4l-1 1"/></svg>
<span class="ch-num">§5</span>
<span class="ch-label">Излучение</span>
<span class="ch-count">5</span>
</button>
<div class="sb-divider"></div>
<button class="ch-btn" data-tab="ref6">
<svg class="ch-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><rect x="3" y="12" width="14" height="5" rx="2"/><path d="M7 12V7a3 3 0 016 0v5"/></svg>
<span class="ch-num">§6</span>
<span class="ch-label">Удельная теплоёмкость</span>
<span class="ch-count">8</span>
</button>
<button class="ch-btn" data-tab="ref7">
<svg class="ch-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M10 17V6"/><path d="M6 10c0-3 4-7 4-7s4 4 4 7a4 4 0 01-8 0z" fill="currentColor" opacity=".25"/></svg>
<span class="ch-num">§7</span>
<span class="ch-label">Теплота сгорания</span>
<span class="ch-count">6</span>
</button>
<button class="ch-btn" data-tab="ref8">
<svg class="ch-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M4 10 Q7 4 10 10 Q13 16 16 10"/><path d="M4 14h12"/></svg>
<span class="ch-num">§8</span>
<span class="ch-label">Плавление</span>
<span class="ch-count">6</span>
</button>
<button class="ch-btn" data-tab="ref9">
<svg class="ch-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M10 17a5 5 0 000-10"/><path d="M10 7V3M7 4.5l3-2 3 2"/></svg>
<span class="ch-num">§9</span>
<span class="ch-label">Теплота плавления</span>
<span class="ch-count">6</span>
</button>
<div class="sb-divider"></div>
<button class="ch-btn" data-tab="ref10">
<svg class="ch-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M4 14 Q8 6 12 10 Q16 14 18 8"/><circle cx="12" cy="10" r="1.5" fill="currentColor"/></svg>
<span class="ch-num">§10</span>
<span class="ch-label">Испарение</span>
<span class="ch-count">5</span>
</button>
<button class="ch-btn" data-tab="ref11">
<svg class="ch-icon" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M5 15 Q7 8 10 12 Q13 8 15 15"/><path d="M3 17h14"/><path d="M10 8V4"/></svg>
<span class="ch-num">§11</span>
<span class="ch-label">Кипение</span>
<span class="ch-count">7</span>
</button>
<div class="sb-divider"></div>
<button class="ch-btn" data-tab="tasks">
<svg class="ch-icon" 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 class="ch-num" style="font-size:.85rem">📝</span>
<span class="ch-label">Задачи</span>
</button>
</nav>
</aside><!-- /.sidebar -->
<!-- Главная колонка -->
<main class="main-col">
<div class="content-area">
<!-- §1 -->
<div class="content active" id="tab-ref1">
<div class="para-hero ph-1">
<div class="ph-label">§1 · Физика 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">🌡 зависит от T и агр. состояния</span>
</div>
</div>
<div class="section-title"><i class="fas fa-atom"></i> §1. Внутренняя энергия тела</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">температура · вещество · агрегатное состояние</div>
<p>↑ Температура → растёт скорость молекул → растёт внутренняя энергия.</p>
<p>Тв.→жид.→газ → растёт (даже при той же температуре!).</p>
<p><b>Не зависит</b> от скорости и высоты тела как целого.</p>
</div>
</div>
<div class="idiag-2col">
<div class="idiag">
<h3>📌 Три агрегатных состояния</h3>
<svg width="100%" viewBox="0 0 200 90" style="display:block">
<text x="30" y="12" font-size="8" text-anchor="middle" fill="#64748b" font-family="sans-serif">Твёрдое</text>
<circle cx="16" cy="30" r="5" fill="#93c5fd" stroke="#1d4ed8" stroke-width="1"/>
<circle cx="30" cy="30" r="5" fill="#93c5fd" stroke="#1d4ed8" stroke-width="1"/>
<circle cx="44" cy="30" r="5" fill="#93c5fd" stroke="#1d4ed8" stroke-width="1"/>
<circle cx="16" cy="44" r="5" fill="#93c5fd" stroke="#1d4ed8" stroke-width="1"/>
<circle cx="30" cy="44" r="5" fill="#93c5fd" stroke="#1d4ed8" stroke-width="1"/>
<circle cx="44" cy="44" r="5" fill="#93c5fd" stroke="#1d4ed8" stroke-width="1"/>
<line x1="16" y1="30" x2="44" y2="30" stroke="#93c5fd" stroke-width="1"/>
<line x1="16" y1="44" x2="44" y2="44" stroke="#93c5fd" stroke-width="1"/>
<line x1="16" y1="30" x2="16" y2="44" stroke="#93c5fd" stroke-width="1"/>
<line x1="30" y1="30" x2="30" y2="44" stroke="#93c5fd" stroke-width="1"/>
<line x1="44" y1="30" x2="44" y2="44" stroke="#93c5fd" stroke-width="1"/>
<text x="30" y="70" font-size="7" text-anchor="middle" fill="#1d4ed8" font-family="sans-serif">низкая</text>
<text x="100" y="12" font-size="8" text-anchor="middle" fill="#64748b" font-family="sans-serif">Жидкое</text>
<circle cx="88" cy="30" r="5" fill="#6ee7b7" stroke="#059669" stroke-width="1"/>
<circle cx="104" cy="28" r="5" fill="#6ee7b7" stroke="#059669" stroke-width="1"/>
<circle cx="116" cy="35" r="5" fill="#6ee7b7" stroke="#059669" stroke-width="1"/>
<circle cx="92" cy="45" r="5" fill="#6ee7b7" stroke="#059669" stroke-width="1"/>
<circle cx="108" cy="43" r="5" fill="#6ee7b7" stroke="#059669" stroke-width="1"/>
<text x="100" y="70" font-size="7" text-anchor="middle" fill="#059669" font-family="sans-serif">средняя</text>
<text x="170" y="12" font-size="8" text-anchor="middle" fill="#64748b" font-family="sans-serif">Газ</text>
<circle cx="155" cy="25" r="4" fill="#fca5a5" stroke="#dc2626" stroke-width="1"/>
<circle cx="175" cy="40" r="4" fill="#fca5a5" stroke="#dc2626" stroke-width="1"/>
<circle cx="162" cy="50" r="4" fill="#fca5a5" stroke="#dc2626" stroke-width="1"/>
<circle cx="183" cy="25" r="4" fill="#fca5a5" stroke="#dc2626" stroke-width="1"/>
<text x="170" y="70" font-size="7" text-anchor="middle" fill="#dc2626" font-family="sans-serif">высокая</text>
</svg>
</div>
<div class="idiag">
<h3>💡 Пример</h3>
<p style="font-size:.84rem;line-height:1.75">Камень, лежащий на земле, <b>не имеет</b> механической энергии ($v=0$, $h=0$).<br>Но его молекулы всё равно движутся и взаимодействуют — <b>внутренняя энергия есть всегда</b>.</p>
<p style="font-size:.84rem;line-height:1.75;margin-top:8px">При нагреве воды её молекулы движутся быстрее — внутренняя энергия растёт. При охлаждении — молекулы замедляются, внутренняя энергия уменьшается.</p>
</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>
</ul>
</div>
<div class="mistakes-box">
<div class="mistakes-box-title"><i class="fas fa-triangle-exclamation"></i> Частые ошибки</div>
<ul>
<li>Путают «тело не имеет механической энергии» с «внутренняя энергия = 0».</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">v=0, h=0 — нет механической, но молекулы движутся → внутренняя энергия есть</div></div>
<div class="life-item"><div class="li-icon">🧊</div><div class="li-title">Лёд при -10°C</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">Высокая 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="student-box">
<div class="student-box-title">💬 Объяснение простыми словами</div>
<p>Представь, что молекулы — крошечные шарики, которые <b>никогда не стоят на месте</b>. Они прыгают, вращаются, сталкиваются — даже в самом холодном веществе. Сумма всей их энергии и есть <b>внутренняя энергия тела</b>.</p>
<p>Нагрел тело — молекулы разогнались → внутренняя энергия выросла. Охладил — замедлились → уменьшилась. Но никогда не стала нулём!</p>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Молекулярное движение</div>
<div class="idiag">
<h3>🎚️ Меняй температуру и агрегатное состояние</h3>
<canvas id="cv1" style="width:100%;height:220px;border-radius:12px;background:#1e1b4b;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:12px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:200px">
<span class="slider-lbl">🌡 Температура:</span>
<input type="range" id="sl1T" min="0" max="200" value="20" style="flex:1;min-width:100px" oninput="lbl1T.textContent=this.value;sl1Tval=+this.value;upd1ChipE();">
<span class="slider-val"><span id="lbl1T">20</span>°C</span>
</div>
<div style="display:flex;gap:8px">
<button class="btn btn-ghost" id="btn1solid" onclick="setState1('solid')">🔷 Твёрдое</button>
<button class="btn btn-ghost" id="btn1liq" onclick="setState1('liquid')">💧 Жидкое</button>
<button class="btn btn-ghost" id="btn1gas" onclick="setState1('gas')">💨 Газ</button>
</div>
</div>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:8px;margin-top:8px;align-items:center">
<span class="slider-lbl">🧪 Вещество:</span>
<button class="btn btn-ghost" id="btn1subH2O" onclick="setSubst1('H2O')" style="font-size:.72rem;padding:6px 11px">💧 H₂O</button>
<button class="btn btn-ghost" id="btn1subFe" onclick="setSubst1('Fe')" style="font-size:.72rem;padding:6px 11px">⚙️ Fe</button>
<button class="btn btn-ghost" id="btn1subAr" onclick="setSubst1('Ar')" style="font-size:.72rem;padding:6px 11px">⚛️ Ar</button>
<span style="margin-left:auto;font-size:.72rem;color:var(--muted)"><span class="val-chip" id="chipKE1">⟨Eₖ⟩ ~ 0</span></span>
</div>
<p style="font-size:.78rem;color:var(--muted);margin-top:8px">Цвет атомов отражает их скорость по Максвелл-Больцману: синие — медленные, красные — быстрые. В газе работают упругие столкновения. Каждое вещество имеет свою массу и температуры фазовых переходов — попробуй сравнить!</p>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §1</div>
<ul class="key-points-list">
<li>Внутренняя энергия — сумма кинетической и потенциальной энергий всех молекул тела, она есть всегда (даже у холодного тела).</li>
<li>Внутренняя энергия растёт при нагреве и при переходе тв.→жид.→газ (даже при той же температуре).</li>
<li>Внутренняя энергия не зависит от скорости и высоты тела как целого — это не то же самое, что механическая энергия.</li>
<li>Единица внутренней энергии — джоуль (Дж).</li>
</ul>
</div>
</div>
<!-- §2 -->
<div class="content" id="tab-ref2">
<div class="para-hero ph-2">
<div class="ph-label">§2 · Физика 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">⚡ Q — количество теплоты, Дж</span>
</div>
</div>
<div class="section-title"><i class="fas fa-bolt"></i> §2. Способы изменения внутренней энергии</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>1. Совершение механической работы</h3>
<div class="main-f" style="font-size:.85rem">трение · сжатие · удар</div>
<p>Трение (пиление, сверление), сжатие газа поршнем, удар — внутренняя энергия тела увеличивается.</p>
<p>Молекулы разгоняются → температура растёт.</p>
<p><b>Пример:</b> натирание рук, нагрев воздуха в насосе при накачивании шины.</p>
</div>
<div class="fcard">
<h3>2. Теплопередача (теплообмен)</h3>
<div class="main-f" style="font-size:.85rem">передача без работы</div>
<p>Изменение внутренней энергии тела без совершения механической работы.</p>
<p><b>Количество теплоты Q</b> — величина, равная изменению внутренней энергии при теплообмене. Единица: <b>Дж</b>.</p>
<p><b>Пример:</b> нагрев воды в чайнике, охлаждение тела в холодильнике.</p>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li><b>Работа:</b> молекулы разгоняются внешней силой → T растёт.</li>
<li><b>Теплообмен:</b> быстрые молекулы передают энергию медленным при контакте.</li>
<li>Оба способа изменяют внутреннюю энергию — результат одинаков, пути разные.</li>
</ul>
</div>
<div class="idiag">
<h3>📊 Два способа изменения внутренней энергии</h3>
<svg viewBox="0 0 320 130" width="100%" style="display:block;margin:4px 0">
<!-- Блок 1: Работа -->
<rect x="4" y="8" width="148" height="114" rx="12" fill="rgba(220,38,38,.06)" stroke="rgba(220,38,38,.35)" stroke-width="1.5"/>
<text x="78" y="25" text-anchor="middle" font-size="9.5" font-weight="bold" fill="#dc2626" font-family="sans-serif">Механическая работа</text>
<rect x="20" y="55" width="60" height="36" rx="5" fill="rgba(220,38,38,.15)" stroke="#dc2626" stroke-width="1.5"/>
<text x="50" y="77" text-anchor="middle" font-size="8" fill="#dc2626" font-family="sans-serif">Газ</text>
<rect x="16" y="48" width="68" height="9" rx="3" fill="#dc2626"/>
<text x="52" y="44" text-anchor="middle" font-size="7" fill="#dc2626" font-family="sans-serif">↓ поршень давит</text>
<text x="100" y="62" font-size="7.5" fill="#64748b" font-family="sans-serif">• трение</text>
<text x="100" y="74" font-size="7.5" fill="#64748b" font-family="sans-serif">• сжатие газа</text>
<text x="100" y="86" font-size="7.5" fill="#64748b" font-family="sans-serif">• удар</text>
<text x="78" y="112" text-anchor="middle" font-size="7" fill="#dc2626" font-family="sans-serif">внешняя сила → молекулы↑</text>
<!-- Блок 2: Теплообмен -->
<rect x="168" y="8" width="148" height="114" rx="12" fill="rgba(14,165,233,.06)" stroke="rgba(14,165,233,.4)" stroke-width="1.5"/>
<text x="242" y="25" text-anchor="middle" font-size="9.5" font-weight="bold" fill="#0369a1" font-family="sans-serif">Теплопередача</text>
<circle cx="200" cy="73" r="22" fill="rgba(239,68,68,.12)" stroke="#ef4444" stroke-width="1.5"/>
<text x="200" y="77" text-anchor="middle" font-size="7.5" fill="#ef4444" font-family="sans-serif">горячее</text>
<line x1="225" y1="73" x2="248" y2="73" stroke="#f97316" stroke-width="2"/>
<polygon points="249,73 244,70 244,76" fill="#f97316"/>
<circle cx="268" cy="73" r="18" fill="rgba(59,130,246,.12)" stroke="#3b82f6" stroke-width="1.5"/>
<text x="268" y="77" text-anchor="middle" font-size="7.5" fill="#3b82f6" font-family="sans-serif">холод.</text>
<text x="242" y="112" text-anchor="middle" font-size="7" fill="#0369a1" font-family="sans-serif">без внешней силы · Q = Дж</text>
</svg>
</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>🔨 Работа vs 🌡 Теплообмен</h3>
<canvas id="cv2" style="width:100%;height:220px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:12px;margin-top:12px;align-items:center">
<button class="btn btn-pri" id="btn2work" onclick="startWork2()">🔨 Сжать газ (работа)</button>
<button class="btn btn-ghost" id="btn2heat" onclick="startHeat2()">🌡 Нагреть снаружи (теплообмен)</button>
<button class="btn btn-ghost" onclick="reset2()">↺ Сброс</button>
</div>
<p style="font-size:.78rem;color:var(--muted);margin-top:8px">Слева — сжатие поршнем (механическая работа). Справа — нагрев стенки (теплопередача). Оба способа увеличивают внутреннюю энергию газа.</p>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §2</div>
<ul class="key-points-list">
<li>Изменить внутреннюю энергию можно двумя способами: совершив механическую работу или через теплопередачу.</li>
<li>Механическая работа: трение, сжатие, удар — молекулы разгоняются внешней силой.</li>
<li>Теплопередача: быстрые молекулы передают энергию медленным при контакте — без приложения внешней силы.</li>
<li>Количество теплоты Q — величина изменения внутренней энергии при теплообмене; единица — Дж.</li>
</ul>
</div>
</div>
<!-- §3 -->
<div class="content" id="tab-ref3">
<div class="para-hero ph-3">
<div class="ph-label">§3 · Физика 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-fire-flame-curved"></i> §3. Теплопроводность</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Механизм</h3>
<div class="main-f">столкновения молекул</div>
<p>Тепло передаётся через столкновения молекул от горячих к холодным участкам. <b>Перенос вещества не происходит.</b></p>
</div>
<div class="fcard">
<h3>Сравнение материалов</h3>
<div class="main-f">Металлы ≫ Стекло ≫ Дерево ≫ Газы</div>
<p>Металлы: свободные электроны переносят энергию быстро. Газы: молекулы редко сталкиваются → плохие проводники.</p>
<p>В <b>вакууме</b> теплопроводность невозможна.</p>
</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> (молекулы редко сталкиваются). Воздух — теплоизолятор.</li>
<li>Процесс продолжается до <b>выравнивания температур</b> по всему телу.</li>
</ul>
</div>
<div class="idiag">
<h3>📊 Сравнение теплопроводности материалов</h3>
<table style="width:100%;border-collapse:collapse;font-size:.8rem">
<thead><tr style="background:rgba(220,38,38,.08)"><th style="padding:6px 8px;text-align:left;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;color:#dc2626;font-weight:700">★★★★★</td><td style="padding:5px 8px;border:1px solid var(--border)">Радиаторы, кастрюли</td></tr>
<tr style="background:rgba(220,38,38,.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;color:#dc2626;font-weight:700">★★★★☆</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;color:#0369a1;font-weight:700">★★☆☆☆</td><td style="padding:5px 8px;border:1px solid var(--border)">Ручки посуды, мебель</td></tr>
<tr style="background:rgba(220,38,38,.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;color:#059669;font-weight:700">★☆☆☆☆</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;color:#059669;font-weight:700">✗ нет</td><td style="padding:5px 8px;border:1px solid var(--border)">Термос (двойные стенки)</td></tr>
</table>
</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="cv3" style="width:100%;height:180px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:12px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:200px">
<span class="slider-lbl">Материал:</span>
<select id="sel3mat" onchange="upd3()" style="padding:6px 10px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text);font-size:.85rem">
<option value="0.95">🟤 Медь (высокая)</option>
<option value="0.6">⚙️ Алюминий (хорошая)</option>
<option value="0.3">🔩 Сталь (средняя)</option>
<option value="0.08">🪵 Дерево (низкая)</option>
<option value="0.02">🫧 Воздух (очень низкая)</option>
</select>
</div>
<button class="btn btn-pri" onclick="runAnim3()">▶ Запустить нагрев</button>
<button class="btn btn-ghost" onclick="resetAnim3()">↺ Сброс</button>
</div>
<p style="font-size:.78rem;color:var(--muted);margin-top:8px">Левый конец стержня нагревается (красный). Тепловая волна распространяется вправо. Скорость зависит от материала.</p>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §3</div>
<ul class="key-points-list">
<li>Теплопроводность — передача тепла от молекулы к молекуле без переноса вещества (через столкновения).</li>
<li>Металлы — лучшие проводники (свободные электроны), газы — плохие (молекулы редко сталкиваются).</li>
<li>В вакууме теплопроводность невозможна — нет молекул.</li>
<li>Теплообмен идёт до выравнивания температур по всему телу.</li>
<li>Практика: металлическая ложка нагревается в чае, деревянная ручка остаётся холодной.</li>
</ul>
</div>
</div>
<!-- §4 -->
<div class="content" id="tab-ref4">
<div class="para-hero ph-4">
<div class="ph-label">§4 · Физика 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-water"></i> §4. Конвекция</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Механизм конвекции</h3>
<div class="main-f">нагрев → ↑плотность↓ → поток</div>
<p>Нагретые слои жидкости/газа становятся <b>менее плотными</b> → поднимаются вверх. Холодные — опускаются вниз.</p>
</div>
<div class="fcard">
<h3>Виды конвекции</h3>
<div class="main-f">естественная / принудительная</div>
<p><b>Естественная:</b> от разности плотностей (батарея, бриз).</p>
<p><b>Принудительная:</b> насос, вентилятор.</p>
<p>В <b>твёрдых телах</b> — невозможна.</p>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Тёплые слои — <b>вверх</b>, холодные — <b>вниз</b> → циркуляция.</li>
<li>В твёрдых телах конвекции нет — молекулы не могут свободно перемещаться.</li>
<li>Примеры: батарея отопления, морские бризы, конвекция в кипящей воде.</li>
</ul>
</div>
<div class="idiag">
<h3>🌀 Схема конвекционного потока</h3>
<svg viewBox="0 0 280 130" width="100%" style="display:block">
<!-- Container -->
<rect x="20" y="10" width="240" height="100" rx="8" fill="rgba(8,145,178,.06)" stroke="#0891b2" stroke-width="1.5"/>
<!-- Hot bottom -->
<rect x="20" y="100" width="240" height="10" rx="0" fill="rgba(239,68,68,.4)"/>
<text x="140" y="122" text-anchor="middle" font-size="8" fill="#dc2626" font-family="sans-serif">🔥 Нагреватель</text>
<!-- Upward hot flow (left) -->
<line x1="60" y1="95" x2="60" y2="25" stroke="#ef4444" stroke-width="2" stroke-dasharray="4,2"/>
<polygon points="60,22 56,30 64,30" fill="#ef4444"/>
<text x="40" y="55" font-size="7.5" fill="#ef4444" font-family="sans-serif">горячее</text>
<text x="40" y="65" font-size="7.5" fill="#ef4444" font-family="sans-serif">подним.</text>
<!-- Top horizontal -->
<line x1="60" y1="25" x2="220" y2="25" stroke="#94a3b8" stroke-width="1.5" stroke-dasharray="4,2"/>
<polygon points="223,25 216,22 216,28" fill="#94a3b8"/>
<!-- Downward cold flow (right) -->
<line x1="220" y1="25" x2="220" y2="95" stroke="#3b82f6" stroke-width="2" stroke-dasharray="4,2"/>
<polygon points="220,97 216,89 224,89" fill="#3b82f6"/>
<text x="230" y="55" font-size="7.5" fill="#3b82f6" font-family="sans-serif">холодное</text>
<text x="230" y="65" font-size="7.5" fill="#3b82f6" font-family="sans-serif">опускается</text>
<!-- Bottom horizontal -->
<line x1="220" y1="95" x2="60" y2="95" stroke="#94a3b8" stroke-width="1.5" stroke-dasharray="4,2"/>
<polygon points="57,95 64,92 64,98" fill="#94a3b8"/>
<!-- Center label -->
<text x="140" y="60" text-anchor="middle" font-size="8.5" fill="#0891b2" font-family="sans-serif" font-weight="bold">циркуляция</text>
<circle cx="140" cy="70" r="4" fill="#0891b2" opacity="0.4"/>
</svg>
</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>
<div style="display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px">
<button class="btn btn-ghost" id="btn4mCond" onclick="setMode4('cond')" style="font-size:.74rem;padding:7px 12px">📏 Теплопроводность</button>
<button class="btn btn-ghost" id="btn4mConv" onclick="setMode4('conv')" style="font-size:.74rem;padding:7px 12px">🌪️ Конвекция</button>
<button class="btn btn-ghost" id="btn4mRad" onclick="setMode4('rad')" style="font-size:.74rem;padding:7px 12px">📡 Излучение</button>
</div>
<canvas id="cv4" style="width:100%;height:260px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:12px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:200px">
<span class="slider-lbl">🔥 Мощность:</span>
<input type="range" id="sl4p" min="10" max="100" value="50" style="flex:1;min-width:100px" oninput="lbl4p.textContent=this.value;sl4pval=+this.value;">
<span class="slider-val"><span id="lbl4p">50</span>%</span>
</div>
<span class="val-chip" id="chip4info">конвекция · 50%</span>
</div>
<p class="cv-cap" id="cap4"><i class="fas fa-info-circle"></i><span>Нагретые частицы (красные) у дна поднимаются вверх, охлаждаются и опускаются — циркуляция переносит тепло вместе с веществом.</span></p>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §4</div>
<ul class="key-points-list">
<li>Конвекция — теплопередача потоками жидкости или газа: тёплые слои поднимаются, холодные опускаются.</li>
<li>В твёрдых телах конвекция невозможна — молекулы не могут свободно перемещаться.</li>
<li>Естественная конвекция — за счёт разности плотностей; принудительная — насос или вентилятор.</li>
<li>Примеры: батарея отопления, морской бриз, кипение воды в кастрюле.</li>
</ul>
</div>
</div>
<!-- §5 -->
<div class="content" id="tab-ref5">
<div class="para-hero ph-5">
<div class="ph-label">§5 · Физика 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">⚫ чёрное &gt; белого</span>
</div>
</div>
<div class="section-title"><i class="fas fa-sun"></i> §5. Излучение</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Тепловое излучение</h3>
<div class="main-f">ЭМ-волны → вакуум ✓</div>
<p>Любое тело с T &gt; 0 К испускает электромагнитные волны. <b>Не требует среды</b> — работает в вакууме.</p>
<p>Чем выше T — тем интенсивнее излучение.</p>
</div>
<div class="fcard">
<h3>Поглощение и отражение</h3>
<div class="main-f">⚫ поглощает ≫ ⚪ отражает</div>
<p><b>Тёмные матовые:</b> лучший поглотитель и излучатель.</p>
<p><b>Светлые блестящие:</b> хуже поглощают, лучше отражают.</p>
<p>Примеры: термос, солнечный нагрев Земли, тепловизор.</p>
</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>
</ul>
</div>
<div class="idiag">
<h3>📊 Поглощение и излучение разных поверхностей</h3>
<table style="width:100%;border-collapse:collapse;font-size:.8rem">
<thead><tr style="background:rgba(220,38,38,.08)"><th style="padding:6px 8px;text-align:left;border:1px solid var(--border)">Поверхность</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;color:#dc2626;font-weight:700">★★★★★</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center;color:#dc2626;font-weight:700">★★★★★</td><td style="padding:5px 8px;border:1px solid var(--border)">Солнечные коллекторы</td></tr>
<tr style="background:rgba(220,38,38,.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;color:#0369a1;font-weight:700">★★☆☆☆</td><td style="padding:5px 8px;border:1px solid var(--border);text-align:center;color:#0369a1;font-weight:700">★★☆☆☆</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;color:#059669;font-weight:700">★☆☆☆☆</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)">Термос, скафандр</td></tr>
</table>
</div>
<div class="insight-box">
<div class="insight-title"><i class="fas fa-lightbulb"></i> Интересный факт</div>
<p>Тепловизор «видит» именно тепловое излучение. Именно поэтому в темноте можно обнаружить тёплый предмет — он сам светится в инфракрасном диапазоне. Тело человека излучает так же, как электрическая плитка мощностью около 100 Вт!</p>
</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="cv5" style="width:100%;height:240px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:12px;margin-top:12px;align-items:center">
<div class="slider-row" style="flex:1;min-width:200px">
<span class="slider-lbl">🌡 T источника:</span>
<input type="range" id="sl5T" min="100" max="1000" value="500" style="flex:1;min-width:100px" oninput="lbl5T.textContent=this.value;sl5Tval=+this.value;upd5();">
<span class="slider-val"><span id="lbl5T">500</span>°C</span>
</div>
</div>
<p style="font-size:.78rem;color:var(--muted);margin-top:8px">Источник тепла слева испускает волны. Три поверхности (чёрная / серая / серебристая) поглощают их с разной эффективностью и нагреваются.</p>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §5</div>
<ul class="key-points-list">
<li>Излучение — передача тепла электромагнитными волнами, не требует вещества — работает в вакууме.</li>
<li>Любое тело с температурой выше 0 К испускает тепловое излучение; чем выше T, тем интенсивнее.</li>
<li>Тёмная матовая поверхность — лучший поглотитель и излучатель; светлая блестящая — хуже поглощает, лучше отражает.</li>
<li>Тело нагревается, если поглощает больше, чем излучает; охлаждается — если наоборот.</li>
</ul>
</div>
</div>
<!-- §6 -->
<div class="content" id="tab-ref6">
<div class="para-hero ph-6">
<div class="ph-label">§6 · Физика 8 кл</div>
<h2>Расчёт количества теплоты. Удельная теплоёмкость</h2>
<div class="ph-formula">$Q = cm\Delta t$</div>
<div class="ph-desc">Количество теплоты прямо пропорционально массе и изменению температуры. Коэффициент c зависит от вещества.</div>
<div class="ph-tags">
<span class="ph-tag">📐 [c] = Дж/(кг·°C)</span>
<span class="ph-tag">💧 c(воды) = 4200</span>
<span class="ph-tag">⚖️ тепловой баланс</span>
</div>
</div>
<div class="section-title"><i class="fas fa-calculator"></i> §6. Удельная теплоёмкость</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Основная формула</h3>
<div class="main-f">$Q = cm(t_2 - t_1)$</div>
<p>$c$ — удельная теплоёмкость [Дж/(кг·°C)], $m$ — масса [кг], $\Delta t$ — изменение температуры [°C].</p>
</div>
<div class="fcard">
<h3>Тепловой баланс</h3>
<div class="main-f">$Q_{\text{отд}} = Q_{\text{погл}}$</div>
<p>$Q \propto m$ и $Q \propto \Delta t$. Вода: $c = 4200$ — самая большая среди обычных жидкостей.</p>
<p>Тепловой баланс: отданная теплота = поглощённой.</p>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>$c$ — свойство <b>вещества</b>, не тела. У воды оно наибольшее.</li>
<li>При остывании $Q$ отрицательное (или пишут $Q = cm(t_1 - t_2)$).</li>
<li>Тепловой баланс работает только в <b>изолированной</b> системе.</li>
</ul>
</div>
<div class="idiag">
<h3>📐 Пример решения: тепловой баланс</h3>
<p style="font-size:.83rem;font-weight:600;margin-bottom:10px">Задача: В стакан воды $m_2 = 2{,}0$ кг при $t_1 = 20$°C бросили стальной брусок $m_1 = 1{,}0$ кг при $t_2 = 95$°C. Найти установившуюся температуру.</p>
<ol class="sol-steps">
<li><span class="step-n">1</span><span>Записываем тепловой баланс: $Q_\text{отд} = Q_\text{погл}$<br>Теплота, отданная бруском = теплота, поглощённой водой</span></li>
<li><span class="step-n">2</span><span>$Q_\text{бр} = c_\text{ст} \cdot m_1 \cdot (t_2 - t) = 460 \times 1{,}0 \times (95 - t)$</span></li>
<li><span class="step-n">3</span><span>$Q_\text{вода} = c_\text{в} \cdot m_2 \cdot (t - t_1) = 4200 \times 2{,}0 \times (t - 20)$</span></li>
<li><span class="step-n">4</span><span>Приравниваем: $460(95-t) = 8400(t-20)$<br>$43700 - 460t = 8400t - 168000$<br>$211700 = 8860t$ → $t \approx 23{,}9$°C</span></li>
</ol>
</div>
<div class="insight-box">
<div class="insight-title"><i class="fas fa-lightbulb"></i> Почему вода «особенная»?</div>
<p>Удельная теплоёмкость воды $c = 4200$ Дж/(кг·°C) — одна из самых высоких. Это значит, что для нагрева 1 кг воды на 1°C нужно <b>в 10 раз больше теплоты</b>, чем для нагрева 1 кг железа. Поэтому море медленно нагревается летом и медленно остывает зимой — оно «хранит» тепло!</p>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Калориметр Pro Max</div>
<div class="idiag">
<h3>⚖️ Смешай два тела разных веществ</h3>
<canvas id="cv6" style="width:100%;height:220px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:14px;margin-top:12px;align-items:flex-start">
<div style="display:flex;flex-direction:column;gap:6px;flex:1;min-width:200px;padding:10px;background:rgba(239,68,68,.06);border-radius:10px;border:1px solid rgba(239,68,68,.2)">
<div style="font-weight:700;color:#dc2626;font-size:.78rem;margin-bottom:4px">🔥 Горячее тело</div>
<div class="slider-row">
<span class="slider-lbl">Вещество:</span>
<select id="sel6mat1" onchange="upd6()" style="flex:1;padding:5px 8px;border-radius:7px;border:1.5px solid var(--border);background:var(--card);color:var(--text);font-size:.8rem">
<option value="4200">💧 Вода (4200)</option>
<option value="460">⚙️ Железо (460)</option>
<option value="2100">🛢️ Масло (2100)</option>
<option value="900">⚪ Алюминий (900)</option>
<option value="385">🟫 Медь (385)</option>
</select>
</div>
<div class="slider-row">
<span class="slider-lbl">m₁, кг:</span>
<input type="range" id="sl6m1" min="0.1" max="3" step="0.1" value="1" style="flex:1" oninput="lbl6m1.textContent=this.value;upd6();">
<span class="slider-val"><span id="lbl6m1">1</span></span>
</div>
<div class="slider-row">
<span class="slider-lbl">T₁:</span>
<input type="range" id="sl6t1" min="40" max="100" value="80" style="flex:1" oninput="lbl6t1.textContent=this.value;upd6();">
<span class="slider-val"><span id="lbl6t1">80</span>°C</span>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:6px;flex:1;min-width:200px;padding:10px;background:rgba(59,130,246,.06);border-radius:10px;border:1px solid rgba(59,130,246,.2)">
<div style="font-weight:700;color:#2563eb;font-size:.78rem;margin-bottom:4px">❄️ Холодное тело</div>
<div class="slider-row">
<span class="slider-lbl">Вещество:</span>
<select id="sel6mat2" onchange="upd6()" style="flex:1;padding:5px 8px;border-radius:7px;border:1.5px solid var(--border);background:var(--card);color:var(--text);font-size:.8rem">
<option value="4200">💧 Вода (4200)</option>
<option value="460">⚙️ Железо (460)</option>
<option value="2100">🛢️ Масло (2100)</option>
<option value="900">⚪ Алюминий (900)</option>
<option value="385">🟫 Медь (385)</option>
</select>
</div>
<div class="slider-row">
<span class="slider-lbl">m₂, кг:</span>
<input type="range" id="sl6m2" min="0.1" max="3" step="0.1" value="1" style="flex:1" oninput="lbl6m2.textContent=this.value;upd6();">
<span class="slider-val"><span id="lbl6m2">1</span></span>
</div>
<div class="slider-row">
<span class="slider-lbl">T₂:</span>
<input type="range" id="sl6t2" min="0" max="40" value="20" style="flex:1" oninput="lbl6t2.textContent=this.value;upd6();">
<span class="slider-val"><span id="lbl6t2">20</span>°C</span>
</div>
</div>
</div>
<div id="cv6result" class="idiag-result" style="text-align:left;font-size:.83rem;line-height:1.7">T_смеси: —</div>
<p class="cv-cap"><i class="fas fa-info-circle"></i><span>Уравнение теплового баланса: $c_1 m_1 (T_1 - T) = c_2 m_2 (T - T_2)$. Поэкспериментируй с разными веществами — увидишь, как масло остывает медленнее воды, а металлы — намного быстрее.</span></p>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §6</div>
<ul class="key-points-list">
<li>Количество теплоты при нагреве/охлаждении: $Q = cm\Delta t$, где $c$ — удельная теплоёмкость [Дж/(кг·°C)].</li>
<li>Удельная теплоёмкость — свойство вещества: у воды $c = 4200$ — самое высокое из обычных жидкостей.</li>
<li>Тепловой баланс: $Q_\text{отд} = Q_\text{погл}$ — работает только в изолированной системе.</li>
<li>При остывании $\Delta t$ отрицательное — Q получается отрицательным или записывают $Q = cm(t_1 - t_2)$.</li>
</ul>
</div>
</div>
<!-- §7 -->
<div class="content" id="tab-ref7">
<div class="para-hero ph-7">
<div class="ph-label">§7 · Физика 8 кл</div>
<h2>Горение. Удельная теплота сгорания топлива</h2>
<div class="ph-formula">$Q = qm$</div>
<div class="ph-desc">При полном сгорании топлива выделяется $Q = qm$. Удельная теплота сгорания $q$ зависит только от вида топлива.</div>
<div class="ph-tags">
<span class="ph-tag">📐 [q] = МДж/кг</span>
<span class="ph-tag">💨 H₂: q = 120 МДж/кг</span>
<span class="ph-tag">🌍 экология</span>
</div>
</div>
<div class="section-title"><i class="fas fa-fire"></i> §7. Удельная теплота сгорания</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Основная формула</h3>
<div class="main-f">$Q = qm$</div>
<p>$q$ — удельная теплота сгорания [МДж/кг], $m$ — масса топлива [кг].</p>
<p>Выделяется при <b>полном</b> сгорании.</p>
</div>
<div class="fcard">
<h3>Значения q, МДж/кг</h3>
<ul>
<li>Дрова: 10</li>
<li>Торф: 19 &nbsp;|&nbsp; Уголь: 27</li>
<li>Бензин: 47 &nbsp;|&nbsp; Газ: 44</li>
<li>Водород: <b>120</b> — рекорд</li>
</ul>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>$q$ — свойство <b>топлива</b>, не зависит от массы.</li>
<li>Водород — самый энергоёмкий, но взрывоопасный. Бензин — наиболее распространён.</li>
<li>КПД реальной печи всегда меньше 100% — часть теплоты теряется.</li>
</ul>
</div>
<div class="idiag">
<h3>📊 Удельная теплота сгорания топлив</h3>
<svg viewBox="0 0 300 140" width="100%" style="display:block">
<!-- Bars -->
<text x="4" y="13" font-size="7.5" fill="#64748b" font-family="sans-serif">МДж/кг</text>
<!-- Водород 120 -->
<rect x="70" y="10" width="216" height="14" rx="3" fill="#ef4444"/>
<text x="68" y="21" text-anchor="end" font-size="7.5" fill="var(--text)" font-family="sans-serif">Водород</text>
<text x="291" y="21" font-size="7.5" fill="#ef4444" font-weight="bold" font-family="sans-serif">120</text>
<!-- Бензин 47 -->
<rect x="70" y="30" width="84.6" height="14" rx="3" fill="#f97316"/>
<text x="68" y="41" text-anchor="end" font-size="7.5" fill="var(--text)" font-family="sans-serif">Бензин</text>
<text x="159" y="41" font-size="7.5" fill="#f97316" font-weight="bold" font-family="sans-serif">47</text>
<!-- Газ 44 -->
<rect x="70" y="50" width="79.2" height="14" rx="3" fill="#f97316" opacity=".8"/>
<text x="68" y="61" text-anchor="end" font-size="7.5" fill="var(--text)" font-family="sans-serif">Природный газ</text>
<text x="154" y="61" font-size="7.5" fill="#ea580c" font-weight="bold" font-family="sans-serif">44</text>
<!-- Уголь 27 -->
<rect x="70" y="70" width="48.6" height="14" rx="3" fill="#78716c"/>
<text x="68" y="81" text-anchor="end" font-size="7.5" fill="var(--text)" font-family="sans-serif">Уголь кам.</text>
<text x="123" y="81" font-size="7.5" fill="#78716c" font-weight="bold" font-family="sans-serif">27</text>
<!-- Торф 19 -->
<rect x="70" y="90" width="34.2" height="14" rx="3" fill="#a16207" opacity=".8"/>
<text x="68" y="101" text-anchor="end" font-size="7.5" fill="var(--text)" font-family="sans-serif">Торф</text>
<text x="109" y="101" font-size="7.5" fill="#a16207" font-weight="bold" font-family="sans-serif">19</text>
<!-- Дрова 10 -->
<rect x="70" y="110" width="18" height="14" rx="3" fill="#92400e" opacity=".8"/>
<text x="68" y="121" text-anchor="end" font-size="7.5" fill="var(--text)" font-family="sans-serif">Дрова</text>
<text x="93" y="121" font-size="7.5" fill="#92400e" font-weight="bold" font-family="sans-serif">10</text>
<!-- Scale -->
<line x1="70" y1="128" x2="290" y2="128" stroke="var(--border)" stroke-width="1"/>
<text x="70" y="137" font-size="6.5" fill="#94a3b8" font-family="sans-serif">0</text>
<text x="160" y="137" font-size="6.5" fill="#94a3b8" font-family="sans-serif">50</text>
<text x="286" y="137" font-size="6.5" fill="#94a3b8" font-family="sans-serif">120</text>
</svg>
</div>
<div class="insight-box">
<div class="insight-title"><i class="fas fa-lightbulb"></i> Водород — топливо будущего</div>
<p>Водород имеет $q = 120$ МДж/кг — в 2,5 раза эффективнее бензина и в 12 раз — дров. При сгорании водорода образуется только <b>вода</b>, никакого CO₂. Именно поэтому водородные двигатели и топливные элементы — одно из ключевых направлений зелёной энергетики.</p>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Виртуальная печь</div>
<div class="idiag">
<h3>🔥 Выбери топливо и рассчитай теплоту</h3>
<canvas id="cv7" style="width:100%;height:200px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:12px;margin-top:12px;align-items:center">
<div style="flex:1;min-width:180px">
<div class="slider-row">
<span class="slider-lbl">Масса топлива:</span>
<input type="range" id="sl7m" min="0.1" max="10" step="0.1" value="2" style="flex:1;margin-top:4px" oninput="lbl7m.textContent=this.value;upd7();">
<span class="slider-val"><span id="lbl7m">2</span> кг</span>
</div>
</div>
<div style="flex:1;min-width:180px">
<select id="sel7fuel" onchange="upd7()" style="width:100%;margin-top:4px;padding:6px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text)">
<option value="10">🪵 Дрова (10 МДж/кг)</option>
<option value="19">🟫 Торф (19 МДж/кг)</option>
<option value="27" selected>⚫ Уголь (27 МДж/кг)</option>
<option value="44">🔵 Газ природный (44 МДж/кг)</option>
<option value="47">🟡 Бензин (47 МДж/кг)</option>
<option value="120">💨 Водород (120 МДж/кг)</option>
</select>
</div>
</div>
<div id="cv7result" class="idiag-result">Q = —</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §7</div>
<ul class="key-points-list">
<li>При полном сгорании топлива выделяется теплота $Q = qm$, где $q$ — удельная теплота сгорания [МДж/кг].</li>
<li>$q$ — свойство вида топлива, не зависит от его массы.</li>
<li>Водород — рекорд ($q = 120$ МДж/кг), бензин — 47, дрова — 10 МДж/кг.</li>
<li>КПД реальной печи всегда меньше 100% — часть теплоты теряется на нагрев окружения.</li>
</ul>
</div>
</div>
<!-- §8 -->
<div class="content" id="tab-ref8">
<div class="para-hero ph-8">
<div class="ph-label">§8 · Физика 8 кл</div>
<h2>Плавление и кристаллизация</h2>
<div class="ph-desc">Плавление — переход тв.→жид. при $T_\text{пл} = \text{const}$. Кристаллизация — обратно. Температура постоянна, пока идёт переход, а внутренняя энергия меняется.</div>
<div class="ph-tags">
<span class="ph-tag">🌡 T = const при переходе</span>
<span class="ph-tag">❄ лёд: 0°C</span>
<span class="ph-tag">🔩 Fe: 1539°C</span>
</div>
</div>
<div class="section-title"><i class="fas fa-snowflake"></i> §8. Плавление и кристаллизация</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Плавление</h3>
<div class="main-f">тв. → жид., $T = \text{const}$</div>
<p>Вся теплота идёт на <b>разрушение кристаллической решётки</b>, а не на разгон молекул. Поэтому T не растёт во время плавления.</p>
</div>
<div class="fcard">
<h3>Температуры плавления</h3>
<ul>
<li>Лёд: 0°C</li>
<li>Свинец: 327°C &nbsp;|&nbsp; Al: 660°C</li>
<li>Медь: 1084°C &nbsp;|&nbsp; Fe: 1539°C</li>
<li>Вольфрам: 3387°C</li>
</ul>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>При плавлении $T = \text{const}$, но $U$ растёт — энергия идёт на разрушение решётки.</li>
<li>Кристаллизация — <b>обратный</b> процесс при той же температуре.</li>
<li>Аморфные тела (стекло, смола) плавятся постепенно — у них нет чёткой $T_\text{пл}$.</li>
</ul>
</div>
<div class="idiag">
<h3>📈 График нагрева вещества (T–t диаграмма)</h3>
<svg viewBox="0 0 280 140" width="100%" style="display:block">
<!-- Axes -->
<line x1="35" y1="10" x2="35" y2="120" stroke="var(--border)" stroke-width="1.5"/>
<line x1="35" y1="120" x2="270" y2="120" stroke="var(--border)" stroke-width="1.5"/>
<text x="18" y="70" font-size="7.5" fill="#64748b" font-family="sans-serif" transform="rotate(-90,18,70)">T, °C</text>
<text x="270" y="125" font-size="7.5" fill="#64748b" font-family="sans-serif">τ</text>
<!-- Graph line -->
<!-- AB: нагрев твёрдого (slope up) -->
<polyline points="40,110 80,75" stroke="#dc2626" stroke-width="2.5" fill="none"/>
<!-- BC: плавление (горизонталь) -->
<polyline points="80,75 130,75" stroke="#dc2626" stroke-width="2.5" fill="none"/>
<!-- CD: нагрев жидкого -->
<polyline points="130,75 175,40" stroke="#dc2626" stroke-width="2.5" fill="none"/>
<!-- DE: кипение (горизонталь) -->
<polyline points="175,40 225,40" stroke="#dc2626" stroke-width="2.5" fill="none"/>
<!-- EF: нагрев пара (optionally) -->
<polyline points="225,40 260,20" stroke="#dc2626" stroke-width="2.5" fill="none" stroke-dasharray="4,2" opacity=".5"/>
<!-- Labels for segments -->
<text x="57" y="100" font-size="7.5" fill="#64748b" font-family="sans-serif">A→B</text>
<text x="57" y="110" font-size="7" fill="#64748b" font-family="sans-serif">нагрев</text>
<text x="57" y="118" font-size="7" fill="#64748b" font-family="sans-serif">тв. тела</text>
<text x="98" y="70" font-size="7.5" fill="#0369a1" font-family="sans-serif" font-weight="bold">B→C</text>
<text x="90" y="80" font-size="7" fill="#0369a1" font-family="sans-serif">ПЛАВЛЕНИЕ</text>
<text x="90" y="89" font-size="7" fill="#0369a1" font-family="sans-serif">T = const</text>
<text x="152" y="62" font-size="7.5" fill="#64748b" font-family="sans-serif">C→D</text>
<text x="149" y="72" font-size="7" fill="#64748b" font-family="sans-serif">жидкость</text>
<text x="185" y="35" font-size="7.5" fill="#059669" font-family="sans-serif" font-weight="bold">D→E</text>
<text x="178" y="44" font-size="7" fill="#059669" font-family="sans-serif">КИПЕНИЕ</text>
<!-- T_пл line -->
<line x1="35" y1="75" x2="82" y2="75" stroke="#0369a1" stroke-width="1" stroke-dasharray="3,2" opacity=".7"/>
<text x="5" y="78" font-size="6.5" fill="#0369a1" font-family="sans-serif">t_пл</text>
<!-- T_кип line -->
<line x1="35" y1="40" x2="177" y2="40" stroke="#059669" stroke-width="1" stroke-dasharray="3,2" opacity=".7"/>
<text x="3" y="43" font-size="6.5" fill="#059669" font-family="sans-serif">t_кип</text>
<!-- Points -->
<circle cx="80" cy="75" r="3.5" fill="#0369a1"/>
<circle cx="130" cy="75" r="3.5" fill="#0369a1"/>
<circle cx="175" cy="40" r="3.5" fill="#059669"/>
<circle cx="225" cy="40" r="3.5" fill="#059669"/>
<text x="78" y="87" font-size="7" fill="#0369a1" font-family="sans-serif">B</text>
<text x="128" y="87" font-size="7" fill="#0369a1" font-family="sans-serif">C</text>
<text x="173" y="53" font-size="7" fill="#059669" font-family="sans-serif">D</text>
<text x="223" y="53" font-size="7" fill="#059669" font-family="sans-serif">E</text>
</svg>
</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">Металл плавят при $t_\text{пл}$ → заливают в форму → охлаждают → кристаллизация</div></div>
<div class="life-item"><div class="li-icon">🌡️</div><div class="li-title">Антифриз</div><div class="li-desc">Смесь с водой — $t_\text{пл}$ ниже 0°C, не замерзает в радиаторе зимой</div></div>
<div class="life-item"><div class="li-icon">🧊</div><div class="li-title">Лёд в стакане</div><div class="li-desc">При 0°C лёд тает, пока не расплавится весь — температура не растёт</div></div>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Кристаллическая решётка</div>
<div class="idiag">
<h3>❄️ Меняй температуру и наблюдай переход</h3>
<canvas id="cv8" style="width:100%;height:220px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:12px;margin-top:12px;align-items:center">
<div style="flex:1;min-width:200px">
<div class="slider-row">
<span class="slider-lbl">🌡 Температура:</span>
<input type="range" id="sl8T" min="-50" max="150" value="0" style="flex:1;margin-top:4px" oninput="lbl8T.textContent=this.value;upd8();">
<span class="slider-val"><span id="lbl8T">0</span>°C</span>
</div>
<div style="font-size:.75rem;color:var(--muted);margin-top:4px">t_пл = <span id="lbl8Tpl">0</span>°C</div>
</div>
<div>
<select id="sel8sub" onchange="upd8()" style="padding:6px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text)">
<option value="0">❄ Лёд (0°C)</option>
<option value="327">🔩 Свинец (327°C)</option>
</select>
</div>
</div>
<div id="cv8state" class="idiag-result">Состояние: Твёрдое</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §8</div>
<ul class="key-points-list">
<li>Плавление — переход тв.→жид. при постоянной температуре $T_\text{пл}$: вся теплота идёт на разрушение кристаллической решётки.</li>
<li>Кристаллизация — обратный процесс при той же $T_\text{пл}$ с выделением теплоты.</li>
<li>Аморфные тела (стекло, смола) не имеют чёткой $T_\text{пл}$ — плавятся постепенно.</li>
<li>На T–t графике плавление — горизонтальный участок: температура не меняется, пока идёт переход.</li>
</ul>
</div>
</div>
<!-- §9 -->
<div class="content" id="tab-ref9">
<div class="para-hero ph-9">
<div class="ph-label">§9 · Физика 8 кл</div>
<h2>Удельная теплота плавления и кристаллизации</h2>
<div class="ph-formula">$Q = \lambda m$</div>
<div class="ph-desc">Для плавления 1 кг вещества при $T_\text{пл}$ нужна теплота $\lambda$. При кристаллизации столько же выделяется. Идёт на разрушение кристаллической решётки.</div>
<div class="ph-tags">
<span class="ph-tag">📐 [λ] = кДж/кг</span>
<span class="ph-tag">❄ λ(лёд) = 333 кДж/кг</span>
<span class="ph-tag">🔩 λ(Al) = 390 кДж/кг</span>
</div>
</div>
<div class="section-title"><i class="fas fa-calculator"></i> §9. Удельная теплота плавления</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Основная формула</h3>
<div class="main-f">$Q = \lambda m$</div>
<p>$\lambda$ — удельная теплота плавления [кДж/кг], $m$ — масса [кг].</p>
<p>При кристаллизации выделяется <b>столько же</b>.</p>
</div>
<div class="fcard">
<h3>Значения λ, кДж/кг</h3>
<ul>
<li>Лёд: <b>333</b> &nbsp;|&nbsp; Свинец: 25</li>
<li>Серебро: 88 &nbsp;|&nbsp; Медь: 205</li>
<li>Железо: 270 &nbsp;|&nbsp; Алюминий: <b>390</b></li>
</ul>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>$\lambda$ — теплота на <b>1 кг</b> при $T_\text{пл}$. На нагрев она не тратится!</li>
<li>При кристаллизации выделяется ровно столько же теплоты, сколько поглощалось при плавлении.</li>
<li>Лёд плавится при 0°C, но нужно ещё 333 кДж/кг — вот почему лёд хорошо охлаждает.</li>
</ul>
</div>
<div class="idiag">
<h3>📊 Удельная теплота плавления λ (кДж/кг)</h3>
<svg viewBox="0 0 280 110" width="100%" style="display:block">
<!-- Aluminium 390 -->
<text x="65" y="20" text-anchor="end" font-size="7.5" fill="var(--text)" font-family="sans-serif">Алюминий</text>
<rect x="70" y="8" width="175.5" height="13" rx="3" fill="#6366f1"/>
<text x="250" y="19" font-size="7.5" fill="#6366f1" font-weight="bold" font-family="sans-serif">390</text>
<!-- Железо 270 -->
<text x="65" y="40" text-anchor="end" font-size="7.5" fill="var(--text)" font-family="sans-serif">Железо</text>
<rect x="70" y="28" width="121.5" height="13" rx="3" fill="#0369a1"/>
<text x="196" y="39" font-size="7.5" fill="#0369a1" font-weight="bold" font-family="sans-serif">270</text>
<!-- Вода 333 -->
<text x="65" y="60" text-anchor="end" font-size="7.5" fill="var(--text)" font-family="sans-serif">Лёд→вода</text>
<rect x="70" y="48" width="149.85" height="13" rx="3" fill="#0891b2"/>
<text x="225" y="59" font-size="7.5" fill="#0891b2" font-weight="bold" font-family="sans-serif">333</text>
<!-- Медь 205 -->
<text x="65" y="80" text-anchor="end" font-size="7.5" fill="var(--text)" font-family="sans-serif">Медь</text>
<rect x="70" y="68" width="92.25" height="13" rx="3" fill="#b45309"/>
<text x="167" y="79" font-size="7.5" fill="#b45309" font-weight="bold" font-family="sans-serif">205</text>
<!-- Свинец 25 -->
<text x="65" y="100" text-anchor="end" font-size="7.5" fill="var(--text)" font-family="sans-serif">Свинец</text>
<rect x="70" y="88" width="11.25" height="13" rx="3" fill="#78716c"/>
<text x="86" y="99" font-size="7.5" fill="#78716c" font-weight="bold" font-family="sans-serif">25</text>
<!-- Scale -->
<line x1="70" y1="104" x2="250" y2="104" stroke="var(--border)" stroke-width="1"/>
<text x="70" y="110" font-size="6" fill="#94a3b8" font-family="sans-serif">0</text>
<text x="242" y="110" font-size="6" fill="#94a3b8" font-family="sans-serif">390</text>
</svg>
</div>
<div class="insight-box">
<div class="insight-title"><i class="fas fa-lightbulb"></i> Почему лёд «тает» медленно?</div>
<p>Для плавления 1 кг льда нужно <b>333 000 Дж</b> — такое же количество теплоты, которое нужно, чтобы нагреть ту же воду от 0°C до 79°C. Вся эта энергия идёт не на нагрев, а на разрушение кристаллической решётки. Именно поэтому айсберги тают очень медленно — они как «термостат» для полярных морей!</p>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Плавление + график T(t)</div>
<div class="idiag">
<h3>🔥 Наблюдай горизонтальный участок графика</h3>
<canvas id="cv9" style="width:100%;height:240px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:12px;margin-top:12px;align-items:center">
<div style="flex:1;min-width:180px">
<div class="slider-row">
<span class="slider-lbl">Масса m:</span>
<input type="range" id="sl9m" min="0.1" max="5" step="0.1" value="1" style="flex:1;margin-top:4px" oninput="lbl9m.textContent=this.value;upd9();">
<span class="slider-val"><span id="lbl9m">1</span> кг</span>
</div>
</div>
<div style="flex:1;min-width:180px">
<select id="sel9sub" onchange="upd9()" style="width:100%;padding:6px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text)">
<option value="333">❄ Лёд (λ=333 кДж/кг)</option>
<option value="270">⚙️ Железо (λ=270 кДж/кг)</option>
<option value="390">🔩 Алюминий (λ=390 кДж/кг)</option>
<option value="205">🟤 Медь (λ=205 кДж/кг)</option>
<option value="88">⚪ Серебро (λ=88 кДж/кг)</option>
<option value="25">🔵 Свинец (λ=25 кДж/кг)</option>
</select>
</div>
<div style="display:flex;gap:8px">
<button class="btn btn-pri" onclick="anim9('melt')">🔥 Плавить</button>
<button class="btn btn-ghost" onclick="anim9('freeze')">❄ Заморозить</button>
</div>
</div>
<div id="cv9result" class="idiag-result">Q = —</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §9</div>
<ul class="key-points-list">
<li>Удельная теплота плавления: $Q = \lambda m$, где $\lambda$ — количество теплоты на плавление 1 кг при $T_\text{пл}$.</li>
<li>При кристаллизации выделяется ровно столько же теплоты, сколько поглощалось при плавлении.</li>
<li>$\lambda$ льда = 333 кДж/кг — поэтому для таяния льда нужно много теплоты (почему лёд хорошо охлаждает).</li>
<li>$\lambda$ идёт на разрушение кристаллической решётки, а не на нагрев вещества.</li>
</ul>
</div>
</div>
<!-- §10 -->
<div class="content" id="tab-ref10">
<div class="para-hero ph-10">
<div class="ph-label">§10 · Физика 8 кл</div>
<h2>Испарение жидкостей. Факторы</h2>
<div class="ph-desc">Испарение — переход жид.→пар с поверхности при любой T. Охлаждает жидкость. Скорость зависит от температуры, площади, ветра и рода жидкости.</div>
<div class="ph-tags">
<span class="ph-tag">🌡 при любой T</span>
<span class="ph-tag">❄ охлаждает жидкость</span>
<span class="ph-tag">💨 ветер ускоряет</span>
</div>
</div>
<div class="section-title"><i class="fas fa-cloud"></i> §10. Испарение жидкостей</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Механизм испарения</h3>
<div class="main-f">жид. → пар (с поверхности)</div>
<p>Быстрые молекулы с поверхности преодолевают силы притяжения → вылетают. Оставшиеся медленнее → жидкость <b>охлаждается</b>.</p>
</div>
<div class="fcard">
<h3>4 фактора скорости</h3>
<ul>
<li>Температура↑ → быстрее</li>
<li>Площадь поверхности↑ → быстрее</li>
<li>Ветер → быстрее (уносит пар)</li>
<li>Род жидкости: ацетон ≫ вода ≫ масло</li>
</ul>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>Испарение идёт при <b>любой температуре</b> — не только при 100°C.</li>
<li>Испарение <b>охлаждает</b> жидкость — быстрые молекулы уходят, медленные остаются.</li>
<li>Конденсация — обратный процесс: пар → жидкость.</li>
</ul>
</div>
<div class="idiag">
<h3>📊 Факторы, влияющие на скорость испарения</h3>
<table style="width:100%;border-collapse:collapse;font-size:.8rem">
<thead><tr style="background:rgba(220,38,38,.08)"><th style="padding:6px 8px;text-align:left;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">↑T → ↑испарение</td><td style="padding:5px 8px;border:1px solid var(--border)">Больше молекул с энергией ≥ E_отрыва</td></tr>
<tr style="background:rgba(220,38,38,.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">↑S → ↑испарение</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(220,38,38,.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>
</table>
</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">Испарение непрерывно охлаждает поверхность воды — T остаётся ниже кипения</div></div>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Испарение молекул</div>
<div class="idiag">
<h3>💧 Наблюдай испарение при разных условиях</h3>
<canvas id="cv10" style="width:100%;height:240px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:12px;margin-top:12px;align-items:center">
<div style="flex:1;min-width:180px">
<div class="slider-row">
<span class="slider-lbl">🌡 Температура:</span>
<input type="range" id="sl10T" min="0" max="100" value="40" style="flex:1;margin-top:4px" oninput="lbl10T.textContent=this.value;sl10Tval=+this.value;">
<span class="slider-val"><span id="lbl10T">40</span>°C</span>
</div>
</div>
<div style="flex:1;min-width:180px">
<div class="slider-row">
<span class="slider-lbl">📐 Ширина:</span>
<input type="range" id="sl10W" min="1" max="3" step="0.5" value="2" style="flex:1;margin-top:4px" oninput="sl10Wval=+this.value;">
</div>
</div>
<label style="display:flex;align-items:center;gap:8px;font-size:.82rem;font-weight:700;cursor:pointer">
<input type="checkbox" id="chk10wind" onchange="wind10=this.checked"> 💨 Ветер
</label>
</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §10</div>
<ul class="key-points-list">
<li>Испарение — переход жид.→пар с поверхности при любой температуре (не только при 100°C).</li>
<li>Испарение охлаждает жидкость: быстрые молекулы уходят, оставшиеся движутся медленнее.</li>
<li>Скорость испарения растёт с повышением T, увеличением площади поверхности, наличием ветра и зависит от рода жидкости.</li>
<li>Конденсация — обратный процесс: пар переходит в жидкость с выделением теплоты.</li>
</ul>
</div>
</div>
<!-- §11 -->
<div class="content" id="tab-ref11">
<div class="para-hero ph-11">
<div class="ph-label">§11 · Физика 8 кл</div>
<h2>Кипение. Удельная теплота парообразования</h2>
<div class="ph-formula">$Q = Lm$</div>
<div class="ph-desc">Кипение — парообразование по всему объёму при $T_\text{кип} = \text{const}$. $L$ — теплота для превращения 1 кг жидкости в пар. $T_\text{кип}$ зависит от давления.</div>
<div class="ph-tags">
<span class="ph-tag">💧→💨 весь объём</span>
<span class="ph-tag">📐 [L] = МДж/кг</span>
<span class="ph-tag">💧 L(воды) = 2,26 МДж/кг</span>
</div>
</div>
<div class="section-title"><i class="fas fa-temperature-high"></i> §11. Кипение и теплота парообразования</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Кипение</h3>
<div class="main-f">$Q = Lm$, $T = \text{const}$</div>
<p>Парообразование по всему <b>объёму</b> при $T_\text{кип}$. Вся теплота идёт на испарение, а не на нагрев.</p>
<p>$L$ — удельная теплота парообразования [кДж/кг].</p>
</div>
<div class="fcard">
<h3>Значения $L$ и $T_\text{кип}$</h3>
<ul>
<li>Вода: 100°C, L = 2260 кДж/кг</li>
<li>Спирт: 78°C, L = 857 кДж/кг</li>
<li>Эфир: 35°C, L = 352 кДж/кг</li>
</ul>
<p>С ростом давления $T_\text{кип}$ <b>повышается</b> (скороварка). С уменьшением — понижается (горы).</p>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"><i class="fas fa-exclamation-circle"></i> Запомни!</div>
<ul>
<li>При кипении $T = \text{const}$ — вся теплота идёт на превращение жидкости в пар.</li>
<li>$T_\text{кип}$ зависит от <b>давления</b>: больше давление → выше $T_\text{кип}$.</li>
<li>Конденсация — обратный процесс: выделяется столько же теплоты $Lm$.</li>
</ul>
</div>
<div class="idiag">
<h3>📈 Температура кипения воды vs давление</h3>
<svg viewBox="0 0 280 120" width="100%" style="display:block">
<!-- Axes -->
<line x1="45" y1="10" x2="45" y2="100" stroke="var(--border)" stroke-width="1.5"/>
<line x1="45" y1="100" x2="265" y2="100" stroke="var(--border)" stroke-width="1.5"/>
<text x="8" y="60" font-size="7" fill="#64748b" font-family="sans-serif" transform="rotate(-90,8,60)">T_кип, °C</text>
<text x="260" y="107" font-size="7" fill="#64748b" font-family="sans-serif">P</text>
<!-- Curve (exponential-like) -->
<polyline points="55,90 85,82 115,75 145,68 175,60 205,50 235,38" stroke="#0891b2" stroke-width="2.5" fill="none"/>
<!-- Key points -->
<!-- P=0.3 atm → ~70°C (горы) -->
<circle cx="85" cy="82" r="4" fill="#059669"/>
<text x="62" y="95" font-size="6.5" fill="#059669" font-family="sans-serif">0,3 атм</text>
<text x="62" y="103" font-size="6.5" fill="#059669" font-family="sans-serif">≈70°C</text>
<text x="56" y="112" font-size="6" fill="#94a3b8" font-family="sans-serif">⛰️ горы</text>
<!-- P=1 atm → 100°C (normal) -->
<circle cx="145" cy="68" r="4" fill="#0369a1"/>
<text x="136" y="82" font-size="6.5" fill="#0369a1" font-family="sans-serif">1 атм</text>
<text x="134" y="91" font-size="6.5" fill="#0369a1" font-family="sans-serif">100°C</text>
<text x="132" y="100" font-size="6" fill="#94a3b8" font-family="sans-serif">🌊 уровень моря</text>
<!-- P=2 atm → ~120°C (скороварка) -->
<circle cx="205" cy="50" r="4" fill="#dc2626"/>
<text x="210" y="45" font-size="6.5" fill="#dc2626" font-family="sans-serif">2 атм</text>
<text x="210" y="54" font-size="6.5" fill="#dc2626" font-family="sans-serif">≈120°C</text>
<text x="205" y="63" font-size="6" fill="#94a3b8" font-family="sans-serif">🥘 скороварка</text>
<!-- Labels -->
<text x="50" y="9" font-size="6.5" fill="#94a3b8" font-family="sans-serif">70</text>
<text x="50" y="69" font-size="6.5" fill="#94a3b8" font-family="sans-serif">100</text>
</svg>
</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon">🥘</div><div class="li-title">Скороварка</div><div class="li-desc">P &gt; 1 атм → $t_\text{кип}$ &gt; 100°C → еда готовится быстрее при высокой T</div></div>
<div class="life-item"><div class="li-icon">⛰️</div><div class="li-title">На вершине горы</div><div class="li-desc">P &lt; 1 атм → вода кипит при ~70°C → суп варится дольше, чем у моря</div></div>
<div class="life-item"><div class="li-icon">💉</div><div class="li-title">Стерилизация</div><div class="li-desc">Автоклав — P = 2 атм, $t_\text{кип} = 120$°C → убивает все микробы</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Идеальный чай</div><div class="li-desc">Заваривают при 80-90°C, не 100°C — кипяток разрушает витамины и аромат</div></div>
</div>
<div class="section-title"><i class="fas fa-play-circle"></i> Интерактив — Кипящая жидкость</div>
<div class="idiag">
<h3>🫧 Меняй давление и жидкость</h3>
<canvas id="cv11" style="width:100%;height:260px;border-radius:12px;background:#0f172a;display:block"></canvas>
<div class="ctrl-row" style="display:flex;flex-wrap:wrap;gap:12px;margin-top:12px;align-items:center">
<div style="flex:1;min-width:180px">
<div class="slider-row">
<span class="slider-lbl">🔘 Давление:</span>
<input type="range" id="sl11P" min="0.3" max="2" step="0.1" value="1" style="flex:1;margin-top:4px" oninput="upd11P(this.value);">
<span class="slider-val"><span id="lbl11P">1</span> атм</span>
</div>
<div style="font-size:.75rem;color:var(--muted);margin-top:4px">t_кип = <span id="lbl11Tkip">100</span>°C</div>
</div>
<div style="flex:1;min-width:180px">
<select id="sel11liq" onchange="upd11liq()" style="width:100%;padding:6px;border-radius:8px;border:2px solid var(--border);background:var(--card);color:var(--text)">
<option value="100,2260">💧 Вода (100°C, L=2260)</option>
<option value="78,857">🍺 Спирт (78°C, L=857)</option>
<option value="35,352">🌿 Эфир (35°C, L=352)</option>
</select>
</div>
<div style="flex:1;min-width:180px">
<div class="slider-row">
<span class="slider-lbl">Масса m:</span>
<input type="range" id="sl11m" min="0.1" max="5" step="0.1" value="1" style="flex:1;margin-top:4px" oninput="lbl11m.textContent=this.value;upd11Q();">
<span class="slider-val"><span id="lbl11m">1</span> кг</span>
</div>
</div>
</div>
<div id="cv11result" class="idiag-result">Q = —</div>
</div>
<div class="key-points">
<div class="key-points-title">🔑 Главное в §11</div>
<ul class="key-points-list">
<li>Кипение — парообразование по всему объёму жидкости при постоянной $T_\text{кип}$.</li>
<li>Теплота парообразования: $Q = Lm$, где $L$ — удельная теплота парообразования [кДж/кг].</li>
<li>$T_\text{кип}$ зависит от давления: больше давление → выше $T_\text{кип}$ (скороварка), меньше → ниже (горы).</li>
<li>Конденсация — обратный процесс; выделяется столько же теплоты $Lm$.</li>
<li>$L$ воды = 2260 кДж/кг — очень высокое значение, поэтому пар несёт огромное количество теплоты.</li>
</ul>
</div>
</div>
<!-- ЗАДАЧИ -->
<div class="content" id="tab-tasks">
<div class="para-pills">
<button class="para-pill active" data-para="p1" onclick="setParaTab('p1')">§1 Внутренняя энергия</button>
<button class="para-pill" data-para="p2" onclick="setParaTab('p2')">§2 Способы изменения U</button>
<button class="para-pill" data-para="p3" onclick="setParaTab('p3')">§3 Теплопроводность</button>
<button class="para-pill" data-para="p4" onclick="setParaTab('p4')">§4 Конвекция</button>
<button class="para-pill" data-para="p5" onclick="setParaTab('p5')">§5 Излучение</button>
<button class="para-pill" data-para="p6" onclick="setParaTab('p6')">§6 Удельная теплоёмкость</button>
<button class="para-pill" data-para="p7" onclick="setParaTab('p7')">§7 Горение</button>
<button class="para-pill" data-para="p8" onclick="setParaTab('p8')">§8 Плавление</button>
<button class="para-pill" data-para="p9" onclick="setParaTab('p9')">§9 Теплота плавления</button>
<button class="para-pill" data-para="p10" onclick="setParaTab('p10')">§10 Испарение</button>
<button class="para-pill" data-para="p11" onclick="setParaTab('p11')">§11 Кипение</button>
<button class="para-pill" data-para="hard" onclick="setParaTab('hard')">⚡ Сложные</button>
</div>
<!-- ptab-p1 -->
<div id="ptab-p1">
<div class="score-bar">
<div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp1">0</span></div>
<div class="chip chip-tot"><span id="curp1">0</span>&nbsp;/&nbsp;<span id="maxp1">0</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p1')" 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="progp1" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp1"></div>
<div id="taskAreap1"></div>
<div class="feedback" id="fbp1"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp1" onclick="nextTask('p1')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button>
</div>
<div class="summary" id="sump1">
<h2>§1 — готово!</h2>
<div class="big-score" id="sumScorep1">0/4</div>
<div class="sum-grade" id="sumGradep1"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p1')"><i class="fas fa-rotate-right"></i> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p2')">→ §2</button>
</div>
</div>
</div>
<!-- ptab-p2 -->
<div id="ptab-p2">
<div class="score-bar">
<div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp2">0</span></div>
<div class="chip chip-tot"><span id="curp2">0</span>&nbsp;/&nbsp;<span id="maxp2">0</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p2')" 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="progp2" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp2"></div>
<div id="taskAreap2"></div>
<div class="feedback" id="fbp2"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp2" onclick="nextTask('p2')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button>
</div>
<div class="summary" id="sump2">
<h2>§2 — готово!</h2>
<div class="big-score" id="sumScorep2">0/4</div>
<div class="sum-grade" id="sumGradep2"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p2')"><i class="fas fa-rotate-right"></i> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p3')">→ §3</button>
</div>
</div>
</div>
<!-- ptab-p3 -->
<div id="ptab-p3">
<div class="score-bar">
<div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp3">0</span></div>
<div class="chip chip-tot"><span id="curp3">0</span>&nbsp;/&nbsp;<span id="maxp3">0</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p3')" 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="progp3" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp3"></div>
<div id="taskAreap3"></div>
<div class="feedback" id="fbp3"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp3" onclick="nextTask('p3')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button>
</div>
<div class="summary" id="sump3">
<h2>§3 — готово!</h2>
<div class="big-score" id="sumScorep3">0/7</div>
<div class="sum-grade" id="sumGradep3"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p3')"><i class="fas fa-rotate-right"></i> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p4')">→ §4</button>
</div>
</div>
</div>
<!-- ptab-p4 -->
<div id="ptab-p4">
<div class="score-bar">
<div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp4">0</span></div>
<div class="chip chip-tot"><span id="curp4">0</span>&nbsp;/&nbsp;<span id="maxp4">0</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p4')" 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="progp4" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp4"></div>
<div id="taskAreap4"></div>
<div class="feedback" id="fbp4"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp4" onclick="nextTask('p4')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button>
</div>
<div class="summary" id="sump4">
<h2>§4 — готово!</h2>
<div class="big-score" id="sumScorep4">0/4</div>
<div class="sum-grade" id="sumGradep4"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p4')"><i class="fas fa-rotate-right"></i> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p5')">→ §5</button>
</div>
</div>
</div>
<!-- ptab-p5 -->
<div id="ptab-p5">
<div class="score-bar">
<div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp5">0</span></div>
<div class="chip chip-tot"><span id="curp5">0</span>&nbsp;/&nbsp;<span id="maxp5">0</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p5')" 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="progp5" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp5"></div>
<div id="taskAreap5"></div>
<div class="feedback" id="fbp5"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp5" onclick="nextTask('p5')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button>
</div>
<div class="summary" id="sump5">
<h2>§5 — готово!</h2>
<div class="big-score" id="sumScorep5">0/11</div>
<div class="sum-grade" id="sumGradep5"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p5')"><i class="fas fa-rotate-right"></i> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p6')">→ §6</button>
</div>
</div>
</div>
<!-- ptab-p6 -->
<div id="ptab-p6">
<div class="score-bar">
<div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp6">0</span></div>
<div class="chip chip-tot"><span id="curp6">0</span>&nbsp;/&nbsp;<span id="maxp6">0</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p6')" 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="progp6" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp6"></div>
<div id="taskAreap6"></div>
<div class="feedback" id="fbp6"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp6" onclick="nextTask('p6')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button>
</div>
<div class="summary" id="sump6">
<h2>§6 — готово!</h2>
<div class="big-score" id="sumScorep6">0/5</div>
<div class="sum-grade" id="sumGradep6"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p6')"><i class="fas fa-rotate-right"></i> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p7')">→ §7</button>
</div>
</div>
</div>
<!-- ptab-p7 -->
<div id="ptab-p7">
<div class="score-bar">
<div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp7">0</span></div>
<div class="chip chip-tot"><span id="curp7">0</span>&nbsp;/&nbsp;<span id="maxp7">0</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p7')" 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="progp7" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp7"></div>
<div id="taskAreap7"></div>
<div class="feedback" id="fbp7"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp7" onclick="nextTask('p7')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button>
</div>
<div class="summary" id="sump7">
<h2>§7 — готово!</h2>
<div class="big-score" id="sumScorep7">0/6</div>
<div class="sum-grade" id="sumGradep7"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p7')"><i class="fas fa-rotate-right"></i> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p8')">→ §8</button>
</div>
</div>
</div>
<!-- ptab-p8 -->
<div id="ptab-p8">
<div class="score-bar">
<div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp8">0</span></div>
<div class="chip chip-tot"><span id="curp8">0</span>&nbsp;/&nbsp;<span id="maxp8">0</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p8')" 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="progp8" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp8"></div>
<div id="taskAreap8"></div>
<div class="feedback" id="fbp8"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp8" onclick="nextTask('p8')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button>
</div>
<div class="summary" id="sump8">
<h2>§8 — готово!</h2>
<div class="big-score" id="sumScorep8">0/7</div>
<div class="sum-grade" id="sumGradep8"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p8')"><i class="fas fa-rotate-right"></i> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p9')">→ §9</button>
</div>
</div>
</div>
<!-- ptab-p9 -->
<div id="ptab-p9">
<div class="score-bar">
<div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp9">0</span></div>
<div class="chip chip-tot"><span id="curp9">0</span>&nbsp;/&nbsp;<span id="maxp9">0</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p9')" 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="progp9" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp9"></div>
<div id="taskAreap9"></div>
<div class="feedback" id="fbp9"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp9" onclick="nextTask('p9')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button>
</div>
<div class="summary" id="sump9">
<h2>§9 — готово!</h2>
<div class="big-score" id="sumScorep9">0/7</div>
<div class="sum-grade" id="sumGradep9"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p9')"><i class="fas fa-rotate-right"></i> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p10')">→ §10</button>
</div>
</div>
</div>
<!-- ptab-p10 -->
<div id="ptab-p10">
<div class="score-bar">
<div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp10">0</span></div>
<div class="chip chip-tot"><span id="curp10">0</span>&nbsp;/&nbsp;<span id="maxp10">0</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p10')" 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="progp10" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp10"></div>
<div id="taskAreap10"></div>
<div class="feedback" id="fbp10"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp10" onclick="nextTask('p10')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button>
</div>
<div class="summary" id="sump10">
<h2>§10 — готово!</h2>
<div class="big-score" id="sumScorep10">0/8</div>
<div class="sum-grade" id="sumGradep10"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p10')"><i class="fas fa-rotate-right"></i> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p11')">→ §11</button>
</div>
</div>
</div>
<!-- ptab-p11 -->
<div id="ptab-p11">
<div class="score-bar">
<div class="chip chip-ok"><i class="fas fa-check"></i>&nbsp;<span id="okp11">0</span></div>
<div class="chip chip-tot"><span id="curp11">0</span>&nbsp;/&nbsp;<span id="maxp11">0</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p11')" 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="progp11" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp11"></div>
<div id="taskAreap11"></div>
<div class="feedback" id="fbp11"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp11" onclick="nextTask('p11')" style="display:none"><i class="fas fa-arrow-right"></i> Следующее</button>
</div>
<div class="summary" id="sump11">
<h2>§11 — готово!</h2>
<div class="big-score" id="sumScorep11">0/9</div>
<div class="sum-grade" id="sumGradep11"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p11')"><i class="fas fa-rotate-right"></i> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('hard')">→ ⚡ Сложные</button>
</div>
</div>
</div>
<!-- ptab-hard -->
<div id="ptab-hard">
<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/8</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>
// ═══════════════════════════════════════
// ДАННЫЕ ЗАДАЧ
// ═══════════════════════════════════════
var TASKS_P1 = [
{q:"Может ли тело обладать внутренней энергией, не имея механической?",opts:["Нет, это невозможно","Да, например покоящийся камень на уровне земли","Только в газообразном состоянии","Только при абсолютном нуле"],a:1,ex:"Покоящееся тело на нулевом уровне не имеет механической энергии, но молекулы в нём всегда движутся — внутренняя энергия всегда не равна нулю."},
{q:"Одинаковы ли внутренние энергии 1 кг золота в твёрдом и расплавленном состояниях при одинаковой температуре?",opts:["Да, температура одинакова","Нет, у расплавленного больше — разрушена кристаллическая решётка","Нет, у твёрдого больше","Зависит от давления"],a:1,ex:"При плавлении разрушается кристаллическая решётка — растёт потенциальная энергия молекул. Внутренняя энергия расплавленного тела больше при той же температуре."},
{q:"Равны ли внутренние энергии воздуха в двух одинаковых колбах, опущенных в воду разной температуры?",opts:["Да, объём и масса одинаковы","Нет, у более горячей колбы внутренняя энергия больше","Нет, у холодной больше","Зависит от давления"],a:1,ex:"Чем выше температура, тем быстрее движутся молекулы и тем больше их кинетическая энергия и внутренняя энергия воздуха в колбе."},
{q:"Из каких составляющих складывается внутренняя энергия воздуха?",opts:["Только кинетическая энергия молекул","Только потенциальная энергия молекул","Кинетическая + потенциальная энергии молекул","Механическая и тепловая энергии тела"],a:2,ex:"Внутренняя энергия = кинетическая энергия хаотического движения + потенциальная энергия взаимодействия молекул."},
{q:"Внутренняя энергия газа в баллоне $U_1 = 480$ кДж. После охлаждения она стала $U_2 = 25{,}0$ кДж. На сколько уменьшилась внутренняя энергия газа?",hint:"$|\\Delta U| = U_1 - U_2$",unit:"кДж",a:455,ex:"$|\\Delta U| = 480 - 25 = 455$ кДж. Газ отдал теплоту окружающей среде — его внутренняя энергия уменьшилась."},
{q:"Газ с внутренней энергией $U_1 = 840$ Дж сжали поршнем. Его внутренняя энергия стала $U_2 = 3{,}60$ кДж. Определите изменение внутренней энергии газа.",hint:"$\\Delta U = U_2 - U_1$",unit:"Дж",a:2760,ex:"$\\Delta U = 3600 - 840 = 2760$ Дж. Внутренняя энергия выросла: механическая работа поршня перешла во внутреннюю энергию газа."},
{q:"Два стальных кирпича одинаковой массы лежат на столе. В каком случае их внутренние энергии могут стать одинаковыми?",opts:["Они всегда одинаковы, т.к. массы равны","При нагреве одного до температуры другого","Только если их расплавить","Никогда — внутренняя энергия зависит от положения"],a:1,ex:"Внутренние энергии двух тел из одного вещества одинаковой массы равны, если они имеют одинаковую температуру. Нагрей более холодный — и они сравняются."}
];
var TASKS_P2 = [
{q:"Каким способом изменяется внутренняя энергия свечи при горении?",opts:["Механической работой","Теплопередачей","Не изменяется","Оба способа"],a:1,ex:"Химическая энергия переходит во внутреннюю энергию продуктов горения — это теплообмен."},
{q:"Как изменяется внутренняя энергия пакета молока в холодильнике?",opts:["Увеличивается — холодильник работает","Уменьшается путём теплопередачи","Не изменяется","Увеличивается из-за давления"],a:1,ex:"Тепло передаётся от молока к холодному воздуху холодильника (теплопередача). Внутренняя энергия молока уменьшается."},
{q:"Цилиндр натёрли сукном (A=1 Дж). Другой цилиндр подняли (A=1 Дж). У которого больше выросла внутренняя энергия?",opts:["У обоих одинаково","У первого (трение): его U выросла на 1 Дж; у второго U не изменилась","У второго (подъём) U выросла больше","Ни у одного U не изменилась"],a:1,ex:"При трении работа превращается в тепло (рост U). При подъёме работа идёт на механическую потенциальную энергию — U тела не меняется."},
{q:"Изменилась ли внутренняя энергия эспандера при его растяжении?",opts:["Нет, форма не влияет на U","Да, увеличилась: выросла потенциальная энергия взаимодействия молекул","Да, уменьшилась","Только если растяжение сопровождается нагревом"],a:1,ex:"Молекулы резины удаляются — растёт потенциальная энергия их взаимодействия. Это механический способ изменения внутренней энергии."},
{q:"Газ в закрытом баллоне получил при теплопередаче $\\Delta U = 20$ кДж. Чему равно количество теплоты, полученное газом?",hint:"В закрытом баллоне объём не меняется, работа не совершается: $Q = \\Delta U$",unit:"кДж",a:20,ex:"При постоянном объёме вся теплота идёт на увеличение внутренней энергии: $Q = \\Delta U = 20$ кДж."},
{q:"Два металлических цилиндра: первый натёрли куском сукна (совершена работа $A_1 = 1$ Дж), второй подняли на некоторую высоту (совершена работа $A_2 = 1$ Дж). Одинаково ли изменилась их внутренняя энергия?",opts:["Да — работы равны, значит изменения одинаковы","Нет: у первого внутренняя энергия выросла, у второго — не изменилась (работа → механическая потенциальная)","Нет: у обоих внутренняя энергия не изменилась","Нет: у второго внутренняя энергия выросла больше"],a:1,ex:"При трении вся механическая работа превращается во внутреннюю энергию (нагрев). При подъёме тела работа идёт на увеличение механической потенциальной энергии тела — внутренняя энергия не меняется."}
];
var TASKS_P3 = [
{q:"Почему посуда для приготовления пищи делается из стали или чугуна?",opts:["Металлы дешевле дерева","Металлы имеют высокую теплопроводность — быстро передают тепло еде","Металлы имеют низкую теплопроводность","Дерево плавится"],a:1,ex:"Высокая теплопроводность металлов обеспечивает быстрый и равномерный нагрев содержимого."},
{q:"В Якутии устанавливают пятикамерные стеклопакеты. Почему?",opts:["Прочнее","Больше воздушных прослоёк — лучше теплоизоляция (воздух плохо проводит тепло)","Дешевле","Лучше пропускают свет"],a:1,ex:"Воздух — плохой проводник тепла. Больше прослоёк → меньше теплопотери в суровые морозы."},
{q:"Верно ли «Шуба греет человека»? Кто на самом деле греет?",opts:["Да, шуба выделяет тепло","Нет, греет сам человек; шуба замедляет потери тепла (плохая теплопроводность)","Греет окружающий воздух","Оба одинаково"],a:1,ex:"Шуба — теплоизолятор (воздух в меху плохо проводит тепло). Тепло выделяет организм; шуба лишь замедляет его потери."},
{q:"Почему медицинский термометр держат под мышкой не менее 5–7 мин?",opts:["Ртуть долго расширяется","Теплопроводность тела невысокая — нужно время для выравнивания температур","Для дезинфекции","Для калибровки шкалы"],a:1,ex:"Теплопроводность кожи и мышц сравнительно низка. До выравнивания температуры нужно 5–7 минут."},
{q:"Почему стальные ножницы кажутся холоднее деревянного карандаша в той же комнате?",opts:["Ножницы тяжелее","Металл быстро отводит тепло от руки (высокая теплопроводность)","Карандаш нагрет","Ножницы испаряют влагу"],a:1,ex:"Ножницы из металла быстро отводят тепло от тёплой руки. Карандаш (дерево) с низкой теплопроводностью отводит тепло медленнее — кажется теплее."},
{q:"Одинакова ли теплопроводность пенопласта $\\rho_1 = 20$ кг/м³ и $\\rho_2 = 50$ кг/м³?",opts:["Да","Нет, у $\\rho_2 = 50$ теплопроводность выше (меньше воздуха)","Нет, у $\\rho_1 = 20$ теплопроводность выше","Зависит от температуры"],a:1,ex:"В более плотном пенопласте меньше воздушных пустот. Воздух — плохой теплопроводник, поэтому более плотный пенопласт чуть хуже изолирует."},
{q:"Зачем из термоса выкачивают воздух между стенками?",opts:["Уменьшить вес","Вакуум устраняет теплопроводность и конвекцию — минимизирует все виды теплопередачи","Вакуум отражает тепло","Создаёт давление для сохранения тепла"],a:1,ex:"Без газовых молекул нет теплопроводности. Без вещества нет конвекции. Вместе с отражающими стенками это минимизирует теплопотери."}
];
var TASKS_P4 = [
{q:"Почему конвекция невозможна в твёрдых телах?",opts:["Они слишком плотные","Молекулы твёрдого тела удерживаются в узлах решётки — не могут свободно перемещаться","Они не нагреваются","Нет теплопроводности"],a:1,ex:"При конвекции перемещаются сами объёмы вещества. В твёрдых телах молекулы только колеблются на своих местах."},
{q:"Какую роль играет конвекция при обогреве комнаты батареей?",opts:["Никакую","Горячий воздух от батареи поднимается, холодный опускается — вся комната нагревается","Батарея греет только излучением","Теплопроводность стен передаёт тепло"],a:1,ex:"Нагретый воздух у батареи поднимается, холодный опускается, занимая его место. Конвекционный поток охватывает всю комнату."},
{q:"Охлаждение комнаты через форточку — конвекция или теплопроводность?",opts:["Теплопроводность через стекло","Конвекция: холодный воздух тяжелее и опускается с форточки","Только излучение","Диффузия молекул"],a:1,ex:"Холодный воздух с улицы плотнее тёплого. Он поступает через форточку вниз — это конвекция."},
{q:"Чем конвекция отличается от теплопроводности?",opts:["Конвекция — только в газах, теплопроводность — только в металлах","При конвекции перемещается само вещество; при теплопроводности — только энергия через столкновения","Конвекция при высоких T","Конвекция не требует контакта"],a:1,ex:"Теплопроводность: энергия передаётся от молекулы к молекуле без переноса вещества. Конвекция: перемещаются нагретые объёмы вещества."}
];
var TASKS_P5 = [
{q:"Почему форточки делают в верхней части окна?",opts:["Удобнее открывать","Тёплый воздух скапливается вверху; верхняя форточка обеспечивает вентиляцию","Нижняя форточка опасна","Традиция"],a:1,ex:"Тёплый воздух легче и поднимается вверх. Верхняя форточка эффективно вентилирует комнату."},
{q:"Как быстрее охладить бутылку: поставить на лёд или обложить льдом сверху?",opts:["Одинаково","Поставить на лёд","Обложить сверху — холодный воздух опускается вниз и охлаждает бутылку","Погрузить в воду"],a:2,ex:"Холодный воздух тяжелее тёплого. Если лёд сверху, охлаждённый воздух опускается вниз, огибая бутылку."},
{q:"Почему подвал — самое холодное место в доме зимой?",opts:["Нет солнечного света","Холодный воздух плотнее и опускается вниз по конвекции","Земля забирает тепло","Нет источников тепла"],a:1,ex:"Холодный воздух плотнее тёплого и по конвекции скапливается внизу здания — в подвале."},
{q:"В каком кофейнике одинаковый объём воды закипит быстрее: тёмном матовом или блестящем светлом?",opts:["В блестящем","В тёмном матовом — тёмная поверхность лучше поглощает тепловое излучение","Одинаково","В большем"],a:1,ex:"Тёмная матовая поверхность лучше поглощает тепловое излучение конфорки."},
{q:"Почему снег в городе тает быстрее, чем в лесу?",opts:["В городе теплее из-за людей","Тёмные поверхности города поглощают больше солнечного излучения и нагревают воздух","В лесу деревья защищают снег","Сильнее ветер"],a:1,ex:"Асфальт и крыши тёмные — поглощают больше солнечного тепла. В лесу снег в тени деревьев."},
{q:"Почему поверхность цилиндров мотоцикла делают ребристой?",opts:["Красиво","Рёбра увеличивают площадь поверхности и улучшают теплообмен с воздухом","Рёбра придают жёсткость","Легче крепить двигатель"],a:1,ex:"Рёбра значительно увеличивают площадь охлаждения. Чем больше площадь — тем больше тепла передаётся воздуху."},
{q:"Вагон-рефрижератор снаружи окрашен в светлый цвет. Почему?",opts:["Обозначение типа","Светлые цвета меньше поглощают солнечное излучение — внутри прохладнее","Светлая краска дешевле","Защита от коррозии"],a:1,ex:"Светлые поверхности хуже поглощают тепловое излучение Солнца — внутри дольше сохраняется холод."},
{q:"Кто прав — Маша (чёрная одежда лучше) или Дима (светлая лучше) в жаркую погоду?",opts:["Маша — чёрная и излучает больше","Дима — светлая отражает солнечное излучение, тело меньше нагревается","Оба правы","Цвет одежды не важен"],a:1,ex:"На солнце главное — отразить излучение. Светлая одежда отражает его лучше, не давая телу нагреться."},
{q:"При горении свечи верхняя часть парафина расплавлена. Какие виды теплопередачи задействованы?",opts:["Только теплопроводность","Только конвекция","Только излучение","Теплопроводность парафина + излучение от пламени"],a:3,ex:"От пламени к парафину — излучение. Внутри парафина тепло распространяется теплопроводностью."},
{q:"Каким видом теплопередачи объясняется понижение уровня воды в озере в жаркий день?",opts:["Конвекцией","Теплопроводностью через дно","Излучением Солнца — испарение воды","Теплопроводностью через берег"],a:2,ex:"Солнечное излучение нагревает поверхность воды, вызывая испарение. Уровень понижается."},
{q:"Каким видом теплопередачи объясняется остывание воды в озере в прохладную ночь?",opts:["Конвекцией воздуха","Излучением тепла в ночное небо","Теплопроводностью через дно","Испарением воды"],a:1,ex:"Ночью вода излучает тепловую энергию в сторону более холодного неба — поверхность охлаждается."}
];
var TASKS_P6 = [
{q:"Чайная ложка получила $Q = 690$ Дж и нагрелась на $\\Delta t = 75$°C. Сколько теплоты выделится при её остывании на те же 75°C?",hint:"$Q$ при нагреве = $Q$ при охлаждении на ту же $\\Delta t$",unit:"Дж",a:690,ex:"$Q = cm\\Delta t$. При нагреве и охлаждении на одинаковую $\\Delta t$ значение $Q$ одинаково. Ответ: 690 Дж."},
{q:"Сколько теплоты нужно для нагрева 1 л воды от $t_1 = 15$°C до кипения (100°C)? $c = 4200$ Дж/(кг·°C), $m = 1$ кг.",hint:"$Q = cm(t_2 - t_1)$; $\\Delta t = 100 - 15 = 85$°C",unit:"кДж",a:357,ex:"$Q = 4200 \\times 1 \\times 85 = 357\\,000$ Дж = 357 кДж"},
{q:"Из какого металла статуэтка $m = 200$ г, если нагрев на $\\Delta t = 10$°C потребовал $Q = 500$ Дж?",opts:["Алюминий ($c = 900$ Дж/(кг·°C))","Серебро ($c \\approx 235$ Дж/(кг·°C))","Железо ($c = 460$ Дж/(кг·°C))","Медь ($c = 385$ Дж/(кг·°C))"],a:1,ex:"$c = Q/(m\\Delta t) = 500/(0{,}2 \\times 10) = 250$ Дж/(кг·°C). Ближайшее к таблице — серебро ($c = 235$ Дж/(кг·°C))."},
{q:"Воду $m_1 = 300$ г при $t_1 = 80$°C смешали с водой $m_2 = 200$ г при $t_2 = 20$°C. Найдите температуру смеси.",hint:"$Q_\\text{отд} = Q_\\text{погл}$; $cm_1(t_1 - t) = cm_2(t - t_2)$",unit:"°C",a:56,ex:"$0{,}3(80 - t) = 0{,}2(t - 20)$; $24 - 0{,}3t = 0{,}2t - 4$; $28 = 0{,}5t$; $t = 56$°C"},
{q:"Сколько теплоты выделит медная деталь $m = 0{,}5$ кг при охлаждении от 300°C до 20°C? $c(\\text{Cu}) = 385$ Дж/(кг·°C).",hint:"$Q = cm\\Delta t$; $\\Delta t = 280$°C",unit:"кДж",a:53.9,ex:"$Q = 385 \\times 0{,}5 \\times 280 = 53\\,900$ Дж $\\approx 53{,}9$ кДж"},
{q:"Какое количество теплоты поглощается при нагреве стальной детали $m = 10{,}0$ кг от $t_1 = 100$°C до $t_2 = 150$°C? $c_\\text{ст} = 460$ Дж/(кг·°C).",hint:"$Q = cm\\Delta t$",unit:"кДж",a:230,ex:"$Q = 460 \\times 10 \\times 50 = 230\\,000$ Дж = 230 кДж"},
{q:"Сколько теплоты выделяется при охлаждении воды объёмом $V = 200$ мл от $t_1 = 90{,}0$°C до $t_2 = 30{,}0$°C?",hint:"$m = \\rho V = 0{,}200$ кг; $Q = cm\\Delta t$",unit:"кДж",a:50.4,ex:"$Q = 4200 \\times 0{,}200 \\times 60 = 50\\,400$ Дж = 50,4 кДж"},
{q:"Найдите удельную теплоёмкость чугуна, если при охлаждении чугунной детали $m = 20{,}0$ кг от 130°C до 80°C выделилось $Q = 0{,}550$ МДж.",hint:"$c = Q / (m \\cdot \\Delta t)$",unit:"Дж/(кг·°C)",a:550,ex:"$c = 550\\,000 / (20 \\times 50) = 550$ Дж/(кг·°C)"},
{q:"До какой температуры нагреется кусочек олова $m = 10$ г при начальной температуре $t_1 = 20$°C, если ему сообщили $Q = 57$ Дж? $c_\\text{Sn} = 230$ Дж/(кг·°C).",hint:"$t_2 = t_1 + Q/(cm)$",unit:"°C",a:44.8,ex:"$\\Delta t = 57/(230 \\times 0{,}01) = 24{,}8$°C; $t_2 = 20 + 24{,}8 \\approx 45$°C"},
{q:"На сколько нагреется стальная плита $m_2 = 10$ кг, если молот $m_1 = 600$ кг падает с $h = 5{,}0$ м и 40% его механической энергии идёт на нагрев плиты? $c_\\text{ст} = 460$ Дж/(кг·°C).",hint:"$Q = 0{,}4 \\cdot m_1 g h$; $\\Delta t = Q/(c \\cdot m_2)$",unit:"°C",a:2.6,ex:"$Q = 0{,}4 \\times 600 \\times 10 \\times 5 = 12\\,000$ Дж; $\\Delta t = 12000/(460 \\times 10) \\approx 2{,}6$°C"},
{q:"С какой высоты должен упасть свинцовый шарик, чтобы его температура выросла на $\\Delta t = 1{,}0$°C? 60% механической энергии → нагрев. $c_\\text{Pb} = 128$ Дж/(кг·°C).",hint:"$0{,}6 \\cdot mgh = cm\\Delta t$ → $h = c\\Delta t/(0{,}6g)$",unit:"м",a:21.3,ex:"$h = 128 \\times 1{,}0 / (0{,}6 \\times 10) = 21{,}3$ м"},
{q:"Три кирпича одинаковой массы: два при $t_1 = 20$°C и один при $t_2 = 80$°C. Найдите установившуюся температуру (потерями пренебречь).",hint:"$cm(t_2 - T) = 2cm(T - t_1)$",unit:"°C",a:40,ex:"$80-T = 2(T-20)$; $80-T = 2T-40$; $3T = 120$; $T = 40$°C"},
{q:"На сколько изменилась температура воды объёмом $V = 5{,}0$ л, если она выделила $Q = 0{,}21$ МДж?",hint:"$\\Delta t = Q/(cm)$; $m = \\rho V = 5$ кг",unit:"°C",a:10,ex:"$\\Delta t = 210\\,000/(4200 \\times 5) = 10$°C. Температура понизилась на 10°C."}
];
var TASKS_P7 = [
{q:"Сколько теплоты выделится при сгорании каменного угля $m = 10$ кг? $q = 27$ МДж/кг.",hint:"$Q = qm$",unit:"МДж",a:270,ex:"$Q = 27 \\times 10 = 270$ МДж"},
{q:"Что выделит больше тепла: дрова $m_1 = 14{,}5$ кг или торф $m_2 = 8{,}0$ кг? ($q_\\text{дров} = 10$, $q_\\text{торфа} = 19$ МДж/кг)",opts:["Дрова: $Q = 145$ МДж $>$ $Q_\\text{торфа} = 152$ МДж","Торф: $Q = 152$ МДж $>$ $Q_\\text{дров} = 145$ МДж","Одинаково","Зависит от влажности"],a:1,ex:"$Q(\\text{дрова}) = 10 \\times 14{,}5 = 145$ МДж; $Q(\\text{торф}) = 19 \\times 8 = 152$ МДж. Торф на 7 МДж больше."},
{q:"При сгорании $m = 50$ кг выделилось $Q = 750$ МДж. Какое это топливо? ($q = Q/m$)",opts:["Дрова ($q = 10$ МДж/кг)","Торф ($q \\approx 15$ МДж/кг)","Бензин ($q = 47$ МДж/кг)","Природный газ ($q = 44$ МДж/кг)"],a:1,ex:"$q = Q/m = 750/50 = 15$ МДж/кг. Ближайшее к таблице — торф (19 МДж/кг). Вероятно, влажный торф."},
{q:"1 л бензина ($\\rho = 710$ кг/м³, $q = 47$ МДж/кг) и 1 л керосина ($\\rho = 800$ кг/м³, $q = 44$ МДж/кг). Что выделит больше тепла?",opts:["Бензин: $Q \\approx 33{,}4$ МДж","Керосин: $Q = 35{,}2$ МДж — больше","Одинаково","Зависит от горелки"],a:1,ex:"$m_\\text{б} = 0{,}71$ кг; $Q_\\text{б} = 47 \\times 0{,}71 \\approx 33{,}4$ МДж; $m_\\text{к} = 0{,}80$ кг; $Q_\\text{к} = 44 \\times 0{,}8 = 35{,}2$ МДж."},
{q:"Во сколько раз водород ($q = 120$ МДж/кг) эффективнее бензина ($q = 47$ МДж/кг)?",hint:"$k = q_{H_2} / q_\\text{бенз}$",unit:"раза",a:2.55,ex:"$k = 120 / 47 \\approx 2{,}55$. Водород почти в 2,5 раза эффективнее и экологически чище."},
{q:"Сколько дров ($q = 10$ МДж/кг) нужно сжечь, чтобы нагреть воду $m = 50$ кг от 20 до 100°C при КПД 50%? $c = 4200$ Дж/(кг·°C).",hint:"$Q_\\text{пол} = cm\\Delta t$; $m_\\text{дров} = Q_\\text{пол} / (q \\cdot \\eta)$",unit:"кг",a:3.36,ex:"$Q = 4200 \\times 50 \\times 80 = 16{,}8$ МДж; $m = 16{,}8 / (10 \\times 0{,}5) = 3{,}36$ кг"},
{q:"Какое количество теплоты выделяется при полном сгорании керосина $m = 0{,}50$ кг? $q_\\text{кер} = 44$ МДж/кг.",hint:"$Q = qm$",unit:"МДж",a:22,ex:"$Q = 44 \\times 0{,}50 = 22$ МДж"},
{q:"При полном сгорании $m = 0{,}25$ кг некоторого топлива выделилось $Q = 10$ МДж. Какое это топливо?",opts:["Дрова ($q = 10$ МДж/кг)","Торф ($q = 19$ МДж/кг)","Мазут ($q \\approx 40$ МДж/кг)","Бензин ($q = 47$ МДж/кг)"],a:2,ex:"$q = Q/m = 10/0{,}25 = 40$ МДж/кг — мазут ($q \\approx 40$ МДж/кг)."},
{q:"При сгорании $m = 280$ г некоего топлива выделяется теплота, достаточная для нагрева $V = 20$ л воды от 0 до 100°C (КПД = 100%). Какое это топливо?",opts:["Торф ($q = 19$ МДж/кг)","Кокс ($q = 30$ МДж/кг)","Бензин ($q = 47$ МДж/кг)","Природный газ ($q = 44$ МДж/кг)"],a:1,ex:"$Q = 4200 \\times 20 \\times 100 = 8{,}4$ МДж; $q = Q/m = 8{,}4/0{,}28 = 30$ МДж/кг — кокс."},
{q:"При полном сгорании $m = 1{,}0$ кг торфа вся теплота идёт на нагрев стальной заготовки $m_\\text{ст} = 10$ кг от $t_1 = 20$°C. До какой температуры нагреется заготовка? $q_\\text{торф} = 19$ МДж/кг, $c_\\text{ст} = 460$ Дж/(кг·°C).",hint:"$qm_\\text{торф} = c_\\text{ст} m_\\text{ст}(t_2 - t_1)$",unit:"°C",a:4150,ex:"$\\Delta t = 19\\times10^6/(460\\times10) = 4130$°C; $t_2 = 20 + 4130 = 4150$°C — температура выше точки плавления стали (1500°C), значит КПД реальной печи не 100%."}
];
var TASKS_P8 = [
{q:"Что такое плавление и кристаллизация?",opts:["Плавление тв.→жид.; кристаллизация жид.→тв.","Плавление жид.→газ; кристаллизация газ→жид.","Одно и то же","Плавление тв.→газ"],a:0,ex:"Плавление — переход тв. в жид. состояние при $T_\\text{пл}$. Кристаллизация — обратный процесс."},
{q:"Почему температура вещества при плавлении не меняется?",opts:["Плавление идёт очень быстро","Вся энергия идёт на разрушение кристаллической решётки, а не на разгон молекул","Температура не может расти быстрее","Плавление экзотермично"],a:1,ex:"При плавлении теплота тратится на разрушение кристаллической решётки (рост потенциальной энергии), а не на ускорение молекул. Кинетическая энергия не растёт — $T = \\text{const}$."},
{q:"Можно ли расплавить гвоздь, посыпав на него лёд при 0°C?",opts:["Да, лёд поглощает тепло из гвоздя","Нет — 0°C намного ниже $t_\\text{пл}$ железа (1539°C)","Да, при таянии выделяется тепло","Нет, железо тяжелее льда"],a:1,ex:"Температура плавления железа 1539°C. Лёд при 0°C будет поглощать тепло от гвоздя, а не давать его."},
{q:"В каком состоянии находится свинец при $t = 330$°C? $t_\\text{пл}$(Pb) = 327°C.",opts:["Твёрдом","Жидком — $t > t_\\text{пл}$","Газообразном","Переходном"],a:1,ex:"330°C > 327°C ($t_\\text{пл}$ свинца) → свинец в жидком состоянии."},
{q:"Принесли лёд при −5°C в сарай при 0°C. Будет ли таять?",opts:["Да, сразу начнёт","Лёд нагреется до 0°C, затем начнётся медленное плавление (если есть приток тепла)","Нет — лёд не тает при 0°C","Зависит от размера"],a:1,ex:"Лёд холоднее воздуха сарая → поглощает тепло, нагревается до 0°C. При $t_\\text{сарая} = 0$°C плавление идёт очень медленно."},
{q:"Как изменяется внутренняя энергия при плавлении кристаллического тела?",opts:["Уменьшается","Не изменяется","Увеличивается — за счёт потенциальной энергии молекул","Сначала растёт, потом уменьшается"],a:2,ex:"При плавлении разрушается кристаллическая решётка. Потенциальная энергия молекул растёт — внутренняя энергия увеличивается."},
{q:"Почему верхняя часть парафиновой свечи расплавлена, а нижняя — твёрдая?",opts:["Парафин плавится только от огня","Теплопроводность парафина низкая — тепло не доходит до низа","Нижнюю часть охлаждает воздух","Нижняя часть другого состава"],a:1,ex:"Теплопроводность парафина невысока. Пламя нагревает область у фитиля выше $t_\\text{пл}$, но внизу температура падает ниже $t_\\text{пл}$."}
];
var TASKS_P9 = [
{q:"Что выделит больше тепла при кристаллизации 1 кг: медь ($\\lambda=205$ кДж/кг) или алюминий ($\\lambda=390$ кДж/кг)?",opts:["Медь","Алюминий — в 390/205 ≈ 1,9 раза больше","Одинаково","Зависит от температуры"],a:1,ex:"$Q(\\text{Cu}) = 205$ кДж; $Q(\\text{Al}) = 390$ кДж. Алюминий выделяет в ≈1,9 раза больше теплоты при кристаллизации."},
{q:"На сколько увеличится внутренняя энергия серебра $m = 2$ кг при плавлении? $\\lambda(\\text{Ag}) = 88$ кДж/кг.",hint:"$\\Delta U = Q = \\lambda m$",unit:"кДж",a:176,ex:"$\\Delta U = 88 \\times 2 = 176$ кДж. Вся теплота плавления идёт на увеличение потенциальной энергии молекул."},
{q:"Сколько теплоты нужно, чтобы расплавить золото $V = 60$ см³ при $t_\\text{пл}$? $\\rho = 19\\,300$ кг/м³, $\\lambda = 67$ кДж/кг.",hint:"$m = \\rho V$; $Q = \\lambda m$",unit:"кДж",a:77.5,ex:"$m = 19300 \\times 60 \\cdot 10^{-6} = 1{,}158$ кг; $Q = 67 \\times 1{,}158 \\approx 77{,}5$ кДж"},
{q:"Сколько теплоты нужно, чтобы расплавить лёд $m = 3$ кг при $t = 0$°C? $\\lambda = 333$ кДж/кг.",hint:"$Q = \\lambda m$",unit:"кДж",a:999,ex:"$Q = 333 \\times 3 = 999$ кДж"},
{q:"Сколько теплоты нужно для льда $m = 3$ кг при $t = -10$°C? $c_\\text{льда} = 2090$ Дж/(кг·°C), $\\lambda = 333$ кДж/кг.",hint:"$Q = cm \\cdot 10 + \\lambda m$ (нагрев до 0°C + плавление)",unit:"кДж",a:1062,ex:"$Q_1 = 2090 \\times 3 \\times 10 = 62{,}7$ кДж; $Q_2 = 999$ кДж; $Q = 1061{,}7 \\approx 1062$ кДж"},
{q:"Что означает $\\lambda(\\text{олова}) = 60\\,300$ Дж/кг?",opts:["Олово плавится при 60 300°C","Для плавления 1 кг олова при $t_\\text{пл}$ нужно 60 300 Дж теплоты","При кристаллизации 1 г олова выделяется 60 300 Дж","Масса олова при плавлении"],a:1,ex:"Удельная теплота плавления $\\lambda = 60\\,300$ Дж/кг означает: для перехода 1 кг олова из твёрдого в жидкое при $t_\\text{пл}$ необходимо $60\\,300$ Дж."},
{q:"Сколько кДж теплоты нужно для плавления серебра $m = 500$ г? $\\lambda(\\text{Ag}) = 88$ кДж/кг.",hint:"$Q = \\lambda m$",unit:"кДж",a:44,ex:"$Q = 88 \\times 0{,}5 = 44$ кДж"},
{q:"Какое количество теплоты выделяется при кристаллизации жидкого кислорода $m = 2{,}0$ кг при $t = -219$°C? $\\lambda_{O_2} = 13{,}8$ кДж/кг.",hint:"$Q = \\lambda m$",unit:"кДж",a:27.6,ex:"$Q = 13{,}8 \\times 2{,}0 = 27{,}6$ кДж. При кристаллизации выделяется столько же, сколько поглощается при плавлении."},
{q:"Определите плотность льда при $t = 0{,}0$°C, если для плавления $V = 1{,}00$ дм³ льда требуется $Q = 301{,}5$ кДж. $\\lambda = 333$ кДж/кг.",hint:"$m = Q/\\lambda$; $\\rho = m/V$",unit:"кг/м³",a:905,ex:"$m = 301500/333000 = 0{,}905$ кг; $\\rho = 0{,}905/10^{-3} = 905$ кг/м³. Лёд легче воды — поэтому плавает!"},
{q:"В калориметр со льдом при $t_1 = 0{,}0$°C влили воду $m_2 = 0{,}50$ кг при $t_2 = 30$°C. Лёд полностью растаял, $T = 0{,}0$°C. Найдите массу льда.",hint:"Всё тепло воды → плавление льда: $cm_2 t_2 = \\lambda m_1$",unit:"кг",a:0.189,ex:"$m_1 = 4200 \\times 0{,}5 \\times 30 / 333000 = 0{,}189$ кг"},
{q:"Калориметр: лёд $m_1 = 0{,}10$ кг при $0$°C + вода $m_2 = 0{,}50$ кг при $t_2 = 70$°C. Найдите конечную температуру.",hint:"Проверь: тепла достаточно для плавления? Затем $Q_\\text{ост} = c(m_1+m_2)T$",unit:"°C",a:45,ex:"$Q_\\text{воды} = 4200 \\times 0{,}5 \\times 70 = 147\\,000$ Дж; $Q_\\text{пл} = 333\\,000 \\times 0{,}1 = 33\\,300$ Дж; $Q_\\text{ост} = 113\\,700$ Дж; $T = 113700/(4200 \\times 0{,}6) \\approx 45$°C"},
{q:"В калориметр: снег $m_1 = 100$ г при $0$°C + железная гиря $m_2 = 200$ г при $t_2 = 100$°C. Сколько снега растает? $c_\\text{Fe} = 460$ Дж/(кг·°C), $\\lambda = 333$ кДж/кг.",hint:"$Q_\\text{гири} = c_{Fe}m_2 \\cdot 100$; $m_\\text{расплавленного} = Q_\\text{гири}/\\lambda$",unit:"г",a:27.6,ex:"$Q = 460 \\times 0{,}2 \\times 100 = 9200$ Дж; $m = 9200/333000 \\approx 0{,}0276$ кг = 27,6 г — лишь четверть снега растает."}
];
var TASKS_P10 = [
{q:"В каком флаконе духи сохраняются дольше — с узким или широким горлышком?",opts:["С широким","С узким — меньше площадь испарения","Одинаково","С широким — лучше циркуляция"],a:1,ex:"Скорость испарения зависит от площади поверхности. Узкое горлышко уменьшает площадь → медленнее испарение."},
{q:"Почему бельё сохнет быстрее при ветре?",opts:["Ветер нагревает бельё","Ветер удаляет насыщенный пар — испарение ускоряется","Ветер давит на бельё","Ветер охлаждает воду"],a:1,ex:"Ветер уносит насыщенный пар и заменяет его ненасыщенным воздухом → давление пара над поверхностью падает → испарение ускоряется."},
{q:"Почему мокрая тряпка охлаждает сосуд в жару?",opts:["Тряпка отражает излучение","При испарении воды поглощается тепло тела/сосуда","Тряпка плохо проводит тепло","Создаёт давление"],a:1,ex:"Испарение — эндотермический процесс. Нужная энергия поглощается из сосуда и воды. Сосуд охлаждается."},
{q:"Будет ли испаряться вода из стакана при t = −2°C?",opts:["Нет — при отрицательной температуре испарение невозможно","Да — испарение идёт при любой температуре, только медленнее","Нет — вода замёрзнет","Только при ветре"],a:1,ex:"Испарение происходит при любой температуре выше абсолютного нуля. При −2°C очень медленно."},
{q:"Нарушится ли равновесие весов, если на одну чашу поставить ацетон, на другую — воду?",opts:["Нет","Да — чаша с ацетоном поднимется (ацетон испаряется быстрее, масса уменьшается)","Да — поднимется чаша с водой","Зависит от объёма"],a:1,ex:"Ацетон испаряется намного быстрее воды. Масса ацетона уменьшается быстрее — его чаша поднимается."},
{q:"Почему купальщик ощущает холод, выходя из воды?",opts:["Воздух холоднее воды","Вода испаряется с кожи и поглощает тепло тела","Мокрая кожа лучше проводит тепло","Мокрая одежда тяжелее"],a:1,ex:"Вода на коже испаряется — при испарении поглощается тепло. Источник тепла — тело, поэтому человек ощущает охлаждение."},
{q:"Почему вспотевшему человеку вредно выходить на холодный воздух?",opts:["Холодный воздух вреден напрямую","На холоде пот испаряется быстрее, резко охлаждая тело","Пот замерзает","Влажная кожа хуже защищает"],a:1,ex:"На холодном воздухе испарение пота резко ускоряется. Интенсивное охлаждение тела может привести к болезни."},
{q:"Какое значение для человека имеет потоотделение?",opts:["Выводит токсины","Регулирует температуру тела: испарение пота охлаждает кожу при перегреве","Увлажняет кожу","Защищает от ультрафиолета"],a:1,ex:"Испарение пота — главный механизм терморегуляции организма. Предотвращает перегрев в жару."}
];
var TASKS_P11 = [
{q:"Как разделить смесь воды и спирта?",opts:["Фильтрованием","Дистилляцией — нагреть до $t_\\text{кип}$ спирта (78°C), он испаряется первым","Охлаждением","Центрифугированием"],a:1,ex:"Дистилляция: нагреваем до 78°C — спирт кипит первым. Его пар конденсируют отдельно."},
{q:"Где мясо сварится быстрее: у подножия Эвереста или на вершине (~31 кПа)?",opts:["На вершине","У подножия — давление больше, $t_\\text{кип}$ воды выше (~100°C > ~70°C)","Одинаково","На вершине — мясо сохнет"],a:1,ex:"На вершине давление ~31 кПа → $t_\\text{кип} \\approx 70$°C. При 70°C мясо варится намного медленнее."},
{q:"Сколько теплоты нужно, чтобы превратить воду $m = 2$ кг при 100°C в пар? $L = 2260$ кДж/кг.",hint:"$Q = Lm$",unit:"кДж",a:4520,ex:"$Q = 2260 \\times 2 = 4520$ кДж"},
{q:"Почему ожог паром при 100°C опаснее ожога водой при 100°C?",opts:["Пар горячее воды","При конденсации пара выделяется дополнительная теплота $L \\approx 2260$ кДж/кг","Пар проникает в поры","Пар содержит активные молекулы"],a:1,ex:"Пар, конденсируясь на коже, выделяет теплоту $L$. Суммарно кожа получает намного больше тепла от пара, чем от воды той же массы."},
{q:"Скороварка готовит быстрее. Почему?",opts:["Давление уплотняет пищу","Повышенное давление поднимает $t_\\text{кип}$ воды выше 100°C","Лучше проводит тепло","Меньше воздуха"],a:1,ex:"В скороварке давление выше атмосферного → $t_\\text{кип}$ воды > 100°C → еда готовится при более высокой температуре."},
{q:"Что происходит на горизонтальном участке графика $T(t)$ при нагреве воды?",opts:["Нагрев жидкости","Кипение — $T = \\text{const}$, вся теплота идёт на парообразование","Конденсация пара","Плавление льда"],a:1,ex:"При кипении $T = \\text{const}$ (100°C для воды). Вся теплота идёт на разрыв межмолекулярных связей, а не на разгон молекул."},
{q:"Сколько теплоты выделится при конденсации пара $m = 0{,}1$ кг при 100°C? $L = 2260$ кДж/кг.",hint:"$Q = Lm$ (выделяется)",unit:"кДж",a:226,ex:"$Q = 2260 \\times 0{,}1 = 226$ кДж. При конденсации выделяется столько же, сколько затрачивается на испарение той же массы."},
{q:"Что такое удельная теплота парообразования $L$?",opts:["Количество теплоты для нагрева 1 кг на 1°C","Количество теплоты для превращения 1 кг жидкости в пар при $t_\\text{кип}$","Температура кипения","Давление кипения"],a:1,ex:"$L$ — удельная теплота парообразования: количество теплоты для превращения 1 кг жидкости в пар при $t_\\text{кип}$. Единица: Дж/кг."},
{q:"Сколько теплоты нужно для превращения льда $m = 200$ г при 0°C в пар при 100°C? $\\lambda=333$ кДж/кг, $c=4200$ Дж/(кг·°C), $L=2260$ кДж/кг.",hint:"$Q = \\lambda m + cm \\cdot 100 + Lm$",unit:"кДж",a:602.6,ex:"$Q_1 = 333 \\times 0{,}2 = 66{,}6$ кДж; $Q_2 = 4200 \\times 0{,}2 \\times 100 = 84$ кДж; $Q_3 = 2260 \\times 0{,}2 = 452$ кДж; $Q = 602{,}6$ кДж"},
{q:"Какое количество теплоты нужно передать ацетону $m = 2{,}0$ кг при температуре кипения, чтобы перевести его в пар? $L_\\text{ацетона} = 520$ кДж/кг.",hint:"$Q = Lm$",unit:"кДж",a:1040,ex:"$Q = 520 \\times 2{,}0 = 1040$ кДж"},
{q:"Вычислите удельную теплоту парообразования жидкого азота, если $m = 4{,}0$ г азота при переходе в пар при $t_\\text{кип}$ поглощает $Q = 804$ Дж.",hint:"$L = Q/m$",unit:"кДж/кг",a:201,ex:"$L = 804/0{,}004 = 201\\,000$ Дж/кг = 201 кДж/кг"},
{q:"Какую массу водяного пара при $t = 100$°C надо впустить в $V = 1{,}0$ л воды при $t_1 = 20$°C, чтобы конечная температура стала 100°C?",hint:"$Lm_\\text{пара} = cm_\\text{воды}(100-20)$",unit:"г",a:149,ex:"$m_\\text{пара} = 4200 \\times 1 \\times 80 / 2\\,260\\,000 \\approx 0{,}149$ кг = 149 г"},
{q:"В калориметр с кипящей водой (100°C) бросили медный шар $m = 0{,}50$ кг при $t = 500$°C. Определите массу испарившейся воды. $c_\\text{Cu} = 385$ Дж/(кг·°C), $L = 2260$ кДж/кг.",hint:"$c_\\text{Cu}m(500-100) = Lm_\\text{пара}$",unit:"г",a:34,ex:"$Q = 385 \\times 0{,}5 \\times 400 = 77\\,000$ Дж; $m_\\text{пара} = 77000/2260000 \\approx 0{,}034$ кг = 34 г"},
{q:"Какую массу воды при $t_\\text{кип} = 100$°C можно испарить, затратив столько же теплоты, сколько нужно для плавления льда $m_1 = 1{,}0$ кг при 0°C? $\\lambda=333$ кДж/кг, $L=2260$ кДж/кг.",hint:"$\\lambda m_1 = Lm_2$",unit:"г",a:147,ex:"$Q = 333\\,000$ Дж; $m_2 = 333000/2260000 \\approx 0{,}147$ кг = 147 г"},
{q:"В каком процессе поглощается больше теплоты: при плавлении льда $m_1 = 10$ кг или при испарении воды $m_2 = 1{,}0$ кг при 100°C? $\\lambda=333$ кДж/кг, $L=2260$ кДж/кг.",opts:["Плавление льда поглощает больше: $Q_1 = 3330$ кДж $> Q_2 = 2260$ кДж","Испарение воды поглощает больше: $Q_2 = 2260$ кДж $> Q_1 = 333$ кДж","Плавление льда: $Q_1 = 333$ кДж; испарение воды: $Q_2 = 2260$ кДж — испарение больше","Одинаково"],a:0,ex:"$Q_1 = \\lambda m_1 = 333 \\times 10 = 3330$ кДж; $Q_2 = L m_2 = 2260 \\times 1 = 2260$ кДж. Плавление $10$ кг льда требует больше энергии."}
];
var TASKS_HARD = [
{para:"§6",q:"Смешали воду $m_1 = 0{,}5$ кг при 80°C и $m_2 = 0{,}3$ кг при 10°C. Температура смеси?",hint:"$cm_1(t_1-t)=cm_2(t-t_2)$",unit:"°C",a:53.75,ex:"$0{,}5(80-t)=0{,}3(t-10)$; $40-0{,}5t=0{,}3t-3$; $43=0{,}8t$; $t \\approx 53{,}75$°C"},
{para:"§7",q:"Тепловоз сжигает 400 кг дизельного топлива ($q=43$ МДж/кг) за 1 час. Мощность двигателя при КПД=25%?",hint:"$P = qm\\eta / t$",unit:"кВт",a:1194,ex:"$Q=43\\times10^6\\times400\\times0{,}25=4{,}3\\times10^9$ Дж; $P=4{,}3\\times10^9/3600\\approx 1194$ кВт"},
{para:"§9",q:"Серебро $m = 500$ г нагрели от 20°C до $t_\\text{пл} = 962$°C и расплавили. Суммарная теплота? $c=235$, $\\lambda=88$ кДж/кг.",hint:"$Q = cm\\Delta t + \\lambda m$",unit:"кДж",a:154.5,ex:"$Q_1=235\\times0{,}5\\times942=110{,}7$ кДж; $Q_2=88\\times0{,}5=44$ кДж; $Q\\approx154{,}7$ кДж"},
{para:"§6",q:"Из какого металла деталь $m=400$ г, если при $\\Delta t=50$°C поглощает $Q=18\\,400$ Дж?",opts:["Алюминий ($c=900$)","Железо ($c=460$)","Медь ($c=385$)","Свинец ($c=128$)"],a:0,ex:"$c=Q/(m\\Delta t)=18400/(0{,}4\\times50)=920$ Дж/(кг·°C). Ближайшее — алюминий ($c=900$ Дж/(кг·°C))."},
{para:"§11",q:"Пар $m=100$ г при 100°C конденсировался и остыл до 20°C. Сколько теплоты выделилось? $L=2260$, $c=4200$.",hint:"$Q = Lm + cm\\Delta t$",unit:"кДж",a:259.6,ex:"$Q_1=2260\\times0{,}1=226$ кДж; $Q_2=4200\\times0{,}1\\times80=33{,}6$ кДж; $Q=259{,}6$ кДж"},
{para:"§9",q:"Сколько льда при 0°C расплавит 1 кг воды, охлаждаясь от 80°C до 0°C? $c=4200$ Дж/(кг·°C), $\\lambda=333\\,000$ Дж/кг.",hint:"$Q_\\text{воды} = \\lambda \\cdot m_\\text{льда}$",unit:"г",a:1009,ex:"$Q=4200\\times1\\times80=336\\,000$ Дж; $m_\\text{льда}=336000/333000\\approx1{,}009$ кг $\\approx1009$ г"},
{para:"§8",q:"На каких участках графика нагрева вещества (AB, BC, CD, DE) температура не меняется?",opts:["AB","BC и DE","CD","Только AB"],a:1,ex:"На участках BC (плавление) и DE (кипение) $T = \\text{const}$, т.к. вся теплота идёт на фазовый переход."},
{para:"§7",q:"Сколько дров ($q=10$ МДж/кг) нужно для нагрева 50 кг воды от 20 до 100°C при КПД=60%? $c=4200$ Дж/(кг·°C).",hint:"$m = Q_\\text{пол}/(q\\eta)$; $Q_\\text{пол}=cm\\Delta t$",unit:"кг",a:2.8,ex:"$Q=4200\\times50\\times80=16{,}8$ МДж; $m=16{,}8/(10\\times0{,}6)=2{,}8$ кг"},
{para:"§6",q:"Молот $m_1=600$ кг падает с $h=5{,}0$ м на стальную плиту $m_2=10$ кг. 40% механической энергии → нагрев плиты. $c_\\text{ст}=460$ Дж/(кг·°C). Найдите $\\Delta t$ плиты.",hint:"$Q=0{,}4 m_1 g h$; $\\Delta t = Q/(c m_2)$",unit:"°C",a:2.6,ex:"$Q=0{,}4\\times600\\times10\\times5=12\\,000$ Дж; $\\Delta t=12000/(460\\times10)\\approx2{,}6$°C"},
{para:"§6",q:"С какой высоты должен упасть свинцовый шарик, чтобы его температура выросла на $\\Delta t=1{,}0$°C? 60% механической → теплота. $c_\\text{Pb}=128$ Дж/(кг·°C).",hint:"$0{,}6 mgh=cm\\Delta t$ → $m$ сокращается",unit:"м",a:21.3,ex:"$h=c\\Delta t/(0{,}6g)=128\\times1/(0{,}6\\times10)=21{,}3$ м"},
{para:"§9",q:"Нагретую железную болванку $m_\\text{Fe}=2{,}0$ кг поставили на лёд при $t_x=-10$°C. Под болванкой расплавилось $m_\\text{л}=150$ г льда. До какой температуры была нагрета болванка? $c_\\text{Fe}=460$, $c_\\text{л}=2100$ Дж/(кг·°C), $\\lambda=333$ кДж/кг.",hint:"$c_\\text{Fe}m_\\text{Fe}(t_\\text{ж}-0) = c_\\text{л}m_\\text{л}(0-t_x)+\\lambda m_\\text{л}$",unit:"°C",a:58,ex:"$460\\times2\\times t_\\text{ж} = 2100\\times0{,}15\\times10+333000\\times0{,}15 = 3150+49950=53100$; $t_\\text{ж}=53100/920\\approx58$°C"},
{para:"§7",q:"При смешивании бурого ($m_\\text{б}=2m_\\text{к}$, $q_\\text{б}=15$ МДж/кг) и каменного ($q_\\text{к}=27$ МДж/кг) угля выделилось $Q=78{,}2$ МДж. Найдите массу каменного угля.",hint:"$Q=q_\\text{б}\\cdot2m_\\text{к}+q_\\text{к}\\cdot m_\\text{к}=(2q_\\text{б}+q_\\text{к})m_\\text{к}$",unit:"кг",a:1.37,ex:"$(30+27)m_\\text{к}=78{,}2$; $m_\\text{к}=78{,}2/57\\approx1{,}37$ кг; $m_\\text{б}=2{,}74$ кг"},
{para:"§11",q:"Пар $m_2=100$ г при $t_2=100$°C конденсировался и охладился до $T=15$°C в калориметре, растопив при этом лёд при $t_1=-10$°C. Найдите массу льда. $c_\\text{л}=2090$, $c_\\text{в}=4200$ Дж/(кг·°C), $\\lambda=333$, $L=2260$ кДж/кг.",hint:"$Q_\\text{пара}=Lm_2+c_\\text{в}m_2\\cdot85$; $Q_\\text{льда}=c_\\text{л}m_1\\cdot10+\\lambda m_1+c_\\text{в}m_1\\cdot15$",unit:"г",a:73,ex:"$Q_\\text{пара}=2260\\times0{,}1+4200\\times0{,}1\\times85=226+357=583$ кДж ... $Q_\\text{льда}=(2090\\times10+333000+4200\\times15)\\times m_1=(20900+333000+63000)m_1=416900m_1$; $m_1=583000/416900\\approx0{,}073$ кг=73 г",tol:0.05},
{para:"§9",q:"Найдите объём воды при $t=20$°C, при кристаллизации которой выделяется столько же теплоты, сколько при полном сгорании бензина $m=1{,}0$ кг. $q_\\text{б}=47$ МДж/кг, $\\lambda_\\text{воды}=333$ кДж/кг.",hint:"$qm_\\text{б}=\\lambda m_\\text{воды}$; $V=m/\\rho$",unit:"л",a:141,ex:"$Q=47\\times10^6$ Дж; $m_\\text{воды}=47\\times10^6/333000\\approx141$ кг; $V=141/1000\\times1000=141$ л"},
{para:"§11",q:"Электрочайник нагревает воду от $t_1=70$°C до $t_2=80$°C за $\\tau_1=3{,}0$ мин, а охлаждается от 80°C до 70°C за $\\tau_2=9{,}0$ мин. Какая часть теплоты, выделяемой спиралью, рассеивается в среду?",hint:"$P_\\text{рассеяния}/P_\\text{спирали} = \\tau_1/\\tau_2$",unit:"%",a:33.3,ex:"При нагреве: $P_\\text{сп}-P_\\text{расс}=cm\\Delta t/\\tau_1$. При охлаждении: $P_\\text{расс}=cm\\Delta t/\\tau_2$. Отношение: $P_\\text{расс}/P_\\text{сп}=\\tau_1/(\\tau_1+\\tau_2)=3/9=1/3\\approx33{,}3\\%$",tol:0.05}
];
// ═══════════════════════════════════════
// ПУЛЫ И СОСТОЯНИЯ
// ═══════════════════════════════════════
var POOLS = {
p1:TASKS_P1, p2:TASKS_P2, p3:TASKS_P3, p4:TASKS_P4, p5:TASKS_P5,
p6:TASKS_P6, p7:TASKS_P7, p8:TASKS_P8, p9:TASKS_P9, p10:TASKS_P10,
p11:TASKS_P11, 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 = {
p1:mkState(TASKS_P1), p2:mkState(TASKS_P2), p3:mkState(TASKS_P3),
p4:mkState(TASKS_P4), p5:mkState(TASKS_P5), p6:mkState(TASKS_P6),
p7:mkState(TASKS_P7), p8:mkState(TASKS_P8), p9:mkState(TASKS_P9),
p10:mkState(TASKS_P10), p11:mkState(TASKS_P11), 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) {
['p1','p2','p3','p4','p5','p6','p7','p8','p9','p10','p11','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(220,38,38,.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 ? 'Неплохо. Повтори формулы и попробуй ещё раз.' :
'Прочитай теорию и реши снова.';
}
// ═══════════════════════════════════════
// ЗАГЛУШКИ ИНТЕРАКТИВОВ
// ═══════════════════════════════════════
var anim1Id=null, anim4Id=null, anim5Id=null, anim10Id=null, anim11Id=null;
// ═══ §1: Молекулярное движение Pro Max (RAF) ═══
// Maxwell-Boltzmann распределение + упругие столкновения + переключение веществ
var sl1Tval = 20, state1 = 'solid', subst1 = 'H2O';
var atoms1 = [];
var SUBST1 = {
H2O: { name:'H₂O', mass:1.0, radius:4.5, tmelt:0, tboil:100, color:'#60a5fa' },
Fe: { name:'Fe', mass:3.1, radius:5.5, tmelt:1539, tboil:2862, color:'#a8a29e' },
Ar: { name:'Ar', mass:1.5, radius:4.0, tmelt:-189, tboil:-186, color:'#c4b5fd' }
};
function setState1(s) {
state1 = s;
['solid','liq','gas'].forEach(function(k,i){
var ids = ['btn1solid','btn1liq','btn1gas'];
var states = ['solid','liquid','gas'];
var btn = document.getElementById(ids[i]);
if(btn){ btn.style.background = s===states[i]?'var(--pri)':''; btn.style.color = s===states[i]?'#fff':''; }
});
startAnim1();
}
function setSubst1(name){
subst1 = name;
['H2O','Fe','Ar'].forEach(function(k){
var btn = document.getElementById('btn1sub'+k);
if(btn){ btn.style.background = subst1===k?'var(--pri)':''; btn.style.color = subst1===k?'#fff':''; }
});
// Авто-предложение состояния по T и вещества
var T = sl1Tval, sp = SUBST1[subst1];
if(T < sp.tmelt) setState1('solid');
else if(T < sp.tboil) setState1('liquid');
else setState1('gas');
upd1ChipE();
}
function upd1ChipE(){
var ch = document.getElementById('chipKE1');
if(!ch) return;
var T = (sl1Tval||20)+273; // в Кельвинах
var sp = SUBST1[subst1];
// ⟨Eₖ⟩ ∝ T (в условных единицах для наглядности)
var ke = (T*0.012).toFixed(1);
ch.textContent = '⟨Eₖ⟩ ~ '+ke+' усл.ед · m='+sp.mass.toFixed(1);
}
// Maxwell-Boltzmann: вернуть скорость для частицы при данной T
function mbSpeed(T, mass){
// Box-Muller для нормально распределённой компоненты
function gauss(){
var u=Math.random(), v=Math.random();
return Math.sqrt(-2*Math.log(u||0.001))*Math.cos(2*Math.PI*v);
}
// σ = sqrt(kT/m) — три компоненты, берём 2 (плоскость)
var sigma = Math.sqrt(Math.max(20,T+50)/mass)*0.18;
return { vx: gauss()*sigma, vy: gauss()*sigma };
}
function startAnim1() {
var cv = document.getElementById('cv1');
if (!cv || cv.offsetWidth === 0) return;
if (anim1Id) { cancelAnimationFrame(anim1Id); anim1Id = null; }
var dpr = Math.min(window.devicePixelRatio||1, 2);
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 cols = 12, rows = 8, n = cols * rows;
var sp = SUBST1[subst1];
if (!atoms1.length || atoms1.length !== n) {
atoms1 = [];
for (var i = 0; i < n; i++) {
var c = i % cols, r = Math.floor(i / cols);
var mb = mbSpeed(sl1Tval, sp.mass);
atoms1.push({
bx: (c + 0.5) * W / cols,
by: (r + 0.5) * H / rows,
ox: 0, oy: 0,
vx: mb.vx, vy: mb.vy,
phase: Math.random() * Math.PI * 2
});
}
}
var t0 = performance.now();
function frame(now) {
// фоновая заливка (мягкая, в тон canvas)
ctx.fillStyle = '#1e1b4b';
ctx.fillRect(0,0,W,H);
var T = (sl1Tval || 20);
var spLocal = SUBST1[subst1];
var R = spLocal.radius;
var amp = state1 === 'gas' ? 0 : state1 === 'liquid' ? T / 100 * 7 + 1 : T / 100 * 3 + 0.5;
var spd = T / 100 * (state1 === 'gas' ? 3 : 0.5) + 0.2;
var dt = Math.min(0.04, (now - t0) / 1000); t0 = now;
// Гистограмма скоростей в углу
var hist = new Array(8).fill(0);
var maxV = 0;
for(var k=0;k<n;k++){ var v=Math.hypot(atoms1[k].vx,atoms1[k].vy); if(v>maxV) maxV=v; }
// Расчёт положений + упругие столкновения для газа
if(state1==='gas'){
// адаптация скоростей к новой T (мягкая)
var targetSigma = Math.sqrt(Math.max(20,T+50)/spLocal.mass)*0.18;
for(var i=0;i<n;i++){
var a = atoms1[i];
// плавный пересчёт абсолютной скорости
var cur = Math.hypot(a.vx, a.vy)||0.001;
var want = Math.abs(targetSigma)*1.4;
var sc = 1 + (want-cur)*0.02/cur;
a.vx *= sc; a.vy *= sc;
a.ox += a.vx * 60 * dt;
a.oy += a.vy * 60 * dt;
var ax = a.bx + a.ox, ay = a.by + a.oy;
if (ax < R || ax > W - R) { a.vx *= -1; a.ox += a.vx*2*dt*60; }
if (ay < R || ay > H - R) { a.vy *= -1; a.oy += a.vy*2*dt*60; }
}
// Упругие столкновения O(n²) — для 96 частиц вполне ОК
for(var i=0;i<n;i++){
for(var j=i+1;j<n;j++){
var a=atoms1[i], b=atoms1[j];
var ax=a.bx+a.ox, ay=a.by+a.oy, bx=b.bx+b.ox, by=b.by+b.oy;
var dx=bx-ax, dy=by-ay, d2=dx*dx+dy*dy;
var minD = R*2;
if(d2 < minD*minD && d2 > 0.01){
var d = Math.sqrt(d2);
var nx = dx/d, ny = dy/d;
// относительная скорость по нормали
var dvx=b.vx-a.vx, dvy=b.vy-a.vy;
var p = dvx*nx + dvy*ny;
if(p<0){
// обмен импульсами (равные массы для простоты визуала)
a.vx += p*nx; a.vy += p*ny;
b.vx -= p*nx; b.vy -= p*ny;
// раздвинуть, чтобы не залипали
var overlap = (minD-d)/2;
a.ox -= nx*overlap; a.oy -= ny*overlap;
b.ox += nx*overlap; b.oy += ny*overlap;
}
}
}
}
}
// Отрисовка
for (var i = 0; i < n; i++) {
var a = atoms1[i];
var x,y;
if (state1 === 'gas') {
x = a.bx + a.ox; y = a.by + a.oy;
} else {
var ph = (now / 200 + a.phase);
a.ox = Math.sin(ph * 1.3) * amp * (0.8 + 0.4 * Math.sin(i));
a.oy = Math.cos(ph * 1.1) * amp * (0.8 + 0.4 * Math.cos(i));
if (state1 === 'liquid') {
a.bx += (Math.random() - 0.5) * 0.3;
a.by += (Math.random() - 0.5) * 0.3;
a.bx = Math.max(R+2, Math.min(W-R-2, a.bx));
a.by = Math.max(R+2, Math.min(H-R-2, a.by));
}
x = a.bx + a.ox; y = a.by + a.oy;
}
// Цвет по индивидуальной скорости (Maxwell-Boltzmann визуально)
var v = Math.hypot(a.vx, a.vy);
var vNorm = maxV>0 ? Math.min(1, v/(maxV*0.7)) : 0;
var Tfrac = Math.min(1, T / 200);
var frac = state1==='gas' ? vNorm : Tfrac;
// гистограмма
hist[Math.min(7,Math.floor(vNorm*8))]++;
var r = Math.round(frac * 230 + (1 - frac) * 60);
var g = Math.round(Math.sin(frac * Math.PI) * 80 + 50);
var b = Math.round((1 - frac) * 230 + frac * 50);
// связи (твёрдое) — кристаллическая решётка
if (state1 === 'solid' && i % cols < cols - 1) {
var j = i + 1, nb = atoms1[j];
ctx.strokeStyle = 'rgba(148,163,184,0.28)';
ctx.lineWidth = 1.2;
ctx.beginPath(); ctx.moveTo(x, y);
ctx.lineTo(nb.bx + nb.ox, nb.by + nb.oy); ctx.stroke();
}
ctx.shadowColor = 'rgb(' + r + ',' + g + ',' + b + ')';
ctx.shadowBlur = frac * 10 + 3;
ctx.fillStyle = 'rgb(' + r + ',' + g + ',' + b + ')';
ctx.beginPath(); ctx.arc(x, y, state1==='gas'? R*0.6 : R, 0, Math.PI*2); ctx.fill();
ctx.shadowBlur = 0;
}
// Maxwell-Boltzmann гистограмма в правом верхнем углу
if(state1==='gas' && W>240){
var hx = W - 110, hy = 8, hw = 100, hh = 50;
ctx.fillStyle = 'rgba(15,23,42,0.7)';
ctx.fillRect(hx-4, hy-4, hw+8, hh+18);
ctx.fillStyle = '#cbd5e1';
ctx.font = '9px system-ui';
ctx.fillText('распределение скоростей', hx, hy+9);
var maxH = Math.max.apply(null, hist)||1;
var bw = hw/hist.length;
for(var bi=0;bi<hist.length;bi++){
var bh = hist[bi]/maxH*(hh-12);
var biFrac = bi/hist.length;
ctx.fillStyle = 'hsla('+Math.round((1-biFrac)*240)+',80%,60%,0.85)';
ctx.fillRect(hx + bi*bw + 1, hy+12+(hh-12-bh), bw-2, bh);
}
}
// Метка вещества и состояния
ctx.fillStyle = 'rgba(255,255,255,0.55)';
ctx.font = 'bold 11px system-ui';
ctx.fillText(spLocal.name + ' · ' + (state1==='solid'?'твёрдое':state1==='liquid'?'жидкое':'газ'), 10, 16);
anim1Id = requestAnimationFrame(frame);
}
anim1Id = requestAnimationFrame(frame);
}
// ═══ §2: Два способа нагрева ═══
var anim2Id = null, mode2 = null, piston2y = 0.8, temp2 = 0.1;
var mols2 = [];
function initMols2(W, H) {
mols2 = [];
for (var i = 0; i < 40; i++) {
mols2.push({
x: 20 + Math.random() * (W / 2 - 40),
y: 30 + Math.random() * (H - 60),
vx: (Math.random() - 0.5) * 2,
vy: (Math.random() - 0.5) * 2
});
}
}
function startWork2() {
mode2 = 'work'; piston2y = 0.8; temp2 = 0.1;
runAnim2();
}
function startHeat2() {
mode2 = 'heat'; piston2y = 0.8; temp2 = 0.1;
runAnim2();
}
function reset2() {
if (anim2Id) { cancelAnimationFrame(anim2Id); anim2Id = null; }
mode2 = null; piston2y = 0.8; temp2 = 0.1; mols2 = [];
upd2();
}
function upd2() {
var cv = document.getElementById('cv2');
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 lW = W / 2 - 5;
ctx.strokeStyle = '#475569'; ctx.lineWidth = 2;
ctx.strokeRect(10, 20, lW - 20, H - 40);
var py = 20 + (H - 40) * piston2y;
ctx.fillStyle = '#94a3b8'; ctx.fillRect(10, py, lW - 20, 8);
ctx.fillStyle = '#e2e8f0'; ctx.font = '11px system-ui';
ctx.fillText('Сжатие (работа)', 15, 15);
if (!mols2.length) initMols2(W, H);
for (var mi = 0; mi < mols2.length; mi++) {
var m = mols2[mi];
if (m.x < 10 || m.x > lW - 12) m.vx *= -1;
if (m.y < 25 || m.y > py - 5) m.vy *= -1;
m.x += m.vx * (1 + temp2 * 3); m.y += m.vy * (1 + temp2 * 3);
var frac = Math.min(1, temp2);
ctx.fillStyle = 'rgb(' + Math.round(40 + frac * 190) + ',' + Math.round(100 - frac * 70) + ',220)';
ctx.beginPath(); ctx.arc(m.x, m.y, 4, 0, Math.PI * 2); ctx.fill();
}
var rx = W / 2 + 5;
ctx.strokeStyle = '#475569'; ctx.lineWidth = 2;
ctx.strokeRect(rx, 20, lW - 20, H - 40);
var wallAlpha = temp2;
ctx.fillStyle = 'rgba(239,68,68,' + Math.min(1, wallAlpha + 0.1) + ')';
ctx.fillRect(rx, 20, 8, H - 40);
ctx.fillStyle = '#e2e8f0'; ctx.font = '11px system-ui';
ctx.fillText('Теплообмен', rx + 12, 15);
ctx.fillStyle = 'rgba(148,163,184,0.7)';
for (var k = 0; k < 20; k++) {
var mx = rx + 15 + (k % 5) * 20, my = 40 + Math.floor(k / 5) * 35;
var spd2 = 1 + temp2 * 3;
ctx.beginPath(); ctx.arc(mx + Math.sin(Date.now() / 300 + k) * spd2, my + Math.cos(Date.now() / 250 + k) * spd2, 4, 0, Math.PI * 2); ctx.fill();
}
var drawTherm = function(x, y, val, lbl) {
ctx.fillStyle = '#1e293b'; ctx.fillRect(x, y, 14, 80);
var fh = Math.min(78, val * 78);
ctx.fillStyle = 'rgba(239,68,68,0.9)'; ctx.fillRect(x + 1, y + 79 - fh, 12, fh);
ctx.fillStyle = '#e2e8f0'; ctx.font = '10px system-ui';
ctx.fillText(lbl, x - 5, y + 95);
ctx.fillText(Math.round(val * 100) + '°', x, y - 4);
};
drawTherm(lW - 15, H / 2 - 40, temp2, 'T');
drawTherm(W - 25, H / 2 - 40, temp2, 'T');
}
function runAnim2() {
if (anim2Id) { cancelAnimationFrame(anim2Id); anim2Id = null; }
var cv = document.getElementById('cv2');
if (!cv) 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);
if (!mols2.length) initMols2(W, H);
function frame() {
if (mode2 === 'work' && piston2y > 0.2) piston2y -= 0.003;
if (temp2 < 0.95) temp2 += 0.004;
upd2Draw(ctx, W, H);
anim2Id = requestAnimationFrame(frame);
if (temp2 >= 0.95 && (mode2 !== 'work' || piston2y <= 0.2)) {
cancelAnimationFrame(anim2Id); anim2Id = null;
}
}
anim2Id = requestAnimationFrame(frame);
}
function upd2Draw(ctx, W, H) {
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var lW = W / 2 - 5;
ctx.strokeStyle = '#475569'; ctx.lineWidth = 2;
ctx.strokeRect(10, 20, lW - 20, H - 40);
var py = 20 + (H - 40) * piston2y;
ctx.fillStyle = '#94a3b8'; ctx.fillRect(10, py, lW - 20, 8);
ctx.fillStyle = '#cbd5e1'; ctx.font = '11px system-ui'; ctx.fillText('Сжатие', 15, 15);
for (var mi = 0; mi < mols2.length; mi++) {
var m = mols2[mi];
if (m.x < 12 || m.x > lW - 14) m.vx *= -1;
if (m.y < 25 || m.y > py - 6) m.vy *= -1;
m.x += m.vx * (1 + temp2 * 4); m.y += m.vy * (1 + temp2 * 4);
m.x = Math.max(12, Math.min(lW - 14, m.x));
m.y = Math.max(25, Math.min(py - 6, m.y));
var f = Math.min(1, temp2 * 1.2);
ctx.fillStyle = 'rgb(' + Math.round(40 + f * 200) + ',' + Math.round(140 - f * 90) + ',' + Math.round(220 - f * 180) + ')';
ctx.beginPath(); ctx.arc(m.x, m.y, 4, 0, Math.PI * 2); ctx.fill();
}
var rx = W / 2 + 5;
ctx.strokeStyle = '#475569'; ctx.lineWidth = 2;
ctx.strokeRect(rx, 20, lW - 20, H - 40);
var wa = Math.min(1, temp2 * 1.5);
ctx.fillStyle = 'rgba(239,68,68,' + (0.1 + wa * 0.8) + ')';
ctx.fillRect(rx, 20, 10, H - 40);
ctx.fillStyle = '#cbd5e1'; ctx.font = '11px system-ui'; ctx.fillText('Теплообмен', rx + 14, 15);
var now = Date.now();
for (var k = 0; k < 20; k++) {
var mx2 = rx + 18 + (k % 5) * ((lW - 40) / 5);
var my2 = 40 + Math.floor(k / 5) * Math.floor((H - 70) / 4);
var spd3 = 1 + temp2 * 4;
var f2 = Math.min(1, temp2);
ctx.fillStyle = 'rgb(' + Math.round(40 + f2 * 200) + ',' + Math.round(140 - f2 * 90) + ',' + Math.round(220 - f2 * 180) + ')';
ctx.beginPath(); ctx.arc(mx2 + Math.sin(now / 250 + k) * spd3, my2 + Math.cos(now / 210 + k) * spd3, 4, 0, Math.PI * 2); ctx.fill();
}
[{ x: lW - 20, y: H / 2 - 45 }, { x: W - 28, y: H / 2 - 45 }].forEach(function(pos) {
ctx.fillStyle = '#1e293b'; ctx.fillRect(pos.x, pos.y, 14, 80);
var fh = Math.min(78, temp2 * 78);
ctx.fillStyle = 'rgba(239,68,68,.85)'; ctx.fillRect(pos.x + 1, pos.y + 79 - fh, 12, fh);
ctx.fillStyle = '#e2e8f0'; ctx.font = '10px system-ui';
ctx.fillText(Math.round(temp2 * 100) + '°', pos.x - 2, pos.y - 5);
});
}
// ═══ §3: Тепловая волна в стержне ═══
var anim3Id = null, rod3Heat = new Array(40).fill(0);
rod3Heat[0] = 1;
function upd3() {
if (anim3Id) return;
drawRod3();
}
function drawRod3() {
var cv = document.getElementById('cv3');
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 = rod3Heat.length, rw = (W - 40) / n, rh = 50, ry = H / 2 - rh / 2;
for (var i = 0; i < n; i++) {
var v = rod3Heat[i];
var r = Math.round(v * 220 + (1 - v) * 40);
var g = Math.round((1 - Math.abs(v * 2 - 1)) * 80 + 20);
var b = Math.round((1 - v) * 200 + v * 30);
ctx.fillStyle = 'rgb(' + r + ',' + g + ',' + b + ')';
ctx.fillRect(20 + i * rw, ry, rw - 1, rh);
}
ctx.fillStyle = '#e2e8f0'; ctx.font = '12px system-ui';
ctx.fillText('🔥 100°C', 15, ry - 8);
ctx.fillText('❄ 20°C', W - 70, ry - 8);
for (var i = 0; i < n; i++) {
var v = rod3Heat[i];
var ax = 20 + i * rw + rw / 2;
var ay = ry + rh / 2 + Math.sin(Date.now() / 150 + i * 0.8) * (v * 10 + 1);
var r2 = Math.round(v * 220 + 40), b2 = Math.round((1 - v) * 200 + 30);
ctx.fillStyle = 'rgb(' + r2 + ',120,' + b2 + ')';
ctx.beginPath(); ctx.arc(ax, ay, 4, 0, Math.PI * 2); ctx.fill();
}
ctx.strokeStyle = 'rgba(251,191,36,0.7)'; ctx.lineWidth = 2;
ctx.beginPath();
for (var i = 0; i < n; i++) {
var gx = 20 + i * rw + rw / 2;
var gy = H - 20 - rod3Heat[i] * 35;
i === 0 ? ctx.moveTo(gx, gy) : ctx.lineTo(gx, gy);
}
ctx.stroke();
ctx.fillStyle = 'rgba(251,191,36,0.5)'; ctx.font = '9px system-ui'; ctx.fillText('T(x)', 20, H - 5);
}
function runAnim3() {
if (anim3Id) { cancelAnimationFrame(anim3Id); anim3Id = null; }
rod3Heat = new Array(40).fill(0); rod3Heat[0] = 1;
var sel = document.getElementById('sel3mat');
var speed = sel ? parseFloat(sel.value) : 0.5;
function frame() {
var newHeat = rod3Heat.slice();
for (var i = 1; i < rod3Heat.length; i++) {
newHeat[i] += (rod3Heat[i - 1] - rod3Heat[i]) * speed * 0.08;
newHeat[i] = Math.max(0, Math.min(1, newHeat[i]));
}
newHeat[0] = 1;
rod3Heat = newHeat;
drawRod3();
if (rod3Heat[rod3Heat.length - 1] < 0.95) {
anim3Id = requestAnimationFrame(frame);
} else {
anim3Id = null;
}
}
anim3Id = requestAnimationFrame(frame);
}
function resetAnim3() {
if (anim3Id) { cancelAnimationFrame(anim3Id); anim3Id = null; }
rod3Heat = new Array(40).fill(0); rod3Heat[0] = 1;
drawRod3();
}
// ═══ §4: Три вида теплопередачи Pro Max (RAF) ═══
var sl4pval = 50, mode4 = 'conv';
var particles4 = [];
var rodTemp4 = null; // массив сегментов стержня для теплопроводности
var photons4 = []; // фотоны для излучения
function setMode4(m){
mode4 = m;
['cond','conv','rad'].forEach(function(k){
var btn = document.getElementById('btn4m'+(k==='cond'?'Cond':k==='conv'?'Conv':'Rad'));
if(btn){ btn.style.background = mode4===k?'var(--pri)':''; btn.style.color = mode4===k?'#fff':''; }
});
var cap = document.getElementById('cap4');
if(cap){
var span = cap.querySelector('span');
if(span){
span.textContent = m==='cond' ? 'Тепло передаётся вдоль стержня без перемещения вещества — соседние молекулы передают энергию столкновениями. Металлы — отличные проводники, дерево/воздух — плохие.' :
m==='conv' ? 'Нагретые частицы (красные) у дна поднимаются вверх, охлаждаются и опускаются — циркуляция переносит тепло вместе с веществом.' :
'Горячее тело испускает электромагнитные волны. Они доходят даже через вакуум. Тёмные поверхности поглощают лучше, белые — отражают.';
}
}
var chip = document.getElementById('chip4info');
if(chip) chip.textContent = (m==='cond'?'теплопроводность':m==='conv'?'конвекция':'излучение')+' · '+sl4pval+'%';
// сброс состояний
rodTemp4 = null; photons4 = [];
particles4 = [];
}
function startAnim4() {
var cv = document.getElementById('cv4');
if (!cv || cv.offsetWidth === 0) return;
if (anim4Id) { cancelAnimationFrame(anim4Id); anim4Id = null; }
var dpr = Math.min(window.devicePixelRatio||1, 2);
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);
// подготовка по режиму
if(mode4==='cond' && !rodTemp4){
rodTemp4 = new Array(60).fill(0);
}
if(mode4==='conv' && !particles4.length){
for (var i = 0; i < 60; i++) {
particles4.push({
x: 20 + Math.random() * (W - 40),
y: 30 + Math.random() * (H - 60),
temp: Math.random(),
vx: (Math.random() - 0.5) * 0.5,
vy: (Math.random() - 0.5) * 0.5
});
}
}
var tPrev = performance.now();
function frame(now) {
var dt = Math.min(0.05, (now-tPrev)/1000); tPrev = now;
var pwr = (sl4pval || 50) / 100;
// ───── ОБЩИЙ ФОН ─────
ctx.fillStyle = '#0f172a';
ctx.fillRect(0,0,W,H);
var chip = document.getElementById('chip4info');
if(chip) chip.textContent = (mode4==='cond'?'теплопроводность':mode4==='conv'?'конвекция':'излучение')+' · '+sl4pval+'%';
if(mode4==='conv'){
// ───── КОНВЕКЦИЯ ─────
var grd = ctx.createLinearGradient(0, H - 20, 0, H);
grd.addColorStop(0, 'rgba(234,88,12,' + pwr + ')');
grd.addColorStop(1, 'rgba(239,68,68,' + pwr * 0.5 + ')');
ctx.fillStyle = grd; ctx.fillRect(0, H - 18, W, 18);
ctx.fillStyle = '#e2e8f0'; ctx.font = '10px system-ui'; ctx.fillText('🔥 Нагреватель', 10, H - 5);
ctx.strokeStyle = '#475569'; ctx.lineWidth = 2;
ctx.strokeRect(5, 5, W - 10, H - 20);
for (var i = 0; i < particles4.length; i++) {
var p = particles4[i];
if (p.y > H - 40) p.temp = Math.min(1, p.temp + pwr * 0.04);
if (p.y < 30) p.temp = Math.max(0, p.temp - 0.03);
p.vy += (p.temp - 0.5) * (-pwr * 0.3);
p.vx += (Math.random() - 0.5) * 0.1;
p.vx *= 0.95; p.vy *= 0.92;
p.x += p.vx; p.y += p.vy;
if (p.x < 10) { p.x = 10; p.vx = Math.abs(p.vx); }
if (p.x > W - 10) { p.x = W - 10; p.vx = -Math.abs(p.vx); }
if (p.y < 8) { p.y = 8; p.vy = Math.abs(p.vy) * 0.5; }
if (p.y > H - 22) { p.y = H - 22; p.vy = -Math.abs(p.vy) * 0.5; }
var t = p.temp;
var pr = Math.round(t * 220 + (1 - t) * 50);
var pg = Math.round((1 - Math.abs(t * 2 - 1)) * 100 + 20);
var pb = Math.round((1 - t) * 220 + t * 40);
ctx.shadowColor = 'rgb(' + pr + ',' + pg + ',' + pb + ')';
ctx.shadowBlur = 4;
ctx.fillStyle = 'rgb(' + pr + ',' + pg + ',' + pb + ')';
ctx.beginPath(); ctx.arc(p.x, p.y, 5, 0, Math.PI * 2); ctx.fill();
ctx.shadowBlur = 0;
}
} else if(mode4==='cond'){
// ───── ТЕПЛОПРОВОДНОСТЬ ─────
// Стержень: левый конец нагревается, тепло диффундирует вправо
var rodY = H/2, rodH = 50, rodMargin = 50;
var segW = (W - rodMargin*2) / rodTemp4.length;
// источник
rodTemp4[0] = Math.min(1, rodTemp4[0] + pwr * dt * 1.5);
// диффузия (1D heat equation)
var alpha = 0.18;
var next = rodTemp4.slice();
for(var i=1;i<rodTemp4.length-1;i++){
next[i] = rodTemp4[i] + alpha * (rodTemp4[i-1] - 2*rodTemp4[i] + rodTemp4[i+1]);
}
next[next.length-1] = rodTemp4[next.length-2]*0.98; // лёгкие потери на правом конце
rodTemp4 = next;
// огонь слева
var gGrd = ctx.createRadialGradient(rodMargin-10, rodY, 5, rodMargin-10, rodY, 28);
gGrd.addColorStop(0,'rgba(255,180,0,'+(pwr*0.9)+')');
gGrd.addColorStop(1,'rgba(255,80,0,0)');
ctx.fillStyle = gGrd;
ctx.fillRect(rodMargin-40, rodY-30, 40, 60);
ctx.fillStyle='#e2e8f0'; ctx.font='10px system-ui';
ctx.fillText('🔥', rodMargin-22, rodY+5);
// стержень
for(var i=0;i<rodTemp4.length;i++){
var t = rodTemp4[i];
var pr = Math.round(t * 230 + (1 - t) * 80);
var pg = Math.round((1 - Math.abs(t * 2 - 1)) * 80 + 40);
var pb = Math.round((1 - t) * 200 + t * 30);
ctx.fillStyle = 'rgb('+pr+','+pg+','+pb+')';
ctx.fillRect(rodMargin + i*segW, rodY-rodH/2, segW+0.5, rodH);
}
// обводка
ctx.strokeStyle='#475569'; ctx.lineWidth=2;
ctx.strokeRect(rodMargin, rodY-rodH/2, W-rodMargin*2, rodH);
// термометры
[0.0, 0.5, 1.0].forEach(function(frac){
var x = rodMargin + (rodTemp4.length-1)*segW*frac;
var idx = Math.round(frac*(rodTemp4.length-1));
var T = Math.round(rodTemp4[idx]*200);
ctx.fillStyle = 'rgba(15,23,42,0.85)';
ctx.fillRect(x-22, rodY-rodH/2-22, 44, 16);
ctx.fillStyle = '#fbbf24';
ctx.font='bold 11px monospace';
ctx.textAlign='center';
ctx.fillText(T+'°', x, rodY-rodH/2-10);
ctx.textAlign='left';
// указатель
ctx.strokeStyle='#fbbf24'; ctx.lineWidth=1;
ctx.beginPath(); ctx.moveTo(x, rodY-rodH/2-6); ctx.lineTo(x, rodY-rodH/2); ctx.stroke();
});
ctx.fillStyle='#94a3b8'; ctx.font='10px system-ui';
ctx.fillText('Молекулы передают энергию столкновениями →', 10, H-10);
} else if(mode4==='rad'){
// ───── ИЗЛУЧЕНИЕ ─────
// Слева — горячий источник (Солнце/лампа), справа — 3 поверхности (чёрная/серая/белая)
var srcX = 60, srcY = H/2, srcR = 28;
var grd2 = ctx.createRadialGradient(srcX, srcY, 4, srcX, srcY, srcR*1.5);
grd2.addColorStop(0,'rgba(255,240,200,1)');
grd2.addColorStop(0.4,'rgba(255,160,80,'+(0.4+pwr*0.4)+')');
grd2.addColorStop(1,'rgba(255,60,0,0)');
ctx.fillStyle = grd2;
ctx.fillRect(0, srcY-srcR*2, srcX+srcR*2, srcR*4);
ctx.fillStyle='rgba(255,200,80,1)';
ctx.beginPath(); ctx.arc(srcX, srcY, srcR*0.5+pwr*5, 0, Math.PI*2); ctx.fill();
ctx.fillStyle='#fff'; ctx.font='10px system-ui';
ctx.fillText('☀️ источник', srcX-30, srcY-srcR-4);
// 3 поверхности справа
var sx = W-100, sH = 50, gap = 16;
var surfs = [
{name:'чёрная', absorb:0.95, col:'#0f172a', tempK:'tBlack'},
{name:'серая', absorb:0.55, col:'#94a3b8', tempK:'tGray'},
{name:'белая', absorb:0.10, col:'#f1f5f9', tempK:'tWhite'}
];
window._surf4 = window._surf4 || {tBlack:20,tGray:20,tWhite:20};
for(var si=0;si<3;si++){
var s = surfs[si];
var sy = 22 + si*(sH+gap);
ctx.fillStyle = s.col;
ctx.fillRect(sx, sy, 70, sH);
ctx.strokeStyle = '#475569'; ctx.lineWidth=1.5; ctx.strokeRect(sx, sy, 70, sH);
// нагрев
window._surf4[s.tempK] = Math.min(120, window._surf4[s.tempK] + pwr*s.absorb*dt*8);
// охлаждение
window._surf4[s.tempK] = Math.max(20, window._surf4[s.tempK] - dt*0.8);
// glow по нагреву
var glow = (window._surf4[s.tempK]-20)/100;
if(glow>0.05){
ctx.shadowColor='rgba(255,80,0,'+(glow*0.7)+')';
ctx.shadowBlur=glow*22;
ctx.fillStyle = 'rgba(255,60,0,'+(glow*0.5)+')';
ctx.fillRect(sx, sy, 70, sH);
ctx.shadowBlur=0;
}
// температура
ctx.fillStyle = si===2?'#1c1917':'#fff';
ctx.font='bold 12px monospace';
ctx.textAlign='center';
ctx.fillText(Math.round(window._surf4[s.tempK])+'°C', sx+35, sy+sH/2+4);
ctx.textAlign='left';
// подпись
ctx.fillStyle='#cbd5e1'; ctx.font='10px system-ui';
ctx.fillText(s.name, sx+78, sy+sH/2+4);
}
// ЭМ-волны (лучи)
var nRays = 14;
for(var ri=0;ri<nRays;ri++){
var ty = 22 + (ri/(nRays-1))*(H-44);
var dist = ((now/8 + ri*22) % 200);
var rayX = srcX + 8 + dist;
if(rayX > sx) continue;
var op = pwr * (1 - dist/200) * 0.8;
// волнообразная линия
ctx.strokeStyle = 'rgba(255,200,100,'+op+')';
ctx.lineWidth = 2.2;
ctx.beginPath();
for(var rx=rayX; rx<rayX+18; rx+=2){
var ry = ty + Math.sin((rx-rayX)*0.6 + ri)*2.5;
if(rx===rayX) ctx.moveTo(rx, ry);
else ctx.lineTo(rx, ry);
}
ctx.stroke();
}
ctx.fillStyle='#94a3b8'; ctx.font='10px system-ui';
ctx.fillText('ЭМ-волны → поверхности с разной поглощающей способностью', 10, H-8);
}
anim4Id = requestAnimationFrame(frame);
}
anim4Id = requestAnimationFrame(frame);
}
// ═══ §5: Излучение от источника ═══
var sl5Tval = 500;
var surf5temps = [0, 0, 0];
var surf5absorb = [0.95, 0.6, 0.15];
function upd5() { /* метка обновляется через oninput */ }
function startAnim5() {
var cv = document.getElementById('cv5');
if (!cv || cv.offsetWidth === 0) return;
if (anim5Id) { cancelAnimationFrame(anim5Id); anim5Id = null; }
surf5temps = [0, 0, 0];
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 waves = [];
function spawnWave() {
waves.push({ r: 5, alpha: 1 });
}
var waveTimer = 0;
function frame(now) {
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var T = sl5Tval || 500;
var srcX = 60, srcY = H / 2;
var intensity = T / 1000;
var srcR = 8 + intensity * 8;
var grd = ctx.createRadialGradient(srcX, srcY, 0, srcX, srcY, srcR * 2);
grd.addColorStop(0, 'rgba(255,255,200,1)');
grd.addColorStop(0.3, 'rgba(255,160,40,0.8)');
grd.addColorStop(1, 'transparent');
ctx.fillStyle = grd;
ctx.beginPath(); ctx.arc(srcX, srcY, srcR * 2, 0, Math.PI * 2); ctx.fill();
ctx.fillStyle = '#fffde7';
ctx.beginPath(); ctx.arc(srcX, srcY, srcR, 0, Math.PI * 2); ctx.fill();
ctx.fillStyle = '#94a3b8'; ctx.font = '10px system-ui';
ctx.fillText(T + '°C', srcX - 15, srcY + srcR + 14);
waveTimer += 16;
if (waveTimer > Math.max(80, 300 - intensity * 250)) {
spawnWave(); waveTimer = 0;
}
for (var i = waves.length - 1; i >= 0; i--) {
var w = waves[i];
w.r += 3 + intensity * 4; w.alpha -= 0.015;
if (w.alpha <= 0) { waves.splice(i, 1); continue; }
var wclr = 'rgba(255,' + Math.round(100 + intensity * 100) + ',0,' + (w.alpha * 0.5) + ')';
ctx.strokeStyle = wclr; ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.arc(srcX, srcY, w.r, -Math.PI / 2, Math.PI / 2); ctx.stroke();
}
var surfX = W - 90, surfH = 45, surfGap = (H - 40) / 3;
var names = ['Чёрная', 'Серая', 'Серебристая'];
var colors = ['#1e1e1e', '#6b7280', '#e2e8f0'];
var textColors = ['#e2e8f0', '#e2e8f0', '#1c1917'];
for (var s = 0; s < 3; s++) {
var sy = 20 + s * surfGap;
var abs = surf5absorb[s];
surf5temps[s] = Math.min(1, surf5temps[s] + intensity * abs * 0.003);
var temp = surf5temps[s];
var heat = temp * intensity;
ctx.fillStyle = colors[s];
ctx.fillRect(surfX, sy, 55, surfH);
if (heat > 0.05) {
ctx.fillStyle = 'rgba(239,68,68,' + heat * 0.4 + ')';
ctx.fillRect(surfX, sy, 55, surfH);
}
ctx.fillStyle = textColors[s]; ctx.font = '10px system-ui';
ctx.fillText(names[s], surfX + 2, sy + 14);
ctx.fillText(Math.round(abs * 100) + '%', surfX + 2, sy + 26);
ctx.fillStyle = '#1e293b'; ctx.fillRect(surfX + 60, sy, 12, surfH);
var bh = Math.min(surfH - 2, temp * (surfH - 2));
ctx.fillStyle = 'rgba(239,68,68,0.9)';
ctx.fillRect(surfX + 61, sy + (surfH - 2) - bh, 10, bh);
ctx.fillStyle = '#94a3b8'; ctx.font = '9px system-ui';
ctx.fillText(Math.round(temp * 100) + '°', surfX + 58, sy + surfH + 12);
}
anim5Id = requestAnimationFrame(frame);
}
anim5Id = requestAnimationFrame(frame);
}
// ═══ §6: Калориметр Pro Max (с разными c) ═══
var MAT6 = {
'4200':{name:'вода', emoji:'💧', col:'#3b82f6'},
'460': {name:'железо',emoji:'⚙️', col:'#94a3b8'},
'2100':{name:'масло', emoji:'🛢️',col:'#a16207'},
'900': {name:'алюминий',emoji:'⚪',col:'#cbd5e1'},
'385': {name:'медь', emoji:'🟫', col:'#c2410c'}
};
function upd6() {
var cv = document.getElementById('cv6');
if (!cv || cv.offsetWidth === 0) return;
var dpr = Math.min(window.devicePixelRatio||1, 2);
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 m1 = parseFloat(document.getElementById('sl6m1').value) || 1;
var t1 = parseFloat(document.getElementById('sl6t1').value) || 80;
var m2 = parseFloat(document.getElementById('sl6m2').value) || 1;
var t2 = parseFloat(document.getElementById('sl6t2').value) || 20;
var s1 = document.getElementById('sel6mat1');
var s2 = document.getElementById('sel6mat2');
var c1 = s1 ? parseFloat(s1.value) : 4200;
var c2 = s2 ? parseFloat(s2.value) : 4200;
var mat1 = MAT6[String(c1)]||MAT6['4200'];
var mat2 = MAT6[String(c2)]||MAT6['4200'];
// Реальный тепловой баланс с разными c
var tmix = (c1*m1*t1 + c2*m2*t2) / (c1*m1 + c2*m2);
// Два сосуда
var pad = 20, bH = H - 70, bW = W / 2 - pad * 2;
// Горячий
ctx.fillStyle = 'rgba(239,68,68,0.10)'; ctx.fillRect(pad, pad, bW, bH);
ctx.strokeStyle = '#ef4444'; ctx.lineWidth = 2; ctx.strokeRect(pad, pad, bW, bH);
var fillH1 = Math.min(bH - 6, (m1 / 3) * (bH - 6));
// окрашиваем по веществу
var fillCol1 = mat1.col;
// оттенок по T (более горячий — ярче)
ctx.fillStyle = fillCol1;
ctx.globalAlpha = 0.4 + (t1/100)*0.4;
ctx.fillRect(pad + 3, pad + bH - fillH1 - 3, bW - 6, fillH1);
ctx.globalAlpha = 1;
// лейблы
ctx.fillStyle = '#fca5a5'; ctx.font = 'bold 11px system-ui';
ctx.fillText('🔥 '+mat1.emoji+' '+mat1.name, pad + 5, pad + 14);
ctx.fillStyle = '#e2e8f0'; ctx.font = '11px system-ui';
ctx.fillText(t1+'°C · '+m1.toFixed(1)+' кг', pad + 5, pad+bH+15);
ctx.fillStyle = '#94a3b8'; ctx.font = '10px system-ui';
ctx.fillText('c = '+c1+' Дж/(кг·°C)', pad + 5, pad+bH+28);
// Холодный
var rx = W / 2 + pad;
ctx.fillStyle = 'rgba(59,130,246,0.08)'; ctx.fillRect(rx, pad, bW, bH);
ctx.strokeStyle = '#3b82f6'; ctx.lineWidth = 2; ctx.strokeRect(rx, pad, bW, bH);
var fillH2 = Math.min(bH - 6, (m2 / 3) * (bH - 6));
ctx.fillStyle = mat2.col;
ctx.globalAlpha = 0.4 + (t2/100)*0.4;
ctx.fillRect(rx + 3, pad + bH - fillH2 - 3, bW - 6, fillH2);
ctx.globalAlpha = 1;
ctx.fillStyle = '#93c5fd'; ctx.font = 'bold 11px system-ui';
ctx.fillText('❄️ '+mat2.emoji+' '+mat2.name, rx + 5, pad + 14);
ctx.fillStyle = '#e2e8f0'; ctx.font = '11px system-ui';
ctx.fillText(t2+'°C · '+m2.toFixed(1)+' кг', rx + 5, pad+bH+15);
ctx.fillStyle = '#94a3b8'; ctx.font = '10px system-ui';
ctx.fillText('c = '+c2+' Дж/(кг·°C)', rx + 5, pad+bH+28);
// Шкала температуры справа от каждого
function drawTherm(x,y,h,T){
ctx.strokeStyle='#475569'; ctx.lineWidth=1;
ctx.strokeRect(x, y, 6, h);
var fillH = (T/100)*h;
ctx.fillStyle = 'rgba(239,68,68,'+(0.3+T/100*0.6)+')';
ctx.fillRect(x+1, y+h-fillH+1, 4, fillH-2);
}
drawTherm(pad+bW-12, pad+8, bH-16, t1);
drawTherm(rx+bW-12, pad+8, bH-16, t2);
// Стрелка смешивания + точка результата
ctx.strokeStyle = '#fbbf24'; ctx.lineWidth = 2;
ctx.beginPath();
ctx.moveTo(pad + bW + 4, H/2 - 15); ctx.lineTo(rx - 4, H/2 - 15);
ctx.stroke();
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 18px system-ui';
ctx.textAlign='center';
ctx.fillText('⇄', W/2, H/2-10);
// Результат смеси в центре
var tFrac = (tmix-t2)/(t1-t2 + 0.001);
ctx.fillStyle = 'rgba(15,23,42,0.9)';
ctx.fillRect(W/2-40, H/2+6, 80, 26);
ctx.fillStyle = 'rgb('+Math.round(60+tFrac*180)+',130,'+Math.round(220-tFrac*150)+')';
ctx.font='bold 16px monospace';
ctx.fillText(tmix.toFixed(1)+'°C', W/2, H/2+24);
ctx.fillStyle='#cbd5e1'; ctx.font='9px system-ui';
ctx.fillText('T смеси', W/2, H/2+40);
ctx.textAlign='left';
// Результат текстом
var res = document.getElementById('cv6result');
if (res) {
var Q1 = c1*m1*(t1-tmix);
var Q2 = c2*m2*(tmix-t2);
res.innerHTML =
'<div style="font-size:.82rem;line-height:1.8">' +
'<div><b style="color:var(--pri)">T смеси = '+tmix.toFixed(2)+'°C</b></div>' +
'<div style="color:var(--muted);font-family:monospace;font-size:.78rem">'+
'c₁m₁(T₁−T) = '+c1+'·'+m1.toFixed(1)+'·('+t1+''+tmix.toFixed(1)+') = <b>'+(Q1/1000).toFixed(1)+' кДж</b> отдаёт' +
'</div>'+
'<div style="color:var(--muted);font-family:monospace;font-size:.78rem">'+
'c₂m₂(TT₂) = '+c2+'·'+m2.toFixed(1)+'·('+tmix.toFixed(1)+''+t2+') = <b>'+(Q2/1000).toFixed(1)+' кДж</b> получает' +
'</div>'+
'<div style="margin-top:4px;color:var(--ok);font-size:.74rem">✓ баланс: '+(Q1/1000).toFixed(2)+' ≈ '+(Q2/1000).toFixed(2)+' кДж</div>' +
'</div>';
if (window.doRender) doRender(res);
}
}
// ═══ §7: Виртуальная печь ═══
var anim7Id = null, fuel7 = 1.0; // 1.0 = полный, 0 = пустой
function upd7() {
if (!anim7Id) drawFurnace7();
var m = parseFloat(document.getElementById('sl7m').value) || 2;
var sel = document.getElementById('sel7fuel');
var q = sel ? parseFloat(sel.value) : 27;
var Q = (q * m).toFixed(1);
var res = document.getElementById('cv7result');
if (res) res.innerHTML = 'Q = q · m = ' + q + ' × ' + m + ' = <b>' + Q + ' МДж</b>';
}
function drawFurnace7() {
var cv = document.getElementById('cv7');
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 sel = document.getElementById('sel7fuel');
var q = sel ? parseFloat(sel.value) : 27;
var intensity = Math.min(1, q / 120);
// печь
ctx.fillStyle = '#292524'; ctx.fillRect(W / 2 - 60, H - 80, 120, 70);
ctx.strokeStyle = '#78716c'; ctx.lineWidth = 2;
ctx.strokeRect(W / 2 - 60, H - 80, 120, 70);
// топливо
var fuelH = fuel7 * 30;
ctx.fillStyle = '#451a03'; ctx.fillRect(W / 2 - 50, H - 20 - fuelH, 100, fuelH);
// пламя (несколько языков)
var now = Date.now();
for (var fl = 0; fl < 3 + Math.round(intensity * 4); fl++) {
var fx = W / 2 - 30 + fl * 15 + Math.sin(now / 200 + fl) * 8;
var fh = 40 + intensity * 60 + Math.sin(now / 150 + fl * 1.2) * 15;
var fy = H - 80 - fh;
var grd = ctx.createLinearGradient(fx, H - 80, fx, fy);
grd.addColorStop(0, 'rgba(239,68,68,0.9)');
grd.addColorStop(0.5, 'rgba(251,146,60,0.7)');
grd.addColorStop(1, 'rgba(253,224,71,0)');
ctx.fillStyle = grd;
ctx.beginPath();
ctx.moveTo(fx - 8, H - 80);
ctx.quadraticCurveTo(fx + Math.sin(now / 100 + fl) * 12, fy + fh / 2, fx, fy);
ctx.quadraticCurveTo(fx + 6, fy + fh / 2, fx + 8, H - 80);
ctx.fill();
}
// Q-бар
var m = parseFloat((document.getElementById('sl7m') || {}).value) || 2;
var Q = q * m;
var qMax = 120 * 10; // max = водород 10кг
var qFrac = Math.min(1, Q / qMax);
ctx.fillStyle = '#1e293b'; ctx.fillRect(W - 60, 20, 20, H - 40);
ctx.fillStyle = 'rgba(251,146,60,0.9)'; ctx.fillRect(W - 59, 20 + (H - 40) * (1 - qFrac), 18, (H - 40) * qFrac);
ctx.fillStyle = '#e2e8f0'; ctx.font = '10px system-ui'; ctx.fillText('Q', W - 56, 15);
ctx.fillText(Q.toFixed(0) + 'МДж', W - 78, H - 20);
}
// ═══ §8: Кристаллическая решётка ═══
var anim8Id = null;
var lattice8 = []; // {x, y, ox, oy, phase}
function initLattice8(W, H) {
lattice8 = [];
var cols = 10, rows = 8;
for (var r = 0; r < rows; r++) {
for (var c = 0; c < cols; c++) {
lattice8.push({
bx: 20 + (c + 0.5) * (W - 40) / cols,
by: 20 + (r + 0.5) * (H - 40) / rows,
ox: 0, oy: 0,
phase: Math.random() * Math.PI * 2,
vx: (Math.random() - 0.5) * 2,
vy: (Math.random() - 0.5) * 2
});
}
}
}
function upd8() {
var cv = document.getElementById('cv8');
if (!cv || cv.offsetWidth === 0) return;
if (anim8Id) { cancelAnimationFrame(anim8Id); anim8Id = 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);
if (!lattice8.length) initLattice8(W, H);
var Tval = parseFloat(document.getElementById('sl8T').value) || 0;
var sel = document.getElementById('sel8sub');
var Tpl = sel ? parseFloat(sel.value) : 0;
var lbl = document.getElementById('lbl8Tpl');
if (lbl) lbl.textContent = Tpl;
// Изменяем диапазон слайдера при смене вещества
var sl = document.getElementById('sl8T');
if (sel && sel.value == '327') {
if (sl && sl.max != '500') { sl.min = 200; sl.max = 500; }
} else {
if (sl && sl.max != '150') { sl.min = -50; sl.max = 150; }
}
var state = Tval < Tpl ? 'solid' : Tval < Tpl + 30 ? 'melting' : 'liquid';
var stateEl = document.getElementById('cv8state');
if (stateEl) {
var stateNames = {solid:'❄️ Твёрдое (кристаллическая решётка)', melting:'🔥 Плавление (T = const = ' + Tpl + '°C)', liquid:'💧 Жидкое'};
stateEl.textContent = 'Состояние: ' + (stateNames[state] || state);
}
var amp = state === 'solid' ? Math.max(0.5, (Tval - Tpl + 60) / 60 * 3) :
state === 'melting' ? 6 : 8;
function frame() {
ctx.clearRect(0, 0, W, H);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var cols = 10, now = Date.now();
var n = lattice8.length;
for (var i = 0; i < n; i++) {
var a = lattice8[i];
if (state === 'liquid') {
a.bx += a.vx * 0.3; a.by += a.vy * 0.3;
a.ox = Math.sin(now / 180 + a.phase) * amp;
a.oy = Math.cos(now / 200 + a.phase) * amp;
if (a.bx < 10 || a.bx > W - 10) a.vx *= -1;
if (a.by < 10 || a.by > H - 10) a.vy *= -1;
} else {
a.ox = Math.sin(now / 200 + a.phase) * amp;
a.oy = Math.cos(now / 230 + a.phase) * amp;
if (state === 'melting') {
a.bx += (Math.random() - 0.5) * 0.5;
a.by += (Math.random() - 0.5) * 0.5;
}
}
var x = a.bx + a.ox, y = a.by + a.oy;
// Связи (решётка) — только для solid
if (state === 'solid' && i % cols < cols - 1) {
var j = i + 1, nb = lattice8[j];
ctx.strokeStyle = 'rgba(100,150,200,0.3)'; ctx.lineWidth = 1;
ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(nb.bx + nb.ox, nb.by + nb.oy); ctx.stroke();
}
if (state === 'solid' && i + cols < n) {
var k = i + cols, nb2 = lattice8[k];
ctx.strokeStyle = 'rgba(100,150,200,0.3)'; ctx.lineWidth = 1;
ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(nb2.bx + nb2.ox, nb2.by + nb2.oy); ctx.stroke();
}
var normT = Math.min(1, Math.max(0, (Tval - Tpl + 60) / 120));
if (state === 'melting') normT = 0.7;
if (state === 'liquid') normT = 1;
var cr = Math.round(normT * 220 + (1 - normT) * 40);
var cg = Math.round((1 - Math.abs(normT * 2 - 1)) * 80 + 30);
var cb = Math.round((1 - normT) * 220 + normT * 40);
ctx.shadowColor = 'rgb(' + cr + ',' + cg + ',' + cb + ')';
ctx.shadowBlur = state === 'liquid' ? 6 : 3;
ctx.fillStyle = 'rgb(' + cr + ',' + cg + ',' + cb + ')';
ctx.beginPath(); ctx.arc(x, y, 5, 0, Math.PI * 2); ctx.fill();
ctx.shadowBlur = 0;
}
anim8Id = requestAnimationFrame(frame);
}
anim8Id = requestAnimationFrame(frame);
}
// ═══ §9: Плавление + график T(t) Pro Max ═══
var anim9Id = null, melt9progress = 0, melt9dir = 0;
// история температуры для графика T(t)
var melt9history = []; // {t,T,phase}
var melt9time = 0;
// Tпл для каждого вещества (по таблице): индекс → температура
var TPL9 = {333:0, 270:1539, 390:660, 205:1084, 88:962, 25:327};
function upd9() {
var m = parseFloat(document.getElementById('sl9m').value) || 1;
var sel = document.getElementById('sel9sub');
var lam = sel ? parseFloat(sel.value) : 333;
var Q = (lam * m).toFixed(1);
var res = document.getElementById('cv9result');
if (res) res.innerHTML = 'Q = λ · m = ' + lam + ' × ' + m.toFixed(1) + ' = <b>' + Q + ' кДж</b>';
drawMelt9();
}
function anim9(mode) {
if (anim9Id) { cancelAnimationFrame(anim9Id); anim9Id = null; }
melt9dir = mode === 'melt' ? 1 : -1;
// сброс истории при новой анимации
if(mode==='melt' && melt9progress===0){ melt9history=[]; melt9time=0; }
if(mode==='freeze' && melt9progress===1){ melt9history=[]; melt9time=0; }
var last = performance.now();
function frame(now){
var dt = Math.min(0.05,(now-last)/1000); last = now;
melt9time += dt;
// прогресс
var prev = melt9progress;
melt9progress = Math.max(0, Math.min(1, melt9progress + melt9dir * dt * 0.5));
// вычисляем "виртуальную" температуру
var sel = document.getElementById('sel9sub');
var lam = sel ? parseFloat(sel.value) : 333;
var Tpl = TPL9[lam] !== undefined ? TPL9[lam] : 0;
// 3 фазы: 0..0.2 — нагрев до Tпл, 0.2..0.8 — плавление (T=Tпл), 0.8..1 — нагрев выше
var T, phase;
var p = melt9progress;
if(p < 0.2){ T = Tpl - 30 + p/0.2 * 30; phase='solid_heat'; }
else if(p < 0.8){ T = Tpl; phase='melt'; }
else { T = Tpl + (p-0.8)/0.2 * 40; phase='liq_heat'; }
melt9history.push({t:melt9time, T:T, phase:phase});
if(melt9history.length > 250) melt9history.shift();
drawMelt9();
if (melt9progress > 0 && melt9progress < 1) anim9Id = requestAnimationFrame(frame);
else anim9Id = null;
}
anim9Id = requestAnimationFrame(frame);
}
function drawMelt9() {
var cv = document.getElementById('cv9');
if (!cv || cv.offsetWidth === 0) return;
var dpr = Math.min(window.devicePixelRatio||1, 2);
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 m = parseFloat((document.getElementById('sl9m') || {}).value) || 1;
var sel = document.getElementById('sel9sub');
var lam = sel ? parseFloat(sel.value) : 333;
var Tpl = TPL9[lam] !== undefined ? TPL9[lam] : 0;
var p = melt9progress;
// ───── ЛЕВАЯ ЗОНА: блок ─────
var leftW = W * 0.42;
var bx = leftW/2 - 50, by = 30, bw = 100, bh = 140;
// подпись зоны
ctx.fillStyle = '#cbd5e1'; ctx.font = 'bold 11px system-ui';
ctx.fillText('Вещество', 8, 16);
var solidH = bh * (1 - p);
var liqH = bh * p;
if (solidH > 2) {
// решётка
ctx.fillStyle = 'rgba(147,197,253,0.45)';
ctx.fillRect(bx, by, bw, solidH);
ctx.strokeStyle = 'rgba(147,197,253,0.7)'; ctx.lineWidth = 1;
for (var rx = 0; rx < 5; rx++) for (var ry = 0; ry < Math.ceil(solidH / 14); ry++) {
ctx.strokeRect(bx + rx * 20, by + ry * 14, 20, 14);
}
}
if (liqH > 2) {
ctx.fillStyle = 'rgba(59,130,246,0.6)';
ctx.fillRect(bx - p * 10, by + solidH, bw + p * 20, liqH);
ctx.fillStyle = 'rgba(96,165,250,0.4)';
ctx.beginPath(); ctx.ellipse(bx + bw / 2, by + solidH + liqH / 2, (bw / 2 + p * 10), liqH / 2, 0, 0, Math.PI * 2); ctx.fill();
}
// термометр (слева от блока)
ctx.strokeStyle = '#475569'; ctx.lineWidth = 1.5;
ctx.strokeRect(8, by, 12, bh);
var Tcur = melt9history.length ? melt9history[melt9history.length-1].T : (Tpl-30);
var Tmin = Tpl-30, Tmax = Tpl+40;
var thFrac = Math.max(0, Math.min(1, (Tcur-Tmin)/(Tmax-Tmin)));
ctx.fillStyle = 'rgba(239,68,68,'+(0.4+thFrac*0.5)+')';
ctx.fillRect(9, by+bh - thFrac*bh+1, 10, thFrac*bh-2);
ctx.fillStyle = '#fbbf24'; ctx.font='bold 10px monospace';
ctx.fillText(Math.round(Tcur)+'°', 4, by-4);
// Q бар (справа от блока)
var Q = lam * m;
var qMax = 390 * 5;
var qFrac = Math.min(1, (Q * p) / qMax);
ctx.fillStyle = '#1e293b'; ctx.fillRect(leftW - 28, by, 14, bh);
ctx.fillStyle = 'rgba(251,146,60,0.9)';
ctx.fillRect(leftW - 27, by+bh - bh*qFrac+1, 12, bh*qFrac-2);
ctx.fillStyle = '#cbd5e1'; ctx.font = '9px system-ui';
ctx.fillText('Q', leftW - 24, by-4);
ctx.fillText(Math.round(Q*p)+'кДж', leftW-60, by+bh+12);
// Метка состояния
ctx.fillStyle = '#94a3b8'; ctx.font = '10px system-ui';
var label = p === 0 ? '❄ Твёрдое' : p === 1 ? '💧 Жидкое' : (p<0.2 ? '❄ Нагрев' : p<0.8 ? '🔥 Плавление T=const' : '💧 Нагрев');
ctx.fillText(label, 8, H - 12);
// ───── ПРАВАЯ ЗОНА: график T(t) ─────
var gx = leftW + 14, gy = 24, gw = W - leftW - 28, gh = H - 50;
// фон
ctx.fillStyle = 'rgba(15,23,42,0.6)';
ctx.fillRect(gx, gy, gw, gh);
ctx.strokeStyle = '#334155'; ctx.lineWidth = 1;
ctx.strokeRect(gx, gy, gw, gh);
// подпись
ctx.fillStyle = '#cbd5e1'; ctx.font='bold 11px system-ui';
ctx.fillText('График T(t)', gx, 16);
// оси
ctx.fillStyle = '#94a3b8'; ctx.font='9px system-ui';
ctx.fillText('T,°C', gx-4, gy-4);
ctx.fillText('t →', gx+gw-18, gy+gh+12);
// линия Tпл
var yTpl = gy + gh - ((Tpl-Tmin)/(Tmax-Tmin))*gh;
ctx.setLineDash([4,3]); ctx.strokeStyle='rgba(251,191,36,0.7)'; ctx.lineWidth=1;
ctx.beginPath(); ctx.moveTo(gx,yTpl); ctx.lineTo(gx+gw,yTpl); ctx.stroke();
ctx.setLineDash([]);
ctx.fillStyle = '#fbbf24'; ctx.font='bold 9px monospace';
ctx.fillText('Tпл='+Tpl+'°', gx+gw-58, yTpl-3);
// график
if(melt9history.length > 1){
var tMin = melt9history[0].t, tMax = melt9history[melt9history.length-1].t;
var tRange = Math.max(1, tMax-tMin);
ctx.lineWidth = 2;
ctx.strokeStyle = '#f59e0b';
ctx.beginPath();
melt9history.forEach(function(h, i){
var x = gx + (h.t - tMin)/tRange * gw;
var y = gy + gh - ((h.T-Tmin)/(Tmax-Tmin))*gh;
// цвет фазы
if(i===0) ctx.moveTo(x,y); else ctx.lineTo(x,y);
});
ctx.stroke();
// точки фаз
melt9history.forEach(function(h, i){
if(i % 8 !== 0 && i!==melt9history.length-1) return;
var x = gx + (h.t - tMin)/tRange * gw;
var y = gy + gh - ((h.T-Tmin)/(Tmax-Tmin))*gh;
var col = h.phase==='melt' ? '#fbbf24' : h.phase==='solid_heat' ? '#60a5fa' : '#ef4444';
ctx.fillStyle = col;
ctx.beginPath(); ctx.arc(x,y,2.2,0,Math.PI*2); ctx.fill();
});
// подсветка текущей точки
var last = melt9history[melt9history.length-1];
var lx = gx + (last.t-tMin)/tRange * gw;
var ly = gy + gh - ((last.T-Tmin)/(Tmax-Tmin))*gh;
ctx.fillStyle='#fff';
ctx.shadowColor='#fbbf24'; ctx.shadowBlur=10;
ctx.beginPath(); ctx.arc(lx,ly,4,0,Math.PI*2); ctx.fill();
ctx.shadowBlur=0;
} else {
ctx.fillStyle = '#475569'; ctx.font='10px system-ui';
ctx.fillText('Нажми "Плавить" для начала', gx+10, gy+gh/2);
}
// легенда фаз
ctx.font = '8px system-ui';
var legY = H-8;
ctx.fillStyle='#60a5fa'; ctx.beginPath(); ctx.arc(gx+4, legY-2, 2.5, 0, Math.PI*2); ctx.fill();
ctx.fillStyle='#cbd5e1'; ctx.fillText('нагрев тв.', gx+10, legY);
ctx.fillStyle='#fbbf24'; ctx.beginPath(); ctx.arc(gx+62, legY-2, 2.5, 0, Math.PI*2); ctx.fill();
ctx.fillStyle='#cbd5e1'; ctx.fillText('плавление', gx+68, legY);
ctx.fillStyle='#ef4444'; ctx.beginPath(); ctx.arc(gx+118, legY-2, 2.5, 0, Math.PI*2); ctx.fill();
ctx.fillStyle='#cbd5e1'; ctx.fillText('нагрев жид.', gx+124, legY);
}
// ═══ §10: Испарение молекул (RAF) ═══
var anim10Id = null, sl10Tval = 40, sl10Wval = 2, wind10 = false;
var liqMols10 = [], vapMols10 = [];
var liqTemp10 = 40;
function initLiq10(W, H) {
liqMols10 = [];
var cW = W * sl10Wval / 3;
var lh = H * 0.55, ly = H - lh - 30;
for (var i = 0; i < 80; i++) {
liqMols10.push({
x: (W - cW) / 2 + 5 + Math.random() * (cW - 10),
y: ly + 5 + Math.random() * (lh - 10),
vx: (Math.random() - 0.5) * 1.5,
vy: (Math.random() - 0.5) * 1.5,
energy: Math.random()
});
}
vapMols10 = [];
}
function startAnim10() {
var cv = document.getElementById('cv10');
if (!cv || cv.offsetWidth === 0) return;
if (anim10Id) { cancelAnimationFrame(anim10Id); anim10Id = 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);
liqTemp10 = sl10Tval || 40;
if (!liqMols10.length) initLiq10(W, H);
function frame() {
ctx.clearRect(0, 0, W, H);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var T = sl10Tval || 40;
var cW = W * Math.min(3, sl10Wval || 2) / 3;
var cx = (W - cW) / 2;
var lh = H * 0.5, ly = H - lh - 30;
// контейнер
ctx.strokeStyle = '#64748b'; ctx.lineWidth = 2;
ctx.beginPath();
ctx.moveTo(cx, ly); ctx.lineTo(cx, H - 30); ctx.lineTo(cx + cW, H - 30); ctx.lineTo(cx + cW, ly);
ctx.stroke();
// жидкость
ctx.fillStyle = 'rgba(59,130,246,0.2)'; ctx.fillRect(cx + 1, ly, cW - 2, lh);
// термометр и охлаждение
liqTemp10 = Math.max(0, liqTemp10 - (T < liqTemp10 ? 0 : 0) - vapMols10.filter(function(v){return v.evap;}).length * 0.02);
// жидкие молекулы
var escThresh = 0.5 + T / 200;
for (var i = liqMols10.length - 1; i >= 0; i--) {
var m = liqMols10[i];
m.energy = Math.min(1, m.energy + (T / 100 - 0.3) * 0.01 + Math.random() * 0.01);
m.vx += (Math.random() - 0.5) * 0.2; m.vy += (Math.random() - 0.5) * 0.2;
m.vx *= 0.95; m.vy *= 0.95;
m.x += m.vx; m.y += m.vy;
if (m.x < cx + 4) { m.x = cx + 4; m.vx = Math.abs(m.vx); }
if (m.x > cx + cW - 4) { m.x = cx + cW - 4; m.vx = -Math.abs(m.vx); }
if (m.y > H - 33) { m.y = H - 33; m.vy = -Math.abs(m.vy); }
if (m.y < ly + 2) m.vy = Math.abs(m.vy);
// Испарение — если у поверхности с высокой энергией
if (m.y < ly + 15 && m.energy > escThresh) {
vapMols10.push({ x: m.x, y: ly - 5, vx: (Math.random() - 0.5) * 1.5, vy: -1 - Math.random() * 1.5, alpha: 1, evap: true });
liqMols10.splice(i, 1);
liqTemp10 = Math.max(0, liqTemp10 - 0.5);
continue;
}
var e = m.energy;
ctx.fillStyle = 'rgb(' + Math.round(40 + e * 190) + ',120,' + Math.round(220 - e * 170) + ')';
ctx.beginPath(); ctx.arc(m.x, m.y, 3.5, 0, Math.PI * 2); ctx.fill();
}
// пары
for (var i = vapMols10.length - 1; i >= 0; i--) {
var v = vapMols10[i];
if (wind10) v.vx += 0.08;
v.x += v.vx; v.y += v.vy;
v.alpha -= 0.008;
if (v.alpha <= 0 || v.y < 0 || v.x < 0 || v.x > W) { vapMols10.splice(i, 1); continue; }
ctx.globalAlpha = v.alpha * 0.7;
ctx.fillStyle = '#93c5fd';
ctx.beginPath(); ctx.arc(v.x, v.y, 2.5, 0, Math.PI * 2); ctx.fill();
ctx.globalAlpha = 1;
}
// ветер
if (wind10) {
ctx.strokeStyle = 'rgba(148,163,184,0.4)'; ctx.lineWidth = 1;
var wnow = Date.now();
for (var wl = 0; wl < 3; wl++) {
var wy = ly - 15 - wl * 12 + Math.sin(wnow / 300 + wl) * 5;
ctx.beginPath(); ctx.moveTo(cx, wy); ctx.lineTo(cx + cW, wy); ctx.stroke();
}
ctx.fillStyle = '#94a3b8'; ctx.font = '11px system-ui'; ctx.fillText('→ ветер', cx + cW - 55, ly - 25);
}
// термометр
ctx.fillStyle = '#1e293b'; ctx.fillRect(20, 20, 12, H - 60);
var lth = Math.min(H - 62, liqTemp10 / 100 * (H - 62));
ctx.fillStyle = 'rgba(239,68,68,0.85)'; ctx.fillRect(21, 20 + (H - 62) - lth, 10, lth);
ctx.fillStyle = '#e2e8f0'; ctx.font = '10px system-ui';
ctx.fillText(Math.round(liqTemp10) + '°', 14, 15);
ctx.fillText('T жидк', 4, H - 35);
// Новые молекулы рождаются
if (liqMols10.length < 80) {
var cW2 = cW, cx2 = cx;
liqMols10.push({
x: cx2 + 5 + Math.random() * (cW2 - 10),
y: H - 33 - Math.random() * lh * 0.8,
vx: (Math.random() - 0.5), vy: (Math.random() - 0.5),
energy: Math.random() * 0.3
});
}
anim10Id = requestAnimationFrame(frame);
}
anim10Id = requestAnimationFrame(frame);
}
// ═══ §11: Кипение (RAF) ═══
var anim11Id = null;
var bubbles11 = [], liq11base = 100, liq11L = 2260;
function upd11P(val) {
var P = parseFloat(val) || 1;
document.getElementById('lbl11P').textContent = P.toFixed(1);
// T_кип = 100 + 30*(P-1) (линейное приближение для воды)
var Tkip = Math.round(liq11base + 30 * (P - 1));
document.getElementById('lbl11Tkip').textContent = Tkip;
upd11Q();
}
function upd11liq() {
var sel = document.getElementById('sel11liq');
if (!sel) return;
var parts = sel.value.split(',');
liq11base = parseFloat(parts[0]) || 100;
liq11L = parseFloat(parts[1]) || 2260;
var P = parseFloat(document.getElementById('sl11P').value) || 1;
upd11P(P);
}
function upd11Q() {
var m = parseFloat(document.getElementById('sl11m').value) || 1;
var Q = (liq11L * m / 1000).toFixed(2);
var res = document.getElementById('cv11result');
if (res) res.innerHTML = 'Q = L · m = ' + (liq11L / 1000).toFixed(3) + ' МДж/кг × ' + m.toFixed(1) + ' кг = <b>' + Q + ' МДж</b>';
}
function startAnim11() {
var cv = document.getElementById('cv11');
if (!cv || cv.offsetWidth === 0) return;
if (anim11Id) { cancelAnimationFrame(anim11Id); anim11Id = null; }
bubbles11 = [];
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 bubTimer = 0;
function frame() {
ctx.clearRect(0, 0, W, H);
ctx.fillStyle = '#0f172a'; ctx.fillRect(0, 0, W, H);
var liqTop = H * 0.15, liqBot = H - 50;
var liqH = liqBot - liqTop;
// жидкость
var lgrd = ctx.createLinearGradient(0, liqTop, 0, liqBot);
lgrd.addColorStop(0, 'rgba(186,230,253,0.15)');
lgrd.addColorStop(1, 'rgba(59,130,246,0.25)');
ctx.fillStyle = lgrd; ctx.fillRect(20, liqTop, W - 40, liqH);
ctx.strokeStyle = '#38bdf8'; ctx.lineWidth = 1.5;
ctx.strokeRect(20, liqTop, W - 40, liqH);
// пламя снизу
var now = Date.now();
for (var fl = 0; fl < 5; fl++) {
var fx = 30 + fl * (W - 60) / 4 + Math.sin(now / 200 + fl) * 8;
var fh = 25 + Math.sin(now / 130 + fl * 0.7) * 10;
var fgrd = ctx.createLinearGradient(fx, liqBot, fx, liqBot + fh);
fgrd.addColorStop(0, 'rgba(251,146,60,0.9)');
fgrd.addColorStop(1, 'rgba(239,68,68,0)');
ctx.fillStyle = fgrd;
ctx.beginPath(); ctx.ellipse(fx, liqBot + fh / 2, 10, fh / 2, 0, 0, Math.PI * 2); ctx.fill();
}
ctx.fillStyle = '#94a3b8'; ctx.font = '10px system-ui'; ctx.fillText('🔥 Нагреватель', 20, H - 5);
// T метка
var Tsl = document.getElementById('sl11P');
var P = Tsl ? parseFloat(Tsl.value) : 1;
var Tkip = Math.round(liq11base + 30 * (P - 1));
ctx.fillStyle = '#fbbf24'; ctx.font = 'bold 11px system-ui';
ctx.fillText('T = ' + Tkip + '°C = const', W / 2 - 50, liqTop + 20);
// Пузырьки
bubTimer += 16;
if (bubTimer > 350) {
var nx = 30 + Math.random() * (W - 60);
bubbles11.push({ x: nx, y: liqBot - 8, r: 2 + Math.random() * 3 });
bubTimer = 0;
}
for (var i = bubbles11.length - 1; i >= 0; i--) {
var b = bubbles11[i];
b.r += 0.3; b.y -= 1.5;
b.x += Math.sin(now / 200 + i) * 0.5;
ctx.strokeStyle = 'rgba(186,230,253,0.7)'; ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.arc(b.x, b.y, b.r, 0, Math.PI * 2); ctx.stroke();
if (b.y < liqTop + 5) {
// Лопнуть: брызги
for (var sp = 0; sp < 4; sp++) {
ctx.strokeStyle = 'rgba(186,230,253,0.4)'; ctx.lineWidth = 1;
ctx.beginPath(); ctx.moveTo(b.x, b.y);
ctx.lineTo(b.x + Math.cos(sp * Math.PI / 2) * 8, b.y + Math.sin(sp * Math.PI / 2) * 8);
ctx.stroke();
}
bubbles11.splice(i, 1);
}
}
// пар над поверхностью
ctx.fillStyle = 'rgba(186,230,253,0.08)';
for (var pv = 0; pv < 8; pv++) {
ctx.beginPath(); ctx.ellipse(30 + pv * (W - 60) / 7, liqTop - 10 - Math.sin(now / 300 + pv) * 8, 6, 4, 0, 0, Math.PI * 2); ctx.fill();
}
anim11Id = requestAnimationFrame(frame);
}
anim11Id = requestAnimationFrame(frame);
}
// ═══════════════════════════════════════
// ИНИЦИАЛИЗАЦИЯ
// ═══════════════════════════════════════
document.addEventListener('DOMContentLoaded', function() {
// тема
if (localStorage.getItem('phys8_t_theme')==='dark') document.documentElement.classList.add('dark');
document.getElementById('themeBtn').onclick = function() {
document.documentElement.classList.toggle('dark');
localStorage.setItem('phys8_t_theme', document.documentElement.classList.contains('dark')?'dark':'light');
};
// sidebar ch-btn nav
function switchTab(tn) {
document.querySelectorAll('.ch-btn').forEach(function(b){ b.classList.remove('active'); });
document.querySelectorAll('.content').forEach(function(c){ c.classList.remove('active'); });
var btn = document.querySelector('.ch-btn[data-tab="'+tn+'"]');
if (btn) btn.classList.add('active');
var cont = document.getElementById('tab-'+tn);
if (cont) cont.classList.add('active');
if (tn==='ref1') setTimeout(startAnim1, 60);
if (tn==='ref4') setTimeout(startAnim4, 60);
if (tn==='ref5') setTimeout(startAnim5, 60);
if (tn==='ref6') setTimeout(upd6, 60);
if (tn==='ref7') setTimeout(upd7, 60);
if (tn==='ref8') setTimeout(function(){ var cv8el = document.getElementById('cv8'); if (cv8el && !lattice8.length) initLattice8(cv8el.offsetWidth, 220); upd8(); }, 60);
if (tn==='ref9') setTimeout(function(){ drawMelt9(); upd9(); }, 60);
if (tn==='ref10') setTimeout(startAnim10, 60);
if (tn==='ref11') setTimeout(startAnim11, 60);
// на мобильном: прокрутить sidebar к активной кнопке
if (btn && window.innerWidth <= 768) btn.scrollIntoView({block:'nearest',inline:'center',behavior:'smooth'});
}
document.querySelectorAll('.ch-btn').forEach(function(btn) {
btn.onclick = function() { switchTab(this.dataset.tab); };
});
// совместимость: старые .tab тоже работают (используются в buildMiniToc и др.)
document.querySelectorAll('.tab').forEach(function(tab) {
tab.onclick = function() { switchTab(this.dataset.tab); };
});
// переключение вкладок ref-panel
window.switchRefTab = function(name) {
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*="\''+name+'\'"]');
if (btn) btn.classList.add('active');
var cont = document.getElementById('reftab-'+name);
if (cont) cont.classList.add('active');
// render KaTeX в шпаргалке при первом открытии
if (name === 'cheat' && cont && !cont.dataset.katexDone) {
cont.dataset.katexDone = '1';
if (window.renderMathInElement) renderMathInElement(cont, {
delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false}],
throwOnError:false
});
}
};
// refPanel — popup toggle
var refRendered = false;
document.getElementById('refToggle').onclick = function(e) {
e.stopPropagation();
var panel = document.getElementById('refPanel');
panel.classList.toggle('show');
if (!refRendered && panel.classList.contains('show')) {
refRendered = true;
if (window.renderMathInElement) renderMathInElement(panel, {
delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false}],
throwOnError:false
});
}
};
document.addEventListener('click', function(e) {
var panel = document.getElementById('refPanel');
var toggle = document.getElementById('refToggle');
if (panel && panel.classList.contains('show') && !panel.contains(e.target) && e.target !== toggle) {
panel.classList.remove('show');
}
});
// задачи — инит
['p1','p2','p3','p4','p5','p6','p7','p8','p9','p10','p11','hard'].forEach(function(sec) {
renderTask(sec);
});
setParaTab('p1');
// KaTeX
if (window.renderMathInElement) {
renderMathInElement(document.body, {
delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false}],
throwOnError:false
});
}
// первоначальный запуск анимации §1
setTimeout(startAnim1, 200);
setTimeout(drawRod3, 300);
setTimeout(upd6, 100);
setTimeout(upd7, 100);
setTimeout(function(){ drawMelt9(); upd9(); }, 100);
setTimeout(upd11Q, 100);
setTimeout(startAnim11, 400);
// ═══════════ 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')){
// определить номер § из class ph-N
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){
// не трогаем para-hero — у него своя анимация
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, .tab, .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');
// reflow
void btn.offsetWidth;
btn.classList.add('is-ripple');
setTimeout(function(){ btn.classList.remove('is-ripple'); }, 600);
});
// 5. Mini-TOC — no-op (убран в новом layout)
// buildMiniToc(); — не нужен
// 6. Chapter progress — no-op (убран в новом layout)
// updateChapterProgress(); — не нужен
}
function buildMiniToc(){ /* no-op — mini-TOC убран */ }
function markMiniTocActive(target){ /* no-op */ }
function updateChapterProgress(){ /* no-op — chapter-prog убран */ }
// ═══ 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>