{% extends 'base.html.twig' %}
{% block title %}Галерея картин – Николай Макаров{% endblock %}
{% block body %}
<h1 class="text-3xl font-semibold my-8 text-center mx-auto">Галерея</h1>
<div class="flex items-center justify-center py-4 md:py-8 flex-wrap mb-8">
<button type="button" class="text-blue-700 hover:text-white border-2 border-blue-600 bg-white hover:bg-blue-700 focus:ring-4 focus:outline-none focus:ring-blue-300 rounded-full text-base font-medium px-5 py-2.5 text-center mr-3 mb-3 dark:border-blue-500 dark:text-blue-500 dark:hover:text-white dark:hover:bg-blue-500 dark:bg-gray-900 dark:focus:ring-blue-800" aria-label="Показать все жанры">
<a href="{{ path('photo_gallery') }}">Все жанры</a>
</button>
{% for genre in genres %}
{% set isNonFiction = 'non-fiction' in genre %}
{% if not isNonFiction %}
<button type="button" class="hover:text-white hover:bg-blue-700 dark:border-blue-500 dark:text-blue-500 dark:hover:text-white dark:hover:bg-blue-500 dark:focus:ring-blue-800 text-gray-900 border-2 border-white hover:border-gray-200 dark:border-gray-900 dark:bg-gray-900 dark:hover:border-gray-700 bg-white focus:ring-4 focus:outline-none focus:ring-gray-300 rounded-full text-base font-medium px-5 py-2.5 text-center mr-3 mb-3 dark:text-white dark:focus:ring-gray-800" aria-label="Показать жанр {{ genre|join(', ') }}">
<a href="{{ path('photos_by_genre', {'genre': genre|join(',')}) }}">{{ genre|join(', ') }}</a>
</button>
{% endif %}
{% endfor %}
</div>
<div class="container mx-auto px-4 pb-2">
<div class="masonry">
{% for photo in photos %}
{% if 'non-fiction' not in photo.genre %}
<div class="masonry-item">
<a href="{{ path('photo_show', {'genre': photo.genre, 'id': photo.id}) }}" aria-label="Просмотр картины {{ photo.title }}">
<div class="image-container" role="img" aria-label="Картина {{ photo.title }}">
<img class="h-auto max-w-full rounded-lg" src="{{ asset('photos/' ~ photo.path) }}" alt="Картина '{{ photo.title }}' в жанре {{ photo.genre }}" loading="lazy" width="200" height="300">
<div class="image-overlay" aria-hidden="true">
<p class="image-text">Посмотреть</p>
</div>
</div>
</a>
</div>
{% endif %}
{% endfor %}
</div>
</div>
<style>
/* Основной стиль сетки */
.masonry {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.masonry-item {
flex: 1 1 30%;
max-width: 30%;
background-color: #f0f0f0;
border: 1px solid #ccc;
padding: 1rem;
box-sizing: border-box;
margin-bottom: 1rem;
}
@media (max-width: 1200px) {
.masonry-item {
flex: 1 1 45%;
max-width: 45%;
}
}
@media (max-width: 768px) {
.masonry-item {
flex: 1 1 100%;
max-width: 100%;
}
}
.image-container {
position: relative;
}
.image-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
opacity: 0;
transition: opacity 0.3s ease;
}
.image-text {
color: #fff;
font-size: 18px;
font-weight: bold;
}
.image-container:hover .image-overlay {
opacity: 1;
}
</style>
<!-- Подключение Masonry.js для более точной расстановки элементов -->
<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
<script>
// Инициализация Masonry после загрузки
document.addEventListener('DOMContentLoaded', function () {
const masonry = new Masonry('.masonry', {
itemSelector: '.masonry-item',
columnWidth: '.masonry-item',
percentPosition: true,
gutter: 20
});
});
</script>
{% endblock %}