Стилизация подкатегорий каталога платьев

This commit is contained in:
Konstantin
2026-05-30 11:23:30 +03:00
parent 1da999779b
commit a7cbc801a4
3 changed files with 642 additions and 486 deletions
@@ -1,360 +1,547 @@
:root{ :root{
--color-secondary: #D8CECB; --color-secondary: #D8CECB;
--color-gray: #EEEEEE; --color-gray: #EEEEEE;
--color-dark-gray: #5c5950; --color-dark-gray: #5c5950;
} --swiper-theme-color: var(--bs-dark) !important;
body{ }
body{
font-family: "Tenor Sans", sans-serif;
font-weight: 400; font-family: "Tenor Sans", sans-serif;
font-style: normal; font-weight: 400;
font-size: 16px; font-style: normal;
} font-size: 16px;
a{ }
text-decoration: none; a{
color: inherit; text-decoration: none;
} color: inherit;
img{ }
max-width: 100%; img{
} max-width: 100%;
.container-fluid { }
max-width: 1400px; .container-fluid {
} max-width: 1400px;
p { }
margin-bottom: 0.5rem; p {
} margin-bottom: 0.5rem;
a:hover{ }
color: var(--color-secondary); a:hover{
} color: var(--color-secondary);
a:hover svg, }
a:hover path{ a:hover svg,
fill: var(--color-secondary); a:hover path{
} fill: var(--color-secondary);
.heading { }
font-size: 27px; .heading {
line-height: 120%; font-size: 27px;
} line-height: 120%;
.subheading{ }
font-size: 19px; .subheading{
line-height: 120%; font-size: 19px;
} line-height: 120%;
}
.logo {
.logo {
font-size: 30px;
font-size: 30px;
}
}
header .menu {
margin: 0; header .menu {
padding: 0; margin: 0;
list-style: none; padding: 0;
display: flex; list-style: none;
} display: flex;
}
header .menu ul {
position: absolute; header .menu ul {
opacity: 0; position: absolute;
visibility: hidden; opacity: 0;
transition-duration: 0.2s; visibility: hidden;
top: 100%; transition-duration: 0.2s;
background-color: white; top: 100%;
width: 260px; background-color: white;
width: 260px;
box-shadow: 0px -1px 20px 3px #4b4b4b3d;
padding: 10px 0; box-shadow: 0px -1px 20px 3px #4b4b4b3d;
} padding: 10px 0;
header .menu ul li { }
padding: 0px 15px; header .menu ul li {
} padding: 0px 15px;
header .menu ul li a { }
display: flex; header .menu ul li a {
width: 100%; display: flex;
} width: 100%;
header .menu li:hover ul{ }
opacity: 1; header .menu li:hover ul{
visibility: visible; opacity: 1;
} visibility: visible;
header .menu li { }
padding: 13px 15px; header .menu li {
display: flex; padding: 13px 15px;
align-items: center; display: flex;
} align-items: center;
header .menu li a { }
flex-wrap: nowrap; header .menu li a {
display: flex; flex-wrap: nowrap;
align-items: center; display: flex;
} align-items: center;
header .menu svg{ }
header .menu svg{
}
}
header .menu>li:first-child {
padding-left: 0; header .menu>li:first-child {
} padding-left: 0;
header .menu>li:last-child { }
padding-right: 0; header .menu>li:last-child {
} padding-right: 0;
@media (max-width: 767px){ }
header .menu li { @media (max-width: 767px){
padding: 13px 8px; header .menu li {
} padding: 13px 8px;
.logo { }
.logo {
font-size: 20px;
font-size: 20px;
}
} }
.btn { }
text-transform: uppercase; .btn {
padding: 10px 30px; text-transform: uppercase;
border-radius: 0; padding: 10px 30px;
box-shadow: none !important; border-radius: 0;
} box-shadow: none !important;
.btn-close{ }
box-shadow: none !important; .btn-close{
outline: none; box-shadow: none !important;
} outline: none;
.btn-white{ }
background-color: white; .btn-white{
color: black; background-color: white;
color: black;
}
.btn-white:hover{ }
background-color: var(--color-secondary); .btn-white:hover{
} background-color: var(--color-secondary);
}
.product-card .images{
position: relative; .product-card .images{
} position: relative;
}
.product-card .images .hidden-image{
position: absolute; .product-card .images .hidden-image{
left: 0; position: absolute;
top: 0; left: 0;
opacity: 0; top: 0;
visibility: hidden; opacity: 0;
transition-duration: 0.4s; visibility: hidden;
} transition-duration: 0.4s;
}
.product-card .images:hover .hidden-image{
opacity: 1; .product-card .images:hover .hidden-image{
visibility: visible; opacity: 1;
} visibility: visible;
.swiper-pagination-bullet{ }
transition-duration: 0.45s; .swiper-pagination-bullet{
} transition-duration: 0.45s;
.swiper-pagination-bullet-active { }
width: 30px !important; .swiper-pagination-bullet-active {
border-radius: 10px !important; width: 30px !important;
} border-radius: 10px !important;
}
.bg-dominik{
background-color: var(--color-secondary); .subcategory-showcase {
} background: linear-gradient(180deg, #f8f6f5 0, #fff 100%);
.bg-dominik-dark{ color: #14142b;
background-color: var(--color-dark-gray); }
}
.subcategory-showcase__heading {
.bg-center { max-width: 760px;
background-position: center; margin: 0 auto 31px;
background-repeat: no-repeat; text-align: center;
background-size: cover; }
}
.position-relative{ .subcategory-showcase__eyebrow {
z-index: 0; display: block;
} color: var(--color-dark-gray);
.bg-absolute-background { font-size: 11px;
position: absolute; letter-spacing: 0.18em;
left: 0; line-height: 1.4;
top: 0; text-transform: uppercase;
width: 100%; }
height: 100%;
z-index: -1; .subcategory-showcase__heading h1,
} .subcategory-showcase__heading h2 {
.bg-absolute-background img { margin: 10px 0 0;
z-index: 0; color: #14142b;
position: relative; font-size: clamp(30px, 3.2vw, 46px);
width: 100%; font-weight: 400;
height: 100%; line-height: 1.12;
object-fit: cover; }
}
section{ .subcategory-slider {
overflow-x: hidden; padding: 3px 2px 0;
} }
.text-shadow{
text-shadow: -3px 5px 11px #000 .subcategory-card {
} display: block;
min-width: 0;
@media (max-width: 767px){ color: #14142b;
.section-prems .banner-text { }
background-color: var(--color-gray);
color: black !important; .subcategory-card:hover {
text-shadow: none; color: #14142b;
margin-bottom: 1rem; }
text-align: center;
} .subcategory-card__image {
.section-prems .banner-text p{ position: relative;
margin: 0 auto; display: block;
aspect-ratio: 1;
} overflow: hidden;
.section-prems .bg-dominik-dark{ background: #ede9e7;
background-color: transparent; }
}
.w-mob-100{ .subcategory-card__image::after {
width: 100%; position: absolute;
} inset: 10px;
border: 1px solid rgba(255, 255, 255, 0.72);
} content: "";
pointer-events: none;
transition: inset 0.35s, border-color 0.35s;
}
.nav-tabs{
border: none; .subcategory-card__image img {
} width: 100%;
.nav-link { height: 100%;
border: none !important; object-fit: cover;
text-transform: uppercase; transition: transform 0.5s;
outline: none; }
padding: 0 0 4px 0;
border-bottom: 2px solid #000 !important; .subcategory-card__number {
border-radius: 0; position: absolute;
color: black; right: 10px;
opacity: 0.4; bottom: 10px;
text-wrap: nowrap; min-width: 38px;
} padding: 6px 7px 5px;
.nav-link:hover,.nav-link.active{ background: rgba(255, 255, 255, 0.92);
opacity: 1; color: #14142b;
color: black; font-size: 11px;
} letter-spacing: 0.12em;
.nav-item{ line-height: 1;
margin-right: 18px; text-align: center;
margin-bottom: 10px; }
}
.sw-thumb{ .subcategory-card__body {
display: flex;
} gap: 14px;
.sw-thumb:not(.swiper-slide-thumb-active){ align-items: center;
opacity: 0.5; justify-content: space-between;
cursor: pointer; padding: 15px 1px 0;
} }
.offcanvas-wrap { .subcategory-card__title {
position: fixed; font-size: 17px;
z-index: 1100; line-height: 1.3;
} }
.toast-container{
z-index: 1200; .subcategory-card__arrow {
} display: inline-flex;
.modal-backdrop { flex: 0 0 auto;
background-color: var(--color-secondary); align-items: center;
} justify-content: center;
.modal-backdrop.show { transition: transform 0.25s;
opacity: .7; }
}
.modal-header { .subcategory-card__arrow svg,
border-bottom: 0; .subcategory-slider__button svg {
} fill: none !important;
stroke: currentColor;
.form-wrap { stroke-linecap: round;
position: relative; stroke-linejoin: round;
} }
.form-wrap label {
background-color: #ffffff; .subcategory-card:hover .subcategory-card__image img {
position: relative; transform: scale(1.055);
display: inline-block; }
top: 1px;
left: 15px; .subcategory-card:hover .subcategory-card__image::after {
} inset: 15px;
.form-control { border-color: rgba(255, 255, 255, 0.92);
box-shadow: none !important; }
border-radius: 0;
padding: 10px 13px; .subcategory-card:hover .subcategory-card__arrow {
} transform: translateX(4px);
.form-control:focus{ }
border-color: #000
} .subcategory-slider__controls {
display: flex;
.fav-btn { gap: 16px;
position: absolute; align-items: center;
top: 20px; justify-content: center;
right: 20px; padding-top: 32px;
opacity: 0; }
visibility: hidden;
.subcategory-slider .swiper-pagination {
} position: static;
.product-card:hover .fav-btn{ width: auto;
opacity: 1; min-width: 56px;
visibility: visible; transform: none;
} }
.fav-btn svg path{
fill: #fff !important; .subcategory-slider .swiper-pagination-bullet {
transition-duration: 0.2s; margin: 0 4px;
} }
.fav-btn:hover svg path{
fill: var(--color-secondary) !important; .subcategory-slider__button {
} position: static;
@media (max-width: 767px){ width: 42px;
.fav-btn { height: 42px;
opacity: 1; margin: 0;
visibility: visible; border: 1px solid rgba(20, 20, 43, 0.16);
} background: transparent;
} color: #14142b;
transition: background-color 0.2s, border-color 0.2s, color 0.2s;
.abs-loading.abs-loading-fixed { }
position: fixed;
top: 0; .subcategory-slider__button::after {
left: 0; display: none;
width: 100%; }
height: 100%;
background-color: #ffffff61; .subcategory-slider__button:hover {
display: flex; background: #14142b;
align-items: center; border-color: #14142b;
justify-content: center; color: #fff;
} }
.abs-loading{
position: absolute; .subcategory-slider__button.swiper-button-disabled {
top: 0; opacity: 0.32;
left: 0; }
width: 100%;
height: 100%; @media (max-width: 767px) {
z-index: 10; .subcategory-showcase__heading {
background-color: #ffffff61; margin-bottom: 24px;
display: flex; }
align-items: center;
justify-content: center; .subcategory-showcase__heading h1,
} .subcategory-showcase__heading h2 {
.no-anim .abs-loading{ font-size: 31px;
display: none; }
}
.offcanvas .left-menu { .subcategory-card__title {
padding: 0 0 10px 0; font-size: 16px;
list-style: none; }
margin: 0 0 10px 0;
border-bottom: 1px solid #dbdbdb; .subcategory-slider__controls {
} padding-top: 25px;
.offcanvas .left-menu ul{ }
padding: 0; }
list-style: none;
margin: 0; .bg-dominik{
} background-color: var(--color-secondary);
.offcanvas .left-menu>li>a { }
font-weight: bold; .bg-dominik-dark{
font-size: 20px; background-color: var(--color-dark-gray);
} }
.offcanvas .left-menu li {
text-align: right; .bg-center {
} background-position: center;
background-repeat: no-repeat;
.product-page .fav-btn { background-size: cover;
opacity: 1; }
visibility: visible; .position-relative{
top: auto; z-index: 0;
bottom: 4px; }
} .bg-absolute-background {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: -1;
}
.bg-absolute-background img {
z-index: 0;
position: relative;
width: 100%;
height: 100%;
object-fit: cover;
}
section{
overflow-x: hidden;
}
.text-shadow{
text-shadow: -3px 5px 11px #000
}
@media (max-width: 767px){
.section-prems .banner-text {
background-color: var(--color-gray);
color: black !important;
text-shadow: none;
margin-bottom: 1rem;
text-align: center;
}
.section-prems .banner-text p{
margin: 0 auto;
}
.section-prems .bg-dominik-dark{
background-color: transparent;
}
.w-mob-100{
width: 100%;
}
}
.nav-tabs{
border: none;
}
.nav-link {
border: none !important;
text-transform: uppercase;
outline: none;
padding: 0 0 4px 0;
border-bottom: 2px solid #000 !important;
border-radius: 0;
color: black;
opacity: 0.4;
text-wrap: nowrap;
}
.nav-link:hover,.nav-link.active{
opacity: 1;
color: black;
}
.nav-item{
margin-right: 18px;
margin-bottom: 10px;
}
.sw-thumb{
}
.sw-thumb:not(.swiper-slide-thumb-active){
opacity: 0.5;
cursor: pointer;
}
.offcanvas-wrap {
position: fixed;
z-index: 1100;
}
.toast-container{
z-index: 1200;
}
.modal-backdrop {
background-color: var(--color-secondary);
}
.modal-backdrop.show {
opacity: .7;
}
.modal-header {
border-bottom: 0;
}
.form-wrap {
position: relative;
}
.form-wrap label {
background-color: #ffffff;
position: relative;
display: inline-block;
top: 1px;
left: 15px;
}
.form-control {
box-shadow: none !important;
border-radius: 0;
padding: 10px 13px;
}
.form-control:focus{
border-color: #000
}
.fav-btn {
position: absolute;
top: 20px;
right: 20px;
opacity: 0;
visibility: hidden;
}
.product-card:hover .fav-btn{
opacity: 1;
visibility: visible;
}
.fav-btn svg path{
fill: #fff !important;
transition-duration: 0.2s;
}
.fav-btn:hover svg path{
fill: var(--color-secondary) !important;
}
@media (max-width: 767px){
.fav-btn {
opacity: 1;
visibility: visible;
}
}
.abs-loading.abs-loading-fixed {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #ffffff61;
display: flex;
align-items: center;
justify-content: center;
}
.abs-loading{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 10;
background-color: #ffffff61;
display: flex;
align-items: center;
justify-content: center;
}
.no-anim .abs-loading{
display: none;
}
.offcanvas .left-menu {
padding: 0 0 10px 0;
list-style: none;
margin: 0 0 10px 0;
border-bottom: 1px solid #dbdbdb;
}
.offcanvas .left-menu ul{
padding: 0;
list-style: none;
margin: 0;
}
.offcanvas .left-menu>li>a {
font-weight: bold;
font-size: 20px;
}
.offcanvas .left-menu li {
text-align: right;
}
.product-page .fav-btn {
opacity: 1;
visibility: visible;
top: auto;
bottom: 4px;
}
.product-page .fav-btn path { .product-page .fav-btn path {
fill: #000 !important; fill: #000 !important;
} }
@@ -1,68 +1,92 @@
<section class="subcategories py-5" style="-swiper-pagination-color: var(--color-secondary);--swiper-theme-color: var(--color-secondary);"> <section class="subcategories subcategory-showcase py-5">
<div class="container-fluid"> <div class="container-fluid">
<div class="section-heading py-3 text-center"> <div class="subcategory-showcase__heading">
<h3 class="heading">{{ module_name }}</h3> <span class="subcategory-showcase__eyebrow">Каталог салона</span>
</div> <h2>{{ module_name }}</h2>
</div>
<div class="swiper swiper-{{ random }} pb-5">
<div class="swiper-wrapper"> {% block subcategories %}
{% for category in categories %} {% set slider_id = random|default('category-list') %}
<div class="swiper-slide" style="width: auto"> <div id="subcategory-slider-{{ slider_id }}" class="swiper subcategory-slider">
<a href="{{ category.href }}" class="d-block category-item text-center"> <div class="swiper-wrapper">
<img src="{{ category.thumb }}" alt="{{ category.name }}" class="rounded-pill"> {% for category in categories %}
<div class="text-center mt-3">{{ category.name }}</div> <div class="swiper-slide">
</a> <a href="{{ category.href }}" class="subcategory-card">
<span class="subcategory-card__image">
</div> <img src="{{ category.thumb }}" alt="{{ category.name }}" loading="lazy">
{% endfor %} <span class="subcategory-card__number">{% if loop.index < 10 %}0{% endif %}{{ loop.index }}</span>
</span>
<span class="subcategory-card__body">
</div> <span class="subcategory-card__title">{{ category.name }}</span>
<div class="swiper-pagination"></div> <span class="subcategory-card__arrow" aria-hidden="true">
<div class="swiper-button-next d-none d-lg-flex" style="top:33%"></div> <svg width="18" height="12" viewBox="0 0 18 12">
<div class="swiper-button-prev d-none d-lg-flex" style="top:33%"></div> <path d="M0 6h16M11 1l5 5-5 5"></path>
</div> </svg>
</span>
<script> </span>
var swiper = new Swiper(".swiper-{{ random }}", { </a>
loop: true, </div>
spaceBetween: 10, {% endfor %}
// Responsive breakpoints </div>
breakpoints: {
// when window width is >= 320px <div class="subcategory-slider__controls">
320: { <button class="swiper-button-prev subcategory-slider__button" type="button" aria-label="Предыдущие категории">
slidesPerView: 2, <svg width="18" height="12" viewBox="0 0 18 12" aria-hidden="true">
spaceBetween: 50, <path d="M18 6H2m5 5L2 6l5-5"></path>
}, </svg>
// when window width is >= 480px </button>
575: { <div class="swiper-pagination"></div>
slidesPerView: 3, <button class="swiper-button-next subcategory-slider__button" type="button" aria-label="Следующие категории">
spaceBetween: 50, <svg width="18" height="12" viewBox="0 0 18 12" aria-hidden="true">
}, <path d="M0 6h16m-5-5 5 5-5 5"></path>
// when window width is >= 640px </svg>
768: { </button>
slidesPerView: 3, </div>
spaceBetween: 50, </div>
},
992: { <script>
slidesPerView: 4, (function () {
var slider = document.getElementById('subcategory-slider-{{ slider_id }}');
},
1200: { if (!slider || typeof Swiper === 'undefined') {
slidesPerView: 4, return;
}
}
}, new Swiper(slider, {
grabCursor: true,
rewind: true,
pagination: { slidesPerView: 1.35,
el: ".swiper-{{ random }} .swiper-pagination", spaceBetween: 14,
}, watchOverflow: true,
navigation: { breakpoints: {
nextEl: ".swiper-{{ random }} .swiper-button-next", 480: {
prevEl: ".swiper-{{ random }} .swiper-button-prev", slidesPerView: 2.15,
}, spaceBetween: 16
}); },
</script> 768: {
</div> slidesPerView: 3,
</section> spaceBetween: 18
},
992: {
slidesPerView: 4,
spaceBetween: 20
},
1280: {
slidesPerView: 5,
spaceBetween: 22
}
},
pagination: {
el: slider.querySelector('.swiper-pagination'),
clickable: true
},
navigation: {
nextEl: slider.querySelector('.swiper-button-next'),
prevEl: slider.querySelector('.swiper-button-prev')
}
});
})();
</script>
{% endblock %}
</div>
</section>
@@ -1,69 +1,14 @@
{{ header }} {{ header }}
{{ content_top }} {{ content_top }}
<section class="subcategories {% if categories %}py-5{% else %}pt-4{% endif %}" style="-swiper-pagination-color: var(--color-secondary);--swiper-theme-color: var(--color-secondary);"> <section class="subcategories subcategory-showcase subcategory-showcase--catalog {% if categories %}py-5{% else %}pt-4{% endif %}">
<div class="container-fluid"> <div class="container-fluid">
<div class="section-heading py-3 text-center"> <div class="subcategory-showcase__heading">
<h3 class="heading">{{ heading_title }}</h3> <span class="subcategory-showcase__eyebrow">{% if categories %}Выберите направление{% else %}Каталог салона{% endif %}</span>
<h1>{{ heading_title }}</h1>
</div> </div>
{% if categories %} {% if categories %}
<div class="swiper swiper-category-list pb-5 swiper-initialized swiper-horizontal swiper-pointer-events"> {{ block('subcategories', 'dominik/template/extension/module/subcategory.twig') }}
<div class="swiper-wrapper">
{% for category in categories %}
<div class="swiper-slide">
<a href="{{ category.href }}" class="d-block category-item text-center">
<img src="{{ category.thumb }}" alt="Открытые плечи" class="rounded-pill">
<div class="text-center mt-3">{{ category.name }}</div>
</a>
</div>
{% endfor %}
</div>
<div class="swiper-pagination"></div>
<div class="swiper-button-next d-none d-lg-flex" style="top:33%"></div>
<div class="swiper-button-prev d-none d-lg-flex" style="top:33%"></div>
</div>
<script>
var swiper = new Swiper(".swiper-category-list", {
loop: true,
spaceBetween: 10,
// Responsive breakpoints
breakpoints: {
// when window width is >= 320px
320: {
slidesPerView: 2,
spaceBetween: 50,
},
// when window width is >= 480px
575: {
slidesPerView: 3,
spaceBetween: 50,
},
// when window width is >= 640px
768: {
slidesPerView: 3,
spaceBetween: 50,
},
992: {
slidesPerView: 4,
},
1200: {
slidesPerView: 4,
}
},
pagination: {
el: ".swiper-category-list .swiper-pagination",
},
navigation: {
nextEl: ".swiper-category-list .swiper-button-next",
prevEl: ".swiper-category-list .swiper-button-prev",
},
});
</script>
{% endif %} {% endif %}
</div> </div>
</section> </section>