Камерный театр в Москве
01 / ГЛАВНАЯ
Чисто театр «Intact»
Короткое описание театра будет согласовано.
Фото будет согласовано
Все запланированные показы сгруппированы по месяцам.
Названия, жанры и возрастные ограничения будут уточнены.
Карточка каждого актёра раскрывает краткую биографию и роли.
О театре
Текст о театре будет согласован.
01Камерный зрительный зал
02Зритель рядом со сценой
03Москва, Сущёвский Вал
Фото зала будет согласовано
ГОЛОСА ЗРИТЕЛЕЙ / 01 «Здесь будет короткая сильная цитата зрителя, выбранная после согласования». Имя зрителя / источник отзыва
Выберите билетную платформу
На спектакли театра Intact можно перейти через одну из трёх площадок.
${event.month}
${event.weekday}
${event.time}
${event.title}
${event.meta}
`).join("")} `).join(""); } function renderShows() { showRoot.innerHTML = shows.map((show, index) => `
= 3 ? "hidden" : ""}>${String(index + 1).padStart(2, "0")}Фото будет согласовано
${show.title}
${show.genre}${show.age}
О спектакле ↗ `).join(""); } function renderTroupe() { troupeRoot.innerHTML = troupe.map((person, index) => `
= 8 ? "hidden" : ""}>${String(index + 1).padStart(2, "0")}
${person.name}
${person.bio}
`).join(""); } function toggleCollection(root, button, expandedLabel, collapsedLabel) { const willExpand = button.getAttribute("aria-expanded") !== "true"; root.querySelectorAll("[hidden]").forEach((item) => { item.hidden = !willExpand; }); if (!willExpand) { const visibleCount = root === showRoot ? 3 : 8; [...root.children].forEach((item, index) => { item.hidden = index >= visibleCount; }); } root.classList.toggle("is-expanded", willExpand); button.setAttribute("aria-expanded", String(willExpand)); button.textContent = willExpand ? expandedLabel : collapsedLabel; } function openModal(trigger) { lastFocused = trigger; modal.classList.add("is-open"); modal.setAttribute("aria-hidden", "false"); document.body.classList.add("is-locked"); modalClose.focus(); } function closeModal() { modal.classList.remove("is-open"); modal.setAttribute("aria-hidden", "true"); document.body.classList.remove("is-locked"); if (lastFocused) lastFocused.focus(); } function closeMenu() { menu.classList.remove("is-open"); menuButtons.forEach((button) => button.setAttribute("aria-expanded", "false")); } function toggleMenu() { const willOpen = !menu.classList.contains("is-open"); menu.classList.toggle("is-open", willOpen); menuButtons.forEach((button) => button.setAttribute("aria-expanded", String(willOpen))); } getEvents().then(renderEvents); renderShows(); renderTroupe(); showsToggle.addEventListener("click", () => { toggleCollection(showRoot, showsToggle, "Свернуть репертуар", "Весь репертуар"); }); troupeToggle.addEventListener("click", () => { toggleCollection(troupeRoot, troupeToggle, "Свернуть труппу", "Показать всю труппу"); }); site.addEventListener("click", (event) => { const ticketTrigger = event.target.closest("[data-ticket-open]"); const menuTrigger = event.target.closest("[data-menu-toggle]"); if (ticketTrigger) { openModal(ticketTrigger); return; } if (menuTrigger) { toggleMenu(); return; } if (event.target === modal || event.target.closest("[data-ticket-close]")) { closeModal(); return; } if (event.target.closest(".intact-mobile-menu a")) { closeMenu(); } if (event.target.closest(".intact-platform[href='#']")) { event.preventDefault(); } }); site.addEventListener("keydown", (event) => { if (event.key === "Escape") { if (modal.classList.contains("is-open")) closeModal(); if (menu.classList.contains("is-open")) closeMenu(); } if (event.key === "Tab" && modal.classList.contains("is-open")) { const focusable = [...modal.querySelectorAll("button, a[href]")]; const first = focusable[0]; const last = focusable[focusable.length - 1]; if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last.focus(); } else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first.focus(); } } }); })();