Сетка размечает контент внутри страницы. Каркас приложения — шапку, панели и подвал — собирайте из CdsLayout.
Анатомия
Каждый макет начинается с CdsGrid — контейнер можно ставить на любом уровне вложенности, если он занимает всю ширину родителя. Внутри Flexbox-сетки колонки CdsCol группируются в ряды CdsRow; в режиме CSS Grid ряды не нужны — колонки переносятся сами.
Вариации
Flexbox или CSS Grid
По умолчанию сетка построена на Flexbox. Второй режим — CSS Grid — включается один раз на всё приложение опцией cssGrid и добавляет возможности, которых у Flexbox нет: вложенные сетки subgrid и явное позиционирование колонок через span, start и end. Flexbox-режим взамен умеет менять порядок колонок через order.
import { createCds } from '@central-design-system/components';
const cds = createCds({ cssGrid: true });Компоненты и пропсы в обоих режимах одни и те же, различается сгенерированная разметка. В примерах ниже режим CSS Grid включён точечно — через provide(CssGridSymbol, true); в приложении достаточно опции cssGrid.
Колонки и брейкпоинты
Ширина колонки задаётся пропсами-брейкпоинтами xs–xl: число — сколько колонок сетки займёт CdsCol, начиная с этого брейкпоинта. Значения работают «снизу вверх»: md="4" действует на md и шире.
Количество колонок в сетке зависит от ширины экрана, поэтому одно и то же число на разных брейкпоинтах занимает разную долю ряда:
| Брейкпоинт | Ширина экрана | Колонок в сетке |
|---|---|---|
xs | ≥ 320px | 4 |
sm | ≥ 672px | 8 |
md | ≥ 1056px | 16 |
lg | ≥ 1312px | 16 |
xl | ≥ 1584px | 16 |
Комбинируйте брейкпоинты, чтобы описать поведение макета на всех экранах: здесь каждая колонка занимает половину ряда на телефоне и четверть — начиная с планшета. Значение 0 скрывает колонку на брейкпоинте.
Автоматические колонки
CdsCol без пропсов-брейкпоинтов делит ряд поровну между соседями: одна колонка займёт всю ширину, четыре — по четверти. Удобно, когда доли равные и пересчитывать их по брейкпоинтам незачем. Работает только в Flexbox-режиме.
Виды сетки
Свойства narrow и condensed сжимают отступ между колонками с 32px до 16px и 1px соответственно. Те же пропсы есть у CdsRow — так виды смешиваются в одной сетке. Свойство wide снимает ограничение максимальной ширины (1584px) и растягивает сетку на весь контейнер.
Смещение и порядок
Вместо числа в проп-брейкпоинт можно передать объект. Ключ span задаёт ширину, offset — сдвиг вправо на заданное число колонок.
Ключ order меняет визуальный порядок колонок, не трогая разметку — например, чтобы на десктопе показать колонки в другой последовательности, чем в DOM. Работает только в Flexbox-режиме.
Режим CSS Grid
В режиме CSS Grid колонки кладутся прямо в CdsGrid — без CdsRow: сетка сама переносит их на новую строку, когда ряд заполнен.
Вложенная сетка с пропом subgrid наследует колонки родительской: положите её внутрь CdsCol — и её колонки встанут точно по линиям внешней сетки. Виды narrow и condensed у вложенной сетки работают независимо от корневой.
Колонку можно позиционировать явно: в объекте брейкпоинта start и end задают начальную и конечную линию сетки, а проп span фиксирует диапазон сразу для всех брейкпоинтов — числом или долей '25%', '50%', '75%', '100%'.
CSS-классы
Вся сетка продублирована утилитарными классами — размечайте макет без Vue-компонентов: в письмах, на статических страницах или в чужом коде. Компоненты генерируют те же классы, поэтому оба способа свободно смешиваются.
Классы Flexbox-сетки:
| Класс | Назначение |
|---|---|
cds-grid | Контейнер сетки |
cds-grid-narrow / cds-grid-condensed | Узкий (16px) и конденсированный (1px) отступ |
cds-grid--wide | Без ограничения максимальной ширины |
cds-row | Ряд; cds-row-narrow, cds-row-condensed — виды |
cds-col-{bp}-{n} | Колонка шириной n на брейкпоинте bp и шире |
cds-col-{bp} / cds-col-{bp}-auto | Автоматическая колонка / ширина по контенту |
cds-offset-{bp}-{n} | Сдвиг вправо на n колонок |
cds-order-{bp}-{n} | Визуальный порядок колонки |
cds-row-padding / cds-col-padding | Вертикальные отступы, равные половине межколонника |
cds-aspect-ratio cds-aspect-ratio--{w}x{h} | Соотношение сторон блока: 16x9, 4x3, 1x1, … |
Классы режима CSS Grid:
| Класс | Назначение |
|---|---|
cds--css-grid | Контейнер; --narrow, --condensed, --wide |
cds--css-grid-column | Колонка |
cds--col-span-{n} | Диапазон в n колонок на всех брейкпоинтах |
cds--{bp}:col-span-{n} | Диапазон с брейкпоинта bp |
cds--col-span-{25|50|75|100} | Диапазон долей сетки |
cds--col-start-{n} / cds--col-end-{n} | Начальная и конечная линия |
cds--subgrid | Вложенная сетка; виды — --narrow и т. д. |
Классы cds-no-gutter и cds-no-gutter--start / cds-no-gutter--end убирают отступы колонок — у всего ряда или с одной стороны. Парные cds-hang--start / cds-hang--end возвращают отступ контенту, когда его нужно выровнять по модульной сетке.
Рекомендации
Сценарии использования
Плитка карточек
Витрина отчётов: на телефоне карточки в столбик, на планшете — по две, на широком экране — четыре в ряд. Класс cds-row-padding даёт вертикальный отступ между рядами плитки.
Форма в две колонки
Сетка раскладывает поля формы: парные поля (sm="4" md="8") делят ряд пополам начиная с планшета, комментарий и кнопки занимают ряд целиком. На телефоне всё складывается в одну колонку без дополнительных условий. Вертикальный ритм задают утилитарные классы py-1 на колонках — плотнее, чем cds-row-padding, а hide-details у контролов убирает зарезервированную зону сообщений.
Список с фильтрами
Классическая пропорция «фильтры слева, результаты справа»: панель занимает 4 колонки, список — 12. На телефоне и планшете фильтры встают над списком — за это отвечают значения xs и sm во всю ширину ряда.
API
CdsGrid
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
condensed | boolean | undefined | — | Конденсированная сетка. Уменьшенный отступ до 1px по обеим сторонам |
narrow | boolean | undefined | — | Узкая сетка |
subgrid | boolean | undefined | — | Only CSS Grid supported. Вложенная сетка |
tag | string | JSXComponent<any> | undefined | 'div' | Пользовательский HTML-тег для отображения |
wide | boolean | undefined | — | Удаляет max-width по умолчанию и растягивает сетку на всю ширину контейнера |
Слоты
| Имя | Тип | Описание |
|---|---|---|
default | any | Ряды сетки — CdsRow |
CdsRow
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
condensed | boolean | undefined | — | Конденсированная сетка. Уменьшенный отступ до 1px по обеим сторонам |
narrow | boolean | undefined | — | Узкая сетка |
tag | string | JSXComponent<any> | undefined | 'div' | Пользовательский HTML-тег для отображения |
Слоты
| Имя | Тип | Описание |
|---|---|---|
default | any | Колонки ряда — CdsCol |
CdsCol
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
lg | ColumnBreakpoint<ColumnGridBreakpoint | ColumnFlexBreakpoint> | — | >1312px |
md | ColumnBreakpoint<ColumnGridBreakpoint | ColumnFlexBreakpoint> | — | >1056px |
sm | ColumnBreakpoint<ColumnGridBreakpoint | ColumnFlexBreakpoint> | — | >672px |
span | string | number | ColumnSpanType | undefined | — | Only CSS Grid supported. Постоянный диапазон колонок, start или end значения, которые не изменятся. |
tag | string | JSXComponent<any> | undefined | 'div' | Пользовательский HTML-тег для отображения |
xl | ColumnBreakpoint<ColumnGridBreakpoint | ColumnFlexBreakpoint> | — | >1584px |
xs | ColumnBreakpoint<ColumnGridBreakpoint | ColumnFlexBreakpoint> | — | >320px |
Слоты
| Имя | Тип | Описание |
|---|---|---|
default | any | Контент колонки |