const { useEffect } = React;
const defaultSite = {
settings: {},
sections: {},
services: [],
reviews: [],
gallery: [],
};
const BRAND_NAME = "Малярка.Pro";
const BRAND_LOGO = "/static/assets/malyarka-pro-logo.svg";
const YANDEX_MAP_POINT = "37.761450,44.698994";
const YANDEX_MAP_URL =
"https://yandex.ru/map-widget/v1/?ll=37.761450%2C44.698994&pt=37.761450%2C44.698994%2Cpm2rdm&z=18";
function isEnabled(sections, key) {
return Boolean(sections && sections[key]);
}
function Reveal({ as: Tag = "section", children, ...props }) {
return (
{children}
);
}
function IndustrialStrip() {
const items = [
"Кузовной цех",
"Покраска",
"Геометрия",
"Новороссийск",
"Оценка по фото",
"До/после",
"Кузовной цех",
"Покраска",
"Геометрия",
"Новороссийск",
"Оценка по фото",
"До/после",
];
return (
{items.map((item, index) => (
{item}
))}
);
}
function Header({ sections }) {
return (
);
}
function Hero({ settings }) {
const specs = [settings.hero_fact_1, settings.hero_fact_2, settings.hero_fact_3].filter(Boolean);
return (
{settings.hero_eyebrow}
{settings.hero_title}
{settings.hero_subtitle}
{specs.map((fact, index) => (
- {String(index + 1).padStart(2, "0")}
- {fact}
))}
Собственная покрасочная камера
);
}
function KineticRail() {
return (
Рихтовка
Покраска
Полировка
Подбор цвета
);
}
function SectionHeading({ eyebrow, title }) {
return (
);
}
function Services({ services }) {
return (
{services.map((service) => (
{service.title}
{service.summary}
))}
);
}
function PhotoEvaluation({ settings }) {
return (
Быстрый первый шаг
Бесплатная оценка по фото в MAX
Отправьте несколько фото повреждения. Точная оценка дается после осмотра.
Без формы на сайте
Напишите в MAX
{settings.max_contact}
);
}
function BeforeAfter({ gallery }) {
return (
{gallery.length ? (
gallery.map((pair) => (
{pair.caption}
))
) : (
До ремонта
Фото для замены.
После ремонта
Фото для замены.
)}
);
}
function Trust({ reviews }) {
return (
Собственная камера покраски
Покрасочные работы выполняются в подготовленной зоне.
{reviews.map((review) => (
{review.reviewer_label}
{review.text}
))}
{!reviews.length && (
Реальные отзывы
Пока нет реальных отзывов: место зарезервировано.
)}
);
}
function Contact({ settings }) {
return (
Связаться
Позвоните или напишите в MAX
Телефон
{settings.phone}
MAX
{settings.max_contact}
Адрес
{settings.address}
);
}
function Footer() {
return (
);
}
function useRevealAnimation() {
useEffect(() => {
const revealTargets = document.querySelectorAll("[data-reveal]");
const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)");
if (!revealTargets.length) {
return undefined;
}
revealTargets.forEach((target) => target.classList.add("reveal"));
if (reduceMotion.matches || !("IntersectionObserver" in window)) {
revealTargets.forEach((target) => target.classList.add("is-visible"));
return undefined;
}
revealTargets.forEach((target, index) => {
window.setTimeout(() => {
target.classList.add("is-visible");
}, 120 + index * 45);
});
const revealObserver = new IntersectionObserver(
(entries, observer) => {
entries.forEach((entry) => {
if (!entry.isIntersecting) {
return;
}
entry.target.classList.add("is-visible");
observer.unobserve(entry.target);
});
},
{ rootMargin: "0px 0px -12% 0px", threshold: 0.12 },
);
revealTargets.forEach((target) => revealObserver.observe(target));
return () => revealObserver.disconnect();
}, []);
}
function PublicApp() {
const site = window.__PUBLIC_SITE__ || defaultSite;
const settings = site.settings || defaultSite.settings;
const sections = site.sections || defaultSite.sections;
const services = site.services || defaultSite.services;
const reviews = site.reviews || defaultSite.reviews;
const gallery = site.gallery || defaultSite.gallery;
useRevealAnimation();
return (
{isEnabled(sections, "services") && }
{isEnabled(sections, "photo_evaluation") && }
{isEnabled(sections, "before_after") && }
{isEnabled(sections, "trust") && }
{isEnabled(sections, "contact") && }
);
}
ReactDOM.createRoot(document.getElementById("public-root")).render();