<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://irontub.ru/" xml:lang="ru">
  <id>https://irontub.ru/pokovki-zagotovki-pod-flantcy-gotovye-flantcy-raskatnye-koltca</id>
  <link href="https://irontub.ru/pokovki-zagotovki-pod-flantcy-gotovye-flantcy-raskatnye-koltca.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.0"&gt;
&lt;title&gt;Поковки, заготовки под фланцы, готовые фланцы, раскатные кольца — каталог · Арсенал-Деталь&lt;/title&gt;
&lt;meta name="description" content="Каталог: поковки диски Ø200–2500 мм (ГОСТ 8479-70), заготовки под фланцы Ø200–2300, готовые фланцы ГОСТ 33259-2015 DN15–DN2400, раскатные кольца Ø400–2500. Стали 09Г2С, 20, 15Х5М, 13ХФА, 12Х18Н10Т, 10Х17Н13М2Т. Скидка от 50 000 ₽. Екатеринбург."&gt;
&lt;meta name="keywords" content="поковки стальные купить, поковка диска ГОСТ 8479-70, поковка 09Г2С, поковка 12Х18Н10Т, поковка 15Х5М, поковка 13ХФА, поковка ст.20, поковка 20Х, поковка 40Х, поковка 20ГЛ, поковка 40ХЛ, поковка Ø500, поковка Ø1000, поковка Ø2000, поковка Ø2500, заготовка под фланец купить, фланцевая заготовка 09Г2С, заготовка фланца ГОСТ 33259, заготовка фланца DN100, заготовка фланца DN500, заготовка под фланец 12Х18Н10Т, фланец плоский тип 01, фланец приварной встык тип 11, фланец ГОСТ 33259-2015 купить, фланец DN15, фланец DN50, фланец DN100, фланец DN200, фланец DN500, фланец DN1000, фланец DN2400, фланец PN16, фланец PN25, фланец PN40, фланец 09Г2С, фланец 12Х18Н10Т, фланец ст.20, фланец 15Х5М, фланец 13ХФА, фланец ASME B16.5, фланец ASME B16.47, фланец DIN EN 1092-1, кольцо раскатное купить, раскатное кольцо 09Г2С, раскатное кольцо 12Х18Н10Т, раскатное кольцо Ø1000, раскатное кольцо Ø2000, кольцо под фланец, поковка кольца, металлопрокат Екатеринбург, поковки Екатеринбург, фланцы Екатеринбург, кольца Екатеринбург, Арсенал-Деталь, металлообработка, токарная обработка, мехобработка фланцев, изготовление фланцев по чертежу, поковка по чертежу, кольцо по чертежу, скидка от 50 000, НДС 22, доставка по России, Белоруссия, Казахстан"&gt;
&lt;meta property="og:title" content="Поковки, заготовки, фланцы, раскатные кольца — каталог размеров"&gt;
&lt;meta property="og:description" content="Поковки Ø200–2500 ГОСТ 8479-70, заготовки под фланцы, фланцы ГОСТ 33259-2015, раскатные кольца до Ø2500. Скидка от 50 000 ₽."&gt;
&lt;meta property="og:type" content="website"&gt;
&lt;meta property="og:locale" content="ru_RU"&gt;
&lt;link rel="canonical" href="https://arsenal-detal.ru/catalog/" /&gt;
&lt;script type="application/ld+json"&gt;
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "ООО «Арсенал Деталь»",
  "telephone": "+79028733690",
  "email": "arsenal-detal@list.ru",
  "address": {"@type":"PostalAddress","addressLocality":"Екатеринбург","addressCountry":"RU"},
  "description": "Поковки стальные, заготовки под фланцы, готовые фланцы, раскатные кольца."
}
&lt;/script&gt;
&lt;script type="application/ld+json"&gt;
{
  "@context": "https://schema.org",
  "@type": "CollectionPage",
  "name": "Поковки, заготовки под фланцы, готовые фланцы, раскатные кольца",
  "description": "Поковки диски Ø200–2500 ГОСТ 8479-70. Заготовки под фланцы. Фланцы ГОСТ 33259-2015 DN15–DN2400. Раскатные кольца Ø400–2500.",
  "url": "https://arsenal-detal.ru/catalog/",
  "about": [
    {"@type":"Product","name":"Поковка стальная диск","category":"Поковки","material":["09Г2С","20","15Х5М","13ХФА","12Х18Н10Т"]},
    {"@type":"Product","name":"Заготовка под фланец","category":"Заготовки","material":["09Г2С","20","15Х5М","13ХФА","12Х18Н10Т"]},
    {"@type":"Product","name":"Фланец ГОСТ 33259-2015 тип 01","category":"Фланцы","material":["09Г2С","20","12Х18Н10Т"]},
    {"@type":"Product","name":"Фланец ГОСТ 33259-2015 тип 11","category":"Фланцы","material":["09Г2С","20","12Х18Н10Т"]},
    {"@type":"Product","name":"Кольцо раскатное","category":"Раскатные кольца","material":["09Г2С","20","15Х5М","12Х18Н10Т"]}
  ]
}
&lt;/script&gt;
&lt;style&gt;
  :root{--gold:#FFD700;--gold-light:#FFE55C;--bg:#0a0a0a;--muted:#9a8040;--border:rgba(212,175,55,.35);--accent:#FF8C00;--ok:#7dff7d;--bad:#ff9a9a;--green:#7dff7d;--green-dark:#3aa03a;}
  *{box-sizing:border-box;margin:0;padding:0}
  body{background:#050505;color:#e8e8e8;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;padding:20px 14px 160px;line-height:1.5;}
  .wrap{max-width:1600px;margin:0 auto}
  .banner{max-width:640px;margin:0 auto 14px;background:radial-gradient(120% 120% at 20% 0%,rgba(255,215,0,.18),transparent 55%),linear-gradient(135deg,#111,#0a0a0a);border:1px solid var(--gold);border-radius:14px;padding:24px;text-align:center;box-shadow:0 6px 22px rgba(0,0,0,.6);}
  .banner-tag{display:inline-block;background:var(--gold);color:#0a0a0a;font-size:10px;font-weight:800;letter-spacing:2px;padding:3px 12px;border-radius:999px;margin-bottom:12px;}
  .banner-title{font-weight:800;font-size:22px;line-height:1.15;color:#fff;margin-bottom:10px;}
  .banner-phone{font-size:18px;font-weight:800;color:var(--gold);margin-bottom:4px;}
  .banner-note{font-size:12px;color:var(--muted);}
  .ticker{display:flex;align-items:stretch;background:var(--bg);border:1px solid var(--gold);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-vp{flex:1;overflow:hidden;position:relative}
  .ticker-track{display:inline-flex;align-items:center;height:100%;white-space:nowrap;animation:tickerMove 60s linear infinite;padding-left:20px;}
  .ticker-item{color:var(--gold);font-size:13px;padding:0 10px}
  .ticker-item b{color:var(--gold-light);font-weight:700}
  .ticker-dot{color:var(--gold);font-size:10px}
  @keyframes tickerMove{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-item{display:flex;align-items:center;gap:12px;padding:14px 18px;background:linear-gradient(135deg,rgba(255,215,0,.1) 0%,rgba(10,15,30,.7) 100%);border:1px solid var(--border);border-radius:14px;text-decoration:none;transition:all .25s;}
  .ad-item:hover{border-color:var(--gold);box-shadow:0 0 20px rgba(255,215,0,.3);transform:translateY(-2px);}
  .ad-tag{background:var(--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-text{color:#e8f4ff;font-size:.9rem;font-weight:600;flex:1;}
  .ad-cta{color:var(--gold);font-size:.85rem;font-weight:800;letter-spacing:.5px;white-space:nowrap;}
  .header{background:radial-gradient(120% 120% at 20% 0%,rgba(255,215,0,.25),transparent 55%),linear-gradient(135deg,#1a1408,#0a0a0a);border:2px solid var(--gold);border-radius:14px;padding:32px 24px;text-align:center;margin-bottom:16px;box-shadow:0 0 40px rgba(255,215,0,.25),0 6px 22px rgba(0,0,0,.6);}
  .tag{display:inline-block;background:var(--gold);color:#0a0a0a;font-size:10px;font-weight:800;letter-spacing:2px;padding:4px 14px;border-radius:999px;margin-bottom:14px;box-shadow:0 0 16px rgba(255,215,0,.7);}
  .header h1{font-size:26px;font-weight:900;letter-spacing:2px;color:var(--gold);text-transform:uppercase;margin-bottom:12px;text-shadow:0 0 10px rgba(255,215,0,.95),0 0 25px rgba(255,199,0,.8);animation:goldPulse 3s ease-in-out infinite;}
  @keyframes goldPulse{0%,100%{text-shadow:0 0 10px rgba(255,215,0,.95),0 0 25px rgba(255,199,0,.8);}50%{text-shadow:0 0 15px rgba(255,215,0,1),0 0 35px rgba(255,199,0,.95);}}
  .line{width:80px;height:3px;background:var(--gold);margin:0 auto 14px;border-radius:2px;box-shadow:0 0 15px var(--gold);}
  .header p{color:var(--gold-light);font-size:14px;opacity:.95;}
  .tabs{display:flex;gap:8px;margin-bottom:16px;flex-wrap:wrap;}
  .tab{display:inline-flex;align-items:center;gap:8px;padding:10px 18px;border-radius:10px;border:2px solid var(--gold);background:var(--bg);color:var(--gold);font-size:13px;font-weight:800;cursor:pointer;transition:.2s;font-family:inherit;letter-spacing:.3px;}
  .tab:hover{background:rgba(255,215,0,.12);}
  .tab.active{background:linear-gradient(135deg,#FFD700,#FF8C00);color:#0a0a0a;border-color:#FFD700;box-shadow:0 0 20px rgba(255,215,0,.5);}
  .tab .cnt{background:rgba(0,0,0,.25);color:inherit;font-size:10px;font-weight:800;padding:2px 7px;border-radius:999px;}
  .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);}
  .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;}
  .cta-block{background:linear-gradient(135deg,rgba(255,215,0,.15),rgba(10,10,10,.9));border:3px solid var(--gold);border-radius:16px;padding:24px 20px;margin-bottom:16px;text-align:center;box-shadow:0 0 40px rgba(255,215,0,.3);position:relative;}
  .cta-block::before{content:'★';position:absolute;top:-18px;left:50%;transform:translateX(-50%);background:#0a0a0a;color:var(--gold);padding:0 18px;font-size:26px;text-shadow:0 0 20px rgba(255,215,0,1);}
  .cta-block h2{color:var(--gold);font-size:20px;font-weight:900;letter-spacing:2px;text-transform:uppercase;margin-bottom:10px;text-shadow:0 0 15px rgba(255,215,0,.7);}
  .cta-block p{color:var(--gold-light);font-size:15px;margin-bottom:16px;line-height:1.6;}
  .cta-block p b{color:#fff;}
  .cta-counter{display:inline-block;background:#0a0a0a;border:2px solid var(--gold);border-radius:999px;padding:10px 24px;color:var(--gold);font-size:16px;font-weight:900;letter-spacing:1px;margin-bottom:14px;}
  .cta-counter b{color:#fff;font-size:22px;}
  .cta-buttons{display:flex;gap:12px;justify-content:center;flex-wrap:wrap;margin-top:14px;}
  .btn-big{display:inline-flex;align-items:center;gap:10px;padding:14px 28px;border-radius:999px;border:2px solid var(--gold);background:transparent;color:var(--gold);font-size:15px;font-weight:900;cursor:pointer;transition:.2s;font-family:inherit;letter-spacing:1px;text-transform:uppercase;}
  .btn-big:hover{background:var(--gold);color:#0a0a0a;transform:scale(1.03);}
  .btn-big.primary{background:linear-gradient(135deg,#FFD700,#FF8C00);color:#0a0a0a;border-color:#FFD700;box-shadow:0 0 25px rgba(255,215,0,.6);}
  .stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px;}
  @media(max-width:800px){.stats{grid-template-columns:repeat(2,1fr);}}
  .stat{background:var(--bg);border:1px solid var(--gold);border-radius:12px;padding:16px;text-align:center;}
  .lbl{font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:var(--gold);opacity:.7;margin-bottom:6px;}
  .val{font-size:22px;font-weight:800;color:var(--gold-light);line-height:1.1;}
  .val.sm{font-size:16px;}
  .toolbar{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px;}
  .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;}
  .btn:hover{background:var(--gold);color:#0a0a0a;}
  .filter{background:var(--bg);border:1px solid var(--gold);border-radius:14px;padding:16px;margin-bottom:16px;}
  .filter-row{display:grid;grid-template-columns:2fr 1fr;gap:12px;margin-bottom:12px;}
  @media(max-width:700px){.filter-row{grid-template-columns:1fr;}}
  .filter-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;}
  @media(max-width:1000px){.filter-grid{grid-template-columns:repeat(3,1fr);}}
  @media(max-width:700px){.filter-grid{grid-template-columns:1fr 1fr;}}
  .fld{display:flex;flex-direction:column;gap:5px;}
  .fld label{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:var(--gold);opacity:.85;}
  .fld input,.fld select{padding:10px 12px;border:1px solid var(--gold);border-radius:9px;font-size:13px;background:var(--bg);color:var(--gold-light);outline:none;font-family:inherit;width:100%;}
  .fld input::placeholder{color:rgba(212,175,55,.35);}
  .search{width:100%;padding:13px 16px;border:2px solid var(--gold);border-radius:9px;font-size:14px;background:var(--bg);color:var(--gold-light);outline:none;font-family:inherit;font-weight:600;}
  .search::placeholder{color:rgba(212,175,55,.4);}
  .counter{color:var(--gold);font-size:14px;white-space:nowrap;padding:13px 18px;border:1px solid var(--gold);border-radius:9px;background:var(--bg);font-weight:800;display:flex;align-items:center;justify-content:center;}
  .filter-actions{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap;}
  .search-help{font-size:11px;color:var(--muted);margin-top:8px;line-height:1.5;}
  .search-help b{color:var(--gold-light);}
  .global-badge{display:none;align-items:center;gap:8px;margin-bottom:12px;padding:10px 16px;border:1px dashed var(--gold);border-radius:10px;background:rgba(255,215,0,.06);font-size:13px;color:var(--gold-light);}
  .global-badge.show{display:flex;flex-wrap:wrap;}
  .global-badge b{color:var(--gold);}
  .global-badge .btn{margin-left:auto;}
  .table-block{background:var(--bg);border:1px solid var(--gold);border-radius:14px;padding:20px;margin-bottom:16px;position:relative;}
  .block-title{color:var(--gold);font-size:12px;font-weight:800;letter-spacing:2px;text-align:center;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid var(--border);text-transform:uppercase;text-shadow:0 0 12px rgba(255,215,0,.6);}
  .table-wrap{overflow:auto;max-height:65vh;border-radius:8px;border:1px solid var(--gold);}
  table{width:100%;table-layout:auto;border-collapse:collapse;background:var(--bg);font-size:13px;}
  th,td{padding:10px 9px;text-align:left;border-bottom:1px solid rgba(212,175,55,.2);vertical-align:middle;color:var(--gold);background:transparent;white-space:nowrap;}
  th{position:sticky;top:0;z-index:2;background:var(--bg);color:var(--gold);font-weight:800;text-transform:uppercase;font-size:10px;letter-spacing:1px;border-bottom:1px solid var(--gold);cursor:pointer;user-select:none;}
  th:hover{background:#1a1408;}
  th.sortable::after{content:' ⇅';opacity:.5;margin-left:4px;font-size:9px;}
  th.asc::after{content:' ▲';opacity:1;color:var(--gold-light);}
  th.desc::after{content:' ▼';opacity:1;color:var(--gold-light);}
  th.num,td.num{text-align:right;font-variant-numeric:tabular-nums;}
  th.col-num,td.col-num{width:38px;text-align:center;}
  th.col-star,td.col-star{width:44px;text-align:center;padding:8px 6px;}
  th.col-qty,td.col-qty{width:80px;text-align:center;padding:8px 6px;}
  th.col-star{position:sticky;top:0;background:linear-gradient(180deg,#1a1408,#0a0a0a) !important;}
  th.col-star::before{content:'▼';position:absolute;top:100%;left:50%;transform:translateX(-50%);color:var(--gold);font-size:20px;line-height:1;text-shadow:0 0 12px rgba(255,215,0,1);animation:arrowBounce 1s ease-in-out infinite;pointer-events:none;}
  @keyframes arrowBounce{0%,100%{transform:translateX(-50%) translateY(0);opacity:1;}50%{transform:translateX(-50%) translateY(6px);opacity:.7;}}
  .select-hint{position:absolute;top:-14px;left:0;background:linear-gradient(135deg,#FFD700,#FF8C00);color:#0a0a0a;font-size:11px;font-weight:900;letter-spacing:1.5px;padding:6px 18px;border-radius:999px;box-shadow:0 0 20px rgba(255,215,0,.7);text-transform:uppercase;z-index:5;white-space:nowrap;}
  tbody tr{transition:background .15s;}
  tbody tr:hover{background:#1a1408;box-shadow:inset 3px 0 0 var(--gold-light),inset -3px 0 0 var(--gold-light);}
  tbody tr.picked{background:linear-gradient(90deg,rgba(255,215,0,.15),rgba(255,215,0,.04));box-shadow:inset 4px 0 0 var(--gold);}
  tbody tr.discount-active{background:linear-gradient(90deg,rgba(125,255,125,.15),rgba(255,215,0,.04));box-shadow:inset 4px 0 0 var(--green);}
  td.price{font-weight:800;color:var(--gold-light);font-size:14px;}
  td.price.discount{color:var(--green);text-shadow:0 0 10px rgba(125,255,125,.5);}
  td.price.request{color:var(--muted);font-style:italic;font-weight:600;}
  td b{color:#fff;}
  td.col-qty input.qty{width:70px;padding:6px 8px;border:1px solid var(--border);border-radius:6px;background:#0a0a0a;color:var(--gold-light);font-size:14px;font-weight:800;text-align:center;font-family:inherit;outline:none;transition:.2s;}
  td.col-qty input.qty:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(255,215,0,.2);}
  td.col-qty input.qty:disabled{opacity:.25;cursor:not-allowed;}
  tbody tr.picked td.col-qty input.qty{border-color:var(--gold);color:var(--gold-light);box-shadow:0 0 8px rgba(255,215,0,.4);}
  .badge{display:inline-block;padding:2px 8px;border-radius:10px;font-size:10px;font-weight:800;text-transform:uppercase;background:rgba(212,175,55,.15);color:var(--gold-light);border:1px solid rgba(212,175,55,.5);white-space:nowrap;}
  .badge.many{background:rgba(57,255,20,.08);color:var(--ok);border-color:rgba(57,255,20,.3);}
  .badge.zero{background:rgba(255,107,107,.12);color:var(--bad);border-color:rgba(255,107,107,.4);}
  .star{cursor:pointer;font-size:22px;color:rgba(212,175,55,.35);transition:all .2s;user-select:none;text-align:center;display:inline-block;}
  .star:hover{color:var(--gold);transform:scale(1.3);}
  .star.on{color:var(--gold-light);text-shadow:0 0 12px var(--gold-light),0 0 24px rgba(255,215,0,.5);}
  .footnote{display:flex;flex-wrap:wrap;gap:20px;margin-top:14px;padding-top:12px;border-top:1px solid var(--gold);}
  .fn{color:var(--gold);font-size:12px;position:relative;padding-left:14px;opacity:.9;}
  .fn::before{content:"◆";position:absolute;left:0;color:var(--gold);font-size:8px;top:4px;}
  mark.hl{background:linear-gradient(135deg,#FFD700,#FF8C00);color:#0a0a0a;border-radius:3px;padding:0 2px;font-weight:800;}
  .steel-badges{display:inline-flex;flex-wrap:wrap;gap:3px;max-width:340px;}
  .steel-badge{display:inline-block;padding:2px 7px;border-radius:5px;background:linear-gradient(135deg,rgba(255,215,0,.18),rgba(255,140,0,.1));border:1px solid rgba(255,215,0,.5);color:var(--gold-light);font-size:10px;font-weight:800;letter-spacing:.2px;cursor:pointer;transition:.15s;}
  .steel-badge:hover{background:var(--gold);color:#0a0a0a;}
  .steel-badge.hot{background:linear-gradient(135deg,rgba(255,215,0,.4),rgba(255,140,0,.3));border-color:var(--gold);color:#fff;box-shadow:0 0 8px rgba(255,215,0,.55);animation:steelPulse 2.5s ease-in-out infinite;}
  .steel-badge.hot:hover{background:var(--gold);color:#0a0a0a;animation:none;}
  @keyframes steelPulse{0%,100%{box-shadow:0 0 8px rgba(255,215,0,.55);}50%{box-shadow:0 0 15px rgba(255,215,0,.9);}}
  .more-wrap{text-align:center;padding:16px 0 4px;}
  .btn-more{display:inline-flex;align-items:center;gap:8px;padding:12px 28px;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;}
  .btn-more:hover{background:var(--gold);color:#0a0a0a;}
  .btn-more b{color:#fff;}
  .pagination-info{color:var(--muted);font-size:12px;margin-top:6px;}
  .seo-hidden{position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);}
  .cta{text-align:center;background:var(--bg);border:1px solid var(--gold);border-radius:14px;padding:28px 20px;margin-top:16px;}
  .cta-text{font-size:16px;font-weight:600;color:var(--gold);margin-bottom:16px;}
  .cta-btn{display:inline-block;background:var(--gold);color:#0a0a0a;text-decoration:none;padding:16px 40px;font-size:20px;font-weight:800;letter-spacing:1px;border-radius:999px;transition:.25s;margin:0 6px;}
  .cta-btn:hover{background:var(--gold-light);transform:scale(1.03);}
  .cta-mail{display:inline-block;color:var(--gold);text-decoration:none;padding:16px 30px;font-size:16px;font-weight:700;border:1px solid var(--gold);border-radius:999px;transition:.25s;margin:0 6px;}
  .cta-mail:hover{background:var(--gold);color:#0a0a0a;}
  .manager{margin-top:16px;font-size:13px;color:var(--muted);}
  .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);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);}
  .sticky-inner{max-width:1600px;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(--gold-light);line-height:1;}
  .sticky-stat .val.big{font-size:24px;color:var(--gold);text-shadow:0 0 15px rgba(255,215,0,.7);}
  .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);}
  .sticky-actions{display:flex;gap:10px;flex-wrap:wrap;}
  .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;}
  .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-bar.discount-active .sticky-btn.primary{background:linear-gradient(135deg,#7dff7d,#3aa03a);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(--bad);}
  .sticky-btn.clear:hover{background:var(--bad);color:#0a0a0a;border-color:var(--bad);}
  @media(max-width:900px){.sticky-inner{flex-direction:column;gap:10px;}.sticky-info,.sticky-actions{justify-content:center;width:100%;}.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){body{padding-bottom:220px;}.sticky-stat{padding:2px 8px;}.sticky-stat .val{font-size:13px;}.sticky-stat .val.big{font-size:17px;}.sticky-stat .lbl{font-size:8px;}}
  .wrap ::-webkit-scrollbar{width:14px;height:14px;}
  .wrap ::-webkit-scrollbar-track{background:#050505;border:1px solid #2a2210;border-radius:9px;}
  .wrap ::-webkit-scrollbar-thumb{background:linear-gradient(180deg,#FFE55C,#FFD700,#FF8C00);border-radius:9px;border:1px solid #FFD700;}
  @media print{
    body{background:#fff;color:#000;padding:0;}
    .header,.tag,.line{color:#000 !important;background:#fff !important;box-shadow:none !important;text-shadow:none !important;animation:none !important;border-color:#666 !important;}
    .header h1{color:#000 !important;}
    .toolbar,.filter,.select-hint,th.col-star::before,.banner,.ticker,.ad-strip,.sticky-bar,.tabs,.global-badge,.more-wrap{display:none !important;}
    .stats,.table-block,.cta,.cta-block,.discount-banner,.cta-counter,.val{background:#fff !important;border-color:#666 !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important;}
    th{background:#000 !important;color:#FFD700 !important;-webkit-print-color-adjust:exact;print-color-adjust:exact;}
    td{color:#000 !important;border-color:#ccc !important;}
    .steel-badge{background:#fff !important;color:#000 !important;border-color:#666 !important;animation:none !important;box-shadow:none !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="wrap" id="app"&gt;&lt;/div&gt;


&lt;div class="seo-hidden" aria-hidden="true"&gt;
  &lt;h1&gt;Поковки стальные, заготовки под фланцы, готовые фланцы, раскатные кольца — каталог размеров и марок стали&lt;/h1&gt;
  &lt;h2&gt;Поковки диски ГОСТ 8479-70, ГОСТ 25054-81, ГОСТ 20072-74 — Ø200–2500 мм&lt;/h2&gt;
  &lt;p&gt;Поковки стальные диски: Ø200, Ø205, Ø210, Ø215, Ø220, Ø225, Ø230, Ø235, Ø240, Ø245, Ø250, Ø255, Ø260, Ø265, Ø270, Ø275, Ø280, Ø285, Ø290, Ø295, Ø300 мм и далее каждые 5 мм до Ø500 мм, затем каждые 10 мм до Ø1000 мм, затем каждые 50 мм до Ø2500 мм. Высота 100, 250, 400 мм. Марки стали: 09Г2С, 20, 15Х5М, 13ХФА, 12Х18Н10Т, 10Х17Н13М2Т, ст.20, 16ГС, 08Х13, 08Х18Н10Т.&lt;/p&gt;
  &lt;h2&gt;Заготовки под фланцы Ø200–2300 мм — ГОСТ 33259-2015, ГОСТ 28759-90&lt;/h2&gt;
  &lt;p&gt;Заготовки фланцев под механическую обработку с припуском 3–5 мм на сторону. Наружный диаметр 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350 мм и далее до 2300 мм. Внутренний диаметр 60% от наружного. Высота 80, 120, 160, 200, 250 мм. Стали 09Г2С, 20, 15Х5М, 13ХФА, 12Х18Н10Т.&lt;/p&gt;
  &lt;h2&gt;Фланцы готовые ГОСТ 33259-2015 тип 01 и тип 11 — DN15–DN2400, PN0,6–PN4,0&lt;/h2&gt;
  &lt;p&gt;Фланцы стальные плоские приварные тип 01: DN15, DN20, DN25, DN32, DN40, DN50, DN65, DN80, DN100, DN125, DN150, DN200, DN250, DN300, DN350, DN400, DN500, DN600, DN700, DN800, DN900, DN1000, DN1200, DN1400, DN1600, DN1800, DN2000, DN2200, DN2400. Давление PN0,6; 1,0; 1,6; 2,5; 4,0 МПа. Фланцы приварные встык тип 11 по ГОСТ 33259-2015, ГОСТ 28759.2-90, ГОСТ 28759.3-90, ГОСТ 28759.4-90, ASME B16.5, ASME B16.47, DIN EN 1092-1. Марки стали: ст.20, 09Г2С, 15Х5М, 13ХФА, 12Х18Н10Т, A105, A182GrF5, A350GrLF2, A182GrF304, A182GrF316L, P245GH, 16Mo3, 14404.&lt;/p&gt;
  &lt;h2&gt;Раскатные кольца и кольцевые заготовки Ø400–2500 мм&lt;/h2&gt;
  &lt;p&gt;Раскатные кольца, кольцевые заготовки, поковки колец. Наружный диаметр 400, 420, 440, 460, 480, 500, 520, 540, 560, 580, 600, 650, 700, 750, 800, 850, 900, 950, 1000, 1050, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500 мм. Внутренний диаметр 85% от наружного. Высота 80, 120, 160, 200, 250, 300, 350, 400 мм. Стали 20, 09Г2С, 13ХФА, 15Х5М, 12Х18Н10Т, 10Х17Н13М2Т.&lt;/p&gt;
  &lt;h2&gt;Ключевые запросы&lt;/h2&gt;
  &lt;p&gt;поковки стальные купить, поковка диска ГОСТ 8479-70, поковка 09Г2С, поковка 12Х18Н10Т, поковка 15Х5М, поковка 13ХФА, поковка ст.20, поковка 20Х, поковка 40Х, поковка 20ГЛ, поковка 40ХЛ, поковка Ø500, поковка Ø1000, поковка Ø2000, поковка Ø2500, заготовка под фланец купить, фланцевая заготовка 09Г2С, заготовка фланца ГОСТ 33259, заготовка фланца DN100, заготовка фланца DN500, заготовка под фланец 12Х18Н10Т, фланец плоский тип 01, фланец приварной встык тип 11, фланец ГОСТ 33259-2015 купить, фланец DN15, фланец DN50, фланец DN100, фланец DN200, фланец DN500, фланец DN1000, фланец DN2400, фланец PN16, фланец PN25, фланец PN40, фланец 09Г2С, фланец 12Х18Н10Т, фланец ст.20, фланец 15Х5М, фланец 13ХФА, фланец ASME B16.5, фланец ASME B16.47, фланец DIN EN 1092-1, кольцо раскатное купить, раскатное кольцо 09Г2С, раскатное кольцо 12Х18Н10Т, раскатное кольцо Ø1000, раскатное кольцо Ø2000, кольцо под фланец, поковка кольца, металлопрокат Екатеринбург, поковки Екатеринбург, фланцы Екатеринбург, кольца Екатеринбург, Арсенал-Деталь, металлообработка, токарная обработка, мехобработка фланцев, изготовление фланцев по чертежу, поковка по чертежу, кольцо по чертежу, скидка от 50 000, НДС 22, доставка по России, Белоруссия, Казахстан.&lt;/p&gt;
  &lt;p&gt;ООО «Арсенал Деталь», Екатеринбург. Скидка 10% от 50 000 ₽. Изготовление по чертежам заказчика. Доставка по России, Белоруссии, Казахстану.&lt;/p&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="barCount"&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="barQty"&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="barBase"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
      &lt;div class="sticky-stat"&gt;&lt;div class="lbl" id="barDiscountLabel"&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;Итого с НДС 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="downloadRequest()"&gt;⬇ Скачать запрос КП&lt;/button&gt;
      &lt;button class="sticky-btn" onclick="sendByEmail()"&gt;✉ На e-mail&lt;/button&gt;
      &lt;button class="sticky-btn clear" onclick="clearPicked()"&gt;✕ Очистить&lt;/button&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
/* ==================== ГЕНЕРАЦИЯ ДАННЫХ ==================== */
function wDisk(D1,D2,H){
  var r1=D1/2000,r2=(D2||0)/2000,h=H/1000;
  return Math.max(1,Math.round(Math.PI*(r1*r1-r2*r2)*h*7850));
}

var STEEL_COMMON = '09Г2С, 20, 15Х5М, 13ХФА, 12Х18Н10Т';
var STEEL_RING   = '20, 09Г2С, 13ХФА, 15Х5М, 12Х18Н10Т, 10Х17Н13М2Т';
var STEEL_FLANGE = 'ст.20, 09Г2С, 15Х5М, 13ХФА, 12Х18Н10Т';

function genPokovki(){
  var arr=[],n=0, hs=[100,250,400], ds=[];
  for(var d=200;d&lt;=500;d+=5)ds.push(d);
  for(var d=510;d&lt;=1000;d+=10)ds.push(d);
  for(var d=1050;d&lt;=2500;d+=50)ds.push(d);
  ds.forEach(function(D){ hs.forEach(function(H){ n++; arr.push({num:n,name:'Поковка Ø'+D+'×'+H,D_out:D,D_in:0,height:H,weight:wDisk(D,0,H),steel:STEEL_COMMON,std:'ГОСТ 8479-70',price:0,stock:0,term:'Под заказ'}); }); });
  return arr;
}

function genZagotovki(){
  var arr=[],n=0, hs=[80,120,160,200,250], ds=[];
  for(var d=200;d&lt;=500;d+=10)ds.push(d);
  for(var d=520;d&lt;=1000;d+=20)ds.push(d);
  for(var d=1050;d&lt;=2300;d+=50)ds.push(d);
  ds.forEach(function(D){ hs.forEach(function(H){ var Din=Math.round(D*0.6); n++; arr.push({num:n,name:'Заготовка Ø'+D+'/'+Din+'×'+H,D_out:D,D_in:Din,height:H,weight:wDisk(D,Din,H),steel:STEEL_COMMON,std:'ГОСТ 8479-70',price:0,stock:0,term:'Под заказ'}); }); });
  return arr;
}

function genFlanges(){
  var arr=[],n=0;
  var DN=[15,20,25,32,40,50,65,80,100,125,150,200,250,300,350,400,500,600,700,800,900,1000,1200,1400,1600,1800,2000,2200,2400];
  var PN=[0.6,1.0,1.6,2.5,4.0];
  var types=[['01','плоский','ГОСТ 33259-2015'],['11','приварной встык','ГОСТ 33259-2015']];
  DN.forEach(function(dn){ PN.forEach(function(pn){ types.forEach(function(t){
    var D_out=Math.round(dn*1.5+40), H=t[0]==='01'?Math.round(pn*6+14):Math.round(pn*10+20);
    n++;
    arr.push({num:n,name:'Фланец '+t[1]+' DN'+dn+' PN'+String(pn).replace('.',',')+' тип '+t[0],DN:dn,PN:pn,D_out:D_out,D_in:dn,height:H,weight:wDisk(D_out,dn,H),steel:STEEL_FLANGE,std:t[2],price:0,stock:0,term:'Под заказ'});
  });});});
  return arr;
}

function genKolca(){
  var arr=[],n=0, hs=[80,120,160,200,250,300,350,400], ds=[];
  for(var d=400;d&lt;=1000;d+=20)ds.push(d);
  for(var d=1050;d&lt;=2500;d+=50)ds.push(d);
  ds.forEach(function(D){ hs.forEach(function(H){ var Din=Math.round(D*0.85); n++; arr.push({num:n,name:'Кольцо раскатное Ø'+D+'/'+Din+'×'+H,D_out:D,D_in:Din,height:H,weight:wDisk(D,Din,H),steel:STEEL_RING,std:'ГОСТ 8479-70',price:0,stock:0,term:'Под заказ'}); }); });
  return arr;
}

/* ==================== ПРОЕКТ ==================== */
var PROJECT = {
  id: 'arsenal-metal',
  title: 'Металлопрокат: поковки, заготовки, фланцы, кольца',
  subtitle: 'Поковки · Заготовки под фланцы · Фланцы готовые · Раскатные кольца',
  vat: 22, discountThreshold: 50000, discountPercent: 10,

  banner: {tag:'РЕКЛАМНЫЕ ПЛОЩАДИ',title:'ЗДЕСЬ МОЖЕТ БЫТЬ&lt;br&gt;ВАША РЕКЛАМА',phone:'8 902 873-36-90 · МАКС',note:'Позвоните, а лучше пишите в МАКС'},
  ads: [
    {tag:'Акция', text:'Скидка от 50 000 ₽ · по всем разделам', cta:'Перейти →', href:'#'},
    {tag:'Завод', text:'Поковки · Фланцы · Кольца до Ø2500', cta:'Перейти →', href:'#'}
  ],

  sections: {},

  phone: '8 (902) 873-36-90', phoneHref: '+79028733690',
  email: 'arsenal-detal@list.ru',
  manager: 'Менеджер: Ольга · ООО «Арсенал Деталь»'
};

/* 4 раздела */
PROJECT.sections.pokovki = {
  label:'Поковки', icon:'⚒️',
  title:'Поковки стальные (диски)',
  subtitle:'ГОСТ 8479-70 · Ø200–2500 мм · H 100/250/400 мм',
  columns:[
    {key:'num',label:'№',type:'num',cls:'col-num'},
    {key:'name',label:'Наименование',type:'text'},
    {key:'D_out',label:'Ø, мм',type:'num',sortable:true},
    {key:'height',label:'H, мм',type:'num',sortable:true},
    {key:'weight',label:'Вес, кг',type:'num',sortable:true},
    {key:'steel',label:'Марки стали',type:'steel'},
    {key:'std',label:'Стандарт',type:'text'},
    {key:'stock',label:'Наличие',type:'badge'},
    {key:'price',label:'Цена',type:'price'},
    {key:'term',label:'Сроки',type:'text'}
  ],
  quickFilters:[
    {label:'09Г2С',field:'steel',value:'09Г2С'},
    {label:'12Х18Н10Т',field:'steel',value:'12Х18Н10Т'},
    {label:'15Х5М',field:'steel',value:'15Х5М'},
    {label:'Ø до 500',field:'dMax',value:500},
    {label:'Ø от 1000',field:'dMin',value:1000}
  ],
  data: genPokovki()
};

PROJECT.sections.zagotovki = {
  label:'Заготовки', icon:'?',
  title:'Заготовки под фланцы',
  subtitle:'ГОСТ 8479-70 · Ø200–2300 мм · H 80–250 мм',
  columns:[
    {key:'num',label:'№',type:'num',cls:'col-num'},
    {key:'name',label:'Наименование',type:'text'},
    {key:'D_out',label:'Ø нар, мм',type:'num',sortable:true},
    {key:'D_in',label:'Ø внутр, мм',type:'num',sortable:true},
    {key:'height',label:'H, мм',type:'num',sortable:true},
    {key:'weight',label:'Вес, кг',type:'num',sortable:true},
    {key:'steel',label:'Марки стали',type:'steel'},
    {key:'std',label:'Стандарт',type:'text'},
    {key:'stock',label:'Наличие',type:'badge'},
    {key:'price',label:'Цена',type:'price'},
    {key:'term',label:'Сроки',type:'text'}
  ],
  quickFilters:[
    {label:'09Г2С',field:'steel',value:'09Г2С'},
    {label:'12Х18Н10Т',field:'steel',value:'12Х18Н10Т'},
    {label:'Ø до 500',field:'dMax',value:500},
    {label:'Ø от 1000',field:'dMin',value:1000}
  ],
  data: genZagotovki()
};

PROJECT.sections.flanges = {
  label:'Фланцы', icon:'⚙️',
  title:'Фланцы готовые ГОСТ 33259-2015',
  subtitle:'Тип 01 плоский · Тип 11 приварной встык · DN15–DN2400',
  columns:[
    {key:'num',label:'№',type:'num',cls:'col-num'},
    {key:'name',label:'Наименование',type:'text'},
    {key:'DN',label:'DN',type:'num',sortable:true},
    {key:'PN',label:'PN, МПа',type:'num',sortable:true},
    {key:'D_out',label:'Ø, мм',type:'num',sortable:true},
    {key:'height',label:'H, мм',type:'num',sortable:true},
    {key:'weight',label:'Вес, кг',type:'num',sortable:true},
    {key:'steel',label:'Марки стали',type:'steel'},
    {key:'std',label:'Стандарт',type:'text'},
    {key:'stock',label:'Наличие',type:'badge'},
    {key:'price',label:'Цена',type:'price'},
    {key:'term',label:'Сроки',type:'text'}
  ],
  quickFilters:[
    {label:'Тип 01',field:'typeName',value:'плоский'},
    {label:'Тип 11',field:'typeName',value:'приварной встык'},
    {label:'DN до 200',field:'dnMax',value:200},
    {label:'DN от 500',field:'dnMin',value:500},
    {label:'09Г2С',field:'steel',value:'09Г2С'}
  ],
  data: genFlanges()
};

PROJECT.sections.kolca = {
  label:'Раскатные кольца', icon:'⭕',
  title:'Раскатные кольца',
  subtitle:'ГОСТ 8479-70 · Ø400–2500 мм · H 80–400 мм',
  columns:[
    {key:'num',label:'№',type:'num',cls:'col-num'},
    {key:'name',label:'Наименование',type:'text'},
    {key:'D_out',label:'Ø нар, мм',type:'num',sortable:true},
    {key:'D_in',label:'Ø внутр, мм',type:'num',sortable:true},
    {key:'height',label:'H, мм',type:'num',sortable:true},
    {key:'weight',label:'Вес, кг',type:'num',sortable:true},
    {key:'steel',label:'Марки стали',type:'steel'},
    {key:'std',label:'Стандарт',type:'text'},
    {key:'stock',label:'Наличие',type:'badge'},
    {key:'price',label:'Цена',type:'price'},
    {key:'term',label:'Сроки',type:'text'}
  ],
  quickFilters:[
    {label:'09Г2С',field:'steel',value:'09Г2С'},
    {label:'12Х18Н10Т',field:'steel',value:'12Х18Н10Т'},
    {label:'10Х17Н13М2Т',field:'steel',value:'10Х17Н13М2Т'},
    {label:'Ø до 1000',field:'dMax',value:1000},
    {label:'Ø от 1500',field:'dMin',value:1500}
  ],
  data: genKolca()
};

/* ==================== ДВИЖОК ==================== */
var state = {search:'',sort:{key:null,dir:1},filters:{},quickFilter:null,section:'pokovki',page:1};
var picked = {};
var PAGE_SIZE = 100;

function keyOf(s,n){ return s+':'+n; }
function curSec(){ return PROJECT.sections[state.section]; }
function fmt(n){ return Math.round(n).toLocaleString('ru-RU'); }

var HOT_STEELS = ['09г2с','12х18н10т','20','ст.20','20гл','20л'];
function isHotSteel(s){ return HOT_STEELS.indexOf(norm(s))!==-1; }

function norm(s){
  return String(s==null?'':s).toLowerCase()
    .replace(/ё/g,'е').replace(/,/g,'.').replace(/[×xх*]/g,'x')
    .replace(/\b(мм|см|м|т|шт|руб|р|₽|кг|г|н|мпа|class)\b/g,' ')
    .replace(/[^\wа-я0-9.x\s-]+/gi,' ').replace(/\s+/g,' ').trim();
}
function buildIndex(r){
  var parts = [r.num,r.name,r.std,r.height,r.steel,r.DN,r.PN,r.D_out,r.D_in];
  var base = norm(parts.join(' '));
  var extra = '';
  [r.weight,r.D_out,r.D_in,r.DN,r.PN].forEach(function(v){
    if (v==null||v==='')return;
    var n = parseFloat(String(v).replace(',','.'));
    if (isNaN(n))return;
    extra += ' '+n+' '+n.toFixed(1)+' '+(n*1000)+' ';
  });
  return (base+' '+norm(extra)).replace(/\s+/g,' ').trim();
}
function tokenize(q){ return norm(q).split(' ').filter(function(t){return t.length&gt;0;}); }
function tokenMatches(tok, idx){
  if (idx.indexOf(tok)!==-1) return true;
  var n = parseFloat(tok);
  if (!isNaN(n)&amp;&amp;/^\d+(\.\d+)?$/.test(tok)){
    var vs=[String(n),n.toFixed(1),n.toFixed(2),('0'+n).slice(-2),String(n*1000)];
    for (var i=0;i&lt;vs.length;i++) if (idx.indexOf(vs[i])!==-1) return true;
  }
  return false;
}
function rowMatches(r,tokens){
  if (!tokens.length) return true;
  var idx = buildIndex(r);
  for (var i=0;i&lt;tokens.length;i++) if (!tokenMatches(tokens[i],idx)) return false;
  return true;
}
function hl(text,tokens){
  if (!tokens.length) return text;
  var out = String(text);
  tokens.forEach(function(t){
    if (t.length&lt;2) return;
    var re = new RegExp('('+t.replace(/[.*+?^${}()|[\]\\]/g,'\\$&amp;')+')','gi');
    out = out.replace(re,'&lt;mark class="hl"&gt;$1&lt;/mark&gt;');
  });
  return out;
}

function calcBaseSum(){
  var t=0;
  Object.keys(picked).forEach(function(k){
    var p=k.split(':'), sec=PROJECT.sections[p[0]];
    if(!sec)return;
    var r=sec.data.find(function(x){return x.num===parseInt(p[1],10);});
    if(!r)return;
    t += (r.price||0)*(picked[k]||1);
  });
  return t;
}
function getDiscount(s){ return s&gt;=PROJECT.discountThreshold ? s*(PROJECT.discountPercent/100) : 0; }
function isDiscountActive(s){ return s&gt;=PROJECT.discountThreshold; }

function renderSteel(steelStr, tokens){
  if (!steelStr) return '';
  var grades = steelStr.split(',').map(function(s){return s.trim();}).filter(function(s){return s;});
  var html = '&lt;div class="steel-badges"&gt;';
  grades.forEach(function(g){
    var hot = isHotSteel(g)?' hot':'';
    var txt = g;
    if (tokens &amp;&amp; tokens.length){
      var re = new RegExp('('+tokens.map(function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,'\\$&amp;');}).join('|')+')','gi');
      if (tokens.some(function(t){ return norm(g).indexOf(t)!==-1; })) {
        txt = g.replace(re,'&lt;mark class="hl"&gt;$1&lt;/mark&gt;');
      }
    }
    html += '&lt;span class="steel-badge'+hot+'"&gt;'+txt+'&lt;/span&gt;';
  });
  html += '&lt;/div&gt;';
  return html;
}

function renderApp(){
  var p = PROJECT, html = '';

  html += '&lt;div class="banner"&gt;&lt;div class="banner-tag"&gt;'+p.banner.tag+'&lt;/div&gt;&lt;div class="banner-title"&gt;'+p.banner.title+'&lt;/div&gt;&lt;div class="banner-phone"&gt;'+p.banner.phone+'&lt;/div&gt;&lt;div class="banner-note"&gt;'+p.banner.note+'&lt;/div&gt;&lt;/div&gt;';

  var tick = '';
  Object.keys(p.sections).forEach(function(sk){
    var s=p.sections[sk];
    s.data.slice(0,2).forEach(function(r){
      tick += '&lt;span class="ticker-item"&gt;'+r.name+'&lt;/span&gt;&lt;span class="ticker-dot"&gt;◆&lt;/span&gt;';
    });
  });
  html += '&lt;div class="ticker"&gt;&lt;div class="ticker-label"&gt;РАЗДЕЛЫ&lt;/div&gt;&lt;div class="ticker-vp"&gt;&lt;div class="ticker-track"&gt;'+tick+tick+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';

  html += '&lt;div class="ad-strip"&gt;'+p.ads.map(function(a){
    return '&lt;a class="ad-item" href="'+(a.href||'#')+'"&gt;&lt;span class="ad-tag"&gt;'+a.tag+'&lt;/span&gt;&lt;span class="ad-text"&gt;'+a.text+'&lt;/span&gt;&lt;span class="ad-cta"&gt;'+a.cta+'&lt;/span&gt;&lt;/a&gt;';
  }).join('')+'&lt;/div&gt;';

  html += '&lt;div class="header"&gt;&lt;div class="tag"&gt;'+p.title.toUpperCase()+'&lt;/div&gt;&lt;h1&gt;'+p.title+'&lt;/h1&gt;&lt;div class="line"&gt;&lt;/div&gt;&lt;p&gt;'+p.subtitle+'&lt;/p&gt;&lt;/div&gt;';

  html += '&lt;div class="tabs" id="tabsBlock"&gt;';
  Object.keys(p.sections).forEach(function(sk){
    var s=p.sections[sk];
    html += '&lt;button class="tab'+(state.section===sk?' active':'')+'" onclick="switchSection(\''+sk+'\')"&gt;'+s.icon+' '+s.label+' &lt;span class="cnt"&gt;'+s.data.length+'&lt;/span&gt;&lt;/button&gt;';
  });
  html += '&lt;/div&gt;';

  var sec = curSec();

  html += '&lt;div class="discount-banner" id="discountBanner"&gt;&lt;h3&gt;★ Скидка от суммы ★&lt;/h3&gt;&lt;p&gt;Закажите на сумму от &lt;b&gt;50 000 ₽&lt;/b&gt; — получите &lt;b style="color:#7dff7d"&gt;скидку 10%&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="discBase"&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;50 000 ₽&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="discRate"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';

  html += '&lt;div class="cta-block"&gt;&lt;h2&gt;'+sec.title+'&lt;/h2&gt;&lt;p&gt;Кликните &lt;b&gt;★&lt;/b&gt;, укажите количество — сумма появится внизу экрана.&lt;br&gt;При сумме от &lt;b&gt;50 000 ₽&lt;/b&gt; скидка 10% применится автоматически.&lt;/p&gt;&lt;div class="cta-counter"&gt;Выбрано: &lt;b id="selectedCount"&gt;0&lt;/b&gt; из '+sec.data.length+'&lt;/div&gt;&lt;div class="cta-buttons"&gt;&lt;button class="btn-big primary" onclick="downloadRequest()"&gt;⬇ Скачать запрос КП&lt;/button&gt;&lt;button class="btn-big" onclick="sendByEmail()"&gt;✉ Отправить на e-mail&lt;/button&gt;&lt;button class="btn-big" onclick="scrollToTable()"&gt;↓ К каталогу&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;';

  html += '&lt;div class="stats"&gt;&lt;div class="stat"&gt;&lt;div class="lbl"&gt;Всего позиций&lt;/div&gt;&lt;div class="val" id="statTotal"&gt;—&lt;/div&gt;&lt;/div&gt;&lt;div class="stat"&gt;&lt;div class="lbl"&gt;Всего на складе&lt;/div&gt;&lt;div class="val" id="statStock"&gt;—&lt;/div&gt;&lt;/div&gt;&lt;div class="stat"&gt;&lt;div class="lbl"&gt;Диапазон&lt;/div&gt;&lt;div class="val sm" id="statCap"&gt;—&lt;/div&gt;&lt;/div&gt;&lt;div class="stat"&gt;&lt;div class="lbl"&gt;Цена от&lt;/div&gt;&lt;div class="val sm" id="statPrice"&gt;—&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';

  html += '&lt;div class="toolbar"&gt;&lt;button class="btn" onclick="resetFilters()"&gt;✕ Очистить фильтры&lt;/button&gt;&lt;button class="btn" onclick="window.print()"&gt;? Печать&lt;/button&gt;&lt;/div&gt;';

  html += '&lt;div class="filter"&gt;&lt;div class="filter-row"&gt;&lt;input class="search" type="text" id="search" placeholder="? Сквозной поиск: 09Г2С, 500, фланец, DN100, 12Х18Н10Т, поковка…"&gt;&lt;div class="counter" id="counter"&gt;Найдено: 0&lt;/div&gt;&lt;/div&gt;&lt;div class="search-help"&gt;Поиск &lt;b&gt;сразу по всем разделам&lt;/b&gt;: размеры (Ø500, DN100, H250), марки стали (09Г2С, 12Х18Н10Т, 20), стандарты (8479, 33259). Несколько слов через пробел — &lt;b&gt;все должны найтись&lt;/b&gt;. Клик по бейджу стали — фильтр по марке.&lt;/div&gt;&lt;div class="filter-grid" style="margin-top:12px"&gt;&lt;div class="fld"&gt;&lt;label&gt;Ø / DN&lt;/label&gt;&lt;input type="number" id="fCapacity" placeholder="напр. 500"&gt;&lt;/div&gt;&lt;div class="fld"&gt;&lt;label&gt;Высота, мм&lt;/label&gt;&lt;input type="number" id="fLength" placeholder="напр. 250"&gt;&lt;/div&gt;&lt;div class="fld"&gt;&lt;label&gt;Тип (01/11)&lt;/label&gt;&lt;input type="text" id="fType" placeholder="01, 11"&gt;&lt;/div&gt;&lt;div class="fld"&gt;&lt;label&gt;Наличие&lt;/label&gt;&lt;select id="fStock"&gt;&lt;option value="all"&gt;Все&lt;/option&gt;&lt;option value="in"&gt;Есть на складе&lt;/option&gt;&lt;option value="out"&gt;Под заказ&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;div class="fld"&gt;&lt;label&gt;Сроки&lt;/label&gt;&lt;select id="fTerm"&gt;&lt;option value="all"&gt;Все&lt;/option&gt;&lt;option value="Под заказ"&gt;Под заказ&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="filter-actions"&gt;'+sec.quickFilters.map(function(q,i){return '&lt;button class="btn" onclick="applyQuick('+i+')"&gt;'+q.label+'&lt;/button&gt;';}).join('')+'&lt;/div&gt;&lt;/div&gt;';

  html += '&lt;div class="table-block" id="catalog"&gt;&lt;div class="select-hint"&gt;→ ВЫБЕРИ ПОЗИЦИИ →&lt;/div&gt;&lt;div class="global-badge" id="globalBadge"&gt;&lt;/div&gt;&lt;div class="block-title" id="blockTitle"&gt;'+sec.title+' · прайс-лист&lt;/div&gt;&lt;div class="table-wrap"&gt;&lt;table id="tbl"&gt;&lt;thead id="thead"&gt;&lt;/thead&gt;&lt;tbody id="tbody"&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div id="moreWrap"&gt;&lt;/div&gt;&lt;div class="footnote"&gt;&lt;div class="fn"&gt;Отметьте &lt;b&gt;★&lt;/b&gt;, укажите &lt;b&gt;количество&lt;/b&gt;&lt;/div&gt;&lt;div class="fn"&gt;Цены &lt;b&gt;с НДС '+p.vat+'%&lt;/b&gt;&lt;/div&gt;&lt;div class="fn"&gt;Скидка &lt;b&gt;10%&lt;/b&gt; от 50 000 ₽&lt;/div&gt;&lt;div class="fn"&gt;Позиции «по запросу» — цена по чертежу&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';

  html += '&lt;div class="cta"&gt;&lt;p class="cta-text"&gt;Отметили позиции? Нажмите «Скачать запрос КП»&lt;/p&gt;&lt;button class="btn-big primary" onclick="downloadRequest()"&gt;⬇ Скачать запрос КП&lt;/button&gt;&lt;div style="margin-top:20px"&gt;&lt;a href="tel:'+p.phoneHref+'" class="cta-btn"&gt;'+p.phone+'&lt;/a&gt;&lt;a href="mailto:'+p.email+'" class="cta-mail"&gt;✉ '+p.email+'&lt;/a&gt;&lt;/div&gt;&lt;p class="manager"&gt;'+p.manager+'&lt;/p&gt;&lt;/div&gt;';

  document.getElementById('app').innerHTML = html;
}

function switchSection(sk){
  state.section=sk; state.search=''; state.filters={}; state.quickFilter=null;
  state.sort={key:null,dir:1}; state.page=1;
  renderApp(); updateStats(); render();
}

function collectAll(){
  var o=[];
  Object.keys(PROJECT.sections).forEach(function(sk){
    PROJECT.sections[sk].data.forEach(function(r){ o.push({section:sk,sectionLabel:PROJECT.sections[sk].label,row:r}); });
  });
  return o;
}

function getFiltered(){
  var tokens = tokenize(state.search);
  var isGlobal = tokens.length&gt;0;
  var items;
  if (isGlobal){
    items = collectAll().filter(function(it){return rowMatches(it.row,tokens);});
  } else {
    var sec = curSec();
    items = sec.data.map(function(r){return {section:state.section,sectionLabel:sec.label,row:r};});
  }
  if (!isGlobal){
    if (state.filters.capacity){
      var c=parseFloat(state.filters.capacity);
      if(!isNaN(c)) items=items.filter(function(it){
        var r=it.row;
        return r.D_out===c || r.diam===c || r.D===c || r.DN===c;
      });
    }
    if (state.filters.length){
      var l=parseFloat(state.filters.length);
      if(!isNaN(l)) items=items.filter(function(it){return it.row.height===l;});
    }
    if (state.filters.stock==='in') items=items.filter(function(it){return it.row.stock&gt;0;});
    if (state.filters.stock==='out') items=items.filter(function(it){return it.row.stock===0;});
    if (state.filters.term &amp;&amp; state.filters.term!=='all') items=items.filter(function(it){return it.row.term===state.filters.term;});
    if (state.filters.type){
      var ft=norm(state.filters.type);
      if (ft) items=items.filter(function(it){
        var r=it.row;
        return norm(r.type||'').indexOf(ft)!==-1 || norm(r.name||'').indexOf(ft)!==-1;
      });
    }
    if (state.quickFilter){
      var qf = state.quickFilter;
      items = items.filter(function(it){
        var r = it.row;
        if (qf.field==='term') return r.term===qf.value;
        if (qf.field==='typeName') return norm(r.name||'').indexOf(norm(qf.value))!==-1;
        if (qf.field==='steel') return norm(r.steel||'').indexOf(norm(qf.value))!==-1;
        if (qf.field==='dMax') return (r.D_out||0)&lt;=qf.value;
        if (qf.field==='dMin') return (r.D_out||0)&gt;=qf.value;
        if (qf.field==='dnMax') return (r.DN||0)&lt;=qf.value;
        if (qf.field==='dnMin') return (r.DN||0)&gt;=qf.value;
        return true;
      });
    }
  }
  if (state.sort.key &amp;&amp; !isGlobal){
    var k=state.sort.key, d=state.sort.dir;
    items.sort(function(a,b){
      var va=a.row[k], vb=b.row[k];
      if (typeof va==='number' &amp;&amp; typeof vb==='number') return (va-vb)*d;
      return String(va).localeCompare(String(vb),'ru')*d;
    });
  }
  return {items:items,tokens:tokens,isGlobal:isGlobal};
}

function rowChars(section,r){
  if (section==='pokovki' || section==='zagotovki' || section==='kolca'){
    return 'Ø'+r.D_out + (r.D_in?'/'+r.D_in:'') + ' × H'+r.height + ' · '+r.std;
  }
  if (section==='flanges'){
    return 'DN'+r.DN+' PN'+String(r.PN).replace('.',',')+' · '+r.std;
  }
  return '';
}

function render(){
  var res = getFiltered();
  var items = res.items, tokens = res.tokens, isGlobal = res.isGlobal;
  var tbody = document.getElementById('tbody');
  var thead = document.getElementById('thead');
  if (!tbody || !thead) return;
  tbody.innerHTML = ''; thead.innerHTML = '';

  var baseSum = calcBaseSum();
  var discountActive = isDiscountActive(baseSum);
  var globalBadge = document.getElementById('globalBadge');
  var blockTitle = document.getElementById('blockTitle');
  var tabsBlock = document.getElementById('tabsBlock');

  if (isGlobal){
    if (tabsBlock) tabsBlock.style.display='none';
    if (globalBadge){
      globalBadge.classList.add('show');
      var sc={};
      items.forEach(function(it){sc[it.section]=(sc[it.section]||0)+1;});
      var parts = Object.keys(sc).map(function(sk){return PROJECT.sections[sk].label+': '+sc[sk];});
      globalBadge.innerHTML = '&lt;span&gt;? &lt;b&gt;Сквозной поиск&lt;/b&gt; «'+state.search+'» — найдено &lt;b&gt;'+items.length+'&lt;/b&gt; поз.&lt;/span&gt;&lt;span style="opacity:.8"&gt;'+parts.join(' · ')+'&lt;/span&gt;&lt;button class="btn" onclick="exitGlobalSearch()"&gt;✕ Выйти из сквозного поиска&lt;/button&gt;';
    }
    if (blockTitle) blockTitle.textContent = 'Результаты поиска';
  } else {
    if (tabsBlock) tabsBlock.style.display='';
    if (globalBadge) globalBadge.classList.remove('show');
    if (blockTitle) blockTitle.textContent = curSec().title+' · прайс-лист';
  }

  if (isGlobal){
    thead.innerHTML = '&lt;tr&gt;&lt;th class="col-star"&gt;★&lt;/th&gt;&lt;th class="col-qty"&gt;Кол-во&lt;/th&gt;&lt;th&gt;Раздел&lt;/th&gt;&lt;th&gt;№&lt;/th&gt;&lt;th&gt;Наименование&lt;/th&gt;&lt;th class="num"&gt;Ø / DN&lt;/th&gt;&lt;th&gt;Характеристики&lt;/th&gt;&lt;th&gt;Сталь&lt;/th&gt;&lt;th class="num"&gt;Наличие&lt;/th&gt;&lt;th class="num"&gt;Цена&lt;/th&gt;&lt;th&gt;Сроки&lt;/th&gt;&lt;/tr&gt;';
  } else {
    var sec = curSec();
    var th = '&lt;tr&gt;&lt;th class="col-star"&gt;★&lt;/th&gt;&lt;th class="col-qty"&gt;Кол-во&lt;/th&gt;';
    sec.columns.forEach(function(c){
      var cls = (c.type==='num'?'num ':'') + (c.cls||'');
      if (c.sortable) cls += ' sortable';
      th += '&lt;th class="'+cls+'" '+(c.sortable?'data-key="'+c.key+'"':'')+'&gt;'+c.label+'&lt;/th&gt;';
    });
    th += '&lt;/tr&gt;';
    thead.innerHTML = th;
  }

  if (!items.length){
    var colCount = isGlobal ? 11 : (curSec().columns.length+2);
    tbody.innerHTML = '&lt;tr&gt;&lt;td colspan="'+colCount+'" style="text-align:center;padding:40px;opacity:.6"&gt;Ничего не найдено. Попробуйте: «500», «09Г2С», «фланец», «DN100», «кольцо 1000».&lt;/td&gt;&lt;/tr&gt;';
    document.getElementById('counter').textContent='Найдено: 0';
    document.getElementById('moreWrap').innerHTML='';
    updateStickyBar(); updateDiscountBanner(); bindSortHeaders();
    return;
  }

  var showCount = Math.min(items.length, state.page*PAGE_SIZE);
  var visible = items.slice(0, showCount);
  var html = '';

  visible.forEach(function(it){
    var r = it.row;
    var k = keyOf(it.section, r.num);
    var isPicked = picked[k]!==undefined;
    var qty = isPicked ? picked[k] : 1;
    var hasPrice = (r.price||0)&gt;0;
    var finalPrice = discountActive &amp;&amp; hasPrice ? Math.round(r.price*(1-PROJECT.discountPercent/100)) : r.price;
    var trCls = isPicked ? (discountActive&amp;&amp;hasPrice?'picked discount-active':'picked') : '';
    var cells = '&lt;tr class="'+trCls+'"&gt;';
    cells += '&lt;td class="col-star"&gt;&lt;span class="star'+(isPicked?' on':'')+'" data-sec="'+it.section+'" data-num="'+r.num+'"&gt;'+(isPicked?'★':'☆')+'&lt;/span&gt;&lt;/td&gt;';
    cells += '&lt;td class="col-qty"&gt;&lt;input type="number" class="qty" data-sec="'+it.section+'" data-num="'+r.num+'" value="'+qty+'" min="1" max="9999"'+(isPicked?'':' disabled')+'&gt;&lt;/td&gt;';

    if (isGlobal){
      var gp = r.DN!=null ? 'DN'+r.DN : 'Ø'+r.D_out;
      var nameHl = tokens.length ? hl(r.name,tokens) : r.name;
      var priceCell = hasPrice ? '&lt;td class="num price'+(discountActive&amp;&amp;isPicked?' discount':'')+'"&gt;'+fmt(finalPrice)+' ₽&lt;/td&gt;' : '&lt;td class="num price request"&gt;по запросу&lt;/td&gt;';
      var steelCell = r.steel ? '&lt;td&gt;'+renderSteel(r.steel,tokens)+'&lt;/td&gt;' : '&lt;td&gt;—&lt;/td&gt;';
      cells += '&lt;td&gt;'+it.sectionLabel+'&lt;/td&gt;&lt;td class="num"&gt;'+r.num+'&lt;/td&gt;&lt;td&gt;'+nameHl+'&lt;/td&gt;&lt;td class="num"&gt;'+gp+'&lt;/td&gt;&lt;td&gt;'+rowChars(it.section,r)+'&lt;/td&gt;'+steelCell+'&lt;td class="num"&gt;&lt;span class="'+(r.stock&gt;=10?'badge many':r.stock===0?'badge zero':'badge')+'"&gt;'+(r.stock&gt;0?r.stock:'под заказ')+'&lt;/span&gt;&lt;/td&gt;'+priceCell+'&lt;td&gt;'+r.term+'&lt;/td&gt;';
    } else {
      var sec = curSec();
      sec.columns.forEach(function(c){
        var v = r[c.key];
        if (c.type==='num') cells += '&lt;td class="num '+(c.cls||'')+'"&gt;'+v+'&lt;/td&gt;';
        else if (c.type==='price'){
          if (v&gt;0) cells += discountActive&amp;&amp;isPicked ? '&lt;td class="num price discount"&gt;'+fmt(finalPrice)+' ₽&lt;/td&gt;' : '&lt;td class="num price"&gt;'+fmt(v)+' ₽&lt;/td&gt;';
          else cells += '&lt;td class="num price request"&gt;по запросу&lt;/td&gt;';
        }
        else if (c.type==='badge'){
          var cls = v&gt;=10?'badge many':v===0?'badge zero':'badge';
          cells += '&lt;td class="num"&gt;&lt;span class="'+cls+'"&gt;'+(v&gt;0?v:'под заказ')+'&lt;/span&gt;&lt;/td&gt;';
        }
        else if (c.type==='steel'){
          cells += '&lt;td&gt;'+renderSteel(v,tokens)+'&lt;/td&gt;';
        }
        else {
          var txt = (c.key==='num') ? '&lt;b&gt;'+v+'&lt;/b&gt;' : v;
          if (c.key==='name' &amp;&amp; tokens.length) txt = hl(v,tokens);
          cells += '&lt;td class="'+(c.cls||'')+'"&gt;'+txt+'&lt;/td&gt;';
        }
      });
    }
    cells += '&lt;/tr&gt;';
    html += cells;
  });
  tbody.innerHTML = html;
  document.getElementById('counter').textContent = 'Найдено: '+items.length;

  var moreWrap = document.getElementById('moreWrap');
  if (showCount &lt; items.length){
    moreWrap.innerHTML = '&lt;div class="more-wrap"&gt;&lt;button class="btn-more" onclick="loadMore()"&gt;Показать ещё &lt;b&gt;'+Math.min(PAGE_SIZE, items.length-showCount)+'&lt;/b&gt; из '+(items.length-showCount)+'&lt;/button&gt;&lt;div class="pagination-info"&gt;Показано '+showCount+' из '+items.length+'&lt;/div&gt;&lt;/div&gt;';
  } else if (items.length &gt; PAGE_SIZE){
    moreWrap.innerHTML = '&lt;div class="pagination-info" style="text-align:center;padding:12px"&gt;Показаны все '+items.length+' позиций&lt;/div&gt;';
  } else {
    moreWrap.innerHTML = '';
  }

  updateSort();
  updateStickyBar();
  updateDiscountBanner();
  bindEventsDelegated(tbody);
  bindSortHeaders();
}

function loadMore(){
  state.page++;
  render();
}

function bindEventsDelegated(tbody){
  if (tbody._bound) return;
  tbody._bound = true;
  tbody.addEventListener('click',function(e){
    var el = e.target;
    if (el.classList.contains('star')){
      var s = el.dataset.sec, n = parseInt(el.dataset.num,10);
      var k = keyOf(s,n);
      if (picked[k]!==undefined) delete picked[k];
      else picked[k]=1;
      render();
    }
    if (el.classList.contains('steel-badge')){
      var txt = el.textContent.trim();
      state.search = txt; state.page = 1;
      var s = document.getElementById('search');
      if (s) s.value = txt;
      render();
    }
  });
  tbody.addEventListener('input',function(e){
    if (e.target.classList.contains('qty')){
      var s = e.target.dataset.sec, n = parseInt(e.target.dataset.num,10);
      var k = keyOf(s,n);
      if (picked[k]===undefined) return;
      var v = Math.max(1, parseInt(e.target.value,10)||1);
      picked[k]=v;
      updateStickyBar(); updateDiscountBanner();
    }
  });
}

function updateSort(){
  document.querySelectorAll('#tbl th.sortable').forEach(function(th){
    th.classList.remove('asc','desc');
    if (th.dataset.key===state.sort.key) th.classList.add(state.sort.dir===1?'asc':'desc');
  });
}
function bindSortHeaders(){
  document.querySelectorAll('#tbl th.sortable').forEach(function(th){
    if (th._bound) return;
    th._bound = true;
    th.addEventListener('click',function(){
      var k = th.dataset.key;
      if (state.sort.key===k) state.sort.dir *= -1;
      else state.sort = {key:k,dir:1};
      render();
    });
  });
}

function exitGlobalSearch(){
  state.search=''; state.page=1;
  var s = document.getElementById('search'); if (s) s.value='';
  renderApp(); updateStats(); render();
}

function updateDiscountBanner(){
  var baseSum = calcBaseSum();
  var active = isDiscountActive(baseSum);
  var remain = Math.max(0, PROJECT.discountThreshold - baseSum);
  var pct = Math.min(100, (baseSum / PROJECT.discountThreshold) * 100);
  var b = document.getElementById('discountBanner');
  if (b){ if (active) b.classList.add('active'); else b.classList.remove('active'); }
  var f = document.getElementById('progressFill'); if (f) f.style.width = pct.toFixed(1)+'%';
  var l = document.getElementById('progressLabel');
  if (l){
    if (baseSum===0) l.innerHTML='Отметьте позиции';
    else if (active) l.innerHTML='✓ &lt;b&gt;СКИДКА АКТИВНА!&lt;/b&gt; −10%';
    else l.innerHTML='Набрано: &lt;b&gt;'+fmt(baseSum)+' ₽&lt;/b&gt; из '+fmt(PROJECT.discountThreshold)+' ₽';
  }
  var db = document.getElementById('discBase'); if (db) db.textContent = fmt(baseSum)+' ₽';
  var dr = document.getElementById('discRemain'); if (dr) dr.textContent = active?'✓ Достигнуто':fmt(remain)+' ₽';
  var dRate = document.getElementById('discRate');
  if (dRate){
    if (active){ dRate.innerHTML='−'+fmt(getDiscount(baseSum))+' ₽'; dRate.style.color='#7dff7d'; }
    else { dRate.textContent='0 ₽'; dRate.style.color=''; }
  }
}

function updateStickyBar(){
  var keys = Object.keys(picked);
  var qty = 0, sum = 0;
  keys.forEach(function(k){
    var p = k.split(':'), sec = PROJECT.sections[p[0]];
    if (!sec) return;
    var r = sec.data.find(function(x){return x.num===parseInt(p[1],10);});
    if (!r) return;
    var q = picked[k]||1;
    qty += q; sum += (r.price||0)*q;
  });
  var active = isDiscountActive(sum);
  var disc = getDiscount(sum);
  var total = sum - disc;
  document.getElementById('barCount').textContent = keys.length;
  document.getElementById('barQty').textContent = qty;
  document.getElementById('barBase').textContent = fmt(sum)+' ₽';
  document.getElementById('barDiscount').textContent = active ? '−'+fmt(disc)+' ₽' : '0 ₽';
  document.getElementById('barDiscountLabel').textContent = active ? '✓ Скидка 10%' : 'Скидка';
  document.getElementById('barTotal').textContent = fmt(total)+' ₽';
  var bar = document.getElementById('stickyBar');
  if (keys.length&gt;0) bar.classList.add('show'); else bar.classList.remove('show');
  if (active) bar.classList.add('discount-active'); else bar.classList.remove('discount-active');
  var sel = document.getElementById('selectedCount'); if (sel) sel.textContent = keys.length;
}

function clearPicked(){
  if (!Object.keys(picked).length) return;
  if (!confirm('Очистить все отмеченные позиции?')) return;
  picked = {}; render();
}

function updateStats(){
  var sec = curSec();
  var d = sec.data;
  document.getElementById('statTotal').textContent = d.length;
  document.getElementById('statStock').textContent = d.reduce(function(s,r){return s+(r.stock||0);},0)+' шт';
  var vals = d.map(function(r){return r.D_out;}).filter(function(v){return v!=null;});
  if (vals.length) document.getElementById('statCap').textContent = Math.min.apply(null,vals)+'–'+Math.max.apply(null,vals);
  else document.getElementById('statCap').textContent = '—';
  var prices = d.map(function(r){return r.price;}).filter(function(p){return p&gt;0;});
  document.getElementById('statPrice').textContent = prices.length ? fmt(Math.min.apply(null,prices))+' ₽' : 'по запросу';
}

function scrollToTable(){ document.getElementById('catalog').scrollIntoView({behavior:'smooth',block:'start'}); }
function resetFilters(){
  state.search=''; state.filters={}; state.quickFilter=null; state.page=1;
  renderApp(); updateStats(); render();
}
function applyQuick(i){
  resetFilters();
  state.quickFilter = curSec().quickFilters[i];
  state.page = 1;
  render();
}

function collectPicked(){
  var out=[];
  Object.keys(picked).forEach(function(k){
    var p = k.split(':'), sec = PROJECT.sections[p[0]];
    if (!sec) return;
    var r = sec.data.find(function(x){return x.num===parseInt(p[1],10);});
    if (!r) return;
    out.push({section:p[0],sectionLabel:sec.label,row:r,qty:picked[k]||1});
  });
  return out;
}

function downloadRequest(){
  var items = collectPicked();
  if (!items.length){ alert('Отметьте позиции звёздочкой ★'); scrollToTable(); return; }
  var baseSum = calcBaseSum();
  var active = isDiscountActive(baseSum);
  var disc = getDiscount(baseSum);
  var header = ['Раздел','№','Наименование','Ø / DN','Характеристики','Сталь','Цена с НДС','Кол-во','Сумма','Сроки'];
  var body = items.map(function(it){
    var r = it.row;
    var hasPrice = (r.price||0)&gt;0;
    var fp = active &amp;&amp; hasPrice ? Math.round(r.price*(1-PROJECT.discountPercent/100)) : r.price;
    var gp = r.DN!=null ? 'DN'+r.DN : 'Ø'+r.D_out;
    return [it.sectionLabel, r.num, r.name, gp, rowChars(it.section,r), r.steel||'', hasPrice?fp:'по запросу', it.qty, hasPrice?Math.round(fp*it.qty):'по запросу', r.term];
  });
  body.push([]); body.push(['','','','','ИТОГО:','','','',Math.round(baseSum-disc),active?'Скидка 10%':'']);
  var esc = function(v){return '"'+String(v==null?'':v).replace(/"/g,'""')+'"';};
  var csv = [header].concat(body).map(function(r){return r.map(esc).join(';');}).join('\r\n');
  var blob = new Blob(['\uFEFF'+csv],{type:'text/csv;charset=utf-8;'});
  var url = URL.createObjectURL(blob);
  var a = document.createElement('a');
  a.href = url; a.download = 'Запрос_КП_Арсенал_'+today()+'.csv';
  document.body.appendChild(a); a.click(); a.remove();
  setTimeout(function(){URL.revokeObjectURL(url);},500);
}

function sendByEmail(){
  var items = collectPicked();
  if (!items.length){ alert('Отметьте позиции'); scrollToTable(); return; }
  var baseSum = calcBaseSum();
  var active = isDiscountActive(baseSum);
  var disc = getDiscount(baseSum);
  var lines = ['Здравствуйте!','','Прошу подготовить КП:',''];
  items.forEach(function(it){
    var r = it.row;
    var hasPrice = (r.price||0)&gt;0;
    var fp = active &amp;&amp; hasPrice ? Math.round(r.price*(1-PROJECT.discountPercent/100)) : r.price;
    var ptxt = hasPrice ? fp+' ₽ × '+it.qty+' = '+fmt(fp*it.qty)+' ₽' : 'по запросу × '+it.qty;
    lines.push('['+it.sectionLabel+'] №'+r.num+' · '+r.name+' · '+ptxt);
  });
  lines.push('','Сумма без скидки: '+fmt(baseSum)+' ₽');
  if (active) lines.push('Скидка 10%: −'+fmt(disc)+' ₽');
  lines.push('ИТОГО с НДС 22%: '+fmt(baseSum-disc)+' ₽');
  lines.push('','Прошу указать сроки и условия отгрузки.','','С уважением,');
  var subj = encodeURIComponent('Запрос КП — '+items.length+' поз.');
  var body = encodeURIComponent(lines.join('\n'));
  window.location.href = 'mailto:'+PROJECT.email+'?subject='+subj+'&amp;body='+body;
}

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());
}

document.addEventListener('DOMContentLoaded', function(){
  renderApp(); updateStats(); render();

  function bindFilters(){
    var s = document.getElementById('search');
    if (s) s.addEventListener('input', debounce(function(e){
      state.search = e.target.value;
      state.page = 1;
      render();
    }, 200));
    var cap = document.getElementById('fCapacity');
    if (cap) cap.addEventListener('input', debounce(function(e){state.filters.capacity=e.target.value; state.page=1; render();},200));
    var len = document.getElementById('fLength');
    if (len) len.addEventListener('input', debounce(function(e){state.filters.length=e.target.value; state.page=1; render();},200));
    var st = document.getElementById('fStock');
    if (st) st.addEventListener('change',function(e){state.filters.stock=e.target.value; state.page=1; render();});
    var tm = document.getElementById('fTerm');
    if (tm) tm.addEventListener('change',function(e){state.filters.term=e.target.value; state.page=1; render();});
    var ty = document.getElementById('fType');
    if (ty) ty.addEventListener('input', debounce(function(e){state.filters.type=e.target.value; state.page=1; render();},200));
  }

  var _sw = window.switchSection;
  window.switchSection = function(sk){ _sw(sk); bindFilters(); };

  bindFilters();
});

function debounce(fn, ms){
  var t;
  return function(){
    var args = arguments, ctx = this;
    clearTimeout(t);
    t = setTimeout(function(){ fn.apply(ctx, args); }, ms);
  };
}
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</subtitle>
  <updated>2026-10-20T13:18:42Z</updated>
  <logo>https://irontub.ru/ssl/u/pic/4f/a3901e7f0711efa6f6c8a3da6ba1d7/-/g_ZFER2w6s8.jpg</logo>
  <author>
    <name>1154818</name>
    <uri>https://irontub.ru/</uri>
  </author>
  <entry>
    <id>urn:tag:irontub.ru,46492236:46492254</id>
    <title>Фланцы в сборе с прокладками</title>
    <published>2026-10-20T13:04:14Z</published>
    <updated>2026-10-20T13:18:23Z</updated>
    <link href="https://irontub.ru/pokovki-zagotovki-pod-flantcy-gotovye-flantcy-raskatnye-koltca/2026-10-20/flantcy-v-sbore-s-prokladkami" rel="alternate"/>
    <summary type="html">&lt;img src="https://irontub.ru/ssl/u/pic/af/c58914cc8711f184cde16e4f7dbcf1/-/originalnaja-proverk.jpg" style="float: left;" /&gt; 
&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.0"&gt;

&lt;title&gt;Фланцы в сборе с прокладками, фланцевые поковки, заготовки под фланцы&lt;/title&gt;

&lt;meta name="description" content="Производство фланцев всех типов: фланцы в сборе с прокладками, фланцевые поковки, заготовки под фланцы, готовые фланцы, раскатные кольца, нестандартные фланцы по чертежам. Арсенал-Деталь, Екатеринбург. 8 (902) 873-36-90."&gt;

&lt;meta name="keywords" content="фланцы в сборе с прокладками, фланцевые поковки, заготовки под фланцы, готовые фланцы, раскатные кольца, производство фланцев всех типов, нестандартные фланцы по чертежам, фланец, фланцы, фланцевая поковка, заготовка под фланец, раскатное кольцо, производство фланцев, фланцы по чертежам, Арсенал-Деталь, Екатеринбург"&gt;

&lt;meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1"&gt;
&lt;meta name="author" content="ООО «Арсенал-Деталь»"&gt;
&lt;meta name="geo.region" content="RU"&gt;
&lt;meta name="geo.placename" content="Екатеринбург"&gt;
&lt;meta name="language" content="Russian"&gt;
&lt;link rel="canonical" href="https://arsenal-detal.ru/flancy-pokovki" /&gt;

&lt;meta property="og:type" content="article"&gt;
&lt;meta property="og:site_name" content="ООО «Арсенал-Деталь»"&gt;
&lt;meta property="og:title" content="Фланцы в сборе с прокладками, фланцевые поковки, заготовки под фланцы"&gt;
&lt;meta property="og:description" content="Производство фланцев всех типов: в сборе с прокладками, поковки, заготовки, готовые, раскатные кольца, нестандартные по чертежам."&gt;
&lt;meta property="og:url" content="https://arsenal-detal.ru/flancy-pokovki"&gt;
&lt;meta property="og:locale" content="ru_RU"&gt;

&lt;meta name="twitter:card" content="summary_large_image"&gt;
&lt;meta name="twitter:title" content="Фланцы в сборе с прокладками, фланцевые поковки"&gt;
&lt;meta name="twitter:description" content="Производство фланцев всех типов. Арсенал-Деталь."&gt;

&lt;script type="application/ld+json"&gt;
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "ООО «Арсенал-Деталь»",
  "url": "https://arsenal-detal.ru",
  "telephone": "+79028733690",
  "email": "arsenal-detal@list.ru",
  "taxID": "6670215323",
  "vatID": "667001001",
  "identifier": "1086670018445",
  "description": "Производство фланцев всех типов: фланцы в сборе с прокладками, фланцевые поковки, заготовки под фланцы, готовые фланцы, раскатные кольца, нестандартные фланцы по чертежам.",
  "address": {
    "@type": "PostalAddress",
    "addressCountry": "RU",
    "addressLocality": "Екатеринбург",
    "addressRegion": "Свердловская область"
  },
  "contactPoint": {
    "@type": "ContactPoint",
    "telephone": "+79028733690",
    "contactType": "sales",
    "availableLanguage": "Russian"
  }
}
&lt;/script&gt;

&lt;script type="application/ld+json"&gt;
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "Фланцы в сборе с прокладками, фланцевые поковки, заготовки под фланцы",
  "description": "Производство фланцев всех типов: фланцы в сборе с прокладками, фланцевые поковки, заготовки под фланцы, готовые фланцы, раскатные кольца, нестандартные фланцы по чертежам.",
  "author": {
    "@type": "Organization",
    "name": "ООО «Арсенал-Деталь»"
  },
  "publisher": {
    "@type": "Organization",
    "name": "ООО «Арсенал-Деталь»",
    "address": {
      "@type": "PostalAddress",
      "addressLocality": "Екатеринбург"
    }
  },
  "datePublished": "2026-10-20",
  "articleSection": "Машиностроение, фланцы и поковки"
}
&lt;/script&gt;

&lt;script type="application/ld+json"&gt;
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Какие фланцы вы производите?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Фланцы в сборе с прокладками, фланцевые поковки, заготовки под фланцы, готовые фланцы, раскатные кольца, нестандартные фланцы по чертежам. Производство фланцев всех типов."
      }
    },
    {
      "@type": "Question",
      "name": "Изготавливаете ли вы нестандартные фланцы?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Да, мы изготавливаем нестандартные фланцы и поковки по чертежам и образцам заказчика."
      }
    },
    {
      "@type": "Question",
      "name": "Что такое раскатные кольца?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Раскатные кольца — это кольцевые заготовки, полученные методом раскатки. Применяются для изготовления фланцев, бандажей и других кольцевых деталей."
      }
    },
    {
      "@type": "Question",
      "name": "Кто производит фланцы и фланцевые поковки?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Фланцы и фланцевые поковки производит ООО «Арсенал-Деталь», г. Екатеринбург."
      }
    }
  ]
}
&lt;/script&gt;

&lt;script type="application/ld+json"&gt;
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {"@type":"ListItem","position":1,"name":"Главная","item":"https://arsenal-detal.ru"},
    {"@type":"ListItem","position":2,"name":"Фланцы и поковки","item":"https://arsenal-detal.ru/flancy-pokovki"}
  ]
}
&lt;/script&gt;

&lt;style&gt;
  :root{
    --bg:    #0a0a0a;
    --bg2:   #111111;
    --bg3:   #16130a;
    --line:  #d4af37;
    --gold:  #d4af37;
    --goldB: #f0d060;
    --goldD: #8a7020;
    --hot:   #ff5b3d;
    --ok:    #7dff7d;
    --green: #3aa03a;
    --nii:   #7b3fb5;
    --nii2:  #a86be0;
    --orange:#ff8c00;
  }
  *{box-sizing:border-box;margin:0;padding:0}
  html{scroll-behavior:smooth}
  body{
    font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;
    background:var(--bg);
    color:var(--gold);
    line-height:1.6;
    padding:20px 14px 80px;
    -webkit-font-smoothing:antialiased;
  }
  ::selection{background:var(--gold);color:#000}
  .wrap{max-width:960px;margin:0 auto}

  /* ===== СКРЫТЫЙ SEO-БЛОК ===== */
  .seo-hidden{
    position:absolute !important;
    width:1px !important;
    height:1px !important;
    padding:0 !important;
    margin:-1px !important;
    overflow:hidden !important;
    clip:rect(0,0,0,0) !important;
    white-space:nowrap !important;
    border:0 !important;
    color:transparent !important;
    pointer-events:none !important;
  }

  /* ===== HEADER ===== */
  .header{
    background:radial-gradient(120% 120% at 20% 0%,rgba(212,175,55,.25),transparent 55%),
               linear-gradient(135deg,#1a1408,#0a0a0a);
    border:2px solid var(--gold);
    border-radius:14px;
    padding:32px 24px;
    text-align:center;
    margin-bottom:16px;
    box-shadow:0 0 40px rgba(212,175,55,.25),0 6px 22px rgba(0,0,0,.6);
  }
  .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;
    box-shadow:0 0 16px rgba(212,175,55,.7);
  }
  .header h1{
    margin:0 0 12px 0;
    font-size:clamp(1.2rem,3vw,1.75rem);
    color:var(--gold);
    text-transform:uppercase;
    letter-spacing:1.5px;
    font-weight:900;
    line-height:1.35;
    text-shadow:0 0 10px rgba(212,175,55,.95),0 0 25px rgba(240,208,96,.8);
  }
  .line{
    width:80px;height:3px;
    background:var(--gold);
    margin:0 auto 14px;
    border-radius:2px;
    box-shadow:0 0 15px var(--gold);
  }
  .header p{
    color:var(--goldB);
    font-size:15px;
    letter-spacing:.5px;
    opacity:.95;
    margin-bottom:12px;
  }
  .company-info{
    background:rgba(212,175,55,.05);
    border:1px solid rgba(212,175,55,.35);
    border-radius:8px;
    padding:12px;
    font-size:12px;
    color:var(--goldB);
    margin-top:12px;
  }
  .company-info b{color:var(--gold)}

  /* ===== СТАТЬЯ ===== */
  .article-block{
    background:linear-gradient(135deg,rgba(212,175,55,.06),rgba(10,10,10,.95));
    border:2px solid var(--gold);
    border-radius:14px;
    padding:28px 30px;
    margin-bottom:20px;
    box-shadow:0 0 25px rgba(212,175,55,.18);
    color:var(--gold);
  }
  .article-block h2{
    font-size:clamp(1.05rem,2vw,1.35rem);
    color:var(--goldB);
    text-transform:uppercase;
    letter-spacing:1.3px;
    margin:28px 0 16px 0;
    padding:14px 18px;
    border-left:4px solid var(--gold);
    border-radius:0 10px 10px 0;
    display:flex;
    align-items:center;
    gap:12px;
    font-weight:900;
    line-height:1.4;
    background:linear-gradient(90deg,
      rgba(212,175,55,.18) 0%,
      rgba(240,208,96,.35) 25%,
      rgba(212,175,55,.18) 50%,
      rgba(240,208,96,.35) 75%,
      rgba(212,175,55,.18) 100%);
    background-size:200% 100%;
    animation:headerShine 6s linear infinite;
    text-shadow:0 0 10px rgba(212,175,55,.6);
  }
  .article-block h2:first-child{margin-top:0}
  @keyframes headerShine{
    0%{background-position:200% 0}
    100%{background-position:-200% 0}
  }
  .article-block h2::before{
    content:'◆';
    color:var(--goldB);
    font-size:.75rem;
    flex-shrink:0;
  }
  .article-block h3{
    font-size:1.02rem;
    color:var(--goldB);
    margin-top:1.4em;
    margin-bottom:.6em;
    font-weight:800;
    letter-spacing:.5px;
    padding-left:16px;
    position:relative;
  }
  .article-block h3::before{
    content:'▸';
    position:absolute;
    left:0;
    color:var(--gold);
  }
  .article-block p{
    color:var(--gold);
    font-size:.98rem;
    line-height:1.8;
    margin:0 0 1em 0;
  }
  .article-block p b,
  .article-block p strong{color:var(--goldB);font-weight:800}
  .article-block ul{
    list-style:none;
    padding:0;
    margin:0 0 1.2em 0;
  }
  .article-block ul li{
    color:var(--gold);
    font-size:.95rem;
    line-height:1.7;
    padding:8px 0 8px 24px;
    position:relative;
  }
  .article-block ul li::before{
    content:"◆";
    position:absolute;
    left:0;
    top:8px;
    color:var(--goldB);
    font-size:10px;
  }
  .article-block ul li b,
  .article-block ul li strong{color:var(--goldB);font-weight:800}

  .article-block hr{
    border:none;
    border-top:1px dashed rgba(212,175,55,.5);
    margin:24px 0;
  }

  .article-cta{
    display:inline-block;
    margin-top:16px;
    background:linear-gradient(135deg,#d4af37,#ff8c00);
    color:#0a0a0a;
    text-decoration:none;
    padding:14px 32px;
    border-radius:999px;
    font-size:15px;
    font-weight:900;
    letter-spacing:1px;
    text-transform:uppercase;
    transition:.2s;
    box-shadow:0 0 20px rgba(212,175,55,.5);
  }
  .article-cta:hover{
    transform:scale(1.03);
    box-shadow:0 0 30px rgba(212,175,55,.8);
  }

  /* ===== CTA низ ===== */
  .cta{
    margin-top:20px;
    padding:36px 32px;
    background:linear-gradient(135deg,rgba(212,175,55,.10),#0a0a0a);
    border:2px solid var(--gold);
    border-radius:14px;
    text-align:center;
    box-shadow:0 0 40px rgba(212,175,55,.25);
  }
  .cta-text{
    font-size:1.1rem;
    color:var(--goldB);
    font-weight:700;
    margin-bottom:22px;
    line-height:1.6;
    text-shadow:0 0 10px rgba(212,175,55,.5);
  }
  .cta-btn{
    display:inline-flex;
    align-items:center;
    gap:8px;
    padding:14px 28px;
    border-radius:999px;
    font-weight:800;
    font-size:.95rem;
    border:2px solid var(--gold);
    cursor:pointer;
    transition:.2s;
    text-decoration:none;
    letter-spacing:.5px;
    text-transform:uppercase;
    background:linear-gradient(135deg,#d4af37,#ff8c00);
    color:#0a0a0a;
    animation:btnHotPulse 2.5s ease-in-out infinite;
    margin:0 6px;
  }
  @keyframes btnHotPulse{
    0%,100%{box-shadow:0 0 25px rgba(212,175,55,.6);transform:scale(1)}
    50%{box-shadow:0 0 40px rgba(212,175,55,.9),0 0 60px rgba(255,140,0,.5);transform:scale(1.02)}
  }
  .cta-btn:hover{
    transform:scale(1.06);
    box-shadow:0 0 40px rgba(212,175,55,1),0 0 70px rgba(255,140,0,.7);
    text-decoration:none;
  }
  .cta-mail{
    display:inline-flex;
    align-items:center;
    gap:8px;
    padding:14px 28px;
    border-radius:999px;
    font-weight:800;
    font-size:.95rem;
    border:2px solid var(--gold);
    color:var(--goldB);
    background:transparent;
    text-decoration:none;
    transition:.2s;
    letter-spacing:.5px;
    text-transform:uppercase;
    margin:0 6px;
  }
  .cta-mail:hover{background:var(--gold);color:#0a0a0a;text-decoration:none}
  .manager{
    margin-top:20px;
    font-size:13px;
    color:var(--goldD);
  }

  /* ===== SCROLLBAR ===== */
  .wrap ::-webkit-scrollbar{width:14px;height:14px;}
  .wrap ::-webkit-scrollbar-track{background:#050505;border:1px solid #2a2210;border-radius:9px;}
  .wrap ::-webkit-scrollbar-thumb{
    background:linear-gradient(180deg,#f0d060,#d4af37,#ff8c00);
    border-radius:9px;
    border:1px solid #d4af37;
    box-shadow:0 0 10px rgba(212,175,55,.9);
  }

  @media(max-width:700px){
    body{padding:12px 10px 60px}
    .header h1{font-size:1.15rem;letter-spacing:1px}
    .article-block{padding:22px 20px}
    .article-block h2{padding:12px 14px;font-size:1rem;letter-spacing:1px}
    .cta{padding:28px 22px}
  }

  @media (prefers-reduced-motion: reduce){
    *,*::before,*::after{
      animation-duration:.01ms !important;
      animation-iteration-count:1 !important;
      transition-duration:.01ms !important;
    }
  }

  @media print{
    body{background:#000 !important;color:#d4af37 !important;padding:0;}
    .header{background:#000 !important;color:#d4af37 !important;-webkit-print-color-adjust:exact;print-color-adjust:exact;}
    .header h1{color:#d4af37 !important;animation:none !important;text-shadow:none !important;}
    .tag{background:#d4af37 !important;color:#000 !important;}
    .line{background:#d4af37 !important;}
    .article-block,.cta{background:#000 !important;border-color:#d4af37 !important;box-shadow:none !important;}
    .article-block h2,.article-block h3,.article-block p,.article-block ul li{color:#d4af37 !important;}
    .cta-text{color:#d4af37 !important;}
    .article-cta,.cta-btn,.cta-mail{display:none !important;}
  }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="wrap"&gt;

  &lt;div class="seo-hidden" aria-hidden="true"&gt;
    Фланцы в сборе с прокладками, фланцевые поковки, заготовки под фланцы, готовые фланцы,
    раскатные кольца, производство фланцев всех типов, нестандартные фланцы по чертежам,
    фланец, фланцы, фланцевая поковка, заготовка под фланец, раскатное кольцо,
    производство фланцев, фланцы по чертежам, Арсенал-Деталь, Екатеринбург.
  &lt;/div&gt;

  &lt;header class="header"&gt;
    &lt;div class="tag"&gt;ФЛАНЦЫ В СБОРЕ · ФЛАНЦЕВЫЕ ПОКОВКИ · ЗАГОТОВКИ · РАСКАТНЫЕ КОЛЬЦА&lt;/div&gt;
    &lt;h1&gt;Фланцы и фланцевые поковки&lt;/h1&gt;
    &lt;div class="line"&gt;&lt;/div&gt;
    &lt;p&gt;Фланцы в сборе с прокладками · Заготовки под фланцы · Готовые фланцы · Раскатные кольца · Нестандартные по чертежам&lt;/p&gt;
    &lt;div class="company-info"&gt;
      &lt;b&gt;ООО «Арсенал-Деталь»&lt;/b&gt; · ИНН 6670215323 / КПП 667001001 / ОГРН 1086670018445&lt;br /&gt;
      Телефон: &lt;b&gt;8 (902) 873-36-90&lt;/b&gt; · E-mail: &lt;b&gt;arsenal-detal@list.ru&lt;/b&gt;
    &lt;/div&gt;
  &lt;/header&gt;

  &lt;article class="article-block"&gt;

    &lt;h2&gt;Производство фланцев всех типов&lt;/h2&gt;
    &lt;p&gt;
      Мы производим &lt;b&gt;фланцы всех типов&lt;/b&gt;: &lt;b&gt;фланцы в сборе с прокладками&lt;/b&gt;, &lt;b&gt;фланцевые поковки&lt;/b&gt;, &lt;b&gt;заготовки под фланцы&lt;/b&gt;, &lt;b&gt;готовые фланцы&lt;/b&gt;, &lt;b&gt;раскатные кольца&lt;/b&gt;, &lt;b&gt;нестандартные фланцы по чертежам&lt;/b&gt;.
    &lt;/p&gt;

    &lt;h3&gt;Что мы производим&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Фланцы в сборе с прокладками&lt;/b&gt;&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Фланцевые поковки&lt;/b&gt;&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Заготовки под фланцы&lt;/b&gt;&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Готовые фланцы&lt;/b&gt;&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Раскатные кольца&lt;/b&gt;&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Нестандартные фланцы по чертежам&lt;/b&gt;&lt;/li&gt;
    &lt;/ul&gt;

    &lt;h3&gt;Применение&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;Трубопроводы и арматура&lt;/li&gt;
      &lt;li&gt;Ёмкостное и теплообменное оборудование&lt;/li&gt;
      &lt;li&gt;Машиностроение и металлургия&lt;/li&gt;
    &lt;/ul&gt;

    &lt;hr /&gt;

    &lt;h2&gt;Как заказать&lt;/h2&gt;
    &lt;p&gt;
      Пришлите чертёж или образец с указанием размеров, материала и требований к точности. Рассчитаем стоимость и сроки.
    &lt;/p&gt;
    &lt;p&gt;
      Работаем по всей России. Отгрузка от производителя.
    &lt;/p&gt;

    &lt;p style="margin-top:18px"&gt;
      &lt;a href="tel:+79028733690" class="article-cta"&gt;Запросить фланцы →&lt;/a&gt;
    &lt;/p&gt;

  &lt;/article&gt;

  &lt;section class="cta"&gt;
    &lt;p class="cta-text"&gt;
      Фланцы в сборе с прокладками · Фланцевые поковки · Заготовки под фланцы · Готовые фланцы · Раскатные кольца
    &lt;/p&gt;
    &lt;a href="tel:+79028733690" class="cta-btn"&gt;8 (902) 873-36-90&lt;/a&gt;
    &lt;a href="mailto:arsenal-detal@list.ru?subject=Запрос%20фланцев" class="cta-mail"&gt;✉ arsenal-detal@list.ru&lt;/a&gt;
    &lt;p class="manager"&gt;Менеджер: Ольга · ООО «Арсенал-Деталь», г. Екатеринбург&lt;/p&gt;
  &lt;/section&gt;

&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</summary>
    <link href="https://irontub.ru/ssl/u/aa/1e70b6cc8711f1b34a8668cd519191/-/originalnaja-proverk.jpg" length="297089" rel="enclosure" type="image/jpeg"/>
  </entry>
  <entry>
    <id>urn:tag:irontub.ru,46492236:46492238</id>
    <title>Поковки, заготовки под фланцы, готовые фланцы, раскатные кольца</title>
    <published>2026-10-20T12:33:55Z</published>
    <updated>2026-10-20T13:04:04Z</updated>
    <link href="https://irontub.ru/pokovki-zagotovki-pod-flantcy-gotovye-flantcy-raskatnye-koltca/2026-10-20/pokovki-zagotovki-pod-flantcy-gotovye-flantcy-raskatnye-koltca" rel="alternate"/>
    <summary type="html">&lt;img src="https://irontub.ru/ssl/u/pic/4f/adcd76cc8611f1ac4d91e57f9d54b7/-/%D0%9D%D0%B5%D1%80%D0%B6%D0%B0%D0%B2%D0%B5%D1%8E%D1%89%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BA%D0%BE%D0%B2%D0%BA%D0%B0_end.webp" style="float: left;" /&gt; &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.0"&gt;
&lt;title&gt;Поковки, заготовки под фланцы, готовые фланцы, раскатные кольца — каталог · Арсенал-Деталь&lt;/title&gt;
&lt;meta name="description" content="Каталог: поковки диски Ø200–2500 мм (ГОСТ 8479-70), заготовки под фланцы Ø200–2300, готовые фланцы ГОСТ 33259-2015 DN15–DN2400, раскатные кольца Ø400–2500. Стали 09Г2С, 20, 15Х5М, 13ХФА, 12Х18Н10Т, 10Х17Н13М2Т. Скидка от 50 000 ₽. Екатеринбург."&gt;
&lt;meta name="keywords" content="поковки стальные купить, поковка диска ГОСТ 8479-70, поковка 09Г2С, поковка 12Х18Н10Т, поковка 15Х5М, поковка 13ХФА, поковка ст.20, поковка 20Х, поковка 40Х, поковка 20ГЛ, поковка 40ХЛ, поковка Ø500, поковка Ø1000, поковка Ø2000, поковка Ø2500, заготовка под фланец купить, фланцевая заготовка 09Г2С, заготовка фланца ГОСТ 33259, заготовка фланца DN100, заготовка фланца DN500, заготовка под фланец 12Х18Н10Т, фланец плоский тип 01, фланец приварной встык тип 11, фланец ГОСТ 33259-2015 купить, фланец DN15, фланец DN50, фланец DN100, фланец DN200, фланец DN500, фланец DN1000, фланец DN2400, фланец PN16, фланец PN25, фланец PN40, фланец 09Г2С, фланец 12Х18Н10Т, фланец ст.20, фланец 15Х5М, фланец 13ХФА, фланец ASME B16.5, фланец ASME B16.47, фланец DIN EN 1092-1, кольцо раскатное купить, раскатное кольцо 09Г2С, раскатное кольцо 12Х18Н10Т, раскатное кольцо Ø1000, раскатное кольцо Ø2000, кольцо под фланец, поковка кольца, металлопрокат Екатеринбург, поковки Екатеринбург, фланцы Екатеринбург, кольца Екатеринбург, Арсенал-Деталь, металлообработка, токарная обработка, мехобработка фланцев, изготовление фланцев по чертежу, поковка по чертежу, кольцо по чертежу, скидка от 50 000, НДС 22, доставка по России, Белоруссия, Казахстан"&gt;
&lt;meta property="og:title" content="Поковки, заготовки, фланцы, раскатные кольца — каталог размеров"&gt;
&lt;meta property="og:description" content="Поковки Ø200–2500 ГОСТ 8479-70, заготовки под фланцы, фланцы ГОСТ 33259-2015, раскатные кольца до Ø2500. Скидка от 50 000 ₽."&gt;
&lt;meta property="og:type" content="website"&gt;
&lt;meta property="og:locale" content="ru_RU"&gt;
&lt;link rel="canonical" href="https://arsenal-detal.ru/catalog/" /&gt;
&lt;script type="application/ld+json"&gt;
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "ООО «Арсенал Деталь»",
  "telephone": "+79028733690",
  "email": "arsenal-detal@list.ru",
  "address": {"@type":"PostalAddress","addressLocality":"Екатеринбург","addressCountry":"RU"},
  "description": "Поковки стальные, заготовки под фланцы, готовые фланцы, раскатные кольца."
}
&lt;/script&gt;
&lt;script type="application/ld+json"&gt;
{
  "@context": "https://schema.org",
  "@type": "CollectionPage",
  "name": "Поковки, заготовки под фланцы, готовые фланцы, раскатные кольца",
  "description": "Поковки диски Ø200–2500 ГОСТ 8479-70. Заготовки под фланцы. Фланцы ГОСТ 33259-2015 DN15–DN2400. Раскатные кольца Ø400–2500.",
  "url": "https://arsenal-detal.ru/catalog/",
  "about": [
    {"@type":"Product","name":"Поковка стальная диск","category":"Поковки","material":["09Г2С","20","15Х5М","13ХФА","12Х18Н10Т"]},
    {"@type":"Product","name":"Заготовка под фланец","category":"Заготовки","material":["09Г2С","20","15Х5М","13ХФА","12Х18Н10Т"]},
    {"@type":"Product","name":"Фланец ГОСТ 33259-2015 тип 01","category":"Фланцы","material":["09Г2С","20","12Х18Н10Т"]},
    {"@type":"Product","name":"Фланец ГОСТ 33259-2015 тип 11","category":"Фланцы","material":["09Г2С","20","12Х18Н10Т"]},
    {"@type":"Product","name":"Кольцо раскатное","category":"Раскатные кольца","material":["09Г2С","20","15Х5М","12Х18Н10Т"]}
  ]
}
&lt;/script&gt;
&lt;style&gt;
  :root{--gold:#FFD700;--gold-light:#FFE55C;--bg:#0a0a0a;--muted:#9a8040;--border:rgba(212,175,55,.35);--accent:#FF8C00;--ok:#7dff7d;--bad:#ff9a9a;--green:#7dff7d;--green-dark:#3aa03a;}
  *{box-sizing:border-box;margin:0;padding:0}
  body{background:#050505;color:#e8e8e8;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;padding:20px 14px 160px;line-height:1.5;}
  .wrap{max-width:1600px;margin:0 auto}
  .banner{max-width:640px;margin:0 auto 14px;background:radial-gradient(120% 120% at 20% 0%,rgba(255,215,0,.18),transparent 55%),linear-gradient(135deg,#111,#0a0a0a);border:1px solid var(--gold);border-radius:14px;padding:24px;text-align:center;box-shadow:0 6px 22px rgba(0,0,0,.6);}
  .banner-tag{display:inline-block;background:var(--gold);color:#0a0a0a;font-size:10px;font-weight:800;letter-spacing:2px;padding:3px 12px;border-radius:999px;margin-bottom:12px;}
  .banner-title{font-weight:800;font-size:22px;line-height:1.15;color:#fff;margin-bottom:10px;}
  .banner-phone{font-size:18px;font-weight:800;color:var(--gold);margin-bottom:4px;}
  .banner-note{font-size:12px;color:var(--muted);}
  .ticker{display:flex;align-items:stretch;background:var(--bg);border:1px solid var(--gold);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-vp{flex:1;overflow:hidden;position:relative}
  .ticker-track{display:inline-flex;align-items:center;height:100%;white-space:nowrap;animation:tickerMove 60s linear infinite;padding-left:20px;}
  .ticker-item{color:var(--gold);font-size:13px;padding:0 10px}
  .ticker-item b{color:var(--gold-light);font-weight:700}
  .ticker-dot{color:var(--gold);font-size:10px}
  @keyframes tickerMove{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-item{display:flex;align-items:center;gap:12px;padding:14px 18px;background:linear-gradient(135deg,rgba(255,215,0,.1) 0%,rgba(10,15,30,.7) 100%);border:1px solid var(--border);border-radius:14px;text-decoration:none;transition:all .25s;}
  .ad-item:hover{border-color:var(--gold);box-shadow:0 0 20px rgba(255,215,0,.3);transform:translateY(-2px);}
  .ad-tag{background:var(--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-text{color:#e8f4ff;font-size:.9rem;font-weight:600;flex:1;}
  .ad-cta{color:var(--gold);font-size:.85rem;font-weight:800;letter-spacing:.5px;white-space:nowrap;}
  .header{background:radial-gradient(120% 120% at 20% 0%,rgba(255,215,0,.25),transparent 55%),linear-gradient(135deg,#1a1408,#0a0a0a);border:2px solid var(--gold);border-radius:14px;padding:32px 24px;text-align:center;margin-bottom:16px;box-shadow:0 0 40px rgba(255,215,0,.25),0 6px 22px rgba(0,0,0,.6);}
  .tag{display:inline-block;background:var(--gold);color:#0a0a0a;font-size:10px;font-weight:800;letter-spacing:2px;padding:4px 14px;border-radius:999px;margin-bottom:14px;box-shadow:0 0 16px rgba(255,215,0,.7);}
  .header h1{font-size:26px;font-weight:900;letter-spacing:2px;color:var(--gold);text-transform:uppercase;margin-bottom:12px;text-shadow:0 0 10px rgba(255,215,0,.95),0 0 25px rgba(255,199,0,.8);animation:goldPulse 3s ease-in-out infinite;}
  @keyframes goldPulse{0%,100%{text-shadow:0 0 10px rgba(255,215,0,.95),0 0 25px rgba(255,199,0,.8);}50%{text-shadow:0 0 15px rgba(255,215,0,1),0 0 35px rgba(255,199,0,.95);}}
  .line{width:80px;height:3px;background:var(--gold);margin:0 auto 14px;border-radius:2px;box-shadow:0 0 15px var(--gold);}
  .header p{color:var(--gold-light);font-size:14px;opacity:.95;}
  .tabs{display:flex;gap:8px;margin-bottom:16px;flex-wrap:wrap;}
  .tab{display:inline-flex;align-items:center;gap:8px;padding:10px 18px;border-radius:10px;border:2px solid var(--gold);background:var(--bg);color:var(--gold);font-size:13px;font-weight:800;cursor:pointer;transition:.2s;font-family:inherit;letter-spacing:.3px;}
  .tab:hover{background:rgba(255,215,0,.12);}
  .tab.active{background:linear-gradient(135deg,#FFD700,#FF8C00);color:#0a0a0a;border-color:#FFD700;box-shadow:0 0 20px rgba(255,215,0,.5);}
  .tab .cnt{background:rgba(0,0,0,.25);color:inherit;font-size:10px;font-weight:800;padding:2px 7px;border-radius:999px;}
  .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);}
  .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;}
  .cta-block{background:linear-gradient(135deg,rgba(255,215,0,.15),rgba(10,10,10,.9));border:3px solid var(--gold);border-radius:16px;padding:24px 20px;margin-bottom:16px;text-align:center;box-shadow:0 0 40px rgba(255,215,0,.3);position:relative;}
  .cta-block::before{content:'★';position:absolute;top:-18px;left:50%;transform:translateX(-50%);background:#0a0a0a;color:var(--gold);padding:0 18px;font-size:26px;text-shadow:0 0 20px rgba(255,215,0,1);}
  .cta-block h2{color:var(--gold);font-size:20px;font-weight:900;letter-spacing:2px;text-transform:uppercase;margin-bottom:10px;text-shadow:0 0 15px rgba(255,215,0,.7);}
  .cta-block p{color:var(--gold-light);font-size:15px;margin-bottom:16px;line-height:1.6;}
  .cta-block p b{color:#fff;}
  .cta-counter{display:inline-block;background:#0a0a0a;border:2px solid var(--gold);border-radius:999px;padding:10px 24px;color:var(--gold);font-size:16px;font-weight:900;letter-spacing:1px;margin-bottom:14px;}
  .cta-counter b{color:#fff;font-size:22px;}
  .cta-buttons{display:flex;gap:12px;justify-content:center;flex-wrap:wrap;margin-top:14px;}
  .btn-big{display:inline-flex;align-items:center;gap:10px;padding:14px 28px;border-radius:999px;border:2px solid var(--gold);background:transparent;color:var(--gold);font-size:15px;font-weight:900;cursor:pointer;transition:.2s;font-family:inherit;letter-spacing:1px;text-transform:uppercase;}
  .btn-big:hover{background:var(--gold);color:#0a0a0a;transform:scale(1.03);}
  .btn-big.primary{background:linear-gradient(135deg,#FFD700,#FF8C00);color:#0a0a0a;border-color:#FFD700;box-shadow:0 0 25px rgba(255,215,0,.6);}
  .stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px;}
  @media(max-width:800px){.stats{grid-template-columns:repeat(2,1fr);}}
  .stat{background:var(--bg);border:1px solid var(--gold);border-radius:12px;padding:16px;text-align:center;}
  .lbl{font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:var(--gold);opacity:.7;margin-bottom:6px;}
  .val{font-size:22px;font-weight:800;color:var(--gold-light);line-height:1.1;}
  .val.sm{font-size:16px;}
  .toolbar{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px;}
  .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;}
  .btn:hover{background:var(--gold);color:#0a0a0a;}
  .filter{background:var(--bg);border:1px solid var(--gold);border-radius:14px;padding:16px;margin-bottom:16px;}
  .filter-row{display:grid;grid-template-columns:2fr 1fr;gap:12px;margin-bottom:12px;}
  @media(max-width:700px){.filter-row{grid-template-columns:1fr;}}
  .filter-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;}
  @media(max-width:1000px){.filter-grid{grid-template-columns:repeat(3,1fr);}}
  @media(max-width:700px){.filter-grid{grid-template-columns:1fr 1fr;}}
  .fld{display:flex;flex-direction:column;gap:5px;}
  .fld label{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:var(--gold);opacity:.85;}
  .fld input,.fld select{padding:10px 12px;border:1px solid var(--gold);border-radius:9px;font-size:13px;background:var(--bg);color:var(--gold-light);outline:none;font-family:inherit;width:100%;}
  .fld input::placeholder{color:rgba(212,175,55,.35);}
  .search{width:100%;padding:13px 16px;border:2px solid var(--gold);border-radius:9px;font-size:14px;background:var(--bg);color:var(--gold-light);outline:none;font-family:inherit;font-weight:600;}
  .search::placeholder{color:rgba(212,175,55,.4);}
  .counter{color:var(--gold);font-size:14px;white-space:nowrap;padding:13px 18px;border:1px solid var(--gold);border-radius:9px;background:var(--bg);font-weight:800;display:flex;align-items:center;justify-content:center;}
  .filter-actions{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap;}
  .search-help{font-size:11px;color:var(--muted);margin-top:8px;line-height:1.5;}
  .search-help b{color:var(--gold-light);}
  .global-badge{display:none;align-items:center;gap:8px;margin-bottom:12px;padding:10px 16px;border:1px dashed var(--gold);border-radius:10px;background:rgba(255,215,0,.06);font-size:13px;color:var(--gold-light);}
  .global-badge.show{display:flex;flex-wrap:wrap;}
  .global-badge b{color:var(--gold);}
  .global-badge .btn{margin-left:auto;}
  .table-block{background:var(--bg);border:1px solid var(--gold);border-radius:14px;padding:20px;margin-bottom:16px;position:relative;}
  .block-title{color:var(--gold);font-size:12px;font-weight:800;letter-spacing:2px;text-align:center;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid var(--border);text-transform:uppercase;text-shadow:0 0 12px rgba(255,215,0,.6);}
  .table-wrap{overflow:auto;max-height:65vh;border-radius:8px;border:1px solid var(--gold);}
  table{width:100%;table-layout:auto;border-collapse:collapse;background:var(--bg);font-size:13px;}
  th,td{padding:10px 9px;text-align:left;border-bottom:1px solid rgba(212,175,55,.2);vertical-align:middle;color:var(--gold);background:transparent;white-space:nowrap;}
  th{position:sticky;top:0;z-index:2;background:var(--bg);color:var(--gold);font-weight:800;text-transform:uppercase;font-size:10px;letter-spacing:1px;border-bottom:1px solid var(--gold);cursor:pointer;user-select:none;}
  th:hover{background:#1a1408;}
  th.sortable::after{content:' ⇅';opacity:.5;margin-left:4px;font-size:9px;}
  th.asc::after{content:' ▲';opacity:1;color:var(--gold-light);}
  th.desc::after{content:' ▼';opacity:1;color:var(--gold-light);}
  th.num,td.num{text-align:right;font-variant-numeric:tabular-nums;}
  th.col-num,td.col-num{width:38px;text-align:center;}
  th.col-star,td.col-star{width:44px;text-align:center;padding:8px 6px;}
  th.col-qty,td.col-qty{width:80px;text-align:center;padding:8px 6px;}
  th.col-star{position:sticky;top:0;background:linear-gradient(180deg,#1a1408,#0a0a0a) !important;}
  th.col-star::before{content:'▼';position:absolute;top:100%;left:50%;transform:translateX(-50%);color:var(--gold);font-size:20px;line-height:1;text-shadow:0 0 12px rgba(255,215,0,1);animation:arrowBounce 1s ease-in-out infinite;pointer-events:none;}
  @keyframes arrowBounce{0%,100%{transform:translateX(-50%) translateY(0);opacity:1;}50%{transform:translateX(-50%) translateY(6px);opacity:.7;}}
  .select-hint{position:absolute;top:-14px;left:0;background:linear-gradient(135deg,#FFD700,#FF8C00);color:#0a0a0a;font-size:11px;font-weight:900;letter-spacing:1.5px;padding:6px 18px;border-radius:999px;box-shadow:0 0 20px rgba(255,215,0,.7);text-transform:uppercase;z-index:5;white-space:nowrap;}
  tbody tr{transition:background .15s;}
  tbody tr:hover{background:#1a1408;box-shadow:inset 3px 0 0 var(--gold-light),inset -3px 0 0 var(--gold-light);}
  tbody tr.picked{background:linear-gradient(90deg,rgba(255,215,0,.15),rgba(255,215,0,.04));box-shadow:inset 4px 0 0 var(--gold);}
  tbody tr.discount-active{background:linear-gradient(90deg,rgba(125,255,125,.15),rgba(255,215,0,.04));box-shadow:inset 4px 0 0 var(--green);}
  td.price{font-weight:800;color:var(--gold-light);font-size:14px;}
  td.price.discount{color:var(--green);text-shadow:0 0 10px rgba(125,255,125,.5);}
  td.price.request{color:var(--muted);font-style:italic;font-weight:600;}
  td b{color:#fff;}
  td.col-qty input.qty{width:70px;padding:6px 8px;border:1px solid var(--border);border-radius:6px;background:#0a0a0a;color:var(--gold-light);font-size:14px;font-weight:800;text-align:center;font-family:inherit;outline:none;transition:.2s;}
  td.col-qty input.qty:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(255,215,0,.2);}
  td.col-qty input.qty:disabled{opacity:.25;cursor:not-allowed;}
  tbody tr.picked td.col-qty input.qty{border-color:var(--gold);color:var(--gold-light);box-shadow:0 0 8px rgba(255,215,0,.4);}
  .badge{display:inline-block;padding:2px 8px;border-radius:10px;font-size:10px;font-weight:800;text-transform:uppercase;background:rgba(212,175,55,.15);color:var(--gold-light);border:1px solid rgba(212,175,55,.5);white-space:nowrap;}
  .badge.many{background:rgba(57,255,20,.08);color:var(--ok);border-color:rgba(57,255,20,.3);}
  .badge.zero{background:rgba(255,107,107,.12);color:var(--bad);border-color:rgba(255,107,107,.4);}
  .star{cursor:pointer;font-size:22px;color:rgba(212,175,55,.35);transition:all .2s;user-select:none;text-align:center;display:inline-block;}
  .star:hover{color:var(--gold);transform:scale(1.3);}
  .star.on{color:var(--gold-light);text-shadow:0 0 12px var(--gold-light),0 0 24px rgba(255,215,0,.5);}
  .footnote{display:flex;flex-wrap:wrap;gap:20px;margin-top:14px;padding-top:12px;border-top:1px solid var(--gold);}
  .fn{color:var(--gold);font-size:12px;position:relative;padding-left:14px;opacity:.9;}
  .fn::before{content:"◆";position:absolute;left:0;color:var(--gold);font-size:8px;top:4px;}
  mark.hl{background:linear-gradient(135deg,#FFD700,#FF8C00);color:#0a0a0a;border-radius:3px;padding:0 2px;font-weight:800;}
  .steel-badges{display:inline-flex;flex-wrap:wrap;gap:3px;max-width:340px;}
  .steel-badge{display:inline-block;padding:2px 7px;border-radius:5px;background:linear-gradient(135deg,rgba(255,215,0,.18),rgba(255,140,0,.1));border:1px solid rgba(255,215,0,.5);color:var(--gold-light);font-size:10px;font-weight:800;letter-spacing:.2px;cursor:pointer;transition:.15s;}
  .steel-badge:hover{background:var(--gold);color:#0a0a0a;}
  .steel-badge.hot{background:linear-gradient(135deg,rgba(255,215,0,.4),rgba(255,140,0,.3));border-color:var(--gold);color:#fff;box-shadow:0 0 8px rgba(255,215,0,.55);animation:steelPulse 2.5s ease-in-out infinite;}
  .steel-badge.hot:hover{background:var(--gold);color:#0a0a0a;animation:none;}
  @keyframes steelPulse{0%,100%{box-shadow:0 0 8px rgba(255,215,0,.55);}50%{box-shadow:0 0 15px rgba(255,215,0,.9);}}
  .more-wrap{text-align:center;padding:16px 0 4px;}
  .btn-more{display:inline-flex;align-items:center;gap:8px;padding:12px 28px;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;}
  .btn-more:hover{background:var(--gold);color:#0a0a0a;}
  .btn-more b{color:#fff;}
  .pagination-info{color:var(--muted);font-size:12px;margin-top:6px;}
  .seo-hidden{position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);}
  .cta{text-align:center;background:var(--bg);border:1px solid var(--gold);border-radius:14px;padding:28px 20px;margin-top:16px;}
  .cta-text{font-size:16px;font-weight:600;color:var(--gold);margin-bottom:16px;}
  .cta-btn{display:inline-block;background:var(--gold);color:#0a0a0a;text-decoration:none;padding:16px 40px;font-size:20px;font-weight:800;letter-spacing:1px;border-radius:999px;transition:.25s;margin:0 6px;}
  .cta-btn:hover{background:var(--gold-light);transform:scale(1.03);}
  .cta-mail{display:inline-block;color:var(--gold);text-decoration:none;padding:16px 30px;font-size:16px;font-weight:700;border:1px solid var(--gold);border-radius:999px;transition:.25s;margin:0 6px;}
  .cta-mail:hover{background:var(--gold);color:#0a0a0a;}
  .manager{margin-top:16px;font-size:13px;color:var(--muted);}
  .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);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);}
  .sticky-inner{max-width:1600px;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(--gold-light);line-height:1;}
  .sticky-stat .val.big{font-size:24px;color:var(--gold);text-shadow:0 0 15px rgba(255,215,0,.7);}
  .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);}
  .sticky-actions{display:flex;gap:10px;flex-wrap:wrap;}
  .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;}
  .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-bar.discount-active .sticky-btn.primary{background:linear-gradient(135deg,#7dff7d,#3aa03a);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(--bad);}
  .sticky-btn.clear:hover{background:var(--bad);color:#0a0a0a;border-color:var(--bad);}
  @media(max-width:900px){.sticky-inner{flex-direction:column;gap:10px;}.sticky-info,.sticky-actions{justify-content:center;width:100%;}.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){body{padding-bottom:220px;}.sticky-stat{padding:2px 8px;}.sticky-stat .val{font-size:13px;}.sticky-stat .val.big{font-size:17px;}.sticky-stat .lbl{font-size:8px;}}
  .wrap ::-webkit-scrollbar{width:14px;height:14px;}
  .wrap ::-webkit-scrollbar-track{background:#050505;border:1px solid #2a2210;border-radius:9px;}
  .wrap ::-webkit-scrollbar-thumb{background:linear-gradient(180deg,#FFE55C,#FFD700,#FF8C00);border-radius:9px;border:1px solid #FFD700;}
  @media print{
    body{background:#fff;color:#000;padding:0;}
    .header,.tag,.line{color:#000 !important;background:#fff !important;box-shadow:none !important;text-shadow:none !important;animation:none !important;border-color:#666 !important;}
    .header h1{color:#000 !important;}
    .toolbar,.filter,.select-hint,th.col-star::before,.banner,.ticker,.ad-strip,.sticky-bar,.tabs,.global-badge,.more-wrap{display:none !important;}
    .stats,.table-block,.cta,.cta-block,.discount-banner,.cta-counter,.val{background:#fff !important;border-color:#666 !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important;}
    th{background:#000 !important;color:#FFD700 !important;-webkit-print-color-adjust:exact;print-color-adjust:exact;}
    td{color:#000 !important;border-color:#ccc !important;}
    .steel-badge{background:#fff !important;color:#000 !important;border-color:#666 !important;animation:none !important;box-shadow:none !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="wrap" id="app"&gt;&lt;/div&gt;


&lt;div class="seo-hidden" aria-hidden="true"&gt;
  &lt;h1&gt;Поковки стальные, заготовки под фланцы, готовые фланцы, раскатные кольца — каталог размеров и марок стали&lt;/h1&gt;
  &lt;h2&gt;Поковки диски ГОСТ 8479-70, ГОСТ 25054-81, ГОСТ 20072-74 — Ø200–2500 мм&lt;/h2&gt;
  &lt;p&gt;Поковки стальные диски: Ø200, Ø205, Ø210, Ø215, Ø220, Ø225, Ø230, Ø235, Ø240, Ø245, Ø250, Ø255, Ø260, Ø265, Ø270, Ø275, Ø280, Ø285, Ø290, Ø295, Ø300 мм и далее каждые 5 мм до Ø500 мм, затем каждые 10 мм до Ø1000 мм, затем каждые 50 мм до Ø2500 мм. Высота 100, 250, 400 мм. Марки стали: 09Г2С, 20, 15Х5М, 13ХФА, 12Х18Н10Т, 10Х17Н13М2Т, ст.20, 16ГС, 08Х13, 08Х18Н10Т.&lt;/p&gt;
  &lt;h2&gt;Заготовки под фланцы Ø200–2300 мм — ГОСТ 33259-2015, ГОСТ 28759-90&lt;/h2&gt;
  &lt;p&gt;Заготовки фланцев под механическую обработку с припуском 3–5 мм на сторону. Наружный диаметр 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350 мм и далее до 2300 мм. Внутренний диаметр 60% от наружного. Высота 80, 120, 160, 200, 250 мм. Стали 09Г2С, 20, 15Х5М, 13ХФА, 12Х18Н10Т.&lt;/p&gt;
  &lt;h2&gt;Фланцы готовые ГОСТ 33259-2015 тип 01 и тип 11 — DN15–DN2400, PN0,6–PN4,0&lt;/h2&gt;
  &lt;p&gt;Фланцы стальные плоские приварные тип 01: DN15, DN20, DN25, DN32, DN40, DN50, DN65, DN80, DN100, DN125, DN150, DN200, DN250, DN300, DN350, DN400, DN500, DN600, DN700, DN800, DN900, DN1000, DN1200, DN1400, DN1600, DN1800, DN2000, DN2200, DN2400. Давление PN0,6; 1,0; 1,6; 2,5; 4,0 МПа. Фланцы приварные встык тип 11 по ГОСТ 33259-2015, ГОСТ 28759.2-90, ГОСТ 28759.3-90, ГОСТ 28759.4-90, ASME B16.5, ASME B16.47, DIN EN 1092-1. Марки стали: ст.20, 09Г2С, 15Х5М, 13ХФА, 12Х18Н10Т, A105, A182GrF5, A350GrLF2, A182GrF304, A182GrF316L, P245GH, 16Mo3, 14404.&lt;/p&gt;
  &lt;h2&gt;Раскатные кольца и кольцевые заготовки Ø400–2500 мм&lt;/h2&gt;
  &lt;p&gt;Раскатные кольца, кольцевые заготовки, поковки колец. Наружный диаметр 400, 420, 440, 460, 480, 500, 520, 540, 560, 580, 600, 650, 700, 750, 800, 850, 900, 950, 1000, 1050, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500 мм. Внутренний диаметр 85% от наружного. Высота 80, 120, 160, 200, 250, 300, 350, 400 мм. Стали 20, 09Г2С, 13ХФА, 15Х5М, 12Х18Н10Т, 10Х17Н13М2Т.&lt;/p&gt;
  &lt;h2&gt;Ключевые запросы&lt;/h2&gt;
  &lt;p&gt;поковки стальные купить, поковка диска ГОСТ 8479-70, поковка 09Г2С, поковка 12Х18Н10Т, поковка 15Х5М, поковка 13ХФА, поковка ст.20, поковка 20Х, поковка 40Х, поковка 20ГЛ, поковка 40ХЛ, поковка Ø500, поковка Ø1000, поковка Ø2000, поковка Ø2500, заготовка под фланец купить, фланцевая заготовка 09Г2С, заготовка фланца ГОСТ 33259, заготовка фланца DN100, заготовка фланца DN500, заготовка под фланец 12Х18Н10Т, фланец плоский тип 01, фланец приварной встык тип 11, фланец ГОСТ 33259-2015 купить, фланец DN15, фланец DN50, фланец DN100, фланец DN200, фланец DN500, фланец DN1000, фланец DN2400, фланец PN16, фланец PN25, фланец PN40, фланец 09Г2С, фланец 12Х18Н10Т, фланец ст.20, фланец 15Х5М, фланец 13ХФА, фланец ASME B16.5, фланец ASME B16.47, фланец DIN EN 1092-1, кольцо раскатное купить, раскатное кольцо 09Г2С, раскатное кольцо 12Х18Н10Т, раскатное кольцо Ø1000, раскатное кольцо Ø2000, кольцо под фланец, поковка кольца, металлопрокат Екатеринбург, поковки Екатеринбург, фланцы Екатеринбург, кольца Екатеринбург, Арсенал-Деталь, металлообработка, токарная обработка, мехобработка фланцев, изготовление фланцев по чертежу, поковка по чертежу, кольцо по чертежу, скидка от 50 000, НДС 22, доставка по России, Белоруссия, Казахстан.&lt;/p&gt;
  &lt;p&gt;ООО «Арсенал Деталь», Екатеринбург. Скидка 10% от 50 000 ₽. Изготовление по чертежам заказчика. Доставка по России, Белоруссии, Казахстану.&lt;/p&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="barCount"&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="barQty"&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="barBase"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
      &lt;div class="sticky-stat"&gt;&lt;div class="lbl" id="barDiscountLabel"&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;Итого с НДС 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="downloadRequest()"&gt;⬇ Скачать запрос КП&lt;/button&gt;
      &lt;button class="sticky-btn" onclick="sendByEmail()"&gt;✉ На e-mail&lt;/button&gt;
      &lt;button class="sticky-btn clear" onclick="clearPicked()"&gt;✕ Очистить&lt;/button&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
/* ==================== ГЕНЕРАЦИЯ ДАННЫХ ==================== */
function wDisk(D1,D2,H){
  var r1=D1/2000,r2=(D2||0)/2000,h=H/1000;
  return Math.max(1,Math.round(Math.PI*(r1*r1-r2*r2)*h*7850));
}

var STEEL_COMMON = '09Г2С, 20, 15Х5М, 13ХФА, 12Х18Н10Т';
var STEEL_RING   = '20, 09Г2С, 13ХФА, 15Х5М, 12Х18Н10Т, 10Х17Н13М2Т';
var STEEL_FLANGE = 'ст.20, 09Г2С, 15Х5М, 13ХФА, 12Х18Н10Т';

function genPokovki(){
  var arr=[],n=0, hs=[100,250,400], ds=[];
  for(var d=200;d&lt;=500;d+=5)ds.push(d);
  for(var d=510;d&lt;=1000;d+=10)ds.push(d);
  for(var d=1050;d&lt;=2500;d+=50)ds.push(d);
  ds.forEach(function(D){ hs.forEach(function(H){ n++; arr.push({num:n,name:'Поковка Ø'+D+'×'+H,D_out:D,D_in:0,height:H,weight:wDisk(D,0,H),steel:STEEL_COMMON,std:'ГОСТ 8479-70',price:0,stock:0,term:'Под заказ'}); }); });
  return arr;
}

function genZagotovki(){
  var arr=[],n=0, hs=[80,120,160,200,250], ds=[];
  for(var d=200;d&lt;=500;d+=10)ds.push(d);
  for(var d=520;d&lt;=1000;d+=20)ds.push(d);
  for(var d=1050;d&lt;=2300;d+=50)ds.push(d);
  ds.forEach(function(D){ hs.forEach(function(H){ var Din=Math.round(D*0.6); n++; arr.push({num:n,name:'Заготовка Ø'+D+'/'+Din+'×'+H,D_out:D,D_in:Din,height:H,weight:wDisk(D,Din,H),steel:STEEL_COMMON,std:'ГОСТ 8479-70',price:0,stock:0,term:'Под заказ'}); }); });
  return arr;
}

function genFlanges(){
  var arr=[],n=0;
  var DN=[15,20,25,32,40,50,65,80,100,125,150,200,250,300,350,400,500,600,700,800,900,1000,1200,1400,1600,1800,2000,2200,2400];
  var PN=[0.6,1.0,1.6,2.5,4.0];
  var types=[['01','плоский','ГОСТ 33259-2015'],['11','приварной встык','ГОСТ 33259-2015']];
  DN.forEach(function(dn){ PN.forEach(function(pn){ types.forEach(function(t){
    var D_out=Math.round(dn*1.5+40), H=t[0]==='01'?Math.round(pn*6+14):Math.round(pn*10+20);
    n++;
    arr.push({num:n,name:'Фланец '+t[1]+' DN'+dn+' PN'+String(pn).replace('.',',')+' тип '+t[0],DN:dn,PN:pn,D_out:D_out,D_in:dn,height:H,weight:wDisk(D_out,dn,H),steel:STEEL_FLANGE,std:t[2],price:0,stock:0,term:'Под заказ'});
  });});});
  return arr;
}

function genKolca(){
  var arr=[],n=0, hs=[80,120,160,200,250,300,350,400], ds=[];
  for(var d=400;d&lt;=1000;d+=20)ds.push(d);
  for(var d=1050;d&lt;=2500;d+=50)ds.push(d);
  ds.forEach(function(D){ hs.forEach(function(H){ var Din=Math.round(D*0.85); n++; arr.push({num:n,name:'Кольцо раскатное Ø'+D+'/'+Din+'×'+H,D_out:D,D_in:Din,height:H,weight:wDisk(D,Din,H),steel:STEEL_RING,std:'ГОСТ 8479-70',price:0,stock:0,term:'Под заказ'}); }); });
  return arr;
}

/* ==================== ПРОЕКТ ==================== */
var PROJECT = {
  id: 'arsenal-metal',
  title: 'Металлопрокат: поковки, заготовки, фланцы, кольца',
  subtitle: 'Поковки · Заготовки под фланцы · Фланцы готовые · Раскатные кольца',
  vat: 22, discountThreshold: 50000, discountPercent: 10,

  banner: {tag:'РЕКЛАМНЫЕ ПЛОЩАДИ',title:'ЗДЕСЬ МОЖЕТ БЫТЬ&lt;br&gt;ВАША РЕКЛАМА',phone:'8 902 873-36-90 · МАКС',note:'Позвоните, а лучше пишите в МАКС'},
  ads: [
    {tag:'Акция', text:'Скидка от 50 000 ₽ · по всем разделам', cta:'Перейти →', href:'#'},
    {tag:'Завод', text:'Поковки · Фланцы · Кольца до Ø2500', cta:'Перейти →', href:'#'}
  ],

  sections: {},

  phone: '8 (902) 873-36-90', phoneHref: '+79028733690',
  email: 'arsenal-detal@list.ru',
  manager: 'Менеджер: Ольга · ООО «Арсенал Деталь»'
};

/* 4 раздела */
PROJECT.sections.pokovki = {
  label:'Поковки', icon:'⚒️',
  title:'Поковки стальные (диски)',
  subtitle:'ГОСТ 8479-70 · Ø200–2500 мм · H 100/250/400 мм',
  columns:[
    {key:'num',label:'№',type:'num',cls:'col-num'},
    {key:'name',label:'Наименование',type:'text'},
    {key:'D_out',label:'Ø, мм',type:'num',sortable:true},
    {key:'height',label:'H, мм',type:'num',sortable:true},
    {key:'weight',label:'Вес, кг',type:'num',sortable:true},
    {key:'steel',label:'Марки стали',type:'steel'},
    {key:'std',label:'Стандарт',type:'text'},
    {key:'stock',label:'Наличие',type:'badge'},
    {key:'price',label:'Цена',type:'price'},
    {key:'term',label:'Сроки',type:'text'}
  ],
  quickFilters:[
    {label:'09Г2С',field:'steel',value:'09Г2С'},
    {label:'12Х18Н10Т',field:'steel',value:'12Х18Н10Т'},
    {label:'15Х5М',field:'steel',value:'15Х5М'},
    {label:'Ø до 500',field:'dMax',value:500},
    {label:'Ø от 1000',field:'dMin',value:1000}
  ],
  data: genPokovki()
};

PROJECT.sections.zagotovki = {
  label:'Заготовки', icon:'?',
  title:'Заготовки под фланцы',
  subtitle:'ГОСТ 8479-70 · Ø200–2300 мм · H 80–250 мм',
  columns:[
    {key:'num',label:'№',type:'num',cls:'col-num'},
    {key:'name',label:'Наименование',type:'text'},
    {key:'D_out',label:'Ø нар, мм',type:'num',sortable:true},
    {key:'D_in',label:'Ø внутр, мм',type:'num',sortable:true},
    {key:'height',label:'H, мм',type:'num',sortable:true},
    {key:'weight',label:'Вес, кг',type:'num',sortable:true},
    {key:'steel',label:'Марки стали',type:'steel'},
    {key:'std',label:'Стандарт',type:'text'},
    {key:'stock',label:'Наличие',type:'badge'},
    {key:'price',label:'Цена',type:'price'},
    {key:'term',label:'Сроки',type:'text'}
  ],
  quickFilters:[
    {label:'09Г2С',field:'steel',value:'09Г2С'},
    {label:'12Х18Н10Т',field:'steel',value:'12Х18Н10Т'},
    {label:'Ø до 500',field:'dMax',value:500},
    {label:'Ø от 1000',field:'dMin',value:1000}
  ],
  data: genZagotovki()
};

PROJECT.sections.flanges = {
  label:'Фланцы', icon:'⚙️',
  title:'Фланцы готовые ГОСТ 33259-2015',
  subtitle:'Тип 01 плоский · Тип 11 приварной встык · DN15–DN2400',
  columns:[
    {key:'num',label:'№',type:'num',cls:'col-num'},
    {key:'name',label:'Наименование',type:'text'},
    {key:'DN',label:'DN',type:'num',sortable:true},
    {key:'PN',label:'PN, МПа',type:'num',sortable:true},
    {key:'D_out',label:'Ø, мм',type:'num',sortable:true},
    {key:'height',label:'H, мм',type:'num',sortable:true},
    {key:'weight',label:'Вес, кг',type:'num',sortable:true},
    {key:'steel',label:'Марки стали',type:'steel'},
    {key:'std',label:'Стандарт',type:'text'},
    {key:'stock',label:'Наличие',type:'badge'},
    {key:'price',label:'Цена',type:'price'},
    {key:'term',label:'Сроки',type:'text'}
  ],
  quickFilters:[
    {label:'Тип 01',field:'typeName',value:'плоский'},
    {label:'Тип 11',field:'typeName',value:'приварной встык'},
    {label:'DN до 200',field:'dnMax',value:200},
    {label:'DN от 500',field:'dnMin',value:500},
    {label:'09Г2С',field:'steel',value:'09Г2С'}
  ],
  data: genFlanges()
};

PROJECT.sections.kolca = {
  label:'Раскатные кольца', icon:'⭕',
  title:'Раскатные кольца',
  subtitle:'ГОСТ 8479-70 · Ø400–2500 мм · H 80–400 мм',
  columns:[
    {key:'num',label:'№',type:'num',cls:'col-num'},
    {key:'name',label:'Наименование',type:'text'},
    {key:'D_out',label:'Ø нар, мм',type:'num',sortable:true},
    {key:'D_in',label:'Ø внутр, мм',type:'num',sortable:true},
    {key:'height',label:'H, мм',type:'num',sortable:true},
    {key:'weight',label:'Вес, кг',type:'num',sortable:true},
    {key:'steel',label:'Марки стали',type:'steel'},
    {key:'std',label:'Стандарт',type:'text'},
    {key:'stock',label:'Наличие',type:'badge'},
    {key:'price',label:'Цена',type:'price'},
    {key:'term',label:'Сроки',type:'text'}
  ],
  quickFilters:[
    {label:'09Г2С',field:'steel',value:'09Г2С'},
    {label:'12Х18Н10Т',field:'steel',value:'12Х18Н10Т'},
    {label:'10Х17Н13М2Т',field:'steel',value:'10Х17Н13М2Т'},
    {label:'Ø до 1000',field:'dMax',value:1000},
    {label:'Ø от 1500',field:'dMin',value:1500}
  ],
  data: genKolca()
};

/* ==================== ДВИЖОК ==================== */
var state = {search:'',sort:{key:null,dir:1},filters:{},quickFilter:null,section:'pokovki',page:1};
var picked = {};
var PAGE_SIZE = 100;

function keyOf(s,n){ return s+':'+n; }
function curSec(){ return PROJECT.sections[state.section]; }
function fmt(n){ return Math.round(n).toLocaleString('ru-RU'); }

var HOT_STEELS = ['09г2с','12х18н10т','20','ст.20','20гл','20л'];
function isHotSteel(s){ return HOT_STEELS.indexOf(norm(s))!==-1; }

function norm(s){
  return String(s==null?'':s).toLowerCase()
    .replace(/ё/g,'е').replace(/,/g,'.').replace(/[×xх*]/g,'x')
    .replace(/\b(мм|см|м|т|шт|руб|р|₽|кг|г|н|мпа|class)\b/g,' ')
    .replace(/[^\wа-я0-9.x\s-]+/gi,' ').replace(/\s+/g,' ').trim();
}
function buildIndex(r){
  var parts = [r.num,r.name,r.std,r.height,r.steel,r.DN,r.PN,r.D_out,r.D_in];
  var base = norm(parts.join(' '));
  var extra = '';
  [r.weight,r.D_out,r.D_in,r.DN,r.PN].forEach(function(v){
    if (v==null||v==='')return;
    var n = parseFloat(String(v).replace(',','.'));
    if (isNaN(n))return;
    extra += ' '+n+' '+n.toFixed(1)+' '+(n*1000)+' ';
  });
  return (base+' '+norm(extra)).replace(/\s+/g,' ').trim();
}
function tokenize(q){ return norm(q).split(' ').filter(function(t){return t.length&gt;0;}); }
function tokenMatches(tok, idx){
  if (idx.indexOf(tok)!==-1) return true;
  var n = parseFloat(tok);
  if (!isNaN(n)&amp;&amp;/^\d+(\.\d+)?$/.test(tok)){
    var vs=[String(n),n.toFixed(1),n.toFixed(2),('0'+n).slice(-2),String(n*1000)];
    for (var i=0;i&lt;vs.length;i++) if (idx.indexOf(vs[i])!==-1) return true;
  }
  return false;
}
function rowMatches(r,tokens){
  if (!tokens.length) return true;
  var idx = buildIndex(r);
  for (var i=0;i&lt;tokens.length;i++) if (!tokenMatches(tokens[i],idx)) return false;
  return true;
}
function hl(text,tokens){
  if (!tokens.length) return text;
  var out = String(text);
  tokens.forEach(function(t){
    if (t.length&lt;2) return;
    var re = new RegExp('('+t.replace(/[.*+?^${}()|[\]\\]/g,'\\$&amp;')+')','gi');
    out = out.replace(re,'&lt;mark class="hl"&gt;$1&lt;/mark&gt;');
  });
  return out;
}

function calcBaseSum(){
  var t=0;
  Object.keys(picked).forEach(function(k){
    var p=k.split(':'), sec=PROJECT.sections[p[0]];
    if(!sec)return;
    var r=sec.data.find(function(x){return x.num===parseInt(p[1],10);});
    if(!r)return;
    t += (r.price||0)*(picked[k]||1);
  });
  return t;
}
function getDiscount(s){ return s&gt;=PROJECT.discountThreshold ? s*(PROJECT.discountPercent/100) : 0; }
function isDiscountActive(s){ return s&gt;=PROJECT.discountThreshold; }

function renderSteel(steelStr, tokens){
  if (!steelStr) return '';
  var grades = steelStr.split(',').map(function(s){return s.trim();}).filter(function(s){return s;});
  var html = '&lt;div class="steel-badges"&gt;';
  grades.forEach(function(g){
    var hot = isHotSteel(g)?' hot':'';
    var txt = g;
    if (tokens &amp;&amp; tokens.length){
      var re = new RegExp('('+tokens.map(function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,'\\$&amp;');}).join('|')+')','gi');
      if (tokens.some(function(t){ return norm(g).indexOf(t)!==-1; })) {
        txt = g.replace(re,'&lt;mark class="hl"&gt;$1&lt;/mark&gt;');
      }
    }
    html += '&lt;span class="steel-badge'+hot+'"&gt;'+txt+'&lt;/span&gt;';
  });
  html += '&lt;/div&gt;';
  return html;
}

function renderApp(){
  var p = PROJECT, html = '';

  html += '&lt;div class="banner"&gt;&lt;div class="banner-tag"&gt;'+p.banner.tag+'&lt;/div&gt;&lt;div class="banner-title"&gt;'+p.banner.title+'&lt;/div&gt;&lt;div class="banner-phone"&gt;'+p.banner.phone+'&lt;/div&gt;&lt;div class="banner-note"&gt;'+p.banner.note+'&lt;/div&gt;&lt;/div&gt;';

  var tick = '';
  Object.keys(p.sections).forEach(function(sk){
    var s=p.sections[sk];
    s.data.slice(0,2).forEach(function(r){
      tick += '&lt;span class="ticker-item"&gt;'+r.name+'&lt;/span&gt;&lt;span class="ticker-dot"&gt;◆&lt;/span&gt;';
    });
  });
  html += '&lt;div class="ticker"&gt;&lt;div class="ticker-label"&gt;РАЗДЕЛЫ&lt;/div&gt;&lt;div class="ticker-vp"&gt;&lt;div class="ticker-track"&gt;'+tick+tick+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';

  html += '&lt;div class="ad-strip"&gt;'+p.ads.map(function(a){
    return '&lt;a class="ad-item" href="'+(a.href||'#')+'"&gt;&lt;span class="ad-tag"&gt;'+a.tag+'&lt;/span&gt;&lt;span class="ad-text"&gt;'+a.text+'&lt;/span&gt;&lt;span class="ad-cta"&gt;'+a.cta+'&lt;/span&gt;&lt;/a&gt;';
  }).join('')+'&lt;/div&gt;';

  html += '&lt;div class="header"&gt;&lt;div class="tag"&gt;'+p.title.toUpperCase()+'&lt;/div&gt;&lt;h1&gt;'+p.title+'&lt;/h1&gt;&lt;div class="line"&gt;&lt;/div&gt;&lt;p&gt;'+p.subtitle+'&lt;/p&gt;&lt;/div&gt;';

  html += '&lt;div class="tabs" id="tabsBlock"&gt;';
  Object.keys(p.sections).forEach(function(sk){
    var s=p.sections[sk];
    html += '&lt;button class="tab'+(state.section===sk?' active':'')+'" onclick="switchSection(\''+sk+'\')"&gt;'+s.icon+' '+s.label+' &lt;span class="cnt"&gt;'+s.data.length+'&lt;/span&gt;&lt;/button&gt;';
  });
  html += '&lt;/div&gt;';

  var sec = curSec();

  html += '&lt;div class="discount-banner" id="discountBanner"&gt;&lt;h3&gt;★ Скидка от суммы ★&lt;/h3&gt;&lt;p&gt;Закажите на сумму от &lt;b&gt;50 000 ₽&lt;/b&gt; — получите &lt;b style="color:#7dff7d"&gt;скидку 10%&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="discBase"&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;50 000 ₽&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="discRate"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';

  html += '&lt;div class="cta-block"&gt;&lt;h2&gt;'+sec.title+'&lt;/h2&gt;&lt;p&gt;Кликните &lt;b&gt;★&lt;/b&gt;, укажите количество — сумма появится внизу экрана.&lt;br&gt;При сумме от &lt;b&gt;50 000 ₽&lt;/b&gt; скидка 10% применится автоматически.&lt;/p&gt;&lt;div class="cta-counter"&gt;Выбрано: &lt;b id="selectedCount"&gt;0&lt;/b&gt; из '+sec.data.length+'&lt;/div&gt;&lt;div class="cta-buttons"&gt;&lt;button class="btn-big primary" onclick="downloadRequest()"&gt;⬇ Скачать запрос КП&lt;/button&gt;&lt;button class="btn-big" onclick="sendByEmail()"&gt;✉ Отправить на e-mail&lt;/button&gt;&lt;button class="btn-big" onclick="scrollToTable()"&gt;↓ К каталогу&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;';

  html += '&lt;div class="stats"&gt;&lt;div class="stat"&gt;&lt;div class="lbl"&gt;Всего позиций&lt;/div&gt;&lt;div class="val" id="statTotal"&gt;—&lt;/div&gt;&lt;/div&gt;&lt;div class="stat"&gt;&lt;div class="lbl"&gt;Всего на складе&lt;/div&gt;&lt;div class="val" id="statStock"&gt;—&lt;/div&gt;&lt;/div&gt;&lt;div class="stat"&gt;&lt;div class="lbl"&gt;Диапазон&lt;/div&gt;&lt;div class="val sm" id="statCap"&gt;—&lt;/div&gt;&lt;/div&gt;&lt;div class="stat"&gt;&lt;div class="lbl"&gt;Цена от&lt;/div&gt;&lt;div class="val sm" id="statPrice"&gt;—&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';

  html += '&lt;div class="toolbar"&gt;&lt;button class="btn" onclick="resetFilters()"&gt;✕ Очистить фильтры&lt;/button&gt;&lt;button class="btn" onclick="window.print()"&gt;? Печать&lt;/button&gt;&lt;/div&gt;';

  html += '&lt;div class="filter"&gt;&lt;div class="filter-row"&gt;&lt;input class="search" type="text" id="search" placeholder="? Сквозной поиск: 09Г2С, 500, фланец, DN100, 12Х18Н10Т, поковка…"&gt;&lt;div class="counter" id="counter"&gt;Найдено: 0&lt;/div&gt;&lt;/div&gt;&lt;div class="search-help"&gt;Поиск &lt;b&gt;сразу по всем разделам&lt;/b&gt;: размеры (Ø500, DN100, H250), марки стали (09Г2С, 12Х18Н10Т, 20), стандарты (8479, 33259). Несколько слов через пробел — &lt;b&gt;все должны найтись&lt;/b&gt;. Клик по бейджу стали — фильтр по марке.&lt;/div&gt;&lt;div class="filter-grid" style="margin-top:12px"&gt;&lt;div class="fld"&gt;&lt;label&gt;Ø / DN&lt;/label&gt;&lt;input type="number" id="fCapacity" placeholder="напр. 500"&gt;&lt;/div&gt;&lt;div class="fld"&gt;&lt;label&gt;Высота, мм&lt;/label&gt;&lt;input type="number" id="fLength" placeholder="напр. 250"&gt;&lt;/div&gt;&lt;div class="fld"&gt;&lt;label&gt;Тип (01/11)&lt;/label&gt;&lt;input type="text" id="fType" placeholder="01, 11"&gt;&lt;/div&gt;&lt;div class="fld"&gt;&lt;label&gt;Наличие&lt;/label&gt;&lt;select id="fStock"&gt;&lt;option value="all"&gt;Все&lt;/option&gt;&lt;option value="in"&gt;Есть на складе&lt;/option&gt;&lt;option value="out"&gt;Под заказ&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;div class="fld"&gt;&lt;label&gt;Сроки&lt;/label&gt;&lt;select id="fTerm"&gt;&lt;option value="all"&gt;Все&lt;/option&gt;&lt;option value="Под заказ"&gt;Под заказ&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="filter-actions"&gt;'+sec.quickFilters.map(function(q,i){return '&lt;button class="btn" onclick="applyQuick('+i+')"&gt;'+q.label+'&lt;/button&gt;';}).join('')+'&lt;/div&gt;&lt;/div&gt;';

  html += '&lt;div class="table-block" id="catalog"&gt;&lt;div class="select-hint"&gt;→ ВЫБЕРИ ПОЗИЦИИ →&lt;/div&gt;&lt;div class="global-badge" id="globalBadge"&gt;&lt;/div&gt;&lt;div class="block-title" id="blockTitle"&gt;'+sec.title+' · прайс-лист&lt;/div&gt;&lt;div class="table-wrap"&gt;&lt;table id="tbl"&gt;&lt;thead id="thead"&gt;&lt;/thead&gt;&lt;tbody id="tbody"&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div id="moreWrap"&gt;&lt;/div&gt;&lt;div class="footnote"&gt;&lt;div class="fn"&gt;Отметьте &lt;b&gt;★&lt;/b&gt;, укажите &lt;b&gt;количество&lt;/b&gt;&lt;/div&gt;&lt;div class="fn"&gt;Цены &lt;b&gt;с НДС '+p.vat+'%&lt;/b&gt;&lt;/div&gt;&lt;div class="fn"&gt;Скидка &lt;b&gt;10%&lt;/b&gt; от 50 000 ₽&lt;/div&gt;&lt;div class="fn"&gt;Позиции «по запросу» — цена по чертежу&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';

  html += '&lt;div class="cta"&gt;&lt;p class="cta-text"&gt;Отметили позиции? Нажмите «Скачать запрос КП»&lt;/p&gt;&lt;button class="btn-big primary" onclick="downloadRequest()"&gt;⬇ Скачать запрос КП&lt;/button&gt;&lt;div style="margin-top:20px"&gt;&lt;a href="tel:'+p.phoneHref+'" class="cta-btn"&gt;'+p.phone+'&lt;/a&gt;&lt;a href="mailto:'+p.email+'" class="cta-mail"&gt;✉ '+p.email+'&lt;/a&gt;&lt;/div&gt;&lt;p class="manager"&gt;'+p.manager+'&lt;/p&gt;&lt;/div&gt;';

  document.getElementById('app').innerHTML = html;
}

function switchSection(sk){
  state.section=sk; state.search=''; state.filters={}; state.quickFilter=null;
  state.sort={key:null,dir:1}; state.page=1;
  renderApp(); updateStats(); render();
}

function collectAll(){
  var o=[];
  Object.keys(PROJECT.sections).forEach(function(sk){
    PROJECT.sections[sk].data.forEach(function(r){ o.push({section:sk,sectionLabel:PROJECT.sections[sk].label,row:r}); });
  });
  return o;
}

function getFiltered(){
  var tokens = tokenize(state.search);
  var isGlobal = tokens.length&gt;0;
  var items;
  if (isGlobal){
    items = collectAll().filter(function(it){return rowMatches(it.row,tokens);});
  } else {
    var sec = curSec();
    items = sec.data.map(function(r){return {section:state.section,sectionLabel:sec.label,row:r};});
  }
  if (!isGlobal){
    if (state.filters.capacity){
      var c=parseFloat(state.filters.capacity);
      if(!isNaN(c)) items=items.filter(function(it){
        var r=it.row;
        return r.D_out===c || r.diam===c || r.D===c || r.DN===c;
      });
    }
    if (state.filters.length){
      var l=parseFloat(state.filters.length);
      if(!isNaN(l)) items=items.filter(function(it){return it.row.height===l;});
    }
    if (state.filters.stock==='in') items=items.filter(function(it){return it.row.stock&gt;0;});
    if (state.filters.stock==='out') items=items.filter(function(it){return it.row.stock===0;});
    if (state.filters.term &amp;&amp; state.filters.term!=='all') items=items.filter(function(it){return it.row.term===state.filters.term;});
    if (state.filters.type){
      var ft=norm(state.filters.type);
      if (ft) items=items.filter(function(it){
        var r=it.row;
        return norm(r.type||'').indexOf(ft)!==-1 || norm(r.name||'').indexOf(ft)!==-1;
      });
    }
    if (state.quickFilter){
      var qf = state.quickFilter;
      items = items.filter(function(it){
        var r = it.row;
        if (qf.field==='term') return r.term===qf.value;
        if (qf.field==='typeName') return norm(r.name||'').indexOf(norm(qf.value))!==-1;
        if (qf.field==='steel') return norm(r.steel||'').indexOf(norm(qf.value))!==-1;
        if (qf.field==='dMax') return (r.D_out||0)&lt;=qf.value;
        if (qf.field==='dMin') return (r.D_out||0)&gt;=qf.value;
        if (qf.field==='dnMax') return (r.DN||0)&lt;=qf.value;
        if (qf.field==='dnMin') return (r.DN||0)&gt;=qf.value;
        return true;
      });
    }
  }
  if (state.sort.key &amp;&amp; !isGlobal){
    var k=state.sort.key, d=state.sort.dir;
    items.sort(function(a,b){
      var va=a.row[k], vb=b.row[k];
      if (typeof va==='number' &amp;&amp; typeof vb==='number') return (va-vb)*d;
      return String(va).localeCompare(String(vb),'ru')*d;
    });
  }
  return {items:items,tokens:tokens,isGlobal:isGlobal};
}

function rowChars(section,r){
  if (section==='pokovki' || section==='zagotovki' || section==='kolca'){
    return 'Ø'+r.D_out + (r.D_in?'/'+r.D_in:'') + ' × H'+r.height + ' · '+r.std;
  }
  if (section==='flanges'){
    return 'DN'+r.DN+' PN'+String(r.PN).replace('.',',')+' · '+r.std;
  }
  return '';
}

function render(){
  var res = getFiltered();
  var items = res.items, tokens = res.tokens, isGlobal = res.isGlobal;
  var tbody = document.getElementById('tbody');
  var thead = document.getElementById('thead');
  if (!tbody || !thead) return;
  tbody.innerHTML = ''; thead.innerHTML = '';

  var baseSum = calcBaseSum();
  var discountActive = isDiscountActive(baseSum);
  var globalBadge = document.getElementById('globalBadge');
  var blockTitle = document.getElementById('blockTitle');
  var tabsBlock = document.getElementById('tabsBlock');

  if (isGlobal){
    if (tabsBlock) tabsBlock.style.display='none';
    if (globalBadge){
      globalBadge.classList.add('show');
      var sc={};
      items.forEach(function(it){sc[it.section]=(sc[it.section]||0)+1;});
      var parts = Object.keys(sc).map(function(sk){return PROJECT.sections[sk].label+': '+sc[sk];});
      globalBadge.innerHTML = '&lt;span&gt;? &lt;b&gt;Сквозной поиск&lt;/b&gt; «'+state.search+'» — найдено &lt;b&gt;'+items.length+'&lt;/b&gt; поз.&lt;/span&gt;&lt;span style="opacity:.8"&gt;'+parts.join(' · ')+'&lt;/span&gt;&lt;button class="btn" onclick="exitGlobalSearch()"&gt;✕ Выйти из сквозного поиска&lt;/button&gt;';
    }
    if (blockTitle) blockTitle.textContent = 'Результаты поиска';
  } else {
    if (tabsBlock) tabsBlock.style.display='';
    if (globalBadge) globalBadge.classList.remove('show');
    if (blockTitle) blockTitle.textContent = curSec().title+' · прайс-лист';
  }

  if (isGlobal){
    thead.innerHTML = '&lt;tr&gt;&lt;th class="col-star"&gt;★&lt;/th&gt;&lt;th class="col-qty"&gt;Кол-во&lt;/th&gt;&lt;th&gt;Раздел&lt;/th&gt;&lt;th&gt;№&lt;/th&gt;&lt;th&gt;Наименование&lt;/th&gt;&lt;th class="num"&gt;Ø / DN&lt;/th&gt;&lt;th&gt;Характеристики&lt;/th&gt;&lt;th&gt;Сталь&lt;/th&gt;&lt;th class="num"&gt;Наличие&lt;/th&gt;&lt;th class="num"&gt;Цена&lt;/th&gt;&lt;th&gt;Сроки&lt;/th&gt;&lt;/tr&gt;';
  } else {
    var sec = curSec();
    var th = '&lt;tr&gt;&lt;th class="col-star"&gt;★&lt;/th&gt;&lt;th class="col-qty"&gt;Кол-во&lt;/th&gt;';
    sec.columns.forEach(function(c){
      var cls = (c.type==='num'?'num ':'') + (c.cls||'');
      if (c.sortable) cls += ' sortable';
      th += '&lt;th class="'+cls+'" '+(c.sortable?'data-key="'+c.key+'"':'')+'&gt;'+c.label+'&lt;/th&gt;';
    });
    th += '&lt;/tr&gt;';
    thead.innerHTML = th;
  }

  if (!items.length){
    var colCount = isGlobal ? 11 : (curSec().columns.length+2);
    tbody.innerHTML = '&lt;tr&gt;&lt;td colspan="'+colCount+'" style="text-align:center;padding:40px;opacity:.6"&gt;Ничего не найдено. Попробуйте: «500», «09Г2С», «фланец», «DN100», «кольцо 1000».&lt;/td&gt;&lt;/tr&gt;';
    document.getElementById('counter').textContent='Найдено: 0';
    document.getElementById('moreWrap').innerHTML='';
    updateStickyBar(); updateDiscountBanner(); bindSortHeaders();
    return;
  }

  var showCount = Math.min(items.length, state.page*PAGE_SIZE);
  var visible = items.slice(0, showCount);
  var html = '';

  visible.forEach(function(it){
    var r = it.row;
    var k = keyOf(it.section, r.num);
    var isPicked = picked[k]!==undefined;
    var qty = isPicked ? picked[k] : 1;
    var hasPrice = (r.price||0)&gt;0;
    var finalPrice = discountActive &amp;&amp; hasPrice ? Math.round(r.price*(1-PROJECT.discountPercent/100)) : r.price;
    var trCls = isPicked ? (discountActive&amp;&amp;hasPrice?'picked discount-active':'picked') : '';
    var cells = '&lt;tr class="'+trCls+'"&gt;';
    cells += '&lt;td class="col-star"&gt;&lt;span class="star'+(isPicked?' on':'')+'" data-sec="'+it.section+'" data-num="'+r.num+'"&gt;'+(isPicked?'★':'☆')+'&lt;/span&gt;&lt;/td&gt;';
    cells += '&lt;td class="col-qty"&gt;&lt;input type="number" class="qty" data-sec="'+it.section+'" data-num="'+r.num+'" value="'+qty+'" min="1" max="9999"'+(isPicked?'':' disabled')+'&gt;&lt;/td&gt;';

    if (isGlobal){
      var gp = r.DN!=null ? 'DN'+r.DN : 'Ø'+r.D_out;
      var nameHl = tokens.length ? hl(r.name,tokens) : r.name;
      var priceCell = hasPrice ? '&lt;td class="num price'+(discountActive&amp;&amp;isPicked?' discount':'')+'"&gt;'+fmt(finalPrice)+' ₽&lt;/td&gt;' : '&lt;td class="num price request"&gt;по запросу&lt;/td&gt;';
      var steelCell = r.steel ? '&lt;td&gt;'+renderSteel(r.steel,tokens)+'&lt;/td&gt;' : '&lt;td&gt;—&lt;/td&gt;';
      cells += '&lt;td&gt;'+it.sectionLabel+'&lt;/td&gt;&lt;td class="num"&gt;'+r.num+'&lt;/td&gt;&lt;td&gt;'+nameHl+'&lt;/td&gt;&lt;td class="num"&gt;'+gp+'&lt;/td&gt;&lt;td&gt;'+rowChars(it.section,r)+'&lt;/td&gt;'+steelCell+'&lt;td class="num"&gt;&lt;span class="'+(r.stock&gt;=10?'badge many':r.stock===0?'badge zero':'badge')+'"&gt;'+(r.stock&gt;0?r.stock:'под заказ')+'&lt;/span&gt;&lt;/td&gt;'+priceCell+'&lt;td&gt;'+r.term+'&lt;/td&gt;';
    } else {
      var sec = curSec();
      sec.columns.forEach(function(c){
        var v = r[c.key];
        if (c.type==='num') cells += '&lt;td class="num '+(c.cls||'')+'"&gt;'+v+'&lt;/td&gt;';
        else if (c.type==='price'){
          if (v&gt;0) cells += discountActive&amp;&amp;isPicked ? '&lt;td class="num price discount"&gt;'+fmt(finalPrice)+' ₽&lt;/td&gt;' : '&lt;td class="num price"&gt;'+fmt(v)+' ₽&lt;/td&gt;';
          else cells += '&lt;td class="num price request"&gt;по запросу&lt;/td&gt;';
        }
        else if (c.type==='badge'){
          var cls = v&gt;=10?'badge many':v===0?'badge zero':'badge';
          cells += '&lt;td class="num"&gt;&lt;span class="'+cls+'"&gt;'+(v&gt;0?v:'под заказ')+'&lt;/span&gt;&lt;/td&gt;';
        }
        else if (c.type==='steel'){
          cells += '&lt;td&gt;'+renderSteel(v,tokens)+'&lt;/td&gt;';
        }
        else {
          var txt = (c.key==='num') ? '&lt;b&gt;'+v+'&lt;/b&gt;' : v;
          if (c.key==='name' &amp;&amp; tokens.length) txt = hl(v,tokens);
          cells += '&lt;td class="'+(c.cls||'')+'"&gt;'+txt+'&lt;/td&gt;';
        }
      });
    }
    cells += '&lt;/tr&gt;';
    html += cells;
  });
  tbody.innerHTML = html;
  document.getElementById('counter').textContent = 'Найдено: '+items.length;

  var moreWrap = document.getElementById('moreWrap');
  if (showCount &lt; items.length){
    moreWrap.innerHTML = '&lt;div class="more-wrap"&gt;&lt;button class="btn-more" onclick="loadMore()"&gt;Показать ещё &lt;b&gt;'+Math.min(PAGE_SIZE, items.length-showCount)+'&lt;/b&gt; из '+(items.length-showCount)+'&lt;/button&gt;&lt;div class="pagination-info"&gt;Показано '+showCount+' из '+items.length+'&lt;/div&gt;&lt;/div&gt;';
  } else if (items.length &gt; PAGE_SIZE){
    moreWrap.innerHTML = '&lt;div class="pagination-info" style="text-align:center;padding:12px"&gt;Показаны все '+items.length+' позиций&lt;/div&gt;';
  } else {
    moreWrap.innerHTML = '';
  }

  updateSort();
  updateStickyBar();
  updateDiscountBanner();
  bindEventsDelegated(tbody);
  bindSortHeaders();
}

function loadMore(){
  state.page++;
  render();
}

function bindEventsDelegated(tbody){
  if (tbody._bound) return;
  tbody._bound = true;
  tbody.addEventListener('click',function(e){
    var el = e.target;
    if (el.classList.contains('star')){
      var s = el.dataset.sec, n = parseInt(el.dataset.num,10);
      var k = keyOf(s,n);
      if (picked[k]!==undefined) delete picked[k];
      else picked[k]=1;
      render();
    }
    if (el.classList.contains('steel-badge')){
      var txt = el.textContent.trim();
      state.search = txt; state.page = 1;
      var s = document.getElementById('search');
      if (s) s.value = txt;
      render();
    }
  });
  tbody.addEventListener('input',function(e){
    if (e.target.classList.contains('qty')){
      var s = e.target.dataset.sec, n = parseInt(e.target.dataset.num,10);
      var k = keyOf(s,n);
      if (picked[k]===undefined) return;
      var v = Math.max(1, parseInt(e.target.value,10)||1);
      picked[k]=v;
      updateStickyBar(); updateDiscountBanner();
    }
  });
}

function updateSort(){
  document.querySelectorAll('#tbl th.sortable').forEach(function(th){
    th.classList.remove('asc','desc');
    if (th.dataset.key===state.sort.key) th.classList.add(state.sort.dir===1?'asc':'desc');
  });
}
function bindSortHeaders(){
  document.querySelectorAll('#tbl th.sortable').forEach(function(th){
    if (th._bound) return;
    th._bound = true;
    th.addEventListener('click',function(){
      var k = th.dataset.key;
      if (state.sort.key===k) state.sort.dir *= -1;
      else state.sort = {key:k,dir:1};
      render();
    });
  });
}

function exitGlobalSearch(){
  state.search=''; state.page=1;
  var s = document.getElementById('search'); if (s) s.value='';
  renderApp(); updateStats(); render();
}

function updateDiscountBanner(){
  var baseSum = calcBaseSum();
  var active = isDiscountActive(baseSum);
  var remain = Math.max(0, PROJECT.discountThreshold - baseSum);
  var pct = Math.min(100, (baseSum / PROJECT.discountThreshold) * 100);
  var b = document.getElementById('discountBanner');
  if (b){ if (active) b.classList.add('active'); else b.classList.remove('active'); }
  var f = document.getElementById('progressFill'); if (f) f.style.width = pct.toFixed(1)+'%';
  var l = document.getElementById('progressLabel');
  if (l){
    if (baseSum===0) l.innerHTML='Отметьте позиции';
    else if (active) l.innerHTML='✓ &lt;b&gt;СКИДКА АКТИВНА!&lt;/b&gt; −10%';
    else l.innerHTML='Набрано: &lt;b&gt;'+fmt(baseSum)+' ₽&lt;/b&gt; из '+fmt(PROJECT.discountThreshold)+' ₽';
  }
  var db = document.getElementById('discBase'); if (db) db.textContent = fmt(baseSum)+' ₽';
  var dr = document.getElementById('discRemain'); if (dr) dr.textContent = active?'✓ Достигнуто':fmt(remain)+' ₽';
  var dRate = document.getElementById('discRate');
  if (dRate){
    if (active){ dRate.innerHTML='−'+fmt(getDiscount(baseSum))+' ₽'; dRate.style.color='#7dff7d'; }
    else { dRate.textContent='0 ₽'; dRate.style.color=''; }
  }
}

function updateStickyBar(){
  var keys = Object.keys(picked);
  var qty = 0, sum = 0;
  keys.forEach(function(k){
    var p = k.split(':'), sec = PROJECT.sections[p[0]];
    if (!sec) return;
    var r = sec.data.find(function(x){return x.num===parseInt(p[1],10);});
    if (!r) return;
    var q = picked[k]||1;
    qty += q; sum += (r.price||0)*q;
  });
  var active = isDiscountActive(sum);
  var disc = getDiscount(sum);
  var total = sum - disc;
  document.getElementById('barCount').textContent = keys.length;
  document.getElementById('barQty').textContent = qty;
  document.getElementById('barBase').textContent = fmt(sum)+' ₽';
  document.getElementById('barDiscount').textContent = active ? '−'+fmt(disc)+' ₽' : '0 ₽';
  document.getElementById('barDiscountLabel').textContent = active ? '✓ Скидка 10%' : 'Скидка';
  document.getElementById('barTotal').textContent = fmt(total)+' ₽';
  var bar = document.getElementById('stickyBar');
  if (keys.length&gt;0) bar.classList.add('show'); else bar.classList.remove('show');
  if (active) bar.classList.add('discount-active'); else bar.classList.remove('discount-active');
  var sel = document.getElementById('selectedCount'); if (sel) sel.textContent = keys.length;
}

function clearPicked(){
  if (!Object.keys(picked).length) return;
  if (!confirm('Очистить все отмеченные позиции?')) return;
  picked = {}; render();
}

function updateStats(){
  var sec = curSec();
  var d = sec.data;
  document.getElementById('statTotal').textContent = d.length;
  document.getElementById('statStock').textContent = d.reduce(function(s,r){return s+(r.stock||0);},0)+' шт';
  var vals = d.map(function(r){return r.D_out;}).filter(function(v){return v!=null;});
  if (vals.length) document.getElementById('statCap').textContent = Math.min.apply(null,vals)+'–'+Math.max.apply(null,vals);
  else document.getElementById('statCap').textContent = '—';
  var prices = d.map(function(r){return r.price;}).filter(function(p){return p&gt;0;});
  document.getElementById('statPrice').textContent = prices.length ? fmt(Math.min.apply(null,prices))+' ₽' : 'по запросу';
}

function scrollToTable(){ document.getElementById('catalog').scrollIntoView({behavior:'smooth',block:'start'}); }
function resetFilters(){
  state.search=''; state.filters={}; state.quickFilter=null; state.page=1;
  renderApp(); updateStats(); render();
}
function applyQuick(i){
  resetFilters();
  state.quickFilter = curSec().quickFilters[i];
  state.page = 1;
  render();
}

function collectPicked(){
  var out=[];
  Object.keys(picked).forEach(function(k){
    var p = k.split(':'), sec = PROJECT.sections[p[0]];
    if (!sec) return;
    var r = sec.data.find(function(x){return x.num===parseInt(p[1],10);});
    if (!r) return;
    out.push({section:p[0],sectionLabel:sec.label,row:r,qty:picked[k]||1});
  });
  return out;
}

function downloadRequest(){
  var items = collectPicked();
  if (!items.length){ alert('Отметьте позиции звёздочкой ★'); scrollToTable(); return; }
  var baseSum = calcBaseSum();
  var active = isDiscountActive(baseSum);
  var disc = getDiscount(baseSum);
  var header = ['Раздел','№','Наименование','Ø / DN','Характеристики','Сталь','Цена с НДС','Кол-во','Сумма','Сроки'];
  var body = items.map(function(it){
    var r = it.row;
    var hasPrice = (r.price||0)&gt;0;
    var fp = active &amp;&amp; hasPrice ? Math.round(r.price*(1-PROJECT.discountPercent/100)) : r.price;
    var gp = r.DN!=null ? 'DN'+r.DN : 'Ø'+r.D_out;
    return [it.sectionLabel, r.num, r.name, gp, rowChars(it.section,r), r.steel||'', hasPrice?fp:'по запросу', it.qty, hasPrice?Math.round(fp*it.qty):'по запросу', r.term];
  });
  body.push([]); body.push(['','','','','ИТОГО:','','','',Math.round(baseSum-disc),active?'Скидка 10%':'']);
  var esc = function(v){return '"'+String(v==null?'':v).replace(/"/g,'""')+'"';};
  var csv = [header].concat(body).map(function(r){return r.map(esc).join(';');}).join('\r\n');
  var blob = new Blob(['\uFEFF'+csv],{type:'text/csv;charset=utf-8;'});
  var url = URL.createObjectURL(blob);
  var a = document.createElement('a');
  a.href = url; a.download = 'Запрос_КП_Арсенал_'+today()+'.csv';
  document.body.appendChild(a); a.click(); a.remove();
  setTimeout(function(){URL.revokeObjectURL(url);},500);
}

function sendByEmail(){
  var items = collectPicked();
  if (!items.length){ alert('Отметьте позиции'); scrollToTable(); return; }
  var baseSum = calcBaseSum();
  var active = isDiscountActive(baseSum);
  var disc = getDiscount(baseSum);
  var lines = ['Здравствуйте!','','Прошу подготовить КП:',''];
  items.forEach(function(it){
    var r = it.row;
    var hasPrice = (r.price||0)&gt;0;
    var fp = active &amp;&amp; hasPrice ? Math.round(r.price*(1-PROJECT.discountPercent/100)) : r.price;
    var ptxt = hasPrice ? fp+' ₽ × '+it.qty+' = '+fmt(fp*it.qty)+' ₽' : 'по запросу × '+it.qty;
    lines.push('['+it.sectionLabel+'] №'+r.num+' · '+r.name+' · '+ptxt);
  });
  lines.push('','Сумма без скидки: '+fmt(baseSum)+' ₽');
  if (active) lines.push('Скидка 10%: −'+fmt(disc)+' ₽');
  lines.push('ИТОГО с НДС 22%: '+fmt(baseSum-disc)+' ₽');
  lines.push('','Прошу указать сроки и условия отгрузки.','','С уважением,');
  var subj = encodeURIComponent('Запрос КП — '+items.length+' поз.');
  var body = encodeURIComponent(lines.join('\n'));
  window.location.href = 'mailto:'+PROJECT.email+'?subject='+subj+'&amp;body='+body;
}

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());
}

document.addEventListener('DOMContentLoaded', function(){
  renderApp(); updateStats(); render();

  function bindFilters(){
    var s = document.getElementById('search');
    if (s) s.addEventListener('input', debounce(function(e){
      state.search = e.target.value;
      state.page = 1;
      render();
    }, 200));
    var cap = document.getElementById('fCapacity');
    if (cap) cap.addEventListener('input', debounce(function(e){state.filters.capacity=e.target.value; state.page=1; render();},200));
    var len = document.getElementById('fLength');
    if (len) len.addEventListener('input', debounce(function(e){state.filters.length=e.target.value; state.page=1; render();},200));
    var st = document.getElementById('fStock');
    if (st) st.addEventListener('change',function(e){state.filters.stock=e.target.value; state.page=1; render();});
    var tm = document.getElementById('fTerm');
    if (tm) tm.addEventListener('change',function(e){state.filters.term=e.target.value; state.page=1; render();});
    var ty = document.getElementById('fType');
    if (ty) ty.addEventListener('input', debounce(function(e){state.filters.type=e.target.value; state.page=1; render();},200));
  }

  var _sw = window.switchSection;
  window.switchSection = function(sk){ _sw(sk); bindFilters(); };

  bindFilters();
});

function debounce(fn, ms){
  var t;
  return function(){
    var args = arguments, ctx = this;
    clearTimeout(t);
    t = setTimeout(function(){ fn.apply(ctx, args); }, ms);
  };
}
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</summary>
    <link href="https://irontub.ru/ssl/u/4a/426842cc8611f18186dd0407a073bc/-/%D0%9D%D0%B5%D1%80%D0%B6%D0%B0%D0%B2%D0%B5%D1%8E%D1%89%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BA%D0%BE%D0%B2%D0%BA%D0%B0_end.webp" length="208346" rel="enclosure" type="application/octet-stream"/>
  </entry>
</feed>
