Files
f1den 29d10ce4cf Тема магазина по макету Figma
Каталог, карточка товара, корзина, оформление заказа и блог на WooCommerce.

Стили разложены по слоям: токены из Figma, база, компоненты, страницы,
брейкпоинты. Цвета, типографика, радиусы и отступы взяты из Variables и
текстовых стилей макета, ниже по слоям хардкода нет.

Иконки — Phosphor, вставляются инлайном как SVG, символами ничего не рисуется.
Стили WooCommerce отключены, вёрстка своя, !important не используется.
2026-07-30 22:38:49 +03:00

549 lines
8.8 KiB
CSS

/*
* Breakpoints. Must stay after every layer it overrides
*/
/* Responsive */
@media (max-width: 1439px) {
.container {
width: min(calc(100% - 48px), 1200px);
}
.product-grid {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.category-card {
grid-template-columns: minmax(0, 1fr) 40%;
}
.archive-shell {
grid-template-columns: 250px minmax(0, 1fr);
gap: 32px;
}
.archive-results .product-grid {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.product-layout {
grid-template-columns: minmax(0, 1.43fr) minmax(440px, 1fr);
}
}
@media (max-width: 1023px) {
.home .site-header {
height: 120px;
}
.hero-copy,
.hero h1 {
width: 100%;
max-width: 100%;
}
.hero h1 {
white-space: normal;
}
.header-inner {
gap: 16px;
}
.menu-toggle {
display: grid;
margin-left: auto;
}
.main-nav {
position: fixed;
z-index: 50;
inset: 88px 0 0;
display: none;
margin: 0;
padding: 30px 24px;
background: var(--bg-main);
}
.menu-open .main-nav {
display: block;
}
.main-nav ul {
align-items: stretch;
flex-direction: column;
gap: 0;
}
.main-nav a {
padding: 15px 0;
border-bottom: 1px solid var(--border-main);
font: var(--lead);
}
.product-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.category-grid,
.news-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.archive-shell,
.product-layout,
.cart-layout,
.checkout-layout {
grid-template-columns: 1fr;
}
.cart-order-card {
width: 100%;
}
.filters {
padding: 20px;
border-radius: 12px;
background: var(--bg-secondary);
}
.archive-results .product-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.product-gallery {
height: min(70vw, 580px);
}
.product-summary {
min-height: 0;
}
.footer-bottom {
grid-template-columns: 1fr auto;
}
.footer-bottom > span:nth-child(2) {
order: 3;
grid-column: 1 / -1;
}
}
@media (max-width: 639px) {
.home .site-header {
height: 72px;
}
.container {
width: calc(100% - 32px);
}
.header-inner {
height: 72px;
}
.main-nav {
inset: 72px 0 0;
}
.cart-link {
width: 48px;
height: 48px;
}
.shop-toast-stack,
.home .shop-toast-stack {
top: 88px;
right: 16px;
width: calc(100vw - 32px);
}
.section {
padding: 48px 0;
}
.hero {
height: auto;
min-height: 0;
padding: 44px 0 48px;
}
.hero-title-group > p,
.hero-features {
width: 100%;
max-width: 100%;
}
.hero-features {
grid-template-columns: 1fr;
gap: 14px;
}
.products-section {
height: auto;
overflow: visible;
}
.product-grid,
.category-grid,
.news-grid,
.archive-results .product-grid {
grid-template-columns: 1fr;
}
.category-card {
height: 230px;
grid-template-columns: minmax(0, 1fr) 38%;
}
.news-card {
height: 360px;
}
.pagination .nav-links,
.woocommerce nav.woocommerce-pagination ul {
flex-wrap: wrap;
}
.pagination .page-numbers,
.woocommerce nav.woocommerce-pagination ul li a,
.woocommerce nav.woocommerce-pagination ul li span {
width: 40px;
height: 40px;
}
.slider-controls {
display: none;
}
/* The design keeps the filter button and the sort control on one row; the
sort label stacks above its value so the pair fits at 360px. */
.archive-toolbar {
align-items: center;
flex-direction: row;
flex-wrap: nowrap;
gap: 12px;
}
.archive-toolbar .sort-control {
display: flex;
min-width: 0;
margin-left: auto;
align-items: flex-end;
flex-direction: column;
gap: 0;
text-align: right;
}
.archive-toolbar .sort-control > span {
font: var(--caption);
}
/* The mobile layout does not expose the per-page control. */
.archive-toolbar .per-page-control {
display: none;
}
.product-gallery {
height: 400px;
}
.product-summary {
padding: 22px;
}
.product-summary form.cart {
grid-template-columns: 120px minmax(0, 1fr);
}
.tab-list {
overflow-x: auto;
}
.tab-list a {
white-space: nowrap;
}
.article-media,
.article-media-wide {
height: 62vw;
}
.article-lead {
margin-bottom: 32px;
}
.cart-table thead {
display: none;
}
.cart-table tr,
.cart-table td {
display: block;
}
.cart-table tr {
padding: 16px 0;
border-bottom: 1px solid var(--border-main);
}
.cart-table td {
padding: 7px 0;
border: 0;
}
.cart-page {
width: 100%;
height: 622px;
padding: 8px 16px 32px;
}
.checkout-fields {
width: 100%;
}
.checkout-page {
width: 100%;
min-height: 1278px;
padding: 8px 16px 32px;
}
.checkout-page .page-heading {
margin-bottom: 14px;
}
.checkout-layout {
gap: 32px;
}
.checkout-input,
.checkout-map {
width: 100%;
}
.checkout-input,
.checkout-input input {
height: 64px;
}
.checkout-delivery,
.checkout-payment-options {
margin-top: 24px;
}
.checkout-delivery legend,
.checkout-payment-options legend {
margin-bottom: 8px;
}
.delivery-switch {
height: 48px;
margin-bottom: 16px;
}
.delivery-switch span {
height: 40px;
}
.checkout-radio {
min-height: 24px;
}
.checkout-map {
height: auto;
margin-top: 16px;
aspect-ratio: 1.44;
}
.checkout-payment-options {
margin-top: 24px;
}
.checkout-order-card {
width: 100%;
min-height: 408px;
height: 408px;
padding: 16px;
}
.site-footer {
height: auto;
min-height: 210px;
}
.footer-bottom {
grid-template-columns: 1fr;
}
.footer-bottom > span:nth-child(2) {
grid-column: auto;
flex-direction: column;
gap: 10px;
}
}
@media (max-width: 767px) {
/* The mobile frame shows the same row, edge to edge and without the
desktop next button — a touch drag does that job. */
.subcategories {
margin-inline: calc(var(--container-gutter) * -1);
padding-inline: var(--container-gutter);
}
.subcategory-next {
display: none;
}
.subcategory-card {
width: 200px;
}
.quick-filters {
flex-wrap: nowrap;
margin-inline: calc(var(--container-gutter) * -1);
padding-inline: var(--container-gutter);
overflow-x: auto;
scrollbar-width: none;
}
.quick-filters::-webkit-scrollbar {
height: 0;
}
.quick-filter {
flex: 0 0 auto;
}
}
/*
* The cart row needs about 550px before its columns start colliding, and the
* summary beside it is a fixed 432px. Below the width where both fit, they
* stack — otherwise the summary ends up sitting on top of the items.
*/
@media (max-width: 1199px) {
.cart-layout,
.checkout-layout {
grid-template-columns: minmax(0, 1fr);
}
.cart-order-card {
width: 100%;
}
/* Once the summary drops below the fields the checkout is one column, so
centre it rather than leaving both blocks pinned to the left edge. */
.checkout-layout .checkout-fields,
.checkout-layout .checkout-order-card {
width: 432px;
max-width: 100%;
margin-inline: auto;
}
}
/*
* The cart row needs about 550px before its columns collide. Below that it
* takes the stacked shape from the mobile frame — thumbnail top left, copy
* beside it, price and controls on the bottom row.
*/
@media (max-width: 767px) {
.cart-page .page-heading {
margin-bottom: 8px;
}
.cart-layout {
display: flex;
flex-direction: column;
gap: 16px;
}
.cart-items {
width: 100%;
gap: 8px;
}
.cart-item {
position: relative;
display: block;
width: 100%;
min-height: 150px;
height: 150px;
padding: 12px;
}
.cart-thumb {
position: absolute;
top: 12px;
left: 12px;
width: 88px;
height: 70px;
}
.cart-thumb .product-badge {
display: none;
}
.cart-item-copy {
position: absolute;
top: 16px;
right: 12px;
left: 112px;
}
.cart-item-price {
position: absolute;
bottom: 16px;
left: 12px;
text-align: left;
}
.cart-item-quantity {
position: absolute;
right: 64px;
bottom: 16px;
width: 104px;
height: 44px;
}
.cart-item-remove {
position: absolute;
right: 12px;
bottom: 16px;
width: 44px;
height: 44px;
}
.cart-order-card {
width: 100%;
min-height: 212px;
height: 212px;
padding: 16px;
}
.cart-order-card .order-row {
min-height: 28px;
padding: 2px 0;
}
.cart-order-card .order-row.total {
min-height: 36px;
margin: 0;
padding-top: 4px;
}
.cart-order-card .button {
height: 56px;
margin-top: 12px;
}
}
@media (max-width: 767px) {
.checkout-input input {
padding: 25px 20px 15px;
}
.checkout-input input:focus + .field-label,
.checkout-input input:not(:placeholder-shown) + .field-label {
top: 10px;
}
}