diff --git a/programmer/mixins.py b/programmer/mixins.py index 671a2a8..bbc10bc 100644 --- a/programmer/mixins.py +++ b/programmer/mixins.py @@ -24,23 +24,41 @@ class MenuContextMixin(ContextMixin): # Основное меню (всегда) main_menu = [ - {'title': "Главная", 'url_name': 'home'}, - {'title': "Проекты", 'url_name': 'solution'}, - {'title': "Статьи", 'url_name': 'blog'}, + # {'title': "Главная", 'url_name': 'home'}, + { + 'title': "Разработки", + 'url_name': None, + 'children': [ + {'title': "Кейсы", 'url_name': 'solution'}, + {'title': "Статьи", 'url_name': 'blog'}, + ] + }, {'title': "Отзывы", 'url_name': 'recall'}, - {'title': "Обо мне", 'url_name': 'about'}, + {'title': "О нас", 'url_name': 'about'}, ] # Пользовательское меню (зависит от статуса) if self.request.user.is_authenticated: user_menu = [ - {'title': "Профиль", 'url_name': 'profile'}, - {'title': "Выйти", 'url_name': 'logout'}, # будет обработан как форма + { + 'title': "Профиль", + 'url_name': None, + 'children': [ + {'title': "Профиль", 'url_name': 'profile'}, + {'title': "Выйти", 'url_name': 'logout'}, + ] + } ] else: user_menu = [ - {'title': "Войти", 'url_name': 'login'}, - {'title': "Регистрация", 'url_name': 'register'}, + { + 'title': "Войти", + 'url_name': None, + 'children': [ + {'title': "Войти", 'url_name': 'login'}, + {'title': "Регистрация", 'url_name': 'register'}, + ] + } ] context['main_menu'] = main_menu diff --git a/programmer/static/programmer/css/styles.css b/programmer/static/programmer/css/styles.css index d539e73..91a41ef 100644 --- a/programmer/static/programmer/css/styles.css +++ b/programmer/static/programmer/css/styles.css @@ -125,7 +125,7 @@ body { .nav { display: flex; align-items: center; - justify-content: space-between; + justify-content: flex-start; padding: 1rem 0; gap: 2rem; } @@ -160,16 +160,190 @@ body { .nav-menu { display: flex; + align-items: center; list-style: none; gap: 2.5rem; margin: 0; flex-wrap: wrap; } +/* ===== DROPDOWN MENU (DESKTOP) ===== */ +.nav-menu .has-dropdown { + position: relative; +} + +/* Родительский пункт (span или ссылка) */ +.nav-menu .has-dropdown > a, +.nav-menu .has-dropdown > span { + text-decoration: none; + color: var(--text-secondary); + font-weight: 600; + padding: 0.75rem 0; + position: relative; + font-size: 1rem; + display: inline-block; + cursor: default; + transition: var(--transition); +} + +/* Выпадающий список */ +.nav-menu .dropdown { + position: absolute; + top: 100%; + left: 0; + min-width: 200px; + background: var(--bg-card); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-xl); + border: 1px solid var(--border-light); + opacity: 0; + visibility: hidden; + transform: translateY(-10px); + transition: opacity 0.2s ease, visibility 0.2s ease, transform 0.2s ease; + list-style: none; + padding: 0.5rem 0; + z-index: 1000; +} + +/* Показываем dropdown при наведении на родительский li */ +.nav-menu .has-dropdown:hover .dropdown { + opacity: 1; + visibility: visible; + transform: translateY(0); +} + +/* Элементы dropdown */ +.nav-menu .dropdown li { + margin: 0; +} + +.nav-menu .dropdown a { + display: block; + padding: 0.6rem 1.2rem; + color: var(--text-primary); + text-decoration: none; + transition: var(--transition); + font-weight: 500; + white-space: nowrap; +} + +.nav-menu .dropdown a:hover { + background: var(--bg-secondary); + color: var(--primary); + padding-left: 1.5rem; +} + +/* Небольшой треугольник (опционально) */ +.nav-menu .has-dropdown > span::after, +.nav-menu .has-dropdown > a::after { + /* content: '▼'; */ + font-size: 0.75em; + margin-left: 6px; + opacity: 0.7; + vertical-align: middle; + transition: transform 0.2s ease; +} + +.nav-menu .has-dropdown:hover > span::after, +.nav-menu .has-dropdown:hover > a::after { + transform: rotate(180deg); +} + +/* ===== USER MENU DROPDOWN (DESKTOP) ===== */ +.user-menu { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.user-menu-item { + position: relative; +} + +.user-menu-parent { + cursor: default; + display: inline-block; + padding: 0.5rem 1rem; /* соответствие .nav-link */ +} + +.user-menu .has-dropdown > a, +.user-menu .has-dropdown > span { + cursor: default; +} + +.user-menu .dropdown { + position: absolute; + top: 100%; + right: 0; /* выравнивание по правому краю */ + min-width: 180px; + background: var(--bg-card); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-xl); + border: 1px solid var(--border-light); + opacity: 0; + visibility: hidden; + transform: translateY(-10px); + transition: opacity 0.2s ease, visibility 0.2s ease, transform 0.2s ease; + list-style: none; + padding: 0.5rem 0; + z-index: 1001; +} + +.user-menu .has-dropdown:hover .dropdown { + opacity: 1; + visibility: visible; + transform: translateY(0); +} + +.user-menu .dropdown li { + margin: 0; +} + +.user-menu .dropdown-link, +.user-menu .dropdown-link-btn { + display: block; + width: 100%; + padding: 0.6rem 1.2rem; + color: var(--text-primary); + text-decoration: none; + transition: var(--transition); + font-weight: 500; + white-space: nowrap; + background: none; + border: none; + text-align: left; + font: inherit; + cursor: pointer; +} + +.user-menu .dropdown-link:hover, +.user-menu .dropdown-link-btn:hover { + background: var(--bg-secondary); + color: var(--primary); + padding-left: 1.5rem; +} + +/* Стрелка для родительского пункта (опционально) */ +.user-menu .has-dropdown > span::after, +.user-menu .has-dropdown > a::after { + /* content: '▼'; */ + font-size: 0.75em; + margin-left: 6px; + opacity: 0.7; + vertical-align: middle; + transition: transform 0.2s ease; +} + +.user-menu .has-dropdown:hover > span::after, +.user-menu .has-dropdown:hover > a::after { + transform: rotate(180deg); +} + .nav-actions { display: flex; align-items: center; gap: 1rem; + margin-left: auto; } .nav-link { @@ -1346,6 +1520,53 @@ body { margin-bottom: 0.5rem; } +/* ===== MOBILE SUBMENU ===== */ +.mobile-nav-item.has-submenu { + position: relative; +} + +/* Родительский пункт в мобильном меню (может быть span или ссылка) */ +.mobile-nav-parent { + cursor: pointer; + display: flex; + align-items: center; + justify-content: space-between; +} + +/* Стрелочка для родительского пункта */ +.mobile-nav-parent::after { + content: '▼'; + font-size: 0.8rem; + opacity: 0.7; + transition: transform 0.2s ease; +} + +.has-submenu.submenu-open .mobile-nav-parent::after { + transform: rotate(180deg); +} + +/* Вложенный список */ +.mobile-submenu { + list-style: none; + margin-left: 1rem; + padding-left: 0.5rem; + border-left: 2px solid var(--primary); + display: none; +} + +.has-submenu.submenu-open .mobile-submenu { + display: block; +} + +.mobile-submenu .mobile-nav-item { + margin-bottom: 0; +} + +.mobile-submenu .mobile-nav-link { + padding: 0.75rem 1rem; + font-size: 0.95rem; +} + .mobile-nav-link { display: block; padding: 1rem; @@ -1752,4 +1973,39 @@ body { .floating-btn .btn.pulse { animation: pulse 1.5s infinite; will-change: transform; +} + +/* Стили для
/ */ +details { + margin: 1rem 0; +} + +summary { + display: inline-block; + padding: 0.5rem 1rem; + background: var(--bg-primary); + border: 1px solid var(--border-light); + border-radius: var(--radius-md); + transition: var(--transition); + user-select: none; +} + +summary:hover { + background: var(--primary); + color: white; + border-color: var(--primary); +} + +details[open] summary { + background: var(--primary); + color: white; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +details[open] { + border: 1px solid var(--border-light); + border-radius: var(--radius-md); + padding: 1rem; + background: var(--bg-primary); } \ No newline at end of file diff --git a/programmer/static/programmer/js/mobile-menu.js b/programmer/static/programmer/js/mobile-menu.js index c0b299e..24263d0 100644 --- a/programmer/static/programmer/js/mobile-menu.js +++ b/programmer/static/programmer/js/mobile-menu.js @@ -49,11 +49,16 @@ document.addEventListener('DOMContentLoaded', function() { } // Закрытие меню при клике на ссылку - const mobileNavLinks = document.querySelectorAll('.mobile-nav-link'); - mobileNavLinks.forEach(link => { - link.addEventListener('click', closeMobileMenu); + document.querySelectorAll('.mobile-nav-item.has-submenu > .mobile-nav-link, .mobile-nav-item.has-submenu > .mobile-nav-parent').forEach(item => { + item.addEventListener('click', function(e) { + if (window.innerWidth <= 768) { // или ваш брейкпоинт + e.preventDefault(); + const parent = this.closest('.has-submenu'); + parent.classList.toggle('submenu-open'); + } + }); }); - + // Синхронизация переключателей темы function syncThemeToggles() { if (mobileThemeToggle && mainThemeToggle) { diff --git a/programmer/templates/programmer/about.html b/programmer/templates/programmer/about.html index 012d056..32ecfa1 100644 --- a/programmer/templates/programmer/about.html +++ b/programmer/templates/programmer/about.html @@ -4,88 +4,133 @@ {% block content %}
-
-

Николай Сердюк

-

Разработчик 1С

+ + +
+

🚀 О компании

+

+ Мы помогаем компаниям расти за счёт прозрачной и эффективной автоматизации + на платформе 1С. Более 10 лет опыта, десятки успешных проектов и + собственная методология внедрения. +

+

+ В основе нашей работы — глубокое понимание бизнес-процессов заказчика, + техническая экспертиза и ответственность за результат. Каждый проект + ведёт выделенная команда под личным управлением ведущего архитектора. +

-

🚀 Опыт работы

-

Более 10 лет успешной работы в разработке и сопровождении систем на платформе 1С

- -
-

Основные направления:

-
-
-

💻 Разработка

-
    -
  • Разработка и доработка конфигураций 1С
  • -
  • Создание внешних обработок и отчетов
  • -
  • Кастомизация под бизнес-процессы
  • -
-
-
-

🔗 Интеграция

-
    -
  • Интеграция 1С с веб-сервисами
  • -
  • Связь с сайтами и мобильными приложениями
  • -
  • API и веб-сервисы
  • -
-
-
-

⚡ Оптимизация

-
    -
  • Оптимизация бизнес-процессов
  • -
  • Ускорение работы баз данных
  • -
  • Автоматизация рутинных операций
  • -
-
-
-
-
- -
-

🛠 Технологии и навыки

+

👥 Наша команда

-

🎯 1С Разработка

-
    -
  • 1С:Предприятие 8.3
  • -
  • Управление торговлей
  • -
  • Бухгалтерия предприятия
  • -
  • Зарплата и управление персоналом
  • -
  • Внешние обработки и отчеты
  • +

    Николай Сердюк

    +

    Руководитель проектов, ведущий архитектор 1С

    +
      +
    • 10+ лет в разработке 1С
    • +
    • Архитектура сложных интеграций
    • +
    • Управление командой и контроль качества
-

🔧 Дополнительные технологии

+

Привлекаемые эксперты

    -
  • SQL и оптимизация запросов
  • -
  • Веб-сервисы и API
  • -
  • XML, JSON, REST
  • -
  • Системное администрирование
  • +
  • Аналитики бизнес-процессов
  • +
  • Специалисты по интеграции с внешними системами
  • + + +
+
+
+

+ Такой подход позволяет нам гибко масштабировать ресурсы под задачи любой + сложности, сохраняя при этом персональную ответственность и высокое качество. +

+
+ +
+

⚙️ Ключевые компетенции

+
+
+

💻 Разработка 1С

+
    +
  • Доработка типовых и создание уникальных конфигураций
  • +
  • Внешние обработки, отчёты, печатные формы
  • +
  • Адаптация интерфейсов под бизнес-процессы
  • +
+
+
+

🔗 Интеграции

+
    +
  • Связь 1С с сайтами, маркетплейсами, CRM
  • +
  • Обмен данными через API, веб-сервисы, HTTP-сервисы
  • +
  • Интеграция с банками, платёжными системами, ЕГАИС
  • +
+
+
+

⚡ Оптимизация

+
    +
  • Ускорение работы баз данных и запросов
  • +
  • Автоматизация рутинных операций
  • +
  • Настройка производительности серверов 1С
-

📈 Проекты и достижения

-

Успешно реализовал более 50 проектов различной сложности

- +

🛠 Технологический стек

+
+
+

🎯 Платформа 1С

+
    +
  • 1С:Предприятие 8.3
  • +
  • Управление торговлей (УТ)
  • +
  • Бухгалтерия предприятия (БП)
  • +
  • Зарплата и управление персоналом (ЗУП)
  • +
  • Управление небольшой фирмой (УНФ)
  • +
+
+
+

🔧 Смежные технологии

+
    +
  • MS SQL, PostgreSQL – администрирование и оптимизация
  • +
  • REST API, SOAP, JSON, XML
  • +
  • Git, системы контроля версий
  • +
  • Linux, Windows Server
  • +
+
+
+
+ +
+

📈 Опыт и проекты

+

Более 50 успешно реализованных проектов для компаний из разных отраслей

-

🏆 Ключевые проекты

+

🏭 Отраслевой опыт

    -
  • Автоматизация учетных систем для предприятий
  • -
  • Интеграция 1С с сайтами и мобильными приложениями
  • -
  • Разработка кастомизированных отчетов и дашбордов
  • -
  • Оптимизация производительности баз данных
  • +
  • Оптовая и розничная торговля
  • +
  • Производственные предприятия
  • +
  • Логистика и складские комплексы
  • +
  • Сфера услуг
  • +
+
+
+

📊 Типовые задачи

+
    +
  • Автоматизация складского учёта и логистики
  • +
  • Интеграция интернет-магазинов с 1С
  • +
  • Построение управленческой отчётности и дашбордов
  • +
  • Переход с устаревших версий 1С на актуальные
@@ -93,58 +138,87 @@

📞 Контакты

-
-
-
-

📧 Электронная почта

-

{{ CONTACT_EMAIL }}

-
-
-

📱 Телефон

-

{{ CONTACT_PHONE }}

-
-
-

💬 Telegram

-

@odinesina_prog

-
+
+
+

📧 Электронная почта

+

{{ CONTACT_EMAIL }}

+
+
+

📱 Телефон

+

{{ CONTACT_PHONE }}

+
+
+

💬 Telegram

+

+ + @odinesina_prog + +

+

+ Работаем официально по договору. + + ИП Сердюк Николай Александрович + | + + Реквизиты + +

+{# Обновлённая микроразметка Schema.org для организации #} -{% endblock %} - +{% endblock %} \ No newline at end of file diff --git a/programmer/templates/programmer/base.html b/programmer/templates/programmer/base.html index 2704f39..91f4ae1 100644 --- a/programmer/templates/programmer/base.html +++ b/programmer/templates/programmer/base.html @@ -6,13 +6,13 @@ {{title}} - + - + @@ -21,7 +21,7 @@ - + @@ -90,8 +90,8 @@ "@context": "https://schema.org", "@type": "Person", "name": "Николай Сердюк", - "jobTitle": "Программист 1С", - "description": "Профессиональный программист 1С с более чем 10-летним опытом", + "jobTitle": "Компания-разработчик 1С", + "description": "Профессиональная разработка и поддержка 1С с более чем 10-летним опытом", "url": "https://nikdizell.ru", "email": "{{ CONTACT_EMAIL }}", "telephone": "{{ CONTACT_PHONE }}", @@ -122,20 +122,29 @@