Skip to content

Commit a66b904

Browse files
committed
Add height, width and overflow to Popover component
1 parent 29facae commit a66b904

File tree

4 files changed

+118
-31
lines changed

4 files changed

+118
-31
lines changed

packages/react/src/Popover/Popover.dev.stories.tsx

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,16 @@ export default {
99
component: Popover,
1010
} as Meta<typeof Popover>
1111

12-
export const SxProps = () => (
13-
<Popover
14-
relative
15-
open={true}
16-
caret="top-right"
17-
sx={{
18-
left: '50%',
19-
transform: 'translateX(-50%)',
20-
mt: 2,
21-
color: 'var(--bgColor-danger-muted)',
22-
}}
23-
style={{padding: '16px'}}
24-
>
25-
<Popover.Content
26-
sx={{
27-
minWidth: '260px',
28-
width: '40%',
29-
}}
30-
style={{padding: '32px'}}
31-
>
32-
<Heading sx={{fontSize: 2}}>Popover heading</Heading>
12+
export const PopoverOverflow = () => (
13+
<Popover relative open={true}>
14+
<Popover.Content height={'small'}>
15+
<Heading style={{fontSize: 2}}>Popover heading</Heading>
16+
<Text as="p">Message about popovers</Text>
17+
<Text as="p">Message about popovers</Text>
18+
<Text as="p">Message about popovers</Text>
19+
<Text as="p">Message about popovers</Text>
20+
<Text as="p">Message about popovers</Text>
21+
<Text as="p">Message about popovers</Text>
3322
<Text as="p">Message about popovers</Text>
3423
<Button>Got it!</Button>
3524
</Popover.Content>

packages/react/src/Popover/Popover.module.css

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@
1414

1515
.PopoverContent {
1616
position: relative;
17-
width: 232px;
1817
padding: var(--base-size-24);
1918
margin-right: auto;
2019
margin-left: auto;
2120
background-color: var(--overlay-bgColor);
2221
border: var(--borderWidth-thin) solid var(--borderColor-default);
2322
border-radius: var(--borderRadius-medium);
23+
overflow: hidden;
2424

2525
/* Carets */
2626
&::before,
@@ -205,4 +205,61 @@
205205
bottom: calc(var(--base-size-16) + 1px);
206206
}
207207
}
208+
209+
&:where([data-width-small]) {
210+
width: 256px;
211+
}
212+
&:where([data-width-medium]) {
213+
width: 320px;
214+
}
215+
&:where([data-width-large]) {
216+
/* stylelint-disable-next-line primer/responsive-widths */
217+
width: 480px;
218+
}
219+
&:where([data-width-xlarge]) {
220+
/* stylelint-disable-next-line primer/responsive-widths */
221+
width: 640px;
222+
}
223+
&:where([data-width-xxlarge]) {
224+
/* stylelint-disable-next-line primer/responsive-widths */
225+
width: 960px;
226+
}
227+
&:where([data-width-auto]) {
228+
width: auto;
229+
}
230+
231+
&:where([data-height-xsmall]) {
232+
height: 192px;
233+
}
234+
&:where([data-height-small]) {
235+
height: 256px;
236+
}
237+
&:where([data-height-medium]) {
238+
height: 320px;
239+
}
240+
&:where([data-height-large]) {
241+
height: 432px;
242+
}
243+
&:where([data-height-xlarge]) {
244+
height: 600px;
245+
}
246+
&:where([data-height-fit-content]) {
247+
height: fit-content;
248+
}
249+
250+
&:where([data-height-auto]) {
251+
height: auto;
252+
}
253+
&:where([data-overflow-auto]) {
254+
overflow: auto;
255+
}
256+
&:where([data-overflow-hidden]) {
257+
overflow: hidden;
258+
}
259+
&:where([data-overflow-scroll]) {
260+
overflow: scroll;
261+
}
262+
&:where([data-overflow-visible]) {
263+
overflow: visible;
264+
}
208265
}

packages/react/src/Popover/Popover.stories.tsx

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type {Meta, StoryFn} from '@storybook/react-vite'
22
import Heading from '../Heading'
3-
import Popover from './Popover'
3+
import Popover, {type PopoverProps, type PopoverContentProps} from './Popover'
44
import Text from '../Text'
55
import {Button} from '../Button'
66

