refactor(labs): полная переработка симуляции Электролиз

electrolysis.js (556 → 1072 строк):
- База электролитов с 3 до 6: NaCl/CuSO4/H2SO4 + KI/ZnSO4/AgNO3
- Стеклянный сосуд с бликами, волнующаяся поверхность раствора (sin-анимация)
- Ионы со стробоскопным шлейфом (4 точки) и радиальным свечением
- Пузырьки: растут при подъёме + pop-эффект на поверхности (LabFX)
- Осадок: градиент по металлу (Cu медь / Zn серый / Ag серебро) + метка
- Электроды с bevel и polarity badge (− / +)
- Внешняя цепь: батарея + провода + анимированные жёлтые электроны
- Закон Фарадея: панель с живой подстановкой U/I/t/Q/m/V в формулу
- Графики m(t)/V(t): мини-холст 200×75 с двумя трендами
- info() добавлены Q (Кл) и n_электронов

lab.html (sim-electrolysis):
- Панель 220 → 280px, класс elec-panel-modern
- elec-quick-bar: Старт/Сброс всегда видны
- 4 collapsible-секции elec-acc: Электролит / Скорость / Отображение / Уравнения
- Stats bar 4 → 6: добавлены Q и e⁻

lab.css: стили .elec-panel-modern, .elec-quick-bar, .elec-acc по паттерну geo-acc/dyn-acc
This commit is contained in:
Maxim Dolgolyov
2026-05-26 19:31:00 +03:00
parent 021ee79219
commit 218baef4ad
3 changed files with 894 additions and 293 deletions
+87
View File
@@ -2206,3 +2206,90 @@ canvas[data-draggable]:active { cursor: grabbing; }
border-color: #06D6E0 !important;
box-shadow: 0 0 8px rgba(6,214,224,0.3);
}
/* ═══════════════════════════════════════════════════════════
ELECTROLYSIS PANEL — modern layout
═══════════════════════════════════════════════════════════ */
.elec-panel-modern {
font-size: .82rem;
padding: 8px 10px 12px;
}
.elec-panel-modern .param-name { font-size: .82rem; }
.elec-panel-modern .param-val { font-size: .85rem; }
/* Quick bar — play/reset row */
.elec-quick-bar {
display: flex;
gap: 6px;
margin-bottom: 8px;
}
.elec-quick-bar .mag-mode-btn {
flex: 1;
font-size: .82rem;
padding: 8px 6px;
font-weight: 600;
}
/* Accordion sections */
.elec-acc {
border: 1px solid var(--border);
border-radius: 10px;
margin-bottom: 6px;
background: rgba(255,255,255,0.02);
flex: 0 0 auto;
}
.elec-acc > summary {
cursor: pointer;
list-style: none;
padding: 9px 12px 9px 30px;
font-family: 'Unbounded', sans-serif;
font-size: .78rem;
font-weight: 700;
color: var(--text);
letter-spacing: .04em;
text-transform: uppercase;
position: relative;
user-select: none;
transition: background .15s;
border-radius: 10px;
}
.elec-acc[open] > summary { border-radius: 10px 10px 0 0; }
.elec-acc > summary:hover { background: rgba(255,255,255,0.04); }
.elec-acc > summary::-webkit-details-marker { display: none; }
.elec-acc > summary::before {
content: '';
position: absolute;
left: 12px;
top: 50%;
width: 0;
height: 0;
border-left: 5px solid currentColor;
border-top: 4px solid transparent;
border-bottom: 4px solid transparent;
transform: translateY(-50%);
transition: transform .18s;
opacity: .65;
}
.elec-acc[open] > summary::before {
transform: translateY(-50%) rotate(90deg);
}
.elec-acc-body {
padding: 10px 12px 12px;
border-top: 1px solid var(--border);
}
.elec-acc-body .mag-mode-btn {
font-size: .80rem;
padding: 7px 4px;
}
.elec-acc-body .mag-mode-btn.active {
background: rgba(155,93,229,0.18);
color: var(--violet);
border: 1px solid rgba(155,93,229,0.45);
}
/* Graph active button state */
#btn-elec-graphs.active {
background: rgba(6,214,224,0.22) !important;
border-color: #06D6E0 !important;
box-shadow: 0 0 8px rgba(6,214,224,0.3);
}