mantine-contextmenu 8.1.0 → 8.1.2
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/README.md +1 -1
- package/dist/index.d.ts +2 -1
- 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 +11 -11
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 V8.
|
|
17
|
+
**⚠️ NOTE: Mantine ContextMenu V8.x is compatible with Mantine V8.x (and probably V7).**
|
|
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
|
@@ -166,8 +166,9 @@ type HideContextMenuFunction = () => void;
|
|
|
166
166
|
type ContextMenuDividerProps = Pick<ContextMenuItemOptions, 'className' | 'style'>;
|
|
167
167
|
declare function ContextMenuDivider({ className, style }: ContextMenuDividerProps): react.JSX.Element;
|
|
168
168
|
|
|
169
|
-
declare function ContextMenuItem({ className, style, icon, iconRight, title, color, disabled, onClick, onHide, items, }: WithRequiredProperty<Omit<ContextMenuItemOptions, 'key'>, 'title'> & {
|
|
169
|
+
declare function ContextMenuItem({ className, style, icon, iconRight, title, color, disabled, onClick, onHide, items, submenuProps, }: WithRequiredProperty<Omit<ContextMenuItemOptions, 'key'>, 'title'> & {
|
|
170
170
|
onHide: () => void;
|
|
171
|
+
submenuProps: Pick<ContextMenuOptions, 'className' | 'classNames' | 'style' | 'styles'>;
|
|
171
172
|
}): react.JSX.Element;
|
|
172
173
|
|
|
173
174
|
type ContextMenuInstanceOptions = {
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";"use client";var ie=Object.create;var
|
|
1
|
+
"use strict";"use client";var ie=Object.create;var N=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var pe=Object.getPrototypeOf,ae=Object.prototype.hasOwnProperty;var xe=(e,t)=>{for(var n in t)N(e,n,{get:t[n],enumerable:!0})},Q=(e,t,n,p)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of me(t))!ae.call(e,i)&&i!==n&&N(e,i,{get:()=>t[i],enumerable:!(p=se(t,i))||p.enumerable});return e};var $=(e,t,n)=>(n=e!=null?ie(pe(e)):{},Q(t||!e||!e.__esModule?N(n,"default",{value:e,enumerable:!0}):n,e)),le=e=>Q(N({},"__esModule",{value:!0}),e);var Ce={};xe(Ce,{ContextMenuCtx:()=>Y,ContextMenuDivider:()=>V,ContextMenuItem:()=>G,ContextMenuPortal:()=>X,ContextMenuProvider:()=>de,ContextMenuSettingsCtx:()=>f,humanize:()=>_,useContextMenu:()=>ce});module.exports=le(Ce);var Z=require("@mantine/core"),J=$(require("clsx")),K=require("react/jsx-runtime");function V({className:e,style:t}){return(0,K.jsx)(Z.Box,{className:(0,J.default)("mantine-contextmenu-divider",e),style:t})}var o=require("@mantine/core"),B=require("@mantine/hooks"),ue=$(require("clsx")),S=require("react");var w=require("@mantine/core"),oe=require("@mantine/hooks"),F=$(require("clsx")),re=require("react");var y=require("react");var ne=require("@mantine/core"),I=require("@mantine/hooks");var j=require("react");var te=require("react/jsx-runtime");function ee({zIndex:e,children:t,onHide:n}){let{repositionOnRepeat:p}=(0,j.useContext)(f);return(0,te.jsx)("div",{className:"mantine-contextmenu-overlay",style:{zIndex:e},onClick:u=>{u.preventDefault(),n()},onContextMenu:async u=>{if(u.preventDefault(),p){let{clientX:s,clientY:m}=u;try{document.elementsFromPoint(s,m)[1].dispatchEvent(new MouseEvent("contextmenu",{bubbles:!0,clientX:s,clientY:m}))}catch{}}else n()},children:t})}var T=require("react/jsx-runtime");function X({onHide:e,zIndex:t,...n}){return(0,I.useWindowEvent)("resize",e),(0,I.useWindowEvent)("scroll",e),(0,I.useHotkeys)([["Escape",e]]),(0,T.jsx)(ne.Portal,{children:(0,T.jsx)(ee,{zIndex:t,onHide:e,children:(0,T.jsx)(W,{...n,onHide:e})})})}var z=require("react/jsx-runtime"),D={shadow:"sm",borderRadius:"xs",submenuDelay:500,repositionOnRepeat:!1},f=(0,y.createContext)(D),Y=(0,y.createContext)({showContextMenu:()=>()=>{},hideContextMenu:()=>{},isContextMenuVisible:!1});function de({zIndex:e=9999,shadow:t=D.shadow,borderRadius:n=D.borderRadius,submenuDelay:p=D.submenuDelay,repositionOnRepeat:i=D.repositionOnRepeat,children:M}){let[u,s]=(0,y.useState)(null),m=()=>{s(null)},h=(O,a)=>r=>{r.preventDefault(),r.stopPropagation();let{x:b,y:c}="touches"in r?{x:r.touches.item(0).clientX,y:r.touches.item(0).clientY}:{x:r.clientX,y:r.clientY};s({x:b,y:c,content:O,zIndex:a?.zIndex||e,className:a?.className,style:a?.style,classNames:a?.classNames,styles:a?.styles})};return(0,z.jsx)(f.Provider,{value:{shadow:t,borderRadius:n,submenuDelay:p,repositionOnRepeat:i},children:(0,z.jsxs)(Y.Provider,{value:{showContextMenu:h,hideContextMenu:m,isContextMenuVisible:!!u},children:[M,u&&(0,z.jsx)(X,{onHide:m,...u})]})})}function ce(){return(0,y.useContext)(Y)}function _(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 A=require("react/jsx-runtime");function W({x:e,y:t,content:n,zIndex:p,onHide:i,className:M,style:u,classNames:s,styles:m}){let{shadow:h,borderRadius:O}=(0,re.useContext)(f),[a]=(0,oe.useResizeObserver)(),{width:r,height:b}=a.current?.getBoundingClientRect()||{width:0,height:0},c=0,P=0;typeof window<"u"&&({innerWidth:c,innerHeight:P}=window);let{dir:L}=(0,w.useDirection)(),q={className:M,classNames:s,style:u,styles:m};return(0,A.jsx)(w.Paper,{ref:a,shadow:h,radius:O,className:(0,F.default)("mantine-contextmenu",M,s?.root),style:[({spacing:{md:v}})=>{let x=(0,w.px)(v);return{zIndex:p,top:t+b+x>P?P-b-x:t,left:L==="ltr"?e+r+x>c?c-r-x:e:c-x-(e-r-x<0?r+x:e)}},u,m?.root],children:Array.isArray(n)?n.map(({key:v,hidden:x,className:R,style:k,onClick:E,items:H,title:U,...l})=>x?null:E||H?(0,A.jsx)(G,{className:(0,F.default)(s?.item,R),style:[m?.item,k],title:U??_(v),onClick:E,onHide:i,items:H,submenuProps:q,...l},v):(0,A.jsx)(V,{className:(0,F.default)(s?.divider,R),style:[m?.divider,k]},v)):n(i)})}var C=require("react/jsx-runtime");function G({className:e,style:t,icon:n,iconRight:p,title:i,color:M,disabled:u,onClick:s,onHide:m,items:h,submenuProps:O}){let a=(0,S.useRef)(null),{submenuDelay:r}=(0,S.useContext)(f),b=(0,B.useMediaQuery)("(hover: hover)"),[c,P]=(0,S.useState)(null),{start:L,clear:q}=(0,B.useTimeout)(()=>{let{top:l,right:g}=a.current.getBoundingClientRect();P({x:g,y:l})},r),{start:v,clear:x}=(0,B.useTimeout)(()=>{P(null)},r),R=()=>{x(),L()},k=()=>{q(),v()},E=h&&!u,H=E&&b,U=E?l=>{l.stopPropagation(),R()}:s?l=>{m(),s(l)}:void 0;return(0,C.jsxs)("div",{onMouseEnter:H?R:void 0,onMouseLeave:H?k:void 0,children:[(0,C.jsxs)(o.UnstyledButton,{ref:a,style:[l=>{let{colors:g}=l,d=M?(0,o.parseThemeColor)({color:M,theme:l}).value:void 0;return{"--mantine-contextmenu-item-button-color":d||"var(--mantine-color-text)","--mantine-contextmenu-item-button-hover-bg-color-light":d?(0,o.rgba)(d,.08):(0,o.rgba)(g.gray[4],.25),"--mantine-contextmenu-item-button-hover-bg-color-dark":d?(0,o.rgba)(d,.15):(0,o.rgba)(g.dark[3],.25),"--mantine-contextmenu-item-button-pressed-bg-color-light":d?(0,o.rgba)(d,.2):(0,o.rgba)(g.gray[4],.5),"--mantine-contextmenu-item-button-pressed-bg-color-dark":d?(0,o.rgba)(d,.3):(0,o.rgba)(g.dark[3],.5)}},t],className:(0,ue.default)("mantine-contextmenu-item-button",e),disabled:u,onClick:U,children:[n&&(0,C.jsx)(o.Box,{fz:0,mr:"xs",mt:-2,children:n}),(0,C.jsx)("div",{className:"mantine-contextmenu-item-button-title",children:i}),p?(0,C.jsx)(o.Box,{fz:0,ml:"xs",mt:-2,children:p}):h&&(0,C.jsx)(o.Box,{mt:-1,ml:"xs",children:"\u203A"})]}),c&&(0,C.jsx)(W,{content:h,onHide:m,...O,...c})]})}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, 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}: WithRequiredProperty<Omit<ContextMenuItemOptions, 'key'>, 'title'> & { onHide: () => void }) {\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 fz={10} mt={-2} ml=\"xs\">\n ▶\n </Box>\n )\n )}\n </UnstyledButton>\n {submenuPosition && <ContextMenu content={items as ContextMenuContent} onHide={onHide} {...submenuPosition} />}\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\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 {...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","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","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 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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{Box as
|
|
1
|
+
"use client";import{Box as G}from"@mantine/core";import Q from"clsx";import{jsx as Z}from"react/jsx-runtime";function W({className:e,style:t}){return Z(G,{className:Q("mantine-contextmenu-divider",e),style:t})}import{Box as T,UnstyledButton as pe,parseThemeColor as ae,rgba as c}from"@mantine/core";import{useMediaQuery as xe,useTimeout as Y}from"@mantine/hooks";import le from"clsx";import{useContext as de,useRef as ce,useState as Ce}from"react";import{Paper as re,px as ue,useDirection as ie}from"@mantine/core";import{useResizeObserver as se}from"@mantine/hooks";import k from"clsx";import{useContext as me}from"react";import{createContext as U,useContext as te,useState as ne}from"react";import{Portal as j}from"@mantine/core";import{useHotkeys as ee,useWindowEvent as A}from"@mantine/hooks";import{useContext as J}from"react";import{jsx as K}from"react/jsx-runtime";function F({zIndex:e,children:t,onHide:r}){let{repositionOnRepeat:l}=J(h);return K("div",{className:"mantine-contextmenu-overlay",style:{zIndex:e},onClick:o=>{o.preventDefault(),r()},onContextMenu:async o=>{if(o.preventDefault(),l){let{clientX:u,clientY:i}=o;try{document.elementsFromPoint(u,i)[1].dispatchEvent(new MouseEvent("contextmenu",{bubbles:!0,clientX:u,clientY:i}))}catch{}}else r()},children:t})}import{jsx as B}from"react/jsx-runtime";function L({onHide:e,zIndex:t,...r}){return A("resize",e),A("scroll",e),ee([["Escape",e]]),B(j,{children:B(F,{zIndex:t,onHide:e,children:B(H,{...r,onHide:e})})})}import{jsx as q,jsxs as oe}from"react/jsx-runtime";var O={shadow:"sm",borderRadius:"xs",submenuDelay:500,repositionOnRepeat:!1},h=U(O),$=U({showContextMenu:()=>()=>{},hideContextMenu:()=>{},isContextMenuVisible:!1});function ze({zIndex:e=9999,shadow:t=O.shadow,borderRadius:r=O.borderRadius,submenuDelay:l=O.submenuDelay,repositionOnRepeat:C=O.repositionOnRepeat,children:d}){let[o,u]=ne(null),i=()=>{u(null)},M=(P,s)=>n=>{n.preventDefault(),n.stopPropagation();let{x:v,y:x}="touches"in n?{x:n.touches.item(0).clientX,y:n.touches.item(0).clientY}:{x:n.clientX,y:n.clientY};u({x:v,y:x,content:P,zIndex:s?.zIndex||e,className:s?.className,style:s?.style,classNames:s?.classNames,styles:s?.styles})};return q(h.Provider,{value:{shadow:t,borderRadius:r,submenuDelay:l,repositionOnRepeat:C},children:oe($.Provider,{value:{showContextMenu:M,hideContextMenu:i,isContextMenuVisible:!!o},children:[d,o&&q(L,{onHide:i,...o})]})})}function Be(){return te($)}function V(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)}`}import{jsx as N}from"react/jsx-runtime";function H({x:e,y:t,content:r,zIndex:l,onHide:C,className:d,style:o,classNames:u,styles:i}){let{shadow:M,borderRadius:P}=me(h),[s]=se(),{width:n,height:v}=s.current?.getBoundingClientRect()||{width:0,height:0},x=0,y=0;typeof window<"u"&&({innerWidth:x,innerHeight:y}=window);let{dir:I}=ie(),D={className:d,classNames:u,style:o,styles:i};return N(re,{ref:s,shadow:M,radius:P,className:k("mantine-contextmenu",d,u?.root),style:[({spacing:{md:f}})=>{let m=ue(f);return{zIndex:l,top:t+v+m>y?y-v-m:t,left:I==="ltr"?e+n+m>x?x-n-m:e:x-m-(e-n-m<0?n+m:e)}},o,i?.root],children:Array.isArray(r)?r.map(({key:f,hidden:m,className:g,style:E,onClick:w,items:S,title:z,...p})=>m?null:w||S?N(X,{className:k(u?.item,g),style:[i?.item,E],title:z??V(f),onClick:w,onHide:C,items:S,submenuProps:D,...p},f):N(W,{className:k(u?.divider,g),style:[i?.divider,E]},f)):r(C)})}import{jsx as R,jsxs as _}from"react/jsx-runtime";function X({className:e,style:t,icon:r,iconRight:l,title:C,color:d,disabled:o,onClick:u,onHide:i,items:M,submenuProps:P}){let s=ce(null),{submenuDelay:n}=de(h),v=xe("(hover: hover)"),[x,y]=Ce(null),{start:I,clear:D}=Y(()=>{let{top:p,right:b}=s.current.getBoundingClientRect();y({x:b,y:p})},n),{start:f,clear:m}=Y(()=>{y(null)},n),g=()=>{m(),I()},E=()=>{D(),f()},w=M&&!o,S=w&&v,z=w?p=>{p.stopPropagation(),g()}:u?p=>{i(),u(p)}:void 0;return _("div",{onMouseEnter:S?g:void 0,onMouseLeave:S?E:void 0,children:[_(pe,{ref:s,style:[p=>{let{colors:b}=p,a=d?ae({color:d,theme:p}).value:void 0;return{"--mantine-contextmenu-item-button-color":a||"var(--mantine-color-text)","--mantine-contextmenu-item-button-hover-bg-color-light":a?c(a,.08):c(b.gray[4],.25),"--mantine-contextmenu-item-button-hover-bg-color-dark":a?c(a,.15):c(b.dark[3],.25),"--mantine-contextmenu-item-button-pressed-bg-color-light":a?c(a,.2):c(b.gray[4],.5),"--mantine-contextmenu-item-button-pressed-bg-color-dark":a?c(a,.3):c(b.dark[3],.5)}},t],className:le("mantine-contextmenu-item-button",e),disabled:o,onClick:z,children:[r&&R(T,{fz:0,mr:"xs",mt:-2,children:r}),R("div",{className:"mantine-contextmenu-item-button-title",children:C}),l?R(T,{fz:0,ml:"xs",mt:-2,children:l}):M&&R(T,{mt:-1,ml:"xs",children:"\u203A"})]}),x&&R(H,{content:M,onHide:i,...P,...x})]})}export{$ as ContextMenuCtx,W as ContextMenuDivider,X as ContextMenuItem,L as ContextMenuPortal,ze as ContextMenuProvider,h as ContextMenuSettingsCtx,V as humanize,Be 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, 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}: WithRequiredProperty<Omit<ContextMenuItemOptions, 'key'>, 'title'> & { onHide: () => void }) {\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 fz={10} mt={-2} ml=\"xs\">\n ▶\n </Box>\n )\n )}\n </UnstyledButton>\n {submenuPosition && <ContextMenu content={items as ContextMenuContent} onHide={onHide} {...submenuPosition} />}\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\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 {...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","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","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 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.1.
|
|
3
|
+
"version": "8.1.2",
|
|
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",
|
|
@@ -64,34 +64,34 @@
|
|
|
64
64
|
"*.css"
|
|
65
65
|
],
|
|
66
66
|
"scripts": {
|
|
67
|
-
"dev": "next dev",
|
|
67
|
+
"dev": "next dev --turbo",
|
|
68
68
|
"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
69
|
"build:docs": "next build",
|
|
70
|
-
"build": "
|
|
70
|
+
"build": "pnpm build:package && pnpm build:docs",
|
|
71
71
|
"lint": "eslint . && tsc --noEmit --pretty",
|
|
72
72
|
"format": "prettier --write ."
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
75
|
"@eslint/eslintrc": "^3.3.1",
|
|
76
|
-
"@mantine/code-highlight": "^8.1.
|
|
77
|
-
"@mantine/core": "^8.1.
|
|
78
|
-
"@mantine/hooks": "^8.1.
|
|
79
|
-
"@mantine/notifications": "^8.1.
|
|
76
|
+
"@mantine/code-highlight": "^8.1.1",
|
|
77
|
+
"@mantine/core": "^8.1.1",
|
|
78
|
+
"@mantine/hooks": "^8.1.1",
|
|
79
|
+
"@mantine/notifications": "^8.1.1",
|
|
80
80
|
"@tabler/icons-react": "^3.34.0",
|
|
81
81
|
"@types/lodash": "^4.17.17",
|
|
82
|
-
"@types/node": "^24.0.
|
|
83
|
-
"@types/react": "^19.1.
|
|
82
|
+
"@types/node": "^24.0.3",
|
|
83
|
+
"@types/react": "^19.1.8",
|
|
84
84
|
"@types/react-dom": "^19.1.6",
|
|
85
85
|
"@typescript-eslint/eslint-plugin": "^8.34.0",
|
|
86
86
|
"@typescript-eslint/parser": "^8.34.0",
|
|
87
87
|
"clsx": "^2.1.1",
|
|
88
88
|
"cssnano": "^7.0.7",
|
|
89
|
-
"eslint": "^9.
|
|
89
|
+
"eslint": "^9.29.0",
|
|
90
90
|
"eslint-config-next": "^15.3.3",
|
|
91
91
|
"eslint-plugin-react-hooks": "^5.2.0",
|
|
92
92
|
"lodash": "^4.17.21",
|
|
93
93
|
"next": "^15.3.3",
|
|
94
|
-
"postcss": "^8.5.
|
|
94
|
+
"postcss": "^8.5.5",
|
|
95
95
|
"postcss-cli": "^11.0.1",
|
|
96
96
|
"postcss-import": "^16.1.0",
|
|
97
97
|
"postcss-preset-mantine": "^1.17.0",
|