Files
Learn_System/frontend/textbooks/physics_9_ch3.html
T
Maxim Dolgolyov c34fd27c6a feat(phys9 ch): добавлен блок задач параграфа из legacy POOLS
Раньше в монолите physics_9.html на каждый § был блок задач
(navDots, taskArea, fb, sum, progress-bar и chip-ok), но в новых
ch-страницах physics_9_ch{1..5}.html этого не было.

Изменения:

1. В каждой ch1..ch5.html добавлен hook поверх ensureBuilt:
   - Функция _makeTaskBlock(sec) генерирует HTML контейнеров
     legacy-tasks (#taskArea<sec>, #navDots<sec>, #fb<sec>, #sum<sec>,
     #prog<sec>, #ok<sec>, #cur<sec>, #max<sec>, кнопка «Заново»,
     кнопка «Следующая»).
   - _injectTasks(id) добавляет блок в #<id>-body если есть
     window.POOLS[id], и вызывает window.renderTask(id) +
     window.renderNav(id) для рендера первой задачи.
   - ensureBuilt обёрнут так, чтобы вызывать _injectTasks
     после оригинального билда.

2. В phys9_legacy.js добавлен экспорт POOLS и STATE в window
   (раньше они были скрыты внутри IIFE).

Стили блока задач используют CSS-переменные секции (var(--sec-acc, ...))
и работают с любой темой главы.

Теперь по каждому §1-§36 показывается соответствующий пул задач
(TASKS_P1..P36).

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

