Skip to content

Commit 47b261d

Browse files
committed
feat(menu/select): make Select and Menu popovers more customizable
It is now possible to pass props to popovers through the Select and MenuButton elements, which allows for more customization and flexibility.
1 parent c3baec8 commit 47b261d

4 files changed

Lines changed: 15 additions & 9 deletions

File tree

packages/actify/src/components/Menus/MenuButton.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,26 @@ import { MenuProps, MenuTrigger, MenuTriggerProps } from 'react-aria-components'
44

55
import { Button } from '../Buttons'
66
import { Menu } from './Menu'
7-
import { MenuPopover } from './MenuPopover'
7+
import { MenuPopover, PopoverProps } from './MenuPopover'
88
import React from 'react'
99

1010
export interface MenuButtonProps<T>
1111
extends MenuProps<T>,
1212
Omit<MenuTriggerProps, 'children'> {
13-
label?: React.ReactNode
13+
label?: React.ReactNode;
14+
popoverProps?: Omit<PopoverProps, 'children'>;
1415
}
1516

1617
const MenuButton = <T extends object>({
1718
label,
1819
children,
20+
popoverProps,
1921
...props
2022
}: MenuButtonProps<T>) => {
2123
return (
2224
<MenuTrigger {...props}>
2325
{typeof label == 'string' ? <Button>{label}</Button> : label}
24-
<MenuPopover>
26+
<MenuPopover {...popoverProps}>
2527
<Menu>{children}</Menu>
2628
</MenuPopover>
2729
</MenuTrigger>

packages/actify/src/components/Menus/MenuPopover.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
import React from 'react'
1111
import { motion } from 'motion/react'
1212
import styles from './menu-popover.module.css'
13+
import clsx from 'clsx'
1314

1415
export interface PopoverProps extends Omit<AriaPopoverProps, 'children'> {
1516
children: React.ReactNode
@@ -32,7 +33,7 @@ const MenuPopover = ({ children, ...props }: PopoverProps) => {
3233
}
3334

3435
return (
35-
<AriaPopover {...props} style={props.style} className={styles['popover']}>
36+
<AriaPopover {...props} style={props.style} className={clsx(styles['popover'], props.className)}>
3637
<motion.div
3738
initial={{
3839
height: 0,

packages/actify/src/components/Popover/Popover.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import type {
1717
import React from 'react'
1818
import { RenderProps, SlotProps } from './../../utils'
1919
import { OverlayTriggerState } from 'react-stately'
20+
import clsx from 'clsx'
2021

2122
interface PopoverRenderProps {
2223
/**
@@ -94,7 +95,7 @@ const Popover = (props: PopoverProps & React.RefAttributes<HTMLElement>) => {
9495
{/* @ts-expect-error */}
9596
<motion.div
9697
{...popoverProps}
97-
className={styles['popover']}
98+
className={clsx(styles['popover'], props.className)}
9899
initial={{
99100
height: 0,
100101
overflow: 'hidden'

packages/actify/src/components/Select/Select.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { AriaSelectOptions, HiddenSelect, useSelect } from 'react-aria'
1+
import { AriaSelectOptions, HiddenSelect, Placement, useSelect } from 'react-aria'
22
import { SelectStateOptions, useSelectState } from 'react-stately'
33

44
import { FilledField } from './FilledField'
55
import { Label } from '../Label/Label'
66
import { ListBox } from '../ListBox'
77
import { OutlinedField } from './OutlinedField'
8-
import { Popover } from '../Popover/Popover'
8+
import { Popover, PopoverProps } from '../Popover/Popover'
99
import React from 'react'
1010
import { TrailingIcon } from './TrailingIcon'
1111
import clsx from 'clsx'
@@ -17,6 +17,7 @@ interface SelectProps<T> extends AriaSelectOptions<T>, SelectStateOptions<T> {
1717
style?: React.CSSProperties
1818
leadingIcon?: React.ReactNode
1919
trailingIcon?: React.ReactNode
20+
popoverProps?: Omit<PopoverProps, 'state'>
2021
variant?: 'filled' | 'outlined'
2122
}
2223

@@ -26,7 +27,7 @@ const Select = <T extends object>(props: SelectProps<T>) => {
2627

2728
const { triggerProps, valueProps, menuProps } = useSelect(props, state, ref)
2829

29-
const { variant = 'filled' } = props
30+
const { variant = 'filled', popoverProps } = props;
3031

3132
let Tag = FilledField
3233
if (variant == 'filled') {
@@ -63,8 +64,9 @@ const Select = <T extends object>(props: SelectProps<T>) => {
6364
offset={2}
6465
state={state}
6566
triggerRef={ref}
66-
placement="bottom start"
6767
referenceWidth={referenceWidth}
68+
placement={popoverProps?.placement ?? 'bottom start'}
69+
{...popoverProps}
6870
>
6971
<ListBox {...menuProps} state={state} />
7072
</Popover>

0 commit comments

Comments
 (0)