@asup/context-menu 2.0.3 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/main.js CHANGED
@@ -822,7 +822,7 @@ const $46fb0088a1bbb6d8$var$getMaxZIndex = (componentMinZIndex)=>{
822
822
  });
823
823
  return maxZIndex;
824
824
  };
825
- const $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = (_param)=>{
825
+ const $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = /*#__PURE__*/ (0, $gTuX4$react.forwardRef)((_param, ref)=>{
826
826
  var { id: id, visible: visible, title: title, titleElement: titleElement, children: children, onOpen: onOpen, onClose: onClose, minZIndex: minZIndex = $46fb0088a1bbb6d8$export$4f9fb66ac71c7da5 } = _param, rest = (0, $gTuX4$swchelperscjs_object_without_propertiescjs._)(_param, [
827
827
  "id",
828
828
  "visible",
@@ -848,7 +848,7 @@ const $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = (_param)=>{
848
848
  y: 0
849
849
  });
850
850
  const [moving, setMoving] = (0, $gTuX4$react.useState)(false);
851
- const move = (x, y)=>{
851
+ const move = (0, $gTuX4$react.useCallback)((x, y)=>{
852
852
  if (windowRef.current && windowPos.current) {
853
853
  const window1 = windowRef.current;
854
854
  const pos = windowPos.current;
@@ -856,43 +856,57 @@ const $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = (_param)=>{
856
856
  pos.y += y;
857
857
  window1.style.transform = `translate(${pos.x}px, ${pos.y}px)`;
858
858
  }
859
- };
860
- // eslint-disable-next-line react-hooks/exhaustive-deps
861
- const checkPosition = ()=>{
859
+ }, []);
860
+ const checkPosition = (0, $gTuX4$react.useCallback)(()=>{
862
861
  const chkPos = (0, $c986bcdcae4b83bd$export$d81cfea7c54be196)(windowRef);
863
862
  move(chkPos.translateX, chkPos.translateY);
864
- };
865
- const mouseMove = (e)=>{
863
+ }, [
864
+ move
865
+ ]);
866
+ const mouseMove = (0, $gTuX4$react.useCallback)((e)=>{
866
867
  e.preventDefault();
867
868
  e.stopPropagation();
868
869
  move(e.movementX, e.movementY);
869
- };
870
- // Store stable references to mouseMove and mouseUp for cleanup
870
+ }, [
871
+ move
872
+ ]);
871
873
  const mouseMoveRef = (0, $gTuX4$react.useRef)(mouseMove);
872
874
  const mouseUpRef = (0, $gTuX4$react.useRef)(()=>{});
873
- const mouseUp = (e)=>{
875
+ const mouseUp = (0, $gTuX4$react.useCallback)((e)=>{
874
876
  e.preventDefault();
875
877
  e.stopPropagation();
876
878
  setMoving(false);
877
879
  checkPosition();
878
- document.removeEventListener("mousemove", mouseMoveRef.current);
879
- document.removeEventListener("mouseup", mouseUpRef.current);
880
+ if (mouseMoveRef.current) document.removeEventListener("mousemove", mouseMoveRef.current);
881
+ if (mouseUpRef.current) document.removeEventListener("mouseup", mouseUpRef.current);
880
882
  if (resizeListenerRef.current) {
881
883
  window.removeEventListener("resize", resizeListenerRef.current);
882
884
  resizeListenerRef.current = null;
883
885
  }
884
886
  if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement)) e.target.style.userSelect = "auto";
885
- };
886
- // Update refs when callbacks change
887
+ }, [
888
+ checkPosition
889
+ ]);
887
890
  (0, $gTuX4$react.useEffect)(()=>{
888
891
  mouseMoveRef.current = mouseMove;
889
892
  mouseUpRef.current = mouseUp;
890
- });
893
+ }, [
894
+ mouseMove,
895
+ mouseUp
896
+ ]);
891
897
  // Helper function to push this window to the top
892
- const pushToTop = ()=>{
898
+ const pushToTop = (0, $gTuX4$react.useCallback)(()=>{
893
899
  const maxZIndex = $46fb0088a1bbb6d8$var$getMaxZIndex(minZIndex);
894
900
  setZIndex(maxZIndex + 1);
895
- };
901
+ }, [
902
+ minZIndex
903
+ ]);
904
+ // Expose pushToTop method via ref
905
+ (0, $gTuX4$react.useImperativeHandle)(ref, ()=>({
906
+ pushToTop: pushToTop
907
+ }), [
908
+ pushToTop
909
+ ]);
896
910
  // Sync windowInDOM with visible prop using a layout effect to avoid ESLint warnings
897
911
  // This effect derives state from props, which is acceptable when there's no synchronous setState
898
912
  (0, $gTuX4$react.useEffect)(()=>{
@@ -946,8 +960,8 @@ const $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = (_param)=>{
946
960
  (0, $gTuX4$react.useEffect)(()=>{
947
961
  return ()=>{
948
962
  // Clean up event listeners if component unmounts while dragging
949
- document.removeEventListener("mousemove", mouseMoveRef.current);
950
- document.removeEventListener("mouseup", mouseUpRef.current);
963
+ if (mouseMoveRef.current) document.removeEventListener("mousemove", mouseMoveRef.current);
964
+ if (mouseUpRef.current) document.removeEventListener("mouseup", mouseUpRef.current);
951
965
  if (resizeListenerRef.current) {
952
966
  window.removeEventListener("resize", resizeListenerRef.current);
953
967
  resizeListenerRef.current = null;
@@ -990,8 +1004,8 @@ const $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = (_param)=>{
990
1004
  if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement)) e.target.style.userSelect = "none";
991
1005
  setMoving(true);
992
1006
  pushToTop();
993
- document.addEventListener("mouseup", mouseUpRef.current);
994
- document.addEventListener("mousemove", mouseMoveRef.current);
1007
+ document.addEventListener("mouseup", mouseUp);
1008
+ document.addEventListener("mousemove", mouseMove);
995
1009
  const resizeListener = ()=>checkPosition();
996
1010
  resizeListenerRef.current = resizeListener;
997
1011
  window.addEventListener("resize", resizeListener);
@@ -1030,7 +1044,7 @@ const $46fb0088a1bbb6d8$export$1af8984c69ba1b24 = (_param)=>{
1030
1044
  ]
1031
1045
  })), document.body)
1032
1046
  });
1033
- };
1047
+ });
1034
1048
  $46fb0088a1bbb6d8$export$1af8984c69ba1b24.displayName = "ContextWindow";
