49 KiB
Перенос UI-kit в WordPress + Elementor
Документ описывает безопасный перенос дизайн-системы и всех макетов DP Trade UI-kit на WordPress с Elementor. Цель: внедрить дизайн-систему поэтапно, не ломая существующие страницы, Header, Footer и WooCommerce, если он используется.
Документ построен в три слоя:
- Аудит исходников — какие страницы, компоненты и паттерны есть в макете и что из этого дорого/опасно переносить на Elementor.
- Декомпозиция работ — список Elementor-элементов (Global Styles, CSS-слой, глобальные шаблоны, страницы) с оценкой сложности и зависимостями.
- Пошаговый план — 6 этапов с QA и планом отката.
Основной источник дизайна:
index.html,catalog.html,product.html,bottle-cards.html,about.html,contacts.html,contacts-auth.html,news-villa-raiano.html,news-villa-raiano-v2.html,article-guidelines.html,ui-kit.htmlплюсcss/tokens.css,css/site.css,css/ui-kit.css.
1. Базовый принцип
Не заменяйте существующие настройки Elementor сразу. Сначала добавляйте новые токены рядом со старыми, собирайте тестовую страницу, проверяйте визуально, и только потом переводите реальные шаблоны и страницы на новые значения.
Рекомендуемый порядок:
- Backup сайта и базы данных.
- Работа на staging-копии или на новой странице.
- Новые Global Colors с префиксом
DP. - Новые Global Fonts с префиксом
DP. - Тонкий базовый CSS-слой с переменными
--dp-*и утилитарными классамиdp-*. - Базовые компоненты: кнопки, поля, карточки, теги, хедер/футер (draft-копии).
- Страница
UI Kit Previewкак живая витрина. - Проверка desktop / tablet / mobile.
- Поэтапная замена Header, Footer, catalog, product, news, about, contacts.
2. Аудит: что в макете и чего в нём нет
2.1 Карта страниц
| Страница | Что демонстрирует | Шаблон Elementor |
|---|---|---|
index.html |
Hero, mega-menu, блок «Производители», блок «Новости», блок «Рекомендации» | Home Template (Single Page) |
catalog.html |
Toolbar, sort select, list-карточки, sidebar-фильтры | Archive Template (WooCommerce или CPT product) |
product.html |
Галерея + карточка товара, meta-list (4 пары label/value), CTA | Single Product Template |
bottle-cards.html |
Все варианты карточки бутылки (grid, mix, compact, horizontal, по регионам) | Showcase внутри UI Kit Preview |
about.html |
Page hero, 2-col layout (article + feature grid), карточки с номерами | Page Template «About» |
contacts.html |
Page hero, контактная форма, info-panel | Page Template «Contacts» |
contacts-auth.html |
То же с авторизацией/аккаунтом | Page Template «Account» или My Account endpoint |
news-villa-raiano.html, news-villa-raiano-v2.html |
Editorial hero, тело статьи, две редакционные верстки | Single Post Template (2 варианта) |
article-guidelines.html |
Редакционные правила, структурный контент | Single Post / CPT guideline |
ui-kit.html |
Живая витрина с sidebar-навигацией и превью компонентов | Не копировать в production, это витрина для дизайнеров и QA |
2.2 Карта компонентов
Сложность указана относительно «чистого» Elementor без hand-coded HTML виджетов.
| Компонент | Ключевые селекторы | Где встречается | Сложность |
|---|---|---|---|
| Primary / Secondary / Small button | .button, .button--primary, .button--secondary, .button--sm |
везде | Лёгко |
| Input, search bar, catalog sort | .input, .search-bar, .catalog-sort |
header, catalog | Средне |
| Tag / Chip / Status | .tag, .tag--filled, .tag--outline, gold-вариант |
каталог, карточки | Лёгко |
| Primary hero (home) | .hero, .hero-copy, .hero-actions |
index.html |
Сложно |
| Page hero (about / contacts / guidelines / news) | .page-hero, .page-hero--about, .page-hero--contacts, .page-hero--guidelines, .page-hero__inner, .page-hero__meta |
5 страниц | Средне |
| Mega menu | .mega-menu, .menu-grid, .menu-column, .visual-column, .appellations, .appellation-group, .country-link |
header | Сложно |
| Header sticky + blur | .site-header, position: sticky, backdrop-filter: blur(18px) |
все страницы | Средне |
| Producer card | .producer-card |
home | Лёгко |
| News card (3 варианта фоновых изображений) | .news-card, .news-card__image |
home | Лёгко |
| Product card grid | .product-card, .product-media, .product-photo, .product-footer |
home, catalog, product | Средне |
| Product card list | .product-card--list (3 колонки: image / info / actions) |
catalog | Сложно |
| Product card compact list | .product-card--list-compact |
ui-kit | Средне |
| Product card B2B | .product-card--list-b2b, .product-params |
ui-kit | Сложно |
| Bottle card + 5 вариантов | .bottle-card, .bottle-card--tuscany/--mosel/--clean/--compact/--horizontal, .bottle-card__media, .bottle-card__photo |
bottle-cards | Средне |
CSS-бутылка (два ::before/::after) |
.bottle, .bottle::before (пробка), .bottle::after (этикетка) |
ui-kit, catalog showcase | Сложно (требует HTML-виджет) |
| Section heading (split) | .section-heading, .section-heading--split |
все секции | Лёгко |
| Feature card с номером | .feature-card + <span>01..04</span> |
about | Лёгко |
| Info card / contact panel / contact form | .info-card, .contact-panel, .contact-form |
about, contacts | Лёгко |
| Meta list (4 пары label/value) | .meta-list, .meta-list div, .meta-list span |
product | Лёгко |
| Article body (editorial) | .article-body, .article-body .lead, .article-body h2/h3/p/ul |
news, guidelines | Средне |
| Footer | .site-footer, .footer-container, .footer-main, .footer-brand-block, .nav-group, .contacts-card, .social-links |
все страницы | Лёгко |
| Breadcrumbs | отсутствуют в макете | — | нужно добавить отдельно |
| Pagination | отсутствует в макете | — | нужно добавить отдельно |
2.3 Проблемные места для Elementor
Ниже — паттерны, которые нельзя просто перетащить в стандартные виджеты. Каждый пункт требует либо custom CSS-класса, либо HTML-виджета, либо отдельного Elementor-шаблона.
- Mega menu с 4-колоночным асимметричным гридом и мостом-ховером.
css/site.css:242-369. Grid1.05fr 0.82fr 1.25fr 0.88fr, вложенная секция.appellationsна 2 колонки, позиционированиеposition: absolute; transform: translateX(-50%); width: min(var(--container), calc(100vw - 40px)), ховер-мост через::afterвысотой 34px,backdrop-filter: blur(18px). Стандартный Elementor Nav Menu/Mega Menu такое не даёт. Решение: custom HTML виджет + CSS-классыdp-megamenu-*либо Crocoblock JetMenu. - Sticky header с backdrop-filter blur.
.site-header { position: sticky; top: 0; backdrop-filter: blur(18px); background: rgba(248, 250, 252, 0.94); }. В Elementor Pro естьEffects → Sticky, но blur и alpha-фон задаются только CSS. - CSS-бутылка на
::before/::after..bottle { width: 54px; height: 152px; ... }, плюс псевдо-пробка и этикетка. Elementor виджет Image такого не даст — нужен HTML-виджет с фиксированной разметкой<div class="dp-bottle"></div>. - Псевдоэлементы как структурная часть карточек.
.type-card.is-selected::before(бейдж), градиентные fond-блоки.bottle-card__mediaс разными заливками под--tuscany/--mosel/--clean/--compact. Решение: пять CSS-классов-модификаторов, в Elementor подключать через полеCSS Classes. - CSS Grid с асимметричными колонками.
Примеры:
.page-hero__inner(0.72fr / 0.28fr),.article-layout(0.68fr / 0.32fr),.about-grid(0.58fr / 0.42fr),.product-card--list(210px / 1fr / 220px),.footer-main(210px / 1fr / 250px),.meta-list(в product — de-facto 2 колонки). Elementor Container сdisplay: flexсправится только с простыми кейсами. Для сложных — либо Container cCSS display: gridчерез custom CSS, либо принять, что колонки останутся фиксированной ширины через%. - Responsive через
clamp().h1 { font-size: clamp(40px, 5.6vw, 76px) }и подобные. Elementor работает через три брейкпоинта. Решение: в Elementor задавайте отдельные desktop/tablet/mobile значения, либо пропишитеclamp()в Custom CSS дляh1/h2с префиксомdp-. - Кастомный select (
.catalog-sort). Элементу<select>нельзя нормально стилизовать в Elementor. Решение: держать.dp-selectв Custom CSS с учётом нативной стрелки черезbackground-image: url("data:image/svg+xml,..."). - Focus-ring на поля и search bar.
box-shadow: 0 0 0 4px rgba(75, 15, 36, 0.08)— задайте глобально через.dp-form input:focus,.dp-search:focus-within. object-fit: containдля продуктовых фото. Elementor Image выставляетobject-fit: coverпо умолчанию. Нужен.dp-product-photo { object-fit: contain }.- Gradient presets per-variant.
.bottle-card--tuscany,.bottle-card--mosel,.bottle-card--clean,.bottle-card--compact,.product-image--wine,.product-image--gold,.product-image--green. Задайте как набор CSS-классов, не как отдельные шаблоны. - JS-поведение.
В репозитории ссылка на
js/inspector.jsесть вCLAUDE.md, но в рабочих HTML она не подключена; кастомного JS на страницах нет. Однако в production понадобятся: открытие/закрытие mega-menu на click/tap (mobile), закрытие поEsc, фокус-трап, поведение мобильного меню, sort select submit, фильтр каталога. Это не входит в Elementor по умолчанию — предусмотрите отдельную задачу по JS.
2.4 Что отсутствует в макете, но нужно на production
Эти блоки не реализованы в HTML-ките, но без них запуск не собрать. Добавьте их в бэклог:
- Breadcrumbs на catalog / single product / news / guidelines.
- Pagination и «показать ещё» в каталоге.
- Author/byline и дата публикации в новостях.
- 404 page.
- Cookie / privacy banner.
- WooCommerce cart/checkout/account (если магазин включён), минимальная стилизация.
- Сохранённое состояние поиска, пустое состояние каталога.
- Форма обратной связи с валидацией и success-экраном.
- Skeleton / loading state для каталога.
- Accessible labels на иконках хедера.
3. Источники токенов в проекте
| Файл | Что это |
|---|---|
css/tokens.css |
Единый источник значений: цвета, шрифты, spacing, radius, shadows, container |
css/site.css |
Все боевые стили: header, mega-menu, hero, page-hero, карточки, каталог, формы, футер |
css/ui-kit.css |
Стили витрины ui-kit.html (sidebar, swatches, demo), в production не переносить |
В Elementor переносите не CSS целиком, а токены + CSS-классы dp-*. ui-kit.css остаётся как reference.
4. Global Colors (Elementor → Site Settings → Global Colors)
Добавьте новые цвета. Старые Primary/Secondary/Text/Accent не удаляйте, пока не перевяжете все элементы.
| Elementor name | CSS token | Value | Роль |
|---|---|---|---|
| DP Wine 100 | --color-primary-wine-100 |
#4b0f24 |
Основной бренд, primary кнопки, hover меню, линки |
| DP Wine 80 | --color-primary-wine-80 |
#6d1c36 |
Hover primary, вторичный вин |
| DP Black | --color-neutral-black |
#161616 |
Основной текст |
| DP Gray 700 | --color-neutral-gray-700 |
#30343a |
Навигация, плотный secondary text |
| DP Gray 600 | --color-neutral-gray-600 |
#66605f |
Muted text, подписи, описания |
| DP Gray 300 | --color-neutral-gray-300 |
#d9dee6 |
Бордеры, разделители |
| DP Background | --color-background-base |
#f4f6f9 |
Фон страниц |
| DP Surface | --color-surface |
#ffffff |
Карточки, формы, панели |
| DP Gold | --color-accent-gold |
#b9965b |
Eyebrow, статусы, премиум-акцент |
| DP Blue | --color-accent-blue |
#1f3476 |
Logo .brand-logo, .phone-link, инфо-акценты |
| DP Error | --color-error |
#a33a2f |
Ошибки форм |
Также рекомендуются служебные alpha-значения, которые лучше держать в --dp-* переменных, а не как Global Colors (Elementor не умеет alpha-переменные как токены):
--dp-border-soft: rgba(102, 96, 95, 0.12);
--dp-border-med: rgba(102, 96, 95, 0.16);
--dp-border-strong: rgba(102, 96, 95, 0.24);
--dp-wine-border: rgba(75, 15, 36, 0.24);
--dp-wine-hover: rgba(75, 15, 36, 0.06);
--dp-header-bg: rgba(248, 250, 252, 0.94);
--dp-focus-ring: 0 0 0 4px rgba(75, 15, 36, 0.08);
5. Global Fonts
Подключить в Elementor → Site Settings → Global Fonts. Google Fonts в index.html включают: Inter, Montserrat, Playfair Display, Cormorant Garamond, Manrope. В production для Elementor достаточно первых трёх; Cormorant/Manrope — только если будете использовать editorial/neo type cards.
| Elementor style | Font | Weight | Desktop | Line height | Transform |
|---|---|---|---|---|---|
| DP H1 | Montserrat | 800 | 56–72px | 1.0–1.1 | Uppercase |
| DP H2 | Montserrat | 800 | 36–44px | 1.1 | Uppercase |
| DP H3 | Montserrat | 800 | 22–28px | 1.15–1.25 | Uppercase |
| DP Body | Inter | 400 | 16px | 1.5 | None |
| DP Body Large | Inter | 400 | 18–19px | 1.5 | None |
| DP Lead | Inter | 500 | 22px | 1.48 | None |
| DP Caption | Inter | 700–800 | 12–13px | 1.2 | Uppercase |
| DP Button | Inter | 700 | 14–16px | 1.2 | None |
| DP Nav | Inter | 800 | 12px | 1.2 | Uppercase |
| DP Editorial H | Playfair Display | 700 | 36–56px | 1.1 | None |
Responsive:
| Style | Tablet | Mobile |
|---|---|---|
| DP H1 | 40–56px | 34–44px |
| DP H2 | 32–36px | 28–32px |
| DP H3 | 22–24px | 20–22px |
| DP Body | 16px | 16px |
| DP Button | 14–16px | 14px |
clamp() в Elementor Global Fonts не ставьте — используйте отдельные значения по брейкпоинтам. Для нескольких ключевых h1/h2 можно вручную прописать clamp() в Custom CSS под классами dp-hero h1, dp-page-hero h1.
6. Spacing, container, radius, shadows
Spacing
| Token | Value | Где использовать |
|---|---|---|
--dp-space-4 |
4px | Микро-зазоры |
--dp-space-8 |
8px | Gap внутри кнопок |
--dp-space-16 |
16px | Gap grids, карточки |
--dp-space-24 |
24px | Padding карточек, блоков |
--dp-space-32 |
32px | Gap колонок |
--dp-space-48 |
48px | Средние секции |
--dp-space-64 |
64px | Большие секции |
--dp-space-80 |
80px | Hero padding top/bottom desktop |
В макете фактические паддинги секций: desktop 80px top/bottom, mobile 48px. В старом документе был 72 — обновлено.
Layout
| Token | Value | Elementor setting |
|---|---|---|
--dp-container |
1240px | Site Settings → Layout → Content Width |
| Section desktop padding | 80px 40px |
Container padding |
| Section mobile padding | 48px 28px |
Container padding (mobile) |
| Section side gap | 40px desktop / 28px mobile | Container padding X |
Radius
| Token | Value | Где |
|---|---|---|
--dp-radius-sm |
8px | Кнопки, поля, карточки, теги |
--dp-radius-md |
12px | Крупные панели, preview |
--dp-radius-lg |
24px | Акцентные блоки (в текущем макете используется редко — оставляем про запас) |
Shadows
| Token | Value | Где |
|---|---|---|
--dp-shadow-soft |
0 12px 32px rgba(22, 22, 22, 0.08) |
Карточки, формы, footer panel |
--dp-shadow-lift |
0 20px 52px rgba(75, 15, 36, 0.14) |
Hover карточек, mega menu, primary hover |
--dp-shadow-header |
0 10px 28px rgba(22, 22, 22, 0.05) |
Sticky header |
--dp-focus-ring |
0 0 0 4px rgba(75, 15, 36, 0.08) |
Input/search focus |
7. Безопасный CSS-слой (dp-*)
Добавляйте CSS только через классы с префиксом dp-, а не через глобальные body, h1, button, input, a. Это единственный способ не сломать тему и плагины.
Где класть CSS:
- Тестовая страница:
Page Settings → Advanced → Custom CSS. - После проверки:
Elementor → Site Settings → Custom CSS. - Финально (если есть child-тема):
wp-content/themes/<child>/style.cssили отдельный enqueued файл.
Базовый слой:
:root {
--dp-wine-100: #4b0f24;
--dp-wine-80: #6d1c36;
--dp-black: #161616;
--dp-gray-700: #30343a;
--dp-gray-600: #66605f;
--dp-gray-300: #d9dee6;
--dp-bg: #f4f6f9;
--dp-surface: #ffffff;
--dp-gold: #b9965b;
--dp-blue: #1f3476;
--dp-error: #a33a2f;
--dp-border-soft: rgba(102, 96, 95, 0.12);
--dp-border-med: rgba(102, 96, 95, 0.16);
--dp-border-strong: rgba(102, 96, 95, 0.24);
--dp-wine-border: rgba(75, 15, 36, 0.24);
--dp-header-bg: rgba(248, 250, 252, 0.94);
--dp-radius-sm: 8px;
--dp-radius-md: 12px;
--dp-radius-lg: 24px;
--dp-shadow-soft: 0 12px 32px rgba(22, 22, 22, 0.08);
--dp-shadow-lift: 0 20px 52px rgba(75, 15, 36, 0.14);
--dp-shadow-header: 0 10px 28px rgba(22, 22, 22, 0.05);
--dp-focus-ring: 0 0 0 4px rgba(75, 15, 36, 0.08);
}
.dp-section { padding: 80px 0; }
.dp-section--muted { background: #eef2f6; }
.dp-surface {
background: var(--dp-surface);
border: 1px solid var(--dp-border-med);
border-radius: var(--dp-radius-sm);
box-shadow: var(--dp-shadow-soft);
}
.dp-eyebrow {
color: var(--dp-gold);
font-family: Inter, Arial, sans-serif;
font-size: 12px;
line-height: 16px;
font-weight: 800;
letter-spacing: 0;
text-transform: uppercase;
}
.dp-section-heading {
font-family: Montserrat, Inter, Arial, sans-serif;
font-weight: 800;
text-transform: uppercase;
color: var(--dp-black);
}
@media (max-width: 1080px) {
.dp-section { padding: 64px 0; }
}
@media (max-width: 720px) {
.dp-section { padding: 48px 0; }
}
8. Кнопки
Site Settings → Buttons. Базовые параметры:
| Property | Value |
|---|---|
| Min height | 48px |
| Padding | 12px 22px |
| Border radius | 8px |
| Font | Inter, 700 |
| Transition | 0.2s |
Primary states:
| State | Text | Background | Shadow |
|---|---|---|---|
| Default | #ffffff | #4b0f24 |
0 10px 22px rgba(75, 15, 36, 0.16) |
| Hover | #ffffff | #6d1c36 |
0 20px 52px rgba(75, 15, 36, 0.14) |
| Active | #ffffff | #6d1c36 |
inset + translateY(0) |
| Disabled | #ffffff |
rgba(75, 15, 36, 0.4) |
none |
Secondary states:
| State | Text | Background | Border |
|---|---|---|---|
| Default | #4b0f24 |
rgba(255,255,255,0.55) |
rgba(75,15,36,0.24) |
| Hover | #4b0f24 |
rgba(75,15,36,0.06) |
rgba(75,15,36,0.36) |
.dp-btn-primary .elementor-button,
.dp-btn-primary.elementor-button,
a.dp-btn-primary {
min-height: 48px;
padding: 12px 22px;
border-radius: 8px;
background: var(--dp-wine-100);
color: #fff;
font-family: Inter, Arial, sans-serif;
font-weight: 700;
box-shadow: 0 10px 22px rgba(75, 15, 36, 0.16);
transition: transform .2s ease, box-shadow .2s ease, background .2s ease;
}
.dp-btn-primary:hover .elementor-button,
.dp-btn-primary.elementor-button:hover,
a.dp-btn-primary:hover {
background: var(--dp-wine-80);
box-shadow: var(--dp-shadow-lift);
transform: translateY(-1px);
}
.dp-btn-secondary .elementor-button,
a.dp-btn-secondary {
min-height: 48px;
padding: 12px 22px;
border: 1px solid var(--dp-wine-border);
border-radius: 8px;
background: rgba(255, 255, 255, 0.55);
color: var(--dp-wine-100);
font-weight: 700;
}
.dp-btn-sm .elementor-button,
a.dp-btn-sm { min-height: 38px; padding: 8px 14px; font-size: 14px; }
Классы вешать на виджет Button через Advanced → CSS Classes: dp-btn-primary, dp-btn-secondary, dp-btn-sm (комбинируются: dp-btn-primary dp-btn-sm).
9. Формы, поля, search
Site Settings → Form Fields:
| Property | Value |
|---|---|
| Background | #ffffff |
| Text | #161616 |
| Placeholder | #66605f |
| Border | 1px solid rgba(102, 96, 95, 0.24) |
| Border radius | 8px |
| Padding | 12–14px |
| Focus border | #4b0f24 |
| Focus shadow | 0 0 0 4px rgba(75, 15, 36, 0.08) |
| Error color | #a33a2f |
.dp-form .elementor-field {
border: 1px solid var(--dp-border-strong);
border-radius: 8px;
background: #fff;
color: var(--dp-black);
font-family: Inter, Arial, sans-serif;
font-size: 14px;
padding: 12px 14px;
}
.dp-form .elementor-field:focus {
border-color: var(--dp-wine-100);
box-shadow: var(--dp-focus-ring);
outline: none;
}
.dp-form .elementor-field-label {
color: var(--dp-gray-700);
font-size: 13px;
font-weight: 700;
}
.dp-form .elementor-message-danger { color: var(--dp-error); }
.dp-select {
appearance: none;
padding: 7px 36px 7px 12px;
min-height: 40px;
border: 1px solid var(--dp-border-strong);
border-radius: 8px;
background: #fff url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path fill='none' stroke='%2330343a' stroke-width='1.5' d='M1 1l5 5 5-5'/></svg>") no-repeat right 14px center;
font-family: Inter, Arial, sans-serif;
font-weight: 600;
}
.dp-search {
display: grid;
grid-template-columns: 44px minmax(0, 1fr);
border: 1px solid var(--dp-border-strong);
border-radius: 8px;
background: #fff;
overflow: hidden;
transition: border-color .2s, box-shadow .2s;
}
.dp-search:focus-within {
border-color: var(--dp-wine-100);
box-shadow: var(--dp-focus-ring);
}
Обязательные состояния для QA: default, hover, focus, filled, disabled, error, required, textarea, submit loading, success screen, mobile keyboard.
10. Карточки
10.1 Базовая карточка
.dp-card {
min-width: 0;
border: 1px solid var(--dp-border-med);
border-radius: var(--dp-radius-sm);
background: #fff;
box-shadow: var(--dp-shadow-soft);
overflow: hidden;
transition: transform .2s ease, box-shadow .2s ease;
}
.dp-card:hover { transform: translateY(-3px); box-shadow: var(--dp-shadow-lift); }
.dp-card-title {
color: var(--dp-black);
font-family: Montserrat, Inter, Arial, sans-serif;
font-size: 24px;
line-height: 1.15;
font-weight: 800;
text-transform: uppercase;
}
.dp-card-text { color: var(--dp-gray-600); font-size: 14px; line-height: 1.45; }
10.2 Product card (grid)
В Elementor построить как Container:
.dp-product-card (Container, display=flex vertical)
.dp-product-media → Image widget c .dp-product-photo
.dp-product-footer → 2 колонки: title + price + small button
CSS:
.dp-product-photo { object-fit: contain; object-position: center; max-height: 200px; }
.dp-product-price { color: var(--dp-wine-100); font-size: 18px; font-weight: 800; }
10.3 Product card (list, catalog)
3 колонки на desktop, 1 на mobile:
.dp-product-list {
display: grid;
grid-template-columns: 210px minmax(0, 1fr) 220px;
gap: 24px;
align-items: center;
padding: 20px;
}
@media (max-width: 1080px) { .dp-product-list { grid-template-columns: 160px 1fr; } .dp-product-list__actions { grid-column: 1 / -1; } }
@media (max-width: 720px) { .dp-product-list { grid-template-columns: 1fr; } }
В Elementor собрать как Container с display: grid через Custom CSS, либо как Inner Section с фиксированными ширинами колонок (проще, но менее адаптивно).
10.4 Bottle card + варианты
.dp-bottle-card { /* extends .dp-card */ }
.dp-bottle-card__media { padding: 32px 0; display: grid; place-items: center; }
.dp-bottle-card__photo { object-fit: contain; }
.dp-bottle-card--tuscany .dp-bottle-card__media { background: linear-gradient(135deg, #b16d2c 0%, #c8ad94 52%, #dfe5eb 100%); }
.dp-bottle-card--mosel .dp-bottle-card__media { background: linear-gradient(135deg, #214f3d 0%, #8aa38e 48%, #e8ebdc 100%); }
.dp-bottle-card--wine .dp-bottle-card__media { background: linear-gradient(135deg, #6d1c36 0%, #9b5366 46%, #e6dce1 100%); }
.dp-bottle-card--gold .dp-bottle-card__media { background: linear-gradient(135deg, #b9965b 0%, #d7c18b 48%, #eef2f6 100%); }
.dp-bottle-card--clean .dp-bottle-card__media { background: linear-gradient(135deg, #edf1f5 0%, #d7dee7 100%); }
.dp-bottle-card--compact { /* scale-down variant */ }
.dp-bottle-card--horizontal { display: grid; grid-template-columns: 180px 1fr; }
Варианты подключаются комбинацией классов: dp-bottle-card dp-bottle-card--tuscany.
10.5 Feature card с номером (about)
<article class="dp-feature-card">
<span class="dp-feature-card__num">01</span>
<h3>Удобный каталог</h3>
<p>Фильтры по типу, региону, производителю…</p>
</article>
.dp-feature-card { padding: 22px; min-height: 210px; display: grid; align-content: space-between; }
.dp-feature-card__num { color: var(--dp-gold); font-size: 12px; font-weight: 800; text-transform: uppercase; }
.dp-feature-card h3 { margin: 18px 0 8px; font-family: Montserrat; font-weight: 800; font-size: 22px; text-transform: uppercase; }
10.6 Info card / contact panel / contact form
Все три на одном surface-шаблоне (.dp-surface) + padding 24px. В Elementor: один Container-пресет, меняется только внутренний контент.
10.7 Meta list (product detail)
<dl class="dp-meta-list">
<div><span>Regione</span><strong>Toscana</strong></div>
<div><span>Annata</span><strong>2020</strong></div>
…
</dl>
.dp-meta-list { display: grid; gap: 12px; margin: 28px 0; }
.dp-meta-list div { display: flex; justify-content: space-between; gap: 18px; padding-bottom: 12px; border-bottom: 1px solid var(--dp-border-med); }
.dp-meta-list span { color: var(--dp-gray-600); }
11. Теги / chips / статусы
.dp-tag, .dp-chip {
display: inline-flex; align-items: center;
min-height: 30px; padding: 6px 10px;
border-radius: 8px;
font: 800 12px/1 Inter, sans-serif;
text-transform: uppercase;
}
.dp-tag--filled, .dp-chip--active { background: var(--dp-wine-100); color: #fff; }
.dp-tag--outline { border: 1px solid var(--dp-wine-border); color: var(--dp-wine-100); background: transparent; }
.dp-tag--gold { background: rgba(185, 150, 91, 0.18); color: #7c5f26; }
В Elementor: Heading widget с HTML tag = span, Button widget без ссылки, либо Text Editor.
12. Hero, page hero, editorial hero
12.1 .dp-hero (home)
.dp-hero {
min-height: 100vh;
padding: 80px 0;
color: #f8fafc;
background:
linear-gradient(100deg, rgba(22, 20, 17, 0.84) 0%, rgba(22, 20, 17, 0.58) 38%, rgba(22, 20, 17, 0.12) 72%),
url("/wp-content/uploads/hero.jpg") center / cover;
}
.dp-hero h1 { font-size: clamp(40px, 5.6vw, 76px); line-height: 1; text-transform: uppercase; font-weight: 800; }
@media (max-width: 720px) { .dp-hero { min-height: 620px; } }
12.2 .dp-page-hero с модификаторами
Четыре варианта фонового изображения (--about, --contacts, --guidelines, --news). Задаются модификаторами через CSS Classes на Elementor секции + background image в Style панели, либо через CSS url-ы.
.dp-page-hero { padding: 78px 0; color: #f8fafc; background-size: cover; background-position: center; }
.dp-page-hero__inner { display: grid; grid-template-columns: minmax(0, 0.72fr) minmax(280px, 0.28fr); gap: 36px; align-items: end; }
.dp-page-hero h1 { font-size: clamp(40px, 5.6vw, 76px); line-height: 0.98; text-transform: uppercase; font-weight: 800; }
.dp-page-hero__meta { padding: 22px; background: #fff; color: var(--dp-black); border-radius: var(--dp-radius-sm); box-shadow: var(--dp-shadow-soft); }
В .dp-page-hero накладывать linear-gradient поверх фонового изображения через background shorthand (Elementor → Style → Background overlay → Gradient).
13. Header
Исходник: css/site.css:47–369, components/menu.html.
Правила переноса:
- Не меняйте текущий Header template сразу.
- Дублируйте →
Header DP UI Kit Draft. - Примените классы и стили на копии.
- После проверки назначьте через
Theme Builder → Header → Display Conditions.
Sticky + blur + border:
.dp-header {
position: sticky; top: 0; z-index: 40;
background: var(--dp-header-bg);
border-bottom: 1px solid rgba(102, 96, 95, 0.18);
box-shadow: var(--dp-shadow-header);
backdrop-filter: blur(18px);
-webkit-backdrop-filter: blur(18px);
}
.dp-nav a,
.dp-nav .elementor-item {
color: var(--dp-gray-700);
font: 800 12px/1.2 Inter, sans-serif;
text-transform: uppercase;
}
.dp-nav a:hover,
.dp-nav .elementor-item:hover,
.dp-nav .elementor-item-active { color: var(--dp-wine-100); }
Mega menu
Стандартный Elementor Nav Menu не даёт асимметричный 4-колоночный grid. Варианты:
- Вариант A (рекомендуется): кастомный HTML-виджет с готовой разметкой
components/menu.html+ CSS-классыdp-mega-menu,dp-mega-menu__grid. Открытие/закрытие — минимальный JS (50 строк) либо CSS-only через:focus-within. - Вариант B: плагин JetMenu / Max Mega Menu. Даёт drag-and-drop контент в колонках, но потребует доработки CSS, чтобы колонки были
1.05fr 0.82fr 1.25fr 0.88fr. - Вариант C: простой dropdown Elementor Pro без 4-колонок (запасной путь).
CSS-контур:
.dp-mega-menu {
position: absolute;
left: 50%;
transform: translateX(-50%);
width: min(1240px, calc(100vw - 40px));
padding: 28px;
background: #fff;
border-radius: var(--dp-radius-md);
box-shadow: var(--dp-shadow-lift);
}
.dp-mega-menu__grid {
display: grid;
grid-template-columns: 1.05fr 0.82fr 1.25fr 0.88fr;
gap: 24px;
}
.dp-mega-menu__appellations {
grid-column: 1 / -1;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px 24px;
}
@media (max-width: 1080px) { .dp-mega-menu__grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 720px) { .dp-mega-menu__grid { grid-template-columns: 1fr; } }
JS-требования: hover desktop с задержкой 150ms, click/tap mobile, Esc закрывает, focus-trap внутри открытого меню, aria-expanded, role="menu".
Header icons
Inline SVG с stroke: currentColor; stroke-width: 1.45. Задать через Icon widget (SVG upload) либо HTML-виджет. Класс .dp-header-icon + .dp-header-icon--air для варианта без бордера.
14. Footer
Исходник: css/site.css:2042–…, components/footer.html.
Структура (desktop): 210px / 1fr / 250px — brand block, nav 3 группы, контакты + соцсети. Карточная панель на белом surface.
.dp-footer { padding: 32px 0 40px; border-top: 1px solid rgba(102, 96, 95, 0.12); background: var(--dp-bg); }
.dp-footer__container {
padding: 24px 28px 20px;
border: 1px solid var(--dp-border-med);
border-radius: var(--dp-radius-sm);
background: #fff;
box-shadow: var(--dp-shadow-soft);
}
.dp-footer__main {
display: grid;
grid-template-columns: minmax(170px, 210px) minmax(0, 1fr) minmax(210px, 250px);
gap: 24px 32px;
align-items: start;
}
@media (max-width: 1080px) { .dp-footer__main { grid-template-columns: 1fr 1fr; } }
@media (max-width: 720px) { .dp-footer__main { grid-template-columns: 1fr; } }
Порядок: дублировать текущий Footer template → назвать Footer DP UI Kit Draft → применить классы → проверить → назначить.
15. Каталог и single product
Catalog (archive)
Переносите поэтапно — не все блоки сразу:
- Визуальный стиль карточки (
.dp-product-card,.dp-product-list). - Toolbar + sort (
.dp-catalog-toolbar,.dp-select). - Filters / chips (
.dp-chip+.dp-chip--active). - List / compact / b2b варианты.
- Hover lift + skeleton / empty state.
- Breadcrumbs (новый компонент, в макете нет).
- Pagination (новый компонент, в макете нет).
Минимальный набор классов:
dp-catalog
dp-catalog-toolbar
dp-select
dp-product-card
dp-product-list
dp-product-price
dp-card-title
dp-card-text
dp-tag dp-tag--filled dp-tag--outline
dp-btn-primary dp-btn-sm
dp-chip dp-chip--active
Single product
.dp-product-hero— 2 колонки (image + info)..dp-product-photoсobject-fit: contain..dp-meta-list— свойства 4 пары label/value.- CTA —
.dp-btn-primary+.dp-btn-secondaryside-by-side. - Breadcrumbs сверху.
- Блок «похожие товары» — переиспользуем
.dp-product-card.
16. Новости, about, contacts, guidelines
News single (2 верстки)
В репозитории две версии: news-villa-raiano.html и -v2.html. Решите, какая идёт в production, вторую оставьте как черновик.
- Editorial hero (
.dp-page-hero+--news). .dp-article-layout { grid-template-columns: 0.68fr 0.32fr }— статья + sidebar с meta..dp-article-body— типографика:.lead22px/1.48,h2/h3, параграфы 18px/1.55.- Author/byline / дата — добавить новым компонентом (в макете нет).
About
.dp-page-hero dp-page-hero--about..dp-about-grid { grid-template-columns: 0.58fr 0.42fr }.- 4
.dp-feature-cardс числовым значком<span>01</span>….
Contacts / Contacts-auth
.dp-page-hero dp-page-hero--contacts..dp-contacts-layout { grid-template-columns: 0.68fr 0.32fr }..dp-contact-form+.dp-contact-panel.contacts-auth.html— выяснить, это залогиненный стейт или отдельная страница «регистрации». От этого зависит, WooCommerce My Account endpoint или кастомная страница.
Article guidelines
- Тот же
.dp-page-hero+--guidelines. .dp-article-bodyс расширенным набором блоков (tables, ul, code).
17. Страница UI Kit Preview
Создайте страницу /ui-kit-preview/. Разместите:
- Color swatches (DP Wine 100/80, Gray 700/600/300, Gold, Blue, Background, Surface, Error).
- Типографика: H1, H2, H3, body, lead, caption, editorial H.
- Кнопки: primary, secondary, small, disabled, hover, focus.
- Формы: input default/focus/error/disabled, select, search bar, textarea.
- Product card (grid + list + compact + b2b).
- Bottle card — все 5 вариантов.
- Feature card (01–04).
- Info card / contact panel / contact form.
- Meta list.
- Tags, chips (filled/outline/gold).
- Section heading, section heading split.
- Eyebrow.
- Page hero превью.
- Header + mega-menu превью (или ссылка на staging).
- Footer превью.
- Breadcrumbs (новый компонент).
- Pagination (новый компонент).
Эта страница — контрольная витрина. Любое изменение токенов проверяется на ней первым.
18. Декомпозиция работ
Формат: элемент → что делать в Elementor → оценка (S/M/L) → зависимости.
A. Global settings (~1 день)
- Global Colors DP palette — S — нет.
- Global Fonts DP — S — нет.
- Container width + default padding — S — нет.
- Form Fields Site Settings — S — нет.
- Buttons Site Settings — S — нет.
B. Custom CSS layer (~1 день)
:rootпеременные--dp-*— S — A..dp-*утилиты (section, surface, eyebrow, heading) — S — 6.- Responsive overrides (1080/720px) — S — 7.
C. Atom-компоненты (~2 дня)
.dp-btn-*(primary/secondary/sm + states) — S..dp-form-*(input/select/search/textarea + states) — M..dp-tag/.dp-chipвсе варианты — S..dp-card,.dp-surface— S.
D. Molecule-компоненты (~3 дня)
.dp-product-card(grid) — M..dp-product-list(catalog list + compact + b2b) — L (требует grid в Container)..dp-bottle-card+ 5 модификаторов — M..dp-feature-card+ номер — S..dp-meta-list— S..dp-info-card,.dp-contact-panel,.dp-contact-form— M..dp-section-heading,.dp-section-heading--split— S.
E. Organisms (~3 дня)
.dp-hero(home) — M..dp-page-hero+ 4 модификатора — M..dp-article-bodyeditorial типографика — M..dp-footer(копия существующего) — M..dp-headersticky + blur (копия) — M.- Mega menu (кастомный HTML + CSS + минимальный JS) — L — критический путь.
F. Page templates (~3 дня)
- Home Template — M — B, C, D, E.
- Single Product Template — M — D.
- Catalog Archive Template — L (требует WooCommerce или CPT) — D.
- Single News Post Template — M — D, E.
- About Page Template — S — D, E.
- Contacts Page Template — S — D, E.
- Article Guidelines Template — S — D, E.
- UI Kit Preview — M — C, D, E.
G. Пробелы макета (~2 дня)
- Breadcrumbs компонент — S.
- Pagination компонент — S.
- 404 page — S.
- Cookie/privacy banner — S.
- Author/byline на news — S.
- Empty/loading states каталога — M.
H. QA и публикация (~2 дня)
- QA по чеклисту §19.
- Rollback-план §20.
- Regenerate CSS & Data, очистка кэшей.
- Production выкатка.
Суммарно ориентировочно 15–17 рабочих дней одним разработчиком при наличии готового Elementor Pro и chosen mega-menu strategy.
19. План по этапам (6 фаз)
Фаза 1. Foundation (1–2 дня).
Backup, staging, Global Colors/Fonts/Layout, Custom CSS layer (:root + .dp-* утилиты). QA: на тестовой странице видны цвета, шрифты, общие классы.
Фаза 2. Atom + molecule (3–4 дня).
Кнопки, формы, теги, .dp-card, .dp-meta-list, .dp-feature-card, .dp-info-card. QA: страница UI Kit Preview собрана на 70%.
Фаза 3. Organisms draft (3–4 дня).
Header DP UI Kit Draft, Footer DP UI Kit Draft, mega menu (HTML-виджет), .dp-hero, .dp-page-hero. Не назначать на production до фазы 6. QA: превью всех хедеров/футеров на staging.
Фаза 4. Pages (3–4 дня). Home, About, Contacts, Contacts-auth, Article Guidelines, News Single (2 варианта), UI Kit Preview. Catalog и Single Product — отдельно, после Woo-конфигурации. QA: кликабельный staging-сайт.
Фаза 5. Catalog / Commerce (2–3 дня).
Archive, Single Product, filters, pagination, breadcrumbs, empty state. Привязка к WooCommerce или кастомному CPT product. QA: добавление товара, фильтрация, отправка CTA.
Фаза 6. Switchover (1 день). Назначение Header/Footer, выключение старых шаблонов, Regenerate CSS & Data, CDN cache purge, incognito-проверка, смоук-тест всех страниц.
20. Что делать нельзя
Не добавляйте глобально такие правила:
* { margin: 0; padding: 0; }
button { all: unset; }
a { color: inherit; text-decoration: none; }
h1, h2, h3 { margin: 0; }
input, select, textarea { all: unset; }
Они ломают тему, плагины, WooCommerce, формы, меню и старые страницы.
Также не стоит:
- удалять старые Elementor Global Colors;
- массово заменять цвета по всему сайту;
- менять breakpoints без полного responsive QA;
- вставлять весь
site.cssв Elementor; - переносить
ui-kit.cssи sidebar UI-kit витрины; - менять Header/Footer на production без дубликата;
- переносить
ui-kit.htmlкак production-страницу; - ставить
position: fixedна header вместоsticky(ломает Elementor Pro Sticky effects).
21. QA checklist перед публикацией
Страницы:
- Home (hero, producers, news, recommendations).
- Catalog (toolbar, list, hover, sort, filters, breadcrumbs, pagination).
- Single Product (meta-list, CTA, related).
- About.
- Contacts + contacts-auth.
- News single (обе верстки).
- Article guidelines.
-
- WooCommerce cart/checkout/account (если используется).
- UI Kit Preview.
Для каждого экрана:
- нет горизонтального скролла;
- текст не обрезается;
- кнопки не ломаются;
- hover/focus видны;
- карточки не прыгают по высоте;
- картинки не растягиваются;
- меню открывается/закрывается клавиатурой;
- mega menu закрывается по
Esc; - формы отправляются;
- ошибки форм читаемы;
- контраст AA ≥ 4.5;
- sticky header работает на iOS Safari;
backdrop-filterимеет fallback (solid bg) для старых браузеров;- lighthouse performance ≥ 80, accessibility ≥ 95.
Устройства:
- Chrome desktop.
- Safari desktop (macOS).
- Firefox desktop.
- iPhone Safari (iOS 17+).
- Android Chrome.
- Таблет 1024px.
22. Публикация
- Свежий backup production.
- Экспорт текущих Elementor templates и Site Settings.
- Перенос Global Colors / Fonts.
- Вставка проверенного CSS-слоя.
- Импорт / обновление шаблонов.
- Назначение Header / Footer draft → main.
Elementor → Tools → Regenerate CSS & Data.- Очистка кэша плагина оптимизации (WP Rocket / W3TC / LiteSpeed).
- Очистка server/CDN кэша.
- Проверка в incognito на desktop и mobile.
- Смоук-тест: home, catalog, product, contacts form, 1 новость.
23. План отката
Перед публикацией должны быть готовы:
- backup production;
- экспорт старых Elementor templates;
- список изменённых Global Colors / Fonts;
- копия добавленного Custom CSS;
- скриншоты ключевых страниц до переноса;
- список условий отображения Header / Footer до изменения.
Если что-то сломалось:
- Отключить новый Custom CSS в Site Settings.
- Вернуть старый Header/Footer template (Theme Builder → Conditions).
Regenerate CSS & Data.- Очистить кэш.
- Если проблема осталась — восстановить backup.
24. Минимальный скоуп первого релиза
Если нужно быстро показать «новое лицо» без полной миграции:
- Global Colors DP.
- Global Fonts DP H1/H2/H3/Body/Button.
:root+.dp-*CSS-слой..dp-btn-primary,.dp-btn-secondary,.dp-btn-sm..dp-card,.dp-form,.dp-tag,.dp-eyebrow.Header DP UI Kit Draftна одной staging-странице.Footer DP UI Kit Draftтам же.- Страница
UI Kit Preview.
Этого достаточно для валидации дизайн-системы. Catalog, single product, news — следующий релиз.
Приложение A. Маппинг исходников → разделы документа
| Исходник | Линии | Раздел |
|---|---|---|
css/tokens.css |
1–35 | §4, §5, §6 |
css/site.css |
47–55 (header sticky) | §13 |
css/site.css |
242–369 (mega menu) | §13 |
css/site.css |
279–288 (eyebrow) | §7 |
css/site.css |
428–461 (hero) | §12.1 |
css/site.css |
870–897 (bottle pseudo) | §2.3 #3, §10.4 |
css/site.css |
976–1001 (product list) | §10.3 |
css/site.css |
1104–1253 (bottle cards + variants) | §10.4 |
css/site.css |
1385–1477 (page hero) | §12.2 |
css/site.css |
1580–1600 (feature card) | §10.5 |
css/site.css |
2024–2040 (meta list) | §10.7 |
css/site.css |
2042–2100 (footer) | §14 |
css/site.css |
2227–2500 (media queries) | §7, все compo |
components/menu.html |
весь | §13 (mega menu HTML) |
components/footer.html |
весь | §14 |