🚀 MEGA UPDATE: Объединение всех изменений для продакшена
Some checks failed
continuous-integration/drone/push Build is failing

 НОВЫЕ ФУНКЦИИ:
- 🎬 Поддержка видео в Hero баннерах и услугах
- 💊 Водная анимация пилюль маркеров банеров
- 📱 Полная главная страница с портфолио, блогом, новостями
- 🎯 HeroBanner модель с видео/изображениями
- 🎨 Современные hover-эффекты и анимации

📊 УЛУЧШЕНИЯ СТРУКТУРЫ:
- Расширенная home_modern.html с полным контентом
- Новые URL маршруты для всех секций
- Обновленные views с передачей всех данных
- CSS стили для всех новых секций
- Миграции для видео полей

🎪 HERO БАНЕР СИСТЕМА:
- Динамические банеры с видео/фото фонами
- Пилюли маркеры с водной анимацией
- Растягивание маркеров от центра
- Адаптивный дизайн для мобильных
- Glassmorphism эффекты

🎨 СОВРЕМЕННЫЙ ДИЗАЙН:
- Hover анимации для карточек
- Плавные переходы везде
- Современная типографика
- Градиенты и тени
- Отзывчивая сетка

Готов к продакшену! 🚀
This commit is contained in:
2025-11-25 11:24:19 +09:00
parent 6a576136af
commit 6f43fa4c3b
14 changed files with 1832 additions and 94 deletions

View File

@@ -0,0 +1,75 @@
# Generated by Django 5.1.1 on 2025-11-24 23:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0009_alter_servicerequest_options_and_more'),
]
operations = [
migrations.CreateModel(
name='HeroBanner',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=200, verbose_name='Заголовок')),
('subtitle', models.TextField(blank=True, verbose_name='Подзаголовок')),
('description', models.TextField(blank=True, verbose_name='Описание')),
('image', models.ImageField(blank=True, null=True, upload_to='static/img/hero/', verbose_name='Фоновое изображение')),
('video', models.FileField(blank=True, help_text='Фоновое видео для баннера (MP4, WebM)', null=True, upload_to='static/video/hero/', verbose_name='Фоновое видео')),
('video_poster', models.ImageField(blank=True, help_text='Превью изображение для видео', null=True, upload_to='static/img/hero/posters/', verbose_name='Превью видео')),
('button_text', models.CharField(blank=True, max_length=100, verbose_name='Текст кнопки')),
('button_link', models.URLField(blank=True, verbose_name='Ссылка кнопки')),
('is_active', models.BooleanField(default=True, verbose_name='Активен')),
('order', models.PositiveIntegerField(default=0, verbose_name='Порядок отображения')),
('created_at', models.DateTimeField(auto_now_add=True)),
],
options={
'verbose_name': 'Hero Баннер',
'verbose_name_plural': 'Hero Баннеры',
'ordering': ['order', '-created_at'],
},
),
migrations.AddField(
model_name='blogpost',
name='video',
field=models.FileField(blank=True, help_text='Видео файл для блог поста', null=True, upload_to='static/video/blog/'),
),
migrations.AddField(
model_name='blogpost',
name='video_poster',
field=models.ImageField(blank=True, help_text='Превью изображение для видео', null=True, upload_to='static/img/blog/posters/'),
),
migrations.AddField(
model_name='project',
name='video',
field=models.FileField(blank=True, help_text='Видео презентация проекта', null=True, upload_to='static/video/project/'),
),
migrations.AddField(
model_name='project',
name='video_poster',
field=models.ImageField(blank=True, help_text='Превью изображение для видео проекта', null=True, upload_to='static/img/project/posters/'),
),
migrations.AddField(
model_name='review',
name='video',
field=models.FileField(blank=True, help_text='Видео отзыв о работе', null=True, upload_to='static/video/review/'),
),
migrations.AddField(
model_name='review',
name='video_poster',
field=models.ImageField(blank=True, help_text='Превью для видео отзыва', null=True, upload_to='static/img/review/posters/'),
),
migrations.AddField(
model_name='service',
name='video',
field=models.FileField(blank=True, help_text='Видео файл для услуги (MP4, WebM, AVI)', null=True, upload_to='static/video/services/'),
),
migrations.AddField(
model_name='service',
name='video_poster',
field=models.ImageField(blank=True, help_text='Превью изображение для видео', null=True, upload_to='static/img/services/posters/'),
),
]

View File

@@ -0,0 +1,13 @@
# Generated by Django 5.1.1 on 2025-11-25 01:03
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('web', '0010_herobanner_blogpost_video_blogpost_video_poster_and_more'),
]
operations = [
]