Гардеробная система в современном интерьере
GarderobeMaster · системы хранения на заказ

Гардеробные и системы хранения на заказ — под вашу планировку, вещи и интерьер

Проектируем гардеробные комнаты, открытые системы, шкафы, двери и перегородки под размеры помещения. Проверяем проходы, объём хранения, материалы, подсветку и внешний вид до производства.

20+ лет опыта 3D-проект до производства Замер и монтаж под ключ Москва и область
Начать можно с фото, размеров, планировки или короткого описания задачи.
Опыт20+ лет опыта

Видим ошибки планировки до производства и подсказываем, что лучше изменить заранее.

Проект3D-проект до запуска

Показываем пропорции, наполнение, материалы и внешний вид системы до изготовления.

РазмерыИзготовление под размеры

Проектируем решение под помещение, а не под готовый модуль.

МонтажМонтаж под ключ

Связываем проектирование, производство, доставку и установку в один процесс.

Проектный подход

Почему готовый шкаф или случайная система не всегда решают хранение

Готовое решение может подойти по ширине, но не учитывать проходы, ежедневный доступ, сезонные вещи, подсветку, двери и визуальную нагрузку интерьера.

Проходы

Система должна не мешать движению, дверям, кровати, входной зоне и другой мебели.

Доступ

Ежедневные вещи должны быть на удобной высоте, а не слишком высоко, глубоко или далеко.

Порядок

Одежда, обувь, сумки, чемоданы и сезонные вещи должны складываться в понятный сценарий.

Интерьер

Хранение должно поддерживать пространство, а не превращать комнату в склад.

Направления

Создаём системы хранения для разных задач и пространств

Выберите направление или начните с описания помещения — мы подскажем, какой формат хранения подойдёт: гардеробная комната, открытая система, шкаф, двери или перегородки.

Гардеробная комната

Гардеробные комнаты

Для отдельной зоны хранения, master-bedroom, большого объёма одежды, обуви, аксессуаров и сезонных вещей.

Смотреть гардеробные
Индивидуальная система хранения

Индивидуальные системы хранения

Для ниш, стен, кладовых, мансард и нестандартных помещений, где готовые решения дают лишние зазоры.

Подробнее о системах
Интерьерная система хранения

Интерьерные системы хранения

Для открытых и архитектурных решений, которые становятся частью интерьера.

Смотреть решения
Шкафы двери и перегородки

Шкафы, двери и перегородки

Для закрытого хранения, зонирования, фасадов и раздвижных решений.

Выбрать решение
Проектный подход

Проект начинается с того, как вы живёте

Мы не начинаем с выбора полок. Сначала смотрим помещение, количество вещей, привычки хранения, проходы, высоты, свет и стиль интерьера. Так появляется система, которой удобно пользоваться каждый день.

Дизайнеры и мастера учитывают детали, которые легко не заметить заранее: где будет удобно доставать вещи, как откроются двери, не появятся ли тёмные зоны и не перегрузит ли система интерьер.

Под ваши вещиОдежда, обувь, аксессуары, сезонное и хозяйственное хранение.
Под помещениеРазмеры, ниши, углы, проходы, свет и особенности планировки.
Под интерьерМатериалы, цвет, фасады, двери, перегородки и подсветка.
Проектирование системы хранения
Сценарии

Создадим решение под ваше помещение

Каждый проект начинается с задачи: где хранить вещи, сколько места есть, нужно ли скрыть хранение или сделать его частью интерьера.

Гардеробная в спальне

Гардеробная в спальне

Когда нужно хранение рядом с ежедневными вещами, но важно сохранить лёгкость комнаты.

Система хранения в нише

Система в нише

Когда нужно использовать проём, стену или нишу без случайных зазоров.

Отдельная гардеробная

Отдельная гардеробная

Когда вещей много и нужно собрать одежду, обувь, аксессуары и сезонное хранение в одном месте.

Открытая гардеробная система

Открытая система

Когда хранение должно стать частью интерьера без массивных фасадов.

Шкаф под размеры

Шкаф под размеры

Когда нужно закрытое хранение под точные размеры помещения.

Перегородки и двери

Перегородки и двери

Когда нужно зонировать пространство или скрыть хранение без капитальных стен.

Портфолио

Реализованные проекты GarderobeMaster

Посмотрите, как похожие задачи решаются в реальных интерьерах: открытые системы, закрытые фасады, комбинированные решения, перегородки, шкафы и гардеробные комнаты под разные планировки.

Гардеробная МДФ с покраской RAL
Реальный проект

Гардеробная МДФ с покраской RAL

Классическая гардеробная с фасадами, капителями и индивидуальным проектом.

Смотреть проект
Гардеробная система Vitra Black
Реальный проект

Гардеробная система Vitra Black

Система хранения с материалами под дерево и фурнитурой Blum.

Смотреть проект
Гардеробная с дверями купе
Реальный проект

Гардеробная с дверями купе

Решение с закрытыми секциями и отдельной зоной для бытовой техники.

Смотреть проект
Классическая гардеробная система
Реальный проект

Классическая гардеробная

Проект с окраской по RAL, индивидуальным наполнением и точной установкой.

Смотреть проект
Первый расчёт

Для первого расчёта не нужен готовый проект

Пришлите то, что уже есть: фото, размеры, планировку, PDF, визуализацию или короткое описание задачи. Этого достаточно, чтобы понять следующий шаг.

Фото помещения

Стена, ниша, комната, проём, входная зона или место будущей системы.

Размеры

Ширина, высота, глубина, расположение дверей, выступов и розеток.

Планировка

БТИ, план дизайнера, схема от руки, PDF или скрин из проекта.

Пример решения

Фото или картинка, которая нравится по формату, цвету или настроению.

Описание задачи

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

Старт проекта

С чего удобнее начать

Выберите сценарий: можно ответить на 4 вопроса, отправить фото в Telegram или прислать ТЗ на e-mail.

1

Есть только идея

Ответьте на 4 вопроса — поймём тип пространства, формат решения, стадию проекта и удобный способ связи.

Ответить на 4 вопроса
2

Есть фото или размеры

Пришлите стену, нишу, комнату или планировку — специалист подскажет, какой формат хранения реалистичен.

Отправить фото в Telegram
3

Есть проект или ТЗ

Отправьте PDF, планировку, визуализацию или техническое задание для предварительной оценки.

Отправить ТЗ на e-mail
Предварительная оценка

Стоимость зависит не только от размера

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

Размер и геометрия

Ширина, высота, глубина, ниши, углы, выступы, мансарды и нестандартные зоны.

Формат решения

Открытая система, корпусное хранение, закрытые фасады, двери, перегородки или комбинированный вариант.

Наполнение

Полки, штанги, ящики, обувные зоны, аксессуары, чемоданы и сезонное хранение.

Материалы и монтаж

Декоры, профили, фурнитура, подсветка, доставка, сборка и установка.

Процесс

От первого фото до готовой системы хранения

Понятный путь от первого обращения до готового решения в интерьере.

Вы присылаете фото, размеры или планировку

Можно начать с одного фото помещения или короткого описания задачи.

Уточняем задачу и формат хранения

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

Готовим проект и предварительную оценку

Показываем пропорции, наполнение, материалы и визуальную нагрузку.

Производим и устанавливаем

