mantine-contextmenu 8.3.9 → 8.3.11
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 -0
- package/dist/index.d.ts +6 -2
- 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/dist/styles.css +1 -1
- package/dist/styles.layer.css +1 -1
- package/package.json +18 -18
package/README.md
CHANGED
|
@@ -25,6 +25,7 @@ Craft your applications for productivity and meet your users’ expectations by
|
|
|
25
25
|
- **[Custom content support](https://icflorescu.github.io/mantine-contextmenu/examples/custom-content)** - use any Mantine component as context menu content
|
|
26
26
|
- **[Highly customizable styling](https://icflorescu.github.io/mantine-contextmenu/examples/styling)** - use the `className`/`classNames` and `style`/`styles` props to customize the context menu appearance
|
|
27
27
|
- **[Written in Typescript and well-documented](https://icflorescu.github.io/mantine-contextmenu/type-definitions)** - with detailed JSDoc annotations for each exported function and component
|
|
28
|
+
- **[Comprehensive RTL support](https://icflorescu.github.io/mantine-contextmenu/examples/rtl-support)** - the context menu adjusts automatically to [Mantine `DirectionProvider`](https://mantine.dev/styles/rtl/)'s settings
|
|
28
29
|
|
|
29
30
|
## Full documentation and examples
|
|
30
31
|
|
package/dist/index.d.ts
CHANGED
|
@@ -168,7 +168,9 @@ declare function ContextMenuDivider({ className, style }: ContextMenuDividerProp
|
|
|
168
168
|
|
|
169
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
|
+
submenuProps: Pick<ContextMenuOptions, 'className' | 'classNames' | 'style' | 'styles'> & {
|
|
172
|
+
dir?: 'ltr' | 'rtl';
|
|
173
|
+
};
|
|
172
174
|
}): react.JSX.Element;
|
|
173
175
|
|
|
174
176
|
type ContextMenuInstanceOptions = {
|
|
@@ -178,12 +180,14 @@ type ContextMenuInstanceOptions = {
|
|
|
178
180
|
};
|
|
179
181
|
type ContextMenuProps = ContextMenuOptions & ContextMenuInstanceOptions & {
|
|
180
182
|
onHide: () => void;
|
|
183
|
+
dir?: 'ltr' | 'rtl';
|
|
181
184
|
};
|
|
182
185
|
|
|
183
186
|
type ContextMenuPortalProps = ContextMenuProps & {
|
|
184
187
|
zIndex?: number;
|
|
188
|
+
dir: 'ltr' | 'rtl';
|
|
185
189
|
};
|
|
186
|
-
declare function ContextMenuPortal({ onHide, zIndex, ...otherProps }: ContextMenuPortalProps): react.JSX.Element;
|
|
190
|
+
declare function ContextMenuPortal({ onHide, zIndex, dir, ...otherProps }: ContextMenuPortalProps): react.JSX.Element;
|
|
187
191
|
|
|
188
192
|
declare const ContextMenuSettingsCtx: react.Context<WithRequiredProperty<ContextMenuSettings, "shadow" | "borderRadius" | "submenuDelay">>;
|
|
189
193
|
declare const ContextMenuCtx: react.Context<{
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";"use client";var
|
|
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,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let u of pe(t))!le.call(e,u)&&u!==n&&F(e,u,{get:()=>t[u],enumerable:!(i=ae(t,u))||i.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:()=>y,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"),N=require("@mantine/hooks"),se=X(require("clsx")),O=require("react");var $=require("@mantine/core"),ue=require("@mantine/hooks"),q=X(require("clsx")),S=require("react");var ie=require("@mantine/core"),b=require("react");var re=require("@mantine/core"),z=require("@mantine/hooks");var te=require("react");var oe=require("react/jsx-runtime");function ne({zIndex:e,children:t,onHide:n}){let{repositionOnRepeat:i}=(0,te.useContext)(y);return(0,oe.jsx)("div",{className:"mantine-contextmenu-overlay",style:{zIndex:e},onClick:r=>{r.preventDefault(),n()},onContextMenu:async r=>{if(r.preventDefault(),i){let{clientX:s,clientY:a}=r;try{document.elementsFromPoint(s,a)[1].dispatchEvent(new MouseEvent("contextmenu",{bubbles:!0,clientX:s,clientY:a}))}catch{}}else n()},children:t})}var A=require("react/jsx-runtime");function _({onHide:e,zIndex:t,dir:n,...i}){return(0,z.useWindowEvent)("resize",e),(0,z.useWindowEvent)("scroll",e),(0,z.useHotkeys)([["Escape",e]]),(0,A.jsx)(re.Portal,{children:(0,A.jsx)(ne,{zIndex:t,onHide:e,children:(0,A.jsx)(L,{...i,onHide:e,dir:n})})})}var k=require("react/jsx-runtime"),B={shadow:"sm",borderRadius:"xs",submenuDelay:500,repositionOnRepeat:!1},y=(0,b.createContext)(B),G=(0,b.createContext)({showContextMenu:()=>()=>{},hideContextMenu:()=>{},isContextMenuVisible:!1});function Ce({zIndex:e=9999,shadow:t=B.shadow,borderRadius:n=B.borderRadius,submenuDelay:i=B.submenuDelay,repositionOnRepeat:u=B.repositionOnRepeat,children:f}){let[r,s]=(0,b.useState)(null),{dir:a}=(0,ie.useDirection)(),C=()=>{s(null)},P=(g,l)=>p=>{p.preventDefault(),p.stopPropagation();let{x:R,y:d}="touches"in p?{x:p.touches.item(0).clientX,y:p.touches.item(0).clientY}:{x:p.clientX,y:p.clientY};s({x:R,y:d,content:g,zIndex:l?.zIndex||e,className:l?.className,style:l?.style,classNames:l?.classNames,styles:l?.styles})};return(0,k.jsx)(y.Provider,{value:{shadow:t,borderRadius:n,submenuDelay:i,repositionOnRepeat:u},children:(0,k.jsxs)(G.Provider,{value:{showContextMenu:P,hideContextMenu:C,isContextMenuVisible:!!r},children:[f,r&&(0,k.jsx)(_,{onHide:C,dir:a,...r})]})})}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:i,onHide:u,className:f,style:r,classNames:s,styles:a,dir:C="ltr"}){let{shadow:P,borderRadius:g}=(0,S.useContext)(y),[l]=(0,ue.useResizeObserver)(),[p,R]=(0,S.useState)(!1),{width:d,height:w}=l.current?.getBoundingClientRect()||{width:0,height:0},E=0,I=0;typeof window<"u"&&({innerWidth:E,innerHeight:I}=window);let V={className:f,classNames:s,style:r,styles:a,dir:C},T=d>0&&w>0;return(0,S.useEffect)(()=>{T&&requestAnimationFrame(()=>R(!0))},[T]),(0,U.jsx)($.Paper,{ref:l,shadow:P,radius:g,className:(0,q.default)("mantine-contextmenu",p&&"mantine-contextmenu-mounted",f,s?.root),style:[({spacing:{md:h}})=>{let c=(0,$.px)(h);return{zIndex:i,top:t+w+c>I?I-w-c:t,left:C==="ltr"?e+d+c>E?E-d-c:e:e-d<c?c:e-d}},r,a?.root],children:Array.isArray(n)?n.map(({key:h,hidden:c,className:H,style:D,onClick:W,items:m,title:v,...x})=>c?null:W||m?(0,U.jsx)(Z,{className:(0,q.default)(s?.item,H),style:[a?.item,D],title:v??Q(h),onClick:W,onHide:u,items:m,submenuProps:V,...x},h):(0,U.jsx)(Y,{className:(0,q.default)(s?.divider,H),style:[a?.divider,D]},h)):n(u)})}var M=require("react/jsx-runtime");function Z({className:e,style:t,icon:n,iconRight:i,title:u,color:f,disabled:r,onClick:s,onHide:a,items:C,submenuProps:P}){let g=(0,O.useRef)(null),{submenuDelay:l}=(0,O.useContext)(y),p=P.dir||"ltr",R=(0,N.useMediaQuery)("(hover: hover)"),[d,w]=(0,O.useState)(null),{start:E,clear:I}=(0,N.useTimeout)(()=>{let m=g.current.getBoundingClientRect(),v=p==="ltr"?m.right:m.left;w({x:v,y:m.top})},l),{start:V,clear:T}=(0,N.useTimeout)(()=>{w(null)},l),h=()=>{T(),E()},c=()=>{I(),V()},H=C&&!r,D=H&&R,W=H?m=>{m.stopPropagation(),h()}:s?m=>{a(),s(m)}:void 0;return(0,M.jsxs)("div",{onMouseEnter:D?h:void 0,onMouseLeave:D?c:void 0,children:[(0,M.jsxs)(o.UnstyledButton,{ref:g,dir:p,style:[m=>{let{colors:v}=m,x=f?(0,o.parseThemeColor)({color:f,theme:m}).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)(v.gray[4],.25),"--mantine-contextmenu-item-button-hover-bg-color-dark":x?(0,o.rgba)(x,.15):(0,o.rgba)(v.dark[3],.25),"--mantine-contextmenu-item-button-pressed-bg-color-light":x?(0,o.rgba)(x,.2):(0,o.rgba)(v.gray[4],.5),"--mantine-contextmenu-item-button-pressed-bg-color-dark":x?(0,o.rgba)(x,.3):(0,o.rgba)(v.dark[3],.5)}},t],className:(0,se.default)("mantine-contextmenu-item-button",e),disabled:r,onClick:W,children:[n&&(0,M.jsx)(o.Box,{fz:0,me:"xs",mt:-2,children:n}),(0,M.jsx)("div",{className:"mantine-contextmenu-item-button-title",children:u}),i?(0,M.jsx)(o.Box,{fz:0,ms:"xs",mt:-2,children:i}):C&&(0,M.jsx)(o.Box,{mt:-1,ms:"xs",children:"\u203A"})]}),d&&(0,M.jsx)(L,{content:C,onHide:a,...P,...d})]})}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'>;\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n\n const hoverAvailable = useMediaQuery('(hover: hover)');\n\n const [submenuPosition, setSubmenuPosition] = useState<{ x: number; y: number } | null>(null);\n\n const { start: startShowingSubmenu, clear: stopShowingSubmenu } = useTimeout(() => {\n const { top: y, right: x } = ref.current!.getBoundingClientRect();\n setSubmenuPosition({ x, y });\n }, submenuDelay);\n\n const { start: startHidingSubmenu, clear: stopHidingSubmenu } = useTimeout(() => {\n setSubmenuPosition(null);\n }, submenuDelay);\n\n const showSubmenu = () => {\n stopHidingSubmenu();\n startShowingSubmenu();\n };\n\n const hideSubmenu = () => {\n stopShowingSubmenu();\n startHidingSubmenu();\n };\n\n const hasSubmenu = items && !disabled;\n const showSubmenuOnHover = hasSubmenu && hoverAvailable;\n\n const handleClick: MouseEventHandler<HTMLButtonElement> | undefined = hasSubmenu\n ? (e) => {\n e.stopPropagation();\n showSubmenu();\n }\n : onClick\n ? (e) => {\n onHide();\n onClick!(e);\n }\n : undefined;\n\n return (\n <div\n onMouseEnter={showSubmenuOnHover ? showSubmenu : undefined}\n onMouseLeave={showSubmenuOnHover ? hideSubmenu : undefined}\n >\n <UnstyledButton\n ref={ref}\n style={[\n (theme) => {\n const { colors } = theme;\n const parsedColor = color ? parseThemeColor({ color, theme }).value : undefined;\n return {\n '--mantine-contextmenu-item-button-color': parsedColor ? parsedColor : 'var(--mantine-color-text)',\n '--mantine-contextmenu-item-button-hover-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.08)\n : rgba(colors.gray[4], 0.25),\n '--mantine-contextmenu-item-button-hover-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.15)\n : rgba(colors.dark[3], 0.25),\n '--mantine-contextmenu-item-button-pressed-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.2)\n : rgba(colors.gray[4], 0.5),\n '--mantine-contextmenu-item-button-pressed-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.3)\n : rgba(colors.dark[3], 0.5),\n };\n },\n style,\n ]}\n className={clsx('mantine-contextmenu-item-button', className)}\n disabled={disabled}\n onClick={handleClick}\n >\n {icon && (\n <Box fz={0} mr=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ml=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ml=\"xs\">\n ›\n </Box>\n )\n )}\n </UnstyledButton>\n {submenuPosition && (\n <ContextMenu content={items as ContextMenuContent} onHide={onHide} {...submenuProps} {...submenuPosition} />\n )}\n </div>\n );\n}\n","import { Paper, px, useDirection } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { useContext } from 'react';\nimport { ContextMenuDivider } from './ContextMenuDivider';\nimport { ContextMenuItem } from './ContextMenuItem';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuOptions } from './types';\nimport { humanize } from './utils';\n\nexport type ContextMenuInstanceOptions = {\n x: number;\n y: number;\n content: ContextMenuContent;\n};\n\nexport type ContextMenuProps = ContextMenuOptions &\n ContextMenuInstanceOptions & {\n onHide: () => void;\n };\n\nexport function ContextMenu({ x, y, content, zIndex, onHide, className, style, classNames, styles }: ContextMenuProps) {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef] = useResizeObserver<HTMLDivElement>();\n // eslint-disable-next-line react-hooks/refs\n const { width, height } = paperRef.current?.getBoundingClientRect() || { width: 0, height: 0 };\n\n let windowWidth = 0;\n let windowHeight = 0;\n if (typeof window !== 'undefined') ({ innerWidth: windowWidth, innerHeight: windowHeight } = window);\n\n const { dir } = useDirection();\n const submenuProps = { className, classNames, style, styles };\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', className, classNames?.root)}\n style={[\n ({ spacing: { md } }) => {\n const mdSpacing = px(md) as number;\n return {\n zIndex,\n top: y + height + mdSpacing > windowHeight ? windowHeight - height - mdSpacing : y,\n left:\n dir === 'ltr'\n ? x + width + mdSpacing > windowWidth\n ? windowWidth - width - mdSpacing\n : x\n : windowWidth - mdSpacing - (x - width - mdSpacing < 0 ? width + mdSpacing : x),\n };\n },\n style,\n styles?.root,\n ]}\n >\n {Array.isArray(content)\n ? content.map(({ key, hidden, className, style, onClick, items, title, ...otherOptions }) =>\n hidden ? null : onClick || items ? (\n <ContextMenuItem\n key={key}\n className={clsx(classNames?.item, className)}\n style={[styles?.item, style]}\n title={title ?? humanize(key)}\n onClick={onClick}\n onHide={onHide}\n items={items}\n submenuProps={submenuProps}\n {...otherOptions}\n />\n ) : (\n <ContextMenuDivider\n key={key}\n className={clsx(classNames?.divider, className)}\n style={[styles?.divider, style]}\n />\n )\n )\n : content(onHide)}\n </Paper>\n );\n}\n","import { createContext, useContext, useState } from 'react';\nimport type { ContextMenuInstanceOptions } from './ContextMenu';\nimport { ContextMenuPortal } from './ContextMenuPortal';\nimport type {\n ContextMenuOptions,\n ContextMenuProviderProps,\n ContextMenuSettings,\n HideContextMenuFunction,\n ShowContextMenuFunction,\n WithRequiredProperty,\n} from './types';\n\nconst DEFAULT_SETTINGS: WithRequiredProperty<ContextMenuSettings, 'shadow' | 'borderRadius' | 'submenuDelay'> = {\n shadow: 'sm',\n borderRadius: 'xs',\n submenuDelay: 500,\n repositionOnRepeat: false,\n};\n\nexport const ContextMenuSettingsCtx = createContext(DEFAULT_SETTINGS);\nexport const ContextMenuCtx = createContext<{\n /**\n * Function that shows the context menu.\n */\n showContextMenu: ShowContextMenuFunction;\n\n /**\n * Function that hides the context menu.\n */\n hideContextMenu: HideContextMenuFunction;\n\n /**\n * Boolean indicating whether the context menu is currently visible.\n */\n isContextMenuVisible: boolean;\n}>({ showContextMenu: () => () => undefined, hideContextMenu: () => undefined, isContextMenuVisible: false });\n\n/**\n * Provider that allows to show a context menu anywhere in your application.\n * If you wrap your application with this provider, you can use the `useContextMenu` hook\n * anywhere in the component tree to access a function that shows the context menu.\n */\nexport function ContextMenuProvider({\n zIndex = 9999,\n shadow = DEFAULT_SETTINGS.shadow,\n borderRadius = DEFAULT_SETTINGS.borderRadius,\n submenuDelay = DEFAULT_SETTINGS.submenuDelay,\n repositionOnRepeat = DEFAULT_SETTINGS.repositionOnRepeat,\n children,\n}: ContextMenuProviderProps) {\n const [data, setData] = useState<(ContextMenuInstanceOptions & ContextMenuOptions) | null>(null);\n\n const hideContextMenu = () => {\n setData(null);\n };\n\n const showContextMenu: ShowContextMenuFunction = (content, options) => (e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const { x, y } =\n 'touches' in e ? { x: e.touches.item(0).clientX, y: e.touches.item(0).clientY } : { x: e.clientX, y: e.clientY };\n\n setData({\n x,\n y,\n content,\n zIndex: options?.zIndex || zIndex,\n className: options?.className,\n style: options?.style,\n classNames: options?.classNames,\n styles: options?.styles,\n });\n };\n\n return (\n <ContextMenuSettingsCtx.Provider value={{ shadow, borderRadius, submenuDelay, repositionOnRepeat }}>\n <ContextMenuCtx.Provider value={{ showContextMenu, hideContextMenu, isContextMenuVisible: !!data }}>\n {children}\n {data && <ContextMenuPortal onHide={hideContextMenu} {...data} />}\n </ContextMenuCtx.Provider>\n </ContextMenuSettingsCtx.Provider>\n );\n}\n\n/**\n * Hook returning functions that show and hide the context menu.\n */\nexport function useContextMenu() {\n return useContext(ContextMenuCtx);\n}\n","import { Portal } from '@mantine/core';\nimport { useHotkeys, useWindowEvent } from '@mantine/hooks';\nimport { ContextMenu, type ContextMenuProps } from './ContextMenu';\nimport { ContextMenuOverlay } from './ContextMenuOverlay';\n\nexport type ContextMenuPortalProps = ContextMenuProps & {\n zIndex?: number;\n};\n\nexport function ContextMenuPortal({ onHide, zIndex, ...otherProps }: ContextMenuPortalProps) {\n useWindowEvent('resize', onHide);\n useWindowEvent('scroll', onHide);\n useHotkeys([['Escape', onHide]]);\n\n return (\n <Portal>\n <ContextMenuOverlay zIndex={zIndex} onHide={onHide}>\n <ContextMenu {...otherProps} onHide={onHide} />\n </ContextMenuOverlay>\n </Portal>\n );\n}\n","import { useContext } from 'react';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\n\nexport type ContextMenuOverlayProps = React.PropsWithChildren<{\n zIndex: number | undefined;\n onHide: () => void;\n}>;\n\nexport function ContextMenuOverlay({ zIndex, children, onHide }: ContextMenuOverlayProps) {\n const { repositionOnRepeat } = useContext(ContextMenuSettingsCtx);\n\n const handleHide = (e: React.MouseEvent) => {\n e.preventDefault();\n onHide();\n };\n\n const handleContextMenu = async (e: React.MouseEvent) => {\n e.preventDefault();\n if (repositionOnRepeat) {\n const { clientX, clientY } = e;\n try {\n document\n .elementsFromPoint(clientX, clientY)[1]\n .dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, clientX, clientY }));\n } catch {\n // ignore error\n }\n } else {\n onHide();\n }\n };\n\n return (\n <div\n className=\"mantine-contextmenu-overlay\"\n style={{ zIndex }}\n onClick={handleHide}\n onContextMenu={handleContextMenu}\n >\n {children}\n </div>\n );\n}\n","/**\n * Utility function that returns a humanized version of a string, e.g. \"camelCase\" -> \"Camel Case\"\n */\nexport function humanize(value: string) {\n const str = value\n .replace(/([a-z\\d])([A-Z]+)/g, '$1 $2')\n .replace(/\\W|_/g, ' ')\n .trim()\n .toLowerCase();\n return `${str.charAt(0).toUpperCase()}${str.slice(1)}`;\n}\n"],"mappings":"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","names":["index_exports","__export","ContextMenuCtx","ContextMenuDivider","ContextMenuItem","ContextMenuPortal","ContextMenuProvider","ContextMenuSettingsCtx","humanize","useContextMenu","__toCommonJS","import_core","import_clsx","import_jsx_runtime","ContextMenuDivider","className","style","clsx","import_core","import_hooks","import_clsx","import_react","import_core","import_hooks","import_clsx","import_react","import_react","import_core","import_hooks","import_react","import_jsx_runtime","ContextMenuOverlay","zIndex","children","onHide","repositionOnRepeat","ContextMenuSettingsCtx","e","clientX","clientY","import_jsx_runtime","ContextMenuPortal","onHide","zIndex","otherProps","ContextMenuOverlay","ContextMenu","import_jsx_runtime","DEFAULT_SETTINGS","ContextMenuSettingsCtx","ContextMenuCtx","ContextMenuProvider","zIndex","shadow","borderRadius","submenuDelay","repositionOnRepeat","children","data","setData","hideContextMenu","showContextMenu","content","options","e","x","y","ContextMenuPortal","useContextMenu","humanize","value","str","import_jsx_runtime","ContextMenu","x","y","content","zIndex","onHide","className","style","classNames","styles","shadow","borderRadius","ContextMenuSettingsCtx","paperRef","width","height","windowWidth","windowHeight","dir","submenuProps","clsx","md","mdSpacing","key","hidden","onClick","items","title","otherOptions","ContextMenuItem","humanize","ContextMenuDivider","import_jsx_runtime","ContextMenuItem","className","style","icon","iconRight","title","color","disabled","onClick","onHide","items","submenuProps","ref","submenuDelay","ContextMenuSettingsCtx","hoverAvailable","submenuPosition","setSubmenuPosition","startShowingSubmenu","stopShowingSubmenu","y","x","startHidingSubmenu","stopHidingSubmenu","showSubmenu","hideSubmenu","hasSubmenu","showSubmenuOnHover","handleClick","e","theme","colors","parsedColor","clsx","ContextMenu"]}
|
|
1
|
+
{"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":"mlBAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,oBAAAE,EAAA,uBAAAC,EAAA,oBAAAC,EAAA,sBAAAC,EAAA,wBAAAC,GAAA,2BAAAC,EAAA,aAAAC,EAAA,mBAAAC,KAAA,eAAAC,GAAAV,ICAA,IAAAW,EAAoB,yBACpBC,EAAiB,mBAMRC,GAAA,6BADF,SAASC,EAAmB,CAAE,UAAAC,EAAW,MAAAC,CAAM,EAA4B,CAChF,SAAO,QAAC,OAAI,aAAW,EAAAC,SAAK,8BAA+BF,CAAS,EAAG,MAAOC,EAAO,CACvF,CCRA,IAAAE,EAA2D,yBAC3DC,EAA0C,0BAC1CC,GAAiB,mBACjBC,EAAqE,iBCHrE,IAAAC,EAA0B,yBAC1BC,GAAkC,0BAClCC,EAAiB,mBACjBC,EAAgD,iBCHhD,IAAAC,GAA6B,yBAC7BC,EAAoD,iBCDpD,IAAAC,GAAuB,yBACvBC,EAA2C,0BCD3C,IAAAC,GAA2B,iBAiCvB,IAAAC,GAAA,6BAzBG,SAASC,GAAmB,CAAE,OAAAC,EAAQ,SAAAC,EAAU,OAAAC,CAAO,EAA4B,CACxF,GAAM,CAAE,mBAAAC,CAAmB,KAAI,eAAWC,CAAsB,EAuBhE,SACE,QAAC,OACC,UAAU,8BACV,MAAO,CAAE,OAAAJ,CAAO,EAChB,QAzBgBK,GAAwB,CAC1CA,EAAE,eAAe,EACjBH,EAAO,CACT,EAuBI,cArBsB,MAAOG,GAAwB,CAEvD,GADAA,EAAE,eAAe,EACbF,EAAoB,CACtB,GAAM,CAAE,QAAAG,EAAS,QAAAC,CAAQ,EAAIF,EAC7B,GAAI,CACF,SACG,kBAAkBC,EAASC,CAAO,EAAE,CAAC,EACrC,cAAc,IAAI,WAAW,cAAe,CAAE,QAAS,GAAM,QAAAD,EAAS,QAAAC,CAAQ,CAAC,CAAC,CACrF,MAAQ,CAER,CACF,MACEL,EAAO,CAEX,EASK,SAAAD,EACH,CAEJ,CDxBQ,IAAAO,EAAA,6BARD,SAASC,EAAkB,CAAE,OAAAC,EAAQ,OAAAC,EAAQ,IAAAC,EAAK,GAAGC,CAAW,EAA2B,CAChG,2BAAe,SAAUH,CAAM,KAC/B,kBAAe,SAAUA,CAAM,KAC/B,cAAW,CAAC,CAAC,SAAUA,CAAM,CAAC,CAAC,KAG7B,OAAC,WACC,mBAACI,GAAA,CAAmB,OAAQH,EAAQ,OAAQD,EAC1C,mBAACK,EAAA,CAAa,GAAGF,EAAY,OAAQH,EAAQ,IAAKE,EAAK,EACzD,EACF,CAEJ,CDyDM,IAAAI,EAAA,6BAlEAC,EAA0G,CAC9G,OAAQ,KACR,aAAc,KACd,aAAc,IACd,mBAAoB,EACtB,EAEaC,KAAyB,iBAAcD,CAAgB,EACvDE,KAAiB,iBAe3B,CAAE,gBAAiB,IAAM,IAAG,GAAc,gBAAiB,IAAG,GAAc,qBAAsB,EAAM,CAAC,EAOrG,SAASC,GAAoB,CAClC,OAAAC,EAAS,KACT,OAAAC,EAASL,EAAiB,OAC1B,aAAAM,EAAeN,EAAiB,aAChC,aAAAO,EAAeP,EAAiB,aAChC,mBAAAQ,EAAqBR,EAAiB,mBACtC,SAAAS,CACF,EAA6B,CAC3B,GAAM,CAACC,EAAMC,CAAO,KAAI,YAAmE,IAAI,EACzF,CAAE,IAAAC,CAAI,KAAI,iBAAa,EAEvBC,EAAkB,IAAM,CAC5BF,EAAQ,IAAI,CACd,EAEMG,EAA2C,CAACC,EAASC,IAAaC,GAA2C,CACjHA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAElB,GAAM,CAAE,EAAAC,EAAG,EAAAC,CAAE,EACX,YAAaF,EAAI,CAAE,EAAGA,EAAE,QAAQ,KAAK,CAAC,EAAE,QAAS,EAAGA,EAAE,QAAQ,KAAK,CAAC,EAAE,OAAQ,EAAI,CAAE,EAAGA,EAAE,QAAS,EAAGA,EAAE,OAAQ,EAEjHN,EAAQ,CACN,EAAAO,EACA,EAAAC,EACA,QAAAJ,EACA,OAAQC,GAAS,QAAUZ,EAC3B,UAAWY,GAAS,UACpB,MAAOA,GAAS,MAChB,WAAYA,GAAS,WACrB,OAAQA,GAAS,MACnB,CAAC,CACH,EAEA,SACE,OAACf,EAAuB,SAAvB,CAAgC,MAAO,CAAE,OAAAI,EAAQ,aAAAC,EAAc,aAAAC,EAAc,mBAAAC,CAAmB,EAC/F,oBAACN,EAAe,SAAf,CAAwB,MAAO,CAAE,gBAAAY,EAAiB,gBAAAD,EAAiB,qBAAsB,CAAC,CAACH,CAAK,EAC9F,UAAAD,EACAC,MAAQ,OAACU,EAAA,CAAkB,OAAQP,EAAiB,IAAKD,EAAM,GAAGF,EAAM,GAC3E,EACF,CAEJ,CAKO,SAASW,IAAiB,CAC/B,SAAO,cAAWnB,CAAc,CAClC,CGzFO,SAASoB,EAASC,EAAe,CACtC,IAAMC,EAAMD,EACT,QAAQ,qBAAsB,OAAO,EACrC,QAAQ,QAAS,GAAG,EACpB,KAAK,EACL,YAAY,EACf,MAAO,GAAGC,EAAI,OAAO,CAAC,EAAE,YAAY,CAAC,GAAGA,EAAI,MAAM,CAAC,CAAC,EACtD,CJ2Ec,IAAAC,EAAA,6BA/DP,SAASC,EAAY,CAC1B,EAAAC,EACA,EAAAC,EACA,QAAAC,EACA,OAAAC,EACA,OAAAC,EACA,UAAAC,EACA,MAAAC,EACA,WAAAC,EACA,OAAAC,EACA,IAAAC,EAAM,KACR,EAAqB,CACnB,GAAM,CAAE,OAAAC,EAAQ,aAAAC,CAAa,KAAI,cAAWC,CAAsB,EAC5D,CAACC,CAAQ,KAAI,sBAAkC,EAC/C,CAACC,EAAWC,CAAY,KAAI,YAAS,EAAK,EAG1C,CAAE,MAAAC,EAAO,OAAAC,CAAO,EAAIJ,EAAS,SAAS,sBAAsB,GAAK,CAAE,MAAO,EAAG,OAAQ,CAAE,EAEzFK,EAAc,EACdC,EAAe,EACf,OAAO,OAAW,MAAc,CAAE,WAAYD,EAAa,YAAaC,CAAa,EAAI,QAE7F,IAAMC,EAAe,CAAE,UAAAf,EAAW,WAAAE,EAAY,MAAAD,EAAO,OAAAE,EAAQ,IAAAC,CAAI,EAG3DY,EAAUL,EAAQ,GAAKC,EAAS,EAEtC,sBAAU,IAAM,CACVI,GACF,sBAAsB,IAAMN,EAAa,EAAI,CAAC,CAElD,EAAG,CAACM,CAAO,CAAC,KAGV,OAAC,SACC,IAAKR,EACL,OAAQH,EACR,OAAQC,EACR,aAAW,EAAAW,SAAK,sBAAuBR,GAAa,8BAA+BT,EAAWE,GAAY,IAAI,EAC9G,MAAO,CACL,CAAC,CAAE,QAAS,CAAE,GAAAgB,CAAG,CAAE,IAAM,CACvB,IAAMC,KAAY,MAAGD,CAAE,EACvB,MAAO,CACL,OAAApB,EACA,IAAKF,EAAIgB,EAASO,EAAYL,EAAeA,EAAeF,EAASO,EAAYvB,EACjF,KACEQ,IAAQ,MACJT,EAAIgB,EAAQQ,EAAYN,EACtBA,EAAcF,EAAQQ,EACtBxB,EACFA,EAAIgB,EAAQQ,EACVA,EACAxB,EAAIgB,CACd,CACF,EACAV,EACAE,GAAQ,IACV,EAEC,eAAM,QAAQN,CAAO,EAClBA,EAAQ,IAAI,CAAC,CAAE,IAAAuB,EAAK,OAAAC,EAAQ,UAAArB,EAAW,MAAAC,EAAO,QAAAqB,EAAS,MAAAC,EAAO,MAAAC,EAAO,GAAGC,CAAa,IACnFJ,EAAS,KAAOC,GAAWC,KACzB,OAACG,EAAA,CAEC,aAAW,EAAAT,SAAKf,GAAY,KAAMF,CAAS,EAC3C,MAAO,CAACG,GAAQ,KAAMF,CAAK,EAC3B,MAAOuB,GAASG,EAASP,CAAG,EAC5B,QAASE,EACT,OAAQvB,EACR,MAAOwB,EACP,aAAcR,EACb,GAAGU,GARCL,CASP,KAEA,OAACQ,EAAA,CAEC,aAAW,EAAAX,SAAKf,GAAY,QAASF,CAAS,EAC9C,MAAO,CAACG,GAAQ,QAASF,CAAK,GAFzBmB,CAGP,CAEJ,EACAvB,EAAQE,CAAM,EACpB,CAEJ,CDnCM,IAAA8B,EAAA,6BAhEC,SAASC,EAAgB,CAC9B,UAAAC,EACA,MAAAC,EACA,KAAAC,EACA,UAAAC,EACA,MAAAC,EACA,MAAAC,EACA,SAAAC,EACA,QAAAC,EACA,OAAAC,EACA,MAAAC,EACA,aAAAC,CACF,EAGG,CACD,IAAMC,KAAM,UAA0B,IAAI,EACpC,CAAE,aAAAC,CAAa,KAAI,cAAWC,CAAsB,EACpDC,EAAMJ,EAAa,KAAO,MAE1BK,KAAiB,iBAAc,gBAAgB,EAE/C,CAACC,EAAiBC,CAAkB,KAAI,YAA0C,IAAI,EAEtF,CAAE,MAAOC,EAAqB,MAAOC,CAAmB,KAAI,cAAW,IAAM,CACjF,IAAMC,EAAOT,EAAI,QAAS,sBAAsB,EAC1CU,EAAIP,IAAQ,MAAQM,EAAK,MAAQA,EAAK,KAC5CH,EAAmB,CAAE,EAAAI,EAAG,EAAGD,EAAK,GAAI,CAAC,CACvC,EAAGR,CAAY,EAET,CAAE,MAAOU,EAAoB,MAAOC,CAAkB,KAAI,cAAW,IAAM,CAC/EN,EAAmB,IAAI,CACzB,EAAGL,CAAY,EAETY,EAAc,IAAM,CACxBD,EAAkB,EAClBL,EAAoB,CACtB,EAEMO,EAAc,IAAM,CACxBN,EAAmB,EACnBG,EAAmB,CACrB,EAEMI,EAAajB,GAAS,CAACH,EACvBqB,EAAqBD,GAAcX,EAEnCa,EAAgEF,EACjEG,GAAM,CACLA,EAAE,gBAAgB,EAClBL,EAAY,CACd,EACAjB,EACGsB,GAAM,CACLrB,EAAO,EACPD,EAASsB,CAAC,CACZ,EACA,OAEN,SACE,QAAC,OACC,aAAcF,EAAqBH,EAAc,OACjD,aAAcG,EAAqBF,EAAc,OAEjD,qBAAC,kBACC,IAAKd,EACL,IAAKG,EACL,MAAO,CACJgB,GAAU,CACT,GAAM,CAAE,OAAAC,CAAO,EAAID,EACbE,EAAc3B,KAAQ,mBAAgB,CAAE,MAAAA,EAAO,MAAAyB,CAAM,CAAC,EAAE,MAAQ,OACtE,MAAO,CACL,0CAA2CE,GAA4B,4BACvE,yDAA0DA,KACtD,QAAKA,EAAa,GAAI,KACtB,QAAKD,EAAO,KAAK,CAAC,EAAG,GAAI,EAC7B,wDAAyDC,KACrD,QAAKA,EAAa,GAAI,KACtB,QAAKD,EAAO,KAAK,CAAC,EAAG,GAAI,EAC7B,2DAA4DC,KACxD,QAAKA,EAAa,EAAG,KACrB,QAAKD,EAAO,KAAK,CAAC,EAAG,EAAG,EAC5B,0DAA2DC,KACvD,QAAKA,EAAa,EAAG,KACrB,QAAKD,EAAO,KAAK,CAAC,EAAG,EAAG,CAC9B,CACF,EACA9B,CACF,EACA,aAAW,GAAAgC,SAAK,kCAAmCjC,CAAS,EAC5D,SAAUM,EACV,QAASsB,EAER,UAAA1B,MACC,OAAC,OAAI,GAAI,EAAG,GAAG,KAAK,GAAI,GACrB,SAAAA,EACH,KAEF,OAAC,OAAI,UAAU,wCAAyC,SAAAE,EAAM,EAC7DD,KACC,OAAC,OAAI,GAAI,EAAG,GAAG,KAAK,GAAI,GACrB,SAAAA,EACH,EAEAM,MACE,OAAC,OAAI,GAAI,GAAI,GAAG,KAAK,kBAErB,GAGN,EACCO,MACC,OAACkB,EAAA,CAAY,QAASzB,EAA6B,OAAQD,EAAS,GAAGE,EAAe,GAAGM,EAAiB,GAE9G,CAEJ","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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{Box as
|
|
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:t}){return J(Q,{className:Z("mantine-contextmenu-divider",e),style:t})}import{Box as W,UnstyledButton as le,parseThemeColor as de,rgba as f}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:t,onHide:o}){let{repositionOnRepeat:p}=K(v);return j("div",{className:"mantine-contextmenu-overlay",style:{zIndex:e},onClick:n=>{n.preventDefault(),o()},onContextMenu:async n=>{if(n.preventDefault(),p){let{clientX:r,clientY:u}=n;try{document.elementsFromPoint(r,u)[1].dispatchEvent(new MouseEvent("contextmenu",{bubbles:!0,clientX:r,clientY:u}))}catch{}}else o()},children:t})}import{jsx as k}from"react/jsx-runtime";function q({onHide:e,zIndex:t,dir:o,...p}){return L("resize",e),L("scroll",e),te([["Escape",e]]),k(ee,{children:k(A,{zIndex:t,onHide:e,children:k(z,{...p,onHide:e,dir:o})})})}import{jsx as U,jsxs as ie}from"react/jsx-runtime";var E={shadow:"sm",borderRadius:"xs",submenuDelay:500,repositionOnRepeat:!1},v=$(E),V=$({showContextMenu:()=>()=>{},hideContextMenu:()=>{},isContextMenuVisible:!1});function Te({zIndex:e=9999,shadow:t=E.shadow,borderRadius:o=E.borderRadius,submenuDelay:p=E.submenuDelay,repositionOnRepeat:h=E.repositionOnRepeat,children:c}){let[n,r]=re(null),{dir:u}=ne(),d=()=>{r(null)},y=(b,a)=>s=>{s.preventDefault(),s.stopPropagation();let{x:g,y:x}="touches"in s?{x:s.touches.item(0).clientX,y:s.touches.item(0).clientY}:{x:s.clientX,y:s.clientY};r({x:g,y:x,content:b,zIndex:a?.zIndex||e,className:a?.className,style:a?.style,classNames:a?.classNames,styles:a?.styles})};return U(v.Provider,{value:{shadow:t,borderRadius:o,submenuDelay:p,repositionOnRepeat:h},children:ie(V.Provider,{value:{showContextMenu:y,hideContextMenu:d,isContextMenuVisible:!!n},children:[c,n&&U(q,{onHide:d,dir:u,...n})]})})}function We(){return oe(V)}function X(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 T}from"react/jsx-runtime";function z({x:e,y:t,content:o,zIndex:p,onHide:h,className:c,style:n,classNames:r,styles:u,dir:d="ltr"}){let{shadow:y,borderRadius:b}=ae(v),[a]=me(),[s,g]=xe(!1),{width:x,height:P}=a.current?.getBoundingClientRect()||{width:0,height:0},w=0,S=0;typeof window<"u"&&({innerWidth:w,innerHeight:S}=window);let B={className:c,classNames:r,style:n,styles:u,dir:d},H=x>0&&P>0;return pe(()=>{H&&requestAnimationFrame(()=>g(!0))},[H]),T(ue,{ref:a,shadow:y,radius:b,className:N("mantine-contextmenu",s&&"mantine-contextmenu-mounted",c,r?.root),style:[({spacing:{md:C}})=>{let l=se(C);return{zIndex:p,top:t+P+l>S?S-P-l:t,left:d==="ltr"?e+x+l>w?w-x-l:e:e-x<l?l:e-x}},n,u?.root],children:Array.isArray(o)?o.map(({key:C,hidden:l,className:O,style:R,onClick:D,items:i,title:M,...m})=>l?null:D||i?T(Y,{className:N(r?.item,O),style:[u?.item,R],title:M??X(C),onClick:D,onHide:h,items:i,submenuProps:B,...m},C):T(F,{className:N(r?.divider,O),style:[u?.divider,R]},C)):o(h)})}import{jsx as I,jsxs as G}from"react/jsx-runtime";function Y({className:e,style:t,icon:o,iconRight:p,title:h,color:c,disabled:n,onClick:r,onHide:u,items:d,submenuProps:y}){let b=fe(null),{submenuDelay:a}=Me(v),s=y.dir||"ltr",g=ce("(hover: hover)"),[x,P]=he(null),{start:w,clear:S}=_(()=>{let i=b.current.getBoundingClientRect(),M=s==="ltr"?i.right:i.left;P({x:M,y:i.top})},a),{start:B,clear:H}=_(()=>{P(null)},a),C=()=>{H(),w()},l=()=>{S(),B()},O=d&&!n,R=O&&g,D=O?i=>{i.stopPropagation(),C()}:r?i=>{u(),r(i)}:void 0;return G("div",{onMouseEnter:R?C:void 0,onMouseLeave:R?l:void 0,children:[G(le,{ref:b,dir:s,style:[i=>{let{colors:M}=i,m=c?de({color:c,theme:i}).value:void 0;return{"--mantine-contextmenu-item-button-color":m||"var(--mantine-color-text)","--mantine-contextmenu-item-button-hover-bg-color-light":m?f(m,.08):f(M.gray[4],.25),"--mantine-contextmenu-item-button-hover-bg-color-dark":m?f(m,.15):f(M.dark[3],.25),"--mantine-contextmenu-item-button-pressed-bg-color-light":m?f(m,.2):f(M.gray[4],.5),"--mantine-contextmenu-item-button-pressed-bg-color-dark":m?f(m,.3):f(M.dark[3],.5)}},t],className:Ce("mantine-contextmenu-item-button",e),disabled:n,onClick:D,children:[o&&I(W,{fz:0,me:"xs",mt:-2,children:o}),I("div",{className:"mantine-contextmenu-item-button-title",children:h}),p?I(W,{fz:0,ms:"xs",mt:-2,children:p}):d&&I(W,{mt:-1,ms:"xs",children:"\u203A"})]}),x&&I(z,{content:d,onHide:u,...y,...x})]})}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'>;\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n\n const hoverAvailable = useMediaQuery('(hover: hover)');\n\n const [submenuPosition, setSubmenuPosition] = useState<{ x: number; y: number } | null>(null);\n\n const { start: startShowingSubmenu, clear: stopShowingSubmenu } = useTimeout(() => {\n const { top: y, right: x } = ref.current!.getBoundingClientRect();\n setSubmenuPosition({ x, y });\n }, submenuDelay);\n\n const { start: startHidingSubmenu, clear: stopHidingSubmenu } = useTimeout(() => {\n setSubmenuPosition(null);\n }, submenuDelay);\n\n const showSubmenu = () => {\n stopHidingSubmenu();\n startShowingSubmenu();\n };\n\n const hideSubmenu = () => {\n stopShowingSubmenu();\n startHidingSubmenu();\n };\n\n const hasSubmenu = items && !disabled;\n const showSubmenuOnHover = hasSubmenu && hoverAvailable;\n\n const handleClick: MouseEventHandler<HTMLButtonElement> | undefined = hasSubmenu\n ? (e) => {\n e.stopPropagation();\n showSubmenu();\n }\n : onClick\n ? (e) => {\n onHide();\n onClick!(e);\n }\n : undefined;\n\n return (\n <div\n onMouseEnter={showSubmenuOnHover ? showSubmenu : undefined}\n onMouseLeave={showSubmenuOnHover ? hideSubmenu : undefined}\n >\n <UnstyledButton\n ref={ref}\n style={[\n (theme) => {\n const { colors } = theme;\n const parsedColor = color ? parseThemeColor({ color, theme }).value : undefined;\n return {\n '--mantine-contextmenu-item-button-color': parsedColor ? parsedColor : 'var(--mantine-color-text)',\n '--mantine-contextmenu-item-button-hover-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.08)\n : rgba(colors.gray[4], 0.25),\n '--mantine-contextmenu-item-button-hover-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.15)\n : rgba(colors.dark[3], 0.25),\n '--mantine-contextmenu-item-button-pressed-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.2)\n : rgba(colors.gray[4], 0.5),\n '--mantine-contextmenu-item-button-pressed-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.3)\n : rgba(colors.dark[3], 0.5),\n };\n },\n style,\n ]}\n className={clsx('mantine-contextmenu-item-button', className)}\n disabled={disabled}\n onClick={handleClick}\n >\n {icon && (\n <Box fz={0} mr=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ml=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ml=\"xs\">\n ›\n </Box>\n )\n )}\n </UnstyledButton>\n {submenuPosition && (\n <ContextMenu content={items as ContextMenuContent} onHide={onHide} {...submenuProps} {...submenuPosition} />\n )}\n </div>\n );\n}\n","import { Paper, px, useDirection } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { useContext } from 'react';\nimport { ContextMenuDivider } from './ContextMenuDivider';\nimport { ContextMenuItem } from './ContextMenuItem';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuOptions } from './types';\nimport { humanize } from './utils';\n\nexport type ContextMenuInstanceOptions = {\n x: number;\n y: number;\n content: ContextMenuContent;\n};\n\nexport type ContextMenuProps = ContextMenuOptions &\n ContextMenuInstanceOptions & {\n onHide: () => void;\n };\n\nexport function ContextMenu({ x, y, content, zIndex, onHide, className, style, classNames, styles }: ContextMenuProps) {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef] = useResizeObserver<HTMLDivElement>();\n // eslint-disable-next-line react-hooks/refs\n const { width, height } = paperRef.current?.getBoundingClientRect() || { width: 0, height: 0 };\n\n let windowWidth = 0;\n let windowHeight = 0;\n if (typeof window !== 'undefined') ({ innerWidth: windowWidth, innerHeight: windowHeight } = window);\n\n const { dir } = useDirection();\n const submenuProps = { className, classNames, style, styles };\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', className, classNames?.root)}\n style={[\n ({ spacing: { md } }) => {\n const mdSpacing = px(md) as number;\n return {\n zIndex,\n top: y + height + mdSpacing > windowHeight ? windowHeight - height - mdSpacing : y,\n left:\n dir === 'ltr'\n ? x + width + mdSpacing > windowWidth\n ? windowWidth - width - mdSpacing\n : x\n : windowWidth - mdSpacing - (x - width - mdSpacing < 0 ? width + mdSpacing : x),\n };\n },\n style,\n styles?.root,\n ]}\n >\n {Array.isArray(content)\n ? content.map(({ key, hidden, className, style, onClick, items, title, ...otherOptions }) =>\n hidden ? null : onClick || items ? (\n <ContextMenuItem\n key={key}\n className={clsx(classNames?.item, className)}\n style={[styles?.item, style]}\n title={title ?? humanize(key)}\n onClick={onClick}\n onHide={onHide}\n items={items}\n submenuProps={submenuProps}\n {...otherOptions}\n />\n ) : (\n <ContextMenuDivider\n key={key}\n className={clsx(classNames?.divider, className)}\n style={[styles?.divider, style]}\n />\n )\n )\n : content(onHide)}\n </Paper>\n );\n}\n","import { createContext, useContext, useState } from 'react';\nimport type { ContextMenuInstanceOptions } from './ContextMenu';\nimport { ContextMenuPortal } from './ContextMenuPortal';\nimport type {\n ContextMenuOptions,\n ContextMenuProviderProps,\n ContextMenuSettings,\n HideContextMenuFunction,\n ShowContextMenuFunction,\n WithRequiredProperty,\n} from './types';\n\nconst DEFAULT_SETTINGS: WithRequiredProperty<ContextMenuSettings, 'shadow' | 'borderRadius' | 'submenuDelay'> = {\n shadow: 'sm',\n borderRadius: 'xs',\n submenuDelay: 500,\n repositionOnRepeat: false,\n};\n\nexport const ContextMenuSettingsCtx = createContext(DEFAULT_SETTINGS);\nexport const ContextMenuCtx = createContext<{\n /**\n * Function that shows the context menu.\n */\n showContextMenu: ShowContextMenuFunction;\n\n /**\n * Function that hides the context menu.\n */\n hideContextMenu: HideContextMenuFunction;\n\n /**\n * Boolean indicating whether the context menu is currently visible.\n */\n isContextMenuVisible: boolean;\n}>({ showContextMenu: () => () => undefined, hideContextMenu: () => undefined, isContextMenuVisible: false });\n\n/**\n * Provider that allows to show a context menu anywhere in your application.\n * If you wrap your application with this provider, you can use the `useContextMenu` hook\n * anywhere in the component tree to access a function that shows the context menu.\n */\nexport function ContextMenuProvider({\n zIndex = 9999,\n shadow = DEFAULT_SETTINGS.shadow,\n borderRadius = DEFAULT_SETTINGS.borderRadius,\n submenuDelay = DEFAULT_SETTINGS.submenuDelay,\n repositionOnRepeat = DEFAULT_SETTINGS.repositionOnRepeat,\n children,\n}: ContextMenuProviderProps) {\n const [data, setData] = useState<(ContextMenuInstanceOptions & ContextMenuOptions) | null>(null);\n\n const hideContextMenu = () => {\n setData(null);\n };\n\n const showContextMenu: ShowContextMenuFunction = (content, options) => (e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const { x, y } =\n 'touches' in e ? { x: e.touches.item(0).clientX, y: e.touches.item(0).clientY } : { x: e.clientX, y: e.clientY };\n\n setData({\n x,\n y,\n content,\n zIndex: options?.zIndex || zIndex,\n className: options?.className,\n style: options?.style,\n classNames: options?.classNames,\n styles: options?.styles,\n });\n };\n\n return (\n <ContextMenuSettingsCtx.Provider value={{ shadow, borderRadius, submenuDelay, repositionOnRepeat }}>\n <ContextMenuCtx.Provider value={{ showContextMenu, hideContextMenu, isContextMenuVisible: !!data }}>\n {children}\n {data && <ContextMenuPortal onHide={hideContextMenu} {...data} />}\n </ContextMenuCtx.Provider>\n </ContextMenuSettingsCtx.Provider>\n );\n}\n\n/**\n * Hook returning functions that show and hide the context menu.\n */\nexport function useContextMenu() {\n return useContext(ContextMenuCtx);\n}\n","import { Portal } from '@mantine/core';\nimport { useHotkeys, useWindowEvent } from '@mantine/hooks';\nimport { ContextMenu, type ContextMenuProps } from './ContextMenu';\nimport { ContextMenuOverlay } from './ContextMenuOverlay';\n\nexport type ContextMenuPortalProps = ContextMenuProps & {\n zIndex?: number;\n};\n\nexport function ContextMenuPortal({ onHide, zIndex, ...otherProps }: ContextMenuPortalProps) {\n useWindowEvent('resize', onHide);\n useWindowEvent('scroll', onHide);\n useHotkeys([['Escape', onHide]]);\n\n return (\n <Portal>\n <ContextMenuOverlay zIndex={zIndex} onHide={onHide}>\n <ContextMenu {...otherProps} onHide={onHide} />\n </ContextMenuOverlay>\n </Portal>\n );\n}\n","import { useContext } from 'react';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\n\nexport type ContextMenuOverlayProps = React.PropsWithChildren<{\n zIndex: number | undefined;\n onHide: () => void;\n}>;\n\nexport function ContextMenuOverlay({ zIndex, children, onHide }: ContextMenuOverlayProps) {\n const { repositionOnRepeat } = useContext(ContextMenuSettingsCtx);\n\n const handleHide = (e: React.MouseEvent) => {\n e.preventDefault();\n onHide();\n };\n\n const handleContextMenu = async (e: React.MouseEvent) => {\n e.preventDefault();\n if (repositionOnRepeat) {\n const { clientX, clientY } = e;\n try {\n document\n .elementsFromPoint(clientX, clientY)[1]\n .dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, clientX, clientY }));\n } catch {\n // ignore error\n }\n } else {\n onHide();\n }\n };\n\n return (\n <div\n className=\"mantine-contextmenu-overlay\"\n style={{ zIndex }}\n onClick={handleHide}\n onContextMenu={handleContextMenu}\n >\n {children}\n </div>\n );\n}\n","/**\n * Utility function that returns a humanized version of a string, e.g. \"camelCase\" -> \"Camel Case\"\n */\nexport function humanize(value: string) {\n const str = value\n .replace(/([a-z\\d])([A-Z]+)/g, '$1 $2')\n .replace(/\\W|_/g, ' ')\n .trim()\n .toLowerCase();\n return `${str.charAt(0).toUpperCase()}${str.slice(1)}`;\n}\n"],"mappings":"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","names":["Box","clsx","jsx","ContextMenuDivider","className","style","Box","UnstyledButton","parseThemeColor","rgba","useMediaQuery","useTimeout","clsx","useContext","useRef","useState","Paper","px","useDirection","useResizeObserver","clsx","useContext","createContext","useContext","useState","Portal","useHotkeys","useWindowEvent","useContext","jsx","ContextMenuOverlay","zIndex","children","onHide","repositionOnRepeat","useContext","ContextMenuSettingsCtx","e","clientX","clientY","jsx","ContextMenuPortal","onHide","zIndex","otherProps","useWindowEvent","useHotkeys","Portal","ContextMenuOverlay","ContextMenu","jsx","jsxs","DEFAULT_SETTINGS","ContextMenuSettingsCtx","createContext","ContextMenuCtx","ContextMenuProvider","zIndex","shadow","borderRadius","submenuDelay","repositionOnRepeat","children","data","setData","useState","hideContextMenu","showContextMenu","content","options","e","x","y","ContextMenuPortal","useContextMenu","useContext","humanize","value","str","jsx","ContextMenu","x","y","content","zIndex","onHide","className","style","classNames","styles","shadow","borderRadius","useContext","ContextMenuSettingsCtx","paperRef","useResizeObserver","width","height","windowWidth","windowHeight","dir","useDirection","submenuProps","Paper","clsx","md","mdSpacing","px","key","hidden","onClick","items","title","otherOptions","ContextMenuItem","humanize","ContextMenuDivider","jsx","jsxs","ContextMenuItem","className","style","icon","iconRight","title","color","disabled","onClick","onHide","items","submenuProps","ref","useRef","submenuDelay","useContext","ContextMenuSettingsCtx","hoverAvailable","useMediaQuery","submenuPosition","setSubmenuPosition","useState","startShowingSubmenu","stopShowingSubmenu","useTimeout","y","x","startHidingSubmenu","stopHidingSubmenu","showSubmenu","hideSubmenu","hasSubmenu","showSubmenuOnHover","handleClick","e","UnstyledButton","theme","colors","parsedColor","parseThemeColor","rgba","clsx","Box","ContextMenu"]}
|
|
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"]}
|
package/dist/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.mantine-contextmenu{border:1px solid var(--mantine-color-gray-3);position:fixed}[data-mantine-color-scheme=dark] .mantine-contextmenu{border:1px solid var(--mantine-color-dark-4)}.mantine-contextmenu{overflow:hidden;transition:
|
|
1
|
+
.mantine-contextmenu{border:1px solid var(--mantine-color-gray-3);position:fixed}[data-mantine-color-scheme=dark] .mantine-contextmenu{border:1px solid var(--mantine-color-dark-4)}.mantine-contextmenu{overflow:hidden;visibility:hidden}.mantine-contextmenu-mounted{transition:top .2s,left .2s;visibility:visible}.mantine-contextmenu-divider{background:var(--mantine-color-gray-1);height:calc(.0625rem*var(--mantine-scale))}[data-mantine-color-scheme=dark] .mantine-contextmenu-divider{background:var(--mantine-color-dark-5)}.mantine-contextmenu-item-button{align-items:center;color:var(--mantine-contextmenu-item-button-color);display:flex;padding:calc(var(--mantine-spacing-sm)/2) var(--mantine-spacing-sm);text-align:start;transition:background .2s;width:100%}.mantine-contextmenu-item-button[disabled]{color:var(--mantine-color-gray-5);cursor:not-allowed}[data-mantine-color-scheme=dark] .mantine-contextmenu-item-button[disabled]{color:var(--mantine-color-dark-3)}.mantine-contextmenu-item-button:hover:not([disabled]){background:var(--mantine-contextmenu-item-button-hover-bg-color-light)}[data-mantine-color-scheme=dark] .mantine-contextmenu-item-button:hover:not([disabled]){background:var(--mantine-contextmenu-item-button-hover-bg-color-dark)}.mantine-contextmenu-item-button:active:not([disabled]){background:var(--mantine-contextmenu-item-button-pressed-bg-color-light)}[data-mantine-color-scheme=dark] .mantine-contextmenu-item-button:active:not([disabled]){background:var(--mantine-contextmenu-item-button-pressed-bg-color-dark)}.mantine-contextmenu-item-button-title{flex-grow:1;font-size:var(--mantine-font-size-sm);text-align:inherit;white-space:nowrap}.mantine-contextmenu-overlay{height:100%;left:0;position:fixed;top:0;width:100%}
|
package/dist/styles.layer.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer mantine-contextmenu{.mantine-contextmenu{border:1px solid var(--mantine-color-gray-3);position:fixed}[data-mantine-color-scheme=dark] .mantine-contextmenu{border:1px solid var(--mantine-color-dark-4)}.mantine-contextmenu{overflow:hidden;transition:
|
|
1
|
+
@layer mantine-contextmenu{.mantine-contextmenu{border:1px solid var(--mantine-color-gray-3);position:fixed}[data-mantine-color-scheme=dark] .mantine-contextmenu{border:1px solid var(--mantine-color-dark-4)}.mantine-contextmenu{overflow:hidden;visibility:hidden}.mantine-contextmenu-mounted{transition:top .2s,left .2s;visibility:visible}.mantine-contextmenu-divider{background:var(--mantine-color-gray-1);height:calc(.0625rem*var(--mantine-scale))}[data-mantine-color-scheme=dark] .mantine-contextmenu-divider{background:var(--mantine-color-dark-5)}.mantine-contextmenu-item-button{align-items:center;color:var(--mantine-contextmenu-item-button-color);display:flex;padding:calc(var(--mantine-spacing-sm)/2) var(--mantine-spacing-sm);text-align:start;transition:background .2s;width:100%}.mantine-contextmenu-item-button[disabled]{color:var(--mantine-color-gray-5);cursor:not-allowed}[data-mantine-color-scheme=dark] .mantine-contextmenu-item-button[disabled]{color:var(--mantine-color-dark-3)}.mantine-contextmenu-item-button:hover:not([disabled]){background:var(--mantine-contextmenu-item-button-hover-bg-color-light)}[data-mantine-color-scheme=dark] .mantine-contextmenu-item-button:hover:not([disabled]){background:var(--mantine-contextmenu-item-button-hover-bg-color-dark)}.mantine-contextmenu-item-button:active:not([disabled]){background:var(--mantine-contextmenu-item-button-pressed-bg-color-light)}[data-mantine-color-scheme=dark] .mantine-contextmenu-item-button:active:not([disabled]){background:var(--mantine-contextmenu-item-button-pressed-bg-color-dark)}.mantine-contextmenu-item-button-title{flex-grow:1;font-size:var(--mantine-font-size-sm);text-align:inherit;white-space:nowrap}.mantine-contextmenu-overlay{height:100%;left:0;position:fixed;top:0;width:100%}}@layer mantine-contextmenu{}@layer mantine-contextmenu{}@layer mantine-contextmenu{}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mantine-contextmenu",
|
|
3
|
-
"version": "8.3.
|
|
3
|
+
"version": "8.3.11",
|
|
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",
|
|
@@ -72,37 +72,37 @@
|
|
|
72
72
|
"format": "prettier --write ."
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
|
-
"@eslint/eslintrc": "^3.3.
|
|
76
|
-
"@mantine/code-highlight": "^8.3.
|
|
77
|
-
"@mantine/core": "^8.3.
|
|
78
|
-
"@mantine/hooks": "^8.3.
|
|
79
|
-
"@mantine/notifications": "^8.3.
|
|
80
|
-
"@next/eslint-plugin-next": "^15.5.
|
|
75
|
+
"@eslint/eslintrc": "^3.3.3",
|
|
76
|
+
"@mantine/code-highlight": "^8.3.9",
|
|
77
|
+
"@mantine/core": "^8.3.9",
|
|
78
|
+
"@mantine/hooks": "^8.3.9",
|
|
79
|
+
"@mantine/notifications": "^8.3.9",
|
|
80
|
+
"@next/eslint-plugin-next": "^15.5.7",
|
|
81
81
|
"@tabler/icons-react": "^3.35.0",
|
|
82
|
-
"@types/lodash": "^4.17.
|
|
82
|
+
"@types/lodash": "^4.17.21",
|
|
83
83
|
"@types/node": "^24.10.1",
|
|
84
|
-
"@types/react": "^19.2.
|
|
84
|
+
"@types/react": "^19.2.7",
|
|
85
85
|
"@types/react-dom": "^19.2.3",
|
|
86
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
87
|
-
"@typescript-eslint/parser": "^8.
|
|
86
|
+
"@typescript-eslint/eslint-plugin": "^8.48.1",
|
|
87
|
+
"@typescript-eslint/parser": "^8.48.1",
|
|
88
88
|
"clsx": "^2.1.1",
|
|
89
89
|
"cssnano": "^7.1.2",
|
|
90
90
|
"eslint": "^9.39.1",
|
|
91
|
-
"eslint-config-next": "^15.5.
|
|
91
|
+
"eslint-config-next": "^15.5.7",
|
|
92
92
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
93
93
|
"lodash": "^4.17.21",
|
|
94
|
-
"next": "^15.5.
|
|
94
|
+
"next": "^15.5.7",
|
|
95
95
|
"postcss": "^8.5.6",
|
|
96
96
|
"postcss-cli": "^11.0.1",
|
|
97
97
|
"postcss-import": "^16.1.1",
|
|
98
98
|
"postcss-preset-mantine": "^1.18.0",
|
|
99
99
|
"postcss-simple-vars": "^7.0.1",
|
|
100
|
-
"prettier": "^3.
|
|
101
|
-
"react": "^19.2.
|
|
102
|
-
"react-dom": "^19.2.
|
|
100
|
+
"prettier": "^3.7.4",
|
|
101
|
+
"react": "^19.2.1",
|
|
102
|
+
"react-dom": "^19.2.1",
|
|
103
103
|
"sharp": "^0.34.5",
|
|
104
|
-
"shiki": "^3.
|
|
105
|
-
"swr": "^2.3.
|
|
104
|
+
"shiki": "^3.19.0",
|
|
105
|
+
"swr": "^2.3.7",
|
|
106
106
|
"tsup": "^8.5.1",
|
|
107
107
|
"typescript": "^5.9.3"
|
|
108
108
|
},
|