Files
Learn_System/frontend/textbooks/physics_9_ch4.html
T
Maxim Dolgolyov d2ce0d70b2 feat(phys9 ch4): добавлены 6 виджетов Wave D — Глава 4 «Импульс, энергия, колебания»
Новый модуль frontend/js/phys9_ch4_widgets.js — экспортирует
window.PHYS9_CH4_WIDGETS = { p31..p36: fn }.

Виджеты:
- §31 CALC: импульс p=mv с slider'ами m, v и бытовой аналогией
  (футбольный мяч / автомобиль / грузовик и т.д.)
- §32 CALC: ЗСИ — упругий и неупругий удар двух тел. m₁, v₁, m₂, v₂ →
  v₁', v₂', проверка сохранения импульса
- §33 DnD: 9 ситуаций → знак работы (A>0/A<0/A=0)
- §34 CALC: Ek+Ep с slider'ами m, v, h
- §35 CALC: ЗСМЭ — найти v в любой точке горки по высоте старта
  (h_старт=5, h_тек=0 → v=9.9 м/с)
- §36 CALC: период маятника (математ./пружинный) — переключатель,
  формула обновляется автоматически

Подключено в physics_9_ch4.html через тот же hook ensureBuilt.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:50:53 +03:00

2410 lines
168 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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">
<head>
<meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<title>Физика 9 · Глава 4 · «Законы сохранения»</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
<link rel="stylesheet" href="/css/phys-textbook-widgets.css">
<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"
onload="renderMathInElement(document.body,{delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false},{left:'\\[',right:'\\]',display:true},{left:'\\(',right:'\\)',display:false}],throwOnError:false})"></script>
<script src="/js/api.js" defer></script>
<script src="/js/xp.js" defer></script>
<script src="/js/phys.js" defer></script>
<script src="/js/phys9_palette.js" defer></script>
<script src="/js/phys9_legacy.js" defer></script>
<script src="/js/phys9_ch4_widgets.js" defer></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Manrope:wght@600;700;800;900&family=Unbounded:wght@700;800;900&family=JetBrains+Mono:wght@500;700&display=swap" rel="stylesheet">
<style>
:root{
--bg:#fafafa; --card:#fff; --card-soft:#f8fafc; --text:#0f172a; --ink:#0f172a; --muted:#64748b;
--border:#e2e8f0; --sh:0 1px 3px rgba(0,0,0,.06); --sh2:0 4px 14px rgba(0,0,0,.08);
--pri:#db2777; --pri2:#be185d; --pri-soft:#fce7f3;
--acc:#f472b6; --acc2:#db2777; --acc-soft:#fce7f3;
--ok:#10b981; --ok-bg:#d1fae5; --warn:#f59e0b; --warn-bg:#fef3c7;
--bad:#ef4444; --fail:#dc2626; --fail-bg:#fee2e2;
}
.dark{--bg:#0a0e1a; --card:#0f1727; --card-soft:#13192a; --text:#dbeafe; --ink:#dbeafe; --muted:#7c8fab; --border:#1e2a44}
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{font-family:'Inter',system-ui,sans-serif;background:var(--bg);color:var(--text);line-height:1.55;font-size:15px}
button,input,select,textarea{font-family:inherit;font-size:inherit}
button{cursor:pointer;border:0;background:transparent;color:inherit}
a{color:inherit;text-decoration:none}
.ic{width:16px;height:16px;display:inline-block;flex-shrink:0;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vertical-align:middle}
.hdr{position:relative;background:linear-gradient(110deg,#831843 0%,#db2777 55%,#f472b6 100%);color:#fff;padding:46px 22px 30px;overflow:hidden;border-bottom:2px solid rgba(255,255,255,.2);min-height:130px}
.hdr::before{content:'ГЛАВА 4';position:absolute;right:-12px;top:50%;transform:translateY(-50%);font-family:'Unbounded',sans-serif;font-size:clamp(5rem,15vw,11rem);font-weight:900;letter-spacing:-.04em;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.12);line-height:1;pointer-events:none;user-select:none;z-index:0}
.hdr-row{position:relative;z-index:1;display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.hdr h1{font-family:'Unbounded',sans-serif;font-size:1.5rem;font-weight:900;letter-spacing:-.01em;line-height:1.3;padding-top:4px}
.hdr-sub{font-size:.85rem;opacity:.88;margin-top:6px;font-weight:500;line-height:1.4}
.hdr-side{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.hdr-btn{padding:7px 12px;border-radius:9px;background:rgba(255,255,255,.14);color:#fff;font-weight:600;font-size:.82rem;display:inline-flex;align-items:center;gap:6px;transition:background .15s;text-decoration:none}
.hdr-btn:hover{background:rgba(255,255,255,.24)}
.main{max-width:1240px;margin:0 auto;padding:22px;width:100%;display:grid;grid-template-columns:1fr 280px;gap:24px}
@media(max-width:980px){.main{grid-template-columns:1fr;padding:14px}}
.col-main{min-width:0}
.hero{background:linear-gradient(135deg,var(--pri-soft) 0%,var(--acc-soft) 50%,var(--pri-soft) 100%);background-size:200% 200%;animation:heroShift 12s ease-in-out infinite;border:1px solid var(--border);border-radius:18px;padding:24px 22px;margin-bottom:24px;position:relative;overflow:hidden}
@keyframes heroShift{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
.hero::before{content:'p&middot;E';position:absolute;right:0;top:-30px;font-size:clamp(2rem,12vw,8rem);font-weight:900;color:var(--pri);opacity:.10;line-height:1;pointer-events:none;font-family:'Unbounded',sans-serif}
.hero h2{font-family:'Unbounded',sans-serif;font-size:1.55rem;font-weight:800;color:var(--pri2);margin-bottom:10px;letter-spacing:-.01em}
.hero p{font-size:.95rem;color:var(--text);opacity:.88;margin-bottom:14px;max-width:640px}
.hero-row{display:flex;gap:14px;flex-wrap:wrap;align-items:center}
.btn-primary{padding:11px 22px;background:linear-gradient(135deg,var(--pri),var(--pri2));color:#fff;border-radius:11px;font-weight:700;font-size:.92rem;display:inline-flex;align-items:center;gap:8px;box-shadow:var(--sh2);transition:transform .15s,box-shadow .15s}
.btn-primary:hover{transform:translateY(-1px);box-shadow:0 8px 28px rgba(0,0,0,.18)}
.hero-progress{flex:1;min-width:200px;max-width:280px}
.hp-label{font-size:.74rem;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;display:block;margin-bottom:5px}
.hp-bar{height:8px;background:rgba(0,0,0,.12);border-radius:5px;overflow:hidden}
.hp-fill{height:100%;background:linear-gradient(90deg,var(--pri),var(--acc));border-radius:5px;width:0%;transition:width .6s cubic-bezier(.16,1,.3,1)}
.hp-text{font-size:.78rem;color:var(--muted);font-weight:700;margin-top:4px;display:block}
.hero-xp-badge{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:linear-gradient(135deg,var(--warn,#f59e0b),var(--pri));color:#fff;border-radius:99px;font-size:.82rem;font-weight:800;letter-spacing:.02em;box-shadow:0 4px 12px rgba(0,0,0,.18);font-family:'Unbounded',sans-serif}
.psel{margin-bottom:24px}
.psel-title{font-size:.72rem;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.08em;margin-bottom:10px}
.psel-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px}
.psel-card{background:var(--card);border:1.5px solid var(--border);border-radius:13px;padding:14px;cursor:pointer;transition:transform .2s,box-shadow .2s,border-color .2s;text-align:left;position:relative}
.psel-card:hover{transform:translateY(-3px);box-shadow:var(--sh2);border-color:var(--pri)}
.psel-card.active{border-color:var(--pri);background:linear-gradient(135deg,var(--pri-soft),var(--card));box-shadow:var(--sh2)}
.psel-card.active::after{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,var(--pri),var(--acc));border-radius:13px 13px 0 0}
.psel-num{font-family:'Unbounded',sans-serif;font-size:.72rem;font-weight:800;color:var(--pri);text-transform:uppercase;letter-spacing:.08em;margin-bottom:5px}
.psel-name{font-size:.86rem;font-weight:700;color:var(--text);line-height:1.3;margin-bottom:8px}
.psel-prog{height:4px;background:rgba(0,0,0,.10);border-radius:3px;overflow:hidden}
.psel-prog-fill{height:100%;background:var(--pri);width:0%;transition:width .4s}
.psel-card.final{background:linear-gradient(135deg,var(--acc-soft),var(--pri-soft))}
.psel-card.final .psel-num{color:var(--warn)}
.sec[id="sec-p31"]{ --sec-acc:#db2777; --sec-acc-d:#be185d; --sec-acc-soft:#fce7f3; }
.sec[id="sec-p32"]{ --sec-acc:#db2777; --sec-acc-d:#be185d; --sec-acc-soft:#fce7f3; }
.sec[id="sec-p33"]{ --sec-acc:#db2777; --sec-acc-d:#be185d; --sec-acc-soft:#fce7f3; }
.sec[id="sec-p34"]{ --sec-acc:#db2777; --sec-acc-d:#be185d; --sec-acc-soft:#fce7f3; }
.sec[id="sec-p35"]{ --sec-acc:#db2777; --sec-acc-d:#be185d; --sec-acc-soft:#fce7f3; }
.sec[id="sec-p36"]{ --sec-acc:#db2777; --sec-acc-d:#be185d; --sec-acc-soft:#fce7f3; }
.sec[id="sec-final4"]{ --sec-acc:#db2777; --sec-acc-d:#be185d; --sec-acc-soft:#fce7f3; }
.sec{display:none;position:relative;animation:fadeIn .35s ease}
.sec.active{display:block}
@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.sec::before{content:attr(data-watermark);position:absolute;right:-20px;top:10%;font-family:'Unbounded',sans-serif;font-size:clamp(6rem,18vw,14rem);font-weight:900;color:transparent;-webkit-text-stroke:1.5px var(--sec-acc-soft,var(--pri-soft));line-height:1;pointer-events:none;user-select:none;z-index:0;opacity:.35}
.sec-header{margin-bottom:22px;padding-bottom:14px;border-bottom:2px solid var(--sec-acc-soft,var(--pri-soft));position:relative;z-index:1}
.sec-num{display:inline-block;padding:4px 10px;background:linear-gradient(135deg,var(--sec-acc,var(--pri)),var(--sec-acc-d,var(--pri2)));color:#fff;border-radius:7px;font-family:'Unbounded',sans-serif;font-size:.78rem;font-weight:800;letter-spacing:.04em;margin-bottom:8px}
.sec-h{font-family:'Unbounded',sans-serif;font-size:1.6rem;font-weight:800;color:var(--sec-acc-d,var(--pri2));letter-spacing:-.01em;line-height:1.25}
.card{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:18px 20px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.04),0 8px 24px rgba(0,0,0,.04);position:relative;z-index:1;transition:transform .25s cubic-bezier(.16,1,.3,1),box-shadow .25s}
.card:hover{transform:translateY(-2px);box-shadow:0 4px 10px rgba(0,0,0,.06),0 16px 36px rgba(0,0,0,.08)}
.card-header{display:flex;align-items:center;gap:10px;margin-bottom:12px;padding-bottom:10px;border-bottom:1px dashed var(--border)}
.card-icon{width:32px;height:32px;border-radius:9px;display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#fff}
.card-icon.theory{background:#8b5cf6}.card-icon.example{background:#10b981}.card-icon.lab{background:#0891b2}.card-icon.rule{background:#ec4899}
.card-icon .ic{width:18px;height:18px}
.card-title{font-family:'Unbounded',sans-serif;font-size:.82rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);flex:1}
.card-num{font-size:.74rem;font-weight:700;color:var(--muted);background:var(--sec-acc-soft,var(--pri-soft));padding:3px 7px;border-radius:5px}
.card-body{font-size:.94rem;line-height:1.65}
.card-body p{margin-bottom:8px}
.card-body p:last-child{margin-bottom:0}
.btn{padding:8px 16px;border-radius:8px;background:var(--card);color:var(--text);border:1.5px solid var(--border);font-weight:600;font-size:.88rem;transition:background .15s,border-color .15s,transform .1s}
.btn:hover{background:var(--sec-acc-soft,var(--pri-soft));border-color:var(--sec-acc,var(--pri))}
.btn:active{transform:scale(.96)}
.btn.primary{background:var(--sec-acc,var(--pri));color:#fff;border-color:var(--sec-acc,var(--pri))}
.btn.primary:hover{background:var(--sec-acc-d,var(--pri2));border-color:var(--sec-acc-d,var(--pri2))}
.col-side{position:sticky;top:14px;align-self:start;height:fit-content;max-height:calc(100vh - 28px);overflow-y:auto}
.sidecard{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:16px;margin-bottom:14px;box-shadow:var(--sh)}
.sidecard h4{font-family:'Unbounded',sans-serif;font-size:.74rem;font-weight:800;color:var(--pri2);text-transform:uppercase;letter-spacing:.07em;margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid var(--border)}
.sidecard-row{margin-bottom:8px;font-size:.86rem;line-height:1.6}
.sidecard-row b{color:var(--pri);font-weight:700}
.sidecard-row:last-child{margin-bottom:0}
@media(max-width:980px){.col-side{position:static;max-height:none}}
.xp-card{background:linear-gradient(135deg,var(--acc-soft),var(--pri-soft));border:1.5px solid var(--acc);border-radius:12px;padding:14px;margin-bottom:14px}
.xp-card-title{font-size:.68rem;font-weight:800;color:var(--acc2);text-transform:uppercase;letter-spacing:.07em;margin-bottom:8px;display:flex;align-items:center;justify-content:space-between}
.xp-level{font-size:1.1rem;font-weight:900;color:var(--acc2);font-family:'Unbounded',sans-serif}
.xp-bar{height:9px;background:rgba(0,0,0,.10);border-radius:6px;overflow:hidden;margin:7px 0}
.xp-fill{height:100%;background:linear-gradient(90deg,var(--acc),var(--pri));border-radius:6px;transition:width .5s cubic-bezier(.4,0,.2,1)}
.xp-nums{font-size:.74rem;color:var(--muted);display:flex;justify-content:space-between}
.sec-nav{display:flex;gap:10px;margin-top:24px;padding-top:20px;border-top:1px solid var(--border);justify-content:space-between;flex-wrap:wrap}
.foot{text-align:center;padding:30px 16px;color:var(--muted);font-size:.78rem;border-top:1px solid var(--border);margin-top:30px}
.ach-popup{position:fixed;top:80px;right:18px;background:linear-gradient(135deg,var(--pri),var(--acc));color:#fff;padding:12px 18px;border-radius:11px;font-weight:700;font-size:.9rem;box-shadow:0 8px 28px rgba(0,0,0,.32);z-index:1002;display:none;align-items:center;gap:8px;max-width:340px}
.ach-popup.show{display:flex}
.col-side-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.42);z-index:9990;display:none}
.col-side-backdrop.show{display:block}
@media(min-width:981px){#sidebar-btn{display:none}.col-side-backdrop.show{display:none}}
@media(max-width:980px){
.col-side{position:fixed;top:0;right:0;height:100vh;width:300px;max-width:88vw;background:var(--bg);box-shadow:-12px 0 24px rgba(0,0,0,.18);padding:18px 16px;overflow-y:auto;transform:translateX(100%);transition:transform .25s ease;z-index:9991;max-height:none}
.col-side.open{transform:none}
}
.search-modal{position:fixed;inset:0;background:rgba(15,23,42,.55);backdrop-filter:blur(4px);z-index:9993;display:none;align-items:flex-start;justify-content:center;padding-top:14vh}
.search-modal.show{display:flex}
.search-box{background:var(--bg);border:1px solid var(--border);border-radius:14px;width:560px;max-width:92vw;max-height:70vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 24px 64px rgba(0,0,0,.4)}
.search-input{padding:14px 16px;font-size:1rem;border:0;border-bottom:1px solid var(--border);background:transparent;color:var(--text);outline:none}
.search-results{flex:1;overflow-y:auto;padding:6px 0}
.search-row{display:block;padding:8px 16px;cursor:pointer;border-bottom:1px solid var(--border);text-align:left;background:transparent;border:0;width:100%;color:var(--text)}
.search-row:hover,.search-row.active{background:var(--sec-acc-soft,var(--pri-soft))}
.search-row .sr-kind{font-size:.7rem;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin-bottom:2px}
.search-row .sr-title{font-weight:700;font-size:.92rem;color:var(--text)}
.search-row .sr-desc{font-size:.8rem;color:var(--muted);margin-top:2px}
.search-empty{padding:20px;text-align:center;color:var(--muted);font-size:.88rem}
.search-foot{padding:8px 14px;border-top:1px solid var(--border);font-size:.74rem;color:var(--muted);display:flex;gap:14px}
.search-foot kbd{padding:2px 6px;background:var(--card);border:1px solid var(--border);border-radius:4px;font-family:'JetBrains Mono',monospace;font-size:.72rem}
.psel-card{position:relative}
.psel-card .psel-done{position:absolute;top:6px;right:6px;width:18px;height:18px;border-radius:50%;background:#10b981;display:none;align-items:center;justify-content:center;box-shadow:0 2px 6px rgba(16,185,129,.45);z-index:2}
.psel-card .psel-done svg{width:11px;height:11px;stroke:#fff;fill:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round}
.psel-card.done .psel-done{display:flex}
/* === MONOLITH CSS (migrated from physics_9.html) === */
:root{
--pri:#1d4ed8; --pri2:#1e40af;
--acc:#0ea5e9;
--ok:#10b981; --ok-bg:#d1fae5;
--fail:#ef4444; --fail-bg:#fee2e2;
--warn:#f59e0b; --warn-bg:#fef3c7;
--bg:#eff6ff; --card:#fff;
--text:#1e293b; --muted:#64748b;
--border:#dbeafe;
--sh:0 2px 10px rgba(30,64,175,.08)
}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);overflow-x:hidden}
.dark{--bg:#0f172a;--card:#1e293b;--text:#e2e8f0;--muted:#94a3b8;--border:#1e3a5f}
/* ── Шапка ── */
.hdr{background:linear-gradient(135deg,#1e40af 0%,#0284c7 55%,#0ea5e9 100%);color:#fff;padding:18px 20px 16px;text-align:center}
.hdr h1{font-size:1.3rem;font-weight:900}
.hdr p{font-size:.8rem;opacity:.85;margin-top:3px}
/* ── Табы ── */
.tabs{display:flex;flex-wrap:wrap;gap:4px;padding:8px 10px;background:var(--card);border-bottom:1px solid var(--border)}
.tabs::-webkit-scrollbar{display:none}
.tab{padding:8px 14px;border:2px solid var(--border);border-radius:10px;font-size:.74rem;font-weight:700;cursor:pointer;white-space:nowrap;transition:.18s;background:var(--card);color:var(--muted);flex-shrink:0}
.tab:hover{border-color:var(--pri);color:var(--pri)}
.tab.active{background:var(--pri);color:#fff;border-color:var(--pri)}
/* ── Контент ── */
.content{max-width:780px;margin:0 auto;padding:16px 14px;display:none}
.content.active{display:block}
/* ── Справочник: карточки формул ── */
.section-title{font-size:1.05rem;font-weight:800;margin-bottom:12px;color:var(--pri);display:flex;align-items:center;gap:8px}
.section-title i{opacity:.7}
.formula-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:20px}
@media(max-width:560px){.formula-grid{grid-template-columns:1fr}}
.fcard{background:var(--card);border:2px solid var(--border);border-radius:14px;padding:16px 18px;box-shadow:var(--sh);transition:transform .18s,box-shadow .18s}
.fcard:hover{transform:translateY(-2px);box-shadow:0 6px 22px rgba(29,78,216,.12)}
.fcard.highlight{border-color:var(--pri);background:linear-gradient(135deg,rgba(29,78,216,.04),rgba(14,165,233,.04))}
.fcard h3{font-size:.8rem;font-weight:700;color:var(--pri);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px}
.fcard .main-f{font-size:1.05rem;font-weight:700;text-align:center;margin:8px 0;padding:10px;background:rgba(29,78,216,.06);border-radius:9px}
.fcard p{font-size:.83rem;color:var(--muted);line-height:1.7;margin-top:6px}
.fcard ul{font-size:.83rem;color:var(--muted);line-height:1.8;padding-left:18px;margin-top:6px}
/* ── Пример задачи ── */
.example-box{background:var(--card);border:2px solid #bfdbfe;border-left:5px solid var(--pri);border-radius:12px;padding:18px 20px;margin-bottom:20px;box-shadow:var(--sh)}
.example-box h3{font-size:.88rem;font-weight:700;color:var(--pri);margin-bottom:10px}
.example-box .cond{font-size:.87rem;background:rgba(29,78,216,.05);border-radius:8px;padding:10px 14px;line-height:1.8;margin-bottom:10px}
.example-box .sol{font-size:.86rem;line-height:1.9}
.given-table{width:100%;border-collapse:collapse;margin:8px 0;font-size:.82rem}
.given-table td{padding:4px 10px;border:1px solid var(--border)}
.given-table tr:first-child td{background:rgba(29,78,216,.04)}
.given-table tr:last-child td{background:rgba(16,185,129,.05)}
.given-table td:first-child{font-weight:700;width:38%;color:var(--pri)}
/* ── Вопросы (теоретические) ── */
.q-list{font-size:.85rem;line-height:1.9;color:var(--muted);padding-left:20px}
.q-list li{margin-bottom:4px}
/* ── Задачи: интерактив ── */
.score-bar{display:flex;gap:10px;align-items:center;justify-content:center;margin-bottom:14px;font-size:.85rem;font-weight:600}
.chip{padding:5px 14px;border-radius:50px;display:flex;align-items:center;gap:5px}
.chip-ok{background:var(--ok-bg);color:#065f46}
.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:16px}
.prog-fill{height:100%;background:linear-gradient(90deg,var(--pri),var(--acc));border-radius:3px;transition:width .4s}
.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:.97rem;font-weight:700;line-height:1.85;margin-bottom:14px}
.task-hint{font-size:.8rem;color:var(--muted);margin-top:4px;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:110px;padding:11px 10px;border:2px solid var(--border);border-radius:10px;font-size:1.05rem;font-family:'JetBrains Mono',monospace;text-align:center;outline:none;background:var(--card);color:var(--text);transition:.18s}
.ans-inp:focus{border-color:var(--pri);box-shadow:0 0 0 3px rgba(29,78,216,.12)}
.unit-lbl{font-size:.82rem;color:var(--muted);font-weight:600;white-space:nowrap}
.btn{padding:11px 20px;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{background:var(--pri2)}
.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)}
.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 .28s ease}
.fb-ok{background:var(--ok-bg);color:#065f46}
.fb-fail{background:var(--fail-bg);color:#991b1b}
@keyframes pop{from{opacity:0;transform:scale(.94)}to{opacity:1;transform:scale(1)}}
/* ── Итог ── */
.summary{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:28px;text-align:center;box-shadow:var(--sh);display:none}
.summary.show{display:block;animation:pop .35s ease}
.summary h2{font-size:1.2rem;font-weight:800;margin-bottom:8px}
.big-score{font-size:3.5rem;font-weight:900;color:var(--pri);line-height:1;margin:10px 0}
.sum-grade{color:var(--muted);font-size:.9rem;margin-bottom:20px}
.sum-btns{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
/* ── Справочник (плавающая кнопка) ── */
.ref-toggle{position:fixed;bottom:16px;right:16px;z-index:60;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 4px 14px rgba(29,78,216,.3)}
.ref-panel{position:fixed;bottom:72px;right:16px;z-index:60;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(29,78,216,.06);border-radius:8px;padding:6px 10px;margin:3px 0;text-align:center}
/* ── Para-hero баннеры ── */
.para-hero{border-radius:18px;padding:22px 24px;margin-bottom:22px;position:relative;overflow:hidden}
.para-hero::after{content:'';position:absolute;right:-28px;top:-28px;width:150px;height:150px;border-radius:50%;opacity:.13;pointer-events:none}
.ph-31{background:linear-gradient(135deg,#1e3a8a 0%,#1d4ed8 55%,#3b82f6 100%);color:#fff}
.ph-31::after{background:#bfdbfe}
.ph-32{background:linear-gradient(135deg,#0c4a6e 0%,#0369a1 55%,#0ea5e9 100%);color:#fff}
.ph-32::after{background:#bae6fd}
.ph-33{background:linear-gradient(135deg,#064e3b 0%,#065f46 55%,#10b981 100%);color:#fff}
.ph-33::after{background:#a7f3d0}
.ph-34{background:linear-gradient(135deg,#78350f 0%,#92400e 55%,#d97706 100%);color:#fff}
.ph-34::after{background:#fde68a}
.ph-35{background:linear-gradient(135deg,#4c1d95 0%,#6d28d9 55%,#8b5cf6 100%);color:#fff}
.ph-35::after{background:#ddd6fe}
.ph-36{background:linear-gradient(135deg,#134e4a 0%,#0f766e 55%,#2dd4bf 100%);color:#fff}
.ph-36::after{background:#99f6e4}
.para-hero .ph-label{font-size:.7rem;font-weight:700;opacity:.7;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}
.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}
.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}
/* ── Запомни! ── */
.remember-box{background:linear-gradient(135deg,rgba(239,68,68,.06),rgba(220,38,38,.03));border:2px solid rgba(239,68,68,.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}
.dark .remember-box{border-color:rgba(239,68,68,.4);background:rgba(239,68,68,.07)}
.dark .remember-box-title{color:#fca5a5}
.remember-box ul{padding-left:18px;margin:0}
.remember-box li,.remember-box p{font-size:.83rem;color:var(--text);line-height:1.9;margin:0}
/* ── Частые ошибки ── */
.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}
.dark .mistakes-box{border-color:rgba(245,158,11,.4);background:rgba(245,158,11,.07)}
.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}
/* ── Шаги решения ── */
.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}
/* ── Интерактивные схемы ── */
.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}}
.slider-row{display:flex;align-items:center;gap:10px;margin:8px 0;font-size:.82rem;flex-wrap:wrap}
.slider-lbl{min-width:90px;font-weight:600;color:var(--text);flex-shrink:0}
.slider-val{min-width:72px;font-weight:800;color:var(--pri);font-family:'JetBrains Mono',monospace;font-size:.82rem;flex-shrink:0}
input[type=range]{flex:1;min-width:100px;accent-color:var(--pri);cursor:pointer}
.idiag-result{background:rgba(29,78,216,.08);border-radius:10px;padding:10px 14px;margin-top:10px;font-size:.9rem;font-weight:700;text-align:center;font-family:'JetBrains Mono',monospace;letter-spacing:.02em;border:1px solid rgba(29,78,216,.15)}
.work-pos{color:#065f46;font-weight:900}.work-zero{color:#92400e;font-weight:900}.work-neg{color:#991b1b;font-weight:900}
/* ── Цепочка вывода формулы ── */
.fchain{display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:rgba(29,78,216,.04);border:1px solid var(--border);border-radius:11px;padding:11px 15px;margin:10px 0;font-size:.82rem}
.fchain-step{background:var(--card);border:1.5px solid var(--border);border-radius:8px;padding:4px 12px;font-family:'JetBrains Mono',monospace;font-size:.8rem;font-weight:600}
.fchain-arrow{color:var(--muted);font-weight:700}
.fchain-note{font-size:.73rem;color:var(--muted);font-style:italic}
/* ── Объяснение по-человечески ── */
.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}
.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}
.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}
.dark .student-box b{color:#fbbf24}
/* ── Тема ── */
.theme-btn{position:fixed;top:12px;right:12px;z-index:60;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)}
/* ── Para badge (сложные задачи) ── */
.para-badge{display:inline-flex;align-items:center;padding:2px 8px;background:rgba(29,78,216,.13);color:var(--pri);border-radius:6px;font-size:.68rem;font-weight:800;margin-left:7px;letter-spacing:.03em}
.para-badge.b32{background:rgba(14,165,233,.13);color:#0284c7}
.para-badge.b33{background:rgba(16,185,129,.13);color:#059669}
.para-badge.b34{background:rgba(245,158,11,.13);color:#d97706}
.para-badge.b35{background:rgba(109,40,217,.13);color:#6d28d9}
.para-badge.b36{background:rgba(15,118,110,.13);color:#0f766e}
/* ── §1–14 Кинематика Para-heroes ── */
.ph-1{background:linear-gradient(135deg,#7f1d1d 0%,#dc2626 55%,#f97316 100%);color:#fff}
.ph-1::after{background:#fed7aa}
.ph-2{background:linear-gradient(135deg,#134e4a 0%,#0d9488 55%,#2dd4bf 100%);color:#fff}
.ph-2::after{background:#99f6e4}
.ph-3{background:linear-gradient(135deg,#500724 0%,#be185d 55%,#f472b6 100%);color:#fff}
.ph-3::after{background:#fce7f3}
.ph-4{background:linear-gradient(135deg,#431407 0%,#b45309 55%,#fbbf24 100%);color:#fff}
.ph-4::after{background:#fde68a}
.ph-5{background:linear-gradient(135deg,#1e3a8a 0%,#1d4ed8 55%,#60a5fa 100%);color:#fff}
.ph-5::after{background:#bfdbfe}
.ph-6{background:linear-gradient(135deg,#14532d 0%,#15803d 55%,#4ade80 100%);color:#fff}
.ph-6::after{background:#bbf7d0}
.ph-7{background:linear-gradient(135deg,#2e1065 0%,#7c3aed 55%,#c4b5fd 100%);color:#fff}
.ph-7::after{background:#ede9fe}
.ph-8{background:linear-gradient(135deg,#082f49 0%,#0284c7 55%,#7dd3fc 100%);color:#fff}
.ph-8::after{background:#e0f2fe}
.ph-9{background:linear-gradient(135deg,#1a2e05 0%,#4d7c0f 55%,#a3e635 100%);color:#fff}
.ph-9::after{background:#d9f99d}
.ph-10{background:linear-gradient(135deg,#4c0519 0%,#be123c 55%,#fb7185 100%);color:#fff}
.ph-10::after{background:#ffe4e6}
.ph-11{background:linear-gradient(135deg,#1e1b4b 0%,#3730a3 55%,#a5b4fc 100%);color:#fff}
.ph-11::after{background:#e0e7ff}
.ph-12{background:linear-gradient(135deg,#7c2d12 0%,#c2410c 55%,#fb923c 100%);color:#fff}
.ph-12::after{background:#ffedd5}
.ph-13{background:linear-gradient(135deg,#2e1065 0%,#6d28d9 55%,#ddd6fe 100%);color:#fff}
.ph-13::after{background:#f5f3ff}
.ph-14{background:linear-gradient(135deg,#164e63 0%,#0e7490 55%,#67e8f9 100%);color:#fff}
.ph-14::after{background:#cffafe}
.para-badge.b1{background:rgba(220,38,38,.13);color:#dc2626}
.para-badge.b2{background:rgba(13,148,136,.13);color:#0d9488}
.para-badge.b3{background:rgba(190,24,93,.13);color:#be185d}
.para-badge.b4{background:rgba(180,83,9,.13);color:#b45309}
.para-badge.b5{background:rgba(29,78,216,.13);color:#1d4ed8}
.para-badge.b6{background:rgba(21,128,61,.13);color:#15803d}
.para-badge.b7{background:rgba(124,58,237,.13);color:#7c3aed}
.para-badge.b8{background:rgba(2,132,199,.13);color:#0284c7}
.para-badge.b9{background:rgba(77,124,15,.13);color:#4d7c0f}
.para-badge.b10{background:rgba(190,18,60,.13);color:#be123c}
.para-badge.b11{background:rgba(55,48,163,.13);color:#3730a3}
.para-badge.b12{background:rgba(194,65,12,.13);color:#c2410c}
.para-badge.b13{background:rgba(109,40,217,.13);color:#6d28d9}
.para-badge.b14{background:rgba(14,116,144,.13);color:#0e7490}
/* ── §1521 Para-heroes ── */
.ph-15{background:linear-gradient(135deg,#7c2d12 0%,#c2410c 55%,#f97316 100%);color:#fff}
.ph-15::after{background:#fed7aa}
.ph-16{background:linear-gradient(135deg,#881337 0%,#be123c 55%,#f43f5e 100%);color:#fff}
.ph-16::after{background:#fecdd3}
.ph-17{background:linear-gradient(135deg,#4a044e 0%,#7e22ce 55%,#d946ef 100%);color:#fff}
.ph-17::after{background:#f5d0fe}
.ph-18{background:linear-gradient(135deg,#082f49 0%,#155e75 55%,#22d3ee 100%);color:#fff}
.ph-18::after{background:#a5f3fc}
.ph-19{background:linear-gradient(135deg,#500724 0%,#9d174d 55%,#f472b6 100%);color:#fff}
.ph-19::after{background:#fbcfe8}
.ph-20{background:linear-gradient(135deg,#1c1917 0%,#44403c 55%,#a8a29e 100%);color:#fff}
.ph-20::after{background:#e7e5e4}
.ph-21{background:linear-gradient(135deg,#1e1b4b 0%,#3730a3 55%,#818cf8 100%);color:#fff}
.ph-21::after{background:#c7d2fe}
.ph-22{background:linear-gradient(135deg,#0c4a6e 0%,#0369a1 55%,#38bdf8 100%);color:#fff}
.ph-22::after{background:#bae6fd}
.ph-23{background:linear-gradient(135deg,#14532d 0%,#166534 55%,#4ade80 100%);color:#fff}
.ph-23::after{background:#bbf7d0}
.ph-24{background:linear-gradient(135deg,#3b0764 0%,#7e22ce 55%,#c084fc 100%);color:#fff}
.ph-24::after{background:#e9d5ff}
.ph-25{background:linear-gradient(135deg,#052e16 0%,#065f46 55%,#34d399 100%);color:#fff}
.ph-25::after{background:#a7f3d0}
.ph-26{background:linear-gradient(135deg,#2e1065 0%,#6d28d9 55%,#c084fc 100%);color:#fff}
.ph-26::after{background:#e9d5ff}
.ph-27{background:linear-gradient(135deg,#431407 0%,#b45309 55%,#fbbf24 100%);color:#fff}
.ph-27::after{background:#fde68a}
.ph-28{background:linear-gradient(135deg,#0f2027 0%,#203a43 55%,#2c5364 100%);color:#fff}
.ph-28::after{background:#a5f3fc}
.ph-29{background:linear-gradient(135deg,#001845 0%,#0041a8 55%,#0099ff 100%);color:#fff}
.ph-29::after{background:#bfdbfe}
.ph-30{background:linear-gradient(135deg,#064e3b 0%,#065f46 55%,#34d399 100%);color:#fff}
.ph-30::after{background:#a7f3d0}
.para-badge.b15{background:rgba(194,65,12,.13);color:#c2410c}
.para-badge.b16{background:rgba(190,18,60,.13);color:#be123c}
.para-badge.b17{background:rgba(126,34,206,.13);color:#7e22ce}
.para-badge.b18{background:rgba(21,94,117,.13);color:#155e75}
.para-badge.b19{background:rgba(157,23,77,.13);color:#9d174d}
.para-badge.b20{background:rgba(68,64,60,.13);color:#44403c}
.para-badge.b21{background:rgba(55,48,163,.13);color:#3730a3}
.para-badge.b22{background:rgba(3,105,161,.13);color:#0369a1}
.para-badge.b23{background:rgba(22,101,52,.13);color:#166534}
.para-badge.b24{background:rgba(126,34,206,.13);color:#7e22ce}
.para-badge.b25{background:rgba(6,95,70,.13);color:#065f46}
.para-badge.b26{background:rgba(109,40,217,.13);color:#6d28d9}
.para-badge.b27{background:rgba(180,83,9,.13);color:#b45309}
.para-badge.b28{background:rgba(32,58,67,.13);color:#203a43}
.para-badge.b29{background:rgba(0,65,168,.13);color:#0041a8}
.para-badge.b30{background:rgba(6,95,70,.13);color:#065f46}
/* ── Misc ── */
.dark .ans-inp{background:#0f172a;color:#e2e8f0}
.dark .fcard{background:#1e293b}.dark .example-box{background:#1e293b}
.katex{font-size:1em!important}
.info-badge{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;border-radius:20px;font-size:.72rem;font-weight:700;background:rgba(14,165,233,.12);color:#0284c7;margin-left:8px}
hr.divider{border:none;border-top:1px solid var(--border);margin:20px 0}
/* ── Навигация по задачам ── */
.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:'JetBrains Mono',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:#065f46}
.nav-dot.nd-fail{background:var(--fail-bg);border-color:var(--fail);color:#991b1b}
/* ── Life-examples grid ── */
.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}
/* ── Insight (physics aha) box ── */
.insight-box{background:linear-gradient(135deg,rgba(99,102,241,.07),rgba(139,92,246,.04));border:2px solid rgba(99,102,241,.22);border-radius:13px;padding:14px 17px;margin:16px 0}
.insight-title{font-weight:800;font-size:.82rem;color:#4f46e5;margin-bottom:7px;display:flex;align-items:center;gap:7px}
.dark .insight-box{background:rgba(99,102,241,.08);border-color:rgba(139,92,246,.3)}
.dark .insight-title{color:#a5b4fc}
.insight-box p{font-size:.83rem;color:var(--text);line-height:1.8;margin:0 0 6px}
.insight-box p:last-child{margin:0}
/* ── μ table ── */
.mu-tbl{width:100%;border-collapse:collapse;font-size:.8rem;margin:8px 0}
.mu-tbl th{background:rgba(68,64,60,.1);padding:5px 8px;text-align:center;font-weight:700;border:1px solid var(--border)}
.mu-tbl td{padding:4px 8px;text-align:center;border:1px solid var(--border)}
.mu-tbl tr:hover td{background:rgba(29,78,216,.04)}
/* ── Solve-steps ── */
.solve-box{background:var(--card);border:1.5px solid var(--border);border-radius:12px;padding:14px 18px;margin:14px 0}
.solve-box h4{font-size:.82rem;font-weight:800;color:var(--pri);margin-bottom:10px;display:flex;align-items:center;gap:6px}
/* ── Canvas physics panels ── */
.cv-wrap{position:relative;margin:10px 0}
.cv-wrap canvas{width:100%;border-radius:10px;display:block}
.cv-playbtn{margin-top:6px;padding:7px 18px;border:none;border-radius:8px;background:var(--pri);color:#fff;font-weight:700;font-size:.8rem;cursor:pointer;transition:.15s}
.cv-playbtn:hover{filter:brightness(1.1)}
/* ── Para-pills ── */
.para-pill{padding:6px 13px;border:2px solid var(--border);border-radius:10px;font-size:.74rem;font-weight:700;cursor:pointer;white-space:nowrap;transition:.18s;background:var(--card);color:var(--muted);flex-shrink:0}
.para-pill:hover{border-color:var(--pri);color:var(--pri)}
.para-pill.active{background:var(--pri);color:#fff;border-color:var(--pri)}
/* ── MCQ ── */
.mcq-opts{display:flex;flex-direction:column;gap:8px;margin-top:4px}
.mcq-opt{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}
.mcq-opt:hover:not(:disabled){border-color:var(--pri);background:rgba(29,78,216,.05);color:var(--text)}
.mcq-opt:disabled{cursor:default}
.mcq-opt.mcq-cor{border-color:var(--ok)!important;background:var(--ok-bg)!important;color:#065f46!important;font-weight:700}
.mcq-opt.mcq-wrong{border-color:var(--fail)!important;background:var(--fail-bg)!important;color:#991b1b!important}
/* ── Def / info box ── */
.def-box{background:rgba(29,78,216,.05);border-left:4px solid var(--pri);border-radius:10px;padding:12px 16px;margin-bottom:16px;font-size:.87rem;line-height:1.8}
/* ── Лаб. №11 ── */
.ph-lab{background:linear-gradient(135deg,#7f1d1d 0%,#b91c1c 55%,#ef4444 100%);color:#fff}
.ph-lab::after{background:#fca5a5}
.lab11-tbl{width:100%;border-collapse:collapse;font-size:.83rem;font-family:'JetBrains Mono',monospace}
.lab11-tbl th{background:rgba(29,78,216,.07);padding:7px 8px;text-align:center;font-weight:700;font-size:.74rem;border:1px solid var(--border)}
.lab11-tbl td{padding:6px 8px;text-align:center;border:1px solid var(--border);background:var(--card)}
.lab11-tbl tr:hover td{background:rgba(29,78,216,.04)}
.lab11-tbl tr.lab11-avg td{background:rgba(29,78,216,.09);font-weight:800;color:var(--pri)}
/* ── Тетрадные вычисления (Лаб. №11) ── */
.nb-wrap{
background-color:#fffef2;
background-image:
linear-gradient(90deg,transparent 33px,rgba(239,68,68,.22) 33px,rgba(239,68,68,.22) 35px,transparent 35px),
repeating-linear-gradient(transparent 0,transparent 26px,#bfdbfe 26px,#bfdbfe 27px);
border:1px solid #fde68a;border-radius:13px;
padding:14px 18px 14px 46px;
font-size:.82rem;line-height:27px;color:var(--text);
margin:16px 0;overflow:hidden
}
.dark .nb-wrap{
background-color:#14120a;
background-image:
linear-gradient(90deg,transparent 33px,rgba(185,28,28,.30) 33px,rgba(185,28,28,.30) 35px,transparent 35px),
repeating-linear-gradient(transparent 0,transparent 26px,rgba(30,58,95,.75) 26px,rgba(30,58,95,.75) 27px);
border-color:#422006
}
.nb-hdr{font-size:.87rem;font-weight:800;color:#b45309;letter-spacing:.03em;margin-bottom:1px}
.dark .nb-hdr{color:#fbbf24}
.nb-dado{display:grid;grid-template-columns:1fr 1fr;gap:0 16px;margin-bottom:4px}
@media(max-width:440px){.nb-dado{grid-template-columns:1fr}}
.nb-clbl{font-weight:800;color:var(--pri);text-decoration:underline;text-underline-offset:2px}
.nb-div{border:none;border-top:1.5px solid #fde68a;margin:4px 0}
.dark .nb-div{border-color:#422006}
.nb-sh{font-weight:800;color:var(--pri);margin:2px 0}
.nb-step{margin:2px 0}
.nb-step b{color:#1e293b;font-weight:700}
.dark .nb-step b{color:#e2e8f0}
.nb-i{display:block;padding-left:18px}
.nb-v{color:#1d4ed8;font-weight:800;font-family:'JetBrains Mono',monospace}
.dark .nb-v{color:#93c5fd}
.nb-box{display:inline-block;background:rgba(29,78,216,.11);border:1.5px solid rgba(29,78,216,.22);
border-radius:5px;padding:0 7px;font-weight:800;font-family:'JetBrains Mono',monospace;color:#1d4ed8}
.dark .nb-box{background:rgba(147,197,253,.11);border-color:rgba(147,197,253,.28);color:#93c5fd}
.nb-ok{color:#065f46;font-weight:800}.nb-bad{color:#991b1b;font-weight:800}
.nb-ans{border-top:2px solid #fde68a;margin-top:6px;padding-top:4px;font-weight:800;font-size:.85rem}
.dark .nb-ans{border-color:#422006}
/* === END MONOLITH CSS === */
</style>
</head>
<body>
<header class="hdr">
<div class="hdr-row">
<div>
<h1>Физика 9 · Глава 4</h1>
<div class="hdr-sub">Импульс · реактивное движение · работа · мощность · кинетическая и потенциальная энергия · закон сохранения энергии</div>
</div>
<div class="hdr-side">
<a href="/textbook/physics-9" class="hdr-btn"><svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg> К физике 9</a>
<button id="search-btn" class="hdr-btn"><svg class="ic" viewBox="0 0 24 24"><circle cx="11" cy="11" r="7"/><path d="m21 21-4-4"/></svg> Поиск</button>
<button id="sidebar-btn" class="hdr-btn"><svg class="ic" viewBox="0 0 24 24"><line x1="4" y1="6" x2="20" y2="6"/><line x1="4" y1="12" x2="20" y2="12"/><line x1="4" y1="18" x2="14" y2="18"/></svg> Шпаргалка</button>
<button id="theme-btn" class="hdr-btn"><svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg><span id="theme-lab">Тёмная</span></button>
</div>
</div>
</header>
<main class="main">
<div class="col-main">
<section class="hero">
<h2>Законы сохранения — фундамент физики</h2>
<p>Импульс и энергия сохраняются в замкнутых системах. Эти законы лежат в основе всего, от движения ракет до колебаний маятников.</p>
<div class="hero-row">
<button class="btn-primary" onclick="goTo('p31')"><svg class="ic" viewBox="0 0 24 24"><polygon points="6 4 20 12 6 20 6 4" fill="currentColor" stroke="none"/></svg> Начать § 31</button>
<div class="hero-progress">
<span class="hp-label">Прогресс по главе</span>
<div class="hp-bar"><div id="hero-hp-fill" class="hp-fill"></div></div>
<span id="hero-hp-text" class="hp-text">0%</span>
</div>
<div id="hero-xp-badge" class="hero-xp-badge"></div>
</div>
</section>
<section class="psel">
<div class="psel-title">Параграфы главы</div>
<div id="psel-grid" class="psel-grid"></div>
</section>
<section id="sec-p31" class="sec" data-watermark="p=mv"><div class="sec-header"><span class="sec-num">§ 31</span><h2 class="sec-h">Импульс тела. Импульс системы тел</h2></div><div id="p31-body"></div></section>
<section id="sec-p32" class="sec" data-watermark="&sum;p"><div class="sec-header"><span class="sec-num">§ 32</span><h2 class="sec-h">Закон сохранения импульса. Реактивное движение</h2></div><div id="p32-body"></div></section>
<section id="sec-p33" class="sec" data-watermark="A"><div class="sec-header"><span class="sec-num">§ 33</span><h2 class="sec-h">Механическая работа. Мощность</h2></div><div id="p33-body"></div></section>
<section id="sec-p34" class="sec" data-watermark="mgh"><div class="sec-header"><span class="sec-num">§ 34</span><h2 class="sec-h">Потенциальная энергия</h2></div><div id="p34-body"></div></section>
<section id="sec-p35" class="sec" data-watermark="mv&sup2;/2"><div class="sec-header"><span class="sec-num">§ 35</span><h2 class="sec-h">Кинетическая энергия. Полная энергия системы тел</h2></div><div id="p35-body"></div></section>
<section id="sec-p36" class="sec" data-watermark="E=const"><div class="sec-header"><span class="sec-num">§ 36</span><h2 class="sec-h">Закон сохранения энергии</h2></div><div id="p36-body"></div></section>
<section id="sec-final4" class="sec" data-watermark="&#9733;"><div class="sec-header"><span class="sec-num" style="background:linear-gradient(135deg,#db2777,#f472b6)"></span><h2 class="sec-h">Финал главы</h2></div><div id="final4-body"></div></section>
</div>
<aside class="col-side" id="col-side"><div id="sidebar-content"></div></aside>
<div class="col-side-backdrop" id="col-side-backdrop"></div>
</main>
<footer class="foot">Интерактивный учебник «Физика 9» · Глава 4 · «Законы сохранения» · LearnSpace</footer>
<div id="ach-popup" class="ach-popup"><svg class="ic" viewBox="0 0 24 24" style="width:22px;height:22px"><polygon points="12,2 22,20 2,20"/></svg><span id="ach-text">Достижение!</span></div>
<div id="search-modal" class="search-modal" role="dialog">
<div class="search-box">
<input type="text" id="search-input" class="search-input" placeholder="Поиск…" autocomplete="off">
<div id="search-results" class="search-results"></div>
<div class="search-foot"><span><kbd>↑↓</kbd> навигация</span><span><kbd>Enter</kbd> открыть</span><span><kbd>Esc</kbd> закрыть</span></div>
</div>
</div>
<script>
'use strict';
const STATE = { current:'p31', progress:{}, achievements:new Map(), xp:0, level:1 };
const TOTAL_PARAS = 7;
const _TB_SLUG = 'physics-9-ch4';
const PARAS = [
{ id:"p31", num:"§ 31", name:"Импульс тела. Импульс системы тел", sub:"$\\vec p = m\\vec v$" },
{ id:"p32", num:"§ 32", name:"Закон сохранения импульса. Реактивное движение", sub:"$\\sum\\vec p = \\text{const}$" },
{ id:"p33", num:"§ 33", name:"Механическая работа. Мощность", sub:"$A = F\\Delta r\\cos\\alpha$" },
{ id:"p34", num:"§ 34", name:"Потенциальная энергия", sub:"$E_п = mgh$" },
{ id:"p35", num:"§ 35", name:"Кинетическая энергия. Полная энергия системы тел", sub:"$E_к = mv^2/2$" },
{ id:"p36", num:"§ 36", name:"Закон сохранения энергии", sub:"$E_к + E_п = \\text{const}$" },
{ id:"final4", num:'\u2605', name:'Финал главы', sub:"Итоги · боссы главы 4", final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
function calcLevel(xp){ return Math.floor(Math.sqrt((xp||0)/100))+1; }
function _xpForLevel(lv){ return (lv-1)*(lv-1)*100; }
const ACH_LABELS = {
start:"Начало главы 4!",
p31_done:"Импульс тела. Импульс системы тел освоен!",
p32_done:"Закон сохранения импульса. Реактивное движение освоен!",
p33_done:"Механическая работа. Мощность освоен!",
p34_done:"Потенциальная энергия освоен!",
p35_done:"Кинетическая энергия. Полная энергия системы тел освоен!",
p36_done:"Закон сохранения энергии освоен!",
ch4_done:"Глава 4 пройдена!"
};
function loadProgress(){
try{
const s=localStorage.getItem('physics9_ch4_progress'); if(s) Object.assign(STATE.progress, JSON.parse(s));
const a=localStorage.getItem('physics9_ch4_achievements');
if(a){ const p=JSON.parse(a); if(Array.isArray(p)) p.forEach(id=>STATE.achievements.set(id, ACH_LABELS[id]||id)); else if(p&&typeof p==='object'){ for(const[id,t] of Object.entries(p)) STATE.achievements.set(id,(t&&t!==id)?t:(ACH_LABELS[id]||id)); } }
STATE.xp=+(localStorage.getItem('physics9_xp')||0); STATE.level=calcLevel(STATE.xp);
}catch(e){}
}
function saveProgress(){
try{
localStorage.setItem('physics9_ch4_progress', JSON.stringify(STATE.progress));
localStorage.setItem('physics9_ch4_achievements', JSON.stringify(Object.fromEntries(STATE.achievements)));
localStorage.setItem('physics9_xp', String(STATE.xp));
}catch(e){}
}
function bumpProgress(key, delta){
STATE.progress[key]=Math.max(0,Math.min(100,(STATE.progress[key]||0)+delta));
saveProgress(); refreshProgressUI();
if(STATE.progress[key]>=50) markParaRead(key);
}
const _markedRead=new Set();
let _pendingProgressBody=null, _progressTimer=null;
function _flushProgress(){
const body=_pendingProgressBody; _pendingProgressBody=null; if(!body) return;
const tok=(window.LS&&LS.getToken)?LS.getToken():''; if(!tok) return;
fetch('/api/textbooks/'+_TB_SLUG+'/progress',{method:'POST',headers:{'Content-Type':'application/json','Authorization':'Bearer '+tok},body:JSON.stringify(body),keepalive:true}).catch(()=>{});
}
function _queueProgress(patch){ _pendingProgressBody=Object.assign(_pendingProgressBody||{},patch); if(_progressTimer) clearTimeout(_progressTimer); _progressTimer=setTimeout(_flushProgress, 600); }
function markLastPara(id){ _queueProgress({last_para:id}); }
function markParaRead(id){ if(_markedRead.has(id)) return; _markedRead.add(id); _queueProgress({mark_read:id}); }
window.addEventListener('beforeunload', _flushProgress);
function loadServerReadState(){
const tok=(window.LS&&LS.getToken)?LS.getToken():''; if(!tok) return;
fetch('/api/textbooks/'+_TB_SLUG,{headers:{'Authorization':'Bearer '+tok}}).then(r=>r.ok?r.json():null).then(d=>{
if(!d||!d.progress) return;
(d.progress.read||[]).forEach(k=>{_markedRead.add(k); if((STATE.progress[k]||0)<50) STATE.progress[k]=100;});
saveProgress(); refreshProgressUI();
}).catch(()=>{});
}
function addXp(n,src){
if(!n) return;
const prev=STATE.level; STATE.xp=Math.max(0,(STATE.xp||0)+n); STATE.level=calcLevel(STATE.xp);
saveProgress(); refreshProgressUI();
if(window.LS&&window.LS.xp) window.LS.xp.add(n,'physics9-ch4-'+(src||'misc'));
if(STATE.level>prev){
const pop=document.getElementById('ach-popup');
if(pop){ document.getElementById('ach-text').textContent='Уровень '+STATE.level+'!'; pop.classList.add('show'); setTimeout(()=>pop.classList.remove('show'),2600); }
}
}
function refreshProgressUI(){
const total=Math.round(Object.values(STATE.progress).reduce((a,b)=>a+b,0)/TOTAL_PARAS);
const f=document.getElementById('hero-hp-fill'); if(f) f.style.width=total+'%';
const t=document.getElementById('hero-hp-text'); if(t) t.textContent=total+'% пройдено';
document.querySelectorAll('[data-prog-card]').forEach(el=>{ const k=el.dataset.progCard; const fl=el.querySelector('.psel-prog-fill'); if(fl) fl.style.width=(STATE.progress[k]||0)+'%'; });
const xpBadge=document.getElementById('hero-xp-badge');
if(xpBadge){ xpBadge.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="width:13px;height:13px"><polygon points="12 2 22 20 2 20"/></svg> Ур. '+STATE.level+' \xb7 '+(STATE.xp||0)+' XP'; }
if(STATE.current && document.getElementById('sidebar-content')){ try{ buildSidebar(STATE.current); }catch(e){} }
refreshDoneMarks();
}
function refreshDoneMarks(){
try{
document.querySelectorAll('.psel-card').forEach(c=>{
const id = c.dataset.id || c.dataset.progCard;
if(!id) return;
const pct = +STATE.progress[id] || 0;
if(!c.querySelector('.psel-done')){
const s = document.createElement('span');
s.className = 'psel-done';
s.setAttribute('title','Прочитано');
s.innerHTML = '<svg viewBox="0 0 24 24"><polyline points="20 6 9 17 4 12"/></svg>';
c.appendChild(s);
}
c.classList.toggle('done', pct >= 50);
});
}catch(e){}
}
function achievement(id,text){
if(STATE.achievements.has(id)) return;
STATE.achievements.set(id, text||ACH_LABELS[id]||id); saveProgress();
const pop=document.getElementById('ach-popup');
if(pop){ document.getElementById('ach-text').textContent=text||ACH_LABELS[id]||id; pop.classList.add('show'); setTimeout(()=>pop.classList.remove('show'),3300); }
addXp(20,'ach-'+id);
}
function buildParaSelector(){
const g=document.getElementById('psel-grid'); g.innerHTML='';
PARAS.forEach(p=>{
const card=document.createElement('div');
card.className='psel-card'+(p.final?' final':'');
card.dataset.id=p.id; card.dataset.progCard=p.id;
card.innerHTML='<div class="psel-num">'+p.num+'</div><div class="psel-name">'+p.name+'</div><div class="psel-prog"><div class="psel-prog-fill"></div></div>';
card.addEventListener('click', ()=>goTo(p.id));
g.appendChild(card);
});
}
const BUILT=new Set();
const BUILDERS = { p31:()=>build_p31(), p32:()=>build_p32(), p33:()=>build_p33(), p34:()=>build_p34(), p35:()=>build_p35(), p36:()=>build_p36(), final4:()=>build_final4() };
function ensureBuilt(id){ if(BUILT.has(id)) return; const fn=BUILDERS[id]; if(fn){ fn(); BUILT.add(id); } }
function _makeTaskBlock(sec){
return ''
+ '<div class="legacy-tasks" id="ptab-' + sec + '" style="margin-top:20px;padding:16px 18px;background:var(--card,#fff);border:1.5px solid var(--border,#e2e8f0);border-radius:14px">'
+ '<div class="score-bar" style="display:flex;gap:10px;align-items:center;margin-bottom:10px;flex-wrap:wrap">'
+ '<div style="font-weight:700;color:var(--text)">Задачи параграфа</div>'
+ '<div class="chip chip-ok" style="margin-left:auto;padding:3px 10px;border-radius:99px;background:#dcfce7;color:#065f46;font-weight:700;font-size:.82rem"><span id="ok' + sec + '">0</span>&nbsp;верно</div>'
+ '<div class="chip chip-tot" style="padding:3px 10px;border-radius:99px;background:rgba(15,23,42,.06);color:var(--muted);font-weight:700;font-size:.82rem"><span id="cur' + sec + '">0</span>/<span id="max' + sec + '">?</span></div>'
+ '<button class="btn" onclick="if(window.resetTasks)window.resetTasks(\'' + sec + '\')" style="padding:5px 11px;font-size:.78rem;border-radius:8px;background:transparent;border:1px solid var(--border);color:var(--text)">Заново</button>'
+ '</div>'
+ '<div class="prog-wrap" style="height:5px;background:rgba(0,0,0,.07);border-radius:3px;overflow:hidden;margin-bottom:10px"><div id="prog' + sec + '" style="height:100%;width:0%;background:linear-gradient(90deg,var(--sec-acc,#2563eb),var(--sec-acc-d,#1d4ed8));transition:width .4s"></div></div>'
+ '<div class="nav-dots" id="navDots' + sec + '" style="display:flex;gap:5px;flex-wrap:wrap;margin-bottom:10px"></div>'
+ '<div id="taskArea' + sec + '"></div>'
+ '<div class="feedback" id="fb' + sec + '" style="margin-top:8px"></div>'
+ '<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end"><button class="btn primary" id="nextBtn' + sec + '" onclick="if(window.nextTask)window.nextTask(\'' + sec + '\')" style="display:none;padding:8px 16px;border-radius:9px;background:var(--sec-acc,#2563eb);color:#fff;border:0;font-weight:700">Следующая &rarr;</button></div>'
+ '<div class="summary" id="sum' + sec + '" style="display:none;text-align:center;padding:16px;margin-top:10px;background:linear-gradient(135deg,var(--sec-acc-soft,#dbeafe),var(--card));border-radius:11px"><div style="font-weight:700;margin-bottom:6px">Параграф пройден!</div><div class="big-score" id="sumScore' + sec + '" style="font-size:1.6rem;font-weight:900;color:var(--sec-acc-d,#1d4ed8)"></div><div class="sum-grade" id="sumGrade' + sec + '" style="margin:6px 0;color:var(--muted)"></div></div>'
+ '</div>';
}
function _injectTasks(id){
if(!id || !id.startsWith('p')) return;
if(!window.POOLS || !window.POOLS[id]) return;
var body = document.getElementById(id + '-body');
if(!body || body.querySelector('.legacy-tasks')) return;
body.insertAdjacentHTML('beforeend', _makeTaskBlock(id));
setTimeout(function(){ try { if(window.renderTask) window.renderTask(id); if(window.renderNav) window.renderNav(id); } catch(e){} try { if(window.PHYS9_CH4_WIDGETS && window.PHYS9_CH4_WIDGETS[id]) window.PHYS9_CH4_WIDGETS[id](); } catch(e){ console.warn('phys9 widget init:', e.message); } }, 60);
}
var _origEnsureBuilt = ensureBuilt;
ensureBuilt = function(id){ _origEnsureBuilt(id); _injectTasks(id); };
function goTo(id){
STATE.current=id; ensureBuilt(id);
document.querySelectorAll('.sec').forEach(s=>s.classList.remove('active'));
const el=document.getElementById('sec-'+id); if(el) el.classList.add('active');
document.querySelectorAll('.psel-card').forEach(c=>c.classList.toggle('active', c.dataset.id===id));
buildSidebar(id);
window.scrollTo({top:0,behavior:'smooth'});
if((STATE.progress[id]||0)<10) bumpProgress(id, 10);
if(window.renderMathInElement) setTimeout(()=>renderMath(el), 0);
// Auto-init legacy simulations: call upd<N>() / startAnim<N>() / draw<N>() if defined in phys9_legacy.js.
if(id.startsWith('p')){
const n = id.slice(1);
setTimeout(()=>{
['upd','startAnim','init','draw'].forEach(prefix=>{
const fn = window[prefix + n];
if(typeof fn === 'function'){ try{ fn(); }catch(e){ console.warn(prefix + n + ' init:', e.message); } }
});
}, 50);
} else if(id.startsWith('lr')){
const n = id.slice(2);
setTimeout(()=>{
['updLab','drawLab'].forEach(prefix=>{
const fn = window[prefix + n];
if(typeof fn === 'function'){ try{ fn(); }catch(e){} }
});
}, 50);
}
markLastPara(id);
}
const SIDEBARS = {
p31:{title:"Шпаргалка §31",rows:[["$\\vec p = m\\vec v$","импульс тела"],["Ед.","кг·м/с"],["Сумма","$\\vec p_{сист} = \\sum \\vec p_i$"]]},
p32:{title:"Шпаргалка §32",rows:[["ЗСИ","$\\sum\\vec p_{до} = \\sum\\vec p_{после}$"],["Замкн. сист.","без внеш. сил"],["Ракета","$m_р\\vec v_р + m_г\\vec v_г = 0$"]]},
p33:{title:"Шпаргалка §33",rows:[["$A = F\\Delta r\\cos\\alpha$",""],["Ед.","Дж"],["Мощность","$P = A/\\Delta t$, Вт"]]},
p34:{title:"Шпаргалка §34",rows:[["$E_п = mgh$","тяжести"],["$E_п = kx^2/2$","упругости"],["$A = -\\Delta E_п$",""]]},
p35:{title:"Шпаргалка §35",rows:[["$E_к = mv^2/2$",""],["Теорема","$A = \\Delta E_к$"],["$E = E_к + E_п$","полная"]]},
p36:{title:"Шпаргалка §36",rows:[["ЗСЭ","$E = \\text{const}$ в замкн. консервативной сист."],["Превращ.","один вид → другой"],["Трение","диссипация $\\to$ тепло"]]},
final4:{title:"Финал главы 4",rows:[["§§3136","теория главы 4"],["Награда","+50 XP"]]}
};
const TIPS=[
{sec:"p31",html:"Импульс тела: $\\vec p = m\\vec v$ (кг·м/с). Импульс системы — сумма импульсов всех тел."},
{sec:"p32",html:"ЗСИ: в замкнутой системе $\\sum\\vec p = \\text{const}$. Реактивное движение: $m_р\\vec v_р + m_г\\vec v_г = 0$."},
{sec:"p33",html:"Работа силы: $A = F \\Delta r \\cos\\alpha$ (Дж). Мощность: $P = A/\\Delta t = Fv\\cos\\alpha$ (Вт)."},
{sec:"p34",html:"Потенц. энергия тяжести: $E_п = mgh$. Упругости: $E_п = kx^2/2$. Работа консерват. силы: $A = -\\Delta E_п$."},
{sec:"p35",html:"Кинет. энергия: $E_к = mv^2/2$. Теорема: $A = \\Delta E_к$. Полная мех. энергия: $E = E_к + E_п$."},
{sec:"p36",html:"ЗСЭ: в замкнутой консервативной системе $E_к + E_п = \\text{const}$. При трении мех. энергия превращается в тепло."},
{sec:"final4",html:"Финал главы 4 — интегрированные задачи по §§31–36. В разработке (Phase 4+)."}
];
function buildSidebar(id){
const box=document.getElementById('sidebar-content');
const sb=SIDEBARS[id]||SIDEBARS[PARAS[0].id];
let html='';
const xpForLv=_xpForLevel(STATE.level), xpNext=_xpForLevel(STATE.level+1);
const xpInLv=STATE.xp-xpForLv, xpRange=xpNext-xpForLv;
const xpPct=xpRange>0?Math.round(xpInLv/xpRange*100):100;
html+='<div class="xp-card"><div class="xp-card-title"><span>XP-прогресс</span><span class="xp-level">Ур. '+STATE.level+'</span></div><div class="xp-bar"><div class="xp-fill" style="width:'+xpPct+'%"></div></div><div class="xp-nums"><span>'+STATE.xp+' XP</span><span>'+xpNext+' XP</span></div></div>';
html+='<div class="sidecard"><h4>'+sb.title+'</h4>';
sb.rows.forEach(([k,v])=>{ html+='<div class="sidecard-row"><b>'+k+'</b>'+(v?' \u2014 '+v:'')+'</div>'; });
html+='</div>';
const tip=TIPS.find(t=>t.sec===id)||TIPS[0];
if(tip){
html+='<div class="sidecard" style="background:linear-gradient(135deg,var(--warn-bg,#fef3c7),var(--pri-soft));border-color:var(--warn,#f59e0b)"><h4 style="color:#92400e;display:flex;align-items:center;gap:6px"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="width:14px;height:14px"><polygon points="12,2 22,20 2,20"/></svg>Подсказка</h4><div class="sidecard-row" style="margin-bottom:0;font-size:.84rem;line-height:1.55">'+tip.html+'</div></div>';
}
if(STATE.achievements.size>0){
html+='<div class="sidecard"><h4>Достижения <span style="color:var(--warn);float:right">'+STATE.achievements.size+'</span></h4>';
[...STATE.achievements.values()].slice(-4).forEach(text=>{ html+='<div class="sidecard-row" style="font-size:.78rem;color:var(--ok)">&#10003; '+text+'</div>'; });
html+='</div>';
}
box.innerHTML=html;
if(window.renderMathInElement) try{ renderMath(box); }catch(e){}
}
function initTheme(){
const t=localStorage.getItem('physics9_ch4_theme')||'light';
if(t==='dark') document.documentElement.classList.add('dark');
document.getElementById('theme-lab').textContent=t==='dark'?'Светлая':'Тёмная';
document.getElementById('theme-btn').addEventListener('click', ()=>{
document.documentElement.classList.toggle('dark');
const dark=document.documentElement.classList.contains('dark');
localStorage.setItem('physics9_ch4_theme', dark?'dark':'light');
document.getElementById('theme-lab').textContent=dark?'Светлая':'Тёмная';
});
}
function renderMath(root){ if(window.renderMathInElement){ try{ renderMathInElement(root, {delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false},{left:'\\[',right:'\\]',display:true},{left:'\\(',right:'\\)',display:false}],throwOnError:false}); }catch(e){} } }
const ICONS = {
theory:'<svg class="ic" viewBox="0 0 24 24"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg>',
example:'<svg class="ic" viewBox="0 0 24 24"><path d="M9 18h6"/><path d="M10 22h4"/><path d="M12 2a7 7 0 0 0-4 13c1 1 2 2 2 4h4c0-2 1-3 2-4a7 7 0 0 0-4-13z"/></svg>',
lab:'<svg class="ic" viewBox="0 0 24 24"><path d="M10 2v7.5L4.5 19a2 2 0 0 0 1.7 3h11.6a2 2 0 0 0 1.7-3L14 9.5V2"/><line x1="9" y1="2" x2="15" y2="2"/></svg>',
rule:'<svg class="ic" viewBox="0 0 24 24"><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"/><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"/></svg>',
};
function makeCard(kind, title, num, body){
const labels = {theory:'Теория',example:'Пример',lab:'Лабораторная работа',rule:'Правило'};
return '<div class="card"><div class="card-header"><div class="card-icon '+kind+'">'+ICONS[kind]+'</div><div class="card-title">'+(labels[kind]||'')+(title&&title!==labels[kind]?' \xb7 '+title:'')+'</div>'+(num?'<div class="card-num">'+num+'</div>':'')+'</div><div class="card-body">'+body+'</div></div>';
}
function secNav(prev, next){
const NAMES = {p31:'\xA731',p32:'\xA732',p33:'\xA733',p34:'\xA734',p35:'\xA735',p36:'\xA736',final4:'Финал'};
let h='<div class="sec-nav">';
h+=prev?'<button class="btn" onclick="goTo(\''+prev+'\')"><svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg> '+NAMES[prev]+'</button>':'<span></span>';
h+=next?'<button class="btn primary" onclick="goTo(\''+next+'\')">'+NAMES[next]+' <svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></button>':'<span></span>';
h+='</div>'; return h;
}
function readButton(paraId){
const p = PARAS.find(x => x.id === paraId);
const labelTail = p && p.final ? 'финал' : (p ? p.num : '?');
return '<div style="margin-top:18px;display:flex;justify-content:center">'
+'<button class="btn primary" id="'+paraId+'-read-btn">'
+'<svg class="ic" viewBox="0 0 24 24"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg>'
+' Я прочитал — '+labelTail+' (+10 XP)'
+'</button></div>';
}
function wireReadBtn(paraId){
const btn = document.getElementById(paraId+'-read-btn'); if(!btn) return;
btn.addEventListener('click', ()=>{
addXp(10, paraId+'-read'); bumpProgress(paraId, 30);
btn.textContent='Прочитано! +10 XP'; btn.disabled=true; btn.style.opacity=.6;
const aId = paraId+'_done';
if(ACH_LABELS[aId]) achievement(aId);
});
}
/* ===== STUB BUILDERS — наполнение в Phase 5 ===== */
function build_p31(){
const box = document.getElementById('p31-body');
let html = '';
html += makeCard('theory', "Импульс тела. Импульс системы тел", "§31", `
<!-- Hero -->
<div class="para-hero ph-31">
<div class="ph-label">§31 · Физика 9 кл</div>
<h2>Импульс тела. Импульс системы тел</h2>
<div class="ph-formula">$\\vec{p} = m\\vec{v}$</div>
<div class="ph-desc">Импульс — это «количество движения»: учитывает и массу, и скорость сразу.<br>Изменить импульс может только внешняя сила, и только она.</div>
<div class="ph-tags">
<span class="ph-tag"> связь с 2-м законом Ньютона</span>
<span class="ph-tag"> [p] = кг·м/с</span>
<span class="ph-tag">↗ векторная величина</span>
</div>
</div>
<div class="section-title"> §31. Импульс тела. Импульс системы тел</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Импульс тела</h3>
<div class="main-f">$\\vec{p} = m\\vec{v}$</div>
<p><b>Векторная</b> величина. Направление совпадает с $\\vec{v}$.</p>
<p>Единица: $[p] = \\text{кг}{\\cdot}\\text{м/с}$</p>
</div>
<div class="fcard">
<h3>Изменение импульса</h3>
<div class="main-f">$\\Delta\\vec{p} = \\vec{F}\\,\\Delta t$</div>
<p>Изменение импульса тела равно <b>импульсу силы</b> $\\vec{F}\\,\\Delta t$.</p>
<p>Также: $\\dfrac{\\Delta\\vec{p}}{\\Delta t} = \\vec{F}$ — 2-й закон Ньютона.</p>
</div>
<div class="fcard">
<h3>Импульс системы тел</h3>
<div class="main-f">$\\vec{p}_{\\text{сист}} = \\vec{p}_1 + \\vec{p}_2 + \\ldots$</div>
<p><b>Внутренние силы</b> — взаимодействие тел внутри системы.<br>
<b>Внешние силы</b> — действующие на систему снаружи.</p>
</div>
<div class="fcard">
<h3>Закон изменения импульса системы</h3>
<div class="main-f">$\\Delta\\vec{p}_{\\text{сист}} = \\vec{F}_{\\text{внешн}}\\,\\Delta t$</div>
<p>Изменение импульса системы равно импульсу <b>результирующей внешних сил</b>.</p>
<p>Внутренние силы импульс системы <b>не изменяют</b>.</p>
</div>
</div>
<!-- ── СХЕМЫ §31 ── -->
<div class="idiag-2col">
<div class="idiag">
<h3> Импульс — вектор вдоль скорости</h3>
<svg width="100%" viewBox="0 0 200 100" style="display:block;margin:0 auto">
<rect x="12" y="32" width="46" height="32" rx="8" fill="#bfdbfe" stroke="#1d4ed8" stroke-width="2"/>
<text x="35" y="52" font-size="10" text-anchor="middle" fill="#1d4ed8" font-weight="700">m</text>
<line x1="58" y1="40" x2="100" y2="40" stroke="#0ea5e9" stroke-width="2.5"/>
<polygon points="100,40 89,35 89,45" fill="#0ea5e9"/>
<text x="79" y="33" font-size="9" fill="#0ea5e9" font-family="Inter" font-weight="700">v</text>
<line x1="58" y1="58" x2="138" y2="58" stroke="#1d4ed8" stroke-width="3.5"/>
<polygon points="138,58 125,53 125,63" fill="#1d4ed8"/>
<text x="97" y="73" font-size="9" fill="#1d4ed8" font-family="Inter" font-weight="700">p = mv</text>
<text x="148" y="37" font-size="8" fill="#0ea5e9" font-family="Inter">v</text>
<text x="148" y="60" font-size="8" fill="#1d4ed8" font-family="Inter">p</text>
<text x="148" y="48" font-size="10" fill="#64748b" font-family="Inter">∥</text>
<text x="10" y="95" font-size="7.5" fill="#64748b" font-family="Inter">p ∥ v · при большей m — p длиннее</text>
</svg>
</div>
<div class="idiag">
<h3> Удар о стену: почему |Δp| = m(v₁+v₂)</h3>
<svg width="100%" viewBox="0 0 200 115" style="display:block;margin:0 auto">
<rect x="104" y="5" width="12" height="105" rx="3" fill="#94a3b8"/>
<text x="110" y="4" font-size="7" text-anchor="middle" fill="#64748b" font-family="Inter">стена</text>
<circle cx="58" cy="55" r="18" fill="#dbeafe" stroke="#1d4ed8" stroke-width="2"/>
<text x="58" y="59" font-size="10" text-anchor="middle" fill="#1d4ed8" font-weight="700">m</text>
<line x1="76" y1="42" x2="100" y2="42" stroke="#1d4ed8" stroke-width="2.5"/>
<polygon points="100,42 90,37 90,47" fill="#1d4ed8"/>
<text x="86" y="36" font-size="9" fill="#1d4ed8" font-family="Inter" font-weight="700">p₁</text>
<line x1="100" y1="68" x2="76" y2="68" stroke="#10b981" stroke-width="2.5"/>
<polygon points="76,68 86,63 86,73" fill="#10b981"/>
<text x="86" y="82" font-size="9" fill="#10b981" font-family="Inter" font-weight="700">p₂</text>
<text x="5" y="40" font-size="7.5" fill="#1d4ed8" font-family="Inter">+mv₁ →</text>
<text x="5" y="72" font-size="7.5" fill="#10b981" font-family="Inter">← -mv₂</text>
<rect x="4" y="86" width="88" height="22" rx="5" fill="rgba(239,68,68,.08)" stroke="#ef4444" stroke-width="1"/>
<text x="48" y="97" font-size="7.5" text-anchor="middle" fill="#991b1b" font-family="Inter" font-weight="700">|Δp| = m(v₁+v₂)</text>
<text x="48" y="107" font-size="7" text-anchor="middle" fill="#64748b" font-family="Inter">знаки противоположны!</text>
</svg>
</div>
</div>
<div class="idiag">
<h3> Интерактив: p = mv — меняй параметры</h3>
<div class="slider-row">
<span class="slider-lbl">Масса $m$:</span>
<input type="range" min="1" max="20" value="5" id="sl31m" oninput="upd31()">
<span class="slider-val" id="v31m">5 кг</span>
</div>
<div class="slider-row">
<span class="slider-lbl">Скорость $v$:</span>
<input type="range" min="1" max="30" value="10" id="sl31v" oninput="upd31()">
<span class="slider-val" id="v31v">10 м/с</span>
</div>
<div class="idiag-result" id="res31">p = 5 × 10 = <b style="font-size:1.1em;color:var(--pri)">50</b> кг·м/с</div>
<svg width="100%" viewBox="0 0 380 38" style="display:block;margin-top:8px">
<rect x="2" y="9" width="376" height="20" rx="6" fill="rgba(29,78,216,.07)" stroke="var(--border)" stroke-width="1"/>
<rect x="2" y="9" id="bar31" width="32" height="20" rx="6" fill="var(--pri)"/>
<text x="8" y="23" font-size="10" fill="white" font-weight="700" id="barlbl31">50 кг·м/с</text>
<text x="4" y="36" font-size="8" fill="var(--muted)" font-family="Inter">0</text>
<text x="376" y="36" font-size="8" fill="var(--muted)" font-family="Inter" text-anchor="end">600 кг·м/с</text>
</svg>
<p style="font-size:.75rem;color:var(--muted);margin-top:6px"> Попробуй: грузовик m=20 кг, v=30 м/с vs велосипедист m=2 кг, v=5 м/с — у кого импульс больше?</p>
</div>
<div class="remember-box">
<div class="remember-box-title"> Запомни!</div>
<ul>
<li><b>Импульс — вектор.</b> Нельзя просто складывать числа, если тела движутся в разные стороны — нужно учитывать знак проекции на ось.</li>
<li>$\\Delta\\vec{p} = \\vec{F}\\,\\Delta t$ — это и есть 2-й закон Ньютона в другой форме записи.</li>
<li>Внутренние силы <b>не меняют</b> импульс системы — только внешние.</li>
</ul>
</div>
<div class="mistakes-box">
<div class="mistakes-box-title"> Частые ошибки</div>
<ul>
<li>Путают импульс тела $p = mv$ с кинетической энергией $E_k = mv^2/2$ — это разные вещи.</li>
<li>При ударе мяча о стену берут $|\\Delta p| = mv_2 - mv_1$ — забывают, что скорости противоположны, надо $m(v_2 + v_1)$.</li>
<li>Считают, что большая сила = большое изменение импульса. На самом деле важно произведение $F \\cdot \\Delta t$.</li>
</ul>
</div>
<div class="student-box">
<div class="student-box-title"> Как я это понял</div>
<p><b>Зачем импульс, если есть скорость?</b><br>
Грузовик едет 5 км/ч, велосипедист — тоже 5 км/ч. Но остановить грузовик в сто раз сложнее. Дело не только в скорости — важна ещё и масса. Импульс $p = mv$ учитывает сразу и то, и другое.</p>
<p><b>Почему машины «мнутся» и почему это хорошо?</b><br>
Когда машина бьётся, скорость меняется за какое-то время: $\\Delta p = F \\cdot \\Delta t$. Суммарное изменение импульса фиксировано. Но если кузов мнётся — время удара $\\Delta t$ увеличивается → сила $F$ уменьшается. Именно поэтому делают «зоны деформации» и подушки безопасности: не жалеют машину, зато спасают водителя.</p>
<p><b>Почему каратист бьёт резко, а не медленно?</b><br>
При резком ударе время контакта $\\Delta t$ мизерное. Из $\\Delta p = F \\cdot \\Delta t$ следует $F = \\Delta p / \\Delta t$. Чем меньше $\\Delta t$ — тем больше $F$. Одно и то же изменение импульса за 0,001 с даёт силу, которая за 1 с выглядела бы смешно.</p>
</div>
<hr class="divider">
<div class="section-title"> Пример решения задачи</div>
<div class="example-box">
<h3>Мяч падает на пол и отскакивает</h3>
<div class="cond">
Мяч массой $m = 0{,}10\\,\\text{кг}$ падает с высоты $h = 0{,}20\\,\\text{м}$ на горизонтальный пол и отскакивает (упруго). Время удара $\\Delta t = 5{,}0 \\cdot 10^{-3}\\,\\text{с}$, $g = 10\\,\\text{м/с}^2$. Найдите среднюю силу удара.
</div>
<table class="given-table">
<tr><td>Дано</td><td>$m = 0{,}10\\,\\text{кг};\\quad h = 0{,}20\\,\\text{м}$</td></tr>
<tr><td></td><td>$\\Delta t = 5{,}0\\cdot10^{-3}\\,\\text{с};\\quad g = 10\\,\\text{м/с}^2$</td></tr>
<tr><td>Найти</td><td>$F_{\\text{пол}} — ?$</td></tr>
</table>
<div class="sol">
<ol class="sol-steps">
<li><span class="step-n">1</span><span>Ось $Oy$ — вверх. Находим скорость мяча перед ударом:<br>\\[v_1 = \\sqrt{2gh} = \\sqrt{2\\cdot10\\cdot0{,}20} = 2\\,\\text{м/с}\\quad\\text{(направлена вниз, проекция } {-}2\\text{ м/с)}\\]</span></li>
<li><span class="step-n">2</span><span>При упругом отскоке скорость сохраняется по модулю: $v_2 = 2\\,\\text{м/с}$ (вверх, проекция $+2$ м/с).<br>Изменение импульса (по модулю):\\[|\\Delta p| = m\\cdot|v_2 - (-v_1)| = m(v_2+v_1) = 0{,}10\\cdot4 = 0{,}40\\,\\text{кг}{\\cdot}\\text{м/с}\\]</span></li>
<li><span class="step-n">3</span><span>По 2-му закону Ньютона: $\\vec{F}_{\\text{рез}}\\,\\Delta t = \\Delta\\vec{p}$, откуда средняя сила пола на мяч:\\[F_{\\text{пол}} = \\frac{|\\Delta p|}{\\Delta t} + mg = \\frac{0{,}40}{5{,}0\\cdot10^{-3}} + 1 \\approx 81\\,\\text{Н}\\]</span></li>
<li><span class="step-n">4</span><span>По 3-му закону Ньютона сила мяча на пол равна $81\\,\\text{Н}$ — это в <b>81 раз</b> больше веса мяча!</span></li>
</ol>
</div>
</div>
<hr class="divider">
<div class="section-title"> Контрольные вопросы</div>
<ol class="q-list">
<li>Что такое импульс тела? Как он направлен? В каких единицах измеряется?</li>
<li>Как можно изменить импульс тела? Почему это изменение направлено именно так?</li>
<li>Что называют механической системой? Что такое импульс системы тел?</li>
<li>Какие силы называют внутренними? Какие — внешними?</li>
<li>Какие силы могут изменить импульс механической системы? Почему?</li>
</ol>
`);
html += secNav(null, 'p32');
html += readButton('p31');
box.innerHTML = html;
renderMath(box);
wireReadBtn('p31');
// === Задачи §31 — task panel (auto-injected from monolith) ===
const tasksBlock = document.createElement('div');
tasksBlock.className = 'wg';
tasksBlock.style.marginTop = '20px';
tasksBlock.innerHTML = '<div class="wg-header"><span class="wg-badge">Задачи</span><div class="wg-title">Тренажёр §31</div></div>' + `<div id="ptab-p31">
<div class="score-bar">
<div class="chip chip-ok">&nbsp;<span id="okp31">0</span></div>
<div class="chip chip-tot"><span id="curp31">0</span>&nbsp;/&nbsp;<span id="maxp31">12</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p31')" style="padding:6px 13px;font-size:.74rem"> Заново</button>
</div>
<div class="prog-wrap"><div class="prog-fill" id="progp31" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp31"></div>
<div id="taskAreap31"></div>
<div class="feedback" id="fbp31"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp31" onclick="nextTask('p31')" style="display:none"> Следующая</button>
</div>
<div class="summary" id="sump31">
<h2>§31 — готово!</h2>
<div class="big-score" id="sumScorep31"></div>
<div class="sum-grade" id="sumGradep31"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p31')"> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p32')">→ §32</button>
</div>
</div>
</div>`;
box.appendChild(tasksBlock);
// Auto-render first task
setTimeout(() => {
try { if (typeof goToTask === 'function') goToTask('p31', 0); }
catch(e) { console.warn('p31 goToTask:', e.message); }
}, 80);
}
function build_p32(){
const box = document.getElementById('p32-body');
let html = '';
html += makeCard('theory', "Закон сохранения импульса. Реактивное движение", "§32", `
<!-- Hero -->
<div class="para-hero ph-32">
<div class="ph-label">§32 · Физика 9 кл</div>
<h2>Закон сохранения импульса. Реактивное движение</h2>
<div class="ph-formula">$\\vec{p}_{\\text{сист}} = \\text{const}$</div>
<div class="ph-desc">Если внешние силы на систему не действуют — суммарный импульс не меняется.<br>Это объясняет и удары, и ракеты, и прыжки с лодки.</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"> §32. Закон сохранения импульса. Реактивное движение</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Закон сохранения импульса</h3>
<div class="main-f">$\\vec{p}_{\\text{сист}} = \\text{const}$</div>
<p>Импульс системы сохраняется, если <b>результирующая внешних сил равна нулю</b>.</p>
<p>Замкнутая система: $\\vec{F}_{\\text{внешн}} = 0$.</p>
</div>
<div class="fcard">
<h3>Применимость ЗСИ</h3>
<div class="main-f" style="font-size:.88rem">$\\vec{F}_{\\text{внешн}} = 0 \\;\\Rightarrow\\; \\vec{p}=\\text{const}$</div>
<p>ЗСИ применим к незамкнутым системам, если:</p>
<ul>
<li>внешние силы малы по сравнению с внутренними;</li>
<li>проекция внешних сил на направление движения равна нулю.</li>
</ul>
</div>
<div class="fcard">
<h3>Абсолютно неупругий удар</h3>
<div class="main-f">$m_1\\vec{v}_1 + m_2\\vec{v}_2 = (m_1{+}m_2)\\vec{v}$</div>
<p>После удара тела движутся вместе с одинаковой скоростью $\\vec{v}$.</p>
</div>
<div class="fcard">
<h3>Реактивное движение</h3>
<div class="main-f">$m_1\\vec{v}_1 + m_2\\vec{v}_2 = 0$</div>
<p>Если система покоилась ($p_0 = 0$), после отделения части тело и отделившаяся часть движутся в <b>противоположных направлениях</b>.</p>
<p>Пушка на платформе, ракета, прыжок с лодки.</p>
</div>
</div>
<!-- Схема: до и после удара -->
<div class="fcard" style="margin-bottom:16px">
<h3>Схема абсолютно неупругого удара (проекция на ось $Ox$)</h3>
<svg width="100%" viewBox="0 0 480 90" style="max-width:480px;display:block;margin:8px auto">
<!-- До удара -->
<text x="4" y="18" font-size="12" fill="#64748b" font-family="Inter">До удара:</text>
<!-- тело 1 -->
<rect x="10" y="28" width="60" height="30" rx="6" fill="#bfdbfe" stroke="#1d4ed8" stroke-width="1.5"/>
<text x="40" y="48" font-size="11" text-anchor="middle" fill="#1d4ed8" font-weight="700">m₁</text>
<polygon points="75,43 90,38 90,48" fill="#1d4ed8"/>
<text x="100" y="48" font-size="11" fill="#1d4ed8" font-family="JetBrains Mono">v₁→</text>
<!-- тело 2 -->
<rect x="160" y="28" width="60" height="30" rx="6" fill="#dbeafe" stroke="#1d4ed8" stroke-width="1.5"/>
<text x="190" y="48" font-size="11" text-anchor="middle" fill="#1d4ed8" font-weight="700">m₂</text>
<polygon points="225,43 240,38 240,48" fill="#64748b"/>
<text x="250" y="48" font-size="11" fill="#64748b" font-family="JetBrains Mono">v₂</text>
<!-- После удара -->
<text x="310" y="18" font-size="12" fill="#64748b" font-family="Inter">После удара:</text>
<rect x="310" y="28" width="100" height="30" rx="6" fill="#a5f3fc" stroke="#0891b2" stroke-width="1.5"/>
<text x="360" y="48" font-size="11" text-anchor="middle" fill="#0891b2" font-weight="700">m₁+m₂</text>
<polygon points="415,43 430,38 430,48" fill="#0891b2"/>
<text x="440" y="48" font-size="11" fill="#0891b2" font-family="JetBrains Mono">v</text>
</svg>
<p style="font-size:.82rem;color:var(--muted);text-align:center">Импульс до удара = Импульс после: $m_1 v_1 + m_2 v_2 = (m_1{+}m_2)v$</p>
</div>
<!-- ── СХЕМЫ §32 ── -->
<div class="idiag-2col">
<div class="idiag">
<h3> Ракета: реактивное движение в вакууме</h3>
<svg width="100%" viewBox="0 0 200 110" style="display:block;margin:0 auto">
<rect width="200" height="110" fill="#0f172a" rx="8"/>
<circle cx="18" cy="14" r="1" fill="white" opacity=".6"/>
<circle cx="52" cy="7" r="1.5" fill="white" opacity=".5"/>
<circle cx="88" cy="20" r="1" fill="white" opacity=".4"/>
<circle cx="138" cy="9" r="1" fill="white" opacity=".7"/>
<circle cx="172" cy="22" r="1" fill="white" opacity=".5"/>
<circle cx="28" cy="42" r="1" fill="white" opacity=".3"/>
<circle cx="162" cy="54" r="1" fill="white" opacity=".4"/>
<rect x="88" y="38" width="52" height="26" rx="5" fill="#bfdbfe" stroke="#1d4ed8" stroke-width="1.5"/>
<polygon points="140,38 140,64 163,51" fill="#93c5fd"/>
<polygon points="88,64 76,78 88,70" fill="#93c5fd"/>
<polygon points="88,38 76,24 88,44" fill="#93c5fd"/>
<text x="114" y="55" font-size="9" text-anchor="middle" fill="#1e3a8a" font-weight="700">M</text>
<rect x="46" y="44" width="42" height="14" rx="5" fill="rgba(251,146,60,.4)" stroke="#f97316" stroke-width="1.2"/>
<text x="67" y="55" font-size="8.5" text-anchor="middle" fill="#ea580c" font-weight="700">m, u</text>
<line x1="163" y1="51" x2="188" y2="51" stroke="#60a5fa" stroke-width="2.5"/>
<polygon points="188,51 178,46 178,56" fill="#60a5fa"/>
<text x="168" y="44" font-size="8" fill="#93c5fd" font-family="Inter">MV→</text>
<line x1="46" y1="78" x2="20" y2="78" stroke="#fb923c" stroke-width="2.5"/>
<polygon points="20,78 30,73 30,83" fill="#fb923c"/>
<text x="24" y="92" font-size="8" fill="#fb923c" font-family="Inter">←mu</text>
<text x="100" y="102" font-size="7.5" text-anchor="middle" fill="#94a3b8" font-family="Inter">MV + mu = 0 · MV = mu</text>
</svg>
</div>
<div class="idiag">
<h3> Лёд: суммарный импульс = 0</h3>
<svg width="100%" viewBox="0 0 200 115" style="display:block;margin:0 auto">
<rect x="0" y="88" width="200" height="20" fill="#bae6fd" opacity=".3" rx="2"/>
<text x="100" y="104" font-size="7.5" text-anchor="middle" fill="#0284c7" font-family="Inter">гладкий лёд (Fтрен ≈ 0)</text>
<text x="50" y="14" font-size="8" text-anchor="middle" fill="#64748b" font-family="Inter">ДО толчка</text>
<circle cx="35" cy="60" r="15" fill="#bfdbfe" stroke="#1d4ed8" stroke-width="1.5"/>
<text x="35" y="64" font-size="9" text-anchor="middle" fill="#1d4ed8" font-weight="700">m₁</text>
<circle cx="65" cy="60" r="15" fill="#bfdbfe" stroke="#1d4ed8" stroke-width="1.5"/>
<text x="65" y="64" font-size="9" text-anchor="middle" fill="#1d4ed8" font-weight="700">m₂</text>
<text x="50" y="84" font-size="8" text-anchor="middle" fill="#64748b" font-family="Inter">p = 0</text>
<line x1="88" y1="60" x2="108" y2="60" stroke="#94a3b8" stroke-width="1.5" stroke-dasharray="3,2"/>
<polygon points="108,60 99,55 99,65" fill="#94a3b8"/>
<text x="96" y="52" font-size="7" fill="#94a3b8" font-family="Inter">толчок</text>
<text x="155" y="14" font-size="8" text-anchor="middle" fill="#64748b" font-family="Inter">ПОСЛЕ толчка</text>
<circle cx="125" cy="60" r="14" fill="#dbeafe" stroke="#1d4ed8" stroke-width="1.5"/>
<text x="125" y="64" font-size="8.5" text-anchor="middle" fill="#1d4ed8" font-weight="700">m₁</text>
<line x1="111" y1="52" x2="97" y2="52" stroke="#1d4ed8" stroke-width="2"/>
<polygon points="97,52 107,47 107,57" fill="#1d4ed8"/>
<text x="99" y="44" font-size="7.5" fill="#1d4ed8" font-family="Inter">p₁←</text>
<circle cx="180" cy="60" r="14" fill="#a5f3fc" stroke="#0891b2" stroke-width="1.5"/>
<text x="180" y="64" font-size="8.5" text-anchor="middle" fill="#0891b2" font-weight="700">m₂</text>
<line x1="194" y1="52" x2="200" y2="52" stroke="#0891b2" stroke-width="2"/>
<polygon points="200,52 191,47 191,57" fill="#0891b2"/>
<text x="191" y="44" font-size="7.5" fill="#0891b2" font-family="Inter">→p₂</text>
<text x="155" y="84" font-size="8" text-anchor="middle" fill="#065f46" font-family="Inter" font-weight="700">p₁+p₂ = 0 </text>
</svg>
</div>
</div>
<div class="remember-box">
<div class="remember-box-title"> Запомни!</div>
<ul>
<li>ЗСИ работает только если <b>результирующая внешних сил = 0</b>. Трение, сила тяжести, реакция опоры — это всё внешние силы!</li>
<li>При ударе внутренние силы огромны (тысячи ньютонов), а внешние малы → ЗСИ применим даже для незамкнутой системы.</li>
<li>Ось выбирай сам. Всегда задавай положительное направление <b>до</b> составления уравнения.</li>
</ul>
</div>
<div class="mistakes-box">
<div class="mistakes-box-title"> Частые ошибки</div>
<ul>
<li>Забывают знак: если вагоны едут <b>навстречу</b>, один из $v$ — отрицательный по выбранной оси.</li>
<li>Путают «реактивное движение» с «отталкиванием от среды» — ракета летит в вакууме без воздуха.</li>
<li>При отдаче пушки берут $v_{\\text{пушки}} = v_{\\text{снаряда}}$ — забывают, что массы разные: $m_1 v_1 = m_2 v_2$.</li>
</ul>
</div>
<div class="student-box">
<div class="student-box-title"> Как я это понял</div>
<p><b>Лёд и друг</b><br>
Встань на лёд (трение почти нулевое) и толкни друга. Ты сам покатишься назад! Ты дал другу импульс вперёд — ты получил равный импульс назад. До толчка система покоилась ($p = 0$). После — суммарный импульс всё равно равен нулю. Ничего не пропало.</p>
<p><b>Как работает ракета в космосе?</b><br>
В космосе не на что опереться. Ракета выбрасывает газы назад — газы получают импульс назад. По ЗСИ ракета получает равный импульс вперёд. Никакого «отталкивания от воздуха» — чисто закон сохранения импульса.</p>
<p><b>Внутренние силы — «кукловод без рук»</b><br>
Сидишь в лодке и толкаешь борт изнутри. Лодка не поплывёт — ты часть той же системы. Только внешняя сила (весло, которое упирается в воду) может изменить суммарный импульс. Внутренние силы переносят импульс между частями системы, но общую сумму не меняют.</p>
</div>
<hr class="divider">
<div class="section-title"> Пример решения задачи</div>
<div class="example-box">
<h3>Два вагона движутся навстречу и сцепляются</h3>
<div class="cond">
Вагон массой $m_1 = 10\\,\\text{т}$ движется со скоростью $v_1 = 0{,}1\\,\\text{м/с}$. Навстречу ему движется вагон массой $m_2 = 20\\,\\text{т}$ со скоростью $v_2 = 0{,}2\\,\\text{м/с}$. После сцепки определите скорость вагонов.
</div>
<table class="given-table">
<tr><td>Дано</td><td>$m_1 = 10^4\\,\\text{кг};\\; v_1 = 0{,}1\\,\\text{м/с}$</td></tr>
<tr><td></td><td>$m_2 = 2{\\cdot}10^4\\,\\text{кг};\\; v_2 = 0{,}2\\,\\text{м/с}$</td></tr>
<tr><td>Найти</td><td>$v — ?$</td></tr>
</table>
<div class="sol">
<ol class="sol-steps">
<li><span class="step-n">1</span><span><b>Ось $Ox$:</b> в направлении движения 1-го вагона. Тогда $v_1 = +0{,}1$ м/с, а $v_2 = -0{,}2$ м/с (навстречу).</span></li>
<li><span class="step-n">2</span><span><b>ЗСИ</b> (силы трения малы по сравнению с силой удара):\\[m_1 v_1 + m_2 v_2 = (m_1+m_2)\\,v\\]</span></li>
<li><span class="step-n">3</span><span>Подставляем:\\[v = \\frac{m_1 v_1 + m_2 v_2}{m_1+m_2} = \\frac{10^4\\cdot(+0{,}1) + 2\\cdot10^4\\cdot(-0{,}2)}{3\\cdot10^4} = \\frac{1000 - 4000}{30000} = -0{,}1\\,\\text{м/с}\\]</span></li>
<li><span class="step-n">4</span><span>Знак «$-$» — вагоны едут в сторону <b>отрицательного направления оси</b>, т.е. в сторону 2-го вагона.<br><b>Ответ:</b> $v = 0{,}1\\,\\text{м/с}$ в сторону второго вагона.</span></li>
</ol>
</div>
</div>
<hr class="divider">
<div class="section-title"> Контрольные вопросы</div>
<ol class="q-list">
<li>Что происходит с импульсом системы, если внешние силы на неё не действуют?</li>
<li>В каких случаях закон сохранения импульса применим к незамкнутой системе?</li>
<li>Что такое реактивная сила? Приведите примеры.</li>
<li>Почему скорость ракеты увеличивается по мере её полёта?</li>
<li>Почему для запуска спутников применяют многоступенчатые ракеты?</li>
</ol>
`);
html += secNav('p31', 'p33');
html += readButton('p32');
box.innerHTML = html;
renderMath(box);
wireReadBtn('p32');
// === Задачи §32 — task panel (auto-injected from monolith) ===
const tasksBlock = document.createElement('div');
tasksBlock.className = 'wg';
tasksBlock.style.marginTop = '20px';
tasksBlock.innerHTML = '<div class="wg-header"><span class="wg-badge">Задачи</span><div class="wg-title">Тренажёр §32</div></div>' + `<div id="ptab-p32" style="display:none">
<div class="score-bar">
<div class="chip chip-ok">&nbsp;<span id="okp32">0</span></div>
<div class="chip chip-tot"><span id="curp32">0</span>&nbsp;/&nbsp;<span id="maxp32">12</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p32')" style="padding:6px 13px;font-size:.74rem"> Заново</button>
</div>
<div class="prog-wrap"><div class="prog-fill" id="progp32" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp32"></div>
<div id="taskAreap32"></div>
<div class="feedback" id="fbp32"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp32" onclick="nextTask('p32')" style="display:none"> Следующая</button>
</div>
<div class="summary" id="sump32">
<h2>§32 — готово!</h2>
<div class="big-score" id="sumScorep32"></div>
<div class="sum-grade" id="sumGradep32"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p32')"> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p33')">→ §33</button>
</div>
</div>
</div>`;
box.appendChild(tasksBlock);
// Auto-render first task
setTimeout(() => {
try { if (typeof goToTask === 'function') goToTask('p32', 0); }
catch(e) { console.warn('p32 goToTask:', e.message); }
}, 80);
}
function build_p33(){
const box = document.getElementById('p33-body');
let html = '';
html += makeCard('theory', "Механическая работа. Мощность", "§33", `
<!-- Hero -->
<div class="para-hero ph-33">
<div class="ph-label">§33 · Физика 9 кл</div>
<h2>Механическая работа. Мощность</h2>
<div class="ph-formula">$A = F\\,\\Delta r\\cos\\alpha$</div>
<div class="ph-desc">Работа — это результат действия силы вдоль перемещения.<br>Мощность — это насколько быстро совершается работа.</div>
<div class="ph-tags">
<span class="ph-tag"> [A] = Дж = Н·м</span>
<span class="ph-tag"> [P] = Вт = Дж/с</span>
<span class="ph-tag"> cosα — ключ к знаку</span>
</div>
</div>
<div class="section-title"> §33. Механическая работа. Мощность</div>
<!-- Главная формула -->
<div class="formula-grid">
<div class="fcard highlight">
<h3>Механическая работа</h3>
<div class="main-f">$A = F\\,\\Delta r\\cos\\alpha$</div>
<p>$F$ — модуль силы, $\\Delta r$ — модуль перемещения, $\\alpha$ — угол между $\\vec{F}$ и $\\Delta\\vec{r}$.</p>
<p style="margin-top:5px">$[A] = \\text{Дж} = \\text{Н}{\\cdot}\\text{м}$</p>
</div>
<div class="fcard">
<h3>Знак работы</h3>
<div style="font-size:.82rem;line-height:2;margin-top:4px">
<div style="color:#065f46;font-weight:700">α &lt; 90° → cos α &gt; 0 → <span style="background:#d1fae5;border-radius:4px;padding:1px 6px">A &gt; 0</span> положительная</div>
<div style="color:#92400e;font-weight:700">α = 90° → cos α = 0 → <span style="background:#fef3c7;border-radius:4px;padding:1px 6px">A = 0</span> равна нулю</div>
<div style="color:#991b1b;font-weight:700">α &gt; 90° → cos α &lt; 0 → <span style="background:#fee2e2;border-radius:4px;padding:1px 6px">A &lt; 0</span> отрицательная</div>
</div>
</div>
<div class="fcard">
<h3>Работа при подъёме тела</h3>
<div class="main-f">$A = mgh$</div>
<p>Работа силы тяжести при подъёме тела массой $m$ на высоту $h$ (сила и перемещение сонаправлены).</p>
</div>
<div class="fcard">
<h3>Работа по деформации пружины</h3>
<div class="main-f">$A = \\dfrac{kx^2}{2}$</div>
<p>Работа внешней силы при растяжении или сжатии пружины жёсткостью $k$ на $x$.</p>
</div>
</div>
<!-- Мощность -->
<div class="formula-grid" style="margin-bottom:16px">
<div class="fcard highlight">
<h3>Мощность</h3>
<div class="main-f">$P = \\dfrac{A}{\\Delta t}$</div>
<p>Мощность — быстрота совершения работы.</p>
<p>$[P] = \\text{Вт} = \\dfrac{\\text{Дж}}{\\text{с}}$; 1 кВт = 10³ Вт; 1 МВт = 10⁶ Вт</p>
</div>
<div class="fcard">
<h3>Мощность через скорость</h3>
<div class="main-f">$P = Fv\\cos\\alpha$</div>
<p>Из $A = F\\Delta r\\cos\\alpha$ и $P = A/\\Delta t$, так как $\\Delta r/\\Delta t = v$.</p>
<p style="margin-top:6px">Если сила вдоль движения: $P = Fv$</p>
</div>
</div>
<!-- Важные частные случаи -->
<div class="def-box">
<b>Силы, перпендикулярные перемещению, работы не совершают</b> (α = 90°, cos 90° = 0).<br>
Примеры: сила реакции опоры при горизонтальном движении, центростремительная сила при движении по окружности.
</div>
<!-- ── СХЕМЫ §33 ── -->
<div class="idiag-2col">
<div class="idiag">
<h3> Санки: только Fcosα совершает работу</h3>
<svg width="100%" viewBox="0 0 210 128" style="display:block;margin:0 auto">
<line x1="5" y1="100" x2="205" y2="100" stroke="#94a3b8" stroke-width="2"/>
<line x1="15" y1="100" x2="5" y2="112" stroke="#94a3b8" stroke-width="1"/>
<line x1="35" y1="100" x2="25" y2="112" stroke="#94a3b8" stroke-width="1"/>
<line x1="55" y1="100" x2="45" y2="112" stroke="#94a3b8" stroke-width="1"/>
<line x1="75" y1="100" x2="65" y2="112" stroke="#94a3b8" stroke-width="1"/>
<line x1="95" y1="100" x2="85" y2="112" stroke="#94a3b8" stroke-width="1"/>
<line x1="115" y1="100" x2="105" y2="112" stroke="#94a3b8" stroke-width="1"/>
<line x1="135" y1="100" x2="125" y2="112" stroke="#94a3b8" stroke-width="1"/>
<rect x="55" y="72" width="54" height="28" rx="5" fill="#bfdbfe" stroke="#1d4ed8" stroke-width="1.5"/>
<text x="82" y="90" font-size="10" text-anchor="middle" fill="#1d4ed8" font-weight="700">m</text>
<line x1="109" y1="78" x2="152" y2="47" stroke="#1d4ed8" stroke-width="2.5"/>
<polygon points="152,47 138,51 143,63" fill="#1d4ed8"/>
<text x="158" y="44" font-size="9" fill="#1d4ed8" font-family="Inter" font-weight="700">F</text>
<line x1="109" y1="87" x2="152" y2="87" stroke="#10b981" stroke-width="2.5"/>
<polygon points="152,87 142,82 142,92" fill="#10b981"/>
<text x="123" y="98" font-size="8" fill="#10b981" font-family="Inter" font-weight="700">F·cosα </text>
<line x1="152" y1="47" x2="152" y2="87" stroke="#94a3b8" stroke-width="1.5" stroke-dasharray="4,2"/>
<polygon points="152,87 147,76 157,76" fill="#94a3b8"/>
<text x="156" y="70" font-size="7.5" fill="#94a3b8" font-family="Inter">F·sinα </text>
<path d="M 122 78 A 14 14 0 0 1 130 69" stroke="#64748b" fill="none" stroke-width="1.2"/>
<text x="131" y="70" font-size="8" fill="#64748b" font-family="Inter">α</text>
<text x="5" y="12" font-size="7.5" fill="#10b981" font-family="Inter" font-weight="700">F·cosα → вдоль Δr → A &gt; 0</text>
<text x="5" y="22" font-size="7.5" fill="#94a3b8" font-family="Inter">F·sinα → ⊥ Δr → A = 0</text>
</svg>
</div>
<div class="idiag">
<h3> Пружина: работа = площадь треугольника под F-x</h3>
<svg width="100%" viewBox="0 0 200 130" style="display:block;margin:0 auto">
<line x1="28" y1="108" x2="183" y2="108" stroke="var(--muted)" stroke-width="1.5"/>
<line x1="28" y1="108" x2="28" y2="15" stroke="var(--muted)" stroke-width="1.5"/>
<polygon points="28,15 24,27 32,27" fill="var(--muted)"/>
<polygon points="183,108 171,104 171,112" fill="var(--muted)"/>
<text x="187" y="112" font-size="9" fill="var(--muted)" font-family="Inter">x</text>
<text x="20" y="13" font-size="9" fill="var(--muted)" font-family="Inter">F</text>
<line x1="24" y1="34" x2="32" y2="34" stroke="var(--muted)" stroke-width="1"/>
<text x="2" y="37" font-size="8" fill="#1d4ed8" font-family="Inter">kx</text>
<line x1="110" y1="104" x2="110" y2="112" stroke="var(--muted)" stroke-width="1"/>
<text x="106" y="122" font-size="8" fill="#1d4ed8" font-family="Inter">x</text>
<line x1="28" y1="108" x2="135" y2="28" stroke="#1d4ed8" stroke-width="2.5"/>
<line x1="28" y1="34" x2="110" y2="34" stroke="#1d4ed8" stroke-width="1" stroke-dasharray="3,2"/>
<line x1="110" y1="34" x2="110" y2="108" stroke="#1d4ed8" stroke-width="1" stroke-dasharray="3,2"/>
<polygon points="28,108 110,108 110,34" fill="rgba(29,78,216,.14)" stroke="#1d4ed8" stroke-width="1.5"/>
<text x="55" y="88" font-size="8.5" fill="#1d4ed8" font-family="Inter" font-weight="700">A = kx²/2</text>
<text x="52" y="100" font-size="7.5" fill="#64748b" font-family="Inter">(площадь ▲)</text>
<text x="128" y="34" font-size="8.5" fill="#1d4ed8" font-family="Inter" font-weight="700">F=kx</text>
<text x="28" y="15" font-size="7.5" fill="#64748b" font-family="Inter">F растёт → ср. значение = kx/2</text>
</svg>
</div>
</div>
<!-- Цепочка вывода P = Fv -->
<div class="fchain">
<span class="fchain-note">Откуда $P = Fv$:</span>
<span class="fchain-step">$A = F\\Delta r\\cos\\alpha$</span>
<span class="fchain-arrow">÷ Δt</span>
<span class="fchain-step">$P = F\\dfrac{\\Delta r}{\\Delta t}\\cos\\alpha$</span>
<span class="fchain-arrow">$\\Delta r/\\Delta t = v$</span>
<span class="fchain-step">$P = Fv\\cos\\alpha$</span>
<span class="fchain-arrow">при α=0°</span>
<span class="fchain-step">$P = Fv$ </span>
</div>
<div class="remember-box">
<div class="remember-box-title"> Запомни!</div>
<ul>
<li><b>Угол α</b> — это угол между вектором силы $\\vec{F}$ и вектором перемещения $\\Delta\\vec{r}$, а не с горизонтом или чем-то ещё.</li>
<li>Если тело движется <b>горизонтально</b>, а сила направлена <b>вертикально</b> — работа равна нулю.</li>
<li>Сила тяжести совершает <b>положительную</b> работу при спуске и <b>отрицательную</b> при подъёме.</li>
</ul>
</div>
<div class="mistakes-box">
<div class="mistakes-box-title"> Частые ошибки</div>
<ul>
<li>Берут угол между верёвкой и горизонтом вместо угла между $\\vec{F}$ и $\\Delta\\vec{r}$ — результат неверный.</li>
<li>Забывают $A = kx^2/2$ — это не $A = kx$, потому что сила пружины сама растёт с деформацией.</li>
<li>Путают мощность двигателя с силой тяги: большая мощность ≠ большая сила (при высокой скорости сила маленькая и наоборот).</li>
</ul>
</div>
<div class="student-box">
<div class="student-box-title"> Как я это понял</div>
<p><b>Нести сумку — это не работа (серьёзно)</b><br>
Когда несёшь сумку по горизонтали, ты держишь её рукой вверх (сила направлена вертикально), а сумка при этом едет горизонтально. Угол между силой и перемещением = 90°, cos 90° = 0, значит $A = 0$. Мышцы устают — это да. Но с точки зрения физики работа равна нулю. Обидно.</p>
<p><b>Угол α — это угол между «куда тянешь» и «куда едет»</b><br>
Тянешь санки верёвкой под углом 30° к земле: часть силы тянет вперёд (делает работу), часть — поднимает санки вверх (работы нет). Только та часть силы, которая направлена вдоль движения, и совершает работу — это и есть $F \\cos\\alpha$.</p>
<p><b>Мощность — это «кто быстрее сделает ту же работу»</b><br>
Подняться на 5-й этаж пешком за 2 минуты или за 10 — работа одинакова ($mgh$). Но кто пробежал за 2 минуты — его мощность в 5 раз больше. Именно поэтому двигатели характеризуют мощностью: не «сколько сделает», а «как быстро».</p>
<p><b>Зачем формула $P = Fv$?</b><br>
Если знаешь скорость машины и силу тяги — мощность считается мгновенно. Гоночная машина едет 60 м/с с тягой 3000 Н → мощность = 180 000 Вт = 180 кВт. Никакого времени знать не нужно.</p>
</div>
<!-- Схема угла -->
<div class="fcard" style="margin-bottom:16px">
<h3>Схема: работа при разных углах</h3>
<svg width="100%" viewBox="0 0 480 100" style="max-width:480px;display:block;margin:6px auto">
<!-- Случай 1: α = 0 -->
<rect x="10" y="40" width="70" height="25" rx="5" fill="#bfdbfe" stroke="#1d4ed8" stroke-width="1.5"/>
<polygon points="80,52 100,47 100,57" fill="#065f46"/>
<text x="110" y="48" font-size="10" fill="#064e3b" font-family="Inter" font-weight="700">F, Δr</text>
<text x="10" y="82" font-size="10" fill="#065f46" font-family="Inter">α=0°, A=FΔr &gt; 0</text>
<!-- Случай 2: α = 90° -->
<rect x="170" y="40" width="70" height="25" rx="5" fill="#fef3c7" stroke="#f59e0b" stroke-width="1.5"/>
<polygon points="240,52 260,47 260,57" fill="#92400e"/>
<polygon points="205,40 200,20 210,20" fill="#92400e"/>
<text x="165" y="82" font-size="10" fill="#92400e" font-family="Inter">α=90°, A=0</text>
<!-- Случай 3: α > 90° -->
<rect x="330" y="40" width="70" height="25" rx="5" fill="#fee2e2" stroke="#ef4444" stroke-width="1.5"/>
<polygon points="330,52 310,47 310,57" fill="#991b1b"/>
<polygon points="400,52 420,47 420,57" fill="#64748b"/>
<text x="305" y="82" font-size="10" fill="#991b1b" font-family="Inter">α&gt;90°, A&lt;0 (торм.)</text>
</svg>
</div>
<!-- Интерактивный угол α -->
<div class="idiag">
<h3> Интерактив: как угол α влияет на работу</h3>
<div class="slider-row">
<span class="slider-lbl">Угол α:</span>
<input type="range" min="0" max="180" value="45" id="sl33a" oninput="upd33()">
<span class="slider-val" id="v33a">45°</span>
</div>
<div style="display:flex;gap:14px;align-items:flex-start;flex-wrap:wrap;margin-top:10px">
<svg width="200" height="110" id="svg33" style="flex-shrink:0;border:1.5px solid var(--border);border-radius:12px;background:rgba(29,78,216,.03)">
<rect x="60" y="60" width="40" height="30" rx="6" fill="#bfdbfe" stroke="#1d4ed8" stroke-width="1.5"/>
<text x="80" y="79" font-size="9" text-anchor="middle" fill="#1d4ed8" font-weight="700">m</text>
<line x1="100" y1="75" x2="178" y2="75" stroke="#94a3b8" stroke-width="2"/>
<polygon points="178,75 167,70 167,80" fill="#94a3b8"/>
<text x="135" y="90" font-size="8" fill="#64748b" font-family="Inter">Δr</text>
<line id="fline33" x1="80" y1="75" x2="108" y2="47" stroke="#10b981" stroke-width="3"/>
<polygon id="farrow33" points="108,47 97,56 107,63" fill="#10b981"/>
<text id="ftxt33" x="115" y="46" font-size="9" fill="#10b981" font-family="Inter" font-weight="700">F</text>
<text id="albl33" x="103" y="70" font-size="8" fill="#64748b" font-family="Inter">α</text>
</svg>
<div style="flex:1;min-width:140px">
<div style="font-size:.84rem;margin-bottom:8px;font-weight:600">cos <span id="aval33">45</span>° = <b id="cosval33" style="font-family:'JetBrains Mono',monospace;color:var(--pri);font-size:.92rem">0.71</b></div>
<div class="idiag-result" id="worksign33" style="font-size:.82rem;padding:8px 12px"><span class="work-pos">A &gt; 0 — положительная</span></div>
<div style="font-size:.77rem;color:var(--muted);margin-top:8px;line-height:1.6" id="workdesc33">Сила «помогает» движению</div>
</div>
</div>
</div>
<hr class="divider">
<div class="section-title"> Примеры решения задач</div>
<div class="example-box">
<h3>Автомобиль поднимается в гору</h3>
<div class="cond">
Автомобиль массой $m = 2{,}0\\,\\text{т}$, мощность двигателя $P \\approx 2{,}9\\cdot10^4\\,\\text{Вт}$, скорость подъёма $v = 3{,}0\\,\\text{м/с}$, $g = 10\\,\\text{м/с}^2$. Найдите угол наклона горы.
</div>
<div class="sol">
<ol class="sol-steps">
<li><span class="step-n">1</span><span>Сила тяги направлена вдоль движения (α = 0°), поэтому $P = Fv$:<br>$F = P/v = 2{,}9\\cdot10^4\\,/\\,3{,}0 \\approx 9{,}7\\cdot10^3\\,\\text{Н}$</span></li>
<li><span class="step-n">2</span><span>При равномерном движении сила тяги = составляющая тяжести вдоль горы:<br>$F = mg\\sin\\alpha$</span></li>
<li><span class="step-n">3</span><span>$\\sin\\alpha = F/(mg) = 9700/(2000\\cdot10) = 0{,}485 \\approx 0{,}5$ → $\\alpha = 30°$</span></li>
</ol>
</div>
</div>
<div class="example-box">
<h3>Работа по деформации пружины</h3>
<div class="cond">
Пружину жёсткостью $k = 200\\,\\text{Н/м}$ растянули с $l_0 = 16\\,\\text{см}$ до $l = 20\\,\\text{см}$. Найдите работу внешней силы.
</div>
<div class="sol">
<ol class="sol-steps">
<li><span class="step-n">1</span><span>Деформация (удлинение, а не полная длина!):<br>$x = l - l_0 = 0{,}20 - 0{,}16 = 0{,}04\\,\\text{м}$</span></li>
<li><span class="step-n">2</span><span>Работа внешней силы при деформации пружины:\\[A = \\frac{kx^2}{2} = \\frac{200\\cdot(0{,}04)^2}{2} = \\frac{200\\cdot0{,}0016}{2} = 0{,}16\\,\\text{Дж}\\]</span></li>
</ol>
</div>
</div>
<hr class="divider">
<div class="section-title"> Главные выводы</div>
<div class="def-box" style="border-left-color:#10b981">
1. Работа силы равна произведению модулей силы и перемещения на косинус угла между ними.<br>
2. Острый угол → A &gt; 0; тупой угол → A &lt; 0; прямой угол → A = 0.<br>
3. Силы, перпендикулярные перемещению тела, работы не совершают.<br>
4. Мощность численно равна работе, совершаемой за единицу времени.<br>
5. Мощность пропорциональна произведению действующей силы и скорости движения тела.
</div>
<hr class="divider">
<div class="section-title"> Контрольные вопросы</div>
<ol class="q-list">
<li>Положительной или отрицательной будет работа силы тяжести, действующей на тело, движущееся вверх? Падающее вниз? Почему?</li>
<li>Положительной или отрицательной будет работа силы сопротивления воздуха при движении мяча вверх? При движении вниз?</li>
<li>Чему равна суммарная работа, которую совершила сила тяжести при броске мяча вверх и при его движении обратно?</li>
<li>Совершает ли работу нормальная составляющая силы реакции поверхности, действующая на движущееся по этой поверхности тело?</li>
<li>Можно ли при заданной мощности выиграть и в силе, и в скорости одновременно?</li>
</ol>
`);
html += secNav('p32', 'p34');
html += readButton('p33');
box.innerHTML = html;
renderMath(box);
wireReadBtn('p33');
// === Задачи §33 — task panel (auto-injected from monolith) ===
const tasksBlock = document.createElement('div');
tasksBlock.className = 'wg';
tasksBlock.style.marginTop = '20px';
tasksBlock.innerHTML = '<div class="wg-header"><span class="wg-badge">Задачи</span><div class="wg-title">Тренажёр §33</div></div>' + `<div id="ptab-p33" style="display:none">
<div class="score-bar">
<div class="chip chip-ok">&nbsp;<span id="okp33">0</span></div>
<div class="chip chip-tot"><span id="curp33">0</span>&nbsp;/&nbsp;<span id="maxp33">8</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p33')" style="padding:6px 13px;font-size:.74rem"> Заново</button>
</div>
<div class="prog-wrap"><div class="prog-fill" id="progp33" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp33"></div>
<div id="taskAreap33"></div>
<div class="feedback" id="fbp33"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp33" onclick="nextTask('p33')" style="display:none"> Следующая</button>
</div>
<div class="summary" id="sump33">
<h2>§33 — готово!</h2>
<div class="big-score" id="sumScorep33"></div>
<div class="sum-grade" id="sumGradep33"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p33')"> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p34')">→ §34</button>
</div>
</div>
</div>`;
box.appendChild(tasksBlock);
// Auto-render first task
setTimeout(() => {
try { if (typeof goToTask === 'function') goToTask('p33', 0); }
catch(e) { console.warn('p33 goToTask:', e.message); }
}, 80);
}
function build_p34(){
const box = document.getElementById('p34-body');
let html = '';
html += makeCard('theory', "Потенциальная энергия", "§34", `
<!-- Hero -->
<div class="para-hero ph-34">
<div class="ph-label">§34 · Физика 9 кл</div>
<h2>Потенциальная энергия</h2>
<div class="ph-formula">$E_\\text{п} = mgh \\quad\\text{или}\\quad E_\\text{п} = \\tfrac{kx^2}{2}$</div>
<div class="ph-desc">Потенциальная энергия — это «запас» работы, которую могут совершить силы взаимодействия.<br>Нулевой уровень выбираешь сам — важна только разность энергий.</div>
<div class="ph-tags">
<span class="ph-tag"> [Eп] = Дж</span>
<span class="ph-tag"> mgh — линейно от h</span>
<span class="ph-tag"> kx²/2 — квадратично от x</span>
</div>
</div>
<div class="section-title"> §34. Потенциальная энергия</div>
<div class="def-box">
<b>Потенциальная энергия</b> — мера способности сил взаимодействия механической системы совершать работу.<br>
Потенциальная энергия равна работе, которую совершат силы взаимодействия при переходе тела из данного состояния на <b>нулевой уровень</b>: $E_\\text{п} = A$.
</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Потенциальная энергия в поле тяжести</h3>
<div class="main-f">$E_\\text{п} = mgh$</div>
<p>$m$ — масса тела, $g$ — ускорение свободного падения, $h$ — высота над нулевым уровнем.</p>
<p style="margin-top:6px">$[E_\\text{п}] = \\text{Дж}$</p>
</div>
<div class="fcard highlight">
<h3>Потенциальная энергия упруго деформированного тела</h3>
<div class="main-f">$E_\\text{п} = \\dfrac{kx^2}{2}$</div>
<p>$k$ — жёсткость пружины, $x$ — деформация (растяжение или сжатие).</p>
</div>
<div class="fcard">
<h3>Изменение потенциальной энергии и работа</h3>
<div class="main-f">$\\Delta E_\\text{п} = -A$</div>
<p>Изменение потенциальной энергии и работа сил взаимодействия имеют <b>противоположные знаки</b>.</p>
<p style="margin-top:5px;font-size:.79rem">Тело опускается → $A &gt; 0$ → $\\Delta E_\\text{п} &lt; 0$ (энергия убывает)</p>
</div>
<div class="fcard">
<h3>Нулевой уровень</h3>
<div class="main-f" style="font-size:.9rem">$E_\\text{п}(h{=}0) = 0$</div>
<p>Нулевой уровень потенциальной энергии <b>выбирается произвольно</b>.</p>
<p style="margin-top:5px;font-size:.79rem">Изменение $\\Delta E_\\text{п}$ от выбора нулевого уровня <b>не зависит</b>.</p>
</div>
</div>
<!-- Графики из учебника -->
<div class="fcard" style="margin-bottom:16px">
<h3>Графики потенциальной энергии</h3>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:10px">
<div>
<svg width="100%" viewBox="0 0 200 140">
<text x="100" y="14" font-size="11" text-anchor="middle" fill="var(--pri)" font-family="Inter" font-weight="700">E п = mgh (гравитац.)</text>
<line x1="20" y1="120" x2="180" y2="120" stroke="var(--muted)" stroke-width="1.5"/>
<line x1="20" y1="120" x2="20" y2="20" stroke="var(--muted)" stroke-width="1.5"/>
<polygon points="20,20 16,32 24,32" fill="var(--muted)"/>
<polygon points="180,120 168,116 168,124" fill="var(--muted)"/>
<text x="183" y="124" font-size="10" fill="var(--muted)" font-family="Inter">h</text>
<text x="14" y="18" font-size="10" fill="var(--muted)" font-family="Inter">Eп</text>
<line x1="20" y1="120" x2="170" y2="30" stroke="#1d4ed8" stroke-width="2.5"/>
<text x="130" y="55" font-size="9" fill="#1d4ed8" font-family="Inter" font-weight="700">прямая</text>
<text x="100" y="135" font-size="9" text-anchor="middle" fill="var(--muted)" font-family="Inter">Eп ~ h (линейно)</text>
</svg>
</div>
<div>
<svg width="100%" viewBox="0 0 200 140">
<text x="100" y="14" font-size="11" text-anchor="middle" fill="var(--pri)" font-family="Inter" font-weight="700">E п = kx²/2 (пружина)</text>
<line x1="20" y1="120" x2="180" y2="120" stroke="var(--muted)" stroke-width="1.5"/>
<line x1="20" y1="120" x2="20" y2="20" stroke="var(--muted)" stroke-width="1.5"/>
<polygon points="20,20 16,32 24,32" fill="var(--muted)"/>
<polygon points="180,120 168,116 168,124" fill="var(--muted)"/>
<text x="183" y="124" font-size="10" fill="var(--muted)" font-family="Inter">x</text>
<text x="14" y="18" font-size="10" fill="var(--muted)" font-family="Inter">Eп</text>
<path d="M20,120 Q80,118 110,90 Q140,62 170,28" stroke="#1d4ed8" stroke-width="2.5" fill="none"/>
<text x="130" y="60" font-size="9" fill="#1d4ed8" font-family="Inter" font-weight="700">парабола</text>
<text x="100" y="135" font-size="9" text-anchor="middle" fill="var(--muted)" font-family="Inter">Eп ~ x² (квадратично)</text>
</svg>
</div>
</div>
</div>
<!-- ── СХЕМЫ §34 ── -->
<div class="idiag">
<h3> Нулевой уровень — двигай и смотри что меняется, а что нет</h3>
<div class="slider-row" style="margin-bottom:12px">
<span class="slider-lbl">Уровень h=0:</span>
<input type="range" min="0" max="6" step="0.5" value="0" id="sl34zero" oninput="upd34zero()">
<span class="slider-val" id="v34zero">пол (0 м)</span>
</div>
<div style="display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap">
<!-- SVG-сцена -->
<svg width="160" height="230" style="flex-shrink:0;border:1.5px solid var(--border);border-radius:12px;overflow:visible;background:rgba(29,78,216,.025)">
<!-- Стена слева -->
<rect x="0" y="0" width="14" height="230" fill="#e2e8f0"/>
<!-- Этажи: фиксированные реальные высоты. 1 м = 22px. Низ SVG = y=218 = реальный -1м (земля). -->
<!-- Реальный пол = 0 м = y=196. Полка 1 = 2м = y=152. Полка 2 = 5м = y=86 -->
<!-- Земля (улица) -->
<rect x="14" y="218" width="146" height="12" fill="#94a3b8" rx="2"/>
<line x1="14" y1="218" x2="160" y2="218" stroke="#64748b" stroke-width="1.5"/>
<!-- Пол комнаты -->
<rect x="14" y="196" width="146" height="5" fill="#94a3b8"/>
<text x="17" y="208" font-size="7.5" fill="#64748b" font-family="Inter">пол</text>
<!-- Потолок -->
<rect x="14" y="18" width="146" height="5" fill="#94a3b8"/>
<text x="17" y="16" font-size="7.5" fill="#64748b" font-family="Inter">потолок (7 м)</text>
<!-- Полка А (шар лежит) — реальная высота 2 м = y=152 -->
<rect x="40" y="152" width="55" height="5" rx="2" fill="#1d4ed8" opacity=".4"/>
<!-- Шар А (позиция 1 — низкая) cy = 152-12 = 140 -->
<circle cx="67" cy="140" r="12" fill="#bfdbfe" stroke="#1d4ed8" stroke-width="2"/>
<text x="67" y="144" font-size="8" text-anchor="middle" fill="#1d4ed8" font-weight="700">m</text>
<text x="100" y="144" font-size="7.5" fill="#1d4ed8" font-family="Inter">2 м</text>
<!-- Полка Б (шар лежит) — реальная высота 5 м = y=86 -->
<rect x="40" y="86" width="55" height="5" rx="2" fill="#7c3aed" opacity=".4"/>
<!-- Шар Б (позиция 2 — высокая) cy = 86-12 = 74 -->
<circle cx="67" cy="74" r="12" fill="#ede9fe" stroke="#7c3aed" stroke-width="2"/>
<text x="67" y="78" font-size="8" text-anchor="middle" fill="#7c3aed" font-weight="700">m</text>
<text x="100" y="78" font-size="7.5" fill="#7c3aed" font-family="Inter">5 м</text>
<!-- Скобка ΔЕп: стрелка между шарами -->
<line x1="130" y1="74" x2="130" y2="140" stroke="#10b981" stroke-width="2"/>
<polygon points="130,74 126,85 134,85" fill="#10b981"/>
<polygon points="130,140 126,129 134,129" fill="#10b981"/>
<text x="134" y="112" font-size="8" fill="#065f46" font-family="Inter" font-weight="700">Δh=3м</text>
<!-- Нулевой уровень — динамическая линия -->
<line id="zline34" x1="14" y1="196" x2="160" y2="196" stroke="#10b981" stroke-width="2.5" stroke-dasharray="6,3"/>
<text id="zlbl34" x="16" y="192" font-size="8" fill="#10b981" font-family="Inter" font-weight="800">h = 0</text>
<!-- Стрелки от нулевого уровня до шара А -->
<line id="za_line" x1="22" y1="196" x2="22" y2="140" stroke="#1d4ed8" stroke-width="1.8" stroke-dasharray="3,2"/>
<polygon id="za_arr1" points="22,140 18,151 26,151" fill="#1d4ed8"/>
<polygon id="za_arr2" points="22,196 18,185 26,185" fill="#1d4ed8"/>
<text id="za_lbl" x="4" y="172" font-size="8" fill="#1d4ed8" font-family="Inter" font-weight="700">h₁</text>
<!-- Стрелки от нулевого уровня до шара Б -->
<line id="zb_line" x1="33" y1="196" x2="33" y2="74" stroke="#7c3aed" stroke-width="1.8" stroke-dasharray="3,2"/>
<polygon id="zb_arr1" points="33,74 29,85 37,85" fill="#7c3aed"/>
<polygon id="zb_arr2" points="33,196 29,185 37,185" fill="#7c3aed"/>
<text id="zb_lbl" x="4" y="130" font-size="8" fill="#7c3aed" font-family="Inter" font-weight="700">h₂</text>
</svg>
<!-- Правая панель с числами -->
<div style="flex:1;min-width:170px;display:flex;flex-direction:column;gap:10px">
<div style="background:rgba(29,78,216,.07);border:1.5px solid rgba(29,78,216,.25);border-radius:10px;padding:10px 13px">
<div style="font-size:.73rem;font-weight:700;color:#1d4ed8;margin-bottom:5px"> Шар на нижней полке (2 м)</div>
<div style="font-family:'JetBrains Mono',monospace;font-size:.85rem;font-weight:700;color:var(--text)">
h₁ = <span id="h1val">2</span> м<br>
Eп₁ = <span id="ep1val" style="color:#1d4ed8">400</span> Дж
</div>
</div>
<div style="background:rgba(124,58,237,.07);border:1.5px solid rgba(124,58,237,.25);border-radius:10px;padding:10px 13px">
<div style="font-size:.73rem;font-weight:700;color:#7c3aed;margin-bottom:5px"> Шар на верхней полке (5 м)</div>
<div style="font-family:'JetBrains Mono',monospace;font-size:.85rem;font-weight:700;color:var(--text)">
h₂ = <span id="h2val">5</span> м<br>
Eп₂ = <span id="ep2val" style="color:#7c3aed">1000</span> Дж
</div>
</div>
<div style="background:rgba(16,185,129,.1);border:2px solid #10b981;border-radius:10px;padding:10px 13px">
<div style="font-size:.73rem;font-weight:700;color:#065f46;margin-bottom:5px"> Изменение энергии</div>
<div style="font-family:'JetBrains Mono',monospace;font-size:.9rem;font-weight:800;color:#065f46">
ΔEп = <span id="depval">600</span> Дж
</div>
<div style="font-size:.72rem;color:#065f46;margin-top:4px;font-weight:600" id="dep_note">
= 2 × 10 × 3 = не меняется!
</div>
</div>
<div style="font-size:.75rem;color:var(--muted);line-height:1.6;padding:0 2px">
Двигай нулевой уровень — Eп₁ и Eп₂ меняются,<br>но <b style="color:#065f46">ΔEп всегда = 600 Дж</b>
</div>
</div>
</div>
</div>
<div class="idiag">
<h3> Интерактив: Eп = mgh</h3>
<div class="slider-row">
<span class="slider-lbl">Масса $m$:</span>
<input type="range" min="1" max="20" value="5" id="sl34m" oninput="upd34()">
<span class="slider-val" id="v34m">5 кг</span>
</div>
<div class="slider-row">
<span class="slider-lbl">Высота $h$:</span>
<input type="range" min="0" max="20" value="4" id="sl34h" oninput="upd34()">
<span class="slider-val" id="v34h">4 м</span>
</div>
<div style="display:flex;gap:16px;align-items:center;flex-wrap:wrap">
<div style="flex:1;min-width:180px">
<div class="idiag-result" id="res34">Eп = 5 × 10 × 4 = <b style="font-size:1.1em;color:var(--pri)">200</b> Дж</div>
<p style="font-size:.75rem;color:var(--muted);margin-top:8px"> Подними m=10 кг на h=10 м — 1000 Дж! Столько тратит кран, поднимая гирю.</p>
</div>
<svg width="60" height="118" id="svg34lift" style="flex-shrink:0">
<line x1="8" y1="5" x2="8" y2="103" stroke="var(--muted)" stroke-width="1"/>
<text x="3" y="9" font-size="7" fill="var(--muted)" font-family="Inter">h</text>
<line x1="4" y1="103" x2="54" y2="103" stroke="#94a3b8" stroke-width="1.5"/>
<text x="30" y="113" font-size="7" text-anchor="middle" fill="#94a3b8" font-family="Inter">h=0</text>
<rect x="18" y="5" width="34" height="98" rx="5" fill="rgba(29,78,216,.07)" stroke="var(--border)" stroke-width="1.5"/>
<rect x="20" id="liftbar34" y="80" width="30" height="22" rx="4" fill="var(--pri)" opacity=".7"/>
<circle id="liftball34" cx="35" cy="70" r="9" fill="#bfdbfe" stroke="#1d4ed8" stroke-width="1.5"/>
<text id="liftballtxt" x="35" y="74" font-size="7" text-anchor="middle" fill="#1d4ed8" font-weight="700">m</text>
</svg>
</div>
</div>
<!-- Цепочка связей §34 -->
<div class="fchain">
<span class="fchain-note">Связь работы и энергии:</span>
<span class="fchain-step">тело опускается</span>
<span class="fchain-arrow">→</span>
<span class="fchain-step">$A_{\\text{тяж}} > 0$</span>
<span class="fchain-arrow">→</span>
<span class="fchain-step">$\\Delta E_\\text{п} = -A < 0$</span>
<span class="fchain-arrow">→</span>
<span class="fchain-step">$E_\\text{п}$ убывает</span>
</div>
<div class="remember-box">
<div class="remember-box-title"> Запомни!</div>
<ul>
<li>$\\Delta E_\\text{п} = -A$: минус означает, что при совершении положительной работы запас энергии <b>уменьшается</b>.</li>
<li>$x$ в формуле $E_\\text{п} = kx^2/2$ — это <b>деформация</b> (изменение длины), а не полная длина пружины!</li>
<li>Нулевой уровень для $mgh$ выбирают там, куда падает тело — тогда $E_\\text{п}$ на нулевом уровне = 0.</li>
</ul>
</div>
<div class="mistakes-box">
<div class="mistakes-box-title"> Частые ошибки</div>
<ul>
<li>Подставляют полную длину пружины $l$ вместо деформации $x = l - l_0$ в $kx^2/2$.</li>
<li>Путают знак: тело поднялось → $A_{\\text{тяж}} < 0$ → $\\Delta E_\\text{п} = -A > 0$ → энергия выросла (всё логично).</li>
<li>Думают, что $E_\\text{п}$ — абсолютная характеристика тела. На самом деле она зависит от выбора нулевого уровня, зато $\\Delta E_\\text{п}$ — не зависит.</li>
</ul>
</div>
<div class="student-box">
<div class="student-box-title"> Как я это понял</div>
<p><b>Потенциальная энергия — это «замороженная» работа</b><br>
Кирпич лежит на высоте 10 м. Он ничего не делает. Но стоит его отпустить — он упадёт, разгонится и совершит работу. Откуда она возьмётся? Из высоты. Пока кирпич висит — у него есть потенциальная энергия. Это как деньги на счёте: их не видно, но они есть.</p>
<p><b>Нулевой уровень — сам выбираешь</b><br>
Считать высоту от пола, от земли или от крыши — всё равно. Меняется только само число $E_\\text{п} = mgh$, но разница $\\Delta E_\\text{п}$ между двумя положениями всегда одинакова. Именно поэтому нулевой уровень выбирают там, где удобно: обычно там, куда тело падает.</p>
<p><b>Пружина тоже хранит энергию — и квадратично</b><br>
Растянул пружину в 2 раза сильнее — энергия выросла в 4 раза ($E_\\text{п} = kx^2/2$). Это не линейно! Поэтому взведённый арбалет опасен сильнее, чем кажется: маленькая дополнительная деформация даёт большой прирост энергии.</p>
<p><b>$\\Delta E_\\text{п} = -A$: почему минус?</b><br>
Тело падает → сила тяжести совершает работу $A > 0$ (помогает движению) → потенциальная энергия уменьшается $\\Delta E_\\text{п} < 0$. Энергия «потратилась» на работу. Знак минус — это просто способ сказать: что потратил на работу, то убыло из запаса.</p>
</div>
<hr class="divider">
<div class="section-title"> Пример решения задачи</div>
<div class="example-box">
<h3>Работа внешней силы и изменение $E_\\text{п}$ пружины</h3>
<div class="cond">
Пружину жёсткостью $k = 200\\,\\text{Н/м}$ растянули с $l_0 = 16\\,\\text{см}$ до $l = 20\\,\\text{см}$. Найдите работу внешней силы, работу силы упругости и изменение потенциальной энергии.
</div>
<div class="sol">
<ol class="sol-steps">
<li><span class="step-n">1</span><span>Деформация (не путать с полной длиной!):<br>$x = l - l_0 = 0{,}20 - 0{,}16 = 0{,}04\\,\\text{м}$</span></li>
<li><span class="step-n">2</span><span>Работа внешней силы = прирост $E_\\text{п}$ пружины:\\[A_\\text{внеш} = \\frac{kx^2}{2} = \\frac{200\\cdot0{,}04^2}{2} = 0{,}16\\,\\text{Дж}\\]</span></li>
<li><span class="step-n">3</span><span>Сила упругости — против деформации, значит работает против: $A_\\text{упр} = -0{,}16\\,\\text{Дж}$</span></li>
<li><span class="step-n">4</span><span>$\\Delta E_\\text{п} = -A_\\text{упр} = -(-0{,}16) = +0{,}16\\,\\text{Дж}$ — энергия выросла. </span></li>
</ol>
</div>
</div>
<div class="example-box">
<h3>Определить массу тела по работе при подъёме</h3>
<div class="cond">
При медленном подъёме камня из ямы глубиной $h = 2{,}0\\,\\text{м}$ совершена работа $A = 100\\,\\text{Дж}$, $g = 10\\,\\text{м/с}^2$. Найдите массу камня.
</div>
<div class="sol">
<ol class="sol-steps">
<li><span class="step-n">1</span><span>При равномерном подъёме сила равна весу, поэтому $A = mgh$.</span></li>
<li><span class="step-n">2</span><span>Выражаем массу:\\[m = \\frac{A}{gh} = \\frac{100}{10\\cdot2{,}0} = 5{,}0\\,\\text{кг}\\]</span></li>
</ol>
</div>
</div>
<hr class="divider">
<div class="section-title"> Главные выводы</div>
<div class="def-box" style="border-left-color:#10b981">
1. Потенциальная энергия характеризует способность тела совершать работу.<br>
2. Потенциальная энергия равна работе сил взаимодействия при переходе тела на нулевой уровень.<br>
3. Изменение потенциальной энергии равно работе сил взаимодействия, взятой с противоположным знаком: $\\Delta E_\\text{п} = -A$.
</div>
<hr class="divider">
<div class="section-title"> Контрольные вопросы</div>
<ol class="q-list">
<li>В каких случаях тело обладает потенциальной энергией?</li>
<li>Как определить потенциальную энергию любого тела? От чего она зависит?</li>
<li>Чему равна потенциальная энергия тела в системе «тело + Земля»?</li>
<li>Чему равна потенциальная энергия упруго деформированного тела?</li>
<li>Почему значение потенциальной энергии зависит от выбора нулевого уровня, а её изменение — нет?</li>
</ol>
`);
html += secNav('p33', 'p35');
html += readButton('p34');
box.innerHTML = html;
renderMath(box);
wireReadBtn('p34');
// === Задачи §34 — task panel (auto-injected from monolith) ===
const tasksBlock = document.createElement('div');
tasksBlock.className = 'wg';
tasksBlock.style.marginTop = '20px';
tasksBlock.innerHTML = '<div class="wg-header"><span class="wg-badge">Задачи</span><div class="wg-title">Тренажёр §34</div></div>' + `<div id="ptab-p34" style="display:none">
<div class="score-bar">
<div class="chip chip-ok">&nbsp;<span id="okp34">0</span></div>
<div class="chip chip-tot"><span id="curp34">0</span>&nbsp;/&nbsp;<span id="maxp34">9</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p34')" style="padding:6px 13px;font-size:.74rem"> Заново</button>
</div>
<div class="prog-wrap"><div class="prog-fill" id="progp34" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp34"></div>
<div id="taskAreap34"></div>
<div class="feedback" id="fbp34"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp34" onclick="nextTask('p34')" style="display:none"> Следующая</button>
</div>
<div class="summary" id="sump34">
<h2>§34 — готово!</h2>
<div class="big-score" id="sumScorep34"></div>
<div class="sum-grade" id="sumGradep34"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p34')"> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p35')">→ §35</button>
</div>
</div>
</div>`;
box.appendChild(tasksBlock);
// Auto-render first task
setTimeout(() => {
try { if (typeof goToTask === 'function') goToTask('p34', 0); }
catch(e) { console.warn('p34 goToTask:', e.message); }
}, 80);
}
function build_p35(){
const box = document.getElementById('p35-body');
let html = '';
html += makeCard('theory', "Кинетическая энергия. Полная энергия системы тел", "§35", `
<div class="para-hero ph-35">
<div class="ph-label">§35 · Физика 9 кл</div>
<h2>Кинетическая энергия. Полная энергия системы тел</h2>
<div class="ph-formula">$E_\\text{к} = \\dfrac{mv^2}{2}$</div>
<div class="ph-desc">Кинетическая энергия — это «энергия движения». Она зависит от скорости квадратично:<br>удвоить скорость — значит учетверить энергию.</div>
<div class="ph-tags">
<span class="ph-tag"> [Eк] = Дж</span>
<span class="ph-tag"> пропорциональна v²</span>
<span class="ph-tag"> теорема ΔEк = Aрез</span>
</div>
</div>
<div class="section-title"> §35. Кинетическая энергия</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Кинетическая энергия</h3>
<div class="main-f">$E_\\text{к} = \\dfrac{mv^2}{2}$</div>
<p><b>Скалярная</b> величина, всегда $\\geq 0$.</p>
<p>$[E_\\text{к}] = \\text{Дж}$</p>
<p style="margin-top:6px;font-size:.79rem">$m$ — масса тела, $v$ — скорость</p>
</div>
<div class="fcard highlight">
<h3>Теорема о кинетической энергии</h3>
<div class="main-f">$\\Delta E_\\text{к} = A_\\text{рез}$</div>
<p>Изменение $E_\\text{к}$ равно <b>работе результирующей всех сил</b>.</p>
<p style="margin-top:5px;font-size:.79rem">$\\dfrac{mv^2}{2} - \\dfrac{mv_0^2}{2} = A_\\text{рез}$</p>
</div>
<div class="fcard">
<h3>Механическая энергия</h3>
<div class="main-f">$E_\\text{мех} = E_\\text{к} + E_\\text{п}$</div>
<p>Сумма кинетической и потенциальной энергии тела (или системы).</p>
<p style="margin-top:5px;font-size:.79rem">$E_\\text{мех} = \\dfrac{mv^2}{2} + mgh$</p>
</div>
<div class="fcard">
<h3>Полная энергия системы</h3>
<div class="main-f">$E = E_\\text{мех} + E_\\text{внутр}$</div>
<p><b>Полная энергия</b> системы тел включает механическую и внутреннюю (тепловую) энергию.</p>
<p style="margin-top:5px;font-size:.79rem">$E = \\text{const}$ — закон сохранения энергии</p>
</div>
</div>
<!-- ── ИНТЕРАКТИВНЫЙ КАЛЬКУЛЯТОР Eк ── -->
<div class="idiag">
<h3> Калькулятор кинетической энергии</h3>
<div class="slider-row">
<span class="slider-lbl">Масса m:</span>
<input type="range" min="1" max="20" step="1" value="5" id="sl35m" oninput="upd35()">
<span class="slider-val" id="v35m">5 кг</span>
</div>
<div class="slider-row">
<span class="slider-lbl">Скорость v:</span>
<input type="range" min="0" max="30" step="1" value="10" id="sl35v" oninput="upd35()">
<span class="slider-val" id="v35v">10 м/с</span>
</div>
<div class="idiag-result" id="res35">Eк = 5 × 100 / 2 = <b style="font-size:1.1em;color:var(--pri)">250</b> Дж</div>
<!-- Полоска энергии -->
<div style="margin-top:10px;background:rgba(29,78,216,.07);border-radius:9px;height:22px;overflow:hidden;position:relative">
<div id="bar35" style="height:100%;background:linear-gradient(90deg,#6d28d9,#8b5cf6);border-radius:9px;transition:width .3s;width:25%"></div>
</div>
<div style="font-size:.73rem;color:var(--muted);margin-top:5px;text-align:right">Шкала: 0 — 4 500 Дж</div>
<!-- Сравнение: удвоение скорости -->
<div class="student-box" style="margin-top:14px">
<div class="student-box-title"> Ключевое наблюдение</div>
<p>Скорость удвоить (×2) → $E_\\text{к}$ увеличится <b>в 4 раза</b>.</p>
<p>Скорость утроить (×3) → $E_\\text{к}$ увеличится <b>в 9 раз</b>.</p>
<p>Это потому что $E_\\text{к} \\sim v^2$ — зависит от квадрата скорости!</p>
</div>
</div>
<!-- ── ТЕОРЕМА О Eк: ЦЕПОЧКА ── -->
<div class="section-title"> Как применять теорему о Eк</div>
<div class="fchain">
<span class="fchain-step">$A_\\text{рез} = F_\\text{рез}\\,\\Delta r$</span>
<span class="fchain-arrow">→</span>
<span class="fchain-step">$A_\\text{рез} = \\Delta E_\\text{к}$</span>
<span class="fchain-arrow">→</span>
<span class="fchain-step">$A_\\text{рез} = \\dfrac{mv^2}{2} - \\dfrac{mv_0^2}{2}$</span>
<span class="fchain-note">Работа всех сил = изменение Eк</span>
</div>
<div class="remember-box">
<div class="remember-box-title"> Запомни!</div>
<ul>
<li>В теореме учитывается работа <b>ВСЕХ</b> сил, а не только одной.</li>
<li>$E_\\text{к}$ скалярная и всегда $\\geq 0$; импульс $\\vec{p}$ — векторный.</li>
<li>$E_\\text{к}$ пропорциональна $v^2$: скорость ×2 → $E_\\text{к}$ ×4.</li>
</ul>
</div>
<hr class="divider">
<div class="section-title"> Пример решения</div>
<div class="example-box">
<h3>Поезд разгоняется до скорости</h3>
<div class="cond">
Поезд массой $m = 600\\,\\text{т} = 6\\cdot10^5\\,\\text{кг}$ разгоняется с нуля до скорости $v = 54\\,\\text{км/ч} = 15\\,\\text{м/с}$. Найдите кинетическую энергию поезда и работу тяговых сил.
</div>
<div class="sol">
<ol class="sol-steps">
<li><span class="step-n">1</span><span>$E_\\text{к} = \\dfrac{mv^2}{2} = \\dfrac{6\\cdot10^5 \\cdot 15^2}{2} = \\dfrac{6\\cdot10^5 \\cdot 225}{2} = 6{,}75\\cdot10^7\\,\\text{Дж} = 67{,}5\\,\\text{МДж}$</span></li>
<li><span class="step-n">2</span><span>По теореме о кинетической энергии: $A = \\Delta E_\\text{к} = E_\\text{к} - 0 = 6{,}75\\cdot10^7\\,\\text{Дж}$</span></li>
</ol>
</div>
</div>
<hr class="divider">
<div class="section-title"> Контрольные вопросы</div>
<ol class="q-list">
<li>Что такое кинетическая энергия? В каких единицах она измеряется?</li>
<li>Как изменится кинетическая энергия тела при увеличении его скорости в 3 раза?</li>
<li>Что гласит теорема о кинетической энергии? Какова её связь со 2-м законом Ньютона?</li>
<li>Что такое механическая энергия? Из каких частей она состоит?</li>
<li>Может ли кинетическая энергия тела быть отрицательной?</li>
</ol>
`);
html += secNav('p34', 'p36');
html += readButton('p35');
box.innerHTML = html;
renderMath(box);
wireReadBtn('p35');
// === Задачи §35 — task panel (auto-injected from monolith) ===
const tasksBlock = document.createElement('div');
tasksBlock.className = 'wg';
tasksBlock.style.marginTop = '20px';
tasksBlock.innerHTML = '<div class="wg-header"><span class="wg-badge">Задачи</span><div class="wg-title">Тренажёр §35</div></div>' + `<div id="ptab-p35" style="display:none">
<div class="score-bar">
<div class="chip chip-ok">&nbsp;<span id="okp35">0</span></div>
<div class="chip chip-tot"><span id="curp35">0</span>&nbsp;/&nbsp;<span id="maxp35">8</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p35')" style="padding:6px 13px;font-size:.74rem"> Заново</button>
</div>
<div class="prog-wrap"><div class="prog-fill" id="progp35" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp35"></div>
<div id="taskAreap35"></div>
<div class="feedback" id="fbp35"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp35" onclick="nextTask('p35')" style="display:none"> Следующая</button>
</div>
<div class="summary" id="sump35">
<h2>§35 — готово!</h2>
<div class="big-score" id="sumScorep35"></div>
<div class="sum-grade" id="sumGradep35"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p35')"> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('p36')">→ §36</button>
</div>
</div>
</div>`;
box.appendChild(tasksBlock);
// Auto-render first task
setTimeout(() => {
try { if (typeof goToTask === 'function') goToTask('p35', 0); }
catch(e) { console.warn('p35 goToTask:', e.message); }
}, 80);
}
function build_p36(){
const box = document.getElementById('p36-body');
let html = '';
html += makeCard('theory', "Закон сохранения энергии", "§36", `
<div class="para-hero ph-36">
<div class="ph-label">§36 · Физика 9 кл</div>
<h2>Закон сохранения энергии</h2>
<div class="ph-formula">$E_\\text{мех} = \\text{const}$</div>
<div class="ph-desc">В замкнутой системе без трения полная механическая энергия не изменяется.<br>Кинетическая и потенциальная энергии непрерывно переходят друг в друга.</div>
<div class="ph-tags">
<span class="ph-tag"> Eк ↔ Eп</span>
<span class="ph-tag"> без трения: Eмех = const</span>
<span class="ph-tag"> с трением: ΔEмех = Aвнеш</span>
</div>
</div>
<div class="section-title"> §36. Закон сохранения механической энергии</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>ЗСЭ — замкнутая система (без трения)</h3>
<div class="main-f">$E_\\text{мех} = \\text{const}$</div>
<p>$E_{\\text{к}1} + E_{\\text{п}1} = E_{\\text{к}2} + E_{\\text{п}2}$</p>
<p style="margin-top:5px;font-size:.79rem">Условие: <b>только консервативные силы</b> (тяжесть и упругость).</p>
</div>
<div class="fcard">
<h3>ЗСЭ с трением</h3>
<div class="main-f">$\\Delta E_\\text{мех} = A_\\text{внеш}$</div>
<p>Изменение мех. энергии равно работе <b>внешних (диссипативных) сил</b>.</p>
<p style="margin-top:5px;font-size:.79rem">$A_\\text{тр} < 0$ → $E_\\text{мех}$ уменьшается → энергия уходит в тепло.</p>
</div>
<div class="fcard">
<h3>Закон сохранения полной энергии</h3>
<div class="main-f">$E_\\text{полн} = \\text{const}$</div>
<p>$E_\\text{полн} = E_\\text{мех} + E_\\text{внутр}$</p>
<p style="margin-top:5px;font-size:.79rem">Полная энергия сохраняется <b>всегда</b>, в любой системе.</p>
</div>
<div class="fcard">
<h3>Практические следствия</h3>
<div class="main-f" style="font-size:.9rem">$v = \\sqrt{2gh}$</div>
<p>Скорость тела, упавшего с высоты $h$ (начальная скорость = 0, без трения).</p>
<p style="margin-top:5px;font-size:.79rem">Из: $mgh = \\dfrac{mv^2}{2}$</p>
</div>
</div>
<!-- ── АНИМАЦИЯ: МАЯТНИК ── -->
<div class="idiag">
<h3> Маятник: превращение Eк ↔ Eп</h3>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start">
<div>
<svg id="svgPend36" width="100%" viewBox="0 0 200 220" style="display:block">
<!-- Потолок -->
<rect x="0" y="0" width="200" height="14" fill="#94a3b8" rx="2"/>
<rect x="93" y="0" width="14" height="14" fill="#64748b"/>
<!-- Нить (динамическая) -->
<line id="pend-rope" x1="100" y1="14" x2="100" y2="165" stroke="#64748b" stroke-width="2.5"/>
<!-- Шар -->
<circle id="pend-ball" cx="100" cy="165" r="15" fill="#ddd6fe" stroke="#6d28d9" stroke-width="2.5"/>
<!-- Уровень равновесия (пунктир) -->
<line x1="10" y1="165" x2="190" y2="165" stroke="#94a3b8" stroke-width="1" stroke-dasharray="4,3"/>
<text x="150" y="160" font-size="8" fill="#94a3b8" font-family="Inter">h = 0</text>
<!-- Высота h -->
<line id="pend-hline" x1="160" y1="165" x2="160" y2="165" stroke="#0f766e" stroke-width="2" stroke-dasharray="3,2"/>
<text id="pend-hlbl" x="165" y="165" font-size="9" fill="#0f766e" font-family="Inter" font-weight="700"></text>
<!-- Скорость -->
<line id="pend-vline" x1="100" y1="165" x2="100" y2="165" stroke="#6d28d9" stroke-width="2.5"/>
<polygon id="pend-varr" points="100,165 96,165 98,165" fill="#6d28d9"/>
<!-- Метки Eк и Eп -->
<text id="pend-ek" x="6" y="200" font-size="9" fill="#6d28d9" font-family="Inter" font-weight="700"></text>
<text id="pend-ep" x="6" y="213" font-size="9" fill="#0f766e" font-family="Inter" font-weight="700"></text>
</svg>
<button class="btn btn-ghost" id="pendBtn36" onclick="togglePend36()" style="width:100%;margin-top:6px;font-size:.78rem">
Запустить
</button>
</div>
<div style="padding-top:10px">
<div style="font-size:.83rem;font-weight:600;margin-bottom:10px">Энергия в точках:</div>
<!-- Шкала Eк -->
<div style="font-size:.78rem;color:var(--muted);margin-bottom:4px">Eк (кинетическая)</div>
<div style="background:rgba(109,40,217,.1);border-radius:8px;height:16px;overflow:hidden;margin-bottom:10px">
<div id="bar-ek36" style="height:100%;background:linear-gradient(90deg,#6d28d9,#8b5cf6);border-radius:8px;transition:width .1s;width:0%"></div>
</div>
<!-- Шкала Eп -->
<div style="font-size:.78rem;color:var(--muted);margin-bottom:4px">Eп (потенциальная)</div>
<div style="background:rgba(15,118,110,.1);border-radius:8px;height:16px;overflow:hidden;margin-bottom:14px">
<div id="bar-ep36" style="height:100%;background:linear-gradient(90deg,#0f766e,#2dd4bf);border-radius:8px;transition:width .1s;width:100%"></div>
</div>
<!-- Итог -->
<div class="idiag-result" id="sum-e36" style="font-size:.8rem">Eмех = const</div>
<div class="student-box" style="margin-top:10px">
<div class="student-box-title" style="font-size:.8rem"> Наблюдение</div>
<p style="font-size:.78rem">В высшей точке: <b>Eп max, Eк = 0</b></p>
<p style="font-size:.78rem">В нижней точке: <b>Eк max, Eп = 0</b></p>
<p style="font-size:.78rem">Сумма Eк + Eп = const всегда!</p>
</div>
</div>
</div>
</div>
<!-- ── ПРИМЕР С ТРЕНИЕМ ── -->
<div class="section-title"> Закон сохранения с трением</div>
<div class="def-box" style="border-left-color:#ef4444">
При наличии <b>сил трения</b> механическая энергия убывает — переходит во внутреннюю (тепловую) энергию. Но <b>полная</b> энергия системы по-прежнему сохраняется: <span style="font-size:.95em">$E_\\text{полн} = E_\\text{мех} + E_\\text{внутр} = \\text{const}$</span>.
</div>
<div class="fchain">
<span class="fchain-step">$E_{\\text{мех}1}$</span>
<span class="fchain-arrow">+</span>
<span class="fchain-step">$A_\\text{тр}$</span>
<span class="fchain-arrow">=</span>
<span class="fchain-step">$E_{\\text{мех}2}$</span>
<span class="fchain-note">$A_\\text{тр} < 0$ — трение уменьшает Eмех</span>
</div>
<div class="remember-box">
<div class="remember-box-title"> Запомни!</div>
<ul>
<li>Без трения: $E_\\text{к} + E_\\text{п} = \\text{const}$ — можно писать равенство в двух точках.</li>
<li>С трением: $\\Delta E_\\text{мех} = A_\\text{тр}$ — часть энергии ушла в теплоту.</li>
<li>Полная энергия $E_\\text{полн}$ сохраняется <b>всегда</b>.</li>
</ul>
</div>
<hr class="divider">
<div class="section-title"> Пример решения</div>
<div class="example-box">
<h3>Шарик бросают вертикально вверх</h3>
<div class="cond">
Шарик массой $m = 0{,}5\\,\\text{кг}$ бросают вертикально вверх с начальной скоростью $v_0 = 20\\,\\text{м/с}$. $g = 10\\,\\text{м/с}^2$. Нет трения. Найдите максимальную высоту подъёма.
</div>
<div class="sol">
<ol class="sol-steps">
<li><span class="step-n">1</span><span>В высшей точке скорость = 0: $E_{\\text{к}2} = 0$. Нулевой уровень — точка бросания: $E_{\\text{п}1} = 0$.</span></li>
<li><span class="step-n">2</span><span>По ЗСЭ: $E_{\\text{к}1} + E_{\\text{п}1} = E_{\\text{к}2} + E_{\\text{п}2}$<br>
$\\dfrac{mv_0^2}{2} + 0 = 0 + mgh_{\\max}$</span></li>
<li><span class="step-n">3</span><span>$h_{\\max} = \\dfrac{v_0^2}{2g} = \\dfrac{400}{20} = 20\\,\\text{м}$</span></li>
</ol>
</div>
</div>
<hr class="divider">
<div class="section-title"> Контрольные вопросы</div>
<ol class="q-list">
<li>При каком условии сохраняется механическая энергия системы тел?</li>
<li>Что происходит с механической энергией при наличии сил трения?</li>
<li>Как связаны кинетическая и потенциальная энергия тела при его падении?</li>
<li>Куда «исчезает» механическая энергия при торможении автомобиля?</li>
<li>Чем отличается механическая энергия от полной энергии системы?</li>
</ol>
`);
html += secNav('p35', 'final4');
html += readButton('p36');
box.innerHTML = html;
renderMath(box);
wireReadBtn('p36');
// === Задачи §36 — task panel (auto-injected from monolith) ===
const tasksBlock = document.createElement('div');
tasksBlock.className = 'wg';
tasksBlock.style.marginTop = '20px';
tasksBlock.innerHTML = '<div class="wg-header"><span class="wg-badge">Задачи</span><div class="wg-title">Тренажёр §36</div></div>' + `<div id="ptab-p36" style="display:none">
<div class="score-bar">
<div class="chip chip-ok">&nbsp;<span id="okp36">0</span></div>
<div class="chip chip-tot"><span id="curp36">0</span>&nbsp;/&nbsp;<span id="maxp36">8</span></div>
<button class="btn btn-ghost" onclick="resetTasks('p36')" style="padding:6px 13px;font-size:.74rem"> Заново</button>
</div>
<div class="prog-wrap"><div class="prog-fill" id="progp36" style="width:0%"></div></div>
<div class="nav-dots" id="navDotsp36"></div>
<div id="taskAreap36"></div>
<div class="feedback" id="fbp36"></div>
<div style="display:flex;gap:10px;margin-top:10px;justify-content:flex-end">
<button class="btn btn-next" id="nextBtnp36" onclick="nextTask('p36')" style="display:none"> Следующая</button>
</div>
<div class="summary" id="sump36">
<h2>§36 — готово!</h2>
<div class="big-score" id="sumScorep36"></div>
<div class="sum-grade" id="sumGradep36"></div>
<div class="sum-btns">
<button class="btn btn-pri" onclick="resetTasks('p36')"> Ещё раз</button>
<button class="btn btn-ghost" onclick="setParaTab('hard')">→ Сложные</button>
</div>
</div>
</div>`;
box.appendChild(tasksBlock);
// Auto-render first task
setTimeout(() => {
try { if (typeof goToTask === 'function') goToTask('p36', 0); }
catch(e) { console.warn('p36 goToTask:', e.message); }
}, 80);
}
function build_final4(){
const box = document.getElementById('final4-body');
let html = '';
html += makeCard('theory', "Финал главы 4", "★", `
<div class="formula-grid" style="margin-bottom:20px">
<div class="fcard highlight"><h3>Импульс</h3>
<div class="main-f">$\\vec{p} = m\\vec{v}$</div>
<p>ЗСИ: $\\sum\\vec{p}_{\\text{до}} = \\sum\\vec{p}_{\\text{после}}$</p>
</div>
<div class="fcard"><h3>Работа · мощность</h3>
<div class="main-f">$A = F\\Delta r\\cos\\alpha$</div>
<p>$P = A/\\Delta t$ · $E_к = mv^2/2$ · $E_п = mgh$</p>
</div>
<div class="fcard"><h3>ЗСЭ</h3>
<div class="main-f">$E_к + E_п = \\text{const}$</div>
<p>В замкнутой консерв. сист. полная мех. энергия сохраняется</p>
</div>
</div>
<div class="section-title"><svg class="ic" viewBox="0 0 24 24" style="width:18px;height:18px;display:inline-block;vertical-align:-3px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg> Интегрированные задачи</div>
<div class="task-card">
<div class="task-num">Задача 1</div>
<div class="task-text">Тележка массой $m_1 = 3$ кг движется со скоростью $v_1 = 4$ м/с и сталкивается с покоящейся тележкой массой $m_2 = 1$ кг. После сцепления они движутся вместе. Найдите их общую скорость.</div>
<div class="task-hint">ЗСИ: $m_1 v_1 = (m_1 + m_2) v$, отсюда $v = m_1 v_1 / (m_1 + m_2)$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin4-q1" step="any"><span class="unit-lbl">м/с</span>
<button class="btn btn-pri" onclick="checkNum('fin4-q1', 3, 'м/с', 0.05)">Проверить</button></div>
<div class="feedback" id="fb-fin4-q1"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 2</div>
<div class="task-text">Тело массой $m = 2$ кг падает с высоты $h = 5$ м без начальной скорости. Найдите кинетическую энергию тела в момент удара о землю (сопротивлением воздуха пренебречь). $g = 10$ м/с².</div>
<div class="task-hint">ЗСЭ: вся потенциальная энергия переходит в кинетическую. $E_к = mgh$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin4-q2" step="any"><span class="unit-lbl">Дж</span>
<button class="btn btn-pri" onclick="checkNum('fin4-q2', 100, 'Дж', 1)">Проверить</button></div>
<div class="feedback" id="fb-fin4-q2"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 3</div>
<div class="task-text">Подъёмный кран поднимает груз массой $m = 500$ кг на высоту $h = 12$ м за $t = 30$ с. Найдите среднюю мощность крана. $g = 10$ м/с².</div>
<div class="task-hint">$A = mgh$, $P = A/t$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin4-q3" step="any"><span class="unit-lbl">Вт</span>
<button class="btn btn-pri" onclick="checkNum('fin4-q3', 2000, 'Вт', 10)">Проверить</button></div>
<div class="feedback" id="fb-fin4-q3"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 4</div>
<div class="task-text">Пуля массой $m = 10$ г летит со скоростью $v = 400$ м/с. Найдите модуль её импульса.</div>
<div class="task-hint">$p = mv$. Не забудьте перевести массу в кг.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin4-q4" step="any"><span class="unit-lbl">кг·м/с</span>
<button class="btn btn-pri" onclick="checkNum('fin4-q4', 4, 'кг·м/с', 0.05)">Проверить</button></div>
<div class="feedback" id="fb-fin4-q4"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 5 (повышенный уровень)</div>
<div class="task-text">Камень бросают вертикально вверх со скоростью $v_0 = 20$ м/с. На какой высоте $h$ кинетическая энергия камня станет в 3 раза меньше начальной? $g = 10$ м/с².</div>
<div class="task-hint">ЗСЭ: $\\dfrac{mv_0^2}{2} = \\dfrac{mv^2}{2} + mgh$. По условию $\\dfrac{mv^2}{2} = \\dfrac{1}{3}\\dfrac{mv_0^2}{2}$. Отсюда $mgh = \\dfrac{2}{3}\\dfrac{mv_0^2}{2}$, т. е. $h = \\dfrac{v_0^2}{3g}$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin4-q5" step="any"><span class="unit-lbl">м</span>
<button class="btn btn-pri" onclick="checkNum('fin4-q5', 13.3, 'м', 0.3)">Проверить</button></div>
<div class="feedback" id="fb-fin4-q5"></div>
</div>
`);
html += secNav('p36', null);
html += readButton('final4');
box.innerHTML = html;
renderMath(box);
wireReadBtn('final4');
}
/* ===== Search ===== */
const SEARCH_INDEX = (function(){
const arr=[];
PARAS.forEach(p=>arr.push({kind: p.id.startsWith('lr')?'Лабораторная':(p.final?'Финал':'Параграф'),title:p.num+' '+p.name,desc:p.sub||'',sec:p.id}));
return arr;
})();
function initSearch(){
const modal=document.getElementById('search-modal'),inp=document.getElementById('search-input'),out=document.getElementById('search-results'),btn=document.getElementById('search-btn');
if(!modal||!inp||!out) return;
let cur=0,rows=[];
function score(q,it){ const t=(it.title+' '+it.desc).toLowerCase(); if(t.includes(q)) return 100+(it.title.toLowerCase().startsWith(q)?50:0); let s=0; q.split(/\s+/).forEach(w=>{if(w&&t.includes(w))s+=10;}); return s; }
function rank(q){ q=q.trim().toLowerCase(); if(!q) return SEARCH_INDEX.slice(0,12); return SEARCH_INDEX.map(it=>({it,s:score(q,it)})).filter(x=>x.s>0).sort((a,b)=>b.s-a.s).slice(0,20).map(x=>x.it); }
function render(){ cur=0; if(!rows.length){out.innerHTML='<div class="search-empty">Ничего не найдено</div>';return;} out.innerHTML=rows.map((r,i)=>'<button class="search-row'+(i===0?' active':'')+'" data-i="'+i+'"><div class="sr-kind">'+r.kind+'</div><div class="sr-title">'+r.title+'</div>'+(r.desc?'<div class="sr-desc">'+(r.desc.length>90?r.desc.slice(0,90)+'…':r.desc)+'</div>':'')+'</button>').join(''); out.querySelectorAll('.search-row').forEach(b=>b.addEventListener('click',()=>{cur=+b.dataset.i;pick();})); }
function pick(){ const r=rows[cur]; if(!r) return; close(); goTo(r.sec); }
function move(d){ const items=out.querySelectorAll('.search-row'); if(!items.length) return; items[cur]&&items[cur].classList.remove('active'); cur=(cur+d+items.length)%items.length; items[cur].classList.add('active'); items[cur].scrollIntoView({block:'nearest'}); }
function open(){ modal.classList.add('show'); inp.value=''; rows=rank(''); render(); setTimeout(()=>inp.focus(),50); }
function close(){ modal.classList.remove('show'); }
btn&&btn.addEventListener('click',open);
modal.addEventListener('click',e=>{if(e.target===modal)close();});
inp.addEventListener('input',()=>{rows=rank(inp.value);render();});
inp.addEventListener('keydown',e=>{ if(e.key==='ArrowDown'){e.preventDefault();move(1);}else if(e.key==='ArrowUp'){e.preventDefault();move(-1);}else if(e.key==='Enter'){e.preventDefault();pick();}else if(e.key==='Escape'){e.preventDefault();close();} });
document.addEventListener('keydown',e=>{ if((e.ctrlKey||e.metaKey)&&(e.key==='k'||e.key==='K')){ e.preventDefault(); if(modal.classList.contains('show')) close(); else open(); } });
}
function initSidebarToggle(){
const side=document.getElementById('col-side'),back=document.getElementById('col-side-backdrop'),btn=document.getElementById('sidebar-btn');
if(!side||!btn) return;
function open(){ side.classList.add('open'); back.classList.add('show'); }
function close(){ side.classList.remove('open'); back.classList.remove('show'); }
btn.addEventListener('click',()=>{ if(side.classList.contains('open')) close(); else open(); });
back.addEventListener('click',close);
document.addEventListener('keydown',e=>{ if(e.key==='Escape') close(); });
}
function init(){
loadProgress(); initTheme(); initSidebarToggle(); initSearch();
buildParaSelector(); refreshProgressUI(); loadServerReadState(); goTo(PARAS[0].id);
setTimeout(()=>achievement('start'), 600);
if(window.LS&&window.LS.xp){
window.LS.xp.load().then(function(s){ if(s&&s.xp>STATE.xp){ STATE.xp=s.xp; STATE.level=calcLevel(STATE.xp); saveProgress(); refreshProgressUI(); if(STATE.current) buildSidebar(STATE.current); } });
}
}
document.addEventListener('DOMContentLoaded', init);
</script>
</body>
</html>