diff --git a/packages/vkui/src/components/Flex/Flex.module.css b/packages/vkui/src/components/Flex/Flex.module.css index f2900e409b..3cc873e2de 100644 --- a/packages/vkui/src/components/Flex/Flex.module.css +++ b/packages/vkui/src/components/Flex/Flex.module.css @@ -13,13 +13,31 @@ margin-block: var(--vkui--size_base_padding_vertical--regular); } -.withGaps { - margin-block-start: calc( - -1 * var(--vkui_internal--row_gap) + var(--vkui_internal--flex_original_margin_block) - ); - margin-inline-start: calc( - -1 * var(--vkui_internal--column_gap) + var(--vkui_internal--flex_original_margin_inline) - ); +/*TODO [>=8]: Проверить браузерную поддержку gap*/ +/*Данная проверка позволяет максимально близко определить поддерживается ли gap + flex*/ +/*см. https://github.com/w3c/csswg-drafts/issues/3559#issuecomment-1758459996*/ +/*Поддержка inset https://developer.mozilla.org/en-US/docs/Web/CSS/inset#browser_compatibility*/ +/*Поддержка gap https://developer.mozilla.org/en-US/docs/Web/CSS/gap#browser_compatibility*/ +@supports (inset: 0) { + .host { + gap: var(--vkui_internal--row_gap) var(--vkui_internal--column_gap); + } +} +@supports not (inset: 0) { + .withGaps { + margin-block-start: calc( + -1 * var(--vkui_internal--row_gap) + var(--vkui_internal--flex_original_margin_block) + ); + margin-inline-start: calc( + -1 * var(--vkui_internal--column_gap) + var(--vkui_internal--flex_original_margin_inline) + ); + } + + /* stylelint-disable-next-line @project-tools/stylelint-atomic, selector-max-universal */ + .withGaps.withGaps > * { + margin-block-start: var(--vkui_internal--row_gap); + margin-inline-start: var(--vkui_internal--column_gap); + } } .host > .marginAuto { @@ -90,9 +108,3 @@ .alignBaseline { align-items: baseline; } - -/* stylelint-disable-next-line @project-tools/stylelint-atomic, selector-max-universal */ -.withGaps.withGaps > * { - margin-block-start: var(--vkui_internal--row_gap); - margin-inline-start: var(--vkui_internal--column_gap); -} diff --git a/packages/vkui/src/components/Flex/Flex.stories.tsx b/packages/vkui/src/components/Flex/Flex.stories.tsx index 56826aaca2..7dc05634b2 100644 --- a/packages/vkui/src/components/Flex/Flex.stories.tsx +++ b/packages/vkui/src/components/Flex/Flex.stories.tsx @@ -7,24 +7,54 @@ import { Button } from '../Button/Button'; import { Image } from '../Image/Image'; import { Flex, type FlexProps } from './Flex'; -const story: Meta = { +type StoryProps = FlexProps & { + /** + * Отступ между строками + */ + rowGap?: number; + /** + * Отступ между столбцами + */ + columnGap?: number; + /** + * Количество элементов + */ + itemsCount?: number; +}; + +const story: Meta = { title: 'Layout/Flex', component: Flex, parameters: { ...CanvasFullLayout, ...DisableCartesianParam }, + argTypes: { + rowGap: { + control: 'number', + }, + columnGap: { + control: 'number', + }, + itemsCount: { + control: 'number', + }, + }, }; export default story; -type Story = StoryObj; +type Story = StoryObj; export const Playground: Story = { args: { gap: 'm', + itemsCount: 2, style: { height: '100%' }, }, - render: (args) => ( - - {Array.from({ length: 2 }, (_, index) => { + render: ({ itemsCount = 2, rowGap, columnGap, gap, ...args }) => ( + + {Array.from({ length: itemsCount }, (_, index) => { return ( & { ...props }: FlexProps) => { const withGaps = Children.count(children) > 1 && gap; - const [rowGap, columnGap] = calculateGap(withGaps ? gap : undefined); + const [rowGap, columnGap] = calculateGap(gap); return ( { ; ``` + +> **⚠️ Важное замечание о поддержке браузеров:** +> +> Современные браузеры (версии от): +> +> - Chrome 87+ +> - Edge 87+ +> - Safari 14.1+ +> - Firefox 66+ +> - Opera 73+ +> +> используют нативное `CSS` свойство `gap`. Для более старых версий браузеров автоматически применяется альтернативное решение с использованием `margin`. +> +> Рекомендации по использованию: +> +> При работе со старыми браузерами, где `gap` на flex-контейнерах не поддерживается, важно соблюдать следующее правило: +> +> ❌ Не используйте `React.Fragment `как обертку для дочерних элементов: +> +> ```jsx static +> +> +>
1
+>
2
+>
+>
+> ``` +> +> ✅ Правильный вариант - размещайте элементы напрямую внутри `Flex`: +> +> ```jsx static +> +>
1
+>
2
+>
+> ``` +> +> Это обеспечит корректную работу отступов между элементами во всех поддерживаемых браузерах.