// Summary panel, mobile bar, contact modal, tweaks UI — no pricing displayed. function Summary({ selection, onContact }) { return (
Ваш бриф
{selection.siteType.name}
{selection.design.name} {selection.cms.name} {selection.pages} {pageWord(selection.pages)}
{selection.groups.filter((g) => g.key === 'features' || g.key === 'extras').map((g) =>
{g.title} {g.items.some((i) => i.muted) ? 0 : g.items.length}
    {g.items.map((it, i) =>
  • {!it.muted && } {it.label}
  • )}
)}
Сроки
  • {selection.urgency.name}
Готовы получить расчёт? Менеджер вернётся со сметой и сроками в течение 30 минут в рабочее время.
Заявка ни к чему не обязывает. Бриф сохраним и пришлём вам копию.
Скидка 5% на SEO-продвижение

при заказе разработки сайта

); } function MobileBar({ selection, onOpen, onContact }) { return (
); } function formatPhone(v) { const d = v.replace(/\D/g, '').slice(0, 11); if (!d) return ''; let s = '+7'; if (d.length > 1) s += ' (' + d.slice(1, 4); if (d.length >= 5) s += ') ' + d.slice(4, 7); if (d.length >= 8) s += '-' + d.slice(7, 9); if (d.length >= 10) s += '-' + d.slice(9, 11); return s; } function ContactModal({ selection, onClose }) { const [form, setForm] = React.useState({ name: '', phone: '', email: '', comment: '', agree: false }); const [submitted, setSubmitted] = React.useState(false); const [sending, setSending] = React.useState(false); const [sendError, setSendError] = React.useState(false); function submit(e) { e.preventDefault(); if (!form.agree) return; setSending(true); const body = new FormData(); body.append('_wpcf7', '1170'); body.append('_wpcf7_unit_tag', 'wpcf7-f1170-p1-o1'); body.append('_wpcf7_version', '6.0'); body.append('_wpcf7_locale', 'ru_RU'); body.append('your-name', form.name); body.append('your-phone', formatPhone(form.phone)); body.append('your-email', form.email); body.append('your-message', form.comment); body.append('site-type', selection.siteType.name); body.append('design', selection.design.name); body.append('cms', selection.cms.name); body.append('pages', `${selection.pages} ${pageWord(selection.pages)}`); body.append('features', selection.features.map(f => f.name).join(', ')); body.append('extras', selection.extras.map(e => e.name).join(', ')); body.append('urgency', selection.urgency.name); fetch('/wp-json/contact-form-7/v1/contact-forms/1170/feedback', { method: 'POST', body }) .then(r => r.json()) .then(data => { if (data.status === 'mail_sent' || data.status === 'sent' || data.status === 'spam') { setSubmitted(true); } else { setSendError(true); setSending(false); } }) .catch(() => { setSendError(true); setSending(false); }); } function handlePhone(e) { const digits = e.target.value.replace(/\D/g, '').slice(0, 11); setForm({ ...form, phone: digits }); } return (
e.stopPropagation()}> {!submitted ? <>
Заявка на расчёт

Готовим персональную смету

Изучим ваш бриф, при необходимости задаём уточняющие вопросы и пришлём детальную смету и сроки.

Ваш бриф {selection.itemCount} пунктов
{selection.groups.map((g) =>
{g.title}
{g.items.map((it, i) => {it.label} )}
)}