Слаботочные системы

Слаботочные системы — CCTV, СКУД, СКС, ОПС/СОУЭ, Wi-Fi | ГК «СтилКонстракшн» :root { —bg: #0e1013; —panel: #12151a; —muted: #1a1f26; —line: #2a313b; —text: #e7ecf3; —soft: #94a3b8; —accent: #56b6f7; —accent-2: #7cf1c9; —warn: #f7b956; —ok: #19d28b; —glass: rgba(255, 255, 255, .06); —blur: 12px; —radius: 18px; —radius-lg: 26px; —shadow: 0 18px 60px rgba(0, 0, 0, .35), 0 1px 0 rgba(255, 255, 255, .03) inset; —max: 1200px; —pad: clamp(16px, 2vw, 32px); } html, body { margin: 0; padding: 0; background: var(—bg); color: var(—text); -webkit-text-size-adjust: 100%; font-family: Inter, system-ui, Arial, sans-serif } *, *:before, *:after { box-sizing: border-box } a { color: inherit; text-decoration: none } a:focus-visible, button:focus-visible, input:focus-visible, select:focus-visible { outline: 2px dashed var(—accent); outline-offset: 2px } img { max-width: 100%; height: auto; display: block } /* layout */ .wrap { position: relative; isolation: isolate; overflow: hidden; padding-bottom: 70px } .wrap::before { content: «»; position: absolute; inset: -22% -12% auto -12%; height: 58vh; z-index: -1; filter: blur(22px); background: radial-gradient(60% 60% at 20% 30%, #56b6f71a 0, transparent 60%), radial-gradient(50% 50% at 80% 20%, #7cf1c918 0, transparent 60%) } .cont { max-width: var(—max); margin: 0 auto; padding: 0 var(—pad) } .sec { padding: clamp(40px, 6vw, 90px) 0 } hr.sep { border: 0; height: 1px; background: linear-gradient(90deg, transparent, var(—line), transparent); opacity: .5; margin: 34px 0 } /* progress */ .progress { position: sticky; top: 0; z-index: 50; height: 3px; background: linear-gradient(90deg, #56b6f7, #7cf1c9); width: 0% } /* HERO */ .hero { position: relative; padding: clamp(82px, 10vw, 120px) 0 28px; text-align: center; border-bottom: 1px solid var(—line); background: radial-gradient(900px 360px at 85% -10%, rgba(86, 182, 247, .10), transparent 60%), radial-gradient(1200px 420px at 20% -15%, rgba(124, 241, 201, .10), transparent 60%), var(—bg) } .hero h1 { margin: 0 0 10px; font-size: clamp(32px, 5.2vw, 64px); font-weight: 900; background: linear-gradient(180deg, #fff, #cfe7ff); -webkit-background-clip: text; background-clip: text; color: transparent } .hero p { margin: 0 auto; color: #cfd8e4; max-width: 84ch; font-size: clamp(15px, 1.4vw, 18px) } .hero .bullets { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin: 18px auto 0 } @media(max-width:980px) { .hero .bullets { grid-template-columns: 1fr 1fr } } @media(max-width:640px) { .hero .bullets { grid-template-columns: 1fr } } .b { border: 1px solid var(—line); border-radius: 14px; padding: 10px 12px; background: rgba(255, 255, 255, .04); color: #d6e6f6; font-size: 14px; position: relative; overflow: hidden } .b::after { content: «»; position: absolute; inset: auto -20% 0 -20%; height: 2px; background: linear-gradient(90deg, #7cf1c9, #56b6f7); opacity: .0; transition: .35s } .b:hover::after { opacity: .6 } .spot { position: absolute; inset: 0; pointer-events: none; mix-blend-mode: screen; opacity: .22; background: radial-gradient(200px 200px at var(—mx, 50%) var(—my, 20%), rgba(124, 241, 201, .35), rgba(86, 182, 247, .0) 70%) } /* CTAs */ .ctas { display: flex; gap: 10px; justify-content: center; flex-wrap: wrap; margin-top: 16px } .btn { position: relative; display: inline-flex; align-items: center; gap: 10px; height: 48px; padding: 0 18px; border-radius: 14px; border: 1px solid var(—line); background: linear-gradient(180deg, #19212a, #12161d); color: #eaf6ff; font-weight: 800; letter-spacing: .2px; box-shadow: var(—shadow); cursor: pointer; transition: .2s; will-change: transform } .btn:hover { transform: translateY(-2px); box-shadow: 0 18px 60px rgba(86, 182, 247, .25) } .btn.ghost { background: rgba(255, 255, 255, .06) } .btn:after { content: «»; position: absolute; inset: 0; border-radius: inherit; transform: scale(0); opacity: 0; background: radial-gradient(140px 140px at var(—rx, 50%) var(—ry, 50%), rgba(124, 241, 201, .22), transparent 45%); transition: transform .4s ease, opacity .5s ease } .btn.click:after { transform: scale(1); opacity: .9 } /* sticky chips */ .tabs-wrap { position: sticky; top: 0; z-index: 6; background: linear-gradient(180deg, rgba(14, 16, 19, .92), rgba(14, 16, 19, .7)); backdrop-filter: blur(10px); border-bottom: 1px solid var(—line) } .tabs { display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; padding: 12px 0 } .tab { border: 1px solid var(—line); background: rgba(255, 255, 255, .06); padding: 10px 16px; border-radius: 999px; color: #eaf2ff; font-weight: 800; letter-spacing: .2px; cursor: pointer; transition: transform .12s ease, border-color .2s } .tab:hover { transform: translateY(-1px); border-color: #3f8bd6 } .tab[aria-pressed=»true»] { background: linear-gradient(90deg, var(—accent), var(—accent-2)); color: #0a1218; box-shadow: 0 6px 24px rgba(86, 182, 247, .35) } /* grid + cards */ .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px } @media(max-width:1024px) { .grid { grid-template-columns: repeat(2, 1fr) } } @media(max-width:640px) { .grid { grid-template-columns: 1fr } } .card { —rx: 0deg; —ry: 0deg; —ang: 120deg; position: relative; border: 1px solid var(—line); border-radius: 18px; overflow: hidden; background: linear-gradient(180deg, rgba(255, 255, 255, .04), rgba(0, 0, 0, .22)); box-shadow: var(—shadow); padding: 18px; transform: perspective(900px) rotateX(var(—rx)) rotateY(var(—ry)) translateZ(0); transition: transform .14s ease, border-color .25s ease, box-shadow .25s ease } .card:hover { transform: translateY(0) scale(1); box-shadow: 0 30px 80px rgba(0, 0, 0, .45); border-color: #3b4654 } .card::after { content: «»; position: absolute; inset: -1px; border-radius: inherit; pointer-events: none; background: conic-gradient(from var(—ang), rgba(124, 241, 201, .0), rgba(124, 241, 201, .25), rgba(86, 182, 247, .18), rgba(124, 241, 201, .0)); opacity: .0; filter: blur(14px); transition: opacity .25s ease } .card:hover::after { opacity: .9 } .card h3 { margin: 6px 0 8px; font-size: 20px } .card p { margin: 0; color: #c8d3e0; line-height: 1.6 } .card ul { margin: 10px 0 0; padding-left: 18px; color: #cfd8e4 } .card li { margin: 6px 0 } .hidden { display: none !important } /* details mini-table */ .details { margin-top: 12px; border: 1px solid var(—line); border-radius: 12px; overflow: hidden; background: rgba(255, 255, 255, .02) } .details summary { cursor: pointer; padding: 10px 12px; font-weight: 800; color: #e7f2ff; border-bottom: 1px solid var(—line) } .details summary::-webkit-details-marker { display: none } .details table { width: 100%; border-collapse: collapse; font-size: 13px } .details th, .details td { padding: 8px 10px; border-bottom: 1px solid #24303d; color: #cbd7e6; text-align: left } .details thead { background: rgba(255, 255, 255, .04) } .details tr:last-child td { border-bottom: none } /* KPI */ .kpis { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px } @media(max-width:640px) { .kpis { grid-template-columns: 1fr } } .k { border: 1px solid var(—line); border-radius: 12px; background: rgba(255, 255, 255, .04); padding: 16px; text-align: center } .k .v { font-weight: 900; font-size: clamp(20px, 3vw, 32px) } .k .d { color: #9fb3c9; font-size: 12px } /* CTA */ .cta { border: 1px solid var(—line); border-radius: 20px; background: linear-gradient(180deg, rgba(255, 255, 255, .03), rgba(0, 0, 0, .35)); box-shadow: var(—shadow); padding: 32px; text-align: center } .cta h3 { margin: 0 0 10px; font-size: clamp(22px, 3vw, 32px) } .cta p { margin: 0 auto 16px; color: #cdd8e6; max-width: 70ch } /* sticky mini-CTA */ .sticky { position: fixed; right: 16px; bottom: 16px; z-index: 9; display: none; gap: 10px; align-items: center; filter: drop-shadow(0 8px 24px rgba(0, 0, 0, .35)) } .sticky .btn { height: auto; padding: 10px 14px; border-radius: 999px } /* INFINITE MARQUEE */ .marq { —gap: 34px; —edge-fade: 24px; —duration: 24s; position: relative; overflow: hidden; border-top: 1px solid var(—line); border-bottom: 1px solid var(—line); background: rgba(255, 255, 255, .02); mask-image: linear-gradient(90deg, transparent 0, #000 var(—edge-fade), #000 calc(100% — var(—edge-fade)), transparent 100%) } .marq-track { display: inline-flex; align-items: center; gap: var(—gap); padding: 10px 0; min-width: max-content; animation: marq-move var(—duration) linear infinite; will-change: transform } .marq:hover .marq-track { animation-play-state: paused } .marq .tag { font-size: 13px; padding: 8px 12px; border-radius: 999px; border: 1px solid var(—line); background: rgba(255, 255, 255, .04); color: #d6e6f6; white-space: nowrap; flex: 0 0 auto } @keyframes marq-move { from { transform: translateX(0) } to { transform: translateX(-50%) } } /* reveal */ .reveal { opacity: 0; transform: translateY(14px); transition: opacity .7s cubic-bezier(.2, .7, .2, 1), transform .7s cubic-bezier(.2, .7, .2, 1) } .reveal.show { opacity: 1; transform: none } /* reduce motion */ @media (prefers-reduced-motion:reduce) { .marq { overflow: auto; mask-image: none } .marq-track { animation: none !important } .reveal, .btn, .card { transition: none } }

Слаботочные системы под ключ

Видеонаблюдение (IP/PoE), СКУД, СКС (Cat 5e/6/6A), ОПС/СОУЭ, охранная сигнализация, Wi-Fi и домофония. Поставка, маркировка линий, ПНР и исполнительная документация.

Проект/чертежи + спецификации
Маркировка трасс/портов
Сертификаты/соответствие
ONVIF, PoE 802.3af/at/bt
Сервера/NVR, RAID
ПНР и фото-отчеты

CCTV: видеонаблюдение IP/PoE

Купольные/цилиндрические/панорамные камеры, NVR/сервер, аналитика, RTSP/ONVIF.

  • Разрешение 2–8 Мп
  • WDR/ИК-подсветка
  • PoE 802.3af/at/bt
Комплектация
Позиция Примечание
Камеры уличн./внутр., варифокал
Запись NVR/сервер, RAID
Сеть PoE-коммутаторы

СКУД: контроль доступа

Считыватели, контроллеры, электромеханика, турникеты. Интеграция с CCTV.

  • Mifare/EM-Marine
  • Антипассбэк/тайм-трек
  • Онлайн/оффлайн

СКС: структурированная сеть

Линии Cat 5e/6/6A, патч-панели, кроссы, розетки, оптика (SM/MM), тесты Fluke.

  • Маркировка портов
  • Схемы распайки
  • Протоколы измерений
Кабель/оптика
Тип Пропускная
Cat 6 1 Гбит/с (до 100 м)
Cat 6A 10 Гбит/с
SM оптика до 10 км+

ОПС/СОУЭ

Пожарная сигнализация, адресная/пороговая. Оповещение по СНиП/СП, сценарии эвакуации.

  • Дым/тепло/ручные
  • Сирены/табло
  • ПНР и пуск

Охранная сигнализация

Объёмные/периметр, вибро/магнитоконтактные датчики, GSM/пульт.

  • Сценарии охраны
  • Журналы событий
  • Интеграция в BMS

Wi-Fi и сеть

Точки 802.11ac/ax, роуминг, контроллер, PoE-инфраструктура, VLAN/QoS.

  • План радиопокрытия
  • Сайт-сервер/контроллер
  • Гостевые сети

Домофония/видеодомофон

IP-панели/мониторы, ключи/QR, интеграция со СКУД и CCTV.

  • SIP/RTSP
  • Этажные коммутаторы
  • Реле замка

Серверные, стойки, ИБП

Стойки 19″, охлаждение, кабель-менеджмент, ИБП/АКБ, распределение питания.

  • PDU/ATS
  • Мониторинг
  • Резервирование

Документация и ПНР

Проект/рабочка, исполнительная, схемы, маркировка, акты/журналы, обучение персонала.

  • OP, ИД, акты
  • Схемы/таблицы портов
  • Фото-отчёты
ONVIFRTSPPoE 802.3af/at/bt
Cat 5eCat 6Cat 6A
SM/MM Fiber802.11ac802.11ax
ModbusBACnetRS-485
СП 5.13130ГОСТ Р 53325ГОСТ 31565
0
часа — типовой пуск
0
камер — в эксплуатации
0
регионов РФ/ЕАЭС

Соберём и запустим «под ключ»

Подбор оборудования, спецификации, поставка, маркировка и ПНР. Отчёты и исполнительная документация — в комплекте.

{«@context»:»https://schema.org»,»@type»:»Service»,»name»:»Слаботочные системы: CCTV, СКУД, СКС, ОПС/СОУЭ», «provider»:{«@type»:»Organization»,»name»:»ГК «СтилКонстракшн»»,»url»:»»}, «areaServed»:»RU», «serviceType»:[«IP видеонаблюдение»,»СКУД»,»СКС»,»ОПС/СОУЭ»,»Охранная сигнализация»,»Wi-Fi»,»Домофония»,»Серверные/ИБП»,»Документация/ПНР»], «offers»:{«@type»:»Offer»,»availability»:»https://schema.org/InStock»}} const prefersReduced = window.matchMedia && window.matchMedia(‘(prefers-reduced-motion: reduce)’).matches; /* reveal + stagger */ (function () { const els = […document.querySelectorAll(‘.reveal’)]; if (!(‘IntersectionObserver’ in window)) { els.forEach(e => e.classList.add(‘show’)); return; } const io = new IntersectionObserver((en, o) => { en.forEach(x => { if (x.isIntersecting) { x.target.classList.add(‘show’); if (x.target.dataset.stag && !prefersReduced) { const kids = x.target.querySelectorAll(‘:scope .card, :scope .b, :scope .k .v’); kids.forEach((el, i) => { el.style.opacity = 0; el.style.transform = ‘translateY(10px)’; setTimeout(() => { el.style.transition = ‘opacity .5s ease, transform .5s ease’; el.style.opacity = 1; el.style.transform = ‘none’; }, 70 * i); }); } o.unobserve(x.target); } }) }, { threshold: .16 }); els.forEach(e => io.observe(e)); })(); /* progress */ (function () { const bar = document.getElementById(‘prg’); const onScroll = () => { const h = document.documentElement; const pr = (h.scrollTop) / (h.scrollHeight — h.clientHeight); bar.style.width = (pr * 100) + ‘%’; }; window.addEventListener(‘scroll’, onScroll, { passive: true }); onScroll(); })(); /* hero spotlight */ (function () { const hero = document.querySelector(‘.hero’); const spot = hero && hero.querySelector(‘.spot’); if (!hero || !spot || prefersReduced) return; hero.addEventListener(‘pointermove’, (e) => { const r = hero.getBoundingClientRect(); const mx = ((e.clientX — r.left) / r.width) * 100; const my = ((e.clientY — r.top) / r.height) * 100; spot.style.setProperty(‘—mx’, mx + ‘%’); spot.style.setProperty(‘—my’, my + ‘%’); spot.style.opacity = .3; }); hero.addEventListener(‘pointerleave’, () => { spot.style.opacity = .18 }); })(); /* magnet buttons + ripple */ (function () { const mags = […document.querySelectorAll(‘.js-magnet’)]; if (prefersReduced) return; mags.forEach(btn => { btn.addEventListener(‘pointermove’, e => { const r = btn.getBoundingClientRect(); const x = e.clientX — (r.left + r.width / 2); const y = e.clientY — (r.top + r.height / 2); btn.style.transform = `translate(${x * 0.08}px, ${y * 0.08}px)`; }); btn.addEventListener(‘pointerleave’, () => btn.style.transform = »); btn.addEventListener(‘click’, e => { const r = e.currentTarget.getBoundingClientRect(); e.currentTarget.style.setProperty(‘—rx’, ((e.clientX — r.left) / r.width * 100) + ‘%’); e.currentTarget.style.setProperty(‘—ry’, ((e.clientY — r.top) / r.height * 100) + ‘%’); e.currentTarget.classList.add(‘click’); setTimeout(() => e.currentTarget.classList.remove(‘click’), 320); }); }); })(); /* 3D tilt cards */ (function () { const grid = document.getElementById(‘grid’); if (!grid || prefersReduced) return; grid.querySelectorAll(‘.card’).forEach(card => { const max = 6; const angBase = parseFloat(card.getAttribute(‘data-ang’) || ‘0’); card.addEventListener(‘pointermove’, e => { const r = card.getBoundingClientRect(); const px = (e.clientX — r.left) / r.width — .5; const py = (e.clientY — r.top) / r.height — .5; card.style.setProperty(‘—rx’, (-py * max) + ‘deg’); card.style.setProperty(‘—ry’, (px * max) + ‘deg’); card.style.setProperty(‘—ang’, (angBase + px * 40) + ‘deg’); }); card.addEventListener(‘pointerleave’, () => { card.style.setProperty(‘—rx’, ‘0deg’); card.style.setProperty(‘—ry’, ‘0deg’); card.style.setProperty(‘—ang’, angBase + ‘deg’); }); }); })(); /* tabs filter */ (function () { const tabs = […document.querySelectorAll(‘.tab’)]; const cards = […document.querySelectorAll(‘#grid .card’)]; function apply(cat) { cards.forEach(c => c.classList.toggle(‘hidden’, !(cat === ‘all’ || c.dataset.cat === cat))); } tabs.forEach(t => t.addEventListener(‘click’, () => { tabs.forEach(x => x.setAttribute(‘aria-pressed’, ‘false’)); t.setAttribute(‘aria-pressed’, ‘true’); apply(t.dataset.filter); const top = document.querySelector(‘.tabs-wrap’).offsetTop; window.scrollTo({ top: top + 1, behavior: prefersReduced ? ‘auto’ : ‘smooth’ }); if (!prefersReduced) { t.animate([{ transform: ‘scale(.9)’ }, { transform: ‘scale(1.04)’ }, { transform: ‘scale(1)’ }], { duration: 240, easing: ‘ease-out’ }); } })); })(); /* KPI counters */ (function () { const wrap = document.getElementById(‘kpis’); if (!wrap) return; const nums = wrap.querySelectorAll(‘.v’); let done = false; const run = () => { if (done) return; done = true; nums.forEach(n => { const target = parseInt(n.getAttribute(‘data-c’) || ‘0’, 10); const dur = 900; const t0 = performance.now(); function tick(t) { const p = Math.min(1, (t — t0) / dur); n.textContent = Math.floor(target * (0.2 + 0.8 * p)).toLocaleString(‘ru-RU’); if (p { if (e[0].isIntersecting) { run(); io.disconnect(); } }, { threshold: .3 }); io.observe(wrap); })(); /* Sticky CTA + footer-aware */ (function () { const sticky = document.getElementById(‘sticky’); let shown = false; const show = () => { if (window.scrollY > 420 && !shown) { sticky.style.display = ‘flex’; shown = true; } if (window.scrollY { entries.forEach(e => { sticky.style.opacity = e.isIntersecting ? ‘.0’ : »; sticky.style.pointerEvents = e.isIntersecting ? ‘none’ : »; }); }, { threshold: 0.01 }); fIO.observe(footer); } })(); /* Widster lazy loader */ function widsterOpen(e) { if (e) e.preventDefault(); try { if (window.__widsterLoaded && window.widster && window.widster.open) { window.widster.open(); return; } if (document.getElementById(‘widsterScript’)) { return; } window.__widsterLoaded = false; window.wwidget = ‘837745a476e49072577bd5965e004260cb787b63525a84eb8931aee32562fed5’; const s = document.createElement(‘script’); s.id = ‘widsterScript’; s.async = true; s.charset = ‘UTF-8’; s.src = ‘https://widster.ru/embed/’ + window.wwidget; s.onload = function () { window.__widsterLoaded = true; try { window.widster && window.widster.open && window.widster.open(); } catch (e) { } }; document.body.appendChild(s); } catch (err) { location.href = ‘mailto:sales@gk-sc.ru?subject=’ + encodeURIComponent(‘Запрос КП (слаботочные системы)’) + ‘&body=’ + encodeURIComponent(‘Здравствуйте! Нужен подбор/расчёт CCTV/СКУД/СКС/ОПС/СОУЭ/Wi-Fi. Приложу план/ведомость.’); } } /* Quick picker */ (function () { const back = document.getElementById(‘pickBack’); if (!back) return; const open = document.getElementById(‘openPicker’); const close = document.getElementById(‘pickClose’); const mail = document.getElementById(‘pickMail’); const out = document.getElementById(‘pickOut’); function gather() { const sys = document.getElementById(‘sysType’).value; const addr = document.getElementById(‘sysAddr’).value.trim() || ‘—’; const cam = +document.getElementById(‘camQty’).value || 0; const scs = +document.getElementById(‘scsQty’).value || 0; const cat = document.getElementById(‘catSel’).value; const poe = document.getElementById(‘needPoE’).checked ? ‘да’ : ‘нет’; const ups = document.getElementById(‘needUPS’).checked ? ‘да’ : ‘нет’; const raid = document.getElementById(‘needRaid’).checked ? ‘да’ : ‘нет’; const days = document.getElementById(‘days’).value || ‘—’; const when = document.getElementById(‘when’).value || ‘—’; const note = document.getElementById(‘note’).value || »; out.textContent = `Система: ${sys}. Камеры: ${cam}. Точки СКС: ${scs} (${cat}). PoE: ${poe}, ИБП: ${ups}, RAID: ${raid}. Хранение: ${days} дн. Адрес: ${addr}. Сроки: ${when}. ${note ? (‘Комментарий: ‘ + note) : »}`; return { sys, addr, cam, scs, cat, poe, ups, raid, days, when, note }; } function openM(e) { if (e) e.preventDefault(); back.style.display = ‘flex’; gather(); } function closeM() { back.style.display = ‘none’; } open.addEventListener(‘click’, openM); close.addEventListener(‘click’, closeM); back.addEventListener(‘click’, e => { if (e.target === back) closeM(); }); [‘change’, ‘input’].forEach(ev => document.querySelectorAll(‘#pickBack input, #pickBack select, #pickBack textarea’).forEach(i => i.addEventListener(ev, gather))); mail.addEventListener(‘click’, () => { const d = gather(); const body = `Быстрый подбор слаботочных системСистема: ${d.sys}Камеры: ${d.cam}Точки СКС: ${d.scs} (${d.cat})PoE: ${d.poe} | ИБП: ${d.ups} | RAID: ${d.raid}Дней хранения: ${d.days}Адрес: ${d.addr}Сроки: ${d.when}${d.note ? (‘Комментарий: ‘ + d.note) : »}Прошу подготовить спецификацию/КП и сроки.`; location.href = ‘mailto:sales@gk-sc.ru?subject=’ + encodeURIComponent(‘Быстрый подбор: слаботочка’) + ‘&body=’ + encodeURIComponent(body); closeM(); }); })(); /* INFINITE MARQUEE: автодубли для бесшовности */ (function () { const reduce = window.matchMedia && window.matchMedia(‘(prefers-reduced-motion: reduce)’).matches; const blocks = document.querySelectorAll(‘.marq’); if (!blocks.length) return; blocks.forEach(m => { const track = m.querySelector(‘.marq-track’); if (!track) return; m.style.setProperty(‘—duration’, (m.getAttribute(‘data-speed’) || ’24s’).trim()); if (reduce) return; const orig = track.innerHTML; track.innerHTML = orig + orig; let copies = 1; while (track.scrollWidth < m.clientWidth * 2.2 && copies { if (reduce) return; track.style.animation = ‘none’; track.innerHTML = orig + orig; let c = 1; while (track.scrollWidth < m.clientWidth * 2.2 && c { clearTimeout(to); to = setTimeout(rebuild, 120); }, { passive: true }); }); })();

Нужен расчёт стоимости?

Отправьте чертёж или ТЗ — подготовим КП за 2 часа

Смотрите также

Нужен расчёт стоимости?

Отправьте чертёж или ТЗ — рассчитаем за 2 часа

+7 (499) 350-85-45
Получить КП
Позвонить Получить КП

Подождите! У нас есть предложение

Оставьте заявку и получите расчёт стоимости в течение 2 часов

Нажимая кнопку, вы соглашаетесь с политикой конфиденциальности

Написать в Telegram