Skip to content

Commit 6474c9f

Browse files
authored
feat(components/Modal): import components via Modal.Header, Modal.Body, Modal.Footer
1 parent 40885c7 commit 6474c9f

File tree

4 files changed

+68
-57
lines changed

4 files changed

+68
-57
lines changed

packages/components/src/components/Modal/Modal.mdx

+10-21
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,7 @@ Modal is a window that appears in front of app content to provide critical
1717
information or ask for a decision.
1818

1919
```tsx
20-
import {
21-
Modal,
22-
ModalHeader,
23-
ModalContent,
24-
ModalFooter,
25-
} from '@koobiq/react-components';
20+
import { Modal } from '@koobiq/react-components';
2621
```
2722

2823
<Story of={Stories.Base} />
@@ -35,9 +30,9 @@ import {
3530

3631
The component has the following helper components:
3732

38-
- `ModalHeader` — header of the modal window
39-
- `ModalContent`content area of the component for placing the main information
40-
- `ModalFooter` — footer of the component, can contain various actions.
33+
- `Modal.Header` — header of the modal window
34+
- `Modal.Body`body of the component for placing the main information
35+
- `Modal.Footer` — footer of the component, can contain various actions.
4136

4237
## Usage
4338

@@ -59,22 +54,16 @@ The `children` prop can be `ReactNode` or a render function with the `ModalPropC
5954
The render function can help pass a function to close the modal window.
6055

6156
```tsx
62-
import {
63-
Button,
64-
Modal,
65-
ModalHeader,
66-
ModalContent,
67-
ModalFooter,
68-
} from '@koobiq/react-components';
57+
import { Button, Modal } from '@koobiq/react-components';
6958

7059
<Modal control={(props) => <Button {...props}>Open</Button>}>
7160
{({ close }) => (
7261
<>
73-
<ModalHeader>Title</ModalHeader>
74-
<ModalContent>Content</ModalContent>
75-
<ModalFooter>
76-
<Button onClick={close}>Close</Button>
77-
</ModalFooter>
62+
<Modal.Header>Title</Modal.Header>
63+
<Modal.Body>Content</Modal.Body>
64+
<Modal.Footer>
65+
<Button onPress={close}>Close</Button>
66+
</Modal.Footer>
7867
</>
7968
)}
8069
</Modal>;

packages/components/src/components/Modal/Modal.stories.tsx

+26-28
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,17 @@ import { spacing } from '../layout';
88
import { Textarea } from '../Textarea';
99
import { Toggle } from '../Toggle';
1010

11-
import {
12-
Modal,
13-
ModalContent,
14-
ModalFooter,
15-
ModalHeader,
16-
type ModalProps,
17-
} from './index';
11+
import { Modal, type ModalProps } from './index';
1812
import { modalPropSize } from './index.js';
1913

2014
const meta = {
2115
title: 'Components/Modal',
2216
component: Modal,
23-
subcomponents: { ModalHeader, ModalContent, ModalFooter },
17+
subcomponents: {
18+
'Modal.Header': Modal.Header,
19+
'Modal.Body': Modal.Body,
20+
'Modal.Footer': Modal.Footer,
21+
},
2422
parameters: {
2523
layout: 'centered',
2624
},
@@ -39,8 +37,8 @@ export const Base: Story = {
3937
>
4038
{({ close }) => (
4139
<>
42-
<ModalHeader>Create access group</ModalHeader>
43-
<ModalContent>
40+
<Modal.Header>Create access group</Modal.Header>
41+
<Modal.Body>
4442
<Input
4543
label="Name"
4644
placeholder="Enter a name"
@@ -53,13 +51,13 @@ export const Base: Story = {
5351
label="Description"
5452
rows={3}
5553
/>
56-
</ModalContent>
57-
<ModalFooter>
54+
</Modal.Body>
55+
<Modal.Footer>
5856
<Button onPress={close}>Ok</Button>
59-
<Button variant="fade-contrast-filled" onPress={close}>
57+
<Button onPress={close} variant="fade-contrast-filled">
6058
Cancel
6159
</Button>
62-
</ModalFooter>
60+
</Modal.Footer>
6361
</>
6462
)}
6563
</Modal>
@@ -80,11 +78,11 @@ export const Size: Story = {
8078
>
8179
{({ close }) => (
8280
<>
83-
<ModalHeader>I have a {size} size</ModalHeader>
84-
<ModalContent>But there&#39;s nothing to say…</ModalContent>
85-
<ModalFooter>
81+
<Modal.Header>I have a {size} size</Modal.Header>
82+
<Modal.Body>But there&#39;s nothing to say…</Modal.Body>
83+
<Modal.Footer>
8684
<Button onPress={close}>Ok</Button>
87-
</ModalFooter>
85+
</Modal.Footer>
8886
</>
8987
)}
9088
</Modal>
@@ -103,8 +101,8 @@ export const ControlledOpen: Story = {
103101
<>
104102
<Button onPress={on}>Open</Button>
105103
<Modal open={open} size="small" onOpenChange={set} {...args}>
106-
<ModalHeader>Create access group</ModalHeader>
107-
<ModalContent>
104+
<Modal.Header>Create access group</Modal.Header>
105+
<Modal.Body>
108106
<Input
109107
label="Name"
110108
placeholder="Enter a name"
@@ -117,13 +115,13 @@ export const ControlledOpen: Story = {
117115
label="Description"
118116
rows={3}
119117
/>
120-
</ModalContent>
121-
<ModalFooter>
118+
</Modal.Body>
119+
<Modal.Footer>
122120
<Button onPress={off}>Ok</Button>
123121
<Button variant="fade-contrast-filled" onPress={off}>
124122
Cancel
125123
</Button>
126-
</ModalFooter>
124+
</Modal.Footer>
127125
</Modal>
128126
</>
129127
);
@@ -152,8 +150,8 @@ export const Settings: Story = {
152150
>
153151
{({ close }) => (
154152
<>
155-
<ModalHeader>Adjust me</ModalHeader>
156-
<ModalContent>
153+
<Modal.Header>Adjust me</Modal.Header>
154+
<Modal.Body>
157155
<FlexBox gap="l" direction="column">
158156
<Toggle
159157
checked={hideBackdrop}
@@ -180,10 +178,10 @@ export const Settings: Story = {
180178
Disable the exit by pressing ESC key
181179
</Toggle>
182180
</FlexBox>
183-
</ModalContent>
184-
<ModalFooter>
181+
</Modal.Body>
182+
<Modal.Footer>
185183
<Button onPress={close}>Ok</Button>
186-
</ModalFooter>
184+
</Modal.Footer>
187185
</>
188186
)}
189187
</Modal>

packages/components/src/components/Modal/Modal.tsx

+15-2
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ import { Transition } from 'react-transition-group';
1313

1414
import { Backdrop } from '../Backdrop';
1515
import { Dialog, type DialogProps } from '../Dialog';
16+
import { DialogHeader, DialogFooter, DialogContent } from '../Dialog';
1617

1718
import s from './Modal.module.css';
1819
import type { ModalProps, ModalRef } from './types';
1920

20-
export const Modal = forwardRef<ModalRef, ModalProps>((props, ref) => {
21+
const ModalComponent = forwardRef<ModalRef, ModalProps>((props, ref) => {
2122
const {
2223
size = 'medium',
2324
hideCloseButton = false,
@@ -144,4 +145,16 @@ export const Modal = forwardRef<ModalRef, ModalProps>((props, ref) => {
144145
);
145146
});
146147

147-
Modal.displayName = 'Modal';
148+
ModalComponent.displayName = 'Modal';
149+
150+
type CompoundedComponent = typeof ModalComponent & {
151+
Header: typeof DialogHeader;
152+
Body: typeof DialogContent;
153+
Footer: typeof DialogFooter;
154+
};
155+
156+
export const Modal = ModalComponent as CompoundedComponent;
157+
158+
Modal.Header = DialogHeader;
159+
Modal.Body = DialogContent;
160+
Modal.Footer = DialogFooter;
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
1+
import { DialogHeader, DialogFooter, DialogContent } from '../Dialog';
2+
13
export * from './Modal';
24
export * from './types';
3-
export { DialogHeader, DialogFooter, DialogContent } from '../Dialog';
45

5-
export {
6-
DialogHeader as ModalHeader,
7-
DialogContent as ModalContent,
8-
DialogFooter as ModalFooter,
9-
} from '../Dialog';
6+
/**
7+
* @deprecated
8+
* This component has been deprecated, please use `Modal.Header` instead.
9+
*/
10+
export const ModalHeader = DialogHeader;
11+
/**
12+
* @deprecated
13+
* This component has been deprecated, please use `Modal.Body` instead.
14+
*/
15+
export const ModalContent = DialogContent;
16+
/**
17+
* @deprecated
18+
* This component has been deprecated, please use `Modal.Footer` instead.
19+
*/
20+
export const ModalFooter = DialogFooter;

0 commit comments

Comments
 (0)