// Editorial Luxury — pages (real backend via window.EH_API) const D2 = window.EH_DATA; const API = window.EH_API; // --- helpers --- const isoDay = (d) => `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`; // «5 июля» из ISO-даты (короткое отображение для диапазонов) const fmtRuDate = (iso) => { const d = new Date(String(iso) + 'T00:00:00'); return isNaN(d) ? iso : d.toLocaleDateString('ru', { day: 'numeric', month: 'short' }); }; // Форматирует время брони: часовая — «13:00–14:00, 15:00–17:00», // дневная — «Весь день», месячная — «30 дней · по 5 авг» function fmtHours(b) { if (b.kind === 'day') return `Весь день (${b.start}–${b.end})`; if (b.kind === 'month') return `30 дней · по ${fmtRuDate(b.dateEnd || b.date)}`; const hrs = Array.isArray(b.hours) && b.hours.length ? b.hours.slice().sort((a, c) => a - c) : null; if (!hrs) return `${b.start} — ${b.end}`; const runs = []; let s = hrs[0], p = hrs[0]; for (let i = 1; i < hrs.length; i++) { if (hrs[i] === p + 1) { p = hrs[i]; } else { runs.push([s, p]); s = hrs[i]; p = hrs[i]; } } runs.push([s, p]); const f = (h) => String(h).padStart(2, '0') + ':00'; return runs.map(([a, z]) => `${f(a)}–${f(z + 1)}`).join(', '); } function maskPhone(v) { let d = (v || '').replace(/\D/g, ''); if (d[0] === '8') d = '7' + d.slice(1); if (d[0] !== '7') d = '7' + d; d = d.slice(0, 11); let out = '+7'; if (d.length > 1) out += ' (' + d.slice(1, 4); if (d.length >= 4) out += ') ' + d.slice(4, 7); if (d.length >= 7) out += '-' + d.slice(7, 9); if (d.length >= 9) out += '-' + d.slice(9, 11); return out; } async function completePendingBooking() { const raw = sessionStorage.getItem('eh_pending_booking'); if (!raw) return; sessionStorage.removeItem('eh_pending_booking'); try { await API.createBooking(JSON.parse(raw)); } catch (e) { /* конфликт/ошибка — пропускаем */ } } const DashLoading = ({ label }) => (
{label}
); // ============================================ // CABINET PLAN — отдельные комнаты со своими планами + клик по месту → бронь // ============================================ const CabinetPlan = ({ type, rooms, onSelectRoom, onClose }) => { // Цвета для разных типов объектов const COLOR = { sofa: { fill: '#2c333d', alpha: 0.82, text: '#ffffff' }, // диваны, тёмная мягкая мебель wood: { fill: '#cba374', alpha: 0.95, text: '#0f1419' }, // деревянная мебель / столики cabinet: { fill: '#7a5a30', alpha: 0.88, text: '#ffffff' }, // глухие шкафы metal: { fill: '#5a6770', alpha: 0.85, text: '#ffffff' }, // мойка, металл glass: { fill: '#9fc1d4', alpha: 0.55, text: '#0f1419' }, // зеркала device: { fill: '#0f1419', alpha: 0.85, text: '#ffffff' }, // аппаратура chair: { fill: '#1d3df0', alpha: 0.6, text: '#ffffff' }, // акцентные кресла light: { fill: '#f5e8c4', alpha: 0.65, text: '#0f1419' }, // окна, светлые проёмы }; const c = (kind) => COLOR[kind] || COLOR.wood; // Helper для прямоугольной мебели const rect = (x, y, w, h, label, kind) => { const col = c(kind); return { x, y, w, h, label, color: col.fill, alpha: col.alpha, _textColor: col.text }; }; // Круглая мебель (стулья и т.п.) — рендерится через furniture с round:true const circ = (x, y, r, label, kind) => { const col = c(kind); return { x: x - r, y: y - r, w: r * 2, h: r * 2, label, color: col.fill, alpha: col.alpha, _textColor: col.text, round: true }; }; // Овал (раковины, чаши) — render через furniture с oval:true const oval = (cx, cy, rx, ry, label, kind) => { const col = c(kind); return { x: cx - rx, y: cy - ry, w: rx * 2, h: ry * 2, label, color: col.fill, alpha: col.alpha, _textColor: col.text, oval: true }; }; // ============================================================ // КОНФИГИ ПЛАНОВ — координаты в метрах, мебель как декорация, places кликабельные // ============================================================ const CFG = { // ---- Зона ожидания (5×4 м) — сдаётся целиком ---- lounge: { title: 'Зона ожидания', planW: 5, planH: 4, furniture: [ // Удобный диван во всю верхнюю стену rect(0.20, 0.20, 4.60, 0.55, 'Удобный диван', 'sofa'), // Кофе у левой стены rect(0.20, 1.40, 0.50, 0.90, 'Кофе', 'wood'), ], // Кликабельная зона = вся комната places: [{ x: 0.20, y: 0.90, w: 4.60, h: 2.85 }], door: { side: 'bottom', x: 2.0, w: 1.0 }, }, // ---- Кабинет барберов (5.5×5.5 м) — только 3 рабочих места ---- barber: { title: 'Кабинет барберов', planW: 5.5, planH: 5.5, furniture: [], places: [ { x: 0.30, y: 0.40, w: 2.30, h: 1.20 }, // Б1 { x: 0.30, y: 2.15, w: 2.30, h: 1.20 }, // Б2 { x: 0.30, y: 3.90, w: 2.30, h: 1.20 }, // Б3 ], door: { side: 'right', y: 4.30, h: 1.00 }, }, // ---- Кабинет с автозагаром (5.5×5.5 м) — сдаётся целиком ---- tan: { title: 'Кабинет с автозагаром', planW: 5.5, planH: 5.5, furniture: [], places: [{ x: 0.20, y: 0.20, w: 5.10, h: 5.10 }], door: { side: 'right', y: 4.30, h: 1.00 }, }, // ---- 2 кабинета с кушеткой (перманентный макияж) в линию (11×5.5 м) ---- bed: { title: 'Кабинеты с кушеткой', planW: 11, planH: 5.5, walls: [ { x1: 5.5, y1: 0, x2: 5.5, y2: 5.5 }, ], furniture: [ // Кушетка в каждом кабинете — прижата к верхней стене rect(1.55, 0.20, 2.40, 0.95, 'Кушетка', 'sofa'), rect(7.05, 0.20, 2.40, 0.95, 'Кушетка', 'sofa'), ], places: [ { x: 0.20, y: 0.20, w: 5.10, h: 5.10 }, { x: 5.70, y: 0.20, w: 5.10, h: 5.10 }, ], doors: [ { side: 'bottom', x: 2.25, w: 1.0 }, { side: 'bottom', x: 7.75, w: 1.0 }, ], }, // ---- Кабинет косметолога (5.5×5.5 м) — сдаётся целиком ---- cosmo: { title: 'Кабинет косметолога', planW: 5.5, planH: 5.5, furniture: [ // Кушетка прижата к верхней стене rect(1.55, 0.20, 2.40, 1.00, 'Кушетка', 'sofa'), ], places: [{ x: 0.20, y: 0.20, w: 5.10, h: 5.10 }], door: { side: 'right', y: 4.30, h: 1.00 }, }, // ---- 2 свободных кабинета в линию (8×4.5 м) ---- free4: { title: 'Кабинеты свободного назначения', planW: 8, planH: 4.5, furniture: [], walls: [ { x1: 4, y1: 0, x2: 4, y2: 4.5 }, ], places: [0, 1].map(i => ({ x: 0.20 + i * 4, y: 0.20, w: 3.60, h: 4.10 })), doors: [0, 1].map(i => ({ side: 'bottom', x: 1.5 + i * 4, w: 1.0 })), }, }; const cfg = CFG[type]; if (!cfg) return null; const scale = 70; const W = cfg.planW * scale; const H = cfg.planH * scale; const places = cfg.places || []; // Цвет статуса const statusColor = (s) => s === 'free' ? '#5d8a72' : s === 'partial' ? '#c9913d' : '#b56666'; // Среднее по зоне const minPrice = rooms.length ? Math.min(...rooms.map(r => r.prices.hour)) : null; const allBusy = rooms.length && rooms.every(r => r.status === 'busy'); const anyFree = rooms.some(r => r.status === 'free'); const zoneStatus = !rooms.length ? 'unknown' : allBusy ? 'busy' : (anyFree ? 'free' : 'partial'); const zoneStatusLabel = zoneStatus === 'free' ? 'СВОБОДНО' : zoneStatus === 'busy' ? 'АРЕНДУЕТСЯ' : 'ЧАСТИЧНО'; const renderDoor = (door, key = 'd') => { if (!door) return null; if (door.side === 'right') { const y = door.y * scale, h = door.h * scale; return ; } if (door.side === 'bottom') { const x = door.x * scale, w = door.w * scale; return ; } return null; }; return (
{zoneStatusLabel}

