Вы написали HTML-форму, а она выглядит как в 90-х? Поля разной высоты, кнопки не выровнены, чекбоксы непонятно где, а на мобильном всё разваливается? Обычно приходится писать кучу CSS, подбирать отступы, делать адаптивность...
А что если просто добавить несколько готовых классов — и форма сразу выглядит современно, работает на всех устройствах, с правильными отступами, иконками и анимациями?
В Wepps Platform есть готовая система CSS-классов для форм — как конструктор Lego. Вы берёте блоки (классы), собираете форму, и она сразу красивая. Давайте разберёмся, как это работает.
Конструктор форм: как это понять
Представьте, что форма — это дом из кубиков Lego. У вас есть:
-
w_form— это фундамент дома. Класс контейнера, который говорит: "Здесь будет форма со всеми правилами оформления". -
fieldset— это комнаты в доме. Группируют связанные поля (например, "Личные данные", "Адрес доставки"). Каждая комната имеет фон и отступы. -
section— это мебель в комнате. Одна секция = одно поле с подписью. Структурирует поля внутри группы. -
label.w_label— это упаковка для каждого элемента формы. Обёртка, которая делает поле кликабельным полностью. -
Модификаторы (
w_input,w_checkbox,w_button) — это тип кубика. Говорят: "Это текстовое поле", "Это кнопка", "Это чекбокс".
Или вспомните конструктор мебели IKEA:
w_form— это инструкция по сборкеfieldset— это модули (полка, ящик, столешница)section— это крепления между элементамиlabel.w_label— это базовая деталь- Модификаторы — это конкретный тип детали (винт, гайка, шуруп)
Суть в том, что вы просто комбинируете классы по правилам — и получаете готовую красивую форму.
Что такое w_form? Контейнер всех форм
w_form — это главный класс-контейнер для любой формы на сайте. Его главная задача — установить базовые правила оформления для всех вложенных элементов.
Суперсилы w_form:
-
Единое оформление. Все поля внутри автоматически получают правильные отступы, закругления, цвета.
- На практике: добавили
class="w_form"к<form>→ все дочерние элементы сразу красиво оформлены.
- На практике: добавили
-
Структурирование через fieldset. Группы полей получают фон, отступы, визуально отделяются друг от друга.
- На практике: личные данные в одном блоке, адрес в другом — визуально понятно.
-
Адаптивность. Форма корректно отображается на мобильных устройствах, планшетах, десктопах.
Где вы это видите на любом сайте?
- Форма регистрации с несколькими шагами
- Форма оформления заказа с разными блоками данных
- Анкета с группировкой вопросов по темам
- Профиль пользователя с секциями (основное, контакты, настройки)
Что такое fieldset и section? Структура формы
fieldset — это логическая группа полей. В HTML это семантический элемент для группировки связанных полей. В Wepps Platform он получает визуальное оформление:
- Светлый фон (
background-color: var(--color-98)) - Отступы (
padding: var(--s2)) - Закругленные углы (
border-radius: var(--s2))
section — это контейнер для одного поля с подписью. Каждая секция = одно поле формы:
<section>
<div class="title">Название поля</div>
<label class="w_label w_input">
<input type="text" name="fieldname" />
</label>
</section>
Суперсилы fieldset и section:
- Визуальная группировка. Пользователь сразу видит, какие поля относятся к одной теме.
- Семантика. Правильная HTML-разметка для доступности (скринридеры понимают структуру).
- Отступы. Автоматические отступы между секциями — не нужно писать CSS.
Проще простого: fieldset = блок с фоном, section = одно поле внутри блока.
Что такое label.w_label? Универсальная обёртка
label.w_label — это базовый класс для любого поля формы. Он делает всю область вокруг поля кликабельной, добавляет правильное позиционирование и подготавливает место для модификаторов.
Ключевые характеристики:
- Относительное позиционирование (
position: relative) — позволяет размещать иконки, ошибки абсолютно. - Flex-контейнер (
display: flex) — выравнивает элементы внутри. - Курсор-указатель (
cursor: pointer) — показывает, что элемент кликабельный. - Полная кликабельность — весь блок
labelкликабельный, не только сам input.
Модификаторы: типы полей
w_input — текстовые поля
Для чего: обычные текстовые поля (имя, email, телефон, адрес).
HTML:
<label class="w_label w_input">
<input type="text" name="name" />
</label>
Стили:
- Белый фон (
background: var(--color-100)) - Серая рамка (
border: var(--s-half) solid var(--color-85)) - Закругленные углы (
border-radius: var(--s2)) - Высота 8 единиц сетки (
min-height: calc(var(--s) * 8)) - Синяя рамка при фокусе (
border-color: var(--color-button))
Типы input:
type="text"— обычный текстtype="email"— email с валидацией браузераtype="tel"— телефон (на мобильных откроется цифровая клавиатура)type="url"— URL с валидациейtype="password"— скрытый ввод пароля
w_area — многострочное поле
Для чего: длинный текст (сообщение, описание, комментарий).
HTML:
<label class="w_label w_area">
<textarea name="message"></textarea>
</label>
Особенности:
- Минимальная высота 20 единиц (
min-height: calc(var(--s) * 20)) - Автоматическое изменение высоты по содержимому (через JavaScript в Forms.js)
- Отключено ручное изменение размера (
resize: none) - Скрытый скроллбар (
overflow: hidden)
w_checkbox — чекбокс
Для чего: множественный выбор (согласие с условиями, выбор услуг, опции).
HTML:
<label class="w_label w_checkbox">
<input type="checkbox" name="approve" />
<span>Я согласен с условиями</span>
</label>
Как работает:
- Нативный
<input type="checkbox">скрыт (display: none) - Кастомный чекбокс через псевдоэлемент
:beforeу<span> - Иконка из Bootstrap Icons:
- Не выбран:
\f584(пустой квадрат) - Выбран:
\f26C(квадрат с галочкой)
- Не выбран:
- Цвет меняется при
:checked
Для массивов: используйте name="field[]" и разные value:
<label class="w_label w_checkbox">
<input type="checkbox" name="services[]" value="web" />
<span>Разработка сайтов</span>
</label>
<label class="w_label w_checkbox">
<input type="checkbox" name="services[]" value="seo" />
<span>SEO-продвижение</span>
</label>
w_radio — радиокнопка
Для чего: выбор одного варианта из нескольких (пол, способ доставки, тариф).
HTML:
<label class="w_label w_radio">
<input type="radio" name="gender" value="male" />
<span>Мужской</span>
</label>
<label class="w_label w_radio">
<input type="radio" name="gender" value="female" />
<span>Женский</span>
</label>
Как работает:
- Нативный
<input type="radio">скрыт - Кастомная радиокнопка через
:beforeу<span> - Иконки:
- Не выбран:
\f28A(пустой круг) - Выбран:
\f26A(круг с точкой)
- Не выбран:
- Все radio с одинаковым
nameобразуют группу (выбрать можно только один)
w_select — выпадающий список
Для чего: выбор из длинного списка (город, страна, категория).
HTML:
<label class="w_label w_select">
<select name="city">
<option value="1">Москва</option>
<option value="2">Санкт-Петербург</option>
<option value="3">Новосибирск</option>
</select>
</label>
Интеграция с Select2:
Платформа использует библиотеку Select2 для расширенных селектов:
- Поиск по списку
- Множественный выбор
- AJAX-подгрузка опций
- Кастомное оформление
Стили Select2:
.select2-container— контейнер.select2-dropdown— выпадающий список.select2-results__option— опция в списке.select2-selection__choice— выбранный элемент (при multiple)
Множественный выбор:
<label class="w_label w_select">
<select multiple name="skills[]">
<option value="php">PHP</option>
<option value="js">JavaScript</option>
<option value="python">Python</option>
</select>
</label>
w_upload — загрузка файла
Для чего: прикрепление файлов (резюме, фото, документы).
HTML:
<label class="w_label w_upload">
<input type="file" name="resume" />
<span>Прикрепить файл</span>
</label>
<div class="w_upload_add">
{foreach $uploaded['resume'] as $k => $file}
<div class="w_upload_file" data-key="{$k}">
{$file.name} <i class="bi bi-x-circle-fill"></i>
</div>
{/foreach}
</div>
Как работает:
- Нативный
<input type="file">скрыт (opacity: 0; display: none) - Кастомная кнопка через
<span> - Кнопка стилизована как обычная кнопка (
color: var(--color-button)) - При наведении меняет цвет (
:hover) - Список загруженных файлов в
.w_upload_add - Иконка удаления файла
.bi-x-circle-fill
JavaScript (Forms.js) обрабатывает:
- Клик по
<span>→ открывает диалог выбора файла - Выбор файла → AJAX-загрузка в сессию
- Клик по
.bi(крестик) → удаление файла из сессии
w_button — кнопка
Для чего: действия (отправить, отменить, далее, назад).
HTML:
<label class="w_label w_button">
<input type="submit" value="Отправить" />
</label>
<!-- Или button -->
<label class="w_label w_button">
<button type="button">Отменить</button>
</label>
<!-- Или ссылка-кнопка -->
<a href="/catalog" class="w_button">Перейти в каталог</a>
Стили:
- Цветная кнопка (
background: var(--color-button)) - Белый текст (
color: var(--color-100)) - Высота 8 единиц (
min-height: calc(var(--s) * 8)) - Состояния:
:hover— темнее (background: var(--color-focus)):active— еще темнее с тенью (background: var(--color-active)):disabled— серая и неактивная (background: var(--color-75))
Модификатор .w_button_important:
<label class="w_label w_button w_button_important">
<input type="submit" value="Купить сейчас" />
</label>
- Жирный шрифт (
font-weight: 600) - Заглавные буквы (
text-transform: uppercase) - Увеличенная высота (
min-height: calc(var(--s) * 10))
Дополнительные классы-утилиты
w_require — обязательное поле
Для чего: показать, что поле обязательно для заполнения.
HTML:
<label class="w_label w_input w_require">
<input type="text" name="email" />
</label>
Визуал:
- Красная звёздочка слева от поля (
:after) - Иконка Bootstrap Icons
\f287(звёздочка) - Цвет
var(--color-attention)(красный) - Позиция:
left: calc(-1 * var(--s3))(слева от label)
w_error — ошибка валидации
Для чего: показать ошибку рядом с неправильно заполненным полем.
Генерируется JavaScript:
var t = $('<div>{$value}</div>').addClass('w_error_{$key}').addClass('w_error');
elem.eq(0).before(t);
Визуал:
- Красный фон (
background: var(--color-attention)) - Белый текст (
color: var(--color-100)) - Абсолютное позиционирование справа от поля
- Треугольник-стрелка влево (
:before) - Иконка закрытия справа (
:after— крестик) - Кликабельная — при клике исчезает
Родительский класс .w_error_parent:
- Добавляется к
labelс ошибкой - Используется для стилизации (можно добавить красную рамку)
w_success — успешная отправка
Для чего: показать сообщение об успешной отправке формы.
Генерируется PHP:
Validator::setFormSuccess("Спасибо! Ваше сообщение отправлено", $this->get['form']);
Визуал:
- Зелёная рамка (
border: var(--s-half) solid var(--color-success)) - Светлый фон (
background: var(--color-98)) - Серый текст (
color: var(--color-25)) - Центрированный текст (
text-align: center) - Заменяет всю форму после успешной отправки
w_minmax — счётчик количества
Для чего: выбор количества товара, гостей, дней.
HTML:
<div class="w_label w_minmax" data-id="123">
<button class="sub"><span></span></button>
<input type="text" name="quantity" value="1" min="1" max="10" />
<button class="add"><span></span></button>
</div>
Визуал:
- Серая рамка вокруг (
border: var(--border)) - Три элемента в ряд: кнопка минус, input, кнопка плюс
- Кнопки с иконками:
- Минус:
\f63B - Плюс:
\f64D
- Минус:
- Серый фон кнопок (
background: var(--color-85)) - При наведении: синий фон (
background: var(--color-focus))
JavaScript (Forms.js):
formWepps.minmax(); // Инициализация
- Клик по минусу — уменьшает значение
- Клик по плюсу — увеличивает значение
- Проверка min/max атрибутов
- Ручной ввод с валидацией
w_hide — скрытие элемента
Для чего: временно скрыть поле или кнопку.
HTML:
<label class="w_label w_input w_hide">
<input type="hidden" name="user_id" value="123" />
</label>
Стили:
label.w_label.w_hide { display: none; }
Магия в соединении: собираем форму из классов
Давайте соберём полноценную форму обратной связи:
<form action="javascript:formWepps.send('feedback','feedback-form','/ext/Contacts/Request.php')"
id="feedback-form" class="w_form">
<h2>Свяжитесь с нами</h2>
<!-- Группа 1: Личные данные -->
<fieldset>
<section>
<div class="title">Ваше имя</div>
<label class="w_label w_input w_require">
<input type="text" name="name" placeholder="Иван Иванов" />
</label>
</section>
<section>
<div class="title">Email</div>
<label class="w_label w_input w_require">
<input type="email" name="email" placeholder="ivan@example.com" />
</label>
</section>
<section>
<div class="title">Телефон</div>
<label class="w_label w_input">
<input type="tel" name="phone" placeholder="+7 (___) ___-__-__" />
</label>
</section>
</fieldset>
<!-- Группа 2: Сообщение -->
<fieldset>
<section>
<div class="title">Ваше сообщение</div>
<label class="w_label w_area w_require">
<textarea name="message" placeholder="Напишите ваш вопрос..."></textarea>
</label>
</section>
<section>
<div class="title">Вложение</div>
<label class="w_label w_upload">
<input type="file" name="attachment" />
<span>Прикрепить файл</span>
</label>
<div class="w_upload_add"></div>
</section>
</fieldset>
<!-- Группа 3: Дополнительно -->
<fieldset>
<section>
<div class="title">Интересующие услуги</div>
<label class="w_label w_checkbox">
<input type="checkbox" name="services[]" value="web" />
<span>Разработка сайтов</span>
</label>
<label class="w_label w_checkbox">
<input type="checkbox" name="services[]" value="seo" />
<span>SEO-продвижение</span>
</label>
<label class="w_label w_checkbox">
<input type="checkbox" name="services[]" value="support" />
<span>Техподдержка</span>
</label>
</section>
<section>
<div class="title">Предпочтительный способ связи</div>
<label class="w_label w_radio">
<input type="radio" name="contact_method" value="email" checked />
<span>Email</span>
</label>
<label class="w_label w_radio">
<input type="radio" name="contact_method" value="phone" />
<span>Телефон</span>
</label>
<label class="w_label w_radio">
<input type="radio" name="contact_method" value="telegram" />
<span>Telegram</span>
</label>
</section>
</fieldset>
<!-- Группа 4: Отправка -->
<fieldset>
<section>
<label class="w_label w_checkbox">
<input type="checkbox" name="approve" />
<span>Я согласен на обработку персональных данных</span>
</label>
</section>
<section>
<label class="w_label w_button">
<input type="submit" value="Отправить" disabled />
</label>
</section>
</fieldset>
</form>
Что получилось:
- ✅ 4 визуальные группы полей (fieldset)
- ✅ Обязательные поля отмечены красной звёздочкой
- ✅ Разные типы полей: текст, email, телефон, текстовая область, загрузка файла
- ✅ Множественный выбор (чекбоксы)
- ✅ Выбор одного варианта (радио)
- ✅ Кнопка неактивна до согласия с условиями
- ✅ Всё адаптивно и красиво из коробки
Реальные сценарии компоновки
Сценарий 1: Форма регистрации
Задача: создать форму регистрации с паролем, подтверждением пароля и выбором пола.
<form class="w_form" id="register-form">
<h2>Регистрация</h2>
<fieldset>
<section>
<div class="title">Email</div>
<label class="w_label w_input w_require">
<input type="email" name="email" />
</label>
</section>
<section>
<div class="title">Пароль</div>
<div class="text">Минимум 8 символов</div>
<label class="w_label w_input w_require">
<input type="password" name="password" />
</label>
</section>
<section>
<div class="title">Подтверждение пароля</div>
<label class="w_label w_input w_require">
<input type="password" name="password_confirm" />
</label>
</section>
<section>
<div class="title">Пол</div>
<label class="w_label w_radio">
<input type="radio" name="gender" value="m" />
<span>Мужской</span>
</label>
<label class="w_label w_radio">
<input type="radio" name="gender" value="f" />
<span>Женский</span>
</label>
</section>
</fieldset>
<fieldset>
<section>
<label class="w_label w_button w_button_important">
<input type="submit" value="Зарегистрироваться" />
</label>
</section>
</fieldset>
</form>
Особенности:
<div class="text">— подсказка под заголовком (серый цвет)type="password"— скрытый ввод- Радиокнопки в одной секции
- Важная кнопка с классом
w_button_important
Сценарий 2: Форма с поиском в селекте (Select2)
Задача: выбор города из большого списка с поиском.
<section>
<div class="title">Город</div>
<label class="w_label w_select">
<select name="city" class="select2">
<option value="">Выберите город</option>
<option value="1">Москва</option>
<option value="2">Санкт-Петербург</option>
<option value="3">Новосибирск</option>
<!-- ... ещё 100+ городов ... -->
</select>
</label>
</section>
JavaScript (Forms.js):
$('.w_select select.select2').select2({
language: "ru",
placeholder: "Введите название города"
});
Стили Select2 автоматически:
- Синяя рамка при открытии
- Поле поиска в выпадающем списке
- Закругленные углы
- Правильная высота
- Иконка стрелки
Сценарий 3: Форма с динамическим добавлением полей
Задача: форма "Добавить участников", где можно добавить несколько человек.
<fieldset id="participants">
<section class="participant-row">
<div class="title">Участник 1</div>
<div class="w_grid w_2col w_gap_small">
<label class="w_label w_input w_require">
<input type="text" name="participants[0][name]" placeholder="Имя" />
</label>
<label class="w_label w_input w_require">
<input type="email" name="participants[0][email]" placeholder="Email" />
</label>
</div>
</section>
</fieldset>
<fieldset>
<section>
<button type="button" class="w_button" onclick="addParticipant()">
+ Добавить участника
</button>
</section>
</fieldset>
JavaScript:
let participantIndex = 1;
function addParticipant() {
let html = `
<section class="participant-row">
<div class="title">Участник ${participantIndex + 1}</div>
<div class="w_grid w_2col w_gap_small">
<label class="w_label w_input w_require">
<input type="text" name="participants[${participantIndex}][name]" placeholder="Имя" />
</label>
<label class="w_label w_input w_require">
<input type="email" name="participants[${participantIndex}][email]" placeholder="Email" />
</label>
</div>
</section>
`;
$('#participants').append(html);
participantIndex++;
}
Используются классы сетки:
w_grid— включает CSS Gridw_2col— две колонкиw_gap_small— маленький промежуток между колонками
Сценарий 4: Форма с кнопкой очистки в input
Задача: добавить иконку очистки поля при вводе текста.
<section>
<div class="title">Поиск</div>
<label class="w_label w_input">
<i class="w_field_empty"></i>
<input type="text" name="search" placeholder="Введите запрос..." />
</label>
</section>
Стили (Forms.css):
.w_field_empty— абсолютное позиционирование справа- Иконка крестика из Bootstrap Icons (
\f659) - При наведении: серый фон
- При клике: очищает поле (обработчик в Forms.js)
JavaScript (Forms.js):
$('i.w_field_empty').on('click', function () {
$(this).siblings('input,textarea').val('');
});
Частые вопросы и проблемы
❓ Почему поля имеют разную высоту?
Проблема: input и button имеют разную высоту, форма выглядит криво.
Причина: Не используется класс w_label или не подключен Forms.css.
Решение:
<!-- ❌ Неправильно -->
<input type="text" name="name" />
<button>Отправить</button>
<!-- ✅ Правильно -->
<label class="w_label w_input">
<input type="text" name="name" />
</label>
<label class="w_label w_button">
<button>Отправить</button>
</label>
Все элементы получают единую высоту min-height: calc(var(--s) * 8).
❓ Как сделать кнопку на всю ширину?
Решение: Добавьте display: block и width: 100% к label:
<label class="w_label w_button" style="display: block; width: 100%;">
<input type="submit" value="Отправить" />
</label>
Или создайте класс-утилиту в своём CSS:
.w_button_full {
display: block;
width: 100%;
}
❓ Чекбоксы не кликаются
Проблема: Клик по тексту чекбокса не переключает его.
Причина: Неправильная структура HTML — <input> не внутри <label> или отсутствует <span>.
Решение:
<!-- ❌ Неправильно -->
<input type="checkbox" name="agree" />
<label>Согласен</label>
<!-- ✅ Правильно -->
<label class="w_label w_checkbox">
<input type="checkbox" name="agree" />
<span>Согласен</span>
</label>
Обязательно используйте <span> для текста — иначе кастомные стили не применятся.
❓ Select2 не инициализируется
Проблема: Селект выглядит как обычный, без поиска и стилей Select2.
Причина: Не вызван select2Render() или не подключена библиотека.
Решение:
-
Убедитесь, что подключены скрипты:
$this->headers->js("/packages/vendor/select2/select2/dist/js/select2.full.min.js"); $this->headers->css("/packages/vendor/select2/select2/dist/css/select2.min.css"); -
Вызовите инициализацию:
$(document).ready(function() { $('.w_select select').select2({ language: "ru" }); });
Или используйте готовую функцию из Forms.js:
select2Render();
❓ Как изменить цвета форм под свой дизайн?
Решение: Переопределите CSS-переменные в своём файле стилей:
:root {
--color-button: #ff5722; /* Цвет кнопок */
--color-focus: #e64a19; /* Цвет при наведении */
--color-active: #d84315; /* Цвет при клике */
--color-attention: #f44336; /* Цвет ошибок */
--color-success: #4caf50; /* Цвет успеха */
}
Все классы используют эти переменные, поэтому форма сразу перекрасится.
Принципы работы с классами
✅ Делайте так:
-
Всегда используйте w_form для контейнера
<form class="w_form"> <!-- Содержимое --> </form> -
Группируйте связанные поля в fieldset
<fieldset> <!-- Личные данные --> </fieldset> <fieldset> <!-- Адрес доставки --> </fieldset> -
Каждое поле в свою section
<section> <div class="title">Название</div> <label class="w_label w_input"> <input type="text" name="field" /> </label> </section> -
Комбинируйте w_label с модификатором
<label class="w_label w_input"> <!-- Текстовое поле --> <label class="w_label w_checkbox"> <!-- Чекбокс --> <label class="w_label w_button"> <!-- Кнопка --> -
Добавляйте w_require к обязательным полям
<label class="w_label w_input w_require"> <input type="email" name="email" /> </label>
❌ Не делайте так:
-
Не пропускайте label
<!-- ❌ Неправильно --> <input type="text" class="w_input" /> <!-- ✅ Правильно --> <label class="w_label w_input"> <input type="text" /> </label> -
Не забывайте про span в чекбоксах/радио
<!-- ❌ Неправильно --> <label class="w_label w_checkbox"> <input type="checkbox" /> Текст </label> <!-- ✅ Правильно --> <label class="w_label w_checkbox"> <input type="checkbox" /> <span>Текст</span> </label> -
Не смешивайте разные типы в одном label
<!-- ❌ Неправильно --> <label class="w_label w_input w_button"> <!-- Что это? Input или button? --> </label> <!-- ✅ Правильно --> <label class="w_label w_input"> <input type="text" /> </label> <label class="w_label w_button"> <button>OK</button> </label>
Адаптивность и сетка
Формы в Wepps Platform адаптивны из коробки, но для сложных макетов используйте классы сетки:
Два поля в строку
<section>
<div class="w_grid w_2col w_gap_medium">
<label class="w_label w_input">
<input type="text" name="first_name" placeholder="Имя" />
</label>
<label class="w_label w_input">
<input type="text" name="last_name" placeholder="Фамилия" />
</label>
</div>
</section>
Три поля в строку
<section>
<div class="w_grid w_3col w_gap_small">
<label class="w_label w_input">
<input type="text" name="city" placeholder="Город" />
</label>
<label class="w_label w_input">
<input type="text" name="street" placeholder="Улица" />
</label>
<label class="w_label w_input">
<input type="text" name="house" placeholder="Дом" />
</label>
</div>
</section>
Разные ширины колонок
<section>
<div class="w_grid w_gap_medium" style="grid-template-columns: 2fr 1fr;">
<label class="w_label w_input">
<input type="text" name="address" placeholder="Адрес" />
</label>
<label class="w_label w_input">
<input type="text" name="apartment" placeholder="Кв." />
</label>
</div>
</section>
Переменные CSS и кастомизация
Все размеры и цвета форм управляются через CSS-переменные:
Размеры (сетка)
:root {
--s: 4px; /* Базовая единица */
--s-half: 2px; /* Половина (для border) */
--s2: 8px; /* 2 единицы */
--s3: 12px; /* 3 единицы */
--s4: 16px; /* 4 единицы */
--s5: 20px; /* 5 единицы */
--s6: 24px; /* 6 единиц */
}
Цвета
:root {
--color-100: #ffffff; /* Белый (фон полей) */
--color-98: #fafafa; /* Почти белый (фон fieldset) */
--color-95: #f5f5f5; /* Светло-серый */
--color-85: #e0e0e0; /* Серый (рамки) */
--color-75: #bdbdbd; /* Темно-серый */
--color-50: #757575; /* Текст подсказок */
--color-25: #424242; /* Основной текст */
--color-20: #333333; /* Темный текст */
--color-primary: #212121; /* Самый темный текст */
--color-button: #2196f3; /* Синий (кнопки, акценты) */
--color-focus: #1976d2; /* Темнее при наведении */
--color-active: #0d47a1; /* Самый темный при клике */
--color-attention: #f44336; /* Красный (ошибки) */
--color-success: #4caf50; /* Зелёный (успех) */
--color-warning: #ff9800; /* Оранжевый (предупреждения) */
}
Шрифты
:root {
--font: 'Roboto', sans-serif; /* Основной шрифт */
--font-default: 14px; /* Размер по умолчанию */
--font-medium: 16px; /* Средний размер */
}
Пример кастомизации
Создайте файл custom-forms.css:
/* Увеличим все поля */
:root {
--s: 5px; /* Было 4px, стало 5px */
}
/* Сделаем кнопки зелёными */
:root {
--color-button: #4caf50;
--color-focus: #43a047;
--color-active: #2e7d32;
}
/* Уберём закругления */
label.w_label.w_input input,
label.w_label.w_button input,
label.w_label.w_button button {
border-radius: 0;
}
/* Сделаем чекбоксы квадратными */
label.w_label.w_checkbox input[type="checkbox"]+span:before {
content: "☐"; /* Квадрат вместо иконки */
}
label.w_label.w_checkbox input[type="checkbox"]:checked+span:before {
content: "☑"; /* Квадрат с галочкой */
}
Подключите после Forms.css:
$this->headers->css("/ext/Template/Forms/Forms.{$this->rand}.css");
$this->headers->css("/path/to/custom-forms.css");
Заключение
Система CSS-классов для форм в Wepps Platform предоставляет:
- ✅ Готовые стили для всех типов полей
- ✅ Единую высоту элементов (8 единиц сетки)
- ✅ Адаптивность из коробки
- ✅ Кастомные чекбоксы и радиокнопки через иконки
- ✅ Интеграцию с Select2 для расширенных селектов
- ✅ Визуализацию ошибок и успеха
- ✅ Модульность через классы-модификаторы
- ✅ Кастомизацию через CSS-переменные
Вы просто комбинируете классы по правилам — и получаете красивую, функциональную, адаптивную форму. Не нужно писать CSS с нуля для каждой формы.
Начните с базовой структуры (form.w_form > fieldset > section > label.w_label), добавляйте модификаторы (w_input, w_checkbox, w_button) — и через 10 минут у вас готова профессионально оформленная форма.
Файлы:
packages/WeppsExtensions/Template/Forms/Forms.css— все стили формpackages/WeppsExtensions/Template/Forms/Forms.js— JavaScript для формpackages/vendor/select2/— библиотека Select2