187 lines
11 KiB
HTML
187 lines
11 KiB
HTML
{% extends '_base.html' %}
|
||
{% load static %}
|
||
|
||
{% block PAGE_TITLE %}{% if current_floor == 'fresh' %}Инкубатор бессознательного{% elif current_floor == 'curated' %}Одобрено Мозговым Слизнем{% elif current_floor == 'top' %}Золотой фонд транса{% else %}Галерея транса — Каталог анимированных картин{% endif %}{% if page_obj.number > 1 %} (Фаза {{ page_obj.number }}){% endif %} | HypnoSVG{% endblock %}
|
||
|
||
{% block META_TITLE %}{% if current_floor == 'fresh' %}Инкубатор бессознательного — Свежие SVG-картины{% elif current_floor == 'curated' %}Одобрено Мозговым Слизнем — Лучшие SVG-халфтоны{% elif current_floor == 'top' %}Золотой фонд транса — Бессмертные SVG-матрицы{% else %}Галерея транса — Каталог анимированных SVG-картин{% endif %}{% if page_obj.number > 1 %} (Фаза {{ page_obj.number }}){% endif %} | HypnoSVG{% endblock %}
|
||
|
||
{% block META_DESCRIPTION %}{% if current_floor == 'fresh' %}Свежие кандидаты в галерею транса HypnoSVG: новые психоделические генерации и векторные матрицы.{% elif current_floor == 'curated' %}Кураторская подборка анимированных SVG-халфтонов HypnoSVG, прошедших одобрение сообщества.{% elif current_floor == 'top' %}Золотой фонд бессмертных векторных матриц и шедевров цифрового транса HypnoSVG.{% else %}Полный каталог и архив анимированных SVG-халфтонов и психоделических картин HypnoSVG.{% endif %}{% if page_obj.number > 1 %} Страница {{ page_obj.number }} из {{ page_obj.paginator.num_pages }}.{% endif %}{% endblock %}
|
||
|
||
{% block OG_TITLE %}{% if current_floor == 'fresh' %}Инкубатор бессознательного{% elif current_floor == 'curated' %}Одобрено Мозговым Слизнем{% elif current_floor == 'top' %}Золотой фонд транса{% else %}Галерея транса{% endif %}{% if page_obj.number > 1 %} (Фаза {{ page_obj.number }}){% endif %} | HypnoSVG{% endblock %}
|
||
|
||
{% block OG_DESCRIPTION %}{% if current_floor == 'fresh' %}Свежие кандидаты в галерею транса HypnoSVG: новые психоделические генерации.{% elif current_floor == 'curated' %}Кураторская подборка анимированных SVG-халфтонов HypnoSVG, одобренных сообществом.{% elif current_floor == 'top' %}Золотой фонд бессмертных векторных матриц и шедевров транса HypnoSVG.{% else %}Полный каталог и архив анимированных SVG-халфтонов и психоделических картин HypnoSVG.{% endif %}{% endblock %}
|
||
|
||
{% block CANONICAL %}{{ request.scheme }}://{{ request.get_host }}{{ request.path }}{% if current_floor != 'all' or page_obj.number > 1 %}?{% if current_floor != 'all' %}floor={{ current_floor }}{% endif %}{% if current_floor != 'all' and page_obj.number > 1 %}&{% endif %}{% if page_obj.number > 1 %}page={{ page_obj.number }}{% endif %}{% endif %}{% endblock %}
|
||
|
||
{% block EXTRA_HEAD %}
|
||
{% if page_obj.has_previous %}
|
||
<link rel="prev" href="{{ request.path }}?floor={{ current_floor }}&sort={{ current_sort }}&page={{ page_obj.previous_page_number }}" />
|
||
{% endif %}
|
||
{% if page_obj.has_next %}
|
||
<link rel="next" href="{{ request.path }}?floor={{ current_floor }}&sort={{ current_sort }}&page={{ page_obj.next_page_number }}" />
|
||
{% endif %}
|
||
{% endblock EXTRA_HEAD %}
|
||
|
||
{% block CONTENT %}
|
||
<div class="mx-auto space-y-8">
|
||
|
||
<!-- Хлебные крошки и навигация -->
|
||
<div class="flex flex-wrap items-center justify-between gap-4">
|
||
<a href="{% url 'hypn0_site:index' %}" class="archive-back">
|
||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"/>
|
||
</svg>
|
||
<span>К генератору</span>
|
||
</a>
|
||
|
||
<span class="archive-phase">
|
||
Фаза {{ page_obj.number }} из {{ page_obj.paginator.num_pages }} (Всего: {{ page_obj.paginator.count }})
|
||
</span>
|
||
</div>
|
||
|
||
<!-- Шапка архива -->
|
||
<div class="archive-header">
|
||
<div class="flex flex-wrap items-center gap-3">
|
||
<h1 class="archive-title">
|
||
Галерея транса
|
||
</h1>
|
||
<span class="archive-badge">
|
||
ARCHIVE
|
||
</span>
|
||
</div>
|
||
<p class="archive-desc">
|
||
Полный архив психоделических генераций • Сортировка по гравитации, признанию и свежести
|
||
</p>
|
||
</div>
|
||
|
||
<!-- Панель фильтров (Табы этажей + Селект сортировки) -->
|
||
<div class="archive-filter-bar">
|
||
|
||
<!-- ТАБЫ ЭТАЖЕЙ -->
|
||
<div class="flex flex-wrap items-center gap-1.5 sm:gap-2">
|
||
<!-- Все волны -->
|
||
<a href="?floor=all&sort={{ current_sort }}"
|
||
class="archive-tab {% if current_floor == 'all' %}archive-tab-all-active{% else %}archive-tab-all-idle{% endif %}">
|
||
<span>Все волны</span>
|
||
<span class="font-mono text-[10px] opacity-75">({{ counts.all }})</span>
|
||
</a>
|
||
|
||
<!-- 1-й этаж: Инкубатор -->
|
||
<a href="?floor=fresh&sort={{ current_sort }}"
|
||
class="archive-tab {% if current_floor == 'fresh' %}archive-tab-fresh-active{% else %}archive-tab-fresh-idle{% endif %}">
|
||
<span class="w-2 h-2 rounded-full bg-amber-400"></span>
|
||
<span>Инкубатор</span>
|
||
<span class="font-mono text-[10px] opacity-75">({{ counts.fresh }})</span>
|
||
</a>
|
||
|
||
<!-- 2-й этаж: Одобрено -->
|
||
<a href="?floor=curated&sort={{ current_sort }}"
|
||
class="archive-tab {% if current_floor == 'curated' %}archive-tab-curated-active{% else %}archive-tab-curated-idle{% endif %}">
|
||
<span class="w-2 h-2 rounded-full bg-cyan-400"></span>
|
||
<span>Одобрено</span>
|
||
<span class="font-mono text-[10px] opacity-75">({{ counts.curated }})</span>
|
||
</a>
|
||
|
||
<!-- 3-й этаж: Золотой фонд -->
|
||
<a href="?floor=top&sort={{ current_sort }}"
|
||
class="archive-tab {% if current_floor == 'top' %}archive-tab-top-active{% else %}archive-tab-top-idle{% endif %}">
|
||
<span class="w-2 h-2 rounded-full bg-emerald-400"></span>
|
||
<span>Золотой фонд</span>
|
||
<span class="font-mono text-[10px] opacity-75">({{ counts.top }})</span>
|
||
</a>
|
||
</div>
|
||
|
||
<!-- СЕЛЕКТ СОРТИРОВКИ -->
|
||
<div class="archive-sort-wrap">
|
||
<label for="gallery-sort-select" class="archive-sort-label">
|
||
Порядок:
|
||
</label>
|
||
<select id="gallery-sort-select"
|
||
onchange="window.location.href=this.value"
|
||
class="archive-sort-select">
|
||
{% for opt in sort_options %}
|
||
<option value="?floor={{ current_floor }}&sort={{ opt.id }}" {% if current_sort == opt.id %}selected{% endif %}>
|
||
{{ opt.icon }} {{ opt.title }}
|
||
</option>
|
||
{% endfor %}
|
||
</select>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<!-- Сетка картин (16 штук на страницу) -->
|
||
<div class="gallery-grid">{% for item in page_obj %}
|
||
{% include "block/gallery_card.html" %}
|
||
{% empty %}<div class="archive-empty">
|
||
<svg class="archive-empty-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/>
|
||
</svg>
|
||
<p class="archive-empty-text">В этой выборке пока нет картин. Сгенерируйте шедевр прямо сейчас!</p>
|
||
</div>
|
||
{% endfor %}
|
||
</div>
|
||
|
||
<!-- Пагинация (Предыдущая фаза / Номера страниц / Следующая фаза) -->
|
||
{% if page_obj.has_other_pages %}
|
||
<div class="paginator">
|
||
<div>
|
||
{% if page_obj.has_previous %}
|
||
<a href="?floor={{ current_floor }}&sort={{ current_sort }}&page={{ page_obj.previous_page_number }}"
|
||
rel="prev"
|
||
class="paginator-btn paginator-btn-prev">
|
||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"/>
|
||
</svg>
|
||
<span>Предыдущая фаза</span>
|
||
</a>
|
||
{% else %}
|
||
<span class="paginator-btn paginator-btn-disabled">
|
||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"/>
|
||
</svg>
|
||
<span>Предыдущая фаза</span>
|
||
</span>
|
||
{% endif %}
|
||
</div>
|
||
|
||
<!-- Номера страниц -->
|
||
<div class="paginator-pages">
|
||
{% for p in page_obj.paginator.page_range %}
|
||
{% if p == page_obj.number %}
|
||
<span class="paginator-page-active">
|
||
{{ p }}
|
||
</span>
|
||
{% else %}
|
||
<a href="?floor={{ current_floor }}&sort={{ current_sort }}&page={{ p }}"
|
||
class="paginator-page-link">
|
||
{{ p }}
|
||
</a>
|
||
{% endif %}
|
||
{% endfor %}
|
||
</div>
|
||
|
||
<div>
|
||
{% if page_obj.has_next %}
|
||
<a href="?floor={{ current_floor }}&sort={{ current_sort }}&page={{ page_obj.next_page_number }}"
|
||
rel="next"
|
||
class="paginator-btn paginator-btn-next">
|
||
<span>Следующая фаза</span>
|
||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
|
||
</svg>
|
||
</a>
|
||
{% else %}
|
||
<span class="paginator-btn paginator-btn-disabled">
|
||
<span>Следующая фаза</span>
|
||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
|
||
</svg>
|
||
</span>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
{% endif %}
|
||
|
||
</div>
|
||
{% endblock CONTENT %}
|