1035
1049
 
1036
1050
 
@@ -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 { 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
+ {"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;;;AFQ5D,MAAM,4CAAc;AAC3B,MAAM,iDAA2B;AAkBjC,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,0DAAgB,CAAA,GAAA,uBAAS,EACpC,SAYE;QAXA,MACE,EAAE,WACF,OAAO,SACP,KAAK,gBACL,YAAY,YACZ,QAAQ,UACR,MAAM,WACN,OAAO,aACP,YAAY,2CAEb,WADI;QARH;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAuKqB,aACD,cACC,cACD;IArKtB,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,CAAA,GAAA,wBAAU,EAAE,CAAC,GAAW;QACnC,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,GAAG,EAAE;IAEL,MAAM,gBAAgB,CAAA,GAAA,wBAAU,EAAE;QAChC,MAAM,SAAS,CAAA,GAAA,yCAAU,EAAE;QAC3B,KAAK,OAAO,UAAU,EAAE,OAAO,UAAU;IAC3C,GAAG;QAAC;KAAK;IAET,MAAM,YAAY,CAAA,GAAA,wBAAU,EAC1B,CAAC;QACC,EAAE,cAAc;QAChB,EAAE,eAAe;QACjB,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS;IAC/B,GACA;QAAC;KAAK;IAGR,MAAM,eAAe,CAAA,GAAA,mBAAK,EAAE;IAC5B,MAAM,aAAa,CAAA,GAAA,mBAAK,EAA2B,KAAO;IAE1D,MAAM,UAAU,CAAA,GAAA,wBAAU,EACxB,CAAC;QACC,EAAE,cAAc;QAChB,EAAE,eAAe;QACjB,UAAU;QACV;QACA,IAAI,aAAa,OAAO,EACtB,SAAS,mBAAmB,CAAC,aAAa,aAAa,OAAO;QAEhE,IAAI,WAAW,OAAO,EACpB,SAAS,mBAAmB,CAAC,WAAW,WAAW,OAAO;QAE5D,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,GACA;QAAC;KAAc;IAGjB,CAAA,GAAA,sBAAQ,EAAE;QACR,aAAa,OAAO,GAAG;QACvB,WAAW,OAAO,GAAG;IACvB,GAAG;QAAC;QAAW;KAAQ;IAEvB,iDAAiD;IACjD,MAAM,YAAY,CAAA,GAAA,wBAAU,EAAE;QAC5B,MAAM,YAAY,mCAAa;QAC/B,UAAU,YAAY;IACxB,GAAG;QAAC;KAAU;IAEd,kCAAkC;IAClC,CAAA,GAAA,gCAAkB,EAChB,KACA,IAAO,CAAA;uBACL;QACF,CAAA,GACA;QAAC;KAAU;IAGb,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,IAAI,aAAa,OAAO,EACtB,SAAS,mBAAmB,CAAC,aAAa,aAAa,OAAO;YAEhE,IAAI,WAAW,OAAO,EACpB,SAAS,mBAAmB,CAAC,WAAW,WAAW,OAAO;YAE5D,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,IACE,EAAE,MAAM,IACP,CAAA,EAAE,MAAM,YAAY,eAAe,EAAE,MAAM,YAAY,UAAS,GAEjE,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG;wBAC9B,UAAU;wBACV;wBACA,SAAS,gBAAgB,CAAC,WAAW;wBACrC,SAAS,gBAAgB,CAAC,aAAa;wBACvC,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;AAGF,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 {\n forwardRef,\n ReactNode,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n useTransition,\n} 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\nexport interface ContextWindowHandle {\n pushToTop: () => void;\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 = forwardRef<ContextWindowHandle, ContextWindowProps>(\n (\n {\n id,\n visible,\n title,\n titleElement,\n children,\n onOpen,\n onClose,\n minZIndex = MIN_Z_INDEX,\n ...rest\n },\n ref,\n ): 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 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 if (mouseMoveRef.current) {\n document.removeEventListener(\"mousemove\", mouseMoveRef.current);\n }\n if (mouseUpRef.current) {\n document.removeEventListener(\"mouseup\", mouseUpRef.current);\n }\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 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 // Expose pushToTop method via ref\n useImperativeHandle(\n ref,\n () => ({\n pushToTop,\n }),\n [pushToTop],\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 if (mouseMoveRef.current) {\n document.removeEventListener(\"mousemove\", mouseMoveRef.current);\n }\n if (mouseUpRef.current) {\n document.removeEventListener(\"mouseup\", mouseUpRef.current);\n }\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 (\n e.target &&\n (e.target instanceof HTMLElement || e.target instanceof SVGElement)\n )\n e.target.style.userSelect = \"none\";\n setMoving(true);\n pushToTop();\n document.addEventListener(\"mouseup\", mouseUp);\n document.addEventListener(\"mousemove\", mouseMove);\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);\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,4 +1,4 @@
1
- import React, { ReactNode } from "react";
1
+ import React, { ReactNode, RefAttributes, ForwardRefExoticComponent } from "react";
2
2
  interface AutoHeightProps extends React.HTMLAttributes<HTMLDivElement> {
3
3
  children: React.ReactNode;
4
4
  hide?: boolean;
@@ -51,9 +51,9 @@ interface ContextWindowProps extends React.HTMLAttributes<HTMLDivElement> {
51
51
  children: React.ReactNode;
52
52
  minZIndex?: number;
53
53
  }
54
- export const ContextWindow: {
55
- ({ id, visible, title, titleElement, children, onOpen, onClose, minZIndex, ...rest }: ContextWindowProps): React.ReactElement;
56
- displayName: string;
57
- };
54
+ interface ContextWindowHandle {
55
+ pushToTop: () => void;
56
+ }
57
+ export const ContextWindow: ForwardRefExoticComponent<ContextWindowProps & RefAttributes<ContextWindowHandle>>;
58
58
 
59
59
  //# sourceMappingURL=context-menu.d.ts.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;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"}
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;AEzMF,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;AAED;IACE,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAkBD,OAAO,MAAM,iGA+OZ,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, 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";
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, useImperativeHandle as $duWW8$useImperativeHandle} from "react";
7
7
  import {createPortal as $duWW8$createPortal} from "react-dom";
8
8
 
9
9
 
@@ -805,7 +805,7 @@ const $b5e8657823def5be$var$getMaxZIndex = (componentMinZIndex)=>{
805
805
  });
806
806
  return maxZIndex;
807
807
  };
