mantine-contextmenu 8.2.0 → 8.3.7

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package/index.ts","../package/ContextMenuDivider.tsx","../package/ContextMenuItem.tsx","../package/ContextMenu.tsx","../package/ContextMenuProvider.tsx","../package/ContextMenuPortal.tsx","../package/ContextMenuOverlay.tsx","../package/utils.ts"],"sourcesContent":["'use client';\n\nexport * from './ContextMenuDivider';\nexport * from './ContextMenuItem';\nexport * from './ContextMenuPortal';\nexport * from './ContextMenuProvider';\nexport * from './types';\nexport * from './utils';\n","import { Box } from '@mantine/core';\nimport clsx from 'clsx';\nimport type { ContextMenuItemOptions } from './types';\n\nexport type ContextMenuDividerProps = Pick<ContextMenuItemOptions, 'className' | 'style'>;\n\nexport function ContextMenuDivider({ className, style }: ContextMenuDividerProps) {\n return <Box className={clsx('mantine-contextmenu-divider', className)} style={style} />;\n}\n","import { Box, UnstyledButton, parseThemeColor, rgba } from '@mantine/core';\nimport { useMediaQuery, useTimeout } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { type MouseEventHandler, useContext, useRef, useState } from 'react';\nimport { ContextMenu } from './ContextMenu';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuItemOptions, ContextMenuOptions, WithRequiredProperty } from './types';\n\nexport function ContextMenuItem({\n className,\n style,\n icon,\n iconRight,\n title,\n color,\n disabled,\n onClick,\n onHide,\n items,\n submenuProps,\n}: WithRequiredProperty<Omit<ContextMenuItemOptions, 'key'>, 'title'> & {\n onHide: () => void;\n submenuProps: Pick<ContextMenuOptions, 'className' | 'classNames' | 'style' | 'styles'>;\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n\n const hoverAvailable = useMediaQuery('(hover: hover)');\n\n const [submenuPosition, setSubmenuPosition] = useState<{ x: number; y: number } | null>(null);\n\n const { start: startShowingSubmenu, clear: stopShowingSubmenu } = useTimeout(() => {\n const { top: y, right: x } = ref.current!.getBoundingClientRect();\n setSubmenuPosition({ x, y });\n }, submenuDelay);\n\n const { start: startHidingSubmenu, clear: stopHidingSubmenu } = useTimeout(() => {\n setSubmenuPosition(null);\n }, submenuDelay);\n\n const showSubmenu = () => {\n stopHidingSubmenu();\n startShowingSubmenu();\n };\n\n const hideSubmenu = () => {\n stopShowingSubmenu();\n startHidingSubmenu();\n };\n\n const hasSubmenu = items && !disabled;\n const showSubmenuOnHover = hasSubmenu && hoverAvailable;\n\n const handleClick: MouseEventHandler<HTMLButtonElement> | undefined = hasSubmenu\n ? (e) => {\n e.stopPropagation();\n showSubmenu();\n }\n : onClick\n ? (e) => {\n onHide();\n onClick!(e);\n }\n : undefined;\n\n return (\n <div\n onMouseEnter={showSubmenuOnHover ? showSubmenu : undefined}\n onMouseLeave={showSubmenuOnHover ? hideSubmenu : undefined}\n >\n <UnstyledButton\n ref={ref}\n style={[\n (theme) => {\n const { colors } = theme;\n const parsedColor = color ? parseThemeColor({ color, theme }).value : undefined;\n return {\n '--mantine-contextmenu-item-button-color': parsedColor ? parsedColor : 'var(--mantine-color-text)',\n '--mantine-contextmenu-item-button-hover-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.08)\n : rgba(colors.gray[4], 0.25),\n '--mantine-contextmenu-item-button-hover-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.15)\n : rgba(colors.dark[3], 0.25),\n '--mantine-contextmenu-item-button-pressed-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.2)\n : rgba(colors.gray[4], 0.5),\n '--mantine-contextmenu-item-button-pressed-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.3)\n : rgba(colors.dark[3], 0.5),\n };\n },\n style,\n ]}\n className={clsx('mantine-contextmenu-item-button', className)}\n disabled={disabled}\n onClick={handleClick}\n >\n {icon && (\n <Box fz={0} mr=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ml=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ml=\"xs\">\n ›\n </Box>\n )\n )}\n </UnstyledButton>\n {submenuPosition && (\n <ContextMenu content={items as ContextMenuContent} onHide={onHide} {...submenuProps} {...submenuPosition} />\n )}\n </div>\n );\n}\n","import { Paper, px, useDirection } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { useContext } from 'react';\nimport { ContextMenuDivider } from './ContextMenuDivider';\nimport { ContextMenuItem } from './ContextMenuItem';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuOptions } from './types';\nimport { humanize } from './utils';\n\nexport type ContextMenuInstanceOptions = {\n x: number;\n y: number;\n content: ContextMenuContent;\n};\n\nexport type ContextMenuProps = ContextMenuOptions &\n ContextMenuInstanceOptions & {\n onHide: () => void;\n };\n\nexport function ContextMenu({ x, y, content, zIndex, onHide, className, style, classNames, styles }: ContextMenuProps) {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef] = useResizeObserver<HTMLDivElement>();\n const { width, height } = paperRef.current?.getBoundingClientRect() || { width: 0, height: 0 };\n\n let windowWidth = 0;\n let windowHeight = 0;\n if (typeof window !== 'undefined') ({ innerWidth: windowWidth, innerHeight: windowHeight } = window);\n\n const { dir } = useDirection();\n const submenuProps = { className, classNames, style, styles };\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', className, classNames?.root)}\n style={[\n ({ spacing: { md } }) => {\n const mdSpacing = px(md) as number;\n return {\n zIndex,\n top: y + height + mdSpacing > windowHeight ? windowHeight - height - mdSpacing : y,\n left:\n dir === 'ltr'\n ? x + width + mdSpacing > windowWidth\n ? windowWidth - width - mdSpacing\n : x\n : windowWidth - mdSpacing - (x - width - mdSpacing < 0 ? width + mdSpacing : x),\n };\n },\n style,\n styles?.root,\n ]}\n >\n {Array.isArray(content)\n ? content.map(({ key, hidden, className, style, onClick, items, title, ...otherOptions }) =>\n hidden ? null : onClick || items ? (\n <ContextMenuItem\n key={key}\n className={clsx(classNames?.item, className)}\n style={[styles?.item, style]}\n title={title ?? humanize(key)}\n onClick={onClick}\n onHide={onHide}\n items={items}\n submenuProps={submenuProps}\n {...otherOptions}\n />\n ) : (\n <ContextMenuDivider\n key={key}\n className={clsx(classNames?.divider, className)}\n style={[styles?.divider, style]}\n />\n )\n )\n : content(onHide)}\n </Paper>\n );\n}\n","import { createContext, useContext, useState } from 'react';\nimport type { ContextMenuInstanceOptions } from './ContextMenu';\nimport { ContextMenuPortal } from './ContextMenuPortal';\nimport type {\n ContextMenuOptions,\n ContextMenuProviderProps,\n ContextMenuSettings,\n HideContextMenuFunction,\n ShowContextMenuFunction,\n WithRequiredProperty,\n} from './types';\n\nconst DEFAULT_SETTINGS: WithRequiredProperty<ContextMenuSettings, 'shadow' | 'borderRadius' | 'submenuDelay'> = {\n shadow: 'sm',\n borderRadius: 'xs',\n submenuDelay: 500,\n repositionOnRepeat: false,\n};\n\nexport const ContextMenuSettingsCtx = createContext(DEFAULT_SETTINGS);\nexport const ContextMenuCtx = createContext<{\n /**\n * Function that shows the context menu.\n */\n showContextMenu: ShowContextMenuFunction;\n\n /**\n * Function that hides the context menu.\n */\n hideContextMenu: HideContextMenuFunction;\n\n /**\n * Boolean indicating whether the context menu is currently visible.\n */\n isContextMenuVisible: boolean;\n}>({ showContextMenu: () => () => undefined, hideContextMenu: () => undefined, isContextMenuVisible: false });\n\n/**\n * Provider that allows to show a context menu anywhere in your application.\n * If you wrap your application with this provider, you can use the `useContextMenu` hook\n * anywhere in the component tree to access a function that shows the context menu.\n */\nexport function ContextMenuProvider({\n zIndex = 9999,\n shadow = DEFAULT_SETTINGS.shadow,\n borderRadius = DEFAULT_SETTINGS.borderRadius,\n submenuDelay = DEFAULT_SETTINGS.submenuDelay,\n repositionOnRepeat = DEFAULT_SETTINGS.repositionOnRepeat,\n children,\n}: ContextMenuProviderProps) {\n const [data, setData] = useState<(ContextMenuInstanceOptions & ContextMenuOptions) | null>(null);\n\n const hideContextMenu = () => {\n setData(null);\n };\n\n const showContextMenu: ShowContextMenuFunction = (content, options) => (e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const { x, y } =\n 'touches' in e ? { x: e.touches.item(0).clientX, y: e.touches.item(0).clientY } : { x: e.clientX, y: e.clientY };\n\n setData({\n x,\n y,\n content,\n zIndex: options?.zIndex || zIndex,\n className: options?.className,\n style: options?.style,\n classNames: options?.classNames,\n styles: options?.styles,\n });\n };\n\n return (\n <ContextMenuSettingsCtx.Provider value={{ shadow, borderRadius, submenuDelay, repositionOnRepeat }}>\n <ContextMenuCtx.Provider value={{ showContextMenu, hideContextMenu, isContextMenuVisible: !!data }}>\n {children}\n {data && <ContextMenuPortal onHide={hideContextMenu} {...data} />}\n </ContextMenuCtx.Provider>\n </ContextMenuSettingsCtx.Provider>\n );\n}\n\n/**\n * Hook returning functions that show and hide the context menu.\n */\nexport function useContextMenu() {\n return useContext(ContextMenuCtx);\n}\n","import { Portal } from '@mantine/core';\nimport { useHotkeys, useWindowEvent } from '@mantine/hooks';\nimport { ContextMenu, type ContextMenuProps } from './ContextMenu';\nimport { ContextMenuOverlay } from './ContextMenuOverlay';\n\nexport type ContextMenuPortalProps = ContextMenuProps & {\n zIndex?: number;\n};\n\nexport function ContextMenuPortal({ onHide, zIndex, ...otherProps }: ContextMenuPortalProps) {\n useWindowEvent('resize', onHide);\n useWindowEvent('scroll', onHide);\n useHotkeys([['Escape', onHide]]);\n\n return (\n <Portal>\n <ContextMenuOverlay zIndex={zIndex} onHide={onHide}>\n <ContextMenu {...otherProps} onHide={onHide} />\n </ContextMenuOverlay>\n </Portal>\n );\n}\n","import { useContext } from 'react';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\n\nexport type ContextMenuOverlayProps = React.PropsWithChildren<{\n zIndex: number | undefined;\n onHide: () => void;\n}>;\n\nexport function ContextMenuOverlay({ zIndex, children, onHide }: ContextMenuOverlayProps) {\n const { repositionOnRepeat } = useContext(ContextMenuSettingsCtx);\n\n const handleHide = (e: React.MouseEvent) => {\n e.preventDefault();\n onHide();\n };\n\n const handleContextMenu = async (e: React.MouseEvent) => {\n e.preventDefault();\n if (repositionOnRepeat) {\n const { clientX, clientY } = e;\n try {\n document\n .elementsFromPoint(clientX, clientY)[1]\n .dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, clientX, clientY }));\n } catch {\n // ignore error\n }\n } else {\n onHide();\n }\n };\n\n return (\n <div\n className=\"mantine-contextmenu-overlay\"\n style={{ zIndex }}\n onClick={handleHide}\n onContextMenu={handleContextMenu}\n >\n {children}\n </div>\n );\n}\n","/**\n * Utility function that returns a humanized version of a string, e.g. \"camelCase\" -> \"Camel Case\"\n */\nexport function humanize(value: string) {\n const str = value\n .replace(/([a-z\\d])([A-Z]+)/g, '$1 $2')\n .replace(/\\W|_/g, ' ')\n .trim()\n .toLowerCase();\n return `${str.charAt(0).toUpperCase()}${str.slice(1)}`;\n}\n"],"mappings":"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","names":["index_exports","__export","ContextMenuCtx","ContextMenuDivider","ContextMenuItem","ContextMenuPortal","ContextMenuProvider","ContextMenuSettingsCtx","humanize","useContextMenu","__toCommonJS","import_core","import_clsx","import_jsx_runtime","ContextMenuDivider","className","style","clsx","import_core","import_hooks","import_clsx","import_react","import_core","import_hooks","import_clsx","import_react","import_react","import_core","import_hooks","import_react","import_jsx_runtime","ContextMenuOverlay","zIndex","children","onHide","repositionOnRepeat","ContextMenuSettingsCtx","e","clientX","clientY","import_jsx_runtime","ContextMenuPortal","onHide","zIndex","otherProps","ContextMenuOverlay","ContextMenu","import_jsx_runtime","DEFAULT_SETTINGS","ContextMenuSettingsCtx","ContextMenuCtx","ContextMenuProvider","zIndex","shadow","borderRadius","submenuDelay","repositionOnRepeat","children","data","setData","hideContextMenu","showContextMenu","content","options","e","x","y","ContextMenuPortal","useContextMenu","humanize","value","str","import_jsx_runtime","ContextMenu","x","y","content","zIndex","onHide","className","style","classNames","styles","shadow","borderRadius","ContextMenuSettingsCtx","paperRef","width","height","windowWidth","windowHeight","dir","submenuProps","clsx","md","mdSpacing","key","hidden","onClick","items","title","otherOptions","ContextMenuItem","humanize","ContextMenuDivider","import_jsx_runtime","ContextMenuItem","className","style","icon","iconRight","title","color","disabled","onClick","onHide","items","submenuProps","ref","submenuDelay","ContextMenuSettingsCtx","hoverAvailable","submenuPosition","setSubmenuPosition","startShowingSubmenu","stopShowingSubmenu","y","x","startHidingSubmenu","stopHidingSubmenu","showSubmenu","hideSubmenu","hasSubmenu","showSubmenuOnHover","handleClick","e","theme","colors","parsedColor","clsx","ContextMenu"]}
1
+ {"version":3,"sources":["../package/index.ts","../package/ContextMenuDivider.tsx","../package/ContextMenuItem.tsx","../package/ContextMenu.tsx","../package/ContextMenuProvider.tsx","../package/ContextMenuPortal.tsx","../package/ContextMenuOverlay.tsx","../package/utils.ts"],"sourcesContent":["'use client';\n\nexport * from './ContextMenuDivider';\nexport * from './ContextMenuItem';\nexport * from './ContextMenuPortal';\nexport * from './ContextMenuProvider';\nexport * from './types';\nexport * from './utils';\n","import { Box } from '@mantine/core';\nimport clsx from 'clsx';\nimport type { ContextMenuItemOptions } from './types';\n\nexport type ContextMenuDividerProps = Pick<ContextMenuItemOptions, 'className' | 'style'>;\n\nexport function ContextMenuDivider({ className, style }: ContextMenuDividerProps) {\n return <Box className={clsx('mantine-contextmenu-divider', className)} style={style} />;\n}\n","import { Box, UnstyledButton, parseThemeColor, rgba } from '@mantine/core';\nimport { useMediaQuery, useTimeout } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { type MouseEventHandler, useContext, useRef, useState } from 'react';\nimport { ContextMenu } from './ContextMenu';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuItemOptions, ContextMenuOptions, WithRequiredProperty } from './types';\n\nexport function ContextMenuItem({\n className,\n style,\n icon,\n iconRight,\n title,\n color,\n disabled,\n onClick,\n onHide,\n items,\n submenuProps,\n}: WithRequiredProperty<Omit<ContextMenuItemOptions, 'key'>, 'title'> & {\n onHide: () => void;\n submenuProps: Pick<ContextMenuOptions, 'className' | 'classNames' | 'style' | 'styles'>;\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n\n const hoverAvailable = useMediaQuery('(hover: hover)');\n\n const [submenuPosition, setSubmenuPosition] = useState<{ x: number; y: number } | null>(null);\n\n const { start: startShowingSubmenu, clear: stopShowingSubmenu } = useTimeout(() => {\n const { top: y, right: x } = ref.current!.getBoundingClientRect();\n setSubmenuPosition({ x, y });\n }, submenuDelay);\n\n const { start: startHidingSubmenu, clear: stopHidingSubmenu } = useTimeout(() => {\n setSubmenuPosition(null);\n }, submenuDelay);\n\n const showSubmenu = () => {\n stopHidingSubmenu();\n startShowingSubmenu();\n };\n\n const hideSubmenu = () => {\n stopShowingSubmenu();\n startHidingSubmenu();\n };\n\n const hasSubmenu = items && !disabled;\n const showSubmenuOnHover = hasSubmenu && hoverAvailable;\n\n const handleClick: MouseEventHandler<HTMLButtonElement> | undefined = hasSubmenu\n ? (e) => {\n e.stopPropagation();\n showSubmenu();\n }\n : onClick\n ? (e) => {\n onHide();\n onClick!(e);\n }\n : undefined;\n\n return (\n <div\n onMouseEnter={showSubmenuOnHover ? showSubmenu : undefined}\n onMouseLeave={showSubmenuOnHover ? hideSubmenu : undefined}\n >\n <UnstyledButton\n ref={ref}\n style={[\n (theme) => {\n const { colors } = theme;\n const parsedColor = color ? parseThemeColor({ color, theme }).value : undefined;\n return {\n '--mantine-contextmenu-item-button-color': parsedColor ? parsedColor : 'var(--mantine-color-text)',\n '--mantine-contextmenu-item-button-hover-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.08)\n : rgba(colors.gray[4], 0.25),\n '--mantine-contextmenu-item-button-hover-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.15)\n : rgba(colors.dark[3], 0.25),\n '--mantine-contextmenu-item-button-pressed-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.2)\n : rgba(colors.gray[4], 0.5),\n '--mantine-contextmenu-item-button-pressed-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.3)\n : rgba(colors.dark[3], 0.5),\n };\n },\n style,\n ]}\n className={clsx('mantine-contextmenu-item-button', className)}\n disabled={disabled}\n onClick={handleClick}\n >\n {icon && (\n <Box fz={0} mr=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ml=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ml=\"xs\">\n ›\n </Box>\n )\n )}\n </UnstyledButton>\n {submenuPosition && (\n <ContextMenu content={items as ContextMenuContent} onHide={onHide} {...submenuProps} {...submenuPosition} />\n )}\n </div>\n );\n}\n","import { Paper, px, useDirection } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { useContext } from 'react';\nimport { ContextMenuDivider } from './ContextMenuDivider';\nimport { ContextMenuItem } from './ContextMenuItem';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuOptions } from './types';\nimport { humanize } from './utils';\n\nexport type ContextMenuInstanceOptions = {\n x: number;\n y: number;\n content: ContextMenuContent;\n};\n\nexport type ContextMenuProps = ContextMenuOptions &\n ContextMenuInstanceOptions & {\n onHide: () => void;\n };\n\nexport function ContextMenu({ x, y, content, zIndex, onHide, className, style, classNames, styles }: ContextMenuProps) {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef] = useResizeObserver<HTMLDivElement>();\n // eslint-disable-next-line react-hooks/refs\n const { width, height } = paperRef.current?.getBoundingClientRect() || { width: 0, height: 0 };\n\n let windowWidth = 0;\n let windowHeight = 0;\n if (typeof window !== 'undefined') ({ innerWidth: windowWidth, innerHeight: windowHeight } = window);\n\n const { dir } = useDirection();\n const submenuProps = { className, classNames, style, styles };\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', className, classNames?.root)}\n style={[\n ({ spacing: { md } }) => {\n const mdSpacing = px(md) as number;\n return {\n zIndex,\n top: y + height + mdSpacing > windowHeight ? windowHeight - height - mdSpacing : y,\n left:\n dir === 'ltr'\n ? x + width + mdSpacing > windowWidth\n ? windowWidth - width - mdSpacing\n : x\n : windowWidth - mdSpacing - (x - width - mdSpacing < 0 ? width + mdSpacing : x),\n };\n },\n style,\n styles?.root,\n ]}\n >\n {Array.isArray(content)\n ? content.map(({ key, hidden, className, style, onClick, items, title, ...otherOptions }) =>\n hidden ? null : onClick || items ? (\n <ContextMenuItem\n key={key}\n className={clsx(classNames?.item, className)}\n style={[styles?.item, style]}\n title={title ?? humanize(key)}\n onClick={onClick}\n onHide={onHide}\n items={items}\n submenuProps={submenuProps}\n {...otherOptions}\n />\n ) : (\n <ContextMenuDivider\n key={key}\n className={clsx(classNames?.divider, className)}\n style={[styles?.divider, style]}\n />\n )\n )\n : content(onHide)}\n </Paper>\n );\n}\n","import { createContext, useContext, useState } from 'react';\nimport type { ContextMenuInstanceOptions } from './ContextMenu';\nimport { ContextMenuPortal } from './ContextMenuPortal';\nimport type {\n ContextMenuOptions,\n ContextMenuProviderProps,\n ContextMenuSettings,\n HideContextMenuFunction,\n ShowContextMenuFunction,\n WithRequiredProperty,\n} from './types';\n\nconst DEFAULT_SETTINGS: WithRequiredProperty<ContextMenuSettings, 'shadow' | 'borderRadius' | 'submenuDelay'> = {\n shadow: 'sm',\n borderRadius: 'xs',\n submenuDelay: 500,\n repositionOnRepeat: false,\n};\n\nexport const ContextMenuSettingsCtx = createContext(DEFAULT_SETTINGS);\nexport const ContextMenuCtx = createContext<{\n /**\n * Function that shows the context menu.\n */\n showContextMenu: ShowContextMenuFunction;\n\n /**\n * Function that hides the context menu.\n */\n hideContextMenu: HideContextMenuFunction;\n\n /**\n * Boolean indicating whether the context menu is currently visible.\n */\n isContextMenuVisible: boolean;\n}>({ showContextMenu: () => () => undefined, hideContextMenu: () => undefined, isContextMenuVisible: false });\n\n/**\n * Provider that allows to show a context menu anywhere in your application.\n * If you wrap your application with this provider, you can use the `useContextMenu` hook\n * anywhere in the component tree to access a function that shows the context menu.\n */\nexport function ContextMenuProvider({\n zIndex = 9999,\n shadow = DEFAULT_SETTINGS.shadow,\n borderRadius = DEFAULT_SETTINGS.borderRadius,\n submenuDelay = DEFAULT_SETTINGS.submenuDelay,\n repositionOnRepeat = DEFAULT_SETTINGS.repositionOnRepeat,\n children,\n}: ContextMenuProviderProps) {\n const [data, setData] = useState<(ContextMenuInstanceOptions & ContextMenuOptions) | null>(null);\n\n const hideContextMenu = () => {\n setData(null);\n };\n\n const showContextMenu: ShowContextMenuFunction = (content, options) => (e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const { x, y } =\n 'touches' in e ? { x: e.touches.item(0).clientX, y: e.touches.item(0).clientY } : { x: e.clientX, y: e.clientY };\n\n setData({\n x,\n y,\n content,\n zIndex: options?.zIndex || zIndex,\n className: options?.className,\n style: options?.style,\n classNames: options?.classNames,\n styles: options?.styles,\n });\n };\n\n return (\n <ContextMenuSettingsCtx.Provider value={{ shadow, borderRadius, submenuDelay, repositionOnRepeat }}>\n <ContextMenuCtx.Provider value={{ showContextMenu, hideContextMenu, isContextMenuVisible: !!data }}>\n {children}\n {data && <ContextMenuPortal onHide={hideContextMenu} {...data} />}\n </ContextMenuCtx.Provider>\n </ContextMenuSettingsCtx.Provider>\n );\n}\n\n/**\n * Hook returning functions that show and hide the context menu.\n */\nexport function useContextMenu() {\n return useContext(ContextMenuCtx);\n}\n","import { Portal } from '@mantine/core';\nimport { useHotkeys, useWindowEvent } from '@mantine/hooks';\nimport { ContextMenu, type ContextMenuProps } from './ContextMenu';\nimport { ContextMenuOverlay } from './ContextMenuOverlay';\n\nexport type ContextMenuPortalProps = ContextMenuProps & {\n zIndex?: number;\n};\n\nexport function ContextMenuPortal({ onHide, zIndex, ...otherProps }: ContextMenuPortalProps) {\n useWindowEvent('resize', onHide);\n useWindowEvent('scroll', onHide);\n useHotkeys([['Escape', onHide]]);\n\n return (\n <Portal>\n <ContextMenuOverlay zIndex={zIndex} onHide={onHide}>\n <ContextMenu {...otherProps} onHide={onHide} />\n </ContextMenuOverlay>\n </Portal>\n );\n}\n","import { useContext } from 'react';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\n\nexport type ContextMenuOverlayProps = React.PropsWithChildren<{\n zIndex: number | undefined;\n onHide: () => void;\n}>;\n\nexport function ContextMenuOverlay({ zIndex, children, onHide }: ContextMenuOverlayProps) {\n const { repositionOnRepeat } = useContext(ContextMenuSettingsCtx);\n\n const handleHide = (e: React.MouseEvent) => {\n e.preventDefault();\n onHide();\n };\n\n const handleContextMenu = async (e: React.MouseEvent) => {\n e.preventDefault();\n if (repositionOnRepeat) {\n const { clientX, clientY } = e;\n try {\n document\n .elementsFromPoint(clientX, clientY)[1]\n .dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, clientX, clientY }));\n } catch {\n // ignore error\n }\n } else {\n onHide();\n }\n };\n\n return (\n <div\n className=\"mantine-contextmenu-overlay\"\n style={{ zIndex }}\n onClick={handleHide}\n onContextMenu={handleContextMenu}\n >\n {children}\n </div>\n );\n}\n","/**\n * Utility function that returns a humanized version of a string, e.g. \"camelCase\" -> \"Camel Case\"\n */\nexport function humanize(value: string) {\n const str = value\n .replace(/([a-z\\d])([A-Z]+)/g, '$1 $2')\n .replace(/\\W|_/g, ' ')\n .trim()\n .toLowerCase();\n return `${str.charAt(0).toUpperCase()}${str.slice(1)}`;\n}\n"],"mappings":"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","names":["index_exports","__export","ContextMenuCtx","ContextMenuDivider","ContextMenuItem","ContextMenuPortal","ContextMenuProvider","ContextMenuSettingsCtx","humanize","useContextMenu","__toCommonJS","import_core","import_clsx","import_jsx_runtime","ContextMenuDivider","className","style","clsx","import_core","import_hooks","import_clsx","import_react","import_core","import_hooks","import_clsx","import_react","import_react","import_core","import_hooks","import_react","import_jsx_runtime","ContextMenuOverlay","zIndex","children","onHide","repositionOnRepeat","ContextMenuSettingsCtx","e","clientX","clientY","import_jsx_runtime","ContextMenuPortal","onHide","zIndex","otherProps","ContextMenuOverlay","ContextMenu","import_jsx_runtime","DEFAULT_SETTINGS","ContextMenuSettingsCtx","ContextMenuCtx","ContextMenuProvider","zIndex","shadow","borderRadius","submenuDelay","repositionOnRepeat","children","data","setData","hideContextMenu","showContextMenu","content","options","e","x","y","ContextMenuPortal","useContextMenu","humanize","value","str","import_jsx_runtime","ContextMenu","x","y","content","zIndex","onHide","className","style","classNames","styles","shadow","borderRadius","ContextMenuSettingsCtx","paperRef","width","height","windowWidth","windowHeight","dir","submenuProps","clsx","md","mdSpacing","key","hidden","onClick","items","title","otherOptions","ContextMenuItem","humanize","ContextMenuDivider","import_jsx_runtime","ContextMenuItem","className","style","icon","iconRight","title","color","disabled","onClick","onHide","items","submenuProps","ref","submenuDelay","ContextMenuSettingsCtx","hoverAvailable","submenuPosition","setSubmenuPosition","startShowingSubmenu","stopShowingSubmenu","y","x","startHidingSubmenu","stopHidingSubmenu","showSubmenu","hideSubmenu","hasSubmenu","showSubmenuOnHover","handleClick","e","theme","colors","parsedColor","clsx","ContextMenu"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../package/ContextMenuDivider.tsx","../package/ContextMenuItem.tsx","../package/ContextMenu.tsx","../package/ContextMenuProvider.tsx","../package/ContextMenuPortal.tsx","../package/ContextMenuOverlay.tsx","../package/utils.ts"],"sourcesContent":["import { Box } from '@mantine/core';\nimport clsx from 'clsx';\nimport type { ContextMenuItemOptions } from './types';\n\nexport type ContextMenuDividerProps = Pick<ContextMenuItemOptions, 'className' | 'style'>;\n\nexport function ContextMenuDivider({ className, style }: ContextMenuDividerProps) {\n return <Box className={clsx('mantine-contextmenu-divider', className)} style={style} />;\n}\n","import { Box, UnstyledButton, parseThemeColor, rgba } from '@mantine/core';\nimport { useMediaQuery, useTimeout } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { type MouseEventHandler, useContext, useRef, useState } from 'react';\nimport { ContextMenu } from './ContextMenu';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuItemOptions, ContextMenuOptions, WithRequiredProperty } from './types';\n\nexport function ContextMenuItem({\n className,\n style,\n icon,\n iconRight,\n title,\n color,\n disabled,\n onClick,\n onHide,\n items,\n submenuProps,\n}: WithRequiredProperty<Omit<ContextMenuItemOptions, 'key'>, 'title'> & {\n onHide: () => void;\n submenuProps: Pick<ContextMenuOptions, 'className' | 'classNames' | 'style' | 'styles'>;\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n\n const hoverAvailable = useMediaQuery('(hover: hover)');\n\n const [submenuPosition, setSubmenuPosition] = useState<{ x: number; y: number } | null>(null);\n\n const { start: startShowingSubmenu, clear: stopShowingSubmenu } = useTimeout(() => {\n const { top: y, right: x } = ref.current!.getBoundingClientRect();\n setSubmenuPosition({ x, y });\n }, submenuDelay);\n\n const { start: startHidingSubmenu, clear: stopHidingSubmenu } = useTimeout(() => {\n setSubmenuPosition(null);\n }, submenuDelay);\n\n const showSubmenu = () => {\n stopHidingSubmenu();\n startShowingSubmenu();\n };\n\n const hideSubmenu = () => {\n stopShowingSubmenu();\n startHidingSubmenu();\n };\n\n const hasSubmenu = items && !disabled;\n const showSubmenuOnHover = hasSubmenu && hoverAvailable;\n\n const handleClick: MouseEventHandler<HTMLButtonElement> | undefined = hasSubmenu\n ? (e) => {\n e.stopPropagation();\n showSubmenu();\n }\n : onClick\n ? (e) => {\n onHide();\n onClick!(e);\n }\n : undefined;\n\n return (\n <div\n onMouseEnter={showSubmenuOnHover ? showSubmenu : undefined}\n onMouseLeave={showSubmenuOnHover ? hideSubmenu : undefined}\n >\n <UnstyledButton\n ref={ref}\n style={[\n (theme) => {\n const { colors } = theme;\n const parsedColor = color ? parseThemeColor({ color, theme }).value : undefined;\n return {\n '--mantine-contextmenu-item-button-color': parsedColor ? parsedColor : 'var(--mantine-color-text)',\n '--mantine-contextmenu-item-button-hover-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.08)\n : rgba(colors.gray[4], 0.25),\n '--mantine-contextmenu-item-button-hover-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.15)\n : rgba(colors.dark[3], 0.25),\n '--mantine-contextmenu-item-button-pressed-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.2)\n : rgba(colors.gray[4], 0.5),\n '--mantine-contextmenu-item-button-pressed-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.3)\n : rgba(colors.dark[3], 0.5),\n };\n },\n style,\n ]}\n className={clsx('mantine-contextmenu-item-button', className)}\n disabled={disabled}\n onClick={handleClick}\n >\n {icon && (\n <Box fz={0} mr=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ml=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ml=\"xs\">\n ›\n </Box>\n )\n )}\n </UnstyledButton>\n {submenuPosition && (\n <ContextMenu content={items as ContextMenuContent} onHide={onHide} {...submenuProps} {...submenuPosition} />\n )}\n </div>\n );\n}\n","import { Paper, px, useDirection } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { useContext } from 'react';\nimport { ContextMenuDivider } from './ContextMenuDivider';\nimport { ContextMenuItem } from './ContextMenuItem';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuOptions } from './types';\nimport { humanize } from './utils';\n\nexport type ContextMenuInstanceOptions = {\n x: number;\n y: number;\n content: ContextMenuContent;\n};\n\nexport type ContextMenuProps = ContextMenuOptions &\n ContextMenuInstanceOptions & {\n onHide: () => void;\n };\n\nexport function ContextMenu({ x, y, content, zIndex, onHide, className, style, classNames, styles }: ContextMenuProps) {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef] = useResizeObserver<HTMLDivElement>();\n const { width, height } = paperRef.current?.getBoundingClientRect() || { width: 0, height: 0 };\n\n let windowWidth = 0;\n let windowHeight = 0;\n if (typeof window !== 'undefined') ({ innerWidth: windowWidth, innerHeight: windowHeight } = window);\n\n const { dir } = useDirection();\n const submenuProps = { className, classNames, style, styles };\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', className, classNames?.root)}\n style={[\n ({ spacing: { md } }) => {\n const mdSpacing = px(md) as number;\n return {\n zIndex,\n top: y + height + mdSpacing > windowHeight ? windowHeight - height - mdSpacing : y,\n left:\n dir === 'ltr'\n ? x + width + mdSpacing > windowWidth\n ? windowWidth - width - mdSpacing\n : x\n : windowWidth - mdSpacing - (x - width - mdSpacing < 0 ? width + mdSpacing : x),\n };\n },\n style,\n styles?.root,\n ]}\n >\n {Array.isArray(content)\n ? content.map(({ key, hidden, className, style, onClick, items, title, ...otherOptions }) =>\n hidden ? null : onClick || items ? (\n <ContextMenuItem\n key={key}\n className={clsx(classNames?.item, className)}\n style={[styles?.item, style]}\n title={title ?? humanize(key)}\n onClick={onClick}\n onHide={onHide}\n items={items}\n submenuProps={submenuProps}\n {...otherOptions}\n />\n ) : (\n <ContextMenuDivider\n key={key}\n className={clsx(classNames?.divider, className)}\n style={[styles?.divider, style]}\n />\n )\n )\n : content(onHide)}\n </Paper>\n );\n}\n","import { createContext, useContext, useState } from 'react';\nimport type { ContextMenuInstanceOptions } from './ContextMenu';\nimport { ContextMenuPortal } from './ContextMenuPortal';\nimport type {\n ContextMenuOptions,\n ContextMenuProviderProps,\n ContextMenuSettings,\n HideContextMenuFunction,\n ShowContextMenuFunction,\n WithRequiredProperty,\n} from './types';\n\nconst DEFAULT_SETTINGS: WithRequiredProperty<ContextMenuSettings, 'shadow' | 'borderRadius' | 'submenuDelay'> = {\n shadow: 'sm',\n borderRadius: 'xs',\n submenuDelay: 500,\n repositionOnRepeat: false,\n};\n\nexport const ContextMenuSettingsCtx = createContext(DEFAULT_SETTINGS);\nexport const ContextMenuCtx = createContext<{\n /**\n * Function that shows the context menu.\n */\n showContextMenu: ShowContextMenuFunction;\n\n /**\n * Function that hides the context menu.\n */\n hideContextMenu: HideContextMenuFunction;\n\n /**\n * Boolean indicating whether the context menu is currently visible.\n */\n isContextMenuVisible: boolean;\n}>({ showContextMenu: () => () => undefined, hideContextMenu: () => undefined, isContextMenuVisible: false });\n\n/**\n * Provider that allows to show a context menu anywhere in your application.\n * If you wrap your application with this provider, you can use the `useContextMenu` hook\n * anywhere in the component tree to access a function that shows the context menu.\n */\nexport function ContextMenuProvider({\n zIndex = 9999,\n shadow = DEFAULT_SETTINGS.shadow,\n borderRadius = DEFAULT_SETTINGS.borderRadius,\n submenuDelay = DEFAULT_SETTINGS.submenuDelay,\n repositionOnRepeat = DEFAULT_SETTINGS.repositionOnRepeat,\n children,\n}: ContextMenuProviderProps) {\n const [data, setData] = useState<(ContextMenuInstanceOptions & ContextMenuOptions) | null>(null);\n\n const hideContextMenu = () => {\n setData(null);\n };\n\n const showContextMenu: ShowContextMenuFunction = (content, options) => (e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const { x, y } =\n 'touches' in e ? { x: e.touches.item(0).clientX, y: e.touches.item(0).clientY } : { x: e.clientX, y: e.clientY };\n\n setData({\n x,\n y,\n content,\n zIndex: options?.zIndex || zIndex,\n className: options?.className,\n style: options?.style,\n classNames: options?.classNames,\n styles: options?.styles,\n });\n };\n\n return (\n <ContextMenuSettingsCtx.Provider value={{ shadow, borderRadius, submenuDelay, repositionOnRepeat }}>\n <ContextMenuCtx.Provider value={{ showContextMenu, hideContextMenu, isContextMenuVisible: !!data }}>\n {children}\n {data && <ContextMenuPortal onHide={hideContextMenu} {...data} />}\n </ContextMenuCtx.Provider>\n </ContextMenuSettingsCtx.Provider>\n );\n}\n\n/**\n * Hook returning functions that show and hide the context menu.\n */\nexport function useContextMenu() {\n return useContext(ContextMenuCtx);\n}\n","import { Portal } from '@mantine/core';\nimport { useHotkeys, useWindowEvent } from '@mantine/hooks';\nimport { ContextMenu, type ContextMenuProps } from './ContextMenu';\nimport { ContextMenuOverlay } from './ContextMenuOverlay';\n\nexport type ContextMenuPortalProps = ContextMenuProps & {\n zIndex?: number;\n};\n\nexport function ContextMenuPortal({ onHide, zIndex, ...otherProps }: ContextMenuPortalProps) {\n useWindowEvent('resize', onHide);\n useWindowEvent('scroll', onHide);\n useHotkeys([['Escape', onHide]]);\n\n return (\n <Portal>\n <ContextMenuOverlay zIndex={zIndex} onHide={onHide}>\n <ContextMenu {...otherProps} onHide={onHide} />\n </ContextMenuOverlay>\n </Portal>\n );\n}\n","import { useContext } from 'react';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\n\nexport type ContextMenuOverlayProps = React.PropsWithChildren<{\n zIndex: number | undefined;\n onHide: () => void;\n}>;\n\nexport function ContextMenuOverlay({ zIndex, children, onHide }: ContextMenuOverlayProps) {\n const { repositionOnRepeat } = useContext(ContextMenuSettingsCtx);\n\n const handleHide = (e: React.MouseEvent) => {\n e.preventDefault();\n onHide();\n };\n\n const handleContextMenu = async (e: React.MouseEvent) => {\n e.preventDefault();\n if (repositionOnRepeat) {\n const { clientX, clientY } = e;\n try {\n document\n .elementsFromPoint(clientX, clientY)[1]\n .dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, clientX, clientY }));\n } catch {\n // ignore error\n }\n } else {\n onHide();\n }\n };\n\n return (\n <div\n className=\"mantine-contextmenu-overlay\"\n style={{ zIndex }}\n onClick={handleHide}\n onContextMenu={handleContextMenu}\n >\n {children}\n </div>\n );\n}\n","/**\n * Utility function that returns a humanized version of a string, e.g. \"camelCase\" -> \"Camel Case\"\n */\nexport function humanize(value: string) {\n const str = value\n .replace(/([a-z\\d])([A-Z]+)/g, '$1 $2')\n .replace(/\\W|_/g, ' ')\n .trim()\n .toLowerCase();\n return `${str.charAt(0).toUpperCase()}${str.slice(1)}`;\n}\n"],"mappings":"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","names":["Box","clsx","jsx","ContextMenuDivider","className","style","Box","UnstyledButton","parseThemeColor","rgba","useMediaQuery","useTimeout","clsx","useContext","useRef","useState","Paper","px","useDirection","useResizeObserver","clsx","useContext","createContext","useContext","useState","Portal","useHotkeys","useWindowEvent","useContext","jsx","ContextMenuOverlay","zIndex","children","onHide","repositionOnRepeat","useContext","ContextMenuSettingsCtx","e","clientX","clientY","jsx","ContextMenuPortal","onHide","zIndex","otherProps","useWindowEvent","useHotkeys","Portal","ContextMenuOverlay","ContextMenu","jsx","jsxs","DEFAULT_SETTINGS","ContextMenuSettingsCtx","createContext","ContextMenuCtx","ContextMenuProvider","zIndex","shadow","borderRadius","submenuDelay","repositionOnRepeat","children","data","setData","useState","hideContextMenu","showContextMenu","content","options","e","x","y","ContextMenuPortal","useContextMenu","useContext","humanize","value","str","jsx","ContextMenu","x","y","content","zIndex","onHide","className","style","classNames","styles","shadow","borderRadius","useContext","ContextMenuSettingsCtx","paperRef","useResizeObserver","width","height","windowWidth","windowHeight","dir","useDirection","submenuProps","Paper","clsx","md","mdSpacing","px","key","hidden","onClick","items","title","otherOptions","ContextMenuItem","humanize","ContextMenuDivider","jsx","jsxs","ContextMenuItem","className","style","icon","iconRight","title","color","disabled","onClick","onHide","items","submenuProps","ref","useRef","submenuDelay","useContext","ContextMenuSettingsCtx","hoverAvailable","useMediaQuery","submenuPosition","setSubmenuPosition","useState","startShowingSubmenu","stopShowingSubmenu","useTimeout","y","x","startHidingSubmenu","stopHidingSubmenu","showSubmenu","hideSubmenu","hasSubmenu","showSubmenuOnHover","handleClick","e","UnstyledButton","theme","colors","parsedColor","parseThemeColor","rgba","clsx","Box","ContextMenu"]}
1
+ {"version":3,"sources":["../package/ContextMenuDivider.tsx","../package/ContextMenuItem.tsx","../package/ContextMenu.tsx","../package/ContextMenuProvider.tsx","../package/ContextMenuPortal.tsx","../package/ContextMenuOverlay.tsx","../package/utils.ts"],"sourcesContent":["import { Box } from '@mantine/core';\nimport clsx from 'clsx';\nimport type { ContextMenuItemOptions } from './types';\n\nexport type ContextMenuDividerProps = Pick<ContextMenuItemOptions, 'className' | 'style'>;\n\nexport function ContextMenuDivider({ className, style }: ContextMenuDividerProps) {\n return <Box className={clsx('mantine-contextmenu-divider', className)} style={style} />;\n}\n","import { Box, UnstyledButton, parseThemeColor, rgba } from '@mantine/core';\nimport { useMediaQuery, useTimeout } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { type MouseEventHandler, useContext, useRef, useState } from 'react';\nimport { ContextMenu } from './ContextMenu';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuItemOptions, ContextMenuOptions, WithRequiredProperty } from './types';\n\nexport function ContextMenuItem({\n className,\n style,\n icon,\n iconRight,\n title,\n color,\n disabled,\n onClick,\n onHide,\n items,\n submenuProps,\n}: WithRequiredProperty<Omit<ContextMenuItemOptions, 'key'>, 'title'> & {\n onHide: () => void;\n submenuProps: Pick<ContextMenuOptions, 'className' | 'classNames' | 'style' | 'styles'>;\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n\n const hoverAvailable = useMediaQuery('(hover: hover)');\n\n const [submenuPosition, setSubmenuPosition] = useState<{ x: number; y: number } | null>(null);\n\n const { start: startShowingSubmenu, clear: stopShowingSubmenu } = useTimeout(() => {\n const { top: y, right: x } = ref.current!.getBoundingClientRect();\n setSubmenuPosition({ x, y });\n }, submenuDelay);\n\n const { start: startHidingSubmenu, clear: stopHidingSubmenu } = useTimeout(() => {\n setSubmenuPosition(null);\n }, submenuDelay);\n\n const showSubmenu = () => {\n stopHidingSubmenu();\n startShowingSubmenu();\n };\n\n const hideSubmenu = () => {\n stopShowingSubmenu();\n startHidingSubmenu();\n };\n\n const hasSubmenu = items && !disabled;\n const showSubmenuOnHover = hasSubmenu && hoverAvailable;\n\n const handleClick: MouseEventHandler<HTMLButtonElement> | undefined = hasSubmenu\n ? (e) => {\n e.stopPropagation();\n showSubmenu();\n }\n : onClick\n ? (e) => {\n onHide();\n onClick!(e);\n }\n : undefined;\n\n return (\n <div\n onMouseEnter={showSubmenuOnHover ? showSubmenu : undefined}\n onMouseLeave={showSubmenuOnHover ? hideSubmenu : undefined}\n >\n <UnstyledButton\n ref={ref}\n style={[\n (theme) => {\n const { colors } = theme;\n const parsedColor = color ? parseThemeColor({ color, theme }).value : undefined;\n return {\n '--mantine-contextmenu-item-button-color': parsedColor ? parsedColor : 'var(--mantine-color-text)',\n '--mantine-contextmenu-item-button-hover-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.08)\n : rgba(colors.gray[4], 0.25),\n '--mantine-contextmenu-item-button-hover-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.15)\n : rgba(colors.dark[3], 0.25),\n '--mantine-contextmenu-item-button-pressed-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.2)\n : rgba(colors.gray[4], 0.5),\n '--mantine-contextmenu-item-button-pressed-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.3)\n : rgba(colors.dark[3], 0.5),\n };\n },\n style,\n ]}\n className={clsx('mantine-contextmenu-item-button', className)}\n disabled={disabled}\n onClick={handleClick}\n >\n {icon && (\n <Box fz={0} mr=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ml=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ml=\"xs\">\n ›\n </Box>\n )\n )}\n </UnstyledButton>\n {submenuPosition && (\n <ContextMenu content={items as ContextMenuContent} onHide={onHide} {...submenuProps} {...submenuPosition} />\n )}\n </div>\n );\n}\n","import { Paper, px, useDirection } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { useContext } from 'react';\nimport { ContextMenuDivider } from './ContextMenuDivider';\nimport { ContextMenuItem } from './ContextMenuItem';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuOptions } from './types';\nimport { humanize } from './utils';\n\nexport type ContextMenuInstanceOptions = {\n x: number;\n y: number;\n content: ContextMenuContent;\n};\n\nexport type ContextMenuProps = ContextMenuOptions &\n ContextMenuInstanceOptions & {\n onHide: () => void;\n };\n\nexport function ContextMenu({ x, y, content, zIndex, onHide, className, style, classNames, styles }: ContextMenuProps) {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef] = useResizeObserver<HTMLDivElement>();\n // eslint-disable-next-line react-hooks/refs\n const { width, height } = paperRef.current?.getBoundingClientRect() || { width: 0, height: 0 };\n\n let windowWidth = 0;\n let windowHeight = 0;\n if (typeof window !== 'undefined') ({ innerWidth: windowWidth, innerHeight: windowHeight } = window);\n\n const { dir } = useDirection();\n const submenuProps = { className, classNames, style, styles };\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', className, classNames?.root)}\n style={[\n ({ spacing: { md } }) => {\n const mdSpacing = px(md) as number;\n return {\n zIndex,\n top: y + height + mdSpacing > windowHeight ? windowHeight - height - mdSpacing : y,\n left:\n dir === 'ltr'\n ? x + width + mdSpacing > windowWidth\n ? windowWidth - width - mdSpacing\n : x\n : windowWidth - mdSpacing - (x - width - mdSpacing < 0 ? width + mdSpacing : x),\n };\n },\n style,\n styles?.root,\n ]}\n >\n {Array.isArray(content)\n ? content.map(({ key, hidden, className, style, onClick, items, title, ...otherOptions }) =>\n hidden ? null : onClick || items ? (\n <ContextMenuItem\n key={key}\n className={clsx(classNames?.item, className)}\n style={[styles?.item, style]}\n title={title ?? humanize(key)}\n onClick={onClick}\n onHide={onHide}\n items={items}\n submenuProps={submenuProps}\n {...otherOptions}\n />\n ) : (\n <ContextMenuDivider\n key={key}\n className={clsx(classNames?.divider, className)}\n style={[styles?.divider, style]}\n />\n )\n )\n : content(onHide)}\n </Paper>\n );\n}\n","import { createContext, useContext, useState } from 'react';\nimport type { ContextMenuInstanceOptions } from './ContextMenu';\nimport { ContextMenuPortal } from './ContextMenuPortal';\nimport type {\n ContextMenuOptions,\n ContextMenuProviderProps,\n ContextMenuSettings,\n HideContextMenuFunction,\n ShowContextMenuFunction,\n WithRequiredProperty,\n} from './types';\n\nconst DEFAULT_SETTINGS: WithRequiredProperty<ContextMenuSettings, 'shadow' | 'borderRadius' | 'submenuDelay'> = {\n shadow: 'sm',\n borderRadius: 'xs',\n submenuDelay: 500,\n repositionOnRepeat: false,\n};\n\nexport const ContextMenuSettingsCtx = createContext(DEFAULT_SETTINGS);\nexport const ContextMenuCtx = createContext<{\n /**\n * Function that shows the context menu.\n */\n showContextMenu: ShowContextMenuFunction;\n\n /**\n * Function that hides the context menu.\n */\n hideContextMenu: HideContextMenuFunction;\n\n /**\n * Boolean indicating whether the context menu is currently visible.\n */\n isContextMenuVisible: boolean;\n}>({ showContextMenu: () => () => undefined, hideContextMenu: () => undefined, isContextMenuVisible: false });\n\n/**\n * Provider that allows to show a context menu anywhere in your application.\n * If you wrap your application with this provider, you can use the `useContextMenu` hook\n * anywhere in the component tree to access a function that shows the context menu.\n */\nexport function ContextMenuProvider({\n zIndex = 9999,\n shadow = DEFAULT_SETTINGS.shadow,\n borderRadius = DEFAULT_SETTINGS.borderRadius,\n submenuDelay = DEFAULT_SETTINGS.submenuDelay,\n repositionOnRepeat = DEFAULT_SETTINGS.repositionOnRepeat,\n children,\n}: ContextMenuProviderProps) {\n const [data, setData] = useState<(ContextMenuInstanceOptions & ContextMenuOptions) | null>(null);\n\n const hideContextMenu = () => {\n setData(null);\n };\n\n const showContextMenu: ShowContextMenuFunction = (content, options) => (e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const { x, y } =\n 'touches' in e ? { x: e.touches.item(0).clientX, y: e.touches.item(0).clientY } : { x: e.clientX, y: e.clientY };\n\n setData({\n x,\n y,\n content,\n zIndex: options?.zIndex || zIndex,\n className: options?.className,\n style: options?.style,\n classNames: options?.classNames,\n styles: options?.styles,\n });\n };\n\n return (\n <ContextMenuSettingsCtx.Provider value={{ shadow, borderRadius, submenuDelay, repositionOnRepeat }}>\n <ContextMenuCtx.Provider value={{ showContextMenu, hideContextMenu, isContextMenuVisible: !!data }}>\n {children}\n {data && <ContextMenuPortal onHide={hideContextMenu} {...data} />}\n </ContextMenuCtx.Provider>\n </ContextMenuSettingsCtx.Provider>\n );\n}\n\n/**\n * Hook returning functions that show and hide the context menu.\n */\nexport function useContextMenu() {\n return useContext(ContextMenuCtx);\n}\n","import { Portal } from '@mantine/core';\nimport { useHotkeys, useWindowEvent } from '@mantine/hooks';\nimport { ContextMenu, type ContextMenuProps } from './ContextMenu';\nimport { ContextMenuOverlay } from './ContextMenuOverlay';\n\nexport type ContextMenuPortalProps = ContextMenuProps & {\n zIndex?: number;\n};\n\nexport function ContextMenuPortal({ onHide, zIndex, ...otherProps }: ContextMenuPortalProps) {\n useWindowEvent('resize', onHide);\n useWindowEvent('scroll', onHide);\n useHotkeys([['Escape', onHide]]);\n\n return (\n <Portal>\n <ContextMenuOverlay zIndex={zIndex} onHide={onHide}>\n <ContextMenu {...otherProps} onHide={onHide} />\n </ContextMenuOverlay>\n </Portal>\n );\n}\n","import { useContext } from 'react';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\n\nexport type ContextMenuOverlayProps = React.PropsWithChildren<{\n zIndex: number | undefined;\n onHide: () => void;\n}>;\n\nexport function ContextMenuOverlay({ zIndex, children, onHide }: ContextMenuOverlayProps) {\n const { repositionOnRepeat } = useContext(ContextMenuSettingsCtx);\n\n const handleHide = (e: React.MouseEvent) => {\n e.preventDefault();\n onHide();\n };\n\n const handleContextMenu = async (e: React.MouseEvent) => {\n e.preventDefault();\n if (repositionOnRepeat) {\n const { clientX, clientY } = e;\n try {\n document\n .elementsFromPoint(clientX, clientY)[1]\n .dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, clientX, clientY }));\n } catch {\n // ignore error\n }\n } else {\n onHide();\n }\n };\n\n return (\n <div\n className=\"mantine-contextmenu-overlay\"\n style={{ zIndex }}\n onClick={handleHide}\n onContextMenu={handleContextMenu}\n >\n {children}\n </div>\n );\n}\n","/**\n * Utility function that returns a humanized version of a string, e.g. \"camelCase\" -> \"Camel Case\"\n */\nexport function humanize(value: string) {\n const str = value\n .replace(/([a-z\\d])([A-Z]+)/g, '$1 $2')\n .replace(/\\W|_/g, ' ')\n .trim()\n .toLowerCase();\n return `${str.charAt(0).toUpperCase()}${str.slice(1)}`;\n}\n"],"mappings":"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","names":["Box","clsx","jsx","ContextMenuDivider","className","style","Box","UnstyledButton","parseThemeColor","rgba","useMediaQuery","useTimeout","clsx","useContext","useRef","useState","Paper","px","useDirection","useResizeObserver","clsx","useContext","createContext","useContext","useState","Portal","useHotkeys","useWindowEvent","useContext","jsx","ContextMenuOverlay","zIndex","children","onHide","repositionOnRepeat","useContext","ContextMenuSettingsCtx","e","clientX","clientY","jsx","ContextMenuPortal","onHide","zIndex","otherProps","useWindowEvent","useHotkeys","Portal","ContextMenuOverlay","ContextMenu","jsx","jsxs","DEFAULT_SETTINGS","ContextMenuSettingsCtx","createContext","ContextMenuCtx","ContextMenuProvider","zIndex","shadow","borderRadius","submenuDelay","repositionOnRepeat","children","data","setData","useState","hideContextMenu","showContextMenu","content","options","e","x","y","ContextMenuPortal","useContextMenu","useContext","humanize","value","str","jsx","ContextMenu","x","y","content","zIndex","onHide","className","style","classNames","styles","shadow","borderRadius","useContext","ContextMenuSettingsCtx","paperRef","useResizeObserver","width","height","windowWidth","windowHeight","dir","useDirection","submenuProps","Paper","clsx","md","mdSpacing","px","key","hidden","onClick","items","title","otherOptions","ContextMenuItem","humanize","ContextMenuDivider","jsx","jsxs","ContextMenuItem","className","style","icon","iconRight","title","color","disabled","onClick","onHide","items","submenuProps","ref","useRef","submenuDelay","useContext","ContextMenuSettingsCtx","hoverAvailable","useMediaQuery","submenuPosition","setSubmenuPosition","useState","startShowingSubmenu","stopShowingSubmenu","useTimeout","y","x","startHidingSubmenu","stopHidingSubmenu","showSubmenu","hideSubmenu","hasSubmenu","showSubmenuOnHover","handleClick","e","UnstyledButton","theme","colors","parsedColor","parseThemeColor","rgba","clsx","Box","ContextMenu"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mantine-contextmenu",
3
- "version": "8.2.0",
3
+ "version": "8.3.7",
4
4
  "description": "Craft your applications for productivity and meet your users’ expectations by enhancing your Mantine-based UIs with a desktop-grade, lightweight yet fully-featured, dark-theme aware context-menu component, built by the creator of Mantine DataTable",
5
5
  "keywords": [
6
6
  "ui",
@@ -73,41 +73,42 @@
73
73
  },
74
74
  "devDependencies": {
75
75
  "@eslint/eslintrc": "^3.3.1",
76
- "@mantine/code-highlight": "^8.2.1",
77
- "@mantine/core": "^8.2.1",
78
- "@mantine/hooks": "^8.2.1",
79
- "@mantine/notifications": "^8.2.1",
80
- "@tabler/icons-react": "^3.34.1",
76
+ "@mantine/code-highlight": "^8.3.7",
77
+ "@mantine/core": "^8.3.7",
78
+ "@mantine/hooks": "^8.3.7",
79
+ "@mantine/notifications": "^8.3.7",
80
+ "@next/eslint-plugin-next": "^15.5.6",
81
+ "@tabler/icons-react": "^3.35.0",
81
82
  "@types/lodash": "^4.17.20",
82
- "@types/node": "^24.1.0",
83
- "@types/react": "^19.1.8",
84
- "@types/react-dom": "^19.1.6",
85
- "@typescript-eslint/eslint-plugin": "^8.38.0",
86
- "@typescript-eslint/parser": "^8.38.0",
83
+ "@types/node": "^24.10.0",
84
+ "@types/react": "^19.2.2",
85
+ "@types/react-dom": "^19.2.2",
86
+ "@typescript-eslint/eslint-plugin": "^8.46.3",
87
+ "@typescript-eslint/parser": "^8.46.3",
87
88
  "clsx": "^2.1.1",
88
- "cssnano": "^7.1.0",
89
- "eslint": "^9.31.0",
90
- "eslint-config-next": "^15.4.3",
91
- "eslint-plugin-react-hooks": "^5.2.0",
89
+ "cssnano": "^7.1.2",
90
+ "eslint": "^9.39.1",
91
+ "eslint-config-next": "^15.5.6",
92
+ "eslint-plugin-react-hooks": "^7.0.1",
92
93
  "lodash": "^4.17.21",
93
- "next": "^15.4.3",
94
+ "next": "^15.5.6",
94
95
  "postcss": "^8.5.6",
95
96
  "postcss-cli": "^11.0.1",
96
97
  "postcss-import": "^16.1.1",
97
98
  "postcss-preset-mantine": "^1.18.0",
98
99
  "postcss-simple-vars": "^7.0.1",
99
100
  "prettier": "^3.6.2",
100
- "react": "^19.1.0",
101
- "react-dom": "^19.1.0",
102
- "sharp": "^0.34.3",
103
- "shiki": "^3.8.1",
104
- "swr": "^2.3.4",
101
+ "react": "^19.2.0",
102
+ "react-dom": "^19.2.0",
103
+ "sharp": "^0.34.5",
104
+ "shiki": "^3.15.0",
105
+ "swr": "^2.3.6",
105
106
  "tsup": "^8.5.0",
106
- "typescript": "^5.8.3"
107
+ "typescript": "^5.9.3"
107
108
  },
108
109
  "peerDependencies": {
109
- "@mantine/core": ">=8.2",
110
- "@mantine/hooks": ">=8.2",
110
+ "@mantine/core": ">=8.3",
111
+ "@mantine/hooks": ">=8.3",
111
112
  "clsx": ">=2",
112
113
  "react": ">=19",
113
114
  "react-dom": ">=19"