Make mobile menu sheet height responsive and support controlled state

This commit is contained in:
Mike Cao committed 2026-08-03 13:11:57 -07:00
1 parent fbc4e86bb9
commit b5e9f7d968
2 files changed
+34 -12

No files matched your search

+1 -7
View File
@@ -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 (
+33 -5
View File
@@ -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>
);