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 CHANGED
@@ -1,236 +1,205 @@
1
- import * as react from 'react';
2
- import { JSX } from 'react';
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
- * The z-index of context menu.
21
- * @default 9999
22
- */
23
- zIndex?: number;
24
- /**
25
- * Context menu container class name.
26
- */
27
- className?: string;
28
- /**
29
- * Context menu container style.
30
- */
31
- style?: MantineStyleProp;
32
- /**
33
- * Context menu elements class names.
34
- */
35
- classNames?: Partial<Record<'root' | 'item' | 'divider', string>>;
36
- /**
37
- * Context menu styles.
38
- * Can be an object with `root`, `item` and `divider` keys and style objects as values,
39
- * or a function that accepts the current theme and returns a similarly structured object.
40
- */
41
- styles?: StylesRecord<'root' | 'item' | 'divider', MantineStyleProp>;
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
- * Context menu shadow.
49
- * @default 'sm'
50
- */
51
- shadow?: MantineShadow;
52
- /**
53
- * Context menu border radius.
54
- * @default 'xs'
55
- */
56
- borderRadius?: MantineRadius;
57
- /**
58
- * Delay in ms to use when showing and hiding submenus.
59
- * @default 500
60
- */
61
- submenuDelay?: number;
62
- /**
63
- * Whether to reposition the context menu when the triggering event repeats. If set to true, the context menu will
64
- * reposition itself to the position of the triggering event. If set to false, the context menu will hide
65
- * automatically when the triggering event repeats.
66
- * @default false
67
- */
68
- repositionOnRepeat?: boolean;
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
- children: React.ReactNode;
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
- * Unique key of the context menu item or divider.
82
- */
83
- key: string;
84
- /**
85
- * Context menu item or divider className.
86
- */
87
- className?: string;
88
- /**
89
- * Context menu item or divider style.
90
- */
91
- style?: MantineStyleProp;
92
- /**
93
- * Boolean indicating whether the context menu item is hidden.
94
- */
95
- hidden?: boolean;
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
- * Optional context menu item icon.
99
- */
100
- icon?: React.ReactNode;
101
- /**
102
- * Optional context menu item icon for the right side of the title.
103
- * If provided this will overwrite the submenu's ▶ icon
104
- */
105
- iconRight?: React.ReactNode;
106
- /**
107
- * Optional context menu item title.
108
- * If not provided, one will be generated automatically by "humanizing" the key.
109
- * @default humanize(key)
110
- */
111
- title?: React.ReactNode;
112
- /**
113
- * Optional context menu item color.
114
- */
115
- color?: MantineColor;
116
- /**
117
- * Boolean indicating whether the context menu item is disabled.
118
- */
119
- disabled?: boolean;
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
- * Optional context menu item `onClick` handler.
123
- * If not provided, a divider will be rendered instead.
124
- */
125
- onClick: React.MouseEventHandler<HTMLButtonElement>;
126
- items?: never;
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
- onClick?: never;
129
- /**
130
- * Optional items.
131
- * If provided, a submenu will be rendered.
132
- */
133
- items: ContextMenuItemOptions[];
124
+ onClick?: never;
125
+ /**
126
+ * Optional items.
127
+ * If provided, a submenu will be rendered.
128
+ */
129
+ items: ContextMenuItemOptions[];
134
130
  })) | {
135
- icon?: never;
136
- iconRight?: never;
137
- title?: never;
138
- color?: never;
139
- disabled?: never;
140
- onClick?: never;
141
- items?: never;
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
- type ContextMenuDividerProps = Pick<ContextMenuItemOptions, 'className' | 'style'>;
167
- declare function ContextMenuDivider({ className, style }: ContextMenuDividerProps): react.JSX.Element;
168
-
169
- declare function ContextMenuItem({ className, style, icon, iconRight, title, color, disabled, onClick, onHide, items, submenuProps, }: WithRequiredProperty<Omit<ContextMenuItemOptions, 'key'>, 'title'> & {
170
- onHide: () => void;
171
- submenuProps: Pick<ContextMenuOptions, 'className' | 'classNames' | 'style' | 'styles'> & {
172
- dir?: 'ltr' | 'rtl';
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
- x: number;
178
- y: number;
179
- content: ContextMenuContent;
161
+ x: number;
162
+ y: number;
163
+ content: ContextMenuContent;
180
164
  };
181
165
  type ContextMenuProps = ContextMenuOptions & ContextMenuInstanceOptions & {
182
- onHide: () => void;
183
- dir?: 'ltr' | 'rtl';
166
+ onHide: () => void;
167
+ dir?: "ltr" | "rtl";
184
168
  };
185
-
186
- type ContextMenuPortalProps = ContextMenuProps & {
187
- zIndex?: number;
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): react.JSX.Element;
191
-
192
- declare const ContextMenuSettingsCtx: react.Context<WithRequiredProperty<ContextMenuSettings, "shadow" | "borderRadius" | "submenuDelay">>;
193
- declare const ContextMenuCtx: react.Context<{
194
- /**
195
- * Function that shows the context menu.
196
- */
197
- showContextMenu: ShowContextMenuFunction;
198
- /**
199
- * Function that hides the context menu.
200
- */
201
- hideContextMenu: HideContextMenuFunction;
202
- /**
203
- * Boolean indicating whether the context menu is currently visible.
204
- */
205
- isContextMenuVisible: boolean;
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, }: ContextMenuProviderProps): react.JSX.Element;
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 strict";"use client";var me=Object.create;var F=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var pe=Object.getOwnPropertyNames;var xe=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty;var de=(e,t)=>{for(var n in t)F(e,n,{get:t[n],enumerable:!0})},J=(e,t,n,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of pe(t))!le.call(e,s)&&s!==n&&F(e,s,{get:()=>t[s],enumerable:!(u=ae(t,s))||u.enumerable});return e};var X=(e,t,n)=>(n=e!=null?me(xe(e)):{},J(t||!e||!e.__esModule?F(n,"default",{value:e,enumerable:!0}):n,e)),ce=e=>J(F({},"__esModule",{value:!0}),e);var fe={};de(fe,{ContextMenuCtx:()=>G,ContextMenuDivider:()=>Y,ContextMenuItem:()=>Z,ContextMenuPortal:()=>_,ContextMenuProvider:()=>Ce,ContextMenuSettingsCtx:()=>v,humanize:()=>Q,useContextMenu:()=>Me});module.exports=ce(fe);var K=require("@mantine/core"),j=X(require("clsx")),ee=require("react/jsx-runtime");function Y({className:e,style:t}){return(0,ee.jsx)(K.Box,{className:(0,j.default)("mantine-contextmenu-divider",e),style:t})}var o=require("@mantine/core"),k=require("@mantine/hooks"),se=X(require("clsx")),O=require("react");var $=require("@mantine/core"),ue=require("@mantine/hooks"),q=X(require("clsx")),w=require("react");var ie=require("@mantine/core"),b=require("react");var re=require("@mantine/core"),D=require("@mantine/hooks");var te=require("react");var oe=require("react/jsx-runtime");function ne({zIndex:e,children:t,onHide:n}){let{repositionOnRepeat:u}=(0,te.useContext)(v);return(0,oe.jsx)("div",{className:"mantine-contextmenu-overlay",style:{zIndex:e},onClick:i=>{i.preventDefault(),n()},onContextMenu:async i=>{if(i.preventDefault(),u){let{clientX:m,clientY:p}=i;try{document.elementsFromPoint(m,p)[1].dispatchEvent(new MouseEvent("contextmenu",{bubbles:!0,clientX:m,clientY:p}))}catch{}}else n()},children:t})}var A=require("react/jsx-runtime");function _({onHide:e,zIndex:t,dir:n,...u}){return(0,D.useWindowEvent)("resize",e),(0,D.useWindowEvent)("scroll",e),(0,D.useHotkeys)([["Escape",e]]),(0,A.jsx)(re.Portal,{children:(0,A.jsx)(ne,{zIndex:t,onHide:e,children:(0,A.jsx)(L,{...u,onHide:e,dir:n})})})}var B=require("react/jsx-runtime"),z={shadow:"sm",borderRadius:"xs",submenuDelay:500,repositionOnRepeat:!1},v=(0,b.createContext)(z),G=(0,b.createContext)({showContextMenu:()=>()=>{},hideContextMenu:()=>{},isContextMenuVisible:!1});function Ce({zIndex:e=9999,shadow:t=z.shadow,borderRadius:n=z.borderRadius,submenuDelay:u=z.submenuDelay,repositionOnRepeat:s=z.repositionOnRepeat,children:M}){let[i,m]=(0,b.useState)(null),{dir:p}=(0,ie.useDirection)(),c=()=>{m(null)},P=(g,l)=>r=>{r.preventDefault(),r.stopPropagation();let{x:y,y:S}="touches"in r?{x:r.touches.item(0).clientX,y:r.touches.item(0).clientY}:{x:r.clientX,y:r.clientY};m({x:y,y:S,content:g,zIndex:l?.zIndex||e,className:l?.className,style:l?.style,classNames:l?.classNames,styles:l?.styles})};return(0,B.jsx)(v.Provider,{value:{shadow:t,borderRadius:n,submenuDelay:u,repositionOnRepeat:s},children:(0,B.jsxs)(G.Provider,{value:{showContextMenu:P,hideContextMenu:c,isContextMenuVisible:!!i},children:[M,i&&(0,B.jsx)(_,{onHide:c,dir:p,...i})]})})}function Me(){return(0,b.useContext)(G)}function Q(e){let t=e.replace(/([a-z\d])([A-Z]+)/g,"$1 $2").replace(/\W|_/g," ").trim().toLowerCase();return`${t.charAt(0).toUpperCase()}${t.slice(1)}`}var U=require("react/jsx-runtime");function L({x:e,y:t,content:n,zIndex:u,onHide:s,className:M,style:i,classNames:m,styles:p,dir:c="ltr"}){let{shadow:P,borderRadius:g}=(0,w.useContext)(v),[l,{width:r,height:y}]=(0,ue.useResizeObserver)(),[S,N]=(0,w.useState)(!1),R=0,E=0;typeof window<"u"&&({innerWidth:R,innerHeight:E}=window);let V={className:M,classNames:m,style:i,styles:p,dir:c},T=r>0&&y>0;return(0,w.useEffect)(()=>{T&&requestAnimationFrame(()=>N(!0))},[T]),(0,U.jsx)($.Paper,{ref:l,shadow:P,radius:g,className:(0,q.default)("mantine-contextmenu",S&&"mantine-contextmenu-mounted",M,m?.root),style:[({spacing:{md:f}})=>{let d=(0,$.px)(f);return{zIndex:u,top:t+y+d>E?E-y-d:t,left:c==="ltr"?e+r+d>R?R-r-d:e:e-r<d?d:e-r}},i,p?.root],children:Array.isArray(n)?n.map(({key:f,hidden:d,className:H,style:I,onClick:W,items:a,title:h,...x})=>d?null:W||a?(0,U.jsx)(Z,{className:(0,q.default)(m?.item,H),style:[p?.item,I],title:h??Q(f),onClick:W,onHide:s,items:a,submenuProps:V,...x},f):(0,U.jsx)(Y,{className:(0,q.default)(m?.divider,H),style:[p?.divider,I]},f)):n(s)})}var C=require("react/jsx-runtime");function Z({className:e,style:t,icon:n,iconRight:u,title:s,color:M,disabled:i,onClick:m,onHide:p,items:c,submenuProps:P}){let g=(0,O.useRef)(null),{submenuDelay:l}=(0,O.useContext)(v),r=P.dir||"ltr",y=(0,k.useMediaQuery)("(hover: hover)"),[S,N]=(0,O.useState)(null),{start:R,clear:E}=(0,k.useTimeout)(()=>{let a=g.current.getBoundingClientRect(),h=r==="ltr"?a.right:a.left;N({x:h,y:a.top})},l),{start:V,clear:T}=(0,k.useTimeout)(()=>{N(null)},l),f=()=>{T(),R()},d=()=>{E(),V()},H=c&&!i,I=H&&y,W=H?a=>{a.stopPropagation(),f()}:m?a=>{p(),m?.(a)}:void 0;return(0,C.jsxs)("div",{onMouseEnter:I?f:void 0,onMouseLeave:I?d:void 0,children:[(0,C.jsxs)(o.UnstyledButton,{ref:g,dir:r,style:[a=>{let{colors:h}=a,x=M?(0,o.parseThemeColor)({color:M,theme:a}).value:void 0;return{"--mantine-contextmenu-item-button-color":x||"var(--mantine-color-text)","--mantine-contextmenu-item-button-hover-bg-color-light":x?(0,o.rgba)(x,.08):(0,o.rgba)(h.gray[4],.25),"--mantine-contextmenu-item-button-hover-bg-color-dark":x?(0,o.rgba)(x,.15):(0,o.rgba)(h.dark[3],.25),"--mantine-contextmenu-item-button-pressed-bg-color-light":x?(0,o.rgba)(x,.2):(0,o.rgba)(h.gray[4],.5),"--mantine-contextmenu-item-button-pressed-bg-color-dark":x?(0,o.rgba)(x,.3):(0,o.rgba)(h.dark[3],.5)}},t],className:(0,se.default)("mantine-contextmenu-item-button",e),disabled:i,onClick:W,children:[n&&(0,C.jsx)(o.Box,{fz:0,me:"xs",mt:-2,children:n}),(0,C.jsx)("div",{className:"mantine-contextmenu-item-button-title",children:s}),u?(0,C.jsx)(o.Box,{fz:0,ms:"xs",mt:-2,children:u}):c&&(0,C.jsx)(o.Box,{mt:-1,ms:"xs",children:"\u203A"})]}),S&&(0,C.jsx)(L,{content:c,onHide:p,...P,...S})]})}0&&(module.exports={ContextMenuCtx,ContextMenuDivider,ContextMenuItem,ContextMenuPortal,ContextMenuProvider,ContextMenuSettingsCtx,humanize,useContextMenu});
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":"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,CJwEc,IAAAC,EAAA,6BA5DP,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,EAAU,CAAE,MAAAC,EAAO,OAAAC,CAAO,CAAC,KAAI,sBAAkC,EAClE,CAACC,EAAWC,CAAY,KAAI,YAAS,EAAK,EAE5CC,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,EAAUP,EAAQ,GAAKC,EAAS,EAEtC,sBAAU,IAAM,CACVM,GACF,sBAAsB,IAAMJ,EAAa,EAAI,CAAC,CAElD,EAAG,CAACI,CAAO,CAAC,KAGV,OAAC,SACC,IAAKR,EACL,OAAQH,EACR,OAAQC,EACR,aAAW,EAAAW,SAAK,sBAAuBN,GAAa,8BAA+BX,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,EAAIc,EAASS,EAAYL,EAAeA,EAAeJ,EAASS,EAAYvB,EACjF,KACEQ,IAAQ,MACJT,EAAIc,EAAQU,EAAYN,EACtBA,EAAcJ,EAAQU,EACtBxB,EACFA,EAAIc,EAAQU,EACVA,EACAxB,EAAIc,CACd,CACF,EACAR,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,CDhCM,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,EAAQT,EAAI,QAA8B,sBAAsB,EAChEU,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,IAAUsB,CAAC,CACb,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","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 Q}from"@mantine/core";import Z from"clsx";import{jsx as J}from"react/jsx-runtime";function F({className:e,style:n}){return J(Q,{className:Z("mantine-contextmenu-divider",e),style:n})}import{Box as W,parseThemeColor as le,rgba as M,UnstyledButton as de}from"@mantine/core";import{useMediaQuery as ce,useTimeout as _}from"@mantine/hooks";import Ce from"clsx";import{useContext as Me,useRef as fe,useState as he}from"react";import{Paper as ue,px as se}from"@mantine/core";import{useResizeObserver as me}from"@mantine/hooks";import N from"clsx";import{useContext as ae,useEffect as pe,useState as xe}from"react";import{useDirection as ne}from"@mantine/core";import{createContext as $,useContext as oe,useState as re}from"react";import{Portal as ee}from"@mantine/core";import{useHotkeys as te,useWindowEvent as L}from"@mantine/hooks";import{useContext as K}from"react";import{jsx as j}from"react/jsx-runtime";function A({zIndex:e,children:n,onHide:r}){let{repositionOnRepeat:a}=K(v);return j("div",{className:"mantine-contextmenu-overlay",style:{zIndex:e},onClick:o=>{o.preventDefault(),r()},onContextMenu:async o=>{if(o.preventDefault(),a){let{clientX:i,clientY:s}=o;try{document.elementsFromPoint(i,s)[1].dispatchEvent(new MouseEvent("contextmenu",{bubbles:!0,clientX:i,clientY:s}))}catch{}}else r()},children:n})}import{jsx as k}from"react/jsx-runtime";function q({onHide:e,zIndex:n,dir:r,...a}){return L("resize",e),L("scroll",e),te([["Escape",e]]),k(ee,{children:k(A,{zIndex:n,onHide:e,children:k(z,{...a,onHide:e,dir:r})})})}import{jsx as U,jsxs as ie}from"react/jsx-runtime";var R={shadow:"sm",borderRadius:"xs",submenuDelay:500,repositionOnRepeat:!1},v=$(R),V=$({showContextMenu:()=>()=>{},hideContextMenu:()=>{},isContextMenuVisible:!1});function Te({zIndex:e=9999,shadow:n=R.shadow,borderRadius:r=R.borderRadius,submenuDelay:a=R.submenuDelay,repositionOnRepeat:f=R.repositionOnRepeat,children:d}){let[o,i]=re(null),{dir:s}=ne(),l=()=>{i(null)},y=(b,p)=>t=>{t.preventDefault(),t.stopPropagation();let{x:h,y:P}="touches"in t?{x:t.touches.item(0).clientX,y:t.touches.item(0).clientY}:{x:t.clientX,y:t.clientY};i({x:h,y:P,content:b,zIndex:p?.zIndex||e,className:p?.className,style:p?.style,classNames:p?.classNames,styles:p?.styles})};return U(v.Provider,{value:{shadow:n,borderRadius:r,submenuDelay:a,repositionOnRepeat:f},children:ie(V.Provider,{value:{showContextMenu:y,hideContextMenu:l,isContextMenuVisible:!!o},children:[d,o&&U(q,{onHide:l,dir:s,...o})]})})}function We(){return oe(V)}function X(e){let n=e.replace(/([a-z\d])([A-Z]+)/g,"$1 $2").replace(/\W|_/g," ").trim().toLowerCase();return`${n.charAt(0).toUpperCase()}${n.slice(1)}`}import{jsx as T}from"react/jsx-runtime";function z({x:e,y:n,content:r,zIndex:a,onHide:f,className:d,style:o,classNames:i,styles:s,dir:l="ltr"}){let{shadow:y,borderRadius:b}=ae(v),[p,{width:t,height:h}]=me(),[P,H]=xe(!1),g=0,S=0;typeof window<"u"&&({innerWidth:g,innerHeight:S}=window);let B={className:d,classNames:i,style:o,styles:s,dir:l},I=t>0&&h>0;return pe(()=>{I&&requestAnimationFrame(()=>H(!0))},[I]),T(ue,{ref:p,shadow:y,radius:b,className:N("mantine-contextmenu",P&&"mantine-contextmenu-mounted",d,i?.root),style:[({spacing:{md:c}})=>{let x=se(c);return{zIndex:a,top:n+h+x>S?S-h-x:n,left:l==="ltr"?e+t+x>g?g-t-x:e:e-t<x?x:e-t}},o,s?.root],children:Array.isArray(r)?r.map(({key:c,hidden:x,className:w,style:O,onClick:D,items:u,title:C,...m})=>x?null:D||u?T(Y,{className:N(i?.item,w),style:[s?.item,O],title:C??X(c),onClick:D,onHide:f,items:u,submenuProps:B,...m},c):T(F,{className:N(i?.divider,w),style:[s?.divider,O]},c)):r(f)})}import{jsx as E,jsxs as G}from"react/jsx-runtime";function Y({className:e,style:n,icon:r,iconRight:a,title:f,color:d,disabled:o,onClick:i,onHide:s,items:l,submenuProps:y}){let b=fe(null),{submenuDelay:p}=Me(v),t=y.dir||"ltr",h=ce("(hover: hover)"),[P,H]=he(null),{start:g,clear:S}=_(()=>{let u=b.current.getBoundingClientRect(),C=t==="ltr"?u.right:u.left;H({x:C,y:u.top})},p),{start:B,clear:I}=_(()=>{H(null)},p),c=()=>{I(),g()},x=()=>{S(),B()},w=l&&!o,O=w&&h,D=w?u=>{u.stopPropagation(),c()}:i?u=>{s(),i?.(u)}:void 0;return G("div",{onMouseEnter:O?c:void 0,onMouseLeave:O?x:void 0,children:[G(de,{ref:b,dir:t,style:[u=>{let{colors:C}=u,m=d?le({color:d,theme:u}).value:void 0;return{"--mantine-contextmenu-item-button-color":m||"var(--mantine-color-text)","--mantine-contextmenu-item-button-hover-bg-color-light":m?M(m,.08):M(C.gray[4],.25),"--mantine-contextmenu-item-button-hover-bg-color-dark":m?M(m,.15):M(C.dark[3],.25),"--mantine-contextmenu-item-button-pressed-bg-color-light":m?M(m,.2):M(C.gray[4],.5),"--mantine-contextmenu-item-button-pressed-bg-color-dark":m?M(m,.3):M(C.dark[3],.5)}},n],className:Ce("mantine-contextmenu-item-button",e),disabled:o,onClick:D,children:[r&&E(W,{fz:0,me:"xs",mt:-2,children:r}),E("div",{className:"mantine-contextmenu-item-button-title",children:f}),a?E(W,{fz:0,ms:"xs",mt:-2,children:a}):l&&E(W,{mt:-1,ms:"xs",children:"\u203A"})]}),P&&E(z,{content:l,onHide:s,...y,...P})]})}export{V as ContextMenuCtx,F as ContextMenuDivider,Y as ContextMenuItem,q as ContextMenuPortal,Te as ContextMenuProvider,v as ContextMenuSettingsCtx,X as humanize,We as useContextMenu};
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
@@ -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":"A,obAOA,SAAgBC,EAAmB,CAAE,YAAW,SAA+C,CAC7F,MAAO,kBAACC,EAAD,CAAK,UAAWF,EAAK,8BAA+BG,CAAS,EAAU,OAAQ,CAAA,CACxF,CCDA,SAAgBC,EAAmB,CAAE,SAAQ,WAAU,UAAgD,CACrG,GAAM,CAAE,sBAAuBC,EAAWC,CAAsB,EAuBhE,MACE,kBAAC,MAAD,CACE,UAAU,8BACV,MAAO,CAAE,QAAO,EAChB,QAzBgB,GAAwB,CAC1C,EAAE,eAAe,EACjBC,EAAO,CACT,EAuBI,cAAe,KArBc,IAAwB,CAEvD,GADA,EAAE,eAAe,EACbC,EAAoB,CACtB,GAAM,CAAE,UAAS,WAAY,EAC7B,GAAI,CACF,SACG,kBAAkBC,EAASC,CAAO,CAAC,CAAC,EAAE,CACtC,cAAc,IAAI,WAAW,cAAe,CAAE,QAAS,GAAM,UAAS,SAAQ,CAAC,CAAC,CACrF,MAAQ,CAER,CACF,MACEH,EAAO,CAEX,EASK,UACE,CAAA,CAET,CC/BA,SAAgBI,EAAkB,CAAE,SAAQ,SAAQ,MAAK,GAAGC,GAAmD,CAK7G,OAJAC,EAAe,SAAUN,CAAM,EAC/BM,EAAe,SAAUN,CAAM,EAC/BO,EAAW,CAAC,CAAC,SAAUP,CAAM,CAAC,CAAC,EAG7B,kBAACQ,EAAD,CAAA,SACE,kBAACX,EAAD,CAA4B,SAAgB,SAC1C,SAAA,kBAACY,EAAD,CAAa,GAAIJ,EAAoB,SAAa,KAAM,CAAA,CACtC,CAAA,CACd,CAAA,CAEZ,CCLA,MAAMK,EAAgD,CACpD,OAAQ,KACR,aAAc,KACd,aAAc,IACd,mBAAoB,EACtB,EAEaX,EAA+DY,EAAcD,CAAgB,EAmB7FE,EAAmDD,EAAuC,CACrG,wBAA6B,IAAA,GAC7B,oBAAuB,IAAA,GACvB,qBAAsB,EACxB,CAAC,EAOD,SAAgBE,EAAoB,CAClC,SAAS,KACT,SAASH,EAAiB,OAC1B,eAAeA,EAAiB,aAChC,eAAeA,EAAiB,aAChC,qBAAqBA,EAAiB,mBACtC,YACwC,CACxC,GAAM,CAACI,EAAMC,GAAWC,EAAmE,IAAI,EACzF,CAAE,OAAQC,EAAa,EAEvBC,MAAwB,CAC5BH,EAAQ,IAAI,CACd,EAqBA,MACE,kBAAChB,EAAuB,SAAxB,CAAiC,MAAO,CAAE,SAAQ,eAAc,eAAc,oBAAmB,EAC/F,SAAA,kBAACa,EAAe,SAAhB,CAAyB,MAAO,CAAE,iBArBY,EAAS,IAAa,GAA2C,CACjHO,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAElB,GAAM,CAAE,IAAG,KACT,YAAaA,EAAI,CAAE,EAAGA,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,QAAS,EAAGA,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,OAAQ,EAAI,CAAE,EAAGA,EAAE,QAAS,EAAGA,EAAE,OAAQ,EAEjHJ,EAAQ,CACN,IACA,IACA,UACA,OAAQK,GAAS,QAAUC,EAC3B,UAAWD,GAAS,UACpB,MAAOA,GAAS,MAChB,WAAYA,GAAS,WACrB,OAAQA,GAAS,MACnB,CAAC,CACH,EAIuD,kBAAiB,qBAAsB,CAAC,CAACN,CAAK,EAAjG,SAAA,CACGQ,EACAR,GAAQ,kBAACV,EAAD,CAAmB,OAAQc,EAAsB,MAAK,GAAIJ,CAAO,CAAA,CACnD,C,EACM,CAAA,CAErC,CAKA,SAAgBS,GAA0C,CACxD,OAAOzB,EAAWc,CAAc,CAClC,CCrGA,SAAgBY,EAAS,EAAe,CACtC,IAAMC,EAAMC,EACT,QAAQ,qBAAsB,OAAO,CAAC,CACtC,QAAQ,QAAS,GAAG,CAAC,CACrB,KAAK,CAAC,CACN,YAAY,EACf,MAAO,GAAGD,EAAI,OAAO,CAAC,CAAC,CAAC,YAAY,IAAIA,EAAI,MAAM,CAAC,GACrD,CCYA,SAAgBhB,EAAY,CAC1B,IACA,IACA,UACA,SACA,SACA,YACA,QACA,aACA,SACA,MAAM,OAC0B,CAChC,GAAM,CAAE,SAAQ,gBAAiBX,EAAWC,CAAsB,EAC5D,CAAC4B,EAAU,CAAE,QAAO,WAAYC,EAAkC,EAClE,CAACC,EAAWC,GAAgBd,EAAS,EAAK,EAE5Ce,EAAc,EACdC,EAAe,EACf,OAAO,OAAW,MAAc,CAAE,WAAYD,EAAa,YAAaC,GAAiB,QAE7F,IAAMC,EAAe,CAAE,YAAW,aAAY,QAAO,SAAQ,KAAI,EAG3DC,EAAUC,EAAQ,GAAKC,EAAS,EAQtC,OANAC,MAAgB,CACVH,GACF,0BAA4BJ,EAAa,EAAI,CAAC,CAElD,EAAG,CAACI,CAAO,CAAC,EAGV,kBAACI,EAAD,CACE,IAAKX,EACG,SACR,OAAQY,EACR,UAAW9C,EAAK,sBAAuBoC,GAAa,8BAA+BjC,EAAW4C,GAAY,IAAI,EAC9G,MAAO,EACJ,CAAE,QAAS,CAAE,SAAW,CACvB,IAAMC,EAAYC,EAAGC,CAAE,EACvB,MAAO,CACL,SACA,IAAKC,EAAIR,EAASK,EAAYT,EAAeA,EAAeI,EAASK,EAAYG,EACjF,KACEC,IAAQ,MACJC,EAAIX,EAAQM,EAAYV,EACtBA,EAAcI,EAAQM,EACtBK,EACF,KAAK,IAAIA,EAAIX,EAAOM,CAAS,CACrC,CACF,EACAM,EACAC,GAAQ,IACV,EAEC,SAAA,MAAM,QAAQC,CAAO,EAClBA,EAAQ,KAAK,CAAE,MAAK,SAAQ,YAAW,QAAO,UAAS,QAAO,QAAO,GAAGC,KACtEC,EAAS,KAAOC,GAAWC,EACzB,kBAACC,EAAD,CAEE,UAAW7D,EAAK+C,GAAY,KAAM5C,CAAS,EAC3C,MAAO,CAACoD,GAAQ,KAAMD,CAAK,EAC3B,MAAOQ,GAAS/B,EAASgC,CAAG,EACnB,UACD,SACD,QACO,eACd,GAAIN,CACL,EATMM,CASN,EAED,kBAAC9D,EAAD,CAEE,UAAWD,EAAK+C,GAAY,QAAS5C,CAAS,EAC9C,MAAO,CAACoD,GAAQ,QAASD,CAAK,CAC/B,EAHMS,CAGN,CAEL,EACAP,EAAQjD,CAAM,CACb,CAAA,CAEX,CC9FA,SAAgBsD,EAAgB,CAC9B,YACA,QACA,OACA,YACA,QACA,QACA,WACA,UACA,SACA,QACA,gBAIc,CACd,IAAMG,EAAMC,EAA0B,IAAI,EACpC,CAAE,gBAAiB5D,EAAWC,CAAsB,EACpD8C,EAAMZ,EAAa,KAAO,MAE1B0B,EAAiBC,EAAc,gBAAgB,EAE/C,CAACC,EAAiBC,GAAsB9C,EAA0C,IAAI,EAEtF,CAAE,MAAO+C,EAAqB,MAAOC,GAAuBC,MAAiB,CACjF,IAAMC,EAAQT,EAAI,QAA8B,sBAAsB,EAChEX,EAAID,IAAQ,MAAQqB,EAAK,MAAQA,EAAK,KAC5CJ,EAAmB,CAAE,IAAG,EAAGI,EAAK,GAAI,CAAC,CACvC,EAAGC,CAAY,EAET,CAAE,MAAOC,EAAoB,MAAOC,GAAsBJ,MAAiB,CAC/EH,EAAmB,IAAI,CACzB,EAAGK,CAAY,EAETG,MAAoB,CACxBD,EAAkB,EAClBN,EAAoB,CACtB,EAEMQ,MAAoB,CACxBP,EAAmB,EACnBI,EAAmB,CACrB,EAEMI,EAAanB,GAAS,CAACoB,EACvBC,EAAqBF,GAAcb,EAEnCgB,EAAgEH,EACjE,GAAM,CACL,EAAE,gBAAgB,EAClBF,EAAY,CACd,EACAlB,EACG,GAAM,CACLpD,EAAO,EACPoD,IAAU,CAAC,CACb,EACA,IAAA,GAEN,MACE,kBAAC,MAAD,CACE,aAAcsB,EAAqBJ,EAAc,IAAA,GACjD,aAAcI,EAAqBH,EAAc,IAAA,GAFnD,SAAA,CAIE,kBAACK,EAAD,CACO,MACA,MACL,MAAO,CACJ,GAAU,CACT,GAAM,CAAE,UAAWC,EACbC,EAAcC,EAAQC,EAAgB,CAAE,QAAO,OAAM,CAAC,CAAC,CAAC,MAAQ,IAAA,GACtE,MAAO,CACL,0CAA2CF,GAA4B,4BACvE,yDAA0DA,EACtDG,EAAKH,EAAa,GAAI,EACtBG,EAAKC,EAAO,KAAK,GAAI,GAAI,EAC7B,wDAAyDJ,EACrDG,EAAKH,EAAa,GAAI,EACtBG,EAAKC,EAAO,KAAK,GAAI,GAAI,EAC7B,2DAA4DJ,EACxDG,EAAKH,EAAa,EAAG,EACrBG,EAAKC,EAAO,KAAK,GAAI,EAAG,EAC5B,0DAA2DJ,EACvDG,EAAKH,EAAa,EAAG,EACrBG,EAAKC,EAAO,KAAK,GAAI,EAAG,CAC9B,CACF,EACAnC,CACF,EACA,UAAWtD,EAAK,kCAAmCG,CAAS,EAClD,WACV,QAAS+E,EA3BX,SAAA,CA6BGQ,GACC,kBAACxF,EAAD,CAAK,GAAI,EAAG,GAAG,KAAK,GAAI,GACrB,SAAAwF,CACE,CAAA,EAEP,kBAAC,MAAD,CAAK,UAAU,wCAAyC,SAAA5B,CAAW,CAAA,EAClE6B,EACC,kBAACzF,EAAD,CAAK,GAAI,EAAG,GAAG,KAAK,GAAI,GACrB,SAAAyF,CACE,CAAA,EAEL/B,GACE,kBAAC1D,EAAD,CAAK,GAAI,GAAI,GAAG,KAAK,SAAA,GAEhB,CAAA,CAGK,CACf,CAAA,EAAAkE,GACC,kBAACpD,EAAD,CAAa,QAAS4C,EAAqC,SAAQ,GAAIpB,EAAc,GAAI4B,CAAkB,CAAA,CAE1G,C,EAET,C"}
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{overflow:hidden;visibility:hidden}.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:calc(var(--mantine-spacing-sm)/2) 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%}
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%}
@@ -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{overflow:hidden;visibility:hidden}.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:calc(var(--mantine-spacing-sm)/2) 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%}}@layer mantine-contextmenu{}@layer mantine-contextmenu{}@layer 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.4.0",
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; tsup --config scripts/tsup.esm.ts; tsup --config scripts/tsup.cjs.ts; tsup --config scripts/tsup.dts.ts; postcss package/styles*.css -d dist -m",
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.5.3",
79
- "@mantine/code-highlight": "^9.4.1",
80
- "@mantine/core": "^9.4.1",
81
- "@mantine/hooks": "^9.4.1",
82
- "@mantine/notifications": "^9.4.1",
83
- "@tabler/icons-react": "^3.44.0",
84
- "@types/lodash": "^4.17.24",
85
- "@types/node": "^26.1.1",
86
- "@types/react": "^19.2.17",
87
- "@types/react-dom": "^19.2.3",
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": "^8.0.2",
89
+ "cssnano": "^9.9.0",
90
90
  "lodash": "^4.18.1",
91
- "next": "^16.2.10",
92
- "postcss": "^8.5.19",
93
- "postcss-cli": "^11.0.1",
94
- "postcss-import": "^16.1.1",
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.5",
98
- "react": "^19.2.7",
99
- "react-dom": "^19.2.7",
100
- "sharp": "^0.35.3",
101
- "shiki": "^4.3.1",
102
- "swr": "^2.4.2",
103
- "tsup": "^8.5.1",
104
- "typescript": "^6.0.3"
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",