PageForm
Раскладка формы создания или настройки ресурса: заголовок, степпер (stepper), контент (children), сайд-блок (sideBlock) и sticky-футер с оценкой бюджета (priceSummary) и кнопками (footer). Раскладку берёт из AdaptiveProvider.
Когда использовать
- Многошаговые формы создания/аренды/настройки ресурса со степпером и итоговой ценой.
- Нужен закреплённый футер с основной/вторичной кнопкой и сводкой бюджета.
Анатомия
Тело PageForm на desktop — одна карточка формы фиксированной ширины по центру страницы; справа при переданных слотах встаёт липкая колонка sideItems (304px). Внутри карточки вертикальным стеком идут заголовок, степпер, контент шага и футер.
Боковая колонка отрисовывается только при переданных priceSummary.content / sideBlock; иначе карточка формы стоит одна по центру. На mobile раскладка одноколоночная: степпер sticky сверху, слоты — стопкой, футер sticky снизу.
Слоты:
title/subtitle— заголовок формы и подзаголовок.stepper— степпер шагов; на mobile становится sticky сверху.children— контент текущего шага.sideBlock— массив блоков{ label, content }в боковой колонке (подсказки, сводка конфигурации).priceSummary—{ total, content? }: на desktopcontentидёт карточкой боковой колонки, на mobile — оценкой бюджета в футере.footer— кнопки футера (внизу карточки формы на desktop, sticky-футер на mobile).stickyFooterзакрепляет его внизу при прокрутке длинной формы.
Кнопки футера
buttonPrimary— основная кнопка.variantиз набора (continue,create,save,rent,send,restore,add) задаёт локализованную подпись;variant: 'custom'требует свойlabel.buttonSecondary— вторичная кнопка (cancel,backилиcustom).buttonAdditional— дополнительная кнопка@cloud-ru/ds-button.
Каждой кнопке можно передать tooltip (пропсы @cloud-ru/ds-tooltip).
Адаптивность
desktop— сайд-блок сбоку, футер с бюджетом и кнопками внизу.mobile— слот «ещё» (moreActions, kebab) прижимается к правому краю строки заголовка; степпер sticky сверху, футер с оценкой бюджета и кнопками — sticky снизу.
Установка
pnpm add @cloud-ru/ds-uikit-product-page-layout
import { PageForm } from '@cloud-ru/ds-uikit-product-page-layout'
Props
Types
PageFormProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
children | string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined | — | no | |
className | string | — | no | |
data-test-id | string | — | no | |
footer | { buttonPrimary: ({ variant: ButtonPrimaryVariant; } | { variant: "custom"; label: string; }) & { tooltip?: TooltipProps; } & Omit<ButtonProps, "label">; buttonSecondary?: (({ ...; } | { ...; }) & ... 1 more ... & Omit<...>); buttonAdditional?: ({ ...; } & ... 4 more ... & { ...; }) | undefin... | — | no | |
priceSummary | { total: ReactNode; content?: ReactNode; } | — | no | |
sideBlock | { label: string; content: ReactNode; snapPoints?: SnapPoint[]; }[] | — | no | |
stepper | ReactNode | — | no | |
stickyFooter | boolean | — | no | Закрепляет футер внизу формы при прокрутке контента. |
subtitle | ReactNode | — | no | Подзаголовок под заголовком |
title | string | — | yes | Заголовок страницы |