@@ -2,137 +2,96 @@ import type { Meta, StoryObj } from "@storybook/nextjs";
22import { useState } from "react";
33
44import { Button } from "../Button";
5+ import { Text } from "../Text";
56import { BottomSheet } from "./BottomSheet";
6- import * as styles from "./BottomSheet.css";
77
8- const meta: Meta<typeof BottomSheet> = {
8+ const meta: Meta<typeof BottomSheet.Root > = {
99 title: "Components/BottomSheet",
10- component: BottomSheet,
10+ component: BottomSheet.Root ,
1111 tags: ["autodocs"],
12- argTypes: {
13- open: { table: { disable: true } },
14- title: { control: "text" },
15- trigger: { control: false },
16- footer: { control: false },
17- content: { control: false },
18- },
1912};
2013export default meta;
2114
22- type Story = StoryObj<typeof BottomSheet>;
15+ type Story = StoryObj<typeof BottomSheet.Root >;
2316
24- const BottomSheetWrapper = (
25- args: React.ComponentProps<typeof BottomSheet> & {
26- content?: React.ReactNode;
27- footer?: React.ReactNode;
28- }
29- ) => {
30- const [isOpen, setIsOpen] = useState(args.open || false);
17+ const BottomSheetWrapper = ({
18+ defaultOpen = false,
19+ title = "서비스 필수 이용 약관",
20+ bodyText = "회원님의 개인정보 보호를 위해 장기간 비밀번호를 유지 중인 경우 비밀번호 변경을 안내해 드리고 있습니다.",
21+ confirmText = "동의하고 계속하기",
22+ }: {
23+ defaultOpen?: boolean;
24+ title?: string;
25+ bodyText?: string;
26+ confirmText?: string;
27+ }) => {
28+ const [isOpen, setIsOpen] = useState(defaultOpen);
3129
3230 return (
33- <BottomSheet
34- {...args}
35- open={isOpen}
36- onOpenChange={setIsOpen}
37- trigger={
31+ <BottomSheet.Root open={isOpen} onOpenChange={setIsOpen}>
32+ <BottomSheet.Trigger>
3833 <Button variant='primary' onClick={() => setIsOpen(true)}>
3934 바텀시트 열기
4035 </Button>
41- }
42- content={args.content}
43- />
36+ </BottomSheet.Trigger>
37+
38+ <BottomSheet.Content>
39+ <BottomSheet.Title>
40+ <Text typo='title3Sb'>{title}</Text>
41+ </BottomSheet.Title>
42+
43+ <BottomSheet.Body>
44+ <Text>{bodyText}</Text>
45+ </BottomSheet.Body>
46+
47+ <BottomSheet.Footer>
48+ <Button size='fullWidth' onClick={() => setIsOpen(false)}>
49+ {confirmText}
50+ </Button>
51+ </BottomSheet.Footer>
52+ </BottomSheet.Content>
53+ </BottomSheet.Root>
4454 );
4555};
4656
4757export const Default: Story = {
48- render: args => (
58+ render: () => (
4959 <BottomSheetWrapper
50- {...args}
51- title='서비스 필수 이용약관'
52- footer={
53- <Button size='fullWidth' onClick={() => alert("동의합니다")}>
54- 동의하고 계속하기
55- </Button>
56- }
57- content={
58- <>
59- <h2 className={styles.sheetBodyTitle}>비밀번호를 변경해 안내 설명</h2>
60- <p className={styles.sheetBodyDescription}>
61- 회원님의 개인정보 보호를 위해 장기간 비밀번호를 유지 중인 경우
62- 비밀번호 변경을 안내해 드리고 있습니다. 회원님의 개인정보 보호를
63- 위해 장기간 비밀번호를 유지 중인 경우 비밀번호 변경을 안내해 드리고
64- 있습니다.회원님의 개인정보 보호를 위해 장기간 비밀번호를 유지 중인
65- 경우 비밀번호 변경을 안내해 드리고 있습니다.회원님의 개인정보 보호를
66- 위해 장기간 비밀번호를 유지 중인 경우 비밀번호 변경을 안내해 드리고
67- 있습니다.회원님의 개인정보 보호를 위해 장기간 비밀번호를 유지 중인
68- 경우 비밀번호 변경을 안내해 드리고 있습니다.회원님의 개인정보 보호를
69- 위해 장기간 비밀번호를 유지 중인 경우 비밀번호 변경을 안내해 드리고
70- 있습니다.회원님의 개인정보 보호를 위해 장기간 비밀번호를 유지 중인
71- 경우 비밀번호 변경을 안내해 드리고 있습니다.회원님의 개인정보 보호를
72- 위해 장기간 비밀번호를 유지 중인 경우 비밀번호 변경을 안내해 드리고
73- 있습니다.회원님의 개인정보 보호를 위해 장기간 비밀번호를 유지 중인
74- 경우 비밀번호 변경을 안내해 드리고 있습니다.회원님의 개인정보 보호를
75- 위해 장기간 비밀번호를 유지 중인 경우 비밀번호 변경을 안내해 드리고
76- 있습니다.회원님의 개인정보 보호를 위해 장기간 비밀번호를 유지 중인
77- 경우 비밀번호 변경을 안내해 드리고 있습니다.회원님의 개인정보 보호를
78- 위해 장기간 비밀번호를 유지 중인 경우 비밀번호 변경을 안내해 드리고
79- 있습니다.회원님의 개인정보 보호를 위해 장기간 비밀번호를 유지 중인
80- 경우 비밀번호 변경을 안내해 드리고 있습니다.회원님의 개인정보 보호를
81- 위해 장기간 비밀번호를 유지 중인 경우 비밀번호 변경을 안내해 드리고
82- 있습니다.회원님의 개인정보 보호를 위해 장기간 비밀번호를 유지 중인
83- 경우 비밀번호 변경을 안내해 드리고 있습니다.회원님의 개인정보 보호를
84- 위해 장기간 비밀번호를 유지 중인 경우 비밀번호 변경을 안내해 드리고
85- 있습니다.
86- </p>
87- </>
88- }
60+ defaultOpen={false}
61+ title='서비스 필수 이용 약관'
62+ bodyText={`회원님의 개인정보 보호를 위해 장기간 비밀번호를 유지 중인 경우 비밀번호 변경을 안내해 드리고 있습니다.
63+ 동일한 설명이 반복되어 내용이 길어지면, Body 영역에 scroll이 적용됩니다.`}
64+ confirmText='동의하고 계속하기'
8965 />
9066 ),
9167 parameters: {
9268 docs: {
9369 description: {
9470 story:
95- "버튼을 클릭하면 바텀시트가 열리고, 하단에 footer 버튼이 렌더링됩니다 .",
71+ "Trigger 버튼을 클릭하면 BottomSheet가 열리고 Title/Body/Footer가 표시됩니다 .",
9672 },
9773 },
9874 },
9975};
10076
10177export const Opened: Story = {
102- render: (args , { viewMode }) => {
78+ render: (_ , { viewMode }) => {
10379 const forceClosedInDocs = viewMode === "docs";
80+
10481 return (
10582 <BottomSheetWrapper
106- {...args}
107- open={forceClosedInDocs ? false : args.open}
83+ defaultOpen={!forceClosedInDocs}
10884 title='즉시 열리는 바텀시트'
109- footer={
110- <Button size='fullWidth' onClick={() => alert("닫기")}>
111- 확인
112- </Button>
113- }
114- content={
115- <>
116- <h2 className={styles.sheetBodyTitle}>
117- 비밀번호를 변경해 안내 설명
118- </h2>
119- <p className={styles.sheetBodyDescription}>
120- 회원님의 개인정보 보호를 위해 장기간 비밀번호를 유지 중인 경우
121- 비밀번호 변경을 안내해 드리고 있습니다.
122- </p>
123- </>
124- }
85+ bodyText='회원님의 개인정보 보호를 위해 장기간 비밀번호를 유지 중인 경우 비밀번호 변경을 안내해 드리고 있습니다.'
86+ confirmText='확인'
12587 />
12688 );
12789 },
128- args: {
129- open: true,
130- },
13190 parameters: {
13291 docs: {
13392 description: {
13493 story:
135- "Canvas에선 열린 상태로 시작되며, 하단에 버튼이 함께 표시됩니다 .",
94+ "Canvas에선 열린 상태로 시작되며, 닫기 버튼을 통해 닫을 수 있습니다 .",
13695 },
13796 },
13897 },
0 commit comments