<?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/lite-metallav-kalkulyator</id>
  <link href="https://www.pandoraburo.ru/lite-metallav-kalkulyator.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;Калькулятор отливок и шаров · Арсенал-Деталь&lt;/title&gt;
&lt;style&gt;
  :root {
    --bg:#0a0a0a; --bg2:#111111; --bg3:#16130a;
    --line:#d4af37; --gold:#d4af37; --goldB:#f0d060; --goldD:#8a7020;
    --red:#e74c3c; --green:#2ecc71; --cyan:#6ee8e4;
    --ad-gold:#d4af37; --ad-goldB:#f0d060;
  }
  * { box-sizing: border-box; margin: 0; padding: 0; }
  body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    background: var(--bg); color: var(--gold); line-height: 1.5; padding: 20px 14px 200px;
  }
  ::selection { background: var(--gold); color: #000; }
  .wrap { max-width: 1300px; margin: 0 auto; }

  /* ============ БАННЕР СВЕРХУ ============ */
  .adb-top-wrap { max-width:640px; margin:0 auto 24px; 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)); }

  /* ============ БЕГУЩАЯ СТРОКА ============ */
  .ticker-block { display:flex; align-items:stretch; background:var(--bg);
    border:1px solid var(--line); border-radius:8px; overflow:hidden;
    margin-bottom:14px; height:44px; }
  .ticker-label { background:var(--gold); color:#0a0a0a; font-weight:800; font-size:12px;
    letter-spacing:1.5px; padding:0 16px; display:flex; align-items:center; white-space:nowrap; }
  .ticker-viewport { flex:1; overflow:hidden; position:relative; }
  .ticker-track { display:inline-flex; align-items:center; height:100%; white-space:nowrap;
    animation:tickerScroll 50s linear infinite; padding-left:20px; }
  .ticker-item { color:var(--gold); font-size:13px; padding:0 10px; letter-spacing:.3px; }
  .ticker-item b { color:var(--goldB); font-weight:700; }
  .ticker-dot { color:var(--gold); font-size:10px; }
  @keyframes tickerScroll { 0% { transform:translateX(0); } 100% { transform:translateX(-50%); } }

  /* ============ РЕКЛАМНАЯ ПОЛОСА ============ */
  .ad-strip { display:grid; grid-template-columns:1fr 1fr; gap:12px; margin-bottom:14px; }
  @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; }

  /* ============ ШАПКА ============ */
  header { background:var(--bg); border:1px solid var(--line); border-radius:12px;
    padding:30px 25px; text-align:center; margin-bottom:14px; }
  .banner-tag { display:inline-block; background:var(--gold); color:#0a0a0a;
    font-size:11px; font-weight:800; letter-spacing:2px; padding:4px 14px;
    border-radius:999px; margin-bottom:14px; }
  header h1 { margin:0 0 12px 0; font-size:28px; color:var(--gold);
    text-transform:uppercase; letter-spacing:3px; font-weight:800; }
  .banner-line { width:60px; height:2px; background:var(--gold); margin:0 auto 14px; }
  header p { margin:0; color:var(--gold); font-size:15px; letter-spacing:.5px; opacity:.9; }

  /* ============ ТУЛБАР ============ */
  .promo-toolbar { display:flex; flex-wrap:wrap; gap:8px; margin-bottom:14px; }
  .promo-btn { display:inline-flex; align-items:center; gap:6px; padding:10px 16px;
    border-radius:9px; border:1px solid var(--gold); background:transparent;
    color:var(--gold); font-size:13px; font-weight:700; cursor:pointer;
    transition:.15s; font-family:inherit; letter-spacing:.3px; }
  .promo-btn:hover { background:var(--gold); color:#0a0a0a; }
  .promo-btn.primary { background:var(--gold); color:#0a0a0a; }
  .promo-btn.primary:hover { background:var(--goldB); }
  .promo-btn.danger { border-color:var(--red); color:var(--red); }
  .promo-btn.danger:hover { background:var(--red); color:#0a0a0a; }

  /* ============ КАЛЬКУЛЯТОР ============ */
  .calc-grid { display:grid; grid-template-columns:1fr; gap:14px; margin-bottom:14px; }
  .calc-block { background:var(--bg); border:1px solid var(--line); border-radius:12px; padding:20px; }
  .calc-title { color:var(--gold); font-size:12px; font-weight:800; letter-spacing:2px;
    text-transform:uppercase; padding-bottom:12px; margin-bottom:16px;
    border-bottom:1px solid var(--line); text-align:center; }
  .input-grid { display:grid; grid-template-columns:1fr 1fr; gap:20px; }
  @media (max-width:860px) { .input-grid { grid-template-columns:1fr; } }

  .field { display:flex; flex-direction:column; gap:6px; margin-bottom:14px; }
  .field label { font-size:11px; font-weight:700; color:var(--gold);
    text-transform:uppercase; letter-spacing:1px; opacity:.8; }
  .field input, .field select { padding:12px 14px; border:1px solid var(--line);
    border-radius:9px; font-size:14px; background:var(--bg); color:var(--gold);
    outline:none; transition:.15s; font-family:inherit; font-variant-numeric:tabular-nums; }
  .field input:focus, .field select:focus { border-color:var(--goldB); box-shadow:0 0 0 3px rgba(212,175,55,.2); }
  .field select option { background:var(--bg); color:var(--gold); }
  .field input.error { border-color:var(--red); box-shadow:0 0 0 3px rgba(231,76,60,.2); }
  .field-hint { font-size:11px; color:var(--gold); opacity:.55; font-style:italic; }
  .field-row { display:grid; grid-template-columns:1fr 1fr; gap:10px; }

  .shape-grid { display:grid; grid-template-columns:repeat(3,1fr); gap:8px; margin-bottom:16px; }
  .shape-btn { padding:14px 8px; background:var(--bg); border:1px solid var(--line);
    border-radius:9px; cursor:pointer; text-align:center; transition:.15s;
    color:var(--gold); font-family:inherit; }
  .shape-btn:hover { background:rgba(212,175,55,.1); }
  .shape-btn.active { background:var(--gold); color:#0a0a0a; }
  .shape-icon { font-size:22px; display:block; margin-bottom:4px; }
  .shape-name { font-size:11px; font-weight:800; letter-spacing:.5px; text-transform:uppercase; }

  .mode-toggle { display:flex; gap:8px; margin-bottom:16px; }
  .mode-btn { flex:1; padding:10px 14px; background:var(--bg); border:1px solid var(--line);
    border-radius:9px; cursor:pointer; font-size:13px; font-weight:700;
    color:var(--gold); transition:.15s; font-family:inherit; }
  .mode-btn.active { background:var(--gold); color:#0a0a0a; }

  /* ============ БЛОК СКИДКИ ============ */
  .discount-banner{
    background:linear-gradient(135deg,rgba(125,255,125,.12),rgba(10,10,10,.9));
    border:3px solid var(--green);border-radius:16px;
    padding:22px 26px;margin-bottom:16px;
    text-align:center;position:relative;
    box-shadow:0 0 40px rgba(125,255,125,.2);
    transition:all .4s;
  }
  .discount-banner.active{
    background:linear-gradient(135deg,rgba(125,255,125,.25),rgba(10,10,10,.9));
    box-shadow:0 0 60px rgba(125,255,125,.5),inset 0 0 30px rgba(125,255,125,.15);
    animation:discountActive 1.5s ease-in-out infinite;
  }
  @keyframes discountActive{
    0%,100%{box-shadow:0 0 60px rgba(125,255,125,.5),inset 0 0 30px rgba(125,255,125,.15);}
    50%{box-shadow:0 0 80px rgba(125,255,125,.8),inset 0 0 40px rgba(125,255,125,.25);}
  }
  .discount-banner::before{
    content:'★ СКИДКА ОТ ОБЪЁМА ★';
    position:absolute;top:-14px;left:50%;transform:translateX(-50%);
    background:#0a0a0a;color:var(--green);
    padding:4px 22px;border:2px solid var(--green);border-radius:999px;
    font-size:12px;font-weight:900;letter-spacing:3px;
    text-shadow:0 0 15px rgba(125,255,125,1);
    white-space:nowrap;box-shadow:0 0 20px rgba(125,255,125,.6);
  }
  .discount-banner h3{
    color:var(--green);font-size:20px;font-weight:900;
    letter-spacing:1.5px;text-transform:uppercase;
    margin-bottom:12px;
    text-shadow:0 0 15px rgba(125,255,125,.7);
  }
  .discount-banner p{
    color:#c8e8c8;font-size:14px;
    margin-bottom:16px;line-height:1.6;
  }
  .discount-banner p b{color:#fff;}

  .progress-wrap{
    max-width:700px;margin:0 auto 16px;
    background:#0a0a0a;border:2px solid var(--green);
    border-radius:999px;height:36px;position:relative;overflow:hidden;
  }
  .progress-fill{
    height:100%;background:linear-gradient(90deg,#3aa03a,#7dff7d,#3aa03a);
    background-size:200% 100%;
    width:0%;transition:width .5s ease-out;
    animation:progressShine 2s linear infinite;
    border-radius:999px;
    box-shadow:0 0 20px rgba(125,255,125,.7);
  }
  @keyframes progressShine{0%{background-position:200% 0;}100%{background-position:-200% 0;}}
  .progress-label{
    position:absolute;inset:0;
    display:flex;align-items:center;justify-content:center;
    color:#fff;font-size:13px;font-weight:900;
    text-shadow:0 1px 3px rgba(0,0,0,.9);
    z-index:2;letter-spacing:.5px;
  }
  .progress-label b{color:var(--gold);font-size:14px;}

  .discount-stats{
    display:grid;grid-template-columns:repeat(3,1fr);
    gap:12px;max-width:800px;margin:0 auto;
  }
  @media(max-width:600px){.discount-stats{grid-template-columns:1fr;}}
  .discount-stat{
    background:rgba(0,0,0,.5);border:1px solid var(--green);
    border-radius:10px;padding:12px;
    display:flex;flex-direction:column;gap:4px;text-align:center;
  }
  .discount-stat .lbl{
    font-size:9px;font-weight:800;text-transform:uppercase;
    letter-spacing:1.2px;color:var(--green);opacity:.8;
  }
  .discount-stat .val{
    font-size:18px;font-weight:900;color:var(--green);
    font-variant-numeric:tabular-nums;
  }
  .discount-stat .val.new{color:var(--goldB);font-size:20px;}

  /* ============ РЕЗУЛЬТАТ ============ */
  .result-block { background:var(--bg); border:1px solid var(--line); border-radius:12px;
    padding:20px; margin-bottom:14px; }
  .result-grid { display:grid; grid-template-columns:repeat(6,1fr); gap:12px; margin-bottom:16px; }
  @media (max-width:1000px) { .result-grid { grid-template-columns:repeat(3,1fr); } }
  @media (max-width:700px) { .result-grid { grid-template-columns:1fr 1fr; } }
  .result-item { background:#0a0a0a; border:1px solid rgba(212,175,55,.3);
    border-radius:9px; padding:14px; text-align:center; }
  .result-label { font-size:10px; font-weight:700; letter-spacing:1px;
    text-transform:uppercase; color:var(--gold); opacity:.7; margin-bottom:6px; }
  .result-value { font-size:22px; font-weight:800; color:var(--goldB);
    line-height:1.1; font-variant-numeric:tabular-nums; word-break:break-word; }
  .result-value.small { font-size:18px; }
  .result-value.green { color:var(--green); }
  .result-unit { font-size:12px; color:var(--gold); opacity:.7; font-weight:600; margin-left:3px; }

  .result-total { background:linear-gradient(135deg,#1a1408,#0a0a0a);
    border:2px solid var(--gold); border-radius:12px; padding:20px;
    text-align:center; margin-top:8px; transition:all .4s; }
  .result-total.discount-active {
    background:linear-gradient(135deg,rgba(46,204,113,.2),rgba(10,10,10,.95));
    border-color:var(--green);
    box-shadow:0 0 40px rgba(46,204,113,.4);
  }
  .result-total-label { font-size:12px; font-weight:800; letter-spacing:2px;
    text-transform:uppercase; color:var(--gold); opacity:.8; margin-bottom:8px; }
  .result-total.discount-active .result-total-label { color:var(--green); }
  .result-total-value { font-size:40px; font-weight:800; color:var(--goldB);
    line-height:1; font-variant-numeric:tabular-nums; word-break:break-word; }
  .result-total.discount-active .result-total-value { color:var(--green); }
  .result-total-note { font-size:12px; color:var(--gold); opacity:.7; margin-top:8px; }
  .result-total.discount-active .result-total-note { color:#c8e8c8; }

  .warn { background:rgba(231,76,60,.1); border:1px solid var(--red);
    border-left:4px solid var(--red); border-radius:8px; padding:12px 16px;
    margin-bottom:12px; color:#ff8a7a; font-size:13px; display:none; }
  .warn.show { display:block; }
  .warn b { color:#ffaa99; }

  /* ============ SUMMARY ============ */
  .summary-block { background:var(--bg); border:1px solid var(--line);
    border-radius:12px; padding:20px; margin-bottom:14px; }
  .summary-table { width:100%; border-collapse:collapse; font-size:14px; }
  .summary-table td { padding:10px 12px; border-bottom:1px solid rgba(212,175,55,.2); color:var(--gold); }
  .summary-table td:first-child { color:var(--gold); opacity:.8; width:60%; }
  .summary-table td:last-child { color:var(--goldB); font-weight:700; text-align:right;
    font-variant-numeric:tabular-nums; white-space:nowrap; }
  .summary-table tr:last-child td { border-bottom:none; }
  .summary-table .highlight-row td { background:rgba(46,204,113,.08); }
  .summary-table .highlight-row td:last-child { color:var(--green); }

  /* ============ CTA ============ */
  .cta-section { text-align:center; background:var(--bg); border:1px solid var(--gold);
    border-radius:12px; padding:28px 20px; margin-top:14px; }
  .cta-text { font-size:16px; font-weight:600; color:var(--gold); margin:0 0 16px 0; }
  .cta-button { display:inline-block; background:var(--gold); color:#0a0a0a !important;
    text-decoration:none; padding:16px 40px; font-size:20px; font-weight:800;
    letter-spacing:1px; border-radius:999px; transition:.25s; }
  .cta-button:hover { background:var(--goldB); transform:scale(1.03); }
  .manager-info { margin:16px 0 0 0; font-size:13px; color:var(--gold); opacity:.8; }

  .seo-text { position:absolute; width:1px; height:1px; padding:0; margin:-1px;
    overflow:hidden; clip:rect(0,0,0,0); border:0; }

  /* ============ STICKY-БАР ============ */
  .sticky-bar{position:fixed;left:0;right:0;bottom:0;
    background:linear-gradient(180deg,rgba(10,10,10,.95),#0a0a0a);
    border-top:3px solid var(--gold);
    box-shadow:0 -10px 40px rgba(255,215,0,.25),0 -4px 15px rgba(0,0,0,.8);
    padding:14px 20px;z-index:1000;
    transform:translateY(110%);
    transition:transform .35s cubic-bezier(.34,1.56,.64,1);
    backdrop-filter:blur(8px);}
  .sticky-bar.show{transform:translateY(0);}
  .sticky-bar.discount-active{border-top-color:var(--green);
    box-shadow:0 -10px 40px rgba(125,255,125,.4),0 -4px 15px rgba(0,0,0,.8);}
  .sticky-bar::before{content:'';position:absolute;top:-3px;left:0;right:0;height:3px;
    background:linear-gradient(90deg,transparent,var(--gold),#FF8C00,var(--gold),transparent);
    background-size:200% 100%;animation:barShine 3s linear infinite;}
  .sticky-bar.discount-active::before{
    background:linear-gradient(90deg,transparent,var(--green),#3aa03a,var(--green),transparent);
    background-size:200% 100%;}
  @keyframes barShine{0%{background-position:200% 0;}100%{background-position:-200% 0;}}
  .sticky-inner{max-width:1300px;margin:0 auto;display:flex;align-items:center;gap:16px;flex-wrap:wrap;}
  .sticky-info{display:flex;gap:16px;align-items:center;flex-wrap:wrap;flex:1;}
  .sticky-stat{display:flex;flex-direction:column;gap:2px;padding:6px 14px;border-left:2px solid var(--gold);}
  .sticky-stat:first-child{border-left:none;padding-left:0;}
  .sticky-stat .lbl{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:1.2px;color:var(--gold);opacity:.7;margin:0;}
  .sticky-stat .val{font-size:18px;font-weight:900;color:var(--goldB);line-height:1;font-variant-numeric:tabular-nums;}
  .sticky-stat .val.big{font-size:26px;color:var(--gold);text-shadow:0 0 15px rgba(255,215,0,.7);animation:totalPulse 1.5s ease-in-out infinite;}
  @keyframes totalPulse{0%,100%{text-shadow:0 0 15px rgba(255,215,0,.7);}50%{text-shadow:0 0 25px rgba(255,215,0,1),0 0 40px rgba(255,140,0,.6);}}
  .sticky-bar.discount-active .sticky-stat{border-color:var(--green);}
  .sticky-bar.discount-active .sticky-stat .lbl{color:var(--green);}
  .sticky-bar.discount-active .sticky-stat .val{color:#c8ffb8;}
  .sticky-bar.discount-active .sticky-stat .val.big{color:var(--green);text-shadow:0 0 15px rgba(125,255,125,.8);animation:totalPulseGreen 1.5s ease-in-out infinite;}
  @keyframes totalPulseGreen{0%,100%{text-shadow:0 0 15px rgba(125,255,125,.8);}50%{text-shadow:0 0 25px rgba(125,255,125,1),0 0 40px rgba(58,160,58,.8);}}
  .sticky-actions{display:flex;gap:10px;flex-wrap:wrap;align-items:center;}
  .sticky-btn{display:inline-flex;align-items:center;gap:6px;padding:12px 22px;border-radius:999px;border:2px solid var(--gold);background:transparent;color:var(--gold);font-size:14px;font-weight:900;cursor:pointer;transition:.2s;font-family:inherit;letter-spacing:.5px;text-transform:uppercase;white-space:nowrap;}
  .sticky-btn:hover{background:var(--gold);color:#0a0a0a;transform:scale(1.03);}
  .sticky-btn.primary{background:linear-gradient(135deg,#FFD700,#FF8C00);color:#0a0a0a;border-color:#FFD700;box-shadow:0 0 20px rgba(255,215,0,.5);}
  .sticky-btn.primary:hover{transform:scale(1.05);box-shadow:0 0 30px rgba(255,215,0,.8);}
  .sticky-bar.discount-active .sticky-btn.primary{background:linear-gradient(135deg,#7dff7d,#3aa03a);color:#0a0a0a;border-color:#7dff7d;box-shadow:0 0 25px rgba(125,255,125,.7);}
  .sticky-btn.clear{border-color:rgba(255,138,122,.5);color:var(--red);}
  .sticky-btn.clear:hover{background:var(--red);color:#0a0a0a;border-color:var(--red);}
  .sticky-btn.hide{padding:12px 14px;min-width:auto;font-size:16px;line-height:1;}
  .sticky-btn.hide:hover{background:var(--red);color:#0a0a0a;border-color:var(--red);}

  /* ============ СКРОЛЛ ============ */
  ::-webkit-scrollbar { width:18px; height:18px; }
  ::-webkit-scrollbar-track { background:#050505; border:1px solid #2a2210;
    border-radius:9px; box-shadow:inset 0 0 12px rgba(212,175,55,.2); }
  ::-webkit-scrollbar-thumb { background:linear-gradient(180deg,#ffffcc 0%,#ffd700 15%,#ff8c00 35%,#d4af37 50%,#ff8c00 65%,#ffd700 85%,#ffffcc 100%);
    border:1px solid #ffd700; border-radius:9px;
    box-shadow:0 0 10px rgba(255,215,0,.9),0 0 20px rgba(255,140,0,.7),0 0 30px rgba(255,80,0,.4),inset 0 0 8px rgba(255,255,255,.5);
    background-size:100% 200%; animation:fireFlow 2.5s linear infinite; }
  @keyframes fireFlow { 0% { background-position:0% 0%; } 100% { background-position:0% 200%; } }
  * { scrollbar-width:thin; scrollbar-color:#ffd700 #0a0a0a; }

  /* ============ АДАПТИВ ============ */
  @media (max-width:700px) {
    body { padding:12px 10px 240px; }
    header h1 { font-size:20px; letter-spacing:1.5px; }
    header p { font-size:13px; }
    .shape-grid { grid-template-columns:repeat(3,1fr); }
    .shape-icon { font-size:18px; }
    .shape-name { font-size:10px; }
    .result-total-value { font-size:30px; }
    .result-value { font-size:18px; }
    .promo-btn { padding:9px 12px; font-size:12px; }
    .cta-button { width:100%; padding:16px 10px; font-size:17px; }
    .ticker-block { height:40px; }
    .ticker-item { font-size:12px; }
    .field-row { grid-template-columns:1fr; }
    .adb-top-wrap { padding:0; }
    .sticky-inner{flex-direction:column;gap:10px;}
    .sticky-info{justify-content:center;width:100%;}
    .sticky-actions{width:100%;justify-content:center;}
    .sticky-stat{padding:4px 10px;}
    .sticky-stat .val{font-size:15px;}
    .sticky-stat .val.big{font-size:20px;}
    .sticky-btn{padding:10px 16px;font-size:12px;}
  }
  @media (max-width:500px) {
    .sticky-info{gap:8px;}
    .sticky-stat{padding:2px 8px;}
    .sticky-stat .val{font-size:13px;}
    .sticky-stat .val.big{font-size:17px;}
    .sticky-stat .lbl{font-size:8px;}
  }

  @media print {
    body { background:#fff; color:#000; padding:0; }
    .ticker-block, .promo-toolbar, .shape-btn, .mode-btn,
    .adb-top-wrap, .ad-strip, .sticky-bar { display:none !important; }
    header { background:#000 !important; color:#ffd700 !important;
      border-color:#000 !important; -webkit-print-color-adjust:exact; print-color-adjust:exact; }
    header h1, header p { color:#ffd700 !important; }
    .banner-tag { background:#ffd700 !important; color:#000 !important;
      -webkit-print-color-adjust:exact; print-color-adjust:exact; }
    .banner-line { background:#ffd700 !important; }
    .calc-block, .result-block, .summary-block, .discount-banner {
      background:#fff !important; border:1px solid #999 !important; box-shadow:none !important; }
    .calc-title, .result-label, .result-total-label,
    .discount-banner h3, .discount-banner p { color:#000 !important; }
    .field label { color:#000 !important; }
    .field input, .field select { background:#fff !important; color:#000 !important; border-color:#999 !important; }
    .result-item { background:#f5f5f5 !important; border-color:#999 !important; }
    .result-value { color:#000 !important; }
    .result-total { background:#000 !important; border-color:#000 !important; }
    .result-total-value { color:#ffd700 !important; }
    .summary-table td { color:#000 !important; }
    .summary-table td:last-child { color:#000 !important; }
    .cta-section { background:#fff !important; }
    .cta-button { background:#000 !important; color:#fff !important;
      -webkit-print-color-adjust:exact; print-color-adjust:exact; }
    .manager-info { color:#666 !important; }
    .progress-fill { background:#3aa03a !important;
      -webkit-print-color-adjust:exact; print-color-adjust:exact; }
  }
&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;/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;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="wrap"&gt;

  &lt;div class="ticker-block"&gt;
    &lt;div class="ticker-label"&gt;ЦЕНЫ&lt;/div&gt;
    &lt;div class="ticker-viewport"&gt;
      &lt;div class="ticker-track"&gt;
        &lt;span class="ticker-item"&gt;СЧ20 — &lt;b&gt;390 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;ВЧ40 — &lt;b&gt;480 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;ЧХ1 — &lt;b&gt;800 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;ЧХ3 — &lt;b&gt;1 000 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;20Л — &lt;b&gt;360 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;110Г13Л — &lt;b&gt;520 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;Шары 5–1000 кг · Скидки от 100 кг партии&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;СЧ20 — &lt;b&gt;390 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;ВЧ40 — &lt;b&gt;480 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;ЧХ1 — &lt;b&gt;800 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;ЧХ3 — &lt;b&gt;1 000 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;20Л — &lt;b&gt;360 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;110Г13Л — &lt;b&gt;520 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;Шары 5–1000 кг · Скидки от 100 кг партии&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;header&gt;
    &lt;div class="banner-tag"&gt;КАЛЬКУЛЯТОР&lt;/div&gt;
    &lt;h1&gt;Расчёт стоимости отливок и шаров&lt;/h1&gt;
    &lt;div class="banner-line"&gt;&lt;/div&gt;
    &lt;p&gt;Чугун · Сталь · Бронза · Шары 5–1000 кг · Скидки от объёма&lt;/p&gt;
  &lt;/header&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="promo-toolbar"&gt;
    &lt;button class="promo-btn primary" onclick="downloadCSV()"&gt;⬇ Скачать расчёт CSV&lt;/button&gt;
    &lt;button class="promo-btn primary" onclick="downloadExcel()"&gt;⬇ Скачать Excel&lt;/button&gt;
    &lt;button class="promo-btn" onclick="window.print()"&gt;? Печать / PDF&lt;/button&gt;
    &lt;button class="promo-btn danger" onclick="resetAll()"&gt;✕ Сбросить&lt;/button&gt;
    &lt;button class="promo-btn danger" onclick="hideStickyBar()"&gt;▼ Скрыть панель&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class="calc-block" style="margin-bottom:14px"&gt;
    &lt;div class="calc-title"&gt;Параметры отливки&lt;/div&gt;

    &lt;div class="input-grid"&gt;
      &lt;div&gt;
        &lt;div class="field"&gt;
          &lt;label&gt;Материал&lt;/label&gt;
          &lt;select id="material"&gt;&lt;/select&gt;
        &lt;/div&gt;

        &lt;div class="field"&gt;
          &lt;label&gt;Форма отливки&lt;/label&gt;
          &lt;div class="shape-grid"&gt;
            &lt;div class="shape-btn active" data-shape="circle"&gt;&lt;span class="shape-icon"&gt;⬤&lt;/span&gt;&lt;span class="shape-name"&gt;Круг&lt;/span&gt;&lt;/div&gt;
            &lt;div class="shape-btn" data-shape="bushing"&gt;&lt;span class="shape-icon"&gt;◎&lt;/span&gt;&lt;span class="shape-name"&gt;Втулка&lt;/span&gt;&lt;/div&gt;
            &lt;div class="shape-btn" data-shape="plate"&gt;&lt;span class="shape-icon"&gt;▬&lt;/span&gt;&lt;span class="shape-name"&gt;Плита&lt;/span&gt;&lt;/div&gt;
            &lt;div class="shape-btn" data-shape="ball"&gt;&lt;span class="shape-icon"&gt;●&lt;/span&gt;&lt;span class="shape-name"&gt;Шар&lt;/span&gt;&lt;/div&gt;
            &lt;div class="shape-btn" data-shape="bar"&gt;&lt;span class="shape-icon"&gt;▭&lt;/span&gt;&lt;span class="shape-name"&gt;Брусок&lt;/span&gt;&lt;/div&gt;
            &lt;div class="shape-btn" data-shape="ball_grind"&gt;&lt;span class="shape-icon"&gt;⚫&lt;/span&gt;&lt;span class="shape-name"&gt;Шар мелющий&lt;/span&gt;&lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="field"&gt;
          &lt;label&gt;Способ расчёта&lt;/label&gt;
          &lt;div class="mode-toggle"&gt;
            &lt;button class="mode-btn active" data-mode="size"&gt;По размерам&lt;/button&gt;
            &lt;button class="mode-btn" data-mode="weight"&gt;По весу&lt;/button&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div&gt;
        &lt;div id="sizeFields"&gt;
          &lt;div class="shape-fields" data-shape="circle"&gt;
            &lt;div class="field"&gt;&lt;label&gt;Диаметр, мм&lt;/label&gt;&lt;input type="number" id="circleD" min="50" max="500" step="1" value="100" /&gt;&lt;div class="field-hint"&gt;от 50 до 500 мм&lt;/div&gt;&lt;/div&gt;
            &lt;div class="field"&gt;&lt;label&gt;Длина, мм&lt;/label&gt;&lt;input type="number" id="circleL" min="100" max="600" step="1" value="200" /&gt;&lt;div class="field-hint"&gt;от 100 до 600 мм&lt;/div&gt;&lt;/div&gt;
          &lt;/div&gt;

          &lt;div class="shape-fields" data-shape="bushing" style="display:none"&gt;
            &lt;div class="field-row"&gt;
              &lt;div class="field"&gt;&lt;label&gt;Наружный Ø, мм&lt;/label&gt;&lt;input type="number" id="bushD" min="50" max="500" step="1" value="200" /&gt;&lt;/div&gt;
              &lt;div class="field"&gt;&lt;label&gt;Внутренний Ø, мм&lt;/label&gt;&lt;input type="number" id="bushd" min="30" max="450" step="1" value="100" /&gt;&lt;/div&gt;
            &lt;/div&gt;
            &lt;div class="field"&gt;&lt;label&gt;Длина, мм&lt;/label&gt;&lt;input type="number" id="bushL" min="20" max="600" step="1" value="200" /&gt;&lt;div class="field-hint"&gt;от 20 до 600 мм&lt;/div&gt;&lt;/div&gt;
            &lt;div class="field-hint"&gt;мин. толщина стенки 10 мм&lt;/div&gt;
          &lt;/div&gt;

          &lt;div class="shape-fields" data-shape="plate" style="display:none"&gt;
            &lt;div class="field"&gt;&lt;label&gt;Толщина, мм&lt;/label&gt;&lt;input type="number" id="plateT" min="30" max="300" step="1" value="50" /&gt;&lt;div class="field-hint"&gt;от 30 до 300 мм&lt;/div&gt;&lt;/div&gt;
            &lt;div class="field-row"&gt;
              &lt;div class="field"&gt;&lt;label&gt;Ширина, мм&lt;/label&gt;&lt;input type="number" id="plateW" min="50" max="500" step="1" value="200" /&gt;&lt;/div&gt;
              &lt;div class="field"&gt;&lt;label&gt;Длина, мм&lt;/label&gt;&lt;input type="number" id="plateL" min="50" max="600" step="1" value="300" /&gt;&lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;

          &lt;div class="shape-fields" data-shape="ball" style="display:none"&gt;
            &lt;div class="field"&gt;&lt;label&gt;Диаметр, мм&lt;/label&gt;&lt;input type="number" id="ballD" min="50" max="500" step="1" value="100" /&gt;&lt;div class="field-hint"&gt;от 50 до 500 мм&lt;/div&gt;&lt;/div&gt;
          &lt;/div&gt;

          &lt;div class="shape-fields" data-shape="bar" style="display:none"&gt;
            &lt;div class="field"&gt;&lt;label&gt;Высота, мм&lt;/label&gt;&lt;input type="number" id="barH" min="30" max="300" step="1" value="50" /&gt;&lt;div class="field-hint"&gt;от 30 до 300 мм&lt;/div&gt;&lt;/div&gt;
            &lt;div class="field-row"&gt;
              &lt;div class="field"&gt;&lt;label&gt;Ширина, мм&lt;/label&gt;&lt;input type="number" id="barW" min="50" max="500" step="1" value="200" /&gt;&lt;/div&gt;
              &lt;div class="field"&gt;&lt;label&gt;Длина, мм&lt;/label&gt;&lt;input type="number" id="barL" min="50" max="600" step="1" value="300" /&gt;&lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;

          &lt;div class="shape-fields" data-shape="ball_grind" style="display:none"&gt;
            &lt;div class="field"&gt;
              &lt;label&gt;Вес одного шара, кг&lt;/label&gt;
              &lt;input type="number" id="grindWeight" min="5" max="1000" step="0.1" value="50" /&gt;
              &lt;div class="field-hint"&gt;от 5 до 1000 кг · диаметр пересчитывается автоматически&lt;/div&gt;
            &lt;/div&gt;
            &lt;div style="background:rgba(212,175,55,.08);border:1px dashed var(--gold);border-radius:9px;padding:12px 14px;margin-top:10px;text-align:center;"&gt;
              &lt;div style="font-size:10px;color:var(--gold);opacity:.7;text-transform:uppercase;font-weight:700;"&gt;Диаметр шара (автоматически)&lt;/div&gt;
              &lt;div id="grindDiam" style="font-size:22px;font-weight:800;color:var(--goldB);font-variant-numeric:tabular-nums;"&gt;— мм&lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;

        &lt;div id="weightFields" style="display:none"&gt;
          &lt;div class="field"&gt;&lt;label&gt;Вес одной детали, кг&lt;/label&gt;&lt;input type="number" id="weightInput" min="0.5" max="700" step="0.1" value="10" /&gt;&lt;div class="field-hint"&gt;от 0,5 до 700 кг&lt;/div&gt;&lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="field"&gt;
          &lt;label&gt;Количество, шт&lt;/label&gt;
          &lt;input type="number" id="qty" min="0" max="1000" step="1" value="1" /&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  
  &lt;div class="discount-banner" id="discountBanner"&gt;
    &lt;h3&gt;★ Скидка от объёма партии ★&lt;/h3&gt;
    &lt;p&gt;Закажите партию от &lt;b&gt;100 кг&lt;/b&gt; — скидка &lt;b style="color:#7dff7d"&gt;5%&lt;/b&gt;.&lt;br /&gt;
       От &lt;b&gt;300 кг&lt;/b&gt; — &lt;b style="color:#7dff7d"&gt;10%&lt;/b&gt;. От &lt;b&gt;1 тонны&lt;/b&gt; — &lt;b style="color:#7dff7d"&gt;15%&lt;/b&gt;.&lt;br /&gt;
       Скидка применяется автоматически ко всей партии.&lt;/p&gt;
    &lt;div class="progress-wrap"&gt;
      &lt;div class="progress-fill" id="progressFill" style="width:0%"&gt;&lt;/div&gt;
      &lt;div class="progress-label" id="progressLabel"&gt;Укажите количество — узнаете скидку&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="discount-stats"&gt;
      &lt;div class="discount-stat"&gt;
        &lt;div class="lbl"&gt;Вес партии&lt;/div&gt;
        &lt;div class="val" id="discWeight"&gt;0 кг&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="discount-stat"&gt;
        &lt;div class="lbl"&gt;До следующей скидки&lt;/div&gt;
        &lt;div class="val" id="discRemain"&gt;100 кг&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="discount-stat"&gt;
        &lt;div class="lbl"&gt;Ваша скидка&lt;/div&gt;
        &lt;div class="val new" id="discPct"&gt;0%&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="result-block"&gt;
    &lt;div class="calc-title"&gt;Результат расчёта&lt;/div&gt;
    &lt;div class="warn" id="warnBox"&gt;&lt;/div&gt;

    &lt;div class="result-grid"&gt;
      &lt;div class="result-item"&gt;&lt;div class="result-label"&gt;Объём детали&lt;/div&gt;&lt;div class="result-value small" id="resVolume"&gt;—&lt;/div&gt;&lt;div class="result-unit"&gt;м³&lt;/div&gt;&lt;/div&gt;
      &lt;div class="result-item"&gt;&lt;div class="result-label"&gt;Вес детали&lt;/div&gt;&lt;div class="result-value" id="resWeight"&gt;—&lt;/div&gt;&lt;div class="result-unit"&gt;кг&lt;/div&gt;&lt;/div&gt;
      &lt;div class="result-item"&gt;&lt;div class="result-label"&gt;Диаметр&lt;/div&gt;&lt;div class="result-value small" id="resDiam"&gt;—&lt;/div&gt;&lt;div class="result-unit"&gt;мм&lt;/div&gt;&lt;/div&gt;
      &lt;div class="result-item"&gt;&lt;div class="result-label"&gt;Кол-во&lt;/div&gt;&lt;div class="result-value" id="resQty"&gt;—&lt;/div&gt;&lt;div class="result-unit"&gt;шт&lt;/div&gt;&lt;/div&gt;
      &lt;div class="result-item"&gt;&lt;div class="result-label"&gt;Вес партии&lt;/div&gt;&lt;div class="result-value" id="resBatchWeight"&gt;—&lt;/div&gt;&lt;div class="result-unit"&gt;кг&lt;/div&gt;&lt;/div&gt;
      &lt;div class="result-item"&gt;&lt;div class="result-label"&gt;Цена за кг&lt;/div&gt;&lt;div class="result-value small" id="resPriceKg"&gt;—&lt;/div&gt;&lt;div class="result-unit"&gt;₽&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="result-total" id="resultTotal"&gt;
      &lt;div class="result-total-label"&gt;Цена за партию (с НДС 22%)&lt;/div&gt;
      &lt;div class="result-total-value" id="resPriceBatch"&gt;—&lt;/div&gt;
      &lt;div class="result-total-note" id="resPriceBatchNote"&gt;—&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="summary-block"&gt;
    &lt;div class="calc-title"&gt;Детализация расчёта&lt;/div&gt;
    &lt;table class="summary-table"&gt;
      &lt;tr&gt;&lt;td&gt;Материал&lt;/td&gt;&lt;td id="sumMaterial"&gt;—&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Группа&lt;/td&gt;&lt;td id="sumGroup"&gt;—&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Цена материала (с НДС)&lt;/td&gt;&lt;td id="sumPriceKg"&gt;—&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Плотность&lt;/td&gt;&lt;td id="sumDensity"&gt;—&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Форма&lt;/td&gt;&lt;td id="sumShape"&gt;—&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Способ расчёта&lt;/td&gt;&lt;td id="sumMode"&gt;—&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Объём одной детали&lt;/td&gt;&lt;td id="sumVolume"&gt;—&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Вес одной детали&lt;/td&gt;&lt;td id="sumWeightOne"&gt;—&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Количество&lt;/td&gt;&lt;td id="sumQty"&gt;—&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Общий вес партии&lt;/td&gt;&lt;td id="sumBatchWeight"&gt;—&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Коэффициент точности 16-00-16&lt;/td&gt;&lt;td id="sumCoef"&gt;+15%&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Минимальная плавка&lt;/td&gt;&lt;td id="sumMinMelt"&gt;—&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Расчётный вес для оплаты&lt;/td&gt;&lt;td id="sumPayWeight"&gt;—&lt;/td&gt;&lt;/tr&gt;
      &lt;tr class="highlight-row"&gt;&lt;td&gt;&lt;b&gt;Скидка от объёма партии&lt;/b&gt;&lt;/td&gt;&lt;td id="sumDiscount"&gt;0%&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;&lt;b&gt;Цена за деталь&lt;/b&gt;&lt;/td&gt;&lt;td id="sumPriceOne"&gt;—&lt;/td&gt;&lt;/tr&gt;
      &lt;tr class="highlight-row"&gt;&lt;td&gt;&lt;b&gt;Цена за партию&lt;/b&gt;&lt;/td&gt;&lt;td id="sumPriceBatch"&gt;—&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/div&gt;

  &lt;div class="cta-section"&gt;
    &lt;p class="cta-text"&gt;Нужен точный расчёт или нестандартная форма — звоните&lt;/p&gt;
    &lt;a href="tel:+79028733690" class="cta-button"&gt;8 902 873-36-90&lt;/a&gt;
    &lt;p class="manager-info"&gt;Менеджер: Ольга · ООО «Арсенал Деталь»&lt;/p&gt;
  &lt;/div&gt;

  &lt;div class="seo-text"&gt;
    &lt;p&gt;Калькулятор стоимости отливок и помольных шаров. Чугун СЧ20, ВЧ40, ЧХ1, ЧХ3, сталь 20Л, 110Г13Л. Шары мелющие 5–1000 кг. Расчёт диаметра по весу. Скидки от объёма партии от 100 кг. Цены с НДС 22%. ООО «Арсенал-Деталь», 8 902 873-36-90.&lt;/p&gt;
  &lt;/div&gt;

&lt;/div&gt;


&lt;div class="sticky-bar" id="stickyBar"&gt;
  &lt;div class="sticky-inner"&gt;
    &lt;div class="sticky-info"&gt;
      &lt;div class="sticky-stat"&gt;
        &lt;div class="lbl"&gt;Вес партии&lt;/div&gt;
        &lt;div class="val" id="barWeight"&gt;0 кг&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="sticky-stat"&gt;
        &lt;div class="lbl"&gt;Скидка&lt;/div&gt;
        &lt;div class="val" id="barDiscount"&gt;0%&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="sticky-stat"&gt;
        &lt;div class="lbl"&gt;Цена за деталь&lt;/div&gt;
        &lt;div class="val" id="barPriceOne"&gt;0 ₽&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="sticky-stat"&gt;
        &lt;div class="lbl"&gt;Итого с НДС 22%&lt;/div&gt;
        &lt;div class="val big" id="barTotal"&gt;0 ₽&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="sticky-actions"&gt;
      &lt;button class="sticky-btn primary" onclick="downloadExcel()"&gt;⬇ Скачать расчёт&lt;/button&gt;
      &lt;button class="sticky-btn" onclick="window.print()"&gt;? Печать&lt;/button&gt;
      &lt;button class="sticky-btn clear" onclick="resetAll()"&gt;✕ Сброс&lt;/button&gt;
      &lt;button class="sticky-btn hide" onclick="hideStickyBar()" title="Скрыть панель"&gt;✕&lt;/button&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
/* ==================== БАННЕР ==================== */
(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();
})();

/* ==================== ДАННЫЕ: МАТЕРИАЛЫ ==================== */
var MATERIALS = [
  {key:'sch20',    name:'СЧ20',        priceVat:390,  density:7100, minMelt:100, group:'Чугун'},
  {key:'sch1836',  name:'СЧ18-36',     priceVat:390,  density:7100, minMelt:50,  group:'Чугун'},
  {key:'sch25',    name:'СЧ25',        priceVat:420,  density:7200, minMelt:100, group:'Чугун'},
  {key:'vch40',    name:'ВЧ40',        priceVat:480,  density:7200, minMelt:300, group:'Чугун'},
  {key:'chh16',    name:'ЧХ16',        priceVat:1200, density:7300, minMelt:300, group:'Чугун'},
  {key:'chh3',     name:'ЧХ3',         priceVat:1000, density:7300, minMelt:300, group:'Чугун'},
  {key:'chh1',     name:'ЧХ1',         priceVat:800,  density:7300, minMelt:200, group:'Чугун'},
  {key:'achs1',    name:'АЧС-1',       priceVat:460,  density:7200, minMelt:200, group:'Чугун'},

  {key:'st110g13l',name:'110Г13Л',     priceVat:520,  density:7820, minMelt:100, group:'Сталь'},
  {key:'st20l',    name:'20Л',         priceVat:360,  density:7820, minMelt:100, group:'Сталь'},
  {key:'st25l',    name:'25Л',         priceVat:480,  density:7820, minMelt:100, group:'Сталь'},
  {key:'st30l',    name:'30Л',         priceVat:500,  density:7820, minMelt:100, group:'Сталь'},

  {key:'st40hnl',  name:'40ХНЛ',       priceVat:450,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st40hml',  name:'40ХМЛ',       priceVat:470,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st30hml',  name:'30ХМЛ',       priceVat:450,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st35hghfl',name:'35ХГФЛ',      priceVat:320,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st70h2gl', name:'70Х2ГЛ',      priceVat:480,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st60hgl',  name:'60ХГЛ',       priceVat:460,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st50hgl',  name:'50ХГЛ',       priceVat:440,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st35hgl',  name:'35ХГЛ',       priceVat:420,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st25hgl',  name:'25ХГЛ',       priceVat:390,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st30hl',   name:'30ХЛ',        priceVat:380,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st55sl',   name:'55СЛ',        priceVat:480,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st70gl',   name:'70ГЛ',        priceVat:480,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st45gl',   name:'45ГЛ',        priceVat:420,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st30gl',   name:'30ГЛ',        priceVat:390,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st35ngml', name:'35НГМЛ',      priceVat:560,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st35hgsl', name:'35ХГСЛ',      priceVat:490,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st30hnml', name:'30ХНМЛ',      priceVat:490,  density:7830, minMelt:300, group:'Легированная сталь'},
  {key:'st35hml',  name:'35ХМЛ',       priceVat:430,  density:7830, minMelt:300, group:'Легированная сталь'},

  {key:'bro10f1',  name:'Бронза БрО10Ф1', priceVat:3200, density:8700, minMelt:200, group:'Бронза'},
  {key:'bro10c2',  name:'Бронза БрО10Ц2', priceVat:2800, density:8700, minMelt:200, group:'Бронза'}
];

var SHAPES = {
  circle:'Круг (сигара)', bushing:'Втулка', plate:'Плита',
  ball:'Шар', bar:'Брусок', ball_grind:'Шар мелющий'
};

var COEF_PRECISION = 1.15;
var MIN_WEIGHT = 0.5;
var MAX_WEIGHT = 700;
var MIN_WALL = 10;

/* Пороги скидки от объёма партии (кг) */
var DISCOUNT_TIERS = [
  {minKg: 1000, pct: 15, label: 'от 1 тонны'},
  {minKg: 300,  pct: 10, label: 'от 300 кг'},
  {minKg: 100,  pct: 5,  label: 'от 100 кг'}
];

var state = {
  material: 'sch20',
  shape: 'circle',
  mode: 'size',
  qty: 1,
  result: null,
  userInteracted: false,   // пользователь хоть раз менял параметры
  manuallyHidden: false    // пользователь вручную скрыл sticky-бар
};

/* ==================== ЗАПОЛНЕНИЕ SELECT ==================== */
var matSelect = document.getElementById('material');
var groups = { 'Чугун':[], 'Сталь':[], 'Легированная сталь':[], 'Бронза':[] };
MATERIALS.forEach(function(m){
  if (!groups[m.group]) groups[m.group] = [];
  groups[m.group].push(m);
});
Object.entries(groups).forEach(function(entry){
  var groupName = entry[0], items = entry[1];
  var og = document.createElement('optgroup');
  og.label = groupName;
  items.forEach(function(item){
    var opt = document.createElement('option');
    opt.value = item.key;
    opt.textContent = item.name + ' — ' + item.priceVat + ' ₽/кг (мин. плавка ' + item.minMelt + ' кг)';
    og.appendChild(opt);
  });
  matSelect.appendChild(og);
});

/* ==================== УТИЛИТЫ ==================== */
var fmt = function(n){ return (n === null || n === undefined || isNaN(n)) ? '—' : n.toLocaleString('ru-RU', {maximumFractionDigits: 2}); };
var fmtInt = function(n){ return (n === null || n === undefined || isNaN(n)) ? '—' : Math.round(n).toLocaleString('ru-RU'); };
var num = function(id){ var el = document.getElementById(id); if (!el) return 0; var v = parseFloat(el.value); return isNaN(v) ? 0 : v; };
var getMaterial = function(key){ var found = MATERIALS.find(function(m){return m.key===key;}); return found || MATERIALS[0]; };
var priceNoVat = function(m){ return m.priceVat / 1.2; };

/* ==================== СКИДКА ==================== */
function getVolumeDiscount(batchWeight){
  for (var i = 0; i &lt; DISCOUNT_TIERS.length; i++){
    if (batchWeight &gt;= DISCOUNT_TIERS[i].minKg) return DISCOUNT_TIERS[i];
  }
  return {minKg: 100, pct: 0, label: 'до 100 кг'};
}

/* ==================== ДИАМЕТР ШАРА ИЗ ВЕСА ==================== */
function weightToDiameter(weightKg, density){
  if (weightKg &lt;= 0 || density &lt;= 0) return 0;
  var V = weightKg / density;
  var r = Math.cbrt((3 * V) / (4 * Math.PI));
  return r * 2 * 1000;
}

/* ==================== ОБЪЁМ ==================== */
function calcVolume() {
  var m = 0.001;
  switch (state.shape) {
    case 'circle': { var r = num('circleD')*m/2; return Math.PI * r * r * num('circleL')*m; }
    case 'bushing': { var R = num('bushD')*m/2, r = num('bushd')*m/2; return Math.PI * (R*R - r*r) * num('bushL')*m; }
    case 'plate': return num('plateT')*m * num('plateW')*m * num('plateL')*m;
    case 'ball': { var r = num('ballD')*m/2; return (4/3) * Math.PI * r**3; }
    case 'bar': return num('barH')*m * num('barW')*m * num('barL')*m;
    case 'ball_grind': {
      var w = num('grindWeight');
      var mat = getMaterial(state.material);
      return w / mat.density;
    }
  }
  return 0;
}

/* ==================== ПРОВЕРКИ ==================== */
function validate() {
  var warns = [];
  var checks = {
    circle: [
      {id:'circleD',min:50,max:500,label:'Диаметр'},
      {id:'circleL',min:100,max:600,label:'Длина'}
    ],
    bushing: [
      {id:'bushD',min:50,max:500,label:'Наружный Ø'},
      {id:'bushd',min:30,max:450,label:'Внутренний Ø'},
      {id:'bushL',min:20,max:600,label:'Длина'}
    ],
    plate: [
      {id:'plateT',min:30,max:300,label:'Толщина'},
      {id:'plateW',min:50,max:500,label:'Ширина'},
      {id:'plateL',min:50,max:600,label:'Длина'}
    ],
    ball: [{id:'ballD',min:50,max:500,label:'Диаметр'}],
    bar: [
      {id:'barH',min:30,max:300,label:'Высота'},
      {id:'barW',min:50,max:500,label:'Ширина'},
      {id:'barL',min:50,max:600,label:'Длина'}
    ],
    ball_grind: [{id:'grindWeight',min:5,max:1000,label:'Вес шара'}]
  };
  if (state.mode === 'size') {
    (checks[state.shape] || []).forEach(function(c){
      var el = document.getElementById(c.id);
      if (!el) return;
      var v = parseFloat(el.value);
      if (isNaN(v) || v &lt; c.min || v &gt; c.max) {
        el.classList.add('error');
        warns.push(c.label + ': от ' + c.min + ' до ' + c.max + (c.id==='grindWeight'?' кг':' мм'));
      } else {
        el.classList.remove('error');
      }
    });
    if (state.shape === 'bushing') {
      var D = num('bushD');
      var d = num('bushd');
      if (d &gt;= D) {
        warns.push('Внутренний Ø должен быть меньше наружного');
        document.getElementById('bushd').classList.add('error');
      } else {
        var wall = (D - d) / 2;
        if (wall &lt; MIN_WALL) {
          warns.push('Мин. толщина стенки втулки — ' + MIN_WALL + ' мм (у вас ' + wall.toFixed(1) + ' мм)');
          document.getElementById('bushD').classList.add('error');
          document.getElementById('bushd').classList.add('error');
        }
      }
    }
  } else {
    var w = num('weightInput');
    if (w &lt; MIN_WEIGHT || w &gt; MAX_WEIGHT) {
      warns.push('Вес детали: от ' + MIN_WEIGHT + ' до ' + MAX_WEIGHT + ' кг');
      document.getElementById('weightInput').classList.add('error');
    } else {
      document.getElementById('weightInput').classList.remove('error');
    }
  }
  return warns;
}

/* ==================== РАСЧЁТ ==================== */
function calculate() {
  var m = getMaterial(state.material);
  var warns = validate();

  var volume = 0, weightOne = 0, diameter = 0;

  if (state.shape === 'ball_grind') {
    weightOne = num('grindWeight');
    volume = weightOne / m.density;
    diameter = weightToDiameter(weightOne, m.density);
    document.getElementById('grindDiam').textContent = diameter.toFixed(1) + ' мм';
  } else if (state.mode === 'size') {
    volume = calcVolume();
    weightOne = volume * m.density;
    if (state.shape === 'ball') diameter = num('ballD');
  } else {
    weightOne = num('weightInput');
    volume = weightOne / m.density;
  }

  if (weightOne &lt; MIN_WEIGHT) warns.push('Минимальный вес детали — ' + MIN_WEIGHT + ' кг');
  if (weightOne &gt; MAX_WEIGHT) warns.push('Максимальный вес детали — ' + MAX_WEIGHT + ' кг');

  var qtyRaw = parseInt(num('qty'));
  var qty = isNaN(qtyRaw) ? 0 : Math.max(0, qtyRaw);
  var batchWeight = weightOne * qty;

  var priceVat = m.priceVat;
  var priceNoVatVal = priceNoVat(m);
  var priceVatCoef = priceVat * COEF_PRECISION;
  var priceNoVatCoef = priceNoVatVal * COEF_PRECISION;

  /* Скидка от объёма партии */
  var discount = getVolumeDiscount(batchWeight);
  var discountMultiplier = 1 - discount.pct / 100;

  var priceOne = weightOne * priceVatCoef * discountMultiplier;
  var minMelt = m.minMelt || 300;
  var payWeight = Math.max(batchWeight, minMelt);
  var priceBatch = payWeight * priceVatCoef * discountMultiplier;
  var priceBatchNoDiscount = payWeight * priceVatCoef;

  /* Warns */
  var warnBox = document.getElementById('warnBox');
  if (warns.length) {
    warnBox.innerHTML = warns.map(function(w){ return '• ' + w; }).join('&lt;br&gt;');
    warnBox.classList.add('show');
  } else {
    warnBox.classList.remove('show');
  }

  /* Если данных нет — обнуляем результат и скрываем sticky-бар */
  if (qty &lt;= 0 || weightOne &lt;= 0 || batchWeight &lt;= 0) {
    document.getElementById('resVolume').textContent = '—';
    document.getElementById('resWeight').textContent = '—';
    document.getElementById('resDiam').textContent = '—';
    document.getElementById('resQty').textContent = qty || '0';
    document.getElementById('resBatchWeight').textContent = '0';
    document.getElementById('resPriceKg').textContent = '—';
    document.getElementById('resPriceBatch').textContent = '0 ₽';
    document.getElementById('resPriceBatchNote').textContent = 'Укажите количество деталей';

    document.getElementById('sumMaterial').textContent = m.name;
    document.getElementById('sumGroup').textContent = m.group;
    document.getElementById('sumPriceKg').textContent = fmtInt(m.priceVat) + ' ₽/кг (с НДС) · ' + fmtInt(priceNoVatVal) + ' ₽/кг (без НДС)';
    document.getElementById('sumDensity').textContent = fmtInt(m.density) + ' кг/м³';
    document.getElementById('sumShape').textContent = SHAPES[state.shape];
    document.getElementById('sumMode').textContent = state.shape === 'ball_grind' ? 'По весу (авто-диаметр)' : (state.mode === 'size' ? 'По размерам' : 'По весу');
    document.getElementById('sumVolume').textContent = volume &gt; 0 ? volume.toFixed(6) + ' м³' : '—';
    document.getElementById('sumWeightOne').textContent = weightOne &gt; 0 ? fmt(weightOne) + ' кг' : '—';
    document.getElementById('sumQty').textContent = qty + ' шт';
    document.getElementById('sumBatchWeight').textContent = '0 кг';
    document.getElementById('sumMinMelt').textContent = minMelt + ' кг';
    document.getElementById('sumPayWeight').textContent = minMelt + ' кг';
    document.getElementById('sumDiscount').textContent = '0%';
    document.getElementById('sumPriceOne').textContent = '—';
    document.getElementById('sumPriceBatch').textContent = '—';

    state.result = null;
    updateDiscountBanner(0, {minKg:100, pct:0, label:'до 100 кг'}, 0, 0);
    updateStickyBar();
    return;
  }

  /* Вывод */
  document.getElementById('resVolume').textContent = volume.toFixed(6);
  document.getElementById('resWeight').textContent = fmt(weightOne);
  document.getElementById('resDiam').textContent = diameter &gt; 0 ? diameter.toFixed(1) : '—';
  document.getElementById('resQty').textContent = qty;
  document.getElementById('resBatchWeight').textContent = fmt(batchWeight);
  document.getElementById('resPriceKg').textContent = fmtInt(priceVatCoef * discountMultiplier);
  document.getElementById('resPriceBatch').textContent = fmtInt(priceBatch) + ' ₽';

  var noteText = batchWeight &lt; minMelt
    ? 'Оплата за ' + minMelt + ' кг (мин. плавка)'
    : 'Фактический вес: ' + fmt(batchWeight) + ' кг';
  if (discount.pct &gt; 0) noteText += ' · Скидка ' + discount.pct + '%';
  document.getElementById('resPriceBatchNote').textContent = noteText;

  /* Summary */
  document.getElementById('sumMaterial').textContent = m.name;
  document.getElementById('sumGroup').textContent = m.group;
  document.getElementById('sumPriceKg').textContent = fmtInt(m.priceVat) + ' ₽/кг (с НДС) · ' + fmtInt(priceNoVatVal) + ' ₽/кг (без НДС)';
  document.getElementById('sumDensity').textContent = fmtInt(m.density) + ' кг/м³';
  document.getElementById('sumShape').textContent = SHAPES[state.shape];
  document.getElementById('sumMode').textContent = state.shape === 'ball_grind' ? 'По весу (авто-диаметр)' : (state.mode === 'size' ? 'По размерам' : 'По весу');
  document.getElementById('sumVolume').textContent = volume.toFixed(6) + ' м³';
  document.getElementById('sumWeightOne').textContent = fmt(weightOne) + ' кг';
  document.getElementById('sumQty').textContent = qty + ' шт';
  document.getElementById('sumBatchWeight').textContent = fmt(batchWeight) + ' кг';
  document.getElementById('sumMinMelt').textContent = minMelt + ' кг';
  document.getElementById('sumPayWeight').textContent = fmt(payWeight) + ' кг';
  document.getElementById('sumDiscount').textContent = discount.pct + '%';
  document.getElementById('sumPriceOne').textContent = fmtInt(priceOne) + ' ₽';
  document.getElementById('sumPriceBatch').textContent = fmtInt(priceBatch) + ' ₽';

  /* Сохраняем результат */
  state.result = {
    material: m, shape: SHAPES[state.shape],
    mode: state.shape === 'ball_grind' ? 'По весу (авто-диаметр)' : (state.mode === 'size' ? 'По размерам' : 'По весу'),
    volume: volume, weightOne: weightOne, diameter: diameter, qty: qty, batchWeight: batchWeight, payWeight: payWeight,
    priceVat: priceVat, priceNoVat: priceNoVatVal, priceVatCoef: priceVatCoef, priceNoVatCoef: priceNoVatCoef,
    discount: discount, discountPct: discount.pct,
    priceOne: priceOne, priceBatch: priceBatch,
    priceBatchNoDiscount: priceBatchNoDiscount,
    minMelt: minMelt
  };

  /* Обновляем блок скидки и sticky-бар */
  updateDiscountBanner(batchWeight, discount, priceOne, priceBatch);
  updateStickyBar();
}

/* ==================== ОБНОВЛЕНИЕ БЛОКА СКИДКИ ==================== */
function updateDiscountBanner(batchWeight, discount, priceOne, priceBatch){
  var nextTier = null;
  for (var i = DISCOUNT_TIERS.length - 1; i &gt;= 0; i--){
    if (batchWeight &lt; DISCOUNT_TIERS[i].minKg){
      nextTier = DISCOUNT_TIERS[i];
    }
  }
  var maxTier = DISCOUNT_TIERS[0];
  var progressPct = Math.min(100, (batchWeight / maxTier.minKg) * 100);

  var banner = document.getElementById('discountBanner');
  if (discount.pct &gt; 0) banner.classList.add('active');
  else banner.classList.remove('active');

  var fill = document.getElementById('progressFill');
  if (fill) fill.style.width = progressPct.toFixed(1) + '%';

  var lbl = document.getElementById('progressLabel');
  if (lbl){
    if (batchWeight === 0){
      lbl.innerHTML = 'Укажите количество — узнаете скидку';
    } else if (discount.pct === maxTier.pct){
      lbl.innerHTML = '★ &lt;b&gt;МАКСИМАЛЬНАЯ СКИДКА ' + discount.pct + '%&lt;/b&gt;';
    } else if (discount.pct &gt; 0){
      lbl.innerHTML = '✓ Скидка &lt;b&gt;' + discount.pct + '%&lt;/b&gt;' + (nextTier ? ' · до ' + nextTier.pct + '% осталось ' + fmt(nextTier.minKg - batchWeight) + ' кг' : '');
    } else {
      lbl.innerHTML = 'Вес партии: &lt;b&gt;' + fmt(batchWeight) + ' кг&lt;/b&gt;' + (nextTier ? ' · до скидки ' + nextTier.pct + '% осталось ' + fmt(nextTier.minKg - batchWeight) + ' кг' : '');
    }
  }

  var w = document.getElementById('discWeight');
  if (w) w.textContent = fmt(batchWeight) + ' кг';

  var r = document.getElementById('discRemain');
  if (r){
    if (nextTier) r.textContent = fmt(nextTier.minKg - batchWeight) + ' кг';
    else r.textContent = '✓ Максимум';
  }

  var pct = document.getElementById('discPct');
  if (pct){
    if (discount.pct &gt; 0){
      pct.innerHTML = '&lt;span style="text-decoration:line-through;color:#9a8040;font-size:14px"&gt;0%&lt;/span&gt; ' + discount.pct + '%';
    } else {
      pct.textContent = '0%';
    }
  }

  /* Результат-total */
  var total = document.getElementById('resultTotal');
  if (total){
    if (discount.pct &gt; 0) total.classList.add('discount-active');
    else total.classList.remove('discount-active');
  }

  /* Заполняем значения sticky-бара (показ/скрытие — в updateStickyBar) */
  var bw = document.getElementById('barWeight');
  if (bw) bw.textContent = fmt(batchWeight) + ' кг';
  var bd = document.getElementById('barDiscount');
  if (bd) bd.textContent = discount.pct + '%';
  var bp = document.getElementById('barPriceOne');
  if (bp) bp.textContent = fmtInt(priceOne) + ' ₽';
  var bt = document.getElementById('barTotal');
  if (bt) bt.textContent = fmtInt(priceBatch) + ' ₽';
}

/* ==================== STICKY-БАР ==================== */
function updateStickyBar(){
  var bar = document.getElementById('stickyBar');
  if (!bar) return;

  // Показываем только если:
  // 1. Пользователь уже взаимодействовал с формой
  // 2. Не скрывал вручную
  // 3. Есть валидный результат с ненулевым весом партии
  if (!state.userInteracted || state.manuallyHidden || !state.result || state.result.batchWeight &lt;= 0){
    bar.classList.remove('show');
    bar.classList.remove('discount-active');
    return;
  }

  var r = state.result;
  if (r.discountPct &gt; 0) bar.classList.add('discount-active');
  else bar.classList.remove('discount-active');
  bar.classList.add('show');
}

/* ==================== РУЧНОЕ СКРЫТИЕ STICKY-БАРА ==================== */
function hideStickyBar(){
  state.manuallyHidden = true;
  var bar = document.getElementById('stickyBar');
  if (bar) bar.classList.remove('show');
}

/* ==================== ФОРМЫ ==================== */
function setShape(shape) {
  state.shape = shape;
  document.querySelectorAll('.shape-btn').forEach(function(b){ b.classList.toggle('active', b.dataset.shape === shape); });
  document.querySelectorAll('.shape-fields').forEach(function(f){ f.style.display = f.dataset.shape === shape ? 'block' : 'none'; });
  calculate();
}
function setMode(mode) {
  state.mode = mode;
  document.querySelectorAll('.mode-btn').forEach(function(b){ b.classList.toggle('active', b.dataset.mode === mode); });
  document.getElementById('sizeFields').style.display = mode === 'size' ? 'block' : 'none';
  document.getElementById('weightFields').style.display = mode === 'weight' ? 'block' : 'none';
  calculate();
}

/* ==================== СОБЫТИЯ ==================== */
document.querySelectorAll('.shape-btn').forEach(function(btn){
  btn.addEventListener('click', function(){
    state.userInteracted = true;
    state.manuallyHidden = false;
    setShape(btn.dataset.shape);
  });
});
document.querySelectorAll('.mode-btn').forEach(function(btn){
  btn.addEventListener('click', function(){
    state.userInteracted = true;
    state.manuallyHidden = false;
    setMode(btn.dataset.mode);
  });
});
matSelect.addEventListener('change', function(e){
  state.userInteracted = true;
  state.manuallyHidden = false;
  state.material = e.target.value;
  calculate();
});
document.getElementById('qty').addEventListener('input', function(){
  state.userInteracted = true;
  state.manuallyHidden = false;
  calculate();
});
['circleD','circleL','bushD','bushd','bushL','plateT','plateW','plateL','ballD','barH','barW','barL','weightInput','grindWeight']
  .forEach(function(id){
    var el = document.getElementById(id);
    if (el) el.addEventListener('input', function(){
      state.userInteracted = true;
      state.manuallyHidden = false;
      calculate();
    });
  });

/* ==================== СБРОС ==================== */
function resetAll() {
  state.userInteracted = false;
  state.manuallyHidden = false;
  matSelect.value = 'sch20';
  state.material = 'sch20';
  setShape('circle');
  setMode('size');
  document.getElementById('qty').value = 1;
  document.getElementById('circleD').value = 100;
  document.getElementById('circleL').value = 200;
  document.getElementById('bushD').value = 200;
  document.getElementById('bushd').value = 100;
  document.getElementById('bushL').value = 200;
  document.getElementById('plateT').value = 50;
  document.getElementById('plateW').value = 200;
  document.getElementById('plateL').value = 300;
  document.getElementById('ballD').value = 100;
  document.getElementById('barH').value = 50;
  document.getElementById('barW').value = 200;
  document.getElementById('barL').value = 300;
  document.getElementById('weightInput').value = 10;
  document.getElementById('grindWeight').value = 50;
  document.querySelectorAll('.error').forEach(function(el){ el.classList.remove('error'); });
  calculate();
  // Принудительно скрываем sticky-бар
  document.getElementById('stickyBar').classList.remove('show');
}

/* ==================== ЭКСПОРТ ==================== */
function downloadBlob(blob, filename) {
  var url = URL.createObjectURL(blob);
  var a = document.createElement('a');
  a.href = url; a.download = filename;
  document.body.appendChild(a); a.click(); a.remove();
  setTimeout(function(){ URL.revokeObjectURL(url); }, 500);
}
function today() {
  var d = new Date(), p = function(n){ return String(n).padStart(2,'0'); };
  return d.getFullYear() + '-' + p(d.getMonth()+1) + '-' + p(d.getDate());
}

function buildRows() {
  var r = state.result;
  if (!r) return {header:[], body:[]};
  var header = ['Параметр','Значение'];
  var body = [
    ['Материал', r.material.name],
    ['Группа', r.material.group],
    ['Цена с НДС', r.priceVat + ' ₽/кг'],
    ['Цена без НДС', r.priceNoVat.toFixed(2) + ' ₽/кг'],
    ['Цена с коэф. 16-00-16 (с НДС)', r.priceVatCoef.toFixed(2) + ' ₽/кг'],
    ['Плотность', r.material.density + ' кг/м³'],
    ['Форма', r.shape],
    ['Способ расчёта', r.mode],
    ['Объём детали', r.volume.toFixed(6) + ' м³'],
    ['Вес детали', r.weightOne.toFixed(2) + ' кг'],
    ['Диаметр', r.diameter &gt; 0 ? r.diameter.toFixed(1) + ' мм' : '—'],
    ['Количество', r.qty + ' шт'],
    ['Вес партии', r.batchWeight.toFixed(2) + ' кг'],
    ['Минимальная плавка', r.minMelt + ' кг'],
    ['Расчётный вес для оплаты', r.payWeight.toFixed(2) + ' кг'],
    ['Скидка от объёма партии', r.discountPct + '%' + (r.discount.label ? ' (' + r.discount.label + ')' : '')],
    ['Цена без скидки (партия)', Math.round(r.priceBatchNoDiscount) + ' ₽'],
    ['Цена за деталь', Math.round(r.priceOne) + ' ₽'],
    ['Цена за партию', Math.round(r.priceBatch) + ' ₽']
  ];
  return {header: header, body: body};
}

function downloadCSV() {
  var res = buildRows();
  if (!res.body.length) return;
  var esc = function(v){ return '"' + String(v).replace(/"/g,'""') + '"'; };
  var csv = [res.header].concat(res.body).map(function(r){ return r.map(esc).join(';'); }).join('\r\n');
  downloadBlob(new Blob(['\uFEFF' + csv], {type:'text/csv;charset=utf-8;'}), 'calc_otlivki_' + today() + '.csv');
}
function downloadExcel() {
  var res = buildRows();
  if (!res.body.length) return;
  var esc = function(v){ return String(v == null ? '' : v).replace(/&amp;/g,'&amp;amp;').replace(/&lt;/g,'&amp;lt;').replace(/&gt;/g,'&amp;gt;'); };
  var table = '&lt;table border="1" cellspacing="0" cellpadding="4"&gt;&lt;thead style="background:#000;color:#ffd700;"&gt;&lt;tr&gt;' +
    res.header.map(function(h){ return '&lt;th&gt;' + esc(h) + '&lt;/th&gt;'; }).join('') + '&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;' +
    res.body.map(function(r){ return '&lt;tr&gt;' + r.map(function(c){ return '&lt;td&gt;' + esc(c) + '&lt;/td&gt;'; }).join('') + '&lt;/tr&gt;'; }).join('') +
    '&lt;/tbody&gt;&lt;/table&gt;';
  var html = '&lt;html xmlns:x="urn:schemas-microsoft-com:office:excel"&gt;&lt;head&gt;&lt;meta charset="UTF-8"&gt;' +
    '&lt;style&gt;td,th{font-family:Arial;font-size:12px;}&lt;/style&gt;&lt;/head&gt;' +
    '&lt;body&gt;&lt;h2&gt;Расчёт стоимости отливки — ' + today() + '&lt;/h2&gt;' +
    '&lt;p&gt;ООО «Арсенал-Деталь» · 8 902 873-36-90&lt;/p&gt;' + table +
    '&lt;p&gt;&lt;i&gt;Точность отливки 16-00-16 · Цены с НДС 22%&lt;/i&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;';
  downloadBlob(new Blob(['\uFEFF' + html], {type:'application/vnd.ms-excel;charset=utf-8;'}), 'calc_otlivki_' + today() + '.xls');
}

/* ==================== СТАРТ ==================== */
calculate();
document.getElementById('stickyBar').classList.remove('show');
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</subtitle>
  <updated>2026-10-14T08:12:43Z</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>
