Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 29201 байт. Загружен за: 0сек.
Проверяемая страница не запрещена в robots.txt.
Цепочка редиректов для файла robots.txt:
http://novaskinwisp.ru/robots.txt
301 MovedPermanently
https://xn--80adthmec0a.xn--p1ai/robots.txt
200 OK
Показать содержимое robots.txt
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>NOVA SKIN</title>
<meta name="description" content="NOVA SKIN - носимая световая оболочка. Футура-спорт для города, события и кадра.">
<style>
:root {
--ink: #080808;
--paper: #f2f0eb;
--muted: rgba(242, 240, 235, 0.64);
--line: rgba(242, 240, 235, 0.12);
--panel: #111111;
--page-gutter: clamp(28px, 3.6vw, 52px);
}
* {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
margin: 0;
background: var(--ink);
color: var(--paper);
font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
a {
color: inherit;
}
.mono {
font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
letter-spacing: 0.18em;
text-transform: uppercase;
}
.nav {
position: fixed;
inset: 0 0 auto;
z-index: 10;
display: flex;
justify-content: space-between;
align-items: flex-start;
padding: 28px var(--page-gutter);
background: linear-gradient(to bottom, rgba(8, 8, 8, 0.66), rgba(8, 8, 8, 0));
}
.brand {
order: 1;
display: grid;
justify-items: start;
gap: 6px;
text-align: left;
text-decoration: none;
}
.brand strong {
font-size: 13px;
font-weight: 700;
}
.brand span {
display: flex;
width: 100%;
justify-content: space-between;
font-size: 10px;
font-style: normal;
line-height: 1;
color: var(--muted);
}
.brand i {
font-style: normal;
}
.button {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 42px;
padding: 0 22px;
border: 1px solid var(--paper);
background: var(--paper);
color: var(--ink);
font-size: 11px;
font-weight: 700;
text-decoration: none;
transition: transform 0.16s ease, opacity 0.16s ease;
}
.button:hover {
opacity: 0.86;
transform: translateY(-1px);
}
.button.secondary {
order: 2;
background: transparent;
color: var(--paper);
}
.button:disabled {
cursor: wait;
opacity: 0.58;
}
.buy-form {
margin: 0;
}
.order-modal {
position: fixed;
inset: 0;
z-index: 100;
display: none;
place-items: center;
padding: 20px;
background: rgba(0, 0, 0, 0.78);
backdrop-filter: blur(12px);
}
.order-modal.is-open {
display: grid;
}
.order-dialog {
width: min(100%, 620px);
max-height: calc(100svh - 40px);
overflow: auto;
position: relative;
padding: clamp(24px, 5vw, 44px);
border: 1px solid var(--line);
background: #111;
}
.order-dialog h2 {
margin: 0 48px 10px 0;
font-size: clamp(28px, 5vw, 48px);
line-height: 1;
}
.order-summary {
margin: 0 0 28px;
color: var(--muted);
line-height: 1.55;
}
.order-close {
width: 42px;
height: 42px;
position: absolute;
top: 18px;
right: 18px;
border: 1px solid var(--line);
background: transparent;
color: var(--paper);
cursor: pointer;
font-size: 24px;
}
.order-fields {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
.order-field {
display: grid;
gap: 8px;
}
.order-field.wide {
grid-column: 1 / -1;
}
.order-field label {
color: var(--muted);
font-size: 10px;
}
.order-field input,
.order-field textarea {
width: 100%;
border: 1px solid rgba(242, 240, 235, 0.24);
border-radius: 0;
outline: none;
background: #080808;
color: var(--paper);
font: inherit;
font-size: 16px;
padding: 14px;
}
.order-field textarea {
min-height: 88px;
resize: vertical;
}
.order-field input:focus,
.order-field textarea:focus {
border-color: var(--paper);
}
.order-consent {
display: flex;
gap: 10px;
align-items: flex-start;
margin: 18px 0;
color: var(--muted);
font-size: 12px;
line-height: 1.45;
}
.order-consent input {
margin-top: 3px;
}
.order-consent a,
.order-terms a {
color: var(--paper);
}
.order-delivery,
.order-terms {
color: var(--muted);
font-size: 12px;
line-height: 1.55;
}
.order-delivery {
margin: -14px 0 24px;
}
.order-terms {
margin: 14px 0 0;
text-align: center;
}
.order-submit {
width: 100%;
}
body.modal-open {
overflow: hidden;
}
.hero {
min-height: 100svh;
display: grid;
align-items: end;
position: relative;
overflow: hidden;
padding: 120px var(--page-gutter) 6.4vh;
}
.hero::before,
.hero::after {
content: "";
position: absolute;
inset: 0;
}
.hero::before {
background: url("assets/b68ef948-3b6e-4c52-8c79-a422f5a642f9.jpg") center 18% / cover no-repeat;
}
.hero::after {
background: linear-gradient(to bottom, rgba(8, 8, 8, 0.14), rgba(8, 8, 8, 0.86));
}
.hero-video {
display: block;
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
pointer-events: none;
}
video::-webkit-media-controls,
video::-webkit-media-controls-panel,
video::-webkit-media-controls-play-button,
video::-webkit-media-controls-start-playback-button {
display: none !important;
-webkit-appearance: none;
opacity: 0;
pointer-events: none;
}
.hero-inner {
position: relative;
z-index: 2;
width: min(760px, 64vw);
display: flex;
flex-direction: column;
align-items: flex-start;
}
.eyebrow,
.section-label {
margin: 0 0 22px;
color: rgba(242, 240, 235, 0.72);
font-size: 11px;
}
.hero .eyebrow {
margin-bottom: 23px;
color: rgba(244, 242, 237, 0.72);
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-weight: 550;
letter-spacing: 0.29em;
}
.hero h1 {
margin: 0;
max-width: 760px;
color: #f4f2ed;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: clamp(62px, 8vw, 122px);
font-weight: 470;
line-height: 0.83;
letter-spacing: -0.058em;
text-transform: uppercase;
transform: translateX(-0.04em);
}
.hero h1 span {
display: block;
margin: 0;
color: transparent;
font: inherit;
-webkit-text-stroke: 1.2px rgba(244, 242, 237, 0.92);
text-stroke: 1.2px rgba(244, 242, 237, 0.92);
}
.hero-meta {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 22px;
margin-top: 30px;
}
.hero-tagline {
margin: 0;
color: rgba(244, 242, 237, 0.88);
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 12px;
line-height: 1.35;
letter-spacing: 0.21em;
text-transform: uppercase;
}
.hero-copy {
display: contents;
}
.hero .button {
min-height: 48px;
padding-inline: 23px;
border-color: #f4f2ed;
background: #f4f2ed;
color: #0a0a0a;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 10px;
font-weight: 750;
letter-spacing: 0.19em;
}
.hero-index {
position: absolute;
right: var(--page-gutter);
bottom: 34px;
z-index: 2;
color: rgba(255, 255, 255, 0.52);
font-size: 10px;
letter-spacing: 0.2em;
text-transform: uppercase;
writing-mode: vertical-rl;
transform: rotate(180deg);
}
section {
padding: 64px clamp(18px, 4vw, 48px);
border-top: 1px solid var(--line);
}
.grid-3,
.grid-2 {
display: grid;
gap: 1px;
background: var(--line);
}
.grid-3 {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.grid-2 {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.tile,
.product,
.review {
background: var(--ink);
}
.photo {
display: block;
width: 100%;
aspect-ratio: 3 / 4;
object-fit: cover;
background: var(--panel);
}
.photo.wide {
aspect-ratio: 16 / 10;
}
.caption,
.product-body {
padding: 18px 0 0;
}
.caption strong,
.product h3 {
display: block;
margin: 0 0 6px;
font-size: 13px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.caption span,
.product p,
.review small {
color: var(--muted);
font-size: 13px;
}
.product {
padding-bottom: 28px;
}
.product-body {
padding-left: 24px;
padding-right: 24px;
}
.one-size {
margin: 20px 0 24px;
color: rgba(242, 240, 235, 0.72);
font-size: 11px;
}
.buy-form {
margin: 0;
}
.buy-form .button {
border-radius: 0;
cursor: pointer;
}
.material {
display: grid;
grid-template-columns: minmax(0, 1.1fr) minmax(280px, 0.9fr);
gap: clamp(28px, 5vw, 64px);
align-items: start;
}
.material-card {
min-height: 420px;
display: flex;
align-items: end;
padding: 24px;
background:
linear-gradient(to top, rgba(8, 8, 8, 0.78), rgba(8, 8, 8, 0) 46%),
url("assets/material-reflective-jacket.jpeg") center 44% / cover no-repeat;
color: rgba(242, 240, 235, 0.82);
}
.material h2 {
margin: 0 0 30px;
max-width: 13ch;
font-size: clamp(30px, 5vw, 56px);
line-height: 0.98;
letter-spacing: 0;
}
.features {
list-style: none;
margin: 0;
padding: 0;
border-bottom: 1px solid var(--line);
}
.features li {
display: grid;
grid-template-columns: 42px 1fr;
gap: 14px;
padding: 18px 0;
border-top: 1px solid var(--line);
color: rgba(242, 240, 235, 0.84);
line-height: 1.5;
}
.features b {
color: rgba(242, 240, 235, 0.42);
font: 700 11px "SFMono-Regular", Consolas, monospace;
}
.reviews {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 1px;
background: var(--line);
}
.review {
min-height: 240px;
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 34px 28px;
}
.review p {
margin: 0 0 28px;
font-size: clamp(17px, 1.6vw, 22px);
line-height: 1.45;
}
.shine {
min-height: 86svh;
display: grid;
place-items: center;
position: relative;
overflow: hidden;
text-align: center;
}
.shine::before,
.shine::after {
content: "";
position: absolute;
inset: 0;
}
.shine::before {
background: url("assets/d66fd9ef-5fb8-4125-9064-def7741ff69f.jpg") center 26% / cover no-repeat;
filter: grayscale(0.72) saturate(0.55) contrast(1.16) brightness(0.86);
transform: scale(1.01);
}
.shine::after {
background: linear-gradient(to bottom, rgba(8, 10, 12, 0.42), rgba(8, 8, 8, 0.58));
}
.shine-inner {
position: relative;
z-index: 1;
}
.shine h2 {
width: min(92vw, 1180px);
display: flex;
justify-content: space-between;
margin: 0 0 42px;
font-size: clamp(64px, 14vw, 170px);
line-height: 0.82;
letter-spacing: 0;
}
footer {
padding: 56px clamp(18px, 4vw, 48px) 36px;
border-top: 1px solid var(--line);
}
.footer-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 30px;
}
footer p {
margin: 0;
color: var(--muted);
font-size: 13px;
line-height: 1.8;
}
footer .bottom {
display: flex;
justify-content: space-between;
gap: 24px;
margin-top: 42px;
padding-top: 24px;
border-top: 1px solid var(--line);
color: rgba(242, 240, 235, 0.34);
font-size: 10px;
}
footer .bottom a {
color: inherit;
}
@media (max-width: 780px) {
.nav {
padding: 16px 18px;
}
.nav .button {
min-height: 36px;
padding-inline: 14px;
}
.hero {
min-height: 92svh;
padding: 120px 22px 34px;
}
.hero::before {
background-image: url("assets/hero-mobile-poster.jpg");
}
.hero::after {
z-index: 1;
}
.hero-video {
display: block;
}
.hero-inner {
width: calc(100vw - 44px);
}
.hero h1 {
font-size: clamp(50px, 15.5vw, 72px);
}
.hero-copy {
display: block;
width: min-content;
}
.hero-copy .hero-meta,
.hero-copy .hero-tagline {
width: 100%;
}
.hero-tagline {
display: flex;
justify-content: space-between;
letter-spacing: 0.16em;
white-space: nowrap;
}
.hero-index {
display: none;
}
@media (prefers-reduced-motion: reduce) {
.hero-video {
display: none;
}
}
section {
padding-top: 48px;
padding-bottom: 48px;
}
.grid-3,
.grid-2,
.material,
.reviews,
.footer-grid {
grid-template-columns: 1fr;
}
.order-fields {
grid-template-columns: 1fr;
}
.photo.wide {
aspect-ratio: 3 / 4;
}
.product-body {
padding-left: 18px;
padding-right: 18px;
}
.shine h2 {
font-size: clamp(58px, 21vw, 100px);
}
footer .bottom {
flex-direction: column;
}
}
</style>
</head>
<body>
<nav class="nav">
<a class="brand mono" href="#top" aria-label="NOVA SKIN">
<strong>НОВА СКИН</strong>
<span><i>С</i><i>И</i><i>Я</i><i>Й</i></span>
</a>
<a class="button secondary mono" href="#product">Заказать</a>
</nav>
<main id="top">
<header class="hero">
<video class="hero-video" autoplay muted loop playsinline webkit-playsinline preload="auto" disablepictureinpicture disableremoteplayback controlslist="nodownload nofullscreen noremoteplayback" poster="assets/hero-mobile-poster.jpg" aria-hidden="true">
<source src="assets/hero-mobile-full.mp4" type="video/mp4">
</video>
<div class="hero-inner">
<p class="eyebrow mono">Футура-спорт для выхода в люди</p>
<div class="hero-copy">
<h1>Свет выбирает<br><span>тебя</span></h1>
<div class="hero-meta">
<p class="hero-tagline"><span>Объём</span> <span>Движение</span> <span>Отражение</span></p>
<a class="button mono" href="#product">Смотреть коллекцию</a>
</div>
</div>
</div>
<div class="hero-index">NOVA SKIN / COLLECTION 01</div>
</header>
<section id="effect">
<p class="section-label mono">Как работает свет</p>
<div class="grid-3">
<article class="tile">
<img class="photo" src="assets/how-light-works-flash.jpg" alt="Белый костюм NOVA SKIN со световым кантом при вспышке">
<p class="caption"><strong>Вспышка</strong><span>оболочка вспыхивает</span></p>
</article>
<article class="tile">
<video class="photo" autoplay muted loop playsinline webkit-playsinline preload="auto" disablepictureinpicture disableremoteplayback aria-label="Костюм NOVA SKIN при дневном свете">
<source src="assets/how-light-works-day-v2.mp4" type="video/mp4">
</video>
<p class="caption"><strong>День</strong><span>матовый силуэт</span></p>
</article>
<article class="tile">
<img class="photo" src="assets/how-light-works-night.jpg" alt="Темно-синий и белый костюмы NOVA SKIN ночью">
<p class="caption"><strong>Ночь</strong><span>контур проявляется</span></p>
</article>
</div>
</section>
<section id="product">
<p class="section-label mono">Коллекция</p>
<div class="grid-2">
<article class="product">
<img class="photo" src="assets/product-white-v2.jpg" alt="Белый костюм NOVA SKIN">
<div class="product-body">
<h3>Костюм белый — кремовый</h3>
<p>25 000 ₽</p>
<p class="one-size mono">One size</p>
<button class="button mono buy-button" type="button" data-product="cream" data-name="Костюм белый — кремовый">Заказать</button>
</div>
</article>
<article class="product">
<img class="photo" src="assets/product-dark-blue-v2.jpg" alt="Темно-синий костюм NOVA SKIN">
<div class="product-body">
<h3>Костюм темно-синий</h3>
<p>25 000 ₽</p>
<p class="one-size mono">One size</p>
<button class="button mono buy-button" type="button" data-product="dark-blue" data-name="Костюм темно-синий">Заказать</button>
</div>
</article>
</div>
</section>
<section id="wear">
<p class="section-label mono">Как носить</p>
<img class="photo wide" src="assets/how-to-wear-group.jpg" alt="Общие образы NOVA SKIN для города">
</section>
<section id="material">
<div class="material">
<div class="material-card mono">Фактура / отражающий кант / малая партия</div>
<div>
<h2>Ткань, которая держит свет</h2>
<ul class="features">
<li><b>01</b><span>Отражающий кант ловит вспышку и фары, поэтому силуэт читается в темноте.</span></li>
<li><b>02</b><span>Легкий технологичный нейлон не парусит и держит форму.</span></li>
<li><b>03</b><span>Теплая подкладка работает от городского дня до ночного кадра.</span></li>
</ul>
</div>
</div>
</section>
<section class="shine">
<div class="shine-inner">
<h2><span>С</span><span>И</span><span>Я</span><span>Й</span></h2>
<a class="button mono" href="#product">Заказать</a>
</div>
</section>
</main>
<footer>
<div class="footer-grid">
<div>
<p class="section-label mono">Доставка</p>
<p>Россия — 3–5 дней<br>Стоимость рассчитывается после покупки</p>
</div>
<div>
<p class="section-label mono">Возврат</p>
<p>14 дней с момента получения<br>Без следов носки</p>
</div>
<div>
<p class="section-label mono">Контакт</p>
<p><a href="tel:+79960465422">+7 996 046-54-22</a><br><a href="mailto:rem.laer@gmail.com">rem.laer@gmail.com</a><br><a href="https://t.me/Rem_Laer">Telegram</a></p>
</div>
<div>
<p class="section-label mono">Продавец</p>
<p>ИП Лаер Рем Викторович<br>ИНН 100122547114<br>ОГРНИП 324430000001869<br>г. Киров, Хлебозаводской проезд, д. 3</p>
</div>
</div>
<div class="bottom mono">
<span>2026 NOVA SKIN</span>
<span><a href="/offer.html">Публичная оферта</a> · <a href="/privacy.html">Политика</a> · <a href="/consent.html">Согласие</a></span>
</div>
</footer>
<div class="order-modal" id="order-modal" aria-hidden="true">
<div class="order-dialog" role="dialog" aria-modal="true" aria-labelledby="order-title">
<button class="order-close" type="button" aria-label="Закрыть">×</button>
<p class="section-label mono">Оформление заказа</p>
<h2 id="order-title">Данные покупателя</h2>
<p class="order-summary"><span id="order-product-name"></span><br><strong>25 000 ₽</strong> · ONE SIZE</p>
<p class="order-delivery">Доставка по России — 3–5 дней. Стоимость рассчитывается после покупки, оплачивается отдельно и согласуется до передачи заказа перевозчику.</p>
<form class="buy-form" method="post" action="/api/create-payment">
<input type="hidden" name="product" id="order-product">
<input type="hidden" name="checkout_id" id="order-checkout-id">
<div class="order-fields">
<div class="order-field">
<label class="mono" for="customer-name">Имя и фамилия</label>
<input id="customer-name" name="customer_name" autocomplete="name" maxlength="100" required>
</div>
<div class="order-field">
<label class="mono" for="customer-phone">Телефон</label>
<input id="customer-phone" name="phone" type="tel" autocomplete="tel" inputmode="tel" placeholder="+7 999 000-00-00" maxlength="30" required>
</div>
<div class="order-field wide">
<label class="mono" for="customer-email">Email для чека и подтверждения</label>
<input id="customer-email" name="email" type="email" autocomplete="email" maxlength="120" required>
</div>
<div class="order-field wide">
<label class="mono" for="delivery-address">Адрес доставки</label>
<textarea id="delivery-address" name="address" autocomplete="street-address" maxlength="300" placeholder="Город, улица, дом, квартира, индекс" required></textarea>
</div>
</div>
<label class="order-consent">
<input type="checkbox" name="consent" value="yes" required>
<span>Даю отдельное <a href="/consent.html" target="_blank" rel="noopener">согласие на обработку персональных данных</a> для оформления, оплаты и доставки заказа.</span>
</label>
<button class="button mono order-submit" type="submit">Перейти к оплате · 25 000 ₽</button>
<p class="order-terms">Нажимая кнопку, покупатель принимает <a href="/offer.html" target="_blank" rel="noopener">публичную оферту</a> и подтверждает ознакомление с <a href="/privacy.html" target="_blank" rel="noopener">политикой обработки данных</a>.</p>
</form>
</div>
</div>
<script>
(() => {
const videos = [...document.querySelectorAll("video")];
if (!videos.length) return;
const startVideo = (video) => {
video.autoplay = true;
video.loop = true;
video.muted = true;
video.defaultMuted = true;
video.playsInline = true;
video.setAttribute("autoplay", "");
video.setAttribute("loop", "");
video.setAttribute("muted", "");
video.setAttribute("playsinline", "");
video.setAttribute("webkit-playsinline", "");
video.removeAttribute("controls");
if (video.paused) {
video.play().catch(() => {});
}
};
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) startVideo(entry.target);
});
}, { threshold: 0.05 });
const startVisibleVideos = () => videos.forEach((video) => {
const rect = video.getBoundingClientRect();
if (!document.hidden && rect.bottom > 0 && rect.top < innerHeight) startVideo(video);
});
videos.forEach((video) => {
startVideo(video);
observer.observe(video);
video.addEventListener("loadedmetadata", () => startVideo(video));
video.addEventListener("canplay", () => startVideo(video));
video.addEventListener("pause", () => {
const rect = video.getBoundingClientRect();
if (!document.hidden && rect.bottom > 0 && rect.top < innerHeight) startVideo(video);
});
video.addEventListener("stalled", () => video.load());
video.addEventListener("ended", () => {
video.currentTime = 0;
startVideo(video);
});
});
document.addEventListener("DOMContentLoaded", startVisibleVideos, { once: true });
window.addEventListener("load", startVisibleVideos, { once: true });
window.addEventListener("pageshow", startVisibleVideos);
document.addEventListener("visibilitychange", () => {
if (!document.hidden) startVisibleVideos();
});
let restartFrame = 0;
const restartOnViewportChange = () => {
cancelAnimationFrame(restartFrame);
restartFrame = requestAnimationFrame(startVisibleVideos);
};
window.addEventListener("scroll", restartOnViewportChange, { passive: true });
window.addEventListener("resize", restartOnViewportChange, { passive: true });
window.addEventListener("focus", startVisibleVideos);
document.addEventListener("touchstart", startVisibleVideos, { once: true, passive: true });
document.addEventListener("pointerdown", startVisibleVideos, { once: true, passive: true });
})();
(() => {
const modal = document.querySelector("#order-modal");
const form = modal?.querySelector("form");
const productInput = document.querySelector("#order-product");
const productName = document.querySelector("#order-product-name");
const checkoutIdInput = document.querySelector("#order-checkout-id");
const closeButton = modal?.querySelector(".order-close");
if (!modal || !form || !productInput || !productName || !checkoutIdInput || !closeButton) return;
const createCheckoutId = () => {
if (globalThis.crypto?.randomUUID) return globalThis.crypto.randomUUID();
if (!globalThis.crypto?.getRandomValues) {
return `${Date.now()}-${Math.random().toString(36).slice(2)}-${Math.random().toString(36).slice(2)}`;
}
const bytes = new Uint8Array(16);
globalThis.crypto.getRandomValues(bytes);
return Array.from(bytes, (value) => value.toString(16).padStart(2, "0")).join("");
};
const closeModal = () => {
modal.classList.remove("is-open");
modal.setAttribute("aria-hidden", "true");
document.body.classList.remove("modal-open");
};
document.querySelectorAll(".buy-button").forEach((button) => {
button.addEventListener("click", () => {
productInput.value = button.dataset.product || "";
productName.textContent = button.dataset.name || "";
checkoutIdInput.value = createCheckoutId();
modal.classList.add("is-open");
modal.setAttribute("aria-hidden", "false");
document.body.classList.add("modal-open");
document.querySelector("#customer-name")?.focus();
});
});
closeButton.addEventListener("click", closeModal);
modal.addEventListener("click", (event) => {
if (event.target === modal) closeModal();
});
document.addEventListener("keydown", (event) => {
if (event.key === "Escape") closeModal();
});
form.addEventListener("submit", () => {
if (!checkoutIdInput.value) checkoutIdInput.value = createCheckoutId();
const submit = form.querySelector("[type=submit]");
if (submit) {
submit.disabled = true;
submit.textContent = "Переходим к оплате…";
}
});
})();
</script>
</body>
</html>