/* parts3.jsx — модалка пабов + модалка развода мостов */ const W3 = window.WC; const U3 = window.U; /* ════════ МОДАЛКА ПАБОВ ════════ */ function BarsModal({ onClose }) { const spb = W3.bars.filter((b) => b.city === 'СПб'); const msk = W3.bars.filter((b) => b.city === 'Москва'); return (
e.stopPropagation()}>
Где смотреть

Пабы

Санкт-Петербург
{spb.map((b) => )}
Москва
{msk.map((b) => )}
); } function BarCardCompact({ b }) { const mapUrl = 'https://yandex.ru/maps/?text=' + encodeURIComponent(b.addr + ', ' + b.city); return (
{b.name}
{b.addr} {b.phoneDisplay} {b.telegram && Telegram }
Забронировать
); } /* ════════ МОДАЛКА РАЗВОДА МОСТОВ ════════ */ function BridgesModal({ onClose }) { const bridges = W3.bridges; // Таймлайн от 1:00 до 6:00 (5 часов) const tStart = 1; // 1:00 const tEnd = 6; // 6:00 const totalMin = (tEnd - tStart) * 60; // 300 min function timeToMin(s) { const [h, m] = s.split(':').map(Number); return (h - tStart) * 60 + m; } function pct(min) { return (min / totalMin) * 100; } const mainBridges = bridges.filter((b) => b.slots.length > 0); const byRequest = bridges.filter((b) => b.slots.length === 0); return (
e.stopPropagation()}>
Петербург

Развод мостов

Навигация 2026 · время закрытия для транспорта
{/* Таймлайн-инфографика */}
{/* Часовая шкала */}
{[1, 2, 3, 4, 5, 6].map((h) => (
{h}:00
))}
{/* Мосты */} {mainBridges.map((b, i) => (
{b.name}
{b.slots.map((slot, j) => { const left = pct(timeToMin(slot[0])); const width = pct(timeToMin(slot[1]) - timeToMin(slot[0])); return (
{slot[0]} {slot[1]}
); })}
{b.river}
))}
{/* По заявке */}
По предварительной заявке (за 2 суток)
{byRequest.map((b, i) => (
{b.name} {b.note}
))}
Источник: СПб ГБУ «Мостотрест», mostotrest-spb.ru
); } Object.assign(window, { BarsModal, BridgesModal });