@@ -11,18 +11,18 @@ export default {
1111

1212
export const Default = () => (
1313
<Popover relative open={true} caret="top">
14-
<Popover.Content sx={{marginTop: 2}}>
15-
<Heading sx={{fontSize: 2}}>Popover heading</Heading>
14+
<Popover.Content style={{marginTop: 2}}>
15+
<Heading style={{fontSize: 2}}>Popover heading</Heading>
1616
<Text as="p">Message about popovers</Text>
1717
<Button>Got it!</Button>
1818
</Popover.Content>
1919
</Popover>
2020
)
2121

22-
export const Playground: StoryFn<typeof Popover> = args => (
22+
export const Playground: StoryFn<PopoverProps & PopoverContentProps> = args => (
2323
<Popover {...args}>
24-
<Popover.Content sx={{marginTop: 2}}>
25-
<Heading sx={{fontSize: 2}}>Popover heading</Heading>
24+
<Popover.Content style={{marginTop: 2}} width={args.width || 'small'} height={args.height} overflow={args.overflow}>
25+
<Heading style={{fontSize: 2}}>Popover heading</Heading>
2626
<Text as="p">Message about popovers</Text>
2727
<Button>Got it!</Button>
2828
</Popover.Content>
@@ -33,6 +33,8 @@ Playground.args = {
3333
caret: 'top',
3434
open: true,
3535
relative: true,
36+
width: 'auto',
37+
height: 'auto',
3638
}
3739

3840
Playground.argTypes = {
@@ -65,4 +67,22 @@ Playground.argTypes = {
6567
type: 'boolean',
6668
},
6769
},
70+
width: {
71+
control: {
72+
type: 'radio',
73+
},
74+
options: ['small', 'medium', 'large', 'auto', 'xlarge'],
75+
},
76+
height: {
77+
control: {
78+
type: 'radio',
79+
},
80+
options: ['xsmall', 'small', 'medium', 'large', 'auto', 'xlarge', 'fit-content'],
81+
},
82+
overflow: {
83+
control: {
84+
type: 'radio',
85+
},
86+
options: ['auto', 'hidden', 'scroll', 'visible'],
87+
},
6888
}

packages/react/src/Popover/Popover.tsx

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,32 @@ const Popover = React.forwardRef<HTMLDivElement, PopoverProps>(function Popover(
5454
})
5555
Popover.displayName = 'Popover'
5656

57-
export type PopoverContentProps = {className?: string} & StyledPopoverProps & HTMLProps<HTMLDivElement>
57+
export type PopoverContentProps = {
58+
className?: string
59+
width?: 'small' | 'large' | 'medium' | 'auto' | 'xlarge'
60+
height?: 'xsmall' | 'small' | 'large' | 'medium' | 'auto' | 'xlarge' | 'fit-content'
61+
overflow?: 'auto' | 'hidden' | 'scroll' | 'visible'
62+
} & StyledPopoverProps &
63+
HTMLProps<HTMLDivElement>
5864

5965
const PopoverContentBaseComponent = toggleSxComponent('div') as React.ComponentType<PopoverContentProps>
60-
const PopoverContent: React.FC<React.PropsWithChildren<PopoverContentProps>> = ({className, ...props}) => {
61-
return <PopoverContentBaseComponent {...props} className={clsx(className, classes.PopoverContent)} />
66+
const PopoverContent: React.FC<React.PropsWithChildren<PopoverContentProps>> = ({
67+
className,
68+
width = 'small',
69+
height = 'fit-content',
70+
...props
71+
}) => {
72+
return (
73+
<PopoverContentBaseComponent
74+
{...{
75+
[`data-width-${width}`]: '',
76+
[`data-height-${height}`]: '',
77+
[`data-overflow-${props.overflow || 'auto'}`]: '',
78+
}}
79+
{...props}
80+
className={clsx(className, classes.PopoverContent)}
81+
/>
82+
)
6283
}
6384

6485
PopoverContent.displayName = 'Popover.Content'

0 commit comments

Comments
 (0)