{cfg.title}

Нажмите на место на плане — увидите фотографии, цены и свободные часы. Оплата онлайн, бронь подтверждается мгновенно.

{/* Контур комнаты */} {/* Перегородки */} {cfg.walls && cfg.walls.map((w, i) => ( ))} {/* Декоративная мебель */} {cfg.furniture && cfg.furniture.map((it, i) => { const px = it.x * scale, py = it.y * scale; const pw = it.w * scale, ph = it.h * scale; const cx = px + pw / 2, cy = py + ph / 2; const txtColor = it._textColor || '#0f1419'; return ( {it.round ? ( ) : it.oval ? ( ) : ( )} {it.label && ( {it.label} )} ); })} {/* Двери */} {cfg.door && renderDoor(cfg.door, 'door')} {cfg.doors && cfg.doors.map((d, i) => renderDoor(d, `door${i}`))} {/* Кликабельные «места» */} {places.map((p, i) => { const room = rooms[i]; if (!room) return null; const stColor = statusColor(room.status); const disabled = room.status === 'busy'; const cx = p.x * scale + (p.w * scale) / 2; const cy = p.y * scale + (p.h * scale) / 2; return ( !disabled && onSelectRoom && onSelectRoom(room)}> {room.num} {room.prices.hour}₽/ч ); })} {/* Размеры */} {cfg.planW} м {cfg.planH} м
); }; // Слайд-шоу блока «Мероприятия»: один большой горизонтальный кадр, фото меняются // по кругу (кроссфейд + медленный «наезд камеры»). Под кадром — счётчик, // линия-прогресс и стрелки. Пауза — при наведении курсора или касании. const EvSlideshow = ({ slides, interval = 5200 }) => { const [idx, setIdx] = useState(0); const [paused, setPaused] = useState(false); const [cycle, setCycle] = useState(0); // перезапускает линию прогресса после паузы const touchX = useRef(null); const n = slides.length; const go = (i) => setIdx(((i % n) + n) % n); const resume = () => { setPaused(false); setCycle(c => c + 1); }; // следующий кадр — через interval после показа текущего useEffect(() => { if (paused) return; const t = setTimeout(() => setIdx(i => (i + 1) % n), interval); return () => clearTimeout(t); }, [idx, cycle, paused, n, interval]); return (
setPaused(true)} onMouseLeave={resume} onTouchStart={(e) => { touchX.current = e.touches[0].clientX; setPaused(true); }} onTouchCancel={resume} onTouchEnd={(e) => { const dx = touchX.current == null ? 0 : e.changedTouches[0].clientX - touchX.current; touchX.current = null; if (Math.abs(dx) > 40) go(idx + (dx < 0 ? 1 : -1)); // свайп влево — следующий кадр resume(); }} > {slides.map((s, i) => (
{s.alt}
))} Зал · до 30 человек
{String(idx + 1).padStart(2, '0')} / {String(n).padStart(2, '0')}
); }; // ============================================ // LANDING // ============================================ const EditorialLanding = () => { const [room, setRoom] = useState(null); const [hovered, setHovered] = useState(null); const [toast, setToast] = useState(null); // { type:'ok'|'err', msg } const [openZone, setOpenZone] = useState(null); // аккордеон зон в плане главного зала const [activePlan, setActivePlan] = useState(null); // null | 'main' | 'lounge' | 'barber' | 'tan' | 'bed' | 'cosmo' | 'free4' const [emailPopup, setEmailPopup] = useState(null); // null | 'rooms' | 'events' — контекст для модалки «Написать на почту» const [payModal, setPayModal] = useState(null); // данные оплаты по QR после создания брони // Слайдер-фон в hero (5 фото зала, кроссфейд). Каждый слайд можно заменить в админке («Картинки»). // Без useMemo: настройки (siteImages) приходят из БД после маунта, и фото, // заменённые в админке, должны подхватиться при ближайшем ре-рендере. const heroSlides = [ ehSitePhoto('hero1', 'heroInterior'), ehSitePhoto('hero2', 'heroMoody'), ehSitePhoto('hero3', 'heroSoft'), ehSitePhoto('hero4', 'interior5'), ehSitePhoto('hero5', 'interior3'), ].filter(Boolean); const [heroIdx, setHeroIdx] = useState(0); // Видео-фон: assets/video/hero.mp4 или hero.mov. Если файла нет / формат не играет — // остаётся фото-слайдер (видео появится само, как только файл положат на место). const [videoOn, setVideoOn] = useState(false); // true после успешного старта воспроизведения const videoRef = React.useRef(null); useEffect(() => { if ((heroSlides.length <= 1) || videoOn) return; const t = setInterval(() => setHeroIdx(i => (i + 1) % heroSlides.length), 6500); return () => clearInterval(t); }, [heroSlides.length, videoOn]); useEffect(() => { document.title = "Estetic Hall · бьюти-коворкинг в Тамбове"; }, []); const handleBook = async ({ room, kind, dateISO, dateLabel, slots, payWith }) => { kind = kind || 'hour'; let me = null; try { me = (await API.me()).user; } catch (e) {} if (!me) { sessionStorage.setItem('eh_pending_booking', JSON.stringify({ roomId: room.id, kind, date: dateISO, slots })); window.location.hash = '#/login'; return; } try { const resp = await API.createBooking({ roomId: room.id, kind, date: dateISO, slots, payWith: payWith || 'money' }); const when = kind === 'day' ? 'весь день' : kind === 'month' ? '30 дней' : `${String(slots[0]).padStart(2, '0')}:00–${String(slots[slots.length - 1] + 1).padStart(2, '0')}:00`; setRoom(null); if (resp && resp.payment) { // Оплата деньгами: место удержано, показываем QR и реквизиты для перевода setPayModal(resp.payment); } else { setToast({ type: 'ok', msg: `${room.name} · ${dateLabel} · ${when}` }); setTimeout(() => setToast(null), 6000); } } catch (ex) { setRoom(null); setToast({ type: 'err', msg: ex.message || 'Не удалось забронировать. Попробуйте другое время.' }); setTimeout(() => setToast(null), 6000); } }; return ( <> {/* HERO — Nordic-стиль текста + видео-фон (assets/video/hero.mp4 | hero.mov) с фолбэком на фото-слайдер */}
{heroSlides.map((src, i) => (
))}

