-
Notifications
You must be signed in to change notification settings - Fork 198
[RFC][Компоненты раскладки]: Создание общих свойств раскладки для изменения геометрии #8871
Description
Какая есть проблема?
Сейчас следующие задачи:
- изменить внешние или внутренние отступы
- растянуть по вертикали или горизонтали
- ограничить размеры по вертикали или горизонтали
- изменить позиционирование
- задать flex-свойства потомку
необходимо делать либо через определение className или style.
Есть прикладные компоненты Group, FormLayoutGroup, FormField, ButtonGroup, CellButtonGroup, RadioGroup, которые задают отступы по дизайн-системе, но они не покрывают все задачи.
Есть общие компоненты, но они тоже ограничивают пользователя:
Div– отступы зашиты, можно перебить либо токены, либо отступы черезclassNameилиstyleFlex- чтобы задать отступ нужно либо обернуть в
Div, либо передать его вComponent, либо использоватьmargin, который тоже зашивает конкретный отступ. - нельзя задать
flex-basis,flex-shrink,flex-grow, если говорить о вложенномFlex.
- чтобы задать отступ нужно либо обернуть в
Flex.Item– нельзя точечно задатьflex-basis,flex-shrink,flex-grow.SimpleGrid– чтобы задать отступ нужно либо обернуть вDiv, либо передать его вComponent, либо использоватьmargin, который тоже зашивает конкретный отступ.
Примеры как приходится делать сейчас
<Flex Component={Div} align="center" justify="center"> ... </Flex>// .box { padding: 12px; }
<Flex direction="column" className={styles.box}> ... </Flex>// .scrollContainer { position: relative; flex-grow: 1; }
<Flex direction="column" className={styles.scrollContainer}> ... </Flex>// .root .content { flex: 1; }
<Flex direction="column" align="start" className={styles.content}> ... </Flex>// .content { padding-inline: 8px }
<Div className={styles.content}>
<Flex gap={4}>
....
</Flex>
....
</Div>Что нужно сделать?
Нужно расширить компоненты Flex, SimpleGrid, Box (новый компонент см. #8928) общими свойствами для управления геометрией.
Исключение:
Flex.Item
Определим черновой вариант типов для наглядности примеров:
// https://github.com/microsoft/TypeScript/issues/29729
interface Nothing {}
type LiteralUnion<Union, Type> = Union | (Type & Nothing);
// размерности из vkui-tokens
type DesignSystemSize = '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' | '2xl' | '3xl' | '4xl';
// типы в CSS
type CSSGlobalValue = "inherit" | "initial" | "unset";
type CSSUnitValue = `${number}${'em' | 'rem' | '%' | 'vw' | 'vh'}`;
type CSSCustomSize = `--${string}`;
type CSSIntrinsicSizingKeywords = "auto" | "fill" | "max-content" | "min-content" | "fit-content";Note
- Свойства также должны быть адаптивными по итогам обсуждения:
- Для именования используем CSS Logical
display
| Компонент | Типы |
|---|---|
Box |
"none" | "inline" | "inline-block" | "block" | "contents"> |
Flex |
'none' | 'inline-flex' | 'flex' |
SimpleGrid |
'none' | 'inline-grid' | 'grid' |
Отступы
| Название | Тип |
|---|---|
padding |
LiteralUnion<DesignSystemSize | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
paddingInline |
LiteralUnion<DesignSystemSize | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
paddingBlock |
LiteralUnion<DesignSystemSize | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
paddingInlineStart |
LiteralUnion<DesignSystemSize | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
paddingInlineEnd |
LiteralUnion<DesignSystemSize | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
paddingBlockStart |
LiteralUnion<DesignSystemSize | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
paddingBlockEnd |
LiteralUnion<DesignSystemSize | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
Ширина
Для задач по растягиванию ширины или, наоборот, её ограничения.
| Название | Тип |
|---|---|
inlineSize |
LiteralUnion<CSSIntrinsicSizingKeywords | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
minInlineSize |
LiteralUnion<CSSIntrinsicSizingKeywords | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
maxInlineSize |
LiteralUnion<CSSIntrinsicSizingKeywords | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
См. также: [RFC] Адаптивные свойства компонентов раскладки.
Высота
Для задач по растягиванию высоты или, наоборот, её ограничения.
| Название | Тип |
|---|---|
blockSize |
LiteralUnion<CSSIntrinsicSizingKeywords | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
minBlockSize |
LiteralUnion<CSSIntrinsicSizingKeywords | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
maxBlockSize |
LiteralUnion<CSSIntrinsicSizingKeywords | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
Flex-потомок
Должно быть также у компонента
Separator
Чтобы была возможность управлять размерами потомков Flex-родителя.
| Название | Тип |
|---|---|
flexGrow |
LiteralUnion<CSSGlobalValue | CSSCustomSize, number> |
flexShrink |
LiteralUnion<CSSGlobalValue | CSSCustomSize, number> |
flexBasis |
LiteralUnion<CSSIntrinsicSizingKeywords | CSSGlobalValue | CSSUnitValue | CSSCustomSize, number> |
Позиционирование
Управление слоем может пригодиться для декоративных элементов.
| Название | Тип |
|---|---|
position |
'static' | 'relative' | 'absolute' | 'fixed' |
inset |
LiteralUnion<DesignSystemSize | CSSUnitValue | CSSCustomSize, number> |
insetBlockStart |
LiteralUnion<DesignSystemSize | CSSUnitValue | CSSCustomSize, number> |
insetBlockEnd |
LiteralUnion<DesignSystemSize | CSSUnitValue | CSSCustomSize, number> |
insetInlineStart |
LiteralUnion<DesignSystemSize | CSSUnitValue | CSSCustomSize, number> |
insetInlineEnd |
LiteralUnion<DesignSystemSize | CSSUnitValue | CSSCustomSize, number> |
Переполнение
| Название | Тип |
|---|---|
overflow |
'visible' | 'hidden' | 'clip' | 'scroll' | 'auto' | 'inherit' | 'initial' | 'unset' |
overflowBlock |
'visible' | 'hidden' | 'clip' | 'scroll' | 'auto' | 'inherit' | 'initial' | 'unset' |
overflowInline |
'visible' | 'hidden' | 'clip' | 'scroll' | 'auto' | 'inherit' | 'initial' | 'unset' |
Референсы
- Всё выше описанное вдохновлено Radix UI https://www.radix-ui.com/themes/docs/overview/layout
- related to [BREAKING CHANGE] Убрать стили внешней геометрии #2347
- related to [EPIC]: Использовать vkui-токены для системы расстояний внутри компонентов VKUI #6684
- related to [RFC] Расширение возможностей кастомизации компонентов #8754
Metadata
Metadata
Assignees
Type
Projects
Status