808
- const $b5e8657823def5be$export$1af8984c69ba1b24 = (_param)=>{
808
+ const $b5e8657823def5be$export$1af8984c69ba1b24 = /*#__PURE__*/ (0, $duWW8$forwardRef)((_param, ref)=>{
809
809
  var { id: id, visible: visible, title: title, titleElement: titleElement, children: children, onOpen: onOpen, onClose: onClose, minZIndex: minZIndex = $b5e8657823def5be$export$4f9fb66ac71c7da5 } = _param, rest = (0, $duWW8$_2)(_param, [
810
810
  "id",
811
811
  "visible",
@@ -831,7 +831,7 @@ const $b5e8657823def5be$export$1af8984c69ba1b24 = (_param)=>{
831
831
  y: 0
832
832
  });
833
833
  const [moving, setMoving] = (0, $duWW8$useState)(false);
834
- const move = (x, y)=>{
834
+ const move = (0, $duWW8$useCallback)((x, y)=>{
835
835
  if (windowRef.current && windowPos.current) {
836
836
  const window1 = windowRef.current;
837
837
  const pos = windowPos.current;
@@ -839,43 +839,57 @@ const $b5e8657823def5be$export$1af8984c69ba1b24 = (_param)=>{
839
839
  pos.y += y;
840
840
  window1.style.transform = `translate(${pos.x}px, ${pos.y}px)`;
841
841
  }
842
- };
843
- // eslint-disable-next-line react-hooks/exhaustive-deps
844
- const checkPosition = ()=>{
842
+ }, []);
843
+ const checkPosition = (0, $duWW8$useCallback)(()=>{
845
844
  const chkPos = (0, $ab4d5d6bf03370d0$export$d81cfea7c54be196)(windowRef);
846
845
  move(chkPos.translateX, chkPos.translateY);
847
- };
848
- const mouseMove = (e)=>{
846
+ }, [
847
+ move
848
+ ]);
849
+ const mouseMove = (0, $duWW8$useCallback)((e)=>{
849
850
  e.preventDefault();
850
851
  e.stopPropagation();
851
852
  move(e.movementX, e.movementY);
852
- };
853
- // Store stable references to mouseMove and mouseUp for cleanup
853
+ }, [
854
+ move
855
+ ]);
854
856
  const mouseMoveRef = (0, $duWW8$useRef)(mouseMove);
855
857
  const mouseUpRef = (0, $duWW8$useRef)(()=>{});
856
- const mouseUp = (e)=>{
858
+ const mouseUp = (0, $duWW8$useCallback)((e)=>{
857
859
  e.preventDefault();
858
860
  e.stopPropagation();
859
861
  setMoving(false);
860
862
  checkPosition();
861
- document.removeEventListener("mousemove", mouseMoveRef.current);
862
- document.removeEventListener("mouseup", mouseUpRef.current);
863
+ if (mouseMoveRef.current) document.removeEventListener("mousemove", mouseMoveRef.current);
864
+ if (mouseUpRef.current) document.removeEventListener("mouseup", mouseUpRef.current);
863
865
  if (resizeListenerRef.current) {
864
866
  window.removeEventListener("resize", resizeListenerRef.current);
865
867
  resizeListenerRef.current = null;
866
868
  }
867
869
  if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement)) e.target.style.userSelect = "auto";
868
- };
869
- // Update refs when callbacks change
870
+ }, [
871
+ checkPosition
872
+ ]);
870
873
  (0, $duWW8$useEffect)(()=>{
871
874
  mouseMoveRef.current = mouseMove;
872
875
  mouseUpRef.current = mouseUp;
873
- });
876
+ }, [
877
+ mouseMove,
878
+ mouseUp
879
+ ]);
874
880
  // Helper function to push this window to the top
875
- const pushToTop = ()=>{
881
+ const pushToTop = (0, $duWW8$useCallback)(()=>{
876
882
  const maxZIndex = $b5e8657823def5be$var$getMaxZIndex(minZIndex);
877
883
  setZIndex(maxZIndex + 1);
878
- };
884
+ }, [
885
+ minZIndex
886
+ ]);
887
+ // Expose pushToTop method via ref
888
+ (0, $duWW8$useImperativeHandle)(ref, ()=>({
889
+ pushToTop: pushToTop
890
+ }), [
891
+ pushToTop
892
+ ]);
879
893
  // Sync windowInDOM with visible prop using a layout effect to avoid ESLint warnings
880
894
  // This effect derives state from props, which is acceptable when there's no synchronous setState
881
895
  (0, $duWW8$useEffect)(()=>{
@@ -929,8 +943,8 @@ const $b5e8657823def5be$export$1af8984c69ba1b24 = (_param)=>{
929
943
  (0, $duWW8$useEffect)(()=>{
930
944
  return ()=>{
931
945
  // Clean up event listeners if component unmounts while dragging
932
- document.removeEventListener("mousemove", mouseMoveRef.current);
933
- document.removeEventListener("mouseup", mouseUpRef.current);
946
+ if (mouseMoveRef.current) document.removeEventListener("mousemove", mouseMoveRef.current);
947
+ if (mouseUpRef.current) document.removeEventListener("mouseup", mouseUpRef.current);
934
948
  if (resizeListenerRef.current) {
935
949
  window.removeEventListener("resize", resizeListenerRef.current);
936
950
  resizeListenerRef.current = null;
@@ -973,8 +987,8 @@ const $b5e8657823def5be$export$1af8984c69ba1b24 = (_param)=>{
973
987
  if (e.target && (e.target instanceof HTMLElement || e.target instanceof SVGElement)) e.target.style.userSelect = "none";
974
988
  setMoving(true);
975
989
  pushToTop();
976
- document.addEventListener("mouseup", mouseUpRef.current);
977
- document.addEventListener("mousemove", mouseMoveRef.current);
990
+ document.addEventListener("mouseup", mouseUp);
991
+ document.addEventListener("mousemove", mouseMove);
978
992
  const resizeListener = ()=>checkPosition();
979
993
  resizeListenerRef.current = resizeListener;
980
994
  window.addEventListener("resize", resizeListener);
@@ -1013,7 +1027,7 @@ const $b5e8657823def5be$export$1af8984c69ba1b24 = (_param)=>{
1013
1027
  ]
1014
1028
  })), document.body)
1015
1029
  });
1016
- };
1030
+ });
1017
1031
  $b5e8657823def5be$export$1af8984c69ba1b24.displayName = "ContextWindow";
