diff --git a/src/components/extenders/Menu.tsx b/src/components/extenders/Menu.tsx index c6c44f892..bf34a9603 100644 --- a/src/components/extenders/Menu.tsx +++ b/src/components/extenders/Menu.tsx @@ -1,14 +1,17 @@ import * as DropdownMenu from "@radix-ui/react-dropdown-menu"; import type { ReactNode } from "react"; -import { useMemo } from "react"; +import { useMemo, useState } from "react"; import { Fragment } from "react"; import { useTheme } from "../../context/Theme.context"; import { mergeClass } from "../../utils/css"; import type { Component, GetSet } from "../../utils/types"; import Box, { type BoxProps } from "../primitives/Box"; +import Collapsible from "../primitives/Collapsible"; import Divider from "../primitives/Divider"; import EventBlocker from "../primitives/EventBlocker"; import Icon from "../primitives/Icon"; +import Space from "../primitives/Space"; +import Text from "../primitives/Text"; import Group from "./Group"; export interface MenuOptions { @@ -29,6 +32,45 @@ const divide = (element: JSX.Element, index: number, arr: JSX.Element[]) => ( ); +export function SubMenuResponsiv({ children, options, size, look, className }: Component) { + const [isOpen, setIsOpen] = useState(false); + + return ( + + + setIsOpen(prev => !prev)}> + { + + {children} + + + } + + + + + {Object.entries(options).map(([key, { label, options: subOptions }]) => { + if (subOptions && Object.keys(subOptions).length > 0) + return ( + + {label} + + ); + return ( + + + {label} + + + ); + })} + + + + + ); +} + export function SubMenu({ children, options, size, look, className }: Component) { const { vars } = useTheme(); @@ -36,7 +78,7 @@ export function SubMenu({ children, options, size, look, className }: Component< - {children} + {children} @@ -74,7 +116,7 @@ export default function Menu({ }: Component) { const { vars } = useTheme(); - const menu = useMemo(() => { + const desktopMenuItems = useMemo(() => { return Object.entries(options) .map(([key, { label, options: subOptions }]) => { if (subOptions && Object.keys(subOptions).length > 0) @@ -88,22 +130,71 @@ export default function Menu({ .map(divide); }, [options, size, look, className]); + const responsiveMenuItems = useMemo(() => { + return Object.entries(options) + .map(([key, { label, options: subOptions }]) => { + if (subOptions && Object.keys(subOptions).length > 0) + return ( + + {label} + + ); + return {label}; + }) + .map(divide); + }, [options, size, look, className]); + + // biome-ignore lint/correctness/useExhaustiveDependencies: + const desktopMenu = useMemo(() => { + return ( + + + + {desktopMenuItems} + + + + ); + }, [options, size, look, className, vars, desktopMenuItems]); + + // biome-ignore lint/correctness/useExhaustiveDependencies: + const responsivMenu = useMemo(() => { + return ( + + + + {responsiveMenuItems} + + + + ); + }, [options, size, look, className, vars, desktopMenuItems]); + return ( {children} - - - - {menu} - - - + { + <> + {desktopMenu} + {responsivMenu} + + } );