Skip to content

Commit b806ae5

Browse files
feat(Box): add system paddings (#9388)
* feat(Box): add system paddings * fix: fix tests * fix: refactor system padding logic
1 parent 5724613 commit b806ae5

File tree

8 files changed

+52
-8
lines changed

8 files changed

+52
-8
lines changed

packages/vkui/src/components/Box/Box.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ type Story = StoryObj<BoxProps>;
1919
export const Playground: Story = {
2020
args: {},
2121
render: (args) => (
22-
<Box padding="4xl" {...args} style={{ background: 'grey' }}>
22+
<Box padding="system" {...args} style={{ background: 'grey' }}>
2323
{Array.from({ length: 5 }, (_, index) => {
2424
return <Avatar key={index} />;
2525
})}

packages/vkui/src/lib/layouts/layoutProps.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const CSS_INTRINSIC_KEYWORDS: CSSIntrinsicSizingKeywords[] = [
2626
const CSS_GLOBAL_KEYWORDS: CSSGlobalValue[] = ['inherit', 'initial', 'unset'];
2727

2828
const CSS_KEYWORDS = [...CSS_INTRINSIC_KEYWORDS, ...CSS_GLOBAL_KEYWORDS];
29-
const PADDING_VALUES = [...DESIGN_SYSTEM_SIZES, ...CSS_GLOBAL_KEYWORDS];
29+
const PADDING_VALUES = [...DESIGN_SYSTEM_SIZES, ...CSS_GLOBAL_KEYWORDS, 'system'];
3030
const SIZE_VALUES = CSS_KEYWORDS;
3131
const MINMAX_SIZE_VALUES = [...CSS_KEYWORDS.filter((opt) => opt !== 'auto')];
3232
const FLEX_VALUES = CSS_GLOBAL_KEYWORDS;
@@ -42,6 +42,9 @@ const OVERFLOW_VALUES: OverflowValue[] = [
4242
...CSS_GLOBAL_KEYWORDS,
4343
];
4444

45+
export const SYSTEM_PADDING_VERTICAL = 'var(--vkui--size_base_padding_vertical--regular)';
46+
export const SYSTEM_PADDING_HORIZONTAL = 'var(--vkui--size_base_padding_horizontal--regular)';
47+
4548
export const LAYOUT_PROPS = {
4649
padding: PADDING_VALUES,
4750
paddingInline: PADDING_VALUES,

packages/vkui/src/lib/layouts/resolveLayoutProps.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ describe('resolveLayoutProps', () => {
4343
});
4444

4545
it('should handle string values from predefined list (position)', () => {
46-
const props = { position: 'absolute' };
46+
const props = { position: 'absolute' as const };
4747
const result = resolveLayoutProps(props);
4848

4949
expect(result).toEqual({

packages/vkui/src/lib/layouts/resolveLayoutProps.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ import { classNames } from '@vkontakte/vkjs';
22
import { mergeStyle } from '../../helpers/mergeStyle';
33
import { generateConstantClassName, generateVariable, generateVariableClassName } from './helpers';
44
import { LAYOUT_PROPS, type LayoutPropKeys } from './layoutProps';
5+
import type { LayoutProps } from './types';
56

6-
export type ComponentProps = {
7+
export type ComponentProps = Partial<LayoutProps> & {
78
className?: string;
89
style?: React.CSSProperties;
10+
} & {
911
[key: string]: unknown;
1012
};
1113

packages/vkui/src/lib/layouts/types.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ export type PositionValue = 'static' | 'relative' | 'absolute' | 'fixed' | 'stic
1414
export type OverflowValue = 'visible' | 'hidden' | 'clip' | 'scroll' | 'auto' | CSSGlobalValue;
1515

1616
// Тип для отступов
17-
export type PaddingProp = LiteralUnion<DesignSystemSize | CSSGlobalValue, number | string>;
17+
export type PaddingProp = LiteralUnion<
18+
DesignSystemSize | CSSGlobalValue | 'system',
19+
number | string
20+
>;
1821

1922
// Типы для параметров позиционирования
2023
export type InsetProp = LiteralUnion<DesignSystemSize | CSSGlobalValue | 'auto', number | string>;

tools/postcss-layout-classes/index.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ module.exports = () => {
6060
const {
6161
LAYOUT_PROPS,
6262
DESIGN_SYSTEM_SIZES,
63+
SYSTEM_PADDING_VERTICAL,
64+
SYSTEM_PADDING_HORIZONTAL,
6365
generateConstantClassName,
6466
generateVariableClassName,
6567
generateVariable,
@@ -82,16 +84,28 @@ module.exports = () => {
8284
values.forEach((value) => {
8385
const className = `.${generateConstantClassName(cssProperty, value)}`;
8486

87+
const getValue = () => {
88+
if (cssProperty.startsWith('padding') && value === 'system') {
89+
if (cssProperty.startsWith('padding-block')) {
90+
return SYSTEM_PADDING_VERTICAL;
91+
} else if (cssProperty.startsWith('padding-inline')) {
92+
return SYSTEM_PADDING_HORIZONTAL;
93+
}
94+
return `${SYSTEM_PADDING_VERTICAL} ${SYSTEM_PADDING_HORIZONTAL}`;
95+
}
96+
return DESIGN_SYSTEM_SIZES.includes(value)
97+
? `var(--vkui--spacing_size_${value})`
98+
: value;
99+
};
100+
85101
root.append({
86102
selector: className,
87103
raws: { semicolon: true },
88104
source: root.source,
89105
nodes: [
90106
{
91107
prop: cssProperty,
92-
value: DESIGN_SYSTEM_SIZES.includes(value)
93-
? `var(--vkui--spacing_size_${value})`
94-
: value,
108+
value: getValue(),
95109
source: root.source,
96110
},
97111
],

tools/postcss-layout-classes/postcss-layout-classes.test.js.snapshot

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ exports[`generate layout classes 1`] = `
3535
.vkui-padding-unset {
3636
padding: unset;
3737
}
38+
.vkui-padding-system {
39+
padding: var(--vkui--size_base_padding_vertical--regular) var(--vkui--size_base_padding_horizontal--regular);
40+
}
3841
.vkui-padding {
3942
padding: var(--vkui_internal--padding);
4043
}
@@ -74,6 +77,9 @@ exports[`generate layout classes 1`] = `
7477
.vkui-padding-inline-unset {
7578
padding-inline: unset;
7679
}
80+
.vkui-padding-inline-system {
81+
padding-inline: var(--vkui--size_base_padding_horizontal--regular);
82+
}
7783
.vkui-padding-inline {
7884
padding-inline: var(--vkui_internal--padding-inline);
7985
}
@@ -113,6 +119,9 @@ exports[`generate layout classes 1`] = `
113119
.vkui-padding-block-unset {
114120
padding-block: unset;
115121
}
122+
.vkui-padding-block-system {
123+
padding-block: var(--vkui--size_base_padding_vertical--regular);
124+
}
116125
.vkui-padding-block {
117126
padding-block: var(--vkui_internal--padding-block);
118127
}
@@ -152,6 +161,9 @@ exports[`generate layout classes 1`] = `
152161
.vkui-padding-inline-start-unset {
153162
padding-inline-start: unset;
154163
}
164+
.vkui-padding-inline-start-system {
165+
padding-inline-start: var(--vkui--size_base_padding_horizontal--regular);
166+
}
155167
.vkui-padding-inline-start {
156168
padding-inline-start: var(--vkui_internal--padding-inline-start);
157169
}
@@ -191,6 +203,9 @@ exports[`generate layout classes 1`] = `
191203
.vkui-padding-inline-end-unset {
192204
padding-inline-end: unset;
193205
}
206+
.vkui-padding-inline-end-system {
207+
padding-inline-end: var(--vkui--size_base_padding_horizontal--regular);
208+
}
194209
.vkui-padding-inline-end {
195210
padding-inline-end: var(--vkui_internal--padding-inline-end);
196211
}
@@ -230,6 +245,9 @@ exports[`generate layout classes 1`] = `
230245
.vkui-padding-block-start-unset {
231246
padding-block-start: unset;
232247
}
248+
.vkui-padding-block-start-system {
249+
padding-block-start: var(--vkui--size_base_padding_vertical--regular);
250+
}
233251
.vkui-padding-block-start {
234252
padding-block-start: var(--vkui_internal--padding-block-start);
235253
}
@@ -269,6 +287,9 @@ exports[`generate layout classes 1`] = `
269287
.vkui-padding-block-end-unset {
270288
padding-block-end: unset;
271289
}
290+
.vkui-padding-block-end-system {
291+
padding-block-end: var(--vkui--size_base_padding_vertical--regular);
292+
}
272293
.vkui-padding-block-end {
273294
padding-block-end: var(--vkui_internal--padding-block-end);
274295
}

website/content/components/box.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ description: Универсальный компонент для создани
4444

4545
- токены дизайн-системы VKUI (`'2xs', 'xs', 's', 'm', 'l', 'xl', '2xl', '3xl', '4xl'`);
4646
- стандартные CSS-значения (`'inherit'`, `'initial'`, `'unset'`);
47+
- специальное значение `'system'` — автоматически устанавливает системные отступы VKUI (эквивалентно использованию `--vkui--size_base_padding_vertical--regular` и `--vkui--size_base_padding_horizontal--regular`);
4748
- числовые значения (будут преобразованы в пиксели);
4849
- любое валидное строковое значение (`"2rem", "10%"`, CSS-переменные).
4950

0 commit comments

Comments
 (0)