@plexui/ui 0.7.25 → 0.7.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -94,6 +94,12 @@ const Link = ((props) => {
|
|
|
94
94
|
const Separator = ({ className }) => {
|
|
95
95
|
return _jsx(DropdownMenu.Separator, { className: clsx(s.Separator, className), role: "separator" });
|
|
96
96
|
};
|
|
97
|
+
const Label = ({ className, children }) => {
|
|
98
|
+
return (_jsx(DropdownMenu.Label, { className: clsx(s.MenuLabel, className), children: children }));
|
|
99
|
+
};
|
|
100
|
+
const Group = ({ className, children, }) => {
|
|
101
|
+
return _jsx(DropdownMenu.Group, { className: className, children: children });
|
|
102
|
+
};
|
|
97
103
|
const Content = ({ children, side, sideOffset = 5, align, alignOffset, width, minWidth, maxHeight, }) => {
|
|
98
104
|
const { open } = useMenuContext();
|
|
99
105
|
return (_jsx(DropdownMenu.Portal, { forceMount: true, children: _jsx(TransitionGroup, { className: s.Menu, enterDuration: 350, exitDuration: 200, disableAnimations: true, children: open && (_jsx(DropdownMenu.Content, { forceMount: true, className: s.MenuList, side: side, sideOffset: sideOffset, align: align, alignOffset: alignOffset ?? (align === "center" ? 0 : -5), avoidCollisions: true, collisionPadding: { bottom: 30, top: 30, left: 12, right: 12 }, onEscapeKeyDown: preventDefaultHandler, style: toCssVariables({
|
|
@@ -177,4 +183,6 @@ Menu.SubContent = SubContent;
|
|
|
177
183
|
Menu.CheckboxItem = CheckboxItem;
|
|
178
184
|
Menu.RadioGroup = RadioGroup;
|
|
179
185
|
Menu.RadioItem = RadioItem;
|
|
186
|
+
Menu.Label = Label;
|
|
187
|
+
Menu.Group = Group;
|
|
180
188
|
//# sourceMappingURL=Menu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.js","sourceRoot":"","sources":["../../../../src/components/Menu/Menu.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport { DropdownMenu } from \"radix-ui\"\nimport React, {\n type ComponentProps,\n type ComponentType,\n createContext,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\"\n\nimport clsx from \"clsx\"\nimport { useEscCloseStack } from \"../../hooks/useEscCloseStack\"\nimport { useLatestValue } from \"../../hooks/useLatestValue\"\nimport { preventDefaultHandler, toCssVariables } from \"../../lib/helpers\"\nimport { Button } from \"../Button\"\nimport { Check, ChevronRight } from \"../Icon\"\nimport { useLinkComponent } from \"../PlexUIProvider/internal\"\nimport { TransitionGroup } from \"../Transition\"\nimport s from \"./Menu.module.css\"\n\ntype MenuContextValue = {\n open: boolean\n setOpen: (next: boolean) => void\n}\n\nconst MenuContext = createContext<MenuContextValue | null>(null)\n\nconst useMenuContext = () => {\n const context = useContext(MenuContext)\n\n if (!context) {\n throw new Error(\"Menu components must be wrapped in <Menu />\")\n }\n\n return context\n}\n\nexport type MenuProps = {\n children: React.ReactNode\n /** Force the menu to remain open or closed */\n forceOpen?: boolean\n /** Callback triggered when the modal is opened */\n onOpen?: () => void\n /** Callback triggered when the modal is closed */\n onClose?: () => void\n /**\n * When set to `true`, interaction with outside elements will be disabled and only menu content will be visible to screen readers.\n * @default false\n */\n modal?: boolean\n}\n\nexport const Menu = ({ children, forceOpen, onOpen, onClose, modal = false }: MenuProps) => {\n const [open, setOpen] = useState<boolean>(false)\n const isOpen = forceOpen ?? open\n\n const latestOnOpen = useLatestValue(onOpen)\n const latestOnClose = useLatestValue(onClose)\n\n const handleOpenChange = useCallback(\n (nextState: boolean) => {\n setOpen(nextState)\n if (nextState) {\n latestOnOpen.current?.()\n } else {\n latestOnClose.current?.()\n }\n },\n [latestOnOpen, latestOnClose],\n )\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n })\n\n const store = useMemo<MenuContextValue>(\n () => ({\n open: isOpen,\n setOpen: handleOpenChange,\n }),\n [isOpen, handleOpenChange],\n )\n\n return (\n <MenuContext.Provider value={store}>\n <DropdownMenu.Root open={isOpen} onOpenChange={handleOpenChange} modal={modal}>\n {children}\n </DropdownMenu.Root>\n </MenuContext.Provider>\n )\n}\n\nexport type MenuItemProps = {\n className?: string\n children: React.ReactNode\n /** Callback triggered when the item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Callback triggered when the item is clicked */\n onClick?: DropdownMenu.DropdownMenuItemProps[\"onClick\"]\n /** Disables the menu item */\n disabled?: boolean\n}\n\nconst Item = ({ className, children, disabled, onSelect, onClick }: MenuItemProps) => {\n const { open } = useMenuContext()\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we're always known to be closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n // Custom click handlers\n if (onSelect) {\n return (\n <DropdownMenu.Item\n className={clsx(s.MenuItem, className)}\n onSelect={onSelect}\n onClick={onClick}\n disabled={disabled}\n onPointerMove={handlePreventAfterClose}\n onPointerLeave={handlePreventAfterClose}\n >\n <div className={s.PressableInner}>{children}</div>\n </DropdownMenu.Item>\n )\n }\n\n // Read-only content - will not appear interactive.\n return <div className={clsx(s.MenuItemContent, className)}>{children}</div>\n}\n\nconst ItemActions = ({ className, children }: { className?: string; children: ReactNode }) => {\n return <div className={clsx(s.ItemActions, className)}>{children}</div>\n}\n\nconst ItemAction = ({\n children,\n onClick,\n}: {\n children: ReactNode\n onClick: (evt: MouseEvent) => void\n}) => {\n const { setOpen } = useMenuContext()\n\n return (\n <Button\n className=\"rounded-sm\"\n color=\"secondary\"\n size=\"xs\"\n uniform\n iconSize=\"sm\"\n variant=\"ghost\"\n onClick={(evt) => {\n evt.stopPropagation()\n setOpen(false)\n onClick(evt)\n }}\n >\n {children}\n </Button>\n )\n}\n\ntype MenuLinkProps = Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\" | \"children\"> & {\n /** Content rendered inside the Link */\n children: React.ReactNode\n /** Disables the menu item */\n disabled?: boolean\n}\n\ntype MenuLink = <\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends ComponentType<any> | \"a\" = PlexUI.LinkComponent,\n>(\n props: Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\"> &\n MenuLinkProps & {\n /**\n * Override the default component used for the link. This is useful for\n * using a routing library, or SSR rendering.\n * purposes.\n *\n * @default 'a'\n */\n as?: T\n } & ComponentProps<T>,\n) => ReactNode\n\nconst Link = ((\n props: MenuLinkProps & { href?: string; to?: string; as?: PlexUI.LinkComponent },\n) => {\n const { className, children, href, to, disabled, as: OverrideComponent, ...restProps } = props\n const { open } = useMenuContext()\n\n const propPath = href || to\n // When a path is not provided, default to an anchor\n const isExternal = propPath ? /^https?:\\/\\//.test(propPath) : true\n const DefaultComponent = useLinkComponent()\n const Component = OverrideComponent || (isExternal ? \"a\" : DefaultComponent)\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we're always known to be closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n const linkProps = isExternal\n ? { target: \"_blank\", rel: \"noopener noreferrer\", href: href ?? to }\n : { href, to }\n\n return (\n <DropdownMenu.Item\n asChild\n className={clsx(s.MenuItem, className)}\n disabled={disabled}\n onPointerMove={isExternal ? undefined : handlePreventAfterClose}\n onPointerLeave={isExternal ? undefined : handlePreventAfterClose}\n >\n <Component {...linkProps} {...restProps}>\n <span className={s.PressableInner}>{children}</span>\n </Component>\n </DropdownMenu.Item>\n )\n}) as MenuLink\n\nconst Separator = ({ className }: { className?: string }) => {\n return <DropdownMenu.Separator className={clsx(s.Separator, className)} role=\"separator\" />\n}\n\nexport type MenuContentProps = {\n children: React.ReactNode\n /**\n * The preferred side of the trigger to render against when open. Will be reversed when collisions occur.\n * @default bottom\n */\n side?: DropdownMenu.DropdownMenuContentProps[\"side\"]\n /**\n * The distance in pixels from the trigger.\n * @default 5\n */\n sideOffset?: DropdownMenu.DropdownMenuContentProps[\"sideOffset\"]\n /**\n * The preferred alignment against the trigger. May change when collisions occur.\n * @default center\n */\n align?: DropdownMenu.DropdownMenuContentProps[\"align\"]\n /**\n * An offset in pixels from the \"start\" or \"end\" alignment options.\n * @default 0\n */\n alignOffset?: DropdownMenu.DropdownMenuContentProps[\"alignOffset\"]\n /**\n * Defines the `width` property of the content\n * @default auto\n */\n width?: number | \"auto\"\n /**\n * Defines the `min-width` property of the content, in pixels.\n * @default 300\n */\n minWidth?: number | \"auto\"\n /**\n * Defines the `max-width` property of the content, in pixels.\n */\n maxHeight?: number\n}\n\nconst Content = ({\n children,\n side,\n sideOffset = 5,\n align,\n alignOffset,\n width,\n minWidth,\n maxHeight,\n}: MenuContentProps) => {\n const { open } = useMenuContext()\n\n return (\n <DropdownMenu.Portal forceMount>\n <TransitionGroup className={s.Menu} enterDuration={350} exitDuration={200} disableAnimations>\n {open && (\n <DropdownMenu.Content\n key=\"dropdown\"\n forceMount\n className={s.MenuList}\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset ?? (align === \"center\" ? 0 : -5)}\n avoidCollisions\n collisionPadding={{ bottom: 30, top: 30, left: 12, right: 12 }}\n onEscapeKeyDown={preventDefaultHandler}\n style={toCssVariables({\n \"menu-width\": width,\n \"menu-min-width\": minWidth,\n \"menu-max-height\": maxHeight,\n })}\n >\n {children}\n </DropdownMenu.Content>\n )}\n </TransitionGroup>\n </DropdownMenu.Portal>\n )\n}\n\nconst Trigger = ({ children, disabled }: DropdownMenu.DropdownMenuTriggerProps) => {\n return (\n <DropdownMenu.Trigger asChild disabled={disabled}>\n {children}\n </DropdownMenu.Trigger>\n )\n}\n\ntype SubmenuContextValue = {\n open: boolean\n setOpen: (next: boolean) => void\n triggerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst SubmenuContext = createContext<SubmenuContextValue | null>(null)\n\nconst useSubmenuContext = () => {\n const context = useContext(SubmenuContext)\n\n if (!context) {\n throw new Error(\"Submenu components must be wrapped in <Sub />\")\n }\n\n return context\n}\n\nexport type SubmenuProps = {\n children: React.ReactNode\n /** Force the menu to remain open or closed */\n forceOpen?: boolean\n /** Callback triggered when the modal is opened */\n onOpen?: () => void\n /** Callback triggered when the modal is closed */\n onClose?: () => void\n}\n\nconst Sub = ({ children, forceOpen, onOpen, onClose }: SubmenuProps) => {\n const [open, setOpen] = useState<boolean>(false)\n const triggerRef = useRef<HTMLDivElement>(null)\n const isOpen = forceOpen ?? open\n\n const latestOnOpen = useLatestValue(onOpen)\n const latestOnClose = useLatestValue(onClose)\n\n const handleOpenChange = useCallback(\n (nextState: boolean) => {\n setOpen(nextState)\n if (nextState) {\n latestOnOpen.current?.()\n } else {\n latestOnClose.current?.()\n }\n },\n [latestOnOpen, latestOnClose],\n )\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n // Ensure trigger is focused\n triggerRef.current?.focus()\n })\n\n const store = useMemo<SubmenuContextValue>(\n () => ({\n open: isOpen,\n setOpen: handleOpenChange,\n triggerRef,\n }),\n [isOpen, handleOpenChange],\n )\n\n return (\n <SubmenuContext.Provider value={store}>\n <DropdownMenu.Sub open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </DropdownMenu.Sub>\n </SubmenuContext.Provider>\n )\n}\n\nconst SubTrigger = ({\n className,\n children,\n disabled,\n}: {\n className?: string\n children: ReactNode\n disabled?: boolean\n}) => {\n const { open } = useMenuContext()\n const { triggerRef } = useSubmenuContext()\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we know the outer menu is closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n return (\n <DropdownMenu.SubTrigger\n ref={triggerRef}\n className={clsx(s.MenuItem, s.SubMenuItem, className)}\n disabled={disabled}\n onPointerMove={handlePreventAfterClose}\n onPointerLeave={handlePreventAfterClose}\n >\n <div className={s.PressableInner}>\n {children}\n <ChevronRight width=\"16\" height=\"16\" className={s.SubTriggerIcon} />\n </div>\n </DropdownMenu.SubTrigger>\n )\n}\n\ntype SubContentProps = {\n children: ReactNode\n sideOffset?: DropdownMenu.DropdownMenuSubContentProps[\"sideOffset\"]\n alignOffset?: DropdownMenu.DropdownMenuSubContentProps[\"alignOffset\"]\n width?: number | \"auto\"\n minWidth?: number | \"auto\"\n maxHeight?: number\n}\n\nconst SubContent = ({\n children,\n sideOffset = 4,\n alignOffset = -6,\n width = \"auto\",\n minWidth = \"auto\",\n maxHeight,\n}: SubContentProps) => {\n const { open } = useSubmenuContext()\n\n return (\n <DropdownMenu.Portal forceMount>\n <TransitionGroup className={s.Menu} enterDuration={350} exitDuration={200} disableAnimations>\n {open && (\n <DropdownMenu.SubContent\n key=\"submenu\"\n className={s.MenuList}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n avoidCollisions\n collisionPadding={{ bottom: 30, top: 30, left: 12, right: 12 }}\n onEscapeKeyDown={preventDefaultHandler}\n style={toCssVariables({\n \"menu-width\": width,\n \"menu-min-width\": minWidth,\n \"menu-max-height\": maxHeight,\n })}\n >\n {children}\n </DropdownMenu.SubContent>\n )}\n </TransitionGroup>\n </DropdownMenu.Portal>\n )\n}\n\nexport type MenuRadioGroupProps<T extends string> = {\n /** Controlled value */\n value: T\n /** Fired when selection changes */\n onChange: (value: T) => void\n children: ReactNode\n /**\n * The orientation of the indicator within the radio item.\n * @default end\n */\n indicatorPosition?: \"start\" | \"end\"\n}\n\nconst RadioGroup = <T extends string>({\n children,\n value,\n onChange,\n indicatorPosition = \"end\",\n ...props\n}: MenuRadioGroupProps<T>) => (\n <DropdownMenu.RadioGroup\n {...props}\n value={value}\n onValueChange={(v: string) => onChange(v as T)}\n data-indicator-position={indicatorPosition}\n >\n {children}\n </DropdownMenu.RadioGroup>\n)\n\nexport type MenuRadioItemProps<T extends string> = {\n value: T\n /** Class applied to the radio item */\n className?: string\n children: ReactNode\n /** Callback triggered when the radio item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Disables the radio item */\n disabled?: boolean\n}\n\nconst RadioItem = <T extends string>({ className, children, ...props }: MenuRadioItemProps<T>) => (\n <DropdownMenu.RadioItem className={clsx(s.MenuItem, s.RadioItem, className)} {...props}>\n <div className={s.PressableInner}>\n <div className={s.RadioIndicator}>\n <DropdownMenu.ItemIndicator className={s.RadioIndicatorActive} />\n </div>\n {children}\n </div>\n </DropdownMenu.RadioItem>\n)\n\nexport type MenuCheckboxItemProps = {\n /** Controlled checked state of the checkbox item */\n checked?: DropdownMenu.DropdownMenuCheckboxItemProps[\"checked\"]\n /** Event handler called when the checked state changes */\n onCheckedChange?: DropdownMenu.DropdownMenuCheckboxItemProps[\"onCheckedChange\"]\n /** Class applied to the checkbox item */\n className?: string\n children: ReactNode\n /** Callback triggered when the checkbox item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Disables the checkbox item */\n disabled?: boolean\n /**\n * The orientation of the indicator within the checkbox item.\n * @default end\n */\n indicatorPosition?: \"start\" | \"end\"\n /**\n * Visual treatment for the checkbox indicator.\n * @default solid\n */\n indicatorVariant?: \"solid\" | \"ghost\"\n}\nconst CheckboxItem = ({\n className,\n children,\n indicatorPosition = \"end\",\n indicatorVariant = \"solid\",\n ...props\n}: MenuCheckboxItemProps) => (\n <DropdownMenu.CheckboxItem\n className={clsx(s.MenuItem, s.CheckboxItem, className)}\n {...props}\n data-indicator-position={indicatorPosition}\n data-indicator-variant={indicatorVariant}\n >\n <div className={s.PressableInner}>\n <div className={s.CheckboxIndicator}>\n <DropdownMenu.ItemIndicator>\n {indicatorVariant === \"ghost\" ? (\n <Check className=\"size-4\" />\n ) : (\n <div className={s.CheckboxCircle}>\n <Check className=\"size-4\" />\n </div>\n )}\n </DropdownMenu.ItemIndicator>\n </div>\n {children}\n </div>\n </DropdownMenu.CheckboxItem>\n)\n\nMenu.Content = Content\nMenu.Item = Item\nMenu.ItemActions = ItemActions\nMenu.ItemAction = ItemAction\nMenu.Link = Link\nMenu.Separator = Separator\nMenu.Trigger = Trigger\nMenu.Sub = Sub\nMenu.SubTrigger = SubTrigger\nMenu.SubContent = SubContent\nMenu.CheckboxItem = CheckboxItem\nMenu.RadioGroup = RadioGroup\nMenu.RadioItem = RadioItem\n"]}
|
|
1
|
+
{"version":3,"file":"Menu.js","sourceRoot":"","sources":["../../../../src/components/Menu/Menu.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport { DropdownMenu } from \"radix-ui\"\nimport React, {\n type ComponentProps,\n type ComponentType,\n createContext,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\"\n\nimport clsx from \"clsx\"\nimport { useEscCloseStack } from \"../../hooks/useEscCloseStack\"\nimport { useLatestValue } from \"../../hooks/useLatestValue\"\nimport { preventDefaultHandler, toCssVariables } from \"../../lib/helpers\"\nimport { Button } from \"../Button\"\nimport { Check, ChevronRight } from \"../Icon\"\nimport { useLinkComponent } from \"../PlexUIProvider/internal\"\nimport { TransitionGroup } from \"../Transition\"\nimport s from \"./Menu.module.css\"\n\ntype MenuContextValue = {\n open: boolean\n setOpen: (next: boolean) => void\n}\n\nconst MenuContext = createContext<MenuContextValue | null>(null)\n\nconst useMenuContext = () => {\n const context = useContext(MenuContext)\n\n if (!context) {\n throw new Error(\"Menu components must be wrapped in <Menu />\")\n }\n\n return context\n}\n\nexport type MenuProps = {\n children: React.ReactNode\n /** Force the menu to remain open or closed */\n forceOpen?: boolean\n /** Callback triggered when the modal is opened */\n onOpen?: () => void\n /** Callback triggered when the modal is closed */\n onClose?: () => void\n /**\n * When set to `true`, interaction with outside elements will be disabled and only menu content will be visible to screen readers.\n * @default false\n */\n modal?: boolean\n}\n\nexport const Menu = ({ children, forceOpen, onOpen, onClose, modal = false }: MenuProps) => {\n const [open, setOpen] = useState<boolean>(false)\n const isOpen = forceOpen ?? open\n\n const latestOnOpen = useLatestValue(onOpen)\n const latestOnClose = useLatestValue(onClose)\n\n const handleOpenChange = useCallback(\n (nextState: boolean) => {\n setOpen(nextState)\n if (nextState) {\n latestOnOpen.current?.()\n } else {\n latestOnClose.current?.()\n }\n },\n [latestOnOpen, latestOnClose],\n )\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n })\n\n const store = useMemo<MenuContextValue>(\n () => ({\n open: isOpen,\n setOpen: handleOpenChange,\n }),\n [isOpen, handleOpenChange],\n )\n\n return (\n <MenuContext.Provider value={store}>\n <DropdownMenu.Root open={isOpen} onOpenChange={handleOpenChange} modal={modal}>\n {children}\n </DropdownMenu.Root>\n </MenuContext.Provider>\n )\n}\n\nexport type MenuItemProps = {\n className?: string\n children: React.ReactNode\n /** Callback triggered when the item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Callback triggered when the item is clicked */\n onClick?: DropdownMenu.DropdownMenuItemProps[\"onClick\"]\n /** Disables the menu item */\n disabled?: boolean\n}\n\nconst Item = ({ className, children, disabled, onSelect, onClick }: MenuItemProps) => {\n const { open } = useMenuContext()\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we're always known to be closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n // Custom click handlers\n if (onSelect) {\n return (\n <DropdownMenu.Item\n className={clsx(s.MenuItem, className)}\n onSelect={onSelect}\n onClick={onClick}\n disabled={disabled}\n onPointerMove={handlePreventAfterClose}\n onPointerLeave={handlePreventAfterClose}\n >\n <div className={s.PressableInner}>{children}</div>\n </DropdownMenu.Item>\n )\n }\n\n // Read-only content - will not appear interactive.\n return <div className={clsx(s.MenuItemContent, className)}>{children}</div>\n}\n\nconst ItemActions = ({ className, children }: { className?: string; children: ReactNode }) => {\n return <div className={clsx(s.ItemActions, className)}>{children}</div>\n}\n\nconst ItemAction = ({\n children,\n onClick,\n}: {\n children: ReactNode\n onClick: (evt: MouseEvent) => void\n}) => {\n const { setOpen } = useMenuContext()\n\n return (\n <Button\n className=\"rounded-sm\"\n color=\"secondary\"\n size=\"xs\"\n uniform\n iconSize=\"sm\"\n variant=\"ghost\"\n onClick={(evt) => {\n evt.stopPropagation()\n setOpen(false)\n onClick(evt)\n }}\n >\n {children}\n </Button>\n )\n}\n\ntype MenuLinkProps = Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\" | \"children\"> & {\n /** Content rendered inside the Link */\n children: React.ReactNode\n /** Disables the menu item */\n disabled?: boolean\n}\n\ntype MenuLink = <\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends ComponentType<any> | \"a\" = PlexUI.LinkComponent,\n>(\n props: Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\"> &\n MenuLinkProps & {\n /**\n * Override the default component used for the link. This is useful for\n * using a routing library, or SSR rendering.\n * purposes.\n *\n * @default 'a'\n */\n as?: T\n } & ComponentProps<T>,\n) => ReactNode\n\nconst Link = ((\n props: MenuLinkProps & { href?: string; to?: string; as?: PlexUI.LinkComponent },\n) => {\n const { className, children, href, to, disabled, as: OverrideComponent, ...restProps } = props\n const { open } = useMenuContext()\n\n const propPath = href || to\n // When a path is not provided, default to an anchor\n const isExternal = propPath ? /^https?:\\/\\//.test(propPath) : true\n const DefaultComponent = useLinkComponent()\n const Component = OverrideComponent || (isExternal ? \"a\" : DefaultComponent)\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we're always known to be closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n const linkProps = isExternal\n ? { target: \"_blank\", rel: \"noopener noreferrer\", href: href ?? to }\n : { href, to }\n\n return (\n <DropdownMenu.Item\n asChild\n className={clsx(s.MenuItem, className)}\n disabled={disabled}\n onPointerMove={isExternal ? undefined : handlePreventAfterClose}\n onPointerLeave={isExternal ? undefined : handlePreventAfterClose}\n >\n <Component {...linkProps} {...restProps}>\n <span className={s.PressableInner}>{children}</span>\n </Component>\n </DropdownMenu.Item>\n )\n}) as MenuLink\n\nconst Separator = ({ className }: { className?: string }) => {\n return <DropdownMenu.Separator className={clsx(s.Separator, className)} role=\"separator\" />\n}\n\n\nconst Label = ({ className, children }: { className?: string; children: ReactNode }) => {\n return (\n <DropdownMenu.Label className={clsx(s.MenuLabel, className)}>\n {children}\n </DropdownMenu.Label>\n )\n}\n\nconst Group = ({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) => {\n return <DropdownMenu.Group className={className}>{children}</DropdownMenu.Group>\n}\n\nexport type MenuContentProps = {\n children: React.ReactNode\n /**\n * The preferred side of the trigger to render against when open. Will be reversed when collisions occur.\n * @default bottom\n */\n side?: DropdownMenu.DropdownMenuContentProps[\"side\"]\n /**\n * The distance in pixels from the trigger.\n * @default 5\n */\n sideOffset?: DropdownMenu.DropdownMenuContentProps[\"sideOffset\"]\n /**\n * The preferred alignment against the trigger. May change when collisions occur.\n * @default center\n */\n align?: DropdownMenu.DropdownMenuContentProps[\"align\"]\n /**\n * An offset in pixels from the \"start\" or \"end\" alignment options.\n * @default 0\n */\n alignOffset?: DropdownMenu.DropdownMenuContentProps[\"alignOffset\"]\n /**\n * Defines the `width` property of the content\n * @default auto\n */\n width?: number | \"auto\"\n /**\n * Defines the `min-width` property of the content, in pixels.\n * @default 300\n */\n minWidth?: number | \"auto\"\n /**\n * Defines the `max-width` property of the content, in pixels.\n */\n maxHeight?: number\n}\n\nconst Content = ({\n children,\n side,\n sideOffset = 5,\n align,\n alignOffset,\n width,\n minWidth,\n maxHeight,\n}: MenuContentProps) => {\n const { open } = useMenuContext()\n\n return (\n <DropdownMenu.Portal forceMount>\n <TransitionGroup className={s.Menu} enterDuration={350} exitDuration={200} disableAnimations>\n {open && (\n <DropdownMenu.Content\n key=\"dropdown\"\n forceMount\n className={s.MenuList}\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset ?? (align === \"center\" ? 0 : -5)}\n avoidCollisions\n collisionPadding={{ bottom: 30, top: 30, left: 12, right: 12 }}\n onEscapeKeyDown={preventDefaultHandler}\n style={toCssVariables({\n \"menu-width\": width,\n \"menu-min-width\": minWidth,\n \"menu-max-height\": maxHeight,\n })}\n >\n {children}\n </DropdownMenu.Content>\n )}\n </TransitionGroup>\n </DropdownMenu.Portal>\n )\n}\n\nconst Trigger = ({ children, disabled }: DropdownMenu.DropdownMenuTriggerProps) => {\n return (\n <DropdownMenu.Trigger asChild disabled={disabled}>\n {children}\n </DropdownMenu.Trigger>\n )\n}\n\ntype SubmenuContextValue = {\n open: boolean\n setOpen: (next: boolean) => void\n triggerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst SubmenuContext = createContext<SubmenuContextValue | null>(null)\n\nconst useSubmenuContext = () => {\n const context = useContext(SubmenuContext)\n\n if (!context) {\n throw new Error(\"Submenu components must be wrapped in <Sub />\")\n }\n\n return context\n}\n\nexport type SubmenuProps = {\n children: React.ReactNode\n /** Force the menu to remain open or closed */\n forceOpen?: boolean\n /** Callback triggered when the modal is opened */\n onOpen?: () => void\n /** Callback triggered when the modal is closed */\n onClose?: () => void\n}\n\nconst Sub = ({ children, forceOpen, onOpen, onClose }: SubmenuProps) => {\n const [open, setOpen] = useState<boolean>(false)\n const triggerRef = useRef<HTMLDivElement>(null)\n const isOpen = forceOpen ?? open\n\n const latestOnOpen = useLatestValue(onOpen)\n const latestOnClose = useLatestValue(onClose)\n\n const handleOpenChange = useCallback(\n (nextState: boolean) => {\n setOpen(nextState)\n if (nextState) {\n latestOnOpen.current?.()\n } else {\n latestOnClose.current?.()\n }\n },\n [latestOnOpen, latestOnClose],\n )\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n // Ensure trigger is focused\n triggerRef.current?.focus()\n })\n\n const store = useMemo<SubmenuContextValue>(\n () => ({\n open: isOpen,\n setOpen: handleOpenChange,\n triggerRef,\n }),\n [isOpen, handleOpenChange],\n )\n\n return (\n <SubmenuContext.Provider value={store}>\n <DropdownMenu.Sub open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </DropdownMenu.Sub>\n </SubmenuContext.Provider>\n )\n}\n\nconst SubTrigger = ({\n className,\n children,\n disabled,\n}: {\n className?: string\n children: ReactNode\n disabled?: boolean\n}) => {\n const { open } = useMenuContext()\n const { triggerRef } = useSubmenuContext()\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we know the outer menu is closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n return (\n <DropdownMenu.SubTrigger\n ref={triggerRef}\n className={clsx(s.MenuItem, s.SubMenuItem, className)}\n disabled={disabled}\n onPointerMove={handlePreventAfterClose}\n onPointerLeave={handlePreventAfterClose}\n >\n <div className={s.PressableInner}>\n {children}\n <ChevronRight width=\"16\" height=\"16\" className={s.SubTriggerIcon} />\n </div>\n </DropdownMenu.SubTrigger>\n )\n}\n\ntype SubContentProps = {\n children: ReactNode\n sideOffset?: DropdownMenu.DropdownMenuSubContentProps[\"sideOffset\"]\n alignOffset?: DropdownMenu.DropdownMenuSubContentProps[\"alignOffset\"]\n width?: number | \"auto\"\n minWidth?: number | \"auto\"\n maxHeight?: number\n}\n\nconst SubContent = ({\n children,\n sideOffset = 4,\n alignOffset = -6,\n width = \"auto\",\n minWidth = \"auto\",\n maxHeight,\n}: SubContentProps) => {\n const { open } = useSubmenuContext()\n\n return (\n <DropdownMenu.Portal forceMount>\n <TransitionGroup className={s.Menu} enterDuration={350} exitDuration={200} disableAnimations>\n {open && (\n <DropdownMenu.SubContent\n key=\"submenu\"\n className={s.MenuList}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n avoidCollisions\n collisionPadding={{ bottom: 30, top: 30, left: 12, right: 12 }}\n onEscapeKeyDown={preventDefaultHandler}\n style={toCssVariables({\n \"menu-width\": width,\n \"menu-min-width\": minWidth,\n \"menu-max-height\": maxHeight,\n })}\n >\n {children}\n </DropdownMenu.SubContent>\n )}\n </TransitionGroup>\n </DropdownMenu.Portal>\n )\n}\n\nexport type MenuRadioGroupProps<T extends string> = {\n /** Controlled value */\n value: T\n /** Fired when selection changes */\n onChange: (value: T) => void\n children: ReactNode\n /**\n * The orientation of the indicator within the radio item.\n * @default end\n */\n indicatorPosition?: \"start\" | \"end\"\n}\n\nconst RadioGroup = <T extends string>({\n children,\n value,\n onChange,\n indicatorPosition = \"end\",\n ...props\n}: MenuRadioGroupProps<T>) => (\n <DropdownMenu.RadioGroup\n {...props}\n value={value}\n onValueChange={(v: string) => onChange(v as T)}\n data-indicator-position={indicatorPosition}\n >\n {children}\n </DropdownMenu.RadioGroup>\n)\n\nexport type MenuRadioItemProps<T extends string> = {\n value: T\n /** Class applied to the radio item */\n className?: string\n children: ReactNode\n /** Callback triggered when the radio item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Disables the radio item */\n disabled?: boolean\n}\n\nconst RadioItem = <T extends string>({ className, children, ...props }: MenuRadioItemProps<T>) => (\n <DropdownMenu.RadioItem className={clsx(s.MenuItem, s.RadioItem, className)} {...props}>\n <div className={s.PressableInner}>\n <div className={s.RadioIndicator}>\n <DropdownMenu.ItemIndicator className={s.RadioIndicatorActive} />\n </div>\n {children}\n </div>\n </DropdownMenu.RadioItem>\n)\n\nexport type MenuCheckboxItemProps = {\n /** Controlled checked state of the checkbox item */\n checked?: DropdownMenu.DropdownMenuCheckboxItemProps[\"checked\"]\n /** Event handler called when the checked state changes */\n onCheckedChange?: DropdownMenu.DropdownMenuCheckboxItemProps[\"onCheckedChange\"]\n /** Class applied to the checkbox item */\n className?: string\n children: ReactNode\n /** Callback triggered when the checkbox item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Disables the checkbox item */\n disabled?: boolean\n /**\n * The orientation of the indicator within the checkbox item.\n * @default end\n */\n indicatorPosition?: \"start\" | \"end\"\n /**\n * Visual treatment for the checkbox indicator.\n * @default solid\n */\n indicatorVariant?: \"solid\" | \"ghost\"\n}\nconst CheckboxItem = ({\n className,\n children,\n indicatorPosition = \"end\",\n indicatorVariant = \"solid\",\n ...props\n}: MenuCheckboxItemProps) => (\n <DropdownMenu.CheckboxItem\n className={clsx(s.MenuItem, s.CheckboxItem, className)}\n {...props}\n data-indicator-position={indicatorPosition}\n data-indicator-variant={indicatorVariant}\n >\n <div className={s.PressableInner}>\n <div className={s.CheckboxIndicator}>\n <DropdownMenu.ItemIndicator>\n {indicatorVariant === \"ghost\" ? (\n <Check className=\"size-4\" />\n ) : (\n <div className={s.CheckboxCircle}>\n <Check className=\"size-4\" />\n </div>\n )}\n </DropdownMenu.ItemIndicator>\n </div>\n {children}\n </div>\n </DropdownMenu.CheckboxItem>\n)\n\nMenu.Content = Content\nMenu.Item = Item\nMenu.ItemActions = ItemActions\nMenu.ItemAction = ItemAction\nMenu.Link = Link\nMenu.Separator = Separator\nMenu.Trigger = Trigger\nMenu.Sub = Sub\nMenu.SubTrigger = SubTrigger\nMenu.SubContent = SubContent\nMenu.CheckboxItem = CheckboxItem\nMenu.RadioGroup = RadioGroup\nMenu.RadioItem = RadioItem\nMenu.Label = Label\nMenu.Group = Group\n"]}
|
|
@@ -137,6 +137,16 @@
|
|
|
137
137
|
height: 1px;
|
|
138
138
|
margin: var(--menu-separator-gutter);
|
|
139
139
|
background: var(--menu-separator-background-color);
|
|
140
|
+
}.MenuLabel {
|
|
141
|
+
padding: var(--menu-item-padding);
|
|
142
|
+
padding-bottom: calc(var(--spacing) * 0.5);
|
|
143
|
+
color: var(--color-text-tertiary);
|
|
144
|
+
font-size: var(--font-size-xs);
|
|
145
|
+
font-weight: var(--font-weight-semibold);
|
|
146
|
+
line-height: var(--line-height-xs);
|
|
147
|
+
-webkit-user-select: none;
|
|
148
|
+
-moz-user-select: none;
|
|
149
|
+
user-select: none;
|
|
140
150
|
}.SubMenuItem {
|
|
141
151
|
justify-content: space-between;
|
|
142
152
|
}.SubTriggerIcon {
|
|
@@ -41,6 +41,14 @@ export declare const Menu: {
|
|
|
41
41
|
CheckboxItem: ({ className, children, indicatorPosition, indicatorVariant, ...props }: MenuCheckboxItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
42
42
|
RadioGroup: <T extends string>({ children, value, onChange, indicatorPosition, ...props }: MenuRadioGroupProps<T>) => import("react/jsx-runtime").JSX.Element;
|
|
43
43
|
RadioItem: <T extends string>({ className, children, ...props }: MenuRadioItemProps<T>) => import("react/jsx-runtime").JSX.Element;
|
|
44
|
+
Label: ({ className, children }: {
|
|
45
|
+
className?: string;
|
|
46
|
+
children: ReactNode;
|
|
47
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
48
|
+
Group: ({ className, children, }: {
|
|
49
|
+
className?: string;
|
|
50
|
+
children: ReactNode;
|
|
51
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
44
52
|
};
|
|
45
53
|
export type MenuItemProps = {
|
|
46
54
|
className?: string;
|