mantine-contextmenu 8.3.13 → 9.2.0
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/LICENSE +1 -1
- package/README.md +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +27 -31
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2023 -
|
|
3
|
+
Copyright (c) 2023 - 2026 Ionuț-Cristian Florescu
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ Craft your applications for productivity and meet your users’ expectations by
|
|
|
14
14
|
|
|
15
15
|
[](https://icflorescu.github.io/mantine-contextmenu/)
|
|
16
16
|
|
|
17
|
-
**⚠️ NOTE: Mantine ContextMenu
|
|
17
|
+
**⚠️ NOTE: Mantine ContextMenu V9.x is compatible with Mantine V9.x.**
|
|
18
18
|
**💡 If you're looking for the old version that works with [Mantine V6](https://v6.mantine.dev), head over to [Mantine ContextMenu V6](https://icflorescu.github.io/mantine-contextmenu-v6).**
|
|
19
19
|
|
|
20
20
|
## Features
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { MantineStyleProp, MantineColor, StylesRecord, MantineShadow, MantineRadius } from '@mantine/core';
|
|
1
3
|
import * as react from 'react';
|
|
2
4
|
import { JSX } from 'react';
|
|
3
|
-
import { MantineStyleProp, MantineColor, StylesRecord, MantineShadow, MantineRadius } from '@mantine/core';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Utility type that makes a property required
|
|
@@ -164,14 +165,14 @@ options?: ContextMenuOptions) => React.MouseEventHandler & React.TouchEventHandl
|
|
|
164
165
|
type HideContextMenuFunction = () => void;
|
|
165
166
|
|
|
166
167
|
type ContextMenuDividerProps = Pick<ContextMenuItemOptions, 'className' | 'style'>;
|
|
167
|
-
declare function ContextMenuDivider({ className, style }: ContextMenuDividerProps):
|
|
168
|
+
declare function ContextMenuDivider({ className, style }: ContextMenuDividerProps): react_jsx_runtime.JSX.Element;
|
|
168
169
|
|
|
169
170
|
declare function ContextMenuItem({ className, style, icon, iconRight, title, color, disabled, onClick, onHide, items, submenuProps, }: WithRequiredProperty<Omit<ContextMenuItemOptions, 'key'>, 'title'> & {
|
|
170
171
|
onHide: () => void;
|
|
171
172
|
submenuProps: Pick<ContextMenuOptions, 'className' | 'classNames' | 'style' | 'styles'> & {
|
|
172
173
|
dir?: 'ltr' | 'rtl';
|
|
173
174
|
};
|
|
174
|
-
}):
|
|
175
|
+
}): react_jsx_runtime.JSX.Element;
|
|
175
176
|
|
|
176
177
|
type ContextMenuInstanceOptions = {
|
|
177
178
|
x: number;
|
|
@@ -187,7 +188,7 @@ type ContextMenuPortalProps = ContextMenuProps & {
|
|
|
187
188
|
zIndex?: number;
|
|
188
189
|
dir: 'ltr' | 'rtl';
|
|
189
190
|
};
|
|
190
|
-
declare function ContextMenuPortal({ onHide, zIndex, dir, ...otherProps }: ContextMenuPortalProps):
|
|
191
|
+
declare function ContextMenuPortal({ onHide, zIndex, dir, ...otherProps }: ContextMenuPortalProps): react_jsx_runtime.JSX.Element;
|
|
191
192
|
|
|
192
193
|
declare const ContextMenuSettingsCtx: react.Context<WithRequiredProperty<ContextMenuSettings, "shadow" | "borderRadius" | "submenuDelay">>;
|
|
193
194
|
declare const ContextMenuCtx: react.Context<{
|
|
@@ -209,7 +210,7 @@ declare const ContextMenuCtx: react.Context<{
|
|
|
209
210
|
* If you wrap your application with this provider, you can use the `useContextMenu` hook
|
|
210
211
|
* anywhere in the component tree to access a function that shows the context menu.
|
|
211
212
|
*/
|
|
212
|
-
declare function ContextMenuProvider({ zIndex, shadow, borderRadius, submenuDelay, repositionOnRepeat, children, }: ContextMenuProviderProps):
|
|
213
|
+
declare function ContextMenuProvider({ zIndex, shadow, borderRadius, submenuDelay, repositionOnRepeat, children, }: ContextMenuProviderProps): react_jsx_runtime.JSX.Element;
|
|
213
214
|
/**
|
|
214
215
|
* Hook returning functions that show and hide the context menu.
|
|
215
216
|
*/
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";"use client";var me=Object.create;var F=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var pe=Object.getOwnPropertyNames;var xe=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty;var de=(e,t)=>{for(var n in t)F(e,n,{get:t[n],enumerable:!0})},J=(e,t,n,
|
|
1
|
+
"use strict";"use client";var me=Object.create;var F=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var pe=Object.getOwnPropertyNames;var xe=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty;var de=(e,t)=>{for(var n in t)F(e,n,{get:t[n],enumerable:!0})},J=(e,t,n,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of pe(t))!le.call(e,s)&&s!==n&&F(e,s,{get:()=>t[s],enumerable:!(u=ae(t,s))||u.enumerable});return e};var X=(e,t,n)=>(n=e!=null?me(xe(e)):{},J(t||!e||!e.__esModule?F(n,"default",{value:e,enumerable:!0}):n,e)),ce=e=>J(F({},"__esModule",{value:!0}),e);var fe={};de(fe,{ContextMenuCtx:()=>G,ContextMenuDivider:()=>Y,ContextMenuItem:()=>Z,ContextMenuPortal:()=>_,ContextMenuProvider:()=>Ce,ContextMenuSettingsCtx:()=>v,humanize:()=>Q,useContextMenu:()=>Me});module.exports=ce(fe);var K=require("@mantine/core"),j=X(require("clsx")),ee=require("react/jsx-runtime");function Y({className:e,style:t}){return(0,ee.jsx)(K.Box,{className:(0,j.default)("mantine-contextmenu-divider",e),style:t})}var o=require("@mantine/core"),k=require("@mantine/hooks"),se=X(require("clsx")),O=require("react");var $=require("@mantine/core"),ue=require("@mantine/hooks"),q=X(require("clsx")),w=require("react");var ie=require("@mantine/core"),b=require("react");var re=require("@mantine/core"),D=require("@mantine/hooks");var te=require("react");var oe=require("react/jsx-runtime");function ne({zIndex:e,children:t,onHide:n}){let{repositionOnRepeat:u}=(0,te.useContext)(v);return(0,oe.jsx)("div",{className:"mantine-contextmenu-overlay",style:{zIndex:e},onClick:i=>{i.preventDefault(),n()},onContextMenu:async i=>{if(i.preventDefault(),u){let{clientX:m,clientY:p}=i;try{document.elementsFromPoint(m,p)[1].dispatchEvent(new MouseEvent("contextmenu",{bubbles:!0,clientX:m,clientY:p}))}catch{}}else n()},children:t})}var A=require("react/jsx-runtime");function _({onHide:e,zIndex:t,dir:n,...u}){return(0,D.useWindowEvent)("resize",e),(0,D.useWindowEvent)("scroll",e),(0,D.useHotkeys)([["Escape",e]]),(0,A.jsx)(re.Portal,{children:(0,A.jsx)(ne,{zIndex:t,onHide:e,children:(0,A.jsx)(L,{...u,onHide:e,dir:n})})})}var B=require("react/jsx-runtime"),z={shadow:"sm",borderRadius:"xs",submenuDelay:500,repositionOnRepeat:!1},v=(0,b.createContext)(z),G=(0,b.createContext)({showContextMenu:()=>()=>{},hideContextMenu:()=>{},isContextMenuVisible:!1});function Ce({zIndex:e=9999,shadow:t=z.shadow,borderRadius:n=z.borderRadius,submenuDelay:u=z.submenuDelay,repositionOnRepeat:s=z.repositionOnRepeat,children:M}){let[i,m]=(0,b.useState)(null),{dir:p}=(0,ie.useDirection)(),c=()=>{m(null)},P=(g,l)=>r=>{r.preventDefault(),r.stopPropagation();let{x:y,y:S}="touches"in r?{x:r.touches.item(0).clientX,y:r.touches.item(0).clientY}:{x:r.clientX,y:r.clientY};m({x:y,y:S,content:g,zIndex:l?.zIndex||e,className:l?.className,style:l?.style,classNames:l?.classNames,styles:l?.styles})};return(0,B.jsx)(v.Provider,{value:{shadow:t,borderRadius:n,submenuDelay:u,repositionOnRepeat:s},children:(0,B.jsxs)(G.Provider,{value:{showContextMenu:P,hideContextMenu:c,isContextMenuVisible:!!i},children:[M,i&&(0,B.jsx)(_,{onHide:c,dir:p,...i})]})})}function Me(){return(0,b.useContext)(G)}function Q(e){let t=e.replace(/([a-z\d])([A-Z]+)/g,"$1 $2").replace(/\W|_/g," ").trim().toLowerCase();return`${t.charAt(0).toUpperCase()}${t.slice(1)}`}var U=require("react/jsx-runtime");function L({x:e,y:t,content:n,zIndex:u,onHide:s,className:M,style:i,classNames:m,styles:p,dir:c="ltr"}){let{shadow:P,borderRadius:g}=(0,w.useContext)(v),[l,{width:r,height:y}]=(0,ue.useResizeObserver)(),[S,N]=(0,w.useState)(!1),R=0,E=0;typeof window<"u"&&({innerWidth:R,innerHeight:E}=window);let V={className:M,classNames:m,style:i,styles:p,dir:c},T=r>0&&y>0;return(0,w.useEffect)(()=>{T&&requestAnimationFrame(()=>N(!0))},[T]),(0,U.jsx)($.Paper,{ref:l,shadow:P,radius:g,className:(0,q.default)("mantine-contextmenu",S&&"mantine-contextmenu-mounted",M,m?.root),style:[({spacing:{md:f}})=>{let d=(0,$.px)(f);return{zIndex:u,top:t+y+d>E?E-y-d:t,left:c==="ltr"?e+r+d>R?R-r-d:e:e-r<d?d:e-r}},i,p?.root],children:Array.isArray(n)?n.map(({key:f,hidden:d,className:H,style:I,onClick:W,items:a,title:h,...x})=>d?null:W||a?(0,U.jsx)(Z,{className:(0,q.default)(m?.item,H),style:[p?.item,I],title:h??Q(f),onClick:W,onHide:s,items:a,submenuProps:V,...x},f):(0,U.jsx)(Y,{className:(0,q.default)(m?.divider,H),style:[p?.divider,I]},f)):n(s)})}var C=require("react/jsx-runtime");function Z({className:e,style:t,icon:n,iconRight:u,title:s,color:M,disabled:i,onClick:m,onHide:p,items:c,submenuProps:P}){let g=(0,O.useRef)(null),{submenuDelay:l}=(0,O.useContext)(v),r=P.dir||"ltr",y=(0,k.useMediaQuery)("(hover: hover)"),[S,N]=(0,O.useState)(null),{start:R,clear:E}=(0,k.useTimeout)(()=>{let a=g.current.getBoundingClientRect(),h=r==="ltr"?a.right:a.left;N({x:h,y:a.top})},l),{start:V,clear:T}=(0,k.useTimeout)(()=>{N(null)},l),f=()=>{T(),R()},d=()=>{E(),V()},H=c&&!i,I=H&&y,W=H?a=>{a.stopPropagation(),f()}:m?a=>{p(),m?.(a)}:void 0;return(0,C.jsxs)("div",{onMouseEnter:I?f:void 0,onMouseLeave:I?d:void 0,children:[(0,C.jsxs)(o.UnstyledButton,{ref:g,dir:r,style:[a=>{let{colors:h}=a,x=M?(0,o.parseThemeColor)({color:M,theme:a}).value:void 0;return{"--mantine-contextmenu-item-button-color":x||"var(--mantine-color-text)","--mantine-contextmenu-item-button-hover-bg-color-light":x?(0,o.rgba)(x,.08):(0,o.rgba)(h.gray[4],.25),"--mantine-contextmenu-item-button-hover-bg-color-dark":x?(0,o.rgba)(x,.15):(0,o.rgba)(h.dark[3],.25),"--mantine-contextmenu-item-button-pressed-bg-color-light":x?(0,o.rgba)(x,.2):(0,o.rgba)(h.gray[4],.5),"--mantine-contextmenu-item-button-pressed-bg-color-dark":x?(0,o.rgba)(x,.3):(0,o.rgba)(h.dark[3],.5)}},t],className:(0,se.default)("mantine-contextmenu-item-button",e),disabled:i,onClick:W,children:[n&&(0,C.jsx)(o.Box,{fz:0,me:"xs",mt:-2,children:n}),(0,C.jsx)("div",{className:"mantine-contextmenu-item-button-title",children:s}),u?(0,C.jsx)(o.Box,{fz:0,ms:"xs",mt:-2,children:u}):c&&(0,C.jsx)(o.Box,{mt:-1,ms:"xs",children:"\u203A"})]}),S&&(0,C.jsx)(L,{content:c,onHide:p,...P,...S})]})}0&&(module.exports={ContextMenuCtx,ContextMenuDivider,ContextMenuItem,ContextMenuPortal,ContextMenuProvider,ContextMenuSettingsCtx,humanize,useContextMenu});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
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'> & { dir?: 'ltr' | 'rtl' };\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n const dir = submenuProps.dir || 'ltr';\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 rect = ref.current!.getBoundingClientRect();\n const x = dir === 'ltr' ? rect.right : rect.left;\n setSubmenuPosition({ x, y: rect.top });\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 dir={dir}\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} me=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ms=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ms=\"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 } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { useContext, useEffect, useState } 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 dir?: 'ltr' | 'rtl';\n };\n\nexport function ContextMenu({\n x,\n y,\n content,\n zIndex,\n onHide,\n className,\n style,\n classNames,\n styles,\n dir = 'ltr',\n}: ContextMenuProps) {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef] = useResizeObserver<HTMLDivElement>();\n const [isMounted, setIsMounted] = useState(false);\n\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 submenuProps = { className, classNames, style, styles, dir };\n\n // Wait for dimensions to be measured before showing to prevent visible repositioning\n const hasSize = width > 0 && height > 0;\n\n useEffect(() => {\n if (hasSize) {\n requestAnimationFrame(() => setIsMounted(true));\n }\n }, [hasSize]);\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', isMounted && 'mantine-contextmenu-mounted', 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 : x - width < mdSpacing\n ? mdSpacing\n : x - width,\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 { useDirection } from '@mantine/core';\nimport { 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 const { dir } = useDirection();\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} dir={dir} {...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 dir: 'ltr' | 'rtl';\n};\n\nexport function ContextMenuPortal({ onHide, zIndex, dir, ...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} dir={dir} />\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_core","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","dir","otherProps","ContextMenuOverlay","ContextMenu","import_jsx_runtime","DEFAULT_SETTINGS","ContextMenuSettingsCtx","ContextMenuCtx","ContextMenuProvider","zIndex","shadow","borderRadius","submenuDelay","repositionOnRepeat","children","data","setData","dir","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","dir","shadow","borderRadius","ContextMenuSettingsCtx","paperRef","isMounted","setIsMounted","width","height","windowWidth","windowHeight","submenuProps","hasSize","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","dir","hoverAvailable","submenuPosition","setSubmenuPosition","startShowingSubmenu","stopShowingSubmenu","rect","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, parseThemeColor, rgba, UnstyledButton } 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'> & { dir?: 'ltr' | 'rtl' };\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n const dir = submenuProps.dir || 'ltr';\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 rect = (ref.current as HTMLButtonElement).getBoundingClientRect();\n const x = dir === 'ltr' ? rect.right : rect.left;\n setSubmenuPosition({ x, y: rect.top });\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 dir={dir}\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} me=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ms=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ms=\"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 } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { useContext, useEffect, useState } 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 dir?: 'ltr' | 'rtl';\n };\n\nexport function ContextMenu({\n x,\n y,\n content,\n zIndex,\n onHide,\n className,\n style,\n classNames,\n styles,\n dir = 'ltr',\n}: ContextMenuProps) {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef, { width, height }] = useResizeObserver<HTMLDivElement>();\n const [isMounted, setIsMounted] = useState(false);\n\n let windowWidth = 0;\n let windowHeight = 0;\n if (typeof window !== 'undefined') ({ innerWidth: windowWidth, innerHeight: windowHeight } = window);\n\n const submenuProps = { className, classNames, style, styles, dir };\n\n // Wait for dimensions to be measured before showing to prevent visible repositioning\n const hasSize = width > 0 && height > 0;\n\n useEffect(() => {\n if (hasSize) {\n requestAnimationFrame(() => setIsMounted(true));\n }\n }, [hasSize]);\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', isMounted && 'mantine-contextmenu-mounted', 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 : x - width < mdSpacing\n ? mdSpacing\n : x - width,\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 { useDirection } from '@mantine/core';\nimport { 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 const { dir } = useDirection();\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} dir={dir} {...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 dir: 'ltr' | 'rtl';\n};\n\nexport function ContextMenuPortal({ onHide, zIndex, dir, ...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} dir={dir} />\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_core","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","dir","otherProps","ContextMenuOverlay","ContextMenu","import_jsx_runtime","DEFAULT_SETTINGS","ContextMenuSettingsCtx","ContextMenuCtx","ContextMenuProvider","zIndex","shadow","borderRadius","submenuDelay","repositionOnRepeat","children","data","setData","dir","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","dir","shadow","borderRadius","ContextMenuSettingsCtx","paperRef","width","height","isMounted","setIsMounted","windowWidth","windowHeight","submenuProps","hasSize","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","dir","hoverAvailable","submenuPosition","setSubmenuPosition","startShowingSubmenu","stopShowingSubmenu","rect","x","startHidingSubmenu","stopHidingSubmenu","showSubmenu","hideSubmenu","hasSubmenu","showSubmenuOnHover","handleClick","e","theme","colors","parsedColor","clsx","ContextMenu"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{Box as Q}from"@mantine/core";import Z from"clsx";import{jsx as J}from"react/jsx-runtime";function F({className:e,style:
|
|
1
|
+
"use client";import{Box as Q}from"@mantine/core";import Z from"clsx";import{jsx as J}from"react/jsx-runtime";function F({className:e,style:n}){return J(Q,{className:Z("mantine-contextmenu-divider",e),style:n})}import{Box as W,parseThemeColor as le,rgba as M,UnstyledButton as de}from"@mantine/core";import{useMediaQuery as ce,useTimeout as _}from"@mantine/hooks";import Ce from"clsx";import{useContext as Me,useRef as fe,useState as he}from"react";import{Paper as ue,px as se}from"@mantine/core";import{useResizeObserver as me}from"@mantine/hooks";import N from"clsx";import{useContext as ae,useEffect as pe,useState as xe}from"react";import{useDirection as ne}from"@mantine/core";import{createContext as $,useContext as oe,useState as re}from"react";import{Portal as ee}from"@mantine/core";import{useHotkeys as te,useWindowEvent as L}from"@mantine/hooks";import{useContext as K}from"react";import{jsx as j}from"react/jsx-runtime";function A({zIndex:e,children:n,onHide:r}){let{repositionOnRepeat:a}=K(v);return j("div",{className:"mantine-contextmenu-overlay",style:{zIndex:e},onClick:o=>{o.preventDefault(),r()},onContextMenu:async o=>{if(o.preventDefault(),a){let{clientX:i,clientY:s}=o;try{document.elementsFromPoint(i,s)[1].dispatchEvent(new MouseEvent("contextmenu",{bubbles:!0,clientX:i,clientY:s}))}catch{}}else r()},children:n})}import{jsx as k}from"react/jsx-runtime";function q({onHide:e,zIndex:n,dir:r,...a}){return L("resize",e),L("scroll",e),te([["Escape",e]]),k(ee,{children:k(A,{zIndex:n,onHide:e,children:k(z,{...a,onHide:e,dir:r})})})}import{jsx as U,jsxs as ie}from"react/jsx-runtime";var R={shadow:"sm",borderRadius:"xs",submenuDelay:500,repositionOnRepeat:!1},v=$(R),V=$({showContextMenu:()=>()=>{},hideContextMenu:()=>{},isContextMenuVisible:!1});function Te({zIndex:e=9999,shadow:n=R.shadow,borderRadius:r=R.borderRadius,submenuDelay:a=R.submenuDelay,repositionOnRepeat:f=R.repositionOnRepeat,children:d}){let[o,i]=re(null),{dir:s}=ne(),l=()=>{i(null)},y=(b,p)=>t=>{t.preventDefault(),t.stopPropagation();let{x:h,y:P}="touches"in t?{x:t.touches.item(0).clientX,y:t.touches.item(0).clientY}:{x:t.clientX,y:t.clientY};i({x:h,y:P,content:b,zIndex:p?.zIndex||e,className:p?.className,style:p?.style,classNames:p?.classNames,styles:p?.styles})};return U(v.Provider,{value:{shadow:n,borderRadius:r,submenuDelay:a,repositionOnRepeat:f},children:ie(V.Provider,{value:{showContextMenu:y,hideContextMenu:l,isContextMenuVisible:!!o},children:[d,o&&U(q,{onHide:l,dir:s,...o})]})})}function We(){return oe(V)}function X(e){let n=e.replace(/([a-z\d])([A-Z]+)/g,"$1 $2").replace(/\W|_/g," ").trim().toLowerCase();return`${n.charAt(0).toUpperCase()}${n.slice(1)}`}import{jsx as T}from"react/jsx-runtime";function z({x:e,y:n,content:r,zIndex:a,onHide:f,className:d,style:o,classNames:i,styles:s,dir:l="ltr"}){let{shadow:y,borderRadius:b}=ae(v),[p,{width:t,height:h}]=me(),[P,H]=xe(!1),g=0,S=0;typeof window<"u"&&({innerWidth:g,innerHeight:S}=window);let B={className:d,classNames:i,style:o,styles:s,dir:l},I=t>0&&h>0;return pe(()=>{I&&requestAnimationFrame(()=>H(!0))},[I]),T(ue,{ref:p,shadow:y,radius:b,className:N("mantine-contextmenu",P&&"mantine-contextmenu-mounted",d,i?.root),style:[({spacing:{md:c}})=>{let x=se(c);return{zIndex:a,top:n+h+x>S?S-h-x:n,left:l==="ltr"?e+t+x>g?g-t-x:e:e-t<x?x:e-t}},o,s?.root],children:Array.isArray(r)?r.map(({key:c,hidden:x,className:w,style:O,onClick:D,items:u,title:C,...m})=>x?null:D||u?T(Y,{className:N(i?.item,w),style:[s?.item,O],title:C??X(c),onClick:D,onHide:f,items:u,submenuProps:B,...m},c):T(F,{className:N(i?.divider,w),style:[s?.divider,O]},c)):r(f)})}import{jsx as E,jsxs as G}from"react/jsx-runtime";function Y({className:e,style:n,icon:r,iconRight:a,title:f,color:d,disabled:o,onClick:i,onHide:s,items:l,submenuProps:y}){let b=fe(null),{submenuDelay:p}=Me(v),t=y.dir||"ltr",h=ce("(hover: hover)"),[P,H]=he(null),{start:g,clear:S}=_(()=>{let u=b.current.getBoundingClientRect(),C=t==="ltr"?u.right:u.left;H({x:C,y:u.top})},p),{start:B,clear:I}=_(()=>{H(null)},p),c=()=>{I(),g()},x=()=>{S(),B()},w=l&&!o,O=w&&h,D=w?u=>{u.stopPropagation(),c()}:i?u=>{s(),i?.(u)}:void 0;return G("div",{onMouseEnter:O?c:void 0,onMouseLeave:O?x:void 0,children:[G(de,{ref:b,dir:t,style:[u=>{let{colors:C}=u,m=d?le({color:d,theme:u}).value:void 0;return{"--mantine-contextmenu-item-button-color":m||"var(--mantine-color-text)","--mantine-contextmenu-item-button-hover-bg-color-light":m?M(m,.08):M(C.gray[4],.25),"--mantine-contextmenu-item-button-hover-bg-color-dark":m?M(m,.15):M(C.dark[3],.25),"--mantine-contextmenu-item-button-pressed-bg-color-light":m?M(m,.2):M(C.gray[4],.5),"--mantine-contextmenu-item-button-pressed-bg-color-dark":m?M(m,.3):M(C.dark[3],.5)}},n],className:Ce("mantine-contextmenu-item-button",e),disabled:o,onClick:D,children:[r&&E(W,{fz:0,me:"xs",mt:-2,children:r}),E("div",{className:"mantine-contextmenu-item-button-title",children:f}),a?E(W,{fz:0,ms:"xs",mt:-2,children:a}):l&&E(W,{mt:-1,ms:"xs",children:"\u203A"})]}),P&&E(z,{content:l,onHide:s,...y,...P})]})}export{V as ContextMenuCtx,F as ContextMenuDivider,Y as ContextMenuItem,q as ContextMenuPortal,Te as ContextMenuProvider,v as ContextMenuSettingsCtx,X as humanize,We as useContextMenu};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -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'> & { dir?: 'ltr' | 'rtl' };\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n const dir = submenuProps.dir || 'ltr';\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 rect = ref.current!.getBoundingClientRect();\n const x = dir === 'ltr' ? rect.right : rect.left;\n setSubmenuPosition({ x, y: rect.top });\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 dir={dir}\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} me=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ms=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ms=\"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 } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { useContext, useEffect, useState } 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 dir?: 'ltr' | 'rtl';\n };\n\nexport function ContextMenu({\n x,\n y,\n content,\n zIndex,\n onHide,\n className,\n style,\n classNames,\n styles,\n dir = 'ltr',\n}: ContextMenuProps) {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef] = useResizeObserver<HTMLDivElement>();\n const [isMounted, setIsMounted] = useState(false);\n\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 submenuProps = { className, classNames, style, styles, dir };\n\n // Wait for dimensions to be measured before showing to prevent visible repositioning\n const hasSize = width > 0 && height > 0;\n\n useEffect(() => {\n if (hasSize) {\n requestAnimationFrame(() => setIsMounted(true));\n }\n }, [hasSize]);\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', isMounted && 'mantine-contextmenu-mounted', 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 : x - width < mdSpacing\n ? mdSpacing\n : x - width,\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 { useDirection } from '@mantine/core';\nimport { 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 const { dir } = useDirection();\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} dir={dir} {...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 dir: 'ltr' | 'rtl';\n};\n\nexport function ContextMenuPortal({ onHide, zIndex, dir, ...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} dir={dir} />\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","useResizeObserver","clsx","useContext","useEffect","useState","useDirection","createContext","useContext","useState","Portal","useHotkeys","useWindowEvent","useContext","jsx","ContextMenuOverlay","zIndex","children","onHide","repositionOnRepeat","useContext","ContextMenuSettingsCtx","e","clientX","clientY","jsx","ContextMenuPortal","onHide","zIndex","dir","otherProps","useWindowEvent","useHotkeys","Portal","ContextMenuOverlay","ContextMenu","jsx","jsxs","DEFAULT_SETTINGS","ContextMenuSettingsCtx","createContext","ContextMenuCtx","ContextMenuProvider","zIndex","shadow","borderRadius","submenuDelay","repositionOnRepeat","children","data","setData","useState","dir","useDirection","hideContextMenu","showContextMenu","content","options","e","x","y","ContextMenuPortal","useContextMenu","useContext","humanize","value","str","jsx","ContextMenu","x","y","content","zIndex","onHide","className","style","classNames","styles","dir","shadow","borderRadius","useContext","ContextMenuSettingsCtx","paperRef","useResizeObserver","isMounted","setIsMounted","useState","width","height","windowWidth","windowHeight","submenuProps","hasSize","useEffect","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","dir","hoverAvailable","useMediaQuery","submenuPosition","setSubmenuPosition","useState","startShowingSubmenu","stopShowingSubmenu","useTimeout","rect","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, parseThemeColor, rgba, UnstyledButton } 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'> & { dir?: 'ltr' | 'rtl' };\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n const dir = submenuProps.dir || 'ltr';\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 rect = (ref.current as HTMLButtonElement).getBoundingClientRect();\n const x = dir === 'ltr' ? rect.right : rect.left;\n setSubmenuPosition({ x, y: rect.top });\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 dir={dir}\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} me=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ms=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ms=\"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 } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { useContext, useEffect, useState } 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 dir?: 'ltr' | 'rtl';\n };\n\nexport function ContextMenu({\n x,\n y,\n content,\n zIndex,\n onHide,\n className,\n style,\n classNames,\n styles,\n dir = 'ltr',\n}: ContextMenuProps) {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef, { width, height }] = useResizeObserver<HTMLDivElement>();\n const [isMounted, setIsMounted] = useState(false);\n\n let windowWidth = 0;\n let windowHeight = 0;\n if (typeof window !== 'undefined') ({ innerWidth: windowWidth, innerHeight: windowHeight } = window);\n\n const submenuProps = { className, classNames, style, styles, dir };\n\n // Wait for dimensions to be measured before showing to prevent visible repositioning\n const hasSize = width > 0 && height > 0;\n\n useEffect(() => {\n if (hasSize) {\n requestAnimationFrame(() => setIsMounted(true));\n }\n }, [hasSize]);\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', isMounted && 'mantine-contextmenu-mounted', 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 : x - width < mdSpacing\n ? mdSpacing\n : x - width,\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 { useDirection } from '@mantine/core';\nimport { 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 const { dir } = useDirection();\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} dir={dir} {...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 dir: 'ltr' | 'rtl';\n};\n\nexport function ContextMenuPortal({ onHide, zIndex, dir, ...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} dir={dir} />\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","parseThemeColor","rgba","UnstyledButton","useMediaQuery","useTimeout","clsx","useContext","useRef","useState","Paper","px","useResizeObserver","clsx","useContext","useEffect","useState","useDirection","createContext","useContext","useState","Portal","useHotkeys","useWindowEvent","useContext","jsx","ContextMenuOverlay","zIndex","children","onHide","repositionOnRepeat","useContext","ContextMenuSettingsCtx","e","clientX","clientY","jsx","ContextMenuPortal","onHide","zIndex","dir","otherProps","useWindowEvent","useHotkeys","Portal","ContextMenuOverlay","ContextMenu","jsx","jsxs","DEFAULT_SETTINGS","ContextMenuSettingsCtx","createContext","ContextMenuCtx","ContextMenuProvider","zIndex","shadow","borderRadius","submenuDelay","repositionOnRepeat","children","data","setData","useState","dir","useDirection","hideContextMenu","showContextMenu","content","options","e","x","y","ContextMenuPortal","useContextMenu","useContext","humanize","value","str","jsx","ContextMenu","x","y","content","zIndex","onHide","className","style","classNames","styles","dir","shadow","borderRadius","useContext","ContextMenuSettingsCtx","paperRef","width","height","useResizeObserver","isMounted","setIsMounted","useState","windowWidth","windowHeight","submenuProps","hasSize","useEffect","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","dir","hoverAvailable","useMediaQuery","submenuPosition","setSubmenuPosition","useState","startShowingSubmenu","stopShowingSubmenu","useTimeout","rect","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": "
|
|
3
|
+
"version": "9.2.0",
|
|
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",
|
|
@@ -23,7 +23,10 @@
|
|
|
23
23
|
"usability",
|
|
24
24
|
"component"
|
|
25
25
|
],
|
|
26
|
-
"repository":
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "git+https://github.com/icflorescu/mantine-contextmenu.git"
|
|
29
|
+
},
|
|
27
30
|
"homepage": "https://icflorescu.github.io/mantine-contextmenu/",
|
|
28
31
|
"bugs": {
|
|
29
32
|
"url": "https://github.com/icflorescu/mantine-contextmenu/issues"
|
|
@@ -64,51 +67,44 @@
|
|
|
64
67
|
"*.css"
|
|
65
68
|
],
|
|
66
69
|
"scripts": {
|
|
67
|
-
"dev": "next dev
|
|
70
|
+
"dev": "next dev",
|
|
68
71
|
"build:package": "rm -rf dist; tsup --config scripts/tsup.esm.ts; tsup --config scripts/tsup.cjs.ts; tsup --config scripts/tsup.dts.ts; postcss package/styles*.css -d dist -m",
|
|
69
72
|
"build:docs": "next build",
|
|
70
73
|
"build": "pnpm build:package && pnpm build:docs",
|
|
71
|
-
"lint": "
|
|
72
|
-
"format": "
|
|
74
|
+
"lint": "biome check . && tsc --noEmit --pretty",
|
|
75
|
+
"format": "biome format --write ."
|
|
73
76
|
},
|
|
74
77
|
"devDependencies": {
|
|
75
|
-
"@
|
|
76
|
-
"@mantine/code-highlight": "^
|
|
77
|
-
"@mantine/core": "^
|
|
78
|
-
"@mantine/hooks": "^
|
|
79
|
-
"@mantine/notifications": "^
|
|
80
|
-
"@
|
|
81
|
-
"@
|
|
82
|
-
"@types/
|
|
83
|
-
"@types/
|
|
84
|
-
"@types/react": "^19.2.8",
|
|
78
|
+
"@biomejs/biome": "^2.4.15",
|
|
79
|
+
"@mantine/code-highlight": "^9.2.0",
|
|
80
|
+
"@mantine/core": "^9.2.0",
|
|
81
|
+
"@mantine/hooks": "^9.2.0",
|
|
82
|
+
"@mantine/notifications": "^9.2.0",
|
|
83
|
+
"@tabler/icons-react": "^3.44.0",
|
|
84
|
+
"@types/lodash": "^4.17.24",
|
|
85
|
+
"@types/node": "^25.7.0",
|
|
86
|
+
"@types/react": "^19.2.14",
|
|
85
87
|
"@types/react-dom": "^19.2.3",
|
|
86
|
-
"@typescript-eslint/eslint-plugin": "^8.53.1",
|
|
87
|
-
"@typescript-eslint/parser": "^8.53.1",
|
|
88
88
|
"clsx": "^2.1.1",
|
|
89
89
|
"cssnano": "^7.1.2",
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
"lodash": "^4.17.21",
|
|
94
|
-
"next": "^15.5.9",
|
|
95
|
-
"postcss": "^8.5.6",
|
|
90
|
+
"lodash": "^4.18.1",
|
|
91
|
+
"next": "^16.2.6",
|
|
92
|
+
"postcss": "^8.5.14",
|
|
96
93
|
"postcss-cli": "^11.0.1",
|
|
97
94
|
"postcss-import": "^16.1.1",
|
|
98
95
|
"postcss-preset-mantine": "^1.18.0",
|
|
99
96
|
"postcss-simple-vars": "^7.0.1",
|
|
100
|
-
"
|
|
101
|
-
"react": "^19.2.
|
|
102
|
-
"react-dom": "^19.2.3",
|
|
97
|
+
"react": "^19.2.6",
|
|
98
|
+
"react-dom": "^19.2.6",
|
|
103
99
|
"sharp": "^0.34.5",
|
|
104
|
-
"shiki": "^
|
|
105
|
-
"swr": "^2.
|
|
100
|
+
"shiki": "^4.0.2",
|
|
101
|
+
"swr": "^2.4.1",
|
|
106
102
|
"tsup": "^8.5.1",
|
|
107
|
-
"typescript": "^
|
|
103
|
+
"typescript": "^6.0.3"
|
|
108
104
|
},
|
|
109
105
|
"peerDependencies": {
|
|
110
|
-
"@mantine/core": ">=
|
|
111
|
-
"@mantine/hooks": ">=
|
|
106
|
+
"@mantine/core": ">=9",
|
|
107
|
+
"@mantine/hooks": ">=9",
|
|
112
108
|
"clsx": ">=2",
|
|
113
109
|
"react": ">=19",
|
|
114
110
|
"react-dom": ">=19"
|