355 lines
17 KiB
HTML
355 lines
17 KiB
HTML
{% load static %}
|
||
{% load programmer_tags %}
|
||
{% load django_bootstrap5 %}
|
||
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
<head>
|
||
<title>{{title}}</title>
|
||
<!-- Основные мета-теги -->
|
||
<meta name="description" content="{% block meta_description %}{{ meta_description|default:'Профессиональный программист 1С с более чем 10-летним опытом. Разработка, интеграция и оптимизация систем 1С.' }}{% endblock %}">
|
||
<meta name="keywords" content="{% block meta_keywords %}{{ meta_keywords|default:'программист 1С, разработка 1С, интеграция 1С, оптимизация 1С, 1С предприятие' }}{% endblock %}">
|
||
<meta name="author" content="Николай Сердюк">
|
||
|
||
<!-- Open Graph для соцсетей -->
|
||
<meta property="og:title" content="{{title}}">
|
||
<meta property="og:description" content="{% block og_description %}{{ meta_description|default:'Профессиональный программист 1С с более чем 10-летним опытом' }}{% endblock %}">
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:url" content="{{ request.build_absolute_uri }}">
|
||
<!-- <meta property="og:image" content="{% static 'programmer/images/og-image.jpg' %}">-->
|
||
<meta property="og:site_name" content="Программист 1С - Николай Сердюк">
|
||
|
||
<!-- Twitter Card -->
|
||
<meta name="twitter:card" content="summary_large_image">
|
||
<meta name="twitter:title" content="{{title}}">
|
||
<meta name="twitter:description" content="{% block twitter_description %}{{ meta_description|default:'Профессиональный программист 1С с более чем 10-летним опытом' }}{% endblock %}">
|
||
<!-- <meta name="twitter:image" content="{% static 'programmer/images/og-image.jpg' %}">-->
|
||
|
||
<!-- Дополнительные SEO-теги -->
|
||
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
|
||
<link rel="canonical" href="{{ request.build_absolute_uri }}">
|
||
{% bootstrap_css %}
|
||
|
||
<!-- исключаем мигание при применении темы-->
|
||
<script>
|
||
(function() {
|
||
try {
|
||
const savedTheme = localStorage.getItem('theme');
|
||
if (savedTheme === 'dark') {
|
||
document.body.classList.add('theme-dark');
|
||
}
|
||
} catch (e) {
|
||
// если localStorage недоступен, игнорируем
|
||
}
|
||
})();
|
||
</script>
|
||
|
||
<!-- Основной CSS файл (темная тема по умолчанию) -->
|
||
<link type="text/css" href="{% static 'programmer/css/styles.css' %}" rel="stylesheet" />
|
||
|
||
<!-- Тема Highlight.js -->
|
||
<!-- <link rel="stylesheet" href="{% static 'programmer/css/highlight-default.min.css' %}">-->
|
||
<link rel="stylesheet" href="{% static 'programmer/css/1c-light.min.css' %}" id="theme-css-1c">
|
||
|
||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||
<link rel="shortcut icon" href="{% static 'programmer/images/main.ico' %}" type="image/x-icon">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
|
||
|
||
{% block extra_css %}
|
||
<!-- Дополнительные CSS файлы для конкретных страниц -->
|
||
{% endblock %}
|
||
|
||
<!-- Google Analytics -->
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-X3W9YSQHRM"></script>
|
||
<script>
|
||
window.dataLayer = window.dataLayer || [];
|
||
function gtag(){dataLayer.push(arguments);}
|
||
gtag('js', new Date());
|
||
|
||
gtag('config', 'G-X3W9YSQHRM');
|
||
</script>
|
||
|
||
<!-- Яндекс.Метрика -->
|
||
<script type="text/javascript">
|
||
(function(m,e,t,r,i,k,a){
|
||
m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
|
||
m[i].l=1*new Date();
|
||
for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
|
||
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)
|
||
})(window, document,'script','https://mc.yandex.ru/metrika/tag.js?id=105278924', 'ym');
|
||
|
||
ym(105278924, 'init', {ssr:true, webvisor:true, clickmap:true, ecommerce:"dataLayer", accurateTrackBounce:true, trackLinks:true});
|
||
</script>
|
||
<noscript><div><img src="https://mc.yandex.ru/watch/105278924" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||
|
||
<script type="application/ld+json">
|
||
{
|
||
"@context": "https://schema.org",
|
||
"@type": "Person",
|
||
"name": "Николай Сердюк",
|
||
"jobTitle": "Программист 1С",
|
||
"description": "Профессиональный программист 1С с более чем 10-летним опытом",
|
||
"url": "https://nikdizell.ru",
|
||
"email": "{{ CONTACT_EMAIL }}",
|
||
"telephone": "{{ CONTACT_PHONE }}",
|
||
"knowsAbout": [
|
||
"1С:Предприятие 8.3",
|
||
"Управление торговлей",
|
||
"Бухгалтерия предприятия",
|
||
"Зарплата и управление персоналом",
|
||
"SQL",
|
||
"Веб-сервисы",
|
||
"API интеграция"
|
||
],
|
||
"hasOccupation": {
|
||
"@type": "Occupation",
|
||
"name": "Программист 1С",
|
||
"description": "Разработка и сопровождение систем на платформе 1С",
|
||
"occupationLocation": "Россия"
|
||
}
|
||
}
|
||
</script>
|
||
|
||
</head>
|
||
<body>
|
||
<!-- Header -->
|
||
{% block mainmenu %}
|
||
<header class="header">
|
||
<div class="container">
|
||
<nav class="nav">
|
||
<a href="{% url 'home' %}" class="logo">
|
||
<img src="{% static 'programmer/images/black_logo.ico' %}" alt="Logo" class="logo-img">
|
||
<span class="logo-text">СНА Технологии</span>
|
||
</a>
|
||
|
||
<!-- Десктопное меню -->
|
||
<ul class="nav-menu">
|
||
{% for item in main_menu %}
|
||
<li class="nav-item">
|
||
<a href="{% url item.url_name %}" class="nav-link {% if request.resolver_match.url_name == item.url_name %}active{% endif %}">
|
||
{{ item.title }}
|
||
</a>
|
||
</li>
|
||
{% endfor %}
|
||
</ul>
|
||
|
||
<div class="nav-actions">
|
||
|
||
<!-- Telegram -->
|
||
<!-- <a href="https://t.me/odinesina_prog" target="_blank" class="telegram-btn">-->
|
||
<!-- <span class="telegram-icon">-->
|
||
<!-- <img src="{% static 'programmer/images/share_tg.png' %}" alt="Telegram" width="20" height="20">-->
|
||
<!-- </span>-->
|
||
<!-- </a>-->
|
||
|
||
<!-- Theme Toggle Switch -->
|
||
<div class="theme-switcher">
|
||
<input type="checkbox" id="theme-toggle" class="theme-toggle-checkbox" checked>
|
||
<label for="theme-toggle" class="theme-toggle-label">
|
||
<span class="theme-toggle-slider"></span>
|
||
<span class="theme-icon sun">☀️</span>
|
||
<span class="theme-icon moon">🌙</span>
|
||
</label>
|
||
</div>
|
||
|
||
<div class="user-menu">
|
||
{% for item in user_menu %}
|
||
{% if item.url_name == 'logout' %}
|
||
<form method="post" action="{% url 'logout' %}" style="display: inline;">
|
||
{% csrf_token %}
|
||
<button type="submit" class="nav-link btn btn-link" style="border: none; background: none; padding: 0.5rem 1rem; font: inherit; cursor: pointer; color: inherit;">
|
||
{{ item.title }}
|
||
</button>
|
||
</form>
|
||
{% elif item.url_name == 'login' %}
|
||
<a href="{% url 'login' %}?next={{ request.path|urlencode }}" class="nav-link {% if request.resolver_match.url_name == item.url_name %}active{% endif %}" style="display: inline-block; padding: 0.5rem 1rem;">
|
||
{{ item.title }}
|
||
</a>
|
||
{% elif item.url_name == 'register' %}
|
||
<a href="{% url 'register' %}?next={{ request.path|urlencode }}" class="nav-link {% if request.resolver_match.url_name == item.url_name %}active{% endif %}" style="display: inline-block; padding: 0.5rem 1rem;">
|
||
{{ item.title }}
|
||
</a>
|
||
{% else %}
|
||
<a href="{% url item.url_name %}" class="nav-link {% if request.resolver_match.url_name == item.url_name %}active{% endif %}" style="display: inline-block; padding: 0.5rem 1rem;">
|
||
{{ item.title }}
|
||
</a>
|
||
{% endif %}
|
||
{% endfor %}
|
||
</div>
|
||
|
||
<!-- Кнопка мобильного меню -->
|
||
<button class="mobile-menu-btn" id="mobileMenuBtn">
|
||
☰
|
||
</button>
|
||
</div>
|
||
</nav>
|
||
</div>
|
||
</header>
|
||
|
||
<!-- Мобильное меню -->
|
||
<div class="mobile-menu-overlay" id="mobileMenuOverlay"></div>
|
||
<div class="mobile-menu" id="mobileMenu">
|
||
<div class="mobile-menu-header">
|
||
<h3>Меню</h3>
|
||
<button class="mobile-menu-close" id="mobileMenuClose">
|
||
✕
|
||
</button>
|
||
</div>
|
||
|
||
<ul class="mobile-nav-menu">
|
||
{% for m in main_menu %}
|
||
<li class="mobile-nav-item">
|
||
{% if m.url_name == 'logout' %}
|
||
<form method="post" action="{% url 'logout' %}" style="display: block;">
|
||
{% csrf_token %}
|
||
<button type="submit" class="mobile-nav-link btn btn-link" style="border: none; background: none; width: 100%; text-align: left; padding: 1rem; font: inherit; cursor: pointer; color: inherit;">
|
||
{{ m.title }}
|
||
</button>
|
||
</form>
|
||
{% else %}
|
||
<a href="{% url m.url_name %}" class="mobile-nav-link {% if request.resolver_match.url_name == m.url_name %}active{% endif %}">
|
||
{{ m.title }}
|
||
</a>
|
||
{% endif %}
|
||
</li>
|
||
{% endfor %}
|
||
|
||
{% for item in user_menu %}
|
||
{% if item.url_name == 'logout' %}
|
||
<form method="post" action="{% url 'logout' %}" style="display: inline;">
|
||
{% csrf_token %}
|
||
<button type="submit" class="nav-link btn btn-link" style="border: none; background: none; padding: 0.5rem 1rem; font: inherit; cursor: pointer; color: inherit;">
|
||
{{ item.title }}
|
||
</button>
|
||
</form>
|
||
{% else %}
|
||
<a href="{% url item.url_name %}" class="nav-link {% if request.resolver_match.url_name == item.url_name %}active{% endif %}" style="display: inline-block; padding: 0.5rem 1rem;">
|
||
{{ item.title }}
|
||
</a>
|
||
{% endif %}
|
||
{% endfor %}
|
||
</ul>
|
||
|
||
<div class="mobile-nav-actions">
|
||
<!-- <a href="https://t.me/odinesina_prog" target="_blank" class="btn btn-primary" style="width: 100%; text-align: center;">-->
|
||
<!-- <span class="telegram-icon">-->
|
||
<!-- <img src="{% static 'programmer/images/share_tg.png' %}" alt="Telegram" width="20" height="20">-->
|
||
<!-- </span>-->
|
||
<!-- </a>-->
|
||
<div class="theme-switcher" style="justify-content: center;">
|
||
<input type="checkbox" id="mobile-theme-toggle" class="theme-toggle-checkbox" checked>
|
||
<label for="mobile-theme-toggle" class="theme-toggle-label">
|
||
<span class="theme-toggle-slider"></span>
|
||
<span class="theme-icon sun">☀️</span>
|
||
<span class="theme-icon moon">🌙</span>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{% endblock mainmenu %}
|
||
|
||
<!-- Main Content -->
|
||
<main class="main">
|
||
<div class="container">
|
||
<section class="content">
|
||
<!-- Breadcrumbs -->
|
||
{% block breadcrumbs %}
|
||
<nav class="breadcrumbs" aria-label="breadcrumb">
|
||
<a href="{% url 'home' %}" class="breadcrumb-link">Главная</a>
|
||
{% for crumb in breadcrumbs %}
|
||
<span class="breadcrumb-separator">/</span>
|
||
{% if crumb.url_name %}
|
||
{% if crumb.category_slug %}
|
||
<a href="{% url crumb.url_name category_slug=crumb.category_slug %}" class="breadcrumb-link">{{ crumb.title }}</a>
|
||
{% elif crumb.url_args %}
|
||
<a href="{% url crumb.url_name crumb.url_kwargs %}" class="breadcrumb-link">{{ crumb.title }}</a>
|
||
{% else %}
|
||
<a href="{% url crumb.url_name %}" class="breadcrumb-link">{{ crumb.title }}</a>
|
||
{% endif %}
|
||
{% else %}
|
||
<span class="breadcrumb-current">{{ crumb.title }}</span>
|
||
{% endif %}
|
||
{% empty %}
|
||
{# Если крошек нет, показываем просто заголовок страницы #}
|
||
<span class="breadcrumb-separator">/</span>
|
||
<span class="breadcrumb-current">{{ title }}</span>
|
||
{% endfor %}
|
||
</nav>
|
||
{% endblock %}
|
||
|
||
<!-- Messages -->
|
||
{% bootstrap_messages %}
|
||
|
||
<!-- Page Content -->
|
||
<div class="page-content">
|
||
{% block content %}
|
||
{% endblock %}
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</main>
|
||
|
||
<!-- Footer -->
|
||
<footer class="footer">
|
||
<div class="container">
|
||
<div class="footer-content">
|
||
<div class="footer-info">
|
||
<h3>Николай Сердюк</h3>
|
||
<p>Программист 1С</p>
|
||
</div>
|
||
<div class="footer-contacts">
|
||
<p>📧 {{ CONTACT_EMAIL }}</p>
|
||
<p>📱 {{ CONTACT_PHONE }}</p>
|
||
</div>
|
||
<div class="footer-copyright">
|
||
<p>© 2026 ИП Сердюк Николай Александрович. Все права защищены.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
|
||
{% bootstrap_javascript %}
|
||
<script src="{% static 'programmer/js/theme-switcher.js' %}"></script>
|
||
<script src="{% static 'programmer/js/mobile-menu.js' %}"></script>
|
||
|
||
<!-- Основной скрипт Highlight.js -->
|
||
<script src="{% static 'programmer/js/highlight.min.js' %}"></script>
|
||
|
||
<!-- Локальный плагин для 1С -->
|
||
<script src="{% static 'programmer/js/1c-enterprise.min.js' %}"></script>
|
||
|
||
<!-- Инициализация подсветки: только для блоков 1С -->
|
||
<script>
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
hljs.highlightAll();
|
||
});
|
||
</script>
|
||
|
||
{% block extra_js %}
|
||
|
||
|
||
{% endblock %}
|
||
|
||
<script>
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
const bottomConsent = document.getElementById('cookie-consent-bottom');
|
||
const acceptBtn = document.getElementById('cookie-accept-bottom');
|
||
|
||
if (!localStorage.getItem('cookieConsent')) {
|
||
bottomConsent.style.display = 'block';
|
||
}
|
||
|
||
if (acceptBtn) {
|
||
acceptBtn.addEventListener('click', function() {
|
||
localStorage.setItem('cookieConsent', 'true');
|
||
bottomConsent.style.display = 'none';
|
||
});
|
||
}
|
||
|
||
// Можно добавить закрытие по клику вне (но для плашки обычно не нужно)
|
||
// Если хотите, можно сделать крестик в углу
|
||
});
|
||
</script>
|
||
{% include 'programmer/includes/cookie_consent.html' %}
|
||
</body>
|
||
</html> |