Изготавливаем элементы под проект, доставляем, монтируем и сдаём готовое решение.

Доверие

Почему нам доверяют проекты хранения

Более 20 лет опыта

Проектируем системы хранения с 2004 года и видим ошибки планировки до производства.

Индивидуальный проект

Решение создаётся под размеры, вещи, привычки и интерьер.

3D-проект до производства

Вы заранее видите расположение секций, наполнение, материалы и общий вид.

Производство и монтаж

Берём на себя консультацию, проектирование, изготовление и установку.

Сложные помещения

Работаем с нишами, углами, высокими потолками, мансардами и нестандартной геометрией.

Интеграция в интерьер

Подбираем материалы, свет, двери и перегородки под стиль пространства.

Детали

Продумываем не только хранение, но и ощущение пространства

Материалы, фурнитура, подсветка, двери, перегородки и внутреннее наполнение влияют не только на внешний вид, но и на ежедневное удобство: доступ к вещам, высоту хранения, свет в секциях и визуальную лёгкость интерьера.

Материалы

Материалы

Под стиль интерьера, нагрузку, формат хранения и желаемое визуальное ощущение.

Наполнение

Наполнение

Секции для одежды, обуви, аксессуаров, сумок и сезонных вещей.

Подсветка

Подсветка

Свет в открытых секциях, зонах обуви, аксессуаров и глубоких модулях.

Двери и перегородки

Двери и перегородки

Скрыть хранение, зонировать пространство или выделить гардеробную.

Когда обращаться

Когда стоит заказать индивидуальную систему хранения

Индивидуальное решение особенно полезно, когда нужно не просто поставить мебель, а заранее проверить планировку, удобство доступа, проходы, объём вещей и внешний вид системы в интерьере.

  • В доме или квартире не хватает организованного хранения.
  • Есть ниша, кладовая, мансарда, спальня или отдельная комната.
  • Нужна гардеробная комната под вещи, обувь и сезонное хранение.
  • Идёт ремонт, и хранение нужно заложить заранее.
  • Нужно объединить хранение, двери и перегородки.
  • Помещение нестандартное: углы, выступы, высокие потолки.
  • Есть планировка, дизайн-проект или техническое задание.
  • Нужно понять, какой формат будет удобен именно в вашем пространстве.
FAQ

Частые вопросы

С чего начинается работа над проектом?

С фото, размеров, планировки или описания задачи. Этого достаточно, чтобы понять формат решения и следующий шаг.

Можно получить предварительный расчёт без замера?

Да. Для первого разговора можно прислать фото помещения, размеры, планировку, PDF или короткое описание задачи.

Что прислать для начала?

Фото стены, ниши, комнаты или проёма, размеры, план БТИ, дизайн-проект, пример понравившегося решения или список задач хранения.

Можно не оставлять телефон?

Да. Можно указать Telegram, MAX или e-mail — ответим удобным способом. Телефон нужен только если вам комфортнее обсудить проект голосом.

Зачем нужен 3D-проект?

Чтобы заранее увидеть пропорции, наполнение, материалы и внешний вид системы до производства.

От чего зависит стоимость?

От размеров, формата решения, наполнения, материалов, подсветки, дверей, перегородок, доставки и монтажа.

Работаете ли вы с нестандартными помещениями?

Да. Проектируем решения для ниш, мансард, кладовых, углов, высоких потолков и сложной геометрии.

Можно отправить планировку или ТЗ на e-mail?

Да. Планировки, PDF, визуализации и технические задания можно отправить через e-mail-ссылку на сайте.

Какие решения можно заказать?

Гардеробные комнаты, открытые интерьерные системы, шкафы, двери-купе, раздвижные перегородки и нестандартную мебель для хранения.

Система хранения под интерьер
Следующий шаг

Начать можно с одного фото помещения

Пришлите фото, размеры, планировку или короткое описание задачи — мы посмотрим, какой формат хранения подойдёт, что важно учесть и какие данные нужны для предварительного расчёта.

