@asup/context-menu 2.0.0 → 2.0.3
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 +100 -75
- package/dist/cjs/main.js.map +1 -1
- package/dist/context-menu.d.ts.map +1 -1
- package/dist/main.js +101 -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)(()=>{
|
|
@@ -378,6 +415,7 @@ const $a79b75d040e03c92$export$d4ebdd58e04c6ace = (_param)=>{
|
|
|
378
415
|
yPos: menuYPos,
|
|
379
416
|
toClose: ()=>{
|
|
380
417
|
setMenuVisible(false);
|
|
418
|
+
setMenuInDom(false);
|
|
381
419
|
}
|
|
382
420
|
})
|
|
383
421
|
}), document.body)
|
|
@@ -549,27 +587,24 @@ const $3c568ee547c732c3$export$ed4f9641643dc7e4 = (_param)=>{
|
|
|
549
587
|
]);
|
|
550
588
|
// Check for higher content menu
|
|
551
589
|
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
|
-
]);
|
|
590
|
+
const thisMenuItems = [
|
|
591
|
+
...higherContext !== null ? [
|
|
592
|
+
...higherContext.menuItems,
|
|
593
|
+
...[
|
|
594
|
+
higherContext.menuItems.length > 0 && !$3c568ee547c732c3$var$isDivider(higherContext.menuItems[higherContext.menuItems.length - 1].label) && menuItems.length > 0 && !$3c568ee547c732c3$var$isDivider(menuItems[0].label) ? {
|
|
595
|
+
label: /*#__PURE__*/ (0, $gTuX4$reactjsxruntime.jsx)("hr", {
|
|
596
|
+
style: {
|
|
597
|
+
flexGrow: 1,
|
|
598
|
+
cursor: "none",
|
|
599
|
+
margin: "0",
|
|
600
|
+
padding: "0"
|
|
601
|
+
}
|
|
602
|
+
})
|
|
603
|
+
} : null
|
|
604
|
+
].filter((item)=>item !== null)
|
|
605
|
+
] : [],
|
|
606
|
+
...menuItems
|
|
607
|
+
];
|
|
573
608
|
// Menu resources
|
|
574
609
|
const divHandlderRef = (0, $gTuX4$react.useRef)(null);
|
|
575
610
|
const menuRef = (0, $gTuX4$react.useRef)(null);
|
|
@@ -813,7 +848,7 @@ const $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = (_param)=>{
|
|
|
813
848
|
y: 0
|
|
814
849
|
});
|
|
815
850
|
const [moving, setMoving] = (0, $gTuX4$react.useState)(false);
|
|
816
|
-
const move = (
|
|
851
|
+
const move = (x, y)=>{
|
|
817
852
|
if (windowRef.current && windowPos.current) {
|
|
818
853
|
const window1 = windowRef.current;
|
|
819
854
|
const pos = windowPos.current;
|
|
@@ -821,24 +856,21 @@ const $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = (_param)=>{
|
|
|
821
856
|
pos.y += y;
|
|
822
857
|
window1.style.transform = `translate(${pos.x}px, ${pos.y}px)`;
|
|
823
858
|
}
|
|
824
|
-
}
|
|
825
|
-
|
|
859
|
+
};
|
|
860
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
861
|
+
const checkPosition = ()=>{
|
|
826
862
|
const chkPos = (0, $c986bcdcae4b83bd$export$d81cfea7c54be196)(windowRef);
|
|
827
863
|
move(chkPos.translateX, chkPos.translateY);
|
|
828
|
-
}
|
|
829
|
-
|
|
830
|
-
]);
|
|
831
|
-
const mouseMove = (0, $gTuX4$react.useCallback)((e)=>{
|
|
864
|
+
};
|
|
865
|
+
const mouseMove = (e)=>{
|
|
832
866
|
e.preventDefault();
|
|
833
867
|
e.stopPropagation();
|
|
834
868
|
move(e.movementX, e.movementY);
|
|
835
|
-
}
|
|
836
|
-
move
|
|
837
|
-
]);
|
|
869
|
+
};
|
|
838
870
|
// Store stable references to mouseMove and mouseUp for cleanup
|
|
839
871
|
const mouseMoveRef = (0, $gTuX4$react.useRef)(mouseMove);
|
|
840
872
|
const mouseUpRef = (0, $gTuX4$react.useRef)(()=>{});
|
|
841
|
-
const mouseUp = (
|
|
873
|
+
const mouseUp = (e)=>{
|
|
842
874
|
e.preventDefault();
|
|
843
875
|
e.stopPropagation();
|
|
844
876
|
setMoving(false);
|
|
@@ -850,24 +882,17 @@ const $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = (_param)=>{
|
|
|
850
882
|
resizeListenerRef.current = null;
|
|
851
883
|
}
|
|
852
884
|
if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement)) e.target.style.userSelect = "auto";
|
|
853
|
-
}
|
|
854
|
-
checkPosition
|
|
855
|
-
]);
|
|
885
|
+
};
|
|
856
886
|
// Update refs when callbacks change
|
|
857
887
|
(0, $gTuX4$react.useEffect)(()=>{
|
|
858
888
|
mouseMoveRef.current = mouseMove;
|
|
859
889
|
mouseUpRef.current = mouseUp;
|
|
860
|
-
}
|
|
861
|
-
mouseMove,
|
|
862
|
-
mouseUp
|
|
863
|
-
]);
|
|
890
|
+
});
|
|
864
891
|
// Helper function to push this window to the top
|
|
865
|
-
const pushToTop = (
|
|
892
|
+
const pushToTop = ()=>{
|
|
866
893
|
const maxZIndex = $46fb0088a1bbb6d8$var$getMaxZIndex(minZIndex);
|
|
867
894
|
setZIndex(maxZIndex + 1);
|
|
868
|
-
}
|
|
869
|
-
minZIndex
|
|
870
|
-
]);
|
|
895
|
+
};
|
|
871
896
|
// Sync windowInDOM with visible prop using a layout effect to avoid ESLint warnings
|
|
872
897
|
// This effect derives state from props, which is acceptable when there's no synchronous setState
|
|
873
898
|
(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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AIAA,IAAA;AACA,IAAA;AADA,4CAAoC,CAAC,4CAA4C,CAAC;AAClF,4CAAsC,CAAC,8CAA8C,CAAC;;;ADU/E,SAAS,yCAAW;QAAA,YACzB,QAAQ,QACR,OAAO,iBACP,WAAW,KAEK,GALS,QAItB,gEAJsB;QACzB;QACA;QACA;;IAGA,MAAM,aAAa,CAAA,GAAA,mBAAK,EAAkB;IAC1C,MAAM,WAAW,CAAA,GAAA,mBAAK,EAAkB;IACxC,MAAM,CAAC,QAAQ,UAAU,GAAG,CAAA,GAAA,qBAAO,EAAiB;IACpD,MAAM,CAAC,gBAAgB,kBAAkB,GAAG,CAAA,GAAA,qBAAO,EAAkB,CAAC,OAAO,SAAS;IAEtF,MAAM,SAAS,CAAA,GAAA,mBAAK,EAAiB;IACrC,MAAM,aAAa,CAAA,GAAA,mBAAK,EAAiB;IAEzC,MAAM,iBACJ,mBAAmB,YAAY,CAAC,WAAW,OAAO;IAEpD,MAAM,kBAAkB,CAAA,GAAA,2BAAa,EAAE,CAAC;QACtC,UAAU;IACZ;IAEA,MAAM,sBAAsB,CAAA,GAAA,2BAAa,EAAE;QACzC,mCAAmC;QACnC,IAAI,WAAW,OAAO,KAAK,MAAM;YAC/B,aAAa,WAAW,OAAO;YAC/B,WAAW,OAAO,GAAG;QACvB;QAEA,kBAAkB;QAElB,MAAM,KAAK,OAAO,qBAAqB,CAAC;YACtC,OAAO,OAAO,GAAG;YACjB,gBAAgB;YAEhB,MAAM,UAAU,OAAO,qBAAqB,CAAC;gBAC3C,MAAM,QAAQ,SAAS,OAAO;gBAC9B,IAAI,OAAO;oBACT,gBAAgB,MAAM,YAAY;oBAClC,kBAAkB;gBACpB;YACF;YACA,OAAO,OAAO,GAAG;QACnB;QACA,OAAO,OAAO,GAAG;IACnB;IAEA,MAAM,sBAAsB,CAAA,GAAA,2BAAa,EAAE;QACzC,yBAAyB;QACzB,IAAI,OAAO,OAAO,KAAK,MAAM;YAC3B,qBAAqB,OAAO,OAAO;YACnC,OAAO,OAAO,GAAG;QACnB;QAEA,kBAAkB;QAClB,gBAAgB;QAEhB,WAAW,OAAO,GAAG,OAAO,UAAU,CAAC;YACrC,WAAW,OAAO,GAAG;YACrB,kBAAkB;QACpB,GAAG;IACL;IAEA,CAAA,GAAA,4BAAc,EAAE;QACd,IAAI,CAAC,MACH,mCAAmC;QACnC;YAAA,IAAI,mBAAmB,YAAY,mBAAmB,WACpD;QACF,OAGA,qCAAqC;QACrC,IAAI,mBAAmB,UAAU,mBAAmB,WAClD;IAGN,GAAG;QAAC;QAAM;KAAe;IAEzB,qDAAqD;IACrD,CAAA,GAAA,sBAAQ,EAAE;QACR,MAAM,aAAa,SAAS,OAAO;QACnC,IAAI,YAAY;YACd,MAAM,WAAW,IAAI,eAAe;gBAClC,IAAI,mBAAmB,QACrB,gBAAgB,WAAY,YAAY;YAE5C;YAEA,SAAS,OAAO,CAAC;YAEjB,OAAO;gBACL,SAAS,UAAU;YACrB;QACF;IACF,GAAG;QAAC;KAAe;IAEnB,qBAAqB;IACrB,CAAA,GAAA,sBAAQ,EAAE;QACR,OAAO;YACL,IAAI,OAAO,OAAO,KAAK,MAAM;gBAC3B,qBAAqB,OAAO,OAAO;gBACnC,OAAO,OAAO,GAAG;YACnB;YACA,IAAI,WAAW,OAAO,KAAK,MAAM;gBAC/B,aAAa,WAAW,OAAO;gBAC/B,WAAW,OAAO,GAAG;YACvB;QACF;IACF,GAAG,EAAE;IAEL,qBACE,gCAAC,2GACK;QACJ,WAAW,CAAA,GAAA,gEAAK,EAAE,iBAAiB;QACnC,KAAK;QACL,OAAO,oGACF,KAAK,KAAK;YACb,SAAS,mBAAmB,WAAW,SAAS;YAChD,QAAQ,SAAS,GAAG,OAAO,EAAE,CAAC,GAAG;YACjC,oBAAoB,GAAG,SAAS,EAAE,CAAC;;kBAGrC,cAAA,gCAAC;YACC,WAAW,CAAA,GAAA,gEAAK,EAAE,eAAe;YACjC,KAAK;sBAEJ;;;AAIT;AAEA,yCAAW,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;AI9IzB,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AATA,4CAA2B,CAAC,oCAAoC,CAAC;AACjE,4CAAgC,CAAC,yCAAyC,CAAC;AAC3E,4CAAgC,CAAC,yCAAyC,CAAC;AAC3E,4CAAuC,CAAC,gDAAgD,CAAC;AACzF,4CAAoC,CAAC,6CAA6C,CAAC;AACnF,4CAAyC,CAAC,kDAAkD,CAAC;AAC7F,4CAA6B,CAAC,sCAAsC,CAAC;AACrE,4CAA2B,CAAC,oCAAoC,CAAC;AACjE,4CAA4B,CAAC,qCAAqC,CAAC;AACnE,4CAA4B,CAAC,qCAAqC,CAAC;;;;;;;;;;AEE5D,MAAM,4CAAiB,CAAC,WAAE,OAAO,WAAE,OAAO,EAAuB;IACtE,MAAM,CAAC,SAAS,WAAW,GAAG,CAAA,GAAA,qBAAO,EAAW;IAChD,qBACE,iCAAC;QACC,WAAW,CAAA,GAAA,gEAAK,EAAE,WAAW;QAC7B,cAAc,IAAM,WAAW;QAC/B,cAAc,IAAM,WAAW;;0BAE/B,gCAAC;gBACC,OAAM;gBACN,OAAM;gBACN,QAAO;gBACP,MAAK;gBACL,SAAQ;0BAER,cAAA,gCAAC;oBAAK,GAAE;;;YAET,yBACC,gCAAC;gBAAI,WAAW,CAAA,GAAA,gEAAK,EAAE,OAAO;0BAC5B,cAAA,gCAAC,CAAA,GAAA,yCAAU;oBACT,SAAS;oBACT,SAAS;oBACT,MAAM;oBACN,MAAM;oBACN,SAAS;;;;;AAMrB;AAEA,0CAAe,WAAW,GAAG;;;ADjCtB,MAAM,4CAAmB,CAAC,SAAE,KAAK,WAAE,OAAO,EAAyB;IACxE,MAAM,CAAC,QAAQ,UAAU,GAAG,CAAA,GAAA,qBAAO,EAAgB;IACnD,qBACE,iCAAC;QACC,WAAW;YAAC,CAAA,GAAA,gEAAK,EAAE,eAAe;YAAE,MAAM,QAAQ,GAAG,CAAA,GAAA,gEAAK,EAAE,QAAQ,GAAG;SAAG,CACvE,MAAM,CAAC,CAAC,IAAM,MAAM,IACpB,IAAI,CAAC;;YAEP,OAAO,MAAM,KAAK,KAAK,yBACtB,gCAAC;gBACC,cAAY,MAAM,KAAK;gBACvB,iBAAe,MAAM,QAAQ;gBAC7B,WAAW,CAAA,GAAA,gEAAK,EAAE,oBAAoB;gBACtC,cAAc;oBACZ,MAAM,MAAM,OAAO,YAAY;oBAC/B,MAAM,SAAS,OAAO,IAAI,UAAU,GAAG,IAAI,IAAI,UAAU,CAAC,KAAK;oBAC/D,UAAU;gBACZ;gBACA,cAAc;oBACZ,UAAU;gBACZ;gBACA,oBAAoB,CAAC;oBACnB,EAAE,cAAc;oBAChB,EAAE,eAAe;oBACjB,IAAI,CAAC,MAAM,QAAQ,EAAE;wBACnB,IAAI,MAAM,MAAM,EACd,MAAM,MAAM,CAAC,QAAQ;wBAEvB;oBACF;gBACF;0BAEC,MAAM,KAAK;iBAGd,MAAM,KAAK;YAEZ,MAAM,KAAK,kBACV,gCAAC,CAAA,GAAA,yCAAa;gBACZ,SAAS;gBACT,SAAS,MAAM,KAAK;;;;AAK9B;;;AFlDA,mEAAmE;AACnE,MAAM,mDAA6B;AACnC,MAAM,+CAAyB;AAC/B,MAAM,6CAAuB;AAUtB,MAAM,0DAAc,CAAA,GAAA,uBAAS,EAClC,CAAC,WAAE,OAAO,WAAE,OAAO,QAAE,IAAI,QAAE,IAAI,WAAE,OAAO,EAAE,EAAE;IAC1C,6EAA6E;IAC7E,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,qBAAO,EACzC,QAAQ,MAAM,GAAG,mDAA6B;IAEhD,MAAM,CAAC,WAAW,aAAa,GAAG,CAAA,GAAA,qBAAO,EAAE;IAE3C,CAAA,GAAA,4BAAc,EAAE;QACd,iEAAiE;QACjE,IAAI,WAAW,OAAO,OAAO,QAAQ,cAAc,IAAI,OAAO,YAAY,gBAAgB;YACxF,cAAc,IAAI,OAAO,CAAC,YAAY;YACtC,aAAa,IAAI,OAAO,CAAC,WAAW;QACtC;QACA,2CAA2C;QAC3C,IAAI,CAAC,SAAS;YACZ,cAAc,QAAQ,MAAM,GAAG,mDAA6B;YAC5D,aAAa;QACf;IACF,GAAG;QAAC;QAAS;QAAS;KAAI;IAE1B,MAAM,eACJ,OAAO,aAAa,OAAO,WAAW,GAClC,KAAK,GAAG,CAAC,OAAO,WAAW,GAAG,aAAa,8CAAwB,KACnE;IACN,MAAM,eACJ,OAAO,YAAY,OAAO,UAAU,GAChC,KAAK,GAAG,CAAC,OAAO,UAAU,GAAG,YAAY,8CAAwB,KACjE;IAEN,qBACE,gCAAC;QACC,KAAK;QACL,WAAW;YAAC,CAAA,GAAA,gEAAK,EAAE,WAAW;YAAE,UAAU,CAAA,GAAA,gEAAK,EAAE,OAAO,GAAG,CAAA,GAAA,gEAAK,EAAE,MAAM;SAAC,CACtE,MAAM,CAAC,CAAC,IAAM,MAAM,IACpB,IAAI,CAAC;QACR,OAAO;YACL,KAAK,GAAG,aAAa,EAAE,CAAC;YACxB,MAAM,GAAG,aAAa,EAAE,CAAC;QAC3B;QACA,eAAe,CAAC;YACd,EAAE,cAAc;YAChB,EAAE,eAAe;QACnB;kBAEC,QAAQ,GAAG,CAAC,CAAC,OAAO,kBACnB,gCAAC,CAAA,GAAA,yCAAe;gBAEd,OAAO;gBACP,SAAS;eAFJ;;AAOf;AAGF,0CAAY,WAAW,GAAG;;;;AD/DnB,MAAM,4CAAe;QAAC,MAC3B,EAAE,aACF,SAAS,YACT,QAAQ,EAEU,WADf;QAHH;QACA;QACA;;IAGA,aAAa;IACb,MAAM,CAAC,WAAW,aAAa,GAAG,CAAA,GAAA,qBAAO,EAAW;IACpD,MAAM,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,qBAAO,EAAW;IACxD,MAAM,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,qBAAO,EAAU;IACjD,MAAM,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,qBAAO,EAAU;IAEjD,8BAA8B;IAC9B,MAAM,UAAU,CAAA,GAAA,mBAAK,EAAyB;IAE9C,4BAA4B;IAC5B,uDAAuD;IACvD,MAAM,cAAc,CAAC;QACnB,IACE,QAAQ,OAAO,IACd,CAAA,AAAC,EAAE,MAAM,YAAY,WAAW,CAAC,QAAQ,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,KACjE,CAAE,CAAA,EAAE,MAAM,YAAY,OAAM,CAAC,GAE/B,aAAa;IAEjB;IAEA,MAAM,mBAAmB,CAAA,GAAA,mBAAK,EAA0B;IACxD,MAAM,mBAAmB,CAAA,GAAA,mBAAK,EAAyB;IACvD,CAAA,GAAA,sBAAQ,EAAE;QACR,IAAI,CAAC,eAAe,iBAAiB,OAAO,KAAK,MAAM;YACrD,6DAA6D;YAC7D,IAAI,iBAAiB,OAAO,EAC1B,iBAAiB,OAAO,CAAC,KAAK;YAEhC,iBAAiB,OAAO,GAAG,IAAI;YAC/B,MAAM,aAAa,iBAAiB,OAAO;YAC3C,gEAAgE;YAChE,iBAAiB,OAAO,GAAG,WAAW;gBACpC,IAAI,CAAC,WAAW,MAAM,CAAC,OAAO,EAAE,aAAa;gBAC7C,iBAAiB,OAAO,GAAG;YAC7B,GAAG;QACL;QACA,OAAO;YACL,kDAAkD;YAClD,IAAI,iBAAiB,OAAO,EAAE;gBAC5B,aAAa,iBAAiB,OAAO;gBACrC,iBAAiB,OAAO,GAAG;YAC7B;QACF;IACF,GAAG;QAAC;KAAY;IAEhB,oCAAoC;IACpC,CAAA,GAAA,sBAAQ,EAAE;QACR,IAAI,WAAW,SAAS,gBAAgB,CAAC,aAAa;QACtD,OAAO;YACL,SAAS,mBAAmB,CAAC,aAAa;YAC1C,IAAI,iBAAiB,OAAO,EAC1B,iBAAiB,OAAO,CAAC,KAAK;QAElC;IACF,GAAG;QAAC;QAAa;KAAU;IAE3B,qBACE;;0BACE,gCAAC,2GACK;gBACJ,IAAI;gBACJ,SAAS,CAAC;wBAcN;oBAbF,IAAI,WAAW;wBACb,aAAa;wBACb,EAAE,cAAc;wBAChB,EAAE,eAAe;wBACjB,WAAW;4BACT,IAAI,iBAAiB,OAAO,EAC1B,iBAAiB,OAAO,CAAC,KAAK;4BAEhC,eAAe;4BACf,YAAY,EAAE,KAAK;4BACnB,YAAY,EAAE,KAAK;wBACrB,GAAG;oBACL,QACE,gBAAA,KAAK,OAAO,cAAZ,oCAAA,mBAAA,MAAe;gBAEnB;0BAEC;;YAEF,aACC,2BACA,CAAA,GAAA,4BAAW,gBACT,gCAAC;gBAAI,WAAW,CAAA,GAAA,gEAAK,EAAE,MAAM;0BAC3B,cAAA,gCAAC,CAAA,GAAA,yCAAU;oBACT,SAAS;oBACT,KAAK;oBACL,SAAS;oBACT,MAAM;oBACN,MAAM;oBACN,SAAS;wBACP,eAAe;wBACf,aAAa;oBACf;;gBAGJ,SAAS,IAAI;;;AAIvB;AAEA,0CAAa,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;AO1H3B,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AARA,4CAAgC,CAAC,qCAAqC,CAAC;AACvE,4CAA6B,CAAC,kCAAkC,CAAC;AACjE,4CAA2B,CAAC,gCAAgC,CAAC;AAC7D,2CAA4B,CAAC,iCAAiC,CAAC;AAC/D,4CAAiC,CAAC,sCAAsC,CAAC;AACzE,4CAAwC,CAAC,6CAA6C,CAAC;AACvF,4CAAgC,CAAC,qCAAqC,CAAC;AACvE,4CAA4B,CAAC,iCAAiC,CAAC;AAC/D,4CAA4B,CAAC,iCAAiC,CAAC;;;;;;;;;;AEExD,MAAM,4CAAa,CAAC,SAAE,KAAK,EAAmB;IACnD,MAAM,CAAC,SAAS,WAAW,GAAG,CAAA,GAAA,qBAAO,EAAW;IAChD,IAAI,CAAC,MAAM,KAAK,IAAI,MAAM,KAAK,CAAC,MAAM,KAAK,GAAG,qBAAO;IACrD,qBACE,iCAAC;QACC,cAAY,CAAC,aAAa,EAAE,MAAM,KAAK,EAAE;QACzC,WAAW,CAAA,GAAA,gEAAK,EAAE,WAAW;QAC7B,cAAc;YACZ,WAAW;QACb;QACA,cAAc;YACZ,WAAW;QACb;;0BAEA,gCAAC;gBACC,OAAM;gBACN,OAAM;gBACN,QAAO;gBACP,MAAK;gBACL,SAAQ;0BAER,cAAA,gCAAC;oBAAK,GAAE;;;0BAEV,gCAAC;gBAAI,WAAW,CAAA,GAAA,gEAAK,EAAE,OAAO;0BAC3B,yBACC,gCAAC,CAAA,GAAA,yCAAU;oBACT,SAAS;oBACT,SAAS,MAAM,KAAK;oBACpB,MAAM;oBACN,MAAM,MAAM,KAAK,CAAC,MAAM,GAAG,MAAM;oBACjC,SAAS,IAAM,WAAW;;;;;AAMtC;AAEA,0CAAW,WAAW,GAAG;;;ADxClB,MAAM,4CAAgB,CAAC,SAAE,KAAK,EAAsB;IACzD,MAAM,CAAC,QAAQ,UAAU,GAAG,CAAA,GAAA,qBAAO,EAAgB;IACnD,qBACE,iCAAC;QACC,WAAW;YAAC,CAAA,GAAA,gEAAK,EAAE,WAAW;YAAE,MAAM,QAAQ,GAAG,CAAA,GAAA,gEAAK,EAAE,QAAQ,GAAG;SAAG,CACnE,MAAM,CAAC,CAAC,IAAM,MAAM,IACpB,IAAI,CAAC;QACR,cAAY,OAAO,MAAM,KAAK,KAAK,WAAW,MAAM,KAAK,GAAG;QAC5D,iBAAe,MAAM,QAAQ;QAC7B,cAAc;YACZ,MAAM,MAAM,OAAO,YAAY;YAC/B,MAAM,SAAS,OAAO,IAAI,UAAU,GAAG,IAAI,IAAI,UAAU,CAAC,KAAK;YAC/D,UAAU;QACZ;QACA,cAAc;YACZ,UAAU;QACZ;QACA,SAAS,CAAC;gBAGa;YAFrB,EAAE,cAAc;YAChB,EAAE,eAAe;YACjB,IAAI,CAAC,MAAM,QAAQ,GAAE,gBAAA,MAAM,MAAM,cAAZ,oCAAA,mBAAA,OAAe;QACtC;;0BAEA,gCAAC;0BAAM,MAAM,KAAK;;YACjB,MAAM,KAAK,kBAAI,gCAAC,CAAA,GAAA,yCAAS;gBAAE,OAAO;;;;AAGzC;AAEA,0CAAc,WAAW,GAAG;;;AFzBrB,MAAM,4CAAU,CAAC,WACtB,OAAO,WACP,OAAO,QACP,IAAI,QACJ,IAAI,YACJ,QAAQ,EACK;IACb,gDAAgD;IAChD,IAAI,QAAQ,OAAO,UAAU,IAAI,QAAQ,OAAO,WAAW,EAAE,qBAAO;IACpE,gBAAgB;IAChB,qBACE,gCAAC;QACC,WAAW;YAAC,CAAA,GAAA,gEAAK,EAAE,OAAO;YAAE,UAAU,CAAA,GAAA,gEAAK,EAAE,OAAO,GAAG,CAAA,GAAA,gEAAK,EAAE,MAAM;SAAC,CAAC,IAAI,CAAC;QAC3E,cAAW;QACX,OAAO;YACL,MAAM,GAAG,KAAK,EAAE,CAAC;YACjB,KAAK,GAAG,KAAK,EAAE,CAAC;YAChB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,CAAC;YAC/B,OAAO,CAAC,KAAK,EAAE,SAAS,SAAS,CAAC;QACpC;kBAEA,cAAA,gCAAC;YAAI,WAAW,CAAA,GAAA,gEAAK,EAAE,mBAAmB;sBACvC,QAAQ,GAAG,CAAC,CAAC,GAAG,kBACf,gCAAC,CAAA,GAAA,yCAAY;oBAEX,OAAO;mBADF;;;AAOjB;AAEA,0CAAQ,WAAW,GAAG;;;AD3Bf,MAAM,0DAA4B,CAAA,GAAA,0BAAY,EAAyC;AAQ9F,SAAS,gCAAU,KAAkC;IACnD,OAAO,OAAO,UAAU,YAAY,MAAM,IAAI,KAAK;AACrD;AAEO,MAAM,4CAAqB;QAAC,YACjC,QAAQ,aACR,SAAS,eACT,cAAc,OAEU,WADrB;QAHH;QACA;QACA;;IAGA,gCAAgC;IAChC,MAAM,gBAAgB,CAAA,GAAA,uBAAS,EAAE;IACjC,MAAM,gBAA6B;WAC7B,kBAAkB,OAClB;eACK,cAAc,SAAS;eACvB;gBACD,cAAc,SAAS,CAAC,MAAM,GAAG,KACjC,CAAC,gCAAU,cAAc,SAAS,CAAC,cAAc,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,KAC5E,UAAU,MAAM,GAAG,KACnB,CAAC,gCAAU,SAAS,CAAC,EAAE,CAAC,KAAK,IACzB;oBACE,qBAAO,gCAAC;wBAAG,OAAO;4BAAE,UAAU;4BAAG,QAAQ;4BAAQ,QAAQ;4BAAK,SAAS;wBAAI;;gBAC7E,IACA;aACL,CAAC,MAAM,CAAC,CAAC,OAAS,SAAS;SAC7B,GACD,EAAE;WACH;KACJ;IAED,iBAAiB;IACjB,MAAM,iBAAiB,CAAA,GAAA,mBAAK,EAAyB;IACrD,MAAM,UAAU,CAAA,GAAA,mBAAK,EAAyB;IAC9C,MAAM,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,qBAAO,EAAU;IACjD,MAAM,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,qBAAO,EAAU;IACjD,MAAM,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,qBAAO,EAAW;IACxD,MAAM,CAAC,WAAW,aAAa,GAAG,CAAA,GAAA,qBAAO,EAAW;IACpD,MAAM,CAAC,qBAAqB,uBAAuB,GAAG,CAAA,GAAA,qBAAO,EAAW;IACxE,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,qBAAO,EAAW;IAE5D,8EAA8E;IAC9E,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,qBAAO,EAAkB;IAEnE,CAAA,GAAA,4BAAc,EAAE;QACd,SAAS;YACP,IAAI,eAAe,OAAO,EACxB,iBAAiB,eAAe,OAAO,CAAC,qBAAqB;QAEjE;QAEA,sFAAsF;QACtF,IAAI,uBAAuB,WACzB;QAGF,wFAAwF;QACxF,IAAI,uBAAuB,WAAW;YACpC,OAAO,gBAAgB,CAAC,UAAU;YAClC,oEAAoE;YACpE,OAAO,gBAAgB,CAAC,UAAU,WAAW;YAE7C,IAAI,KAA4B;YAChC,IAAI,OAAO,mBAAmB,eAAe,eAAe,OAAO,EAAE;gBACnE,KAAK,IAAI,eAAe,IAAM;gBAC9B,GAAG,OAAO,CAAC,eAAe,OAAO;YACnC;YAEA,OAAO;gBACL,OAAO,mBAAmB,CAAC,UAAU;gBACrC,OAAO,mBAAmB,CAAC,UAAU,WAAW;gBAChD,IAAI,IAAI,GAAG,UAAU;YACvB;QACF;IACF,GAAG;QAAC;QAAqB;KAAU;IAEnC,4BAA4B;IAC5B,MAAM,cAAc,CAAA,GAAA,wBAAU,EAAE,CAAC;YAGK;QAFpC,IACE,QAAQ,OAAO,IACd,CAAA,AAAC,EAAE,MAAM,YAAY,WAAW,GAAC,mBAAA,QAAQ,OAAO,cAAf,uCAAA,iBAAiB,QAAQ,CAAC,EAAE,MAAM,MAClE,CAAE,CAAA,EAAE,MAAM,YAAY,OAAM,CAAC,GAE/B,eAAe;IAEnB,GAAG,EAAE;IAEL,oCAAoC;IACpC,CAAA,GAAA,sBAAQ,EAAE;QACR,IAAI,aAAa,SAAS,gBAAgB,CAAC,aAAa;QACxD,OAAO;YACL,SAAS,mBAAmB,CAAC,aAAa;QAC5C;IACF,GAAG;QAAC;QAAa;KAAY;IAE7B,MAAM,mBAAmB,CAAA,GAAA,mBAAK,EAAmB,IAAI;IACrD,CAAA,GAAA,sBAAQ,EAAE;QACR,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,qBAAqB;YAC1D,iBAAiB,OAAO,CAAC,KAAK;YAC9B,iBAAiB,OAAO,GAAG,IAAI;YAC/B,WAAW;gBACT,IAAI,CAAC,iBAAiB,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa;YAC7D,GAAG;QACL;IACF,GAAG;QAAC;QAAqB;QAAa;KAAc;IAEpD,qBACE,iCAAC,0CAA0B,QAAQ;QACjC,OAAO;YACL,WAAW;QACb;;0BAEA,gCAAC;gBACC,KAAK;eACD;gBACJ,WAAW;oBAAC,CAAA,GAAA,gEAAK,EAAE,kBAAkB;oBAAE,KAAK,SAAS;iBAAC,CAAC,IAAI,CAAC;gBAC5D,eAAe,OAAO;oBACpB,IAAI,CAAC,aAAa;wBAChB,aAAa;wBACb,EAAE,cAAc;wBAChB,EAAE,eAAe;wBACjB,WAAW;4BACT,iBAAiB,OAAO,CAAC,KAAK;4BAC9B,eAAe;4BACf,YAAY,EAAE,KAAK;4BACnB,YAAY,EAAE,KAAK;wBACrB,GAAG;oBACL;gBACF;gBACA,cAAc,OAAO;wBASnB;oBARA,IAAI,aAAa;wBACf,aAAa;wBACb,uBAAuB;wBACvB,WAAW;4BACT,iBAAiB,OAAO,CAAC,KAAK;4BAC9B,uBAAuB;wBACzB,GAAG;oBACL;qBACA,qBAAA,KAAK,YAAY,cAAjB,yCAAA,wBAAA,MAAoB;gBACtB;gBACA,cAAc,OAAO;wBAMnB;oBALA,IAAI,aAAa;wBACf,iBAAiB,OAAO,CAAC,KAAK;wBAC9B,iBAAiB,OAAO,GAAG,IAAI;wBAC/B,uBAAuB;oBACzB;qBACA,qBAAA,KAAK,YAAY,cAAjB,yCAAA,wBAAA,MAAoB;gBACtB;0BAEC;;YAEF,aACC,+BACA,CAAA,GAAA,4BAAW,gBACT,gCAAC;gBACC,WAAW,CAAA,GAAA,gEAAK,EAAE,MAAM;gBACxB,cAAc;oBACZ,iBAAiB,OAAO,CAAC,KAAK;oBAC9B,iBAAiB;gBACnB;gBACA,cAAc;oBACZ,iBAAiB,OAAO,CAAC,KAAK;oBAC9B,iBAAiB,OAAO,GAAG,IAAI;oBAC/B,iBAAiB;gBACnB;0BAEC,4BACC,gCAAC,CAAA,GAAA,yCAAM;oBACL,SAAS;oBACT,SAAS;oBACT,MAAM,cAAc,IAAI;oBACxB,MAAM,cAAc,MAAM;oBAC1B,UAAU,cAAc,KAAK;mCAG/B,gCAAC,CAAA,GAAA,yCAAU;oBACT,SAAS;oBACT,KAAK;oBACL,SAAS;oBACT,MAAM;oBACN,MAAM;oBACN,SAAS;wBACP,eAAe;wBACf,iBAAiB;oBACnB;;gBAIN,SAAS,IAAI;;;AAIvB;AAEA,0CAAmB,WAAW,GAAG;;;;;;;;;AMrN1B,MAAM,4CAAc,CACzB;IAEA,IAAI,CAAC,OAAO,OAAO,EACjB,OAAO;QAAE,YAAY;QAAG,YAAY;IAAE;SACjC;QACL,MAAM,cAAc;QACpB,MAAM,OAAO,OAAO,OAAO,CAAC,qBAAqB;QACjD,IAAI,aAAa;QACjB,IAAI,KAAK,IAAI,GAAG,aACd,aAAa,CAAC,KAAK,IAAI,GAAG;aACrB,IAAI,KAAK,KAAK,GAAG,OAAO,UAAU,EACvC,aAAa,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,GAAG,aAAa,OAAO,UAAU,GAAG,KAAK,KAAK,GAAG;QAEnF,IAAI,aAAa;QACjB,IAAI,KAAK,GAAG,GAAG,aACb,aAAa,CAAC,KAAK,GAAG,GAAG;aACpB,IAAI,KAAK,MAAM,GAAG,OAAO,WAAW,EACzC,aAAa,KAAK,GAAG,CACnB,CAAC,KAAK,GAAG,GAAG,aACZ,OAAO,WAAW,GAAG,KAAK,MAAM,GAAG;QAGvC,OAAO;wBAAE;wBAAY;QAAW;IAClC;AACF;;;;;;;;;;;;AChCA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AANA,4CAAkC,CAAC,6CAA6C,CAAC;AACjF,4CAAwC,CAAC,mDAAmD,CAAC;AAC7F,4CAAsC,CAAC,iDAAiD,CAAC;AACzF,4CAAuC,CAAC,kDAAkD,CAAC;AAC3F,4CAA4C,CAAC,uDAAuD,CAAC;AACrG,4CAA2C,CAAC,sDAAsD,CAAC;AACnG,4CAA2B,CAAC,sCAAsC,CAAC;;;AFD5D,MAAM,4CAAc;AAC3B,MAAM,iDAA2B;AAcjC,gFAAgF;AAChF,MAAM,qCAAe,CAAC;IACpB,MAAM,UAAU,SAAS,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,+CAAyB,CAAC,CAAC;IAC9E,IAAI,YAAY,qBAAqB;IACrC,QAAQ,OAAO,CAAC,CAAC;QACf,MAAM,YAAY,AAAC,IAAoB,KAAK,CAAC,MAAM;QACnD,IAAI,WAAW;YACb,MAAM,SAAS,SAAS,WAAW;YACnC,IAAI,CAAC,MAAM,WAAW,SAAS,WAC7B,YAAY;QAEhB;IACF;IACA,OAAO;AACT;AAEO,MAAM,4CAAgB;QAAC,MAC5B,EAAE,WACF,OAAO,SACP,KAAK,gBACL,YAAY,YACZ,QAAQ,UACR,MAAM,WACN,OAAO,aACP,YAAY,2CAEO,WADhB;QARH;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAiJuB,aACD,cACC,cACD;IAjJtB,MAAM,SAAS,CAAA,GAAA,mBAAK,EAAyB;IAC7C,MAAM,YAAY,CAAA,GAAA,mBAAK,EAAyB;IAChD,MAAM,CAAC,QAAQ,UAAU,GAAG,CAAA,GAAA,qBAAO,EAAU;IAC7C,MAAM,oBAAoB,CAAA,GAAA,mBAAK,EAAuB;IAEtD,kFAAkF;IAClF,MAAM,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,qBAAO,EAAW;IACxD,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,qBAAO,EAAW;IAC5D,MAAM,GAAG,gBAAgB,GAAG,CAAA,GAAA,0BAAY;IAExC,WAAW;IACX,MAAM,YAAY,CAAA,GAAA,mBAAK,EAA4B;QAAE,GAAG;QAAG,GAAG;IAAE;IAChE,MAAM,CAAC,QAAQ,UAAU,GAAG,CAAA,GAAA,qBAAO,EAAW;IAE9C,MAAM,OAAO,CAAC,GAAW;QACvB,IAAI,UAAU,OAAO,IAAI,UAAU,OAAO,EAAE;YAC1C,MAAM,UAAS,UAAU,OAAO;YAChC,MAAM,MAAM,UAAU,OAAO;YAC7B,IAAI,CAAC,IAAI;YACT,IAAI,CAAC,IAAI;YACT,QAAO,KAAK,CAAC,SAAS,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;QAC9D;IACF;IAEA,uDAAuD;IACvD,MAAM,gBAAgB;QACpB,MAAM,SAAS,CAAA,GAAA,yCAAU,EAAE;QAC3B,KAAK,OAAO,UAAU,EAAE,OAAO,UAAU;IAC3C;IAEA,MAAM,YAAY,CAAC;QACjB,EAAE,cAAc;QAChB,EAAE,eAAe;QACjB,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS;IAC/B;IAEA,+DAA+D;IAC/D,MAAM,eAAe,CAAA,GAAA,mBAAK,EAAE;IAC5B,MAAM,aAAa,CAAA,GAAA,mBAAK,EAA2B,KAAO;IAE1D,MAAM,UAAU,CAAC;QACf,EAAE,cAAc;QAChB,EAAE,eAAe;QACjB,UAAU;QACV;QACA,SAAS,mBAAmB,CAAC,aAAa,aAAa,OAAO;QAC9D,SAAS,mBAAmB,CAAC,WAAW,WAAW,OAAO;QAC1D,IAAI,kBAAkB,OAAO,EAAE;YAC7B,OAAO,mBAAmB,CAAC,UAAU,kBAAkB,OAAO;YAC9D,kBAAkB,OAAO,GAAG;QAC9B;QACA,IAAI,EAAE,MAAM,IAAK,CAAA,EAAE,MAAM,YAAY,eAAe,EAAE,MAAM,YAAY,UAAS,GAC/E,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG;IAChC;IAEA,oCAAoC;IACpC,CAAA,GAAA,sBAAQ,EAAE;QACR,aAAa,OAAO,GAAG;QACvB,WAAW,OAAO,GAAG;IACvB;IAEA,iDAAiD;IACjD,MAAM,YAAY;QAChB,MAAM,YAAY,mCAAa;QAC/B,UAAU,YAAY;IACxB;IAEA,oFAAoF;IACpF,iGAAiG;IACjG,CAAA,GAAA,sBAAQ,EAAE;QACR,IAAI,WAAW,CAAC,aACd,oDAAoD;QACpD,gBAAgB;YACd,eAAe;QACjB;aACK,IAAI,CAAC,WAAW,aACrB,qDAAqD;QACrD,gBAAgB;YACd,eAAe;YACf,iBAAiB;QACnB;IAEJ,GAAG;QAAC;QAAS;QAAa;KAAgB;IAE1C,mDAAmD;IACnD,CAAA,GAAA,sBAAQ,EAAE;QACR,IAAI,eAAe,CAAC,iBAAiB,WAAW,OAAO,OAAO,IAAI,UAAU,OAAO,EAAE;YACnF,sBAAsB;YACtB,MAAM,YAAY,OAAO,OAAO,CAAC,qBAAqB;YACtD,MAAM,MAAM,UAAU,OAAO,CAAC,qBAAqB;YACnD,MAAM,eAAe,IAAI,MAAM,GAAG,IAAI,GAAG;YACzC,UAAU,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,UAAU,IAAI,CAAC,EAAE,CAAC;YACpD,UAAU,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAC5B,UAAU,MAAM,GAAG,eAAe,OAAO,WAAW,GAChD,UAAU,MAAM,GAChB,KAAK,GAAG,CAAC,GAAG,UAAU,GAAG,GAAG,cACjC,EAAE,CAAC;YACJ,UAAU,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG;YACpC,UAAU,OAAO,GAAG;gBAAE,GAAG;gBAAG,GAAG;YAAE;YACjC;YAEA,wDAAwD;YACxD,MAAM,OAAO,mCAAa;YAC1B,mBAAA,6BAAA;YACA,gBAAgB;gBACd,UAAU,OAAO;gBACjB,iBAAiB;YACnB;QACF;IACF,GAAG;QAAC;QAAa;QAAe;QAAS;QAAe;QAAW;QAAQ;KAAgB;IAE3F,sDAAsD;IACtD,CAAA,GAAA,sBAAQ,EAAE;QACR,OAAO;YACL,gEAAgE;YAChE,SAAS,mBAAmB,CAAC,aAAa,aAAa,OAAO;YAC9D,SAAS,mBAAmB,CAAC,WAAW,WAAW,OAAO;YAC1D,IAAI,kBAAkB,OAAO,EAAE;gBAC7B,OAAO,mBAAmB,CAAC,UAAU,kBAAkB,OAAO;gBAC9D,kBAAkB,OAAO,GAAG;YAC9B;QACF;IACF,GAAG,EAAE;QAoBkB,uBACD,sBACC,uBACD;IArBtB,qBACE,gCAAC;QACC,WAAW,CAAA,GAAA,gEAAK,EAAE,mBAAmB;QACrC,KAAK;kBAEJ,6BACC,CAAA,GAAA,4BAAW,gBACT,iCAAC,2GACK;YACJ,KAAK;YACL,IAAI;YACE,CAAC,+CAAyB,EAAE;YAClC,WAAW;gBAAC,CAAA,GAAA,gEAAK,EAAE,aAAa;gBAAE,KAAK,SAAS;aAAC,CAAC,MAAM,CAAC,CAAC,IAAM,GAAG,IAAI,CAAC;YACxE,OAAO,oGACF,KAAK,KAAK;gBACb,SAAS,SAAS,MAAM,gBAAgB,IAAI;gBAC5C,YAAY,gBAAgB,YAAY;gBACxC,QAAQ;gBACR,WAAW,CAAA,yBAAA,cAAA,KAAK,KAAK,cAAV,kCAAA,YAAY,SAAS,cAArB,mCAAA,wBAAyB;gBACpC,UAAU,CAAA,wBAAA,eAAA,KAAK,KAAK,cAAV,mCAAA,aAAY,QAAQ,cAApB,kCAAA,uBAAwB;gBAClC,WAAW,CAAA,yBAAA,eAAA,KAAK,KAAK,cAAV,mCAAA,aAAY,SAAS,cAArB,mCAAA,wBAAyB;gBACpC,UAAU,CAAA,wBAAA,eAAA,KAAK,KAAK,cAAV,mCAAA,aAAY,QAAQ,cAApB,kCAAA,uBAAwB;;YAEpC,gBAAgB,CAAC;oBAEf;gBADA;iBACA,uBAAA,KAAK,cAAc,cAAnB,2CAAA,0BAAA,MAAsB;YACxB;;8BAEA,iCAAC;oBACC,WAAW;wBAAC,CAAA,GAAA,gEAAK,EAAE,kBAAkB;wBAAE,SAAS,CAAA,GAAA,gEAAK,EAAE,MAAM,GAAG;qBAAG,CAChE,MAAM,CAAC,CAAC,IAAM,MAAM,IACpB,IAAI,CAAC;oBACR,aAAa,CAAC;wBACZ,IAAI,EAAE,MAAM,IAAK,CAAA,EAAE,MAAM,YAAY,eAAe,EAAE,MAAM,YAAY,UAAS,GAC/E,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG;wBAC9B,UAAU;wBACV;wBACA,SAAS,gBAAgB,CAAC,WAAW,WAAW,OAAO;wBACvD,SAAS,gBAAgB,CAAC,aAAa,aAAa,OAAO;wBAC3D,MAAM,iBAAiB,IAAM;wBAC7B,kBAAkB,OAAO,GAAG;wBAC5B,OAAO,gBAAgB,CAAC,UAAU;oBACpC;;sCAEA,gCAAC;4BACC,WAAW,CAAA,GAAA,gEAAK,EAAE,sBAAsB;4BACxC,OAAO;sCAEN,eAAe,eAAe;;sCAEjC,gCAAC;4BACC,WAAW,CAAA,GAAA,gEAAK,EAAE,uBAAuB;4BACzC,MAAK;4BACL,cAAW;4BACX,SAAS;4BACT,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,IAAI,OAAO,KAAK,QAAQ,UAAU;sCAEjE,cAAA,gCAAC;gCACC,OAAM;gCACN,OAAM;gCACN,QAAO;gCACP,MAAK;gCACL,SAAQ;0CAER,cAAA,gCAAC;oCAAK,GAAE;;;;;;8BAId,gCAAC;oBAAI,WAAW,CAAA,GAAA,gEAAK,EAAE,iBAAiB;8BACtC,cAAA,gCAAC;kCAAK;;;;aAGV,SAAS,IAAI;;AAIvB;AAEA,0CAAc,WAAW,GAAG;","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 setMenuInDom(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;;CAuGxC,CAAC;AIpGF,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)(()=>{
|
|
@@ -361,6 +398,7 @@ const $c3e82278b501f10c$export$d4ebdd58e04c6ace = (_param)=>{
|
|
|
361
398
|
yPos: menuYPos,
|
|
362
399
|
toClose: ()=>{
|
|
363
400
|
setMenuVisible(false);
|
|
401
|
+
setMenuInDom(false);
|
|
364
402
|
}
|
|
365
403
|
})
|
|
366
404
|
}), document.body)
|
|
@@ -532,27 +570,24 @@ const $1e1c1e9e0b943830$export$ed4f9641643dc7e4 = (_param)=>{
|
|
|
532
570
|
]);
|
|
533
571
|
// Check for higher content menu
|
|
534
572
|
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
|
-
]);
|
|
573
|
+
const thisMenuItems = [
|
|
574
|
+
...higherContext !== null ? [
|
|
575
|
+
...higherContext.menuItems,
|
|
576
|
+
...[
|
|
577
|
+
higherContext.menuItems.length > 0 && !$1e1c1e9e0b943830$var$isDivider(higherContext.menuItems[higherContext.menuItems.length - 1].label) && menuItems.length > 0 && !$1e1c1e9e0b943830$var$isDivider(menuItems[0].label) ? {
|
|
578
|
+
label: /*#__PURE__*/ (0, $duWW8$jsx)("hr", {
|
|
579
|
+
style: {
|
|
580
|
+
flexGrow: 1,
|
|
581
|
+
cursor: "none",
|
|
582
|
+
margin: "0",
|
|
583
|
+
padding: "0"
|
|
584
|
+
}
|
|
585
|
+
})
|
|
586
|
+
} : null
|
|
587
|
+
].filter((item)=>item !== null)
|
|
588
|
+
] : [],
|
|
589
|
+
...menuItems
|
|
590
|
+
];
|
|
556
591
|
// Menu resources
|
|
557
592
|
const divHandlderRef = (0, $duWW8$useRef)(null);
|
|
558
593
|
const menuRef = (0, $duWW8$useRef)(null);
|
|
@@ -796,7 +831,7 @@ const $b5e8657823def5be$export$1af8984c69ba1b24 = (_param)=>{
|
|
|
796
831
|
y: 0
|
|
797
832
|
});
|
|
798
833
|
const [moving, setMoving] = (0, $duWW8$useState)(false);
|
|
799
|
-
const move = (
|
|
834
|
+
const move = (x, y)=>{
|
|
800
835
|
if (windowRef.current && windowPos.current) {
|
|
801
836
|
const window1 = windowRef.current;
|
|
802
837
|
const pos = windowPos.current;
|
|
@@ -804,24 +839,21 @@ const $b5e8657823def5be$export$1af8984c69ba1b24 = (_param)=>{
|
|
|
804
839
|
pos.y += y;
|
|
805
840
|
window1.style.transform = `translate(${pos.x}px, ${pos.y}px)`;
|
|
806
841
|
}
|
|
807
|
-
}
|
|
808
|
-
|
|
842
|
+
};
|
|
843
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
844
|
+
const checkPosition = ()=>{
|
|
809
845
|
const chkPos = (0, $ab4d5d6bf03370d0$export$d81cfea7c54be196)(windowRef);
|
|
810
846
|
move(chkPos.translateX, chkPos.translateY);
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
]);
|
|
814
|
-
const mouseMove = (0, $duWW8$useCallback)((e)=>{
|
|
847
|
+
};
|
|
848
|
+
const mouseMove = (e)=>{
|
|
815
849
|
e.preventDefault();
|
|
816
850
|
e.stopPropagation();
|
|
817
851
|
move(e.movementX, e.movementY);
|
|
818
|
-
}
|
|
819
|
-
move
|
|
820
|
-
]);
|
|
852
|
+
};
|
|
821
853
|
// Store stable references to mouseMove and mouseUp for cleanup
|
|
822
854
|
const mouseMoveRef = (0, $duWW8$useRef)(mouseMove);
|
|
823
855
|
const mouseUpRef = (0, $duWW8$useRef)(()=>{});
|
|
824
|
-
const mouseUp = (
|
|
856
|
+
const mouseUp = (e)=>{
|
|
825
857
|
e.preventDefault();
|
|
826
858
|
e.stopPropagation();
|
|
827
859
|
setMoving(false);
|
|
@@ -833,24 +865,17 @@ const $b5e8657823def5be$export$1af8984c69ba1b24 = (_param)=>{
|
|
|
833
865
|
resizeListenerRef.current = null;
|
|
834
866
|
}
|
|
835
867
|
if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement)) e.target.style.userSelect = "auto";
|
|
836
|
-
}
|
|
837
|
-
checkPosition
|
|
838
|
-
]);
|
|
868
|
+
};
|
|
839
869
|
// Update refs when callbacks change
|
|
840
870
|
(0, $duWW8$useEffect)(()=>{
|
|
841
871
|
mouseMoveRef.current = mouseMove;
|
|
842
872
|
mouseUpRef.current = mouseUp;
|
|
843
|
-
}
|
|
844
|
-
mouseMove,
|
|
845
|
-
mouseUp
|
|
846
|
-
]);
|
|
873
|
+
});
|
|
847
874
|
// Helper function to push this window to the top
|
|
848
|
-
const pushToTop = (
|
|
875
|
+
const pushToTop = ()=>{
|
|
849
876
|
const maxZIndex = $b5e8657823def5be$var$getMaxZIndex(minZIndex);
|
|
850
877
|
setZIndex(maxZIndex + 1);
|
|
851
|
-
}
|
|
852
|
-
minZIndex
|
|
853
|
-
]);
|
|
878
|
+
};
|
|
854
879
|
// Sync windowInDOM with visible prop using a layout effect to avoid ESLint warnings
|
|
855
880
|
// This effect derives state from props, which is acceptable when there's no synchronous setState
|
|
856
881
|
(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 setMenuInDom(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.3",
|
|
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": {
|