Attempt to fix submenu not disappearing properly.

This commit is contained in:
barnabasmolnar 2023-04-18 14:57:25 +02:00
parent e615056302
commit 7d791b86f8
5 changed files with 106 additions and 32 deletions

View File

@ -8,6 +8,12 @@
.dropdown-menu { .dropdown-menu {
position: absolute; position: absolute;
.radix-menuitem {
&:focus-visible {
outline: none;
}
}
&--mobile { &--mobile {
bottom: 55px; bottom: 55px;
top: auto; top: auto;

View File

@ -1,10 +1,11 @@
import React from "react";
import { import {
getDropdownMenuItemClassName, getDropdownMenuItemClassName,
useHandleDropdownMenuItemClick, useHandleDropdownMenuItemClick,
} from "./common"; } from "./common";
import MenuItemContent from "./DropdownMenuItemContent"; import MenuItemContent from "./DropdownMenuItemContent";
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
const DropdownMenuItem = ({ const DropdownMenuItem = ({
icon, icon,
onSelect, onSelect,
@ -22,17 +23,19 @@ const DropdownMenuItem = ({
const handleClick = useHandleDropdownMenuItemClick(rest.onClick, onSelect); const handleClick = useHandleDropdownMenuItemClick(rest.onClick, onSelect);
return ( return (
<button <DropdownMenuPrimitive.Item className="radix-menuitem">
{...rest} <button
onClick={handleClick} {...rest}
type="button" onClick={handleClick}
className={getDropdownMenuItemClassName(className)} type="button"
title={rest.title ?? rest["aria-label"]} className={getDropdownMenuItemClassName(className)}
> title={rest.title ?? rest["aria-label"]}
<MenuItemContent icon={icon} shortcut={shortcut}> >
{children} <MenuItemContent icon={icon} shortcut={shortcut}>
</MenuItemContent> {children}
</button> </MenuItemContent>
</button>
</DropdownMenuPrimitive.Item>
); );
}; };

View File

@ -4,6 +4,8 @@ import {
useHandleDropdownMenuItemClick, useHandleDropdownMenuItemClick,
} from "./common"; } from "./common";
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
const DropdownMenuSubItem = ({ const DropdownMenuSubItem = ({
icon, icon,
onSelect, onSelect,
@ -21,17 +23,19 @@ const DropdownMenuSubItem = ({
const handleClick = useHandleDropdownMenuItemClick(rest.onClick, onSelect); const handleClick = useHandleDropdownMenuItemClick(rest.onClick, onSelect);
return ( return (
<button <DropdownMenuPrimitive.Item className="radix-menuitem">
{...rest} <button
onClick={handleClick} {...rest}
type="button" onClick={handleClick}
className={getDropdownMenuItemClassName(className)} type="button"
title={rest.title ?? rest["aria-label"]} className={getDropdownMenuItemClassName(className)}
> title={rest.title ?? rest["aria-label"]}
<MenuItemContent icon={icon} shortcut={shortcut}> >
{children} <MenuItemContent icon={icon} shortcut={shortcut}>
</MenuItemContent> {children}
</button> </MenuItemContent>
</button>
</DropdownMenuPrimitive.Item>
); );
}; };

View File

@ -8,19 +8,24 @@ const DropdownMenuSubTrigger = ({
icon, icon,
shortcut, shortcut,
className, className,
...rest
}: { }: {
children: React.ReactNode; children: React.ReactNode;
icon?: JSX.Element; icon?: JSX.Element;
shortcut?: string; shortcut?: string;
className?: string; className?: string;
}) => { } & React.HTMLAttributes<HTMLDivElement>) => {
return ( return (
<DropdownMenuPrimitive.SubTrigger <DropdownMenuPrimitive.SubTrigger className="radix-menuitem">
className={getDropdownMenuItemClassName(className)} <div
> {...rest}
<MenuItemContent icon={icon} shortcut={shortcut}> className={getDropdownMenuItemClassName(className)}
{children} title={rest.title ?? rest["aria-label"]}
</MenuItemContent> >
<MenuItemContent icon={icon} shortcut={shortcut}>
{children}
</MenuItemContent>
</div>
</DropdownMenuPrimitive.SubTrigger> </DropdownMenuPrimitive.SubTrigger>
); );
}; };

View File

@ -507,9 +507,45 @@ export default function App({ appTitle, useCustom, customArgs }: AppProps) {
return ( return (
<MainMenu> <MainMenu>
<MainMenu.Sub> <MainMenu.Sub>
<MainMenu.Sub.Trigger>Trigger</MainMenu.Sub.Trigger> <MainMenu.Sub.Trigger
title="Custom trigger"
icon={
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
strokeWidth={1.5}
stroke="currentColor"
className="w-6 h-6"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M15.042 21.672L13.684 16.6m0 0l-2.51 2.225.569-9.47 5.227 7.917-3.286-.672zm-7.518-.267A8.25 8.25 0 1120.25 10.5M8.288 14.212A5.25 5.25 0 1117.25 10.5"
/>
</svg>
}
>
Trigger
</MainMenu.Sub.Trigger>
<MainMenu.Sub.Content> <MainMenu.Sub.Content>
<MainMenu.Sub.Item <MainMenu.Sub.Item
icon={
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
strokeWidth={1.5}
stroke="currentColor"
className="w-6 h-6"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5M6 7.5h3v3H6v-3z"
/>
</svg>
}
onSelect={() => window.alert("You clicked on sub item")} onSelect={() => window.alert("You clicked on sub item")}
> >
Sub item Sub item
@ -523,10 +559,30 @@ export default function App({ appTitle, useCustom, customArgs }: AppProps) {
isCollaborating={isCollaborating} isCollaborating={isCollaborating}
onSelect={() => window.alert("You clicked on collab button")} onSelect={() => window.alert("You clicked on collab button")}
/> />
<MainMenu.Sub>
<MainMenu.Sub.Trigger>Trigger</MainMenu.Sub.Trigger>
<MainMenu.Sub.Content>
<MainMenu.Sub.Item
onSelect={() => window.alert("You clicked on sub item")}
>
Sub item
</MainMenu.Sub.Item>
</MainMenu.Sub.Content>
</MainMenu.Sub>
<MainMenu.Group title="Excalidraw links"> <MainMenu.Group title="Excalidraw links">
<MainMenu.DefaultItems.Socials /> <MainMenu.DefaultItems.Socials />
</MainMenu.Group> </MainMenu.Group>
<MainMenu.Separator /> {/* <MainMenu.Separator /> */}
<MainMenu.Sub>
<MainMenu.Sub.Trigger>Trigger</MainMenu.Sub.Trigger>
<MainMenu.Sub.Content>
<MainMenu.Sub.Item
onSelect={() => window.alert("You clicked on sub item")}
>
Sub item
</MainMenu.Sub.Item>
</MainMenu.Sub.Content>
</MainMenu.Sub>
<MainMenu.ItemCustom> <MainMenu.ItemCustom>
<button <button
style={{ height: "2rem" }} style={{ height: "2rem" }}