minor: отступы и подключаемый блок EXTRA_LD_JSON

This commit is contained in:
2026-08-15 21:21:29 +03:00
parent 811037fe80
commit a4fff36407
+68 -69
View File
@@ -1,79 +1,78 @@
<!doctype html>{% load static %} <!doctype html>{% load static %}
<html lang="ru" x-data="{ darkMode: false }" x-init="darkMode = localStorage.getItem('darkMode') === 'true'; $watch('darkMode', val => { if(val) document.documentElement.classList.add('dark'); else document.documentElement.classList.remove('dark'); })" x-bind:class="{ 'dark': darkMode }"> <html lang="ru" x-data="{ darkMode: false }" x-init="darkMode = localStorage.getItem('darkMode') === 'true'; $watch('darkMode', val => { if(val) document.documentElement.classList.add('dark'); else document.documentElement.classList.remove('dark'); })" x-bind:class="{ 'dark': darkMode }">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="{% block DESCRIPTION %}SVG-матрицы, блокирующие неокортекс. Алгоритмы мерцания и пульсаций, вводящие в транс. Новая web-технология удержания посетителей. Перед деплоем проконсультируйтесь с нейропсихологом{% endblock %}" /> <meta name="description" content="{% block DESCRIPTION %}SVG-матрицы, блокирующие неокортекс. Алгоритмы мерцания и пульсаций, вводящие в транс. Новая web-технология удержания посетителей. Перед деплоем проконсультируйтесь с нейропсихологом{% endblock %}" />
<meta name="keywords" content="{% block KEYWORDS %}hypn0, svg matrix, hypnotoad, гипножаба, векторный глюко-растр, халфтон генератор, k-means svg, веб-дизайн паттерны, css анимация сетки{% endblock %}" /> <meta name="keywords" content="{% block KEYWORDS %}hypn0, svg matrix, hypnotoad, гипножаба, векторный глюко-растр, халфтон генератор, k-means svg, веб-дизайн паттерны, css анимация сетки{% endblock %}" />
<meta name="copyright" lang="ru" content="Sergei Erjemin{% block META_COPYRIGHT_AUTHOR %}{% endblock %}." /> <meta name="copyright" lang="ru" content="Sergei Erjemin{% block META_COPYRIGHT_AUTHOR %}{% endblock %}." />
<meta name="robots" content="{% block ROBOTS %}index,follow{% endblock %}" /> <meta name="robots" content="{% block ROBOTS %}index,follow{% endblock %}" />
<meta name="format-detection" content="telephone=no" /> <meta name="format-detection" content="telephone=no" />
<title>{% block PAGE_TITLE %}hypn0: SVG-matrix of Hypnotoad — инструмент цифрового гипно-маркетинга{% endblock %}</title> <title>{% block PAGE_TITLE %}hypn0: SVG-matrix of Hypnotoad — инструмент цифрового гипно-маркетинга{% endblock %}</title>
<meta name="meta-title" content="{% block META_TITLE %}hypn0: SVG-matrix of Hypnotoad — инструмент цифрового гипно-маркетинга{% endblock %}" /> <meta name="meta-title" content="{% block META_TITLE %}hypn0: SVG-matrix of Hypnotoad — инструмент цифрового гипно-маркетинга{% endblock %}" />
<meta name="meta-description" content="{% block META_DESCRIPTION %}SVG-матрицы, блокирующие неокортекс. Алгоритмы мерцания и пульсаций, вводящие в транс. Новая web-технология удержания посетителей. Перед деплоем проконсультируйтесь с нейропсихологом{% endblock %}" /> <meta name="meta-description" content="{% block META_DESCRIPTION %}SVG-матрицы, блокирующие неокортекс. Алгоритмы мерцания и пульсаций, вводящие в транс. Новая web-технология удержания посетителей. Перед деплоем проконсультируйтесь с нейропсихологом{% endblock %}" />
<meta property="og:site_name" content="hypn0.xyz" /> <meta property="og:site_name" content="hypn0.xyz" />
<meta property="og:locale" content="ru_RU" /> <meta property="og:locale" content="ru_RU" />
<meta property="og:title" content="{% block OG_TITLE %}hypn0: SVG-matrix of Hypnotoad — инструмент цифрового гипно-маркетинга{% endblock %}" /> <meta property="og:title" content="{% block OG_TITLE %}hypn0: SVG-matrix of Hypnotoad — инструмент цифрового гипно-маркетинга{% endblock %}" />
<meta property="og:description" content="{% block OG_DESCRIPTION %}SVG-матрицы, блокирующие неокортекс. Алгоритмы мерцания и пульсаций, вводящие в транс. Новая web-технология удержания посетителей. Перед деплоем проконсультируйтесь с нейропсихологом{% endblock %}" /> <meta property="og:description" content="{% block OG_DESCRIPTION %}SVG-матрицы, блокирующие неокортекс. Алгоритмы мерцания и пульсаций, вводящие в транс. Новая web-технология удержания посетителей. Перед деплоем проконсультируйтесь с нейропсихологом{% endblock %}" />
<meta property="og:url" content="{% block OG_URL %}{{ request.scheme }}://{{ request.get_host }}{{ request.path }}{% endblock %}" /> <meta property="og:url" content="{% block OG_URL %}{{ request.scheme }}://{{ request.get_host }}{{ request.path }}{% endblock %}" />
<meta property="og:type" content="{% block OG_TYPE %}website{% endblock %}" /> <meta property="og:type" content="{% block OG_TYPE %}website{% endblock %}" />
<meta property="og:image" content="{% block OG_IMAGE %}{% static 'img/og-hypn0-default.png' %}{% endblock %}" /> <meta property="og:image" content="{% block OG_IMAGE %}{% static 'img/og-hypn0-default.png' %}{% endblock %}" />
<meta property="og:image:alt" content="{% block OG_IMAGE_ALT %}hypn0: SVG-matrix of Hypnotoad — инструмент цифрового гипно-маркетинга{% endblock %}" /> <meta property="og:image:alt" content="{% block OG_IMAGE_ALT %}hypn0: SVG-matrix of Hypnotoad — инструмент цифрового гипно-маркетинга{% endblock %}" />
<meta name="twitter:card" content="{% block TWITTER_CARD %}summary_large_image{% endblock %}" /> <meta name="twitter:card" content="{% block TWITTER_CARD %}summary_large_image{% endblock %}" />
<meta name="twitter:title" content="{% block TWITTER_TITLE %}hypn0: SVG-matrix of Hypnotoad — инструмент цифрового гипно-маркетинга{% endblock %}" /> <meta name="twitter:title" content="{% block TWITTER_TITLE %}hypn0: SVG-matrix of Hypnotoad — инструмент цифрового гипно-маркетинга{% endblock %}" />
<meta name="twitter:description" content="{% block TWITTER_DESCRIPTION %}SVG-матрицы, блокирующие неокортекс. Алгоритмы мерцания и пульсаций, вводящие в транс. Новая web-технология удержания посетителей. Перед деплоем проконсультируйтесь с нейропсихологом{% endblock %}" /> <meta name="twitter:description" content="{% block TWITTER_DESCRIPTION %}SVG-матрицы, блокирующие неокортекс. Алгоритмы мерцания и пульсаций, вводящие в транс. Новая web-технология удержания посетителей. Перед деплоем проконсультируйтесь с нейропсихологом{% endblock %}" />
<meta name="twitter:image" content="{% block TWITTER_IMAGE %}{% static 'img/og-hypn0-default.png' %}{% endblock %}" /> <meta name="twitter:image" content="{% block TWITTER_IMAGE %}{% static 'img/og-hypn0-default.png' %}{% endblock %}" />
<meta name="theme-color" content="#F5F5F5" /> <meta name="theme-color" content="#F5F5F5" />
{# Шутка #}<meta name="generator" content="Microsoft FrontPage 1.0" /> {# Шутка #}<meta name="generator" content="Microsoft FrontPage 1.0" />
<meta name="apple-mobile-web-app-title" content="hypn0" /> <meta name="apple-mobile-web-app-title" content="hypn0" />
{# !CANONICAL #}<link rel="canonical" href="{% block CANONICAL %}{{ request.scheme }}://{{ request.get_host }}{{ request.path }}{% endblock %}" /> {# !CANONICAL #}<link rel="canonical" href="{% block CANONICAL %}{{ request.scheme }}://{{ request.get_host }}{{ request.path }}{% endblock %}" />
<link rel="icon" type="image/png" href="{% static 'img/favicon.png' %}" sizes="96x96" /> <link rel="icon" type="image/png" href="{% static 'img/favicon.png' %}" sizes="96x96" />
<link rel="icon" type="image/svg+xml" href="{% static 'img/favicon.svg' %}" /> <link rel="icon" type="image/svg+xml" href="{% static 'img/favicon.svg' %}" />
<link rel="shortcut icon" href="{% static 'img/favicon.ico' %}" /> <link rel="shortcut icon" href="{% static 'img/favicon.ico' %}" />
<link rel="apple-touch-icon" href="{% static 'img/apple-touch-icon.png' %}" sizes="180x180" /> <link rel="apple-touch-icon" href="{% static 'img/apple-touch-icon.png' %}" sizes="180x180" />
<link rel="manifest" href="{% static 'img/site.webmanifest' %}" /> <link rel="manifest" href="{% static 'img/site.webmanifest' %}" />
<script> <script>
if (localStorage.getItem('darkMode') === 'true' || (!('darkMode' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) { if (localStorage.getItem('darkMode') === 'true' || (!('darkMode' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
document.documentElement.classList.add('dark'); document.documentElement.classList.add('dark');
} else { } else {
document.documentElement.classList.remove('dark'); document.documentElement.classList.remove('dark');
} }
</script> </script>
{% if IS_DEBUG %}{% comment %} {% if IS_DEBUG %}{% comment %}
Переключение dev/prod стилей Tailwind CSS происходит Переключение dev/prod стилей Tailwind CSS происходит
АВТОМАТИЧЕСКИ через переменную IS_DEBUG (см. контексный-процессор АВТОМАТИЧЕСКИ через переменную IS_DEBUG (см. контексный-процессор
frontend/context_processors.py), DEV: tailwindcss из CDN, компилируется прямо в браузере. Удобно frontend/context_processors.py), DEV: tailwindcss из CDN, компилируется прямо в браузере. Удобно
для разработки (не нужна сборка), но грузит браузер и prod не используется. {% endcomment %} для разработки (не нужна сборка), но грузит браузер и prod не используется. {% endcomment %}
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>{% comment %} <script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>{% comment %}
Кастомные @theme/@layer директивы проекта (токены цвета, типовой стиль ссылок) Кастомные @theme/@layer директивы проекта (токены цвета, типовой стиль ссылок)
лежат в css/tailwind-custom.css. @tailwindcss/browser сканирует и компилирует ТОЛЬКО то, что лежат в css/tailwind-custom.css. @tailwindcss/browser сканирует и компилирует ТОЛЬКО то, что
видит в финальном DOM — то есть только содержимое тегов style с type text/tailwindcss, а не видит в финальном DOM — то есть только содержимое тегов style с type text/tailwindcss, а не
внешние .css, подключённые через link. Поэтому файл вставляется сюда через include, а не внешние .css, подключённые через link. Поэтому файл вставляется сюда через include, а не
подключается отдельным link.{% endcomment %} подключается отдельным link.{% endcomment %}
<style type="text/tailwindcss"> <style type="text/tailwindcss">
{% include "css/tailwind-custom.css" %} {% include "css/tailwind-custom.css" %}
</style>{% else %}{% comment %} PROD: заранее собранный Tailwind CLI файл (см. </style>{% else %}{% comment %} PROD: заранее собранный Tailwind CLI файл (см.
frontend-assembly/tailwind/input.css и package.json). CLI сканирует шаблоны проекта и генерирует frontend-assembly/tailwind/input.css и package.json). CLI сканирует шаблоны проекта и генерирует
только реально используемые классы, включая кастомные @theme/@layer директивы из того же самого только реально используемые классы, включая кастомные @theme/@layer директивы из того же самого
файла css/tailwind-custom.css (подключён в input.css через @import).{% endcomment %} файла css/tailwind-custom.css (подключён в input.css через @import).{% endcomment %}
<link rel="stylesheet" href="{% static 'css/tailwind.min.css' %}" />{% endif %} <link rel="stylesheet" href="{% static 'css/tailwind.min.css' %}" />{% endif %}
<script type="application/ld+json"> <script type="application/ld+json">
{ {
"@context": "https://schema.org", "@context": "https://schema.org",
"@type": "WebSite", "@type": "WebSite",
"name": "hypn0.xyz", "name": "hypn0.xyz",
"url": "{{ request.scheme }}://{{ request.get_host }}/" "url": "{{ request.scheme }}://{{ request.get_host }}/"
}{% block EXTRA_LD_JSON %}{% endblock EXTRA_LD_JSON %} }{% block EXTRA_LD_JSON %}
</script> {% endblock EXTRA_LD_JSON %}</script>
<script src="{% static 'js/alpine.min.js' %}" defer></script> <script src="{% static 'js/alpine.min.js' %}" defer></script>
<script src="{% static 'js/htmx.min.js' %}" defer></script> <script src="{% static 'js/htmx.min.js' %}" defer></script>
{% block EXTRA_HEAD %}{% endblock EXTRA_HEAD %} {% block EXTRA_HEAD %}{% endblock EXTRA_HEAD %}
<link rel="stylesheet" href="{% static 'css/hypn0.css' %}" />
</head> </head>
<body class="bg-stone-50 text-emerald-700 dark:bg-zinc-950 dark:text-emerald-100 font-mono">{% block ADD_CSS1 %}{% endblock %}{% block ADD_CSS2 %}{% endblock %}{% block ADD_CSS3 %}{% endblock %}{% block BODY %} <body class="bg-stone-50 text-emerald-700 dark:bg-zinc-950 dark:text-emerald-100 font-mono">{% block ADD_CSS1 %}{% endblock %}{% block ADD_CSS2 %}{% endblock %}{% block ADD_CSS3 %}{% endblock %}{% block BODY %}
{% include "block/header.html" %} {% include "block/header.html" %}
<main id="main-content" class="mx-auto min-h-screen max-w-7xl px-4 py-8"> <main id="main-content" class="mx-auto min-h-screen max-w-7xl px-4 py-8">
{% block CONTENT %}{% endblock CONTENT %} {% block CONTENT %}{% endblock CONTENT %}
</main> </main>
{# {% include "blocks/footer.jinja2" %} #}{% endblock BODY %}{% if not ALLOW_TRACKING %}{# Если клиент еще не согласился на отслеживание покажем ему уведомление #}{% include "block/allow-tracking.html" %}{% else %}{# Если согласился -- отслеживаем#} {# {% include "blocks/footer.jinja2" %} #}{% endblock BODY %}{% if not ALLOW_TRACKING %}{# Если клиент еще не согласился на отслеживание покажем ему уведомление #}{% include "block/allow-tracking.html" %}{% else %}{# Если согласился -- отслеживаем#}
<script src="{% static 'js/analytics.js' %}"></script>{% endif %} <script src="{% static 'js/analytics.js' %}"></script>{% endif %}