1638 lines
122 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="ru">
<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 · Глава 3 · «Основы статики»</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">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.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_legacy.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:#7c3aed; --pri2:#6d28d9; --pri-soft:#ede9fe;
--acc:#a78bfa; --acc2:#7c3aed; --acc-soft:#ede9fe;
--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,#3b0764 0%,#7c3aed 55%,#a78bfa 100%);color:#fff;padding:46px 22px 30px;overflow:hidden;border-bottom:2px solid rgba(255,255,255,.2);min-height:130px}
.hdr::before{content:'ГЛАВА 3';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:'M';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-p25"]{ --sec-acc:#7c3aed; --sec-acc-d:#6d28d9; --sec-acc-soft:#ede9fe; }
.sec[id="sec-p26"]{ --sec-acc:#7c3aed; --sec-acc-d:#6d28d9; --sec-acc-soft:#ede9fe; }
.sec[id="sec-p27"]{ --sec-acc:#7c3aed; --sec-acc-d:#6d28d9; --sec-acc-soft:#ede9fe; }
.sec[id="sec-p28"]{ --sec-acc:#7c3aed; --sec-acc-d:#6d28d9; --sec-acc-soft:#ede9fe; }
.sec[id="sec-p29"]{ --sec-acc:#7c3aed; --sec-acc-d:#6d28d9; --sec-acc-soft:#ede9fe; }
.sec[id="sec-p30"]{ --sec-acc:#7c3aed; --sec-acc-d:#6d28d9; --sec-acc-soft:#ede9fe; }
.sec[id="sec-final3"]{ --sec-acc:#7c3aed; --sec-acc-d:#6d28d9; --sec-acc-soft:#ede9fe; }
.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(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 · Глава 3</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('p25')"><svg class="ic" viewBox="0 0 24 24"><polygon points="6 4 20 12 6 20 6 4" fill="currentColor" stroke="none"/></svg> Начать § 25</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-p25" class="sec" data-watermark="M"><div class="sec-header"><span class="sec-num">§ 25</span><h2 class="sec-h">Условия равновесия тел. Момент силы</h2></div><div id="p25-body"></div></section>
<section id="sec-p26" class="sec" data-watermark="l_1F_1"><div class="sec-header"><span class="sec-num">§ 26</span><h2 class="sec-h">Простые механизмы. Рычаги. Блоки</h2></div><div id="p26-body"></div></section>
<section id="sec-p27" class="sec" data-watermark="&eta;"><div class="sec-header"><span class="sec-num">§ 27</span><h2 class="sec-h">Наклонная плоскость. «Золотое правило» механики. КПД</h2></div><div id="p27-body"></div></section>
<section id="sec-p28" class="sec" data-watermark="ЦТ"><div class="sec-header"><span class="sec-num">§ 28</span><h2 class="sec-h">Центр тяжести. Виды равновесия</h2></div><div id="p28-body"></div></section>
<section id="sec-p29" class="sec" data-watermark="F_A"><div class="sec-header"><span class="sec-num">§ 29</span><h2 class="sec-h">Закон Архимеда. Выталкивающая сила</h2></div><div id="p29-body"></div></section>
<section id="sec-p30" class="sec" data-watermark="&rho;"><div class="sec-header"><span class="sec-num">§ 30</span><h2 class="sec-h">Плавание судов. Воздухоплавание</h2></div><div id="p30-body"></div></section>
<section id="sec-final3" class="sec" data-watermark="&#9733;"><div class="sec-header"><span class="sec-num" style="background:linear-gradient(135deg,#7c3aed,#a78bfa)"></span><h2 class="sec-h">Финал главы</h2></div><div id="final3-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» · Глава 3 · «Основы статики» · 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:'p25', progress:{}, achievements:new Map(), xp:0, level:1 };
const TOTAL_PARAS = 7;
const _TB_SLUG = 'physics-9-ch3';
const PARAS = [
{ id:"p25", num:"§ 25", name:"Условия равновесия тел. Момент силы", sub:"$M = Fl$" },
{ id:"p26", num:"§ 26", name:"Простые механизмы. Рычаги. Блоки", sub:"$F_1 l_1 = F_2 l_2$" },
{ id:"p27", num:"§ 27", name:"Наклонная плоскость. «Золотое правило» механики. КПД", sub:"$\\eta = A_{пол}/A_{сов}$" },
{ id:"p28", num:"§ 28", name:"Центр тяжести. Виды равновесия", sub:"ЦТ · равновесие" },
{ id:"p29", num:"§ 29", name:"Закон Архимеда. Выталкивающая сила", sub:"$F_A = \\rho g V$" },
{ id:"p30", num:"§ 30", name:"Плавание судов. Воздухоплавание", sub:"$\\rho_т \\le \\rho_ж$" },
{ id:"final3", num:'\u2605', name:'Финал главы', sub:"Итоги · боссы главы 3", 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:"Начало главы 3!",
p25_done:"Условия равновесия тел. Момент силы освоен!",
p26_done:"Простые механизмы. Рычаги. Блоки освоен!",
p27_done:"Наклонная плоскость. «Золотое правило» механики. КПД освоен!",
p28_done:"Центр тяжести. Виды равновесия освоен!",
p29_done:"Закон Архимеда. Выталкивающая сила освоен!",
p30_done:"Плавание судов. Воздухоплавание освоен!",
ch3_done:"Глава 3 пройдена!"
};
function loadProgress(){
try{
const s=localStorage.getItem('physics9_ch3_progress'); if(s) Object.assign(STATE.progress, JSON.parse(s));
const a=localStorage.getItem('physics9_ch3_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_ch3_progress', JSON.stringify(STATE.progress));
localStorage.setItem('physics9_ch3_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-ch3-'+(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 = { p25:()=>build_p25(), p26:()=>build_p26(), p27:()=>build_p27(), p28:()=>build_p28(), p29:()=>build_p29(), p30:()=>build_p30(), final3:()=>build_final3() };
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){} }, 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 = {
p25:{title:"Шпаргалка §25",rows:[["$M = Fl$","момент силы"],["$\\sum\\vec F = 0$ и $\\sum M = 0$",""],["Плечо","$l$ — расст. от оси до линии действия"]]},
p26:{title:"Шпаргалка §26",rows:[["Рычаг","$F_1 l_1 = F_2 l_2$"],["Неподв. блок","без выигрыша"],["Подв. блок","выигрыш в силе в 2 раза"]]},
p27:{title:"Шпаргалка §27",rows:[["Накл. пл.","выигрыш = $l/h$"],["«Золотое правило»","выигр. в силе = проигр. в пути"],["$\\eta = A_{пол}/A_{сов}$","КПД"]]},
p28:{title:"Шпаргалка §28",rows:[["ЦТ","точка прилож. силы тяжести"],["Устойч.","ЦТ при отклонении поднимается"],["Безразл.","ЦТ не меняется"]]},
p29:{title:"Шпаргалка §29",rows:[["$F_A = \\rho g V_{погр}$",""],["Вверх","направление"],["Архимед","выталкивающая сила"]]},
p30:{title:"Шпаргалка §30",rows:[["Плав.","$\\rho_т \\le \\rho_ж$"],["Ватерлиния","граница погружения"],["Воздухопл.","подъёмная сила"]]},
final3:{title:"Финал главы 3",rows:[["§§2530","теория главы 3"],["Награда","+50 XP"]]}
};
const TIPS=[
{sec:"p25",html:"Условия равновесия: $\\sum\\vec F = 0$ И $\\sum M = 0$. Момент силы $M = F \\cdot l$, где $l$ — плечо."},
{sec:"p26",html:"Рычаг в равновесии: $F_1 l_1 = F_2 l_2$. Неподвижный блок выигрыша не даёт. Подвижный — выигрыш в силе в 2 раза."},
{sec:"p27",html:"Накл. плоскость: выигрыш в силе = $l/h$. «Золотое правило»: выигрываем в силе — проигрываем в пути. КПД: $\\eta = A_{пол}/A_{сов}$."},
{sec:"p28",html:"Центр тяжести — точка приложения равнодействующей сил тяжести. Устойчивое равновесие: ЦТ при отклонении поднимается."},
{sec:"p29",html:"Закон Архимеда: $F_A = \\rho_ж g V_{погр}$. Направлен вверх. Не зависит от глубины, формы тела или плотности тела."},
{sec:"p30",html:"Условие плавания: $\\rho_т \\le \\rho_ж$. Подъёмная сила воздухоплавательного аппарата — разность веса вытесненного воздуха и веса аппарата."},
{sec:"final3",html:"Финал главы 3 — интегрированные задачи по §§25–30. В разработке (Phase 3+)."}
];
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_ch3_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_ch3_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 = {p25:'\xA725',p26:'\xA726',p27:'\xA727',p28:'\xA728',p29:'\xA729',p30:'\xA730',final3:'Финал'};
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_p25(){
const box = document.getElementById('p25-body');
let html = '';
html += makeCard('theory', "Условия равновесия тел. Момент силы", "§25", `
<div class="para-hero ph-25">
<div class="ph-label">§25 · Физика 9 кл</div>
<h2>Условия равновесия тел. Момент силы</h2>
<div class="ph-formula">$M = F \\cdot l;\\quad \\sum \\vec{F} = \\vec{0};\\quad \\sum M = 0$</div>
<div class="ph-desc">Тело в равновесии — если нет ни поступательного, ни вращательного движения. Момент силы — это «вращательный эффект» силы. Чем длиннее плечо, тем легче повернуть.</div>
<div class="ph-tags">
<span class="ph-tag"> [M] = Н·м</span>
<span class="ph-tag"> ΣM = 0</span>
<span class="ph-tag">↔ ΣF = 0</span>
</div>
</div>
<div class="section-title"> §25. Момент силы. Условия равновесия</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Момент силы</h3>
<div class="main-f">$M = F \\cdot l$</div>
<p>$F$ — сила (Н), $l$ — <b>плечо</b> (м) — перпендикуляр от оси вращения до <em>линии действия</em> силы (не до точки приложения!). Тот же болт, та же сила — но длинный ключ даёт больший момент → легче открутить. Удвоил плечо — удвоил момент при той же силе. $[M] = \\text{Н}{\\cdot}\\text{м}$.</p>
</div>
<div class="fcard">
<h3>Знак момента</h3>
<div class="main-f">$M = {+}F l$ или $M = {-}F l$</div>
<p>Чтобы условие равновесия $\\sum M = 0$ работало, моментам нужен знак. Договоримся: <b>«+»</b> — против часовой стрелки (правило буравчика: палец вверх — ладонь против часовой). <b>«−»</b> — по часовой. Один груз на качелях «крутит» в одну сторону (+), второй — в другую (−). Баланс: суммарный момент = 0.</p>
</div>
<div class="fcard">
<h3>1-е условие равновесия (поступат.)</h3>
<div class="main-f">$\\vec{F}_1 + \\vec{F}_2 + \\ldots = \\vec{0}$</div>
<p>Книга на столе: сила тяжести вниз + реакция стола вверх = 0 → покой. Люстра на потолке: тяжесть вниз + натяжение троса вверх = 0 → висит. Это условие не допускает ускорения: ни влево-вправо, ни вперёд-назад, ни вверх-вниз. Нарушишь — тело начнёт лететь.</p>
</div>
<div class="fcard">
<h3>2-е условие равновесия (вращат.)</h3>
<div class="main-f">$M_1 + M_2 + \\ldots = 0$</div>
<p>Даже если все силы уравновешены (1-е условие), тело может вращаться — если их моменты не компенсируют друг друга. Кран: трос тянет вниз слева (момент +), противовес давит вниз справа (момент −). Сумма = 0 → не вращается. Нарушь баланс моментов — кран начнёт заваливаться.</p>
</div>
</div>
<!-- Интерактивные качели -->
<div class="idiag">
<h3> Интерактив: балансирующие качели</h3>
<p style="font-size:.79rem;color:var(--muted);margin-bottom:8px">Двигай плечи — качели наклоняются! Найди баланс: $M_1 = M_2$</p>
<div class="slider-row">
<span class="slider-lbl">Плечо $l_1$ (синий, 4 кг):</span>
<input type="range" min="1" max="20" value="8" id="sl25l1" oninput="upd25()">
<span class="slider-val" id="v25l1">0.8 м</span>
</div>
<div class="slider-row">
<span class="slider-lbl">Плечо $l_2$ (оранж., 6 кг):</span>
<input type="range" min="1" max="20" value="6" id="sl25l2" oninput="upd25()">
<span class="slider-val" id="v25l2">0.6 м</span>
</div>
<div class="idiag-result" id="res25">M₁ = 32 Н·м | M₂ = 36 Н·м — наклон вправо</div>
<div class="cv-wrap" style="margin-top:8px">
<canvas id="cv25" style="height:180px"></canvas>
</div>
</div>
<!-- Жизненные примеры -->
<div class="section-title" style="margin-top:14px"> Момент силы в жизни</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon"></div><div class="li-title">Гаечный ключ</div><div class="li-desc">Длинная ручка = большое плечо → меньше силы нужно для того же момента</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Ручка двери</div><div class="li-desc">Ручка у края: $l$ велико → легко открыть. Толкать у петель: $l$ мало → очень тяжело!</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Башенный кран</div><div class="li-desc">Противовес сзади уравновешивает груз спереди: $M_1 = M_2$</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Качели</div><div class="li-desc">Тяжёлый ребёнок сидит ближе к центру, лёгкий — дальше. $F_1 l_1 = F_2 l_2$</div></div>
</div>
<div class="insight-box">
<div class="insight-title"> Почему трудно открыть дверь, толкая у петель?</div>
<p>Попробуй открыть дверь, нажав вблизи петель — почти невозможно! Плечо $l$ очень маленькое, значит момент $M = F \\cdot l$ тоже мал при той же силе.</p>
<p>Поэтому ручки всегда ставят <b>максимально далеко от петель</b> — чтобы создавать большой момент небольшой силой.</p>
</div>
<div class="insight-box">
<div class="insight-title"> Как найти плечо «косой» силы?</div>
<p>Плечо — это <b>перпендикуляр</b> из оси вращения на <b>линию действия</b> силы (не на саму стрелку). Если сила приложена под углом, плечо $l = d \\cdot \\sin\\alpha$, где $d$ — расстояние от оси до точки приложения.</p>
</div>
<div class="student-box">
<div class="student-box-title"> Как это понять?</div>
<p>Представь качели. Слева сел тяжёлый человек (60 кг × 1 м = 60 Н·м), справа лёгкий ребёнок (30 кг). Чтобы сбалансировать — ребёнок должен сесть на 2 м от оси: $30 \\cdot 2 = 60$ Н·м. Моменты равны — качели в равновесии. Это и есть условие $\\sum M = 0$.</p>
<p>Ключевая ловушка: плечо — это не расстояние до <em>точки приложения</em> силы, а перпендикуляр до <em>линии действия</em>. Если сила приложена под углом — плечо короче, чем кажется. Именно поэтому «косая» сила создаёт меньший момент, чем «прямая» та же сила на том же расстоянии.</p>
</div>
<div class="remember-box">
<div class="remember-box-title"> Запомни!</div>
<ul>
<li>Два условия равновесия: <b>ΣF = 0</b> (нет поступательного движения) и <b>ΣM = 0</b> (нет вращения).</li>
<li>Плечо — это <b>перпендикуляр</b> от оси до линии действия силы, а не до точки приложения!</li>
<li>$[M] = \\text{Н}{\\cdot}\\text{м}$ — единица момента силы.</li>
</ul>
</div>
<ol class="q-list">
<li>Что называется плечом силы? Как его найти?</li>
<li>Запиши оба условия равновесия тела.</li>
<li>Почему длинный гаечный ключ эффективнее короткого?</li>
</ol>
`);
html += secNav(null, 'p26');
html += readButton('p25');
box.innerHTML = html;
renderMath(box);
wireReadBtn('p25');
}
function build_p26(){
const box = document.getElementById('p26-body');
let html = '';
html += makeCard('theory', "Простые механизмы. Рычаги. Блоки", "§26", `
<div class="para-hero ph-26">
<div class="ph-label">§26 · Физика 9 кл</div>
<h2>Простые механизмы. Рычаги. Блоки</h2>
<div class="ph-formula">$F_1 \\cdot l_1 = F_2 \\cdot l_2;\\quad \\dfrac{F_2}{F_1} = \\dfrac{l_1}{l_2}$</div>
<div class="ph-desc">Рычаг — это «умножитель силы»: выигрываешь в силе во столько раз, во сколько одно плечо длиннее другого. Но в расстоянии ты проигрываешь ровно столько же!</div>
<div class="ph-tags">
<span class="ph-tag"> F₁l₁ = F₂l₂</span>
<span class="ph-tag"> блок меняет направление</span>
<span class="ph-tag"> выигрыш = l₁/l₂</span>
</div>
</div>
<div class="section-title"> §26. Рычаги и блоки</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Условие равновесия рычага</h3>
<div class="main-f">$F_1 \\cdot l_1 = F_2 \\cdot l_2$</div>
<p>Плечо нагрузки 0,2 м, плечо твоей силы 1 м → выигрыш = 5: тянешь с силой 100 Н, а поднимаешь груз 500 Н. Но! Твоя рука переместится в 5 раз дальше груза — работа не меняется ($F_1 \\cdot s_1 = F_2 \\cdot s_2$). Рычаг не создаёт энергию — только перераспределяет силу и расстояние.</p>
</div>
<div class="fcard">
<h3>Рычаг 1-го рода</h3>
<div class="main-f">ось между силами</div>
<p>Точка опоры — посередине, силы — по разные стороны. Качели: один толкает вниз слева, другой справа — точка опоры в центре. Ножницы: два лезвия, ось посередине. Лом под камень: камень давит вниз с одной стороны, ты тянешь вниз с другой — оба «вниз», но по разные стороны оси → противоположные моменты.</p>
</div>
<div class="fcard">
<h3>Неподвижный блок</h3>
<div class="main-f">выигрыш = 1</div>
<p>Ось блока закреплена. Верёвка меняет направление: тянешь вниз — груз идёт вверх. В силе выигрыша нет: сила нужна равная весу груза. Но удобство огромное: легче тянуть вниз (своим весом), чем поднимать вверх с напряжением мышц. Именно поэтому блок на колодце.</p>
</div>
<div class="fcard">
<h3>Подвижный блок</h3>
<div class="main-f">выигрыш = 2 (в силе)</div>
<p>Ось блока движется вместе с грузом — верёвка идёт сразу с двух сторон. Груз 100 кг = 1000 Н, а тянешь всего 500 Н — вдвое легче! Но верёвку надо вытянуть на 2 метра, чтобы груз поднялся на 1 метр. Работа та же: $500 \\cdot 2 = 1000 \\cdot 1$. «Золотое правило»: что выиграл в силе — проиграл в расстоянии.</p>
</div>
</div>
<!-- Рычаг: интерактив -->
<div class="idiag">
<h3> Интерактив: сила нужна меньше при длинном плече!</h3>
<div class="slider-row">
<span class="slider-lbl">Плечо нагрузки $l_2$:</span>
<input type="range" min="1" max="10" value="3" id="sl26l2" oninput="upd26()">
<span class="slider-val" id="v26l2">0.3 м</span>
</div>
<div class="slider-row">
<span class="slider-lbl">Плечо силы $l_1$:</span>
<input type="range" min="3" max="20" value="9" id="sl26l1" oninput="upd26()">
<span class="slider-val" id="v26l1">0.9 м</span>
</div>
<div class="idiag-result" id="res26">F = 167 Н | Выигрыш = 3.0× | Нагрузка 50 кг</div>
<div class="cv-wrap" style="margin-top:8px">
<canvas id="cv26" style="height:160px"></canvas>
</div>
<p style="font-size:.78rem;color:var(--muted);margin-top:6px">Увеличивай $l_1$ — стрелка силы уменьшается. Чем длиннее плечо, тем меньше нужно сил!</p>
</div>
<!-- Жизненные примеры -->
<div class="section-title" style="margin-top:14px"> Рычаги вокруг нас</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon"></div><div class="li-title">Ножницы</div><div class="li-desc">Рычаг 1-го рода. Длинные ручки и короткие лезвия — выигрыш в силе для резки</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Лом под камень</div><div class="li-desc">Маленькое усилие на длинном конце — огромная сила на коротком конце у камня</div></div>
<div class="life-item"><div class="li-icon">🪣</div><div class="li-title">Колодец</div><div class="li-desc">Блок на колодце меняет направление силы — тянуть вниз удобнее, чем поднимать вверх</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Строительный кран</div><div class="li-desc">Подвижные блоки дают выигрыш в силе, позволяя поднимать тонны</div></div>
</div>
<div class="insight-box">
<div class="insight-title"> «Золотое правило механики»</div>
<p>Любой механизм — рычаг, блок, наклонная плоскость — даёт выигрыш <b>либо в силе, либо в расстоянии</b>, но никогда — в работе.</p>
<p>Выиграл в силе в $n$ раз → проиграл в пути в $n$ раз. Работа: $A = F \\cdot s$ — остаётся той же.</p>
</div>
<div class="student-box">
<div class="student-box-title"> Как это понять?</div>
<p>Архимед говорил: «Дайте мне точку опоры — и я переверну Землю». Рычаг с достаточно длинным плечом может создать любую силу. Но для этого нужно двигать ручку очень далеко. Поднять Землю на 1 нанометр потребовало бы, чтобы ты перемещал свою руку на сотни световых лет.</p>
<p>Именно это и есть «золотое правило механики»: <b>выигрываешь в силе — проигрываешь в пути</b>. Работа не меняется. Поэтому вечного двигателя не бывает — любой механизм лишь перераспределяет, но не создаёт энергию.</p>
</div>
<div class="remember-box">
<div class="remember-box-title"> Запомни!</div>
<ul>
<li>Рычаг: $F_1 l_1 = F_2 l_2$ — момент сил с обеих сторон равен (равновесие).</li>
<li><b>Неподвижный</b> блок — меняет направление, выигрыш = 1.</li>
<li><b>Подвижный</b> блок — выигрыш = 2 (сила в 2 раза меньше, путь в 2 раза длиннее).</li>
</ul>
</div>
<ol class="q-list">
<li>Сформулируй условие равновесия рычага.</li>
<li>Чем отличается подвижный блок от неподвижного?</li>
<li>Как получить выигрыш в силе 4 раза с помощью блоков?</li>
</ol>
`);
html += secNav('p25', 'p27');
html += readButton('p26');
box.innerHTML = html;
renderMath(box);
wireReadBtn('p26');
}
function build_p27(){
const box = document.getElementById('p27-body');
let html = '';
html += makeCard('theory', "Наклонная плоскость. «Золотое правило» механики. КПД", "§27", `
<div class="para-hero ph-27">
<div class="ph-label">§27 · Физика 9 кл</div>
<h2>Наклонная плоскость. «Золотое правило». КПД</h2>
<div class="ph-formula">$\\dfrac{F_2}{F} = \\dfrac{h}{l};\\quad \\eta = \\dfrac{A_\\text{пол}}{A_\\text{затр}} \\cdot 100\\%$</div>
<div class="ph-desc">Наклонная плоскость уменьшает нужную силу, но удлиняет путь. КПД показывает, какую долю работы мы используем с пользой — всегда меньше 100% из-за трения.</div>
<div class="ph-tags">
<span class="ph-tag"> выигрыш = l/h</span>
<span class="ph-tag"> КПД &lt; 100%</span>
<span class="ph-tag"> золотое правило</span>
</div>
</div>
<div class="section-title"> §27. Наклонная плоскость и КПД</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Наклонная плоскость (без трения)</h3>
<div class="main-f">$F_2 = F \\cdot \\dfrac{h}{l}$</div>
<p>$F = mg$ — вес груза, $l$ — длина плоскости, $h$ — высота.</p>
<p>Выигрыш в силе: $l/h$ (во столько раз меньше нужная сила).</p>
</div>
<div class="fcard">
<h3>КПД механизма</h3>
<div class="main-f">$\\eta = \\dfrac{A_\\text{полез}}{A_\\text{затрач}} \\cdot 100\\%$</div>
<p>$A_\\text{полез} = mgh$ — работа против силы тяжести.</p>
<p>$A_\\text{затрач} = F_2 \\cdot l$ — работа приложенной силы.</p>
<p>Всегда: $\\eta < 100\\%$</p>
</div>
<div class="fcard">
<h3>«Золотое правило механики»</h3>
<div class="main-f">$A_\\text{затрач} \\geq A_\\text{полез}$</div>
<p>Ни один механизм не даёт выигрыша в работе. Выигрываешь в силе — проигрываешь в пути.</p>
<p>$F_2 \\cdot l = mg \\cdot h$ — идеально (без трения)</p>
</div>
<div class="fcard">
<h3>Силы на наклонной плоскости</h3>
<div class="main-f">$N = mg\\cos\\alpha;\\quad F_\\text{тр} = \\mu N$</div>
<p>Компонента вдоль плоскости: $mg\\sin\\alpha$ (надо преодолеть, чтобы двигаться).</p>
<p>С трением: $F_2 = mg\\sin\\alpha + \\mu mg\\cos\\alpha$</p>
</div>
</div>
<!-- Наклонная плоскость: интерактив -->
<div class="idiag">
<h3> Интерактив: угол наклона → нужная сила</h3>
<div class="slider-row">
<span class="slider-lbl">Угол $\\alpha$:</span>
<input type="range" min="5" max="70" value="20" id="sl27a" oninput="upd27()">
<span class="slider-val" id="v27a">20°</span>
</div>
<div class="slider-row">
<span class="slider-lbl">Масса $m$:</span>
<input type="range" min="5" max="50" value="20" id="sl27m" oninput="upd27()">
<span class="slider-val" id="v27m">20 кг</span>
</div>
<div class="idiag-result" id="res27">F = 68 Н (против 200 Н напрямую) | Выигрыш = 2.9×</div>
<div class="cv-wrap" style="margin-top:8px">
<canvas id="cv27" style="height:180px"></canvas>
</div>
<p style="font-size:.78rem;color:var(--muted);margin-top:6px">Меньше угол = больше выигрыш в силе. Но путь становится длиннее!</p>
</div>
<!-- КПД интерактив -->
<div class="idiag" style="margin-top:12px">
<h3> КПД: полезная и затраченная работа</h3>
<div class="slider-row">
<span class="slider-lbl">Коэфф. трения $\\mu$:</span>
<input type="range" min="0" max="40" value="15" id="sl27mu" oninput="upd27mu()">
<span class="slider-val" id="v27mu">0.15</span>
</div>
<div class="idiag-result" id="res27mu">КПД = 79% | Потери на трение: 21%</div>
<div class="cv-wrap" style="margin-top:6px">
<canvas id="cv27eff" style="height:70px"></canvas>
</div>
<p style="font-size:.78rem;color:var(--muted);margin-top:4px">↑ μ = больше трение = меньше КПД. При $\\mu = 0$ (идеальный механизм) КПД = 100%.</p>
</div>
<!-- Жизненные примеры -->
<div class="section-title" style="margin-top:14px"> Наклонная плоскость в жизни</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon"></div><div class="li-title">Пандус</div><div class="li-desc">Длинный пологий пандус = большой $l/h$ → инвалидное кресло закатить легче</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Шуруп</div><div class="li-desc">Резьба — это наклонная плоскость, «закрученная» вокруг стержня. $l/h$ очень велико</div></div>
<div class="life-item"><div class="li-icon">🪓</div><div class="li-title">Топор / клин</div><div class="li-desc">Острый клин = малый угол α → огромный выигрыш в силе при ударе</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Серпантин дорог</div><div class="li-desc">Горный серпантин — очень длинная «наклонная плоскость» с малым углом</div></div>
</div>
<div class="insight-box">
<div class="insight-title"> Почему КПД не бывает 100%?</div>
<p>Всегда есть <b>трение</b> в механизмах: блоки, подшипники, поверхности — всё это «ворует» часть работы и превращает её в тепло.</p>
<p>КПД 80-90% — хороший механизм. КПД < 50% — плохой. Задача инженеров — смазывать, полировать, выбирать материалы с малым $\\mu$.</p>
</div>
<div class="remember-box">
<div class="remember-box-title"> Запомни!</div>
<ul>
<li>Выигрыш наклонной плоскости = $l/h$ (длина/высота).</li>
<li>КПД: $\\eta = \\frac{A_\\text{пол}}{A_\\text{затр}} \\cdot 100\\% < 100\\%$ всегда (из-за трения).</li>
<li>«Золотое правило»: выигрываешь в силе в $n$ раз → проигрываешь в пути в $n$ раз.</li>
</ul>
</div>
<ol class="q-list">
<li>В чём состоит «золотое правило механики»?</li>
<li>Что такое КПД? Может ли он быть больше 100%?</li>
<li>Во сколько раз наклонная плоскость $l = 5\\,\\text{м}$, $h = 1\\,\\text{м}$ уменьшает нужную силу?</li>
</ol>
`);
html += secNav('p26', 'p28');
html += readButton('p27');
box.innerHTML = html;
renderMath(box);
wireReadBtn('p27');
}
function build_p28(){
const box = document.getElementById('p28-body');
let html = '';
html += makeCard('theory', "Центр тяжести. Виды равновесия", "§28", `
<div class="para-hero ph-28">
<div class="ph-label">§28 · Физика 9 кл</div>
<h2>Центр тяжести. Виды равновесия</h2>
<div class="ph-formula">$x_c = \\dfrac{\\sum m_i x_i}{\\sum m_i};\\quad y_c = \\dfrac{\\sum m_i y_i}{\\sum m_i}$</div>
<div class="ph-desc">Центр тяжести — точка, через которую проходит равнодействующая всех сил тяжести, действующих на тело. Устойчивость тела зависит от положения центра тяжести и площади опоры.</div>
<div class="ph-tags">
<span class="ph-tag">⬆ устойчивое: ЦТ снизу</span>
<span class="ph-tag">↕ неустойчивое: ЦТ сверху</span>
<span class="ph-tag"> безразличное: ЦТ = ось</span>
</div>
</div>
<div class="section-title"> §28. Центр тяжести. Виды равновесия</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Центр тяжести (ЦТ)</h3>
<div class="main-f">$x_c = \\dfrac{m_1 x_1 + m_2 x_2}{m_1 + m_2}$</div>
<p>Точка, в которой можно считать сосредоточенной всю массу тела при вычислении действия силы тяжести.</p>
</div>
<div class="fcard">
<h3>Устойчивое равновесие</h3>
<div class="main-f">ЦТ — <b>ниже</b> точки опоры</div>
<p>При отклонении тело возвращается в исходное положение. Пример: маятник, кресло-качалка.</p>
</div>
<div class="fcard">
<h3>Неустойчивое равновесие</h3>
<div class="main-f">ЦТ — <b>выше</b> точки опоры</div>
<p>При малейшем отклонении тело падает. Пример: карандаш на острие, пирамида вверх ногами.</p>
</div>
<div class="fcard">
<h3>Безразличное равновесие</h3>
<div class="main-f">ЦТ = ось вращения</div>
<p>При отклонении тело остаётся в новом положении. Пример: однородный шар, колесо.</p>
</div>
</div>
<div class="student-box">
<div class="student-box-title"> Как это понять?</div>
<p>Представь неваляшку. Как бы ты её ни толкнул — она возвращается. Потому что её центр тяжести <b>очень низко</b> (снизу тяжёлый груз). Это устойчивое равновесие.</p>
<p>А теперь попробуй поставить карандаш на острие. Почти невозможно — центр тяжести <b>выше точки опоры</b>. Малейшее отклонение — и он падает. Неустойчивое равновесие.</p>
<p><b>Правило устойчивости:</b> чем <b>ниже ЦТ</b> и <b>шире площадь опоры</b>, тем устойчивее тело. Поэтому у грузовика широкая колея и низкий центр масс.</p>
</div>
<!-- Интерактив: 3 вида равновесия -->
<div class="idiag">
<h3> Интерактив: виды равновесия</h3>
<div class="slider-row">
<span class="slider-lbl">Тип:</span>
<input type="range" min="0" max="2" step="1" value="0" id="sl28type" oninput="upd28()">
<span class="slider-val" id="v28type">Устойчивое</span>
</div>
<div class="slider-row">
<span class="slider-lbl">Угол отклонения:</span>
<input type="range" min="-40" max="40" value="0" id="sl28angle" oninput="upd28()">
<span class="slider-val" id="v28angle">0°</span>
</div>
<div class="cv-wrap"><canvas id="cv28" style="height:220px"></canvas></div>
<div class="idiag-result" id="res28">Устойчивое равновесие — тело вернётся!</div>
</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon"></div><div class="li-title">Башенный кран</div><div class="li-desc">Тяжёлый противовес сзади — снижает ЦТ и не даёт упасть вперёд</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Гоночный автомобиль</div><div class="li-desc">Очень низкий кузов — центр тяжести у земли для максимальной устойчивости в поворотах</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Парусник</div><div class="li-desc">Тяжёлый киль снизу — устойчивость. Без киля парусник бы перевернулся</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Гимнаст</div><div class="li-desc">Стойка на руках — неустойчивое равновесие. Мышцы постоянно корректируют ЦТ</div></div>
<div class="life-item"><div class="li-icon">🪆</div><div class="li-title">Неваляшка</div><div class="li-desc">ЦТ очень низко — устойчивое равновесие. Сколько ни толкай — встанет</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Трактор</div><div class="li-desc">Широкие гусеницы и низкий ЦТ — не перевернётся на склоне</div></div>
</div>
<div class="insight-box">
<div class="insight-title"> Пизанская башня не падает — почему?</div>
<p>Башня накренена под углом ~4°. Казалось бы — должна упасть. Но центр тяжести башни всё ещё находится <b>внутри площади опоры</b> (фундамента). Как только ЦТ выйдет за её границу — башня упадёт.</p>
<p>Реставраторы укрепляли фундамент с более высокой стороны, чтобы чуть «выпрямить» башню и вернуть ЦТ подальше от края.</p>
</div>
<div class="remember-box">
<div class="remember-box-title"> Запомни!</div>
<ul>
<li>ЦТ ниже опоры → устойчивое равновесие.</li>
<li>ЦТ выше опоры → неустойчивое.</li>
<li>ЦТ = ось → безразличное.</li>
<li>Тело устойчиво, если вертикаль через ЦТ проходит <b>внутри площади опоры</b>.</li>
</ul>
</div>
<ol class="q-list">
<li>Почему гоночные автомобили делают с низким центром тяжести?</li>
<li>Назовите пример устойчивого, неустойчивого и безразличного равновесия из жизни.</li>
<li>При каком условии тело, стоящее на наклонной поверхности, не опрокидывается?</li>
</ol>
`);
html += secNav('p27', 'p29');
html += readButton('p28');
box.innerHTML = html;
renderMath(box);
wireReadBtn('p28');
}
function build_p29(){
const box = document.getElementById('p29-body');
let html = '';
html += makeCard('theory', "Закон Архимеда. Выталкивающая сила", "§29", `
<div class="para-hero ph-29">
<div class="ph-label">§29 · Физика 9 кл</div>
<h2>Закон Архимеда. Плавание тел</h2>
<div class="ph-formula">$F_\\text{выт} = \\rho_\\text{ж} g V_\\text{погр}$</div>
<div class="ph-desc">На тело, погружённое в жидкость или газ, действует выталкивающая сила, равная весу вытесненной жидкости. Тело плавает, если его средняя плотность меньше плотности жидкости.</div>
<div class="ph-tags">
<span class="ph-tag"> [F_выт] = Н</span>
<span class="ph-tag">⬆ плавает: ρ_тела &lt; ρ_жидк</span>
<span class="ph-tag">⬇ тонет: ρ_тела &gt; ρ_жидк</span>
</div>
</div>
<div class="section-title"> §29. Закон Архимеда. Плавание тел</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Закон Архимеда</h3>
<div class="main-f">$F_\\text{выт} = \\rho_\\text{ж} g V_\\text{погр}$</div>
<p>$\\rho_\\text{ж}$ — плотность жидкости, $V_\\text{погр}$ — объём погружённой части тела. Направление — вертикально вверх.</p>
</div>
<div class="fcard">
<h3>Условие плавания</h3>
<div class="main-f">$F_\\text{выт} = mg \\Leftrightarrow \\rho_\\text{тела} \\leq \\rho_\\text{жидк}$</div>
<p>Тело плавает, когда выталкивающая сила уравновешивает силу тяжести. При этом часть тела может быть над водой.</p>
</div>
<div class="fcard">
<h3>Доля погружённой части</h3>
<div class="main-f">$\\dfrac{V_\\text{погр}}{V_\\text{тела}} = \\dfrac{\\rho_\\text{тела}}{\\rho_\\text{жидк}}$</div>
<p>Лёд ($\\rho = 900\\,\\text{кг/м}^3$) в воде ($\\rho = 1000$) погружён на $900/1000 = 90\\%$. Над водой торчит лишь 10%.</p>
</div>
<div class="fcard">
<h3>Тонет или плывёт?</h3>
<div class="main-f">$\\rho_\\text{т} < \\rho_\\text{ж}$ — плавает</div>
<div class="main-f">$\\rho_\\text{т} > \\rho_\\text{ж}$ — тонет</div>
<div class="main-f">$\\rho_\\text{т} = \\rho_\\text{ж}$ — нейтральный подъём</div>
</div>
</div>
<div class="student-box">
<div class="student-box-title"> Как это понять?</div>
<p>Почему деревянный кубик плавает, а стальной тонет? Дерево легче воды ($\\rho_\\text{дерева} \\approx 600\\,\\text{кг/м}^3 < 1000$). Стальной кубик тяжелее воды ($\\rho_\\text{ст} \\approx 7800 > 1000$).</p>
<p>Но стальной <b>корабль</b> плавает! Потому что внутри много воздуха. <b>Средняя</b> плотность корабля (металл + воздух внутри) меньше воды.</p>
<p>Секрет Архимеда: не важно, из чего тело. Важно, <b>сколько воды оно вытесняет</b>. Выталкивающая сила = вес этой воды.</p>
</div>
<!-- Интерактив: Архимед -->
<div class="idiag">
<h3> Интерактив: тело в жидкости</h3>
<div class="slider-row">
<span class="slider-lbl">ρ тела, кг/м³:</span>
<input type="range" min="200" max="2000" value="700" id="sl29rho" oninput="upd29()">
<span class="slider-val" id="v29rho">700 кг/м³</span>
</div>
<div class="slider-row">
<span class="slider-lbl">V тела, дм³:</span>
<input type="range" min="1" max="20" value="5" id="sl29v" oninput="upd29()">
<span class="slider-val" id="v29v">5 дм³</span>
</div>
<div class="cv-wrap"><canvas id="cv29" style="height:200px"></canvas></div>
<div class="idiag-result" id="res29">F_выт = — Н | F_т = — Н</div>
</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon"></div><div class="li-title">Айсберг</div><div class="li-desc">90% под водой, 10% видно. ρ льда = 900, ρ воды = 1000</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Рыбий пузырь</div><div class="li-desc">Рыба сжимает/расширяет пузырь, меняя свою среднюю плотность</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Корабль</div><div class="li-desc">Сталь + воздух. Средняя плотность меньше воды. Грузишь — погружается глубже</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Воздушный шар</div><div class="li-desc">Горячий воздух легче холодного — выталкивающая сила в воздухе!</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Мёртвое море</div><div class="li-desc">Солёность 30% — ρ = 1230 кг/м³. Человек всплывает сам</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Ареометр</div><div class="li-desc">Прибор для измерения плотности: плавает, по шкале читаешь ρ жидкости</div></div>
</div>
<div class="insight-box">
<div class="insight-title"> Как подводная лодка ныряет и всплывает?</div>
<p>У подводной лодки есть балластные цистерны. Чтобы нырнуть — заполняют водой (средняя плотность растёт, $\\rho_\\text{ср} > \\rho_\\text{воды}$, лодка тонет). Чтобы всплыть — продувают сжатым воздухом (выгоняют воду, $\\rho_\\text{ср} < \\rho_\\text{воды}$, лодка всплывает).</p>
<p>Это прямое применение закона Архимеда и условия плавания!</p>
</div>
<div class="remember-box">
<div class="remember-box-title"> Запомни!</div>
<ul>
<li>$F_\\text{выт} = \\rho_\\text{ж} g V_\\text{погр}$ — зависит от плотности <b>жидкости</b> и объёма <b>погружённой части</b>.</li>
<li>Тело плавает при $\\rho_\\text{тела} \\leq \\rho_\\text{жидкости}$.</li>
<li>Лёд в воде: 10% над водой — потому что $\\rho_\\text{льда}/\\rho_\\text{воды} = 0{,}9$.</li>
<li>$F_\\text{выт}$ не зависит от формы тела и глубины погружения (только от $V_\\text{погр}$).</li>
</ul>
</div>
<ol class="q-list">
<li>От чего зависит архимедова сила? Как изменится $F_\\text{выт}$, если тело перенести из воды в ртуть?</li>
<li>Почему стальной корабль плавает, а стальной гвоздь тонет?</li>
<li>Определите, потонет или всплывёт тело плотностью $1200\\,\\text{кг/м}^3$ в воде.</li>
</ol>
`);
html += secNav('p28', 'p30');
html += readButton('p29');
box.innerHTML = html;
renderMath(box);
wireReadBtn('p29');
}
function build_p30(){
const box = document.getElementById('p30-body');
let html = '';
html += makeCard('theory', "Плавание судов. Воздухоплавание", "§30", `
<div class="para-hero ph-30">
<div class="ph-label">§30 · Физика 9 кл</div>
<h2>Плавание судов. Воздухоплавание</h2>
<div class="ph-formula">$\\langle\\rho\\rangle = \\dfrac{m_\\text{судна}}{V_\\text{судна}} < \\rho_\\text{воды}$</div>
<div class="ph-desc">Корабль плавает, потому что его средняя плотность (вместе с воздухом внутри) меньше воды. Воздушный шар летит, потому что вытесненный им воздух тяжелее шара с газом.</div>
<div class="ph-tags">
<span class="ph-tag"> грузоподъёмность судна</span>
<span class="ph-tag"> F_выт воздуха</span>
<span class="ph-tag"> осадка корабля</span>
</div>
</div>
<div class="section-title"> §30. Плавание судов. Воздухоплавание</div>
<div class="formula-grid">
<div class="fcard highlight">
<h3>Условие плавания судна</h3>
<div class="main-f">$\\langle\\rho\\rangle_\\text{судна} = \\dfrac{m_\\text{т} + m_\\text{груза}}{V_\\text{корпуса}} < \\rho_\\text{воды}$</div>
<p>Средняя плотность = общая масса / полный объём корпуса. Пока $\\langle\\rho\\rangle < 1000\\,\\text{кг/м}^3$ — судно плавает.</p>
</div>
<div class="fcard">
<h3>Грузоподъёмность судна</h3>
<div class="main-f">$m_\\text{груз}^{max} = \\rho_\\text{ж} V_\\text{корп} - m_\\text{судна}$</div>
<p>Максимальный груз — когда весь объём корпуса под водой. Ватерлиния не должна превышать борт.</p>
</div>
<div class="fcard">
<h3>Воздушный шар</h3>
<div class="main-f">$F_\\text{подъём} = (\\rho_\\text{возд} - \\rho_\\text{газа})gV - mg_\\text{обол}$</div>
<p>Шар поднимается, если подъёмная сила превышает вес оболочки и корзины. Горячий воздух ($\\rho \\approx 0{,}9\\,\\text{кг/м}^3$) легче холодного ($\\rho = 1{,}29$).</p>
</div>
<div class="fcard">
<h3>Линия Плимсоля</h3>
<div class="main-f">метка на борту судна</div>
<p>Обязательная метка загрузки. Показывает максимально допустимую осадку в разных морях (солёная вода тяжелее пресной → корабль сидит выше).</p>
</div>
</div>
<div class="student-box">
<div class="student-box-title"> Как это понять?</div>
<p>Возьми пустую жестяную банку. Она плавает — металл + воздух внутри = маленькая средняя плотность. Теперь наполни её водой — банка тонет.</p>
<p>Корабль работает так же. Огромный стальной корпус — как банка, только очень большая. Внутри воздух, каюты, машины. <b>Средняя</b> плотность корабля с воздухом — меньше воды. Загружаешь груз — осадка увеличивается.</p>
<p>Воздушный шар — такой же принцип, только в воздухе. Лёгкий газ (водород, гелий, горячий воздух) вытесняет тяжёлый атмосферный воздух. Разница в весе и есть подъёмная сила.</p>
</div>
<!-- Интерактив: корабль с грузом -->
<div class="idiag">
<h3> Интерактив: корабль</h3>
<div class="slider-row">
<span class="slider-lbl">Масса судна, т:</span>
<input type="range" min="5" max="50" value="20" id="sl30ms" oninput="upd30()">
<span class="slider-val" id="v30ms">20 т</span>
</div>
<div class="slider-row">
<span class="slider-lbl">Груз, т:</span>
<input type="range" min="0" max="30" value="5" id="sl30mg" oninput="upd30()">
<span class="slider-val" id="v30mg">5 т</span>
</div>
<div class="slider-row">
<span class="slider-lbl">Объём корпуса, м³:</span>
<input type="range" min="10" max="100" value="40" id="sl30v" oninput="upd30()">
<span class="slider-val" id="v30v">40 м³</span>
</div>
<div class="cv-wrap"><canvas id="cv30" style="height:200px"></canvas></div>
<div class="idiag-result" id="res30">Осадка: — | ρ_ср = — кг/м³</div>
</div>
<div class="life-grid">
<div class="life-item"><div class="li-icon"></div><div class="li-title">Танкер</div><div class="li-desc">Гружёный — глубоко сидит. Пустой — высоко. Средняя плотность изменилась</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Монгольфьер</div><div class="li-desc">Первый воздушный шар (1783). Горячий воздух внутри — легче холодного снаружи</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Дирижабль</div><div class="li-desc">Гелий внутри — безопаснее водорода. Подъём = вытесненный воздух тяжелее гелия</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Осадка в морях</div><div class="li-desc">В солёном море (ρ=1025) судно сидит выше, чем в пресной воде (ρ=1000)</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Подъём затонувших кораблей</div><div class="li-desc">Закачивают воздух в корпус — вытесняют воду, уменьшают среднюю плотность</div></div>
<div class="life-item"><div class="li-icon"></div><div class="li-title">Кальмар</div><div class="li-desc">Nautilus (наутилус) — моллюск с камерой. Заполняет газом/жидкостью → регулирует плавучесть</div></div>
</div>
<div class="insight-box">
<div class="insight-title"> Почему в солёной воде корабль «выше»?</div>
<p>Морская вода плотнее пресной ($\\rho \\approx 1025$ vs $1000\\,\\text{кг/м}^3$). Это значит, что для той же архимедовой силы нужен <b>меньший объём</b> погружённой части. Корабль «всплывает» немного выше при переходе из реки в море.</p>
<p>Именно поэтому на кораблях рисуют несколько линий Плимсоля: для Атлантики, для тропиков (горячая вода менее плотная), для пресных рек.</p>
</div>
<div class="remember-box">
<div class="remember-box-title"> Запомни!</div>
<ul>
<li>Судно плавает, если $\\langle\\rho\\rangle_\\text{судна} < \\rho_\\text{воды}$.</li>
<li>Загружая груз, увеличиваем $\\langle\\rho\\rangle$ → судно глубже погружается.</li>
<li>Воздушный шар поднимается, если $(\\rho_\\text{возд} - \\rho_\\text{газа}) \\cdot gV > mg_\\text{оболочки}$.</li>
<li>В солёной воде судно сидит <b>выше</b>, чем в пресной.</li>
</ul>
</div>
<ol class="q-list">
<li>Почему стальной корабль плавает, хотя сталь тяжелее воды?</li>
<li>Как изменится осадка судна при переходе из моря в реку?</li>
<li>Какой газ легче заполняет воздушный шар: водород, гелий или горячий воздух? В чём их отличия?</li>
</ol>
`);
html += secNav('p29', 'final3');
html += readButton('p30');
box.innerHTML = html;
renderMath(box);
wireReadBtn('p30');
}
function build_final3(){
const box = document.getElementById('final3-body');
let html = '';
html += makeCard('theory', "Финал главы 3", "★", `
<div class="formula-grid" style="margin-bottom:20px">
<div class="fcard highlight"><h3>Равновесие</h3>
<div class="main-f">$\\sum\\vec{F} = 0$ и $\\sum M = 0$</div>
<p>Момент: $M = F \\cdot \\ell$ (плечо)</p>
</div>
<div class="fcard"><h3>Простые механизмы</h3>
<div class="main-f">$F_1 \\ell_1 = F_2 \\ell_2$</div>
<p>Рычаг · подв. блок (выигрыш в 2 раза) · накл. плоскость</p>
</div>
<div class="fcard"><h3>Архимед</h3>
<div class="main-f">$F_A = \\rho_ж g V_{\\text{погр}}$</div>
<p>КПД: $\\eta = A_{\\text{пол}}/A_{\\text{сов}} \\cdot 100\\%$</p>
</div>
</div>
<div class="section-title"><i class="fas fa-star"></i> Интегрированные задачи</div>
<div class="task-card">
<div class="task-num">Задача 1</div>
<div class="task-text">Рычаг в равновесии. На левое плечо длиной $\\ell_1 = 0{,}3$ м действует сила $F_1 = 60$ Н. Правое плечо длиной $\\ell_2 = 0{,}9$ м. Найдите силу $F_2$ на правом плече.</div>
<div class="task-hint">$F_1 \\ell_1 = F_2 \\ell_2$, отсюда $F_2 = F_1 \\ell_1 / \\ell_2$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin3-q1" step="any"><span class="unit-lbl">Н</span>
<button class="btn btn-pri" onclick="checkNum('fin3-q1', 20, 'Н', 0.2)">Проверить</button></div>
<div class="feedback" id="fb-fin3-q1"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 2</div>
<div class="task-text">Куб со стороной $a = 10$ см полностью погружён в воду. Плотность воды $\\rho = 1000$ кг/м³, $g = 10$ м/с². Найдите выталкивающую силу.</div>
<div class="task-hint">$V = a^3$, $F_A = \\rho g V$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin3-q2" step="any"><span class="unit-lbl">Н</span>
<button class="btn btn-pri" onclick="checkNum('fin3-q2', 10, 'Н', 0.1)">Проверить</button></div>
<div class="feedback" id="fb-fin3-q2"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 3</div>
<div class="task-text">Подвижный блок поднимает груз весом $P = 200$ Н на высоту $h_1 = 1$ м. Найдите силу тяги $F$, прикладываемую к нити (без учёта трения и веса блока).</div>
<div class="task-hint">Подвижный блок даёт выигрыш в силе в 2 раза: $F = P/2$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin3-q3" step="any"><span class="unit-lbl">Н</span>
<button class="btn btn-pri" onclick="checkNum('fin3-q3', 100, 'Н', 1)">Проверить</button></div>
<div class="feedback" id="fb-fin3-q3"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 4</div>
<div class="task-text">Тело весом $P = 50$ Н поднимают по наклонной плоскости длиной $\\ell = 3$ м на высоту $h = 1$ м. Сила тяги $F = 20$ Н. Найдите КПД наклонной плоскости.</div>
<div class="task-hint">$A_{\\text{пол}} = Ph$, $A_{\\text{сов}} = F\\ell$, $\\eta = A_{\\text{пол}}/A_{\\text{сов}} \\cdot 100\\%$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin3-q4" step="any"><span class="unit-lbl">%</span>
<button class="btn btn-pri" onclick="checkNum('fin3-q4', 83.3, '%', 1)">Проверить</button></div>
<div class="feedback" id="fb-fin3-q4"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 5 (повышенный уровень)</div>
<div class="task-text">Льдина имеет объём $V = 2{,}0$ м³ и плавает в пресной воде. Плотность льда $\\rho_л = 900$ кг/м³, воды $\\rho_в = 1000$ кг/м³. Какой объём льдины находится над водой?</div>
<div class="task-hint">Условие плавания: $mg = F_A$, откуда $\\rho_л V g = \\rho_в V_{\\text{погр}} g$. Объём над водой: $V - V_{\\text{погр}}$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin3-q5" step="any"><span class="unit-lbl">м³</span>
<button class="btn btn-pri" onclick="checkNum('fin3-q5', 0.2, 'м³', 0.01)">Проверить</button></div>
<div class="feedback" id="fb-fin3-q5"></div>
</div>
`);
html += secNav('p30', null);
html += readButton('final3');
box.innerHTML = html;
renderMath(box);
wireReadBtn('final3');
}
/* ===== 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>