Фортеця. Сайт инженерной компании подземных убежищ

Сайт компании, которая возводит подземные убежища для частных домов и участков. three.js-модель на первом экране, инженерный разрез, страница 404 с радаром, две языковые версии, система обработки лидов и выстраивание процесса продаж.

Корпоративный сайтfront.polyarix.spaceFigmaHTML5CSS3JavaScriptthree.js
Клиент
Фортеця - инженерные подземные убежища
Сфера
Проектирование и строительство укрытий под частными домами
Стек
Figma · three.js · vanilla JS · Schema.org
Наша роль
Дизайн, фронтенд, концепт воронки заявок

Компания и задача проекта

«Фортеця» проектирует и строит автономные подземные убежища. Полный цикл: геология, проект, монолитные работы, инженерные системы - вентиляция с фильтрацией, электропитание, связь, автоматика.

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

Дизайн в Figma

Дизайн сделали в Figma с нуля. Тёмная схема: фон #141618, акцент - золото #c9a227. Заголовки набраны Unbounded, текст и цифры - IBM Plex Sans и IBM Plex Mono. Оформление построено на чертёжной графике: тонкие линии, координаты, отметки уровней.

В макете описаны состояния интерфейса для кнопок, ссылок, полей формы и языкового переключателя - обычное, при наведении и в фокусе. Отдельным фреймом собран UI-kit.

Дизайн сайта Фортеця в Figma: макеты экранов и состояния интерфейса

3D-модель дома и убежища на первом экране

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

Модель в формате glTF/GLB, рендер на three.js: из геометрии строится каркас рёбер, появление анимируется штриховкой линий. Сцена инициализируется в простое главного потока и строится порциями, чтобы не блокировать загрузку страницы. Если WebGL недоступен, показывается SVG-версия сцены с той же анимацией.

Панель настройки толщины линий

Толщина линий задаётся отдельно для каждой группы элементов - земля, стены дома, лестница, короб убежища, вентиляция. Для подбора значений сделали внутреннюю панель: она открывается параметром ?tune=1 в адресе и на обычных страницах не отображается.

Параметры меняются ползунками прямо в браузере, поэтому варианты мы показывали и утверждали с клиентом в моменте. Потом он и сам «поиграл» с настройками и выбрал оптимальный вид - нам осталось скопировать готовый набор значений в конфигурацию и применить на сайте.

Внутренняя панель настройки толщины линий 3D-модели по группам элементов

Инженерный разрез участка

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

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

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

Комплектации и этапы работ

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

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

Анимации и prefers-reduced-motion

На сайте четыре типа анимации: появление блоков при прокрутке, прорисовка чертежей, счётчики показателей и параллакс фоновых сеток. Всё реализовано на нативном JavaScript через IntersectionObserver и requestAnimationFrame, без сторонних библиотек. Смещения выполняются через transform, обработчики прокрутки - пассивные.

При включённой системной настройке prefers-reduced-motion анимации отключаются, а элементы сразу отображаются в конечном состоянии.

Страница 404

Нам хотелось добавить проекту что-то живое и запоминающееся, и на 404 для этого самое место - страницу и так никто не ждёт. Так появилась идея радара.

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

Страница закрыта от индексации через robots.txt и мета-тег noindex. При prefers-reduced-motion лог выводится сразу, без анимации и мигания.

Получилось интересно - страница стала ещё одной фишкой проекта, которую хочется показать.

Производительность

Сайт собран без сборщика: HTML, CSS и нативные ES-модули, один минифицированный файл стилей, шрифты в woff2 размещены на своём хосте и разбиты на кириллический и латинский поднаборы. Модель GLB отдаётся с gzip.

Для 3D-сцены заданы ограничения по нагрузке. Плотность пикселей ограничена двойной, а на устройствах с четырьмя ядрами и меньше - полуторной. Сглаживание включается только при низкой плотности. После сборки сцена рендерится с шагом 33 мс, то есть около 30 кадров в секунду, а за пределами области видимости рендер останавливается. При недоступном WebGL показывается SVG-версия.

PageSpeed главной страницы на мобильных

94Performance
97Accessibility
100Best Practices
100SEO

Замер в Lighthouse, мобильный профиль, главная страница с 3D-сценой на первом экране. Внутренние страницы дают такие же значения.

SEO и две языковые версии

Сайт двуязычный: украинская версия в корне, английская в разделе /en с зеркальной структурой страниц. Каждая пара связана атрибутами hreflang - uk, en и x-default. Если язык браузера не совпадает с языком страницы, показывается плашка с предложением переключиться, выбор сохраняется в localStorage.

На страницах прописаны canonical, Open Graph и Twitter Card. Разметка Schema.org в формате JSON-LD включает Organization, WebSite, HomeAndConstructionBusiness, Blog, Article, CollectionPage, AboutPage, BreadcrumbList и Person. Карта сайта содержит 18 адресов с языковыми альтернативами, служебные страницы закрыты в robots.txt.

Форма заявки и путь лида

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

Схема обработки заявок для проектов с бэкендом выглядит так: заявка уходит в Telegram-бот с кнопками смены статуса, сохраняется в CRM с этапом и источником, конверсия считается сквозным отчётом от источника до договора. Ниже - демонстрационный макет такой панели: поток заявок, этапы, источники трафика и показатели. Данные на макете условные.

Демонстрационный макет панели воронки: заявки, этапы, источники и конверсии

Git, автодеплой и тесты

Проект хранится в Git. Деплой выполняется одной командой: сборка CSS-бандла, простановка версий у ресурсов для сброса кеша браузера, выкладка файлов по rsync и выставление прав на сервере.

На статическом сайте тестировать нечего. В проектах, где есть бэкенд на Laravel и обработка заявок, мы покрываем юнит-тестами приём и валидацию лида, отправку в Telegram и запись в CRM, а после деплоя прогоняем смоук-проверку доступности ключевых страниц и формы.

Проект в цифрах

2языковые версии, uk и en
9типов разметки Schema.org
4типа анимации на нативном JavaScript
0сторонних трекеров и рекламных cookies

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

Хотите такие же результаты?

Обсудим проект

Расскажите о задаче — ответим в течение одного рабочего дня.

Что вам нужно?
Бюджет

Спасибо!

Заявка получена. Ответим в течение одного рабочего дня.