.gm-lead-modal{ position:fixed; inset:0; z-index:999999; display:none; align-items:center; justify-content:center; padding:28px; background:rgba(0,0,0,.72); backdrop-filter:blur(10px); font-family:Manrope,Arial,sans-serif; } .gm-lead-modal.is-open{ display:flex; } .gm-lead-dialog{ width:min(920px,100%); max-height:calc(100vh — 56px); overflow:auto; background:#F7F2EA; color:#171717; border-radius:28px; box-shadow:0 34px 110px rgba(0,0,0,.48); position:relative; } .gm-lead-close{ position:absolute; top:18px; right:18px; width:42px; height:42px; border-radius:50%; border:1px solid rgba(0,0,0,.12); background:#fff; color:#171717; font-size:26px; line-height:1; cursor:pointer; z-index:3; } .gm-lead-grid{ display:grid; grid-template-columns:.88fr 1.12fr; min-height:560px; } .gm-lead-info{ padding:48px; background:#101010; color:#fff; display:flex; flex-direction:column; justify-content:center; } .gm-lead-kicker{ margin:0 0 16px; color:#C8AA78; font-size:13px; font-weight:700; } .gm-lead-info h2{ margin:0 0 18px; font-size:42px; line-height:1.04; letter-spacing:-.055em; } .gm-lead-info p{ margin:0; color:rgba(255,255,255,.72); font-size:16px; line-height:1.65; } .gm-lead-list{ margin:30px 0 0; padding:0; list-style:none; display:grid; gap:12px; color:rgba(255,255,255,.78); font-size:15px; } .gm-lead-list li{ display:grid; grid-template-columns:22px 1fr; gap:10px; } .gm-lead-list li:before{ content:»✓»; color:#C8AA78; font-weight:800; } .gm-lead-form-wrap{ padding:48px; display:flex; flex-direction:column; justify-content:center; } .gm-lead-form{ display:grid; gap:14px; } .gm-lead-field label{ display:block; margin:0 0 7px; color:#6A6258; font-size:13px; font-weight:700; } .gm-lead-field input, .gm-lead-field select, .gm-lead-field textarea{ width:100%; border:1px solid rgba(23,23,23,.14); border-radius:16px; background:#fff; color:#171717; padding:15px 16px; font:16px/1.3 Manrope,Arial,sans-serif; outline:none; } .gm-lead-field textarea{ min-height:104px; resize:vertical; } .gm-lead-field input:focus, .gm-lead-field select:focus, .gm-lead-field textarea:focus{ border-color:#B89667; box-shadow:0 0 0 3px rgba(184,150,103,.14); } .gm-lead-hp{ position:absolute!important; left:-9999px!important; opacity:0!important; pointer-events:none!important; } .gm-lead-agree{ display:grid; grid-template-columns:18px 1fr; gap:10px; align-items:start; color:#6A6258; font-size:12px; line-height:1.45; margin-top:2px; } .gm-lead-agree input{ margin-top:2px; } .gm-lead-agree a{ color:#171717; text-decoration:none; border-bottom:1px solid rgba(23,23,23,.25); } .gm-lead-submit{ min-height:52px; border:0; border-radius:999px; background:#B89667; color:#fff; font:700 15px/1 Manrope,Arial,sans-serif; cursor:pointer; margin-top:6px; } .gm-lead-submit:disabled{ opacity:.65; cursor:wait; } .gm-lead-note{ margin:12px 0 0; color:#6A6258; font-size:13px; line-height:1.45; text-align:center; } .gm-lead-note a{ color:#171717; text-decoration:none; border-bottom:1px solid rgba(23,23,23,.25); } .gm-lead-status{ display:none; margin-top:14px; padding:18px 20px 18px 54px; border-radius:16px; font-size:16px; font-weight:800; line-height:1.45; position:relative; box-shadow:0 14px 34px rgba(13,106,57,.18); } .gm-lead-status.is-visible{ display:block; } .gm-lead-status.is-success{ background:#DDF8E8; color:#073D22; border:2px solid #0F8A49; } .gm-lead-status.is-success:before{ content:»✓»; position:absolute; left:18px; top:50%; width:24px; height:24px; margin-top:-12px; border-radius:50%; background:#0F8A49; color:#fff; display:flex; align-items:center; justify-content:center; font-size:16px; font-weight:900; } .gm-lead-status.is-error{ background:#FFF0F0; color:#8A1F1F; } @media(max-width:760px){ .gm-lead-modal{ padding:12px; } .gm-lead-dialog{ border-radius:22px; max-height:calc(100vh — 24px); } .gm-lead-grid{ grid-template-columns:1fr; } .gm-lead-info, .gm-lead-form-wrap{ padding:30px 22px; } .gm-lead-info h2{ font-size:32px; } } (function(){ var modal = document.getElementById(‘gm-lead-modal’); var form = document.getElementById(‘gm-lead-form’); var status = document.getElementById(‘gm-lead-status’); var closeBtn = modal ? modal.querySelector(‘.gm-lead-close’) : null; var submitBtn = form ? form.querySelector(‘.gm-lead-submit’) : null; if(!modal || !form || !status || !closeBtn || !submitBtn) return; function setStatus(type,message){ status.className = ‘gm-lead-status is-visible ‘ + (type === ‘success’ ? ‘is-success’ : ‘is-error’); status.textContent = message; } function clearStatus(){ status.className = ‘gm-lead-status’; status.textContent = »; } function openModal(trigger){ clearStatus(); form.reset(); form.querySelector(‘[name=»consent»]’).checked = true; form.querySelector(‘[name=»landing_variant»]’).value = trigger.getAttribute(‘data-lead-variant’) || »; form.querySelector(‘[name=»button_label»]’).value = trigger.getAttribute(‘data-lead-button’) || trigger.textContent.trim(); form.querySelector(‘[name=»page_url»]’).value = window.location.href; form.querySelector(‘[name=»started_at»]’).value = Math.floor(Date.now() / 1000).toString(); modal.classList.add(‘is-open’); modal.setAttribute(‘aria-hidden’,’false’); document.documentElement.style.overflow = ‘hidden’; setTimeout(function(){ var phone = form.querySelector(‘[name=»phone»]’); if(phone) phone.focus(); },100); } function closeModal(){ modal.classList.remove(‘is-open’); modal.setAttribute(‘aria-hidden’,’true’); document.documentElement.style.overflow = »; } function contactLooksValid(value){ return (value || »).trim().length >= 3; } document.addEventListener(‘click’,function(event){ var trigger = event.target.closest(‘.gm-lead-open’); if(!trigger) return; event.preventDefault(); openModal(trigger); }); closeBtn.addEventListener(‘click’,closeModal); modal.addEventListener(‘click’,function(event){ if(event.target === modal){ closeModal(); } }); document.addEventListener(‘keydown’,function(event){ if(event.key === ‘Escape’ && modal.classList.contains(‘is-open’)){ closeModal(); } }); form.addEventListener(‘submit’,function(event){ event.preventDefault(); clearStatus(); var phone = form.querySelector(‘[name=»phone»]’).value; if(!contactLooksValid(phone)){ setStatus(‘error’,’Укажите телефон, Telegram или e-mail, чтобы мы могли ответить.’); return; } if(!form.querySelector(‘[name=»consent»]’).checked){ setStatus(‘error’,’Нужно согласие на обработку персональных данных.’); return; } submitBtn.disabled = true; submitBtn.textContent = ‘Отправляем…’; fetch(‘/gm-lead/submit.php’,{ method:’POST’, body:new FormData(form), credentials:’same-origin’ }) .then(function(response){ return response.json().catch(function(){ throw new Error(‘Некорректный ответ сервера.’); }); }) .then(function(data){ if(data && data.ok){ setStatus(‘success’,data.message || ‘Спасибо. Заявка отправлена. Мы ответим удобным для вас способом.’); form.reset(); }else{ setStatus(‘error’,(data && data.message) ? data.message : ‘Не удалось отправить заявку.’); } }) .catch(function(){ setStatus(‘error’,’Не удалось отправить заявку. Попробуйте ещё раз или позвоните нам: +7 (495) 220-0304.’); }) .finally(function(){ submitBtn.disabled = false; submitBtn.textContent = ‘Отправить на предварительный расчёт’; }); }); })(); .gm-rq-modal{ position:fixed; inset:0; z-index:999999; display:none; align-items:center; justify-content:center; padding:28px; background:rgba(0,0,0,.72); backdrop-filter:blur(10px); font-family:Manrope,Arial,sans-serif; } .gm-rq-modal.is-open{ display:flex; } .gm-rq-dialog{ width:min(960px,100%); height:min(820px,calc(100vh — 56px)); background:#101010; color:#171717; border-radius:28px; box-shadow:0 34px 110px rgba(0,0,0,.50); position:relative; overflow:hidden; display:grid; grid-template-rows:auto 1fr; } .gm-rq-head{ min-height:88px; padding:22px 76px 18px 30px; background:#101010; color:#fff; border-bottom:1px solid rgba(255,255,255,.10); } .gm-rq-kicker{ margin:0 0 6px; color:#C8AA78; font-size:13px; font-weight:700; } .gm-rq-title{ margin:0; font-size:28px; line-height:1.1; letter-spacing:-.045em; font-weight:700; } .gm-rq-subtitle{ margin:8px 0 0; max-width:690px; color:rgba(255,255,255,.68); font-size:14px; line-height:1.5; } .gm-rq-close{ position:absolute; top:20px; right:22px; width:42px; height:42px; border-radius:50%; border:1px solid rgba(255,255,255,.20); background:#fff; color:#171717; font-size:26px; line-height:1; cursor:pointer; z-index:3; } .gm-rq-frame-wrap{ position:relative; width:100%; height:100%; min-height:0; background:#151515; overflow:auto; -webkit-overflow-scrolling:touch; scrollbar-width:thin; scrollbar-color:#B89667 #101010; } .gm-rq-frame-wrap::-webkit-scrollbar{ width:10px; } .gm-rq-frame-wrap::-webkit-scrollbar-track{ background:#101010; } .gm-rq-frame-wrap::-webkit-scrollbar-thumb{ background:#B89667; border-radius:999px; border:2px solid #101010; } .gm-rq-frame{ display:block; width:100%; height:1500px; min-height:100%; border:0; background:#151515; } .gm-rq-loading{ position:absolute; inset:0; display:grid; place-items:center; background:#151515; color:rgba(255,255,255,.78); font-size:14px; z-index:2; opacity:1; visibility:visible; transition:opacity .26s ease, visibility .26s ease; } .gm-rq-loading.is-hidden{ opacity:0; visibility:hidden; pointer-events:none; } .gm-rq-loading-card{ width:min(420px,calc(100% — 44px)); min-height:170px; border-radius:24px; background:rgba(255,255,255,.045); border:1px solid rgba(255,255,255,.10); display:grid; place-items:center; padding:28px; text-align:center; } .gm-rq-loading-inner{ display:grid; gap:14px; justify-items:center; } .gm-rq-loading-dot{ width:34px; height:34px; border-radius:50%; border:3px solid rgba(255,255,255,.18); border-top-color:#B89667; animation:gmRqSpin .8s linear infinite; } .gm-rq-loading-title{ color:#fff; font-size:16px; font-weight:700; } .gm-rq-loading-text{ max-width:290px; color:rgba(255,255,255,.62); font-size:13px; line-height:1.5; } @keyframes gmRqSpin{ to{transform:rotate(360deg);} } @media(max-width:760px){ .gm-rq-modal{ padding:12px; } .gm-rq-dialog{ height:calc(100vh — 24px); border-radius:22px; } .gm-rq-head{ min-height:104px; padding:22px 68px 18px 22px; } .gm-rq-title{ font-size:24px; } .gm-rq-subtitle{ font-size:13px; } .gm-rq-frame{ height:1600px; } } (function(){ var modal = document.getElementById(‘gm-rq-modal’); var frame = document.getElementById(‘gm-rq-frame’); var frameWrap = document.getElementById(‘gm-rq-frame-wrap’); var title = document.getElementById(‘gm-rq-title’); var subtitle = document.getElementById(‘gm-rq-subtitle’); var loading = document.getElementById(‘gm-rq-loading’); var closeBtn = modal ? modal.querySelector(‘.gm-rq-close’) : null; var loadTimer = null; var currentSrc = »; if(!modal || !frame || !frameWrap || !title || !subtitle || !loading || !closeBtn) return; function showLoading(){ loading.classList.remove(‘is-hidden’); } function hideLoading(){ loading.classList.add(‘is-hidden’); } function openModal(trigger){ var src = trigger.getAttribute(‘data-rq-src’) || ‘/rqchat1-1.html’; var modalTitle = trigger.getAttribute(‘data-rq-title’) || ‘Обсудить задачу’; var modalSubtitle = trigger.getAttribute(‘data-rq-subtitle’) || ‘Ответьте на несколько вопросов — мы уточним задачу и предложим подходящий сценарий хранения.’; title.textContent = modalTitle; subtitle.textContent = modalSubtitle; frameWrap.scrollTop = 0; showLoading(); modal.classList.add(‘is-open’); modal.setAttribute(‘aria-hidden’,’false’); document.documentElement.style.overflow = ‘hidden’; clearTimeout(loadTimer); if(currentSrc !== src || frame.src === ‘about:blank’){ currentSrc = src; frame.src = src; } /* RQChat может отдать load раньше, чем виджет полностью отрисован. Поэтому заглушка держится минимум 700 мс и максимум 2200 мс. */ loadTimer = setTimeout(hideLoading, 2200); } function closeModal(){ modal.classList.remove(‘is-open’); modal.setAttribute(‘aria-hidden’,’true’); document.documentElement.style.overflow = »; clearTimeout(loadTimer); /* iframe НЕ сбрасываем, чтобы повторное открытие было быстрым. Если нужно начинать диалог заново каждый раз — это изменим отдельной версией. */ } document.addEventListener(‘click’,function(event){ var trigger = event.target.closest(‘.gm-rq-discuss-open’); if(!trigger) return; event.preventDefault(); openModal(trigger); }); frame.addEventListener(‘load’,function(){ if(frame.src && frame.src !== ‘about:blank’){ clearTimeout(loadTimer); loadTimer = setTimeout(hideLoading, 700); } }); closeBtn.addEventListener(‘click’,closeModal); modal.addEventListener(‘click’,function(event){ if(event.target === modal){ closeModal(); } }); document.addEventListener(‘keydown’,function(event){ if(event.key === ‘Escape’ && modal.classList.contains(‘is-open’)){ closeModal(); } }); })(); .gm-pfm-modal{ position:fixed; inset:0; z-index:999999; display:none; align-items:center; justify-content:center; padding:24px; background:rgba(0,0,0,.76); backdrop-filter:blur(10px); font-family:Manrope,Arial,sans-serif; } .gm-pfm-modal.is-open{ display:flex; } .gm-pfm-dialog{ width:min(752px,100%); height:min(776px,calc(100vh — 48px)); background:#101010; color:#fff; border-radius:24px; box-shadow:0 34px 110px rgba(0,0,0,.54); position:relative; overflow:hidden; display:grid; grid-template-rows:auto 1fr; } .gm-pfm-close{ position:absolute; top:16px; right:16px; width:42px; height:42px; border-radius:50%; border:1px solid rgba(255,255,255,.20); background:#fff; color:#171717; font-size:26px; line-height:1; cursor:pointer; z-index:10; } .gm-pfm-top{ background:#101010; border-bottom:1px solid rgba(255,255,255,.10); padding:16px 70px 14px 18px; } .gm-pfm-form{ display:grid; gap:8px; } .gm-pfm-form-row{ display:grid; grid-template-columns:1fr 1fr 1.35fr auto; gap:10px; align-items:end; } .gm-pfm-field label{ display:block; margin:0 0 6px; color:rgba(255,255,255,.62); font-size:11px; font-weight:700; } .gm-pfm-field input{ width:100%; height:38px; border:1px solid rgba(255,255,255,.14); border-radius:14px; background:#fff; color:#171717; padding:0 14px; font:14px/1.2 Manrope,Arial,sans-serif; outline:none; } .gm-pfm-field input:focus{ border-color:#B89667; box-shadow:0 0 0 3px rgba(184,150,103,.18); } .gm-pfm-submit{ height:38px; min-width:128px; border:0; border-radius:999px; background:#B89667; color:#fff; font:700 14px/1 Manrope,Arial,sans-serif; cursor:pointer; padding:0 18px; white-space:nowrap; } .gm-pfm-submit:disabled{ opacity:.65; cursor:wait; } .gm-pfm-hp{ position:absolute!important; left:-9999px!important; opacity:0!important; pointer-events:none!important; } .gm-pfm-agree{ display:grid; grid-template-columns:16px 1fr; gap:8px; align-items:start; color:rgba(255,255,255,.56); font-size:10px; line-height:1.35; } .gm-pfm-agree input{ margin-top:1px; } .gm-pfm-agree a{ color:rgba(255,255,255,.78); text-decoration:none; border-bottom:1px solid rgba(255,255,255,.25); } .gm-pfm-status{ display:none; padding:18px 20px 18px 54px; border-radius:16px; font-size:16px; line-height:1.45; position:relative; } .gm-pfm-status.is-visible{ display:block; } .gm-pfm-status.is-success{ background:#DDF8E8; color:#073D22; border:2px solid #0F8A49; box-shadow:0 14px 34px rgba(13,106,57,.18); font-weight:800; } .gm-pfm-status.is-success:before{ content:»✓»; position:absolute; left:18px; top:50%; width:24px; height:24px; margin-top:-12px; border-radius:50%; background:#0F8A49; color:#fff; display:flex; align-items:center; justify-content:center; font-size:16px; font-weight:900; } .gm-pfm-status.is-error{ background:#FFF0F0; color:#8A1F1F; } .gm-pfm-body{ min-height:0; overflow:auto; padding:18px; background:#151515; scrollbar-width:thin; scrollbar-color:#B89667 #101010; } .gm-pfm-body::-webkit-scrollbar{ width:10px; } .gm-pfm-body::-webkit-scrollbar-track{ background:#101010; } .gm-pfm-body::-webkit-scrollbar-thumb{ background:#B89667; border-radius:999px; border:2px solid #101010; } .gm-pfm-viewer{ position:relative; } .gm-pfm-media{ position:relative; aspect-ratio:16 / 9; overflow:hidden; border-radius:22px; background:#111; box-shadow:0 18px 44px rgba(0,0,0,.22); transform:translateZ(0); } .gm-pfm-media:before{ content:»»; position:absolute; inset:0; z-index:3; pointer-events:none; background: linear-gradient(180deg,rgba(0,0,0,.10) 0%,rgba(0,0,0,.42) 100%), linear-gradient(90deg,rgba(0,0,0,.58) 0%,rgba(0,0,0,.30) 36%,rgba(0,0,0,.08) 58%,rgba(0,0,0,0) 78%); } .gm-pfm-media.is-playing:before{ opacity:.18; } .gm-pfm-visual{ position:absolute; inset:0; z-index:1; background:#111; overflow:hidden; } .gm-pfm-image, .gm-pfm-iframe{ display:block; width:100%; height:100%; border:0; background:#111; } .gm-pfm-image{ object-fit:cover; } .gm-pfm-iframe{ position:absolute; inset:0; } .gm-pfm-video-loading{ position:absolute; inset:0; z-index:7; display:none; align-items:center; justify-content:center; background:rgba(12,12,12,.72); backdrop-filter:blur(4px); pointer-events:none; } .gm-pfm-media.is-video-loading .gm-pfm-video-loading{ display:flex; } .gm-pfm-video-loading-card{ display:grid; justify-items:center; gap:12px; padding:22px 26px; border-radius:22px; background:rgba(16,16,16,.78); border:1px solid rgba(255,255,255,.12); box-shadow:0 18px 44px rgba(0,0,0,.38); color:#fff; text-align:center; } .gm-pfm-video-spinner{ width:36px; height:36px; border-radius:50%; border:3px solid rgba(255,255,255,.18); border-top-color:#B89667; animation:gmPfmSpin .8s linear infinite; } .gm-pfm-video-loading-title{ font-size:15px; font-weight:700; line-height:1.2; } .gm-pfm-video-loading-text{ color:rgba(255,255,255,.66); font-size:12px; line-height:1.35; } @keyframes gmPfmSpin{ to{transform:rotate(360deg);} } .gm-pfm-overlay{ position:absolute; inset:0; z-index:4; display:flex; flex-direction:column; justify-content:space-between; padding:18px; pointer-events:none; } .gm-pfm-banner{ display:flex; justify-content:center; } .gm-pfm-banner-inner{ display:inline-flex; align-items:center; justify-content:center; max-width:92%; padding:11px 20px; border-radius:18px; background:linear-gradient(180deg,rgba(0,0,0,.58) 0%,rgba(0,0,0,.36) 100%); backdrop-filter:blur(8px); box-shadow:0 10px 26px rgba(0,0,0,.22); color:#fff; font-size:21px; line-height:1.08; font-weight:800; letter-spacing:.01em; text-transform:uppercase; text-align:center; text-shadow:0 2px 10px rgba(0,0,0,.24); } .gm-pfm-bottom-row{ display:flex; align-items:flex-end; justify-content:flex-end; gap:18px; width:100%; } .gm-pfm-center-video{ position:absolute; left:26px; bottom:82px; top:auto; transform:none; z-index:5; pointer-events:none; transition:opacity .24s ease, transform .24s ease, bottom .24s ease; } .gm-pfm-media.is-playing .gm-pfm-center-video{ opacity:0; visibility:hidden; pointer-events:none; transform:translateY(8px); } .gm-pfm-media.is-playing .gm-pfm-play{ pointer-events:none; } .gm-pfm-play{ pointer-events:auto; display:inline-flex; align-items:center; gap:14px; text-decoration:none; color:#fff; cursor:pointer; transition:transform .2s ease,box-shadow .2s ease,background .2s ease,border-color .2s ease,opacity .2s ease,padding .2s ease; padding:14px 20px 14px 16px; border:0; border-radius:22px; background:rgba(24,26,30,.90); backdrop-filter:blur(10px); box-shadow:0 14px 32px rgba(0,0,0,.32); font-size:15px; line-height:1; font-weight:700; } .gm-pfm-play:hover{ transform:translateY(-2px); background:rgba(32,35,40,.96); } .gm-pfm-play-ico{ width:58px; height:40px; min-width:58px; border-radius:12px; background:#ff0000; display:flex; align-items:center; justify-content:center; box-shadow:0 8px 18px rgba(255,0,0,.28); } .gm-pfm-play-ico svg{ width:18px; height:18px; fill:#fff; margin-left:2px; } .gm-pfm-play-text{ display:flex; flex-direction:column; align-items:flex-start; gap:4px; } .gm-pfm-play-kicker{ font-size:11px; line-height:1; font-weight:600; letter-spacing:.08em; text-transform:uppercase; color:rgba(255,255,255,.58); } .gm-pfm-play-label{ font-size:16px; line-height:1; font-weight:700; color:#fff; } .gm-pfm-caption{ max-width:360px; text-align:right; margin-left:auto; } .gm-pfm-slide-title{ margin:0 0 10px; font-size:20px; line-height:1.02; font-weight:700; letter-spacing:-.03em; color:#fff; text-shadow:0 2px 12px rgba(0,0,0,.26); } .gm-pfm-slide-desc{ margin:0; font-size:12px; line-height:1.42; color:rgba(255,255,255,.78); text-shadow:0 2px 10px rgba(0,0,0,.24); } .gm-pfm-nav, .gm-pfm-thumb-nav{ width:58px; height:58px; min-width:58px; border:0; border-radius:50%; background:linear-gradient(180deg,#B89667 0%,#8F692C 100%); box-shadow:0 10px 24px rgba(184,138,59,.34); display:flex; align-items:center; justify-content:center; cursor:pointer; padding:0; transition:transform .2s ease,box-shadow .2s ease,opacity .2s ease; } .gm-pfm-nav svg, .gm-pfm-thumb-nav svg{ width:22px; height:22px; fill:#fff; } .gm-pfm-nav{ position:absolute; top:50%; transform:translateY(-50%); z-index:6; } .gm-pfm-nav:hover{ transform:translateY(calc(-50% — 1px)); } .gm-pfm-nav—prev{ left:12px; } .gm-pfm-nav—next{ right:12px; } .gm-pfm-dots{ display:flex; align-items:center; justify-content:center; gap:8px; padding:12px 0 0; } .gm-pfm-dot{ width:8px; height:8px; padding:0; border:0; border-radius:50%; background:rgba(255,255,255,.24); cursor:pointer; transition:transform .2s ease,background .2s ease; } .gm-pfm-dot.is-active{ background:#d0a35a; transform:scale(1.12); } .gm-pfm-thumbs-wrap{ position:relative; margin-top:12px; padding:0 36px; } .gm-pfm-thumbs-viewport{ overflow:hidden; width:100%; } .gm-pfm-thumbs{ display:flex; gap:10px; transition:transform .28s ease; will-change:transform; } .gm-pfm-thumb{ flex:0 0 100px; width:100px; padding:0; border:0; background:none; cursor:pointer; color:#fff; text-align:left; } .gm-pfm-thumb-card{ display:flex; flex-direction:column; overflow:hidden; border-radius:14px; border:2px solid rgba(255,255,255,.08); background:rgba(255,255,255,.03); transition:border-color .2s ease,transform .2s ease,box-shadow .2s ease; } .gm-pfm-thumb:hover .gm-pfm-thumb-card{ transform:translateY(-2px); box-shadow:0 10px 18px rgba(0,0,0,.18); } .gm-pfm-thumb.is-active .gm-pfm-thumb-card{ border-color:#B89667; box-shadow:0 10px 18px rgba(184,138,59,.16); } .gm-pfm-thumb-image{ display:block; width:100%; height:78px; object-fit:cover; background:#111; } .gm-pfm-thumb-body{ padding:7px 8px 8px; } .gm-pfm-thumb-title{ margin:0; font-size:10px; line-height:1.2; font-weight:700; color:rgba(255,255,255,.96); display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:24px; } .gm-pfm-thumb-desc{ margin:4px 0 0; font-size:8px; line-height:1.28; color:rgba(255,255,255,.74); display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:20px; } .gm-pfm-thumb-nav{ position:absolute; top:50%; transform:translateY(-50%); z-index:6; } .gm-pfm-thumb-nav:hover{ transform:translateY(calc(-50% — 1px)); } .gm-pfm-thumb-nav—prev{ left:0; } .gm-pfm-thumb-nav—next{ right:0; } .gm-pfm-thumb-nav.is-disabled{ opacity:.35; cursor:default; } /* V3.3: убраны нижние стрелки миниатюр */ .gm-pfm-thumb-nav{ display:none !important; } .gm-pfm-thumbs-wrap{ padding:0 !important; } @media(max-width:980px){ .gm-pfm-dialog{ width:min(94vw,752px); height:min(88vh,776px); } .gm-pfm-form-row{ grid-template-columns:1fr 1fr; } .gm-pfm-submit{ width:100%; } } @media(max-width:760px){ .gm-pfm-modal{ padding:12px; } .gm-pfm-dialog{ width:100%; height:calc(100vh — 24px); border-radius:22px; } .gm-pfm-top{ padding:18px 62px 14px 16px; } .gm-pfm-form-row{ grid-template-columns:1fr; } .gm-pfm-body{ padding:14px; } .gm-pfm-media{ aspect-ratio:1 / 1.04; border-radius:18px; } .gm-pfm-overlay{ padding:14px; } .gm-pfm-center-video{ left:16px; bottom:78px; } .gm-pfm-media.is-playing .gm-pfm-center-video{ transform:translateY(8px); } .gm-pfm-banner-inner{ max-width:100%; padding:10px 14px; border-radius:14px; font-size:15px; line-height:1.14; } .gm-pfm-bottom-row{ align-items:flex-end; justify-content:flex-end; } .gm-pfm-caption{ max-width:100%; text-align:right; } .gm-pfm-play{ padding:12px 16px 12px 14px; } .gm-pfm-play-ico{ width:52px; height:36px; min-width:52px; } .gm-pfm-play-label{ font-size:14px; } .gm-pfm-slide-title{ font-size:18px; } .gm-pfm-slide-desc{ font-size:12px; line-height:1.36; } .gm-pfm-nav, .gm-pfm-thumb-nav{ width:50px; height:50px; min-width:50px; } .gm-pfm-thumbs-wrap{ padding:0 26px; } .gm-pfm-thumb{ flex-basis:88px; width:88px; } .gm-pfm-thumb-image{ height:70px; } } /* GM HOME V7.1: readable e-mail CTA + CRM mail marker */ .gm-home-section-light .gm-site-mail-link, .gm-home-section-cream .gm-site-mail-link{ background:#fff!important; color:var(—gm-dark)!important; border-color:rgba(23,23,23,.16)!important; box-shadow:0 14px 34px rgba(26,22,18,.08); } .gm-home-section-light .gm-site-mail-link:hover, .gm-home-section-cream .gm-site-mail-link:hover{ background:var(—gm-dark)!important; color:#fff!important; border-color:var(—gm-dark)!important; } .gm-home-start .gm-site-mail-link{ background:transparent!important; color:#fff!important; border-color:rgba(255,255,255,.34)!important; box-shadow:none!important; } .gm-home-start .gm-site-mail-link:hover{ background:#fff!important; color:var(—gm-dark)!important; border-color:#fff!important; } (function(){ var modal = document.getElementById(‘gm-pfm-modal’); if(!modal) return; var items = [ {image:’https://garderobmaster.ru/wp-content/uploads/2026/03/IMG_20251220_202041.webp’,videoId:’vplvzluzwczsjfnohbwg’,title:’Гардеробная МДФ с покраской RAL’,desc:’Гардеробная МДФ с покраской RAL. Врезеровка, капители, картинные фасады, эскиз заказчика. Дизайн-проект GarderobeMaster, 2026 год.’}, {image:’https://garderobmaster.ru/wp-content/uploads/2026/03/2-scaled.webp’,videoId:’vplvo44vucvj4ts6wcsm’,title:’Гардеробная система Vitra Black’,desc:’Гардеробная система Vitra Black, материал МДФ EGGER с текстурой древесины, фурнитура Blum. Дизайн GarderobeMaster, 2026.’}, {image:’https://garderobmaster.ru/wp-content/uploads/2026/03/3-scaled.webp’,videoId:’vplvkmfow3apvx2qtlai’,title:’Гардеробная система Vitra Black’,desc:’Гардеробная система Vitra Black с дверями купе и отсеком для стиральной машины.’}, {image:’https://garderobmaster.ru/wp-content/uploads/2026/03/4-1-scaled.webp’,videoId:’vplvbaimwjvtfe5x5h7q’,title:’Гардеробная система Vitra Black’,desc:’Гардеробная система Vitra Black с сейфом и выдвижной гладильной доской. ЛДСП EGGER.’}, {image:’https://garderobmaster.ru/wp-content/uploads/2026/03/6-scaled.jpg’,videoId:’vplv6ee5wib66wtbuosr’,title:’Гардеробная классический шкаф’,desc:’Гардеробная классический шкаф, материал МДФ, окрас эмалью по RAL, фурнитура Blum. Дизайн GarderobeMaster, 2026.’}, {image:’https://garderobmaster.ru/wp-content/uploads/2026/03/8-scaled.jpg’,videoId:’vplvzknd7guzyf7mhqey’,title:’Гардеробная классический шкаф’,desc:’Гардеробная классический шкаф, материал ЛДСП EGGER текстура дерево, фурнитура Blum. Дизайн GarderobeMaster, 2026.’}, {image:’https://garderobmaster.ru/wp-content/uploads/2026/03/9-scaled.jpg’,videoId:’vplv3q6gs3s5epvjlrvr’,title:’Сетчатая гардеробная система’,desc:’Сетчатая гардеробная система. Дизайн GarderobeMaster, 2026.’}, {image:’https://garderobmaster.ru/wp-content/uploads/2026/03/10-scaled.jpg’,videoId:’vplvmyepnatcafi6djhf’,title:’Гардеробная система Vitra Black’,desc:’Гардеробная система Vitra Black, материал МДФ EGGER с текстурой древесины, фурнитура Blum. Дизайн GarderobeMaster, 2026.’}, {image:’https://garderobmaster.ru/wp-content/uploads/2026/03/12-scaled.jpg’,videoId:’vplv2y5mcjwnaee7n56n’,title:’Гардеробная классический шкаф’,desc:’Гардеробная классический шкаф, материал МДФ, окрас эмалью по RAL, фурнитура Blum. Дизайн GarderobeMaster, 2026.’} ]; var currentIndex = 0; var thumbOffset = 0; var isPlaying = false; var userEditedComment = false; var portfolioRendered = false; var body = modal.querySelector(‘.gm-pfm-body’); var closeBtn = modal.querySelector(‘.gm-pfm-close’); var media = document.getElementById(‘gmPfmMedia’); var visual = document.getElementById(‘gmPfmVisual’); var videoLoading = document.getElementById(‘gmPfmVideoLoading’); var videoLoadTimer = null; var title = document.getElementById(‘gmPfmTitle’); var desc = document.getElementById(‘gmPfmDesc’); var playBtn = document.getElementById(‘gmPfmPlay’); var playLabel = playBtn.querySelector(‘.gm-pfm-play-label’); var dotsWrap = document.getElementById(‘gmPfmDots’); var thumbsWrap = document.getElementById(‘gmPfmThumbs’); var thumbsViewport = modal.querySelector(‘.gm-pfm-thumbs-viewport’); var prevBtn = modal.querySelector(‘.gm-pfm-nav—prev’); var nextBtn = modal.querySelector(‘.gm-pfm-nav—next’); var prevThumbBtn = modal.querySelector(‘.gm-pfm-thumb-nav—prev’); var nextThumbBtn = modal.querySelector(‘.gm-pfm-thumb-nav—next’); var form = document.getElementById(‘gmPfmForm’); var status = document.getElementById(‘gmPfmStatus’); var submitBtn = form.querySelector(‘.gm-pfm-submit’); var commentField = document.getElementById(‘gm-pfm-comment’); var phoneField = document.getElementById(‘gm-pfm-phone’); function esc(str){ return String(str || »).replace(/&/g,’&’).replace(//g,’>’).replace(/»/g,’"’); } function playerSrc(id){ return ‘https://runtime.video.cloud.yandex.net/player/video/’ + encodeURIComponent(id) + ‘?autoplay=1&mute=0’; } function renderImage(item){ visual.innerHTML = ‘' + esc(item.title) + '‘; } function showVideoLoading(){ clearTimeout(videoLoadTimer); media.classList.add(‘is-video-loading’); } function hideVideoLoading(){ media.classList.remove(‘is-video-loading’); } function renderPlayer(item){ showVideoLoading(); var iframe = document.createElement(‘iframe’); iframe.className = ‘gm-pfm-iframe’; iframe.src = playerSrc(item.videoId); iframe.allow = ‘autoplay; fullscreen; accelerometer; gyroscope; picture-in-picture; encrypted-media’; iframe.allowFullscreen = true; iframe.loading = ‘eager’; iframe.scrolling = ‘no’; iframe.frameBorder = ‘0’; iframe.title = item.title || ‘Видео проекта’; iframe.addEventListener(‘load’,function(){ clearTimeout(videoLoadTimer); videoLoadTimer = setTimeout(hideVideoLoading,900); }); visual.innerHTML = »; visual.appendChild(iframe); /* На случай, если load от плеера не сработает или сработает некорректно. */ videoLoadTimer = setTimeout(hideVideoLoading,6500); } function setPlayingState(state){ isPlaying = !!state; media.classList.toggle(‘is-playing’,isPlaying); playLabel.textContent = isPlaying ? ‘Остановить видео’ : ‘Смотреть видео’; playBtn.setAttribute(‘aria-label’,isPlaying ? ‘Остановить видео’ : ‘Смотреть видео’); } function renderDots(){ dotsWrap.innerHTML = items.map(function(item,i){ return ‘‘; }).join(»); Array.prototype.forEach.call(dotsWrap.querySelectorAll(‘.gm-pfm-dot’),function(dot,i){ dot.addEventListener(‘click’,function(){ goTo(i); }); }); } function renderThumbs(){ thumbsWrap.innerHTML = items.map(function(item,i){ var loadingMode = i < 4 ? 'eager' : 'lazy'; return '' + '‘; }).join(»); Array.prototype.forEach.call(thumbsWrap.querySelectorAll(‘.gm-pfm-thumb’),function(btn,i){ btn.addEventListener(‘click’,function(e){ e.preventDefault(); goTo(i); }); }); } function updateActiveStates(){ Array.prototype.forEach.call(thumbsWrap.querySelectorAll(‘.gm-pfm-thumb’),function(btn,i){ btn.classList.toggle(‘is-active’,i === currentIndex); btn.setAttribute(‘aria-selected’,i === currentIndex ? ‘true’ : ‘false’); }); Array.prototype.forEach.call(dotsWrap.querySelectorAll(‘.gm-pfm-dot’),function(btn,i){ btn.classList.toggle(‘is-active’,i === currentIndex); }); } function getThumbStep(){ var firstThumb = thumbsWrap.querySelector(‘.gm-pfm-thumb’); if(!firstThumb) return 120; var thumbWidth = firstThumb.getBoundingClientRect().width; var styles = window.getComputedStyle(thumbsWrap); var gap = parseFloat(styles.columnGap || styles.gap || 10) || 10; return thumbWidth + gap; } function getMaxThumbOffset(){ return Math.max(0,thumbsWrap.scrollWidth — thumbsViewport.clientWidth); } function updateThumbButtons(){ var maxOffset = getMaxThumbOffset(); if(prevThumbBtn) prevThumbBtn.classList.toggle(‘is-disabled’,thumbOffset = maxOffset — 1); } function updateThumbTrack(){ var maxOffset = getMaxThumbOffset(); if(thumbOffset maxOffset) thumbOffset = maxOffset; thumbsWrap.style.transform = ‘translateX(‘ + (-thumbOffset) + ‘px)’; updateThumbButtons(); } function ensureThumbVisible(index){ var thumbs = thumbsWrap.querySelectorAll(‘.gm-pfm-thumb’); var target = thumbs[index]; if(!target) return; var thumbLeft = target.offsetLeft; var thumbRight = thumbLeft + target.offsetWidth; var visibleLeft = thumbOffset; var visibleRight = thumbOffset + thumbsViewport.clientWidth; var gap = 10; if(thumbLeft visibleRight) thumbOffset = thumbRight — thumbsViewport.clientWidth + gap; updateThumbTrack(); } function selectedComment(){ return ‘Интересует похожее решение: ‘ + items[currentIndex].title; } function updateSelectedProject(){ form.querySelector(‘[name=»button_label»]’).value = ‘Портфолио: ‘ + items[currentIndex].title; if(!userEditedComment){ commentField.value = selectedComment(); } } function ensurePortfolioRendered(){ if(portfolioRendered) return; renderDots(); renderThumbs(); portfolioRendered = true; } function renderHero(){ var item = items[currentIndex]; renderImage(item); title.textContent = item.title; desc.textContent = item.desc; setPlayingState(false); updateActiveStates(); ensureThumbVisible(currentIndex); updateSelectedProject(); } function goTo(index){ currentIndex = (index + items.length) % items.length; renderHero(); } function playCurrent(){ renderPlayer(items[currentIndex]); setPlayingState(true); } function stopVideo(){ clearTimeout(videoLoadTimer); hideVideoLoading(); renderImage(items[currentIndex]); setPlayingState(false); } function setStatus(type,message){ status.className = ‘gm-pfm-status is-visible ‘ + (type === ‘success’ ? ‘is-success’ : ‘is-error’); status.textContent = message; } function clearStatus(){ status.className = ‘gm-pfm-status’; status.textContent = »; } function contactLooksValid(value){ return (value || »).trim().length >= 3; } function openModal(){ modal.classList.add(‘is-open’); modal.setAttribute(‘aria-hidden’,’false’); document.documentElement.style.overflow = ‘hidden’; body.scrollTop = 0; clearStatus(); form.querySelector(‘[name=»consent»]’).checked = true; form.querySelector(‘[name=»landing_variant»]’).value = ‘portfolio-modal’; form.querySelector(‘[name=»page_url»]’).value = window.location.href; form.querySelector(‘[name=»started_at»]’).value = Math.floor(Date.now() / 1000).toString(); ensurePortfolioRendered(); renderHero(); setTimeout(function(){ updateThumbTrack(); ensureThumbVisible(currentIndex); },60); } function closeModal(){ modal.classList.remove(‘is-open’); modal.setAttribute(‘aria-hidden’,’true’); document.documentElement.style.overflow = »; if(isPlaying) stopVideo(); } document.addEventListener(‘click’,function(e){ var trigger = e.target.closest(‘.gm-portfolio-open’); if(!trigger) return; e.preventDefault(); openModal(); }); closeBtn.addEventListener(‘click’,closeModal); modal.addEventListener(‘click’,function(e){ if(e.target === modal) closeModal(); }); document.addEventListener(‘keydown’,function(e){ if(!modal.classList.contains(‘is-open’)) return; if(e.key === ‘Escape’) closeModal(); if(e.key === ‘ArrowLeft’) goTo(currentIndex — 1); if(e.key === ‘ArrowRight’) goTo(currentIndex + 1); }); playBtn.addEventListener(‘click’,function(){ if(isPlaying) stopVideo(); else playCurrent(); }); prevBtn.addEventListener(‘click’,function(){ goTo(currentIndex — 1); }); nextBtn.addEventListener(‘click’,function(){ goTo(currentIndex + 1); }); if(prevThumbBtn){ prevThumbBtn.addEventListener(‘click’,function(){ if(prevThumbBtn.classList.contains(‘is-disabled’)) return; thumbOffset -= getThumbStep() * 4; updateThumbTrack(); }); } if(nextThumbBtn){ nextThumbBtn.addEventListener(‘click’,function(){ if(nextThumbBtn.classList.contains(‘is-disabled’)) return; thumbOffset += getThumbStep() * 4; updateThumbTrack(); }); } commentField.addEventListener(‘input’,function(){ userEditedComment = true; }); form.addEventListener(‘submit’,function(e){ e.preventDefault(); clearStatus(); var phone = form.querySelector(‘[name=»phone»]’).value; if(!contactLooksValid(phone)){ setStatus(‘error’,’Укажите телефон, Telegram или e-mail, чтобы мы могли ответить.’); return; } if(!form.querySelector(‘[name=»consent»]’).checked){ setStatus(‘error’,’Нужно согласие на обработку персональных данных.’); return; } submitBtn.disabled = true; submitBtn.textContent = ‘Отправляем…’; fetch(‘/gm-lead/submit.php’,{ method:’POST’, body:new FormData(form), credentials:’same-origin’ }) .then(function(response){ return response.json().catch(function(){ throw new Error(‘Некорректный ответ сервера.’); }); }) .then(function(data){ if(data && data.ok){ setStatus(‘success’,data.message || ‘Спасибо. Заявка отправлена. Мы ответим удобным для вас способом.’); form.reset(); userEditedComment = false; updateSelectedProject(); form.querySelector(‘[name=»consent»]’).checked = true; }else{ setStatus(‘error’,(data && data.message) ? data.message : ‘Не удалось отправить заявку.’); } }) .catch(function(){ setStatus(‘error’,’Не удалось отправить заявку. Попробуйте ещё раз или позвоните нам: +7 (495) 220-0304.’); }) .finally(function(){ submitBtn.disabled = false; submitBtn.textContent = ‘Отправить’; }); }); window.addEventListener(‘resize’,function(){ updateThumbTrack(); ensureThumbVisible(currentIndex); }); updateSelectedProject(); })(); (function(){ var root = document.querySelector(‘.gm-home’); if(!root) return; root.addEventListener(‘click’,function(event){ var link = event.target.closest(‘[data-gm-scroll]’); if(!link) return; var href = link.getAttribute(‘href’); if(!href || href.charAt(0) !== ‘#’) return; var target = document.querySelector(href); if(!target) return; event.preventDefault(); var top = target.getBoundingClientRect().top + window.pageYOffset — 18; window.scrollTo({top:top, behavior:’smooth’}); }); function hideOldConsultant(){ var nodes = Array.prototype.slice.call(document.body.children || []); nodes.forEach(function(el){ if(!el || el.classList.contains(‘gm-lead-modal’) || el.classList.contains(‘gm-rq-modal’) || el.classList.contains(‘gm-pfm-modal’)) return; if(el.id === ‘wpadminbar’) return; var text = (el.textContent || »).replace(/s+/g,’ ‘).trim(); if(text.indexOf(‘Ваш консультант’) === -1) return; var style = window.getComputedStyle(el); if(style.position === ‘fixed’ || style.position === ‘sticky’ || style.position === ‘absolute’){ el.style.setProperty(‘display’,’none’,’important’); el.style.setProperty(‘visibility’,’hidden’,’important’); el.style.setProperty(‘pointer-events’,’none’,’important’); } }); } hideOldConsultant(); setTimeout(hideOldConsultant,300); setTimeout(hideOldConsultant,1000); setTimeout(hideOldConsultant,2500); })(); /* GM HOME FIX: mobile menu callback clone */ document.addEventListener(‘DOMContentLoaded’, function () { if (!document.querySelector(‘.gm-home’)) return; var navList = document.querySelector(‘.header__top .header__nav ul’); var sourceButton = document.querySelector(‘.header__contacts > .btn.js-modal[data-modal=»call»]’); if (!navList || !sourceButton || navList.querySelector(‘.gm-mobile-menu-callback’)) return; var item = document.createElement(‘li’); item.className = ‘menu-item gm-mobile-menu-callback’; var link = sourceButton.cloneNode(true); link.className = ‘gm-menu-callback js-modal’; link.textContent = ‘Позвонить вам?’; link.setAttribute(‘data-modal’, ‘call’); item.appendChild(link); navList.insertBefore(item, navList.firstElementChild); });