Аренда места мастера
от 1 часа, 24/7,
без скрытых платежей

Центр города Онлайн-бронь Гибкие тарифы

Оборудованное рабочее место мастера красоты в центре Тамбова — без переплат и бюрократии.

Хочу забронировать! Забронировать Подробнее
30+Рабочих мест
24/7Доступ для мастеров
{(D2.brand.open || '09:00')}–{(D2.brand.close || '21:00')}Ресепшн
Тамбовул. Октябрьская, 11
ТД Октябрьский (3-й этаж)
{/* Порядок блоков: «Аренда и цены» → «Для мероприятий» → «О пространстве» (через flex order) */}
{/* ABOUT */}
III.О пространстве
Интерьер ресепшна
2026 Открыты
с 2026 года
Не просто аренда —

Место, где мастера
работают с удовольствием.

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

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

I.

Свой ключ · 24/7

Свободный доступ круглосуточно для арендаторов от 1 месяца.

II.

Оборудование

Профессиональные кресла, мойки, лампы, ринг-лайты и инструмент.

III.

Гибкое расписание

От 1 часа до месяца. Бронируйте онлайн в один клик.

IV.

Личные локеры

Шкафчик с замком — оставляйте инструменты и приходите налегке.

V.

Кофе-аппарат

Зерновой кофе-аппарат в зоне лаунжа для вас и ваших клиентов.

