<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://www.pandoraburo.ru/" xml:lang="ru">
  <id>https://www.pandoraburo.ru/kalkulyator-dlya-zubchatykh-peredach</id>
  <link href="https://www.pandoraburo.ru/kalkulyator-dlya-zubchatykh-peredach.xml" rel="self"/>
  <title>Калькулятор для Зубчатых передач</title>
  <subtitle type="html">
&lt;html lang="ru"&gt;
&lt;head&gt;
&lt;meta charset="utf-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;
&lt;title&gt;⚙️ GearCalc Pro · Калькулятор зубчатых колёс&lt;/title&gt;
&lt;style&gt;
:root{
  --bg1:#05070f; --bg2:#0a0f1e; --bg3:#101830;
  --neon-cyan:#00f0ff; --neon-pink:#ff2bd6; --neon-green:#39ff14;
  --neon-orange:#ff8a1e; --neon-yellow:#f9ff00; --neon-violet:#b55cff;
  --text:#e8f4ff; --text-dim:#8aa0c0; --line:rgba(255,255,255,0.08);
  --ad-gold:#d4af37; --ad-goldB:#f0d060;
}
*{margin:0;padding:0;box-sizing:border-box;font-family:'Segoe UI','Rajdhani',system-ui,sans-serif}
html,body{min-height:100vh;background:radial-gradient(ellipse at top,#0a1530 0%,var(--bg1) 70%);color:var(--text);overflow-x:hidden}
body::before{
  content:'';position:fixed;inset:0;pointer-events:none;z-index:0;
  background:
    radial-gradient(circle at 10% 20%, rgba(0,240,255,0.08), transparent 40%),
    radial-gradient(circle at 90% 80%, rgba(255,43,214,0.08), transparent 40%),
    radial-gradient(circle at 50% 50%, rgba(57,255,20,0.04), transparent 50%);
}
.container{max-width:1400px;margin:0 auto;padding:24px;position:relative;z-index:1}

/* ============ БАННЕР СВЕРХУ ============ */
.adb-top-wrap{
  max-width:640px;
  margin:0 auto 24px;
  padding:24px 14px 0;
  position:relative;
  z-index:2;
}
.adb{
  width:100%;
  aspect-ratio:5/2;
  min-height:180px;
  position:relative;
  font-family:'Manrope','Segoe UI',sans-serif;
  overflow:hidden;
  border-radius:14px;
  background:#0a0a0a;
  border:1px solid var(--ad-gold);
  box-shadow:0 6px 22px rgba(0,0,0,.6), 0 0 0 1px rgba(212,175,55,.15);
}
.adb-frame{position:absolute;inset:0;padding-top:34px}

.adb-ticker{
  position:absolute;
  top:0;left:0;right:0;
  height:34px;
  display:flex;
  align-items:center;
  background:#0a0a0a;
  border-bottom:1px solid var(--ad-gold);
  overflow:hidden;
  z-index:5;
}
.adb-ticker::before{
  content:'ЦЕНЫ';
  background:var(--ad-gold);
  color:#0a0a0a;
  font-size:10px;
  font-weight:800;
  letter-spacing:1.5px;
  padding:0 12px;
  height:100%;
  display:flex;
  align-items:center;
  flex-shrink:0;
}
.adb-ticker-track{
  display:inline-flex;
  align-items:center;
  white-space:nowrap;
  animation:adb-ticker 40s linear infinite;
  padding-left:16px;
}
.adb-ticker-track span{
  color:var(--ad-gold);
  font-size:12px;
  font-weight:500;
  padding:0 8px;
}
.adb-ticker-track b{color:var(--ad-goldB);font-weight:800}
.adb-ticker-track .dot{color:var(--ad-gold);font-size:8px;padding:0}
@keyframes adb-ticker{
  0%{transform:translateX(0)}
  100%{transform:translateX(-50%)}
}

.adb-slide{
  position:absolute;
  inset:34px 0 0 0;
  display:flex;
  align-items:center;
  opacity:0;
  pointer-events:none;
  transform:translateX(2em);
  transition:opacity .5s ease,transform .5s ease;
  text-decoration:none;
}
.adb-slide.active{opacity:1;pointer-events:auto;transform:none}

.adb-tag{
  position:absolute;
  top:.5em;right:.6em;
  font-size:.5em;
  letter-spacing:.12em;
  text-transform:uppercase;
  color:var(--ad-gold);
  background:rgba(10,10,10,.7);
  border:1px solid var(--ad-gold);
  padding:.25em .7em;
  border-radius:999px;
  z-index:3;
}

.adb-splash{
  background:radial-gradient(120% 120% at 20% 0%,rgba(212,175,55,.18),transparent 55%),linear-gradient(135deg,#111,#0a0a0a);
}
.adb-splash-txt{padding:0 1.4em;width:100%}
.adb-splash-title{
  font-family:'Unbounded','Arial Black',sans-serif;
  font-weight:800;
  font-size:1.05em;
  line-height:1.15;
  color:#fff;
}
.adb-splash-title br{display:block}
.adb-splash-phone{
  margin-top:.5em;
  font-size:.95em;
  font-weight:800;
  color:var(--ad-gold);
}
.adb-splash-note{margin-top:.3em;font-size:.55em;color:#9a8040}

.adb-ad{color:#fff}
.adb-ad-img{position:absolute;inset:0;background-size:cover;background-position:center}
.adb-ad-txt{position:relative;z-index:2;padding:0 1.4em}
.adb-ad-title{
  font-family:'Unbounded','Arial Black',sans-serif;
  font-weight:800;
  font-size:1.05em;
  line-height:1.1;
  color:#fff;
  text-shadow:0 2px 10px rgba(0,0,0,.7);
}
.adb-ad-cta{
  margin-top:.5em;
  display:inline-block;
  font-size:.6em;
  font-weight:700;
  letter-spacing:.06em;
  text-transform:uppercase;
  color:#0a0a0a;
  background:var(--ad-gold);
  padding:.45em 1em;
  border-radius:999px;
}

.adb-dots{
  position:absolute;
  bottom:.5em;left:0;right:0;
  display:flex;
  justify-content:center;
  gap:.3em;
  z-index:4;
}
.adb-dots i{
  width:.34em;height:.34em;
  border-radius:50%;
  background:rgba(212,175,55,.3);
  cursor:pointer;
  transition:.2s;
}
.adb-dots i.on{background:var(--ad-gold);transform:scale(1.25)}
.adb-bar{
  position:absolute;
  left:0;right:0;bottom:0;
  height:.14em;
  background:rgba(212,175,55,.15);
  z-index:4;
}
.adb-bar i{
  display:block;
  height:100%;
  width:0;
  background:linear-gradient(90deg,var(--ad-gold),var(--ad-goldB));
}

/* ============ ЗАГОЛОВОК ============ */
h1{
  font-size:clamp(1.8rem,3vw,2.6rem);font-weight:800;letter-spacing:1px;
  background:linear-gradient(90deg,var(--neon-cyan),var(--neon-pink),var(--neon-yellow));
  -webkit-background-clip:text;background-clip:text;color:transparent;
  text-shadow:0 0 30px rgba(0,240,255,0.3);margin-bottom:6px;
  display:flex;align-items:center;gap:14px;flex-wrap:wrap
}
h1 small{font-size:.85rem;font-weight:400;opacity:.7;color:var(--text-dim);margin-left:auto;-webkit-text-fill-color:var(--text-dim)}
.subtitle{color:var(--neon-green);font-size:.95rem;margin-bottom:22px;border-left:3px solid var(--neon-pink);padding-left:14px;
  text-shadow:0 0 12px rgba(57,255,20,0.6);letter-spacing:.5px;font-weight:600}

/* ============ ТАБЫ ============ */
.tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:22px;border-bottom:1px solid var(--line);padding-bottom:8px}
.tab{
  background:rgba(255,255,255,0.03);border:1px solid var(--line);border-radius:12px;
  padding:10px 18px;color:var(--text-dim);cursor:pointer;font-size:.9rem;font-weight:600;
  transition:all .25s;letter-spacing:.5px;user-select:none
}
.tab:hover{color:var(--neon-cyan);border-color:var(--neon-cyan);box-shadow:0 0 16px rgba(0,240,255,0.3)}
.tab.active{
  background:linear-gradient(135deg,rgba(0,240,255,0.15),rgba(255,43,214,0.1));
  border-color:var(--neon-cyan);color:#fff;
  box-shadow:0 0 20px rgba(0,240,255,0.5),inset 0 0 20px rgba(0,240,255,0.08);
  text-shadow:0 0 8px var(--neon-cyan)
}
.tab-icon{margin-right:6px}

/* ============ РЕКЛАМНАЯ ПОЛОСА ============ */
.ad-strip{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:12px;
  margin-bottom:22px;
}
@media(max-width:700px){
  .ad-strip{grid-template-columns:1fr}
}
.ad-strip-item{
  display:flex;
  align-items:center;
  gap:12px;
  padding:14px 18px;
  background:linear-gradient(135deg,rgba(212,175,55,.1) 0%,rgba(10,15,30,.7) 100%);
  border:1px solid rgba(212,175,55,.4);
  border-radius:14px;
  text-decoration:none;
  transition:all .25s;
}
.ad-strip-item:hover{
  border-color:var(--ad-gold);
  box-shadow:0 0 20px rgba(212,175,55,.3);
  transform:translateY(-2px);
}
.ad-strip-tag{
  background:var(--ad-gold);
  color:#0a0a0a;
  font-size:.68rem;
  font-weight:800;
  letter-spacing:.8px;
  text-transform:uppercase;
  padding:4px 10px;
  border-radius:999px;
  flex-shrink:0;
}
.ad-strip-text{
  color:#e8f4ff;
  font-size:.9rem;
  font-weight:600;
  flex:1;
}
.ad-strip-cta{
  color:var(--ad-gold);
  font-size:.85rem;
  font-weight:800;
  letter-spacing:.5px;
  white-space:nowrap;
}
.ad-strip-item:hover .ad-strip-cta{
  color:var(--ad-goldB);
  text-shadow:0 0 8px var(--ad-goldB);
}

.tab-content{display:none;animation:fadeIn .3s ease}
.tab-content.active{display:block}
@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}

/* ============ КАРТОЧКИ ============ */
.card{
  background:linear-gradient(145deg,rgba(15,25,50,0.6),rgba(8,14,32,0.8));
  backdrop-filter:blur(10px);border:1px solid var(--line);border-radius:20px;
  padding:22px;margin-bottom:20px;
  box-shadow:0 8px 32px rgba(0,0,0,0.5),inset 0 1px 0 rgba(255,255,255,0.05)
}
.card h2{
  font-size:1.15rem;font-weight:700;margin-bottom:16px;padding-bottom:10px;
  border-bottom:1px solid var(--line);letter-spacing:.8px;text-transform:uppercase;
  display:flex;align-items:center;gap:10px
}
.card h2 .h2-neon-cyan{color:var(--neon-cyan);text-shadow:0 0 12px var(--neon-cyan)}
.card h2 .h2-neon-pink{color:var(--neon-pink);text-shadow:0 0 12px var(--neon-pink)}
.card h2 .h2-neon-green{color:var(--neon-green);text-shadow:0 0 12px var(--neon-green)}
.card h2 .h2-neon-orange{color:var(--neon-orange);text-shadow:0 0 12px var(--neon-orange)}
.card h2 .h2-neon-violet{color:var(--neon-violet);text-shadow:0 0 12px var(--neon-violet)}
.card h2 .h2-neon-yellow{color:var(--neon-yellow);text-shadow:0 0 12px var(--neon-yellow)}

.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:14px 18px}
.field{display:flex;flex-direction:column;gap:4px}
.field label{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color:var(--neon-cyan);text-shadow:0 0 6px rgba(0,240,255,0.4)}
.field input,.field select{
  background:rgba(0,240,255,0.05);border:1px solid rgba(0,240,255,0.25);border-radius:10px;
  padding:10px 12px;font-size:1rem;color:#fff;outline:none;transition:all .2s;width:100%;font-weight:600
}
.field input:focus,.field select:focus{
  border-color:var(--neon-cyan);background:rgba(0,240,255,0.08);
  box-shadow:0 0 0 3px rgba(0,240,255,0.2),0 0 20px rgba(0,240,255,0.3)
}
.field input::placeholder{color:rgba(138,160,192,0.5)}
.field select option{background:#0a1530;color:#fff}
.field small{font-size:.7rem;color:var(--text-dim);margin-top:2px}

.btn{
  background:linear-gradient(135deg,var(--neon-cyan),var(--neon-pink));border:none;border-radius:40px;
  padding:12px 28px;font-size:1rem;font-weight:800;color:#000;cursor:pointer;
  transition:all .25s;letter-spacing:1px;text-transform:uppercase;
  box-shadow:0 0 25px rgba(0,240,255,0.5),0 0 50px rgba(255,43,214,0.3);
  display:inline-flex;align-items:center;gap:8px;margin-top:8px
}
.btn:hover{transform:translateY(-2px);box-shadow:0 0 40px rgba(0,240,255,0.7),0 0 60px rgba(255,43,214,0.5)}
.btn:active{transform:translateY(0)}
.btn-sm{padding:8px 16px;font-size:.85rem}
.btn-green{background:linear-gradient(135deg,var(--neon-green),#00aa44);box-shadow:0 0 25px rgba(57,255,20,0.5)}
.btn-orange{background:linear-gradient(135deg,var(--neon-orange),#ff4422);color:#000;box-shadow:0 0 25px rgba(255,138,30,0.5)}
.btn-violet{background:linear-gradient(135deg,var(--neon-violet),#6a1bd9);box-shadow:0 0 25px rgba(181,92,255,0.5)}

.hidden{display:none!important}

.result-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.result-grid .card{margin-bottom:0}

table.data{width:100%;border-collapse:collapse;font-size:.92rem}
table.data td{padding:8px 10px;border-bottom:1px solid rgba(0,240,255,0.08)}
table.data td:first-child{color:var(--text-dim);font-weight:500;width:48%}
table.data td:last-child{color:#fff;font-weight:700;text-align:right;font-family:'Consolas',monospace;text-shadow:0 0 6px rgba(0,240,255,0.3)}
table.data tr:hover td{background:rgba(0,240,255,0.04)}
.val-cyan{color:var(--neon-cyan)!important;text-shadow:0 0 8px var(--neon-cyan)!important}
.val-pink{color:var(--neon-pink)!important;text-shadow:0 0 8px var(--neon-pink)!important}
.val-green{color:var(--neon-green)!important;text-shadow:0 0 8px var(--neon-green)!important}
.val-orange{color:var(--neon-orange)!important;text-shadow:0 0 8px var(--neon-orange)!important}
.val-yellow{color:var(--neon-yellow)!important;text-shadow:0 0 8px var(--neon-yellow)!important}
.val-violet{color:var(--neon-violet)!important;text-shadow:0 0 8px var(--neon-violet)!important}

.alert{border-radius:14px;padding:14px 18px;margin:12px 0;font-size:.9rem;line-height:1.5;font-weight:600}
.alert-warn{background:rgba(255,138,30,0.08);border:1px solid rgba(255,138,30,0.4);color:var(--neon-orange);text-shadow:0 0 8px rgba(255,138,30,0.5)}
.alert-ok{background:rgba(57,255,20,0.06);border:1px solid rgba(57,255,20,0.3);color:var(--neon-green);text-shadow:0 0 8px rgba(57,255,20,0.4)}
.alert-err{background:rgba(255,43,214,0.08);border:1px solid rgba(255,43,214,0.4);color:var(--neon-pink);text-shadow:0 0 8px rgba(255,43,214,0.5)}

/* ============ УЛУЧШЕННАЯ ВИЗУАЛИЗАЦИЯ ============ */
.viz-wrap{
  background:rgba(0,0,0,0.55);
  border-radius:24px;
  padding:14px;
  border:1px solid rgba(0,240,255,0.2);
  box-shadow:
    inset 0 0 60px rgba(0,240,255,0.08),
    0 0 40px rgba(0,240,255,0.08);
  position:relative;
  overflow:hidden;
}
.viz-wrap::before{
  content:'';
  position:absolute;
  inset:0;
  background:
    radial-gradient(circle at 50% 0%, rgba(0,240,255,0.1), transparent 60%),
    radial-gradient(circle at 0% 100%, rgba(255,43,214,0.08), transparent 60%);
  pointer-events:none;
  border-radius:24px;
}
.viz-toolbar{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  margin-bottom:10px;
  position:relative;
  z-index:2;
}
.viz-btn{
  background:rgba(0,240,255,0.08);
  border:1px solid rgba(0,240,255,0.35);
  color:var(--neon-cyan);
  border-radius:10px;
  padding:8px 14px;
  font-size:.8rem;
  font-weight:700;
  cursor:pointer;
  transition:all .2s;
  letter-spacing:.5px;
  display:inline-flex;
  align-items:center;
  gap:6px;
}
.viz-btn:hover{background:rgba(0,240,255,0.18);box-shadow:0 0 16px rgba(0,240,255,0.4)}
.viz-btn.on{background:var(--neon-cyan);color:#000;box-shadow:0 0 16px rgba(0,240,255,0.6)}
canvas{
  display:block;
  width:100%;
  height:auto;
  border-radius:18px;
  background:radial-gradient(circle at 30% 30%,#0a1a38,#020510 80%);
  cursor:grab;
  position:relative;
  z-index:1;
}
canvas:active{cursor:grabbing}

.viz-legend{
  display:flex;
  flex-wrap:wrap;
  gap:14px;
  margin-top:10px;
  font-size:.78rem;
  color:var(--text-dim);
  position:relative;
  z-index:2;
}
.viz-legend span{display:inline-flex;align-items:center;gap:5px}
.viz-legend i{
  display:inline-block;
  width:14px;
  height:2px;
  border-radius:1px;
}
.viz-legend .tip{background:#00f0ff;box-shadow:0 0 8px #00f0ff}
.viz-legend .root{background:#ff2bd6;box-shadow:0 0 8px #ff2bd6}
.viz-legend .dev{background:#f9ff00;box-shadow:0 0 8px #f9ff00}
.viz-legend .base{background:#39ff14;box-shadow:0 0 8px #39ff14}

.viz-stats{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(140px,1fr));
  gap:10px;
  margin-top:12px;
  position:relative;
  z-index:2;
}
.viz-stat{
  background:rgba(0,240,255,0.05);
  border:1px solid rgba(0,240,255,0.2);
  border-radius:12px;
  padding:10px 12px;
  text-align:center;
}
.viz-stat .lbl{
  font-size:.65rem;
  text-transform:uppercase;
  letter-spacing:.8px;
  color:var(--text-dim);
  margin-bottom:4px;
}
.viz-stat .val{
  font-size:1.05rem;
  font-weight:800;
  color:var(--neon-cyan);
  text-shadow:0 0 8px var(--neon-cyan);
  font-family:'Consolas',monospace;
}

.actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:16px}

/* ============ РЕКЛАМНЫЕ БЛОКИ ВНИЗУ ============ */
.ad-bottom{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(260px,1fr));
  gap:14px;
  margin-top:32px;
}
.ad-bottom-card{
  display:flex;
  align-items:center;
  gap:14px;
  padding:18px 20px;
  background:linear-gradient(135deg,rgba(212,175,55,.12) 0%,rgba(10,15,30,.8) 100%);
  border:1px solid rgba(212,175,55,.45);
  border-radius:16px;
  text-decoration:none;
  transition:all .25s;
}
.ad-bottom-card:hover{
  border-color:var(--ad-gold);
  box-shadow:0 0 25px rgba(212,175,55,.35);
  transform:translateY(-3px);
}
.ad-bottom-icon{
  width:52px;
  height:52px;
  border-radius:12px;
  background:var(--ad-gold);
  color:#0a0a0a;
  display:flex;
  align-items:center;
  justify-content:center;
  font-size:1.4rem;
  font-weight:800;
  flex-shrink:0;
}
.ad-bottom-text h3{
  color:var(--ad-goldB);
  font-size:1rem;
  font-weight:800;
  margin-bottom:4px;
  text-transform:uppercase;
  letter-spacing:.5px;
}
.ad-bottom-text p{
  color:#e8f4ff;
  font-size:.85rem;
  opacity:.8;
  line-height:1.4;
}

.ad-cta-block{
  grid-column:1/-1;
  text-align:center;
  padding:24px;
  background:linear-gradient(135deg,rgba(212,175,55,.15) 0%,rgba(10,15,30,.9) 100%);
  border:1px solid var(--ad-gold);
  border-radius:16px;
}
.ad-cta-block h3{
  color:var(--ad-goldB);
  font-size:1.3rem;
  font-weight:800;
  margin-bottom:8px;
  text-transform:uppercase;
  letter-spacing:1px;
}
.ad-cta-block p{
  color:#e8f4ff;
  font-size:.9rem;
  opacity:.85;
  margin-bottom:16px;
}
.ad-cta-block a{
  display:inline-block;
  background:var(--ad-gold);
  color:#0a0a0a;
  text-decoration:none;
  padding:12px 28px;
  font-size:1rem;
  font-weight:800;
  letter-spacing:1px;
  border-radius:999px;
  transition:all .25s;
  text-transform:uppercase;
}
.ad-cta-block a:hover{
  background:var(--ad-goldB);
  transform:scale(1.03);
  box-shadow:0 0 30px rgba(212,175,55,.5);
}

/* ============ ПЕЧАТЬ ============ */
@media print{
  body{background:#fff;color:#000}
  .tabs,.btn,.field,.tab,.viz-toolbar,.adb-top-wrap,.ad-strip,.ad-bottom,.adb-ticker{display:none!important}
  .card{background:#fff;border:1px solid #000;color:#000;box-shadow:none}
  table.data td{color:#000}
  .val-cyan,.val-pink,.val-green,.val-orange,.val-yellow,.val-violet{color:#000;text-shadow:none}
}

/* ============ АДАПТИВ ============ */
@media(max-width:900px){.result-grid{grid-template-columns:1fr}}
@media(max-width:540px){
  .form-grid{grid-template-columns:1fr 1fr;gap:10px}
  .container{padding:14px}
  .adb-top-wrap{padding:14px 10px 0}
}

@media(prefers-reduced-motion:reduce){
  .adb-slide{transition:none}
  .adb-bar i{animation:none!important}
  .adb-ticker-track{animation:none!important}
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;


&lt;div class="adb-top-wrap"&gt;
  &lt;div class="adb" id="adb"&gt;
    &lt;div class="adb-frame"&gt;

      &lt;div class="adb-ticker"&gt;
        &lt;div class="adb-ticker-track"&gt;
          &lt;span&gt;БТВТ 450 — &lt;b&gt;300 ₽/кг&lt;/b&gt;&lt;/span&gt;
          &lt;span class="dot"&gt;◆&lt;/span&gt;
          &lt;span&gt;C500 6 мм — &lt;b&gt;425 ₽/кг&lt;/b&gt;&lt;/span&gt;
          &lt;span class="dot"&gt;◆&lt;/span&gt;
          &lt;span&gt;6×1500×6000 БТВТ — &lt;b&gt;129 000 ₽/лист&lt;/b&gt;&lt;/span&gt;
          &lt;span class="dot"&gt;◆&lt;/span&gt;
          &lt;span&gt;6×1500×6000 C500 — &lt;b&gt;182 750 ₽/лист&lt;/b&gt;&lt;/span&gt;
          &lt;span class="dot"&gt;◆&lt;/span&gt;
          &lt;span&gt;Класс Бр2 / С2 · от 1 листа · НДС 22%&lt;/span&gt;
          &lt;span class="dot"&gt;◆&lt;/span&gt;
          &lt;span&gt;БТВТ 450 — &lt;b&gt;300 ₽/кг&lt;/b&gt;&lt;/span&gt;
          &lt;span class="dot"&gt;◆&lt;/span&gt;
          &lt;span&gt;C500 6 мм — &lt;b&gt;425 ₽/кг&lt;/b&gt;&lt;/span&gt;
          &lt;span class="dot"&gt;◆&lt;/span&gt;
          &lt;span&gt;6×1500×6000 БТВТ — &lt;b&gt;129 000 ₽/лист&lt;/b&gt;&lt;/span&gt;
          &lt;span class="dot"&gt;◆&lt;/span&gt;
          &lt;span&gt;6×1500×6000 C500 — &lt;b&gt;182 750 ₽/лист&lt;/b&gt;&lt;/span&gt;
          &lt;span class="dot"&gt;◆&lt;/span&gt;
          &lt;span&gt;Класс Бр2 / С2 · от 1 листа · НДС 22%&lt;/span&gt;
          &lt;span class="dot"&gt;◆&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;a class="adb-slide adb-splash active" href="https://brony-rf.ru/kuski-i-listy-na-probu" target="_blank" rel="noopener"&gt;
        &lt;div class="adb-tag"&gt;Рекламные площади&lt;/div&gt;
        &lt;div class="adb-splash-txt"&gt;
          &lt;div class="adb-splash-title"&gt;ЗДЕСЬ МОЖЕТ БЫТЬ&lt;br /&gt;ВАША РЕКЛАМА&lt;/div&gt;
          &lt;div class="adb-splash-phone"&gt;8 902 873-36-90 · МАКС&lt;/div&gt;
          &lt;div class="adb-splash-note"&gt;Позвоните, а лучше пишите в МАКС&lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

      &lt;a class="adb-slide adb-ad" href="https://brony-rf.ru/aktciya-solnechnyy-oktyabr" target="_blank" rel="noopener"&gt;
        &lt;div class="adb-ad-img" style="background-image:linear-gradient(90deg,rgba(5,10,18,.9) 0%,rgba(5,10,18,.4) 60%,rgba(5,10,18,.1) 100%),url('bronya.jpg')"&gt;&lt;/div&gt;
        &lt;div class="adb-tag"&gt;Броня&lt;/div&gt;
        &lt;div class="adb-ad-txt"&gt;
          &lt;div class="adb-ad-title"&gt;C500 · 6 мм&lt;/div&gt;
          &lt;div class="adb-ad-cta"&gt;Перейти на сайт →&lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

      &lt;a class="adb-slide adb-ad" href="https://brony-rf.ru/btvt-450-list-6-mm" target="_blank" rel="noopener"&gt;
        &lt;div class="adb-ad-img" style="background-image:linear-gradient(90deg,rgba(5,10,18,.9) 0%,rgba(5,10,18,.4) 60%,rgba(5,10,18,.1) 100%),url('tank.jpg')"&gt;&lt;/div&gt;
        &lt;div class="adb-tag"&gt;Броня&lt;/div&gt;
        &lt;div class="adb-ad-txt"&gt;
          &lt;div class="adb-ad-title"&gt;БТВТ 450 · 6 мм&lt;/div&gt;
          &lt;div class="adb-ad-cta"&gt;Перейти на сайт →&lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

      &lt;a class="adb-slide adb-ad" href="https://brony-rf.ru/kuski-i-listy-na-probu" target="_blank" rel="noopener"&gt;
        &lt;div class="adb-ad-img" style="background-image:linear-gradient(90deg,rgba(5,10,18,.9) 0%,rgba(5,10,18,.4) 60%,rgba(5,10,18,.1) 100%),url('listy.jpg')"&gt;&lt;/div&gt;
        &lt;div class="adb-tag"&gt;Проба&lt;/div&gt;
        &lt;div class="adb-ad-txt"&gt;
          &lt;div class="adb-ad-title"&gt;КУСКИ И ЛИСТЫ&lt;br /&gt;НА ПРОБУ&lt;/div&gt;
          &lt;div class="adb-ad-cta"&gt;Перейти на сайт →&lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

      &lt;div class="adb-dots"&gt;&lt;/div&gt;
      &lt;div class="adb-bar"&gt;&lt;i&gt;&lt;/i&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div class="container"&gt;

&lt;h1&gt;⚙️ GearCalc Pro &lt;small&gt;Калькулятор для машиностроителей&lt;/small&gt;&lt;/h1&gt;
&lt;div class="subtitle"&gt;Геометрия · Производство · Контроль · Прочность · Экспорт&lt;/div&gt;

&lt;div class="tabs"&gt;
  &lt;div class="tab active" data-tab="geometry"&gt;&lt;span class="tab-icon"&gt;?&lt;/span&gt;Геометрия&lt;/div&gt;
  &lt;div class="tab" data-tab="reverse"&gt;&lt;span class="tab-icon"&gt;?&lt;/span&gt;Подбор по замерам&lt;/div&gt;
  &lt;div class="tab" data-tab="production"&gt;&lt;span class="tab-icon"&gt;⚙️&lt;/span&gt;Производство&lt;/div&gt;
  &lt;div class="tab" data-tab="control"&gt;&lt;span class="tab-icon"&gt;?&lt;/span&gt;Контроль&lt;/div&gt;
  &lt;div class="tab" data-tab="strength"&gt;&lt;span class="tab-icon"&gt;?&lt;/span&gt;Прочность&lt;/div&gt;
  &lt;div class="tab" data-tab="export"&gt;&lt;span class="tab-icon"&gt;?&lt;/span&gt;Экспорт&lt;/div&gt;
&lt;/div&gt;


&lt;div class="ad-strip"&gt;
  &lt;a class="ad-strip-item" href="https://brony-rf.ru/aktciya-solnechnyy-oktyabr" target="_blank" rel="noopener"&gt;
    &lt;span class="ad-strip-tag"&gt;Акция&lt;/span&gt;
    &lt;span class="ad-strip-text"&gt;Солнечный Октябрь · БТВТ 450 · C500&lt;/span&gt;
    &lt;span class="ad-strip-cta"&gt;Перейти →&lt;/span&gt;
  &lt;/a&gt;
  &lt;a class="ad-strip-item" href="https://brony-rf.ru/btvt-450-list-6-mm" target="_blank" rel="noopener"&gt;
    &lt;span class="ad-strip-tag"&gt;Броня&lt;/span&gt;
    &lt;span class="ad-strip-text"&gt;БТВТ 450 · 6 мм · класс Бр2 / С2&lt;/span&gt;
    &lt;span class="ad-strip-cta"&gt;Перейти →&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="tab-content active" id="tab-geometry"&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-cyan"&gt;▣&lt;/span&gt; Исходные данные&lt;/h2&gt;
  &lt;form id="geomForm" class="form-grid" onsubmit="event.preventDefault(); calcGeometry();"&gt;
    &lt;div class="field"&gt;&lt;label&gt;Тип зубьев&lt;/label&gt;
      &lt;select id="g_type"&gt;
        &lt;option value="spur"&gt;Прямозубая&lt;/option&gt;
        &lt;option value="helical" selected="selected"&gt;Косозубая&lt;/option&gt;
        &lt;option value="bevel"&gt;Коническая прямозубая&lt;/option&gt;
        &lt;option value="spiral"&gt;Коническая с круговым зубом&lt;/option&gt;
        &lt;option value="epicycloidal"&gt;Эпициклоидная&lt;/option&gt;
      &lt;/select&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Модуль m, мм&lt;/label&gt;&lt;input type="number" id="g_m" value="2" step="0.1" min="0.1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z₁ (шестерня)&lt;/label&gt;&lt;input type="number" id="g_z1" value="20" step="1" min="5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z₂ (колесо)&lt;/label&gt;&lt;input type="number" id="g_z2" value="30" step="1" min="5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Угол α, °&lt;/label&gt;&lt;input type="number" id="g_alpha" value="20" step="0.5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;ha*&lt;/label&gt;&lt;input type="number" id="g_ha" value="1" step="0.05" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;c*&lt;/label&gt;&lt;input type="number" id="g_c" value="0.25" step="0.05" /&gt;&lt;/div&gt;
    &lt;div class="field" id="g_x1_w"&gt;&lt;label&gt;Смещение x₁&lt;/label&gt;&lt;input type="number" id="g_x1" value="0" step="0.01" /&gt;&lt;/div&gt;
    &lt;div class="field" id="g_x2_w"&gt;&lt;label&gt;Смещение x₂&lt;/label&gt;&lt;input type="number" id="g_x2" value="0" step="0.01" /&gt;&lt;/div&gt;
    &lt;div class="field hidden" id="g_beta_w"&gt;&lt;label&gt;Угол β, °&lt;/label&gt;&lt;input type="number" id="g_beta" value="15" step="0.5" /&gt;&lt;/div&gt;
    &lt;div class="field hidden" id="g_delta_w"&gt;&lt;label&gt;δ₁, ° (коническая)&lt;/label&gt;&lt;input type="number" id="g_delta1" value="33.69" step="0.1" /&gt;&lt;/div&gt;
    &lt;div class="field hidden" id="g_bsp_w"&gt;&lt;label&gt;β спирали, °&lt;/label&gt;&lt;input type="number" id="g_bsp" value="35" step="0.5" /&gt;&lt;/div&gt;
    &lt;button type="submit" class="btn"&gt;⚡ Рассчитать&lt;/button&gt;
  &lt;/form&gt;
&lt;/div&gt;

&lt;div class="result-grid"&gt;
  &lt;div class="card"&gt;
    &lt;h2&gt;&lt;span class="h2-neon-pink"&gt;▣&lt;/span&gt; Геометрия&lt;/h2&gt;
    &lt;table class="data" id="geomT1"&gt;&lt;/table&gt;
  &lt;/div&gt;
  &lt;div class="card"&gt;
    &lt;h2&gt;&lt;span class="h2-neon-green"&gt;▣&lt;/span&gt; Дополнительно&lt;/h2&gt;
    &lt;table class="data" id="geomT2"&gt;&lt;/table&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-orange"&gt;▣&lt;/span&gt; Визуализация&lt;/h2&gt;
  &lt;div id="geomAlert"&gt;&lt;/div&gt;
  &lt;div class="viz-wrap"&gt;
    &lt;div class="viz-toolbar"&gt;
      &lt;button class="viz-btn on" id="btnTip" onclick="toggleLayer('tip',this)"&gt;⭕ Вершины&lt;/button&gt;
      &lt;button class="viz-btn on" id="btnRoot" onclick="toggleLayer('root',this)"&gt;⭕ Впадины&lt;/button&gt;
      &lt;button class="viz-btn on" id="btnDev" onclick="toggleLayer('dev',this)"&gt;⭕ Делительная&lt;/button&gt;
      &lt;button class="viz-btn on" id="btnBase" onclick="toggleLayer('base',this)"&gt;⭕ Основная&lt;/button&gt;
      &lt;button class="viz-btn on" id="btnGrid" onclick="toggleLayer('grid',this)"&gt;▦ Сетка&lt;/button&gt;
      &lt;button class="viz-btn" id="btnLabels" onclick="toggleLayer('labels',this)"&gt;? Подписи&lt;/button&gt;
      &lt;button class="viz-btn" onclick="fitView()"&gt;⤢ Вписать&lt;/button&gt;
      &lt;button class="viz-btn" onclick="zoomBy(1.2)"&gt;＋&lt;/button&gt;
      &lt;button class="viz-btn" onclick="zoomBy(0.8)"&gt;−&lt;/button&gt;
    &lt;/div&gt;
    &lt;canvas id="cvGeom" width="1200" height="620"&gt;&lt;/canvas&gt;
    &lt;div class="viz-legend"&gt;
      &lt;span&gt;&lt;i class="tip"&gt;&lt;/i&gt; Вершины&lt;/span&gt;
      &lt;span&gt;&lt;i class="root"&gt;&lt;/i&gt; Впадины&lt;/span&gt;
      &lt;span&gt;&lt;i class="dev"&gt;&lt;/i&gt; Делительная&lt;/span&gt;
      &lt;span&gt;&lt;i class="base"&gt;&lt;/i&gt; Основная&lt;/span&gt;
    &lt;/div&gt;
    &lt;div class="viz-stats" id="vizStats"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div class="tab-content" id="tab-reverse"&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-violet"&gt;▣&lt;/span&gt; Обратный подбор модуля по замерам&lt;/h2&gt;
  &lt;div class="form-grid"&gt;
    &lt;div class="field"&gt;&lt;label&gt;Способ подбора&lt;/label&gt;
      &lt;select id="rv_mode"&gt;
        &lt;option value="da"&gt;По диаметру вершин da&lt;/option&gt;
        &lt;option value="a"&gt;По межосевому a&lt;/option&gt;
        &lt;option value="p"&gt;По шагу p&lt;/option&gt;
        &lt;option value="h"&gt;По высоте зуба h&lt;/option&gt;
      &lt;/select&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z шестерни&lt;/label&gt;&lt;input type="number" id="rv_z" value="20" step="1" min="5" /&gt;&lt;/div&gt;
    &lt;div class="field" id="rv_z2_w"&gt;&lt;label&gt;z₂ колеса&lt;/label&gt;&lt;input type="number" id="rv_z2" value="30" step="1" min="5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Измеренное значение, мм&lt;/label&gt;&lt;input type="number" id="rv_val" value="44" step="0.01" /&gt;&lt;/div&gt;
    &lt;button type="button" class="btn btn-violet" onclick="calcReverse()"&gt;? Подобрать&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-pink"&gt;▣&lt;/span&gt; Результат подбора&lt;/h2&gt;
  &lt;div id="rvOut"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div class="tab-content" id="tab-production"&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-yellow"&gt;▣&lt;/span&gt; Делительная головка&lt;/h2&gt;
  &lt;div class="form-grid"&gt;
    &lt;div class="field"&gt;&lt;label&gt;Передаточное головки N&lt;/label&gt;&lt;input type="number" id="pr_N" value="40" step="1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Число зубьев z&lt;/label&gt;&lt;input type="number" id="pr_z" value="37" step="1" min="3" /&gt;&lt;/div&gt;
    &lt;button type="button" class="btn btn-orange" onclick="calcIndexHead()"&gt;⚙️ Рассчитать&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-cyan"&gt;▣&lt;/span&gt; Номер модульной фрезы (ГОСТ)&lt;/h2&gt;
  &lt;div class="form-grid"&gt;
    &lt;div class="field"&gt;&lt;label&gt;Тип&lt;/label&gt;
      &lt;select id="fr_type"&gt;&lt;option value="spur"&gt;Прямозубая&lt;/option&gt;&lt;option value="helical"&gt;Косозубая&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z или z_v&lt;/label&gt;&lt;input type="number" id="fr_z" value="20" step="1" /&gt;&lt;/div&gt;
    &lt;div class="field" id="fr_beta_w"&gt;&lt;label&gt;β, °&lt;/label&gt;&lt;input type="number" id="fr_beta" value="15" step="0.5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;α, °&lt;/label&gt;&lt;input type="number" id="fr_alpha" value="20" step="0.5" /&gt;&lt;/div&gt;
    &lt;button type="button" class="btn" onclick="calcCutter()"&gt;? Найти фрезу&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="result-grid"&gt;
  &lt;div class="card"&gt;&lt;h2&gt;&lt;span class="h2-neon-green"&gt;▣&lt;/span&gt; Делительная головка — результат&lt;/h2&gt;&lt;div id="prIndexOut"&gt;&lt;/div&gt;&lt;/div&gt;
  &lt;div class="card"&gt;&lt;h2&gt;&lt;span class="h2-neon-pink"&gt;▣&lt;/span&gt; Модульная фреза&lt;/h2&gt;&lt;div id="prCutterOut"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div class="tab-content" id="tab-control"&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-cyan"&gt;▣&lt;/span&gt; Размер по роликам M и общая нормаль W&lt;/h2&gt;
  &lt;div class="form-grid"&gt;
    &lt;div class="field"&gt;&lt;label&gt;Тип&lt;/label&gt;
      &lt;select id="c_type"&gt;&lt;option value="external"&gt;Наружное (z-чётное)&lt;/option&gt;&lt;option value="external_odd"&gt;Наружное (z-нечётное)&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;m, мм&lt;/label&gt;&lt;input type="number" id="c_m" value="2" step="0.1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z&lt;/label&gt;&lt;input type="number" id="c_z" value="20" step="1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;α, °&lt;/label&gt;&lt;input type="number" id="c_alpha" value="20" step="0.5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;β, ° (0 — прям.)&lt;/label&gt;&lt;input type="number" id="c_beta" value="0" step="0.5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;x (смещение)&lt;/label&gt;&lt;input type="number" id="c_x" value="0" step="0.01" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;d_ролика, мм&lt;/label&gt;&lt;input type="number" id="c_dp" value="3.36" step="0.01" /&gt;&lt;/div&gt;
    &lt;button type="button" class="btn" onclick="calcMeasure()"&gt;? Рассчитать&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-pink"&gt;▣&lt;/span&gt; Результаты контроля&lt;/h2&gt;
  &lt;div id="ctrlOut"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div class="tab-content" id="tab-strength"&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-orange"&gt;▣&lt;/span&gt; Исходные данные для расчёта прочности (упрощённо по ГОСТ 21354)&lt;/h2&gt;
  &lt;div class="form-grid"&gt;
    &lt;div class="field"&gt;&lt;label&gt;Мощность P, кВт&lt;/label&gt;&lt;input type="number" id="s_P" value="5" step="0.1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Частота n₁, об/мин&lt;/label&gt;&lt;input type="number" id="s_n" value="1500" step="10" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Модуль m, мм&lt;/label&gt;&lt;input type="number" id="s_m" value="2" step="0.1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z₁&lt;/label&gt;&lt;input type="number" id="s_z1" value="20" step="1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z₂&lt;/label&gt;&lt;input type="number" id="s_z2" value="30" step="1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;β, °&lt;/label&gt;&lt;input type="number" id="s_beta" value="15" step="0.5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Ширина венца b, мм&lt;/label&gt;&lt;input type="number" id="s_b" value="20" step="1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Коэф. нагрузки K&lt;/label&gt;&lt;input type="number" id="s_K" value="1.3" step="0.05" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Материал&lt;/label&gt;
      &lt;select id="s_mat"&gt;
        &lt;option value="steel"&gt;Сталь улучшенная (σ_Hlim=580 МПа)&lt;/option&gt;
        &lt;option value="steel_h"&gt;Сталь закалённая (σ_Hlim=900 МПа)&lt;/option&gt;
        &lt;option value="iron"&gt;Чугун (σ_Hlim=400 МПа)&lt;/option&gt;
      &lt;/select&gt;&lt;/div&gt;
    &lt;button type="button" class="btn btn-orange" onclick="calcStrength()"&gt;? Рассчитать&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-green"&gt;▣&lt;/span&gt; Результаты прочностного расчёта&lt;/h2&gt;
  &lt;div id="strOut"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div class="tab-content" id="tab-export"&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-violet"&gt;▣&lt;/span&gt; Экспорт результатов&lt;/h2&gt;
  &lt;p style="color:var(--text-dim);margin-bottom:14px"&gt;Экспортируйте все рассчитанные данные на вкладке «Геометрия». PDF — через диалог печати браузера. DXF — профиль зуба для CAD.&lt;/p&gt;
  &lt;div class="actions"&gt;
    &lt;button class="btn btn-violet" onclick="exportPDF()"&gt;? Экспорт в PDF&lt;/button&gt;
    &lt;button class="btn btn-green" onclick="exportDXF()"&gt;? Экспорт профиля (DXF)&lt;/button&gt;
    &lt;button class="btn" onclick="copyReport()"&gt;? Копировать отчёт&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-cyan"&gt;▣&lt;/span&gt; Предпросмотр отчёта&lt;/h2&gt;
  &lt;pre id="expPreview" style="background:rgba(0,0,0,0.4);padding:16px;border-radius:12px;color:var(--neon-green);font-family:Consolas,monospace;font-size:.85rem;overflow:auto;white-space:pre-wrap;max-height:400px;text-shadow:0 0 6px rgba(57,255,20,0.4)"&gt;Сначала рассчитайте параметры на вкладке «Геометрия».&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;



&lt;div class="ad-bottom"&gt;
  &lt;a class="ad-bottom-card" href="https://brony-rf.ru/aktciya-solnechnyy-oktyabr" target="_blank" rel="noopener"&gt;
    &lt;div class="ad-bottom-icon"&gt;?&lt;/div&gt;
    &lt;div class="ad-bottom-text"&gt;
      &lt;h3&gt;Акция «Солнечный Октябрь»&lt;/h3&gt;
      &lt;p&gt;БТВТ 450 и C500 · от 1 листа · НДС 22%&lt;/p&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a class="ad-bottom-card" href="https://brony-rf.ru/btvt-450-list-6-mm" target="_blank" rel="noopener"&gt;
    &lt;div class="ad-bottom-icon"&gt;?️&lt;/div&gt;
    &lt;div class="ad-bottom-text"&gt;
      &lt;h3&gt;БТВТ 450 · 6 мм&lt;/h3&gt;
      &lt;p&gt;ТУ 18105BB-2024 · класс Бр2 / С2&lt;/p&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a class="ad-bottom-card" href="https://brony-rf.ru/kuski-i-listy-na-probu" target="_blank" rel="noopener"&gt;
    &lt;div class="ad-bottom-icon"&gt;?&lt;/div&gt;
    &lt;div class="ad-bottom-text"&gt;
      &lt;h3&gt;Куски и листы на пробу&lt;/h3&gt;
      &lt;p&gt;Пробная партия · стоимость по запросу&lt;/p&gt;
    &lt;/div&gt;
  &lt;/a&gt;

  &lt;div class="ad-cta-block"&gt;
    &lt;h3&gt;Здесь может быть ваша реклама&lt;/h3&gt;
    &lt;p&gt;Разместим ваш бренд на страницах калькулятора&lt;/p&gt;
    &lt;a href="tel:+79028733690"&gt;Позвонить: 8 902 873-36-90&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;/div&gt;

&lt;script&gt;
// ============ ВКЛАДКИ ============
document.querySelectorAll('.tab').forEach(t=&gt;{
  t.addEventListener('click',()=&gt;{
    document.querySelectorAll('.tab').forEach(x=&gt;x.classList.remove('active'));
    document.querySelectorAll('.tab-content').forEach(x=&gt;x.classList.remove('active'));
    t.classList.add('active');
    document.getElementById('tab-'+t.dataset.tab).classList.add('active');
  });
});

// ============ БАННЕР ============
(function(){
  var root=document.getElementById('adb');if(!root)return;
  var INTERVAL=4500;
  var slides=root.querySelectorAll('.adb-slide');
  var dotsBox=root.querySelector('.adb-dots');
  var bar=root.querySelector('.adb-bar i');
  var N=slides.length,idx=0,timer=null,hover=false;

  function fit(){var w=root.getBoundingClientRect().width;root.style.fontSize=(w/22)+'px';}
  if(window.ResizeObserver)new ResizeObserver(fit).observe(root);
  window.addEventListener('resize',fit);fit();

  for(var i=0;i&lt;N;i++){var d=document.createElement('i');dotsBox.appendChild(d);}
  var dots=dotsBox.querySelectorAll('i');

  function restartBar(){
    if(!bar)return;
    bar.style.animation='none';
    void bar.offsetWidth;
    bar.style.animation='adb-fill '+INTERVAL+'ms linear';
  }
  var st=document.createElement('style');
  st.textContent='@keyframes adb-fill{from{width:0}to{width:100%}}';
  document.head.appendChild(st);

  function show(i){
    idx=(i+N)%N;
    slides.forEach(function(s,k){s.classList.toggle('active',k===idx);});
    dots.forEach(function(d,k){d.classList.toggle('on',k===idx);});
    restartBar();
  }
  function start(){
    stop();
    timer=setInterval(function(){if(!hover)show(idx+1);},INTERVAL);
    restartBar();
  }
  function stop(){if(timer){clearInterval(timer);timer=null;}}

  root.addEventListener('mouseenter',function(){hover=true;});
  root.addEventListener('mouseleave',function(){hover=false;});
  dots.forEach(function(d,k){d.addEventListener('click',function(){show(k);});});

  show(0);start();
})();

// ============ УТИЛИТЫ ============
const $=id=&gt;document.getElementById(id);
const deg=r=&gt;r*180/Math.PI, rad=d=&gt;d*Math.PI/180;
const fmt=(v,n=3)=&gt;v==null||isNaN(v)?'—':Number(v).toFixed(n);
function solveInv(t){if(t&lt;=0)return 0;let lo=1e-6,hi=1.45;while(Math.tan(hi)-hi&lt;t&amp;&amp;hi&lt;1.56)hi+=.01;for(let i=0;i&lt;100;i++){const m=(lo+hi)/2;if(Math.tan(m)-m&lt;t)lo=m;else hi=m}return(lo+hi)/2}
function inv(a){return Math.tan(a)-a}
function row(a,b,cls='val-cyan'){return `&lt;tr&gt;&lt;td&gt;${a}&lt;/td&gt;&lt;td class="${cls}"&gt;${b}&lt;/td&gt;&lt;/tr&gt;`}
function alertBox(msg,type='warn'){const cls={warn:'alert-warn',ok:'alert-ok',err:'alert-err'}[type];return `&lt;div class="alert ${cls}"&gt;${msg}&lt;/div&gt;`}

// ============ ВИЗУАЛИЗАЦИЯ: СЛОИ + ЗУМ + ПАН ============
const vizLayers = {tip:true, root:true, dev:true, base:true, grid:true, labels:false};
let vizZoom = 1;
let vizPan = {x:0, y:0};
let vizDragging = false;
let vizDragStart = null;

function toggleLayer(name, btn){
  vizLayers[name] = !vizLayers[name];
  btn.classList.toggle('on', vizLayers[name]);
  if(lastGeom) drawGears(lastGeom);
}
function zoomBy(f){
  vizZoom = Math.max(0.3, Math.min(4, vizZoom * f));
  if(lastGeom) drawGears(lastGeom);
}
function fitView(){
  vizZoom = 1; vizPan = {x:0, y:0};
  if(lastGeom) drawGears(lastGeom);
}

// ============ ВКЛАДКА 1: ГЕОМЕТРИЯ ============
const gType=$('g_type');
function updGeomFields(){
  const t=gType.value;
  $('g_beta_w').classList.toggle('hidden',t!=='helical');
  $('g_delta_w').classList.toggle('hidden',t!=='bevel'&amp;&amp;t!=='spiral');
  $('g_bsp_w').classList.toggle('hidden',t!=='spiral');
  $('g_x1_w').classList.toggle('hidden',t==='bevel'||t==='spiral');
  $('g_x2_w').classList.toggle('hidden',t==='bevel'||t==='spiral');
}
gType.addEventListener('change',updGeomFields);updGeomFields();

let lastGeom=null;
function calcGeometry(){
  const type=gType.value;
  const m=+$('g_m').value, z1=+$('g_z1').value, z2=+$('g_z2').value;
  const alpha=+$('g_alpha').value, ha=+$('g_ha').value, c=+$('g_c').value;
  const alphaR=rad(alpha);
  const warns=[];
  let R={};

  if(m&lt;=0){warns.push('Модуль должен быть положительным.');$('geomAlert').innerHTML=alertBox(warns.join('&lt;br&gt;'),'err');return}
  if(z1&lt;3||z2&lt;3){warns.push('z должно быть ≥ 3');$('geomAlert').innerHTML=alertBox(warns.join('&lt;br&gt;'),'err');return}

  if(type==='spur'||type==='helical'){
    const x1=+$('g_x1').value,x2=+$('g_x2').value;
    const betaDeg=type==='helical'?+$('g_beta').value:0;
    const betaR=rad(betaDeg),cosB=Math.cos(betaR);
    const mt=m/cosB;
    const alpha_t=Math.atan(Math.tan(alphaR)/cosB);
    const d1=mt*z1,d2=mt*z2;
    const db1=d1*Math.cos(alpha_t),db2=d2*Math.cos(alpha_t);
    const a_std=mt*(z1+z2)/2;
    const inv_t=inv(alpha_t);
    const inv_w=inv_t+2*(x1+x2)*Math.tan(alphaR)/(z1+z2);
    const alpha_w=solveInv(Math.max(0,inv_w));
    const cosAw=Math.cos(alpha_w);
    const aw=(cosAw&gt;1e-9)?a_std*Math.cos(alpha_t)/cosAw:a_std;
    const y=(z1+z2)/(2*cosB)*(Math.cos(alpha_t)/(cosAw||1)-1);
    const dY=(x1+x2)-y;
    const da1=d1+2*m*(ha+x1-dY);
    const da2=d2+2*m*(ha+x2-dY);
    const df1=d1-2*m*(ha+c-x1);
    const df2=d2-2*m*(ha+c-x2);
    const h=((da1-df1)+(da2-df2))/4;
    const p_t=Math.PI*mt,p_n=Math.PI*m,p_bt=p_t*Math.cos(alpha_t);
    const s_t1=mt*(Math.PI/2+2*x1*Math.tan(alphaR));
    const s_t2=mt*(Math.PI/2+2*x2*Math.tan(alphaR));
    const zv1=z1/Math.pow(cosB,3),zv2=z2/Math.pow(cosB,3);
    const zvMin=2*ha/Math.pow(Math.sin(alphaR),2);
    const zMin=zvMin*Math.pow(cosB,3);
    const xMin1=ha*(zvMin-zv1)/zvMin,xMin2=ha*(zvMin-zv2)/zvMin;
    if(x1&lt;xMin1-1e-6)warns.push(`z₁: для защиты от подрезания x₁ ≥ ${xMin1.toFixed(3)}`);
    if(x2&lt;xMin2-1e-6)warns.push(`z₂: для защиты от подрезания x₂ ≥ ${xMin2.toFixed(3)}`);
    if(z1&lt;zMin)warns.push(`z₁ &lt; минимума z ≈ ${zMin.toFixed(1)}`);
    if(z2&lt;zMin)warns.push(`z₂ &lt; минимума z ≈ ${zMin.toFixed(1)}`);
    if(type==='helical'&amp;&amp;betaDeg&lt;8)warns.push(`β=${betaDeg}° мал (обычно 8°…30°)`);
    const ra1=da1/2,ra2=da2/2,rb1=db1/2,rb2=db2/2;
    const g=Math.sqrt(Math.max(0,ra1*ra1-rb1*rb1))+Math.sqrt(Math.max(0,ra2*ra2-rb2*rb2))-aw*Math.sin(alpha_w);
    const eps=g/(Math.PI*mt*Math.cos(alpha_t));
    if(eps&lt;1)warns.push(`εα=${eps.toFixed(3)} &lt; 1 — возможен разрыв зацепления`);
    else if(eps&lt;1.1)warns.push(`εα=${eps.toFixed(3)} — низкий запас`);

    R={type,m,mt,alpha,beta:betaDeg,alpha_t:deg(alpha_t),alpha_w:deg(alpha_w),z1,z2,u:z2/z1,d1,d2,db1,db2,da1,da2,df1,df2,h,a_std,aw,p_t,p_n,p_bt,s_t1,s_t2,zv1,zv2,zMin,xMin1,xMin2,x1,x2,dY,eps};
  } else if(type==='bevel'||type==='spiral'){
    const d1Deg=+$('g_delta1').value,d1R=rad(d1Deg);
    const beta=type==='spiral'?+$('g_bsp').value:0;
    const d2R=Math.PI/2-d1R,d2Deg=deg(d2R);
    const exp=deg(Math.atan(z1/z2));
    if(Math.abs(d1Deg-exp)&gt;0.5)warns.push(`Для Σ=90° рекомендуется δ₁ ≈ ${exp.toFixed(2)}°`);
    const de1=m*z1,de2=m*z2;
    const Re=de1/(2*Math.sin(d1R));
    const da1=de1+2*m*Math.cos(d1R),da2=de2+2*m*Math.cos(d2R);
    const df1=de1-2.4*m*Math.cos(d1R),df2=de2-2.4*m*Math.cos(d2R);
    const h=2.2*m;
    const b=Math.min(10*m,0.3*Re);
    R={type,m,alpha,z1,z2,u:z2/z1,d1:de1,d2:de2,da1,da2,df1,df2,h,delta1:d1Deg,delta2:d2Deg,Re,b,beta,eps:1.0,bevel:true};
  } else {
    const d1=m*z1,d2=m*z2;
    const da1=d1+2.2*m,da2=d2+2.2*m;
    const df1=d1-2.6*m,df2=d2-2.6*m;
    const h=2.4*m,aw=(d1+d2)/2;
    warns.push('Эпициклоидная — приближённый расчёт');
    R={type,m,alpha,z1,z2,u:z2/z1,d1,d2,da1,da2,df1,df2,h,aw,eps:1.3,epicycloidal:true,beta:0};
  }

  lastGeom=R;
  renderGeom(R);
  renderGeomAlert(warns);
  fitView();
  updateExportPreview();
}

function renderGeom(R){
  const f=fmt,d=deg;
  const names={spur:'Прямозубая',helical:'Косозубая',bevel:'Коническая прямозубая',spiral:'Коническая круговой зуб',epicycloidal:'Эпициклоидная'};
  let t1='',t2='';
  t1+=row('Тип',names[R.type],'val-cyan');
  t1+=row('Модуль m',f(R.m)+' мм','val-green');
  if(R.type==='helical')t1+=row('Модуль m_t',f(R.mt)+' мм');
  t1+=row('Угол α',f(R.alpha)+'°');
  if(R.type==='helical'){t1+=row('Угол β',f(R.beta)+'°');t1+=row('Угол α_t',f(R.alpha_t)+'°');t1+=row('Угол α_w',f(R.alpha_w)+'°','val-pink')}
  if(R.bevel){t1+=row('δ₁ / δ₂',f(R.delta1,2)+'° / '+f(R.delta2,2)+'°','val-violet')}
  t1+=row('z₁ / z₂',R.z1+' / '+R.z2);
  t1+=row('Передаточное u',f(R.u,4));
  t1+=row('Делит. d₁',f(R.d1)+' мм','val-cyan');
  t1+=row('Делит. d₂',f(R.d2)+' мм','val-cyan');
  if(!R.bevel&amp;&amp;!R.epicycloidal){t1+=row('Основной db₁',f(R.db1)+' мм');t1+=row('Основной db₂',f(R.db2)+' мм')}
  t1+=row('Вершин da₁',f(R.da1)+' мм','val-green');
  t1+=row('Вершин da₂',f(R.da2)+' мм','val-green');
  t1+=row('Впадин df₁',f(R.df1)+' мм','val-pink');
  t1+=row('Впадин df₂',f(R.df2)+' мм','val-pink');
  t1+=row('Высота зуба h',f(R.h)+' мм');
  if(!R.bevel){t1+=row('Межос. a (стд)',f(R.a_std)+' мм');t1+=row('Межос. a_w (раб)',f(R.aw)+' мм','val-orange')}
  if(!R.bevel&amp;&amp;!R.epicycloidal){t1+=row('x₁ / x₂',f(R.x1,3)+' / '+f(R.x2,3));t1+=row('Δy',f(R.dY,4))}
  if(R.bevel)t1+=row('Конус. R_e',f(R.Re)+' мм');
  if(R.epicycloidal)t1+=row('Межос. a_w',f(R.aw)+' мм');

  if(!R.bevel&amp;&amp;!R.epicycloidal){
    t2+=row('z_v₁ / z_v₂',f(R.zv1,2)+' / '+f(R.zv2,2),'val-violet');
    t2+=row('z_min без подрез.',f(R.zMin,1));
    t2+=row('x₁_min / x₂_min',f(R.xMin1,3)+' / '+f(R.xMin2,3));
    t2+=row('Шаг p_t',f(R.p_t)+' мм');
    t2+=row('Шаг p_n',f(R.p_n)+' мм');
    t2+=row('Шаг p_bt',f(R.p_bt)+' мм');
    t2+=row('Толщина s_t₁',f(R.s_t1)+' мм','val-orange');
    t2+=row('Толщина s_t₂',f(R.s_t2)+' мм','val-orange');
  }
  t2+=row('ε_α (перекрытие)',f(R.eps,3),'val-yellow');
  if(R.bevel){t2+=row('Ширина b (рек.)',f(R.b)+' мм')}

  $('geomT1').innerHTML=t1;
  $('geomT2').innerHTML=t2;
}
function renderGeomAlert(w){
  if(!w||!w.length){$('geomAlert').innerHTML=alertBox('✓ Геометрия рассчитана без критичных отклонений.','ok');return}
  $('geomAlert').innerHTML=w.map(m=&gt;alertBox('⚠ '+m,'warn')).join('');
}

// ============ ВИЗУАЛИЗАЦИЯ ============
function drawGears(R){
  const cv=$('cvGeom'),ctx=cv.getContext('2d');
  const W=cv.width,H=cv.height;
  ctx.clearRect(0,0,W,H);

  ctx.save();
  ctx.translate(W/2 + vizPan.x, H/2 + vizPan.y);
  ctx.scale(vizZoom, vizZoom);
  ctx.translate(-W/2, -H/2);

  if(vizLayers.grid){
    ctx.strokeStyle='rgba(0,240,255,0.06)';ctx.lineWidth=1;
    for(let x=0;x&lt;W;x+=40){ctx.beginPath();ctx.moveTo(x,0);ctx.lineTo(x,H);ctx.stroke()}
    for(let y=0;y&lt;H;y+=40){ctx.beginPath();ctx.moveTo(0,y);ctx.lineTo(W,y);ctx.stroke()}
  }

  const maxD=Math.max(R.da1,R.da2);
  const scale=Math.min((W*0.62)/(R.d1+R.d2+40),H*0.36/(maxD+20));
  const gap=35;
  const cx1=(W-(R.d1+R.d2)*scale-gap)/2+R.d1*scale/2;
  const cx2=W-(W-(R.d1+R.d2)*scale-gap)/2-R.d2*scale/2;
  const cy=H/2;

  function drawGear(cx,cy,z,d,da,df,color,label,dbVal){
    const Ra=da/2*scale,Rf=df/2*scale,Rd=d/2*scale,Rb=dbVal?dbVal/2*scale:0;
    const step=2*Math.PI/z;

    ctx.beginPath();ctx.arc(cx,cy,Rf,0,2*Math.PI);
    ctx.fillStyle='rgba(10,20,40,0.7)';ctx.fill();

    ctx.shadowColor=color;ctx.shadowBlur=14;
    for(let i=0;i&lt;z;i++){
      const a=i*step-Math.PI/2;
      const a1=a+step*0.15,a2=a+step*0.85;
      ctx.beginPath();
      ctx.moveTo(cx+Rf*Math.cos(a),cy+Rf*Math.sin(a));
      ctx.lineTo(cx+Ra*Math.cos(a1),cy+Ra*Math.sin(a1));
      ctx.lineTo(cx+Ra*Math.cos(a2),cy+Ra*Math.sin(a2));
      ctx.lineTo(cx+Rf*Math.cos(a+step),cy+Rf*Math.sin(a+step));
      ctx.closePath();
      ctx.fillStyle=color+'cc';ctx.fill();
      ctx.strokeStyle='#fff';ctx.lineWidth=0.8;ctx.stroke();
    }
    ctx.shadowBlur=0;

    if(vizLayers.base &amp;&amp; Rb&gt;0){
      ctx.setLineDash([2,4]);
      ctx.strokeStyle='#39ff14';ctx.lineWidth=1.2;
      ctx.shadowColor='#39ff14';ctx.shadowBlur=8;
      ctx.beginPath();ctx.arc(cx,cy,Rb,0,2*Math.PI);ctx.stroke();
      ctx.setLineDash([]);ctx.shadowBlur=0;
    }

    if(vizLayers.dev){
      ctx.setLineDash([6,5]);
      ctx.strokeStyle='#f9ff00';ctx.lineWidth=1.5;
      ctx.shadowColor='#f9ff00';ctx.shadowBlur=12;
      ctx.beginPath();ctx.arc(cx,cy,Rd,0,2*Math.PI);ctx.stroke();
      ctx.setLineDash([]);ctx.shadowBlur=0;
    }

    if(vizLayers.tip){
      ctx.strokeStyle='#00f0ff';ctx.lineWidth=1;
      ctx.shadowColor='#00f0ff';ctx.shadowBlur=6;
      ctx.beginPath();ctx.arc(cx,cy,Ra,0,2*Math.PI);ctx.stroke();
      ctx.shadowBlur=0;
    }

    if(vizLayers.root){
      ctx.strokeStyle='#ff2bd6';ctx.lineWidth=1;
      ctx.shadowColor='#ff2bd6';ctx.shadowBlur=6;
      ctx.beginPath();ctx.arc(cx,cy,Rf,0,2*Math.PI);ctx.stroke();
      ctx.shadowBlur=0;
    }

    ctx.fillStyle='#fff';
    ctx.beginPath();ctx.arc(cx,cy,3,0,2*Math.PI);ctx.fill();

    if(vizLayers.labels){
      ctx.shadowColor=color;ctx.shadowBlur=10;
      ctx.fillStyle='#fff';ctx.font='bold 16px Segoe UI';ctx.textAlign='center';ctx.textBaseline='bottom';
      ctx.fillText(label,cx,cy-Ra-22);
      ctx.shadowBlur=0;
      ctx.fillStyle='rgba(255,255,255,0.75)';ctx.font='13px Consolas';
      ctx.fillText(`d=${d.toFixed(1)}`,cx,cy+Ra+22);
      ctx.fillText(`da=${da.toFixed(1)}`,cx,cy+Ra+38);
      ctx.fillText(`df=${df.toFixed(1)}`,cx,cy+Ra+54);
    }
  }

  drawGear(cx1,cy,R.z1,R.d1,R.da1,R.df1,'#00f0ff','z₁ = '+R.z1,R.db1);
  drawGear(cx2,cy,R.z2,R.d2,R.da2,R.df2,'#ff2bd6','z₂ = '+R.z2,R.db2);

  ctx.setLineDash([5,6]);ctx.strokeStyle='rgba(255,255,255,0.35)';ctx.lineWidth=1.2;
  ctx.beginPath();ctx.moveTo(cx1,cy+50);ctx.lineTo(cx2,cy+50);ctx.stroke();
  ctx.setLineDash([]);
  const awVal=(R.aw!=null?R.aw:(R.d1+R.d2)/2).toFixed(1);
  ctx.fillStyle='#f9ff00';ctx.font='bold 15px Consolas';ctx.textAlign='center';ctx.textBaseline='top';
  ctx.shadowColor='#f9ff00';ctx.shadowBlur=10;
  ctx.fillText(`a = ${awVal} мм`,(cx1+cx2)/2,cy+56);
  ctx.shadowBlur=0;

  ctx.fillStyle='rgba(255,255,255,0.3)';ctx.font='italic 13px Segoe UI';ctx.textAlign='right';
  const names={spur:'Прямозубая',helical:'Косозубая',bevel:'Коническая',spiral:'Круговой зуб',epicycloidal:'Эпициклоидная'};
  ctx.fillText(names[R.type]||R.type,W-24,H-16);

  ctx.restore();

  const stats=[
    {lbl:'z₁',val:R.z1},
    {lbl:'z₂',val:R.z2},
    {lbl:'u',val:fmt(R.u,3)},
    {lbl:'a, мм',val:fmt(R.a_std||R.aw)},
    {lbl:'ε_α',val:fmt(R.eps,3)},
    {lbl:'m, мм',val:fmt(R.m)}
  ];
  $('vizStats').innerHTML = stats.map(s=&gt;`&lt;div class="viz-stat"&gt;&lt;div class="lbl"&gt;${s.lbl}&lt;/div&gt;&lt;div class="val"&gt;${s.val}&lt;/div&gt;&lt;/div&gt;`).join('');
}

// Пан и зум мышью
(function(){
  const cv=$('cvGeom');
  cv.addEventListener('mousedown',e=&gt;{
    vizDragging=true;
    vizDragStart={x:e.clientX-vizPan.x,y:e.clientY-vizPan.y};
    cv.style.cursor='grabbing';
  });
  cv.addEventListener('mousemove',e=&gt;{
    if(!vizDragging)return;
    vizPan.x=e.clientX-vizDragStart.x;
    vizPan.y=e.clientY-vizDragStart.y;
    if(lastGeom)drawGears(lastGeom);
  });
  window.addEventListener('mouseup',()=&gt;{
    vizDragging=false;
    cv.style.cursor='grab';
  });
  cv.addEventListener('wheel',e=&gt;{
    e.preventDefault();
    zoomBy(e.deltaY&lt;0?1.1:0.9);
  },{passive:false});
})();

// ============ ВКЛАДКА 2: ПОДБОР ============
function calcReverse(){
  const mode=$('rv_mode').value;
  const z=+$('rv_z').value,z2=+$('rv_z2').value,v=+$('rv_val').value;
  let m_calc=null,text='';
  if(mode==='da'){m_calc=v/(z+2);text=`m ≈ da / (z+2) = ${v} / ${z+2}`}
  else if(mode==='a'){m_calc=2*v/(z+z2);text=`m ≈ 2a / (z₁+z₂) = 2·${v} / ${z+z2}`}
  else if(mode==='p'){m_calc=v/Math.PI;text=`m = p / π = ${v} / π`}
  else if(mode==='h'){m_calc=v/2.25;text=`m ≈ h / 2.25 = ${v} / 2.25`}
  const series=[0.5,0.6,0.8,1,1.25,1.5,2,2.5,3,4,5,6,8,10,12,16,20,25];
  let best=series[0],bd=1e9;
  series.forEach(s=&gt;{const d=Math.abs(s-m_calc);if(d&lt;bd){bd=d;best=s}});
  let html=alertBox(`Расчётный модуль: &lt;b&gt;${m_calc.toFixed(3)} мм&lt;/b&gt;`,'ok');
  html+=alertBox(`Формула: ${text}`,'warn');
  html+=alertBox(`Ближайший стандартный модуль (ГОСТ 9563): &lt;b&gt;m = ${best} мм&lt;/b&gt; (отклонение ${(bd/m_calc*100).toFixed(2)}%)`,'ok');
  if(bd/m_calc&gt;0.05)html+=alertBox('⚠ Отклонение от стандарта &gt;5% — возможна нестандартная передача или смещение','warn');
  $('rvOut').innerHTML=html;
}

// ============ ВКЛАДКА 3: ПРОИЗВОДСТВО ============
function calcIndexHead(){
  const N=+$('pr_N').value,z=+$('pr_z').value;
  const turns=N/z;
  const full=Math.floor(turns);
  const frac=turns-full;
  const holes=[15,16,17,18,19,20,21,23,24,27,29,30,31,33,34,37,39,41,42,43,47,49,51,53,54,57,58,59,62,66,71,79,81,83,89,93,97];
  let best=null;
  for(const h of holes){const n=Math.round(frac*h);if(Math.abs(n/h-frac)&lt;1e-6){best={h,n};break}}
  if(!best){
    let bd=1e9;
    for(const h of holes){for(let n=0;n&lt;h;n++){const d=Math.abs(n/h-frac);if(d&lt;bd){bd=d;best={h,n}}}}
  }
  let html=alertBox(`Оборотов рукоятки: &lt;b&gt;${turns.toFixed(4)}&lt;/b&gt;`,'ok');
  html+=alertBox(`Целых оборотов: &lt;b&gt;${full}&lt;/b&gt;`,'ok');
  if(best){
    const {h,n}=best;
    if(n&gt;0)html+=alertBox(`+ &lt;b&gt;${n}&lt;/b&gt; отверстий на диске с &lt;b&gt;${h}&lt;/b&gt; отверстиями`,'ok');
    else html+=alertBox('Дробной части нет — только целые обороты','ok');
    html+='&lt;table class="data" style="margin-top:12px"&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Диск&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Отверстий&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Ошибка&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;';
    const opts=[];
    for(const hh of holes){for(let n=0;n&lt;hh;n++){const d=Math.abs(n/hh-frac);if(d&lt;0.001&amp;&amp;n&gt;0)opts.push({h:hh,n,err:d})}}
    opts.sort((a,b)=&gt;a.err-b.err).slice(0,5).forEach(o=&gt;{
      html+=`&lt;tr&gt;&lt;td&gt;${o.h}&lt;/td&gt;&lt;td class="val-cyan"&gt;${o.n}&lt;/td&gt;&lt;td&gt;${(o.err*100).toFixed(4)}%&lt;/td&gt;&lt;/tr&gt;`;
    });
    html+='&lt;/table&gt;';
  }
  $('prIndexOut').innerHTML=html;
}

function calcCutter(){
  const type=$('fr_type').value;
  const z=+$('fr_z').value,beta=+$('fr_beta').value,alpha=+$('fr_alpha').value;
  const cosB=Math.cos(rad(beta));
  const zv=(type==='helical')?z/Math.pow(cosB,3):z;
  const ranges=[
    {n:1,from:135,to:Infinity},
    {n:2,from:55,to:134},
    {n:3,from:35,to:54},
    {n:4,from:26,to:34},
    {n:5,from:21,to:25},
    {n:6,from:17,to:20},
    {n:7,from:14,to:16},
    {n:8,from:10,to:13}
  ];
  const found=ranges.find(r=&gt;zv&gt;=r.from&amp;&amp;zv&lt;=r.to);
  let html=alertBox(`Эквивалентное z_v = &lt;b&gt;${zv.toFixed(2)}&lt;/b&gt; ${type==='helical'?'(z/cos³β)':''}`,'ok');
  if(found)html+=alertBox(`Номер модульной фрезы: &lt;b&gt;№ ${found.n}&lt;/b&gt; (диапазон ${found.from}${found.to===Infinity?'+':'…'+found.to} зубьев)`,'ok');
  else html+=alertBox('Вне стандартного ряда фрез','err');
  if(zv&lt;17&amp;&amp;alpha===20)html+=alertBox('⚠ z_v &lt; 17 — возможно подрезание, требуется смещение x','warn');
  $('prCutterOut').innerHTML=html;
}

// ============ ВКЛАДКА 4: КОНТРОЛЬ ============
function calcMeasure(){
  const m=+$('c_m').value,z=+$('c_z').value,alpha=+$('c_alpha').value,beta=+$('c_beta').value,x=+$('c_x').value,dp=+$('c_dp').value;
  const type=$('c_type').value;
  const alphaR=rad(alpha),betaR=rad(beta),cosB=Math.cos(betaR);
  const mt=m/cosB;
  const alpha_t=Math.atan(Math.tan(alphaR)/cosB);
  const d=mt*z,db=d*Math.cos(alpha_t);
  const inv_t=inv(alpha_t);
  const invM=inv_t+dp/(d*Math.cos(alpha_t))+2*x*Math.tan(alphaR)/z+Math.PI/z;
  const alphaM=solveInv(Math.max(0,invM));
  const cosM=Math.cos(alphaM);
  let M=(cosM&gt;1e-9)?d*Math.cos(alpha_t)/cosM+dp:d+dp;
  if(type==='external_odd')M=d*Math.cos(alpha_t)/cosM*Math.cos(Math.PI/(2*z))+dp;

  const k=Math.round(z/9.5+0.5);
  const kGeneral=Math.round(z/Math.PI*Math.tan(alpha_t)-z*inv_t/Math.PI+0.5);
  const W=m*Math.cos(alphaR)*((k-0.5)*Math.PI+z*inv_t+2*x*Math.tan(alphaR));

  let html=alertBox(`Размер по ролику M = &lt;b&gt;${M.toFixed(3)} мм&lt;/b&gt; (ролик d_p = ${dp} мм)`,'ok');
  html+=alertBox(`Угол α_M = ${deg(alphaM).toFixed(3)}°`,'ok');
  html+=alertBox(`Общая нормаль W = &lt;b&gt;${W.toFixed(3)} мм&lt;/b&gt; (k = ${k} зуб.)`,'ok');
  html+=alertBox(`Толщина зуба по делительной s_t = ${(mt*(Math.PI/2+2*x*Math.tan(alphaR))).toFixed(3)} мм`,'ok');
  html+=alertBox(`Делительный d = ${d.toFixed(3)} мм, основной db = ${db.toFixed(3)} мм`,'ok');
  if(z&lt;17)html+=alertBox('⚠ z &lt; 17 — возможна интерференция, проверить x','warn');
  $('ctrlOut').innerHTML=html;
}

// ============ ВКЛАДКА 5: ПРОЧНОСТЬ ============
function calcStrength(){
  const P=+$('s_P').value,n=+$('s_n').value,m=+$('s_m').value;
  const z1=+$('s_z1').value,z2=+$('s_z2').value,beta=+$('s_beta').value,b=+$('s_b').value;
  const K=+$('s_K').value,mat=$('s_mat').value;
  const betaR=rad(beta),cosB=Math.cos(betaR);
  const mt=m/cosB;
  const d1=mt*z1;
  const T=P*1000/(2*Math.PI*n/60);
  const Ft=2*T*1000/d1;
  const u=z2/z1;
  const matProps={steel:{ZE:274,sH:580,sF:400},steel_h:{ZE:274,sH:900,sF:700},iron:{ZE:165,sH:400,sF:200}};
  const mp=matProps[mat];
  const ZH=1.77;
  const Ze=0.85;
  const sH=mp.ZE*ZH*Ze*Math.sqrt(Ft*K*(u+1)/(b*d1*u));
  const YF=3.6;
  const Ye=0.75,Yb=0.9;
  const sF=Ft*K*YF*Ye*Yb/(b*m);

  let html='';
  html+=alertBox(`Крутящий момент T = &lt;b&gt;${T.toFixed(2)} Н·м&lt;/b&gt;`,'ok');
  html+=alertBox(`Окружная сила F_t = &lt;b&gt;${Ft.toFixed(0)} Н&lt;/b&gt;`,'ok');
  html+='&lt;h3 style="color:var(--neon-cyan);margin:14px 0 8px;text-shadow:0 0 8px var(--neon-cyan)"&gt;КОНТАКТНАЯ ПРОЧНОСТЬ&lt;/h3&gt;';
  html+=alertBox(`σ_H = &lt;b&gt;${sH.toFixed(0)} МПа&lt;/b&gt;`,'ok');
  html+=alertBox(`Допускаемое [σ]_H = ${mp.sH} МПа`,'ok');
  if(sH&lt;=mp.sH)html+=alertBox(`✓ Запас по контакту: ${((mp.sH/sH-1)*100).toFixed(1)}%`,'ok');
  else html+=alertBox(`✗ Превышение на ${((sH/mp.sH-1)*100).toFixed(1)}% — увеличить модуль/ширину/твёрдость`,'err');
  html+='&lt;h3 style="color:var(--neon-pink);margin:14px 0 8px;text-shadow:0 0 8px var(--neon-pink)"&gt;ИЗГИБНАЯ ПРОЧНОСТЬ&lt;/h3&gt;';
  html+=alertBox(`σ_F = &lt;b&gt;${sF.toFixed(0)} МПа&lt;/b&gt;`,'ok');
  html+=alertBox(`Допускаемое [σ]_F = ${mp.sF} МПа`,'ok');
  if(sF&lt;=mp.sF)html+=alertBox(`✓ Запас по изгибу: ${((mp.sF/sF-1)*100).toFixed(1)}%`,'ok');
  else html+=alertBox(`✗ Превышение на ${((sF/mp.sF-1)*100).toFixed(1)}% — возможно разрушение зуба`,'err');
  $('strOut').innerHTML=html;
}

// ============ ВКЛАДКА 6: ЭКСПОРТ ============
function buildReport(){
  if(!lastGeom)return 'Сначала рассчитайте геометрию.';
  const R=lastGeom;
  const L=[];
  L.push('═══════════════════════════════════════');
  L.push('      ОТЧЁТ ПО ЗУБЧАТОЙ ПЕРЕДАЧЕ');
  L.push('═══════════════════════════════════════');
  L.push(`Дата: ${new Date().toLocaleString('ru-RU')}`);
  L.push('');
  L.push(`Тип: ${R.type}`);
  L.push(`Модуль m: ${fmt(R.m)} мм`);
  if(R.mt!=null)L.push(`Торцовый m_t: ${fmt(R.mt)} мм`);
  L.push(`Угол α: ${fmt(R.alpha)}°`);
  if(R.beta!=null)L.push(`Угол β: ${fmt(R.beta)}°`);
  L.push('');
  L.push('───── ШЕСТЕРНЯ z₁ ─────');
  L.push(`z₁ = ${R.z1}`);
  L.push(`d₁ = ${fmt(R.d1)} мм`);
  L.push(`da₁ = ${fmt(R.da1)} мм`);
  L.push(`df₁ = ${fmt(R.df1)} мм`);
  if(R.db1!=null)L.push(`db₁ = ${fmt(R.db1)} мм`);
  if(R.s_t1!=null)L.push(`Толщина s_t₁ = ${fmt(R.s_t1)} мм`);
  L.push('───── КОЛЕСО z₂ ─────');
  L.push(`z₂ = ${R.z2}`);
  L.push(`d₂ = ${fmt(R.d2)} мм`);
  L.push(`da₂ = ${fmt(R.da2)} мм`);
  L.push(`df₂ = ${fmt(R.df2)} мм`);
  if(R.db2!=null)L.push(`db₂ = ${fmt(R.db2)} мм`);
  if(R.s_t2!=null)L.push(`Толщина s_t₂ = ${fmt(R.s_t2)} мм`);
  L.push('───── ПАРАМЕТРЫ ПЕРЕДАЧИ ─────');
  L.push(`u = ${fmt(R.u,4)}`);
  L.push(`Высота зуба h = ${fmt(R.h)} мм`);
  if(R.a_std!=null)L.push(`a = ${fmt(R.a_std)} мм`);
  if(R.aw!=null)L.push(`a_w = ${fmt(R.aw)} мм`);
  if(R.eps!=null)L.push(`ε_α = ${fmt(R.eps,3)}`);
  if(R.zv1!=null)L.push(`z_v₁/z_v₂ = ${fmt(R.zv1,2)} / ${fmt(R.zv2,2)}`);
  if(R.bevel){L.push(`δ₁=${fmt(R.delta1,2)}° δ₂=${fmt(R.delta2,2)}°`);L.push(`R_e=${fmt(R.Re)} мм`);L.push(`b=${fmt(R.b)} мм`)}
  return L.join('\n');
}
function updateExportPreview(){$('expPreview').textContent=buildReport()}

function exportPDF(){
  const r=buildReport();
  if(r.startsWith('Сначала')){alert(r);return}
  window.print();
}
function exportDXF(){
  if(!lastGeom){alert('Сначала рассчитайте геометрию.');return}
  const R=lastGeom;
  if(R.bevel||R.epicycloidal){alert('DXF-экспорт только для цилиндрических.');return}
  const m=R.m,z=R.z1,d=R.d1,db=R.db1||d*Math.cos(rad(R.alpha)),da=R.da1,df=R.df1;
  const lines=[];
  lines.push('0','SECTION','2','ENTITIES');
  lines.push('0','CIRCLE','8','DEVIDER','10','0','20','0','40',d/2);
  lines.push('0','CIRCLE','8','TIP','10','0','20','0','40',da/2);
  lines.push('0','CIRCLE','8','ROOT','10','0','20','0','40',df/2);
  if(db!=null)lines.push('0','CIRCLE','8','BASE','10','0','20','0','40',db/2);
  const pts=[];
  const tMax=Math.sqrt(Math.max(0,(da/2)*(da/2)-(db/2)*(db/2)))/(db/2);
  for(let i=0;i&lt;=20;i++){
    const t=tMax*i/20;
    const x=db/2*(Math.cos(t)+t*Math.sin(t));
    const y=db/2*(Math.sin(t)-t*Math.cos(t));
    pts.push([x,y]);
  }
  lines.push('0','LWPOLYLINE','8','INVOLUTE','90',pts.length,'70','0');
  pts.forEach(p=&gt;{lines.push('10',p[0].toFixed(4),'20',p[1].toFixed(4))});
  lines.push('0','ENDSEC','0','EOF');
  const blob=new Blob([lines.join('\n')],{type:'application/dxf'});
  const a=document.createElement('a');
  a.href=URL.createObjectURL(blob);
  a.download=`gear_z${z}_m${m}.dxf`;
  a.click();
  URL.revokeObjectURL(a.href);
}
function copyReport(){
  const r=buildReport();
  navigator.clipboard.writeText(r).then(()=&gt;alert('Отчёт скопирован в буфер обмена.'));
}

// Первый расчёт
calcGeometry();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</subtitle>
  <updated>2026-10-09T09:45:00Z</updated>
  <logo>https://pandoraburo.ru/ssl/u/pic/07/26436cc3c611f19d9efcd8c4a10874/-/0c723f71762611f1b3964aaba1665535.jpg</logo>
  <author>
    <name>1592962</name>
    <uri>https://www.pandoraburo.ru/</uri>
  </author>
</feed>
