Skip to content

[RFC][Компоненты раскладки]: Создание общих свойств раскладки для изменения геометрии #8871

@inomdzhon

Description

@inomdzhon

Какая есть проблема?

Сейчас следующие задачи:

  • изменить внешние или внутренние отступы
  • растянуть по вертикали или горизонтали
  • ограничить размеры по вертикали или горизонтали
  • изменить позиционирование
  • задать flex-свойства потомку

необходимо делать либо через определение className или style.

Есть прикладные компоненты Group, FormLayoutGroup, FormField, ButtonGroup, CellButtonGroup, RadioGroup, которые задают отступы по дизайн-системе, но они не покрывают все задачи.

Есть общие компоненты, но они тоже ограничивают пользователя:

  • Div – отступы зашиты, можно перебить либо токены, либо отступы через className или style
  • Flex
    • чтобы задать отступ нужно либо обернуть в 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

  1. Свойства также должны быть адаптивными по итогам обсуждения:
  2. Для именования используем CSS Logical

display

Компонент Типы
Box "none" | "inline" | "inline-block" | "block" | "contents">
Flex 'none' | 'inline-flex' | 'flex'
SimpleGrid 'none' | 'inline-grid' | 'grid'

Отступы

Решает проблему с Flex + Div.

Название Тип
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'

Референсы

Metadata

Metadata

Assignees

Projects

Status

✅ Done

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions