mantine-contextmenu 9.4.0 → 9.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +153 -184
- 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 +26 -26
package/dist/index.d.ts
CHANGED
|
@@ -1,236 +1,205 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { JSX } from
|
|
3
|
-
import { MantineStyleProp, MantineColor, StylesRecord, MantineShadow, MantineRadius } from '@mantine/core';
|
|
4
|
-
|
|
1
|
+
import { MantineColor, MantineRadius, MantineShadow, MantineStyleProp, StylesRecord } from "@mantine/core";
|
|
2
|
+
import { Context, JSX } from "react";
|
|
5
3
|
/**
|
|
6
4
|
* Utility type that makes a property required
|
|
7
5
|
*/
|
|
8
|
-
type WithRequiredProperty<Type, Key extends keyof Type> = Type & {
|
|
9
|
-
[Property in Key]-?: Type[Property];
|
|
10
|
-
};
|
|
6
|
+
export type WithRequiredProperty<Type, Key extends keyof Type> = Type & { [Property in Key]-?: Type[Property]; };
|
|
11
7
|
/**
|
|
12
8
|
* Utility type that makes a property optional
|
|
13
9
|
*/
|
|
14
|
-
type WithOptionalProperty<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
10
|
+
export type WithOptionalProperty<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
15
11
|
/**
|
|
16
12
|
* Context menu options
|
|
17
13
|
*/
|
|
18
|
-
type ContextMenuOptions = {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
14
|
+
export type ContextMenuOptions = {
|
|
15
|
+
/**
|
|
16
|
+
* The z-index of context menu.
|
|
17
|
+
* @default 9999
|
|
18
|
+
*/
|
|
19
|
+
zIndex?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Context menu container class name.
|
|
22
|
+
*/
|
|
23
|
+
className?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Context menu container style.
|
|
26
|
+
*/
|
|
27
|
+
style?: MantineStyleProp;
|
|
28
|
+
/**
|
|
29
|
+
* Context menu elements class names.
|
|
30
|
+
*/
|
|
31
|
+
classNames?: Partial<Record<"root" | "item" | "divider", string>>;
|
|
32
|
+
/**
|
|
33
|
+
* Context menu styles.
|
|
34
|
+
* Can be an object with `root`, `item` and `divider` keys and style objects as values,
|
|
35
|
+
* or a function that accepts the current theme and returns a similarly structured object.
|
|
36
|
+
*/
|
|
37
|
+
styles?: StylesRecord<"root" | "item" | "divider", MantineStyleProp>;
|
|
42
38
|
};
|
|
43
39
|
/**
|
|
44
40
|
* Generic context menu settings
|
|
45
41
|
*/
|
|
46
|
-
type ContextMenuSettings = {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
42
|
+
export type ContextMenuSettings = {
|
|
43
|
+
/**
|
|
44
|
+
* Context menu shadow.
|
|
45
|
+
* @default 'sm'
|
|
46
|
+
*/
|
|
47
|
+
shadow?: MantineShadow;
|
|
48
|
+
/**
|
|
49
|
+
* Context menu border radius.
|
|
50
|
+
* @default 'xs'
|
|
51
|
+
*/
|
|
52
|
+
borderRadius?: MantineRadius;
|
|
53
|
+
/**
|
|
54
|
+
* Delay in ms to use when showing and hiding submenus.
|
|
55
|
+
* @default 500
|
|
56
|
+
*/
|
|
57
|
+
submenuDelay?: number;
|
|
58
|
+
/**
|
|
59
|
+
* Whether to reposition the context menu when the triggering event repeats. If set to true, the context menu will
|
|
60
|
+
* reposition itself to the position of the triggering event. If set to false, the context menu will hide
|
|
61
|
+
* automatically when the triggering event repeats.
|
|
62
|
+
* @default false
|
|
63
|
+
*/
|
|
64
|
+
repositionOnRepeat?: boolean;
|
|
69
65
|
};
|
|
70
66
|
/**
|
|
71
67
|
* Context menu provider props
|
|
72
68
|
*/
|
|
73
|
-
type ContextMenuProviderProps = ContextMenuSettings & ContextMenuOptions & {
|
|
74
|
-
|
|
69
|
+
export type ContextMenuProviderProps = ContextMenuSettings & ContextMenuOptions & {
|
|
70
|
+
children: React.ReactNode;
|
|
75
71
|
};
|
|
76
72
|
/**
|
|
77
73
|
* Context menu item options
|
|
78
74
|
*/
|
|
79
|
-
type ContextMenuItemOptions = {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
75
|
+
export type ContextMenuItemOptions = {
|
|
76
|
+
/**
|
|
77
|
+
* Unique key of the context menu item or divider.
|
|
78
|
+
*/
|
|
79
|
+
key: string;
|
|
80
|
+
/**
|
|
81
|
+
* Context menu item or divider className.
|
|
82
|
+
*/
|
|
83
|
+
className?: string;
|
|
84
|
+
/**
|
|
85
|
+
* Context menu item or divider style.
|
|
86
|
+
*/
|
|
87
|
+
style?: MantineStyleProp;
|
|
88
|
+
/**
|
|
89
|
+
* Boolean indicating whether the context menu item is hidden.
|
|
90
|
+
*/
|
|
91
|
+
hidden?: boolean;
|
|
96
92
|
} & (({
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
93
|
+
/**
|
|
94
|
+
* Optional context menu item icon.
|
|
95
|
+
*/
|
|
96
|
+
icon?: React.ReactNode;
|
|
97
|
+
/**
|
|
98
|
+
* Optional context menu item icon for the right side of the title.
|
|
99
|
+
* If provided this will overwrite the submenu's ▶ icon
|
|
100
|
+
*/
|
|
101
|
+
iconRight?: React.ReactNode;
|
|
102
|
+
/**
|
|
103
|
+
* Optional context menu item title.
|
|
104
|
+
* If not provided, one will be generated automatically by "humanizing" the key.
|
|
105
|
+
* @default humanize(key)
|
|
106
|
+
*/
|
|
107
|
+
title?: React.ReactNode;
|
|
108
|
+
/**
|
|
109
|
+
* Optional context menu item color.
|
|
110
|
+
*/
|
|
111
|
+
color?: MantineColor;
|
|
112
|
+
/**
|
|
113
|
+
* Boolean indicating whether the context menu item is disabled.
|
|
114
|
+
*/
|
|
115
|
+
disabled?: boolean;
|
|
120
116
|
} & ({
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
117
|
+
/**
|
|
118
|
+
* Optional context menu item `onClick` handler.
|
|
119
|
+
* If not provided, a divider will be rendered instead.
|
|
120
|
+
*/
|
|
121
|
+
onClick: React.MouseEventHandler<HTMLButtonElement>;
|
|
122
|
+
items?: never;
|
|
127
123
|
} | {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
124
|
+
onClick?: never;
|
|
125
|
+
/**
|
|
126
|
+
* Optional items.
|
|
127
|
+
* If provided, a submenu will be rendered.
|
|
128
|
+
*/
|
|
129
|
+
items: ContextMenuItemOptions[];
|
|
134
130
|
})) | {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
131
|
+
icon?: never;
|
|
132
|
+
iconRight?: never;
|
|
133
|
+
title?: never;
|
|
134
|
+
color?: never;
|
|
135
|
+
disabled?: never;
|
|
136
|
+
onClick?: never;
|
|
137
|
+
items?: never;
|
|
142
138
|
});
|
|
143
139
|
/**
|
|
144
140
|
* Context menu content.
|
|
145
141
|
* Either an array of context menu items, or a function that accepts a close callback and returns context menu content.
|
|
146
142
|
*/
|
|
147
|
-
type ContextMenuContent = ContextMenuItemOptions[] | ((close: () => void) => JSX.Element);
|
|
143
|
+
export type ContextMenuContent = ContextMenuItemOptions[] | ((close: () => void) => JSX.Element);
|
|
148
144
|
/**
|
|
149
145
|
* Show context menu function
|
|
150
146
|
*/
|
|
151
|
-
type ShowContextMenuFunction = (
|
|
152
|
-
/**
|
|
153
|
-
* Context menu content.
|
|
154
|
-
* Either an array of context menu items or a function that accepts a close callback and returns context menu content.
|
|
155
|
-
*/
|
|
156
|
-
content: ContextMenuContent,
|
|
157
|
-
/**
|
|
158
|
-
* Context menu options (overrides provider props).
|
|
159
|
-
*/
|
|
160
|
-
options?: ContextMenuOptions) => React.MouseEventHandler & React.TouchEventHandler;
|
|
147
|
+
export type ShowContextMenuFunction = (content: ContextMenuContent, options?: ContextMenuOptions) => React.MouseEventHandler & React.TouchEventHandler;
|
|
161
148
|
/**
|
|
162
149
|
* Hide context menu function
|
|
163
150
|
*/
|
|
164
|
-
type HideContextMenuFunction = () => void;
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
declare function
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
};
|
|
174
|
-
}): react.JSX.Element;
|
|
175
|
-
|
|
151
|
+
export type HideContextMenuFunction = () => void;
|
|
152
|
+
export type ContextMenuDividerProps = Pick<ContextMenuItemOptions, "className" | "style">;
|
|
153
|
+
export declare function ContextMenuDivider({ className, style }: ContextMenuDividerProps): JSX.Element;
|
|
154
|
+
export declare function ContextMenuItem({ className, style, icon, iconRight, title, color, disabled, onClick, onHide, items, submenuProps }: WithRequiredProperty<Omit<ContextMenuItemOptions, "key">, "title"> & {
|
|
155
|
+
onHide: () => void;
|
|
156
|
+
submenuProps: Pick<ContextMenuOptions, "className" | "classNames" | "style" | "styles"> & {
|
|
157
|
+
dir?: "ltr" | "rtl";
|
|
158
|
+
};
|
|
159
|
+
}): JSX.Element;
|
|
176
160
|
type ContextMenuInstanceOptions = {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
161
|
+
x: number;
|
|
162
|
+
y: number;
|
|
163
|
+
content: ContextMenuContent;
|
|
180
164
|
};
|
|
181
165
|
type ContextMenuProps = ContextMenuOptions & ContextMenuInstanceOptions & {
|
|
182
|
-
|
|
183
|
-
|
|
166
|
+
onHide: () => void;
|
|
167
|
+
dir?: "ltr" | "rtl";
|
|
184
168
|
};
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
dir: 'ltr' | 'rtl';
|
|
169
|
+
export type ContextMenuPortalProps = ContextMenuProps & {
|
|
170
|
+
zIndex?: number;
|
|
171
|
+
dir: "ltr" | "rtl";
|
|
189
172
|
};
|
|
190
|
-
declare function ContextMenuPortal({ onHide, zIndex, dir, ...otherProps }: ContextMenuPortalProps):
|
|
191
|
-
|
|
192
|
-
declare const ContextMenuSettingsCtx:
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
173
|
+
export declare function ContextMenuPortal({ onHide, zIndex, dir, ...otherProps }: ContextMenuPortalProps): JSX.Element;
|
|
174
|
+
type ResolvedContextMenuSettings = WithRequiredProperty<ContextMenuSettings, "shadow" | "borderRadius" | "submenuDelay">;
|
|
175
|
+
export declare const ContextMenuSettingsCtx: Context<ResolvedContextMenuSettings>;
|
|
176
|
+
type ContextMenuContextValue = {
|
|
177
|
+
/**
|
|
178
|
+
* Function that shows the context menu.
|
|
179
|
+
*/
|
|
180
|
+
showContextMenu: ShowContextMenuFunction;
|
|
181
|
+
/**
|
|
182
|
+
* Function that hides the context menu.
|
|
183
|
+
*/
|
|
184
|
+
hideContextMenu: HideContextMenuFunction;
|
|
185
|
+
/**
|
|
186
|
+
* Boolean indicating whether the context menu is currently visible.
|
|
187
|
+
*/
|
|
188
|
+
isContextMenuVisible: boolean;
|
|
189
|
+
};
|
|
190
|
+
export declare const ContextMenuCtx: Context<ContextMenuContextValue>;
|
|
207
191
|
/**
|
|
208
192
|
* Provider that allows to show a context menu anywhere in your application.
|
|
209
193
|
* If you wrap your application with this provider, you can use the `useContextMenu` hook
|
|
210
194
|
* anywhere in the component tree to access a function that shows the context menu.
|
|
211
195
|
*/
|
|
212
|
-
declare function ContextMenuProvider({ zIndex, shadow, borderRadius, submenuDelay, repositionOnRepeat, children
|
|
196
|
+
export declare function ContextMenuProvider({ zIndex, shadow, borderRadius, submenuDelay, repositionOnRepeat, children }: ContextMenuProviderProps): JSX.Element;
|
|
213
197
|
/**
|
|
214
198
|
* Hook returning functions that show and hide the context menu.
|
|
215
199
|
*/
|
|
216
|
-
declare function useContextMenu():
|
|
217
|
-
/**
|
|
218
|
-
* Function that shows the context menu.
|
|
219
|
-
*/
|
|
220
|
-
showContextMenu: ShowContextMenuFunction;
|
|
221
|
-
/**
|
|
222
|
-
* Function that hides the context menu.
|
|
223
|
-
*/
|
|
224
|
-
hideContextMenu: HideContextMenuFunction;
|
|
225
|
-
/**
|
|
226
|
-
* Boolean indicating whether the context menu is currently visible.
|
|
227
|
-
*/
|
|
228
|
-
isContextMenuVisible: boolean;
|
|
229
|
-
};
|
|
230
|
-
|
|
200
|
+
export declare function useContextMenu(): ContextMenuContextValue;
|
|
231
201
|
/**
|
|
232
202
|
* Utility function that returns a humanized version of a string, e.g. "camelCase" -> "Camel Case"
|
|
233
203
|
*/
|
|
234
|
-
declare function humanize(value: string): string;
|
|
235
|
-
|
|
236
|
-
export { type ContextMenuContent, ContextMenuCtx, ContextMenuDivider, type ContextMenuDividerProps, ContextMenuItem, type ContextMenuItemOptions, type ContextMenuOptions, ContextMenuPortal, type ContextMenuPortalProps, ContextMenuProvider, type ContextMenuProviderProps, type ContextMenuSettings, ContextMenuSettingsCtx, type HideContextMenuFunction, type ShowContextMenuFunction, type WithOptionalProperty, type WithRequiredProperty, humanize, useContextMenu };
|
|
204
|
+
export declare function humanize(value: string): string;
|
|
205
|
+
export {};
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use
|
|
1
|
+
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));let c=require("@mantine/core"),l=require("clsx");l=s(l);let u=require("react/jsx-runtime"),d=require("@mantine/hooks"),f=require("react");function p({className:e,style:t}){return/* @__PURE__ */ (0,u.jsx)(c.Box,{className:(0,l.default)(`mantine-contextmenu-divider`,e),style:t})}function m({zIndex:e,children:t,onHide:n}){let{repositionOnRepeat:r}=(0,f.useContext)(_);return/* @__PURE__ */ (0,u.jsx)(`div`,{className:`mantine-contextmenu-overlay`,style:{zIndex:e},onClick:e=>{e.preventDefault(),n()},onContextMenu:async e=>{if(e.preventDefault(),r){let{clientX:t,clientY:n}=e;try{document.elementsFromPoint(t,n)[1].dispatchEvent(new MouseEvent(`contextmenu`,{bubbles:!0,clientX:t,clientY:n}))}catch{}}else n()},children:t})}function h({onHide:e,zIndex:t,dir:n,...r}){return(0,d.useWindowEvent)(`resize`,e),(0,d.useWindowEvent)(`scroll`,e),(0,d.useHotkeys)([[`Escape`,e]]),/* @__PURE__ */ (0,u.jsx)(c.Portal,{children:/* @__PURE__ */ (0,u.jsx)(m,{zIndex:t,onHide:e,children:/* @__PURE__ */ (0,u.jsx)(S,{...r,onHide:e,dir:n})})})}const g={shadow:`sm`,borderRadius:`xs`,submenuDelay:500,repositionOnRepeat:!1},_=(0,f.createContext)(g),v=(0,f.createContext)({showContextMenu:()=>()=>void 0,hideContextMenu:()=>void 0,isContextMenuVisible:!1});function y({zIndex:e=9999,shadow:t=g.shadow,borderRadius:n=g.borderRadius,submenuDelay:r=g.submenuDelay,repositionOnRepeat:i=g.repositionOnRepeat,children:a}){let[o,s]=(0,f.useState)(null),{dir:l}=(0,c.useDirection)(),d=()=>{s(null)};return/* @__PURE__ */ (0,u.jsx)(_.Provider,{value:{shadow:t,borderRadius:n,submenuDelay:r,repositionOnRepeat:i},children:/* @__PURE__ */ (0,u.jsxs)(v.Provider,{value:{showContextMenu:(t,n)=>r=>{r.preventDefault(),r.stopPropagation();let{x:i,y:a}=`touches`in r?{x:r.touches.item(0).clientX,y:r.touches.item(0).clientY}:{x:r.clientX,y:r.clientY};s({x:i,y:a,content:t,zIndex:n?.zIndex||e,className:n?.className,style:n?.style,classNames:n?.classNames,styles:n?.styles})},hideContextMenu:d,isContextMenuVisible:!!o},children:[a,o&&/* @__PURE__ */ (0,u.jsx)(h,{onHide:d,dir:l,...o})]})})}function b(){return(0,f.useContext)(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)}`}function S({x:e,y:t,content:n,zIndex:r,onHide:i,className:a,style:o,classNames:s,styles:m,dir:h=`ltr`}){let{shadow:g,borderRadius:v}=(0,f.useContext)(_),[y,{width:b,height:S}]=(0,d.useResizeObserver)(),[w,T]=(0,f.useState)(!1),E=0,D=0;typeof window<`u`&&({innerWidth:E,innerHeight:D}=window);let O={className:a,classNames:s,style:o,styles:m,dir:h},k=b>0&&S>0;return(0,f.useEffect)(()=>{k&&requestAnimationFrame(()=>T(!0))},[k]),/* @__PURE__ */ (0,u.jsx)(c.Paper,{ref:y,shadow:g,radius:v,className:(0,l.default)(`mantine-contextmenu`,w&&`mantine-contextmenu-mounted`,a,s?.root),style:[({spacing:{md:n}})=>{let i=(0,c.px)(n);return{zIndex:r,top:t+S+i>D?D-S-i:t,left:h===`ltr`?e+b+i>E?E-b-i:e:Math.max(e-b,i)}},o,m?.root],children:Array.isArray(n)?n.map(({key:e,hidden:t,className:n,style:r,onClick:a,items:o,title:c,...d})=>t?null:a||o?/* @__PURE__ */ (0,u.jsx)(C,{className:(0,l.default)(s?.item,n),style:[m?.item,r],title:c??x(e),onClick:a,onHide:i,items:o,submenuProps:O,...d},e):/* @__PURE__ */ (0,u.jsx)(p,{className:(0,l.default)(s?.divider,n),style:[m?.divider,r]},e)):n(i)})}function C({className:e,style:t,icon:n,iconRight:r,title:i,color:a,disabled:o,onClick:s,onHide:p,items:m,submenuProps:h}){let g=(0,f.useRef)(null),{submenuDelay:v}=(0,f.useContext)(_),y=h.dir||`ltr`,b=(0,d.useMediaQuery)(`(hover: hover)`),[x,C]=(0,f.useState)(null),{start:w,clear:T}=(0,d.useTimeout)(()=>{let e=g.current.getBoundingClientRect(),t=y===`ltr`?e.right:e.left;C({x:t,y:e.top})},v),{start:E,clear:D}=(0,d.useTimeout)(()=>{C(null)},v),O=()=>{D(),w()},k=()=>{T(),E()},A=m&&!o,j=A&&b,M=A?e=>{e.stopPropagation(),O()}:s?e=>{p(),s?.(e)}:void 0;return/* @__PURE__ */ (0,u.jsxs)(`div`,{onMouseEnter:j?O:void 0,onMouseLeave:j?k:void 0,children:[/* @__PURE__ */ (0,u.jsxs)(c.UnstyledButton,{ref:g,dir:y,style:[e=>{let{colors:t}=e,n=a?(0,c.parseThemeColor)({color:a,theme:e}).value:void 0;return{"--mantine-contextmenu-item-button-color":n||`var(--mantine-color-text)`,"--mantine-contextmenu-item-button-hover-bg-color-light":n?(0,c.rgba)(n,.08):(0,c.rgba)(t.gray[4],.25),"--mantine-contextmenu-item-button-hover-bg-color-dark":n?(0,c.rgba)(n,.15):(0,c.rgba)(t.dark[3],.25),"--mantine-contextmenu-item-button-pressed-bg-color-light":n?(0,c.rgba)(n,.2):(0,c.rgba)(t.gray[4],.5),"--mantine-contextmenu-item-button-pressed-bg-color-dark":n?(0,c.rgba)(n,.3):(0,c.rgba)(t.dark[3],.5)}},t],className:(0,l.default)(`mantine-contextmenu-item-button`,e),disabled:o,onClick:M,children:[n&&/* @__PURE__ */ (0,u.jsx)(c.Box,{fz:0,me:`xs`,mt:-2,children:n}),/* @__PURE__ */ (0,u.jsx)(`div`,{className:`mantine-contextmenu-item-button-title`,children:i}),r?/* @__PURE__ */ (0,u.jsx)(c.Box,{fz:0,ms:`xs`,mt:-2,children:r}):m&&/* @__PURE__ */ (0,u.jsx)(c.Box,{mt:-1,ms:`xs`,children:`›`})]}),x&&/* @__PURE__ */ (0,u.jsx)(S,{content:m,onHide:p,...h,...x})]})}exports.ContextMenuCtx=v,exports.ContextMenuDivider=p,exports.ContextMenuItem=C,exports.ContextMenuPortal=h,exports.ContextMenuProvider=y,exports.ContextMenuSettingsCtx=_,exports.humanize=x,exports.useContextMenu=b;
|
|
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, parseThemeColor, rgba, UnstyledButton } from '@mantine/core';\nimport { useMediaQuery, useTimeout } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { type MouseEventHandler, useContext, useRef, useState } from 'react';\nimport { ContextMenu } from './ContextMenu';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuItemOptions, ContextMenuOptions, WithRequiredProperty } from './types';\n\nexport function ContextMenuItem({\n className,\n style,\n icon,\n iconRight,\n title,\n color,\n disabled,\n onClick,\n onHide,\n items,\n submenuProps,\n}: WithRequiredProperty<Omit<ContextMenuItemOptions, 'key'>, 'title'> & {\n onHide: () => void;\n submenuProps: Pick<ContextMenuOptions, 'className' | 'classNames' | 'style' | 'styles'> & { dir?: 'ltr' | 'rtl' };\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n const dir = submenuProps.dir || 'ltr';\n\n const hoverAvailable = useMediaQuery('(hover: hover)');\n\n const [submenuPosition, setSubmenuPosition] = useState<{ x: number; y: number } | null>(null);\n\n const { start: startShowingSubmenu, clear: stopShowingSubmenu } = useTimeout(() => {\n const rect = (ref.current as HTMLButtonElement).getBoundingClientRect();\n const x = dir === 'ltr' ? rect.right : rect.left;\n setSubmenuPosition({ x, y: rect.top });\n }, submenuDelay);\n\n const { start: startHidingSubmenu, clear: stopHidingSubmenu } = useTimeout(() => {\n setSubmenuPosition(null);\n }, submenuDelay);\n\n const showSubmenu = () => {\n stopHidingSubmenu();\n startShowingSubmenu();\n };\n\n const hideSubmenu = () => {\n stopShowingSubmenu();\n startHidingSubmenu();\n };\n\n const hasSubmenu = items && !disabled;\n const showSubmenuOnHover = hasSubmenu && hoverAvailable;\n\n const handleClick: MouseEventHandler<HTMLButtonElement> | undefined = hasSubmenu\n ? (e) => {\n e.stopPropagation();\n showSubmenu();\n }\n : onClick\n ? (e) => {\n onHide();\n onClick?.(e);\n }\n : undefined;\n\n return (\n <div\n onMouseEnter={showSubmenuOnHover ? showSubmenu : undefined}\n onMouseLeave={showSubmenuOnHover ? hideSubmenu : undefined}\n >\n <UnstyledButton\n ref={ref}\n dir={dir}\n style={[\n (theme) => {\n const { colors } = theme;\n const parsedColor = color ? parseThemeColor({ color, theme }).value : undefined;\n return {\n '--mantine-contextmenu-item-button-color': parsedColor ? parsedColor : 'var(--mantine-color-text)',\n '--mantine-contextmenu-item-button-hover-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.08)\n : rgba(colors.gray[4], 0.25),\n '--mantine-contextmenu-item-button-hover-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.15)\n : rgba(colors.dark[3], 0.25),\n '--mantine-contextmenu-item-button-pressed-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.2)\n : rgba(colors.gray[4], 0.5),\n '--mantine-contextmenu-item-button-pressed-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.3)\n : rgba(colors.dark[3], 0.5),\n };\n },\n style,\n ]}\n className={clsx('mantine-contextmenu-item-button', className)}\n disabled={disabled}\n onClick={handleClick}\n >\n {icon && (\n <Box fz={0} me=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ms=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ms=\"xs\">\n ›\n </Box>\n )\n )}\n </UnstyledButton>\n {submenuPosition && (\n <ContextMenu content={items as ContextMenuContent} onHide={onHide} {...submenuProps} {...submenuPosition} />\n )}\n </div>\n );\n}\n","import { Paper, px } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { useContext, useEffect, useState } from 'react';\nimport { ContextMenuDivider } from './ContextMenuDivider';\nimport { ContextMenuItem } from './ContextMenuItem';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuOptions } from './types';\nimport { humanize } from './utils';\n\nexport type ContextMenuInstanceOptions = {\n x: number;\n y: number;\n content: ContextMenuContent;\n};\n\nexport type ContextMenuProps = ContextMenuOptions &\n ContextMenuInstanceOptions & {\n onHide: () => void;\n dir?: 'ltr' | 'rtl';\n };\n\nexport function ContextMenu({\n x,\n y,\n content,\n zIndex,\n onHide,\n className,\n style,\n classNames,\n styles,\n dir = 'ltr',\n}: ContextMenuProps) {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef, { width, height }] = useResizeObserver<HTMLDivElement>();\n const [isMounted, setIsMounted] = useState(false);\n\n let windowWidth = 0;\n let windowHeight = 0;\n if (typeof window !== 'undefined') ({ innerWidth: windowWidth, innerHeight: windowHeight } = window);\n\n const submenuProps = { className, classNames, style, styles, dir };\n\n // Wait for dimensions to be measured before showing to prevent visible repositioning\n const hasSize = width > 0 && height > 0;\n\n useEffect(() => {\n if (hasSize) {\n requestAnimationFrame(() => setIsMounted(true));\n }\n }, [hasSize]);\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', isMounted && 'mantine-contextmenu-mounted', className, classNames?.root)}\n style={[\n ({ spacing: { md } }) => {\n const mdSpacing = px(md) as number;\n return {\n zIndex,\n top: y + height + mdSpacing > windowHeight ? windowHeight - height - mdSpacing : y,\n left:\n dir === 'ltr'\n ? x + width + mdSpacing > windowWidth\n ? windowWidth - width - mdSpacing\n : x\n : x - width < mdSpacing\n ? mdSpacing\n : x - width,\n };\n },\n style,\n styles?.root,\n ]}\n >\n {Array.isArray(content)\n ? content.map(({ key, hidden, className, style, onClick, items, title, ...otherOptions }) =>\n hidden ? null : onClick || items ? (\n <ContextMenuItem\n key={key}\n className={clsx(classNames?.item, className)}\n style={[styles?.item, style]}\n title={title ?? humanize(key)}\n onClick={onClick}\n onHide={onHide}\n items={items}\n submenuProps={submenuProps}\n {...otherOptions}\n />\n ) : (\n <ContextMenuDivider\n key={key}\n className={clsx(classNames?.divider, className)}\n style={[styles?.divider, style]}\n />\n )\n )\n : content(onHide)}\n </Paper>\n );\n}\n","import { useDirection } from '@mantine/core';\nimport { createContext, useContext, useState } from 'react';\nimport type { ContextMenuInstanceOptions } from './ContextMenu';\nimport { ContextMenuPortal } from './ContextMenuPortal';\nimport type {\n ContextMenuOptions,\n ContextMenuProviderProps,\n ContextMenuSettings,\n HideContextMenuFunction,\n ShowContextMenuFunction,\n WithRequiredProperty,\n} from './types';\n\nconst DEFAULT_SETTINGS: WithRequiredProperty<ContextMenuSettings, 'shadow' | 'borderRadius' | 'submenuDelay'> = {\n shadow: 'sm',\n borderRadius: 'xs',\n submenuDelay: 500,\n repositionOnRepeat: false,\n};\n\nexport const ContextMenuSettingsCtx = createContext(DEFAULT_SETTINGS);\nexport const ContextMenuCtx = createContext<{\n /**\n * Function that shows the context menu.\n */\n showContextMenu: ShowContextMenuFunction;\n\n /**\n * Function that hides the context menu.\n */\n hideContextMenu: HideContextMenuFunction;\n\n /**\n * Boolean indicating whether the context menu is currently visible.\n */\n isContextMenuVisible: boolean;\n}>({ showContextMenu: () => () => undefined, hideContextMenu: () => undefined, isContextMenuVisible: false });\n\n/**\n * Provider that allows to show a context menu anywhere in your application.\n * If you wrap your application with this provider, you can use the `useContextMenu` hook\n * anywhere in the component tree to access a function that shows the context menu.\n */\nexport function ContextMenuProvider({\n zIndex = 9999,\n shadow = DEFAULT_SETTINGS.shadow,\n borderRadius = DEFAULT_SETTINGS.borderRadius,\n submenuDelay = DEFAULT_SETTINGS.submenuDelay,\n repositionOnRepeat = DEFAULT_SETTINGS.repositionOnRepeat,\n children,\n}: ContextMenuProviderProps) {\n const [data, setData] = useState<(ContextMenuInstanceOptions & ContextMenuOptions) | null>(null);\n const { dir } = useDirection();\n\n const hideContextMenu = () => {\n setData(null);\n };\n\n const showContextMenu: ShowContextMenuFunction = (content, options) => (e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const { x, y } =\n 'touches' in e ? { x: e.touches.item(0).clientX, y: e.touches.item(0).clientY } : { x: e.clientX, y: e.clientY };\n\n setData({\n x,\n y,\n content,\n zIndex: options?.zIndex || zIndex,\n className: options?.className,\n style: options?.style,\n classNames: options?.classNames,\n styles: options?.styles,\n });\n };\n\n return (\n <ContextMenuSettingsCtx.Provider value={{ shadow, borderRadius, submenuDelay, repositionOnRepeat }}>\n <ContextMenuCtx.Provider value={{ showContextMenu, hideContextMenu, isContextMenuVisible: !!data }}>\n {children}\n {data && <ContextMenuPortal onHide={hideContextMenu} dir={dir} {...data} />}\n </ContextMenuCtx.Provider>\n </ContextMenuSettingsCtx.Provider>\n );\n}\n\n/**\n * Hook returning functions that show and hide the context menu.\n */\nexport function useContextMenu() {\n return useContext(ContextMenuCtx);\n}\n","import { Portal } from '@mantine/core';\nimport { useHotkeys, useWindowEvent } from '@mantine/hooks';\nimport { ContextMenu, type ContextMenuProps } from './ContextMenu';\nimport { ContextMenuOverlay } from './ContextMenuOverlay';\n\nexport type ContextMenuPortalProps = ContextMenuProps & {\n zIndex?: number;\n dir: 'ltr' | 'rtl';\n};\n\nexport function ContextMenuPortal({ onHide, zIndex, dir, ...otherProps }: ContextMenuPortalProps) {\n useWindowEvent('resize', onHide);\n useWindowEvent('scroll', onHide);\n useHotkeys([['Escape', onHide]]);\n\n return (\n <Portal>\n <ContextMenuOverlay zIndex={zIndex} onHide={onHide}>\n <ContextMenu {...otherProps} onHide={onHide} dir={dir} />\n </ContextMenuOverlay>\n </Portal>\n );\n}\n","import { useContext } from 'react';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\n\nexport type ContextMenuOverlayProps = React.PropsWithChildren<{\n zIndex: number | undefined;\n onHide: () => void;\n}>;\n\nexport function ContextMenuOverlay({ zIndex, children, onHide }: ContextMenuOverlayProps) {\n const { repositionOnRepeat } = useContext(ContextMenuSettingsCtx);\n\n const handleHide = (e: React.MouseEvent) => {\n e.preventDefault();\n onHide();\n };\n\n const handleContextMenu = async (e: React.MouseEvent) => {\n e.preventDefault();\n if (repositionOnRepeat) {\n const { clientX, clientY } = e;\n try {\n document\n .elementsFromPoint(clientX, clientY)[1]\n .dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, clientX, clientY }));\n } catch {\n // ignore error\n }\n } else {\n onHide();\n }\n };\n\n return (\n <div\n className=\"mantine-contextmenu-overlay\"\n style={{ zIndex }}\n onClick={handleHide}\n onContextMenu={handleContextMenu}\n >\n {children}\n </div>\n );\n}\n","/**\n * Utility function that returns a humanized version of a string, e.g. \"camelCase\" -> \"Camel Case\"\n */\nexport function humanize(value: string) {\n const str = value\n .replace(/([a-z\\d])([A-Z]+)/g, '$1 $2')\n .replace(/\\W|_/g, ' ')\n .trim()\n .toLowerCase();\n return `${str.charAt(0).toUpperCase()}${str.slice(1)}`;\n}\n"],"mappings":"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","names":["index_exports","__export","ContextMenuCtx","ContextMenuDivider","ContextMenuItem","ContextMenuPortal","ContextMenuProvider","ContextMenuSettingsCtx","humanize","useContextMenu","__toCommonJS","import_core","import_clsx","import_jsx_runtime","ContextMenuDivider","className","style","clsx","import_core","import_hooks","import_clsx","import_react","import_core","import_hooks","import_clsx","import_react","import_core","import_react","import_core","import_hooks","import_react","import_jsx_runtime","ContextMenuOverlay","zIndex","children","onHide","repositionOnRepeat","ContextMenuSettingsCtx","e","clientX","clientY","import_jsx_runtime","ContextMenuPortal","onHide","zIndex","dir","otherProps","ContextMenuOverlay","ContextMenu","import_jsx_runtime","DEFAULT_SETTINGS","ContextMenuSettingsCtx","ContextMenuCtx","ContextMenuProvider","zIndex","shadow","borderRadius","submenuDelay","repositionOnRepeat","children","data","setData","dir","hideContextMenu","showContextMenu","content","options","e","x","y","ContextMenuPortal","useContextMenu","humanize","value","str","import_jsx_runtime","ContextMenu","x","y","content","zIndex","onHide","className","style","classNames","styles","dir","shadow","borderRadius","ContextMenuSettingsCtx","paperRef","width","height","isMounted","setIsMounted","windowWidth","windowHeight","submenuProps","hasSize","clsx","md","mdSpacing","key","hidden","onClick","items","title","otherOptions","ContextMenuItem","humanize","ContextMenuDivider","import_jsx_runtime","ContextMenuItem","className","style","icon","iconRight","title","color","disabled","onClick","onHide","items","submenuProps","ref","submenuDelay","ContextMenuSettingsCtx","dir","hoverAvailable","submenuPosition","setSubmenuPosition","startShowingSubmenu","stopShowingSubmenu","rect","x","startHidingSubmenu","stopHidingSubmenu","showSubmenu","hideSubmenu","hasSubmenu","showSubmenuOnHover","handleClick","e","theme","colors","parsedColor","clsx","ContextMenu"]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Box","useContext","Portal","createContext","useState","useDirection","useContext","useContext","useResizeObserver","useState","Paper","px","useRef","useContext","useMediaQuery","useState","useTimeout","UnstyledButton","parseThemeColor","rgba","Box","__create","__defProp","__getOwnPropDesc","__getOwnPropNames","__getProtoOf","__hasOwnProp","__copyProps","from","keys","i","n","key","to","except","k","desc","__toESM","mod","isNodeMode","target","_mantine_core","clsx","react_jsx_runtime","_mantine_hooks","react","ContextMenuDivider","className","ContextMenuOverlay","ContextMenuSettingsCtx","onHide","repositionOnRepeat","clientX","clientY","ContextMenuPortal","otherProps","ContextMenu","DEFAULT_SETTINGS","ContextMenuCtx","ContextMenuProvider","data","setData","hideContextMenu","e","options","zIndex","children","useContextMenu","humanize","str","value","paperRef","isMounted","setIsMounted","windowWidth","windowHeight","submenuProps","hasSize","width","height","borderRadius","classNames","mdSpacing","md","y","dir","x","style","styles","content","otherOptions","hidden","onClick","items","ContextMenuItem","title","ref","hoverAvailable","submenuPosition","setSubmenuPosition","startShowingSubmenu","stopShowingSubmenu","rect","submenuDelay","startHidingSubmenu","stopHidingSubmenu","showSubmenu","hideSubmenu","hasSubmenu","disabled","showSubmenuOnHover","handleClick","theme","parsedColor","color","colors","icon","iconRight"],"sources":["../package/ContextMenuDivider.tsx","../package/ContextMenuOverlay.tsx","../package/ContextMenuPortal.tsx","../package/ContextMenuProvider.tsx","../package/utils.ts","../package/ContextMenu.tsx","../package/ContextMenuItem.tsx"],"sourcesContent":["import { Box } from '@mantine/core';\nimport clsx from 'clsx';\nimport type { JSX } from 'react';\nimport type { ContextMenuItemOptions } from './types';\n\nexport type ContextMenuDividerProps = Pick<ContextMenuItemOptions, 'className' | 'style'>;\n\nexport function ContextMenuDivider({ className, style }: ContextMenuDividerProps): JSX.Element {\n return <Box className={clsx('mantine-contextmenu-divider', className)} style={style} />;\n}\n","import { type JSX, 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): JSX.Element {\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","import { Portal } from '@mantine/core';\nimport { useHotkeys, useWindowEvent } from '@mantine/hooks';\nimport type { JSX } from 'react';\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): JSX.Element {\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 { useDirection } from '@mantine/core';\nimport { type Context, createContext, type JSX, 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\ntype ResolvedContextMenuSettings = WithRequiredProperty<\n ContextMenuSettings,\n 'shadow' | 'borderRadius' | 'submenuDelay'\n>;\n\nconst DEFAULT_SETTINGS: ResolvedContextMenuSettings = {\n shadow: 'sm',\n borderRadius: 'xs',\n submenuDelay: 500,\n repositionOnRepeat: false,\n};\n\nexport const ContextMenuSettingsCtx: Context<ResolvedContextMenuSettings> = createContext(DEFAULT_SETTINGS);\n\ntype ContextMenuContextValue = {\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};\n\nexport const ContextMenuCtx: Context<ContextMenuContextValue> = createContext<ContextMenuContextValue>({\n showContextMenu: () => () => undefined,\n hideContextMenu: () => undefined,\n isContextMenuVisible: false,\n});\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): JSX.Element {\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(): ContextMenuContextValue {\n return useContext(ContextMenuCtx);\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","import { Paper, px } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { type JSX, 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): JSX.Element {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef, { width, height }] = useResizeObserver<HTMLDivElement>();\n const [isMounted, setIsMounted] = useState(false);\n\n let windowWidth = 0;\n let windowHeight = 0;\n if (typeof window !== 'undefined') ({ innerWidth: windowWidth, innerHeight: windowHeight } = window);\n\n const submenuProps = { className, classNames, style, styles, dir };\n\n // Wait for dimensions to be measured before showing to prevent visible repositioning\n const hasSize = width > 0 && height > 0;\n\n useEffect(() => {\n if (hasSize) {\n requestAnimationFrame(() => setIsMounted(true));\n }\n }, [hasSize]);\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', isMounted && 'mantine-contextmenu-mounted', className, classNames?.root)}\n style={[\n ({ spacing: { md } }) => {\n const mdSpacing = px(md) as number;\n return {\n zIndex,\n top: y + height + mdSpacing > windowHeight ? windowHeight - height - mdSpacing : y,\n left:\n dir === 'ltr'\n ? x + width + mdSpacing > windowWidth\n ? windowWidth - width - mdSpacing\n : x\n : Math.max(x - width, mdSpacing),\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 { Box, parseThemeColor, rgba, UnstyledButton } from '@mantine/core';\nimport { useMediaQuery, useTimeout } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { type JSX, 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}): JSX.Element {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n const dir = submenuProps.dir || 'ltr';\n\n const hoverAvailable = useMediaQuery('(hover: hover)');\n\n const [submenuPosition, setSubmenuPosition] = useState<{ x: number; y: number } | null>(null);\n\n const { start: startShowingSubmenu, clear: stopShowingSubmenu } = useTimeout(() => {\n const rect = (ref.current as HTMLButtonElement).getBoundingClientRect();\n const x = dir === 'ltr' ? rect.right : rect.left;\n setSubmenuPosition({ x, y: rect.top });\n }, submenuDelay);\n\n const { start: startHidingSubmenu, clear: stopHidingSubmenu } = useTimeout(() => {\n setSubmenuPosition(null);\n }, submenuDelay);\n\n const showSubmenu = () => {\n stopHidingSubmenu();\n startShowingSubmenu();\n };\n\n const hideSubmenu = () => {\n stopShowingSubmenu();\n startHidingSubmenu();\n };\n\n const hasSubmenu = items && !disabled;\n const showSubmenuOnHover = hasSubmenu && hoverAvailable;\n\n const handleClick: MouseEventHandler<HTMLButtonElement> | undefined = hasSubmenu\n ? (e) => {\n e.stopPropagation();\n showSubmenu();\n }\n : onClick\n ? (e) => {\n onHide();\n onClick?.(e);\n }\n : undefined;\n\n return (\n <div\n onMouseEnter={showSubmenuOnHover ? showSubmenu : undefined}\n onMouseLeave={showSubmenuOnHover ? hideSubmenu : undefined}\n >\n <UnstyledButton\n ref={ref}\n dir={dir}\n style={[\n (theme) => {\n const { colors } = theme;\n const parsedColor = color ? parseThemeColor({ color, theme }).value : undefined;\n return {\n '--mantine-contextmenu-item-button-color': parsedColor ? parsedColor : 'var(--mantine-color-text)',\n '--mantine-contextmenu-item-button-hover-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.08)\n : rgba(colors.gray[4], 0.25),\n '--mantine-contextmenu-item-button-hover-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.15)\n : rgba(colors.dark[3], 0.25),\n '--mantine-contextmenu-item-button-pressed-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.2)\n : rgba(colors.gray[4], 0.5),\n '--mantine-contextmenu-item-button-pressed-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.3)\n : rgba(colors.dark[3], 0.5),\n };\n },\n style,\n ]}\n className={clsx('mantine-contextmenu-item-button', className)}\n disabled={disabled}\n onClick={handleClick}\n >\n {icon && (\n <Box fz={0} me=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ms=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ms=\"xs\">\n ›\n </Box>\n )\n )}\n </UnstyledButton>\n {submenuPosition && (\n <ContextMenu content={items as ContextMenuContent} onHide={onHide} {...submenuProps} {...submenuPosition} />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{Box as
|
|
1
|
+
"use client";import{Box as e,Paper as t,Portal as n,UnstyledButton as r,parseThemeColor as i,px as a,rgba as o,useDirection as s}from"@mantine/core";import c from"clsx";import{jsx as l,jsxs as u}from"react/jsx-runtime";import{useHotkeys as d,useMediaQuery as f,useResizeObserver as p,useTimeout as m,useWindowEvent as h}from"@mantine/hooks";import{createContext as g,useContext as _,useEffect as v,useRef as y,useState as b}from"react";function x({className:t,style:n}){return/* @__PURE__ */ l(e,{className:c(`mantine-contextmenu-divider`,t),style:n})}function S({zIndex:e,children:t,onHide:n}){let{repositionOnRepeat:r}=_(T);return/* @__PURE__ */ l(`div`,{className:`mantine-contextmenu-overlay`,style:{zIndex:e},onClick:e=>{e.preventDefault(),n()},onContextMenu:async e=>{if(e.preventDefault(),r){let{clientX:t,clientY:n}=e;try{document.elementsFromPoint(t,n)[1].dispatchEvent(new MouseEvent(`contextmenu`,{bubbles:!0,clientX:t,clientY:n}))}catch{}}else n()},children:t})}function C({onHide:e,zIndex:t,dir:r,...i}){return h(`resize`,e),h(`scroll`,e),d([[`Escape`,e]]),/* @__PURE__ */ l(n,{children:/* @__PURE__ */ l(S,{zIndex:t,onHide:e,children:/* @__PURE__ */ l(A,{...i,onHide:e,dir:r})})})}const w={shadow:`sm`,borderRadius:`xs`,submenuDelay:500,repositionOnRepeat:!1},T=g(w),E=g({showContextMenu:()=>()=>void 0,hideContextMenu:()=>void 0,isContextMenuVisible:!1});function D({zIndex:e=9999,shadow:t=w.shadow,borderRadius:n=w.borderRadius,submenuDelay:r=w.submenuDelay,repositionOnRepeat:i=w.repositionOnRepeat,children:a}){let[o,c]=b(null),{dir:d}=s(),f=()=>{c(null)};return/* @__PURE__ */ l(T.Provider,{value:{shadow:t,borderRadius:n,submenuDelay:r,repositionOnRepeat:i},children:/* @__PURE__ */ u(E.Provider,{value:{showContextMenu:(t,n)=>r=>{r.preventDefault(),r.stopPropagation();let{x:i,y:a}=`touches`in r?{x:r.touches.item(0).clientX,y:r.touches.item(0).clientY}:{x:r.clientX,y:r.clientY};c({x:i,y:a,content:t,zIndex:n?.zIndex||e,className:n?.className,style:n?.style,classNames:n?.classNames,styles:n?.styles})},hideContextMenu:f,isContextMenuVisible:!!o},children:[a,o&&/* @__PURE__ */ l(C,{onHide:f,dir:d,...o})]})})}function O(){return _(E)}function k(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)}`}function A({x:e,y:n,content:r,zIndex:i,onHide:o,className:s,style:u,classNames:d,styles:f,dir:m=`ltr`}){let{shadow:h,borderRadius:g}=_(T),[y,{width:S,height:C}]=p(),[w,E]=b(!1),D=0,O=0;typeof window<`u`&&({innerWidth:D,innerHeight:O}=window);let A={className:s,classNames:d,style:u,styles:f,dir:m},M=S>0&&C>0;return v(()=>{M&&requestAnimationFrame(()=>E(!0))},[M]),/* @__PURE__ */ l(t,{ref:y,shadow:h,radius:g,className:c(`mantine-contextmenu`,w&&`mantine-contextmenu-mounted`,s,d?.root),style:[({spacing:{md:t}})=>{let r=a(t);return{zIndex:i,top:n+C+r>O?O-C-r:n,left:m===`ltr`?e+S+r>D?D-S-r:e:Math.max(e-S,r)}},u,f?.root],children:Array.isArray(r)?r.map(({key:e,hidden:t,className:n,style:r,onClick:i,items:a,title:s,...u})=>t?null:i||a?/* @__PURE__ */ l(j,{className:c(d?.item,n),style:[f?.item,r],title:s??k(e),onClick:i,onHide:o,items:a,submenuProps:A,...u},e):/* @__PURE__ */ l(x,{className:c(d?.divider,n),style:[f?.divider,r]},e)):r(o)})}function j({className:t,style:n,icon:a,iconRight:s,title:d,color:p,disabled:h,onClick:g,onHide:v,items:x,submenuProps:S}){let C=y(null),{submenuDelay:w}=_(T),E=S.dir||`ltr`,D=f(`(hover: hover)`),[O,k]=b(null),{start:j,clear:M}=m(()=>{let e=C.current.getBoundingClientRect(),t=E===`ltr`?e.right:e.left;k({x:t,y:e.top})},w),{start:N,clear:P}=m(()=>{k(null)},w),F=()=>{P(),j()},I=()=>{M(),N()},L=x&&!h,R=L&&D,z=L?e=>{e.stopPropagation(),F()}:g?e=>{v(),g?.(e)}:void 0;return/* @__PURE__ */ u(`div`,{onMouseEnter:R?F:void 0,onMouseLeave:R?I:void 0,children:[/* @__PURE__ */ u(r,{ref:C,dir:E,style:[e=>{let{colors:t}=e,n=p?i({color:p,theme:e}).value:void 0;return{"--mantine-contextmenu-item-button-color":n||`var(--mantine-color-text)`,"--mantine-contextmenu-item-button-hover-bg-color-light":n?o(n,.08):o(t.gray[4],.25),"--mantine-contextmenu-item-button-hover-bg-color-dark":n?o(n,.15):o(t.dark[3],.25),"--mantine-contextmenu-item-button-pressed-bg-color-light":n?o(n,.2):o(t.gray[4],.5),"--mantine-contextmenu-item-button-pressed-bg-color-dark":n?o(n,.3):o(t.dark[3],.5)}},n],className:c(`mantine-contextmenu-item-button`,t),disabled:h,onClick:z,children:[a&&/* @__PURE__ */ l(e,{fz:0,me:`xs`,mt:-2,children:a}),/* @__PURE__ */ l(`div`,{className:`mantine-contextmenu-item-button-title`,children:d}),s?/* @__PURE__ */ l(e,{fz:0,ms:`xs`,mt:-2,children:s}):x&&/* @__PURE__ */ l(e,{mt:-1,ms:`xs`,children:`›`})]}),O&&/* @__PURE__ */ l(A,{content:x,onHide:v,...S,...O})]})}export{E as ContextMenuCtx,x as ContextMenuDivider,j as ContextMenuItem,C as ContextMenuPortal,D as ContextMenuProvider,T as ContextMenuSettingsCtx,k as humanize,O 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, parseThemeColor, rgba, UnstyledButton } from '@mantine/core';\nimport { useMediaQuery, useTimeout } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { type MouseEventHandler, useContext, useRef, useState } from 'react';\nimport { ContextMenu } from './ContextMenu';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuItemOptions, ContextMenuOptions, WithRequiredProperty } from './types';\n\nexport function ContextMenuItem({\n className,\n style,\n icon,\n iconRight,\n title,\n color,\n disabled,\n onClick,\n onHide,\n items,\n submenuProps,\n}: WithRequiredProperty<Omit<ContextMenuItemOptions, 'key'>, 'title'> & {\n onHide: () => void;\n submenuProps: Pick<ContextMenuOptions, 'className' | 'classNames' | 'style' | 'styles'> & { dir?: 'ltr' | 'rtl' };\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n const dir = submenuProps.dir || 'ltr';\n\n const hoverAvailable = useMediaQuery('(hover: hover)');\n\n const [submenuPosition, setSubmenuPosition] = useState<{ x: number; y: number } | null>(null);\n\n const { start: startShowingSubmenu, clear: stopShowingSubmenu } = useTimeout(() => {\n const rect = (ref.current as HTMLButtonElement).getBoundingClientRect();\n const x = dir === 'ltr' ? rect.right : rect.left;\n setSubmenuPosition({ x, y: rect.top });\n }, submenuDelay);\n\n const { start: startHidingSubmenu, clear: stopHidingSubmenu } = useTimeout(() => {\n setSubmenuPosition(null);\n }, submenuDelay);\n\n const showSubmenu = () => {\n stopHidingSubmenu();\n startShowingSubmenu();\n };\n\n const hideSubmenu = () => {\n stopShowingSubmenu();\n startHidingSubmenu();\n };\n\n const hasSubmenu = items && !disabled;\n const showSubmenuOnHover = hasSubmenu && hoverAvailable;\n\n const handleClick: MouseEventHandler<HTMLButtonElement> | undefined = hasSubmenu\n ? (e) => {\n e.stopPropagation();\n showSubmenu();\n }\n : onClick\n ? (e) => {\n onHide();\n onClick?.(e);\n }\n : undefined;\n\n return (\n <div\n onMouseEnter={showSubmenuOnHover ? showSubmenu : undefined}\n onMouseLeave={showSubmenuOnHover ? hideSubmenu : undefined}\n >\n <UnstyledButton\n ref={ref}\n dir={dir}\n style={[\n (theme) => {\n const { colors } = theme;\n const parsedColor = color ? parseThemeColor({ color, theme }).value : undefined;\n return {\n '--mantine-contextmenu-item-button-color': parsedColor ? parsedColor : 'var(--mantine-color-text)',\n '--mantine-contextmenu-item-button-hover-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.08)\n : rgba(colors.gray[4], 0.25),\n '--mantine-contextmenu-item-button-hover-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.15)\n : rgba(colors.dark[3], 0.25),\n '--mantine-contextmenu-item-button-pressed-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.2)\n : rgba(colors.gray[4], 0.5),\n '--mantine-contextmenu-item-button-pressed-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.3)\n : rgba(colors.dark[3], 0.5),\n };\n },\n style,\n ]}\n className={clsx('mantine-contextmenu-item-button', className)}\n disabled={disabled}\n onClick={handleClick}\n >\n {icon && (\n <Box fz={0} me=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ms=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ms=\"xs\">\n ›\n </Box>\n )\n )}\n </UnstyledButton>\n {submenuPosition && (\n <ContextMenu content={items as ContextMenuContent} onHide={onHide} {...submenuProps} {...submenuPosition} />\n )}\n </div>\n );\n}\n","import { Paper, px } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { useContext, useEffect, useState } from 'react';\nimport { ContextMenuDivider } from './ContextMenuDivider';\nimport { ContextMenuItem } from './ContextMenuItem';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\nimport type { ContextMenuContent, ContextMenuOptions } from './types';\nimport { humanize } from './utils';\n\nexport type ContextMenuInstanceOptions = {\n x: number;\n y: number;\n content: ContextMenuContent;\n};\n\nexport type ContextMenuProps = ContextMenuOptions &\n ContextMenuInstanceOptions & {\n onHide: () => void;\n dir?: 'ltr' | 'rtl';\n };\n\nexport function ContextMenu({\n x,\n y,\n content,\n zIndex,\n onHide,\n className,\n style,\n classNames,\n styles,\n dir = 'ltr',\n}: ContextMenuProps) {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef, { width, height }] = useResizeObserver<HTMLDivElement>();\n const [isMounted, setIsMounted] = useState(false);\n\n let windowWidth = 0;\n let windowHeight = 0;\n if (typeof window !== 'undefined') ({ innerWidth: windowWidth, innerHeight: windowHeight } = window);\n\n const submenuProps = { className, classNames, style, styles, dir };\n\n // Wait for dimensions to be measured before showing to prevent visible repositioning\n const hasSize = width > 0 && height > 0;\n\n useEffect(() => {\n if (hasSize) {\n requestAnimationFrame(() => setIsMounted(true));\n }\n }, [hasSize]);\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', isMounted && 'mantine-contextmenu-mounted', className, classNames?.root)}\n style={[\n ({ spacing: { md } }) => {\n const mdSpacing = px(md) as number;\n return {\n zIndex,\n top: y + height + mdSpacing > windowHeight ? windowHeight - height - mdSpacing : y,\n left:\n dir === 'ltr'\n ? x + width + mdSpacing > windowWidth\n ? windowWidth - width - mdSpacing\n : x\n : x - width < mdSpacing\n ? mdSpacing\n : x - width,\n };\n },\n style,\n styles?.root,\n ]}\n >\n {Array.isArray(content)\n ? content.map(({ key, hidden, className, style, onClick, items, title, ...otherOptions }) =>\n hidden ? null : onClick || items ? (\n <ContextMenuItem\n key={key}\n className={clsx(classNames?.item, className)}\n style={[styles?.item, style]}\n title={title ?? humanize(key)}\n onClick={onClick}\n onHide={onHide}\n items={items}\n submenuProps={submenuProps}\n {...otherOptions}\n />\n ) : (\n <ContextMenuDivider\n key={key}\n className={clsx(classNames?.divider, className)}\n style={[styles?.divider, style]}\n />\n )\n )\n : content(onHide)}\n </Paper>\n );\n}\n","import { useDirection } from '@mantine/core';\nimport { createContext, useContext, useState } from 'react';\nimport type { ContextMenuInstanceOptions } from './ContextMenu';\nimport { ContextMenuPortal } from './ContextMenuPortal';\nimport type {\n ContextMenuOptions,\n ContextMenuProviderProps,\n ContextMenuSettings,\n HideContextMenuFunction,\n ShowContextMenuFunction,\n WithRequiredProperty,\n} from './types';\n\nconst DEFAULT_SETTINGS: WithRequiredProperty<ContextMenuSettings, 'shadow' | 'borderRadius' | 'submenuDelay'> = {\n shadow: 'sm',\n borderRadius: 'xs',\n submenuDelay: 500,\n repositionOnRepeat: false,\n};\n\nexport const ContextMenuSettingsCtx = createContext(DEFAULT_SETTINGS);\nexport const ContextMenuCtx = createContext<{\n /**\n * Function that shows the context menu.\n */\n showContextMenu: ShowContextMenuFunction;\n\n /**\n * Function that hides the context menu.\n */\n hideContextMenu: HideContextMenuFunction;\n\n /**\n * Boolean indicating whether the context menu is currently visible.\n */\n isContextMenuVisible: boolean;\n}>({ showContextMenu: () => () => undefined, hideContextMenu: () => undefined, isContextMenuVisible: false });\n\n/**\n * Provider that allows to show a context menu anywhere in your application.\n * If you wrap your application with this provider, you can use the `useContextMenu` hook\n * anywhere in the component tree to access a function that shows the context menu.\n */\nexport function ContextMenuProvider({\n zIndex = 9999,\n shadow = DEFAULT_SETTINGS.shadow,\n borderRadius = DEFAULT_SETTINGS.borderRadius,\n submenuDelay = DEFAULT_SETTINGS.submenuDelay,\n repositionOnRepeat = DEFAULT_SETTINGS.repositionOnRepeat,\n children,\n}: ContextMenuProviderProps) {\n const [data, setData] = useState<(ContextMenuInstanceOptions & ContextMenuOptions) | null>(null);\n const { dir } = useDirection();\n\n const hideContextMenu = () => {\n setData(null);\n };\n\n const showContextMenu: ShowContextMenuFunction = (content, options) => (e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const { x, y } =\n 'touches' in e ? { x: e.touches.item(0).clientX, y: e.touches.item(0).clientY } : { x: e.clientX, y: e.clientY };\n\n setData({\n x,\n y,\n content,\n zIndex: options?.zIndex || zIndex,\n className: options?.className,\n style: options?.style,\n classNames: options?.classNames,\n styles: options?.styles,\n });\n };\n\n return (\n <ContextMenuSettingsCtx.Provider value={{ shadow, borderRadius, submenuDelay, repositionOnRepeat }}>\n <ContextMenuCtx.Provider value={{ showContextMenu, hideContextMenu, isContextMenuVisible: !!data }}>\n {children}\n {data && <ContextMenuPortal onHide={hideContextMenu} dir={dir} {...data} />}\n </ContextMenuCtx.Provider>\n </ContextMenuSettingsCtx.Provider>\n );\n}\n\n/**\n * Hook returning functions that show and hide the context menu.\n */\nexport function useContextMenu() {\n return useContext(ContextMenuCtx);\n}\n","import { Portal } from '@mantine/core';\nimport { useHotkeys, useWindowEvent } from '@mantine/hooks';\nimport { ContextMenu, type ContextMenuProps } from './ContextMenu';\nimport { ContextMenuOverlay } from './ContextMenuOverlay';\n\nexport type ContextMenuPortalProps = ContextMenuProps & {\n zIndex?: number;\n dir: 'ltr' | 'rtl';\n};\n\nexport function ContextMenuPortal({ onHide, zIndex, dir, ...otherProps }: ContextMenuPortalProps) {\n useWindowEvent('resize', onHide);\n useWindowEvent('scroll', onHide);\n useHotkeys([['Escape', onHide]]);\n\n return (\n <Portal>\n <ContextMenuOverlay zIndex={zIndex} onHide={onHide}>\n <ContextMenu {...otherProps} onHide={onHide} dir={dir} />\n </ContextMenuOverlay>\n </Portal>\n );\n}\n","import { useContext } from 'react';\nimport { ContextMenuSettingsCtx } from './ContextMenuProvider';\n\nexport type ContextMenuOverlayProps = React.PropsWithChildren<{\n zIndex: number | undefined;\n onHide: () => void;\n}>;\n\nexport function ContextMenuOverlay({ zIndex, children, onHide }: ContextMenuOverlayProps) {\n const { repositionOnRepeat } = useContext(ContextMenuSettingsCtx);\n\n const handleHide = (e: React.MouseEvent) => {\n e.preventDefault();\n onHide();\n };\n\n const handleContextMenu = async (e: React.MouseEvent) => {\n e.preventDefault();\n if (repositionOnRepeat) {\n const { clientX, clientY } = e;\n try {\n document\n .elementsFromPoint(clientX, clientY)[1]\n .dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, clientX, clientY }));\n } catch {\n // ignore error\n }\n } else {\n onHide();\n }\n };\n\n return (\n <div\n className=\"mantine-contextmenu-overlay\"\n style={{ zIndex }}\n onClick={handleHide}\n onContextMenu={handleContextMenu}\n >\n {children}\n </div>\n );\n}\n","/**\n * Utility function that returns a humanized version of a string, e.g. \"camelCase\" -> \"Camel Case\"\n */\nexport function humanize(value: string) {\n const str = value\n .replace(/([a-z\\d])([A-Z]+)/g, '$1 $2')\n .replace(/\\W|_/g, ' ')\n .trim()\n .toLowerCase();\n return `${str.charAt(0).toUpperCase()}${str.slice(1)}`;\n}\n"],"mappings":"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","names":["Box","clsx","jsx","ContextMenuDivider","className","style","Box","parseThemeColor","rgba","UnstyledButton","useMediaQuery","useTimeout","clsx","useContext","useRef","useState","Paper","px","useResizeObserver","clsx","useContext","useEffect","useState","useDirection","createContext","useContext","useState","Portal","useHotkeys","useWindowEvent","useContext","jsx","ContextMenuOverlay","zIndex","children","onHide","repositionOnRepeat","useContext","ContextMenuSettingsCtx","e","clientX","clientY","jsx","ContextMenuPortal","onHide","zIndex","dir","otherProps","useWindowEvent","useHotkeys","Portal","ContextMenuOverlay","ContextMenu","jsx","jsxs","DEFAULT_SETTINGS","ContextMenuSettingsCtx","createContext","ContextMenuCtx","ContextMenuProvider","zIndex","shadow","borderRadius","submenuDelay","repositionOnRepeat","children","data","setData","useState","dir","useDirection","hideContextMenu","showContextMenu","content","options","e","x","y","ContextMenuPortal","useContextMenu","useContext","humanize","value","str","jsx","ContextMenu","x","y","content","zIndex","onHide","className","style","classNames","styles","dir","shadow","borderRadius","useContext","ContextMenuSettingsCtx","paperRef","width","height","useResizeObserver","isMounted","setIsMounted","useState","windowWidth","windowHeight","submenuProps","hasSize","useEffect","Paper","clsx","md","mdSpacing","px","key","hidden","onClick","items","title","otherOptions","ContextMenuItem","humanize","ContextMenuDivider","jsx","jsxs","ContextMenuItem","className","style","icon","iconRight","title","color","disabled","onClick","onHide","items","submenuProps","ref","useRef","submenuDelay","useContext","ContextMenuSettingsCtx","dir","hoverAvailable","useMediaQuery","submenuPosition","setSubmenuPosition","useState","startShowingSubmenu","stopShowingSubmenu","useTimeout","rect","x","startHidingSubmenu","stopHidingSubmenu","showSubmenu","hideSubmenu","hasSubmenu","showSubmenuOnHover","handleClick","e","UnstyledButton","theme","colors","parsedColor","parseThemeColor","rgba","clsx","Box","ContextMenu"]}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["clsx","ContextMenuDivider","Box","className","ContextMenuOverlay","useContext","ContextMenuSettingsCtx","onHide","repositionOnRepeat","clientX","clientY","ContextMenuPortal","otherProps","useWindowEvent","useHotkeys","Portal","ContextMenu","DEFAULT_SETTINGS","createContext","ContextMenuCtx","ContextMenuProvider","data","setData","useState","useDirection","hideContextMenu","e","options","zIndex","children","useContextMenu","humanize","str","value","paperRef","useResizeObserver","isMounted","setIsMounted","windowWidth","windowHeight","submenuProps","hasSize","width","height","useEffect","Paper","borderRadius","classNames","mdSpacing","px","md","y","dir","x","style","styles","content","otherOptions","hidden","onClick","items","ContextMenuItem","title","key","ref","useRef","hoverAvailable","useMediaQuery","submenuPosition","setSubmenuPosition","startShowingSubmenu","stopShowingSubmenu","useTimeout","rect","submenuDelay","startHidingSubmenu","stopHidingSubmenu","showSubmenu","hideSubmenu","hasSubmenu","disabled","showSubmenuOnHover","handleClick","UnstyledButton","theme","parsedColor","color","parseThemeColor","rgba","colors","icon","iconRight"],"sources":["../package/ContextMenuDivider.tsx","../package/ContextMenuOverlay.tsx","../package/ContextMenuPortal.tsx","../package/ContextMenuProvider.tsx","../package/utils.ts","../package/ContextMenu.tsx","../package/ContextMenuItem.tsx"],"sourcesContent":["import { Box } from '@mantine/core';\nimport clsx from 'clsx';\nimport type { JSX } from 'react';\nimport type { ContextMenuItemOptions } from './types';\n\nexport type ContextMenuDividerProps = Pick<ContextMenuItemOptions, 'className' | 'style'>;\n\nexport function ContextMenuDivider({ className, style }: ContextMenuDividerProps): JSX.Element {\n return <Box className={clsx('mantine-contextmenu-divider', className)} style={style} />;\n}\n","import { type JSX, 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): JSX.Element {\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","import { Portal } from '@mantine/core';\nimport { useHotkeys, useWindowEvent } from '@mantine/hooks';\nimport type { JSX } from 'react';\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): JSX.Element {\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 { useDirection } from '@mantine/core';\nimport { type Context, createContext, type JSX, 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\ntype ResolvedContextMenuSettings = WithRequiredProperty<\n ContextMenuSettings,\n 'shadow' | 'borderRadius' | 'submenuDelay'\n>;\n\nconst DEFAULT_SETTINGS: ResolvedContextMenuSettings = {\n shadow: 'sm',\n borderRadius: 'xs',\n submenuDelay: 500,\n repositionOnRepeat: false,\n};\n\nexport const ContextMenuSettingsCtx: Context<ResolvedContextMenuSettings> = createContext(DEFAULT_SETTINGS);\n\ntype ContextMenuContextValue = {\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};\n\nexport const ContextMenuCtx: Context<ContextMenuContextValue> = createContext<ContextMenuContextValue>({\n showContextMenu: () => () => undefined,\n hideContextMenu: () => undefined,\n isContextMenuVisible: false,\n});\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): JSX.Element {\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(): ContextMenuContextValue {\n return useContext(ContextMenuCtx);\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","import { Paper, px } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { type JSX, 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): JSX.Element {\n const { shadow, borderRadius } = useContext(ContextMenuSettingsCtx);\n const [paperRef, { width, height }] = useResizeObserver<HTMLDivElement>();\n const [isMounted, setIsMounted] = useState(false);\n\n let windowWidth = 0;\n let windowHeight = 0;\n if (typeof window !== 'undefined') ({ innerWidth: windowWidth, innerHeight: windowHeight } = window);\n\n const submenuProps = { className, classNames, style, styles, dir };\n\n // Wait for dimensions to be measured before showing to prevent visible repositioning\n const hasSize = width > 0 && height > 0;\n\n useEffect(() => {\n if (hasSize) {\n requestAnimationFrame(() => setIsMounted(true));\n }\n }, [hasSize]);\n\n return (\n <Paper\n ref={paperRef}\n shadow={shadow}\n radius={borderRadius}\n className={clsx('mantine-contextmenu', isMounted && 'mantine-contextmenu-mounted', className, classNames?.root)}\n style={[\n ({ spacing: { md } }) => {\n const mdSpacing = px(md) as number;\n return {\n zIndex,\n top: y + height + mdSpacing > windowHeight ? windowHeight - height - mdSpacing : y,\n left:\n dir === 'ltr'\n ? x + width + mdSpacing > windowWidth\n ? windowWidth - width - mdSpacing\n : x\n : Math.max(x - width, mdSpacing),\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 { Box, parseThemeColor, rgba, UnstyledButton } from '@mantine/core';\nimport { useMediaQuery, useTimeout } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport { type JSX, 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}): JSX.Element {\n const ref = useRef<HTMLButtonElement>(null);\n const { submenuDelay } = useContext(ContextMenuSettingsCtx);\n const dir = submenuProps.dir || 'ltr';\n\n const hoverAvailable = useMediaQuery('(hover: hover)');\n\n const [submenuPosition, setSubmenuPosition] = useState<{ x: number; y: number } | null>(null);\n\n const { start: startShowingSubmenu, clear: stopShowingSubmenu } = useTimeout(() => {\n const rect = (ref.current as HTMLButtonElement).getBoundingClientRect();\n const x = dir === 'ltr' ? rect.right : rect.left;\n setSubmenuPosition({ x, y: rect.top });\n }, submenuDelay);\n\n const { start: startHidingSubmenu, clear: stopHidingSubmenu } = useTimeout(() => {\n setSubmenuPosition(null);\n }, submenuDelay);\n\n const showSubmenu = () => {\n stopHidingSubmenu();\n startShowingSubmenu();\n };\n\n const hideSubmenu = () => {\n stopShowingSubmenu();\n startHidingSubmenu();\n };\n\n const hasSubmenu = items && !disabled;\n const showSubmenuOnHover = hasSubmenu && hoverAvailable;\n\n const handleClick: MouseEventHandler<HTMLButtonElement> | undefined = hasSubmenu\n ? (e) => {\n e.stopPropagation();\n showSubmenu();\n }\n : onClick\n ? (e) => {\n onHide();\n onClick?.(e);\n }\n : undefined;\n\n return (\n <div\n onMouseEnter={showSubmenuOnHover ? showSubmenu : undefined}\n onMouseLeave={showSubmenuOnHover ? hideSubmenu : undefined}\n >\n <UnstyledButton\n ref={ref}\n dir={dir}\n style={[\n (theme) => {\n const { colors } = theme;\n const parsedColor = color ? parseThemeColor({ color, theme }).value : undefined;\n return {\n '--mantine-contextmenu-item-button-color': parsedColor ? parsedColor : 'var(--mantine-color-text)',\n '--mantine-contextmenu-item-button-hover-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.08)\n : rgba(colors.gray[4], 0.25),\n '--mantine-contextmenu-item-button-hover-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.15)\n : rgba(colors.dark[3], 0.25),\n '--mantine-contextmenu-item-button-pressed-bg-color-light': parsedColor\n ? rgba(parsedColor, 0.2)\n : rgba(colors.gray[4], 0.5),\n '--mantine-contextmenu-item-button-pressed-bg-color-dark': parsedColor\n ? rgba(parsedColor, 0.3)\n : rgba(colors.dark[3], 0.5),\n };\n },\n style,\n ]}\n className={clsx('mantine-contextmenu-item-button', className)}\n disabled={disabled}\n onClick={handleClick}\n >\n {icon && (\n <Box fz={0} me=\"xs\" mt={-2}>\n {icon}\n </Box>\n )}\n <div className=\"mantine-contextmenu-item-button-title\">{title}</div>\n {iconRight ? (\n <Box fz={0} ms=\"xs\" mt={-2}>\n {iconRight}\n </Box>\n ) : (\n items && (\n <Box mt={-1} ms=\"xs\">\n ›\n </Box>\n )\n )}\n </UnstyledButton>\n {submenuPosition && (\n <ContextMenu content={items as ContextMenuContent} onHide={onHide} {...submenuProps} {...submenuPosition} />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
package/dist/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.mantine-contextmenu{position:fixed;border:1px solid var(--mantine-color-gray-3)}[data-mantine-color-scheme=dark] .mantine-contextmenu{border:1px solid var(--mantine-color-dark-4)}.mantine-contextmenu
|
|
1
|
+
.mantine-contextmenu{position:fixed;border:1px solid var(--mantine-color-gray-3);overflow:hidden;visibility:hidden}[data-mantine-color-scheme=dark] .mantine-contextmenu{border:1px solid var(--mantine-color-dark-4)}.mantine-contextmenu-mounted{visibility:visible;transition:top .2s,left .2s}.mantine-contextmenu-divider{height:calc(.0625rem * var(--mantine-scale));background:var(--mantine-color-gray-1)}[data-mantine-color-scheme=dark] .mantine-contextmenu-divider{background:var(--mantine-color-dark-5)}.mantine-contextmenu-item-button{width:100%;display:flex;align-items:center;padding-top:calc(var(--mantine-spacing-sm) / 2);padding-bottom:calc(var(--mantine-spacing-sm) / 2);padding-left:var(--mantine-spacing-sm);padding-right:var(--mantine-spacing-sm);color:var(--mantine-contextmenu-item-button-color);transition:background .2s;text-align:start}.mantine-contextmenu-item-button[disabled]{cursor:not-allowed;color:var(--mantine-color-gray-5)}[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{font-size:var(--mantine-font-size-sm);white-space:nowrap;flex-grow:1;text-align:inherit}.mantine-contextmenu-overlay{position:fixed;top:0;left:0;width:100%;height:100%}
|
package/dist/styles.layer.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer mantine-contextmenu{.mantine-contextmenu{position:fixed;border:1px solid var(--mantine-color-gray-3)}[data-mantine-color-scheme=dark] .mantine-contextmenu{border:1px solid var(--mantine-color-dark-4)}.mantine-contextmenu
|
|
1
|
+
@layer mantine-contextmenu{.mantine-contextmenu{position:fixed;border:1px solid var(--mantine-color-gray-3);overflow:hidden;visibility:hidden}[data-mantine-color-scheme=dark] .mantine-contextmenu{border:1px solid var(--mantine-color-dark-4)}.mantine-contextmenu-mounted{visibility:visible;transition:top .2s,left .2s}.mantine-contextmenu-divider{height:calc(.0625rem * var(--mantine-scale));background:var(--mantine-color-gray-1)}[data-mantine-color-scheme=dark] .mantine-contextmenu-divider{background:var(--mantine-color-dark-5)}.mantine-contextmenu-item-button{width:100%;display:flex;align-items:center;padding-top:calc(var(--mantine-spacing-sm) / 2);padding-bottom:calc(var(--mantine-spacing-sm) / 2);padding-left:var(--mantine-spacing-sm);padding-right:var(--mantine-spacing-sm);color:var(--mantine-contextmenu-item-button-color);transition:background .2s;text-align:start}.mantine-contextmenu-item-button[disabled]{cursor:not-allowed;color:var(--mantine-color-gray-5)}[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{font-size:var(--mantine-font-size-sm);white-space:nowrap;flex-grow:1;text-align:inherit}.mantine-contextmenu-overlay{position:fixed;top:0;left:0;width:100%;height:100%}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mantine-contextmenu",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.7.5",
|
|
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",
|
|
@@ -68,40 +68,40 @@
|
|
|
68
68
|
],
|
|
69
69
|
"scripts": {
|
|
70
70
|
"dev": "next dev",
|
|
71
|
-
"build:package": "rm -rf dist
|
|
71
|
+
"build:package": "rm -rf dist && tsdown && postcss package/styles*.css -d dist -m",
|
|
72
72
|
"build:docs": "next build",
|
|
73
73
|
"build": "pnpm build:package && pnpm build:docs",
|
|
74
|
-
"lint": "biome check . && tsc --noEmit --pretty",
|
|
74
|
+
"lint": "biome check . && tsc --noEmit --pretty && tsc -p scripts/tsconfig.build.json --pretty",
|
|
75
75
|
"format": "biome format --write . && prettier --write \"**/*.css\""
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
|
-
"@biomejs/biome": "^2.
|
|
79
|
-
"@mantine/code-highlight": "^9.
|
|
80
|
-
"@mantine/core": "^9.
|
|
81
|
-
"@mantine/hooks": "^9.
|
|
82
|
-
"@mantine/notifications": "^9.
|
|
83
|
-
"@tabler/icons-react": "^3.
|
|
84
|
-
"@types/lodash": "^4.17.
|
|
85
|
-
"@types/node": "^26.
|
|
86
|
-
"@types/react": "^19.
|
|
87
|
-
"@types/react-dom": "^19.
|
|
78
|
+
"@biomejs/biome": "^2.6.6",
|
|
79
|
+
"@mantine/code-highlight": "^9.7.5",
|
|
80
|
+
"@mantine/core": "^9.7.5",
|
|
81
|
+
"@mantine/hooks": "^9.7.5",
|
|
82
|
+
"@mantine/notifications": "^9.7.5",
|
|
83
|
+
"@tabler/icons-react": "^3.51.0",
|
|
84
|
+
"@types/lodash": "^4.17.27",
|
|
85
|
+
"@types/node": "^26.6.6",
|
|
86
|
+
"@types/react": "^19.3.0",
|
|
87
|
+
"@types/react-dom": "^19.3.0",
|
|
88
88
|
"clsx": "^2.1.1",
|
|
89
|
-
"cssnano": "^
|
|
89
|
+
"cssnano": "^9.9.0",
|
|
90
90
|
"lodash": "^4.18.1",
|
|
91
|
-
"next": "^16.
|
|
92
|
-
"postcss": "^8.5.
|
|
93
|
-
"postcss-cli": "^
|
|
94
|
-
"postcss-import": "^
|
|
91
|
+
"next": "^16.4.5",
|
|
92
|
+
"postcss": "^8.5.32",
|
|
93
|
+
"postcss-cli": "^12.0.0",
|
|
94
|
+
"postcss-import": "^17.0.1",
|
|
95
95
|
"postcss-preset-mantine": "^1.18.0",
|
|
96
96
|
"postcss-simple-vars": "^7.0.1",
|
|
97
|
-
"prettier": "^3.9.
|
|
98
|
-
"react": "^19.
|
|
99
|
-
"react-dom": "^19.
|
|
100
|
-
"sharp": "^0.35.
|
|
101
|
-
"shiki": "^4.
|
|
102
|
-
"swr": "^2.
|
|
103
|
-
"
|
|
104
|
-
"typescript": "^
|
|
97
|
+
"prettier": "^3.9.10",
|
|
98
|
+
"react": "^19.3.1",
|
|
99
|
+
"react-dom": "^19.3.1",
|
|
100
|
+
"sharp": "^0.35.5",
|
|
101
|
+
"shiki": "^4.6.0",
|
|
102
|
+
"swr": "^2.5.1",
|
|
103
|
+
"tsdown": "^0.23.7",
|
|
104
|
+
"typescript": "^7.0.2"
|
|
105
105
|
},
|
|
106
106
|
"peerDependencies": {
|
|
107
107
|
"@mantine/core": ">=9",
|