Make mobile menu sheet height responsive and support controlled state
This commit is contained in:
1 parent
fbc4e86bb9
commit
b5e9f7d968
2 files changed
+34
-12
No files matched your search
@@ -49,13 +49,7 @@ export function MobileNav() {
|
||||
<MobileMenuButton>
|
||||
{({ close }) => {
|
||||
return (
|
||||
<Column
|
||||
gap="2"
|
||||
display="flex"
|
||||
flex-direction="column"
|
||||
padding="1"
|
||||
style={{ height: '100dvh' }}
|
||||
>
|
||||
<Column gap="2" display="flex" flex-direction="column" padding="1" height="100%">
|
||||
{isMain &&
|
||||
links.map(link => {
|
||||
return (
|
||||
|
||||
@@ -1,16 +1,44 @@
|
||||
import { Button, Dialog, type DialogProps, DialogTrigger, Icon, Sheet } from '@umami/react-zen';
|
||||
import {
|
||||
Button,
|
||||
type DialogRenderProps,
|
||||
DialogTrigger,
|
||||
Icon,
|
||||
Sheet,
|
||||
type SheetProps,
|
||||
} from '@umami/react-zen';
|
||||
import { type ReactNode, useState } from 'react';
|
||||
import { Menu } from '@/components/icons';
|
||||
|
||||
export function MobileMenuButton(props: DialogProps) {
|
||||
export interface MobileMenuButtonProps extends Omit<SheetProps, 'children' | 'side'> {
|
||||
children?: ReactNode | ((props: DialogRenderProps) => ReactNode);
|
||||
}
|
||||
|
||||
export function MobileMenuButton({
|
||||
children,
|
||||
isOpen: controlledOpen,
|
||||
onOpenChange,
|
||||
...props
|
||||
}: MobileMenuButtonProps) {
|
||||
const [uncontrolledOpen, setUncontrolledOpen] = useState(false);
|
||||
const isOpen = controlledOpen ?? uncontrolledOpen;
|
||||
const handleOpenChange = (open: boolean) => {
|
||||
if (controlledOpen === undefined) {
|
||||
setUncontrolledOpen(open);
|
||||
}
|
||||
onOpenChange?.(open);
|
||||
};
|
||||
|
||||
return (
|
||||
<DialogTrigger>
|
||||
<DialogTrigger isOpen={isOpen} onOpenChange={handleOpenChange}>
|
||||
<Button>
|
||||
<Icon>
|
||||
<Menu />
|
||||
</Icon>
|
||||
</Button>
|
||||
<Sheet side="left">
|
||||
<Dialog {...props} style={{ width: 'auto' }} />
|
||||
<Sheet {...props} side="left">
|
||||
{typeof children === 'function'
|
||||
? children({ close: () => handleOpenChange(false) })
|
||||
: children}
|
||||
</Sheet>
|
||||
</DialogTrigger>
|
||||
);
|
||||
|
||||
Reference in new issue
Block a user