Navigation: - Nav bar pill shape (border-radius: 100px), dark glass style - Icons added to all nav items (FA4 outline variants, fixed-width alignment) - Footer hidden on all devices (nav panel covers mobile) - Footer nav icons + text added before removal Forms (ask.md, plan.md): - Full glassmorphism redesign: rounded card, blur backdrop - Input borders visible (#b8c4ce), focus ring, proper placeholder colors - Select: self-contained CSS, no backdrop-filter conflict, arrow fixed - Submit button: gradient with shadow - File upload button: .file-btn class, fa-arrow-down icon - form-note styled as info callout with left border + ⓘ icon - Footnotes sup.fn: circular badge, baseline positioning (no line-height jump) - Footnote ¹ on both consent checkboxes, accordion = full legal text - Dark mode: opaque dark card (rgba 22,26,34,0.88), proper contrast - Dark mode success/error messages adapted - Double checkmark bug fixed (removed ::after overlay) - Italic removed from privacy-details text Layout: - #main rounded corners (20px all sides) + margin for visibility - Post card images rounded (border-radius: 10px) - Page titles: uppercase removed, font-weight 900, left-aligned - "Подробнее" button hidden on post cards - iOS background-attachment: fixed bug fixed (scroll on mobile) - Pagination mobile: counter restored, buttons above footer Content: - Page titles uncommented in front matter (gallery, map, ask, plan) - Duplicate rawhtml title blocks removed Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
15 KiB
Executable File
+++ title = 'Предстоящие поездки' slug = 'plan' disableComments = true +++ {{< rawhtml >}}
{{< /rawhtml >}}
Хотите присоединится к поездке? Ознакомьтесь с условиями участия и заполните форму
Условия участия
Дронослёты
- Подача заявки: минимум за 5 дней до даты поездки
- Обсуждение деталей: Telegram чат "Полёты БВС"
Важная информация
- Время выезда: обычно рано утром, в зависимости от удалённости локации
- Email: проверьте папку "Нежелательные" - ответ может попасть туда
{{< rawhtml >}}
if (success) {
const messageDiv = document.createElement('div');
messageDiv.className = 'form-message form-success';
messageDiv.textContent = success;
document.querySelector('.travel-form-container').insertBefore(messageDiv, document.querySelector('.travel-form'));
}
if (error) {
const messageDiv = document.createElement('div');
messageDiv.className = 'form-message form-error';
messageDiv.textContent = error;
document.querySelector('.travel-form-container').insertBefore(messageDiv, document.querySelector('.travel-form'));
}
// Русские сообщения валидации
const inputs = document.querySelectorAll('input[required], select[required], textarea[required]');
inputs.forEach(function(input) {
input.addEventListener('invalid', function() {
if (input.type === 'checkbox') {
input.setCustomValidity('Пожалуйста, отметьте этот пункт для продолжения');
} else if (input.type === 'email') {
input.setCustomValidity('Пожалуйста, введите корректный email адрес');
} else if (input.tagName === 'SELECT') {
input.setCustomValidity('Пожалуйста, выберите один из вариантов');
} else {
input.setCustomValidity('Пожалуйста, заполните это поле');
}
});
input.addEventListener('input', function() {
input.setCustomValidity('');
});
});
// Загружаем скрипт шифрования
const encryptionScript = document.createElement('script');
encryptionScript.src = '/js/encryption.js';
encryptionScript.onload = function() {};
encryptionScript.onerror = function() {};
document.head.appendChild(encryptionScript);
// Загружаем скрипт динамического заполнения поездок
const tripScript = document.createElement('script');
tripScript.src = '/js/trip-form-loader.js';
tripScript.onload = function() {
if (typeof TripFormLoader !== 'undefined') {
window.tripFormLoader = new TripFormLoader();
window.tripFormLoader.populateTripsDropdown();
}
};
tripScript.onerror = function() {};
document.head.appendChild(tripScript);
});
// Обработчик отправки формы
function handleFormSubmit(event) {
event.preventDefault();
const form = event.target;
const formData = new FormData(form);
const submitBtn = form.querySelector('.submit-btn');
// Показываем состояние загрузки
submitBtn.textContent = 'Отправляем...';
submitBtn.disabled = true;
fetch('/forms/send_plan.php', {
method: 'POST',
body: formData
})
.then(response => {
return response.text();
})
.then(text => {
try {
const data = JSON.parse(text);
return data;
} catch (e) {
throw new Error('Сервер вернул не JSON: ' + text.substring(0, 100));
}
})
.then(data => {
if (data.success) {
// Успех
const successDiv = document.createElement('div');
successDiv.className = 'form-message form-success';
successDiv.textContent = data.message;
form.parentNode.insertBefore(successDiv, form);
form.reset();
} else {
// Ошибка
const errorDiv = document.createElement('div');
errorDiv.className = 'form-message form-error';
errorDiv.textContent = data.error;
form.parentNode.insertBefore(errorDiv, form);
}
})
.catch(error => {
// Ошибка сети
const errorDiv = document.createElement('div');
errorDiv.className = 'form-message form-error';
errorDiv.textContent = 'Ошибка отправки формы. Попробуйте еще раз.';
form.parentNode.insertBefore(errorDiv, form);
})
.finally(() => {
// Восстанавливаем кнопку
submitBtn.textContent = 'Отправить';
submitBtn.disabled = false;
});
return false;
}
</script>
<form class="travel-form" action="/forms/send_plan.php" method="POST" enctype="multipart/form-data" onsubmit="return handleFormSubmit(event)">
<div class="form-group">
<label for="name">Фамилия, имя *</label>
<input type="text" id="name" name="name" placeholder="Введите Вашу фамилию и имя" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" placeholder="ivan@mail.ru">
</div>
<div class="form-group">
<label for="phone">Телефон *</label>
<input type="tel" id="phone" name="phone" placeholder="Введите телефон" required>
</div>
<div class="form-group">
<label for="telegram">Ник в Telegram</label>
<input type="text" id="telegram" name="telegram" placeholder="@ваш_ник">
</div>
<div class="form-note">
<p>Укажите email или Telegram ник (одно из двух обязательно)</p>
</div>
<div class="form-group">
<label for="bvs_number">Учётный номер БВС *</label>
<textarea id="bvs_number" name="bvs_number" placeholder="БВС от 0,15 кг — учётный номер, например: 123456789AB БВС до 0,15 кг — серийный номер с фюзеляжа" required></textarea>
</div>
<div class="form-group">
<label for="bvs_file">Уведомление о постановке на учёт (.pdf)<br><small style="font-weight:400; color:#888;">Для БВС от 0,15 кг обязательно. Для БВС до 0,15 кг — фото с серийным номером запросим отдельно</small></label>
<div style="margin-top: 10px;">
<label for="bvs_file" class="file-btn"><i class="icon fa-arrow-down"></i> Выбрать файл</label>
<span id="file-name" class="file-name-display"></span>
</div>
<input type="file" id="bvs_file" name="bvs_file" accept=".pdf" style="display: none;">
</div>
<script>
document.getElementById('bvs_file').addEventListener('change', function(e) {
const fileName = e.target.files[0]?.name || '';
document.getElementById('file-name').textContent = fileName ? '✓ ' + fileName : '';
});
</script>
<div class="form-group">
<label for="trip_period">Выберите мероприятие</label>
<select id="trip_period" name="trip_period">
<option value="" disabled selected></option>
<!-- Опции будут загружены динамически из upcoming-trips.json -->
</select>
</div>
<!-- Загрузка файлов временно отключена -->
<div class="form-group checkbox-group">
<label class="checkbox-container">
<input type="checkbox" id="privacy_consent" name="privacy_consent" required>
<span class="checkmark"></span>
<span class="privacy-text">
Я выражаю своё согласие на обработку персональных данных <sup class="fn">1</sup>
<div class="privacy-details">
<p>Персональные данные обрабатываются исключительно для получения разрешения на полёты БВС. Согласие действует 1 месяц. Отзыв согласия – заявление на sleep-trip@ya.ru</p>
</div>
</span>
</label>
</div>
<div class="form-group checkbox-group">
<label class="checkbox-container">
<input type="checkbox" id="age_consent" name="age_consent" required>
<span class="checkmark"></span>
<span class="privacy-text">
Мне есть 18 лет <sup class="fn">2</sup>
</span>
</label>
</div>
<button type="submit" class="submit-btn">
Отправить
</button>
</form>
{{< rawhtml >}}
1 Постановка «галочки» в чекбоксе является подтверждением вашего согласия — читать полный текст (ФЗ №152)
Заполнение «чек-бокса» (проставление «галочки»/«веб-метки» на сайте sleeptrip.ru в графе «Я согласен на обработку персональных данных») и нажатие соответствующей кнопки и (или) направление персональных данных (фамилия, имя, телефон, имя (ник) в Телеграм) в ответном письме на адрес: sleep-trip@ya.ru является подтверждением Вашего согласия на обработку персональных данных либо с целью получения разрешения на полёты беспилотного воздушного судна (БВС), либо с целью ответа на вопрос, заданный на сайте sleeptrip.ru.
Предоставленные персональные данные будут обрабатываться в соответствии с положениями Федерального закона Российской Федерации №152-ФЗ от 27.07.2006 «О персональных данных».
Заявление об уточнении персональных данных, отзыве настоящего согласия может быть направлено по электронной почте по адресу: sleep-trip@ya.ru.
СОГЛАСИЕ НА ОБРАБОТКУ ПЕРСОНАЛЬНЫХ ДАННЫХ
Я выражаю свое согласие на обработку, включая: сбор, запись, систематизацию, накопление, хранение, уточнение (обновление, изменение), извлечение, использование, передачу (предоставление, доступ), блокирование, обезличивание, удаление, уничтожение, своих персональных данных (в случае предоставления мной) Оператору (владельцу сайта sleeptrip.ru) для целей:
- обеспечения получения разрешения на полёты БВС и направления мне информационных сообщений о статусе получения такого разрешения;
- ответа на вопрос, заданный на сайте sleeptrip.ru.
Я согласен и разрешаю Оператору обрабатывать мои персональные данные с использованием средств автоматизации или без использования таких средств (смешанная обработка).
Я согласен с тем, что мои персональные данные будут переданы третьим лицам – Единой системе организации воздушного движения, сервису «Небосвод» (skyarc.ru) или сервису СППИ (sppi.ivprf.ru), а также сотрудникам полиции (в случае взаимодействия с ними на местности) для реализации целей обработки персональных данных — получения разрешения на полёты БВС. Без передачи данных указанным организациям реализация целей обработки персональных данных будет невозможна.
Настоящее Согласие действует до момента достижения целей обработки или отзыва согласия на обработку, но не более 1 (одного) месяца с момента предоставления Согласия.
2 Отметка подтверждает, что участнику поездки исполнилось 18 лет.
{{< /rawhtml >}}