Skip to content

Commit 7946753

Browse files
authored
feat(components): add width prop to Popover (#1687)
1 parent 5bd082c commit 7946753

File tree

4 files changed

+53
-26
lines changed

4 files changed

+53
-26
lines changed

.changeset/easy-deer-cross.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@launchpad-ui/components": patch
3+
---
4+
5+
Add `width` prop to `Popover`

packages/components/src/Popover.tsx

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { VariantProps } from 'class-variance-authority';
12
import type { Ref } from 'react';
23
import type {
34
OverlayArrowProps as AriaOverlayArrowProps,
@@ -16,7 +17,7 @@ import {
1617
import styles from './styles/Popover.module.css';
1718
import { useLPContextProps } from './utils';
1819

19-
interface PopoverProps extends AriaPopoverProps {
20+
interface PopoverProps extends AriaPopoverProps, VariantProps<typeof popoverStyles> {
2021
ref?: Ref<HTMLElement>;
2122
}
2223
interface OverlayArrowProps extends Omit<AriaOverlayArrowProps, 'children'> {
@@ -25,7 +26,17 @@ interface OverlayArrowProps extends Omit<AriaOverlayArrowProps, 'children'> {
2526

2627
const PopoverContext = createContext<ContextValue<PopoverProps, HTMLElement>>(null);
2728

28-
const popoverStyles = cva(styles.popover);
29+
const popoverStyles = cva(styles.popover, {
30+
variants: {
31+
width: {
32+
default: styles.default,
33+
trigger: styles.trigger,
34+
},
35+
},
36+
defaultVariants: {
37+
width: 'default',
38+
},
39+
});
2940
const overlayArrowStyles = cva(styles.arrow);
3041

3142
/**
@@ -35,7 +46,7 @@ const overlayArrowStyles = cva(styles.arrow);
3546
*/
3647
const Popover = ({ ref, ...props }: PopoverProps) => {
3748
[props, ref] = useLPContextProps(props, ref, PopoverContext);
38-
const { offset = 4, crossOffset = 0 } = props;
49+
const { offset = 4, crossOffset = 0, width = 'default' } = props;
3950

4051
return (
4152
<AriaPopover
@@ -44,7 +55,7 @@ const Popover = ({ ref, ...props }: PopoverProps) => {
4455
{...props}
4556
ref={ref}
4657
className={composeRenderProps(props.className, (className, renderProps) =>
47-
popoverStyles({ ...renderProps, className }),
58+
popoverStyles({ ...renderProps, width, className }),
4859
)}
4960
/>
5061
);

packages/components/src/Tooltip.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
composeRenderProps,
1515
} from 'react-aria-components';
1616

17-
import popoverStyles from './styles/Popover.module.css';
17+
import { popoverStyles } from './Popover';
1818
import styles from './styles/Tooltip.module.css';
1919
import { useLPContextProps } from './utils';
2020

@@ -29,7 +29,7 @@ const tooltipStyles = cva(styles.base, {
2929
variants: {
3030
variant: {
3131
default: styles.tooltip,
32-
popover: popoverStyles.popover,
32+
popover: popoverStyles({ width: 'default' }),
3333
},
3434
},
3535
defaultVariants: {

packages/components/src/styles/Popover.module.css

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
}
1212

1313
.popover {
14-
--lp-arrow-offset: var(--lp-size-2);
14+
--arrow-offset: var(--lp-size-2);
1515

1616
isolation: isolate;
1717
border-radius: var(--lp-border-radius-medium);
@@ -39,21 +39,6 @@
3939

4040
&[data-trigger='DialogTrigger'] {
4141
padding: var(--lp-spacing-300);
42-
min-width: var(--lp-size-192);
43-
}
44-
45-
&[data-trigger='MenuTrigger'],
46-
&[data-trigger='SubmenuTrigger'] {
47-
min-width: var(--lp-size-192);
48-
max-width: var(--lp-size-400);
49-
}
50-
51-
&[data-trigger='Select'] {
52-
min-width: var(--trigger-width);
53-
}
54-
55-
&[data-trigger='ComboBox'] {
56-
min-width: var(--trigger-width);
5742
}
5843

5944
&[data-trigger='ComboBoxDialog'] {
@@ -68,7 +53,7 @@
6853
--origin: translateY(4px);
6954

7055
&:has(.arrow) {
71-
margin-bottom: var(--lp-arrow-offset);
56+
margin-bottom: var(--arrow-offset);
7257
}
7358
}
7459

@@ -80,7 +65,7 @@
8065
}
8166

8267
&:has(.arrow) {
83-
margin-top: var(--lp-arrow-offset);
68+
margin-top: var(--arrow-offset);
8469
}
8570
}
8671

@@ -92,7 +77,7 @@
9277
}
9378

9479
&:has(.arrow) {
95-
margin-left: var(--lp-arrow-offset);
80+
margin-left: var(--arrow-offset);
9681
}
9782
}
9883

@@ -104,7 +89,7 @@
10489
}
10590

10691
&:has(.arrow) {
107-
margin-right: var(--lp-arrow-offset);
92+
margin-right: var(--arrow-offset);
10893
}
10994
}
11095

@@ -120,3 +105,29 @@
120105
}
121106
}
122107
}
108+
109+
.default {
110+
&[data-trigger='DialogTrigger'] {
111+
min-width: var(--lp-size-192);
112+
}
113+
114+
&[data-trigger='MenuTrigger'],
115+
&[data-trigger='SubmenuTrigger'] {
116+
min-width: var(--lp-size-192);
117+
max-width: var(--lp-size-400);
118+
}
119+
120+
&[data-trigger='Select'] {
121+
min-width: var(--trigger-width);
122+
}
123+
124+
&[data-trigger='ComboBox'] {
125+
min-width: var(--trigger-width);
126+
}
127+
}
128+
129+
.trigger {
130+
&[data-trigger] {
131+
width: var(--trigger-width);
132+
}
133+
}

0 commit comments

Comments
 (0)