Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions src/components/Flex/Flex.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ export default {
description: "교차축 정렬 방식",
},
gap: { control: "select", options: Object.keys(spacing || {}) },
padding: { control: "select", options: Object.keys(spacing || {}) },
className: { control: false },
},
args: {
Expand Down Expand Up @@ -106,6 +107,25 @@ export const Gaps: Story = {
args: {},
};

export const Padding: Story = {
render: (args) => (
<div>
<div>
<h4>padding: 16</h4>
<Flex {...args} padding="16" />
</div>
<div>
<h4>padding: 32</h4>
<Flex {...args} padding="32" />
</div>
</div>
),
argTypes: {
children: { control: false },
padding: { control: false },
},
};

export const Justify: Story = {
render: (args) => (
<div className={grid({ gridTemplateColumns: "repeat(2, 1fr)", gap: "24" })}>
Expand Down
14 changes: 14 additions & 0 deletions src/components/Flex/Flex.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,20 @@ describe("클래스 토큰 및 스타일", () => {
screen.getByRole("navigation", { name: `flex-gap-${gap}` }).className,
).toMatch(`gap_${gap}`);
});

const paddings = Object.keys(spacing || {}) as Spacing[];
test.each(paddings)("padding=%s이면 p_%s 클래스가 적용된다", (padding) => {
render(
<Flex as="nav" aria-label={`flex-padding-${padding}`} padding={padding}>
<span>child</span>
</Flex>,
);

expect(
screen.getByRole("navigation", { name: `flex-padding-${padding}` })
.className,
).toMatch(`p_${padding}`);
});
});

describe("Flex 접근성", () => {
Expand Down
5 changes: 4 additions & 1 deletion src/components/Flex/Flex.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ export interface FlexProps
as?: As;
/** 자식 간 간격 */
gap?: Spacing;
/** 안쪽 여백 */
padding?: Spacing;
/** ARIA 역할 */
role?: AriaRole;
}
Expand Down Expand Up @@ -54,6 +56,7 @@ export const Flex = ({
justify = "start",
align = "stretch",
gap,
padding,
className,
...rest
}: FlexProps) => {
Expand All @@ -68,7 +71,7 @@ export const Flex = ({
justify,
align,
}),
css({ gap }),
css({ gap, padding }),
className,
),
...rest,
Expand Down
22 changes: 22 additions & 0 deletions src/components/Grid/Grid.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ export default {
control: "select",
options: [undefined, ...Object.keys(spacing || {})],
},
padding: {
control: "select",
options: Object.keys(spacing || {}),
},
areas: { control: false },
className: { control: false },
},
Expand Down Expand Up @@ -128,6 +132,24 @@ export const Gaps: Story = {
},
};

export const Padding: Story = {
render: (args) => (
<div className={grid({ gridTemplateColumns: "1fr", gap: "16" })}>
<div>
<h4>padding: 16</h4>
<Grid {...args} padding="16" />
</div>
<div>
<h4>padding: 32</h4>
<Grid {...args} padding="32" />
</div>
</div>
),
argTypes: {
padding: { control: false },
},
};

