Каталог, карточка товара, корзина, оформление заказа и блог на WooCommerce. Стили разложены по слоям: токены из Figma, база, компоненты, страницы, брейкпоинты. Цвета, типографика, радиусы и отступы взяты из Variables и текстовых стилей макета, ниже по слоям хардкода нет. Иконки — Phosphor, вставляются инлайном как SVG, символами ничего не рисуется. Стили WooCommerce отключены, вёрстка своя, !important не используется.
549 lines
8.8 KiB
CSS
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;
|
|
}
|
|
}
|