VI.

Центр города

ул. Октябрьская, 11, 3-й этаж — рядом остановки общественного транспорта.

{/* EVENTS — Аренда зала для бьюти-мероприятий */}
II.Для мероприятий
{/* Слайд-шоу: 4 горизонтальных кадра по кругу. Каждый можно заменить в админке («Картинки») */}
Не только аренда мест —

Аренда зала
для бьюти-мероприятий

Мастер-классы, фотосъёмки для контента, обучения, дни красоты и закрытые мероприятия — арендуйте весь зал или его часть в нерабочие часы.

Мастер-классыДо 30 участников · видеосвет, ринг-лайты, демо-кресла
Дни красотыВыездные мероприятия и обучающие интенсивы под ключ
Закрытые встречиКорпоративы, презентации брендов, бьюти-завтраки
{/* BOOKING / PLAN */}
I.Аренда и цены

Аренда рабочих мест
для мастеров

Выберите зону и нажмите «Подробнее» — вы увидите схему зала, цены и сможете забронировать конкретное место за минуту.

{/* Карточки зон — 8 шт., 4 в ряд */}
{(() => { // Считаем минимальную цену + статус из реальных данных D2.rooms const zoneInfo = (zone) => { const list = D2.rooms.filter(r => r.zone === zone); if (!list.length) return { minPrice: null, status: 'unknown' }; const minPrice = Math.min(...list.map(r => r.prices.hour)); const allBusy = list.every(r => r.status === 'busy'); const anyFree = list.some(r => r.status === 'free'); const status = allBusy ? 'taken' : anyFree ? 'free' : 'partial'; return { minPrice, status, count: list.length }; }; // Общий зал теперь = парикмахеры + визаж (9 мест); маникюр/педикюр — отдельная карточка const mainMinAll = D2.rooms.filter(r => ['hair','makeup'].includes(r.zone)); const mainMin = mainMinAll.length ? Math.min(...mainMinAll.map(r => r.prices.hour)) : 450; const nailsMinAll = D2.rooms.filter(r => ['nails','pedicure'].includes(r.zone)); const nailsMin = nailsMinAll.length ? Math.min(...nailsMinAll.map(r => r.prices.hour)) : 350; const barb = zoneInfo('barber'), tn = zoneInfo('tan'), bd = zoneInfo('bed'), cs = zoneInfo('cosmo'), fr = zoneInfo('free'); const dynBadge = (info, fallbackBadge, fallbackKind) => { if (info.status === 'unknown') return { badge: fallbackBadge, kind: fallbackKind }; if (info.status === 'taken') return { badge: 'арендуется', kind: 'taken' }; if (info.status === 'free') return { badge: info.minPrice ? `от ${info.minPrice}₽/ч` : 'свободен', kind: 'price' }; return { badge: 'частично', kind: 'partial' }; }; const CABINETS = [ { id: 'main', title: 'Места в общем зале', desc: '9 рабочих мест — 7 парикмахеров и 2 визажиста. Аренда от 1 часа.', photoKey: 'heroInterior', plan: 'main', badge: `от ${mainMin}₽/ч`, kind: 'price' }, { id: 'nails', title: 'Маникюр и педикюр', desc: 'Отдельная зона: 5 мест для маникюра и 2 для педикюра. Аренда от 1 часа.', photoKey: 'manicure1', plan: 'nails', badge: `от ${nailsMin}₽/ч`, kind: 'price' }, { id: 'barber', title: 'Кабинет барберов', desc: 'Отдельная комната ~30 м² с 3 рабочими местами для барберов. Аренда мест отдельно.', photoKey: 'chair3', plan: 'barber', ...dynBadge(barb, '3 места · 30 м²', 'info') }, { id: 'bed', title: 'Кабинет с кушеткой', desc: '2 кабинета с кушеткой для перманентного макияжа (также массаж, татуаж, косметология). Сдаются целиком.', photoKey: 'led2', plan: 'bed', ...dynBadge(bd, '2 кабинета', 'info') }, { id: 'cosmo', title: 'Кабинет косметолога', desc: 'Полноценный косметологический кабинет ~30 м² с аппаратом и кушеткой. Сдаётся целиком.', photoKey: 'led1', plan: 'cosmo', ...dynBadge(cs, 'арендуется', 'taken') }, { id: 'tan', title: 'Кабинет с автозагаром', desc: 'Отдельная комната ~30 м² с оборудованием для автозагара. Сдаётся целиком.', photoKey: 'interior3', plan: 'tan', ...dynBadge(tn, 'арендуется', 'taken') }, { id: 'free4', title: 'Кабинеты свободного назначения', desc: '2 отдельных кабинета ~20 м² каждый в зоне общего зала. Подходят под любые услуги, арендуются отдельно.', photoKey: 'interior1', plan: 'free4', ...dynBadge(fr, '2 кабинета', 'info') }, { id: 'more', title: 'Больше свободных мест', desc: 'Не нашли подходящий вариант? Свяжитесь с нами — расскажем какие места и кабинеты свободны сейчас, когда освобождаются занятые.', photoKey: 'reception', plan: 'contact', badge: 'связаться', kind: 'cta', ctaText: 'Подробнее →' }, ]; return CABINETS.map(c => { const handleClick = () => { setActivePlan(c.plan); if (c.plan === 'main') setOpenZone('hair'); if (c.plan === 'nails') setOpenZone('nails'); setTimeout(() => { const el = document.getElementById('book-plan'); if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' }); }, 120); }; return (
{c.title} {c.badge}

{c.title}

{c.desc}

); }); })()}
{/* План + список — показываются только после клика «Подробнее» */}
{activePlan === 'contact' && (
Свяжитесь с нами

Уточнить что свободно

Не нашли подходящий вариант? Позвоните или напишите — расскажем какие места и кабинеты свободны прямо сейчас и когда освобождаются занятые.

Позвоните прямо сейчас {D2.brand.phone} Ежедневно · {(D2.brand.open || '09:00')}–{(D2.brand.close || '21:00')} {D2.brand.email && ( )}
{D2.brand.email && (
Email{D2.brand.email}
)}
Адрес{D2.brand.address}
Режим работы{D2.brand.hours}
{D2.brand.vk && ( )}
)} {activePlan && activePlan !== 'main' && activePlan !== 'nails' && activePlan !== 'contact' && (() => { // Соотносим тип плана с зоной БД const PLAN_TO_ZONE = { barber: 'barber', tan: 'tan', bed: 'bed', cosmo: 'cosmo', free4: 'free' }; const zone = PLAN_TO_ZONE[activePlan]; const list = D2.rooms.filter(r => r.zone === zone); return ( setRoom(r)} onClose={() => setActivePlan(null)} /> ); })()} {(activePlan === 'main' || activePlan === 'nails') && (() => { const isMain = activePlan === 'main'; const planMode = isMain ? 'hall' : 'nails'; const planZones = isMain ? ['hair', 'makeup'] : ['nails', 'pedicure']; const planRooms = D2.rooms.filter(r => planZones.includes(r.zone)); return <>

Нажмите на место на плане или в списке — увидите фотографии, тарифы и свободные часы.

Свободен Частично Занят сегодня
ПЛАН · РАБОЧИЕ МЕСТА
{isMain ? 'общий зал' : 'маникюр · педикюр'}

Рабочие места

{planZones.map(z => { const list = D2.rooms.filter(r => r.zone === z); if (!list.length) return null; const n = list.length; const word = (n >= 2 && n <= 4) ? 'места' : 'мест'; const open = openZone === z; return (
{open && (
{list.map(r => (
setRoom(r)} onMouseEnter={() => setHovered(r.id)} onMouseLeave={() => setHovered(null)}> {r.num}
{r.name} {r.area} м²
{r.prices.hour}₽/ч
))}
)}
); })}
; })()}
{/* /.land-reorder */} {/* GALLERY */} {/* PROMO — Абонемент + забота о резидентах */}
V.Абонемент

Абонемент
в Estetic Hall

Покупайте часы заранее по выгодной цене и оплачивайте ими брони в общем зале и кабинете барберов — прямо в личном кабинете.

{/* Абонемент — единственная карточка */}
Estetic Hall
ESTETIC
HALL

{D2.brand.abonementHours || 30} часов
за {(D2.brand.abonementPrice || 6000).toLocaleString()} ₽

Абонемент на {D2.brand.abonementHours || 30} часов аренды. Тратится на места в общем зале и кабинет барберов — 1 час брони = 1 час с абонемента. Покупка и оплата прямо на сайте.

Купить абонемент →
{/* CARE — Мы заботимся о наших резидентах */}

Мы заботимся о наших резидентах

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

Сервис для мастеров
и клиентов

Доброжелательные администраторы встретят вас и ваших клиентов, предложат чай/кофе и безлимитный Wi-Fi.

Профессиональное
оборудование и материалы

Свежий стильный и аккуратный ремонт, профессиональное оборудование для работы, дополнительные материалы по себестоимости прямо на месте.

Локер для
личных вещей

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

{/* МАП — Как нас найти (контакты) */}