Skip to content

Commit e3a9937

Browse files
[PLAY-1744] Drawer Kit Refactor (#4028)
**What does this PR do?** A clear and concise description with your runway ticket url. **Screenshots:** Screenshots to visualize your addition/change **How to test?** Steps to confirm the desired behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See addition/change #### Checklist: - [ ] **LABELS** Add a label: `enhancement`, `bug`, `improvement`, `new kit`, `deprecated`, or `breaking`. See [Changelog & Labels](https://github.com/powerhome/playbook/wiki/Changelog-&-Labels) for details. - [ ] **DEPLOY** I have added the `milano` label to show I'm ready for a review. - [ ] **TESTS** I have added test coverage to my code.
1 parent b4c2e7f commit e3a9937

16 files changed

+536
-581
lines changed

playbook/app/pb_kits/playbook/pb_drawer/_drawer.scss

Lines changed: 145 additions & 183 deletions
Large diffs are not rendered by default.

playbook/app/pb_kits/playbook/pb_drawer/_drawer.tsx

Lines changed: 158 additions & 268 deletions
Large diffs are not rendered by default.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import React from 'react'
2+
3+
const noop = (): void => void 0
4+
5+
type DrawerContextType = {
6+
onClose: () => void
7+
}
8+
9+
export const DrawerContext = React.createContext<DrawerContextType>({
10+
onClose: noop,
11+
})
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import React, { useState } from "react"
2+
import { Button, Drawer, Flex } from "playbook-ui"
3+
4+
const useDrawer = (visible = false) => {
5+
const [opened, setOpened] = useState(visible)
6+
const toggle = () => setOpened(!opened)
7+
8+
return [opened, toggle]
9+
}
10+
11+
const DrawerBehavior = () => {
12+
const [drawerOpen, toggleDrawerOpen] = useDrawer()
13+
14+
return (
15+
<>
16+
<Flex wrap>
17+
<Button id='sm'
18+
marginRight='md'
19+
onClick={toggleDrawerOpen}
20+
>
21+
{"Push Behavior"}
22+
</Button>
23+
</Flex>
24+
<Flex>
25+
<Drawer
26+
behavior={"push"}
27+
onClose={toggleDrawerOpen}
28+
opened={drawerOpen}
29+
size={"lg"}
30+
>
31+
Test me (Push Behavior)
32+
</Drawer>
33+
</Flex>
34+
</>
35+
)
36+
}
37+
38+
export default DrawerBehavior

playbook/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.jsx

Lines changed: 3 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,15 @@ const DrawerBorders = () => {
66
const [openedBRightDrawer, setOpenedBRightDrawer] = useState(false);
77
const [openedBLeftDrawer, setOpenedBLeftDrawer] = useState(false);
88
const [openedBFullDrawer, setOpenedBFullDrawer] = useState(false);
9-
const [openedBDefaultDrawer, setOpenedBDefaultDrawer] = useState(false);
10-
const [openedBRoundedDrawer, setOpenedBRoundedDrawer] = useState(false);
119

1210
// Toggle functions for each drawer
1311
const toggleBRightDrawer = () => setOpenedBRightDrawer(!openedBRightDrawer);
1412
const toggleBLeftDrawer = () => setOpenedBLeftDrawer(!openedBLeftDrawer);
1513
const toggleBFullDrawer = () => setOpenedBFullDrawer(!openedBFullDrawer);
16-
const toggleBDefaultDrawer = () => setOpenedBDefaultDrawer(!openedBDefaultDrawer);
17-
const toggleBRoundedDrawer = () => setOpenedBRoundedDrawer(!openedBRoundedDrawer);
1814

1915
return (
2016
<>
21-
<Flex padding="md"
17+
<Flex
2218
wrap
2319
>
2420
<Button marginRight="md"
@@ -36,23 +32,12 @@ const DrawerBorders = () => {
3632
>
3733
Drawer with border full
3834
</Button>
39-
<Button marginRight="md"
40-
onClick={toggleBDefaultDrawer}
41-
>
42-
Default Drawer
43-
</Button>
44-
<Button marginRight="md"
45-
onClick={toggleBRoundedDrawer}
46-
>
47-
Rounded Drawer
48-
</Button>
4935
</Flex>
5036

5137
{/* Drawers for each size */}
5238
<Drawer
5339
behavior="float"
5440
border="right"
55-
fullHeight
5641
onClose={toggleBRightDrawer}
5742
opened={openedBRightDrawer}
5843
overlay={false}
@@ -64,52 +49,25 @@ const DrawerBorders = () => {
6449
<Drawer
6550
behavior="float"
6651
border="left"
67-
fullHeight
6852
onClose={toggleBLeftDrawer}
6953
opened={openedBLeftDrawer}
7054
overlay={false}
71-
placement="right"
55+
placement="left"
7256
size="lg"
7357
>
7458
This is a Drawer with border left
7559
</Drawer>
7660
<Drawer
7761
behavior="float"
7862
border="full"
79-
fullHeight
8063
onClose={toggleBFullDrawer}
8164
opened={openedBFullDrawer}
8265
overlay={false}
83-
placement="right"
66+
placement="left"
8467
size="lg"
8568
>
8669
This is a Drawer with border full
8770
</Drawer>
88-
<Drawer
89-
behavior="float"
90-
fullHeight
91-
onClose={toggleBDefaultDrawer}
92-
opened={openedBDefaultDrawer}
93-
overlay={false}
94-
placement="right"
95-
size="lg"
96-
>
97-
This is a Default Drawer
98-
</Drawer>
99-
<Drawer
100-
behavior="float"
101-
borderRadius="rounded"
102-
fullHeight
103-
onClose={toggleBRoundedDrawer}
104-
opened={openedBRoundedDrawer}
105-
overlay={false}
106-
placement="right"
107-
size="lg"
108-
>
109-
<div style={{ paddingTop: '100px', paddingLeft: '12px' }}>
110-
This is a Rounded Drawer
111-
</div>
112-
</Drawer>
11371
</>
11472
);
11573
};

playbook/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.jsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ const DrawerBreakpoints = () => {
2626
<Drawer
2727
behavior={"push"}
2828
breakpoint="sm"
29-
fullHeight
3029
onClose={toggleSmallDrawer}
3130
opened={smallDrawerOpened}
3231
overlay={false}

playbook/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.jsx

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,47 +9,40 @@ const useDrawer = (visible = false) => {
99
};
1010

1111
const DrawerDefault = () => {
12-
const [headerSeparatorDrawerOpened, toggleHeaderSeparatorDrawer] = useDrawer();
13-
const [bothSeparatorsDrawerOpened, toggleBothSeparatorsDrawer] = useDrawer();
12+
const [drawerLeftOpen, toggleDrawerLeftOpen] = useDrawer();
13+
const [drawerRightOpen, toggleDrawerRightOpen ] = useDrawer();
1414

1515
return (
1616
<>
1717
<Flex wrap>
1818
<Button
1919
id="sm"
2020
marginRight="md"
21-
onClick={toggleHeaderSeparatorDrawer}
21+
onClick={toggleDrawerLeftOpen}
2222
>
2323
{"Left Drawer"}
2424
</Button>
2525
<Button
2626
marginRight="xl"
27-
onClick={toggleBothSeparatorsDrawer}
27+
onClick={toggleDrawerRightOpen}
2828
>
2929
{"Right Drawer"}
3030
</Button>
3131
</Flex>
3232
<Flex>
3333
{/* Left Drawer */}
3434
<Drawer
35-
behavior={"push"}
36-
fullHeight
37-
onClose={toggleHeaderSeparatorDrawer}
38-
opened={headerSeparatorDrawerOpened}
39-
overlay
40-
placement={"left"}
35+
onClose={toggleDrawerLeftOpen}
36+
opened={drawerLeftOpen}
4137
size={"lg"}
4238
>
4339
Test me (Left Drawer)
4440
</Drawer>
4541

4642
{/* Right Drawer */}
4743
<Drawer
48-
behavior={"push"}
49-
fullHeight
50-
onClose={toggleBothSeparatorsDrawer}
51-
opened={bothSeparatorsDrawerOpened}
52-
overlay
44+
onClose={toggleDrawerRightOpen}
45+
opened={drawerRightOpen}
5346
placement={"right"}
5447
size={"lg"}
5548
>
@@ -60,4 +53,4 @@ const DrawerDefault = () => {
6053
);
6154
};
6255

63-
export default DrawerDefault;
56+
export default DrawerDefault;
Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,56 @@
1-
import React from "react";
2-
import { Button, Drawer, Icon, Title } from "playbook-ui";
1+
import React, { useState, useEffect } from "react"
2+
import { Button, Drawer, Icon, Nav, NavItem } from "playbook-ui"
33

44
const DrawerMenu = () => {
5+
const [isSmallScreen, setIsSmallScreen] = useState(false)
6+
7+
useEffect(() => {
8+
const mediaQuery = window.matchMedia("(max-width: 600px)")
9+
setIsSmallScreen(mediaQuery.matches)
10+
const handler = (e) => setIsSmallScreen(e.matches)
11+
mediaQuery.addEventListener('change', handler)
12+
return () => mediaQuery.removeEventListener('change', handler)
13+
}, [])
514

615
return (
7-
<>
8-
<Button id="menuButton"
9-
padding="sm"
16+
<div>
17+
<Button id='menuButton'
18+
padding='xs'
1019
>
11-
<Icon icon="bars"
12-
size="3x"
20+
<Icon icon='bars'
21+
size='2x'
1322
/>
1423
</Button>
1524
<Drawer
16-
behavior="push"
17-
closeBreakpoint="md"
18-
menuButtonID="menuButton"
19-
overlay={false}
20-
placement="left"
21-
size="lg"
25+
breakpoint="md"
26+
placement='bottom'
27+
size='full'
28+
triggerId='menuButton'
2229
withinElement
2330
>
24-
<Title paddingBottom="md">A really neat menu</Title>
25-
<Button text="This Button does nothing" />
31+
<Nav
32+
highlight={false}
33+
link='#'
34+
orientation={isSmallScreen ? 'vertical' : 'horizontal'}
35+
padding={isSmallScreen ? 'none' : 'sm'}
36+
>
37+
<NavItem link='#'
38+
text='About'
39+
/>
40+
<NavItem active
41+
link='#'
42+
text='Case Studies'
43+
/>
44+
<NavItem link='#'
45+
text='Service'
46+
/>
47+
<NavItem link='#'
48+
text='Contacts'
49+
/>
50+
</Nav>
2651
</Drawer>
27-
</>
28-
);
29-
};
52+
</div>
53+
)
54+
}
3055

31-
export default DrawerMenu;
56+
export default DrawerMenu
Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,24 @@
1-
Our drawer kit can fulfill your responsive menu needs! Using the `closeBreakpoint` prop you can have the menu close on smaller screens like phones/tablets.
1+
The Drawer component can be used to create responsive navigation menus and sidebars. It provides flexible options for controlling when and how the drawer appears based on screen size.
2+
3+
### Within Element
4+
The `withinElement` prop allows you to render the drawer within its parent container:
5+
- The drawer will be positioned relative to its parent element
6+
- Useful for creating nested navigation structures
7+
- This must be used in conjunction with the `triggerId` prop
8+
9+
This provides a clean way to create responsive navigation patterns that adapt to different screen sizes while maintaining a consistent user experience.
10+
11+
### Trigger Id
12+
The `triggerId` prop allows you to connect an element to control the drawer:
13+
- The specified element will toggle the drawer open/closed
14+
- The element is automatically hidden when the drawer is opened via breakpoint
15+
- The element reappears when the drawer is closed via breakpoint
16+
17+
### Breakpoint
18+
Use the `breakpoint` prop to control when the drawer automatically opens or closes based on screen size. For example, setting `breakpoint="md"` will:
19+
- Close the drawer on screens smaller than the medium breakpoint (992px)
20+
- Automatically open the drawer on screens larger than or equal to the medium breakpoint
21+
222

3-
Set a menu button with the `menuButtonID` props. When the Drawer is open, the menu button will be hidden. But when your Brakpoint closes the drawer, you can toggle the Drawer open/close with your menu butotn.
423

5-
Also use the `withinElement` props to have the Drawer open within a specific element, instead of the default behavior of it taking up the entire screen size.
624

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
1-
import React, { useState } from "react";
2-
import { Button, Drawer, Flex } from "playbook-ui";
1+
import React, { useState } from "react"
2+
import { Button, Drawer, Flex } from "playbook-ui"
33

44
const DrawerSizes = () => {
55
// Individual state variables for each drawer size
6-
const [openedNoOverlayDrawer, setOpenedNoOverlayDrawer] = useState(false);
7-
const [openedOverlayDrawer, setOpenedOverlayDrawer] = useState(false);
6+
const [openedNoOverlayDrawer, setOpenedNoOverlayDrawer] = useState(false)
7+
const [openedOverlayDrawer, setOpenedOverlayDrawer] = useState(false)
88

99
// Toggle functions for each drawer
10-
const toggleNoOverlayDrawer = () => setOpenedNoOverlayDrawer(!openedNoOverlayDrawer);
11-
const toggleOverlayDrawer = () => setOpenedOverlayDrawer(!openedOverlayDrawer);
10+
const toggleNoOverlayDrawer = () =>
11+
setOpenedNoOverlayDrawer(!openedNoOverlayDrawer)
12+
const toggleOverlayDrawer = () => setOpenedOverlayDrawer(!openedOverlayDrawer)
1213

1314
return (
1415
<>
1516
<Flex wrap>
16-
<Button marginRight="md"
17+
<Button marginRight='md'
1718
onClick={toggleNoOverlayDrawer}
1819
>
1920
No Overlay Drawer
2021
</Button>
21-
<Button marginRight="md"
22+
<Button marginRight='md'
2223
onClick={toggleOverlayDrawer}
2324
>
2425
Overlay Drawer
@@ -27,29 +28,23 @@ const DrawerSizes = () => {
2728

2829
{/* Drawers for each size */}
2930
<Drawer
30-
behavior="push"
31-
fullHeight
3231
onClose={toggleNoOverlayDrawer}
3332
opened={openedNoOverlayDrawer}
3433
overlay={false}
35-
placement="right"
36-
size="lg"
34+
size='lg'
3735
>
3836
This is a Drawer with no overlay
3937
</Drawer>
4038
<Drawer
41-
behavior="push"
42-
fullHeight
4339
onClose={toggleOverlayDrawer}
4440
opened={openedOverlayDrawer}
45-
overlay
46-
placement="right"
47-
size="lg"
41+
placement='right'
42+
size='lg'
4843
>
49-
This is a Drawer with an overlay
44+
This is a Drawer with an overlay
5045
</Drawer>
5146
</>
52-
);
53-
};
47+
)
48+
}
5449

55-
export default DrawerSizes;
50+
export default DrawerSizes

0 commit comments

Comments
 (0)