UX overhaul: glassmorphism nav/footer, forms redesign, mobile fixes

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>
This commit is contained in:
Kirik
2026-03-24 00:44:57 +01:00
parent e5fc0fa4e4
commit 3de138ff41
15 changed files with 964 additions and 541 deletions
+26 -41
View File
@@ -1,16 +1,12 @@
+++
# title = 'Спросить'
title = 'Хочу поехать'
slug = 'ask'
disableComments = true
+++
{{< rawhtml >}}
<h3 align="center">Задать вопрос</h3>
<p class="page-lead">Есть вопрос или хотите предложить маршрут — напишите нам. <a href="/plan/">Смотреть календарь поездок →</a></p>
{{< /rawhtml >}}
Если у Вас есть вопрос или Вы хотите предложить свою локацию / тур для поездки, напишите в форме ниже. Мы вам с радостью ответим!
**Календарь поездок** можно посмотреть [здесь](/plan/)
{{< rawhtml >}}
<div class="contact-form-container">
<!-- Сообщения об успехе/ошибке -->
@@ -57,12 +53,8 @@ disableComments = true
// Загружаем скрипт шифрования
const script = document.createElement('script');
script.src = '/js/encryption.js';
script.onload = function() {
console.log('✅ Скрипт шифрования загружен для формы ask');
};
script.onerror = function() {
console.error('❌ Ошибка загрузки скрипта шифрования');
};
script.onload = function() {};
script.onerror = function() {};
document.head.appendChild(script);
});
@@ -83,12 +75,9 @@ disableComments = true
body: formData
})
.then(response => {
console.log('HTTP статус:', response.status);
console.log('Content-Type:', response.headers.get('content-type'));
return response.text();
})
.then(text => {
console.log('Ответ сервера:', text);
try {
const data = JSON.parse(text);
return data;
@@ -147,19 +136,19 @@ disableComments = true
</div>
<div class="form-note">
<p>* Укажите email или Telegram ник (одно из двух обязательно)</p>
<p>Укажите email или Telegram ник (одно из двух обязательно)</p>
</div>
<div class="form-group">
<label for="subject">Тема *</label>
<select id="subject" name="subject" required>
<option value="">Выберите тему...</option>
<option value="" disabled selected></option>
<option value="работа сайта">Работа сайта</option>
<option value="запланированные мероприятия">Запланированные мероприятия</option>
<option value="пройденные маршруты">Пройденные маршруты</option>
<option value="условия участия">Условия участия</option>
<option value="условия сотрудничества">Условия сотрудничества</option>
<option value="хочу предложить поездку">Хочу предложить поездку</option>
<option value="хочу предложить поездку">Предложить поездку</option>
<option value="контакты для связи">Контакты для связи</option>
</select>
</div>
@@ -175,7 +164,7 @@ disableComments = true
<input type="checkbox" id="privacy_consent" name="privacy_consent" required>
<span class="checkmark"></span>
<span class="privacy-text">
Я согласен на обработку персональных данных в соответствии с ФЗ №152 <sup>1</sup>
Я согласен на обработку персональных данных в соответствии с ФЗ №152 <sup class="fn">1</sup>
<div class="privacy-details">
<p>Данные будут обрабатываться для ответа на ваш вопрос.</p>
<p>Согласие действует 1 месяц. Отзыв согласия: <a href="mailto:sleep-trip@ya.ru">sleep-trip@ya.ru</a></p>
@@ -191,26 +180,22 @@ disableComments = true
</div>
{{< /rawhtml >}}
---
### Пояснения к форме:
<sup>1</sup> **Согласие на обработку персональных данных:**
Заполнение «чек-бокса» (проставление «галочки»/ «веб-метки» на сайте sleeptrip.ru в графе «Я согласен на обработку персональных данных») и нажатие соответствующей кнопки и (или) направление персональных данных (фамилия, имя, телефон, имя (ник) в Телеграм) в ответном письме на адрес: sleep-trip@ya.ru является подтверждением Вашего согласия на обработку персональных данных либо с целью получения разрешения на полёты беспилотного воздушного судна (БВС), либо с целью ответа на вопрос, заданный на сайте sleeptrip.ru.
Предоставленные персональные данные будут обрабатываться в соответствии с положениями Федерального закона Российской Федерации №152-ФЗ от 27.07.2006 «О персональных данных».
Заявление об уточнении персональных данных, отзыве настоящего согласия может быть направлено по электронной почте по адресу: sleep-trip@ya.ru.
Я выражаю свое согласие на обработку, включая: сбор, запись, систематизацию, накопление, хранение, уточнение (обновление, изменение), извлечение, использование, передачу (предоставление, доступ), блокирование, обезличивание, удаление, уничтожение, своих персональных данных (в случае предоставления мной) Оператору (владельцу сайта sleeptrip.ru) для целей:
- обеспечения получения разрешения на полёты БВС и направления мне информационных сообщений о статусе получения такого разрешения;
- ответа на вопрос, заданный на сайте sleeptrip.ru.
Я согласен и разрешаю Оператору обрабатывать мои персональные данные с использованием средств автоматизации или без использования таких средств (смешанная обработка).
Я согласен с тем, что мои персональные данные будут переданы третьим лицам – Единой системе организации воздушного движения, сервису "Небосвод" (skyarc.ru) или сервису СППИ (https://sppi.ivprf.ru), а также сотрудникам полиции (в случае взаимодействия с ними на местности) для реализации целей обработки персональных данных - получения разрешения на полёты БВС. Без передачи данных указанным организациям (сервисам) реализация целей обработки персональных данных будет невозможна.
Настоящее Согласие действует до момента достижения целей обработки или отзыва согласия на обработку, но не более 1 (одного) месяца с момента предоставления Согласия.
{{< rawhtml >}}
<details class="legal-details">
<summary><sup class="fn">1</sup> Постановка «галочки» в чекбоксе является подтверждением вашего согласия — читать полный текст (ФЗ №152)</summary>
<div class="legal-text">
<p>Заполнение «чек-бокса» (проставление «галочки»/«веб-метки» на сайте sleeptrip.ru в графе «Я согласен на обработку персональных данных») и нажатие соответствующей кнопки и (или) направление персональных данных (фамилия, имя, телефон, имя (ник) в Телеграм) в ответном письме на адрес: sleep-trip@ya.ru является подтверждением Вашего согласия на обработку персональных данных либо с целью получения разрешения на полёты беспилотного воздушного судна (БВС), либо с целью ответа на вопрос, заданный на сайте sleeptrip.ru.</p>
<p>Предоставленные персональные данные будут обрабатываться в соответствии с положениями Федерального закона Российской Федерации №152-ФЗ от 27.07.2006 «О персональных данных».</p>
<p>Заявление об уточнении персональных данных, отзыве настоящего согласия может быть направлено по электронной почте по адресу: <a href="mailto:sleep-trip@ya.ru">sleep-trip@ya.ru</a>.</p>
<p>Я выражаю свое согласие на обработку, включая: сбор, запись, систематизацию, накопление, хранение, уточнение (обновление, изменение), извлечение, использование, передачу (предоставление, доступ), блокирование, обезличивание, удаление, уничтожение, своих персональных данных (в случае предоставления мной) Оператору (владельцу сайта sleeptrip.ru) для целей:</p>
<ul>
<li>обеспечения получения разрешения на полёты БВС и направления мне информационных сообщений о статусе получения такого разрешения;</li>
<li>ответа на вопрос, заданный на сайте sleeptrip.ru.</li>
</ul>
<p>Я согласен и разрешаю Оператору обрабатывать мои персональные данные с использованием средств автоматизации или без использования таких средств (смешанная обработка).</p>
<p>Я согласен с тем, что мои персональные данные будут переданы третьим лицам – Единой системе организации воздушного движения, сервису «Небосвод» (skyarc.ru) или сервису СППИ (sppi.ivprf.ru), а также сотрудникам полиции (в случае взаимодействия с ними на местности) для реализации целей обработки персональных данных — получения разрешения на полёты БВС. Без передачи данных указанным организациям реализация целей обработки персональных данных будет невозможна.</p>
<p>Настоящее Согласие действует до момента достижения целей обработки или отзыва согласия на обработку, но не более 1 (одного) месяца с момента предоставления Согласия.</p>
</div>
</details>
{{< /rawhtml >}}
+34 -56
View File
@@ -1,11 +1,9 @@
+++
title = 'Предстоящие поездки'
slug = 'plan'
# description = 'Выберите поездку из календаря'
disableComments = true
+++
{{< rawhtml >}}
<h3 align="center">Предстоящие поездки</h3>
<!-- Календарь поездок из upcoming-trips.json -->
<div id="trips-grid" class="trips-calendar">
<!-- Карточки поездок будут загружены динамически -->
@@ -76,29 +74,20 @@ disableComments = true
// Загружаем скрипт шифрования
const encryptionScript = document.createElement('script');
encryptionScript.src = '/js/encryption.js';
encryptionScript.onload = function() {
console.log('✅ Скрипт шифрования загружен для формы plan');
};
encryptionScript.onerror = function() {
console.error('❌ Ошибка загрузки скрипта шифрования');
};
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() {
console.log('✅ Скрипт загрузчика поездок загружен');
// Принудительно инициализируем после загрузки скрипта
if (typeof TripFormLoader !== 'undefined') {
window.tripFormLoader = new TripFormLoader();
window.tripFormLoader.populateTripsDropdown();
console.log('🔄 Принудительная инициализация загрузчика поездок');
}
};
tripScript.onerror = function() {
console.error('❌ Ошибка загрузки скрипта поездок');
};
tripScript.onerror = function() {};
document.head.appendChild(tripScript);
});
@@ -119,12 +108,9 @@ disableComments = true
body: formData
})
.then(response => {
console.log('HTTP статус:', response.status);
console.log('Content-Type:', response.headers.get('content-type'));
return response.text(); // Сначала получаем как текст
return response.text();
})
.then(text => {
console.log('Ответ сервера:', text);
try {
const data = JSON.parse(text);
return data;
@@ -188,19 +174,19 @@ disableComments = true
</div>
<div class="form-note">
<p>* Укажите email или Telegram ник (одно из двух обязательно)</p>
<p>Укажите email или Telegram ник (одно из двух обязательно)</p>
</div>
<div class="form-group">
<label for="bvs_number"><strong>Учётный номер для БВС от 0,15 кг или серийный номер для БВС до 0,15 кг *</strong></label>
<textarea id="bvs_number" name="bvs_number" placeholder="Укажите учётный номер для БВС от 0,15 кг или серийный номер для БВС до 0,15 кг" required></textarea>
<label for="bvs_number">Учётный номер БВС *</label>
<textarea id="bvs_number" name="bvs_number" placeholder="БВС от 0,15 кг — учётный номер, например: 123456789AB&#10;БВС до 0,15 кг серийный номер с фюзеляжа" required></textarea>
</div>
<div class="form-group">
<label for="bvs_file">Загрузите уведомление в .pdf о постановке на учёт БВС от 0,15 кг, заявки без указанного уведомления не будут рассмотрены. Для БВС до 0,15 кг будут отдельно запрошены фотографии с серийным номером на фюзеляже БВС</label>
<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" style="display: inline-block; padding: 10px 20px; background-color: #007bff; color: white; border-radius: 4px; cursor: pointer; font-weight: bold;">Выбрать файл</label>
<span id="file-name" style="margin-left: 10px; color: #666;"></span>
<label for="bvs_file" class="file-btn"><i class="icon fa-arrow-down"></i>&nbsp;&nbsp;Выбрать файл</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>
@@ -215,7 +201,7 @@ disableComments = true
<div class="form-group">
<label for="trip_period">Выберите мероприятие</label>
<select id="trip_period" name="trip_period">
<option value=""></option>
<option value="" disabled selected></option>
<!-- Опции будут загружены динамически из upcoming-trips.json -->
</select>
</div>
@@ -227,7 +213,7 @@ disableComments = true
<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>
@@ -240,7 +226,7 @@ disableComments = true
<input type="checkbox" id="age_consent" name="age_consent" required>
<span class="checkmark"></span>
<span class="privacy-text">
Мне есть 18 лет <sup>2</sup>
Мне есть 18 лет <sup class="fn">2</sup>
</span>
</label>
</div>
@@ -252,31 +238,23 @@ disableComments = true
</div>
{{< /rawhtml >}}
---
### Пояснения к форме:
<sup>1</sup> **Согласие на обработку персональных данных:**
Заполнение «чек-бокса» (проставление «галочки»/ «веб-метки» на сайте sleeptrip.ru в графе «Я согласен на обработку персональных данных») и нажатие соответствующей кнопки и (или) направление персональных данных (фамилия, имя, телефон, имя (ник) в Телеграм) в ответном письме на адрес: sleep-trip@ya.ru является подтверждением Вашего согласия на обработку персональных данных либо с целью получения разрешения на полёты беспилотного воздушного судна (БВС), либо с целью ответа на вопрос, заданный на сайте sleeptrip.ru.
Предоставленные персональные данные будут обрабатываться в соответствии с положениями Федерального закона Российской Федерации №152-ФЗ от 27.07.2006 «О персональных данных».
Заявление об уточнении персональных данных, отзыве настоящего согласия может быть направлено по электронной почте по адресу: sleep-trip@ya.ru.
<div style="text-align: center; font-weight: bold; margin: 20px 0;">СОГЛАСИЕ НА ОБРАБОТКУ ПЕРСОНАЛЬНЫХ ДАННЫХ</div>
Я выражаю свое согласие на обработку, включая: сбор, запись, систематизацию, накопление, хранение, уточнение (обновление, изменение), извлечение, использование, передачу (предоставление, доступ), блокирование, обезличивание, удаление, уничтожение, своих персональных данных (в случае предоставления мной) Оператору (владельцу сайта sleeptrip.ru) для целей:
- обеспечения получения разрешения на полёты БВС и направления мне информационных сообщений о статусе получения такого разрешения;
- ответа на вопрос, заданный на сайте sleeptrip.ru.
Я согласен и разрешаю Оператору обрабатывать мои персональные данные с использованием средств автоматизации или без использования таких средств (смешанная обработка).
Я согласен с тем, что мои персональные данные будут переданы третьим лицам – Единой системе организации воздушного движения, сервису "Небосвод" (skyarc.ru) или сервису СППИ (https://sppi.ivprf.ru), а также сотрудникам полиции (в случае взаимодействия с ними на местности) для реализации целей обработки персональных данных - получения разрешения на полёты БВС. Без передачи данных указанным организациям (сервисам) реализация целей обработки персональных данных будет невозможна.
Настоящее Согласие действует до момента достижения целей обработки или отзыва согласия на обработку, но не более 1 (одного) месяца с момента предоставления Согласия.
<sup>2</sup> **Подтверждение совершеннолетия:** Поставление отметки в данном поле подтверждает, что вам исполнилось 18 лет.
---
{{< rawhtml >}}
<details class="legal-details">
<summary><sup class="fn">1</sup> Постановка «галочки» в чекбоксе является подтверждением вашего согласия — читать полный текст (ФЗ №152)</summary>
<div class="legal-text">
<p>Заполнение «чек-бокса» (проставление «галочки»/«веб-метки» на сайте sleeptrip.ru в графе «Я согласен на обработку персональных данных») и нажатие соответствующей кнопки и (или) направление персональных данных (фамилия, имя, телефон, имя (ник) в Телеграм) в ответном письме на адрес: sleep-trip@ya.ru является подтверждением Вашего согласия на обработку персональных данных либо с целью получения разрешения на полёты беспилотного воздушного судна (БВС), либо с целью ответа на вопрос, заданный на сайте sleeptrip.ru.</p>
<p>Предоставленные персональные данные будут обрабатываться в соответствии с положениями Федерального закона Российской Федерации №152-ФЗ от 27.07.2006 «О персональных данных».</p>
<p>Заявление об уточнении персональных данных, отзыве настоящего согласия может быть направлено по электронной почте по адресу: <a href="mailto:sleep-trip@ya.ru">sleep-trip@ya.ru</a>.</p>
<p><strong>СОГЛАСИЕ НА ОБРАБОТКУ ПЕРСОНАЛЬНЫХ ДАННЫХ</strong></p>
<p>Я выражаю свое согласие на обработку, включая: сбор, запись, систематизацию, накопление, хранение, уточнение (обновление, изменение), извлечение, использование, передачу (предоставление, доступ), блокирование, обезличивание, удаление, уничтожение, своих персональных данных (в случае предоставления мной) Оператору (владельцу сайта sleeptrip.ru) для целей:</p>
<ul>
<li>обеспечения получения разрешения на полёты БВС и направления мне информационных сообщений о статусе получения такого разрешения;</li>
<li>ответа на вопрос, заданный на сайте sleeptrip.ru.</li>
</ul>
<p>Я согласен и разрешаю Оператору обрабатывать мои персональные данные с использованием средств автоматизации или без использования таких средств (смешанная обработка).</p>
<p>Я согласен с тем, что мои персональные данные будут переданы третьим лицам – Единой системе организации воздушного движения, сервису «Небосвод» (skyarc.ru) или сервису СППИ (sppi.ivprf.ru), а также сотрудникам полиции (в случае взаимодействия с ними на местности) для реализации целей обработки персональных данных — получения разрешения на полёты БВС. Без передачи данных указанным организациям реализация целей обработки персональных данных будет невозможна.</p>
<p>Настоящее Согласие действует до момента достижения целей обработки или отзыва согласия на обработку, но не более 1 (одного) месяца с момента предоставления Согласия.</p>
</div>
</details>
<p class="legal-note"><sup class="fn">2</sup> Отметка подтверждает, что участнику поездки исполнилось 18 лет.</p>
{{< /rawhtml >}}
+5 -1
View File
@@ -1,13 +1,17 @@
items:
- title: 'Хочу поехать'
url: '/plan'
icon: 'fa-calendar-o'
- title: 'Маршруты'
url: '/map'
icon: 'fa-map-o'
- title: 'Спросить'
url: '/ask'
icon: 'fa-envelope-o'
- title: 'Галерея'
url: '/gallery'
icon: 'fa-picture-o'
+5 -1
View File
@@ -1,13 +1,17 @@
items:
- title: 'Хочу поехать'
url: '/plan'
icon: 'fa-calendar-o'
- title: 'Маршруты'
url: '/map'
icon: 'fa-map-o'
- title: 'Спросить'
url: '/ask'
icon: 'fa-envelope-o'
- title: 'Галерея'
url: '/gallery'
icon: 'fa-picture-o'
+40
View File
@@ -0,0 +1,40 @@
<!-- Nav -->
{{ $data := index .Site.Data .Site.Language.Lang }}
{{ $currentPage := .Page }}
<nav id="nav">
<ul class="links">
<li class="{{ if eq ($currentPage.RelPermalink) (`/`) }}active{{end}}">
<a href='{{ "/" | relLangURL }}' class="nav-link">
<i class="icon fa-home nav-icon"></i>
<span>Главная</span>
</a>
</li>
{{- with $data.nav.items -}}
{{- range $i, $e := . -}}
<li class="{{ if eq ($currentPage.RelPermalink) (print .url `/`) }}active{{end}}">
<a href='{{ .url | relLangURL }}' class="nav-link">
{{- with .icon -}}<i class="icon {{ . }} nav-icon"></i>{{- end -}}
<span>{{- .title -}}</span>
</a>
</li>
{{- end -}}
{{- end -}}
{{ with $data.contactinfo }}
{{ end }}
{{ if .IsTranslated }}
{{ range .AllTranslations }}
<li {{if eq ($.Site.Language) (.Language)}}class="active"{{end}}><a href='{{ .Permalink }}'>{{ .Language.LanguageName }}</a></li>
{{ end }}
{{ end }}
</ul>
{{ with $data.social }}
<ul class="icons">
{{ with .telegram }}
<li><a href="{{ . }}" class="icon fa-telegram"><span class="label">Telegram</span></a></li>
{{ end }}
{{ with .youtube }}
<li><a href="{{ . }}" class="icon fa-youtube"><span class="label">Youtube</span></a></li>
{{ end }}
</ul>
{{ end }}
</nav>
+3 -2
View File
@@ -7,8 +7,9 @@
linear-gradient(0deg, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1)),
url('../../images/mobile4.webp') !important;
background-size: cover;
background-position: center;
background-attachment: fixed;
background-position: center top;
/* iOS Safari не поддерживает background-attachment: fixed нормально */
background-attachment: scroll;
}
}
+87 -74
View File
@@ -1,74 +1,87 @@
/* Горизонтальное меню в футере */
.footer-nav-links {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-direction: row;
justify-content: center;
flex-wrap: wrap;
gap: 2rem;
}
.footer-nav-link {
display: flex;
flex-direction: column;
align-items: center;
padding: 0.75rem 1rem;
color: #ffffff;
text-decoration: none;
font-size: 0.85rem;
font-weight: 400;
transition: all 0.3s ease;
border-radius: 6px;
background: rgba(255, 255, 255, 0.05);
min-width: 80px;
}
.footer-nav-link:hover {
color: #18bfef;
background: rgba(24, 191, 239, 0.1);
transform: translateY(-3px);
text-decoration: none;
}
.footer-nav-link .icon {
font-size: 1.2rem;
margin-bottom: 0.4rem;
opacity: 0.9;
}
.footer-nav-link:hover .icon {
opacity: 1;
}
.footer-nav-link span {
color: #ffffff;
font-weight: 500;
}
/* Адаптивность для мобильных */
@media (max-width: 768px) {
.footer-nav-links {
gap: 1rem;
}
.footer-nav-link {
padding: 0.6rem 0.8rem;
font-size: 0.8rem;
min-width: 70px;
}
.footer-nav-link .icon {
font-size: 1rem;
margin-bottom: 0.3rem;
}
}
/* Стиль для заголовка секции */
#footer h3 {
font-size: 1.1rem;
margin-bottom: 1rem;
color: #ffffff;
font-weight: 600;
}
/* Меняем светлый фон футера (#f5f5f5) на тёмный под стиль сайта */
#footer {
background: rgba(0, 0, 0, 0.3) !important;
backdrop-filter: blur(10px) !important;
-webkit-backdrop-filter: blur(10px) !important;
border-top: 1px solid rgba(255, 255, 255, 0.08) !important;
border-radius: 20px 20px 0 0 !important;
}
/* Скрываем футер везде — навигация есть в #nav и мобильной панели */
#footer {
display: none !important;
}
/* Текст и заголовки в футере на тёмном фоне */
#footer h3,
#footer p,
#footer a:not(.footer-nav-link) {
color: rgba(255, 255, 255, 0.5) !important;
border-bottom-color: transparent !important;
}
#footer a:not(.footer-nav-link):hover {
color: rgba(255, 255, 255, 0.85) !important;
}
/* Footer nav — icon left + text, единый стиль с #nav */
#footer .footer-nav-links {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-direction: row;
justify-content: center;
flex-wrap: wrap;
gap: 0;
}
#footer .footer-nav-link {
display: flex;
flex-direction: row;
align-items: center;
gap: 0.4rem;
padding: 0 1.3rem;
height: 3.5rem;
color: rgba(255, 255, 255, 0.75);
text-decoration: none;
border-bottom: none;
font-family: 'Source Sans Pro', Helvetica, sans-serif;
font-size: 0.78rem;
font-weight: 900;
letter-spacing: 0.07em;
text-transform: uppercase;
transition: color 0.2s ease, background 0.2s ease;
}
#footer .footer-nav-link:hover {
color: #ffffff;
background: rgba(255, 255, 255, 0.1);
border-bottom: none;
text-decoration: none;
}
#footer .footer-nav-link .icon {
font-size: 0.9rem;
color: inherit;
opacity: 0.7;
display: inline-block;
line-height: 1;
flex-shrink: 0;
}
#footer .footer-nav-link:hover .icon {
opacity: 1;
}
#footer .footer-nav-link span {
color: inherit;
}
/* Мобильные: скрываем footer nav — есть боковое меню */
@media (max-width: 736px) {
#footer .footer-nav-links {
display: none !important;
}
}
+471 -147
View File
@@ -1,83 +1,112 @@
/* Стили для форм обратной связи */
/* Стили для форм обратной связи — glassmorphism 2025 */
.travel-form-container, .contact-form-container {
max-width: 600px;
margin: 2rem auto;
background: rgba(255, 255, 255, 0.98);
padding: 2.5rem;
max-width: 580px;
margin: 0 auto 2rem;
padding: 2.25rem 2.5rem;
background: rgba(255, 255, 255, 0.72);
backdrop-filter: blur(24px);
-webkit-backdrop-filter: blur(24px);
border-radius: 16px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.08);
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.2);
border: 1px solid rgba(255, 255, 255, 0.6);
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.07), 0 1px 4px rgba(0, 0, 0, 0.04);
}
.travel-form, .contact-form {
width: 100%;
}
/* Снимаем uppercase темы внутри форм */
.travel-form-container *,
.contact-form-container * {
text-transform: none;
letter-spacing: normal;
}
/* Разделитель секций — только капитализация первой буквы */
.travel-form-container .form-section-title,
.contact-form-container .form-section-title {
font-size: 0.72rem;
font-weight: 600;
color: #9aa3ad;
letter-spacing: 0.05em;
text-transform: uppercase; /* намеренно — tiny label */
}
.form-group {
margin-bottom: 1.8rem;
}
.form-group label {
display: block;
margin-bottom: 0.75rem;
font-weight: 500;
color: #2c3e50;
font-size: 0.95rem;
line-height: 1.4;
margin-bottom: 0.6rem;
font-weight: 600;
color: #1e2d3d;
font-size: 0.88rem;
line-height: 1.45;
letter-spacing: 0.01em;
}
.form-group input,
.form-group select,
.form-group textarea {
width: 100%;
padding: 1rem;
border: 1px solid #e1e5e9;
border-radius: 12px;
padding: 0.85rem 1rem;
border: 1.5px solid #b8c4ce;
border-radius: 10px;
font-size: 0.95rem;
background: #fafbfc;
transition: all 0.3s ease;
background: rgba(255, 255, 255, 0.92);
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
transition: border-color 0.2s, box-shadow 0.2s, background 0.2s;
box-sizing: border-box;
font-family: inherit;
color: #2c3e50;
color: #1a252f;
}
/* Select — полностью самодостаточное правило, без backdrop-filter */
.form-group select {
width: 100%;
padding: 1.5rem 3.5rem 2.5rem 1rem;
border: 1px solid #e1e5e9;
border-radius: 12px;
font-size: 0.9rem;
background: white;
color: #333;
padding: 0.95rem 2.5rem 1rem 1rem;
border: 1.5px solid #b8c4ce;
border-radius: 10px;
font-size: 0.95rem;
background-color: rgba(255, 255, 255, 0.92);
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
background-position: right 0.9rem center;
background-repeat: no-repeat;
background-size: 1.25rem 1.25rem;
color: #1a252f;
font-family: inherit;
appearance: none;
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
background-position: right 0.75rem center;
background-repeat: no-repeat;
background-size: 1.2em 1.2em;
min-height: 5.5rem;
line-height: 1.3;
transition: all 0.3s ease;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
-webkit-appearance: none;
line-height: 1.7;
box-sizing: border-box;
transition: border-color 0.2s, box-shadow 0.2s;
cursor: pointer;
min-height: 3rem;
}
.form-group select option {
background: white;
color: #333;
padding: 0.5rem;
background: #ffffff;
color: #1a252f;
}
.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus {
outline: none;
border-color: #3498db;
background: white;
box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.1);
transform: translateY(-1px);
border-color: #4a8fc8;
background: #ffffff;
box-shadow: 0 0 0 3px rgba(74, 143, 200, 0.18);
}
.form-group select:focus {
outline: none;
border-color: #4a8fc8;
background-color: #ffffff;
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%234a8fc8' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
background-position: right 0.9rem center;
background-repeat: no-repeat;
background-size: 1.25rem 1.25rem;
box-shadow: 0 0 0 3px rgba(74, 143, 200, 0.18);
}
.form-group textarea {
@@ -86,15 +115,15 @@
}
.submit-btn {
background: transparent;
color: #2c3e50;
padding: 1.2rem 2.5rem;
border: 2px solid #2c3e50;
border-radius: 12px;
background: linear-gradient(135deg, #4a8fc8 0%, #3476b5 100%);
color: #ffffff;
padding: 0.9rem 2rem;
border: none;
border-radius: 10px;
cursor: pointer;
font-size: 1rem;
font-weight: 500;
transition: all 0.3s ease;
font-size: 0.95rem;
font-weight: 600;
transition: opacity 0.2s, transform 0.15s, box-shadow 0.2s;
display: inline-flex;
align-items: center;
justify-content: center;
@@ -103,19 +132,20 @@
font-family: inherit;
letter-spacing: 0.3px;
width: 100%;
margin-top: 1rem;
margin-top: 0.5rem;
box-shadow: 0 2px 10px rgba(52, 118, 181, 0.3);
}
.submit-btn:hover {
background: #2c3e50;
color: white;
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(44, 62, 80, 0.2);
opacity: 0.92;
transform: translateY(-1px);
box-shadow: 0 5px 18px rgba(52, 118, 181, 0.4);
}
.submit-btn:active {
transform: translateY(0);
box-shadow: 0 4px 15px rgba(44, 62, 80, 0.1);
opacity: 1;
box-shadow: 0 2px 6px rgba(52, 118, 181, 0.25);
}
.submit-btn i {
@@ -145,26 +175,51 @@
/* Мобильная адаптация */
@media (max-width: 768px) {
.travel-form-container, .contact-form-container {
margin: 1rem;
margin: 0;
padding: 1.5rem;
border-radius: 12px;
}
.form-group {
margin-bottom: 1.1rem;
}
.form-group label {
margin-bottom: 0.4rem;
font-size: 0.88rem;
}
.form-group input,
.form-group select,
.form-group textarea {
padding: 0.65rem 0.8rem;
font-size: 16px; /* Предотвращает зум на iOS */
border-radius: 8px;
}
.form-group select {
padding: 1.2rem 3rem 2rem 0.8rem;
min-height: 4.5rem;
font-size: 15px;
line-height: 1.2;
padding: 0.65rem 2.2rem 0.65rem 0.8rem;
font-size: 16px;
}
.form-group textarea {
min-height: 80px;
}
.checkbox-group {
padding: 1rem;
margin: 1.2rem 0;
}
.submit-btn {
width: 100%;
justify-content: center;
padding: 0.9rem 1.5rem;
}
.form-subtitle {
margin-bottom: 1.2rem;
font-size: 0.88rem;
}
}
@@ -234,60 +289,109 @@
}
.form-group label:has(input[type="checkbox"]:checked) {
background-color: rgba(39, 174, 96, 0.1);
border-color: rgba(39, 174, 96, 0.3);
color: #27ae60;
background-color: rgba(39, 174, 96, 0.07);
color: inherit;
}
.form-group label:has(input[type="checkbox"]:checked)::after,
.checkbox-label:has(input[type="checkbox"]:checked)::after {
content: "✓";
position: absolute;
left: 1rem;
top: 50%;
transform: translateY(-50%);
color: #27ae60;
font-size: 1.4em;
font-weight: bold;
animation: checkmark-appear 0.3s ease;
/* Подсказка — инфо-блок между полями */
.form-note {
margin: -0.6rem 0 1.4rem;
padding: 0.55rem 0.85rem;
background: rgba(91, 155, 213, 0.07);
border-left: 2.5px solid rgba(91, 155, 213, 0.45);
border-radius: 0 6px 6px 0;
font-size: 0.8rem;
color: #6b7f94;
line-height: 1.45;
}
@keyframes checkmark-appear {
0% {
opacity: 0;
transform: translateY(-50%) scale(0.5);
}
100% {
opacity: 1;
transform: translateY(-50%) scale(1);
}
.form-note p {
margin: 0;
}
/* Специфичные стили для checkbox-label */
.checkbox-label:has(input[type="checkbox"]):hover {
background-color: rgba(52, 152, 219, 0.05);
.form-note p::before {
content: "ⓘ ";
font-style: normal;
color: #5b9bd5;
font-size: 0.9em;
}
.checkbox-label:has(input[type="checkbox"]:checked) {
background-color: rgba(39, 174, 96, 0.1) !important;
border-color: rgba(39, 174, 96, 0.3) !important;
color: #27ae60 !important;
/* Заголовок формы */
.form-title {
font-size: 1.4rem;
font-weight: 700;
color: #1a252f;
margin-bottom: 0.4rem;
text-align: center;
}
.form-subtitle {
font-size: 0.92rem;
color: #7f8c8d;
text-align: center;
margin-bottom: 2rem;
line-height: 1.5;
}
/* Подводка под заголовком страницы */
.page-lead {
font-size: 1rem;
color: #555c63;
font-family: 'Source Sans Pro', Helvetica, sans-serif;
line-height: 1.65;
margin-bottom: 2rem;
text-align: left;
}
.page-lead a {
color: #5b9bd5;
text-decoration: none;
border-bottom: none;
}
.page-lead a:hover {
color: #4585c2;
}
/* Разделитель секций */
.form-section-title {
font-size: 0.78rem;
font-weight: 600;
color: #95a5a6;
text-transform: uppercase;
letter-spacing: 0.08em;
margin: 2rem 0 1rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid #f0f0f0;
}
/* Плейсхолдеры */
.form-group input::placeholder,
.form-group textarea::placeholder {
color: #95a5a6;
color: #8896a0;
opacity: 1;
}
/* Select в состоянии placeholder (required:invalid или has disabled:checked) */
.form-group select:required:invalid,
.form-group select:has(option[value=""]:checked) {
color: #8896a0;
}
@media (prefers-color-scheme: dark) {
.form-group select:required:invalid,
.form-group select:has(option[value=""]:checked) {
color: rgba(255, 255, 255, 0.32);
}
}
/* Стили для согласия на обработку персональных данных */
.checkbox-group {
background: rgba(52, 152, 219, 0.05);
border: 1px solid rgba(52, 152, 219, 0.2);
background: rgba(74, 143, 200, 0.07);
border: 1.5px solid rgba(74, 143, 200, 0.3);
border-radius: 12px;
padding: 1.5rem;
margin: 2rem 0;
padding: 1.25rem 1.5rem;
margin: 1.5rem 0;
}
.checkbox-container {
@@ -321,9 +425,9 @@
border: none;
border-radius: 0;
font-size: 0.8rem;
line-height: 1.3;
line-height: 1.4;
color: #888;
font-style: italic;
font-style: normal;
}
.privacy-details p {
@@ -473,74 +577,294 @@
font-style: italic;
}
/* Интеграция с темой сайта */
/* Нумерованные сноски — маленькие круглые бейджи */
sup.fn {
display: inline-block;
min-width: 1.4em;
height: 1.4em;
line-height: 1.4em;
text-align: center;
background: rgba(91, 155, 213, 0.18);
color: #5b9bd5 !important;
border-radius: 50%;
font-size: 0.58em;
font-weight: 700;
vertical-align: baseline;
position: relative;
top: -0.5em;
margin-left: 0.25em;
text-decoration: none !important;
font-style: normal;
}
/* Сворачиваемый юридический текст — без рамки */
.legal-details {
margin-top: 1.5rem;
}
.legal-details summary {
padding: 0.4rem 0;
font-size: 0.8rem;
color: #5b9bd5;
cursor: pointer;
list-style: none;
user-select: none;
display: inline-flex;
align-items: baseline;
gap: 0.35rem;
text-decoration: underline;
text-decoration-color: rgba(91, 155, 213, 0.4);
text-underline-offset: 3px;
transition: color 0.2s, text-decoration-color 0.2s;
line-height: 1.5;
}
.legal-details summary sup.fn {
flex-shrink: 0;
text-decoration: none;
}
.legal-details summary::-webkit-details-marker {
display: none;
}
.legal-details summary::after {
content: "↓";
font-size: 0.85em;
transition: transform 0.2s ease;
display: inline-block;
text-decoration: none;
}
.legal-details[open] summary::after {
transform: rotate(180deg);
}
.legal-details summary:hover {
color: #4585c2;
text-decoration-color: rgba(69, 133, 194, 0.6);
}
.legal-text {
padding: 0.75rem 0 0;
font-size: 0.79rem;
color: #8a9199;
line-height: 1.65;
}
.legal-text p {
margin: 0 0 0.7rem;
}
.legal-text p:last-child {
margin-bottom: 0;
}
.legal-text a {
color: #3498db;
text-decoration: none;
}
.legal-text a:hover {
text-decoration: underline;
}
.legal-note {
font-size: 0.78rem;
color: #aaa;
margin-top: 0.75rem;
line-height: 1.5;
}
/* Кнопка загрузки файла — единый стиль с формой */
.file-btn {
display: inline-flex;
align-items: center;
gap: 0.4rem;
padding: 0.7rem 1.4rem;
background: rgba(91, 155, 213, 0.1);
color: #5b9bd5;
border: 1.5px solid rgba(91, 155, 213, 0.35);
border-radius: 8px;
font-size: 0.88rem;
font-weight: 500;
cursor: pointer;
transition: background 0.2s, border-color 0.2s;
font-family: inherit;
}
.file-btn:hover {
background: rgba(91, 155, 213, 0.18);
border-color: #5b9bd5;
}
.file-name-display {
margin-left: 0.75rem;
font-size: 0.82rem;
color: #7f8c8d;
}
@media (prefers-color-scheme: dark) {
.file-btn {
color: #7ab3e0;
border-color: rgba(91, 155, 213, 0.3);
background: rgba(91, 155, 213, 0.08);
}
.file-name-display {
color: #888;
}
}
/* Тёмная тема — тёмная карточка с достаточным контрастом */
@media (prefers-color-scheme: dark) {
.travel-form-container, .contact-form-container {
background: rgba(30, 30, 30, 0.95);
background: rgba(22, 26, 34, 0.88);
backdrop-filter: blur(28px);
-webkit-backdrop-filter: blur(28px);
border-color: rgba(255, 255, 255, 0.1);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.45), 0 1px 6px rgba(0, 0, 0, 0.3);
}
.form-group label {
color: #e0e0e0;
color: #dde3ea;
}
.form-group input,
.form-group select,
.form-group textarea {
background: rgba(50, 50, 50, 0.8);
border-color: #555;
color: #e0e0e0;
background: rgba(255, 255, 255, 0.07);
border-color: rgba(255, 255, 255, 0.16);
color: #e8edf4;
}
.form-group select {
background-color: rgba(255, 255, 255, 0.07);
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23aab2bb' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
background-position: right 0.9rem center;
background-repeat: no-repeat;
background-size: 1.25rem 1.25rem;
border-color: rgba(255, 255, 255, 0.16);
color: #e8edf4;
}
.form-group select option {
background: #1e2533;
color: #e8edf4;
}
.form-group select:focus {
background-color: rgba(255, 255, 255, 0.11);
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236aaee0' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
background-position: right 0.9rem center;
background-repeat: no-repeat;
background-size: 1.25rem 1.25rem;
}
.form-group input::placeholder,
.form-group textarea::placeholder {
color: rgba(255, 255, 255, 0.32);
}
.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus {
border-color: #4a9eff;
border-color: #6aaee0;
background: rgba(255, 255, 255, 0.11);
box-shadow: 0 0 0 3px rgba(106, 174, 224, 0.2);
}
.submit-btn {
background: linear-gradient(135deg, #3d82be 0%, #2d6aa8 100%);
box-shadow: 0 2px 10px rgba(45, 106, 168, 0.4);
}
.submit-btn:hover {
opacity: 0.9;
box-shadow: 0 5px 18px rgba(45, 106, 168, 0.5);
}
.form-note {
background: rgba(91, 155, 213, 0.1);
border-left-color: rgba(91, 155, 213, 0.5);
color: #8ca8c4;
}
.form-note p::before {
color: #7ab3e0;
}
.form-subtitle {
color: #99a6b0;
}
.checkbox-group {
background: rgba(52, 152, 219, 0.1);
border-color: rgba(52, 152, 219, 0.3);
background: rgba(91, 155, 213, 0.1);
border-color: rgba(91, 155, 213, 0.3);
}
.privacy-text {
color: #e0e0e0;
color: #c8d4de;
}
.privacy-details {
background: rgba(40, 40, 40, 0.8);
border-color: rgba(52, 152, 219, 0.3);
color: #ccc;
color: #8a9baa;
}
.privacy-details strong {
color: #e0e0e0;
.privacy-details a {
color: #7ab3e0;
}
.file-input-wrapper {
background: rgba(50, 50, 50, 0.8);
border-color: #555;
color: #aaa;
.legal-details summary {
color: #7ab3e0;
text-decoration-color: rgba(122, 179, 224, 0.4);
}
.file-input-wrapper:hover {
border-color: #4a9eff;
background: rgba(50, 50, 50, 0.9);
.legal-text {
color: #8fa4b8;
}
.file-input-wrapper:focus-within {
border-color: #4a9eff;
background: rgba(50, 50, 50, 0.9);
.legal-text a {
color: #7ab3e0;
}
.file-input-text {
color: #aaa;
.legal-note {
color: #6a7884;
}
.file-input-text.file-selected {
color: #5dade2;
/* Success/error в тёмной теме */
.form-success {
background: rgba(39, 174, 96, 0.15);
color: #6ecf9a;
border-color: rgba(39, 174, 96, 0.3);
}
.file-info small {
color: #aaa;
.form-error {
background: rgba(231, 76, 60, 0.15);
color: #f08080;
border-color: rgba(231, 76, 60, 0.3);
}
.form-group label:has(input[type="checkbox"]:checked) {
background-color: rgba(39, 174, 96, 0.1);
}
sup.fn {
background: rgba(122, 179, 224, 0.2);
color: #7ab3e0 !important;
}
.file-btn {
background: rgba(91, 155, 213, 0.15);
color: #7ab3e0;
border-color: rgba(91, 155, 213, 0.35);
}
.file-btn:hover {
background: rgba(91, 155, 213, 0.25);
border-color: #7ab3e0;
}
.file-name-display {
color: #7a8896;
}
}
+17 -13
View File
@@ -1,25 +1,29 @@
/* Улучшенная мобильная кнопка меню */
/* Кнопка открытия меню */
#navPanelToggle {
background: rgba(255, 255, 255, 0.15) !important;
backdrop-filter: blur(10px) !important;
border: 1px solid rgba(255, 255, 255, 0.3) !important;
color: white !important;
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.8) !important;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2) !important;
border-radius: 8px !important;
background: rgba(18, 22, 28, 0.75) !important;
backdrop-filter: blur(12px) !important;
-webkit-backdrop-filter: blur(12px) !important;
border: 1px solid rgba(255, 255, 255, 0.15) !important;
border-radius: 6px !important;
color: rgba(255, 255, 255, 0.9) !important;
text-shadow: none !important;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.4) !important;
font-family: 'Source Sans Pro', Helvetica, sans-serif !important;
font-weight: 900 !important;
letter-spacing: 0.075em !important;
text-transform: uppercase !important;
}
#navPanelToggle:hover {
background: rgba(255, 255, 255, 0.25) !important;
transform: translateY(-1px) !important;
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3) !important;
background: rgba(18, 22, 28, 0.92) !important;
color: #ffffff !important;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5) !important;
}
/* Улучшение для очень маленьких экранов */
@media (max-width: 480px) {
#navPanelToggle {
font-size: 0.75rem !important;
padding: 0.3rem 0.8rem !important;
backdrop-filter: blur(8px) !important;
}
}
+70 -23
View File
@@ -1,42 +1,89 @@
/* Улучшение фона для десктопного меню навигации */
/* Desktop nav bar */
#nav {
background: rgba(0, 0, 0, 0.4) !important;
backdrop-filter: blur(8px) !important;
border-radius: 10px !important;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3) !important;
border: 1px solid rgba(255, 255, 255, 0.1) !important;
background: rgba(0, 0, 0, 0.35) !important;
backdrop-filter: blur(10px) !important;
-webkit-backdrop-filter: blur(10px) !important;
border-radius: 100px !important;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.25) !important;
border: 1px solid rgba(255, 255, 255, 0.08) !important;
}
#nav ul.links li a {
color: rgba(255, 255, 255, 0.9) !important;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5) !important;
transition: all 0.3s ease !important;
/* Ссылки с иконкой — flex row */
#nav ul.links li a.nav-link {
display: flex !important;
align-items: center !important;
gap: 0.5rem !important;
color: rgba(255, 255, 255, 0.82) !important;
text-shadow: none !important;
padding: 0 1.4rem !important;
transition: color 0.2s ease, background 0.2s ease !important;
text-transform: uppercase !important;
font-size: 0.78rem !important;
letter-spacing: 0.07em !important;
font-weight: 900 !important;
}
#nav ul.links li a:hover {
background-color: rgba(255, 255, 255, 0.2) !important;
color: white !important;
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.7) !important;
#nav ul.links li a.nav-link:hover {
background-color: rgba(255, 255, 255, 0.12) !important;
color: #ffffff !important;
text-shadow: none !important;
}
/* Иконки в nav — фиксированная ширина чтобы все выровнялись */
#nav ul.links li a .nav-icon {
font-size: 0.85rem !important;
opacity: 0.75;
flex-shrink: 0;
line-height: 1 !important;
width: 1em !important;
text-align: center !important;
display: inline-block !important;
}
#nav ul.links li a:hover .nav-icon {
opacity: 1;
}
/* Активный пункт */
#nav ul.links li.active {
background-color: rgba(255, 255, 255, 0.2) !important;
border-radius: 5px !important;
background-color: rgba(255, 255, 255, 0.15) !important;
}
#nav ul.links li.active a {
color: white !important;
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.7) !important;
color: #ffffff !important;
}
#nav ul.links li.active a .nav-icon {
opacity: 1;
}
/* Иконки соцсетей */
#nav ul.icons li a {
color: rgba(255, 255, 255, 0.8) !important;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5) !important;
color: rgba(255, 255, 255, 0.75) !important;
text-shadow: none !important;
transition: color 0.2s ease !important;
}
#nav ul.icons li a:hover {
color: white !important;
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.7) !important;
transform: scale(1.1) !important;
color: #ffffff !important;
}
/* Мобильная панель — иконки + текст в строку */
#navPanel .links li a.nav-link {
display: flex !important;
align-items: center !important;
gap: 0.6rem !important;
padding: 0.85rem 0 !important;
}
#navPanel .links li a .nav-icon {
font-size: 1rem !important;
opacity: 0.7;
flex-shrink: 0;
width: 1.2rem;
text-align: center;
}
#navPanel .links li a:hover .nav-icon {
opacity: 1;
}
+52 -2
View File
@@ -10,14 +10,64 @@
}
}
/* Уменьшение размера заголовков на страницах */
/* Заголовок страницы — убираем UPPERCASE, нормальный регистр */
.post header.major h1 {
font-size: 2.5rem !important;
line-height: 1.2 !important;
text-transform: none !important;
letter-spacing: 0.01em !important;
font-weight: 900 !important;
color: #1a252f !important;
margin-bottom: 1rem !important;
}
/* Описание под заголовком — читаемое, не тонкое */
.post header.major p {
font-size: 1rem !important;
font-weight: 400 !important;
line-height: 1.65 !important;
color: #555c63 !important;
font-family: 'Source Sans Pro', Helvetica, sans-serif !important;
text-align: left !important;
}
/* Выравнивание заголовка влево */
.post header.major {
text-align: left !important;
}
@media (max-width: 736px) {
.post header.major h1 {
font-size: 2rem !important;
font-size: 1.9rem !important;
}
}
/* Скруглённые углы — изображения в карточках постов */
a.image.main img,
a.image.fit img {
border-radius: 10px;
overflow: hidden;
}
a.image.main,
a.image.fit {
border-radius: 10px;
overflow: hidden;
display: block;
}
/* Скруглённые углы — белая подложка #main */
#main {
border-radius: 20px;
overflow: hidden;
margin-top: 1rem;
margin-bottom: 1.5rem;
}
@media (max-width: 736px) {
#main {
border-radius: 14px;
margin-top: 0.75rem;
margin-bottom: 1rem;
}
}
+81 -71
View File
@@ -1,71 +1,81 @@
/* Фиксируем пагинацию */
.pagination ul {
display: flex !important;
align-items: center !important;
justify-content: center !important;
list-style: none !important;
margin: 0 !important;
padding: 0 !important;
gap: 1rem !important;
}
/* Убираем рамки со всех кнопок пагинации */
.pagination a,
.pagination .previous,
.pagination .next,
.pagination .first,
.pagination .last {
border: none !important;
border-radius: 0 !important;
box-shadow: none !important;
outline: none !important;
}
/* Информация о страницах для десктопа */
.pagination .page-info {
display: inline-flex !important;
align-items: center !important;
justify-content: center !important;
padding: 0.4rem 0.8rem !important;
font-size: 0.8rem !important;
color: #333 !important;
background: none !important;
border: none !important;
border-radius: 0 !important;
text-align: center !important;
font-weight: 300 !important;
white-space: nowrap !important;
min-width: 60px !important;
box-sizing: border-box !important;
flex-shrink: 0 !important;
box-shadow: none !important;
outline: none !important;
}
.pagination .page-info .current-page {
color: #333 !important;
font-weight: 400 !important;
font-size: 1em !important;
}
.pagination .page-info .separator {
margin: 0 0.3rem !important;
color: #666 !important;
font-size: 0.9em !important;
font-weight: 300 !important;
}
.pagination .page-info .total-pages {
color: #333 !important;
font-weight: 300 !important;
}
/* Скрываем информацию о страницах на мобильных */
@media (max-width: 768px) {
.pagination .page-info,
.pagination .page-info.desktop-only,
.pagination-info,
.pagination-status {
display: none !important;
}
}
/* Пагинация — новые классы, нет конфликтов с темой */
.pager {
display: flex;
justify-content: center;
padding: 1.5rem 0 3.5rem;
}
.pager-inner {
display: flex;
align-items: center;
gap: 0.5rem;
}
/* Кнопки Новее / Старше */
.pager-btn {
display: inline-flex;
align-items: center;
gap: 0.4rem;
padding: 0.5rem 1.1rem;
font-size: 0.82rem;
font-weight: 500;
color: #555c63;
background: transparent;
border: 1px solid #d0d4d8;
border-radius: 20px;
text-decoration: none;
transition: color 0.18s, border-color 0.18s, background 0.18s;
cursor: pointer;
white-space: nowrap;
letter-spacing: 0.01em;
}
.pager-btn:hover {
color: #5b9bd5;
border-color: #5b9bd5;
background: rgba(24, 191, 239, 0.06);
text-decoration: none;
}
.pager-btn svg {
flex-shrink: 0;
}
/* Заблокированная кнопка */
.pager-disabled {
color: #c0c5ca;
border-color: #e8eaec;
cursor: default;
pointer-events: none;
}
/* Счётчик страниц */
.pager-info {
font-size: 0.78rem;
color: #aaa;
padding: 0 0.5rem;
white-space: nowrap;
font-variant-numeric: tabular-nums;
min-width: 3.5rem;
text-align: center;
}
/* Мобильные: уменьшить счётчик, добавить пространство */
@media (max-width: 736px) {
.pager-info {
font-size: 0.72rem;
min-width: 2.5rem;
color: #bbb;
}
/* Больше белого пространства под кнопками — чёткое разделение с футером */
#main > nav.pager {
padding-bottom: 3rem !important;
}
.pager-btn {
padding: 0.6rem 1.4rem;
font-size: 0.85rem;
}
}
+68 -1
View File
@@ -42,7 +42,7 @@
}
#main article a:hover {
color: #18bfef;
color: #5b9bd5;
}
/* Списки в статьях */
@@ -118,6 +118,73 @@
color: #1a252f;
}
/* Карточки постов */
#main > .posts > article {
padding: 2rem !important;
text-align: left !important;
transition: box-shadow 0.2s ease;
}
#main > .posts > article:hover {
box-shadow: inset 0 0 0 1px rgba(24, 191, 239, 0.3);
}
/* Фиксированная высота хедера — фото на одном уровне в ряду */
#main > .posts > article header {
min-height: 5.5rem;
}
/* Заголовок карточки */
#main > .posts > article header h2 {
font-size: 1.3rem;
line-height: 1.35;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
margin-bottom: 0;
text-align: left;
}
#main > .posts > article header h2 a {
text-decoration: none;
}
/* Убираем огромный отступ у фото (тема: 4rem 0) */
#main > .posts > article .image.main {
margin: 1rem 0 !important;
}
/* Описание — обрезаем до 2 строк */
#main > .posts > article > p {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
text-align: left;
font-size: 0.88rem;
color: #666;
margin-bottom: 1rem;
line-height: 1.5;
}
/* Скрываем кнопку «Подробнее» — карточка и так кликабельна по заголовку */
#main > .posts > article .actions {
display: none !important;
}
@media screen and (max-width: 980px) {
#main > .posts > article {
padding: 1.5rem !important;
}
}
@media screen and (max-width: 736px) {
#main > .posts > article {
text-align: left !important;
}
}
/* Адаптивность для мобильных */
@media (max-width: 768px) {
#main article h1 {
-104
View File
@@ -1,104 +0,0 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Тест шифрования файлов</title>
<link rel="stylesheet" href="/css/forms.css">
</head>
<body>
<div class="travel-form-container">
<h2>Тест системы шифрования файлов</h2>
<form class="contact-form" action="#" method="POST" onsubmit="return false;">
<div class="form-group">
<label for="name">Имя</label>
<input type="text" id="name" name="name" value="Тестовый пользователь">
</div>
<div class="form-group">
<label for="test_file">Тестовый файл для шифрования</label>
<div class="file-input-wrapper" onclick="document.getElementById('test_file').click()">
<input type="file" id="test_file" name="test_file" accept=".pdf,.jpg,.png,.txt" class="file-input-hidden">
<span class="file-input-text" id="test_file_text">Выберите файл для тестирования</span>
</div>
</div>
<div class="form-group">
<button type="submit" class="submit-btn">
Тестировать отправку
</button>
</div>
</form>
<div id="debug-info" style="margin-top: 2rem; padding: 1rem; background: #f8f9fa; border-radius: 8px;">
<h3>Отладочная информация:</h3>
<pre id="debug-content">Выберите файл для просмотра информации о шифровании</pre>
</div>
</div>
<script src="/js/encryption.js"></script>
<script>
// Дополнительная отладочная информация
document.addEventListener('DOMContentLoaded', function() {
const form = document.querySelector('.contact-form');
const debugContent = document.getElementById('debug-content');
// Перехватываем событие отправки формы для демонстрации
form.addEventListener('submit', function(event) {
event.preventDefault();
const formData = new FormData(form);
const encryptedField = form.querySelector('input[name="test_file_encrypted"]');
const metadataField = form.querySelector('input[name="test_file_metadata"]');
let debugInfo = 'Форма готова к отправке:\n\n';
for (let [key, value] of formData.entries()) {
if (key !== 'test_file') { // Не показываем оригинальный файл
debugInfo += `${key}: ${typeof value === 'string' ? value.substring(0, 100) + (value.length > 100 ? '...' : '') : '[File]'}\n`;
}
}
if (encryptedField) {
debugInfo += `\nЗашифрованные данные: ${encryptedField.value.length} символов (Base64)\n`;
}
if (metadataField) {
try {
const metadata = JSON.parse(metadataField.value);
debugInfo += '\nМетаданные файла:\n';
debugInfo += `- Имя: ${metadata.fileName}\n`;
debugInfo += `- Тип: ${metadata.fileType}\n`;
debugInfo += `- Размер: ${metadata.fileSize} байт\n`;
debugInfo += `- Зашифровано: ${metadata.encryptedAt}\n`;
} catch (e) {
debugInfo += '\nОшибка чтения метаданных\n';
}
}
debugContent.textContent = debugInfo;
alert('Тест завершен! Смотрите отладочную информацию ниже.');
});
// Отслеживаем изменения в шифровании
const fileInput = document.getElementById('test_file');
if (fileInput) {
const observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.type === 'childList') {
const encryptedField = form.querySelector('input[name="test_file_encrypted"]');
if (encryptedField && encryptedField.value) {
debugContent.textContent = 'Файл зашифрован и готов к отправке!\nНажмите "Тестировать отправку" для просмотра деталей.';
}
}
});
});
observer.observe(form, { childList: true, subtree: true });
}
});
</script>
</body>
</html>
@@ -11,7 +11,7 @@
</div>
<div class="field">
<label for="email">{{ i18n "CONTACT_FORM_FIELD_EMAIL" . }}</label>
<input type="text" name="email" id="email" />
<input type="email" name="email" id="email" />
</div>
<div class="field">
<label for="message">{{ i18n "CONTACT_FORM_FIELD_MESSAGE" . }}</label>
@@ -52,25 +52,25 @@
{{ end }}
{{ with .plan}}
<li><a href="{{ . }}" class="footer-nav-link">
<i class="icon fa-calendar"></i>
<i class="icon fa-calendar-o"></i>
<span>Хочу поехать</span>
</a></li>
{{ end }}
{{ with .map}}
<li><a href="{{ . }}" class="footer-nav-link">
<i class="icon fa-map"></i>
<i class="icon fa-map-o"></i>
<span>Маршруты</span>
</a></li>
{{ end }}
{{ with .ask}}
<li><a href="{{ . }}" class="footer-nav-link">
<i class="icon fa-question"></i>
<i class="icon fa-question-circle-o"></i>
<span>Спросить</span>
</a></li>
{{ end }}
{{ with .gallery}}
<li><a href="{{ . }}" class="footer-nav-link">
<i class="icon fa-image"></i>
<i class="icon fa-picture-o"></i>
<span>Галерея</span>
</a></li>
{{ end }}