feat(phys7 lab): Phase 7 — Лабораторный практикум, 6 виртуальных ЛР
Все 6 ЛР физики 7 закрыты. Файл phys7_lab_widgets.js (726 строк, 6 экспортов: lr1..lr6). Палитра cyan. Подключение через обновлённый gen_phys7_lab.js: script-тег + hook в goTo (удаление placeholder + вызов widgets). Каждая ЛР содержит: - Цель (goal card, голубая) - Оборудование (equip card, оранжевая) - Ход работы (steps card, фиолетовая) — пронумерованный список - СИМ-виджет (интерактивная симуляция прибора) - ТБЛ-виджет (таблица измерений) - ВОПР-виджет (3 контрольных вопроса с авто-проверкой) - Вывод (concl card, зелёная) - Кнопка «Сдать ЛР» (+30 XP, localStorage-фиксация) ЛР-1 «Цена деления» (§7): - 4 виртуальных прибора (линейка/термометр/мензурка/динамометр) с SVG-шкалами - Таблица C для всех 4 - 3 контрольных вопроса ЛР-2 «Измерение длины» (§4, §7): - 3 предмета на выбор (карандаш/тетрадь/брусок), SVG с линейкой ниже, риска на длине + запись (l ± 0,5) мм - Таблица 3 измерений ЛР-3 «Объём вытеснением» (§4): - 3 тела (камень/гайка/болт), 2 SVG-мензурки рядом (V1=100 и V2=100+V), стрелка «опускаем» между ними, авто-расчёт V = V2 − V1 - Таблица 3 измерений ЛР-4 «Неравномерное движение» (§18): - Шарик на наклонной плоскости, slider угла 10..60°, кнопка «Запустить», анимация скатывания (квадратичная по времени, эмпирически быстрее на больших углах) - Таблица 3 углов с разной средней скоростью ЛР-5 «Плотность» (§20): - 3 образца на выбор (54г/156г/272г, V=20 см³ каждый), SVG-весы+мензурка, расчёт ρ = m/V и автоопределение материала (алюминий/железо/золото) - Таблица плотностей 9 веществ ЛР-6 «Сила трения» (§27): - SVG: брусок с грузами, динамометр, разные поверхности из <select> (дерево/пластик/резина/лёд: μ от 0.04 до 0.5) - slider массы 100..500 г → авто N и Ftr через динамометр - Таблица 5 измерений с разными грузами → видно Ftr ~ N АЧИВКА «Лаборант 7 класса» +80 XP — автоматически при сдаче всех 6 ЛР (проверка через localStorage в wireSubmit). Парсинг OK, smoke (6 экспортов) OK.
This commit is contained in:
@@ -44,6 +44,7 @@ const html = `<!doctype html>
|
||||
<script src="/js/api.js" defer></script>
|
||||
<script src="/js/xp.js" defer></script>
|
||||
<script src="/js/phys.js?v=${VER}" defer></script>
|
||||
<script src="/js/phys7_lab_widgets.js?v=${VER}" 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{
|
||||
@@ -232,6 +233,17 @@ function goTo(id){
|
||||
buildSidebar(id);
|
||||
window.scrollTo({ top: 0, behavior: 'smooth' });
|
||||
if((STATE.progress[id]||0) < 10) bumpProgress(id, 10);
|
||||
const W = window['PHYS7_LAB_WIDGETS'];
|
||||
if(W && typeof W[id] === 'function' && !STATE._built){ STATE._built = {}; }
|
||||
if(W && typeof W[id] === 'function' && !STATE._built[id]){
|
||||
STATE._built[id] = true;
|
||||
const body = document.getElementById(id + '-body');
|
||||
if(body){
|
||||
const ph = body.querySelector('.placeholder');
|
||||
if(ph) ph.remove();
|
||||
}
|
||||
try{ W[id](); }catch(e){ console.warn('phys7 lab ' + id + ':', e.message); }
|
||||
}
|
||||
}
|
||||
|
||||
function buildSidebar(id){
|
||||
|
||||
Reference in New Issue
Block a user