diff --git a/src/components/popover-menu/popover-menu-panel-divider.tsx b/src/components/popover-menu/popover-menu-panel-divider.tsx new file mode 100644 index 00000000..e4d70002 --- /dev/null +++ b/src/components/popover-menu/popover-menu-panel-divider.tsx @@ -0,0 +1,5 @@ +import React from "react"; + +export const PopoverMenuPanelDivider = () => { + return
; +}; diff --git a/src/components/popover-menu/popover-menu-panel-group.tsx b/src/components/popover-menu/popover-menu-panel-group.tsx new file mode 100644 index 00000000..1b93789d --- /dev/null +++ b/src/components/popover-menu/popover-menu-panel-group.tsx @@ -0,0 +1,9 @@ +import React from "react"; + +export interface PopoverMenuGroupProps { + children: React.ReactNode; +} + +export const PopoverMenuPanelGroup = ({ children }: PopoverMenuGroupProps) => { + return
{children}
; +}; diff --git a/src/components/popover-menu/popover-menu-panel-item.tsx b/src/components/popover-menu/popover-menu-panel-item.tsx new file mode 100644 index 00000000..d4bf4f3b --- /dev/null +++ b/src/components/popover-menu/popover-menu-panel-item.tsx @@ -0,0 +1,49 @@ +import React from "react"; +import { classNames } from "../../util/class-names"; + +const itemIntents = { + neutral: "text-neutral-700 fill-neutral-700 hover:bg-primary-100", + danger: "text-danger-500 fill-danger-500 hover:bg-danger-100", +}; + +const activeItemIntents = { + neutral: "bg-primary-100 fill-primary-400 text-primary-400 before:bg-primary-400", + danger: "bg-danger-100 fill-danger-400 text-danger-500 before:bg-danger-400", +}; + +export interface PopoverMenuPanelItemProps { + children: React.ReactNode; + onClick?: () => void; + Icon?: React.ComponentType<{ className: string }>; + variant?: keyof typeof itemIntents; + active?: boolean; +} + +export const PopoverMenuPanelItem = ({ + children, + onClick, + Icon, + variant = "neutral", + active, +}: PopoverMenuPanelItemProps) => { + const intentStyles = itemIntents[variant]; + + return ( +
+ {Icon && } + {children} +
+ ); +}; diff --git a/src/components/popover-menu/popover-menu-panel-title.tsx b/src/components/popover-menu/popover-menu-panel-title.tsx new file mode 100644 index 00000000..0c665127 --- /dev/null +++ b/src/components/popover-menu/popover-menu-panel-title.tsx @@ -0,0 +1,11 @@ +import React from "react"; + +export interface PopoverMenuPanelTitleProps { + children: React.ReactNode; +} + +export const PopoverMenuPanelTitle = ({ children }: PopoverMenuPanelTitleProps) => { + return ( +

{children}

+ ); +}; diff --git a/src/components/popover-menu/popover-menu-panel.tsx b/src/components/popover-menu/popover-menu-panel.tsx index 305a24ba..7f8d2422 100644 --- a/src/components/popover-menu/popover-menu-panel.tsx +++ b/src/components/popover-menu/popover-menu-panel.tsx @@ -1,31 +1,16 @@ import { PopoverPanel as HeadlessUiPopoverPanel } from "@headlessui/react"; import React from "react"; import { usePopoverMenuContext } from "./popover-menu-context"; +import { PopoverMenuPanelGroup } from "./popover-menu-panel-group"; +import { PopoverMenuPanelItem } from "./popover-menu-panel-item"; +import { PopoverMenuPanelDivider } from "./popover-menu-panel-divider"; +import { PopoverMenuPanelTitle } from "./popover-menu-panel-title"; -export interface PopoverMenuPanelItemProps { +export interface PopoverMenuPanelProps { children: React.ReactNode; - onClick?: () => void; } -const PopoverMenuPanelItem = ({ children, onClick }: PopoverMenuPanelItemProps) => { - return ( - - ); -}; - -export interface NavigationPopoverPanelProps { - children: React.ReactNode; -} - -const PopoverMenuPanel = ({ children }: NavigationPopoverPanelProps) => { +const PopoverMenuPanel = ({ children }: PopoverMenuPanelProps) => { const { popoverPanel: { setPopperElement, styles, attributes }, } = usePopoverMenuContext(); @@ -35,7 +20,7 @@ const PopoverMenuPanel = ({ children }: NavigationPopoverPanelProps) => { ref={(el) => el && setPopperElement(el)} style={styles} {...attributes} - className="z-40 ml-2 w-52 rounded bg-neutral-0 py-2 shadow" + className="z-40 w-52 rounded bg-neutral-0 py-2 shadow" > {children} @@ -43,5 +28,8 @@ const PopoverMenuPanel = ({ children }: NavigationPopoverPanelProps) => { }; PopoverMenuPanel.Item = PopoverMenuPanelItem; +PopoverMenuPanel.Group = PopoverMenuPanelGroup; +PopoverMenuPanel.Divider = PopoverMenuPanelDivider; +PopoverMenuPanel.Title = PopoverMenuPanelTitle; export { PopoverMenuPanel }; diff --git a/src/components/popover-menu/popover-menu.stories.tsx b/src/components/popover-menu/popover-menu.stories.tsx index 29651e93..b910b1ad 100644 --- a/src/components/popover-menu/popover-menu.stories.tsx +++ b/src/components/popover-menu/popover-menu.stories.tsx @@ -1,6 +1,7 @@ import type { Meta, StoryObj } from "@storybook/react"; import React from "react"; import { PopoverMenu } from "./popover-menu"; +import { AddIcon, ChatIcon, DeleteIcon, EditIcon } from "../../icons"; const meta: Meta = { title: "Popover Menu", @@ -25,9 +26,21 @@ export const Default: Story = { - Item 1 - Item 1 - Item 1 + You + + Edit profile + Support + Invite member + + + + + Danger Zone + + + Item 1 + +