1018
1032
 
1019
1033
 
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 { 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
+ {"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 {\n forwardRef,\n ReactNode,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n useTransition,\n} 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\nexport interface ContextWindowHandle {\n pushToTop: () => void;\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 = forwardRef<ContextWindowHandle, ContextWindowProps>(\n (\n {\n id,\n visible,\n title,\n titleElement,\n children,\n onOpen,\n onClose,\n minZIndex = MIN_Z_INDEX,\n ...rest\n },\n ref,\n ): 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 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 if (mouseMoveRef.current) {\n document.removeEventListener(\"mousemove\", mouseMoveRef.current);\n }\n if (mouseUpRef.current) {\n document.removeEventListener(\"mouseup\", mouseUpRef.current);\n }\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 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 // Expose pushToTop method via ref\n useImperativeHandle(\n ref,\n () => ({\n pushToTop,\n }),\n [pushToTop],\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 if (mouseMoveRef.current) {\n document.removeEventListener(\"mousemove\", mouseMoveRef.current);\n }\n if (mouseUpRef.current) {\n document.removeEventListener(\"mouseup\", mouseUpRef.current);\n }\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 (\n e.target &&\n (e.target instanceof HTMLElement || e.target instanceof SVGElement)\n )\n e.target.style.userSelect = \"none\";\n setMoving(true);\n pushToTop();\n document.addEventListener(\"mouseup\", mouseUp);\n document.addEventListener(\"mousemove\", mouseMove);\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);\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",
3
+ "version": "2.1.0",
4
4
  "description": "REACT Typescript Context menu component",
5
5
  "author": "Paul Thomas <@PaulDThomas>",
6
6
  "private": false,