export const GridItemSpan: Story = {
render: (args) => (
<Grid
Expand Down
15 changes: 15 additions & 0 deletions src/components/Grid/Grid.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,21 @@ describe("Grid 클래스 토큰 및 스타일", () => {
expect(screen.getByTestId(`grid-gap-${gap}`)).toHaveClass(`gap_${gap}`);
});

const paddings = Object.keys(spacing || {}) as Spacing[];
test.each(paddings)(
`padding=%s 적용 시 알맞은 클래스가 적용된다`,
(padding) => {
render(
<Grid data-testid={`grid-padding-${padding}`} padding={padding}>
<GridItem>child</GridItem>
</Grid>,
);
expect(screen.getByTestId(`grid-padding-${padding}`)).toHaveClass(
`p_${padding}`,
);
},
);

test("areas가 문자열로 전달되면 CSS 변수가 적용된다", () => {
render(
<Grid
Expand Down
4 changes: 4 additions & 0 deletions src/components/Grid/Grid.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ export interface GridProps
gridTemplateRows?: string;
/** 자식 간 간격 */
gap?: Spacing;
/** 안쪽 여백 */
padding?: Spacing;
/** 영역 이름 (grid-template-areas, GridItem.gridArea와 함께 사용) */
areas?: Areas;
/** 자동 배치 흐름 (grid-auto-flow) */
Expand Down Expand Up @@ -73,6 +75,7 @@ export const Grid = ({
gridTemplateColumns,
gridTemplateRows,
gap,
padding,
areas,
autoFlow = "row",
justifyItems = "stretch",
Expand All @@ -97,6 +100,7 @@ export const Grid = ({
}),
css({
gap,
padding,
gridTemplateAreas: "var(--grid-template-areas, none)",
gridTemplateColumns: "var(--grid-template-columns, none)",
gridTemplateRows: "var(--grid-template-rows, none)",
Expand Down
20 changes: 20 additions & 0 deletions src/components/HStack/HStack.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export default {
argTypes: {
children: { control: false },
gap: { control: "select", options: Object.keys(spacing || {}) },
padding: { control: "select", options: Object.keys(spacing || {}) },
className: { control: false },
role: { control: "text" },
},
Expand Down Expand Up @@ -75,6 +76,25 @@ export const Gaps: Story = {
},
};

export const Padding: Story = {
render: (args) => (
<VStack gap="24">
<div>
<h4>padding: 16</h4>
<HStack {...args} padding="16" className={css({ width: "400" })} />
</div>
<div>
<h4>padding: 32</h4>
<HStack {...args} padding="32" className={css({ width: "400" })} />
</div>
</VStack>
),
argTypes: {
children: { control: false },
padding: { control: false },
},
};

export const Reverse: Story = {
render: (args) => (
<VStack gap="24">
Expand Down
13 changes: 13 additions & 0 deletions src/components/HStack/HStack.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,19 @@ describe("클래스 토큰 및 스타일", () => {
expect(screen.getByTestId("gap").className).toMatch(className);
},
);

const paddings = Object.keys(spacing || {}) as Spacing[];
test.each(paddings.map((padding) => [padding, `p_${padding}`]))(
"padding=%s이면 %s 클래스가 적용된다",
(padding, className) => {
render(
<HStack data-testid="padding" padding={padding}>
<span>child</span>
</HStack>,
);
expect(screen.getByTestId("padding").className).toMatch(className);
},
);
});

describe("HStack 접근성", () => {
Expand Down
2 changes: 2 additions & 0 deletions src/components/HStack/HStack.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ export const HStack = ({
align = "center",
reversed = false,
gap,
padding,
className,
...rest
}: HStackProps) => {
Expand All @@ -57,6 +58,7 @@ export const HStack = ({
justify={justifyContent}
align={alignContent}
gap={gap}
padding={padding}
className={className}
{...rest}
>
Expand Down
21 changes: 20 additions & 1 deletion src/components/VStack/VStack.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export default {
argTypes: {
children: { control: false },
gap: { control: "select", options: Object.keys(spacing || {}) },
padding: { control: "select", options: Object.keys(spacing || {}) },
className: { control: false },
role: { control: "text" },
},
Expand All @@ -45,7 +46,7 @@ export default {
<Item>아이템 2</Item>
</>
),
className: css({ width: "120", height: "160" }),
className: css({ height: "160" }),
},
} satisfies Meta<typeof VStack>;

Expand Down Expand Up @@ -74,6 +75,24 @@ export const Gaps: Story = {
},
};

export const Padding: Story = {
render: (args) => (
<HStack gap="24">
<div>
<h4>padding: 16</h4>
<VStack {...args} padding="16" />
</div>
<div>
<h4>padding: 32</h4>
<VStack {...args} padding="32" />
</div>
</HStack>
),
argTypes: {
padding: { control: false },
},
};

export const Reverse: Story = {
render: (args) => (
<HStack gap="24">
Expand Down
13 changes: 13 additions & 0 deletions src/components/VStack/VStack.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,19 @@ describe("클래스 토큰 및 스타일", () => {
expect(screen.getByTestId("gap").className).toMatch(className);
},
);

const paddings = Object.keys(spacing || {}) as Spacing[];
test.each(paddings.map((padding) => [padding, `p_${padding}`]))(
"padding=%s이면 %s 클래스가 적용된다",
(padding, className) => {
render(
<VStack data-testid="padding" padding={padding}>
<span>child</span>
</VStack>,
);
expect(screen.getByTestId("padding").className).toMatch(className);
},
);
});

describe("VStack 접근성", () => {
Expand Down
2 changes: 2 additions & 0 deletions src/components/VStack/VStack.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ export const VStack = ({
align = "center",
reversed = false,
gap,
padding,
className,
...rest
}: VStackProps) => {
Expand All @@ -61,6 +62,7 @@ export const VStack = ({
justify={justifyContent}
align={alignContent}
gap={gap}
padding={padding}
className={className}
{...rest}
>
Expand Down
Loading