@asup/context-menu 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/cjs/main.js +99 -75
- package/dist/cjs/main.js.map +1 -1
- package/dist/context-menu.d.ts.map +1 -1
- package/dist/main.js +100 -76
- package/dist/main.js.map +1 -1
- package/package.json +14 -13
package/README.md
CHANGED
|
@@ -84,7 +84,7 @@ import { AutoHeight } from "@asup/context-menu";
|
|
|
84
84
|
|
|
85
85
|
### ClickForMenu
|
|
86
86
|
|
|
87
|
-
`ClickForMenu` attaches a click-based menu to any element (useful for toolbar buttons or inline actions).
|
|
87
|
+
`ClickForMenu` attaches a click-based menu to any element (useful for toolbar buttons or inline actions). Give each instance a stable `id` so the trigger element can be referenced and cleaned up correctly.
|
|
88
88
|
|
|
89
89
|
```tsx
|
|
90
90
|
import { ClickForMenu, IMenuItem } from "@asup/context-menu";
|
|
@@ -94,7 +94,10 @@ const clickItems: IMenuItem[] = [
|
|
|
94
94
|
{ label: "Delete", action: () => console.log("Delete") },
|
|
95
95
|
];
|
|
96
96
|
|
|
97
|
-
<ClickForMenu
|
|
97
|
+
<ClickForMenu
|
|
98
|
+
id="actions-menu"
|
|
99
|
+
menuItems={clickItems}
|
|
100
|
+
>
|
|
98
101
|
<button type="button">Actions</button>
|
|
99
102
|
</ClickForMenu>;
|
|
100
103
|
```
|
package/dist/cjs/main.js
CHANGED
|
@@ -56,7 +56,7 @@ $796f463330153c24$export$563bd8f955c52746 = `aiw-AutoHeight-module-pDlSVW-autoHe
|
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
function $95149596d5a7ed2b$export$77bf000da9303d1(_param) {
|
|
59
|
-
var { children: children, hide: hide, duration: duration = 300 } = _param, rest = (0, $gTuX4$swchelperscjs_object_without_propertiescjs._)(_param, [
|
|
59
|
+
var { children: children, hide: hide = false, duration: duration = 300 } = _param, rest = (0, $gTuX4$swchelperscjs_object_without_propertiescjs._)(_param, [
|
|
60
60
|
"children",
|
|
61
61
|
"hide",
|
|
62
62
|
"duration"
|
|
@@ -64,29 +64,63 @@ function $95149596d5a7ed2b$export$77bf000da9303d1(_param) {
|
|
|
64
64
|
const wrapperRef = (0, $gTuX4$react.useRef)(null);
|
|
65
65
|
const innerRef = (0, $gTuX4$react.useRef)(null);
|
|
66
66
|
const [height, setHeight] = (0, $gTuX4$react.useState)(null);
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
67
|
+
const [animationState, setAnimationState] = (0, $gTuX4$react.useState)(!hide ? "open" : "closed");
|
|
68
|
+
const rafRef = (0, $gTuX4$react.useRef)(null);
|
|
69
|
+
const timeoutRef = (0, $gTuX4$react.useRef)(null);
|
|
70
|
+
const targetChildren = animationState === "closed" || !children ? null : children;
|
|
71
|
+
const setTargetHeight = (0, $gTuX4$react.useEffectEvent)((newHeight)=>{
|
|
72
|
+
setHeight(newHeight);
|
|
73
|
+
});
|
|
74
|
+
const transitionToOpening = (0, $gTuX4$react.useEffectEvent)(()=>{
|
|
75
|
+
// Cancel any pending close timeout
|
|
76
|
+
if (timeoutRef.current !== null) {
|
|
77
|
+
clearTimeout(timeoutRef.current);
|
|
78
|
+
timeoutRef.current = null;
|
|
79
|
+
}
|
|
80
|
+
setAnimationState("opening");
|
|
81
|
+
const id = window.requestAnimationFrame(()=>{
|
|
82
|
+
rafRef.current = null;
|
|
83
|
+
setTargetHeight(1);
|
|
84
|
+
const frameId = window.requestAnimationFrame(()=>{
|
|
85
|
+
const inner = innerRef.current;
|
|
86
|
+
if (inner) {
|
|
87
|
+
setTargetHeight(inner.offsetHeight);
|
|
88
|
+
setAnimationState("open");
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
rafRef.current = frameId;
|
|
92
|
+
});
|
|
93
|
+
rafRef.current = id;
|
|
94
|
+
});
|
|
95
|
+
const transitionToClosing = (0, $gTuX4$react.useEffectEvent)(()=>{
|
|
96
|
+
// Cancel any pending RAF
|
|
97
|
+
if (rafRef.current !== null) {
|
|
98
|
+
cancelAnimationFrame(rafRef.current);
|
|
99
|
+
rafRef.current = null;
|
|
100
|
+
}
|
|
101
|
+
setAnimationState("closing");
|
|
102
|
+
setTargetHeight(1);
|
|
103
|
+
timeoutRef.current = window.setTimeout(()=>{
|
|
104
|
+
timeoutRef.current = null;
|
|
105
|
+
setAnimationState("closed");
|
|
106
|
+
}, duration);
|
|
107
|
+
});
|
|
108
|
+
(0, $gTuX4$react.useLayoutEffect)(()=>{
|
|
109
|
+
if (!hide) // Want to show: transition to open
|
|
110
|
+
{
|
|
111
|
+
if (animationState === "closed" || animationState === "closing") transitionToOpening();
|
|
112
|
+
} else // Want to hide: transition to closed
|
|
113
|
+
if (animationState === "open" || animationState === "opening") transitionToClosing();
|
|
81
114
|
}, [
|
|
82
|
-
hide
|
|
115
|
+
hide,
|
|
116
|
+
animationState
|
|
83
117
|
]);
|
|
84
|
-
//
|
|
118
|
+
// Setup ResizeObserver to track content size changes
|
|
85
119
|
(0, $gTuX4$react.useEffect)(()=>{
|
|
86
120
|
const transition = innerRef.current;
|
|
87
121
|
if (transition) {
|
|
88
122
|
const observer = new ResizeObserver(()=>{
|
|
89
|
-
setTargetHeight();
|
|
123
|
+
if (animationState === "open") setTargetHeight(transition.offsetHeight);
|
|
90
124
|
});
|
|
91
125
|
observer.observe(transition);
|
|
92
126
|
return ()=>{
|
|
@@ -94,24 +128,26 @@ function $95149596d5a7ed2b$export$77bf000da9303d1(_param) {
|
|
|
94
128
|
};
|
|
95
129
|
}
|
|
96
130
|
}, [
|
|
97
|
-
|
|
131
|
+
animationState
|
|
98
132
|
]);
|
|
99
|
-
//
|
|
100
|
-
const [, startTransition] = (0, $gTuX4$react.useTransition)();
|
|
133
|
+
// Cleanup on unmount
|
|
101
134
|
(0, $gTuX4$react.useEffect)(()=>{
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
135
|
+
return ()=>{
|
|
136
|
+
if (rafRef.current !== null) {
|
|
137
|
+
cancelAnimationFrame(rafRef.current);
|
|
138
|
+
rafRef.current = null;
|
|
139
|
+
}
|
|
140
|
+
if (timeoutRef.current !== null) {
|
|
141
|
+
clearTimeout(timeoutRef.current);
|
|
142
|
+
timeoutRef.current = null;
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}, []);
|
|
111
146
|
return /*#__PURE__*/ (0, $gTuX4$reactjsxruntime.jsx)("div", (0, $gTuX4$swchelperscjs_object_spread_propscjs._)((0, $gTuX4$swchelperscjs_object_spreadcjs._)({}, rest), {
|
|
112
147
|
className: (0, (/*@__PURE__*/$parcel$interopDefault($796f463330153c24$exports))).autoHeightWrapper,
|
|
113
148
|
ref: wrapperRef,
|
|
114
149
|
style: (0, $gTuX4$swchelperscjs_object_spread_propscjs._)((0, $gTuX4$swchelperscjs_object_spreadcjs._)({}, rest.style), {
|
|
150
|
+
display: animationState === "closed" ? "none" : undefined,
|
|
115
151
|
height: height ? `${height}px` : "auto",
|
|
116
152
|
transitionDuration: `${duration}ms`
|
|
117
153
|
}),
|
|
@@ -310,9 +346,10 @@ const $a79b75d040e03c92$export$d4ebdd58e04c6ace = (_param)=>{
|
|
|
310
346
|
// Set up outsideClick handler
|
|
311
347
|
const menuRef = (0, $gTuX4$react.useRef)(null);
|
|
312
348
|
// Handle click off the menu
|
|
313
|
-
|
|
349
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
350
|
+
const handleClick = (e)=>{
|
|
314
351
|
if (menuRef.current && (e.target instanceof Element && !menuRef.current.contains(e.target) || !(e.target instanceof Element))) setMenuInDom(false);
|
|
315
|
-
}
|
|
352
|
+
};
|
|
316
353
|
const removeController = (0, $gTuX4$react.useRef)(null);
|
|
317
354
|
const removeTimeoutRef = (0, $gTuX4$react.useRef)(null);
|
|
318
355
|
(0, $gTuX4$react.useEffect)(()=>{
|
|
@@ -549,27 +586,24 @@ const $3c568ee547c732c3$export$ed4f9641643dc7e4 = (_param)=>{
|
|
|
549
586
|
]);
|
|
550
587
|
// Check for higher content menu
|
|
551
588
|
const higherContext = (0, $gTuX4$react.useContext)($3c568ee547c732c3$export$fc58dc71afe92de2);
|
|
552
|
-
const thisMenuItems =
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
higherContext,
|
|
571
|
-
menuItems
|
|
572
|
-
]);
|
|
589
|
+
const thisMenuItems = [
|
|
590
|
+
...higherContext !== null ? [
|
|
591
|
+
...higherContext.menuItems,
|
|
592
|
+
...[
|
|
593
|
+
higherContext.menuItems.length > 0 && !$3c568ee547c732c3$var$isDivider(higherContext.menuItems[higherContext.menuItems.length - 1].label) && menuItems.length > 0 && !$3c568ee547c732c3$var$isDivider(menuItems[0].label) ? {
|
|
594
|
+
label: /*#__PURE__*/ (0, $gTuX4$reactjsxruntime.jsx)("hr", {
|
|
595
|
+
style: {
|
|
596
|
+
flexGrow: 1,
|
|
597
|
+
cursor: "none",
|
|
598
|
+
margin: "0",
|
|
599
|
+
padding: "0"
|
|
600
|
+
}
|
|
601
|
+
})
|
|
602
|
+
} : null
|
|
603
|
+
].filter((item)=>item !== null)
|
|
604
|
+
] : [],
|
|
605
|
+
...menuItems
|
|
606
|
+
];
|
|
573
607
|
// Menu resources
|
|
574
608
|
const divHandlderRef = (0, $gTuX4$react.useRef)(null);
|
|
575
609
|
const menuRef = (0, $gTuX4$react.useRef)(null);
|
|
@@ -813,7 +847,7 @@ const $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = (_param)=>{
|
|
|
813
847
|
y: 0
|
|
814
848
|
});
|
|
815
849
|
const [moving, setMoving] = (0, $gTuX4$react.useState)(false);
|
|
816
|
-
const move = (
|
|
850
|
+
const move = (x, y)=>{
|
|
817
851
|
if (windowRef.current && windowPos.current) {
|
|
818
852
|
const window1 = windowRef.current;
|
|
819
853
|
const pos = windowPos.current;
|
|
@@ -821,24 +855,21 @@ const $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = (_param)=>{
|
|
|
821
855
|
pos.y += y;
|
|
822
856
|
window1.style.transform = `translate(${pos.x}px, ${pos.y}px)`;
|
|
823
857
|
}
|
|
824
|
-
}
|
|
825
|
-
|
|
858
|
+
};
|
|
859
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
860
|
+
const checkPosition = ()=>{
|
|
826
861
|
const chkPos = (0, $c986bcdcae4b83bd$export$d81cfea7c54be196)(windowRef);
|
|
827
862
|
move(chkPos.translateX, chkPos.translateY);
|
|
828
|
-
}
|
|
829
|
-
|
|
830
|
-
]);
|
|
831
|
-
const mouseMove = (0, $gTuX4$react.useCallback)((e)=>{
|
|
863
|
+
};
|
|
864
|
+
const mouseMove = (e)=>{
|
|
832
865
|
e.preventDefault();
|
|
833
866
|
e.stopPropagation();
|
|
834
867
|
move(e.movementX, e.movementY);
|
|
835
|
-
}
|
|
836
|
-
move
|
|
837
|
-
]);
|
|
868
|
+
};
|
|
838
869
|
// Store stable references to mouseMove and mouseUp for cleanup
|
|
839
870
|
const mouseMoveRef = (0, $gTuX4$react.useRef)(mouseMove);
|
|
840
871
|
const mouseUpRef = (0, $gTuX4$react.useRef)(()=>{});
|
|
841
|
-
const mouseUp = (
|
|
872
|
+
const mouseUp = (e)=>{
|
|
842
873
|
e.preventDefault();
|
|
843
874
|
e.stopPropagation();
|
|
844
875
|
setMoving(false);
|
|
@@ -850,24 +881,17 @@ const $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = (_param)=>{
|
|
|
850
881
|
resizeListenerRef.current = null;
|
|
851
882
|
}
|
|
852
883
|
if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement)) e.target.style.userSelect = "auto";
|
|
853
|
-
}
|
|
854
|
-
checkPosition
|
|
855
|
-
]);
|
|
884
|
+
};
|
|
856
885
|
// Update refs when callbacks change
|
|
857
886
|
(0, $gTuX4$react.useEffect)(()=>{
|
|
858
887
|
mouseMoveRef.current = mouseMove;
|
|
859
888
|
mouseUpRef.current = mouseUp;
|
|
860
|
-
}
|
|
861
|
-
mouseMove,
|
|
862
|
-
mouseUp
|
|
863
|
-
]);
|
|
889
|
+
});
|
|
864
890
|
// Helper function to push this window to the top
|
|
865
|
-
const pushToTop = (
|
|
891
|
+
const pushToTop = ()=>{
|
|
866
892
|
const maxZIndex = $46fb0088a1bbb6d8$var$getMaxZIndex(minZIndex);
|
|
867
893
|
setZIndex(maxZIndex + 1);
|
|
868
|
-
}
|
|
869
|
-
minZIndex
|
|
870
|
-
]);
|
|
894
|
+
};
|
|
871
895
|
// Sync windowInDOM with visible prop using a layout effect to avoid ESLint warnings
|
|
872
896
|
// This effect derives state from props, which is acceptable when there's no synchronous setState
|
|
873
897
|
(0, $gTuX4$react.useEffect)(()=>{
|
package/dist/cjs/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/main.ts","global.d.ts","src/components/index.ts","src/components/AutoHeight.tsx","src/components/AutoHeight.module.css","src/components/ClickForMenu.tsx","src/components/ContextMenu.tsx","src/components/ContextMenu.module.css","src/components/ContextMenuEntry.tsx","src/components/ContextSubMenu.tsx","src/components/ContextMenuHandler.tsx","src/components/LowMenu.tsx","src/components/LowMenu.module.css","src/components/LowMenuButton.tsx","src/components/LowSubMenu.tsx","src/components/ContextWindow.tsx","src/functions/chkPosition.ts","src/components/ContextWindow.module.css"],"sourcesContent":["import \"../global.d.ts\";\nexport * from \"./components\";\n","declare module \"*.module.css\" {\n const classes: { readonly [key: string]: string };\n export default classes;\n}\n\n// React 19 act() environment support\ndeclare global {\n var IS_REACT_ACT_ENVIRONMENT: boolean | undefined;\n}\n","import { AutoHeight } from \"./AutoHeight\";\nimport { ClickForMenu } from \"./ClickForMenu\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { ContextMenuHandler } from \"./ContextMenuHandler\";\nimport { ContextWindow } from \"./ContextWindow\";\nimport { IMenuItem } from \"./interface\";\n\nexport { AutoHeight, ClickForMenu, ContextMenu, ContextMenuHandler, ContextWindow };\nexport type { IMenuItem };\n","import { useCallback, useEffect, useMemo, useRef, useState, useTransition } from \"react\";\nimport styles from \"./AutoHeight.module.css\";\n\ninterface AutoHeightProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n hide?: boolean;\n duration?: number; // transition duration in ms\n}\n\nexport function AutoHeight({\n children,\n hide,\n duration = 300,\n ...rest\n}: AutoHeightProps): React.ReactElement {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState<number | null>(null);\n const targetChildren = useMemo<React.ReactNode>(\n () => (hide || !children ? <div style={{ height: \"1px\" }} /> : children),\n [children, hide],\n );\n\n const setTargetHeight = useCallback(() => {\n const inner = innerRef.current;\n\n // Initial draw to get the height of children and deployed children\n const deployedHeight = hide ? 1 : (inner?.offsetHeight ?? 0);\n setHeight(deployedHeight);\n }, [hide]);\n\n // Add ResizeObserver to update height on content resize, debounced\n useEffect(() => {\n const transition = innerRef.current;\n if (transition) {\n const observer = new ResizeObserver(() => {\n setTargetHeight();\n });\n\n observer.observe(transition);\n\n return () => {\n observer.disconnect();\n };\n }\n }, [setTargetHeight]);\n\n // Trigger height change on children update\n const [, startTransition] = useTransition();\n\n useEffect(() => {\n // Mark this update as non-urgent to avoid cascading render warnings\n startTransition(() => {\n setTargetHeight();\n });\n }, [setTargetHeight, children, startTransition]);\n\n return (\n <div\n {...rest}\n className={styles.autoHeightWrapper}\n ref={wrapperRef}\n style={{\n ...rest.style,\n height: height ? `${height}px` : \"auto\",\n transitionDuration: `${duration}ms`,\n }}\n >\n <div\n className={styles.autoHeightInner}\n ref={innerRef}\n >\n {targetChildren}\n </div>\n </div>\n );\n}\n\nAutoHeight.displayName = \"AutoHeight\";\n",".autoHeightWrapper {\n overflow: hidden;\n transition-timing-function: height ease-in-out width ease-in-out background-color ease-in-out;\n box-sizing: border-box;\n position: relative;\n}\n\n.autoHeightInner {\n height: fit-content;\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./ContextMenu.module.css\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface ClickForMenuProps extends React.HTMLAttributes<HTMLDivElement> {\n id: string;\n menuItems?: IMenuItem[];\n children?: React.ReactNode;\n}\n\nexport const ClickForMenu = ({\n id,\n menuItems,\n children,\n ...rest\n}: ClickForMenuProps): React.ReactElement => {\n // Menu state\n const [menuInDom, setMenuInDom] = useState<boolean>(false);\n const [menuVisible, setMenuVisible] = useState<boolean>(false);\n const [menuXPos, setMenuXPos] = useState<number>(0);\n const [menuYPos, setMenuYPos] = useState<number>(0);\n\n // Set up outsideClick handler\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n // Handle click off the menu\n const handleClick = useCallback((e: MouseEvent) => {\n if (\n menuRef.current &&\n ((e.target instanceof Element && !menuRef.current.contains(e.target)) ||\n !(e.target instanceof Element))\n ) {\n setMenuInDom(false);\n }\n }, []);\n\n const removeController = useRef<AbortController | null>(null);\n const removeTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n useEffect(() => {\n if (!menuVisible && removeTimeoutRef.current === null) {\n // Only create a new controller when scheduling a new timeout\n if (removeController.current) {\n removeController.current.abort();\n }\n removeController.current = new AbortController();\n const controller = removeController.current;\n // Set up the timeout with a reference to the current controller\n removeTimeoutRef.current = setTimeout(() => {\n if (!controller.signal.aborted) setMenuInDom(false);\n removeTimeoutRef.current = null;\n }, 300);\n }\n return () => {\n // Clean up on unmount or when menuVisible changes\n if (removeTimeoutRef.current) {\n clearTimeout(removeTimeoutRef.current);\n removeTimeoutRef.current = null;\n }\n };\n }, [menuVisible]);\n\n // Update the document click handler\n useEffect(() => {\n if (menuInDom) document.addEventListener(\"mousedown\", handleClick);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n if (removeController.current) {\n removeController.current.abort();\n }\n };\n }, [handleClick, menuInDom]);\n\n return (\n <>\n <div\n {...rest}\n id={id}\n onClick={(e) => {\n if (menuItems) {\n setMenuInDom(true);\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n if (removeController.current) {\n removeController.current.abort();\n }\n setMenuVisible(true);\n setMenuXPos(e.pageX);\n setMenuYPos(e.pageY);\n }, 1);\n } else {\n rest.onClick?.(e);\n }\n }}\n >\n {children}\n </div>\n {menuInDom &&\n menuItems &&\n createPortal(\n <div className={styles.anchor}>\n <ContextMenu\n visible={menuVisible}\n ref={menuRef}\n entries={menuItems}\n xPos={menuXPos}\n yPos={menuYPos}\n toClose={() => {\n setMenuVisible(false);\n }}\n />\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nClickForMenu.displayName = \"ClickForMenu\";\n","import React, { forwardRef, useLayoutEffect, useState } from \"react\";\nimport styles from \"./ContextMenu.module.css\";\nimport { ContextMenuEntry } from \"./ContextMenuEntry\";\nimport { IMenuItem } from \"./interface\";\n\n// Constants for menu size estimation when ref is not yet available\nconst ESTIMATED_MENU_ITEM_HEIGHT = 34;\nconst ESTIMATED_MENU_PADDING = 4;\nconst ESTIMATED_MENU_WIDTH = 200;\n\nexport interface ContextMenuProps {\n visible: boolean;\n entries: IMenuItem[];\n xPos: number;\n yPos: number;\n toClose: () => void;\n}\n\nexport const ContextMenu = forwardRef<HTMLDivElement, ContextMenuProps>(\n ({ visible, entries, xPos, yPos, toClose }, ref): React.ReactElement => {\n // Measure menu size after mount/render to avoid accessing refs during render\n const [menuHeight, setMenuHeight] = useState(\n entries.length * ESTIMATED_MENU_ITEM_HEIGHT + ESTIMATED_MENU_PADDING,\n );\n const [menuWidth, setMenuWidth] = useState(ESTIMATED_MENU_WIDTH);\n\n useLayoutEffect(() => {\n // Only measure when visible; ref access inside effect is allowed\n if (visible && ref && typeof ref !== \"function\" && ref.current instanceof HTMLDivElement) {\n setMenuHeight(ref.current.offsetHeight);\n setMenuWidth(ref.current.offsetWidth);\n }\n // When not visible, fall back to estimates\n if (!visible) {\n setMenuHeight(entries.length * ESTIMATED_MENU_ITEM_HEIGHT + ESTIMATED_MENU_PADDING);\n setMenuWidth(ESTIMATED_MENU_WIDTH);\n }\n }, [visible, entries, ref]);\n\n const adjustedYPos =\n yPos + menuHeight > window.innerHeight\n ? Math.max(window.innerHeight - menuHeight - ESTIMATED_MENU_PADDING, 0)\n : yPos;\n const adjustedXPos =\n xPos + menuWidth > window.innerWidth\n ? Math.max(window.innerWidth - menuWidth - ESTIMATED_MENU_PADDING, 0)\n : xPos;\n\n return (\n <div\n ref={ref}\n className={[styles.contextMenu, visible ? styles.visible : styles.hidden]\n .filter((c) => c !== \"\")\n .join(\" \")}\n style={{\n top: `${adjustedYPos}px`,\n left: `${adjustedXPos}px`,\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {entries.map((entry, i) => (\n <ContextMenuEntry\n key={i}\n entry={entry}\n toClose={toClose}\n />\n ))}\n </div>\n );\n },\n);\n\nContextMenu.displayName = \"ContextMenu\";\n",".anchor {\n position: absolute;\n top: 0;\n left: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\",\n \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", sans-serif;\n font-size: 9pt;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.contextMenuHandler {\n height: fit-content;\n width: fit-content;\n}\n\n.contextMenu {\n position: absolute;\n border: 1px solid;\n border-color: rgb(17, 20, 24);\n opacity: 1;\n background-color: rgb(251, 253, 246);\n z-index: 10000;\n box-shadow: 4px 4px 4px rgb(64, 64, 64, 0.75);\n transition: opacity 0.3s linear;\n}\n\n.contextMenu.hidden {\n opacity: 0;\n}\n\n.contextMenu.visible {\n opacity: 1;\n}\n\n.contextMenuItem {\n color: rgb(17, 20, 24);\n cursor: pointer;\n padding: 0 4px;\n min-width: 80px;\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n white-space: nowrap;\n}\n\n.contextMenuItem.disabled {\n background-color: rgba(0, 0, 0, 0.2);\n cursor: not-allowed;\n}\n\n.contextMenuItem:first-child {\n padding-top: 4px;\n}\n\n.contextMenuItem:last-child {\n padding-bottom: 4px;\n}\n\n.contextMenuItem:not(.disabled):hover {\n background-color: rgb(251, 233, 230);\n}\n\n.contextMenuItem .caretHolder {\n align-self: flex-end;\n}\n\n.contextMenuItem .caretHolder .subMenu {\n z-index: 1;\n position: relative;\n}\n\n.contextMenuItemLabel {\n flex-grow: 1;\n height: 19px;\n}\n","import { useState } from \"react\";\nimport styles from \"./ContextMenu.module.css\";\nimport { ContextSubMenu } from \"./ContextSubMenu\";\nimport { IMenuItem } from \"./interface\";\n\ninterface ContextMenuEntryProps {\n entry: IMenuItem;\n toClose: () => void;\n}\n\nexport const ContextMenuEntry = ({ entry, toClose }: ContextMenuEntryProps) => {\n const [target, setTarget] = useState<Range | null>(null);\n return (\n <div\n className={[styles.contextMenuItem, entry.disabled ? styles.disabled : \"\"]\n .filter((c) => c !== \"\")\n .join(\" \")}\n >\n {typeof entry.label === \"string\" ? (\n <span\n aria-label={entry.label}\n aria-disabled={entry.disabled}\n className={styles.contextMenuItemLabel}\n onMouseEnter={() => {\n const sel = window.getSelection();\n const target = sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null;\n setTarget(target);\n }}\n onMouseLeave={() => {\n setTarget(null);\n }}\n onMouseDownCapture={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!entry.disabled) {\n if (entry.action) {\n entry.action(target, e);\n }\n toClose();\n }\n }}\n >\n {entry.label}\n </span>\n ) : (\n entry.label\n )}\n {entry.group && (\n <ContextSubMenu\n toClose={toClose}\n entries={entry.group}\n />\n )}\n </div>\n );\n};\n","import { useState } from \"react\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./ContextMenu.module.css\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface ContextSubMenuProps {\n entries: IMenuItem[];\n toClose: () => void;\n lowMenu?: boolean;\n}\n\nexport const ContextSubMenu = ({ entries, toClose }: ContextSubMenuProps): React.ReactElement => {\n const [visible, setVisible] = useState<boolean>(false);\n return (\n <span\n className={styles.caretHolder}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <path d=\"m12.14 8.753-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z\" />\n </svg>\n {visible && (\n <div className={styles.subMenu}>\n <ContextMenu\n visible={true}\n entries={entries}\n xPos={14}\n yPos={-21}\n toClose={toClose}\n />\n </div>\n )}\n </span>\n );\n};\n\nContextSubMenu.displayName = \"ContextSubMenu\";\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./ContextMenu.module.css\";\nimport { LowMenu } from \"./LowMenu\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface ContentMenuHandlerContextProps {\n menuItems: IMenuItem[];\n}\nexport const ContentMenuHandlerContext = createContext<ContentMenuHandlerContextProps | null>(null);\n\nexport interface ContextMenuHandlerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n menuItems: IMenuItem[];\n showLowMenu?: boolean;\n}\n\nfunction isDivider(label: string | React.ReactElement): boolean {\n return typeof label !== \"string\" && label.type === \"hr\";\n}\n\nexport const ContextMenuHandler = ({\n children,\n menuItems,\n showLowMenu = false,\n ...rest\n}: ContextMenuHandlerProps): React.ReactElement => {\n // Check for higher content menu\n const higherContext = useContext(ContentMenuHandlerContext);\n const thisMenuItems = useMemo(\n () => [\n ...(higherContext !== null\n ? [\n ...higherContext.menuItems,\n ...[\n higherContext.menuItems.length > 0 &&\n !isDivider(higherContext.menuItems[higherContext.menuItems.length - 1].label) &&\n menuItems.length > 0 &&\n !isDivider(menuItems[0].label)\n ? {\n label: (\n <hr style={{ flexGrow: 1, cursor: \"none\", margin: \"0\", padding: \"0\" }} />\n ),\n }\n : null,\n ].filter((item) => item !== null),\n ]\n : []),\n ...menuItems,\n ],\n [higherContext, menuItems],\n );\n\n // Menu resources\n const divHandlderRef = useRef<HTMLDivElement | null>(null);\n const menuRef = useRef<HTMLDivElement | null>(null);\n const [menuXPos, setMenuXPos] = useState<number>(0);\n const [menuYPos, setMenuYPos] = useState<number>(0);\n const [menuVisible, setMenuVisible] = useState<boolean>(false);\n const [menuInDom, setMenuInDom] = useState<boolean>(false);\n const [mouseOverHandlerDiv, setMouseOverHandlerDiv] = useState<boolean>(false);\n const [mouseOverMenu, setMouseOverMenu] = useState<boolean>(false);\n\n // Holder position - measured in an effect to avoid reading refs during render\n const [divHandlerPos, setDivHandlerPos] = useState<DOMRect | null>(null);\n\n useLayoutEffect(() => {\n function updatePos() {\n if (divHandlderRef.current) {\n setDivHandlerPos(divHandlderRef.current.getBoundingClientRect());\n }\n }\n\n // When the handler is hovered or the menu is mounted, ensure we have a fresh position\n if (mouseOverHandlerDiv || menuInDom) {\n updatePos();\n }\n\n // Attach listeners while the menu/low-menu may be visible so the position stays correct\n if (mouseOverHandlerDiv || menuInDom) {\n window.addEventListener(\"resize\", updatePos);\n // listen on capture to catch scrolls from ancestor elements as well\n window.addEventListener(\"scroll\", updatePos, true);\n\n let ro: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\" && divHandlderRef.current) {\n ro = new ResizeObserver(() => updatePos());\n ro.observe(divHandlderRef.current);\n }\n\n return () => {\n window.removeEventListener(\"resize\", updatePos);\n window.removeEventListener(\"scroll\", updatePos, true);\n if (ro) ro.disconnect();\n };\n }\n }, [mouseOverHandlerDiv, menuInDom]);\n\n // Handle click off the menu\n const handleClick = useCallback((e: globalThis.MouseEvent) => {\n if (\n menuRef.current &&\n ((e.target instanceof Element && !menuRef.current?.contains(e.target)) ||\n !(e.target instanceof Element))\n ) {\n setMenuVisible(false);\n }\n }, []);\n\n // Update the document click handler\n useEffect(() => {\n if (menuVisible) document.addEventListener(\"mousedown\", handleClick);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n };\n }, [handleClick, menuVisible]);\n\n const removeController = useRef<AbortController>(new AbortController());\n useEffect(() => {\n if (!mouseOverMenu && !menuVisible && !mouseOverHandlerDiv) {\n removeController.current.abort();\n removeController.current = new AbortController();\n setTimeout(() => {\n if (!removeController.current.signal.aborted) setMenuInDom(false);\n }, 300);\n }\n }, [mouseOverHandlerDiv, menuVisible, mouseOverMenu]);\n\n return (\n <ContentMenuHandlerContext.Provider\n value={{\n menuItems: thisMenuItems,\n }}\n >\n <div\n ref={divHandlderRef}\n {...rest}\n className={[styles.contextMenuHandler, rest.className].join(\" \")}\n onContextMenu={async (e) => {\n if (!showLowMenu) {\n setMenuInDom(true);\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n removeController.current.abort();\n setMenuVisible(true);\n setMenuXPos(e.pageX);\n setMenuYPos(e.pageY);\n }, 1);\n }\n }}\n onMouseEnter={async (e) => {\n if (showLowMenu) {\n setMenuInDom(true);\n setMouseOverHandlerDiv(false);\n setTimeout(() => {\n removeController.current.abort();\n setMouseOverHandlerDiv(true);\n }, 1);\n }\n rest.onMouseEnter?.(e);\n }}\n onMouseLeave={async (e) => {\n if (showLowMenu) {\n removeController.current.abort();\n removeController.current = new AbortController();\n setMouseOverHandlerDiv(false);\n }\n rest.onMouseLeave?.(e);\n }}\n >\n {children}\n </div>\n {menuInDom &&\n divHandlerPos &&\n createPortal(\n <div\n className={styles.anchor}\n onMouseEnter={() => {\n removeController.current.abort();\n setMouseOverMenu(true);\n }}\n onMouseLeave={() => {\n removeController.current.abort();\n removeController.current = new AbortController();\n setMouseOverMenu(false);\n }}\n >\n {showLowMenu ? (\n <LowMenu\n visible={mouseOverHandlerDiv}\n entries={menuItems}\n xPos={divHandlerPos.left}\n yPos={divHandlerPos.bottom}\n maxWidth={divHandlerPos.width}\n />\n ) : (\n <ContextMenu\n visible={menuVisible}\n ref={menuRef}\n entries={thisMenuItems}\n xPos={menuXPos}\n yPos={menuYPos}\n toClose={() => {\n setMenuVisible(false);\n setMouseOverMenu(false);\n }}\n />\n )}\n </div>,\n document.body,\n )}\n </ContentMenuHandlerContext.Provider>\n );\n};\n\nContextMenuHandler.displayName = \"ContextMenuHandler\";\n","import styles from \"./LowMenu.module.css\";\nimport { LowMenuButton } from \"./LowMenuButton\";\nimport { IMenuItem } from \"./interface\";\n\ninterface LowMenuProps {\n entries: IMenuItem[];\n visible: boolean;\n xPos: number;\n yPos: number;\n maxWidth: number;\n}\n\nexport const LowMenu = ({\n entries,\n visible,\n xPos,\n yPos,\n maxWidth,\n}: LowMenuProps): React.ReactElement => {\n // Only show the low menu if it is on the screen\n if (xPos >= window.innerWidth || yPos >= window.innerHeight) return <></>;\n // Show the menu\n return (\n <div\n className={[styles.lowMenu, visible ? styles.visible : styles.hidden].join(\" \")}\n aria-label=\"Low context menu\"\n style={{\n left: `${xPos}px`,\n top: `${yPos}px`,\n maxWidth: `calc(${maxWidth}px)`,\n width: `calc(${maxWidth}px - 4px)`,\n }}\n >\n <div className={styles.lowMenuButtonHolder}>\n {entries.map((e, i) => (\n <LowMenuButton\n key={i}\n entry={e}\n />\n ))}\n </div>\n </div>\n );\n};\n\nLowMenu.displayName = \"LowMenu\";\n",".lowMenu {\n z-index: 2;\n position: absolute;\n margin: 0px;\n transition: opacity 0.3s linear;\n}\n\n.lowMenuButtonHolder {\n border: 2px solid rgb(17, 20, 24);\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n background-color: rgb(17, 20, 24);\n box-shadow: 2px 2px 2px rgb(64, 64, 64, 0.5);\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n gap: 2px;\n row-gap: 2px;\n width: fit-content;\n}\n\n.lowMenu.hidden {\n opacity: 0;\n}\n\n.lowMenu.visible,\n.lowMenu:hover {\n opacity: 1;\n}\n\n.lowMenuItem {\n background-color: rgb(251, 253, 246);\n border: 0;\n color: rgb(17, 20, 24);\n cursor: pointer;\n padding: 0 4px;\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n white-space: nowrap;\n}\n\n.lowMenuItem.disabled {\n background-color: rgba(200, 200, 200);\n cursor: not-allowed;\n}\n\n.lowMenuItem:not(.disabled):hover {\n background-color: rgb(251, 233, 230);\n}\n\n.lowMenu-item .caretHolder {\n align-self: flex-end;\n}\n\n.lowMenuItem .caretHolder .subMenu {\n z-index: 1;\n position: relative;\n}\n","import { useState } from \"react\";\nimport styles from \"./LowMenu.module.css\";\nimport { LowSubMenu } from \"./LowSubMenu\";\nimport { IMenuItem } from \"./interface\";\n\ninterface LowMenuButtonProps {\n entry: IMenuItem;\n}\nexport const LowMenuButton = ({ entry }: LowMenuButtonProps) => {\n const [target, setTarget] = useState<Range | null>(null);\n return (\n <div\n className={[styles.lowMenuItem, entry.disabled ? styles.disabled : \"\"]\n .filter((c) => c !== \"\")\n .join(\" \")}\n aria-label={typeof entry.label === \"string\" ? entry.label : undefined}\n aria-disabled={entry.disabled}\n onMouseEnter={() => {\n const sel = window.getSelection();\n const target = sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null;\n setTarget(target);\n }}\n onMouseLeave={() => {\n setTarget(null);\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!entry.disabled) entry.action?.(target);\n }}\n >\n <span>{entry.label}</span>\n {entry.group && <LowSubMenu entry={entry} />}\n </div>\n );\n};\n\nLowMenuButton.displayName = \"LowMenuButton\";\n","import { useState } from \"react\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./LowMenu.module.css\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface LowSubMenuProps {\n entry: IMenuItem;\n lowMenu?: boolean;\n}\n\nexport const LowSubMenu = ({ entry }: LowSubMenuProps): React.ReactElement => {\n const [visible, setVisible] = useState<boolean>(false);\n if (!entry.group || entry.group.length === 0) return <></>;\n return (\n <span\n aria-label={`Sub menu for ${entry.label}`}\n className={styles.caretHolder}\n onMouseEnter={() => {\n setVisible(true);\n }}\n onMouseLeave={() => {\n setVisible(false);\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <path d=\"m12.14 8.753-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z\" />\n </svg>\n <div className={styles.subMenu}>\n {visible && (\n <ContextMenu\n visible={visible}\n entries={entry.group}\n xPos={14}\n yPos={entry.group.length * -21 - 8}\n toClose={() => setVisible(false)}\n />\n )}\n </div>\n </span>\n );\n};\n\nLowSubMenu.displayName = \"LowSubMenu\";\n","import { ReactNode, useCallback, useEffect, useRef, useState, useTransition } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { chkPosition } from \"../functions/chkPosition\";\nimport styles from \"./ContextWindow.module.css\";\n\nexport const MIN_Z_INDEX = 3000;\nconst CONTEXT_WINDOW_DATA_ATTR = \"data-context-window\";\n\nexport interface ContextWindowProps extends React.HTMLAttributes<HTMLDivElement> {\n id: string;\n visible: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n title: string;\n titleElement?: ReactNode;\n style?: React.CSSProperties;\n children: React.ReactNode;\n minZIndex?: number;\n}\n\n// Helper function to get the highest zIndex from all context windows in the DOM\nconst getMaxZIndex = (componentMinZIndex: number): number => {\n const windows = document.body.querySelectorAll(`[${CONTEXT_WINDOW_DATA_ATTR}]`);\n let maxZIndex = componentMinZIndex - 1;\n windows.forEach((win) => {\n const zIndexStr = (win as HTMLElement).style.zIndex;\n if (zIndexStr) {\n const zIndex = parseInt(zIndexStr, 10);\n if (!isNaN(zIndex) && zIndex > maxZIndex) {\n maxZIndex = zIndex;\n }\n }\n });\n return maxZIndex;\n};\n\nexport const ContextWindow = ({\n id,\n visible,\n title,\n titleElement,\n children,\n onOpen,\n onClose,\n minZIndex = MIN_Z_INDEX,\n ...rest\n}: ContextWindowProps): React.ReactElement => {\n const divRef = useRef<HTMLDivElement | null>(null);\n const windowRef = useRef<HTMLDivElement | null>(null);\n const [zIndex, setZIndex] = useState<number>(minZIndex);\n const resizeListenerRef = useRef<(() => void) | null>(null);\n\n // Track internal state: whether window is in DOM and whether it's been positioned\n const [windowInDOM, setWindowInDOM] = useState<boolean>(false);\n const [windowVisible, setWindowVisible] = useState<boolean>(false);\n const [, startTransition] = useTransition();\n\n // Position\n const windowPos = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const [moving, setMoving] = useState<boolean>(false);\n\n const move = useCallback((x: number, y: number) => {\n if (windowRef.current && windowPos.current) {\n const window = windowRef.current;\n const pos = windowPos.current;\n pos.x += x;\n pos.y += y;\n window.style.transform = `translate(${pos.x}px, ${pos.y}px)`;\n }\n }, []);\n\n const checkPosition = useCallback(() => {\n const chkPos = chkPosition(windowRef);\n move(chkPos.translateX, chkPos.translateY);\n }, [move]);\n\n const mouseMove = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n move(e.movementX, e.movementY);\n },\n [move],\n );\n\n // Store stable references to mouseMove and mouseUp for cleanup\n const mouseMoveRef = useRef(mouseMove);\n const mouseUpRef = useRef<(e: MouseEvent) => void>(() => {});\n\n const mouseUp = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setMoving(false);\n checkPosition();\n document.removeEventListener(\"mousemove\", mouseMoveRef.current);\n document.removeEventListener(\"mouseup\", mouseUpRef.current);\n if (resizeListenerRef.current) {\n window.removeEventListener(\"resize\", resizeListenerRef.current);\n resizeListenerRef.current = null;\n }\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = \"auto\";\n },\n [checkPosition],\n );\n\n // Update refs when callbacks change\n useEffect(() => {\n mouseMoveRef.current = mouseMove;\n mouseUpRef.current = mouseUp;\n }, [mouseMove, mouseUp]);\n\n // Helper function to push this window to the top\n const pushToTop = useCallback(() => {\n const maxZIndex = getMaxZIndex(minZIndex);\n setZIndex(maxZIndex + 1);\n }, [minZIndex]);\n\n // Sync windowInDOM with visible prop using a layout effect to avoid ESLint warnings\n // This effect derives state from props, which is acceptable when there's no synchronous setState\n useEffect(() => {\n if (visible && !windowInDOM) {\n // Window should be in DOM when visible becomes true\n startTransition(() => {\n setWindowInDOM(true);\n });\n } else if (!visible && windowInDOM) {\n // Window should leave DOM when visible becomes false\n startTransition(() => {\n setWindowInDOM(false);\n setWindowVisible(false);\n });\n }\n }, [visible, windowInDOM, startTransition]);\n\n // Position and show window after it's added to DOM\n useEffect(() => {\n if (windowInDOM && !windowVisible && visible && divRef.current && windowRef.current) {\n // Position the window\n const parentPos = divRef.current.getBoundingClientRect();\n const pos = windowRef.current.getBoundingClientRect();\n const windowHeight = pos.bottom - pos.top;\n windowRef.current.style.left = `${parentPos.left}px`;\n windowRef.current.style.top = `${\n parentPos.bottom + windowHeight < window.innerHeight\n ? parentPos.bottom\n : Math.max(0, parentPos.top - windowHeight)\n }px`;\n windowRef.current.style.transform = \"\";\n windowPos.current = { x: 0, y: 0 };\n checkPosition();\n\n // Update z-index and make visible - use startTransition\n const maxZ = getMaxZIndex(minZIndex);\n onOpen?.();\n startTransition(() => {\n setZIndex(maxZ + 1);\n setWindowVisible(true);\n });\n }\n }, [windowInDOM, windowVisible, visible, checkPosition, minZIndex, onOpen, startTransition]);\n\n // Cleanup effect to remove event listeners on unmount\n useEffect(() => {\n return () => {\n // Clean up event listeners if component unmounts while dragging\n document.removeEventListener(\"mousemove\", mouseMoveRef.current);\n document.removeEventListener(\"mouseup\", mouseUpRef.current);\n if (resizeListenerRef.current) {\n window.removeEventListener(\"resize\", resizeListenerRef.current);\n resizeListenerRef.current = null;\n }\n };\n }, []);\n\n return (\n <div\n className={styles.contextWindowAnchor}\n ref={divRef}\n >\n {windowInDOM &&\n createPortal(\n <div\n {...rest}\n ref={windowRef}\n id={id}\n {...{ [CONTEXT_WINDOW_DATA_ATTR]: \"true\" }}\n className={[styles.contextWindow, rest.className].filter((c) => c).join(\" \")}\n style={{\n ...rest.style,\n opacity: moving ? 0.8 : windowVisible ? 1 : 0,\n visibility: windowVisible ? \"visible\" : \"hidden\",\n zIndex: zIndex,\n minHeight: rest.style?.minHeight ?? \"150px\",\n minWidth: rest.style?.minWidth ?? \"200px\",\n maxHeight: rest.style?.maxHeight ?? \"1000px\",\n maxWidth: rest.style?.maxWidth ?? \"1000px\",\n }}\n onClickCapture={(e) => {\n pushToTop();\n rest.onClickCapture?.(e);\n }}\n >\n <div\n className={[styles.contextWindowTitle, moving ? styles.moving : \"\"]\n .filter((c) => c !== \"\")\n .join(\" \")}\n onMouseDown={(e: React.MouseEvent) => {\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = \"none\";\n setMoving(true);\n pushToTop();\n document.addEventListener(\"mouseup\", mouseUpRef.current);\n document.addEventListener(\"mousemove\", mouseMoveRef.current);\n const resizeListener = () => checkPosition();\n resizeListenerRef.current = resizeListener;\n window.addEventListener(\"resize\", resizeListener);\n }}\n >\n <div\n className={styles.contextWindowTitleText}\n title={title}\n >\n {titleElement ? titleElement : title}\n </div>\n <div\n className={styles.contextWindowTitleClose}\n role=\"button\"\n aria-label=\"Close\"\n onClick={onClose}\n title={`Close ${title && title.trim() !== \"\" ? title : \"window\"}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\" />\n </svg>\n </div>\n </div>\n <div className={styles.contextWindowBody}>\n <div>{children}</div>\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n};\n\nContextWindow.displayName = \"ContextWindow\";\n","import { RefObject } from \"react\";\n\n/**\n * Check that an existing div is inside the viewport\n * @param divRef Check div is inside view port, and return n\n * @returns \\{ translateX, translateY \\} Amount to move on X and Y axis\n */\nexport const chkPosition = (\n divRef: RefObject<HTMLDivElement | null>,\n): { translateX: number; translateY: number } => {\n if (!divRef.current) {\n return { translateX: 0, translateY: 0 };\n } else {\n const innerBounce = 16;\n const posn = divRef.current.getBoundingClientRect();\n let translateX = 0;\n if (posn.left < innerBounce) {\n translateX = -posn.left + innerBounce;\n } else if (posn.right > window.innerWidth) {\n translateX = Math.max(-posn.left + innerBounce, window.innerWidth - posn.right - innerBounce);\n }\n let translateY = 0;\n if (posn.top < innerBounce) {\n translateY = -posn.top + innerBounce;\n } else if (posn.bottom > window.innerHeight) {\n translateY = Math.max(\n -posn.top + innerBounce,\n window.innerHeight - posn.bottom - innerBounce,\n );\n }\n return { translateX, translateY };\n }\n};\n",".contextWindowAnchor {\n position: relative;\n}\n\n.contextWindow {\n z-index: 2001;\n border: 1px black solid;\n margin: 0;\n padding: 4px;\n background-color: rgb(250, 250, 250);\n box-shadow: 6px 6px 6px rgb(64, 64, 64, 0.5);\n transition: opacity 0.25s linear;\n justify-content: flex-start;\n position: absolute;\n border-top-left-radius: 8px;\n border-top-right-radius: 8px;\n border-bottom-left-radius: 8px;\n resize: both;\n overflow: auto;\n max-height: 95vh;\n max-width: 95vw;\n}\n\n.contextWindowTitle {\n border-bottom: 1px black dashed;\n box-sizing: unset;\n padding-bottom: 4px;\n margin: 0 4px 3px 4px;\n height: 24px;\n line-height: 24px;\n max-height: 24px;\n cursor: grab;\n font-size: 18px;\n font-weight: 600;\n display: flex;\n flex-direction: row;\n align-items: center;\n width: calc(100% - 8px);\n}\n\n.contextWindowTitle.moving {\n cursor: grabbing;\n}\n\n.contextWindowTitleText {\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: calc(100% - 16px);\n}\n\n.contextWindowTitleClose {\n display: flex;\n color: black;\n height: 16px;\n width: 16px;\n border-radius: 3px;\n margin-left: 2px;\n cursor: pointer;\n line-height: 16px;\n}\n\n.contextWindowTitleClose:hover {\n background-color: black;\n color: white;\n}\n\n.contextWindowBody {\n overflow: auto;\n padding-bottom: 8px;\n margin-right: 4px;\n height: calc(100% - 40px);\n}\n\n.contextWindowBody::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.contextWindowBody::-webkit-scrollbar-track {\n background: white;\n border-radius: 8px;\n}\n\n.contextWindowBody::-webkit-scrollbar-thumb {\n background: lightgrey;\n border: none;\n border-radius: 8px;\n}\n\n.contextWindowBody::-webkit-scrollbar-thumb:hover {\n background: grey;\n}\n"],"names":[],"version":3,"file":"main.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["src/main.ts","global.d.ts","src/components/index.ts","src/components/AutoHeight.tsx","src/components/AutoHeight.module.css","src/components/ClickForMenu.tsx","src/components/ContextMenu.tsx","src/components/ContextMenu.module.css","src/components/ContextMenuEntry.tsx","src/components/ContextSubMenu.tsx","src/components/ContextMenuHandler.tsx","src/components/LowMenu.tsx","src/components/LowMenu.module.css","src/components/LowMenuButton.tsx","src/components/LowSubMenu.tsx","src/components/ContextWindow.tsx","src/functions/chkPosition.ts","src/components/ContextWindow.module.css"],"sourcesContent":["import \"../global.d.ts\";\nexport * from \"./components\";\n","declare module \"*.module.css\" {\n const classes: { readonly [key: string]: string };\n export default classes;\n}\n\n// React 19 act() environment support\ndeclare global {\n var IS_REACT_ACT_ENVIRONMENT: boolean | undefined;\n}\n","import { AutoHeight } from \"./AutoHeight\";\nimport { ClickForMenu } from \"./ClickForMenu\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { ContextMenuHandler } from \"./ContextMenuHandler\";\nimport { ContextWindow } from \"./ContextWindow\";\nimport { IMenuItem } from \"./interface\";\n\nexport { AutoHeight, ClickForMenu, ContextMenu, ContextMenuHandler, ContextWindow };\nexport type { IMenuItem };\n","import { useEffect, useEffectEvent, useLayoutEffect, useRef, useState } from \"react\";\nimport styles from \"./AutoHeight.module.css\";\n\ninterface AutoHeightProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n hide?: boolean;\n duration?: number; // transition duration in ms\n}\n\ntype AnimationState = \"closed\" | \"opening\" | \"open\" | \"closing\";\n\nexport function AutoHeight({\n children,\n hide = false,\n duration = 300,\n ...rest\n}: AutoHeightProps): React.ReactElement {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState<number | null>(null);\n const [animationState, setAnimationState] = useState<AnimationState>(!hide ? \"open\" : \"closed\");\n\n const rafRef = useRef<number | null>(null);\n const timeoutRef = useRef<number | null>(null);\n\n const targetChildren: React.ReactNode =\n animationState === \"closed\" || !children ? null : children;\n\n const setTargetHeight = useEffectEvent((newHeight: number) => {\n setHeight(newHeight);\n });\n\n const transitionToOpening = useEffectEvent((): void => {\n // Cancel any pending close timeout\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n\n setAnimationState(\"opening\");\n\n const id = window.requestAnimationFrame(() => {\n rafRef.current = null;\n setTargetHeight(1);\n\n const frameId = window.requestAnimationFrame(() => {\n const inner = innerRef.current;\n if (inner) {\n setTargetHeight(inner.offsetHeight);\n setAnimationState(\"open\");\n }\n });\n rafRef.current = frameId;\n });\n rafRef.current = id;\n });\n\n const transitionToClosing = useEffectEvent((): void => {\n // Cancel any pending RAF\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n\n setAnimationState(\"closing\");\n setTargetHeight(1);\n\n timeoutRef.current = window.setTimeout(() => {\n timeoutRef.current = null;\n setAnimationState(\"closed\");\n }, duration);\n });\n\n useLayoutEffect(() => {\n if (!hide) {\n // Want to show: transition to open\n if (animationState === \"closed\" || animationState === \"closing\") {\n transitionToOpening();\n }\n // If already opening or open, stay in that state\n } else {\n // Want to hide: transition to closed\n if (animationState === \"open\" || animationState === \"opening\") {\n transitionToClosing();\n }\n }\n }, [hide, animationState]);\n\n // Setup ResizeObserver to track content size changes\n useEffect(() => {\n const transition = innerRef.current;\n if (transition) {\n const observer = new ResizeObserver(() => {\n if (animationState === \"open\") {\n setTargetHeight(transition!.offsetHeight);\n }\n });\n\n observer.observe(transition!);\n\n return () => {\n observer.disconnect();\n };\n }\n }, [animationState]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n };\n }, []);\n\n return (\n <div\n {...rest}\n className={styles.autoHeightWrapper}\n ref={wrapperRef}\n style={{\n ...rest.style,\n display: animationState === \"closed\" ? \"none\" : undefined,\n height: height ? `${height}px` : \"auto\",\n transitionDuration: `${duration}ms`,\n }}\n >\n <div\n className={styles.autoHeightInner}\n ref={innerRef}\n >\n {targetChildren}\n </div>\n </div>\n );\n}\n\nAutoHeight.displayName = \"AutoHeight\";\n",".autoHeightWrapper {\n overflow: hidden;\n transition-timing-function: height ease-in-out width ease-in-out background-color ease-in-out;\n box-sizing: border-box;\n position: relative;\n}\n\n.autoHeightInner {\n height: fit-content;\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./ContextMenu.module.css\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface ClickForMenuProps extends React.HTMLAttributes<HTMLDivElement> {\n id: string;\n menuItems?: IMenuItem[];\n children?: React.ReactNode;\n}\n\nexport const ClickForMenu = ({\n id,\n menuItems,\n children,\n ...rest\n}: ClickForMenuProps): React.ReactElement => {\n // Menu state\n const [menuInDom, setMenuInDom] = useState<boolean>(false);\n const [menuVisible, setMenuVisible] = useState<boolean>(false);\n const [menuXPos, setMenuXPos] = useState<number>(0);\n const [menuYPos, setMenuYPos] = useState<number>(0);\n\n // Set up outsideClick handler\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n // Handle click off the menu\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleClick = (e: MouseEvent) => {\n if (\n menuRef.current &&\n ((e.target instanceof Element && !menuRef.current.contains(e.target)) ||\n !(e.target instanceof Element))\n ) {\n setMenuInDom(false);\n }\n };\n\n const removeController = useRef<AbortController | null>(null);\n const removeTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n useEffect(() => {\n if (!menuVisible && removeTimeoutRef.current === null) {\n // Only create a new controller when scheduling a new timeout\n if (removeController.current) {\n removeController.current.abort();\n }\n removeController.current = new AbortController();\n const controller = removeController.current;\n // Set up the timeout with a reference to the current controller\n removeTimeoutRef.current = setTimeout(() => {\n if (!controller.signal.aborted) setMenuInDom(false);\n removeTimeoutRef.current = null;\n }, 300);\n }\n return () => {\n // Clean up on unmount or when menuVisible changes\n if (removeTimeoutRef.current) {\n clearTimeout(removeTimeoutRef.current);\n removeTimeoutRef.current = null;\n }\n };\n }, [menuVisible]);\n\n // Update the document click handler\n useEffect(() => {\n if (menuInDom) document.addEventListener(\"mousedown\", handleClick);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n if (removeController.current) {\n removeController.current.abort();\n }\n };\n }, [handleClick, menuInDom]);\n\n return (\n <>\n <div\n {...rest}\n id={id}\n onClick={(e) => {\n if (menuItems) {\n setMenuInDom(true);\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n if (removeController.current) {\n removeController.current.abort();\n }\n setMenuVisible(true);\n setMenuXPos(e.pageX);\n setMenuYPos(e.pageY);\n }, 1);\n } else {\n rest.onClick?.(e);\n }\n }}\n >\n {children}\n </div>\n {menuInDom &&\n menuItems &&\n createPortal(\n <div className={styles.anchor}>\n <ContextMenu\n visible={menuVisible}\n ref={menuRef}\n entries={menuItems}\n xPos={menuXPos}\n yPos={menuYPos}\n toClose={() => {\n setMenuVisible(false);\n }}\n />\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nClickForMenu.displayName = \"ClickForMenu\";\n","import React, { forwardRef, useLayoutEffect, useState } from \"react\";\nimport styles from \"./ContextMenu.module.css\";\nimport { ContextMenuEntry } from \"./ContextMenuEntry\";\nimport { IMenuItem } from \"./interface\";\n\n// Constants for menu size estimation when ref is not yet available\nconst ESTIMATED_MENU_ITEM_HEIGHT = 34;\nconst ESTIMATED_MENU_PADDING = 4;\nconst ESTIMATED_MENU_WIDTH = 200;\n\nexport interface ContextMenuProps {\n visible: boolean;\n entries: IMenuItem[];\n xPos: number;\n yPos: number;\n toClose: () => void;\n}\n\nexport const ContextMenu = forwardRef<HTMLDivElement, ContextMenuProps>(\n ({ visible, entries, xPos, yPos, toClose }, ref): React.ReactElement => {\n // Measure menu size after mount/render to avoid accessing refs during render\n const [menuHeight, setMenuHeight] = useState(\n entries.length * ESTIMATED_MENU_ITEM_HEIGHT + ESTIMATED_MENU_PADDING,\n );\n const [menuWidth, setMenuWidth] = useState(ESTIMATED_MENU_WIDTH);\n\n useLayoutEffect(() => {\n // Only measure when visible; ref access inside effect is allowed\n if (visible && ref && typeof ref !== \"function\" && ref.current instanceof HTMLDivElement) {\n setMenuHeight(ref.current.offsetHeight);\n setMenuWidth(ref.current.offsetWidth);\n }\n // When not visible, fall back to estimates\n if (!visible) {\n setMenuHeight(entries.length * ESTIMATED_MENU_ITEM_HEIGHT + ESTIMATED_MENU_PADDING);\n setMenuWidth(ESTIMATED_MENU_WIDTH);\n }\n }, [visible, entries, ref]);\n\n const adjustedYPos =\n yPos + menuHeight > window.innerHeight\n ? Math.max(window.innerHeight - menuHeight - ESTIMATED_MENU_PADDING, 0)\n : yPos;\n const adjustedXPos =\n xPos + menuWidth > window.innerWidth\n ? Math.max(window.innerWidth - menuWidth - ESTIMATED_MENU_PADDING, 0)\n : xPos;\n\n return (\n <div\n ref={ref}\n className={[styles.contextMenu, visible ? styles.visible : styles.hidden]\n .filter((c) => c !== \"\")\n .join(\" \")}\n style={{\n top: `${adjustedYPos}px`,\n left: `${adjustedXPos}px`,\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {entries.map((entry, i) => (\n <ContextMenuEntry\n key={i}\n entry={entry}\n toClose={toClose}\n />\n ))}\n </div>\n );\n },\n);\n\nContextMenu.displayName = \"ContextMenu\";\n",".anchor {\n position: absolute;\n top: 0;\n left: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\",\n \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", sans-serif;\n font-size: 9pt;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.contextMenuHandler {\n height: fit-content;\n width: fit-content;\n}\n\n.contextMenu {\n position: absolute;\n border: 1px solid;\n border-color: rgb(17, 20, 24);\n opacity: 1;\n background-color: rgb(251, 253, 246);\n z-index: 10000;\n box-shadow: 4px 4px 4px rgb(64, 64, 64, 0.75);\n transition: opacity 0.3s linear;\n}\n\n.contextMenu.hidden {\n opacity: 0;\n}\n\n.contextMenu.visible {\n opacity: 1;\n}\n\n.contextMenuItem {\n color: rgb(17, 20, 24);\n cursor: pointer;\n padding: 0 4px;\n min-width: 80px;\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n white-space: nowrap;\n}\n\n.contextMenuItem.disabled {\n background-color: rgba(0, 0, 0, 0.2);\n cursor: not-allowed;\n}\n\n.contextMenuItem:first-child {\n padding-top: 4px;\n}\n\n.contextMenuItem:last-child {\n padding-bottom: 4px;\n}\n\n.contextMenuItem:not(.disabled):hover {\n background-color: rgb(251, 233, 230);\n}\n\n.contextMenuItem .caretHolder {\n align-self: flex-end;\n}\n\n.contextMenuItem .caretHolder .subMenu {\n z-index: 1;\n position: relative;\n}\n\n.contextMenuItemLabel {\n flex-grow: 1;\n height: 19px;\n}\n","import { useState } from \"react\";\nimport styles from \"./ContextMenu.module.css\";\nimport { ContextSubMenu } from \"./ContextSubMenu\";\nimport { IMenuItem } from \"./interface\";\n\ninterface ContextMenuEntryProps {\n entry: IMenuItem;\n toClose: () => void;\n}\n\nexport const ContextMenuEntry = ({ entry, toClose }: ContextMenuEntryProps) => {\n const [target, setTarget] = useState<Range | null>(null);\n return (\n <div\n className={[styles.contextMenuItem, entry.disabled ? styles.disabled : \"\"]\n .filter((c) => c !== \"\")\n .join(\" \")}\n >\n {typeof entry.label === \"string\" ? (\n <span\n aria-label={entry.label}\n aria-disabled={entry.disabled}\n className={styles.contextMenuItemLabel}\n onMouseEnter={() => {\n const sel = window.getSelection();\n const target = sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null;\n setTarget(target);\n }}\n onMouseLeave={() => {\n setTarget(null);\n }}\n onMouseDownCapture={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!entry.disabled) {\n if (entry.action) {\n entry.action(target, e);\n }\n toClose();\n }\n }}\n >\n {entry.label}\n </span>\n ) : (\n entry.label\n )}\n {entry.group && (\n <ContextSubMenu\n toClose={toClose}\n entries={entry.group}\n />\n )}\n </div>\n );\n};\n","import { useState } from \"react\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./ContextMenu.module.css\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface ContextSubMenuProps {\n entries: IMenuItem[];\n toClose: () => void;\n lowMenu?: boolean;\n}\n\nexport const ContextSubMenu = ({ entries, toClose }: ContextSubMenuProps): React.ReactElement => {\n const [visible, setVisible] = useState<boolean>(false);\n return (\n <span\n className={styles.caretHolder}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <path d=\"m12.14 8.753-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z\" />\n </svg>\n {visible && (\n <div className={styles.subMenu}>\n <ContextMenu\n visible={true}\n entries={entries}\n xPos={14}\n yPos={-21}\n toClose={toClose}\n />\n </div>\n )}\n </span>\n );\n};\n\nContextSubMenu.displayName = \"ContextSubMenu\";\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./ContextMenu.module.css\";\nimport { LowMenu } from \"./LowMenu\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface ContentMenuHandlerContextProps {\n menuItems: IMenuItem[];\n}\nexport const ContentMenuHandlerContext = createContext<ContentMenuHandlerContextProps | null>(null);\n\nexport interface ContextMenuHandlerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n menuItems: IMenuItem[];\n showLowMenu?: boolean;\n}\n\nfunction isDivider(label: string | React.ReactElement): boolean {\n return typeof label !== \"string\" && label.type === \"hr\";\n}\n\nexport const ContextMenuHandler = ({\n children,\n menuItems,\n showLowMenu = false,\n ...rest\n}: ContextMenuHandlerProps): React.ReactElement => {\n // Check for higher content menu\n const higherContext = useContext(ContentMenuHandlerContext);\n const thisMenuItems: IMenuItem[] = [\n ...(higherContext !== null\n ? [\n ...higherContext.menuItems,\n ...[\n higherContext.menuItems.length > 0 &&\n !isDivider(higherContext.menuItems[higherContext.menuItems.length - 1].label) &&\n menuItems.length > 0 &&\n !isDivider(menuItems[0].label)\n ? {\n label: <hr style={{ flexGrow: 1, cursor: \"none\", margin: \"0\", padding: \"0\" }} />,\n }\n : null,\n ].filter((item) => item !== null),\n ]\n : []),\n ...menuItems,\n ];\n\n // Menu resources\n const divHandlderRef = useRef<HTMLDivElement | null>(null);\n const menuRef = useRef<HTMLDivElement | null>(null);\n const [menuXPos, setMenuXPos] = useState<number>(0);\n const [menuYPos, setMenuYPos] = useState<number>(0);\n const [menuVisible, setMenuVisible] = useState<boolean>(false);\n const [menuInDom, setMenuInDom] = useState<boolean>(false);\n const [mouseOverHandlerDiv, setMouseOverHandlerDiv] = useState<boolean>(false);\n const [mouseOverMenu, setMouseOverMenu] = useState<boolean>(false);\n\n // Holder position - measured in an effect to avoid reading refs during render\n const [divHandlerPos, setDivHandlerPos] = useState<DOMRect | null>(null);\n\n useLayoutEffect(() => {\n function updatePos() {\n if (divHandlderRef.current) {\n setDivHandlerPos(divHandlderRef.current.getBoundingClientRect());\n }\n }\n\n // When the handler is hovered or the menu is mounted, ensure we have a fresh position\n if (mouseOverHandlerDiv || menuInDom) {\n updatePos();\n }\n\n // Attach listeners while the menu/low-menu may be visible so the position stays correct\n if (mouseOverHandlerDiv || menuInDom) {\n window.addEventListener(\"resize\", updatePos);\n // listen on capture to catch scrolls from ancestor elements as well\n window.addEventListener(\"scroll\", updatePos, true);\n\n let ro: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\" && divHandlderRef.current) {\n ro = new ResizeObserver(() => updatePos());\n ro.observe(divHandlderRef.current);\n }\n\n return () => {\n window.removeEventListener(\"resize\", updatePos);\n window.removeEventListener(\"scroll\", updatePos, true);\n if (ro) ro.disconnect();\n };\n }\n }, [mouseOverHandlerDiv, menuInDom]);\n\n // Handle click off the menu\n const handleClick = useCallback((e: MouseEvent) => {\n if (\n menuRef.current &&\n ((e.target instanceof Element && !menuRef.current?.contains(e.target)) ||\n !(e.target instanceof Element))\n ) {\n setMenuVisible(false);\n }\n }, []);\n\n // Update the document click handler\n useEffect(() => {\n if (menuVisible) document.addEventListener(\"mousedown\", handleClick);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n };\n }, [handleClick, menuVisible]);\n\n const removeController = useRef<AbortController>(new AbortController());\n useEffect(() => {\n if (!mouseOverMenu && !menuVisible && !mouseOverHandlerDiv) {\n removeController.current.abort();\n removeController.current = new AbortController();\n setTimeout(() => {\n if (!removeController.current.signal.aborted) setMenuInDom(false);\n }, 300);\n }\n }, [mouseOverHandlerDiv, menuVisible, mouseOverMenu]);\n\n return (\n <ContentMenuHandlerContext.Provider\n value={{\n menuItems: thisMenuItems,\n }}\n >\n <div\n ref={divHandlderRef}\n {...rest}\n className={[styles.contextMenuHandler, rest.className].join(\" \")}\n onContextMenu={async (e) => {\n if (!showLowMenu) {\n setMenuInDom(true);\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n removeController.current.abort();\n setMenuVisible(true);\n setMenuXPos(e.pageX);\n setMenuYPos(e.pageY);\n }, 1);\n }\n }}\n onMouseEnter={async (e) => {\n if (showLowMenu) {\n setMenuInDom(true);\n setMouseOverHandlerDiv(false);\n setTimeout(() => {\n removeController.current.abort();\n setMouseOverHandlerDiv(true);\n }, 1);\n }\n rest.onMouseEnter?.(e);\n }}\n onMouseLeave={async (e) => {\n if (showLowMenu) {\n removeController.current.abort();\n removeController.current = new AbortController();\n setMouseOverHandlerDiv(false);\n }\n rest.onMouseLeave?.(e);\n }}\n >\n {children}\n </div>\n {menuInDom &&\n divHandlerPos &&\n createPortal(\n <div\n className={styles.anchor}\n onMouseEnter={() => {\n removeController.current.abort();\n setMouseOverMenu(true);\n }}\n onMouseLeave={() => {\n removeController.current.abort();\n removeController.current = new AbortController();\n setMouseOverMenu(false);\n }}\n >\n {showLowMenu ? (\n <LowMenu\n visible={mouseOverHandlerDiv}\n entries={menuItems}\n xPos={divHandlerPos.left}\n yPos={divHandlerPos.bottom}\n maxWidth={divHandlerPos.width}\n />\n ) : (\n <ContextMenu\n visible={menuVisible}\n ref={menuRef}\n entries={thisMenuItems}\n xPos={menuXPos}\n yPos={menuYPos}\n toClose={() => {\n setMenuVisible(false);\n setMouseOverMenu(false);\n }}\n />\n )}\n </div>,\n document.body,\n )}\n </ContentMenuHandlerContext.Provider>\n );\n};\n\nContextMenuHandler.displayName = \"ContextMenuHandler\";\n","import styles from \"./LowMenu.module.css\";\nimport { LowMenuButton } from \"./LowMenuButton\";\nimport { IMenuItem } from \"./interface\";\n\ninterface LowMenuProps {\n entries: IMenuItem[];\n visible: boolean;\n xPos: number;\n yPos: number;\n maxWidth: number;\n}\n\nexport const LowMenu = ({\n entries,\n visible,\n xPos,\n yPos,\n maxWidth,\n}: LowMenuProps): React.ReactElement => {\n // Only show the low menu if it is on the screen\n if (xPos >= window.innerWidth || yPos >= window.innerHeight) return <></>;\n // Show the menu\n return (\n <div\n className={[styles.lowMenu, visible ? styles.visible : styles.hidden].join(\" \")}\n aria-label=\"Low context menu\"\n style={{\n left: `${xPos}px`,\n top: `${yPos}px`,\n maxWidth: `calc(${maxWidth}px)`,\n width: `calc(${maxWidth}px - 4px)`,\n }}\n >\n <div className={styles.lowMenuButtonHolder}>\n {entries.map((e, i) => (\n <LowMenuButton\n key={i}\n entry={e}\n />\n ))}\n </div>\n </div>\n );\n};\n\nLowMenu.displayName = \"LowMenu\";\n",".lowMenu {\n z-index: 2;\n position: absolute;\n margin: 0px;\n transition: opacity 0.3s linear;\n}\n\n.lowMenuButtonHolder {\n border: 2px solid rgb(17, 20, 24);\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n background-color: rgb(17, 20, 24);\n box-shadow: 2px 2px 2px rgb(64, 64, 64, 0.5);\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n gap: 2px;\n row-gap: 2px;\n width: fit-content;\n}\n\n.lowMenu.hidden {\n opacity: 0;\n}\n\n.lowMenu.visible,\n.lowMenu:hover {\n opacity: 1;\n}\n\n.lowMenuItem {\n background-color: rgb(251, 253, 246);\n border: 0;\n color: rgb(17, 20, 24);\n cursor: pointer;\n padding: 0 4px;\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n white-space: nowrap;\n}\n\n.lowMenuItem.disabled {\n background-color: rgba(200, 200, 200);\n cursor: not-allowed;\n}\n\n.lowMenuItem:not(.disabled):hover {\n background-color: rgb(251, 233, 230);\n}\n\n.lowMenu-item .caretHolder {\n align-self: flex-end;\n}\n\n.lowMenuItem .caretHolder .subMenu {\n z-index: 1;\n position: relative;\n}\n","import { useState } from \"react\";\nimport styles from \"./LowMenu.module.css\";\nimport { LowSubMenu } from \"./LowSubMenu\";\nimport { IMenuItem } from \"./interface\";\n\ninterface LowMenuButtonProps {\n entry: IMenuItem;\n}\nexport const LowMenuButton = ({ entry }: LowMenuButtonProps) => {\n const [target, setTarget] = useState<Range | null>(null);\n return (\n <div\n className={[styles.lowMenuItem, entry.disabled ? styles.disabled : \"\"]\n .filter((c) => c !== \"\")\n .join(\" \")}\n aria-label={typeof entry.label === \"string\" ? entry.label : undefined}\n aria-disabled={entry.disabled}\n onMouseEnter={() => {\n const sel = window.getSelection();\n const target = sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null;\n setTarget(target);\n }}\n onMouseLeave={() => {\n setTarget(null);\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!entry.disabled) entry.action?.(target);\n }}\n >\n <span>{entry.label}</span>\n {entry.group && <LowSubMenu entry={entry} />}\n </div>\n );\n};\n\nLowMenuButton.displayName = \"LowMenuButton\";\n","import { useState } from \"react\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./LowMenu.module.css\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface LowSubMenuProps {\n entry: IMenuItem;\n lowMenu?: boolean;\n}\n\nexport const LowSubMenu = ({ entry }: LowSubMenuProps): React.ReactElement => {\n const [visible, setVisible] = useState<boolean>(false);\n if (!entry.group || entry.group.length === 0) return <></>;\n return (\n <span\n aria-label={`Sub menu for ${entry.label}`}\n className={styles.caretHolder}\n onMouseEnter={() => {\n setVisible(true);\n }}\n onMouseLeave={() => {\n setVisible(false);\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <path d=\"m12.14 8.753-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z\" />\n </svg>\n <div className={styles.subMenu}>\n {visible && (\n <ContextMenu\n visible={visible}\n entries={entry.group}\n xPos={14}\n yPos={entry.group.length * -21 - 8}\n toClose={() => setVisible(false)}\n />\n )}\n </div>\n </span>\n );\n};\n\nLowSubMenu.displayName = \"LowSubMenu\";\n","import { ReactNode, useEffect, useRef, useState, useTransition } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { chkPosition } from \"../functions/chkPosition\";\nimport styles from \"./ContextWindow.module.css\";\n\nexport const MIN_Z_INDEX = 3000;\nconst CONTEXT_WINDOW_DATA_ATTR = \"data-context-window\";\n\nexport interface ContextWindowProps extends React.HTMLAttributes<HTMLDivElement> {\n id: string;\n visible: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n title: string;\n titleElement?: ReactNode;\n style?: React.CSSProperties;\n children: React.ReactNode;\n minZIndex?: number;\n}\n\n// Helper function to get the highest zIndex from all context windows in the DOM\nconst getMaxZIndex = (componentMinZIndex: number): number => {\n const windows = document.body.querySelectorAll(`[${CONTEXT_WINDOW_DATA_ATTR}]`);\n let maxZIndex = componentMinZIndex - 1;\n windows.forEach((win) => {\n const zIndexStr = (win as HTMLElement).style.zIndex;\n if (zIndexStr) {\n const zIndex = parseInt(zIndexStr, 10);\n if (!isNaN(zIndex) && zIndex > maxZIndex) {\n maxZIndex = zIndex;\n }\n }\n });\n return maxZIndex;\n};\n\nexport const ContextWindow = ({\n id,\n visible,\n title,\n titleElement,\n children,\n onOpen,\n onClose,\n minZIndex = MIN_Z_INDEX,\n ...rest\n}: ContextWindowProps): React.ReactElement => {\n const divRef = useRef<HTMLDivElement | null>(null);\n const windowRef = useRef<HTMLDivElement | null>(null);\n const [zIndex, setZIndex] = useState<number>(minZIndex);\n const resizeListenerRef = useRef<(() => void) | null>(null);\n\n // Track internal state: whether window is in DOM and whether it's been positioned\n const [windowInDOM, setWindowInDOM] = useState<boolean>(false);\n const [windowVisible, setWindowVisible] = useState<boolean>(false);\n const [, startTransition] = useTransition();\n\n // Position\n const windowPos = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const [moving, setMoving] = useState<boolean>(false);\n\n const move = (x: number, y: number) => {\n if (windowRef.current && windowPos.current) {\n const window = windowRef.current;\n const pos = windowPos.current;\n pos.x += x;\n pos.y += y;\n window.style.transform = `translate(${pos.x}px, ${pos.y}px)`;\n }\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const checkPosition = () => {\n const chkPos = chkPosition(windowRef);\n move(chkPos.translateX, chkPos.translateY);\n };\n\n const mouseMove = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n move(e.movementX, e.movementY);\n };\n\n // Store stable references to mouseMove and mouseUp for cleanup\n const mouseMoveRef = useRef(mouseMove);\n const mouseUpRef = useRef<(e: MouseEvent) => void>(() => {});\n\n const mouseUp = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setMoving(false);\n checkPosition();\n document.removeEventListener(\"mousemove\", mouseMoveRef.current);\n document.removeEventListener(\"mouseup\", mouseUpRef.current);\n if (resizeListenerRef.current) {\n window.removeEventListener(\"resize\", resizeListenerRef.current);\n resizeListenerRef.current = null;\n }\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = \"auto\";\n };\n\n // Update refs when callbacks change\n useEffect(() => {\n mouseMoveRef.current = mouseMove;\n mouseUpRef.current = mouseUp;\n });\n\n // Helper function to push this window to the top\n const pushToTop = () => {\n const maxZIndex = getMaxZIndex(minZIndex);\n setZIndex(maxZIndex + 1);\n };\n\n // Sync windowInDOM with visible prop using a layout effect to avoid ESLint warnings\n // This effect derives state from props, which is acceptable when there's no synchronous setState\n useEffect(() => {\n if (visible && !windowInDOM) {\n // Window should be in DOM when visible becomes true\n startTransition(() => {\n setWindowInDOM(true);\n });\n } else if (!visible && windowInDOM) {\n // Window should leave DOM when visible becomes false\n startTransition(() => {\n setWindowInDOM(false);\n setWindowVisible(false);\n });\n }\n }, [visible, windowInDOM, startTransition]);\n\n // Position and show window after it's added to DOM\n useEffect(() => {\n if (windowInDOM && !windowVisible && visible && divRef.current && windowRef.current) {\n // Position the window\n const parentPos = divRef.current.getBoundingClientRect();\n const pos = windowRef.current.getBoundingClientRect();\n const windowHeight = pos.bottom - pos.top;\n windowRef.current.style.left = `${parentPos.left}px`;\n windowRef.current.style.top = `${\n parentPos.bottom + windowHeight < window.innerHeight\n ? parentPos.bottom\n : Math.max(0, parentPos.top - windowHeight)\n }px`;\n windowRef.current.style.transform = \"\";\n windowPos.current = { x: 0, y: 0 };\n checkPosition();\n\n // Update z-index and make visible - use startTransition\n const maxZ = getMaxZIndex(minZIndex);\n onOpen?.();\n startTransition(() => {\n setZIndex(maxZ + 1);\n setWindowVisible(true);\n });\n }\n }, [windowInDOM, windowVisible, visible, checkPosition, minZIndex, onOpen, startTransition]);\n\n // Cleanup effect to remove event listeners on unmount\n useEffect(() => {\n return () => {\n // Clean up event listeners if component unmounts while dragging\n document.removeEventListener(\"mousemove\", mouseMoveRef.current);\n document.removeEventListener(\"mouseup\", mouseUpRef.current);\n if (resizeListenerRef.current) {\n window.removeEventListener(\"resize\", resizeListenerRef.current);\n resizeListenerRef.current = null;\n }\n };\n }, []);\n\n return (\n <div\n className={styles.contextWindowAnchor}\n ref={divRef}\n >\n {windowInDOM &&\n createPortal(\n <div\n {...rest}\n ref={windowRef}\n id={id}\n {...{ [CONTEXT_WINDOW_DATA_ATTR]: \"true\" }}\n className={[styles.contextWindow, rest.className].filter((c) => c).join(\" \")}\n style={{\n ...rest.style,\n opacity: moving ? 0.8 : windowVisible ? 1 : 0,\n visibility: windowVisible ? \"visible\" : \"hidden\",\n zIndex: zIndex,\n minHeight: rest.style?.minHeight ?? \"150px\",\n minWidth: rest.style?.minWidth ?? \"200px\",\n maxHeight: rest.style?.maxHeight ?? \"1000px\",\n maxWidth: rest.style?.maxWidth ?? \"1000px\",\n }}\n onClickCapture={(e) => {\n pushToTop();\n rest.onClickCapture?.(e);\n }}\n >\n <div\n className={[styles.contextWindowTitle, moving ? styles.moving : \"\"]\n .filter((c) => c !== \"\")\n .join(\" \")}\n onMouseDown={(e: React.MouseEvent) => {\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = \"none\";\n setMoving(true);\n pushToTop();\n document.addEventListener(\"mouseup\", mouseUpRef.current);\n document.addEventListener(\"mousemove\", mouseMoveRef.current);\n const resizeListener = () => checkPosition();\n resizeListenerRef.current = resizeListener;\n window.addEventListener(\"resize\", resizeListener);\n }}\n >\n <div\n className={styles.contextWindowTitleText}\n title={title}\n >\n {titleElement ? titleElement : title}\n </div>\n <div\n className={styles.contextWindowTitleClose}\n role=\"button\"\n aria-label=\"Close\"\n onClick={onClose}\n title={`Close ${title && title.trim() !== \"\" ? title : \"window\"}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\" />\n </svg>\n </div>\n </div>\n <div className={styles.contextWindowBody}>\n <div>{children}</div>\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n};\n\nContextWindow.displayName = \"ContextWindow\";\n","import { RefObject } from \"react\";\n\n/**\n * Check that an existing div is inside the viewport\n * @param divRef Check div is inside view port, and return n\n * @returns \\{ translateX, translateY \\} Amount to move on X and Y axis\n */\nexport const chkPosition = (\n divRef: RefObject<HTMLDivElement | null>,\n): { translateX: number; translateY: number } => {\n if (!divRef.current) {\n return { translateX: 0, translateY: 0 };\n } else {\n const innerBounce = 16;\n const posn = divRef.current.getBoundingClientRect();\n let translateX = 0;\n if (posn.left < innerBounce) {\n translateX = -posn.left + innerBounce;\n } else if (posn.right > window.innerWidth) {\n translateX = Math.max(-posn.left + innerBounce, window.innerWidth - posn.right - innerBounce);\n }\n let translateY = 0;\n if (posn.top < innerBounce) {\n translateY = -posn.top + innerBounce;\n } else if (posn.bottom > window.innerHeight) {\n translateY = Math.max(\n -posn.top + innerBounce,\n window.innerHeight - posn.bottom - innerBounce,\n );\n }\n return { translateX, translateY };\n }\n};\n",".contextWindowAnchor {\n position: relative;\n}\n\n.contextWindow {\n z-index: 2001;\n border: 1px black solid;\n margin: 0;\n padding: 4px;\n background-color: rgb(250, 250, 250);\n box-shadow: 6px 6px 6px rgb(64, 64, 64, 0.5);\n transition: opacity 0.25s linear;\n justify-content: flex-start;\n position: absolute;\n border-top-left-radius: 8px;\n border-top-right-radius: 8px;\n border-bottom-left-radius: 8px;\n resize: both;\n overflow: auto;\n max-height: 95vh;\n max-width: 95vw;\n}\n\n.contextWindowTitle {\n border-bottom: 1px black dashed;\n box-sizing: unset;\n padding-bottom: 4px;\n margin: 0 4px 3px 4px;\n height: 24px;\n line-height: 24px;\n max-height: 24px;\n cursor: grab;\n font-size: 18px;\n font-weight: 600;\n display: flex;\n flex-direction: row;\n align-items: center;\n width: calc(100% - 8px);\n}\n\n.contextWindowTitle.moving {\n cursor: grabbing;\n}\n\n.contextWindowTitleText {\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: calc(100% - 16px);\n}\n\n.contextWindowTitleClose {\n display: flex;\n color: black;\n height: 16px;\n width: 16px;\n border-radius: 3px;\n margin-left: 2px;\n cursor: pointer;\n line-height: 16px;\n}\n\n.contextWindowTitleClose:hover {\n background-color: black;\n color: white;\n}\n\n.contextWindowBody {\n overflow: auto;\n padding-bottom: 8px;\n margin-right: 4px;\n height: calc(100% - 40px);\n}\n\n.contextWindowBody::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.contextWindowBody::-webkit-scrollbar-track {\n background: white;\n border-radius: 8px;\n}\n\n.contextWindowBody::-webkit-scrollbar-thumb {\n background: lightgrey;\n border: none;\n border-radius: 8px;\n}\n\n.contextWindowBody::-webkit-scrollbar-thumb:hover {\n background: grey;\n}\n"],"names":[],"version":3,"file":"main.js.map"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";AAGA,yBAA0B,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACpE,QAAQ,EAAE,MAAM,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"mappings":";AAGA,yBAA0B,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACpE,QAAQ,EAAE,MAAM,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,2BAA2B,EACzB,QAAQ,EACR,IAAY,EACZ,QAAc,EACd,GAAG,IAAI,EACR,EAAE,eAAe,GAAG,MAAM,YAAY,CA4HtC;AAjID,MAAM,mBAAU,UAAU;;;ACX1B;IACE,KAAK,EAAE,MAAM,GAAG,MAAM,YAAY,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACxF,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;CACrB;AGKD;IACE,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,OAAO,MAAM,oGAuDZ,CAAC;ACnEF,2BAAmC,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC7E,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,SAAS,CAAC;CAC5B;AAED,OAAO,MAAM;2CAKV,iBAAiB,GAAG,MAAM,YAAY;;CAsGxC,CAAC;AInGF,iCAAyC,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACnF,QAAQ,EAAE,MAAM,SAAS,CAAC;IAC1B,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAMD,OAAO,MAAM;oDAKV,uBAAuB,GAAG,MAAM,YAAY;;CAuL9C,CAAC;AElNF,4BAAoC,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC9E,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,aAAa,CAAC;IAC5B,QAAQ,EAAE,MAAM,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkBD,OAAO,MAAM;0FAUV,kBAAkB,GAAG,MAAM,YAAY;;CAyMzC,CAAC","sources":["src/src/components/AutoHeight.tsx","src/src/components/interface.ts","src/src/components/ContextSubMenu.tsx","src/src/components/ContextMenuEntry.tsx","src/src/components/ContextMenu.tsx","src/src/components/ClickForMenu.tsx","src/src/components/LowSubMenu.tsx","src/src/components/LowMenuButton.tsx","src/src/components/LowMenu.tsx","src/src/components/ContextMenuHandler.tsx","src/src/functions/chkPosition.ts","src/src/components/ContextWindow.tsx","src/src/components/index.ts","src/src/main.ts","src/main.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"import \"../global.d.ts\";\nexport * from \"./components\";\n"],"names":[],"version":3,"file":"context-menu.d.ts.map"}
|
package/dist/main.js
CHANGED
|
@@ -3,7 +3,7 @@ import {_ as $duWW8$_} from "@swc/helpers/_/_object_spread";
|
|
|
3
3
|
import {_ as $duWW8$_1} from "@swc/helpers/_/_object_spread_props";
|
|
4
4
|
import {_ as $duWW8$_2} from "@swc/helpers/_/_object_without_properties";
|
|
5
5
|
import {jsx as $duWW8$jsx, jsxs as $duWW8$jsxs, Fragment as $duWW8$Fragment} from "react/jsx-runtime";
|
|
6
|
-
import {useRef as $duWW8$useRef, useState as $duWW8$useState,
|
|
6
|
+
import {useRef as $duWW8$useRef, useState as $duWW8$useState, useEffectEvent as $duWW8$useEffectEvent, useLayoutEffect as $duWW8$useLayoutEffect, useEffect as $duWW8$useEffect, forwardRef as $duWW8$forwardRef, createContext as $duWW8$createContext, useContext as $duWW8$useContext, useCallback as $duWW8$useCallback, useTransition as $duWW8$useTransition} from "react";
|
|
7
7
|
import {createPortal as $duWW8$createPortal} from "react-dom";
|
|
8
8
|
|
|
9
9
|
|
|
@@ -39,7 +39,7 @@ $181673e3e0e596f3$export$563bd8f955c52746 = `aiw-AutoHeight-module-pDlSVW-autoHe
|
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
function $62873e7e5aeec7f1$export$77bf000da9303d1(_param) {
|
|
42
|
-
var { children: children, hide: hide, duration: duration = 300 } = _param, rest = (0, $duWW8$_2)(_param, [
|
|
42
|
+
var { children: children, hide: hide = false, duration: duration = 300 } = _param, rest = (0, $duWW8$_2)(_param, [
|
|
43
43
|
"children",
|
|
44
44
|
"hide",
|
|
45
45
|
"duration"
|
|
@@ -47,29 +47,63 @@ function $62873e7e5aeec7f1$export$77bf000da9303d1(_param) {
|
|
|
47
47
|
const wrapperRef = (0, $duWW8$useRef)(null);
|
|
48
48
|
const innerRef = (0, $duWW8$useRef)(null);
|
|
49
49
|
const [height, setHeight] = (0, $duWW8$useState)(null);
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
50
|
+
const [animationState, setAnimationState] = (0, $duWW8$useState)(!hide ? "open" : "closed");
|
|
51
|
+
const rafRef = (0, $duWW8$useRef)(null);
|
|
52
|
+
const timeoutRef = (0, $duWW8$useRef)(null);
|
|
53
|
+
const targetChildren = animationState === "closed" || !children ? null : children;
|
|
54
|
+
const setTargetHeight = (0, $duWW8$useEffectEvent)((newHeight)=>{
|
|
55
|
+
setHeight(newHeight);
|
|
56
|
+
});
|
|
57
|
+
const transitionToOpening = (0, $duWW8$useEffectEvent)(()=>{
|
|
58
|
+
// Cancel any pending close timeout
|
|
59
|
+
if (timeoutRef.current !== null) {
|
|
60
|
+
clearTimeout(timeoutRef.current);
|
|
61
|
+
timeoutRef.current = null;
|
|
62
|
+
}
|
|
63
|
+
setAnimationState("opening");
|
|
64
|
+
const id = window.requestAnimationFrame(()=>{
|
|
65
|
+
rafRef.current = null;
|
|
66
|
+
setTargetHeight(1);
|
|
67
|
+
const frameId = window.requestAnimationFrame(()=>{
|
|
68
|
+
const inner = innerRef.current;
|
|
69
|
+
if (inner) {
|
|
70
|
+
setTargetHeight(inner.offsetHeight);
|
|
71
|
+
setAnimationState("open");
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
rafRef.current = frameId;
|
|
75
|
+
});
|
|
76
|
+
rafRef.current = id;
|
|
77
|
+
});
|
|
78
|
+
const transitionToClosing = (0, $duWW8$useEffectEvent)(()=>{
|
|
79
|
+
// Cancel any pending RAF
|
|
80
|
+
if (rafRef.current !== null) {
|
|
81
|
+
cancelAnimationFrame(rafRef.current);
|
|
82
|
+
rafRef.current = null;
|
|
83
|
+
}
|
|
84
|
+
setAnimationState("closing");
|
|
85
|
+
setTargetHeight(1);
|
|
86
|
+
timeoutRef.current = window.setTimeout(()=>{
|
|
87
|
+
timeoutRef.current = null;
|
|
88
|
+
setAnimationState("closed");
|
|
89
|
+
}, duration);
|
|
90
|
+
});
|
|
91
|
+
(0, $duWW8$useLayoutEffect)(()=>{
|
|
92
|
+
if (!hide) // Want to show: transition to open
|
|
93
|
+
{
|
|
94
|
+
if (animationState === "closed" || animationState === "closing") transitionToOpening();
|
|
95
|
+
} else // Want to hide: transition to closed
|
|
96
|
+
if (animationState === "open" || animationState === "opening") transitionToClosing();
|
|
64
97
|
}, [
|
|
65
|
-
hide
|
|
98
|
+
hide,
|
|
99
|
+
animationState
|
|
66
100
|
]);
|
|
67
|
-
//
|
|
101
|
+
// Setup ResizeObserver to track content size changes
|
|
68
102
|
(0, $duWW8$useEffect)(()=>{
|
|
69
103
|
const transition = innerRef.current;
|
|
70
104
|
if (transition) {
|
|
71
105
|
const observer = new ResizeObserver(()=>{
|
|
72
|
-
setTargetHeight();
|
|
106
|
+
if (animationState === "open") setTargetHeight(transition.offsetHeight);
|
|
73
107
|
});
|
|
74
108
|
observer.observe(transition);
|
|
75
109
|
return ()=>{
|
|
@@ -77,24 +111,26 @@ function $62873e7e5aeec7f1$export$77bf000da9303d1(_param) {
|
|
|
77
111
|
};
|
|
78
112
|
}
|
|
79
113
|
}, [
|
|
80
|
-
|
|
114
|
+
animationState
|
|
81
115
|
]);
|
|
82
|
-
//
|
|
83
|
-
const [, startTransition] = (0, $duWW8$useTransition)();
|
|
116
|
+
// Cleanup on unmount
|
|
84
117
|
(0, $duWW8$useEffect)(()=>{
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
118
|
+
return ()=>{
|
|
119
|
+
if (rafRef.current !== null) {
|
|
120
|
+
cancelAnimationFrame(rafRef.current);
|
|
121
|
+
rafRef.current = null;
|
|
122
|
+
}
|
|
123
|
+
if (timeoutRef.current !== null) {
|
|
124
|
+
clearTimeout(timeoutRef.current);
|
|
125
|
+
timeoutRef.current = null;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}, []);
|
|
94
129
|
return /*#__PURE__*/ (0, $duWW8$jsx)("div", (0, $duWW8$_1)((0, $duWW8$_)({}, rest), {
|
|
95
130
|
className: (0, (/*@__PURE__*/$parcel$interopDefault($181673e3e0e596f3$exports))).autoHeightWrapper,
|
|
96
131
|
ref: wrapperRef,
|
|
97
132
|
style: (0, $duWW8$_1)((0, $duWW8$_)({}, rest.style), {
|
|
133
|
+
display: animationState === "closed" ? "none" : undefined,
|
|
98
134
|
height: height ? `${height}px` : "auto",
|
|
99
135
|
transitionDuration: `${duration}ms`
|
|
100
136
|
}),
|
|
@@ -293,9 +329,10 @@ const $c3e82278b501f10c$export$d4ebdd58e04c6ace = (_param)=>{
|
|
|
293
329
|
// Set up outsideClick handler
|
|
294
330
|
const menuRef = (0, $duWW8$useRef)(null);
|
|
295
331
|
// Handle click off the menu
|
|
296
|
-
|
|
332
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
333
|
+
const handleClick = (e)=>{
|
|
297
334
|
if (menuRef.current && (e.target instanceof Element && !menuRef.current.contains(e.target) || !(e.target instanceof Element))) setMenuInDom(false);
|
|
298
|
-
}
|
|
335
|
+
};
|
|
299
336
|
const removeController = (0, $duWW8$useRef)(null);
|
|
300
337
|
const removeTimeoutRef = (0, $duWW8$useRef)(null);
|
|
301
338
|
(0, $duWW8$useEffect)(()=>{
|
|
@@ -532,27 +569,24 @@ const $1e1c1e9e0b943830$export$ed4f9641643dc7e4 = (_param)=>{
|
|
|
532
569
|
]);
|
|
533
570
|
// Check for higher content menu
|
|
534
571
|
const higherContext = (0, $duWW8$useContext)($1e1c1e9e0b943830$export$fc58dc71afe92de2);
|
|
535
|
-
const thisMenuItems =
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
higherContext,
|
|
554
|
-
menuItems
|
|
555
|
-
]);
|
|
572
|
+
const thisMenuItems = [
|
|
573
|
+
...higherContext !== null ? [
|
|
574
|
+
...higherContext.menuItems,
|
|
575
|
+
...[
|
|
576
|
+
higherContext.menuItems.length > 0 && !$1e1c1e9e0b943830$var$isDivider(higherContext.menuItems[higherContext.menuItems.length - 1].label) && menuItems.length > 0 && !$1e1c1e9e0b943830$var$isDivider(menuItems[0].label) ? {
|
|
577
|
+
label: /*#__PURE__*/ (0, $duWW8$jsx)("hr", {
|
|
578
|
+
style: {
|
|
579
|
+
flexGrow: 1,
|
|
580
|
+
cursor: "none",
|
|
581
|
+
margin: "0",
|
|
582
|
+
padding: "0"
|
|
583
|
+
}
|
|
584
|
+
})
|
|
585
|
+
} : null
|
|
586
|
+
].filter((item)=>item !== null)
|
|
587
|
+
] : [],
|
|
588
|
+
...menuItems
|
|
589
|
+
];
|
|
556
590
|
// Menu resources
|
|
557
591
|
const divHandlderRef = (0, $duWW8$useRef)(null);
|
|
558
592
|
const menuRef = (0, $duWW8$useRef)(null);
|
|
@@ -796,7 +830,7 @@ const $b5e8657823def5be$export$1af8984c69ba1b24 = (_param)=>{
|
|
|
796
830
|
y: 0
|
|
797
831
|
});
|
|
798
832
|
const [moving, setMoving] = (0, $duWW8$useState)(false);
|
|
799
|
-
const move = (
|
|
833
|
+
const move = (x, y)=>{
|
|
800
834
|
if (windowRef.current && windowPos.current) {
|
|
801
835
|
const window1 = windowRef.current;
|
|
802
836
|
const pos = windowPos.current;
|
|
@@ -804,24 +838,21 @@ const $b5e8657823def5be$export$1af8984c69ba1b24 = (_param)=>{
|
|
|
804
838
|
pos.y += y;
|
|
805
839
|
window1.style.transform = `translate(${pos.x}px, ${pos.y}px)`;
|
|
806
840
|
}
|
|
807
|
-
}
|
|
808
|
-
|
|
841
|
+
};
|
|
842
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
843
|
+
const checkPosition = ()=>{
|
|
809
844
|
const chkPos = (0, $ab4d5d6bf03370d0$export$d81cfea7c54be196)(windowRef);
|
|
810
845
|
move(chkPos.translateX, chkPos.translateY);
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
]);
|
|
814
|
-
const mouseMove = (0, $duWW8$useCallback)((e)=>{
|
|
846
|
+
};
|
|
847
|
+
const mouseMove = (e)=>{
|
|
815
848
|
e.preventDefault();
|
|
816
849
|
e.stopPropagation();
|
|
817
850
|
move(e.movementX, e.movementY);
|
|
818
|
-
}
|
|
819
|
-
move
|
|
820
|
-
]);
|
|
851
|
+
};
|
|
821
852
|
// Store stable references to mouseMove and mouseUp for cleanup
|
|
822
853
|
const mouseMoveRef = (0, $duWW8$useRef)(mouseMove);
|
|
823
854
|
const mouseUpRef = (0, $duWW8$useRef)(()=>{});
|
|
824
|
-
const mouseUp = (
|
|
855
|
+
const mouseUp = (e)=>{
|
|
825
856
|
e.preventDefault();
|
|
826
857
|
e.stopPropagation();
|
|
827
858
|
setMoving(false);
|
|
@@ -833,24 +864,17 @@ const $b5e8657823def5be$export$1af8984c69ba1b24 = (_param)=>{
|
|
|
833
864
|
resizeListenerRef.current = null;
|
|
834
865
|
}
|
|
835
866
|
if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement)) e.target.style.userSelect = "auto";
|
|
836
|
-
}
|
|
837
|
-
checkPosition
|
|
838
|
-
]);
|
|
867
|
+
};
|
|
839
868
|
// Update refs when callbacks change
|
|
840
869
|
(0, $duWW8$useEffect)(()=>{
|
|
841
870
|
mouseMoveRef.current = mouseMove;
|
|
842
871
|
mouseUpRef.current = mouseUp;
|
|
843
|
-
}
|
|
844
|
-
mouseMove,
|
|
845
|
-
mouseUp
|
|
846
|
-
]);
|
|
872
|
+
});
|
|
847
873
|
// Helper function to push this window to the top
|
|
848
|
-
const pushToTop = (
|
|
874
|
+
const pushToTop = ()=>{
|
|
849
875
|
const maxZIndex = $b5e8657823def5be$var$getMaxZIndex(minZIndex);
|
|
850
876
|
setZIndex(maxZIndex + 1);
|
|
851
|
-
}
|
|
852
|
-
minZIndex
|
|
853
|
-
]);
|
|
877
|
+
};
|
|
854
878
|
// Sync windowInDOM with visible prop using a layout effect to avoid ESLint warnings
|
|
855
879
|
// This effect derives state from props, which is acceptable when there's no synchronous setState
|
|
856
880
|
(0, $duWW8$useEffect)(()=>{
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/main.ts","global.d.ts","src/components/index.ts","src/components/AutoHeight.tsx","src/components/AutoHeight.module.css","src/components/ClickForMenu.tsx","src/components/ContextMenu.tsx","src/components/ContextMenu.module.css","src/components/ContextMenuEntry.tsx","src/components/ContextSubMenu.tsx","src/components/ContextMenuHandler.tsx","src/components/LowMenu.tsx","src/components/LowMenu.module.css","src/components/LowMenuButton.tsx","src/components/LowSubMenu.tsx","src/components/ContextWindow.tsx","src/functions/chkPosition.ts","src/components/ContextWindow.module.css"],"sourcesContent":["import \"../global.d.ts\";\nexport * from \"./components\";\n","declare module \"*.module.css\" {\n const classes: { readonly [key: string]: string };\n export default classes;\n}\n\n// React 19 act() environment support\ndeclare global {\n var IS_REACT_ACT_ENVIRONMENT: boolean | undefined;\n}\n","import { AutoHeight } from \"./AutoHeight\";\nimport { ClickForMenu } from \"./ClickForMenu\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { ContextMenuHandler } from \"./ContextMenuHandler\";\nimport { ContextWindow } from \"./ContextWindow\";\nimport { IMenuItem } from \"./interface\";\n\nexport { AutoHeight, ClickForMenu, ContextMenu, ContextMenuHandler, ContextWindow };\nexport type { IMenuItem };\n","import { useCallback, useEffect, useMemo, useRef, useState, useTransition } from \"react\";\nimport styles from \"./AutoHeight.module.css\";\n\ninterface AutoHeightProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n hide?: boolean;\n duration?: number; // transition duration in ms\n}\n\nexport function AutoHeight({\n children,\n hide,\n duration = 300,\n ...rest\n}: AutoHeightProps): React.ReactElement {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState<number | null>(null);\n const targetChildren = useMemo<React.ReactNode>(\n () => (hide || !children ? <div style={{ height: \"1px\" }} /> : children),\n [children, hide],\n );\n\n const setTargetHeight = useCallback(() => {\n const inner = innerRef.current;\n\n // Initial draw to get the height of children and deployed children\n const deployedHeight = hide ? 1 : (inner?.offsetHeight ?? 0);\n setHeight(deployedHeight);\n }, [hide]);\n\n // Add ResizeObserver to update height on content resize, debounced\n useEffect(() => {\n const transition = innerRef.current;\n if (transition) {\n const observer = new ResizeObserver(() => {\n setTargetHeight();\n });\n\n observer.observe(transition);\n\n return () => {\n observer.disconnect();\n };\n }\n }, [setTargetHeight]);\n\n // Trigger height change on children update\n const [, startTransition] = useTransition();\n\n useEffect(() => {\n // Mark this update as non-urgent to avoid cascading render warnings\n startTransition(() => {\n setTargetHeight();\n });\n }, [setTargetHeight, children, startTransition]);\n\n return (\n <div\n {...rest}\n className={styles.autoHeightWrapper}\n ref={wrapperRef}\n style={{\n ...rest.style,\n height: height ? `${height}px` : \"auto\",\n transitionDuration: `${duration}ms`,\n }}\n >\n <div\n className={styles.autoHeightInner}\n ref={innerRef}\n >\n {targetChildren}\n </div>\n </div>\n );\n}\n\nAutoHeight.displayName = \"AutoHeight\";\n",".autoHeightWrapper {\n overflow: hidden;\n transition-timing-function: height ease-in-out width ease-in-out background-color ease-in-out;\n box-sizing: border-box;\n position: relative;\n}\n\n.autoHeightInner {\n height: fit-content;\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./ContextMenu.module.css\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface ClickForMenuProps extends React.HTMLAttributes<HTMLDivElement> {\n id: string;\n menuItems?: IMenuItem[];\n children?: React.ReactNode;\n}\n\nexport const ClickForMenu = ({\n id,\n menuItems,\n children,\n ...rest\n}: ClickForMenuProps): React.ReactElement => {\n // Menu state\n const [menuInDom, setMenuInDom] = useState<boolean>(false);\n const [menuVisible, setMenuVisible] = useState<boolean>(false);\n const [menuXPos, setMenuXPos] = useState<number>(0);\n const [menuYPos, setMenuYPos] = useState<number>(0);\n\n // Set up outsideClick handler\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n // Handle click off the menu\n const handleClick = useCallback((e: MouseEvent) => {\n if (\n menuRef.current &&\n ((e.target instanceof Element && !menuRef.current.contains(e.target)) ||\n !(e.target instanceof Element))\n ) {\n setMenuInDom(false);\n }\n }, []);\n\n const removeController = useRef<AbortController | null>(null);\n const removeTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n useEffect(() => {\n if (!menuVisible && removeTimeoutRef.current === null) {\n // Only create a new controller when scheduling a new timeout\n if (removeController.current) {\n removeController.current.abort();\n }\n removeController.current = new AbortController();\n const controller = removeController.current;\n // Set up the timeout with a reference to the current controller\n removeTimeoutRef.current = setTimeout(() => {\n if (!controller.signal.aborted) setMenuInDom(false);\n removeTimeoutRef.current = null;\n }, 300);\n }\n return () => {\n // Clean up on unmount or when menuVisible changes\n if (removeTimeoutRef.current) {\n clearTimeout(removeTimeoutRef.current);\n removeTimeoutRef.current = null;\n }\n };\n }, [menuVisible]);\n\n // Update the document click handler\n useEffect(() => {\n if (menuInDom) document.addEventListener(\"mousedown\", handleClick);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n if (removeController.current) {\n removeController.current.abort();\n }\n };\n }, [handleClick, menuInDom]);\n\n return (\n <>\n <div\n {...rest}\n id={id}\n onClick={(e) => {\n if (menuItems) {\n setMenuInDom(true);\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n if (removeController.current) {\n removeController.current.abort();\n }\n setMenuVisible(true);\n setMenuXPos(e.pageX);\n setMenuYPos(e.pageY);\n }, 1);\n } else {\n rest.onClick?.(e);\n }\n }}\n >\n {children}\n </div>\n {menuInDom &&\n menuItems &&\n createPortal(\n <div className={styles.anchor}>\n <ContextMenu\n visible={menuVisible}\n ref={menuRef}\n entries={menuItems}\n xPos={menuXPos}\n yPos={menuYPos}\n toClose={() => {\n setMenuVisible(false);\n }}\n />\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nClickForMenu.displayName = \"ClickForMenu\";\n","import React, { forwardRef, useLayoutEffect, useState } from \"react\";\nimport styles from \"./ContextMenu.module.css\";\nimport { ContextMenuEntry } from \"./ContextMenuEntry\";\nimport { IMenuItem } from \"./interface\";\n\n// Constants for menu size estimation when ref is not yet available\nconst ESTIMATED_MENU_ITEM_HEIGHT = 34;\nconst ESTIMATED_MENU_PADDING = 4;\nconst ESTIMATED_MENU_WIDTH = 200;\n\nexport interface ContextMenuProps {\n visible: boolean;\n entries: IMenuItem[];\n xPos: number;\n yPos: number;\n toClose: () => void;\n}\n\nexport const ContextMenu = forwardRef<HTMLDivElement, ContextMenuProps>(\n ({ visible, entries, xPos, yPos, toClose }, ref): React.ReactElement => {\n // Measure menu size after mount/render to avoid accessing refs during render\n const [menuHeight, setMenuHeight] = useState(\n entries.length * ESTIMATED_MENU_ITEM_HEIGHT + ESTIMATED_MENU_PADDING,\n );\n const [menuWidth, setMenuWidth] = useState(ESTIMATED_MENU_WIDTH);\n\n useLayoutEffect(() => {\n // Only measure when visible; ref access inside effect is allowed\n if (visible && ref && typeof ref !== \"function\" && ref.current instanceof HTMLDivElement) {\n setMenuHeight(ref.current.offsetHeight);\n setMenuWidth(ref.current.offsetWidth);\n }\n // When not visible, fall back to estimates\n if (!visible) {\n setMenuHeight(entries.length * ESTIMATED_MENU_ITEM_HEIGHT + ESTIMATED_MENU_PADDING);\n setMenuWidth(ESTIMATED_MENU_WIDTH);\n }\n }, [visible, entries, ref]);\n\n const adjustedYPos =\n yPos + menuHeight > window.innerHeight\n ? Math.max(window.innerHeight - menuHeight - ESTIMATED_MENU_PADDING, 0)\n : yPos;\n const adjustedXPos =\n xPos + menuWidth > window.innerWidth\n ? Math.max(window.innerWidth - menuWidth - ESTIMATED_MENU_PADDING, 0)\n : xPos;\n\n return (\n <div\n ref={ref}\n className={[styles.contextMenu, visible ? styles.visible : styles.hidden]\n .filter((c) => c !== \"\")\n .join(\" \")}\n style={{\n top: `${adjustedYPos}px`,\n left: `${adjustedXPos}px`,\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {entries.map((entry, i) => (\n <ContextMenuEntry\n key={i}\n entry={entry}\n toClose={toClose}\n />\n ))}\n </div>\n );\n },\n);\n\nContextMenu.displayName = \"ContextMenu\";\n",".anchor {\n position: absolute;\n top: 0;\n left: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\",\n \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", sans-serif;\n font-size: 9pt;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.contextMenuHandler {\n height: fit-content;\n width: fit-content;\n}\n\n.contextMenu {\n position: absolute;\n border: 1px solid;\n border-color: rgb(17, 20, 24);\n opacity: 1;\n background-color: rgb(251, 253, 246);\n z-index: 10000;\n box-shadow: 4px 4px 4px rgb(64, 64, 64, 0.75);\n transition: opacity 0.3s linear;\n}\n\n.contextMenu.hidden {\n opacity: 0;\n}\n\n.contextMenu.visible {\n opacity: 1;\n}\n\n.contextMenuItem {\n color: rgb(17, 20, 24);\n cursor: pointer;\n padding: 0 4px;\n min-width: 80px;\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n white-space: nowrap;\n}\n\n.contextMenuItem.disabled {\n background-color: rgba(0, 0, 0, 0.2);\n cursor: not-allowed;\n}\n\n.contextMenuItem:first-child {\n padding-top: 4px;\n}\n\n.contextMenuItem:last-child {\n padding-bottom: 4px;\n}\n\n.contextMenuItem:not(.disabled):hover {\n background-color: rgb(251, 233, 230);\n}\n\n.contextMenuItem .caretHolder {\n align-self: flex-end;\n}\n\n.contextMenuItem .caretHolder .subMenu {\n z-index: 1;\n position: relative;\n}\n\n.contextMenuItemLabel {\n flex-grow: 1;\n height: 19px;\n}\n","import { useState } from \"react\";\nimport styles from \"./ContextMenu.module.css\";\nimport { ContextSubMenu } from \"./ContextSubMenu\";\nimport { IMenuItem } from \"./interface\";\n\ninterface ContextMenuEntryProps {\n entry: IMenuItem;\n toClose: () => void;\n}\n\nexport const ContextMenuEntry = ({ entry, toClose }: ContextMenuEntryProps) => {\n const [target, setTarget] = useState<Range | null>(null);\n return (\n <div\n className={[styles.contextMenuItem, entry.disabled ? styles.disabled : \"\"]\n .filter((c) => c !== \"\")\n .join(\" \")}\n >\n {typeof entry.label === \"string\" ? (\n <span\n aria-label={entry.label}\n aria-disabled={entry.disabled}\n className={styles.contextMenuItemLabel}\n onMouseEnter={() => {\n const sel = window.getSelection();\n const target = sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null;\n setTarget(target);\n }}\n onMouseLeave={() => {\n setTarget(null);\n }}\n onMouseDownCapture={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!entry.disabled) {\n if (entry.action) {\n entry.action(target, e);\n }\n toClose();\n }\n }}\n >\n {entry.label}\n </span>\n ) : (\n entry.label\n )}\n {entry.group && (\n <ContextSubMenu\n toClose={toClose}\n entries={entry.group}\n />\n )}\n </div>\n );\n};\n","import { useState } from \"react\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./ContextMenu.module.css\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface ContextSubMenuProps {\n entries: IMenuItem[];\n toClose: () => void;\n lowMenu?: boolean;\n}\n\nexport const ContextSubMenu = ({ entries, toClose }: ContextSubMenuProps): React.ReactElement => {\n const [visible, setVisible] = useState<boolean>(false);\n return (\n <span\n className={styles.caretHolder}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <path d=\"m12.14 8.753-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z\" />\n </svg>\n {visible && (\n <div className={styles.subMenu}>\n <ContextMenu\n visible={true}\n entries={entries}\n xPos={14}\n yPos={-21}\n toClose={toClose}\n />\n </div>\n )}\n </span>\n );\n};\n\nContextSubMenu.displayName = \"ContextSubMenu\";\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./ContextMenu.module.css\";\nimport { LowMenu } from \"./LowMenu\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface ContentMenuHandlerContextProps {\n menuItems: IMenuItem[];\n}\nexport const ContentMenuHandlerContext = createContext<ContentMenuHandlerContextProps | null>(null);\n\nexport interface ContextMenuHandlerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n menuItems: IMenuItem[];\n showLowMenu?: boolean;\n}\n\nfunction isDivider(label: string | React.ReactElement): boolean {\n return typeof label !== \"string\" && label.type === \"hr\";\n}\n\nexport const ContextMenuHandler = ({\n children,\n menuItems,\n showLowMenu = false,\n ...rest\n}: ContextMenuHandlerProps): React.ReactElement => {\n // Check for higher content menu\n const higherContext = useContext(ContentMenuHandlerContext);\n const thisMenuItems = useMemo(\n () => [\n ...(higherContext !== null\n ? [\n ...higherContext.menuItems,\n ...[\n higherContext.menuItems.length > 0 &&\n !isDivider(higherContext.menuItems[higherContext.menuItems.length - 1].label) &&\n menuItems.length > 0 &&\n !isDivider(menuItems[0].label)\n ? {\n label: (\n <hr style={{ flexGrow: 1, cursor: \"none\", margin: \"0\", padding: \"0\" }} />\n ),\n }\n : null,\n ].filter((item) => item !== null),\n ]\n : []),\n ...menuItems,\n ],\n [higherContext, menuItems],\n );\n\n // Menu resources\n const divHandlderRef = useRef<HTMLDivElement | null>(null);\n const menuRef = useRef<HTMLDivElement | null>(null);\n const [menuXPos, setMenuXPos] = useState<number>(0);\n const [menuYPos, setMenuYPos] = useState<number>(0);\n const [menuVisible, setMenuVisible] = useState<boolean>(false);\n const [menuInDom, setMenuInDom] = useState<boolean>(false);\n const [mouseOverHandlerDiv, setMouseOverHandlerDiv] = useState<boolean>(false);\n const [mouseOverMenu, setMouseOverMenu] = useState<boolean>(false);\n\n // Holder position - measured in an effect to avoid reading refs during render\n const [divHandlerPos, setDivHandlerPos] = useState<DOMRect | null>(null);\n\n useLayoutEffect(() => {\n function updatePos() {\n if (divHandlderRef.current) {\n setDivHandlerPos(divHandlderRef.current.getBoundingClientRect());\n }\n }\n\n // When the handler is hovered or the menu is mounted, ensure we have a fresh position\n if (mouseOverHandlerDiv || menuInDom) {\n updatePos();\n }\n\n // Attach listeners while the menu/low-menu may be visible so the position stays correct\n if (mouseOverHandlerDiv || menuInDom) {\n window.addEventListener(\"resize\", updatePos);\n // listen on capture to catch scrolls from ancestor elements as well\n window.addEventListener(\"scroll\", updatePos, true);\n\n let ro: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\" && divHandlderRef.current) {\n ro = new ResizeObserver(() => updatePos());\n ro.observe(divHandlderRef.current);\n }\n\n return () => {\n window.removeEventListener(\"resize\", updatePos);\n window.removeEventListener(\"scroll\", updatePos, true);\n if (ro) ro.disconnect();\n };\n }\n }, [mouseOverHandlerDiv, menuInDom]);\n\n // Handle click off the menu\n const handleClick = useCallback((e: globalThis.MouseEvent) => {\n if (\n menuRef.current &&\n ((e.target instanceof Element && !menuRef.current?.contains(e.target)) ||\n !(e.target instanceof Element))\n ) {\n setMenuVisible(false);\n }\n }, []);\n\n // Update the document click handler\n useEffect(() => {\n if (menuVisible) document.addEventListener(\"mousedown\", handleClick);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n };\n }, [handleClick, menuVisible]);\n\n const removeController = useRef<AbortController>(new AbortController());\n useEffect(() => {\n if (!mouseOverMenu && !menuVisible && !mouseOverHandlerDiv) {\n removeController.current.abort();\n removeController.current = new AbortController();\n setTimeout(() => {\n if (!removeController.current.signal.aborted) setMenuInDom(false);\n }, 300);\n }\n }, [mouseOverHandlerDiv, menuVisible, mouseOverMenu]);\n\n return (\n <ContentMenuHandlerContext.Provider\n value={{\n menuItems: thisMenuItems,\n }}\n >\n <div\n ref={divHandlderRef}\n {...rest}\n className={[styles.contextMenuHandler, rest.className].join(\" \")}\n onContextMenu={async (e) => {\n if (!showLowMenu) {\n setMenuInDom(true);\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n removeController.current.abort();\n setMenuVisible(true);\n setMenuXPos(e.pageX);\n setMenuYPos(e.pageY);\n }, 1);\n }\n }}\n onMouseEnter={async (e) => {\n if (showLowMenu) {\n setMenuInDom(true);\n setMouseOverHandlerDiv(false);\n setTimeout(() => {\n removeController.current.abort();\n setMouseOverHandlerDiv(true);\n }, 1);\n }\n rest.onMouseEnter?.(e);\n }}\n onMouseLeave={async (e) => {\n if (showLowMenu) {\n removeController.current.abort();\n removeController.current = new AbortController();\n setMouseOverHandlerDiv(false);\n }\n rest.onMouseLeave?.(e);\n }}\n >\n {children}\n </div>\n {menuInDom &&\n divHandlerPos &&\n createPortal(\n <div\n className={styles.anchor}\n onMouseEnter={() => {\n removeController.current.abort();\n setMouseOverMenu(true);\n }}\n onMouseLeave={() => {\n removeController.current.abort();\n removeController.current = new AbortController();\n setMouseOverMenu(false);\n }}\n >\n {showLowMenu ? (\n <LowMenu\n visible={mouseOverHandlerDiv}\n entries={menuItems}\n xPos={divHandlerPos.left}\n yPos={divHandlerPos.bottom}\n maxWidth={divHandlerPos.width}\n />\n ) : (\n <ContextMenu\n visible={menuVisible}\n ref={menuRef}\n entries={thisMenuItems}\n xPos={menuXPos}\n yPos={menuYPos}\n toClose={() => {\n setMenuVisible(false);\n setMouseOverMenu(false);\n }}\n />\n )}\n </div>,\n document.body,\n )}\n </ContentMenuHandlerContext.Provider>\n );\n};\n\nContextMenuHandler.displayName = \"ContextMenuHandler\";\n","import styles from \"./LowMenu.module.css\";\nimport { LowMenuButton } from \"./LowMenuButton\";\nimport { IMenuItem } from \"./interface\";\n\ninterface LowMenuProps {\n entries: IMenuItem[];\n visible: boolean;\n xPos: number;\n yPos: number;\n maxWidth: number;\n}\n\nexport const LowMenu = ({\n entries,\n visible,\n xPos,\n yPos,\n maxWidth,\n}: LowMenuProps): React.ReactElement => {\n // Only show the low menu if it is on the screen\n if (xPos >= window.innerWidth || yPos >= window.innerHeight) return <></>;\n // Show the menu\n return (\n <div\n className={[styles.lowMenu, visible ? styles.visible : styles.hidden].join(\" \")}\n aria-label=\"Low context menu\"\n style={{\n left: `${xPos}px`,\n top: `${yPos}px`,\n maxWidth: `calc(${maxWidth}px)`,\n width: `calc(${maxWidth}px - 4px)`,\n }}\n >\n <div className={styles.lowMenuButtonHolder}>\n {entries.map((e, i) => (\n <LowMenuButton\n key={i}\n entry={e}\n />\n ))}\n </div>\n </div>\n );\n};\n\nLowMenu.displayName = \"LowMenu\";\n",".lowMenu {\n z-index: 2;\n position: absolute;\n margin: 0px;\n transition: opacity 0.3s linear;\n}\n\n.lowMenuButtonHolder {\n border: 2px solid rgb(17, 20, 24);\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n background-color: rgb(17, 20, 24);\n box-shadow: 2px 2px 2px rgb(64, 64, 64, 0.5);\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n gap: 2px;\n row-gap: 2px;\n width: fit-content;\n}\n\n.lowMenu.hidden {\n opacity: 0;\n}\n\n.lowMenu.visible,\n.lowMenu:hover {\n opacity: 1;\n}\n\n.lowMenuItem {\n background-color: rgb(251, 253, 246);\n border: 0;\n color: rgb(17, 20, 24);\n cursor: pointer;\n padding: 0 4px;\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n white-space: nowrap;\n}\n\n.lowMenuItem.disabled {\n background-color: rgba(200, 200, 200);\n cursor: not-allowed;\n}\n\n.lowMenuItem:not(.disabled):hover {\n background-color: rgb(251, 233, 230);\n}\n\n.lowMenu-item .caretHolder {\n align-self: flex-end;\n}\n\n.lowMenuItem .caretHolder .subMenu {\n z-index: 1;\n position: relative;\n}\n","import { useState } from \"react\";\nimport styles from \"./LowMenu.module.css\";\nimport { LowSubMenu } from \"./LowSubMenu\";\nimport { IMenuItem } from \"./interface\";\n\ninterface LowMenuButtonProps {\n entry: IMenuItem;\n}\nexport const LowMenuButton = ({ entry }: LowMenuButtonProps) => {\n const [target, setTarget] = useState<Range | null>(null);\n return (\n <div\n className={[styles.lowMenuItem, entry.disabled ? styles.disabled : \"\"]\n .filter((c) => c !== \"\")\n .join(\" \")}\n aria-label={typeof entry.label === \"string\" ? entry.label : undefined}\n aria-disabled={entry.disabled}\n onMouseEnter={() => {\n const sel = window.getSelection();\n const target = sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null;\n setTarget(target);\n }}\n onMouseLeave={() => {\n setTarget(null);\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!entry.disabled) entry.action?.(target);\n }}\n >\n <span>{entry.label}</span>\n {entry.group && <LowSubMenu entry={entry} />}\n </div>\n );\n};\n\nLowMenuButton.displayName = \"LowMenuButton\";\n","import { useState } from \"react\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./LowMenu.module.css\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface LowSubMenuProps {\n entry: IMenuItem;\n lowMenu?: boolean;\n}\n\nexport const LowSubMenu = ({ entry }: LowSubMenuProps): React.ReactElement => {\n const [visible, setVisible] = useState<boolean>(false);\n if (!entry.group || entry.group.length === 0) return <></>;\n return (\n <span\n aria-label={`Sub menu for ${entry.label}`}\n className={styles.caretHolder}\n onMouseEnter={() => {\n setVisible(true);\n }}\n onMouseLeave={() => {\n setVisible(false);\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <path d=\"m12.14 8.753-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z\" />\n </svg>\n <div className={styles.subMenu}>\n {visible && (\n <ContextMenu\n visible={visible}\n entries={entry.group}\n xPos={14}\n yPos={entry.group.length * -21 - 8}\n toClose={() => setVisible(false)}\n />\n )}\n </div>\n </span>\n );\n};\n\nLowSubMenu.displayName = \"LowSubMenu\";\n","import { ReactNode, useCallback, useEffect, useRef, useState, useTransition } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { chkPosition } from \"../functions/chkPosition\";\nimport styles from \"./ContextWindow.module.css\";\n\nexport const MIN_Z_INDEX = 3000;\nconst CONTEXT_WINDOW_DATA_ATTR = \"data-context-window\";\n\nexport interface ContextWindowProps extends React.HTMLAttributes<HTMLDivElement> {\n id: string;\n visible: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n title: string;\n titleElement?: ReactNode;\n style?: React.CSSProperties;\n children: React.ReactNode;\n minZIndex?: number;\n}\n\n// Helper function to get the highest zIndex from all context windows in the DOM\nconst getMaxZIndex = (componentMinZIndex: number): number => {\n const windows = document.body.querySelectorAll(`[${CONTEXT_WINDOW_DATA_ATTR}]`);\n let maxZIndex = componentMinZIndex - 1;\n windows.forEach((win) => {\n const zIndexStr = (win as HTMLElement).style.zIndex;\n if (zIndexStr) {\n const zIndex = parseInt(zIndexStr, 10);\n if (!isNaN(zIndex) && zIndex > maxZIndex) {\n maxZIndex = zIndex;\n }\n }\n });\n return maxZIndex;\n};\n\nexport const ContextWindow = ({\n id,\n visible,\n title,\n titleElement,\n children,\n onOpen,\n onClose,\n minZIndex = MIN_Z_INDEX,\n ...rest\n}: ContextWindowProps): React.ReactElement => {\n const divRef = useRef<HTMLDivElement | null>(null);\n const windowRef = useRef<HTMLDivElement | null>(null);\n const [zIndex, setZIndex] = useState<number>(minZIndex);\n const resizeListenerRef = useRef<(() => void) | null>(null);\n\n // Track internal state: whether window is in DOM and whether it's been positioned\n const [windowInDOM, setWindowInDOM] = useState<boolean>(false);\n const [windowVisible, setWindowVisible] = useState<boolean>(false);\n const [, startTransition] = useTransition();\n\n // Position\n const windowPos = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const [moving, setMoving] = useState<boolean>(false);\n\n const move = useCallback((x: number, y: number) => {\n if (windowRef.current && windowPos.current) {\n const window = windowRef.current;\n const pos = windowPos.current;\n pos.x += x;\n pos.y += y;\n window.style.transform = `translate(${pos.x}px, ${pos.y}px)`;\n }\n }, []);\n\n const checkPosition = useCallback(() => {\n const chkPos = chkPosition(windowRef);\n move(chkPos.translateX, chkPos.translateY);\n }, [move]);\n\n const mouseMove = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n move(e.movementX, e.movementY);\n },\n [move],\n );\n\n // Store stable references to mouseMove and mouseUp for cleanup\n const mouseMoveRef = useRef(mouseMove);\n const mouseUpRef = useRef<(e: MouseEvent) => void>(() => {});\n\n const mouseUp = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setMoving(false);\n checkPosition();\n document.removeEventListener(\"mousemove\", mouseMoveRef.current);\n document.removeEventListener(\"mouseup\", mouseUpRef.current);\n if (resizeListenerRef.current) {\n window.removeEventListener(\"resize\", resizeListenerRef.current);\n resizeListenerRef.current = null;\n }\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = \"auto\";\n },\n [checkPosition],\n );\n\n // Update refs when callbacks change\n useEffect(() => {\n mouseMoveRef.current = mouseMove;\n mouseUpRef.current = mouseUp;\n }, [mouseMove, mouseUp]);\n\n // Helper function to push this window to the top\n const pushToTop = useCallback(() => {\n const maxZIndex = getMaxZIndex(minZIndex);\n setZIndex(maxZIndex + 1);\n }, [minZIndex]);\n\n // Sync windowInDOM with visible prop using a layout effect to avoid ESLint warnings\n // This effect derives state from props, which is acceptable when there's no synchronous setState\n useEffect(() => {\n if (visible && !windowInDOM) {\n // Window should be in DOM when visible becomes true\n startTransition(() => {\n setWindowInDOM(true);\n });\n } else if (!visible && windowInDOM) {\n // Window should leave DOM when visible becomes false\n startTransition(() => {\n setWindowInDOM(false);\n setWindowVisible(false);\n });\n }\n }, [visible, windowInDOM, startTransition]);\n\n // Position and show window after it's added to DOM\n useEffect(() => {\n if (windowInDOM && !windowVisible && visible && divRef.current && windowRef.current) {\n // Position the window\n const parentPos = divRef.current.getBoundingClientRect();\n const pos = windowRef.current.getBoundingClientRect();\n const windowHeight = pos.bottom - pos.top;\n windowRef.current.style.left = `${parentPos.left}px`;\n windowRef.current.style.top = `${\n parentPos.bottom + windowHeight < window.innerHeight\n ? parentPos.bottom\n : Math.max(0, parentPos.top - windowHeight)\n }px`;\n windowRef.current.style.transform = \"\";\n windowPos.current = { x: 0, y: 0 };\n checkPosition();\n\n // Update z-index and make visible - use startTransition\n const maxZ = getMaxZIndex(minZIndex);\n onOpen?.();\n startTransition(() => {\n setZIndex(maxZ + 1);\n setWindowVisible(true);\n });\n }\n }, [windowInDOM, windowVisible, visible, checkPosition, minZIndex, onOpen, startTransition]);\n\n // Cleanup effect to remove event listeners on unmount\n useEffect(() => {\n return () => {\n // Clean up event listeners if component unmounts while dragging\n document.removeEventListener(\"mousemove\", mouseMoveRef.current);\n document.removeEventListener(\"mouseup\", mouseUpRef.current);\n if (resizeListenerRef.current) {\n window.removeEventListener(\"resize\", resizeListenerRef.current);\n resizeListenerRef.current = null;\n }\n };\n }, []);\n\n return (\n <div\n className={styles.contextWindowAnchor}\n ref={divRef}\n >\n {windowInDOM &&\n createPortal(\n <div\n {...rest}\n ref={windowRef}\n id={id}\n {...{ [CONTEXT_WINDOW_DATA_ATTR]: \"true\" }}\n className={[styles.contextWindow, rest.className].filter((c) => c).join(\" \")}\n style={{\n ...rest.style,\n opacity: moving ? 0.8 : windowVisible ? 1 : 0,\n visibility: windowVisible ? \"visible\" : \"hidden\",\n zIndex: zIndex,\n minHeight: rest.style?.minHeight ?? \"150px\",\n minWidth: rest.style?.minWidth ?? \"200px\",\n maxHeight: rest.style?.maxHeight ?? \"1000px\",\n maxWidth: rest.style?.maxWidth ?? \"1000px\",\n }}\n onClickCapture={(e) => {\n pushToTop();\n rest.onClickCapture?.(e);\n }}\n >\n <div\n className={[styles.contextWindowTitle, moving ? styles.moving : \"\"]\n .filter((c) => c !== \"\")\n .join(\" \")}\n onMouseDown={(e: React.MouseEvent) => {\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = \"none\";\n setMoving(true);\n pushToTop();\n document.addEventListener(\"mouseup\", mouseUpRef.current);\n document.addEventListener(\"mousemove\", mouseMoveRef.current);\n const resizeListener = () => checkPosition();\n resizeListenerRef.current = resizeListener;\n window.addEventListener(\"resize\", resizeListener);\n }}\n >\n <div\n className={styles.contextWindowTitleText}\n title={title}\n >\n {titleElement ? titleElement : title}\n </div>\n <div\n className={styles.contextWindowTitleClose}\n role=\"button\"\n aria-label=\"Close\"\n onClick={onClose}\n title={`Close ${title && title.trim() !== \"\" ? title : \"window\"}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\" />\n </svg>\n </div>\n </div>\n <div className={styles.contextWindowBody}>\n <div>{children}</div>\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n};\n\nContextWindow.displayName = \"ContextWindow\";\n","import { RefObject } from \"react\";\n\n/**\n * Check that an existing div is inside the viewport\n * @param divRef Check div is inside view port, and return n\n * @returns \\{ translateX, translateY \\} Amount to move on X and Y axis\n */\nexport const chkPosition = (\n divRef: RefObject<HTMLDivElement | null>,\n): { translateX: number; translateY: number } => {\n if (!divRef.current) {\n return { translateX: 0, translateY: 0 };\n } else {\n const innerBounce = 16;\n const posn = divRef.current.getBoundingClientRect();\n let translateX = 0;\n if (posn.left < innerBounce) {\n translateX = -posn.left + innerBounce;\n } else if (posn.right > window.innerWidth) {\n translateX = Math.max(-posn.left + innerBounce, window.innerWidth - posn.right - innerBounce);\n }\n let translateY = 0;\n if (posn.top < innerBounce) {\n translateY = -posn.top + innerBounce;\n } else if (posn.bottom > window.innerHeight) {\n translateY = Math.max(\n -posn.top + innerBounce,\n window.innerHeight - posn.bottom - innerBounce,\n );\n }\n return { translateX, translateY };\n }\n};\n",".contextWindowAnchor {\n position: relative;\n}\n\n.contextWindow {\n z-index: 2001;\n border: 1px black solid;\n margin: 0;\n padding: 4px;\n background-color: rgb(250, 250, 250);\n box-shadow: 6px 6px 6px rgb(64, 64, 64, 0.5);\n transition: opacity 0.25s linear;\n justify-content: flex-start;\n position: absolute;\n border-top-left-radius: 8px;\n border-top-right-radius: 8px;\n border-bottom-left-radius: 8px;\n resize: both;\n overflow: auto;\n max-height: 95vh;\n max-width: 95vw;\n}\n\n.contextWindowTitle {\n border-bottom: 1px black dashed;\n box-sizing: unset;\n padding-bottom: 4px;\n margin: 0 4px 3px 4px;\n height: 24px;\n line-height: 24px;\n max-height: 24px;\n cursor: grab;\n font-size: 18px;\n font-weight: 600;\n display: flex;\n flex-direction: row;\n align-items: center;\n width: calc(100% - 8px);\n}\n\n.contextWindowTitle.moving {\n cursor: grabbing;\n}\n\n.contextWindowTitleText {\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: calc(100% - 16px);\n}\n\n.contextWindowTitleClose {\n display: flex;\n color: black;\n height: 16px;\n width: 16px;\n border-radius: 3px;\n margin-left: 2px;\n cursor: pointer;\n line-height: 16px;\n}\n\n.contextWindowTitleClose:hover {\n background-color: black;\n color: white;\n}\n\n.contextWindowBody {\n overflow: auto;\n padding-bottom: 8px;\n margin-right: 4px;\n height: calc(100% - 40px);\n}\n\n.contextWindowBody::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.contextWindowBody::-webkit-scrollbar-track {\n background: white;\n border-radius: 8px;\n}\n\n.contextWindowBody::-webkit-scrollbar-thumb {\n background: lightgrey;\n border: none;\n border-radius: 8px;\n}\n\n.contextWindowBody::-webkit-scrollbar-thumb:hover {\n background: grey;\n}\n"],"names":[],"version":3,"file":"main.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["src/main.ts","global.d.ts","src/components/index.ts","src/components/AutoHeight.tsx","src/components/AutoHeight.module.css","src/components/ClickForMenu.tsx","src/components/ContextMenu.tsx","src/components/ContextMenu.module.css","src/components/ContextMenuEntry.tsx","src/components/ContextSubMenu.tsx","src/components/ContextMenuHandler.tsx","src/components/LowMenu.tsx","src/components/LowMenu.module.css","src/components/LowMenuButton.tsx","src/components/LowSubMenu.tsx","src/components/ContextWindow.tsx","src/functions/chkPosition.ts","src/components/ContextWindow.module.css"],"sourcesContent":["import \"../global.d.ts\";\nexport * from \"./components\";\n","declare module \"*.module.css\" {\n const classes: { readonly [key: string]: string };\n export default classes;\n}\n\n// React 19 act() environment support\ndeclare global {\n var IS_REACT_ACT_ENVIRONMENT: boolean | undefined;\n}\n","import { AutoHeight } from \"./AutoHeight\";\nimport { ClickForMenu } from \"./ClickForMenu\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { ContextMenuHandler } from \"./ContextMenuHandler\";\nimport { ContextWindow } from \"./ContextWindow\";\nimport { IMenuItem } from \"./interface\";\n\nexport { AutoHeight, ClickForMenu, ContextMenu, ContextMenuHandler, ContextWindow };\nexport type { IMenuItem };\n","import { useEffect, useEffectEvent, useLayoutEffect, useRef, useState } from \"react\";\nimport styles from \"./AutoHeight.module.css\";\n\ninterface AutoHeightProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n hide?: boolean;\n duration?: number; // transition duration in ms\n}\n\ntype AnimationState = \"closed\" | \"opening\" | \"open\" | \"closing\";\n\nexport function AutoHeight({\n children,\n hide = false,\n duration = 300,\n ...rest\n}: AutoHeightProps): React.ReactElement {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState<number | null>(null);\n const [animationState, setAnimationState] = useState<AnimationState>(!hide ? \"open\" : \"closed\");\n\n const rafRef = useRef<number | null>(null);\n const timeoutRef = useRef<number | null>(null);\n\n const targetChildren: React.ReactNode =\n animationState === \"closed\" || !children ? null : children;\n\n const setTargetHeight = useEffectEvent((newHeight: number) => {\n setHeight(newHeight);\n });\n\n const transitionToOpening = useEffectEvent((): void => {\n // Cancel any pending close timeout\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n\n setAnimationState(\"opening\");\n\n const id = window.requestAnimationFrame(() => {\n rafRef.current = null;\n setTargetHeight(1);\n\n const frameId = window.requestAnimationFrame(() => {\n const inner = innerRef.current;\n if (inner) {\n setTargetHeight(inner.offsetHeight);\n setAnimationState(\"open\");\n }\n });\n rafRef.current = frameId;\n });\n rafRef.current = id;\n });\n\n const transitionToClosing = useEffectEvent((): void => {\n // Cancel any pending RAF\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n\n setAnimationState(\"closing\");\n setTargetHeight(1);\n\n timeoutRef.current = window.setTimeout(() => {\n timeoutRef.current = null;\n setAnimationState(\"closed\");\n }, duration);\n });\n\n useLayoutEffect(() => {\n if (!hide) {\n // Want to show: transition to open\n if (animationState === \"closed\" || animationState === \"closing\") {\n transitionToOpening();\n }\n // If already opening or open, stay in that state\n } else {\n // Want to hide: transition to closed\n if (animationState === \"open\" || animationState === \"opening\") {\n transitionToClosing();\n }\n }\n }, [hide, animationState]);\n\n // Setup ResizeObserver to track content size changes\n useEffect(() => {\n const transition = innerRef.current;\n if (transition) {\n const observer = new ResizeObserver(() => {\n if (animationState === \"open\") {\n setTargetHeight(transition!.offsetHeight);\n }\n });\n\n observer.observe(transition!);\n\n return () => {\n observer.disconnect();\n };\n }\n }, [animationState]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n };\n }, []);\n\n return (\n <div\n {...rest}\n className={styles.autoHeightWrapper}\n ref={wrapperRef}\n style={{\n ...rest.style,\n display: animationState === \"closed\" ? \"none\" : undefined,\n height: height ? `${height}px` : \"auto\",\n transitionDuration: `${duration}ms`,\n }}\n >\n <div\n className={styles.autoHeightInner}\n ref={innerRef}\n >\n {targetChildren}\n </div>\n </div>\n );\n}\n\nAutoHeight.displayName = \"AutoHeight\";\n",".autoHeightWrapper {\n overflow: hidden;\n transition-timing-function: height ease-in-out width ease-in-out background-color ease-in-out;\n box-sizing: border-box;\n position: relative;\n}\n\n.autoHeightInner {\n height: fit-content;\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./ContextMenu.module.css\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface ClickForMenuProps extends React.HTMLAttributes<HTMLDivElement> {\n id: string;\n menuItems?: IMenuItem[];\n children?: React.ReactNode;\n}\n\nexport const ClickForMenu = ({\n id,\n menuItems,\n children,\n ...rest\n}: ClickForMenuProps): React.ReactElement => {\n // Menu state\n const [menuInDom, setMenuInDom] = useState<boolean>(false);\n const [menuVisible, setMenuVisible] = useState<boolean>(false);\n const [menuXPos, setMenuXPos] = useState<number>(0);\n const [menuYPos, setMenuYPos] = useState<number>(0);\n\n // Set up outsideClick handler\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n // Handle click off the menu\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleClick = (e: MouseEvent) => {\n if (\n menuRef.current &&\n ((e.target instanceof Element && !menuRef.current.contains(e.target)) ||\n !(e.target instanceof Element))\n ) {\n setMenuInDom(false);\n }\n };\n\n const removeController = useRef<AbortController | null>(null);\n const removeTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n useEffect(() => {\n if (!menuVisible && removeTimeoutRef.current === null) {\n // Only create a new controller when scheduling a new timeout\n if (removeController.current) {\n removeController.current.abort();\n }\n removeController.current = new AbortController();\n const controller = removeController.current;\n // Set up the timeout with a reference to the current controller\n removeTimeoutRef.current = setTimeout(() => {\n if (!controller.signal.aborted) setMenuInDom(false);\n removeTimeoutRef.current = null;\n }, 300);\n }\n return () => {\n // Clean up on unmount or when menuVisible changes\n if (removeTimeoutRef.current) {\n clearTimeout(removeTimeoutRef.current);\n removeTimeoutRef.current = null;\n }\n };\n }, [menuVisible]);\n\n // Update the document click handler\n useEffect(() => {\n if (menuInDom) document.addEventListener(\"mousedown\", handleClick);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n if (removeController.current) {\n removeController.current.abort();\n }\n };\n }, [handleClick, menuInDom]);\n\n return (\n <>\n <div\n {...rest}\n id={id}\n onClick={(e) => {\n if (menuItems) {\n setMenuInDom(true);\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n if (removeController.current) {\n removeController.current.abort();\n }\n setMenuVisible(true);\n setMenuXPos(e.pageX);\n setMenuYPos(e.pageY);\n }, 1);\n } else {\n rest.onClick?.(e);\n }\n }}\n >\n {children}\n </div>\n {menuInDom &&\n menuItems &&\n createPortal(\n <div className={styles.anchor}>\n <ContextMenu\n visible={menuVisible}\n ref={menuRef}\n entries={menuItems}\n xPos={menuXPos}\n yPos={menuYPos}\n toClose={() => {\n setMenuVisible(false);\n }}\n />\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nClickForMenu.displayName = \"ClickForMenu\";\n","import React, { forwardRef, useLayoutEffect, useState } from \"react\";\nimport styles from \"./ContextMenu.module.css\";\nimport { ContextMenuEntry } from \"./ContextMenuEntry\";\nimport { IMenuItem } from \"./interface\";\n\n// Constants for menu size estimation when ref is not yet available\nconst ESTIMATED_MENU_ITEM_HEIGHT = 34;\nconst ESTIMATED_MENU_PADDING = 4;\nconst ESTIMATED_MENU_WIDTH = 200;\n\nexport interface ContextMenuProps {\n visible: boolean;\n entries: IMenuItem[];\n xPos: number;\n yPos: number;\n toClose: () => void;\n}\n\nexport const ContextMenu = forwardRef<HTMLDivElement, ContextMenuProps>(\n ({ visible, entries, xPos, yPos, toClose }, ref): React.ReactElement => {\n // Measure menu size after mount/render to avoid accessing refs during render\n const [menuHeight, setMenuHeight] = useState(\n entries.length * ESTIMATED_MENU_ITEM_HEIGHT + ESTIMATED_MENU_PADDING,\n );\n const [menuWidth, setMenuWidth] = useState(ESTIMATED_MENU_WIDTH);\n\n useLayoutEffect(() => {\n // Only measure when visible; ref access inside effect is allowed\n if (visible && ref && typeof ref !== \"function\" && ref.current instanceof HTMLDivElement) {\n setMenuHeight(ref.current.offsetHeight);\n setMenuWidth(ref.current.offsetWidth);\n }\n // When not visible, fall back to estimates\n if (!visible) {\n setMenuHeight(entries.length * ESTIMATED_MENU_ITEM_HEIGHT + ESTIMATED_MENU_PADDING);\n setMenuWidth(ESTIMATED_MENU_WIDTH);\n }\n }, [visible, entries, ref]);\n\n const adjustedYPos =\n yPos + menuHeight > window.innerHeight\n ? Math.max(window.innerHeight - menuHeight - ESTIMATED_MENU_PADDING, 0)\n : yPos;\n const adjustedXPos =\n xPos + menuWidth > window.innerWidth\n ? Math.max(window.innerWidth - menuWidth - ESTIMATED_MENU_PADDING, 0)\n : xPos;\n\n return (\n <div\n ref={ref}\n className={[styles.contextMenu, visible ? styles.visible : styles.hidden]\n .filter((c) => c !== \"\")\n .join(\" \")}\n style={{\n top: `${adjustedYPos}px`,\n left: `${adjustedXPos}px`,\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {entries.map((entry, i) => (\n <ContextMenuEntry\n key={i}\n entry={entry}\n toClose={toClose}\n />\n ))}\n </div>\n );\n },\n);\n\nContextMenu.displayName = \"ContextMenu\";\n",".anchor {\n position: absolute;\n top: 0;\n left: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\",\n \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", sans-serif;\n font-size: 9pt;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.contextMenuHandler {\n height: fit-content;\n width: fit-content;\n}\n\n.contextMenu {\n position: absolute;\n border: 1px solid;\n border-color: rgb(17, 20, 24);\n opacity: 1;\n background-color: rgb(251, 253, 246);\n z-index: 10000;\n box-shadow: 4px 4px 4px rgb(64, 64, 64, 0.75);\n transition: opacity 0.3s linear;\n}\n\n.contextMenu.hidden {\n opacity: 0;\n}\n\n.contextMenu.visible {\n opacity: 1;\n}\n\n.contextMenuItem {\n color: rgb(17, 20, 24);\n cursor: pointer;\n padding: 0 4px;\n min-width: 80px;\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n white-space: nowrap;\n}\n\n.contextMenuItem.disabled {\n background-color: rgba(0, 0, 0, 0.2);\n cursor: not-allowed;\n}\n\n.contextMenuItem:first-child {\n padding-top: 4px;\n}\n\n.contextMenuItem:last-child {\n padding-bottom: 4px;\n}\n\n.contextMenuItem:not(.disabled):hover {\n background-color: rgb(251, 233, 230);\n}\n\n.contextMenuItem .caretHolder {\n align-self: flex-end;\n}\n\n.contextMenuItem .caretHolder .subMenu {\n z-index: 1;\n position: relative;\n}\n\n.contextMenuItemLabel {\n flex-grow: 1;\n height: 19px;\n}\n","import { useState } from \"react\";\nimport styles from \"./ContextMenu.module.css\";\nimport { ContextSubMenu } from \"./ContextSubMenu\";\nimport { IMenuItem } from \"./interface\";\n\ninterface ContextMenuEntryProps {\n entry: IMenuItem;\n toClose: () => void;\n}\n\nexport const ContextMenuEntry = ({ entry, toClose }: ContextMenuEntryProps) => {\n const [target, setTarget] = useState<Range | null>(null);\n return (\n <div\n className={[styles.contextMenuItem, entry.disabled ? styles.disabled : \"\"]\n .filter((c) => c !== \"\")\n .join(\" \")}\n >\n {typeof entry.label === \"string\" ? (\n <span\n aria-label={entry.label}\n aria-disabled={entry.disabled}\n className={styles.contextMenuItemLabel}\n onMouseEnter={() => {\n const sel = window.getSelection();\n const target = sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null;\n setTarget(target);\n }}\n onMouseLeave={() => {\n setTarget(null);\n }}\n onMouseDownCapture={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!entry.disabled) {\n if (entry.action) {\n entry.action(target, e);\n }\n toClose();\n }\n }}\n >\n {entry.label}\n </span>\n ) : (\n entry.label\n )}\n {entry.group && (\n <ContextSubMenu\n toClose={toClose}\n entries={entry.group}\n />\n )}\n </div>\n );\n};\n","import { useState } from \"react\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./ContextMenu.module.css\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface ContextSubMenuProps {\n entries: IMenuItem[];\n toClose: () => void;\n lowMenu?: boolean;\n}\n\nexport const ContextSubMenu = ({ entries, toClose }: ContextSubMenuProps): React.ReactElement => {\n const [visible, setVisible] = useState<boolean>(false);\n return (\n <span\n className={styles.caretHolder}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <path d=\"m12.14 8.753-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z\" />\n </svg>\n {visible && (\n <div className={styles.subMenu}>\n <ContextMenu\n visible={true}\n entries={entries}\n xPos={14}\n yPos={-21}\n toClose={toClose}\n />\n </div>\n )}\n </span>\n );\n};\n\nContextSubMenu.displayName = \"ContextSubMenu\";\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./ContextMenu.module.css\";\nimport { LowMenu } from \"./LowMenu\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface ContentMenuHandlerContextProps {\n menuItems: IMenuItem[];\n}\nexport const ContentMenuHandlerContext = createContext<ContentMenuHandlerContextProps | null>(null);\n\nexport interface ContextMenuHandlerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n menuItems: IMenuItem[];\n showLowMenu?: boolean;\n}\n\nfunction isDivider(label: string | React.ReactElement): boolean {\n return typeof label !== \"string\" && label.type === \"hr\";\n}\n\nexport const ContextMenuHandler = ({\n children,\n menuItems,\n showLowMenu = false,\n ...rest\n}: ContextMenuHandlerProps): React.ReactElement => {\n // Check for higher content menu\n const higherContext = useContext(ContentMenuHandlerContext);\n const thisMenuItems: IMenuItem[] = [\n ...(higherContext !== null\n ? [\n ...higherContext.menuItems,\n ...[\n higherContext.menuItems.length > 0 &&\n !isDivider(higherContext.menuItems[higherContext.menuItems.length - 1].label) &&\n menuItems.length > 0 &&\n !isDivider(menuItems[0].label)\n ? {\n label: <hr style={{ flexGrow: 1, cursor: \"none\", margin: \"0\", padding: \"0\" }} />,\n }\n : null,\n ].filter((item) => item !== null),\n ]\n : []),\n ...menuItems,\n ];\n\n // Menu resources\n const divHandlderRef = useRef<HTMLDivElement | null>(null);\n const menuRef = useRef<HTMLDivElement | null>(null);\n const [menuXPos, setMenuXPos] = useState<number>(0);\n const [menuYPos, setMenuYPos] = useState<number>(0);\n const [menuVisible, setMenuVisible] = useState<boolean>(false);\n const [menuInDom, setMenuInDom] = useState<boolean>(false);\n const [mouseOverHandlerDiv, setMouseOverHandlerDiv] = useState<boolean>(false);\n const [mouseOverMenu, setMouseOverMenu] = useState<boolean>(false);\n\n // Holder position - measured in an effect to avoid reading refs during render\n const [divHandlerPos, setDivHandlerPos] = useState<DOMRect | null>(null);\n\n useLayoutEffect(() => {\n function updatePos() {\n if (divHandlderRef.current) {\n setDivHandlerPos(divHandlderRef.current.getBoundingClientRect());\n }\n }\n\n // When the handler is hovered or the menu is mounted, ensure we have a fresh position\n if (mouseOverHandlerDiv || menuInDom) {\n updatePos();\n }\n\n // Attach listeners while the menu/low-menu may be visible so the position stays correct\n if (mouseOverHandlerDiv || menuInDom) {\n window.addEventListener(\"resize\", updatePos);\n // listen on capture to catch scrolls from ancestor elements as well\n window.addEventListener(\"scroll\", updatePos, true);\n\n let ro: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\" && divHandlderRef.current) {\n ro = new ResizeObserver(() => updatePos());\n ro.observe(divHandlderRef.current);\n }\n\n return () => {\n window.removeEventListener(\"resize\", updatePos);\n window.removeEventListener(\"scroll\", updatePos, true);\n if (ro) ro.disconnect();\n };\n }\n }, [mouseOverHandlerDiv, menuInDom]);\n\n // Handle click off the menu\n const handleClick = useCallback((e: MouseEvent) => {\n if (\n menuRef.current &&\n ((e.target instanceof Element && !menuRef.current?.contains(e.target)) ||\n !(e.target instanceof Element))\n ) {\n setMenuVisible(false);\n }\n }, []);\n\n // Update the document click handler\n useEffect(() => {\n if (menuVisible) document.addEventListener(\"mousedown\", handleClick);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n };\n }, [handleClick, menuVisible]);\n\n const removeController = useRef<AbortController>(new AbortController());\n useEffect(() => {\n if (!mouseOverMenu && !menuVisible && !mouseOverHandlerDiv) {\n removeController.current.abort();\n removeController.current = new AbortController();\n setTimeout(() => {\n if (!removeController.current.signal.aborted) setMenuInDom(false);\n }, 300);\n }\n }, [mouseOverHandlerDiv, menuVisible, mouseOverMenu]);\n\n return (\n <ContentMenuHandlerContext.Provider\n value={{\n menuItems: thisMenuItems,\n }}\n >\n <div\n ref={divHandlderRef}\n {...rest}\n className={[styles.contextMenuHandler, rest.className].join(\" \")}\n onContextMenu={async (e) => {\n if (!showLowMenu) {\n setMenuInDom(true);\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n removeController.current.abort();\n setMenuVisible(true);\n setMenuXPos(e.pageX);\n setMenuYPos(e.pageY);\n }, 1);\n }\n }}\n onMouseEnter={async (e) => {\n if (showLowMenu) {\n setMenuInDom(true);\n setMouseOverHandlerDiv(false);\n setTimeout(() => {\n removeController.current.abort();\n setMouseOverHandlerDiv(true);\n }, 1);\n }\n rest.onMouseEnter?.(e);\n }}\n onMouseLeave={async (e) => {\n if (showLowMenu) {\n removeController.current.abort();\n removeController.current = new AbortController();\n setMouseOverHandlerDiv(false);\n }\n rest.onMouseLeave?.(e);\n }}\n >\n {children}\n </div>\n {menuInDom &&\n divHandlerPos &&\n createPortal(\n <div\n className={styles.anchor}\n onMouseEnter={() => {\n removeController.current.abort();\n setMouseOverMenu(true);\n }}\n onMouseLeave={() => {\n removeController.current.abort();\n removeController.current = new AbortController();\n setMouseOverMenu(false);\n }}\n >\n {showLowMenu ? (\n <LowMenu\n visible={mouseOverHandlerDiv}\n entries={menuItems}\n xPos={divHandlerPos.left}\n yPos={divHandlerPos.bottom}\n maxWidth={divHandlerPos.width}\n />\n ) : (\n <ContextMenu\n visible={menuVisible}\n ref={menuRef}\n entries={thisMenuItems}\n xPos={menuXPos}\n yPos={menuYPos}\n toClose={() => {\n setMenuVisible(false);\n setMouseOverMenu(false);\n }}\n />\n )}\n </div>,\n document.body,\n )}\n </ContentMenuHandlerContext.Provider>\n );\n};\n\nContextMenuHandler.displayName = \"ContextMenuHandler\";\n","import styles from \"./LowMenu.module.css\";\nimport { LowMenuButton } from \"./LowMenuButton\";\nimport { IMenuItem } from \"./interface\";\n\ninterface LowMenuProps {\n entries: IMenuItem[];\n visible: boolean;\n xPos: number;\n yPos: number;\n maxWidth: number;\n}\n\nexport const LowMenu = ({\n entries,\n visible,\n xPos,\n yPos,\n maxWidth,\n}: LowMenuProps): React.ReactElement => {\n // Only show the low menu if it is on the screen\n if (xPos >= window.innerWidth || yPos >= window.innerHeight) return <></>;\n // Show the menu\n return (\n <div\n className={[styles.lowMenu, visible ? styles.visible : styles.hidden].join(\" \")}\n aria-label=\"Low context menu\"\n style={{\n left: `${xPos}px`,\n top: `${yPos}px`,\n maxWidth: `calc(${maxWidth}px)`,\n width: `calc(${maxWidth}px - 4px)`,\n }}\n >\n <div className={styles.lowMenuButtonHolder}>\n {entries.map((e, i) => (\n <LowMenuButton\n key={i}\n entry={e}\n />\n ))}\n </div>\n </div>\n );\n};\n\nLowMenu.displayName = \"LowMenu\";\n",".lowMenu {\n z-index: 2;\n position: absolute;\n margin: 0px;\n transition: opacity 0.3s linear;\n}\n\n.lowMenuButtonHolder {\n border: 2px solid rgb(17, 20, 24);\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n background-color: rgb(17, 20, 24);\n box-shadow: 2px 2px 2px rgb(64, 64, 64, 0.5);\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n gap: 2px;\n row-gap: 2px;\n width: fit-content;\n}\n\n.lowMenu.hidden {\n opacity: 0;\n}\n\n.lowMenu.visible,\n.lowMenu:hover {\n opacity: 1;\n}\n\n.lowMenuItem {\n background-color: rgb(251, 253, 246);\n border: 0;\n color: rgb(17, 20, 24);\n cursor: pointer;\n padding: 0 4px;\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n white-space: nowrap;\n}\n\n.lowMenuItem.disabled {\n background-color: rgba(200, 200, 200);\n cursor: not-allowed;\n}\n\n.lowMenuItem:not(.disabled):hover {\n background-color: rgb(251, 233, 230);\n}\n\n.lowMenu-item .caretHolder {\n align-self: flex-end;\n}\n\n.lowMenuItem .caretHolder .subMenu {\n z-index: 1;\n position: relative;\n}\n","import { useState } from \"react\";\nimport styles from \"./LowMenu.module.css\";\nimport { LowSubMenu } from \"./LowSubMenu\";\nimport { IMenuItem } from \"./interface\";\n\ninterface LowMenuButtonProps {\n entry: IMenuItem;\n}\nexport const LowMenuButton = ({ entry }: LowMenuButtonProps) => {\n const [target, setTarget] = useState<Range | null>(null);\n return (\n <div\n className={[styles.lowMenuItem, entry.disabled ? styles.disabled : \"\"]\n .filter((c) => c !== \"\")\n .join(\" \")}\n aria-label={typeof entry.label === \"string\" ? entry.label : undefined}\n aria-disabled={entry.disabled}\n onMouseEnter={() => {\n const sel = window.getSelection();\n const target = sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null;\n setTarget(target);\n }}\n onMouseLeave={() => {\n setTarget(null);\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!entry.disabled) entry.action?.(target);\n }}\n >\n <span>{entry.label}</span>\n {entry.group && <LowSubMenu entry={entry} />}\n </div>\n );\n};\n\nLowMenuButton.displayName = \"LowMenuButton\";\n","import { useState } from \"react\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport styles from \"./LowMenu.module.css\";\nimport { IMenuItem } from \"./interface\";\n\nexport interface LowSubMenuProps {\n entry: IMenuItem;\n lowMenu?: boolean;\n}\n\nexport const LowSubMenu = ({ entry }: LowSubMenuProps): React.ReactElement => {\n const [visible, setVisible] = useState<boolean>(false);\n if (!entry.group || entry.group.length === 0) return <></>;\n return (\n <span\n aria-label={`Sub menu for ${entry.label}`}\n className={styles.caretHolder}\n onMouseEnter={() => {\n setVisible(true);\n }}\n onMouseLeave={() => {\n setVisible(false);\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <path d=\"m12.14 8.753-5.482 4.796c-.646.566-1.658.106-1.658-.753V3.204a1 1 0 0 1 1.659-.753l5.48 4.796a1 1 0 0 1 0 1.506z\" />\n </svg>\n <div className={styles.subMenu}>\n {visible && (\n <ContextMenu\n visible={visible}\n entries={entry.group}\n xPos={14}\n yPos={entry.group.length * -21 - 8}\n toClose={() => setVisible(false)}\n />\n )}\n </div>\n </span>\n );\n};\n\nLowSubMenu.displayName = \"LowSubMenu\";\n","import { ReactNode, useEffect, useRef, useState, useTransition } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { chkPosition } from \"../functions/chkPosition\";\nimport styles from \"./ContextWindow.module.css\";\n\nexport const MIN_Z_INDEX = 3000;\nconst CONTEXT_WINDOW_DATA_ATTR = \"data-context-window\";\n\nexport interface ContextWindowProps extends React.HTMLAttributes<HTMLDivElement> {\n id: string;\n visible: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n title: string;\n titleElement?: ReactNode;\n style?: React.CSSProperties;\n children: React.ReactNode;\n minZIndex?: number;\n}\n\n// Helper function to get the highest zIndex from all context windows in the DOM\nconst getMaxZIndex = (componentMinZIndex: number): number => {\n const windows = document.body.querySelectorAll(`[${CONTEXT_WINDOW_DATA_ATTR}]`);\n let maxZIndex = componentMinZIndex - 1;\n windows.forEach((win) => {\n const zIndexStr = (win as HTMLElement).style.zIndex;\n if (zIndexStr) {\n const zIndex = parseInt(zIndexStr, 10);\n if (!isNaN(zIndex) && zIndex > maxZIndex) {\n maxZIndex = zIndex;\n }\n }\n });\n return maxZIndex;\n};\n\nexport const ContextWindow = ({\n id,\n visible,\n title,\n titleElement,\n children,\n onOpen,\n onClose,\n minZIndex = MIN_Z_INDEX,\n ...rest\n}: ContextWindowProps): React.ReactElement => {\n const divRef = useRef<HTMLDivElement | null>(null);\n const windowRef = useRef<HTMLDivElement | null>(null);\n const [zIndex, setZIndex] = useState<number>(minZIndex);\n const resizeListenerRef = useRef<(() => void) | null>(null);\n\n // Track internal state: whether window is in DOM and whether it's been positioned\n const [windowInDOM, setWindowInDOM] = useState<boolean>(false);\n const [windowVisible, setWindowVisible] = useState<boolean>(false);\n const [, startTransition] = useTransition();\n\n // Position\n const windowPos = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const [moving, setMoving] = useState<boolean>(false);\n\n const move = (x: number, y: number) => {\n if (windowRef.current && windowPos.current) {\n const window = windowRef.current;\n const pos = windowPos.current;\n pos.x += x;\n pos.y += y;\n window.style.transform = `translate(${pos.x}px, ${pos.y}px)`;\n }\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const checkPosition = () => {\n const chkPos = chkPosition(windowRef);\n move(chkPos.translateX, chkPos.translateY);\n };\n\n const mouseMove = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n move(e.movementX, e.movementY);\n };\n\n // Store stable references to mouseMove and mouseUp for cleanup\n const mouseMoveRef = useRef(mouseMove);\n const mouseUpRef = useRef<(e: MouseEvent) => void>(() => {});\n\n const mouseUp = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setMoving(false);\n checkPosition();\n document.removeEventListener(\"mousemove\", mouseMoveRef.current);\n document.removeEventListener(\"mouseup\", mouseUpRef.current);\n if (resizeListenerRef.current) {\n window.removeEventListener(\"resize\", resizeListenerRef.current);\n resizeListenerRef.current = null;\n }\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = \"auto\";\n };\n\n // Update refs when callbacks change\n useEffect(() => {\n mouseMoveRef.current = mouseMove;\n mouseUpRef.current = mouseUp;\n });\n\n // Helper function to push this window to the top\n const pushToTop = () => {\n const maxZIndex = getMaxZIndex(minZIndex);\n setZIndex(maxZIndex + 1);\n };\n\n // Sync windowInDOM with visible prop using a layout effect to avoid ESLint warnings\n // This effect derives state from props, which is acceptable when there's no synchronous setState\n useEffect(() => {\n if (visible && !windowInDOM) {\n // Window should be in DOM when visible becomes true\n startTransition(() => {\n setWindowInDOM(true);\n });\n } else if (!visible && windowInDOM) {\n // Window should leave DOM when visible becomes false\n startTransition(() => {\n setWindowInDOM(false);\n setWindowVisible(false);\n });\n }\n }, [visible, windowInDOM, startTransition]);\n\n // Position and show window after it's added to DOM\n useEffect(() => {\n if (windowInDOM && !windowVisible && visible && divRef.current && windowRef.current) {\n // Position the window\n const parentPos = divRef.current.getBoundingClientRect();\n const pos = windowRef.current.getBoundingClientRect();\n const windowHeight = pos.bottom - pos.top;\n windowRef.current.style.left = `${parentPos.left}px`;\n windowRef.current.style.top = `${\n parentPos.bottom + windowHeight < window.innerHeight\n ? parentPos.bottom\n : Math.max(0, parentPos.top - windowHeight)\n }px`;\n windowRef.current.style.transform = \"\";\n windowPos.current = { x: 0, y: 0 };\n checkPosition();\n\n // Update z-index and make visible - use startTransition\n const maxZ = getMaxZIndex(minZIndex);\n onOpen?.();\n startTransition(() => {\n setZIndex(maxZ + 1);\n setWindowVisible(true);\n });\n }\n }, [windowInDOM, windowVisible, visible, checkPosition, minZIndex, onOpen, startTransition]);\n\n // Cleanup effect to remove event listeners on unmount\n useEffect(() => {\n return () => {\n // Clean up event listeners if component unmounts while dragging\n document.removeEventListener(\"mousemove\", mouseMoveRef.current);\n document.removeEventListener(\"mouseup\", mouseUpRef.current);\n if (resizeListenerRef.current) {\n window.removeEventListener(\"resize\", resizeListenerRef.current);\n resizeListenerRef.current = null;\n }\n };\n }, []);\n\n return (\n <div\n className={styles.contextWindowAnchor}\n ref={divRef}\n >\n {windowInDOM &&\n createPortal(\n <div\n {...rest}\n ref={windowRef}\n id={id}\n {...{ [CONTEXT_WINDOW_DATA_ATTR]: \"true\" }}\n className={[styles.contextWindow, rest.className].filter((c) => c).join(\" \")}\n style={{\n ...rest.style,\n opacity: moving ? 0.8 : windowVisible ? 1 : 0,\n visibility: windowVisible ? \"visible\" : \"hidden\",\n zIndex: zIndex,\n minHeight: rest.style?.minHeight ?? \"150px\",\n minWidth: rest.style?.minWidth ?? \"200px\",\n maxHeight: rest.style?.maxHeight ?? \"1000px\",\n maxWidth: rest.style?.maxWidth ?? \"1000px\",\n }}\n onClickCapture={(e) => {\n pushToTop();\n rest.onClickCapture?.(e);\n }}\n >\n <div\n className={[styles.contextWindowTitle, moving ? styles.moving : \"\"]\n .filter((c) => c !== \"\")\n .join(\" \")}\n onMouseDown={(e: React.MouseEvent) => {\n if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement))\n e.target.style.userSelect = \"none\";\n setMoving(true);\n pushToTop();\n document.addEventListener(\"mouseup\", mouseUpRef.current);\n document.addEventListener(\"mousemove\", mouseMoveRef.current);\n const resizeListener = () => checkPosition();\n resizeListenerRef.current = resizeListener;\n window.addEventListener(\"resize\", resizeListener);\n }}\n >\n <div\n className={styles.contextWindowTitleText}\n title={title}\n >\n {titleElement ? titleElement : title}\n </div>\n <div\n className={styles.contextWindowTitleClose}\n role=\"button\"\n aria-label=\"Close\"\n onClick={onClose}\n title={`Close ${title && title.trim() !== \"\" ? title : \"window\"}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\" />\n </svg>\n </div>\n </div>\n <div className={styles.contextWindowBody}>\n <div>{children}</div>\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n};\n\nContextWindow.displayName = \"ContextWindow\";\n","import { RefObject } from \"react\";\n\n/**\n * Check that an existing div is inside the viewport\n * @param divRef Check div is inside view port, and return n\n * @returns \\{ translateX, translateY \\} Amount to move on X and Y axis\n */\nexport const chkPosition = (\n divRef: RefObject<HTMLDivElement | null>,\n): { translateX: number; translateY: number } => {\n if (!divRef.current) {\n return { translateX: 0, translateY: 0 };\n } else {\n const innerBounce = 16;\n const posn = divRef.current.getBoundingClientRect();\n let translateX = 0;\n if (posn.left < innerBounce) {\n translateX = -posn.left + innerBounce;\n } else if (posn.right > window.innerWidth) {\n translateX = Math.max(-posn.left + innerBounce, window.innerWidth - posn.right - innerBounce);\n }\n let translateY = 0;\n if (posn.top < innerBounce) {\n translateY = -posn.top + innerBounce;\n } else if (posn.bottom > window.innerHeight) {\n translateY = Math.max(\n -posn.top + innerBounce,\n window.innerHeight - posn.bottom - innerBounce,\n );\n }\n return { translateX, translateY };\n }\n};\n",".contextWindowAnchor {\n position: relative;\n}\n\n.contextWindow {\n z-index: 2001;\n border: 1px black solid;\n margin: 0;\n padding: 4px;\n background-color: rgb(250, 250, 250);\n box-shadow: 6px 6px 6px rgb(64, 64, 64, 0.5);\n transition: opacity 0.25s linear;\n justify-content: flex-start;\n position: absolute;\n border-top-left-radius: 8px;\n border-top-right-radius: 8px;\n border-bottom-left-radius: 8px;\n resize: both;\n overflow: auto;\n max-height: 95vh;\n max-width: 95vw;\n}\n\n.contextWindowTitle {\n border-bottom: 1px black dashed;\n box-sizing: unset;\n padding-bottom: 4px;\n margin: 0 4px 3px 4px;\n height: 24px;\n line-height: 24px;\n max-height: 24px;\n cursor: grab;\n font-size: 18px;\n font-weight: 600;\n display: flex;\n flex-direction: row;\n align-items: center;\n width: calc(100% - 8px);\n}\n\n.contextWindowTitle.moving {\n cursor: grabbing;\n}\n\n.contextWindowTitleText {\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: calc(100% - 16px);\n}\n\n.contextWindowTitleClose {\n display: flex;\n color: black;\n height: 16px;\n width: 16px;\n border-radius: 3px;\n margin-left: 2px;\n cursor: pointer;\n line-height: 16px;\n}\n\n.contextWindowTitleClose:hover {\n background-color: black;\n color: white;\n}\n\n.contextWindowBody {\n overflow: auto;\n padding-bottom: 8px;\n margin-right: 4px;\n height: calc(100% - 40px);\n}\n\n.contextWindowBody::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.contextWindowBody::-webkit-scrollbar-track {\n background: white;\n border-radius: 8px;\n}\n\n.contextWindowBody::-webkit-scrollbar-thumb {\n background: lightgrey;\n border: none;\n border-radius: 8px;\n}\n\n.contextWindowBody::-webkit-scrollbar-thumb:hover {\n background: grey;\n}\n"],"names":[],"version":3,"file":"main.js.map"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@asup/context-menu",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "REACT Typescript Context menu component",
|
|
5
5
|
"author": "Paul Thomas <@PaulDThomas>",
|
|
6
6
|
"private": false,
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"build-storybook": "storybook build"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@swc/helpers": "^0.5.
|
|
49
|
+
"@swc/helpers": "^0.5.18",
|
|
50
50
|
"react": "^19.0.0",
|
|
51
51
|
"react-dom": "^19.0.0"
|
|
52
52
|
},
|
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
"react-dom": "^19.0.0"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
+
"@chromatic-com/storybook": "^5.0.0",
|
|
58
59
|
"@eslint/compat": "^2.0.0",
|
|
59
60
|
"@eslint/eslintrc": "^3.3.3",
|
|
60
61
|
"@eslint/js": "^9.28.0",
|
|
@@ -62,6 +63,11 @@
|
|
|
62
63
|
"@parcel/packager-ts": "^2.8.3",
|
|
63
64
|
"@parcel/transformer-typescript-types": "^2.8.0",
|
|
64
65
|
"@parcel/transformer-webmanifest": "^2.7.0",
|
|
66
|
+
"@storybook/addon-a11y": "^10.1.11",
|
|
67
|
+
"@storybook/addon-docs": "^10.1.11",
|
|
68
|
+
"@storybook/addon-onboarding": "^10.1.11",
|
|
69
|
+
"@storybook/addon-vitest": "^10.1.11",
|
|
70
|
+
"@storybook/react-vite": "^10.1.11",
|
|
65
71
|
"@testing-library/jest-dom": "^6.4.2",
|
|
66
72
|
"@testing-library/react": "^16.0.0",
|
|
67
73
|
"@testing-library/user-event": "^14.4.3",
|
|
@@ -71,12 +77,15 @@
|
|
|
71
77
|
"@types/react-dom": "^19.0.0",
|
|
72
78
|
"@typescript-eslint/eslint-plugin": "^8.34.0",
|
|
73
79
|
"@typescript-eslint/parser": "^8.34.0",
|
|
80
|
+
"@vitest/browser-playwright": "^4.0.14",
|
|
81
|
+
"@vitest/coverage-v8": "^4.0.14",
|
|
74
82
|
"eslint": "^9.28.0",
|
|
75
83
|
"eslint-config-prettier": "^10.1.5",
|
|
76
84
|
"eslint-plugin-jest": "^29.1.0",
|
|
77
85
|
"eslint-plugin-prettier": "^5.1.3",
|
|
78
86
|
"eslint-plugin-react": "^7.31.10",
|
|
79
87
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
88
|
+
"eslint-plugin-storybook": "10.1.11",
|
|
80
89
|
"eslint-plugin-unused-imports": "^4.1.4",
|
|
81
90
|
"husky": "^9.0.11",
|
|
82
91
|
"jest": "^30.2.0",
|
|
@@ -84,26 +93,18 @@
|
|
|
84
93
|
"jest-watch-typeahead": "^3.0.1",
|
|
85
94
|
"lint-staged": "^16.2.7",
|
|
86
95
|
"parcel": "^2.7.0",
|
|
96
|
+
"playwright": "^1.57.0",
|
|
87
97
|
"prettier": "^3.2.5",
|
|
88
98
|
"prettier-plugin-organize-imports": "^4.1.0",
|
|
89
99
|
"process": "^0.11.10",
|
|
100
|
+
"storybook": "^10.1.11",
|
|
90
101
|
"ts-jest": "^29.4.5",
|
|
91
102
|
"ts-jest-mock-import-meta": "^1.2.0",
|
|
92
103
|
"ts-node": "^10.9.1",
|
|
93
104
|
"typescript": "^5.0.4",
|
|
94
105
|
"typescript-eslint": "^8.34.0",
|
|
95
106
|
"typescript-plugin-css-modules": "^5.1.0",
|
|
96
|
-
"
|
|
97
|
-
"@storybook/react-vite": "^10.1.2",
|
|
98
|
-
"@chromatic-com/storybook": "^4.1.3",
|
|
99
|
-
"@storybook/addon-vitest": "^10.1.2",
|
|
100
|
-
"@storybook/addon-a11y": "^10.1.2",
|
|
101
|
-
"@storybook/addon-docs": "^10.1.2",
|
|
102
|
-
"@storybook/addon-onboarding": "^10.1.2",
|
|
103
|
-
"vitest": "^4.0.14",
|
|
104
|
-
"playwright": "^1.57.0",
|
|
105
|
-
"@vitest/browser-playwright": "^4.0.14",
|
|
106
|
-
"@vitest/coverage-v8": "^4.0.14"
|
|
107
|
+
"vitest": "^4.0.14"
|
|
107
108
|
},
|
|
108
109
|
"@parcel/transformer-css": {
|
|
109
110
|
"cssModules": {
|