@vuu-ui/vuu-popups 0.7.0-debug → 0.7.1-debug

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/cjs/index.js CHANGED
@@ -1248,13 +1248,13 @@ var Popup = (props) => {
1248
1248
 
1249
1249
  // src/menu/useContextMenu.tsx
1250
1250
  var import_jsx_runtime6 = require("react/jsx-runtime");
1251
- var useContextMenu = () => {
1251
+ var useContextMenu = (menuBuilder) => {
1252
1252
  const ctx = (0, import_react12.useContext)(ContextMenuContext);
1253
1253
  const buildMenuOptions = (0, import_react12.useCallback)(
1254
1254
  (menuBuilders, location, options) => {
1255
1255
  let results = [];
1256
- for (const menuBuilder of menuBuilders) {
1257
- results = results.concat(menuBuilder(location, options));
1256
+ for (const menuBuilder2 of menuBuilders) {
1257
+ results = results.concat(menuBuilder2(location, options));
1258
1258
  }
1259
1259
  return results;
1260
1260
  },
@@ -1265,23 +1265,29 @@ var useContextMenu = () => {
1265
1265
  var _a;
1266
1266
  e.stopPropagation();
1267
1267
  e.preventDefault();
1268
- const menuBuilders = (_a = ctx == null ? void 0 : ctx.menuBuilders) != null ? _a : [];
1269
- const menuItemDescriptors = buildMenuOptions(
1270
- menuBuilders,
1271
- location,
1272
- options
1273
- );
1274
- console.log({
1275
- menuItemDescriptors
1276
- });
1277
- if (menuItemDescriptors.length && (ctx == null ? void 0 : ctx.menuActionHandler)) {
1278
- console.log(`showContextMenu ${location}`, {
1268
+ const menuBuilders = (_a = ctx == null ? void 0 : ctx.menuBuilders) != null ? _a : menuBuilder ? [menuBuilder] : void 0;
1269
+ if (Array.isArray(menuBuilders) && menuBuilders.length > 0) {
1270
+ const menuItemDescriptors = buildMenuOptions(
1271
+ menuBuilders,
1272
+ location,
1279
1273
  options
1274
+ );
1275
+ console.log({
1276
+ menuItemDescriptors
1280
1277
  });
1281
- showContextMenu(e, menuItemDescriptors, ctx.menuActionHandler);
1278
+ if (menuItemDescriptors.length && (ctx == null ? void 0 : ctx.menuActionHandler)) {
1279
+ console.log(`showContextMenu ${location}`, {
1280
+ options
1281
+ });
1282
+ showContextMenu(e, menuItemDescriptors, ctx.menuActionHandler);
1283
+ }
1284
+ } else {
1285
+ console.warn(
1286
+ "useContextMenu, no menuBuilders configured. These should be supplied via the ContextMenuProvider(s)"
1287
+ );
1282
1288
  }
1283
1289
  },
1284
- [buildMenuOptions, ctx]
1290
+ [buildMenuOptions, ctx == null ? void 0 : ctx.menuActionHandler, ctx == null ? void 0 : ctx.menuBuilders, menuBuilder]
1285
1291
  );
1286
1292
  return handleShowContextMenu;
1287
1293
  };
package/cjs/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/vuu-popups/src/index.ts", "../../../packages/vuu-popups/src/dialog/Dialog.tsx", "../../../packages/vuu-popups/src/portal/Portal.tsx", "../../../packages/vuu-popups/src/portal/render-portal.tsx", "../../../packages/vuu-popups/src/portal/portal-utils.ts", "../../../packages/vuu-popups/src/menu/ContextMenu.tsx", "../../../packages/vuu-popups/src/menu/MenuList.tsx", "../../../packages/vuu-popups/src/menu/use-keyboard-navigation.ts", "../../../packages/vuu-popups/src/menu/utils.ts", "../../../packages/vuu-popups/src/menu/key-code.ts", "../../../packages/vuu-popups/src/menu/use-items-with-ids.ts", "../../../packages/vuu-popups/src/menu/use-cascade.ts", "../../../packages/vuu-popups/src/menu/list-dom-utils.ts", "../../../packages/vuu-popups/src/menu/use-click-away.ts", "../../../packages/vuu-popups/src/menu/context-menu-provider.tsx", "../../../packages/vuu-popups/src/menu/useContextMenu.tsx", "../../../packages/vuu-popups/src/popup/popup-service.ts"],
4
- "sourcesContent": ["export * from \"./dialog\";\nexport * from \"./menu\";\nexport * from \"./popup\";\nexport * from \"./portal\";\n", "import { Scrim, Toolbar, ToolbarButton } from \"@heswell/salt-lab\";\nimport { Text } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { HTMLAttributes, useCallback, useRef, useState } from \"react\";\nimport { Portal } from \"../portal\";\n\nimport \"./Dialog.css\";\n\nconst classBase = \"vuuDialog\";\n\nexport interface DialogProps extends HTMLAttributes<HTMLDivElement> {\n isOpen?: boolean;\n onClose?: () => void;\n}\n\nexport const Dialog = ({\n children,\n className,\n isOpen = false,\n onClose,\n title,\n ...props\n}: DialogProps) => {\n const root = useRef<HTMLDivElement>(null);\n const [posX] = useState(0);\n const [posY] = useState(0);\n\n const close = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n const handleRender = useCallback(() => {\n // if (center && isOpen && root.current) {\n // const { width, height } = root.current.getBoundingClientRect();\n // const { innerWidth, innerHeight } = window;\n // const x = innerWidth / 2 - width / 2;\n // const y = innerHeight / 2 - height / 2;\n // setPosX(x);\n // setPosY(y);\n // }\n }, []);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <Portal onRender={handleRender} x={posX} y={posY}>\n <Scrim className={`${classBase}-scrim`} open={isOpen}>\n <div {...props} className={cx(classBase, className)} ref={root}>\n <Toolbar className={`${classBase}-header`}>\n <Text>{title}</Text>\n <ToolbarButton\n key=\"close\"\n onClick={close}\n data-align-end\n data-icon=\"close\"\n />\n </Toolbar>\n {children}\n </div>\n </Scrim>\n </Portal>\n );\n};\n", "import { ReactElement, useLayoutEffect, useMemo } from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { createContainer, renderPortal } from \"./render-portal\";\n\nexport interface PortalProps {\n children: ReactElement;\n onRender?: () => void;\n x?: number;\n y?: number;\n}\n\nexport const Portal = function Portal({\n children,\n x = 0,\n y = 0,\n onRender,\n}: PortalProps) {\n // Do we need to accept container here as a prop ?\n const renderContainer = useMemo(() => {\n return createContainer();\n }, []);\n\n useLayoutEffect(() => {\n renderPortal(children, renderContainer, x, y, onRender);\n }, [children, onRender, renderContainer, x, y]);\n\n useLayoutEffect(() => {\n return () => {\n if (renderContainer) {\n ReactDOM.unmountComponentAtNode(renderContainer);\n if (renderContainer.classList.contains(\"vuuPopup\")) {\n renderContainer.parentElement?.removeChild(renderContainer);\n }\n }\n };\n }, [renderContainer]);\n\n // useLayoutEffect(() => {\n // renderContainer.current = renderPortal(children, x, y, container)\n // return () => {\n // if (renderContainer.current){\n // console.log('EXPLICIT UNMOUNT')\n // ReactDOM.unmountComponentAtNode(renderContainer.current);\n // if (renderContainer.current.classList.contains('hwReactPopup')){\n // renderContainer.current.parentElement.removeChild(renderContainer.current);\n // renderContainer.current = null;\n // }\n // }\n // }\n // },[])\n return null;\n};\n", "import * as ReactDOM from \"react-dom\";\nimport { SaltProvider } from \"@salt-ds/core\";\nimport { ReactElement } from \"react\";\n\nlet containerId = 1;\n\nconst getPortalContainer = (x = 0, y = 0, win = window) => {\n const el = win.document.createElement(\"div\");\n el.className = \"vuuPopup \" + containerId++;\n el.style.cssText = `left:${x}px; top:${y}px;`;\n win.document.body.appendChild(el);\n return el;\n};\n\nconst createDOMContainer = (x?: number, y?: number) => getPortalContainer(x, y);\n\nexport const renderPortal = (\n component: ReactElement,\n container: HTMLElement,\n x: number,\n y: number,\n onRender?: () => void\n) => {\n // check this first to see if position has changed\n container.style.cssText = `left:${x}px; top:${y}px;position: absolute;`;\n\n ReactDOM.render(\n <SaltProvider applyClassesTo=\"child\">{component}</SaltProvider>,\n container,\n onRender\n );\n};\n\nexport const createContainer = createDOMContainer;\n", "export const installTheme = (themeId: string) => {\n const installedThemes = getComputedStyle(document.body).getPropertyValue(\n \"--installed-themes\"\n );\n document.body.style.setProperty(\n \"--installed-themes\",\n `${installedThemes} ${themeId}`\n );\n};\n", "import { useIdMemo as useId } from \"@salt-ds/core\";\nimport { useCallback, useRef } from \"react\";\nimport { Portal } from \"../portal\";\nimport MenuList, { MenuListProps } from \"./MenuList\";\nimport { getItemId, getMenuId, useCascade } from \"./use-cascade\";\nimport { useClickAway } from \"./use-click-away\";\nimport { useItemsWithIds } from \"./use-items-with-ids\";\n\nexport interface ContextMenuProps extends Omit<MenuListProps, \"onCloseMenu\"> {\n onClose?: (menuId?: string, options?: unknown) => void;\n position?: { x: number; y: number };\n withPortal?: boolean;\n}\n\nconst noop = () => undefined;\n\nexport const ContextMenu = ({\n activatedByKeyboard,\n children: childrenProp,\n className,\n id: idProp,\n onClose = () => undefined,\n position = { x: 0, y: 0 },\n style,\n ...menuListProps\n}: ContextMenuProps) => {\n const id = useId(idProp);\n const closeMenuRef = useRef<(location?: string) => void>(noop);\n const [menus, actions] = useItemsWithIds(childrenProp);\n const navigatingWithKeyboard = useRef(activatedByKeyboard);\n const handleMouseEnterItem = useCallback(() => {\n navigatingWithKeyboard.current = false;\n }, []);\n\n const handleActivate = useCallback(\n (menuId: string) => {\n const { action, options } = actions[menuId];\n closeMenuRef.current(\"root\");\n onClose(action, options);\n },\n [actions, onClose]\n );\n\n const { closeMenu, listItemProps, openMenu, openMenus, handleRender } =\n useCascade({\n id,\n onActivate: handleActivate,\n onMouseEnterItem: handleMouseEnterItem,\n position,\n });\n closeMenuRef.current = closeMenu;\n\n console.log({ openMenus });\n\n const handleClose = useCallback(() => {\n closeMenu();\n onClose();\n }, [closeMenu, onClose]);\n\n useClickAway({\n containerClassName: \"vuuMenuList\",\n onClose: handleClose,\n isOpen: openMenus.length > 0,\n });\n\n const handleOpenMenu = (id: string) => {\n const itemId = getItemId(id);\n const menuId = getMenuId(itemId);\n navigatingWithKeyboard.current = true;\n openMenu(menuId, itemId);\n };\n const handleCloseMenu = () => {\n navigatingWithKeyboard.current = true;\n closeMenu();\n };\n\n const handleHighlightMenuItem = () => {\n // console.log(`highlight ${idx}`);\n };\n\n const lastMenu = openMenus.length - 1;\n\n const getChildMenuIndex = (i: number) => {\n if (i >= lastMenu) {\n return -1;\n } else {\n const { id: menuId } = openMenus[i + 1];\n const pos = menuId.lastIndexOf(\".\");\n const idx =\n pos === -1 ? parseInt(menuId, 10) : parseInt(menuId.slice(-pos), 10);\n return idx;\n }\n };\n\n return (\n <>\n {openMenus.map(({ id: menuId, left, top }, i) => {\n const childMenuIndex = getChildMenuIndex(i);\n\n return (\n <Portal key={i} x={left} y={top} onRender={handleRender}>\n <MenuList\n {...menuListProps}\n activatedByKeyboard={navigatingWithKeyboard.current}\n childMenuShowing={childMenuIndex}\n className={className}\n id={id}\n menuId={menuId}\n isRoot={i === 0}\n key={i}\n listItemProps={listItemProps}\n onActivate={handleActivate}\n onHighlightMenuItem={handleHighlightMenuItem}\n onCloseMenu={handleCloseMenu}\n onOpenMenu={handleOpenMenu}\n style={style}\n >\n {menus[menuId]}\n </MenuList>\n </Portal>\n );\n })}\n </>\n );\n};\n\nContextMenu.displayName = \"ContextMenu\";\n", "import React, {\n FC,\n HTMLAttributes,\n ReactElement,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport cx from \"classnames\";\nimport { useIdMemo as useId } from \"@salt-ds/core\";\nimport { useKeyboardNavigation } from \"./use-keyboard-navigation\";\nimport { isMenuItemGroup } from \"./use-items-with-ids\";\n\nimport \"./MenuList.css\";\n\nconst classBase = \"vuuMenuList\";\n\nexport const Separator = () => <li className=\"vuuMenuItem-divider\" />;\n\nexport interface MenuItemGroupProps {\n children: ReactElement<MenuItemProps>[];\n label: string;\n}\n\nexport interface MenuItemProps extends HTMLAttributes<HTMLDivElement> {\n action?: string;\n idx?: number;\n options?: unknown;\n}\n\n// Purely used as markers, props will be extracted\nexport const MenuItemGroup: FC<MenuItemGroupProps> = () => null;\n// eslint-disable-next-line no-unused-vars\nexport const MenuItem = ({ children, idx, ...props }: MenuItemProps) => {\n return <div {...props}>{children}</div>;\n};\n\nconst hasIcon = (child: ReactElement) => child.props[\"data-icon\"];\n\nexport interface MenuListProps extends HTMLAttributes<HTMLDivElement> {\n activatedByKeyboard?: boolean;\n children: ReactElement[];\n childMenuShowing?: number;\n highlightedIdx?: number;\n isRoot?: boolean;\n listItemProps?: Partial<MenuItemProps>;\n menuId?: string;\n onActivate?: (menuId: string) => void;\n onCloseMenu: (idx: number) => void;\n onOpenMenu?: (menuId: string) => void;\n onHighlightMenuItem?: (idx: number) => void;\n}\n\nconst MenuList = ({\n activatedByKeyboard,\n childMenuShowing = -1,\n children,\n className,\n highlightedIdx: highlightedIdxProp,\n id: idProp,\n isRoot,\n listItemProps,\n menuId,\n onHighlightMenuItem,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n ...props\n}: MenuListProps) => {\n const id = useId(idProp);\n const root = useRef<HTMLDivElement>(null);\n\n // The id generation be,ongs in useIttemsWithIds\n const mapIdxToId = useMemo(() => new Map(), []);\n\n const handleOpenMenu = (idx: number) => {\n const el = root.current?.querySelector(`:scope > [data-idx='${idx}']`);\n el?.id && onOpenMenu?.(el.id);\n };\n\n const handleActivate = (idx: number) => {\n const el = root.current?.querySelector(`:scope > [data-idx='${idx}']`);\n el?.id && onActivate?.(el.id);\n };\n\n const { focusVisible, highlightedIndex, listProps } = useKeyboardNavigation({\n count: React.Children.count(children),\n highlightedIndex: highlightedIdxProp,\n onActivate: handleActivate,\n onHighlight: onHighlightMenuItem,\n onOpenMenu: handleOpenMenu,\n onCloseMenu,\n });\n\n const appliedFocusVisible = childMenuShowing == -1 ? focusVisible : -1;\n\n useLayoutEffect(() => {\n if (childMenuShowing === -1 && activatedByKeyboard) {\n root.current?.focus();\n }\n }, [activatedByKeyboard, childMenuShowing]);\n\n const getActiveDescendant = () =>\n highlightedIndex === undefined || highlightedIndex === -1\n ? undefined\n : mapIdxToId.get(highlightedIndex);\n\n return (\n <div\n {...props}\n {...listProps}\n aria-activedescendant={getActiveDescendant()}\n className={cx(classBase, className, {\n [`${classBase}-childMenuShowing`]: childMenuShowing !== -1,\n })}\n data-root={isRoot || undefined}\n id={`${id}-${menuId}`}\n ref={root}\n role=\"menu\"\n tabIndex={0}\n >\n {renderContent()}\n </div>\n );\n\n function renderContent() {\n const propsCommonToAllListItems = {\n ...listItemProps,\n role: \"menuitem\",\n };\n\n const maybeIcon = (\n childElement: ReactElement,\n withIcon: boolean,\n iconName?: string\n ) =>\n withIcon\n ? [\n <span\n className=\"vuuIconContainer\"\n data-icon={iconName}\n key=\"icon\"\n />,\n ].concat(childElement)\n : childElement;\n\n function addClonedChild(\n list: ReactElement[],\n child: ReactElement,\n idx: number,\n withIcon: boolean\n ) {\n const {\n children,\n className,\n \"data-icon\": iconName,\n id: itemId,\n hasSeparator,\n label,\n ...props\n } = child.props;\n const hasSubMenu = isMenuItemGroup(child);\n const subMenuShowing = hasSubMenu && childMenuShowing === idx;\n const ariaControls = subMenuShowing ? `${id}-${itemId}` : undefined;\n\n list.push(\n <MenuItem\n {...props}\n {...propsCommonToAllListItems}\n {...getMenuItemProps(\n `${id}-${menuId}`,\n itemId,\n idx,\n child.key ?? itemId,\n highlightedIndex,\n appliedFocusVisible,\n className,\n hasSeparator\n )}\n aria-controls={ariaControls}\n aria-haspopup={hasSubMenu || undefined}\n aria-expanded={subMenuShowing || undefined}\n >\n {hasSubMenu\n ? maybeIcon(label, withIcon, iconName)\n : maybeIcon(children, withIcon, iconName)}\n </MenuItem>\n );\n // mapIdxToId.set(idx, itemId);\n }\n\n const listItems: ReactElement[] = [];\n\n if (children.length > 0) {\n const withIcon = children.some(hasIcon);\n\n children.forEach((child, idx) => {\n addClonedChild(listItems, child, idx, withIcon);\n });\n }\n\n return listItems;\n }\n};\n\nconst getMenuItemProps = (\n baseId: string,\n itemId: string,\n idx: number,\n key: string,\n highlightedIdx: number,\n focusVisible: number,\n className: string,\n hasSeparator: boolean\n) => ({\n id: `${baseId}-${itemId}`,\n key: key ?? idx,\n \"data-idx\": idx,\n \"data-highlighted\": idx === highlightedIdx || undefined,\n className: cx(\"vuuMenuItem\", className, {\n \"vuuMenuItem-separator\": hasSeparator,\n focusVisible: focusVisible === idx,\n }),\n});\n\nMenuList.displayName = \"MenuList\";\nexport default MenuList;\n", "import {\n FocusEvent,\n KeyboardEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { hasPopup, isRoot } from \"./utils\";\nimport { isNavigationKey } from \"./key-code\";\n\nexport interface KeyboardNavigationProps {\n autoHighlightFirstItem?: boolean;\n count: number;\n highlightedIndex?: number;\n onActivate: (idx: number) => void;\n onHighlight?: (idx: number) => void;\n onCloseMenu: (idx: number) => void;\n onOpenMenu: (idx: number) => void;\n}\n\nexport interface KeyboardHookListProps {\n // onBlur: (evt: FocusEvent) => void;\n onFocus: (evt: FocusEvent) => void;\n onKeyDown: (evt: KeyboardEvent) => void;\n onMouseDownCapture: () => void;\n onMouseMove: () => void;\n onMouseLeave: () => void;\n}\n\nexport interface NavigationHookResult {\n focusVisible: number;\n controlledHighlighting: boolean;\n highlightedIndex: number;\n setHighlightedIndex: (idx: number) => void;\n // keyboardNavigation: RefObject<boolean>;\n listProps: KeyboardHookListProps;\n setIgnoreFocus: (ignoreFocus: boolean) => void;\n}\n\n// we need a way to set highlightedIdx when selection changes\nexport const useKeyboardNavigation = ({\n autoHighlightFirstItem = false,\n count,\n highlightedIndex: highlightedIndexProp,\n onActivate,\n onHighlight,\n // onKeyDown,\n onCloseMenu,\n onOpenMenu,\n}: KeyboardNavigationProps): NavigationHookResult => {\n // const prevCount = useRef(count);\n const highlightedIndexRef = useRef(\n highlightedIndexProp ?? autoHighlightFirstItem ? 0 : -1\n );\n const [, forceRender] = useState<unknown>(null);\n const controlledHighlighting = highlightedIndexProp !== undefined;\n\n // count will not work for this, as it will change when we expand collapse groups\n // if (count !== prevCount.current) {\n // prevCount.current = count;\n // if (highlightedIndexRef.current !== -1){\n // highlightedIndexRef.current = autoHighlightFirstItem ? 0 : -1;\n // }\n // }\n\n const setHighlightedIdx = useCallback(\n (idx) => {\n highlightedIndexRef.current = idx;\n onHighlight?.(idx);\n forceRender({});\n },\n [onHighlight]\n );\n\n const setHighlightedIndex = useCallback(\n (idx) => {\n if (idx !== highlightedIndexRef.current) {\n if (!controlledHighlighting) {\n setHighlightedIdx(idx);\n }\n }\n },\n [controlledHighlighting, setHighlightedIdx]\n );\n\n // does this belong here or should it be a method passed in?\n const keyBoardNavigation = useRef(true);\n const ignoreFocus = useRef(false);\n const setIgnoreFocus = (value: boolean) => (ignoreFocus.current = value);\n\n const highlightedIndex = controlledHighlighting\n ? highlightedIndexProp\n : highlightedIndexRef.current;\n\n const navigateChildldItems = useCallback(\n (e: KeyboardEvent) => {\n const nextIdx = nextItemIdx(count, e.key, highlightedIndexRef.current);\n if (nextIdx !== highlightedIndexRef.current) {\n setHighlightedIndex(nextIdx);\n }\n },\n [count, setHighlightedIndex]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (isNavigationKey(e)) {\n e.preventDefault();\n e.stopPropagation();\n keyBoardNavigation.current = true;\n navigateChildldItems(e);\n } else if (\n (e.key === \"ArrowRight\" || e.key === \"Enter\") &&\n hasPopup(e.target as HTMLElement, highlightedIndex)\n ) {\n onOpenMenu(highlightedIndex);\n } else if (e.key === \"ArrowLeft\" && !isRoot(e.target as HTMLElement)) {\n onCloseMenu(highlightedIndex);\n } else if (e.key === \"Enter\") {\n onActivate && onActivate(highlightedIndex);\n }\n },\n [\n highlightedIndex,\n navigateChildldItems,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n ]\n );\n\n const listProps: KeyboardHookListProps = useMemo(\n () => ({\n onFocus: () => {\n if (highlightedIndex === -1) {\n setHighlightedIdx(0);\n }\n },\n onKeyDown: handleKeyDown,\n onMouseDownCapture: () => {\n keyBoardNavigation.current = false;\n setIgnoreFocus(true);\n },\n\n // onMouseEnter would seem less expensive but it misses some cases\n onMouseMove: () => {\n if (keyBoardNavigation.current) {\n keyBoardNavigation.current = false;\n }\n },\n onMouseLeave: () => {\n // label === 'ParsedInput' && console.log(`%c[useKeyboardNavigationHook]<${label}> onMouseLeave`,'color:brown')\n keyBoardNavigation.current = true;\n setIgnoreFocus(false);\n setHighlightedIndex(-1);\n },\n }),\n [\n highlightedIndex,\n setHighlightedIndex,\n navigateChildldItems,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n setHighlightedIdx,\n ]\n );\n\n // label === 'ParsedInput' && console.log(`%cuseNavigationHook<${label}>\n // highlightedIdxProp= ${highlightedIdxProp},\n // highlightedIndexRef= ${highlightedIndexRef.current},\n // %chighlightedIdx= ${highlightedIdx}`, 'color: brown','color: brown;font-weight: bold;')\n\n return {\n focusVisible: keyBoardNavigation.current ? highlightedIndex : -1,\n controlledHighlighting,\n highlightedIndex,\n setHighlightedIndex: setHighlightedIndex,\n // keyBoardNavigation,\n listProps,\n setIgnoreFocus,\n };\n};\n\n// need to be able to accommodate disabled items\nfunction nextItemIdx(count: number, key: string, idx: number) {\n if (key === \"ArrowUp\") {\n if (idx > 0) {\n return idx - 1;\n } else {\n return idx;\n }\n } else {\n if (idx === null) {\n return 0;\n } else if (idx === count - 1) {\n return idx;\n } else {\n return idx + 1;\n }\n }\n}\n", "export const isRoot = (el: HTMLElement) =>\n el.closest(`[data-root='true']`) !== null;\n\nexport const hasPopup = (el: HTMLElement, idx: number) =>\n (el.ariaHasPopup === \"true\" && el.dataset?.idx === `${idx}`) ||\n el.querySelector(`:scope > [data-idx='${idx}'][aria-haspopup='true']`) !==\n null;\n", "function union(set1: Set<string>, ...sets: Set<string>[]) {\n const result = new Set(set1);\n for (const set of sets) {\n for (const element of set) {\n result.add(element);\n }\n }\n return result;\n}\n\nexport const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const Backspace = \"Backspace\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Delete = \"Delete\";\n\nconst actionKeys = new Set([Enter, Delete]);\nconst focusKeys = new Set([\"Tab\"]);\n// const navigationKeys = new Set([\"Home\", \"End\", \"ArrowRight\", \"ArrowLeft\",\"ArrowDown\", \"ArrowUp\"]);\nconst arrowLeftRightKeys = new Set([\"ArrowRight\", \"ArrowLeft\"]);\nconst verticalNavigationKeys = new Set([\"Home\", \"End\", \"ArrowDown\", \"ArrowUp\"]);\nconst horizontalNavigationKeys = new Set([\n \"Home\",\n \"End\",\n \"ArrowRight\",\n \"ArrowLeft\",\n]);\nconst functionKeys = new Set([\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n]);\nconst specialKeys = union(\n actionKeys,\n horizontalNavigationKeys,\n verticalNavigationKeys,\n arrowLeftRightKeys,\n functionKeys,\n focusKeys\n);\nexport const isCharacterKey = (evt: KeyboardEvent) => {\n if (specialKeys.has(evt.key)) {\n return false;\n }\n if (typeof evt.which === \"number\" && evt.which > 0) {\n return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which !== 8;\n }\n};\n\nexport const isNavigationKey = (\n { key }: { key: string },\n orientation = \"vertical\"\n) => {\n const navigationKeys =\n orientation === \"vertical\"\n ? verticalNavigationKeys\n : horizontalNavigationKeys;\n return navigationKeys.has(key);\n};\n", "import React, { ReactElement, useCallback, useMemo } from \"react\";\nimport { MenuItemGroup, Separator } from \"./MenuList\";\n\nexport const isMenuItemGroup = (child: ReactElement) =>\n child.type === MenuItemGroup || !!child.props[\"data-group\"];\n\ntype Menus = { [key: string]: ReactElement[] };\ntype Actions = { [key: string]: { action: string; options?: unknown } };\n\nexport const useItemsWithIds = (\n childrenProp: ReactElement[]\n): [Menus, Actions] => {\n const normalizeChildren = useCallback(() => {\n const collectChildren = (\n children: ReactElement[],\n path = \"root\",\n menus: Menus = {},\n actions: Actions = {}\n ) => {\n const list: ReactElement[] = (menus[path] = []);\n let idx = 0;\n let hasSeparator = false;\n\n React.Children.forEach(children, (child) => {\n if (child.type === Separator) {\n hasSeparator = true;\n } else {\n const group = isMenuItemGroup(child);\n const childPath = path === \"root\" ? `${idx}` : `${path}.${idx}`;\n const {\n props: { action, options },\n } = child;\n const { childWithId, grandChildren } = assignId(\n child,\n childPath,\n group,\n hasSeparator\n );\n list.push(childWithId);\n if (grandChildren) {\n collectChildren(grandChildren, childPath, menus, actions);\n } else {\n actions[childPath] = { action, options };\n }\n idx += 1;\n hasSeparator = false;\n }\n });\n return [menus, actions];\n };\n\n const assignId = (\n child: ReactElement,\n path: string,\n group: boolean,\n hasSeparator = false\n ) => {\n const {\n props: { children },\n } = child;\n return {\n childWithId: React.cloneElement(child, {\n hasSeparator,\n id: `${path}`,\n key: path,\n children: group ? undefined : children,\n }),\n grandChildren: group ? children : undefined,\n };\n };\n\n return collectChildren(childrenProp);\n }, [childrenProp]);\n\n const [menus, actions] = useMemo(\n () => normalizeChildren(),\n [normalizeChildren]\n );\n\n return [menus, actions] as [Menus, Actions];\n};\n", "import {\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { closestListItem, listItemIndex } from \"./list-dom-utils\";\nimport { MenuItemProps } from \"./MenuList\";\n// import {mousePosition} from './aim/utils';\n// import {aiming} from './aim/aim';\n\nconst nudge = (\n menus: RuntimeMenuDescriptor[],\n distance: number,\n pos: \"left\" | \"top\"\n) => {\n return menus.map((m, i) =>\n i === menus.length - 1\n ? {\n ...m,\n [pos]: m[pos] - distance,\n }\n : m\n );\n};\nconst nudgeLeft = (menus: RuntimeMenuDescriptor[], distance: number) =>\n nudge(menus, distance, \"left\");\nconst nudgeUp = (menus: RuntimeMenuDescriptor[], distance: number) =>\n nudge(menus, distance, \"top\");\n\nconst flipSides = (id: string, menus: RuntimeMenuDescriptor[]) => {\n const [parentMenu, menu] = menus.slice(-2);\n const el = document.getElementById(`${id}-${menu.id}`);\n if (el === null) {\n throw Error(`useCascade.flipSides element with id ${menu.id} not found`);\n }\n const { width } = el.getBoundingClientRect();\n return menus.map((m) =>\n m === menu\n ? {\n ...m,\n left: parentMenu.left - (width - 2),\n }\n : m\n );\n};\n\n// const closedNode = (el: HTMLElement) =>\n// el.ariaHasPopup === \"true\" && el.ariaExpanded !== \"true\";\nconst getPosition = (el: HTMLElement, openMenus: RuntimeMenuDescriptor[]) => {\n const [{ left, top: menuTop }] = openMenus.slice(-1);\n // const {top, right, bottom, left} = el.getBoundingClientRect();\n // this will not work for MenuList within window, we need the\n // const {offsetLeft: left, offsetTop: menuTop} = el.closest('.vuuMenuList');\n const { offsetWidth: width, offsetTop: top } = el;\n return { left: left + width, top: top + menuTop };\n};\n\nexport type RuntimeMenuDescriptor = {\n id: string;\n left: number;\n top: number;\n};\n\nexport const getItemId = (id: string) => {\n const pos = id.lastIndexOf(\"-\");\n return pos === -1 ? id : id.slice(pos + 1);\n};\n\nexport const getMenuId = (id: string) => {\n const itemId = getItemId(id);\n const pos = itemId.lastIndexOf(\".\");\n return pos > -1 ? itemId.slice(0, pos) : \"root\";\n};\n\nconst getMenuDepth = (id: string) => {\n let count = 0,\n pos = id.indexOf(\".\", 0);\n while (pos !== -1) {\n count += 1;\n pos = id.indexOf(\".\", pos + 1);\n }\n return count;\n};\n\nconst identifyItem = (el: HTMLElement) => ({\n menuId: getMenuId(el.id),\n itemId: getItemId(el.id),\n isGroup: el.ariaHasPopup === \"true\",\n isOpen: el.ariaExpanded === \"true\",\n level: getMenuDepth(el.id),\n});\n\nexport interface CascadeHookProps {\n id: string;\n onActivate: (menuId: string) => void;\n onMouseEnterItem: (evt: MouseEvent, itemId: string) => void;\n position: { x: number; y: number };\n}\n\nexport interface CascadeHooksResult {\n closeMenu: () => void;\n handleRender: () => void;\n listItemProps: Partial<MenuItemProps>;\n openMenu: (menuId?: string, itemId?: string) => void;\n openMenus: RuntimeMenuDescriptor[];\n}\n\ntype MenuStatus = \"no-popup\" | \"popup-open\" | \"pending-close\" | \"popup-pending\";\ntype MenuState = { [key: string]: MenuStatus };\n\nexport const useCascade = ({\n id,\n onActivate,\n onMouseEnterItem,\n position: { x: posX, y: posY },\n}: CascadeHookProps): CascadeHooksResult => {\n const [, forceRefresh] = useState({});\n const openMenus = useRef<RuntimeMenuDescriptor[]>([\n { id: \"root\", left: posX, top: posY },\n ]);\n\n const setOpenMenus = useCallback((menus: RuntimeMenuDescriptor[]) => {\n openMenus.current = menus;\n forceRefresh({});\n }, []);\n\n const menuOpenPendingTimeout = useRef<number | undefined>();\n const menuClosePendingTimeout = useRef<number | undefined>();\n const menuState = useRef<MenuState>({ root: \"no-popup\" });\n const prevLevel = useRef(0);\n\n // const prevAim = useRef({mousePos: null, distance: true});\n\n const openMenu = useCallback(\n (menuId = \"root\", itemId = null, listItemEl = null) => {\n if (menuId === \"root\" && itemId === null) {\n setOpenMenus([{ id: \"root\", left: posX, top: posY }]);\n } else {\n menuState.current[menuId] = \"popup-open\";\n const doc = listItemEl ? listItemEl.ownerDocument : document;\n const el = doc.getElementById(`${id}-${menuId}-${itemId}`);\n const { left, top } = getPosition(el, openMenus.current);\n setOpenMenus(openMenus.current.concat({ id: itemId, left, top }));\n }\n },\n [id, posX, posY, setOpenMenus]\n );\n\n const closeMenu = useCallback(\n (menuId?: string) => {\n if (menuId === \"root\") {\n setOpenMenus([]);\n } else {\n setOpenMenus(openMenus.current.slice(0, -1));\n }\n },\n [setOpenMenus]\n );\n\n const closeMenus = useCallback(\n (menuId, itemId) => {\n const menus = openMenus.current.slice();\n let { id: lastMenuId } = menus[menus.length - 1];\n while (menus.length > 1 && !itemId.startsWith(lastMenuId)) {\n const parentMenuId = getMenuId(lastMenuId);\n menus.pop();\n menuState.current[lastMenuId] = \"no-popup\";\n menuState.current[parentMenuId] = \"no-popup\";\n ({ id: lastMenuId } = menus[menus.length - 1]);\n }\n if (menus.length < openMenus.current.length) {\n setOpenMenus(menus);\n }\n },\n [setOpenMenus]\n );\n\n const scheduleOpen = useCallback(\n (menuId, itemId, listItemEl) => {\n if (menuOpenPendingTimeout.current) {\n clearTimeout(menuOpenPendingTimeout.current);\n }\n menuOpenPendingTimeout.current = window.setTimeout(() => {\n console.log(`scheduleOpen timed out opening ${itemId}`);\n closeMenus(menuId, itemId);\n menuState.current[menuId] = \"popup-open\";\n menuState.current[itemId] = \"no-popup\";\n openMenu(menuId, itemId, listItemEl);\n }, 400);\n },\n [closeMenus, openMenu]\n );\n\n const scheduleClose = useCallback(\n (openMenuId, menuId, itemId) => {\n console.log(\n `scheduleClose openMenuId ${openMenuId} menuId ${menuId} itemId ${itemId}`\n );\n menuState.current[openMenuId] = \"pending-close\";\n menuClosePendingTimeout.current = window.setTimeout(() => {\n closeMenus(menuId, itemId);\n }, 400);\n },\n [closeMenus]\n );\n\n const handleRender = useCallback(() => {\n const { current: menus } = openMenus;\n const [menu] = menus.slice(-1);\n const el = document.getElementById(`${id}-${menu.id}`);\n if (el) {\n const { right, bottom } = el.getBoundingClientRect();\n const { clientHeight, clientWidth } = document.body;\n if (right > clientWidth) {\n const newMenus =\n menus.length > 1\n ? flipSides(id, menus)\n : nudgeLeft(menus, right - clientWidth);\n setOpenMenus(newMenus);\n } else if (bottom > clientHeight) {\n const newMenus = nudgeUp(menus, bottom - clientHeight);\n setOpenMenus(newMenus);\n }\n }\n }, [id, setOpenMenus]);\n\n const listItemProps: Partial<MenuItemProps> = useMemo(\n () => ({\n onMouseEnter: (evt: MouseEvent) => {\n const listItemEl = closestListItem(evt.target as HTMLElement);\n const { menuId, itemId, isGroup, isOpen, level } =\n identifyItem(listItemEl);\n const sameLevel = prevLevel.current === level;\n const {\n current: { [menuId]: state },\n } = menuState;\n prevLevel.current = level;\n\n // console.log(\n // `%conMouseEnter #${menuId}[${itemId}] @${level}\n // isGroup ${isGroup} isOpen ${isOpen}\n // openMenus [${openMenus.current.join(',')}]\n // state='${JSON.stringify(menuState.current)}`,\n // 'color: green; font-weight: bold;'\n // );\n\n if (state === \"no-popup\" && isGroup) {\n // Shouldn;t we always set this ?\n menuState.current[menuId] = \"popup-pending\";\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (state === \"popup-pending\" && !isGroup) {\n menuState.current[menuId] = \"no-popup\";\n clearTimeout(menuOpenPendingTimeout.current);\n menuOpenPendingTimeout.current = undefined;\n } else if (state === \"popup-pending\" && isGroup) {\n clearTimeout(menuOpenPendingTimeout.current);\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (state === \"popup-open\") {\n const [{ id: parentMenuId }, { id: openMenuId }] =\n openMenus.current.slice(-2);\n if (\n parentMenuId === menuId &&\n menuState.current[openMenuId] !== \"pending-close\" &&\n sameLevel\n ) {\n scheduleClose(openMenuId, menuId, itemId);\n if (isGroup && !isOpen) {\n scheduleOpen(menuId, itemId, listItemEl);\n }\n } else if (\n parentMenuId === menuId &&\n isGroup &&\n itemId !== openMenuId &&\n menuState.current[openMenuId] === \"pending-close\"\n ) {\n // if there is already an item queued for opening cancel it\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (isGroup) {\n closeMenus(menuId, itemId);\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (\n !(menuState.current[openMenuId] === \"pending-close\" && sameLevel)\n ) {\n closeMenus(menuId, itemId);\n }\n }\n\n if (state === \"pending-close\") {\n if (menuOpenPendingTimeout.current) {\n clearTimeout(menuOpenPendingTimeout.current);\n menuOpenPendingTimeout.current = undefined;\n }\n clearTimeout(menuClosePendingTimeout.current);\n menuClosePendingTimeout.current = undefined;\n menuState.current[menuId] = \"popup-open\";\n }\n\n onMouseEnterItem(evt, itemId);\n },\n\n onClick: (evt: SyntheticEvent) => {\n const targetElement = evt.target as HTMLElement;\n const listItemEl = closestListItem(targetElement);\n const idx = listItemIndex(listItemEl);\n console.log(\n `list item click [${idx}] hasPopup ${listItemEl.ariaHasPopup}`\n );\n if (listItemEl.ariaHasPopup === \"true\") {\n if (listItemEl.ariaExpanded !== \"true\") {\n openMenu(idx);\n } else {\n // do nothing\n }\n } else {\n onActivate(getItemId(listItemEl.id));\n }\n },\n }),\n [\n closeMenus,\n onActivate,\n\n onMouseEnterItem,\n openMenu,\n scheduleClose,\n scheduleOpen,\n ]\n );\n\n return {\n closeMenu,\n handleRender,\n listItemProps,\n openMenu,\n openMenus: openMenus.current,\n };\n};\n", "// const listItemElement = (listEl: HTMLElement, listItemIdx: number) =>\n// listEl.querySelector(`:scope > [data-idx=\"${listItemIdx}\"]`);\n\nexport function listItemIndex(listItemEl: HTMLElement) {\n if (listItemEl) {\n const idx = listItemEl.dataset.idx;\n if (idx) {\n return parseInt(idx, 10);\n // eslint-disable-next-line no-cond-assign\n } else if (listItemEl.ariaPosInSet) {\n return parseInt(listItemEl.ariaPosInSet, 10) - 1;\n }\n }\n}\n\nconst listItemId = (el: HTMLElement | null | undefined) => el?.id;\n\nexport const closestListItem = (el: HTMLElement | null | undefined) =>\n el?.closest(\"[data-idx],[aria-posinset]\") as HTMLElement;\n\nexport const closestListItemId = (el: HTMLElement) =>\n listItemId(closestListItem(el));\n\nexport const closestListItemIndex = (el: HTMLElement) =>\n listItemIndex(closestListItem(el));\n", "import { useEffect } from \"react\";\n\nexport interface ClickAwayHookProps {\n containerClassName: string;\n isOpen: boolean;\n onClose?: (target: string) => void;\n}\n\nexport const useClickAway = ({\n containerClassName,\n isOpen,\n onClose,\n}: ClickAwayHookProps) => {\n useEffect(() => {\n let clickHandler: (evt: MouseEvent) => void;\n if (isOpen) {\n clickHandler = (evt) => {\n const target = evt.target as HTMLElement;\n const container = target.closest(`.${containerClassName}`);\n if (container === null) {\n onClose?.(\"root\");\n }\n };\n\n document.body.addEventListener(\"click\", clickHandler, true);\n }\n\n return () => {\n if (clickHandler) {\n document.body.removeEventListener(\"click\", clickHandler, true);\n }\n };\n }, [containerClassName, isOpen, onClose]);\n};\n", "import { createContext, ReactNode, useCallback, useMemo } from \"react\";\n\nexport type MenuActionHandler = (\n type: string,\n options: unknown\n) => boolean | undefined;\nexport type MenuBuilder<L = string, O = unknown> = (\n location: L,\n options: O\n) => ContextMenuItemDescriptor[];\n\nexport interface ContextMenuContext {\n menuBuilders: MenuBuilder[];\n menuActionHandler: MenuActionHandler;\n}\n\nexport const ContextMenuContext = createContext<ContextMenuContext | null>(\n null\n);\n\nexport interface ContextMenuItemBase {\n icon?: string;\n label: string;\n location?: string;\n}\n\nexport interface ContextMenuLeafItemDescriptor extends ContextMenuItemBase {\n action: string;\n options?: unknown;\n}\n\nexport interface ContextMenuGroupItemDescriptor extends ContextMenuItemBase {\n children: ContextMenuItemDescriptor[];\n}\n\nexport type ContextMenuItemDescriptor =\n | ContextMenuLeafItemDescriptor\n | ContextMenuGroupItemDescriptor;\n\nexport const isGroupMenuItemDescriptor = (\n menuItem?: ContextMenuItemDescriptor\n): menuItem is ContextMenuGroupItemDescriptor =>\n menuItem !== undefined && \"children\" in menuItem;\n\nexport interface ContextMenuProviderProps {\n children: ReactNode;\n label?: string;\n menuActionHandler?: MenuActionHandler;\n menuBuilder: MenuBuilder;\n}\n\ninterface ProviderProps extends ContextMenuProviderProps {\n context: ContextMenuContext | null;\n}\n\nconst Provider = ({\n children,\n context,\n menuActionHandler,\n menuBuilder,\n}: ProviderProps) => {\n const menuBuilders = useMemo(() => {\n if (context?.menuBuilders && menuBuilder) {\n return context.menuBuilders.concat(menuBuilder);\n } else if (menuBuilder) {\n return [menuBuilder];\n } else {\n return context?.menuBuilders || [];\n }\n }, [context, menuBuilder]);\n\n const handleMenuAction = useCallback(\n (type, options) => {\n if (menuActionHandler?.(type, options)) {\n return true;\n }\n\n if (context?.menuActionHandler?.(type, options)) {\n return true;\n }\n },\n [context, menuActionHandler]\n );\n\n return (\n <ContextMenuContext.Provider\n value={{\n menuActionHandler: handleMenuAction,\n menuBuilders,\n }}\n >\n {children}\n </ContextMenuContext.Provider>\n );\n};\n\n// Need an option for local menu to override higher-level menu, rather than extend\nexport const ContextMenuProvider = ({\n children,\n label,\n menuActionHandler,\n menuBuilder,\n}: ContextMenuProviderProps) => {\n return (\n <ContextMenuContext.Consumer>\n {(parentContext) => (\n <Provider\n context={parentContext}\n label={label}\n menuActionHandler={menuActionHandler}\n menuBuilder={menuBuilder}\n >\n {children}\n </Provider>\n )}\n </ContextMenuContext.Consumer>\n );\n};\n", "// The menuBuilder will always be supplied by the code that will display the local\n// context menu. It will be passed all configured menu descriptors. It is free to\n\nimport { VuuServerMenuOptions } from \"@vuu-ui/vuu-data\";\nimport { MouseEvent, useCallback, useContext } from \"react\";\nimport { PopupService } from \"../popup\";\nimport {\n ContextMenuContext,\n ContextMenuItemDescriptor,\n isGroupMenuItemDescriptor,\n MenuActionHandler,\n MenuBuilder,\n} from \"./context-menu-provider\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { MenuItem, MenuItemGroup } from \"./MenuList\";\n\n// augment, replace or ignore the existing menu descriptors.\nexport const useContextMenu = () => {\n const ctx = useContext(ContextMenuContext);\n\n const buildMenuOptions = useCallback(\n (menuBuilders: MenuBuilder[], location, options) => {\n let results: ContextMenuItemDescriptor[] = [];\n for (const menuBuilder of menuBuilders) {\n // Maybe we should leave the concatenation to the menuBuilder, then it can control menuItem order\n results = results.concat(menuBuilder(location, options));\n }\n return results;\n },\n []\n );\n\n const handleShowContextMenu = useCallback(\n (e: MouseEvent<HTMLElement>, location: string, options: unknown) => {\n e.stopPropagation();\n e.preventDefault();\n const menuBuilders = ctx?.menuBuilders ?? [];\n const menuItemDescriptors = buildMenuOptions(\n menuBuilders,\n location,\n options\n );\n console.log({\n menuItemDescriptors,\n });\n if (menuItemDescriptors.length && ctx?.menuActionHandler) {\n console.log(`showContextMenu ${location}`, {\n options,\n });\n showContextMenu(e, menuItemDescriptors, ctx.menuActionHandler);\n }\n },\n [buildMenuOptions, ctx]\n );\n\n return handleShowContextMenu;\n};\n\nconst showContextMenu = (\n e: MouseEvent<HTMLElement>,\n menuDescriptors: ContextMenuItemDescriptor[],\n handleContextMenuAction: MenuActionHandler\n) => {\n const { clientX: left, clientY: top } = e;\n const menuItems = (menuDescriptors: ContextMenuItemDescriptor[]) => {\n const fromDescriptor = (menuItem: ContextMenuItemDescriptor, i: number) =>\n isGroupMenuItemDescriptor(menuItem) ? (\n <MenuItemGroup key={i} label={menuItem.label}>\n {menuItem.children.map(fromDescriptor)}\n </MenuItemGroup>\n ) : (\n <MenuItem\n key={i}\n action={menuItem.action}\n data-icon={menuItem.icon}\n options={menuItem.options}\n >\n {menuItem.label}\n </MenuItem>\n );\n\n return menuDescriptors.map(fromDescriptor);\n };\n\n const handleClose = (menuId?: string, options?: unknown) => {\n if (menuId) {\n handleContextMenuAction(menuId, options);\n PopupService.hidePopup();\n }\n };\n\n const component = (\n <ContextMenu onClose={handleClose} position={{ x: left, y: top }}>\n {menuItems(menuDescriptors)}\n </ContextMenu>\n );\n PopupService.showPopup({ left: 0, top: 0, component });\n};\n", "import cx from \"classnames\";\nimport React, {\n createElement,\n CSSProperties,\n HTMLAttributes,\n ReactElement,\n useEffect,\n useRef,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { renderPortal } from \"../portal\";\n\nimport \"./popup-service.css\";\n\nlet _dialogOpen = false;\nconst _popups: string[] = [];\n\nfunction specialKeyHandler(e: KeyboardEvent) {\n if (e.key === \"Esc\") {\n if (_popups.length) {\n closeAllPopups();\n } else if (_dialogOpen) {\n const dialogRoot = document.body.querySelector(\".vuuDialog\");\n if (dialogRoot) {\n ReactDOM.unmountComponentAtNode(dialogRoot);\n }\n }\n }\n}\n\nfunction outsideClickHandler(e: MouseEvent) {\n if (_popups.length) {\n // onsole.log(`Popup.outsideClickHandler`);\n const popupContainers = document.body.querySelectorAll(\".vuuPopup\");\n for (let i = 0; i < popupContainers.length; i++) {\n if (popupContainers[i].contains(e.target as HTMLElement)) {\n return;\n }\n }\n closeAllPopups();\n }\n}\n\nfunction closeAllPopups() {\n if (_popups.length) {\n // onsole.log(`closeAllPopups`);\n const popupContainers = document.body.querySelectorAll(\".vuuPopup\");\n for (let i = 0; i < popupContainers.length; i++) {\n ReactDOM.unmountComponentAtNode(popupContainers[i]);\n }\n popupClosed(\"*\");\n }\n}\n\nfunction dialogOpened() {\n if (_dialogOpen === false) {\n _dialogOpen = true;\n window.addEventListener(\"keydown\", specialKeyHandler, true);\n }\n}\n\nfunction dialogClosed() {\n if (_dialogOpen) {\n _dialogOpen = false;\n window.removeEventListener(\"keydown\", specialKeyHandler, true);\n }\n}\n\nfunction popupOpened(name: string) {\n if (_popups.indexOf(name) === -1) {\n _popups.push(name);\n //onsole.log('PopupService, popup opened ' + name + ' popups : ' + _popups);\n if (_dialogOpen === false) {\n window.addEventListener(\"keydown\", specialKeyHandler, true);\n window.addEventListener(\"click\", outsideClickHandler, true);\n }\n }\n}\n\nfunction popupClosed(name: string /*, group=null*/) {\n if (_popups.length) {\n if (name === \"*\") {\n _popups.length = 0;\n } else {\n const pos = _popups.indexOf(name);\n if (pos !== -1) {\n _popups.splice(pos, 1);\n }\n }\n //onsole.log('PopupService, popup closed ' + name + ' popups : ' + _popups);\n if (_popups.length === 0 && _dialogOpen === false) {\n window.removeEventListener(\"keydown\", specialKeyHandler, true);\n window.removeEventListener(\"click\", outsideClickHandler, true);\n }\n }\n}\n\nconst PopupComponent = ({\n children,\n position,\n style,\n}: HTMLAttributes<HTMLDivElement> & {\n position?: \"above\" | \"below\" | \"\";\n style?: CSSProperties;\n}) => {\n const className = cx(\"hwPopup\", \"hwPopupContainer\", position);\n return createElement(\"div\", { className, style }, children);\n};\n\nlet incrementingKey = 1;\n\nexport class PopupService {\n static showPopup({\n name = \"anon\",\n group = \"all\",\n position = \"\",\n left = 0,\n right = \"auto\",\n top = 0,\n width = \"auto\",\n component,\n }: {\n depth?: number;\n name?: string;\n group?: string;\n position?: \"above\" | \"below\" | \"\";\n left?: number;\n right?: \"auto\" | number;\n top?: number;\n component: ReactElement;\n width?: number | \"auto\";\n }) {\n if (!component) {\n throw Error(`PopupService showPopup, no component supplied`);\n }\n popupOpened(name);\n let el = document.body.querySelector(\".vuuPopup.\" + group) as HTMLElement;\n if (el === null) {\n el = document.createElement(\"div\") as HTMLElement;\n el.className = \"vuuPopup \" + group;\n document.body.appendChild(el);\n }\n\n const style = { width };\n\n renderPortal(\n createElement(\n PopupComponent,\n { key: incrementingKey++, position, style },\n component\n ),\n el,\n left,\n top,\n () => {\n PopupService.keepWithinThePage(el, right);\n }\n );\n }\n\n static hidePopup(name = \"anon\", group = \"all\") {\n //onsole.log('PopupService.hidePopup name=' + name + ', group=' + group)\n\n if (_popups.indexOf(name) !== -1) {\n popupClosed(name);\n const popupRoot = document.body.querySelector(`.vuuPopup.${group}`);\n if (popupRoot) {\n ReactDOM.unmountComponentAtNode(popupRoot);\n }\n }\n }\n\n static keepWithinThePage(el: HTMLElement, right: number | \"auto\" = \"auto\") {\n const target = el.querySelector(\".vuuPopupContainer > *\") as HTMLElement;\n if (target) {\n const {\n top,\n left,\n width,\n height,\n right: currentRight,\n } = target.getBoundingClientRect();\n\n const w = window.innerWidth;\n const h = window.innerHeight;\n\n const overflowH = h - (top + height);\n if (overflowH < 0) {\n target.style.top = Math.round(top) + overflowH + \"px\";\n }\n\n const overflowW = w - (left + width);\n if (overflowW < 0) {\n target.style.left = Math.round(left) + overflowW + \"px\";\n }\n\n if (typeof right === \"number\" && right !== currentRight) {\n const adjustment = right - currentRight;\n target.style.left = left + adjustment + \"px\";\n }\n }\n }\n}\n\nexport class DialogService {\n static showDialog(dialog: ReactElement) {\n const containerEl = \".vuuDialog\";\n const onClose = dialog.props.onClose;\n\n dialogOpened();\n\n ReactDOM.render(\n React.cloneElement(dialog, {\n container: containerEl,\n onClose: () => {\n DialogService.closeDialog();\n if (onClose) {\n onClose();\n }\n },\n }),\n document.body.querySelector(containerEl)\n );\n }\n\n static closeDialog() {\n dialogClosed();\n const dialogRoot = document.body.querySelector(\".vuuDialog\");\n if (dialogRoot) {\n ReactDOM.unmountComponentAtNode(dialogRoot);\n }\n }\n}\n\nexport interface PopupProps {\n children: ReactElement;\n close?: boolean;\n depth: number;\n group?: string;\n name: string;\n position?: \"above\" | \"below\" | \"\";\n width: number;\n}\n\nexport const Popup = (props: PopupProps) => {\n const pendingTask = useRef<number | undefined>();\n const ref = useRef<HTMLElement>(null);\n\n const show = (props: PopupProps, boundingClientRect: DOMRect) => {\n const { name, group, depth, width } = props;\n let left: number | undefined;\n let top: number | undefined;\n\n if (pendingTask.current) {\n window.clearTimeout(pendingTask.current);\n pendingTask.current = undefined;\n }\n\n if (props.close === true) {\n PopupService.hidePopup(name, group);\n } else {\n const { position, children: component } = props;\n const {\n left: targetLeft,\n top: targetTop,\n width: clientWidth,\n bottom: targetBottom,\n } = boundingClientRect;\n\n if (position === \"below\") {\n left = targetLeft;\n top = targetBottom;\n } else if (position === \"above\") {\n left = targetLeft;\n top = targetTop;\n }\n\n pendingTask.current = window.setTimeout(() => {\n PopupService.showPopup({\n name,\n group,\n depth,\n position,\n left,\n top,\n width: width || clientWidth,\n component,\n });\n }, 10);\n }\n };\n\n useEffect(() => {\n if (ref.current) {\n const el = ref.current.parentElement;\n const boundingClientRect = el?.getBoundingClientRect();\n if (boundingClientRect) {\n show(props, boundingClientRect);\n }\n }\n\n return () => {\n PopupService.hidePopup(props.name, props.group);\n };\n }, [props]);\n\n return React.createElement(\"div\", { className: \"popup-proxy\", ref });\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,sBAA8C;AAC9C,IAAAA,eAAqB;AACrB,wBAAe;AACf,IAAAC,gBAA8D;;;ACH9D,mBAAuD;AACvD,IAAAC,YAA0B;;;ACD1B,eAA0B;AAC1B,kBAA6B;AA0BzB;AAvBJ,IAAI,cAAc;AAElB,IAAM,qBAAqB,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,WAAW;AACzD,QAAM,KAAK,IAAI,SAAS,cAAc,KAAK;AAC3C,KAAG,YAAY,cAAc;AAC7B,KAAG,MAAM,UAAU,QAAQ,YAAY;AACvC,MAAI,SAAS,KAAK,YAAY,EAAE;AAChC,SAAO;AACT;AAEA,IAAM,qBAAqB,CAAC,GAAY,MAAe,mBAAmB,GAAG,CAAC;AAEvE,IAAM,eAAe,CAC1B,WACA,WACA,GACA,GACA,aACG;AAEH,YAAU,MAAM,UAAU,QAAQ,YAAY;AAE9C,EAAS;AAAA,IACP,4CAAC,4BAAa,gBAAe,SAAS,qBAAU;AAAA,IAChD;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,kBAAkB;;;ADtBxB,IAAM,SAAS,SAASC,QAAO;AAAA,EACpC;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ;AACF,GAAgB;AAEd,QAAM,sBAAkB,sBAAQ,MAAM;AACpC,WAAO,gBAAgB;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,oCAAgB,MAAM;AACpB,iBAAa,UAAU,iBAAiB,GAAG,GAAG,QAAQ;AAAA,EACxD,GAAG,CAAC,UAAU,UAAU,iBAAiB,GAAG,CAAC,CAAC;AAE9C,oCAAgB,MAAM;AACpB,WAAO,MAAM;AA3BjB;AA4BM,UAAI,iBAAiB;AACnB,QAAS,iCAAuB,eAAe;AAC/C,YAAI,gBAAgB,UAAU,SAAS,UAAU,GAAG;AAClD,gCAAgB,kBAAhB,mBAA+B,YAAY;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAepB,SAAO;AACT;;;AEnDO,IAAM,eAAe,CAAC,YAAoB;AAC/C,QAAM,kBAAkB,iBAAiB,SAAS,IAAI,EAAE;AAAA,IACtD;AAAA,EACF;AACA,WAAS,KAAK,MAAM;AAAA,IAClB;AAAA,IACA,GAAG,mBAAmB;AAAA,EACxB;AACF;;;AH0CU,IAAAC,sBAAA;AA1CV,IAAM,YAAY;AAOX,IAAM,SAAS,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAmB;AACjB,QAAM,WAAO,sBAAuB,IAAI;AACxC,QAAM,CAAC,IAAI,QAAI,wBAAS,CAAC;AACzB,QAAM,CAAC,IAAI,QAAI,wBAAS,CAAC;AAEzB,QAAM,YAAQ,2BAAY,MAAM;AAC9B;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,mBAAe,2BAAY,MAAM;AAAA,EASvC,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SACE,6CAAC,UAAO,UAAU,cAAc,GAAG,MAAM,GAAG,MAC1C,uDAAC,yBAAM,WAAW,GAAG,mBAAmB,MAAM,QAC5C,wDAAC,SAAK,GAAG,OAAO,eAAW,kBAAAC,SAAG,WAAW,SAAS,GAAG,KAAK,MACxD;AAAA,kDAAC,2BAAQ,WAAW,GAAG,oBACrB;AAAA,mDAAC,qBAAM,iBAAM;AAAA,MACb;AAAA,QAAC;AAAA;AAAA,UAEC,SAAS;AAAA,UACT,kBAAc;AAAA,UACd,aAAU;AAAA;AAAA,QAHN;AAAA,MAIN;AAAA,OACF;AAAA,IACC;AAAA,KACH,GACF,GACF;AAEJ;;;AIhEA,IAAAC,eAAmC;AACnC,IAAAC,gBAAoC;;;ACDpC,IAAAC,gBAOO;AACP,IAAAC,qBAAe;AACf,IAAAC,eAAmC;;;ACTnC,IAAAC,gBAOO;;;ACPA,IAAM,SAAS,CAAC,OACrB,GAAG,QAAQ,oBAAoB,MAAM;AAEhC,IAAM,WAAW,CAAC,IAAiB,QAAa;AAHvD;AAIG,YAAG,iBAAiB,YAAU,QAAG,YAAH,mBAAY,SAAQ,GAAG,SACtD,GAAG,cAAc,uBAAuB,6BAA6B,MACnE;AAAA;;;ACNJ,SAAS,MAAM,SAAsB,MAAqB;AACxD,QAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,aAAW,OAAO,MAAM;AACtB,eAAW,WAAW,KAAK;AACzB,aAAO,IAAI,OAAO;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAOO,IAAM,QAAQ;AAEd,IAAM,SAAS;AAEtB,IAAM,aAAa,oBAAI,IAAI,CAAC,OAAO,MAAM,CAAC;AAC1C,IAAM,YAAY,oBAAI,IAAI,CAAC,KAAK,CAAC;AAEjC,IAAM,qBAAqB,oBAAI,IAAI,CAAC,cAAc,WAAW,CAAC;AAC9D,IAAM,yBAAyB,oBAAI,IAAI,CAAC,QAAQ,OAAO,aAAa,SAAS,CAAC;AAC9E,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,IAAM,kBAAkB,CAC7B,EAAE,IAAI,GACN,cAAc,eACX;AACH,QAAM,iBACJ,gBAAgB,aACZ,yBACA;AACN,SAAO,eAAe,IAAI,GAAG;AAC/B;;;AF7BO,IAAM,wBAAwB,CAAC;AAAA,EACpC,yBAAyB;AAAA,EACzB;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AACF,MAAqD;AAEnD,QAAM,0BAAsB;AAAA,KAC1B,sDAAwB,0BAAyB,IAAI;AAAA,EACvD;AACA,QAAM,CAAC,EAAE,WAAW,QAAI,wBAAkB,IAAI;AAC9C,QAAM,yBAAyB,yBAAyB;AAUxD,QAAM,wBAAoB;AAAA,IACxB,CAAC,QAAQ;AACP,0BAAoB,UAAU;AAC9B,iDAAc;AACd,kBAAY,CAAC,CAAC;AAAA,IAChB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,0BAAsB;AAAA,IAC1B,CAAC,QAAQ;AACP,UAAI,QAAQ,oBAAoB,SAAS;AACvC,YAAI,CAAC,wBAAwB;AAC3B,4BAAkB,GAAG;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,wBAAwB,iBAAiB;AAAA,EAC5C;AAGA,QAAM,yBAAqB,sBAAO,IAAI;AACtC,QAAM,kBAAc,sBAAO,KAAK;AAChC,QAAM,iBAAiB,CAAC,UAAoB,YAAY,UAAU;AAElE,QAAM,mBAAmB,yBACrB,uBACA,oBAAoB;AAExB,QAAM,2BAAuB;AAAA,IAC3B,CAAC,MAAqB;AACpB,YAAM,UAAU,YAAY,OAAO,EAAE,KAAK,oBAAoB,OAAO;AACrE,UAAI,YAAY,oBAAoB,SAAS;AAC3C,4BAAoB,OAAO;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,OAAO,mBAAmB;AAAA,EAC7B;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,MAAqB;AACpB,UAAI,gBAAgB,CAAC,GAAG;AACtB,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB,2BAAmB,UAAU;AAC7B,6BAAqB,CAAC;AAAA,MACxB,YACG,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,YACrC,SAAS,EAAE,QAAuB,gBAAgB,GAClD;AACA,mBAAW,gBAAgB;AAAA,MAC7B,WAAW,EAAE,QAAQ,eAAe,CAAC,OAAO,EAAE,MAAqB,GAAG;AACpE,oBAAY,gBAAgB;AAAA,MAC9B,WAAW,EAAE,QAAQ,SAAS;AAC5B,sBAAc,WAAW,gBAAgB;AAAA,MAC3C;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAmC;AAAA,IACvC,OAAO;AAAA,MACL,SAAS,MAAM;AACb,YAAI,qBAAqB,IAAI;AAC3B,4BAAkB,CAAC;AAAA,QACrB;AAAA,MACF;AAAA,MACA,WAAW;AAAA,MACX,oBAAoB,MAAM;AACxB,2BAAmB,UAAU;AAC7B,uBAAe,IAAI;AAAA,MACrB;AAAA;AAAA,MAGA,aAAa,MAAM;AACjB,YAAI,mBAAmB,SAAS;AAC9B,6BAAmB,UAAU;AAAA,QAC/B;AAAA,MACF;AAAA,MACA,cAAc,MAAM;AAElB,2BAAmB,UAAU;AAC7B,uBAAe,KAAK;AACpB,4BAAoB,EAAE;AAAA,MACxB;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAOA,SAAO;AAAA,IACL,cAAc,mBAAmB,UAAU,mBAAmB;AAAA,IAC9D;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,EACF;AACF;AAGA,SAAS,YAAY,OAAe,KAAa,KAAa;AAC5D,MAAI,QAAQ,WAAW;AACrB,QAAI,MAAM,GAAG;AACX,aAAO,MAAM;AAAA,IACf,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,OAAO;AACL,QAAI,QAAQ,MAAM;AAChB,aAAO;AAAA,IACT,WAAW,QAAQ,QAAQ,GAAG;AAC5B,aAAO;AAAA,IACT,OAAO;AACL,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;;;AG1MA,IAAAC,gBAA0D;AAGnD,IAAM,kBAAkB,CAAC,UAC9B,MAAM,SAAS,iBAAiB,CAAC,CAAC,MAAM,MAAM,YAAY;AAKrD,IAAM,kBAAkB,CAC7B,iBACqB;AACrB,QAAM,wBAAoB,2BAAY,MAAM;AAC1C,UAAM,kBAAkB,CACtB,UACA,OAAO,QACPC,SAAe,CAAC,GAChBC,WAAmB,CAAC,MACjB;AACH,YAAM,OAAwBD,OAAM,IAAI,IAAI,CAAC;AAC7C,UAAI,MAAM;AACV,UAAI,eAAe;AAEnB,oBAAAE,QAAM,SAAS,QAAQ,UAAU,CAAC,UAAU;AAC1C,YAAI,MAAM,SAAS,WAAW;AAC5B,yBAAe;AAAA,QACjB,OAAO;AACL,gBAAM,QAAQ,gBAAgB,KAAK;AACnC,gBAAM,YAAY,SAAS,SAAS,GAAG,QAAQ,GAAG,QAAQ;AAC1D,gBAAM;AAAA,YACJ,OAAO,EAAE,QAAQ,QAAQ;AAAA,UAC3B,IAAI;AACJ,gBAAM,EAAE,aAAa,cAAc,IAAI;AAAA,YACrC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,eAAK,KAAK,WAAW;AACrB,cAAI,eAAe;AACjB,4BAAgB,eAAe,WAAWF,QAAOC,QAAO;AAAA,UAC1D,OAAO;AACL,YAAAA,SAAQ,SAAS,IAAI,EAAE,QAAQ,QAAQ;AAAA,UACzC;AACA,iBAAO;AACP,yBAAe;AAAA,QACjB;AAAA,MACF,CAAC;AACD,aAAO,CAACD,QAAOC,QAAO;AAAA,IACxB;AAEA,UAAM,WAAW,CACf,OACA,MACA,OACA,eAAe,UACZ;AACH,YAAM;AAAA,QACJ,OAAO,EAAE,SAAS;AAAA,MACpB,IAAI;AACJ,aAAO;AAAA,QACL,aAAa,cAAAC,QAAM,aAAa,OAAO;AAAA,UACrC;AAAA,UACA,IAAI,GAAG;AAAA,UACP,KAAK;AAAA,UACL,UAAU,QAAQ,SAAY;AAAA,QAChC,CAAC;AAAA,QACD,eAAe,QAAQ,WAAW;AAAA,MACpC;AAAA,IACF;AAEA,WAAO,gBAAgB,YAAY;AAAA,EACrC,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,CAAC,OAAO,OAAO,QAAI;AAAA,IACvB,MAAM,kBAAkB;AAAA,IACxB,CAAC,iBAAiB;AAAA,EACpB;AAEA,SAAO,CAAC,OAAO,OAAO;AACxB;;;AJ/D+B,IAAAC,sBAAA;AAF/B,IAAMC,aAAY;AAEX,IAAM,YAAY,MAAM,6CAAC,QAAG,WAAU,uBAAsB;AAc5D,IAAM,gBAAwC,MAAM;AAEpD,IAAM,WAAW,CAAC,EAAE,UAAU,KAAK,GAAG,MAAM,MAAqB;AACtE,SAAO,6CAAC,SAAK,GAAG,OAAQ,UAAS;AACnC;AAEA,IAAM,UAAU,CAAC,UAAwB,MAAM,MAAM,WAAW;AAgBhE,IAAM,WAAW,CAAC;AAAA,EAChB;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,IAAI;AAAA,EACJ,QAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAqB;AACnB,QAAM,SAAK,aAAAC,WAAM,MAAM;AACvB,QAAM,WAAO,sBAAuB,IAAI;AAGxC,QAAM,iBAAa,uBAAQ,MAAM,oBAAI,IAAI,GAAG,CAAC,CAAC;AAE9C,QAAM,iBAAiB,CAAC,QAAgB;AA3E1C;AA4EI,UAAM,MAAK,UAAK,YAAL,mBAAc,cAAc,uBAAuB;AAC9D,8BAAI,QAAM,yCAAa,GAAG;AAAA,EAC5B;AAEA,QAAM,iBAAiB,CAAC,QAAgB;AAhF1C;AAiFI,UAAM,MAAK,UAAK,YAAL,mBAAc,cAAc,uBAAuB;AAC9D,8BAAI,QAAM,yCAAa,GAAG;AAAA,EAC5B;AAEA,QAAM,EAAE,cAAc,kBAAkB,UAAU,IAAI,sBAAsB;AAAA,IAC1E,OAAO,cAAAC,QAAM,SAAS,MAAM,QAAQ;AAAA,IACpC,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ;AAAA,EACF,CAAC;AAED,QAAM,sBAAsB,oBAAoB,KAAK,eAAe;AAEpE,qCAAgB,MAAM;AAhGxB;AAiGI,QAAI,qBAAqB,MAAM,qBAAqB;AAClD,iBAAK,YAAL,mBAAc;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,qBAAqB,gBAAgB,CAAC;AAE1C,QAAM,sBAAsB,MAC1B,qBAAqB,UAAa,qBAAqB,KACnD,SACA,WAAW,IAAI,gBAAgB;AAErC,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACH,GAAG;AAAA,MACJ,yBAAuB,oBAAoB;AAAA,MAC3C,eAAW,mBAAAC,SAAGJ,YAAW,WAAW;AAAA,QAClC,CAAC,GAAGA,6BAA4B,GAAG,qBAAqB;AAAA,MAC1D,CAAC;AAAA,MACD,aAAWC,WAAU;AAAA,MACrB,IAAI,GAAG,MAAM;AAAA,MACb,KAAK;AAAA,MACL,MAAK;AAAA,MACL,UAAU;AAAA,MAET,wBAAc;AAAA;AAAA,EACjB;AAGF,WAAS,gBAAgB;AACvB,UAAM,4BAA4B;AAAA,MAChC,GAAG;AAAA,MACH,MAAM;AAAA,IACR;AAEA,UAAM,YAAY,CAChB,cACA,UACA,aAEA,WACI;AAAA,MACE;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,aAAW;AAAA;AAAA,QACP;AAAA,MACN;AAAA,IACF,EAAE,OAAO,YAAY,IACrB;AAEN,aAAS,eACP,MACA,OACA,KACA,UACA;AAvJN;AAwJM,YAAM;AAAA,QACJ,UAAAI;AAAA,QACA,WAAAC;AAAA,QACA,aAAa;AAAA,QACb,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,GAAGC;AAAA,MACL,IAAI,MAAM;AACV,YAAM,aAAa,gBAAgB,KAAK;AACxC,YAAM,iBAAiB,cAAc,qBAAqB;AAC1D,YAAM,eAAe,iBAAiB,GAAG,MAAM,WAAW;AAE1D,WAAK;AAAA,QACH;AAAA,UAAC;AAAA;AAAA,YACE,GAAGA;AAAA,YACH,GAAG;AAAA,YACH,GAAG;AAAA,cACF,GAAG,MAAM;AAAA,cACT;AAAA,cACA;AAAA,eACA,WAAM,QAAN,YAAa;AAAA,cACb;AAAA,cACA;AAAA,cACAD;AAAA,cACA;AAAA,YACF;AAAA,YACA,iBAAe;AAAA,YACf,iBAAe,cAAc;AAAA,YAC7B,iBAAe,kBAAkB;AAAA,YAEhC,uBACG,UAAU,OAAO,UAAU,QAAQ,IACnC,UAAUD,WAAU,UAAU,QAAQ;AAAA;AAAA,QAC5C;AAAA,MACF;AAAA,IAEF;AAEA,UAAM,YAA4B,CAAC;AAEnC,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,WAAW,SAAS,KAAK,OAAO;AAEtC,eAAS,QAAQ,CAAC,OAAO,QAAQ;AAC/B,uBAAe,WAAW,OAAO,KAAK,QAAQ;AAAA,MAChD,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;AAEA,IAAM,mBAAmB,CACvB,QACA,QACA,KACA,KACA,gBACA,cACA,WACA,kBACI;AAAA,EACJ,IAAI,GAAG,UAAU;AAAA,EACjB,KAAK,oBAAO;AAAA,EACZ,YAAY;AAAA,EACZ,oBAAoB,QAAQ,kBAAkB;AAAA,EAC9C,eAAW,mBAAAD,SAAG,eAAe,WAAW;AAAA,IACtC,yBAAyB;AAAA,IACzB,cAAc,iBAAiB;AAAA,EACjC,CAAC;AACH;AAEA,SAAS,cAAc;AACvB,IAAO,mBAAQ;;;AKlOf,IAAAI,gBAOO;;;ACJA,SAAS,cAAc,YAAyB;AACrD,MAAI,YAAY;AACd,UAAM,MAAM,WAAW,QAAQ;AAC/B,QAAI,KAAK;AACP,aAAO,SAAS,KAAK,EAAE;AAAA,IAEzB,WAAW,WAAW,cAAc;AAClC,aAAO,SAAS,WAAW,cAAc,EAAE,IAAI;AAAA,IACjD;AAAA,EACF;AACF;AAIO,IAAM,kBAAkB,CAAC,OAC9B,yBAAI,QAAQ;;;ADJd,IAAM,QAAQ,CACZ,OACA,UACA,QACG;AACH,SAAO,MAAM;AAAA,IAAI,CAAC,GAAG,MACnB,MAAM,MAAM,SAAS,IACjB;AAAA,MACE,GAAG;AAAA,MACH,CAAC,GAAG,GAAG,EAAE,GAAG,IAAI;AAAA,IAClB,IACA;AAAA,EACN;AACF;AACA,IAAM,YAAY,CAAC,OAAgC,aACjD,MAAM,OAAO,UAAU,MAAM;AAC/B,IAAM,UAAU,CAAC,OAAgC,aAC/C,MAAM,OAAO,UAAU,KAAK;AAE9B,IAAM,YAAY,CAAC,IAAY,UAAmC;AAChE,QAAM,CAAC,YAAY,IAAI,IAAI,MAAM,MAAM,EAAE;AACzC,QAAM,KAAK,SAAS,eAAe,GAAG,MAAM,KAAK,IAAI;AACrD,MAAI,OAAO,MAAM;AACf,UAAM,MAAM,wCAAwC,KAAK,cAAc;AAAA,EACzE;AACA,QAAM,EAAE,MAAM,IAAI,GAAG,sBAAsB;AAC3C,SAAO,MAAM;AAAA,IAAI,CAAC,MAChB,MAAM,OACF;AAAA,MACE,GAAG;AAAA,MACH,MAAM,WAAW,QAAQ,QAAQ;AAAA,IACnC,IACA;AAAA,EACN;AACF;AAIA,IAAM,cAAc,CAAC,IAAiB,cAAuC;AAC3E,QAAM,CAAC,EAAE,MAAM,KAAK,QAAQ,CAAC,IAAI,UAAU,MAAM,EAAE;AAInD,QAAM,EAAE,aAAa,OAAO,WAAW,IAAI,IAAI;AAC/C,SAAO,EAAE,MAAM,OAAO,OAAO,KAAK,MAAM,QAAQ;AAClD;AAQO,IAAM,YAAY,CAAC,OAAe;AACvC,QAAM,MAAM,GAAG,YAAY,GAAG;AAC9B,SAAO,QAAQ,KAAK,KAAK,GAAG,MAAM,MAAM,CAAC;AAC3C;AAEO,IAAM,YAAY,CAAC,OAAe;AACvC,QAAM,SAAS,UAAU,EAAE;AAC3B,QAAM,MAAM,OAAO,YAAY,GAAG;AAClC,SAAO,MAAM,KAAK,OAAO,MAAM,GAAG,GAAG,IAAI;AAC3C;AAEA,IAAM,eAAe,CAAC,OAAe;AACnC,MAAI,QAAQ,GACV,MAAM,GAAG,QAAQ,KAAK,CAAC;AACzB,SAAO,QAAQ,IAAI;AACjB,aAAS;AACT,UAAM,GAAG,QAAQ,KAAK,MAAM,CAAC;AAAA,EAC/B;AACA,SAAO;AACT;AAEA,IAAM,eAAe,CAAC,QAAqB;AAAA,EACzC,QAAQ,UAAU,GAAG,EAAE;AAAA,EACvB,QAAQ,UAAU,GAAG,EAAE;AAAA,EACvB,SAAS,GAAG,iBAAiB;AAAA,EAC7B,QAAQ,GAAG,iBAAiB;AAAA,EAC5B,OAAO,aAAa,GAAG,EAAE;AAC3B;AAoBO,IAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,EAAE,GAAG,MAAM,GAAG,KAAK;AAC/B,MAA4C;AAC1C,QAAM,CAAC,EAAE,YAAY,QAAI,wBAAS,CAAC,CAAC;AACpC,QAAM,gBAAY,sBAAgC;AAAA,IAChD,EAAE,IAAI,QAAQ,MAAM,MAAM,KAAK,KAAK;AAAA,EACtC,CAAC;AAED,QAAM,mBAAe,2BAAY,CAAC,UAAmC;AACnE,cAAU,UAAU;AACpB,iBAAa,CAAC,CAAC;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,QAAM,6BAAyB,sBAA2B;AAC1D,QAAM,8BAA0B,sBAA2B;AAC3D,QAAM,gBAAY,sBAAkB,EAAE,MAAM,WAAW,CAAC;AACxD,QAAM,gBAAY,sBAAO,CAAC;AAI1B,QAAM,eAAW;AAAA,IACf,CAAC,SAAS,QAAQ,SAAS,MAAM,aAAa,SAAS;AACrD,UAAI,WAAW,UAAU,WAAW,MAAM;AACxC,qBAAa,CAAC,EAAE,IAAI,QAAQ,MAAM,MAAM,KAAK,KAAK,CAAC,CAAC;AAAA,MACtD,OAAO;AACL,kBAAU,QAAQ,MAAM,IAAI;AAC5B,cAAM,MAAM,aAAa,WAAW,gBAAgB;AACpD,cAAM,KAAK,IAAI,eAAe,GAAG,MAAM,UAAU,QAAQ;AACzD,cAAM,EAAE,MAAM,IAAI,IAAI,YAAY,IAAI,UAAU,OAAO;AACvD,qBAAa,UAAU,QAAQ,OAAO,EAAE,IAAI,QAAQ,MAAM,IAAI,CAAC,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,IACA,CAAC,IAAI,MAAM,MAAM,YAAY;AAAA,EAC/B;AAEA,QAAM,gBAAY;AAAA,IAChB,CAAC,WAAoB;AACnB,UAAI,WAAW,QAAQ;AACrB,qBAAa,CAAC,CAAC;AAAA,MACjB,OAAO;AACL,qBAAa,UAAU,QAAQ,MAAM,GAAG,EAAE,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,iBAAa;AAAA,IACjB,CAAC,QAAQ,WAAW;AAClB,YAAM,QAAQ,UAAU,QAAQ,MAAM;AACtC,UAAI,EAAE,IAAI,WAAW,IAAI,MAAM,MAAM,SAAS,CAAC;AAC/C,aAAO,MAAM,SAAS,KAAK,CAAC,OAAO,WAAW,UAAU,GAAG;AACzD,cAAM,eAAe,UAAU,UAAU;AACzC,cAAM,IAAI;AACV,kBAAU,QAAQ,UAAU,IAAI;AAChC,kBAAU,QAAQ,YAAY,IAAI;AAClC,SAAC,EAAE,IAAI,WAAW,IAAI,MAAM,MAAM,SAAS,CAAC;AAAA,MAC9C;AACA,UAAI,MAAM,SAAS,UAAU,QAAQ,QAAQ;AAC3C,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,mBAAe;AAAA,IACnB,CAAC,QAAQ,QAAQ,eAAe;AAC9B,UAAI,uBAAuB,SAAS;AAClC,qBAAa,uBAAuB,OAAO;AAAA,MAC7C;AACA,6BAAuB,UAAU,OAAO,WAAW,MAAM;AACvD,gBAAQ,IAAI,kCAAkC,QAAQ;AACtD,mBAAW,QAAQ,MAAM;AACzB,kBAAU,QAAQ,MAAM,IAAI;AAC5B,kBAAU,QAAQ,MAAM,IAAI;AAC5B,iBAAS,QAAQ,QAAQ,UAAU;AAAA,MACrC,GAAG,GAAG;AAAA,IACR;AAAA,IACA,CAAC,YAAY,QAAQ;AAAA,EACvB;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,YAAY,QAAQ,WAAW;AAC9B,cAAQ;AAAA,QACN,4BAA4B,qBAAqB,iBAAiB;AAAA,MACpE;AACA,gBAAU,QAAQ,UAAU,IAAI;AAChC,8BAAwB,UAAU,OAAO,WAAW,MAAM;AACxD,mBAAW,QAAQ,MAAM;AAAA,MAC3B,GAAG,GAAG;AAAA,IACR;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,mBAAe,2BAAY,MAAM;AACrC,UAAM,EAAE,SAAS,MAAM,IAAI;AAC3B,UAAM,CAAC,IAAI,IAAI,MAAM,MAAM,EAAE;AAC7B,UAAM,KAAK,SAAS,eAAe,GAAG,MAAM,KAAK,IAAI;AACrD,QAAI,IAAI;AACN,YAAM,EAAE,OAAO,OAAO,IAAI,GAAG,sBAAsB;AACnD,YAAM,EAAE,cAAc,YAAY,IAAI,SAAS;AAC/C,UAAI,QAAQ,aAAa;AACvB,cAAM,WACJ,MAAM,SAAS,IACX,UAAU,IAAI,KAAK,IACnB,UAAU,OAAO,QAAQ,WAAW;AAC1C,qBAAa,QAAQ;AAAA,MACvB,WAAW,SAAS,cAAc;AAChC,cAAM,WAAW,QAAQ,OAAO,SAAS,YAAY;AACrD,qBAAa,QAAQ;AAAA,MACvB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,IAAI,YAAY,CAAC;AAErB,QAAM,oBAAwC;AAAA,IAC5C,OAAO;AAAA,MACL,cAAc,CAAC,QAAoB;AACjC,cAAM,aAAa,gBAAgB,IAAI,MAAqB;AAC5D,cAAM,EAAE,QAAQ,QAAQ,SAAS,QAAQ,MAAM,IAC7C,aAAa,UAAU;AACzB,cAAM,YAAY,UAAU,YAAY;AACxC,cAAM;AAAA,UACJ,SAAS,EAAE,CAAC,MAAM,GAAG,MAAM;AAAA,QAC7B,IAAI;AACJ,kBAAU,UAAU;AAUpB,YAAI,UAAU,cAAc,SAAS;AAEnC,oBAAU,QAAQ,MAAM,IAAI;AAC5B,uBAAa,QAAQ,QAAQ,UAAU;AAAA,QACzC,WAAW,UAAU,mBAAmB,CAAC,SAAS;AAChD,oBAAU,QAAQ,MAAM,IAAI;AAC5B,uBAAa,uBAAuB,OAAO;AAC3C,iCAAuB,UAAU;AAAA,QACnC,WAAW,UAAU,mBAAmB,SAAS;AAC/C,uBAAa,uBAAuB,OAAO;AAC3C,uBAAa,QAAQ,QAAQ,UAAU;AAAA,QACzC,WAAW,UAAU,cAAc;AACjC,gBAAM,CAAC,EAAE,IAAI,aAAa,GAAG,EAAE,IAAI,WAAW,CAAC,IAC7C,UAAU,QAAQ,MAAM,EAAE;AAC5B,cACE,iBAAiB,UACjB,UAAU,QAAQ,UAAU,MAAM,mBAClC,WACA;AACA,0BAAc,YAAY,QAAQ,MAAM;AACxC,gBAAI,WAAW,CAAC,QAAQ;AACtB,2BAAa,QAAQ,QAAQ,UAAU;AAAA,YACzC;AAAA,UACF,WACE,iBAAiB,UACjB,WACA,WAAW,cACX,UAAU,QAAQ,UAAU,MAAM,iBAClC;AAEA,yBAAa,QAAQ,QAAQ,UAAU;AAAA,UACzC,WAAW,SAAS;AAClB,uBAAW,QAAQ,MAAM;AACzB,yBAAa,QAAQ,QAAQ,UAAU;AAAA,UACzC,WACE,EAAE,UAAU,QAAQ,UAAU,MAAM,mBAAmB,YACvD;AACA,uBAAW,QAAQ,MAAM;AAAA,UAC3B;AAAA,QACF;AAEA,YAAI,UAAU,iBAAiB;AAC7B,cAAI,uBAAuB,SAAS;AAClC,yBAAa,uBAAuB,OAAO;AAC3C,mCAAuB,UAAU;AAAA,UACnC;AACA,uBAAa,wBAAwB,OAAO;AAC5C,kCAAwB,UAAU;AAClC,oBAAU,QAAQ,MAAM,IAAI;AAAA,QAC9B;AAEA,yBAAiB,KAAK,MAAM;AAAA,MAC9B;AAAA,MAEA,SAAS,CAAC,QAAwB;AAChC,cAAM,gBAAgB,IAAI;AAC1B,cAAM,aAAa,gBAAgB,aAAa;AAChD,cAAM,MAAM,cAAc,UAAU;AACpC,gBAAQ;AAAA,UACN,oBAAoB,iBAAiB,WAAW;AAAA,QAClD;AACA,YAAI,WAAW,iBAAiB,QAAQ;AACtC,cAAI,WAAW,iBAAiB,QAAQ;AACtC,qBAAS,GAAG;AAAA,UACd,OAAO;AAAA,UAEP;AAAA,QACF,OAAO;AACL,qBAAW,UAAU,WAAW,EAAE,CAAC;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,UAAU;AAAA,EACvB;AACF;;;AEpVA,IAAAC,gBAA0B;AAQnB,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,MAA0B;AACxB,+BAAU,MAAM;AACd,QAAI;AACJ,QAAI,QAAQ;AACV,qBAAe,CAAC,QAAQ;AACtB,cAAM,SAAS,IAAI;AACnB,cAAM,YAAY,OAAO,QAAQ,IAAI,oBAAoB;AACzD,YAAI,cAAc,MAAM;AACtB,6CAAU;AAAA,QACZ;AAAA,MACF;AAEA,eAAS,KAAK,iBAAiB,SAAS,cAAc,IAAI;AAAA,IAC5D;AAEA,WAAO,MAAM;AACX,UAAI,cAAc;AAChB,iBAAS,KAAK,oBAAoB,SAAS,cAAc,IAAI;AAAA,MAC/D;AAAA,IACF;AAAA,EACF,GAAG,CAAC,oBAAoB,QAAQ,OAAO,CAAC;AAC1C;;;AR8DI,IAAAC,sBAAA;AAMQ,IAAAC,gBAAA;AAvFZ,IAAM,OAAO,MAAM;AAEZ,IAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,IAAI;AAAA,EACJ,UAAU,MAAM;AAAA,EAChB,WAAW,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACxB;AAAA,EACA,GAAG;AACL,MAAwB;AACtB,QAAM,SAAK,aAAAC,WAAM,MAAM;AACvB,QAAM,mBAAe,sBAAoC,IAAI;AAC7D,QAAM,CAAC,OAAO,OAAO,IAAI,gBAAgB,YAAY;AACrD,QAAM,6BAAyB,sBAAO,mBAAmB;AACzD,QAAM,2BAAuB,2BAAY,MAAM;AAC7C,2BAAuB,UAAU;AAAA,EACnC,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAiB;AAAA,IACrB,CAAC,WAAmB;AAClB,YAAM,EAAE,QAAQ,QAAQ,IAAI,QAAQ,MAAM;AAC1C,mBAAa,QAAQ,MAAM;AAC3B,cAAQ,QAAQ,OAAO;AAAA,IACzB;AAAA,IACA,CAAC,SAAS,OAAO;AAAA,EACnB;AAEA,QAAM,EAAE,WAAW,eAAe,UAAU,WAAW,aAAa,IAClE,WAAW;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB;AAAA,EACF,CAAC;AACH,eAAa,UAAU;AAEvB,UAAQ,IAAI,EAAE,UAAU,CAAC;AAEzB,QAAM,kBAAc,2BAAY,MAAM;AACpC,cAAU;AACV,YAAQ;AAAA,EACV,GAAG,CAAC,WAAW,OAAO,CAAC;AAEvB,eAAa;AAAA,IACX,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,QAAQ,UAAU,SAAS;AAAA,EAC7B,CAAC;AAED,QAAM,iBAAiB,CAACC,QAAe;AACrC,UAAM,SAAS,UAAUA,GAAE;AAC3B,UAAM,SAAS,UAAU,MAAM;AAC/B,2BAAuB,UAAU;AACjC,aAAS,QAAQ,MAAM;AAAA,EACzB;AACA,QAAM,kBAAkB,MAAM;AAC5B,2BAAuB,UAAU;AACjC,cAAU;AAAA,EACZ;AAEA,QAAM,0BAA0B,MAAM;AAAA,EAEtC;AAEA,QAAM,WAAW,UAAU,SAAS;AAEpC,QAAM,oBAAoB,CAAC,MAAc;AACvC,QAAI,KAAK,UAAU;AACjB,aAAO;AAAA,IACT,OAAO;AACL,YAAM,EAAE,IAAI,OAAO,IAAI,UAAU,IAAI,CAAC;AACtC,YAAM,MAAM,OAAO,YAAY,GAAG;AAClC,YAAM,MACJ,QAAQ,KAAK,SAAS,QAAQ,EAAE,IAAI,SAAS,OAAO,MAAM,CAAC,GAAG,GAAG,EAAE;AACrE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SACE,6EACG,oBAAU,IAAI,CAAC,EAAE,IAAI,QAAQ,MAAM,IAAI,GAAG,MAAM;AAC/C,UAAM,iBAAiB,kBAAkB,CAAC;AAE1C,WACE,6CAAC,UAAe,GAAG,MAAM,GAAG,KAAK,UAAU,cACzC;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,qBAAqB,uBAAuB;AAAA,QAC5C,kBAAkB;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,MAAM;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA,YAAY;AAAA,QACZ,qBAAqB;AAAA,QACrB,aAAa;AAAA,QACb,YAAY;AAAA,QACZ;AAAA;AAAA,MAEC,MAAM,MAAM;AAAA,IACf,KAlBW,CAmBb;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEA,YAAY,cAAc;;;AS9H1B,IAAAC,iBAA+D;AAqF3D,IAAAC,sBAAA;AArEG,IAAM,yBAAqB;AAAA,EAChC;AACF;AAqBO,IAAM,4BAA4B,CACvC,aAEA,aAAa,UAAa,cAAc;AAa1C,IAAM,WAAW,CAAC;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,QAAM,mBAAe,wBAAQ,MAAM;AACjC,SAAI,mCAAS,iBAAgB,aAAa;AACxC,aAAO,QAAQ,aAAa,OAAO,WAAW;AAAA,IAChD,WAAW,aAAa;AACtB,aAAO,CAAC,WAAW;AAAA,IACrB,OAAO;AACL,cAAO,mCAAS,iBAAgB,CAAC;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,SAAS,WAAW,CAAC;AAEzB,QAAM,uBAAmB;AAAA,IACvB,CAAC,MAAM,YAAY;AAxEvB;AAyEM,UAAI,uDAAoB,MAAM,UAAU;AACtC,eAAO;AAAA,MACT;AAEA,WAAI,wCAAS,sBAAT,iCAA6B,MAAM,UAAU;AAC/C,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,CAAC,SAAS,iBAAiB;AAAA,EAC7B;AAEA,SACE;AAAA,IAAC,mBAAmB;AAAA,IAAnB;AAAA,MACC,OAAO;AAAA,QACL,mBAAmB;AAAA,QACnB;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAGO,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAgC;AAC9B,SACE,6CAAC,mBAAmB,UAAnB,EACE,WAAC,kBACA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,EACH,GAEJ;AAEJ;;;ACjHA,IAAAC,iBAAoD;;;ACJpD,IAAAC,qBAAe;AACf,IAAAC,iBAOO;AACP,uBAAqB;AAKrB,IAAI,cAAc;AAClB,IAAM,UAAoB,CAAC;AAE3B,SAAS,kBAAkB,GAAkB;AAC3C,MAAI,EAAE,QAAQ,OAAO;AACnB,QAAI,QAAQ,QAAQ;AAClB,qBAAe;AAAA,IACjB,WAAW,aAAa;AACtB,YAAM,aAAa,SAAS,KAAK,cAAc,YAAY;AAC3D,UAAI,YAAY;AACd,yBAAAC,QAAS,uBAAuB,UAAU;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,GAAe;AAC1C,MAAI,QAAQ,QAAQ;AAElB,UAAM,kBAAkB,SAAS,KAAK,iBAAiB,WAAW;AAClE,aAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,UAAI,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAqB,GAAG;AACxD;AAAA,MACF;AAAA,IACF;AACA,mBAAe;AAAA,EACjB;AACF;AAEA,SAAS,iBAAiB;AACxB,MAAI,QAAQ,QAAQ;AAElB,UAAM,kBAAkB,SAAS,KAAK,iBAAiB,WAAW;AAClE,aAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,uBAAAA,QAAS,uBAAuB,gBAAgB,CAAC,CAAC;AAAA,IACpD;AACA,gBAAY,GAAG;AAAA,EACjB;AACF;AAEA,SAAS,eAAe;AACtB,MAAI,gBAAgB,OAAO;AACzB,kBAAc;AACd,WAAO,iBAAiB,WAAW,mBAAmB,IAAI;AAAA,EAC5D;AACF;AAEA,SAAS,eAAe;AACtB,MAAI,aAAa;AACf,kBAAc;AACd,WAAO,oBAAoB,WAAW,mBAAmB,IAAI;AAAA,EAC/D;AACF;AAEA,SAAS,YAAY,MAAc;AACjC,MAAI,QAAQ,QAAQ,IAAI,MAAM,IAAI;AAChC,YAAQ,KAAK,IAAI;AAEjB,QAAI,gBAAgB,OAAO;AACzB,aAAO,iBAAiB,WAAW,mBAAmB,IAAI;AAC1D,aAAO,iBAAiB,SAAS,qBAAqB,IAAI;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,SAAS,YAAY,MAA+B;AAClD,MAAI,QAAQ,QAAQ;AAClB,QAAI,SAAS,KAAK;AAChB,cAAQ,SAAS;AAAA,IACnB,OAAO;AACL,YAAM,MAAM,QAAQ,QAAQ,IAAI;AAChC,UAAI,QAAQ,IAAI;AACd,gBAAQ,OAAO,KAAK,CAAC;AAAA,MACvB;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,KAAK,gBAAgB,OAAO;AACjD,aAAO,oBAAoB,WAAW,mBAAmB,IAAI;AAC7D,aAAO,oBAAoB,SAAS,qBAAqB,IAAI;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,IAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,MAGM;AACJ,QAAM,gBAAY,mBAAAC,SAAG,WAAW,oBAAoB,QAAQ;AAC5D,aAAO,8BAAc,OAAO,EAAE,WAAW,MAAM,GAAG,QAAQ;AAC5D;AAEA,IAAI,kBAAkB;AAEf,IAAM,eAAN,MAAmB;AAAA,EACxB,OAAO,UAAU;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR;AAAA,EACF,GAUG;AACD,QAAI,CAAC,WAAW;AACd,YAAM,MAAM,+CAA+C;AAAA,IAC7D;AACA,gBAAY,IAAI;AAChB,QAAI,KAAK,SAAS,KAAK,cAAc,eAAe,KAAK;AACzD,QAAI,OAAO,MAAM;AACf,WAAK,SAAS,cAAc,KAAK;AACjC,SAAG,YAAY,cAAc;AAC7B,eAAS,KAAK,YAAY,EAAE;AAAA,IAC9B;AAEA,UAAM,QAAQ,EAAE,MAAM;AAEtB;AAAA,UACE;AAAA,QACE;AAAA,QACA,EAAE,KAAK,mBAAmB,UAAU,MAAM;AAAA,QAC1C;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AACJ,qBAAa,kBAAkB,IAAI,KAAK;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,UAAU,OAAO,QAAQ,QAAQ,OAAO;AAG7C,QAAI,QAAQ,QAAQ,IAAI,MAAM,IAAI;AAChC,kBAAY,IAAI;AAChB,YAAM,YAAY,SAAS,KAAK,cAAc,aAAa,OAAO;AAClE,UAAI,WAAW;AACb,yBAAAD,QAAS,uBAAuB,SAAS;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,kBAAkB,IAAiB,QAAyB,QAAQ;AACzE,UAAM,SAAS,GAAG,cAAc,wBAAwB;AACxD,QAAI,QAAQ;AACV,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT,IAAI,OAAO,sBAAsB;AAEjC,YAAM,IAAI,OAAO;AACjB,YAAM,IAAI,OAAO;AAEjB,YAAM,YAAY,KAAK,MAAM;AAC7B,UAAI,YAAY,GAAG;AACjB,eAAO,MAAM,MAAM,KAAK,MAAM,GAAG,IAAI,YAAY;AAAA,MACnD;AAEA,YAAM,YAAY,KAAK,OAAO;AAC9B,UAAI,YAAY,GAAG;AACjB,eAAO,MAAM,OAAO,KAAK,MAAM,IAAI,IAAI,YAAY;AAAA,MACrD;AAEA,UAAI,OAAO,UAAU,YAAY,UAAU,cAAc;AACvD,cAAM,aAAa,QAAQ;AAC3B,eAAO,MAAM,OAAO,OAAO,aAAa;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACzB,OAAO,WAAW,QAAsB;AACtC,UAAM,cAAc;AACpB,UAAM,UAAU,OAAO,MAAM;AAE7B,iBAAa;AAEb,qBAAAA,QAAS;AAAA,MACP,eAAAE,QAAM,aAAa,QAAQ;AAAA,QACzB,WAAW;AAAA,QACX,SAAS,MAAM;AACb,wBAAc,YAAY;AAC1B,cAAI,SAAS;AACX,oBAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MACD,SAAS,KAAK,cAAc,WAAW;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,OAAO,cAAc;AACnB,iBAAa;AACb,UAAM,aAAa,SAAS,KAAK,cAAc,YAAY;AAC3D,QAAI,YAAY;AACd,uBAAAF,QAAS,uBAAuB,UAAU;AAAA,IAC5C;AAAA,EACF;AACF;AAYO,IAAM,QAAQ,CAAC,UAAsB;AAC1C,QAAM,kBAAc,uBAA2B;AAC/C,QAAM,UAAM,uBAAoB,IAAI;AAEpC,QAAM,OAAO,CAACG,QAAmB,uBAAgC;AAC/D,UAAM,EAAE,MAAM,OAAO,OAAO,MAAM,IAAIA;AACtC,QAAI;AACJ,QAAI;AAEJ,QAAI,YAAY,SAAS;AACvB,aAAO,aAAa,YAAY,OAAO;AACvC,kBAAY,UAAU;AAAA,IACxB;AAEA,QAAIA,OAAM,UAAU,MAAM;AACxB,mBAAa,UAAU,MAAM,KAAK;AAAA,IACpC,OAAO;AACL,YAAM,EAAE,UAAU,UAAU,UAAU,IAAIA;AAC1C,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,IAAI;AAEJ,UAAI,aAAa,SAAS;AACxB,eAAO;AACP,cAAM;AAAA,MACR,WAAW,aAAa,SAAS;AAC/B,eAAO;AACP,cAAM;AAAA,MACR;AAEA,kBAAY,UAAU,OAAO,WAAW,MAAM;AAC5C,qBAAa,UAAU;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO,SAAS;AAAA,UAChB;AAAA,QACF,CAAC;AAAA,MACH,GAAG,EAAE;AAAA,IACP;AAAA,EACF;AAEA,gCAAU,MAAM;AACd,QAAI,IAAI,SAAS;AACf,YAAM,KAAK,IAAI,QAAQ;AACvB,YAAM,qBAAqB,yBAAI;AAC/B,UAAI,oBAAoB;AACtB,aAAK,OAAO,kBAAkB;AAAA,MAChC;AAAA,IACF;AAEA,WAAO,MAAM;AACX,mBAAa,UAAU,MAAM,MAAM,MAAM,KAAK;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,SAAO,eAAAD,QAAM,cAAc,OAAO,EAAE,WAAW,eAAe,IAAI,CAAC;AACrE;;;ADhPQ,IAAAE,sBAAA;AAlDD,IAAM,iBAAiB,MAAM;AAClC,QAAM,UAAM,2BAAW,kBAAkB;AAEzC,QAAM,uBAAmB;AAAA,IACvB,CAAC,cAA6B,UAAU,YAAY;AAClD,UAAI,UAAuC,CAAC;AAC5C,iBAAW,eAAe,cAAc;AAEtC,kBAAU,QAAQ,OAAO,YAAY,UAAU,OAAO,CAAC;AAAA,MACzD;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,4BAAwB;AAAA,IAC5B,CAAC,GAA4B,UAAkB,YAAqB;AAjCxE;AAkCM,QAAE,gBAAgB;AAClB,QAAE,eAAe;AACjB,YAAM,gBAAe,gCAAK,iBAAL,YAAqB,CAAC;AAC3C,YAAM,sBAAsB;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,cAAQ,IAAI;AAAA,QACV;AAAA,MACF,CAAC;AACD,UAAI,oBAAoB,WAAU,2BAAK,oBAAmB;AACxD,gBAAQ,IAAI,mBAAmB,YAAY;AAAA,UACzC;AAAA,QACF,CAAC;AACD,wBAAgB,GAAG,qBAAqB,IAAI,iBAAiB;AAAA,MAC/D;AAAA,IACF;AAAA,IACA,CAAC,kBAAkB,GAAG;AAAA,EACxB;AAEA,SAAO;AACT;AAEA,IAAM,kBAAkB,CACtB,GACA,iBACA,4BACG;AACH,QAAM,EAAE,SAAS,MAAM,SAAS,IAAI,IAAI;AACxC,QAAM,YAAY,CAACC,qBAAiD;AAClE,UAAM,iBAAiB,CAAC,UAAqC,MAC3D,0BAA0B,QAAQ,IAChC,6CAAC,iBAAsB,OAAO,SAAS,OACpC,mBAAS,SAAS,IAAI,cAAc,KADnB,CAEpB,IAEA;AAAA,MAAC;AAAA;AAAA,QAEC,QAAQ,SAAS;AAAA,QACjB,aAAW,SAAS;AAAA,QACpB,SAAS,SAAS;AAAA,QAEjB,mBAAS;AAAA;AAAA,MALL;AAAA,IAMP;AAGJ,WAAOA,iBAAgB,IAAI,cAAc;AAAA,EAC3C;AAEA,QAAM,cAAc,CAAC,QAAiB,YAAsB;AAC1D,QAAI,QAAQ;AACV,8BAAwB,QAAQ,OAAO;AACvC,mBAAa,UAAU;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,YACJ,6CAAC,eAAY,SAAS,aAAa,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI,GAC5D,oBAAU,eAAe,GAC5B;AAEF,eAAa,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,CAAC;AACvD;",
6
- "names": ["import_core", "import_react", "ReactDOM", "Portal", "import_jsx_runtime", "cx", "import_core", "import_react", "import_react", "import_classnames", "import_core", "import_react", "import_react", "menus", "actions", "React", "import_jsx_runtime", "classBase", "isRoot", "useId", "React", "cx", "children", "className", "props", "import_react", "import_react", "import_jsx_runtime", "import_react", "useId", "id", "import_react", "import_jsx_runtime", "import_react", "import_classnames", "import_react", "ReactDOM", "cx", "React", "props", "import_jsx_runtime", "menuDescriptors"]
4
+ "sourcesContent": ["export * from \"./dialog\";\nexport * from \"./menu\";\nexport * from \"./popup\";\nexport * from \"./portal\";\n", "import { Scrim, Toolbar, ToolbarButton } from \"@heswell/salt-lab\";\nimport { Text } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { HTMLAttributes, useCallback, useRef, useState } from \"react\";\nimport { Portal } from \"../portal\";\n\nimport \"./Dialog.css\";\n\nconst classBase = \"vuuDialog\";\n\nexport interface DialogProps extends HTMLAttributes<HTMLDivElement> {\n isOpen?: boolean;\n onClose?: () => void;\n}\n\nexport const Dialog = ({\n children,\n className,\n isOpen = false,\n onClose,\n title,\n ...props\n}: DialogProps) => {\n const root = useRef<HTMLDivElement>(null);\n const [posX] = useState(0);\n const [posY] = useState(0);\n\n const close = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n const handleRender = useCallback(() => {\n // if (center && isOpen && root.current) {\n // const { width, height } = root.current.getBoundingClientRect();\n // const { innerWidth, innerHeight } = window;\n // const x = innerWidth / 2 - width / 2;\n // const y = innerHeight / 2 - height / 2;\n // setPosX(x);\n // setPosY(y);\n // }\n }, []);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <Portal onRender={handleRender} x={posX} y={posY}>\n <Scrim className={`${classBase}-scrim`} open={isOpen}>\n <div {...props} className={cx(classBase, className)} ref={root}>\n <Toolbar className={`${classBase}-header`}>\n <Text>{title}</Text>\n <ToolbarButton\n key=\"close\"\n onClick={close}\n data-align-end\n data-icon=\"close\"\n />\n </Toolbar>\n {children}\n </div>\n </Scrim>\n </Portal>\n );\n};\n", "import { ReactElement, useLayoutEffect, useMemo } from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { createContainer, renderPortal } from \"./render-portal\";\n\nexport interface PortalProps {\n children: ReactElement;\n onRender?: () => void;\n x?: number;\n y?: number;\n}\n\nexport const Portal = function Portal({\n children,\n x = 0,\n y = 0,\n onRender,\n}: PortalProps) {\n // Do we need to accept container here as a prop ?\n const renderContainer = useMemo(() => {\n return createContainer();\n }, []);\n\n useLayoutEffect(() => {\n renderPortal(children, renderContainer, x, y, onRender);\n }, [children, onRender, renderContainer, x, y]);\n\n useLayoutEffect(() => {\n return () => {\n if (renderContainer) {\n ReactDOM.unmountComponentAtNode(renderContainer);\n if (renderContainer.classList.contains(\"vuuPopup\")) {\n renderContainer.parentElement?.removeChild(renderContainer);\n }\n }\n };\n }, [renderContainer]);\n\n // useLayoutEffect(() => {\n // renderContainer.current = renderPortal(children, x, y, container)\n // return () => {\n // if (renderContainer.current){\n // console.log('EXPLICIT UNMOUNT')\n // ReactDOM.unmountComponentAtNode(renderContainer.current);\n // if (renderContainer.current.classList.contains('hwReactPopup')){\n // renderContainer.current.parentElement.removeChild(renderContainer.current);\n // renderContainer.current = null;\n // }\n // }\n // }\n // },[])\n return null;\n};\n", "import * as ReactDOM from \"react-dom\";\nimport { SaltProvider } from \"@salt-ds/core\";\nimport { ReactElement } from \"react\";\n\nlet containerId = 1;\n\nconst getPortalContainer = (x = 0, y = 0, win = window) => {\n const el = win.document.createElement(\"div\");\n el.className = \"vuuPopup \" + containerId++;\n el.style.cssText = `left:${x}px; top:${y}px;`;\n win.document.body.appendChild(el);\n return el;\n};\n\nconst createDOMContainer = (x?: number, y?: number) => getPortalContainer(x, y);\n\nexport const renderPortal = (\n component: ReactElement,\n container: HTMLElement,\n x: number,\n y: number,\n onRender?: () => void\n) => {\n // check this first to see if position has changed\n container.style.cssText = `left:${x}px; top:${y}px;position: absolute;`;\n\n ReactDOM.render(\n <SaltProvider applyClassesTo=\"child\">{component}</SaltProvider>,\n container,\n onRender\n );\n};\n\nexport const createContainer = createDOMContainer;\n", "export const installTheme = (themeId: string) => {\n const installedThemes = getComputedStyle(document.body).getPropertyValue(\n \"--installed-themes\"\n );\n document.body.style.setProperty(\n \"--installed-themes\",\n `${installedThemes} ${themeId}`\n );\n};\n", "import { useIdMemo as useId } from \"@salt-ds/core\";\nimport { useCallback, useRef } from \"react\";\nimport { Portal } from \"../portal\";\nimport MenuList, { MenuListProps } from \"./MenuList\";\nimport { getItemId, getMenuId, useCascade } from \"./use-cascade\";\nimport { useClickAway } from \"./use-click-away\";\nimport { useItemsWithIds } from \"./use-items-with-ids\";\n\nexport interface ContextMenuProps extends Omit<MenuListProps, \"onCloseMenu\"> {\n onClose?: (menuId?: string, options?: unknown) => void;\n position?: { x: number; y: number };\n withPortal?: boolean;\n}\n\nconst noop = () => undefined;\n\nexport const ContextMenu = ({\n activatedByKeyboard,\n children: childrenProp,\n className,\n id: idProp,\n onClose = () => undefined,\n position = { x: 0, y: 0 },\n style,\n ...menuListProps\n}: ContextMenuProps) => {\n const id = useId(idProp);\n const closeMenuRef = useRef<(location?: string) => void>(noop);\n const [menus, actions] = useItemsWithIds(childrenProp);\n const navigatingWithKeyboard = useRef(activatedByKeyboard);\n const handleMouseEnterItem = useCallback(() => {\n navigatingWithKeyboard.current = false;\n }, []);\n\n const handleActivate = useCallback(\n (menuId: string) => {\n const { action, options } = actions[menuId];\n closeMenuRef.current(\"root\");\n onClose(action, options);\n },\n [actions, onClose]\n );\n\n const { closeMenu, listItemProps, openMenu, openMenus, handleRender } =\n useCascade({\n id,\n onActivate: handleActivate,\n onMouseEnterItem: handleMouseEnterItem,\n position,\n });\n closeMenuRef.current = closeMenu;\n\n console.log({ openMenus });\n\n const handleClose = useCallback(() => {\n closeMenu();\n onClose();\n }, [closeMenu, onClose]);\n\n useClickAway({\n containerClassName: \"vuuMenuList\",\n onClose: handleClose,\n isOpen: openMenus.length > 0,\n });\n\n const handleOpenMenu = (id: string) => {\n const itemId = getItemId(id);\n const menuId = getMenuId(itemId);\n navigatingWithKeyboard.current = true;\n openMenu(menuId, itemId);\n };\n const handleCloseMenu = () => {\n navigatingWithKeyboard.current = true;\n closeMenu();\n };\n\n const handleHighlightMenuItem = () => {\n // console.log(`highlight ${idx}`);\n };\n\n const lastMenu = openMenus.length - 1;\n\n const getChildMenuIndex = (i: number) => {\n if (i >= lastMenu) {\n return -1;\n } else {\n const { id: menuId } = openMenus[i + 1];\n const pos = menuId.lastIndexOf(\".\");\n const idx =\n pos === -1 ? parseInt(menuId, 10) : parseInt(menuId.slice(-pos), 10);\n return idx;\n }\n };\n\n return (\n <>\n {openMenus.map(({ id: menuId, left, top }, i) => {\n const childMenuIndex = getChildMenuIndex(i);\n\n return (\n <Portal key={i} x={left} y={top} onRender={handleRender}>\n <MenuList\n {...menuListProps}\n activatedByKeyboard={navigatingWithKeyboard.current}\n childMenuShowing={childMenuIndex}\n className={className}\n id={id}\n menuId={menuId}\n isRoot={i === 0}\n key={i}\n listItemProps={listItemProps}\n onActivate={handleActivate}\n onHighlightMenuItem={handleHighlightMenuItem}\n onCloseMenu={handleCloseMenu}\n onOpenMenu={handleOpenMenu}\n style={style}\n >\n {menus[menuId]}\n </MenuList>\n </Portal>\n );\n })}\n </>\n );\n};\n\nContextMenu.displayName = \"ContextMenu\";\n", "import React, {\n FC,\n HTMLAttributes,\n ReactElement,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport cx from \"classnames\";\nimport { useIdMemo as useId } from \"@salt-ds/core\";\nimport { useKeyboardNavigation } from \"./use-keyboard-navigation\";\nimport { isMenuItemGroup } from \"./use-items-with-ids\";\n\nimport \"./MenuList.css\";\n\nconst classBase = \"vuuMenuList\";\n\nexport const Separator = () => <li className=\"vuuMenuItem-divider\" />;\n\nexport interface MenuItemGroupProps {\n children: ReactElement<MenuItemProps>[];\n label: string;\n}\n\nexport interface MenuItemProps extends HTMLAttributes<HTMLDivElement> {\n action?: string;\n idx?: number;\n options?: unknown;\n}\n\n// Purely used as markers, props will be extracted\nexport const MenuItemGroup: FC<MenuItemGroupProps> = () => null;\n// eslint-disable-next-line no-unused-vars\nexport const MenuItem = ({ children, idx, ...props }: MenuItemProps) => {\n return <div {...props}>{children}</div>;\n};\n\nconst hasIcon = (child: ReactElement) => child.props[\"data-icon\"];\n\nexport interface MenuListProps extends HTMLAttributes<HTMLDivElement> {\n activatedByKeyboard?: boolean;\n children: ReactElement[];\n childMenuShowing?: number;\n highlightedIdx?: number;\n isRoot?: boolean;\n listItemProps?: Partial<MenuItemProps>;\n menuId?: string;\n onActivate?: (menuId: string) => void;\n onCloseMenu: (idx: number) => void;\n onOpenMenu?: (menuId: string) => void;\n onHighlightMenuItem?: (idx: number) => void;\n}\n\nconst MenuList = ({\n activatedByKeyboard,\n childMenuShowing = -1,\n children,\n className,\n highlightedIdx: highlightedIdxProp,\n id: idProp,\n isRoot,\n listItemProps,\n menuId,\n onHighlightMenuItem,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n ...props\n}: MenuListProps) => {\n const id = useId(idProp);\n const root = useRef<HTMLDivElement>(null);\n\n // The id generation be,ongs in useIttemsWithIds\n const mapIdxToId = useMemo(() => new Map(), []);\n\n const handleOpenMenu = (idx: number) => {\n const el = root.current?.querySelector(`:scope > [data-idx='${idx}']`);\n el?.id && onOpenMenu?.(el.id);\n };\n\n const handleActivate = (idx: number) => {\n const el = root.current?.querySelector(`:scope > [data-idx='${idx}']`);\n el?.id && onActivate?.(el.id);\n };\n\n const { focusVisible, highlightedIndex, listProps } = useKeyboardNavigation({\n count: React.Children.count(children),\n highlightedIndex: highlightedIdxProp,\n onActivate: handleActivate,\n onHighlight: onHighlightMenuItem,\n onOpenMenu: handleOpenMenu,\n onCloseMenu,\n });\n\n const appliedFocusVisible = childMenuShowing == -1 ? focusVisible : -1;\n\n useLayoutEffect(() => {\n if (childMenuShowing === -1 && activatedByKeyboard) {\n root.current?.focus();\n }\n }, [activatedByKeyboard, childMenuShowing]);\n\n const getActiveDescendant = () =>\n highlightedIndex === undefined || highlightedIndex === -1\n ? undefined\n : mapIdxToId.get(highlightedIndex);\n\n return (\n <div\n {...props}\n {...listProps}\n aria-activedescendant={getActiveDescendant()}\n className={cx(classBase, className, {\n [`${classBase}-childMenuShowing`]: childMenuShowing !== -1,\n })}\n data-root={isRoot || undefined}\n id={`${id}-${menuId}`}\n ref={root}\n role=\"menu\"\n tabIndex={0}\n >\n {renderContent()}\n </div>\n );\n\n function renderContent() {\n const propsCommonToAllListItems = {\n ...listItemProps,\n role: \"menuitem\",\n };\n\n const maybeIcon = (\n childElement: ReactElement,\n withIcon: boolean,\n iconName?: string\n ) =>\n withIcon\n ? [\n <span\n className=\"vuuIconContainer\"\n data-icon={iconName}\n key=\"icon\"\n />,\n ].concat(childElement)\n : childElement;\n\n function addClonedChild(\n list: ReactElement[],\n child: ReactElement,\n idx: number,\n withIcon: boolean\n ) {\n const {\n children,\n className,\n \"data-icon\": iconName,\n id: itemId,\n hasSeparator,\n label,\n ...props\n } = child.props;\n const hasSubMenu = isMenuItemGroup(child);\n const subMenuShowing = hasSubMenu && childMenuShowing === idx;\n const ariaControls = subMenuShowing ? `${id}-${itemId}` : undefined;\n\n list.push(\n <MenuItem\n {...props}\n {...propsCommonToAllListItems}\n {...getMenuItemProps(\n `${id}-${menuId}`,\n itemId,\n idx,\n child.key ?? itemId,\n highlightedIndex,\n appliedFocusVisible,\n className,\n hasSeparator\n )}\n aria-controls={ariaControls}\n aria-haspopup={hasSubMenu || undefined}\n aria-expanded={subMenuShowing || undefined}\n >\n {hasSubMenu\n ? maybeIcon(label, withIcon, iconName)\n : maybeIcon(children, withIcon, iconName)}\n </MenuItem>\n );\n // mapIdxToId.set(idx, itemId);\n }\n\n const listItems: ReactElement[] = [];\n\n if (children.length > 0) {\n const withIcon = children.some(hasIcon);\n\n children.forEach((child, idx) => {\n addClonedChild(listItems, child, idx, withIcon);\n });\n }\n\n return listItems;\n }\n};\n\nconst getMenuItemProps = (\n baseId: string,\n itemId: string,\n idx: number,\n key: string,\n highlightedIdx: number,\n focusVisible: number,\n className: string,\n hasSeparator: boolean\n) => ({\n id: `${baseId}-${itemId}`,\n key: key ?? idx,\n \"data-idx\": idx,\n \"data-highlighted\": idx === highlightedIdx || undefined,\n className: cx(\"vuuMenuItem\", className, {\n \"vuuMenuItem-separator\": hasSeparator,\n focusVisible: focusVisible === idx,\n }),\n});\n\nMenuList.displayName = \"MenuList\";\nexport default MenuList;\n", "import {\n FocusEvent,\n KeyboardEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { hasPopup, isRoot } from \"./utils\";\nimport { isNavigationKey } from \"./key-code\";\n\nexport interface KeyboardNavigationProps {\n autoHighlightFirstItem?: boolean;\n count: number;\n highlightedIndex?: number;\n onActivate: (idx: number) => void;\n onHighlight?: (idx: number) => void;\n onCloseMenu: (idx: number) => void;\n onOpenMenu: (idx: number) => void;\n}\n\nexport interface KeyboardHookListProps {\n // onBlur: (evt: FocusEvent) => void;\n onFocus: (evt: FocusEvent) => void;\n onKeyDown: (evt: KeyboardEvent) => void;\n onMouseDownCapture: () => void;\n onMouseMove: () => void;\n onMouseLeave: () => void;\n}\n\nexport interface NavigationHookResult {\n focusVisible: number;\n controlledHighlighting: boolean;\n highlightedIndex: number;\n setHighlightedIndex: (idx: number) => void;\n // keyboardNavigation: RefObject<boolean>;\n listProps: KeyboardHookListProps;\n setIgnoreFocus: (ignoreFocus: boolean) => void;\n}\n\n// we need a way to set highlightedIdx when selection changes\nexport const useKeyboardNavigation = ({\n autoHighlightFirstItem = false,\n count,\n highlightedIndex: highlightedIndexProp,\n onActivate,\n onHighlight,\n // onKeyDown,\n onCloseMenu,\n onOpenMenu,\n}: KeyboardNavigationProps): NavigationHookResult => {\n // const prevCount = useRef(count);\n const highlightedIndexRef = useRef(\n highlightedIndexProp ?? autoHighlightFirstItem ? 0 : -1\n );\n const [, forceRender] = useState<unknown>(null);\n const controlledHighlighting = highlightedIndexProp !== undefined;\n\n // count will not work for this, as it will change when we expand collapse groups\n // if (count !== prevCount.current) {\n // prevCount.current = count;\n // if (highlightedIndexRef.current !== -1){\n // highlightedIndexRef.current = autoHighlightFirstItem ? 0 : -1;\n // }\n // }\n\n const setHighlightedIdx = useCallback(\n (idx) => {\n highlightedIndexRef.current = idx;\n onHighlight?.(idx);\n forceRender({});\n },\n [onHighlight]\n );\n\n const setHighlightedIndex = useCallback(\n (idx) => {\n if (idx !== highlightedIndexRef.current) {\n if (!controlledHighlighting) {\n setHighlightedIdx(idx);\n }\n }\n },\n [controlledHighlighting, setHighlightedIdx]\n );\n\n // does this belong here or should it be a method passed in?\n const keyBoardNavigation = useRef(true);\n const ignoreFocus = useRef(false);\n const setIgnoreFocus = (value: boolean) => (ignoreFocus.current = value);\n\n const highlightedIndex = controlledHighlighting\n ? highlightedIndexProp\n : highlightedIndexRef.current;\n\n const navigateChildldItems = useCallback(\n (e: KeyboardEvent) => {\n const nextIdx = nextItemIdx(count, e.key, highlightedIndexRef.current);\n if (nextIdx !== highlightedIndexRef.current) {\n setHighlightedIndex(nextIdx);\n }\n },\n [count, setHighlightedIndex]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (isNavigationKey(e)) {\n e.preventDefault();\n e.stopPropagation();\n keyBoardNavigation.current = true;\n navigateChildldItems(e);\n } else if (\n (e.key === \"ArrowRight\" || e.key === \"Enter\") &&\n hasPopup(e.target as HTMLElement, highlightedIndex)\n ) {\n onOpenMenu(highlightedIndex);\n } else if (e.key === \"ArrowLeft\" && !isRoot(e.target as HTMLElement)) {\n onCloseMenu(highlightedIndex);\n } else if (e.key === \"Enter\") {\n onActivate && onActivate(highlightedIndex);\n }\n },\n [\n highlightedIndex,\n navigateChildldItems,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n ]\n );\n\n const listProps: KeyboardHookListProps = useMemo(\n () => ({\n onFocus: () => {\n if (highlightedIndex === -1) {\n setHighlightedIdx(0);\n }\n },\n onKeyDown: handleKeyDown,\n onMouseDownCapture: () => {\n keyBoardNavigation.current = false;\n setIgnoreFocus(true);\n },\n\n // onMouseEnter would seem less expensive but it misses some cases\n onMouseMove: () => {\n if (keyBoardNavigation.current) {\n keyBoardNavigation.current = false;\n }\n },\n onMouseLeave: () => {\n // label === 'ParsedInput' && console.log(`%c[useKeyboardNavigationHook]<${label}> onMouseLeave`,'color:brown')\n keyBoardNavigation.current = true;\n setIgnoreFocus(false);\n setHighlightedIndex(-1);\n },\n }),\n [\n highlightedIndex,\n setHighlightedIndex,\n navigateChildldItems,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n setHighlightedIdx,\n ]\n );\n\n // label === 'ParsedInput' && console.log(`%cuseNavigationHook<${label}>\n // highlightedIdxProp= ${highlightedIdxProp},\n // highlightedIndexRef= ${highlightedIndexRef.current},\n // %chighlightedIdx= ${highlightedIdx}`, 'color: brown','color: brown;font-weight: bold;')\n\n return {\n focusVisible: keyBoardNavigation.current ? highlightedIndex : -1,\n controlledHighlighting,\n highlightedIndex,\n setHighlightedIndex: setHighlightedIndex,\n // keyBoardNavigation,\n listProps,\n setIgnoreFocus,\n };\n};\n\n// need to be able to accommodate disabled items\nfunction nextItemIdx(count: number, key: string, idx: number) {\n if (key === \"ArrowUp\") {\n if (idx > 0) {\n return idx - 1;\n } else {\n return idx;\n }\n } else {\n if (idx === null) {\n return 0;\n } else if (idx === count - 1) {\n return idx;\n } else {\n return idx + 1;\n }\n }\n}\n", "export const isRoot = (el: HTMLElement) =>\n el.closest(`[data-root='true']`) !== null;\n\nexport const hasPopup = (el: HTMLElement, idx: number) =>\n (el.ariaHasPopup === \"true\" && el.dataset?.idx === `${idx}`) ||\n el.querySelector(`:scope > [data-idx='${idx}'][aria-haspopup='true']`) !==\n null;\n", "function union(set1: Set<string>, ...sets: Set<string>[]) {\n const result = new Set(set1);\n for (const set of sets) {\n for (const element of set) {\n result.add(element);\n }\n }\n return result;\n}\n\nexport const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const Backspace = \"Backspace\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Delete = \"Delete\";\n\nconst actionKeys = new Set([Enter, Delete]);\nconst focusKeys = new Set([\"Tab\"]);\n// const navigationKeys = new Set([\"Home\", \"End\", \"ArrowRight\", \"ArrowLeft\",\"ArrowDown\", \"ArrowUp\"]);\nconst arrowLeftRightKeys = new Set([\"ArrowRight\", \"ArrowLeft\"]);\nconst verticalNavigationKeys = new Set([\"Home\", \"End\", \"ArrowDown\", \"ArrowUp\"]);\nconst horizontalNavigationKeys = new Set([\n \"Home\",\n \"End\",\n \"ArrowRight\",\n \"ArrowLeft\",\n]);\nconst functionKeys = new Set([\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n]);\nconst specialKeys = union(\n actionKeys,\n horizontalNavigationKeys,\n verticalNavigationKeys,\n arrowLeftRightKeys,\n functionKeys,\n focusKeys\n);\nexport const isCharacterKey = (evt: KeyboardEvent) => {\n if (specialKeys.has(evt.key)) {\n return false;\n }\n if (typeof evt.which === \"number\" && evt.which > 0) {\n return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which !== 8;\n }\n};\n\nexport const isNavigationKey = (\n { key }: { key: string },\n orientation = \"vertical\"\n) => {\n const navigationKeys =\n orientation === \"vertical\"\n ? verticalNavigationKeys\n : horizontalNavigationKeys;\n return navigationKeys.has(key);\n};\n", "import React, { ReactElement, useCallback, useMemo } from \"react\";\nimport { MenuItemGroup, Separator } from \"./MenuList\";\n\nexport const isMenuItemGroup = (child: ReactElement) =>\n child.type === MenuItemGroup || !!child.props[\"data-group\"];\n\ntype Menus = { [key: string]: ReactElement[] };\ntype Actions = { [key: string]: { action: string; options?: unknown } };\n\nexport const useItemsWithIds = (\n childrenProp: ReactElement[]\n): [Menus, Actions] => {\n const normalizeChildren = useCallback(() => {\n const collectChildren = (\n children: ReactElement[],\n path = \"root\",\n menus: Menus = {},\n actions: Actions = {}\n ) => {\n const list: ReactElement[] = (menus[path] = []);\n let idx = 0;\n let hasSeparator = false;\n\n React.Children.forEach(children, (child) => {\n if (child.type === Separator) {\n hasSeparator = true;\n } else {\n const group = isMenuItemGroup(child);\n const childPath = path === \"root\" ? `${idx}` : `${path}.${idx}`;\n const {\n props: { action, options },\n } = child;\n const { childWithId, grandChildren } = assignId(\n child,\n childPath,\n group,\n hasSeparator\n );\n list.push(childWithId);\n if (grandChildren) {\n collectChildren(grandChildren, childPath, menus, actions);\n } else {\n actions[childPath] = { action, options };\n }\n idx += 1;\n hasSeparator = false;\n }\n });\n return [menus, actions];\n };\n\n const assignId = (\n child: ReactElement,\n path: string,\n group: boolean,\n hasSeparator = false\n ) => {\n const {\n props: { children },\n } = child;\n return {\n childWithId: React.cloneElement(child, {\n hasSeparator,\n id: `${path}`,\n key: path,\n children: group ? undefined : children,\n }),\n grandChildren: group ? children : undefined,\n };\n };\n\n return collectChildren(childrenProp);\n }, [childrenProp]);\n\n const [menus, actions] = useMemo(\n () => normalizeChildren(),\n [normalizeChildren]\n );\n\n return [menus, actions] as [Menus, Actions];\n};\n", "import {\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { closestListItem, listItemIndex } from \"./list-dom-utils\";\nimport { MenuItemProps } from \"./MenuList\";\n// import {mousePosition} from './aim/utils';\n// import {aiming} from './aim/aim';\n\nconst nudge = (\n menus: RuntimeMenuDescriptor[],\n distance: number,\n pos: \"left\" | \"top\"\n) => {\n return menus.map((m, i) =>\n i === menus.length - 1\n ? {\n ...m,\n [pos]: m[pos] - distance,\n }\n : m\n );\n};\nconst nudgeLeft = (menus: RuntimeMenuDescriptor[], distance: number) =>\n nudge(menus, distance, \"left\");\nconst nudgeUp = (menus: RuntimeMenuDescriptor[], distance: number) =>\n nudge(menus, distance, \"top\");\n\nconst flipSides = (id: string, menus: RuntimeMenuDescriptor[]) => {\n const [parentMenu, menu] = menus.slice(-2);\n const el = document.getElementById(`${id}-${menu.id}`);\n if (el === null) {\n throw Error(`useCascade.flipSides element with id ${menu.id} not found`);\n }\n const { width } = el.getBoundingClientRect();\n return menus.map((m) =>\n m === menu\n ? {\n ...m,\n left: parentMenu.left - (width - 2),\n }\n : m\n );\n};\n\n// const closedNode = (el: HTMLElement) =>\n// el.ariaHasPopup === \"true\" && el.ariaExpanded !== \"true\";\nconst getPosition = (el: HTMLElement, openMenus: RuntimeMenuDescriptor[]) => {\n const [{ left, top: menuTop }] = openMenus.slice(-1);\n // const {top, right, bottom, left} = el.getBoundingClientRect();\n // this will not work for MenuList within window, we need the\n // const {offsetLeft: left, offsetTop: menuTop} = el.closest('.vuuMenuList');\n const { offsetWidth: width, offsetTop: top } = el;\n return { left: left + width, top: top + menuTop };\n};\n\nexport type RuntimeMenuDescriptor = {\n id: string;\n left: number;\n top: number;\n};\n\nexport const getItemId = (id: string) => {\n const pos = id.lastIndexOf(\"-\");\n return pos === -1 ? id : id.slice(pos + 1);\n};\n\nexport const getMenuId = (id: string) => {\n const itemId = getItemId(id);\n const pos = itemId.lastIndexOf(\".\");\n return pos > -1 ? itemId.slice(0, pos) : \"root\";\n};\n\nconst getMenuDepth = (id: string) => {\n let count = 0,\n pos = id.indexOf(\".\", 0);\n while (pos !== -1) {\n count += 1;\n pos = id.indexOf(\".\", pos + 1);\n }\n return count;\n};\n\nconst identifyItem = (el: HTMLElement) => ({\n menuId: getMenuId(el.id),\n itemId: getItemId(el.id),\n isGroup: el.ariaHasPopup === \"true\",\n isOpen: el.ariaExpanded === \"true\",\n level: getMenuDepth(el.id),\n});\n\nexport interface CascadeHookProps {\n id: string;\n onActivate: (menuId: string) => void;\n onMouseEnterItem: (evt: MouseEvent, itemId: string) => void;\n position: { x: number; y: number };\n}\n\nexport interface CascadeHooksResult {\n closeMenu: () => void;\n handleRender: () => void;\n listItemProps: Partial<MenuItemProps>;\n openMenu: (menuId?: string, itemId?: string) => void;\n openMenus: RuntimeMenuDescriptor[];\n}\n\ntype MenuStatus = \"no-popup\" | \"popup-open\" | \"pending-close\" | \"popup-pending\";\ntype MenuState = { [key: string]: MenuStatus };\n\nexport const useCascade = ({\n id,\n onActivate,\n onMouseEnterItem,\n position: { x: posX, y: posY },\n}: CascadeHookProps): CascadeHooksResult => {\n const [, forceRefresh] = useState({});\n const openMenus = useRef<RuntimeMenuDescriptor[]>([\n { id: \"root\", left: posX, top: posY },\n ]);\n\n const setOpenMenus = useCallback((menus: RuntimeMenuDescriptor[]) => {\n openMenus.current = menus;\n forceRefresh({});\n }, []);\n\n const menuOpenPendingTimeout = useRef<number | undefined>();\n const menuClosePendingTimeout = useRef<number | undefined>();\n const menuState = useRef<MenuState>({ root: \"no-popup\" });\n const prevLevel = useRef(0);\n\n // const prevAim = useRef({mousePos: null, distance: true});\n\n const openMenu = useCallback(\n (menuId = \"root\", itemId = null, listItemEl = null) => {\n if (menuId === \"root\" && itemId === null) {\n setOpenMenus([{ id: \"root\", left: posX, top: posY }]);\n } else {\n menuState.current[menuId] = \"popup-open\";\n const doc = listItemEl ? listItemEl.ownerDocument : document;\n const el = doc.getElementById(`${id}-${menuId}-${itemId}`);\n const { left, top } = getPosition(el, openMenus.current);\n setOpenMenus(openMenus.current.concat({ id: itemId, left, top }));\n }\n },\n [id, posX, posY, setOpenMenus]\n );\n\n const closeMenu = useCallback(\n (menuId?: string) => {\n if (menuId === \"root\") {\n setOpenMenus([]);\n } else {\n setOpenMenus(openMenus.current.slice(0, -1));\n }\n },\n [setOpenMenus]\n );\n\n const closeMenus = useCallback(\n (menuId, itemId) => {\n const menus = openMenus.current.slice();\n let { id: lastMenuId } = menus[menus.length - 1];\n while (menus.length > 1 && !itemId.startsWith(lastMenuId)) {\n const parentMenuId = getMenuId(lastMenuId);\n menus.pop();\n menuState.current[lastMenuId] = \"no-popup\";\n menuState.current[parentMenuId] = \"no-popup\";\n ({ id: lastMenuId } = menus[menus.length - 1]);\n }\n if (menus.length < openMenus.current.length) {\n setOpenMenus(menus);\n }\n },\n [setOpenMenus]\n );\n\n const scheduleOpen = useCallback(\n (menuId, itemId, listItemEl) => {\n if (menuOpenPendingTimeout.current) {\n clearTimeout(menuOpenPendingTimeout.current);\n }\n menuOpenPendingTimeout.current = window.setTimeout(() => {\n console.log(`scheduleOpen timed out opening ${itemId}`);\n closeMenus(menuId, itemId);\n menuState.current[menuId] = \"popup-open\";\n menuState.current[itemId] = \"no-popup\";\n openMenu(menuId, itemId, listItemEl);\n }, 400);\n },\n [closeMenus, openMenu]\n );\n\n const scheduleClose = useCallback(\n (openMenuId, menuId, itemId) => {\n console.log(\n `scheduleClose openMenuId ${openMenuId} menuId ${menuId} itemId ${itemId}`\n );\n menuState.current[openMenuId] = \"pending-close\";\n menuClosePendingTimeout.current = window.setTimeout(() => {\n closeMenus(menuId, itemId);\n }, 400);\n },\n [closeMenus]\n );\n\n const handleRender = useCallback(() => {\n const { current: menus } = openMenus;\n const [menu] = menus.slice(-1);\n const el = document.getElementById(`${id}-${menu.id}`);\n if (el) {\n const { right, bottom } = el.getBoundingClientRect();\n const { clientHeight, clientWidth } = document.body;\n if (right > clientWidth) {\n const newMenus =\n menus.length > 1\n ? flipSides(id, menus)\n : nudgeLeft(menus, right - clientWidth);\n setOpenMenus(newMenus);\n } else if (bottom > clientHeight) {\n const newMenus = nudgeUp(menus, bottom - clientHeight);\n setOpenMenus(newMenus);\n }\n }\n }, [id, setOpenMenus]);\n\n const listItemProps: Partial<MenuItemProps> = useMemo(\n () => ({\n onMouseEnter: (evt: MouseEvent) => {\n const listItemEl = closestListItem(evt.target as HTMLElement);\n const { menuId, itemId, isGroup, isOpen, level } =\n identifyItem(listItemEl);\n const sameLevel = prevLevel.current === level;\n const {\n current: { [menuId]: state },\n } = menuState;\n prevLevel.current = level;\n\n // console.log(\n // `%conMouseEnter #${menuId}[${itemId}] @${level}\n // isGroup ${isGroup} isOpen ${isOpen}\n // openMenus [${openMenus.current.join(',')}]\n // state='${JSON.stringify(menuState.current)}`,\n // 'color: green; font-weight: bold;'\n // );\n\n if (state === \"no-popup\" && isGroup) {\n // Shouldn;t we always set this ?\n menuState.current[menuId] = \"popup-pending\";\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (state === \"popup-pending\" && !isGroup) {\n menuState.current[menuId] = \"no-popup\";\n clearTimeout(menuOpenPendingTimeout.current);\n menuOpenPendingTimeout.current = undefined;\n } else if (state === \"popup-pending\" && isGroup) {\n clearTimeout(menuOpenPendingTimeout.current);\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (state === \"popup-open\") {\n const [{ id: parentMenuId }, { id: openMenuId }] =\n openMenus.current.slice(-2);\n if (\n parentMenuId === menuId &&\n menuState.current[openMenuId] !== \"pending-close\" &&\n sameLevel\n ) {\n scheduleClose(openMenuId, menuId, itemId);\n if (isGroup && !isOpen) {\n scheduleOpen(menuId, itemId, listItemEl);\n }\n } else if (\n parentMenuId === menuId &&\n isGroup &&\n itemId !== openMenuId &&\n menuState.current[openMenuId] === \"pending-close\"\n ) {\n // if there is already an item queued for opening cancel it\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (isGroup) {\n closeMenus(menuId, itemId);\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (\n !(menuState.current[openMenuId] === \"pending-close\" && sameLevel)\n ) {\n closeMenus(menuId, itemId);\n }\n }\n\n if (state === \"pending-close\") {\n if (menuOpenPendingTimeout.current) {\n clearTimeout(menuOpenPendingTimeout.current);\n menuOpenPendingTimeout.current = undefined;\n }\n clearTimeout(menuClosePendingTimeout.current);\n menuClosePendingTimeout.current = undefined;\n menuState.current[menuId] = \"popup-open\";\n }\n\n onMouseEnterItem(evt, itemId);\n },\n\n onClick: (evt: SyntheticEvent) => {\n const targetElement = evt.target as HTMLElement;\n const listItemEl = closestListItem(targetElement);\n const idx = listItemIndex(listItemEl);\n console.log(\n `list item click [${idx}] hasPopup ${listItemEl.ariaHasPopup}`\n );\n if (listItemEl.ariaHasPopup === \"true\") {\n if (listItemEl.ariaExpanded !== \"true\") {\n openMenu(idx);\n } else {\n // do nothing\n }\n } else {\n onActivate(getItemId(listItemEl.id));\n }\n },\n }),\n [\n closeMenus,\n onActivate,\n\n onMouseEnterItem,\n openMenu,\n scheduleClose,\n scheduleOpen,\n ]\n );\n\n return {\n closeMenu,\n handleRender,\n listItemProps,\n openMenu,\n openMenus: openMenus.current,\n };\n};\n", "// const listItemElement = (listEl: HTMLElement, listItemIdx: number) =>\n// listEl.querySelector(`:scope > [data-idx=\"${listItemIdx}\"]`);\n\nexport function listItemIndex(listItemEl: HTMLElement) {\n if (listItemEl) {\n const idx = listItemEl.dataset.idx;\n if (idx) {\n return parseInt(idx, 10);\n // eslint-disable-next-line no-cond-assign\n } else if (listItemEl.ariaPosInSet) {\n return parseInt(listItemEl.ariaPosInSet, 10) - 1;\n }\n }\n}\n\nconst listItemId = (el: HTMLElement | null | undefined) => el?.id;\n\nexport const closestListItem = (el: HTMLElement | null | undefined) =>\n el?.closest(\"[data-idx],[aria-posinset]\") as HTMLElement;\n\nexport const closestListItemId = (el: HTMLElement) =>\n listItemId(closestListItem(el));\n\nexport const closestListItemIndex = (el: HTMLElement) =>\n listItemIndex(closestListItem(el));\n", "import { useEffect } from \"react\";\n\nexport interface ClickAwayHookProps {\n containerClassName: string;\n isOpen: boolean;\n onClose?: (target: string) => void;\n}\n\nexport const useClickAway = ({\n containerClassName,\n isOpen,\n onClose,\n}: ClickAwayHookProps) => {\n useEffect(() => {\n let clickHandler: (evt: MouseEvent) => void;\n if (isOpen) {\n clickHandler = (evt) => {\n const target = evt.target as HTMLElement;\n const container = target.closest(`.${containerClassName}`);\n if (container === null) {\n onClose?.(\"root\");\n }\n };\n\n document.body.addEventListener(\"click\", clickHandler, true);\n }\n\n return () => {\n if (clickHandler) {\n document.body.removeEventListener(\"click\", clickHandler, true);\n }\n };\n }, [containerClassName, isOpen, onClose]);\n};\n", "import { createContext, ReactNode, useCallback, useMemo } from \"react\";\n\nexport type MenuActionHandler = (\n type: string,\n options: unknown\n) => boolean | undefined;\nexport type MenuBuilder<L = string, O = unknown> = (\n location: L,\n options: O\n) => ContextMenuItemDescriptor[];\n\nexport interface ContextMenuContext {\n menuBuilders: MenuBuilder[];\n menuActionHandler: MenuActionHandler;\n}\n\nexport const ContextMenuContext = createContext<ContextMenuContext | null>(\n null\n);\n\nexport interface ContextMenuItemBase {\n icon?: string;\n label: string;\n location?: string;\n}\n\nexport interface ContextMenuLeafItemDescriptor extends ContextMenuItemBase {\n action: string;\n options?: unknown;\n}\n\nexport interface ContextMenuGroupItemDescriptor extends ContextMenuItemBase {\n children: ContextMenuItemDescriptor[];\n}\n\nexport type ContextMenuItemDescriptor =\n | ContextMenuLeafItemDescriptor\n | ContextMenuGroupItemDescriptor;\n\nexport const isGroupMenuItemDescriptor = (\n menuItem?: ContextMenuItemDescriptor\n): menuItem is ContextMenuGroupItemDescriptor =>\n menuItem !== undefined && \"children\" in menuItem;\n\nexport interface ContextMenuProviderProps {\n children: ReactNode;\n label?: string;\n menuActionHandler?: MenuActionHandler;\n menuBuilder: MenuBuilder;\n}\n\ninterface ProviderProps extends ContextMenuProviderProps {\n context: ContextMenuContext | null;\n}\n\nconst Provider = ({\n children,\n context,\n menuActionHandler,\n menuBuilder,\n}: ProviderProps) => {\n const menuBuilders = useMemo(() => {\n if (context?.menuBuilders && menuBuilder) {\n return context.menuBuilders.concat(menuBuilder);\n } else if (menuBuilder) {\n return [menuBuilder];\n } else {\n return context?.menuBuilders || [];\n }\n }, [context, menuBuilder]);\n\n const handleMenuAction = useCallback(\n (type, options) => {\n if (menuActionHandler?.(type, options)) {\n return true;\n }\n\n if (context?.menuActionHandler?.(type, options)) {\n return true;\n }\n },\n [context, menuActionHandler]\n );\n\n return (\n <ContextMenuContext.Provider\n value={{\n menuActionHandler: handleMenuAction,\n menuBuilders,\n }}\n >\n {children}\n </ContextMenuContext.Provider>\n );\n};\n\n// Need an option for local menu to override higher-level menu, rather than extend\nexport const ContextMenuProvider = ({\n children,\n label,\n menuActionHandler,\n menuBuilder,\n}: ContextMenuProviderProps) => {\n return (\n <ContextMenuContext.Consumer>\n {(parentContext) => (\n <Provider\n context={parentContext}\n label={label}\n menuActionHandler={menuActionHandler}\n menuBuilder={menuBuilder}\n >\n {children}\n </Provider>\n )}\n </ContextMenuContext.Consumer>\n );\n};\n", "// The menuBuilder will always be supplied by the code that will display the local\n// context menu. It will be passed all configured menu descriptors. It is free to\n\nimport { MouseEvent, useCallback, useContext } from \"react\";\nimport { PopupService } from \"../popup\";\nimport {\n ContextMenuContext,\n ContextMenuItemDescriptor,\n isGroupMenuItemDescriptor,\n MenuActionHandler,\n MenuBuilder,\n} from \"./context-menu-provider\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { MenuItem, MenuItemGroup } from \"./MenuList\";\n\n// The argument allows a top-level menuBuilder to operate outside the Contect\nexport const useContextMenu = (menuBuilder?: MenuBuilder) => {\n const ctx = useContext(ContextMenuContext);\n\n const buildMenuOptions = useCallback(\n (menuBuilders: MenuBuilder[], location, options) => {\n let results: ContextMenuItemDescriptor[] = [];\n for (const menuBuilder of menuBuilders) {\n // Maybe we should leave the concatenation to the menuBuilder, then it can control menuItem order\n results = results.concat(menuBuilder(location, options));\n }\n return results;\n },\n []\n );\n\n const handleShowContextMenu = useCallback(\n (e: MouseEvent<HTMLElement>, location: string, options: unknown) => {\n e.stopPropagation();\n e.preventDefault();\n const menuBuilders =\n ctx?.menuBuilders ?? (menuBuilder ? [menuBuilder] : undefined);\n if (Array.isArray(menuBuilders) && menuBuilders.length > 0) {\n const menuItemDescriptors = buildMenuOptions(\n menuBuilders,\n location,\n options\n );\n console.log({\n menuItemDescriptors,\n });\n if (menuItemDescriptors.length && ctx?.menuActionHandler) {\n console.log(`showContextMenu ${location}`, {\n options,\n });\n showContextMenu(e, menuItemDescriptors, ctx.menuActionHandler);\n }\n } else {\n console.warn(\n \"useContextMenu, no menuBuilders configured. These should be supplied via the ContextMenuProvider(s)\"\n );\n }\n },\n [buildMenuOptions, ctx?.menuActionHandler, ctx?.menuBuilders, menuBuilder]\n );\n\n return handleShowContextMenu;\n};\n\nconst showContextMenu = (\n e: MouseEvent<HTMLElement>,\n menuDescriptors: ContextMenuItemDescriptor[],\n handleContextMenuAction: MenuActionHandler\n) => {\n const { clientX: left, clientY: top } = e;\n const menuItems = (menuDescriptors: ContextMenuItemDescriptor[]) => {\n const fromDescriptor = (menuItem: ContextMenuItemDescriptor, i: number) =>\n isGroupMenuItemDescriptor(menuItem) ? (\n <MenuItemGroup key={i} label={menuItem.label}>\n {menuItem.children.map(fromDescriptor)}\n </MenuItemGroup>\n ) : (\n <MenuItem\n key={i}\n action={menuItem.action}\n data-icon={menuItem.icon}\n options={menuItem.options}\n >\n {menuItem.label}\n </MenuItem>\n );\n\n return menuDescriptors.map(fromDescriptor);\n };\n\n const handleClose = (menuId?: string, options?: unknown) => {\n if (menuId) {\n handleContextMenuAction(menuId, options);\n PopupService.hidePopup();\n }\n };\n\n const component = (\n <ContextMenu onClose={handleClose} position={{ x: left, y: top }}>\n {menuItems(menuDescriptors)}\n </ContextMenu>\n );\n PopupService.showPopup({ left: 0, top: 0, component });\n};\n", "import cx from \"classnames\";\nimport React, {\n createElement,\n CSSProperties,\n HTMLAttributes,\n ReactElement,\n useEffect,\n useRef,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { renderPortal } from \"../portal\";\n\nimport \"./popup-service.css\";\n\nlet _dialogOpen = false;\nconst _popups: string[] = [];\n\nfunction specialKeyHandler(e: KeyboardEvent) {\n if (e.key === \"Esc\") {\n if (_popups.length) {\n closeAllPopups();\n } else if (_dialogOpen) {\n const dialogRoot = document.body.querySelector(\".vuuDialog\");\n if (dialogRoot) {\n ReactDOM.unmountComponentAtNode(dialogRoot);\n }\n }\n }\n}\n\nfunction outsideClickHandler(e: MouseEvent) {\n if (_popups.length) {\n // onsole.log(`Popup.outsideClickHandler`);\n const popupContainers = document.body.querySelectorAll(\".vuuPopup\");\n for (let i = 0; i < popupContainers.length; i++) {\n if (popupContainers[i].contains(e.target as HTMLElement)) {\n return;\n }\n }\n closeAllPopups();\n }\n}\n\nfunction closeAllPopups() {\n if (_popups.length) {\n // onsole.log(`closeAllPopups`);\n const popupContainers = document.body.querySelectorAll(\".vuuPopup\");\n for (let i = 0; i < popupContainers.length; i++) {\n ReactDOM.unmountComponentAtNode(popupContainers[i]);\n }\n popupClosed(\"*\");\n }\n}\n\nfunction dialogOpened() {\n if (_dialogOpen === false) {\n _dialogOpen = true;\n window.addEventListener(\"keydown\", specialKeyHandler, true);\n }\n}\n\nfunction dialogClosed() {\n if (_dialogOpen) {\n _dialogOpen = false;\n window.removeEventListener(\"keydown\", specialKeyHandler, true);\n }\n}\n\nfunction popupOpened(name: string) {\n if (_popups.indexOf(name) === -1) {\n _popups.push(name);\n //onsole.log('PopupService, popup opened ' + name + ' popups : ' + _popups);\n if (_dialogOpen === false) {\n window.addEventListener(\"keydown\", specialKeyHandler, true);\n window.addEventListener(\"click\", outsideClickHandler, true);\n }\n }\n}\n\nfunction popupClosed(name: string /*, group=null*/) {\n if (_popups.length) {\n if (name === \"*\") {\n _popups.length = 0;\n } else {\n const pos = _popups.indexOf(name);\n if (pos !== -1) {\n _popups.splice(pos, 1);\n }\n }\n //onsole.log('PopupService, popup closed ' + name + ' popups : ' + _popups);\n if (_popups.length === 0 && _dialogOpen === false) {\n window.removeEventListener(\"keydown\", specialKeyHandler, true);\n window.removeEventListener(\"click\", outsideClickHandler, true);\n }\n }\n}\n\nconst PopupComponent = ({\n children,\n position,\n style,\n}: HTMLAttributes<HTMLDivElement> & {\n position?: \"above\" | \"below\" | \"\";\n style?: CSSProperties;\n}) => {\n const className = cx(\"hwPopup\", \"hwPopupContainer\", position);\n return createElement(\"div\", { className, style }, children);\n};\n\nlet incrementingKey = 1;\n\nexport class PopupService {\n static showPopup({\n name = \"anon\",\n group = \"all\",\n position = \"\",\n left = 0,\n right = \"auto\",\n top = 0,\n width = \"auto\",\n component,\n }: {\n depth?: number;\n name?: string;\n group?: string;\n position?: \"above\" | \"below\" | \"\";\n left?: number;\n right?: \"auto\" | number;\n top?: number;\n component: ReactElement;\n width?: number | \"auto\";\n }) {\n if (!component) {\n throw Error(`PopupService showPopup, no component supplied`);\n }\n popupOpened(name);\n let el = document.body.querySelector(\".vuuPopup.\" + group) as HTMLElement;\n if (el === null) {\n el = document.createElement(\"div\") as HTMLElement;\n el.className = \"vuuPopup \" + group;\n document.body.appendChild(el);\n }\n\n const style = { width };\n\n renderPortal(\n createElement(\n PopupComponent,\n { key: incrementingKey++, position, style },\n component\n ),\n el,\n left,\n top,\n () => {\n PopupService.keepWithinThePage(el, right);\n }\n );\n }\n\n static hidePopup(name = \"anon\", group = \"all\") {\n //onsole.log('PopupService.hidePopup name=' + name + ', group=' + group)\n\n if (_popups.indexOf(name) !== -1) {\n popupClosed(name);\n const popupRoot = document.body.querySelector(`.vuuPopup.${group}`);\n if (popupRoot) {\n ReactDOM.unmountComponentAtNode(popupRoot);\n }\n }\n }\n\n static keepWithinThePage(el: HTMLElement, right: number | \"auto\" = \"auto\") {\n const target = el.querySelector(\".vuuPopupContainer > *\") as HTMLElement;\n if (target) {\n const {\n top,\n left,\n width,\n height,\n right: currentRight,\n } = target.getBoundingClientRect();\n\n const w = window.innerWidth;\n const h = window.innerHeight;\n\n const overflowH = h - (top + height);\n if (overflowH < 0) {\n target.style.top = Math.round(top) + overflowH + \"px\";\n }\n\n const overflowW = w - (left + width);\n if (overflowW < 0) {\n target.style.left = Math.round(left) + overflowW + \"px\";\n }\n\n if (typeof right === \"number\" && right !== currentRight) {\n const adjustment = right - currentRight;\n target.style.left = left + adjustment + \"px\";\n }\n }\n }\n}\n\nexport class DialogService {\n static showDialog(dialog: ReactElement) {\n const containerEl = \".vuuDialog\";\n const onClose = dialog.props.onClose;\n\n dialogOpened();\n\n ReactDOM.render(\n React.cloneElement(dialog, {\n container: containerEl,\n onClose: () => {\n DialogService.closeDialog();\n if (onClose) {\n onClose();\n }\n },\n }),\n document.body.querySelector(containerEl)\n );\n }\n\n static closeDialog() {\n dialogClosed();\n const dialogRoot = document.body.querySelector(\".vuuDialog\");\n if (dialogRoot) {\n ReactDOM.unmountComponentAtNode(dialogRoot);\n }\n }\n}\n\nexport interface PopupProps {\n children: ReactElement;\n close?: boolean;\n depth: number;\n group?: string;\n name: string;\n position?: \"above\" | \"below\" | \"\";\n width: number;\n}\n\nexport const Popup = (props: PopupProps) => {\n const pendingTask = useRef<number | undefined>();\n const ref = useRef<HTMLElement>(null);\n\n const show = (props: PopupProps, boundingClientRect: DOMRect) => {\n const { name, group, depth, width } = props;\n let left: number | undefined;\n let top: number | undefined;\n\n if (pendingTask.current) {\n window.clearTimeout(pendingTask.current);\n pendingTask.current = undefined;\n }\n\n if (props.close === true) {\n PopupService.hidePopup(name, group);\n } else {\n const { position, children: component } = props;\n const {\n left: targetLeft,\n top: targetTop,\n width: clientWidth,\n bottom: targetBottom,\n } = boundingClientRect;\n\n if (position === \"below\") {\n left = targetLeft;\n top = targetBottom;\n } else if (position === \"above\") {\n left = targetLeft;\n top = targetTop;\n }\n\n pendingTask.current = window.setTimeout(() => {\n PopupService.showPopup({\n name,\n group,\n depth,\n position,\n left,\n top,\n width: width || clientWidth,\n component,\n });\n }, 10);\n }\n };\n\n useEffect(() => {\n if (ref.current) {\n const el = ref.current.parentElement;\n const boundingClientRect = el?.getBoundingClientRect();\n if (boundingClientRect) {\n show(props, boundingClientRect);\n }\n }\n\n return () => {\n PopupService.hidePopup(props.name, props.group);\n };\n }, [props]);\n\n return React.createElement(\"div\", { className: \"popup-proxy\", ref });\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["import_core", "import_react", "ReactDOM", "Portal", "import_jsx_runtime", "cx", "import_core", "import_react", "import_react", "import_classnames", "import_core", "import_react", "import_react", "menus", "actions", "React", "import_jsx_runtime", "classBase", "isRoot", "useId", "React", "cx", "children", "className", "props", "import_react", "import_react", "import_jsx_runtime", "import_react", "useId", "id", "import_react", "import_jsx_runtime", "import_react", "import_classnames", "import_react", "ReactDOM", "cx", "React", "props", "import_jsx_runtime", "menuBuilder", "menuDescriptors"]
7
7
  }
package/esm/index.js CHANGED
@@ -1215,13 +1215,13 @@ var Popup = (props) => {
1215
1215
 
1216
1216
  // src/menu/useContextMenu.tsx
1217
1217
  import { jsx as jsx6 } from "react/jsx-runtime";
1218
- var useContextMenu = () => {
1218
+ var useContextMenu = (menuBuilder) => {
1219
1219
  const ctx = useContext(ContextMenuContext);
1220
1220
  const buildMenuOptions = useCallback7(
1221
1221
  (menuBuilders, location, options) => {
1222
1222
  let results = [];
1223
- for (const menuBuilder of menuBuilders) {
1224
- results = results.concat(menuBuilder(location, options));
1223
+ for (const menuBuilder2 of menuBuilders) {
1224
+ results = results.concat(menuBuilder2(location, options));
1225
1225
  }
1226
1226
  return results;
1227
1227
  },
@@ -1232,23 +1232,29 @@ var useContextMenu = () => {
1232
1232
  var _a;
1233
1233
  e.stopPropagation();
1234
1234
  e.preventDefault();
1235
- const menuBuilders = (_a = ctx == null ? void 0 : ctx.menuBuilders) != null ? _a : [];
1236
- const menuItemDescriptors = buildMenuOptions(
1237
- menuBuilders,
1238
- location,
1239
- options
1240
- );
1241
- console.log({
1242
- menuItemDescriptors
1243
- });
1244
- if (menuItemDescriptors.length && (ctx == null ? void 0 : ctx.menuActionHandler)) {
1245
- console.log(`showContextMenu ${location}`, {
1235
+ const menuBuilders = (_a = ctx == null ? void 0 : ctx.menuBuilders) != null ? _a : menuBuilder ? [menuBuilder] : void 0;
1236
+ if (Array.isArray(menuBuilders) && menuBuilders.length > 0) {
1237
+ const menuItemDescriptors = buildMenuOptions(
1238
+ menuBuilders,
1239
+ location,
1246
1240
  options
1241
+ );
1242
+ console.log({
1243
+ menuItemDescriptors
1247
1244
  });
1248
- showContextMenu(e, menuItemDescriptors, ctx.menuActionHandler);
1245
+ if (menuItemDescriptors.length && (ctx == null ? void 0 : ctx.menuActionHandler)) {
1246
+ console.log(`showContextMenu ${location}`, {
1247
+ options
1248
+ });
1249
+ showContextMenu(e, menuItemDescriptors, ctx.menuActionHandler);
1250
+ }
1251
+ } else {
1252
+ console.warn(
1253
+ "useContextMenu, no menuBuilders configured. These should be supplied via the ContextMenuProvider(s)"
1254
+ );
1249
1255
  }
1250
1256
  },
1251
- [buildMenuOptions, ctx]
1257
+ [buildMenuOptions, ctx == null ? void 0 : ctx.menuActionHandler, ctx == null ? void 0 : ctx.menuBuilders, menuBuilder]
1252
1258
  );
1253
1259
  return handleShowContextMenu;
1254
1260
  };
package/esm/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/vuu-popups/src/dialog/Dialog.tsx", "../../../packages/vuu-popups/src/portal/Portal.tsx", "../../../packages/vuu-popups/src/portal/render-portal.tsx", "../../../packages/vuu-popups/src/portal/portal-utils.ts", "../../../packages/vuu-popups/src/menu/ContextMenu.tsx", "../../../packages/vuu-popups/src/menu/MenuList.tsx", "../../../packages/vuu-popups/src/menu/use-keyboard-navigation.ts", "../../../packages/vuu-popups/src/menu/utils.ts", "../../../packages/vuu-popups/src/menu/key-code.ts", "../../../packages/vuu-popups/src/menu/use-items-with-ids.ts", "../../../packages/vuu-popups/src/menu/use-cascade.ts", "../../../packages/vuu-popups/src/menu/list-dom-utils.ts", "../../../packages/vuu-popups/src/menu/use-click-away.ts", "../../../packages/vuu-popups/src/menu/context-menu-provider.tsx", "../../../packages/vuu-popups/src/menu/useContextMenu.tsx", "../../../packages/vuu-popups/src/popup/popup-service.ts"],
4
- "sourcesContent": ["import { Scrim, Toolbar, ToolbarButton } from \"@heswell/salt-lab\";\nimport { Text } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { HTMLAttributes, useCallback, useRef, useState } from \"react\";\nimport { Portal } from \"../portal\";\n\nimport \"./Dialog.css\";\n\nconst classBase = \"vuuDialog\";\n\nexport interface DialogProps extends HTMLAttributes<HTMLDivElement> {\n isOpen?: boolean;\n onClose?: () => void;\n}\n\nexport const Dialog = ({\n children,\n className,\n isOpen = false,\n onClose,\n title,\n ...props\n}: DialogProps) => {\n const root = useRef<HTMLDivElement>(null);\n const [posX] = useState(0);\n const [posY] = useState(0);\n\n const close = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n const handleRender = useCallback(() => {\n // if (center && isOpen && root.current) {\n // const { width, height } = root.current.getBoundingClientRect();\n // const { innerWidth, innerHeight } = window;\n // const x = innerWidth / 2 - width / 2;\n // const y = innerHeight / 2 - height / 2;\n // setPosX(x);\n // setPosY(y);\n // }\n }, []);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <Portal onRender={handleRender} x={posX} y={posY}>\n <Scrim className={`${classBase}-scrim`} open={isOpen}>\n <div {...props} className={cx(classBase, className)} ref={root}>\n <Toolbar className={`${classBase}-header`}>\n <Text>{title}</Text>\n <ToolbarButton\n key=\"close\"\n onClick={close}\n data-align-end\n data-icon=\"close\"\n />\n </Toolbar>\n {children}\n </div>\n </Scrim>\n </Portal>\n );\n};\n", "import { ReactElement, useLayoutEffect, useMemo } from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { createContainer, renderPortal } from \"./render-portal\";\n\nexport interface PortalProps {\n children: ReactElement;\n onRender?: () => void;\n x?: number;\n y?: number;\n}\n\nexport const Portal = function Portal({\n children,\n x = 0,\n y = 0,\n onRender,\n}: PortalProps) {\n // Do we need to accept container here as a prop ?\n const renderContainer = useMemo(() => {\n return createContainer();\n }, []);\n\n useLayoutEffect(() => {\n renderPortal(children, renderContainer, x, y, onRender);\n }, [children, onRender, renderContainer, x, y]);\n\n useLayoutEffect(() => {\n return () => {\n if (renderContainer) {\n ReactDOM.unmountComponentAtNode(renderContainer);\n if (renderContainer.classList.contains(\"vuuPopup\")) {\n renderContainer.parentElement?.removeChild(renderContainer);\n }\n }\n };\n }, [renderContainer]);\n\n // useLayoutEffect(() => {\n // renderContainer.current = renderPortal(children, x, y, container)\n // return () => {\n // if (renderContainer.current){\n // console.log('EXPLICIT UNMOUNT')\n // ReactDOM.unmountComponentAtNode(renderContainer.current);\n // if (renderContainer.current.classList.contains('hwReactPopup')){\n // renderContainer.current.parentElement.removeChild(renderContainer.current);\n // renderContainer.current = null;\n // }\n // }\n // }\n // },[])\n return null;\n};\n", "import * as ReactDOM from \"react-dom\";\nimport { SaltProvider } from \"@salt-ds/core\";\nimport { ReactElement } from \"react\";\n\nlet containerId = 1;\n\nconst getPortalContainer = (x = 0, y = 0, win = window) => {\n const el = win.document.createElement(\"div\");\n el.className = \"vuuPopup \" + containerId++;\n el.style.cssText = `left:${x}px; top:${y}px;`;\n win.document.body.appendChild(el);\n return el;\n};\n\nconst createDOMContainer = (x?: number, y?: number) => getPortalContainer(x, y);\n\nexport const renderPortal = (\n component: ReactElement,\n container: HTMLElement,\n x: number,\n y: number,\n onRender?: () => void\n) => {\n // check this first to see if position has changed\n container.style.cssText = `left:${x}px; top:${y}px;position: absolute;`;\n\n ReactDOM.render(\n <SaltProvider applyClassesTo=\"child\">{component}</SaltProvider>,\n container,\n onRender\n );\n};\n\nexport const createContainer = createDOMContainer;\n", "export const installTheme = (themeId: string) => {\n const installedThemes = getComputedStyle(document.body).getPropertyValue(\n \"--installed-themes\"\n );\n document.body.style.setProperty(\n \"--installed-themes\",\n `${installedThemes} ${themeId}`\n );\n};\n", "import { useIdMemo as useId } from \"@salt-ds/core\";\nimport { useCallback, useRef } from \"react\";\nimport { Portal } from \"../portal\";\nimport MenuList, { MenuListProps } from \"./MenuList\";\nimport { getItemId, getMenuId, useCascade } from \"./use-cascade\";\nimport { useClickAway } from \"./use-click-away\";\nimport { useItemsWithIds } from \"./use-items-with-ids\";\n\nexport interface ContextMenuProps extends Omit<MenuListProps, \"onCloseMenu\"> {\n onClose?: (menuId?: string, options?: unknown) => void;\n position?: { x: number; y: number };\n withPortal?: boolean;\n}\n\nconst noop = () => undefined;\n\nexport const ContextMenu = ({\n activatedByKeyboard,\n children: childrenProp,\n className,\n id: idProp,\n onClose = () => undefined,\n position = { x: 0, y: 0 },\n style,\n ...menuListProps\n}: ContextMenuProps) => {\n const id = useId(idProp);\n const closeMenuRef = useRef<(location?: string) => void>(noop);\n const [menus, actions] = useItemsWithIds(childrenProp);\n const navigatingWithKeyboard = useRef(activatedByKeyboard);\n const handleMouseEnterItem = useCallback(() => {\n navigatingWithKeyboard.current = false;\n }, []);\n\n const handleActivate = useCallback(\n (menuId: string) => {\n const { action, options } = actions[menuId];\n closeMenuRef.current(\"root\");\n onClose(action, options);\n },\n [actions, onClose]\n );\n\n const { closeMenu, listItemProps, openMenu, openMenus, handleRender } =\n useCascade({\n id,\n onActivate: handleActivate,\n onMouseEnterItem: handleMouseEnterItem,\n position,\n });\n closeMenuRef.current = closeMenu;\n\n console.log({ openMenus });\n\n const handleClose = useCallback(() => {\n closeMenu();\n onClose();\n }, [closeMenu, onClose]);\n\n useClickAway({\n containerClassName: \"vuuMenuList\",\n onClose: handleClose,\n isOpen: openMenus.length > 0,\n });\n\n const handleOpenMenu = (id: string) => {\n const itemId = getItemId(id);\n const menuId = getMenuId(itemId);\n navigatingWithKeyboard.current = true;\n openMenu(menuId, itemId);\n };\n const handleCloseMenu = () => {\n navigatingWithKeyboard.current = true;\n closeMenu();\n };\n\n const handleHighlightMenuItem = () => {\n // console.log(`highlight ${idx}`);\n };\n\n const lastMenu = openMenus.length - 1;\n\n const getChildMenuIndex = (i: number) => {\n if (i >= lastMenu) {\n return -1;\n } else {\n const { id: menuId } = openMenus[i + 1];\n const pos = menuId.lastIndexOf(\".\");\n const idx =\n pos === -1 ? parseInt(menuId, 10) : parseInt(menuId.slice(-pos), 10);\n return idx;\n }\n };\n\n return (\n <>\n {openMenus.map(({ id: menuId, left, top }, i) => {\n const childMenuIndex = getChildMenuIndex(i);\n\n return (\n <Portal key={i} x={left} y={top} onRender={handleRender}>\n <MenuList\n {...menuListProps}\n activatedByKeyboard={navigatingWithKeyboard.current}\n childMenuShowing={childMenuIndex}\n className={className}\n id={id}\n menuId={menuId}\n isRoot={i === 0}\n key={i}\n listItemProps={listItemProps}\n onActivate={handleActivate}\n onHighlightMenuItem={handleHighlightMenuItem}\n onCloseMenu={handleCloseMenu}\n onOpenMenu={handleOpenMenu}\n style={style}\n >\n {menus[menuId]}\n </MenuList>\n </Portal>\n );\n })}\n </>\n );\n};\n\nContextMenu.displayName = \"ContextMenu\";\n", "import React, {\n FC,\n HTMLAttributes,\n ReactElement,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport cx from \"classnames\";\nimport { useIdMemo as useId } from \"@salt-ds/core\";\nimport { useKeyboardNavigation } from \"./use-keyboard-navigation\";\nimport { isMenuItemGroup } from \"./use-items-with-ids\";\n\nimport \"./MenuList.css\";\n\nconst classBase = \"vuuMenuList\";\n\nexport const Separator = () => <li className=\"vuuMenuItem-divider\" />;\n\nexport interface MenuItemGroupProps {\n children: ReactElement<MenuItemProps>[];\n label: string;\n}\n\nexport interface MenuItemProps extends HTMLAttributes<HTMLDivElement> {\n action?: string;\n idx?: number;\n options?: unknown;\n}\n\n// Purely used as markers, props will be extracted\nexport const MenuItemGroup: FC<MenuItemGroupProps> = () => null;\n// eslint-disable-next-line no-unused-vars\nexport const MenuItem = ({ children, idx, ...props }: MenuItemProps) => {\n return <div {...props}>{children}</div>;\n};\n\nconst hasIcon = (child: ReactElement) => child.props[\"data-icon\"];\n\nexport interface MenuListProps extends HTMLAttributes<HTMLDivElement> {\n activatedByKeyboard?: boolean;\n children: ReactElement[];\n childMenuShowing?: number;\n highlightedIdx?: number;\n isRoot?: boolean;\n listItemProps?: Partial<MenuItemProps>;\n menuId?: string;\n onActivate?: (menuId: string) => void;\n onCloseMenu: (idx: number) => void;\n onOpenMenu?: (menuId: string) => void;\n onHighlightMenuItem?: (idx: number) => void;\n}\n\nconst MenuList = ({\n activatedByKeyboard,\n childMenuShowing = -1,\n children,\n className,\n highlightedIdx: highlightedIdxProp,\n id: idProp,\n isRoot,\n listItemProps,\n menuId,\n onHighlightMenuItem,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n ...props\n}: MenuListProps) => {\n const id = useId(idProp);\n const root = useRef<HTMLDivElement>(null);\n\n // The id generation be,ongs in useIttemsWithIds\n const mapIdxToId = useMemo(() => new Map(), []);\n\n const handleOpenMenu = (idx: number) => {\n const el = root.current?.querySelector(`:scope > [data-idx='${idx}']`);\n el?.id && onOpenMenu?.(el.id);\n };\n\n const handleActivate = (idx: number) => {\n const el = root.current?.querySelector(`:scope > [data-idx='${idx}']`);\n el?.id && onActivate?.(el.id);\n };\n\n const { focusVisible, highlightedIndex, listProps } = useKeyboardNavigation({\n count: React.Children.count(children),\n highlightedIndex: highlightedIdxProp,\n onActivate: handleActivate,\n onHighlight: onHighlightMenuItem,\n onOpenMenu: handleOpenMenu,\n onCloseMenu,\n });\n\n const appliedFocusVisible = childMenuShowing == -1 ? focusVisible : -1;\n\n useLayoutEffect(() => {\n if (childMenuShowing === -1 && activatedByKeyboard) {\n root.current?.focus();\n }\n }, [activatedByKeyboard, childMenuShowing]);\n\n const getActiveDescendant = () =>\n highlightedIndex === undefined || highlightedIndex === -1\n ? undefined\n : mapIdxToId.get(highlightedIndex);\n\n return (\n <div\n {...props}\n {...listProps}\n aria-activedescendant={getActiveDescendant()}\n className={cx(classBase, className, {\n [`${classBase}-childMenuShowing`]: childMenuShowing !== -1,\n })}\n data-root={isRoot || undefined}\n id={`${id}-${menuId}`}\n ref={root}\n role=\"menu\"\n tabIndex={0}\n >\n {renderContent()}\n </div>\n );\n\n function renderContent() {\n const propsCommonToAllListItems = {\n ...listItemProps,\n role: \"menuitem\",\n };\n\n const maybeIcon = (\n childElement: ReactElement,\n withIcon: boolean,\n iconName?: string\n ) =>\n withIcon\n ? [\n <span\n className=\"vuuIconContainer\"\n data-icon={iconName}\n key=\"icon\"\n />,\n ].concat(childElement)\n : childElement;\n\n function addClonedChild(\n list: ReactElement[],\n child: ReactElement,\n idx: number,\n withIcon: boolean\n ) {\n const {\n children,\n className,\n \"data-icon\": iconName,\n id: itemId,\n hasSeparator,\n label,\n ...props\n } = child.props;\n const hasSubMenu = isMenuItemGroup(child);\n const subMenuShowing = hasSubMenu && childMenuShowing === idx;\n const ariaControls = subMenuShowing ? `${id}-${itemId}` : undefined;\n\n list.push(\n <MenuItem\n {...props}\n {...propsCommonToAllListItems}\n {...getMenuItemProps(\n `${id}-${menuId}`,\n itemId,\n idx,\n child.key ?? itemId,\n highlightedIndex,\n appliedFocusVisible,\n className,\n hasSeparator\n )}\n aria-controls={ariaControls}\n aria-haspopup={hasSubMenu || undefined}\n aria-expanded={subMenuShowing || undefined}\n >\n {hasSubMenu\n ? maybeIcon(label, withIcon, iconName)\n : maybeIcon(children, withIcon, iconName)}\n </MenuItem>\n );\n // mapIdxToId.set(idx, itemId);\n }\n\n const listItems: ReactElement[] = [];\n\n if (children.length > 0) {\n const withIcon = children.some(hasIcon);\n\n children.forEach((child, idx) => {\n addClonedChild(listItems, child, idx, withIcon);\n });\n }\n\n return listItems;\n }\n};\n\nconst getMenuItemProps = (\n baseId: string,\n itemId: string,\n idx: number,\n key: string,\n highlightedIdx: number,\n focusVisible: number,\n className: string,\n hasSeparator: boolean\n) => ({\n id: `${baseId}-${itemId}`,\n key: key ?? idx,\n \"data-idx\": idx,\n \"data-highlighted\": idx === highlightedIdx || undefined,\n className: cx(\"vuuMenuItem\", className, {\n \"vuuMenuItem-separator\": hasSeparator,\n focusVisible: focusVisible === idx,\n }),\n});\n\nMenuList.displayName = \"MenuList\";\nexport default MenuList;\n", "import {\n FocusEvent,\n KeyboardEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { hasPopup, isRoot } from \"./utils\";\nimport { isNavigationKey } from \"./key-code\";\n\nexport interface KeyboardNavigationProps {\n autoHighlightFirstItem?: boolean;\n count: number;\n highlightedIndex?: number;\n onActivate: (idx: number) => void;\n onHighlight?: (idx: number) => void;\n onCloseMenu: (idx: number) => void;\n onOpenMenu: (idx: number) => void;\n}\n\nexport interface KeyboardHookListProps {\n // onBlur: (evt: FocusEvent) => void;\n onFocus: (evt: FocusEvent) => void;\n onKeyDown: (evt: KeyboardEvent) => void;\n onMouseDownCapture: () => void;\n onMouseMove: () => void;\n onMouseLeave: () => void;\n}\n\nexport interface NavigationHookResult {\n focusVisible: number;\n controlledHighlighting: boolean;\n highlightedIndex: number;\n setHighlightedIndex: (idx: number) => void;\n // keyboardNavigation: RefObject<boolean>;\n listProps: KeyboardHookListProps;\n setIgnoreFocus: (ignoreFocus: boolean) => void;\n}\n\n// we need a way to set highlightedIdx when selection changes\nexport const useKeyboardNavigation = ({\n autoHighlightFirstItem = false,\n count,\n highlightedIndex: highlightedIndexProp,\n onActivate,\n onHighlight,\n // onKeyDown,\n onCloseMenu,\n onOpenMenu,\n}: KeyboardNavigationProps): NavigationHookResult => {\n // const prevCount = useRef(count);\n const highlightedIndexRef = useRef(\n highlightedIndexProp ?? autoHighlightFirstItem ? 0 : -1\n );\n const [, forceRender] = useState<unknown>(null);\n const controlledHighlighting = highlightedIndexProp !== undefined;\n\n // count will not work for this, as it will change when we expand collapse groups\n // if (count !== prevCount.current) {\n // prevCount.current = count;\n // if (highlightedIndexRef.current !== -1){\n // highlightedIndexRef.current = autoHighlightFirstItem ? 0 : -1;\n // }\n // }\n\n const setHighlightedIdx = useCallback(\n (idx) => {\n highlightedIndexRef.current = idx;\n onHighlight?.(idx);\n forceRender({});\n },\n [onHighlight]\n );\n\n const setHighlightedIndex = useCallback(\n (idx) => {\n if (idx !== highlightedIndexRef.current) {\n if (!controlledHighlighting) {\n setHighlightedIdx(idx);\n }\n }\n },\n [controlledHighlighting, setHighlightedIdx]\n );\n\n // does this belong here or should it be a method passed in?\n const keyBoardNavigation = useRef(true);\n const ignoreFocus = useRef(false);\n const setIgnoreFocus = (value: boolean) => (ignoreFocus.current = value);\n\n const highlightedIndex = controlledHighlighting\n ? highlightedIndexProp\n : highlightedIndexRef.current;\n\n const navigateChildldItems = useCallback(\n (e: KeyboardEvent) => {\n const nextIdx = nextItemIdx(count, e.key, highlightedIndexRef.current);\n if (nextIdx !== highlightedIndexRef.current) {\n setHighlightedIndex(nextIdx);\n }\n },\n [count, setHighlightedIndex]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (isNavigationKey(e)) {\n e.preventDefault();\n e.stopPropagation();\n keyBoardNavigation.current = true;\n navigateChildldItems(e);\n } else if (\n (e.key === \"ArrowRight\" || e.key === \"Enter\") &&\n hasPopup(e.target as HTMLElement, highlightedIndex)\n ) {\n onOpenMenu(highlightedIndex);\n } else if (e.key === \"ArrowLeft\" && !isRoot(e.target as HTMLElement)) {\n onCloseMenu(highlightedIndex);\n } else if (e.key === \"Enter\") {\n onActivate && onActivate(highlightedIndex);\n }\n },\n [\n highlightedIndex,\n navigateChildldItems,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n ]\n );\n\n const listProps: KeyboardHookListProps = useMemo(\n () => ({\n onFocus: () => {\n if (highlightedIndex === -1) {\n setHighlightedIdx(0);\n }\n },\n onKeyDown: handleKeyDown,\n onMouseDownCapture: () => {\n keyBoardNavigation.current = false;\n setIgnoreFocus(true);\n },\n\n // onMouseEnter would seem less expensive but it misses some cases\n onMouseMove: () => {\n if (keyBoardNavigation.current) {\n keyBoardNavigation.current = false;\n }\n },\n onMouseLeave: () => {\n // label === 'ParsedInput' && console.log(`%c[useKeyboardNavigationHook]<${label}> onMouseLeave`,'color:brown')\n keyBoardNavigation.current = true;\n setIgnoreFocus(false);\n setHighlightedIndex(-1);\n },\n }),\n [\n highlightedIndex,\n setHighlightedIndex,\n navigateChildldItems,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n setHighlightedIdx,\n ]\n );\n\n // label === 'ParsedInput' && console.log(`%cuseNavigationHook<${label}>\n // highlightedIdxProp= ${highlightedIdxProp},\n // highlightedIndexRef= ${highlightedIndexRef.current},\n // %chighlightedIdx= ${highlightedIdx}`, 'color: brown','color: brown;font-weight: bold;')\n\n return {\n focusVisible: keyBoardNavigation.current ? highlightedIndex : -1,\n controlledHighlighting,\n highlightedIndex,\n setHighlightedIndex: setHighlightedIndex,\n // keyBoardNavigation,\n listProps,\n setIgnoreFocus,\n };\n};\n\n// need to be able to accommodate disabled items\nfunction nextItemIdx(count: number, key: string, idx: number) {\n if (key === \"ArrowUp\") {\n if (idx > 0) {\n return idx - 1;\n } else {\n return idx;\n }\n } else {\n if (idx === null) {\n return 0;\n } else if (idx === count - 1) {\n return idx;\n } else {\n return idx + 1;\n }\n }\n}\n", "export const isRoot = (el: HTMLElement) =>\n el.closest(`[data-root='true']`) !== null;\n\nexport const hasPopup = (el: HTMLElement, idx: number) =>\n (el.ariaHasPopup === \"true\" && el.dataset?.idx === `${idx}`) ||\n el.querySelector(`:scope > [data-idx='${idx}'][aria-haspopup='true']`) !==\n null;\n", "function union(set1: Set<string>, ...sets: Set<string>[]) {\n const result = new Set(set1);\n for (const set of sets) {\n for (const element of set) {\n result.add(element);\n }\n }\n return result;\n}\n\nexport const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const Backspace = \"Backspace\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Delete = \"Delete\";\n\nconst actionKeys = new Set([Enter, Delete]);\nconst focusKeys = new Set([\"Tab\"]);\n// const navigationKeys = new Set([\"Home\", \"End\", \"ArrowRight\", \"ArrowLeft\",\"ArrowDown\", \"ArrowUp\"]);\nconst arrowLeftRightKeys = new Set([\"ArrowRight\", \"ArrowLeft\"]);\nconst verticalNavigationKeys = new Set([\"Home\", \"End\", \"ArrowDown\", \"ArrowUp\"]);\nconst horizontalNavigationKeys = new Set([\n \"Home\",\n \"End\",\n \"ArrowRight\",\n \"ArrowLeft\",\n]);\nconst functionKeys = new Set([\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n]);\nconst specialKeys = union(\n actionKeys,\n horizontalNavigationKeys,\n verticalNavigationKeys,\n arrowLeftRightKeys,\n functionKeys,\n focusKeys\n);\nexport const isCharacterKey = (evt: KeyboardEvent) => {\n if (specialKeys.has(evt.key)) {\n return false;\n }\n if (typeof evt.which === \"number\" && evt.which > 0) {\n return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which !== 8;\n }\n};\n\nexport const isNavigationKey = (\n { key }: { key: string },\n orientation = \"vertical\"\n) => {\n const navigationKeys =\n orientation === \"vertical\"\n ? verticalNavigationKeys\n : horizontalNavigationKeys;\n return navigationKeys.has(key);\n};\n", "import React, { ReactElement, useCallback, useMemo } from \"react\";\nimport { MenuItemGroup, Separator } from \"./MenuList\";\n\nexport const isMenuItemGroup = (child: ReactElement) =>\n child.type === MenuItemGroup || !!child.props[\"data-group\"];\n\ntype Menus = { [key: string]: ReactElement[] };\ntype Actions = { [key: string]: { action: string; options?: unknown } };\n\nexport const useItemsWithIds = (\n childrenProp: ReactElement[]\n): [Menus, Actions] => {\n const normalizeChildren = useCallback(() => {\n const collectChildren = (\n children: ReactElement[],\n path = \"root\",\n menus: Menus = {},\n actions: Actions = {}\n ) => {\n const list: ReactElement[] = (menus[path] = []);\n let idx = 0;\n let hasSeparator = false;\n\n React.Children.forEach(children, (child) => {\n if (child.type === Separator) {\n hasSeparator = true;\n } else {\n const group = isMenuItemGroup(child);\n const childPath = path === \"root\" ? `${idx}` : `${path}.${idx}`;\n const {\n props: { action, options },\n } = child;\n const { childWithId, grandChildren } = assignId(\n child,\n childPath,\n group,\n hasSeparator\n );\n list.push(childWithId);\n if (grandChildren) {\n collectChildren(grandChildren, childPath, menus, actions);\n } else {\n actions[childPath] = { action, options };\n }\n idx += 1;\n hasSeparator = false;\n }\n });\n return [menus, actions];\n };\n\n const assignId = (\n child: ReactElement,\n path: string,\n group: boolean,\n hasSeparator = false\n ) => {\n const {\n props: { children },\n } = child;\n return {\n childWithId: React.cloneElement(child, {\n hasSeparator,\n id: `${path}`,\n key: path,\n children: group ? undefined : children,\n }),\n grandChildren: group ? children : undefined,\n };\n };\n\n return collectChildren(childrenProp);\n }, [childrenProp]);\n\n const [menus, actions] = useMemo(\n () => normalizeChildren(),\n [normalizeChildren]\n );\n\n return [menus, actions] as [Menus, Actions];\n};\n", "import {\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { closestListItem, listItemIndex } from \"./list-dom-utils\";\nimport { MenuItemProps } from \"./MenuList\";\n// import {mousePosition} from './aim/utils';\n// import {aiming} from './aim/aim';\n\nconst nudge = (\n menus: RuntimeMenuDescriptor[],\n distance: number,\n pos: \"left\" | \"top\"\n) => {\n return menus.map((m, i) =>\n i === menus.length - 1\n ? {\n ...m,\n [pos]: m[pos] - distance,\n }\n : m\n );\n};\nconst nudgeLeft = (menus: RuntimeMenuDescriptor[], distance: number) =>\n nudge(menus, distance, \"left\");\nconst nudgeUp = (menus: RuntimeMenuDescriptor[], distance: number) =>\n nudge(menus, distance, \"top\");\n\nconst flipSides = (id: string, menus: RuntimeMenuDescriptor[]) => {\n const [parentMenu, menu] = menus.slice(-2);\n const el = document.getElementById(`${id}-${menu.id}`);\n if (el === null) {\n throw Error(`useCascade.flipSides element with id ${menu.id} not found`);\n }\n const { width } = el.getBoundingClientRect();\n return menus.map((m) =>\n m === menu\n ? {\n ...m,\n left: parentMenu.left - (width - 2),\n }\n : m\n );\n};\n\n// const closedNode = (el: HTMLElement) =>\n// el.ariaHasPopup === \"true\" && el.ariaExpanded !== \"true\";\nconst getPosition = (el: HTMLElement, openMenus: RuntimeMenuDescriptor[]) => {\n const [{ left, top: menuTop }] = openMenus.slice(-1);\n // const {top, right, bottom, left} = el.getBoundingClientRect();\n // this will not work for MenuList within window, we need the\n // const {offsetLeft: left, offsetTop: menuTop} = el.closest('.vuuMenuList');\n const { offsetWidth: width, offsetTop: top } = el;\n return { left: left + width, top: top + menuTop };\n};\n\nexport type RuntimeMenuDescriptor = {\n id: string;\n left: number;\n top: number;\n};\n\nexport const getItemId = (id: string) => {\n const pos = id.lastIndexOf(\"-\");\n return pos === -1 ? id : id.slice(pos + 1);\n};\n\nexport const getMenuId = (id: string) => {\n const itemId = getItemId(id);\n const pos = itemId.lastIndexOf(\".\");\n return pos > -1 ? itemId.slice(0, pos) : \"root\";\n};\n\nconst getMenuDepth = (id: string) => {\n let count = 0,\n pos = id.indexOf(\".\", 0);\n while (pos !== -1) {\n count += 1;\n pos = id.indexOf(\".\", pos + 1);\n }\n return count;\n};\n\nconst identifyItem = (el: HTMLElement) => ({\n menuId: getMenuId(el.id),\n itemId: getItemId(el.id),\n isGroup: el.ariaHasPopup === \"true\",\n isOpen: el.ariaExpanded === \"true\",\n level: getMenuDepth(el.id),\n});\n\nexport interface CascadeHookProps {\n id: string;\n onActivate: (menuId: string) => void;\n onMouseEnterItem: (evt: MouseEvent, itemId: string) => void;\n position: { x: number; y: number };\n}\n\nexport interface CascadeHooksResult {\n closeMenu: () => void;\n handleRender: () => void;\n listItemProps: Partial<MenuItemProps>;\n openMenu: (menuId?: string, itemId?: string) => void;\n openMenus: RuntimeMenuDescriptor[];\n}\n\ntype MenuStatus = \"no-popup\" | \"popup-open\" | \"pending-close\" | \"popup-pending\";\ntype MenuState = { [key: string]: MenuStatus };\n\nexport const useCascade = ({\n id,\n onActivate,\n onMouseEnterItem,\n position: { x: posX, y: posY },\n}: CascadeHookProps): CascadeHooksResult => {\n const [, forceRefresh] = useState({});\n const openMenus = useRef<RuntimeMenuDescriptor[]>([\n { id: \"root\", left: posX, top: posY },\n ]);\n\n const setOpenMenus = useCallback((menus: RuntimeMenuDescriptor[]) => {\n openMenus.current = menus;\n forceRefresh({});\n }, []);\n\n const menuOpenPendingTimeout = useRef<number | undefined>();\n const menuClosePendingTimeout = useRef<number | undefined>();\n const menuState = useRef<MenuState>({ root: \"no-popup\" });\n const prevLevel = useRef(0);\n\n // const prevAim = useRef({mousePos: null, distance: true});\n\n const openMenu = useCallback(\n (menuId = \"root\", itemId = null, listItemEl = null) => {\n if (menuId === \"root\" && itemId === null) {\n setOpenMenus([{ id: \"root\", left: posX, top: posY }]);\n } else {\n menuState.current[menuId] = \"popup-open\";\n const doc = listItemEl ? listItemEl.ownerDocument : document;\n const el = doc.getElementById(`${id}-${menuId}-${itemId}`);\n const { left, top } = getPosition(el, openMenus.current);\n setOpenMenus(openMenus.current.concat({ id: itemId, left, top }));\n }\n },\n [id, posX, posY, setOpenMenus]\n );\n\n const closeMenu = useCallback(\n (menuId?: string) => {\n if (menuId === \"root\") {\n setOpenMenus([]);\n } else {\n setOpenMenus(openMenus.current.slice(0, -1));\n }\n },\n [setOpenMenus]\n );\n\n const closeMenus = useCallback(\n (menuId, itemId) => {\n const menus = openMenus.current.slice();\n let { id: lastMenuId } = menus[menus.length - 1];\n while (menus.length > 1 && !itemId.startsWith(lastMenuId)) {\n const parentMenuId = getMenuId(lastMenuId);\n menus.pop();\n menuState.current[lastMenuId] = \"no-popup\";\n menuState.current[parentMenuId] = \"no-popup\";\n ({ id: lastMenuId } = menus[menus.length - 1]);\n }\n if (menus.length < openMenus.current.length) {\n setOpenMenus(menus);\n }\n },\n [setOpenMenus]\n );\n\n const scheduleOpen = useCallback(\n (menuId, itemId, listItemEl) => {\n if (menuOpenPendingTimeout.current) {\n clearTimeout(menuOpenPendingTimeout.current);\n }\n menuOpenPendingTimeout.current = window.setTimeout(() => {\n console.log(`scheduleOpen timed out opening ${itemId}`);\n closeMenus(menuId, itemId);\n menuState.current[menuId] = \"popup-open\";\n menuState.current[itemId] = \"no-popup\";\n openMenu(menuId, itemId, listItemEl);\n }, 400);\n },\n [closeMenus, openMenu]\n );\n\n const scheduleClose = useCallback(\n (openMenuId, menuId, itemId) => {\n console.log(\n `scheduleClose openMenuId ${openMenuId} menuId ${menuId} itemId ${itemId}`\n );\n menuState.current[openMenuId] = \"pending-close\";\n menuClosePendingTimeout.current = window.setTimeout(() => {\n closeMenus(menuId, itemId);\n }, 400);\n },\n [closeMenus]\n );\n\n const handleRender = useCallback(() => {\n const { current: menus } = openMenus;\n const [menu] = menus.slice(-1);\n const el = document.getElementById(`${id}-${menu.id}`);\n if (el) {\n const { right, bottom } = el.getBoundingClientRect();\n const { clientHeight, clientWidth } = document.body;\n if (right > clientWidth) {\n const newMenus =\n menus.length > 1\n ? flipSides(id, menus)\n : nudgeLeft(menus, right - clientWidth);\n setOpenMenus(newMenus);\n } else if (bottom > clientHeight) {\n const newMenus = nudgeUp(menus, bottom - clientHeight);\n setOpenMenus(newMenus);\n }\n }\n }, [id, setOpenMenus]);\n\n const listItemProps: Partial<MenuItemProps> = useMemo(\n () => ({\n onMouseEnter: (evt: MouseEvent) => {\n const listItemEl = closestListItem(evt.target as HTMLElement);\n const { menuId, itemId, isGroup, isOpen, level } =\n identifyItem(listItemEl);\n const sameLevel = prevLevel.current === level;\n const {\n current: { [menuId]: state },\n } = menuState;\n prevLevel.current = level;\n\n // console.log(\n // `%conMouseEnter #${menuId}[${itemId}] @${level}\n // isGroup ${isGroup} isOpen ${isOpen}\n // openMenus [${openMenus.current.join(',')}]\n // state='${JSON.stringify(menuState.current)}`,\n // 'color: green; font-weight: bold;'\n // );\n\n if (state === \"no-popup\" && isGroup) {\n // Shouldn;t we always set this ?\n menuState.current[menuId] = \"popup-pending\";\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (state === \"popup-pending\" && !isGroup) {\n menuState.current[menuId] = \"no-popup\";\n clearTimeout(menuOpenPendingTimeout.current);\n menuOpenPendingTimeout.current = undefined;\n } else if (state === \"popup-pending\" && isGroup) {\n clearTimeout(menuOpenPendingTimeout.current);\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (state === \"popup-open\") {\n const [{ id: parentMenuId }, { id: openMenuId }] =\n openMenus.current.slice(-2);\n if (\n parentMenuId === menuId &&\n menuState.current[openMenuId] !== \"pending-close\" &&\n sameLevel\n ) {\n scheduleClose(openMenuId, menuId, itemId);\n if (isGroup && !isOpen) {\n scheduleOpen(menuId, itemId, listItemEl);\n }\n } else if (\n parentMenuId === menuId &&\n isGroup &&\n itemId !== openMenuId &&\n menuState.current[openMenuId] === \"pending-close\"\n ) {\n // if there is already an item queued for opening cancel it\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (isGroup) {\n closeMenus(menuId, itemId);\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (\n !(menuState.current[openMenuId] === \"pending-close\" && sameLevel)\n ) {\n closeMenus(menuId, itemId);\n }\n }\n\n if (state === \"pending-close\") {\n if (menuOpenPendingTimeout.current) {\n clearTimeout(menuOpenPendingTimeout.current);\n menuOpenPendingTimeout.current = undefined;\n }\n clearTimeout(menuClosePendingTimeout.current);\n menuClosePendingTimeout.current = undefined;\n menuState.current[menuId] = \"popup-open\";\n }\n\n onMouseEnterItem(evt, itemId);\n },\n\n onClick: (evt: SyntheticEvent) => {\n const targetElement = evt.target as HTMLElement;\n const listItemEl = closestListItem(targetElement);\n const idx = listItemIndex(listItemEl);\n console.log(\n `list item click [${idx}] hasPopup ${listItemEl.ariaHasPopup}`\n );\n if (listItemEl.ariaHasPopup === \"true\") {\n if (listItemEl.ariaExpanded !== \"true\") {\n openMenu(idx);\n } else {\n // do nothing\n }\n } else {\n onActivate(getItemId(listItemEl.id));\n }\n },\n }),\n [\n closeMenus,\n onActivate,\n\n onMouseEnterItem,\n openMenu,\n scheduleClose,\n scheduleOpen,\n ]\n );\n\n return {\n closeMenu,\n handleRender,\n listItemProps,\n openMenu,\n openMenus: openMenus.current,\n };\n};\n", "// const listItemElement = (listEl: HTMLElement, listItemIdx: number) =>\n// listEl.querySelector(`:scope > [data-idx=\"${listItemIdx}\"]`);\n\nexport function listItemIndex(listItemEl: HTMLElement) {\n if (listItemEl) {\n const idx = listItemEl.dataset.idx;\n if (idx) {\n return parseInt(idx, 10);\n // eslint-disable-next-line no-cond-assign\n } else if (listItemEl.ariaPosInSet) {\n return parseInt(listItemEl.ariaPosInSet, 10) - 1;\n }\n }\n}\n\nconst listItemId = (el: HTMLElement | null | undefined) => el?.id;\n\nexport const closestListItem = (el: HTMLElement | null | undefined) =>\n el?.closest(\"[data-idx],[aria-posinset]\") as HTMLElement;\n\nexport const closestListItemId = (el: HTMLElement) =>\n listItemId(closestListItem(el));\n\nexport const closestListItemIndex = (el: HTMLElement) =>\n listItemIndex(closestListItem(el));\n", "import { useEffect } from \"react\";\n\nexport interface ClickAwayHookProps {\n containerClassName: string;\n isOpen: boolean;\n onClose?: (target: string) => void;\n}\n\nexport const useClickAway = ({\n containerClassName,\n isOpen,\n onClose,\n}: ClickAwayHookProps) => {\n useEffect(() => {\n let clickHandler: (evt: MouseEvent) => void;\n if (isOpen) {\n clickHandler = (evt) => {\n const target = evt.target as HTMLElement;\n const container = target.closest(`.${containerClassName}`);\n if (container === null) {\n onClose?.(\"root\");\n }\n };\n\n document.body.addEventListener(\"click\", clickHandler, true);\n }\n\n return () => {\n if (clickHandler) {\n document.body.removeEventListener(\"click\", clickHandler, true);\n }\n };\n }, [containerClassName, isOpen, onClose]);\n};\n", "import { createContext, ReactNode, useCallback, useMemo } from \"react\";\n\nexport type MenuActionHandler = (\n type: string,\n options: unknown\n) => boolean | undefined;\nexport type MenuBuilder<L = string, O = unknown> = (\n location: L,\n options: O\n) => ContextMenuItemDescriptor[];\n\nexport interface ContextMenuContext {\n menuBuilders: MenuBuilder[];\n menuActionHandler: MenuActionHandler;\n}\n\nexport const ContextMenuContext = createContext<ContextMenuContext | null>(\n null\n);\n\nexport interface ContextMenuItemBase {\n icon?: string;\n label: string;\n location?: string;\n}\n\nexport interface ContextMenuLeafItemDescriptor extends ContextMenuItemBase {\n action: string;\n options?: unknown;\n}\n\nexport interface ContextMenuGroupItemDescriptor extends ContextMenuItemBase {\n children: ContextMenuItemDescriptor[];\n}\n\nexport type ContextMenuItemDescriptor =\n | ContextMenuLeafItemDescriptor\n | ContextMenuGroupItemDescriptor;\n\nexport const isGroupMenuItemDescriptor = (\n menuItem?: ContextMenuItemDescriptor\n): menuItem is ContextMenuGroupItemDescriptor =>\n menuItem !== undefined && \"children\" in menuItem;\n\nexport interface ContextMenuProviderProps {\n children: ReactNode;\n label?: string;\n menuActionHandler?: MenuActionHandler;\n menuBuilder: MenuBuilder;\n}\n\ninterface ProviderProps extends ContextMenuProviderProps {\n context: ContextMenuContext | null;\n}\n\nconst Provider = ({\n children,\n context,\n menuActionHandler,\n menuBuilder,\n}: ProviderProps) => {\n const menuBuilders = useMemo(() => {\n if (context?.menuBuilders && menuBuilder) {\n return context.menuBuilders.concat(menuBuilder);\n } else if (menuBuilder) {\n return [menuBuilder];\n } else {\n return context?.menuBuilders || [];\n }\n }, [context, menuBuilder]);\n\n const handleMenuAction = useCallback(\n (type, options) => {\n if (menuActionHandler?.(type, options)) {\n return true;\n }\n\n if (context?.menuActionHandler?.(type, options)) {\n return true;\n }\n },\n [context, menuActionHandler]\n );\n\n return (\n <ContextMenuContext.Provider\n value={{\n menuActionHandler: handleMenuAction,\n menuBuilders,\n }}\n >\n {children}\n </ContextMenuContext.Provider>\n );\n};\n\n// Need an option for local menu to override higher-level menu, rather than extend\nexport const ContextMenuProvider = ({\n children,\n label,\n menuActionHandler,\n menuBuilder,\n}: ContextMenuProviderProps) => {\n return (\n <ContextMenuContext.Consumer>\n {(parentContext) => (\n <Provider\n context={parentContext}\n label={label}\n menuActionHandler={menuActionHandler}\n menuBuilder={menuBuilder}\n >\n {children}\n </Provider>\n )}\n </ContextMenuContext.Consumer>\n );\n};\n", "// The menuBuilder will always be supplied by the code that will display the local\n// context menu. It will be passed all configured menu descriptors. It is free to\n\nimport { VuuServerMenuOptions } from \"@vuu-ui/vuu-data\";\nimport { MouseEvent, useCallback, useContext } from \"react\";\nimport { PopupService } from \"../popup\";\nimport {\n ContextMenuContext,\n ContextMenuItemDescriptor,\n isGroupMenuItemDescriptor,\n MenuActionHandler,\n MenuBuilder,\n} from \"./context-menu-provider\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { MenuItem, MenuItemGroup } from \"./MenuList\";\n\n// augment, replace or ignore the existing menu descriptors.\nexport const useContextMenu = () => {\n const ctx = useContext(ContextMenuContext);\n\n const buildMenuOptions = useCallback(\n (menuBuilders: MenuBuilder[], location, options) => {\n let results: ContextMenuItemDescriptor[] = [];\n for (const menuBuilder of menuBuilders) {\n // Maybe we should leave the concatenation to the menuBuilder, then it can control menuItem order\n results = results.concat(menuBuilder(location, options));\n }\n return results;\n },\n []\n );\n\n const handleShowContextMenu = useCallback(\n (e: MouseEvent<HTMLElement>, location: string, options: unknown) => {\n e.stopPropagation();\n e.preventDefault();\n const menuBuilders = ctx?.menuBuilders ?? [];\n const menuItemDescriptors = buildMenuOptions(\n menuBuilders,\n location,\n options\n );\n console.log({\n menuItemDescriptors,\n });\n if (menuItemDescriptors.length && ctx?.menuActionHandler) {\n console.log(`showContextMenu ${location}`, {\n options,\n });\n showContextMenu(e, menuItemDescriptors, ctx.menuActionHandler);\n }\n },\n [buildMenuOptions, ctx]\n );\n\n return handleShowContextMenu;\n};\n\nconst showContextMenu = (\n e: MouseEvent<HTMLElement>,\n menuDescriptors: ContextMenuItemDescriptor[],\n handleContextMenuAction: MenuActionHandler\n) => {\n const { clientX: left, clientY: top } = e;\n const menuItems = (menuDescriptors: ContextMenuItemDescriptor[]) => {\n const fromDescriptor = (menuItem: ContextMenuItemDescriptor, i: number) =>\n isGroupMenuItemDescriptor(menuItem) ? (\n <MenuItemGroup key={i} label={menuItem.label}>\n {menuItem.children.map(fromDescriptor)}\n </MenuItemGroup>\n ) : (\n <MenuItem\n key={i}\n action={menuItem.action}\n data-icon={menuItem.icon}\n options={menuItem.options}\n >\n {menuItem.label}\n </MenuItem>\n );\n\n return menuDescriptors.map(fromDescriptor);\n };\n\n const handleClose = (menuId?: string, options?: unknown) => {\n if (menuId) {\n handleContextMenuAction(menuId, options);\n PopupService.hidePopup();\n }\n };\n\n const component = (\n <ContextMenu onClose={handleClose} position={{ x: left, y: top }}>\n {menuItems(menuDescriptors)}\n </ContextMenu>\n );\n PopupService.showPopup({ left: 0, top: 0, component });\n};\n", "import cx from \"classnames\";\nimport React, {\n createElement,\n CSSProperties,\n HTMLAttributes,\n ReactElement,\n useEffect,\n useRef,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { renderPortal } from \"../portal\";\n\nimport \"./popup-service.css\";\n\nlet _dialogOpen = false;\nconst _popups: string[] = [];\n\nfunction specialKeyHandler(e: KeyboardEvent) {\n if (e.key === \"Esc\") {\n if (_popups.length) {\n closeAllPopups();\n } else if (_dialogOpen) {\n const dialogRoot = document.body.querySelector(\".vuuDialog\");\n if (dialogRoot) {\n ReactDOM.unmountComponentAtNode(dialogRoot);\n }\n }\n }\n}\n\nfunction outsideClickHandler(e: MouseEvent) {\n if (_popups.length) {\n // onsole.log(`Popup.outsideClickHandler`);\n const popupContainers = document.body.querySelectorAll(\".vuuPopup\");\n for (let i = 0; i < popupContainers.length; i++) {\n if (popupContainers[i].contains(e.target as HTMLElement)) {\n return;\n }\n }\n closeAllPopups();\n }\n}\n\nfunction closeAllPopups() {\n if (_popups.length) {\n // onsole.log(`closeAllPopups`);\n const popupContainers = document.body.querySelectorAll(\".vuuPopup\");\n for (let i = 0; i < popupContainers.length; i++) {\n ReactDOM.unmountComponentAtNode(popupContainers[i]);\n }\n popupClosed(\"*\");\n }\n}\n\nfunction dialogOpened() {\n if (_dialogOpen === false) {\n _dialogOpen = true;\n window.addEventListener(\"keydown\", specialKeyHandler, true);\n }\n}\n\nfunction dialogClosed() {\n if (_dialogOpen) {\n _dialogOpen = false;\n window.removeEventListener(\"keydown\", specialKeyHandler, true);\n }\n}\n\nfunction popupOpened(name: string) {\n if (_popups.indexOf(name) === -1) {\n _popups.push(name);\n //onsole.log('PopupService, popup opened ' + name + ' popups : ' + _popups);\n if (_dialogOpen === false) {\n window.addEventListener(\"keydown\", specialKeyHandler, true);\n window.addEventListener(\"click\", outsideClickHandler, true);\n }\n }\n}\n\nfunction popupClosed(name: string /*, group=null*/) {\n if (_popups.length) {\n if (name === \"*\") {\n _popups.length = 0;\n } else {\n const pos = _popups.indexOf(name);\n if (pos !== -1) {\n _popups.splice(pos, 1);\n }\n }\n //onsole.log('PopupService, popup closed ' + name + ' popups : ' + _popups);\n if (_popups.length === 0 && _dialogOpen === false) {\n window.removeEventListener(\"keydown\", specialKeyHandler, true);\n window.removeEventListener(\"click\", outsideClickHandler, true);\n }\n }\n}\n\nconst PopupComponent = ({\n children,\n position,\n style,\n}: HTMLAttributes<HTMLDivElement> & {\n position?: \"above\" | \"below\" | \"\";\n style?: CSSProperties;\n}) => {\n const className = cx(\"hwPopup\", \"hwPopupContainer\", position);\n return createElement(\"div\", { className, style }, children);\n};\n\nlet incrementingKey = 1;\n\nexport class PopupService {\n static showPopup({\n name = \"anon\",\n group = \"all\",\n position = \"\",\n left = 0,\n right = \"auto\",\n top = 0,\n width = \"auto\",\n component,\n }: {\n depth?: number;\n name?: string;\n group?: string;\n position?: \"above\" | \"below\" | \"\";\n left?: number;\n right?: \"auto\" | number;\n top?: number;\n component: ReactElement;\n width?: number | \"auto\";\n }) {\n if (!component) {\n throw Error(`PopupService showPopup, no component supplied`);\n }\n popupOpened(name);\n let el = document.body.querySelector(\".vuuPopup.\" + group) as HTMLElement;\n if (el === null) {\n el = document.createElement(\"div\") as HTMLElement;\n el.className = \"vuuPopup \" + group;\n document.body.appendChild(el);\n }\n\n const style = { width };\n\n renderPortal(\n createElement(\n PopupComponent,\n { key: incrementingKey++, position, style },\n component\n ),\n el,\n left,\n top,\n () => {\n PopupService.keepWithinThePage(el, right);\n }\n );\n }\n\n static hidePopup(name = \"anon\", group = \"all\") {\n //onsole.log('PopupService.hidePopup name=' + name + ', group=' + group)\n\n if (_popups.indexOf(name) !== -1) {\n popupClosed(name);\n const popupRoot = document.body.querySelector(`.vuuPopup.${group}`);\n if (popupRoot) {\n ReactDOM.unmountComponentAtNode(popupRoot);\n }\n }\n }\n\n static keepWithinThePage(el: HTMLElement, right: number | \"auto\" = \"auto\") {\n const target = el.querySelector(\".vuuPopupContainer > *\") as HTMLElement;\n if (target) {\n const {\n top,\n left,\n width,\n height,\n right: currentRight,\n } = target.getBoundingClientRect();\n\n const w = window.innerWidth;\n const h = window.innerHeight;\n\n const overflowH = h - (top + height);\n if (overflowH < 0) {\n target.style.top = Math.round(top) + overflowH + \"px\";\n }\n\n const overflowW = w - (left + width);\n if (overflowW < 0) {\n target.style.left = Math.round(left) + overflowW + \"px\";\n }\n\n if (typeof right === \"number\" && right !== currentRight) {\n const adjustment = right - currentRight;\n target.style.left = left + adjustment + \"px\";\n }\n }\n }\n}\n\nexport class DialogService {\n static showDialog(dialog: ReactElement) {\n const containerEl = \".vuuDialog\";\n const onClose = dialog.props.onClose;\n\n dialogOpened();\n\n ReactDOM.render(\n React.cloneElement(dialog, {\n container: containerEl,\n onClose: () => {\n DialogService.closeDialog();\n if (onClose) {\n onClose();\n }\n },\n }),\n document.body.querySelector(containerEl)\n );\n }\n\n static closeDialog() {\n dialogClosed();\n const dialogRoot = document.body.querySelector(\".vuuDialog\");\n if (dialogRoot) {\n ReactDOM.unmountComponentAtNode(dialogRoot);\n }\n }\n}\n\nexport interface PopupProps {\n children: ReactElement;\n close?: boolean;\n depth: number;\n group?: string;\n name: string;\n position?: \"above\" | \"below\" | \"\";\n width: number;\n}\n\nexport const Popup = (props: PopupProps) => {\n const pendingTask = useRef<number | undefined>();\n const ref = useRef<HTMLElement>(null);\n\n const show = (props: PopupProps, boundingClientRect: DOMRect) => {\n const { name, group, depth, width } = props;\n let left: number | undefined;\n let top: number | undefined;\n\n if (pendingTask.current) {\n window.clearTimeout(pendingTask.current);\n pendingTask.current = undefined;\n }\n\n if (props.close === true) {\n PopupService.hidePopup(name, group);\n } else {\n const { position, children: component } = props;\n const {\n left: targetLeft,\n top: targetTop,\n width: clientWidth,\n bottom: targetBottom,\n } = boundingClientRect;\n\n if (position === \"below\") {\n left = targetLeft;\n top = targetBottom;\n } else if (position === \"above\") {\n left = targetLeft;\n top = targetTop;\n }\n\n pendingTask.current = window.setTimeout(() => {\n PopupService.showPopup({\n name,\n group,\n depth,\n position,\n left,\n top,\n width: width || clientWidth,\n component,\n });\n }, 10);\n }\n };\n\n useEffect(() => {\n if (ref.current) {\n const el = ref.current.parentElement;\n const boundingClientRect = el?.getBoundingClientRect();\n if (boundingClientRect) {\n show(props, boundingClientRect);\n }\n }\n\n return () => {\n PopupService.hidePopup(props.name, props.group);\n };\n }, [props]);\n\n return React.createElement(\"div\", { className: \"popup-proxy\", ref });\n};\n"],
5
- "mappings": "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",
6
- "names": ["ReactDOM", "Portal", "jsx", "useId", "useCallback", "useRef", "React", "useLayoutEffect", "useMemo", "useRef", "cx", "useCallback", "useMemo", "useRef", "useState", "useRef", "useState", "useCallback", "useMemo", "useCallback", "useMemo", "useCallback", "menus", "actions", "useMemo", "jsx", "classBase", "isRoot", "useRef", "useMemo", "React", "useLayoutEffect", "cx", "children", "className", "props", "useCallback", "useMemo", "useRef", "useState", "useState", "useRef", "useCallback", "useMemo", "jsx", "useId", "useRef", "useCallback", "id", "useCallback", "useMemo", "jsx", "useCallback", "cx", "React", "createElement", "useEffect", "useRef", "ReactDOM", "ReactDOM", "cx", "createElement", "React", "useRef", "props", "useEffect", "jsx", "useCallback", "menuDescriptors"]
4
+ "sourcesContent": ["import { Scrim, Toolbar, ToolbarButton } from \"@heswell/salt-lab\";\nimport { Text } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { HTMLAttributes, useCallback, useRef, useState } from \"react\";\nimport { Portal } from \"../portal\";\n\nimport \"./Dialog.css\";\n\nconst classBase = \"vuuDialog\";\n\nexport interface DialogProps extends HTMLAttributes<HTMLDivElement> {\n isOpen?: boolean;\n onClose?: () => void;\n}\n\nexport const Dialog = ({\n children,\n className,\n isOpen = false,\n onClose,\n title,\n ...props\n}: DialogProps) => {\n const root = useRef<HTMLDivElement>(null);\n const [posX] = useState(0);\n const [posY] = useState(0);\n\n const close = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n const handleRender = useCallback(() => {\n // if (center && isOpen && root.current) {\n // const { width, height } = root.current.getBoundingClientRect();\n // const { innerWidth, innerHeight } = window;\n // const x = innerWidth / 2 - width / 2;\n // const y = innerHeight / 2 - height / 2;\n // setPosX(x);\n // setPosY(y);\n // }\n }, []);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <Portal onRender={handleRender} x={posX} y={posY}>\n <Scrim className={`${classBase}-scrim`} open={isOpen}>\n <div {...props} className={cx(classBase, className)} ref={root}>\n <Toolbar className={`${classBase}-header`}>\n <Text>{title}</Text>\n <ToolbarButton\n key=\"close\"\n onClick={close}\n data-align-end\n data-icon=\"close\"\n />\n </Toolbar>\n {children}\n </div>\n </Scrim>\n </Portal>\n );\n};\n", "import { ReactElement, useLayoutEffect, useMemo } from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { createContainer, renderPortal } from \"./render-portal\";\n\nexport interface PortalProps {\n children: ReactElement;\n onRender?: () => void;\n x?: number;\n y?: number;\n}\n\nexport const Portal = function Portal({\n children,\n x = 0,\n y = 0,\n onRender,\n}: PortalProps) {\n // Do we need to accept container here as a prop ?\n const renderContainer = useMemo(() => {\n return createContainer();\n }, []);\n\n useLayoutEffect(() => {\n renderPortal(children, renderContainer, x, y, onRender);\n }, [children, onRender, renderContainer, x, y]);\n\n useLayoutEffect(() => {\n return () => {\n if (renderContainer) {\n ReactDOM.unmountComponentAtNode(renderContainer);\n if (renderContainer.classList.contains(\"vuuPopup\")) {\n renderContainer.parentElement?.removeChild(renderContainer);\n }\n }\n };\n }, [renderContainer]);\n\n // useLayoutEffect(() => {\n // renderContainer.current = renderPortal(children, x, y, container)\n // return () => {\n // if (renderContainer.current){\n // console.log('EXPLICIT UNMOUNT')\n // ReactDOM.unmountComponentAtNode(renderContainer.current);\n // if (renderContainer.current.classList.contains('hwReactPopup')){\n // renderContainer.current.parentElement.removeChild(renderContainer.current);\n // renderContainer.current = null;\n // }\n // }\n // }\n // },[])\n return null;\n};\n", "import * as ReactDOM from \"react-dom\";\nimport { SaltProvider } from \"@salt-ds/core\";\nimport { ReactElement } from \"react\";\n\nlet containerId = 1;\n\nconst getPortalContainer = (x = 0, y = 0, win = window) => {\n const el = win.document.createElement(\"div\");\n el.className = \"vuuPopup \" + containerId++;\n el.style.cssText = `left:${x}px; top:${y}px;`;\n win.document.body.appendChild(el);\n return el;\n};\n\nconst createDOMContainer = (x?: number, y?: number) => getPortalContainer(x, y);\n\nexport const renderPortal = (\n component: ReactElement,\n container: HTMLElement,\n x: number,\n y: number,\n onRender?: () => void\n) => {\n // check this first to see if position has changed\n container.style.cssText = `left:${x}px; top:${y}px;position: absolute;`;\n\n ReactDOM.render(\n <SaltProvider applyClassesTo=\"child\">{component}</SaltProvider>,\n container,\n onRender\n );\n};\n\nexport const createContainer = createDOMContainer;\n", "export const installTheme = (themeId: string) => {\n const installedThemes = getComputedStyle(document.body).getPropertyValue(\n \"--installed-themes\"\n );\n document.body.style.setProperty(\n \"--installed-themes\",\n `${installedThemes} ${themeId}`\n );\n};\n", "import { useIdMemo as useId } from \"@salt-ds/core\";\nimport { useCallback, useRef } from \"react\";\nimport { Portal } from \"../portal\";\nimport MenuList, { MenuListProps } from \"./MenuList\";\nimport { getItemId, getMenuId, useCascade } from \"./use-cascade\";\nimport { useClickAway } from \"./use-click-away\";\nimport { useItemsWithIds } from \"./use-items-with-ids\";\n\nexport interface ContextMenuProps extends Omit<MenuListProps, \"onCloseMenu\"> {\n onClose?: (menuId?: string, options?: unknown) => void;\n position?: { x: number; y: number };\n withPortal?: boolean;\n}\n\nconst noop = () => undefined;\n\nexport const ContextMenu = ({\n activatedByKeyboard,\n children: childrenProp,\n className,\n id: idProp,\n onClose = () => undefined,\n position = { x: 0, y: 0 },\n style,\n ...menuListProps\n}: ContextMenuProps) => {\n const id = useId(idProp);\n const closeMenuRef = useRef<(location?: string) => void>(noop);\n const [menus, actions] = useItemsWithIds(childrenProp);\n const navigatingWithKeyboard = useRef(activatedByKeyboard);\n const handleMouseEnterItem = useCallback(() => {\n navigatingWithKeyboard.current = false;\n }, []);\n\n const handleActivate = useCallback(\n (menuId: string) => {\n const { action, options } = actions[menuId];\n closeMenuRef.current(\"root\");\n onClose(action, options);\n },\n [actions, onClose]\n );\n\n const { closeMenu, listItemProps, openMenu, openMenus, handleRender } =\n useCascade({\n id,\n onActivate: handleActivate,\n onMouseEnterItem: handleMouseEnterItem,\n position,\n });\n closeMenuRef.current = closeMenu;\n\n console.log({ openMenus });\n\n const handleClose = useCallback(() => {\n closeMenu();\n onClose();\n }, [closeMenu, onClose]);\n\n useClickAway({\n containerClassName: \"vuuMenuList\",\n onClose: handleClose,\n isOpen: openMenus.length > 0,\n });\n\n const handleOpenMenu = (id: string) => {\n const itemId = getItemId(id);\n const menuId = getMenuId(itemId);\n navigatingWithKeyboard.current = true;\n openMenu(menuId, itemId);\n };\n const handleCloseMenu = () => {\n navigatingWithKeyboard.current = true;\n closeMenu();\n };\n\n const handleHighlightMenuItem = () => {\n // console.log(`highlight ${idx}`);\n };\n\n const lastMenu = openMenus.length - 1;\n\n const getChildMenuIndex = (i: number) => {\n if (i >= lastMenu) {\n return -1;\n } else {\n const { id: menuId } = openMenus[i + 1];\n const pos = menuId.lastIndexOf(\".\");\n const idx =\n pos === -1 ? parseInt(menuId, 10) : parseInt(menuId.slice(-pos), 10);\n return idx;\n }\n };\n\n return (\n <>\n {openMenus.map(({ id: menuId, left, top }, i) => {\n const childMenuIndex = getChildMenuIndex(i);\n\n return (\n <Portal key={i} x={left} y={top} onRender={handleRender}>\n <MenuList\n {...menuListProps}\n activatedByKeyboard={navigatingWithKeyboard.current}\n childMenuShowing={childMenuIndex}\n className={className}\n id={id}\n menuId={menuId}\n isRoot={i === 0}\n key={i}\n listItemProps={listItemProps}\n onActivate={handleActivate}\n onHighlightMenuItem={handleHighlightMenuItem}\n onCloseMenu={handleCloseMenu}\n onOpenMenu={handleOpenMenu}\n style={style}\n >\n {menus[menuId]}\n </MenuList>\n </Portal>\n );\n })}\n </>\n );\n};\n\nContextMenu.displayName = \"ContextMenu\";\n", "import React, {\n FC,\n HTMLAttributes,\n ReactElement,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport cx from \"classnames\";\nimport { useIdMemo as useId } from \"@salt-ds/core\";\nimport { useKeyboardNavigation } from \"./use-keyboard-navigation\";\nimport { isMenuItemGroup } from \"./use-items-with-ids\";\n\nimport \"./MenuList.css\";\n\nconst classBase = \"vuuMenuList\";\n\nexport const Separator = () => <li className=\"vuuMenuItem-divider\" />;\n\nexport interface MenuItemGroupProps {\n children: ReactElement<MenuItemProps>[];\n label: string;\n}\n\nexport interface MenuItemProps extends HTMLAttributes<HTMLDivElement> {\n action?: string;\n idx?: number;\n options?: unknown;\n}\n\n// Purely used as markers, props will be extracted\nexport const MenuItemGroup: FC<MenuItemGroupProps> = () => null;\n// eslint-disable-next-line no-unused-vars\nexport const MenuItem = ({ children, idx, ...props }: MenuItemProps) => {\n return <div {...props}>{children}</div>;\n};\n\nconst hasIcon = (child: ReactElement) => child.props[\"data-icon\"];\n\nexport interface MenuListProps extends HTMLAttributes<HTMLDivElement> {\n activatedByKeyboard?: boolean;\n children: ReactElement[];\n childMenuShowing?: number;\n highlightedIdx?: number;\n isRoot?: boolean;\n listItemProps?: Partial<MenuItemProps>;\n menuId?: string;\n onActivate?: (menuId: string) => void;\n onCloseMenu: (idx: number) => void;\n onOpenMenu?: (menuId: string) => void;\n onHighlightMenuItem?: (idx: number) => void;\n}\n\nconst MenuList = ({\n activatedByKeyboard,\n childMenuShowing = -1,\n children,\n className,\n highlightedIdx: highlightedIdxProp,\n id: idProp,\n isRoot,\n listItemProps,\n menuId,\n onHighlightMenuItem,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n ...props\n}: MenuListProps) => {\n const id = useId(idProp);\n const root = useRef<HTMLDivElement>(null);\n\n // The id generation be,ongs in useIttemsWithIds\n const mapIdxToId = useMemo(() => new Map(), []);\n\n const handleOpenMenu = (idx: number) => {\n const el = root.current?.querySelector(`:scope > [data-idx='${idx}']`);\n el?.id && onOpenMenu?.(el.id);\n };\n\n const handleActivate = (idx: number) => {\n const el = root.current?.querySelector(`:scope > [data-idx='${idx}']`);\n el?.id && onActivate?.(el.id);\n };\n\n const { focusVisible, highlightedIndex, listProps } = useKeyboardNavigation({\n count: React.Children.count(children),\n highlightedIndex: highlightedIdxProp,\n onActivate: handleActivate,\n onHighlight: onHighlightMenuItem,\n onOpenMenu: handleOpenMenu,\n onCloseMenu,\n });\n\n const appliedFocusVisible = childMenuShowing == -1 ? focusVisible : -1;\n\n useLayoutEffect(() => {\n if (childMenuShowing === -1 && activatedByKeyboard) {\n root.current?.focus();\n }\n }, [activatedByKeyboard, childMenuShowing]);\n\n const getActiveDescendant = () =>\n highlightedIndex === undefined || highlightedIndex === -1\n ? undefined\n : mapIdxToId.get(highlightedIndex);\n\n return (\n <div\n {...props}\n {...listProps}\n aria-activedescendant={getActiveDescendant()}\n className={cx(classBase, className, {\n [`${classBase}-childMenuShowing`]: childMenuShowing !== -1,\n })}\n data-root={isRoot || undefined}\n id={`${id}-${menuId}`}\n ref={root}\n role=\"menu\"\n tabIndex={0}\n >\n {renderContent()}\n </div>\n );\n\n function renderContent() {\n const propsCommonToAllListItems = {\n ...listItemProps,\n role: \"menuitem\",\n };\n\n const maybeIcon = (\n childElement: ReactElement,\n withIcon: boolean,\n iconName?: string\n ) =>\n withIcon\n ? [\n <span\n className=\"vuuIconContainer\"\n data-icon={iconName}\n key=\"icon\"\n />,\n ].concat(childElement)\n : childElement;\n\n function addClonedChild(\n list: ReactElement[],\n child: ReactElement,\n idx: number,\n withIcon: boolean\n ) {\n const {\n children,\n className,\n \"data-icon\": iconName,\n id: itemId,\n hasSeparator,\n label,\n ...props\n } = child.props;\n const hasSubMenu = isMenuItemGroup(child);\n const subMenuShowing = hasSubMenu && childMenuShowing === idx;\n const ariaControls = subMenuShowing ? `${id}-${itemId}` : undefined;\n\n list.push(\n <MenuItem\n {...props}\n {...propsCommonToAllListItems}\n {...getMenuItemProps(\n `${id}-${menuId}`,\n itemId,\n idx,\n child.key ?? itemId,\n highlightedIndex,\n appliedFocusVisible,\n className,\n hasSeparator\n )}\n aria-controls={ariaControls}\n aria-haspopup={hasSubMenu || undefined}\n aria-expanded={subMenuShowing || undefined}\n >\n {hasSubMenu\n ? maybeIcon(label, withIcon, iconName)\n : maybeIcon(children, withIcon, iconName)}\n </MenuItem>\n );\n // mapIdxToId.set(idx, itemId);\n }\n\n const listItems: ReactElement[] = [];\n\n if (children.length > 0) {\n const withIcon = children.some(hasIcon);\n\n children.forEach((child, idx) => {\n addClonedChild(listItems, child, idx, withIcon);\n });\n }\n\n return listItems;\n }\n};\n\nconst getMenuItemProps = (\n baseId: string,\n itemId: string,\n idx: number,\n key: string,\n highlightedIdx: number,\n focusVisible: number,\n className: string,\n hasSeparator: boolean\n) => ({\n id: `${baseId}-${itemId}`,\n key: key ?? idx,\n \"data-idx\": idx,\n \"data-highlighted\": idx === highlightedIdx || undefined,\n className: cx(\"vuuMenuItem\", className, {\n \"vuuMenuItem-separator\": hasSeparator,\n focusVisible: focusVisible === idx,\n }),\n});\n\nMenuList.displayName = \"MenuList\";\nexport default MenuList;\n", "import {\n FocusEvent,\n KeyboardEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { hasPopup, isRoot } from \"./utils\";\nimport { isNavigationKey } from \"./key-code\";\n\nexport interface KeyboardNavigationProps {\n autoHighlightFirstItem?: boolean;\n count: number;\n highlightedIndex?: number;\n onActivate: (idx: number) => void;\n onHighlight?: (idx: number) => void;\n onCloseMenu: (idx: number) => void;\n onOpenMenu: (idx: number) => void;\n}\n\nexport interface KeyboardHookListProps {\n // onBlur: (evt: FocusEvent) => void;\n onFocus: (evt: FocusEvent) => void;\n onKeyDown: (evt: KeyboardEvent) => void;\n onMouseDownCapture: () => void;\n onMouseMove: () => void;\n onMouseLeave: () => void;\n}\n\nexport interface NavigationHookResult {\n focusVisible: number;\n controlledHighlighting: boolean;\n highlightedIndex: number;\n setHighlightedIndex: (idx: number) => void;\n // keyboardNavigation: RefObject<boolean>;\n listProps: KeyboardHookListProps;\n setIgnoreFocus: (ignoreFocus: boolean) => void;\n}\n\n// we need a way to set highlightedIdx when selection changes\nexport const useKeyboardNavigation = ({\n autoHighlightFirstItem = false,\n count,\n highlightedIndex: highlightedIndexProp,\n onActivate,\n onHighlight,\n // onKeyDown,\n onCloseMenu,\n onOpenMenu,\n}: KeyboardNavigationProps): NavigationHookResult => {\n // const prevCount = useRef(count);\n const highlightedIndexRef = useRef(\n highlightedIndexProp ?? autoHighlightFirstItem ? 0 : -1\n );\n const [, forceRender] = useState<unknown>(null);\n const controlledHighlighting = highlightedIndexProp !== undefined;\n\n // count will not work for this, as it will change when we expand collapse groups\n // if (count !== prevCount.current) {\n // prevCount.current = count;\n // if (highlightedIndexRef.current !== -1){\n // highlightedIndexRef.current = autoHighlightFirstItem ? 0 : -1;\n // }\n // }\n\n const setHighlightedIdx = useCallback(\n (idx) => {\n highlightedIndexRef.current = idx;\n onHighlight?.(idx);\n forceRender({});\n },\n [onHighlight]\n );\n\n const setHighlightedIndex = useCallback(\n (idx) => {\n if (idx !== highlightedIndexRef.current) {\n if (!controlledHighlighting) {\n setHighlightedIdx(idx);\n }\n }\n },\n [controlledHighlighting, setHighlightedIdx]\n );\n\n // does this belong here or should it be a method passed in?\n const keyBoardNavigation = useRef(true);\n const ignoreFocus = useRef(false);\n const setIgnoreFocus = (value: boolean) => (ignoreFocus.current = value);\n\n const highlightedIndex = controlledHighlighting\n ? highlightedIndexProp\n : highlightedIndexRef.current;\n\n const navigateChildldItems = useCallback(\n (e: KeyboardEvent) => {\n const nextIdx = nextItemIdx(count, e.key, highlightedIndexRef.current);\n if (nextIdx !== highlightedIndexRef.current) {\n setHighlightedIndex(nextIdx);\n }\n },\n [count, setHighlightedIndex]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (isNavigationKey(e)) {\n e.preventDefault();\n e.stopPropagation();\n keyBoardNavigation.current = true;\n navigateChildldItems(e);\n } else if (\n (e.key === \"ArrowRight\" || e.key === \"Enter\") &&\n hasPopup(e.target as HTMLElement, highlightedIndex)\n ) {\n onOpenMenu(highlightedIndex);\n } else if (e.key === \"ArrowLeft\" && !isRoot(e.target as HTMLElement)) {\n onCloseMenu(highlightedIndex);\n } else if (e.key === \"Enter\") {\n onActivate && onActivate(highlightedIndex);\n }\n },\n [\n highlightedIndex,\n navigateChildldItems,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n ]\n );\n\n const listProps: KeyboardHookListProps = useMemo(\n () => ({\n onFocus: () => {\n if (highlightedIndex === -1) {\n setHighlightedIdx(0);\n }\n },\n onKeyDown: handleKeyDown,\n onMouseDownCapture: () => {\n keyBoardNavigation.current = false;\n setIgnoreFocus(true);\n },\n\n // onMouseEnter would seem less expensive but it misses some cases\n onMouseMove: () => {\n if (keyBoardNavigation.current) {\n keyBoardNavigation.current = false;\n }\n },\n onMouseLeave: () => {\n // label === 'ParsedInput' && console.log(`%c[useKeyboardNavigationHook]<${label}> onMouseLeave`,'color:brown')\n keyBoardNavigation.current = true;\n setIgnoreFocus(false);\n setHighlightedIndex(-1);\n },\n }),\n [\n highlightedIndex,\n setHighlightedIndex,\n navigateChildldItems,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n setHighlightedIdx,\n ]\n );\n\n // label === 'ParsedInput' && console.log(`%cuseNavigationHook<${label}>\n // highlightedIdxProp= ${highlightedIdxProp},\n // highlightedIndexRef= ${highlightedIndexRef.current},\n // %chighlightedIdx= ${highlightedIdx}`, 'color: brown','color: brown;font-weight: bold;')\n\n return {\n focusVisible: keyBoardNavigation.current ? highlightedIndex : -1,\n controlledHighlighting,\n highlightedIndex,\n setHighlightedIndex: setHighlightedIndex,\n // keyBoardNavigation,\n listProps,\n setIgnoreFocus,\n };\n};\n\n// need to be able to accommodate disabled items\nfunction nextItemIdx(count: number, key: string, idx: number) {\n if (key === \"ArrowUp\") {\n if (idx > 0) {\n return idx - 1;\n } else {\n return idx;\n }\n } else {\n if (idx === null) {\n return 0;\n } else if (idx === count - 1) {\n return idx;\n } else {\n return idx + 1;\n }\n }\n}\n", "export const isRoot = (el: HTMLElement) =>\n el.closest(`[data-root='true']`) !== null;\n\nexport const hasPopup = (el: HTMLElement, idx: number) =>\n (el.ariaHasPopup === \"true\" && el.dataset?.idx === `${idx}`) ||\n el.querySelector(`:scope > [data-idx='${idx}'][aria-haspopup='true']`) !==\n null;\n", "function union(set1: Set<string>, ...sets: Set<string>[]) {\n const result = new Set(set1);\n for (const set of sets) {\n for (const element of set) {\n result.add(element);\n }\n }\n return result;\n}\n\nexport const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const Backspace = \"Backspace\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Delete = \"Delete\";\n\nconst actionKeys = new Set([Enter, Delete]);\nconst focusKeys = new Set([\"Tab\"]);\n// const navigationKeys = new Set([\"Home\", \"End\", \"ArrowRight\", \"ArrowLeft\",\"ArrowDown\", \"ArrowUp\"]);\nconst arrowLeftRightKeys = new Set([\"ArrowRight\", \"ArrowLeft\"]);\nconst verticalNavigationKeys = new Set([\"Home\", \"End\", \"ArrowDown\", \"ArrowUp\"]);\nconst horizontalNavigationKeys = new Set([\n \"Home\",\n \"End\",\n \"ArrowRight\",\n \"ArrowLeft\",\n]);\nconst functionKeys = new Set([\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n]);\nconst specialKeys = union(\n actionKeys,\n horizontalNavigationKeys,\n verticalNavigationKeys,\n arrowLeftRightKeys,\n functionKeys,\n focusKeys\n);\nexport const isCharacterKey = (evt: KeyboardEvent) => {\n if (specialKeys.has(evt.key)) {\n return false;\n }\n if (typeof evt.which === \"number\" && evt.which > 0) {\n return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which !== 8;\n }\n};\n\nexport const isNavigationKey = (\n { key }: { key: string },\n orientation = \"vertical\"\n) => {\n const navigationKeys =\n orientation === \"vertical\"\n ? verticalNavigationKeys\n : horizontalNavigationKeys;\n return navigationKeys.has(key);\n};\n", "import React, { ReactElement, useCallback, useMemo } from \"react\";\nimport { MenuItemGroup, Separator } from \"./MenuList\";\n\nexport const isMenuItemGroup = (child: ReactElement) =>\n child.type === MenuItemGroup || !!child.props[\"data-group\"];\n\ntype Menus = { [key: string]: ReactElement[] };\ntype Actions = { [key: string]: { action: string; options?: unknown } };\n\nexport const useItemsWithIds = (\n childrenProp: ReactElement[]\n): [Menus, Actions] => {\n const normalizeChildren = useCallback(() => {\n const collectChildren = (\n children: ReactElement[],\n path = \"root\",\n menus: Menus = {},\n actions: Actions = {}\n ) => {\n const list: ReactElement[] = (menus[path] = []);\n let idx = 0;\n let hasSeparator = false;\n\n React.Children.forEach(children, (child) => {\n if (child.type === Separator) {\n hasSeparator = true;\n } else {\n const group = isMenuItemGroup(child);\n const childPath = path === \"root\" ? `${idx}` : `${path}.${idx}`;\n const {\n props: { action, options },\n } = child;\n const { childWithId, grandChildren } = assignId(\n child,\n childPath,\n group,\n hasSeparator\n );\n list.push(childWithId);\n if (grandChildren) {\n collectChildren(grandChildren, childPath, menus, actions);\n } else {\n actions[childPath] = { action, options };\n }\n idx += 1;\n hasSeparator = false;\n }\n });\n return [menus, actions];\n };\n\n const assignId = (\n child: ReactElement,\n path: string,\n group: boolean,\n hasSeparator = false\n ) => {\n const {\n props: { children },\n } = child;\n return {\n childWithId: React.cloneElement(child, {\n hasSeparator,\n id: `${path}`,\n key: path,\n children: group ? undefined : children,\n }),\n grandChildren: group ? children : undefined,\n };\n };\n\n return collectChildren(childrenProp);\n }, [childrenProp]);\n\n const [menus, actions] = useMemo(\n () => normalizeChildren(),\n [normalizeChildren]\n );\n\n return [menus, actions] as [Menus, Actions];\n};\n", "import {\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { closestListItem, listItemIndex } from \"./list-dom-utils\";\nimport { MenuItemProps } from \"./MenuList\";\n// import {mousePosition} from './aim/utils';\n// import {aiming} from './aim/aim';\n\nconst nudge = (\n menus: RuntimeMenuDescriptor[],\n distance: number,\n pos: \"left\" | \"top\"\n) => {\n return menus.map((m, i) =>\n i === menus.length - 1\n ? {\n ...m,\n [pos]: m[pos] - distance,\n }\n : m\n );\n};\nconst nudgeLeft = (menus: RuntimeMenuDescriptor[], distance: number) =>\n nudge(menus, distance, \"left\");\nconst nudgeUp = (menus: RuntimeMenuDescriptor[], distance: number) =>\n nudge(menus, distance, \"top\");\n\nconst flipSides = (id: string, menus: RuntimeMenuDescriptor[]) => {\n const [parentMenu, menu] = menus.slice(-2);\n const el = document.getElementById(`${id}-${menu.id}`);\n if (el === null) {\n throw Error(`useCascade.flipSides element with id ${menu.id} not found`);\n }\n const { width } = el.getBoundingClientRect();\n return menus.map((m) =>\n m === menu\n ? {\n ...m,\n left: parentMenu.left - (width - 2),\n }\n : m\n );\n};\n\n// const closedNode = (el: HTMLElement) =>\n// el.ariaHasPopup === \"true\" && el.ariaExpanded !== \"true\";\nconst getPosition = (el: HTMLElement, openMenus: RuntimeMenuDescriptor[]) => {\n const [{ left, top: menuTop }] = openMenus.slice(-1);\n // const {top, right, bottom, left} = el.getBoundingClientRect();\n // this will not work for MenuList within window, we need the\n // const {offsetLeft: left, offsetTop: menuTop} = el.closest('.vuuMenuList');\n const { offsetWidth: width, offsetTop: top } = el;\n return { left: left + width, top: top + menuTop };\n};\n\nexport type RuntimeMenuDescriptor = {\n id: string;\n left: number;\n top: number;\n};\n\nexport const getItemId = (id: string) => {\n const pos = id.lastIndexOf(\"-\");\n return pos === -1 ? id : id.slice(pos + 1);\n};\n\nexport const getMenuId = (id: string) => {\n const itemId = getItemId(id);\n const pos = itemId.lastIndexOf(\".\");\n return pos > -1 ? itemId.slice(0, pos) : \"root\";\n};\n\nconst getMenuDepth = (id: string) => {\n let count = 0,\n pos = id.indexOf(\".\", 0);\n while (pos !== -1) {\n count += 1;\n pos = id.indexOf(\".\", pos + 1);\n }\n return count;\n};\n\nconst identifyItem = (el: HTMLElement) => ({\n menuId: getMenuId(el.id),\n itemId: getItemId(el.id),\n isGroup: el.ariaHasPopup === \"true\",\n isOpen: el.ariaExpanded === \"true\",\n level: getMenuDepth(el.id),\n});\n\nexport interface CascadeHookProps {\n id: string;\n onActivate: (menuId: string) => void;\n onMouseEnterItem: (evt: MouseEvent, itemId: string) => void;\n position: { x: number; y: number };\n}\n\nexport interface CascadeHooksResult {\n closeMenu: () => void;\n handleRender: () => void;\n listItemProps: Partial<MenuItemProps>;\n openMenu: (menuId?: string, itemId?: string) => void;\n openMenus: RuntimeMenuDescriptor[];\n}\n\ntype MenuStatus = \"no-popup\" | \"popup-open\" | \"pending-close\" | \"popup-pending\";\ntype MenuState = { [key: string]: MenuStatus };\n\nexport const useCascade = ({\n id,\n onActivate,\n onMouseEnterItem,\n position: { x: posX, y: posY },\n}: CascadeHookProps): CascadeHooksResult => {\n const [, forceRefresh] = useState({});\n const openMenus = useRef<RuntimeMenuDescriptor[]>([\n { id: \"root\", left: posX, top: posY },\n ]);\n\n const setOpenMenus = useCallback((menus: RuntimeMenuDescriptor[]) => {\n openMenus.current = menus;\n forceRefresh({});\n }, []);\n\n const menuOpenPendingTimeout = useRef<number | undefined>();\n const menuClosePendingTimeout = useRef<number | undefined>();\n const menuState = useRef<MenuState>({ root: \"no-popup\" });\n const prevLevel = useRef(0);\n\n // const prevAim = useRef({mousePos: null, distance: true});\n\n const openMenu = useCallback(\n (menuId = \"root\", itemId = null, listItemEl = null) => {\n if (menuId === \"root\" && itemId === null) {\n setOpenMenus([{ id: \"root\", left: posX, top: posY }]);\n } else {\n menuState.current[menuId] = \"popup-open\";\n const doc = listItemEl ? listItemEl.ownerDocument : document;\n const el = doc.getElementById(`${id}-${menuId}-${itemId}`);\n const { left, top } = getPosition(el, openMenus.current);\n setOpenMenus(openMenus.current.concat({ id: itemId, left, top }));\n }\n },\n [id, posX, posY, setOpenMenus]\n );\n\n const closeMenu = useCallback(\n (menuId?: string) => {\n if (menuId === \"root\") {\n setOpenMenus([]);\n } else {\n setOpenMenus(openMenus.current.slice(0, -1));\n }\n },\n [setOpenMenus]\n );\n\n const closeMenus = useCallback(\n (menuId, itemId) => {\n const menus = openMenus.current.slice();\n let { id: lastMenuId } = menus[menus.length - 1];\n while (menus.length > 1 && !itemId.startsWith(lastMenuId)) {\n const parentMenuId = getMenuId(lastMenuId);\n menus.pop();\n menuState.current[lastMenuId] = \"no-popup\";\n menuState.current[parentMenuId] = \"no-popup\";\n ({ id: lastMenuId } = menus[menus.length - 1]);\n }\n if (menus.length < openMenus.current.length) {\n setOpenMenus(menus);\n }\n },\n [setOpenMenus]\n );\n\n const scheduleOpen = useCallback(\n (menuId, itemId, listItemEl) => {\n if (menuOpenPendingTimeout.current) {\n clearTimeout(menuOpenPendingTimeout.current);\n }\n menuOpenPendingTimeout.current = window.setTimeout(() => {\n console.log(`scheduleOpen timed out opening ${itemId}`);\n closeMenus(menuId, itemId);\n menuState.current[menuId] = \"popup-open\";\n menuState.current[itemId] = \"no-popup\";\n openMenu(menuId, itemId, listItemEl);\n }, 400);\n },\n [closeMenus, openMenu]\n );\n\n const scheduleClose = useCallback(\n (openMenuId, menuId, itemId) => {\n console.log(\n `scheduleClose openMenuId ${openMenuId} menuId ${menuId} itemId ${itemId}`\n );\n menuState.current[openMenuId] = \"pending-close\";\n menuClosePendingTimeout.current = window.setTimeout(() => {\n closeMenus(menuId, itemId);\n }, 400);\n },\n [closeMenus]\n );\n\n const handleRender = useCallback(() => {\n const { current: menus } = openMenus;\n const [menu] = menus.slice(-1);\n const el = document.getElementById(`${id}-${menu.id}`);\n if (el) {\n const { right, bottom } = el.getBoundingClientRect();\n const { clientHeight, clientWidth } = document.body;\n if (right > clientWidth) {\n const newMenus =\n menus.length > 1\n ? flipSides(id, menus)\n : nudgeLeft(menus, right - clientWidth);\n setOpenMenus(newMenus);\n } else if (bottom > clientHeight) {\n const newMenus = nudgeUp(menus, bottom - clientHeight);\n setOpenMenus(newMenus);\n }\n }\n }, [id, setOpenMenus]);\n\n const listItemProps: Partial<MenuItemProps> = useMemo(\n () => ({\n onMouseEnter: (evt: MouseEvent) => {\n const listItemEl = closestListItem(evt.target as HTMLElement);\n const { menuId, itemId, isGroup, isOpen, level } =\n identifyItem(listItemEl);\n const sameLevel = prevLevel.current === level;\n const {\n current: { [menuId]: state },\n } = menuState;\n prevLevel.current = level;\n\n // console.log(\n // `%conMouseEnter #${menuId}[${itemId}] @${level}\n // isGroup ${isGroup} isOpen ${isOpen}\n // openMenus [${openMenus.current.join(',')}]\n // state='${JSON.stringify(menuState.current)}`,\n // 'color: green; font-weight: bold;'\n // );\n\n if (state === \"no-popup\" && isGroup) {\n // Shouldn;t we always set this ?\n menuState.current[menuId] = \"popup-pending\";\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (state === \"popup-pending\" && !isGroup) {\n menuState.current[menuId] = \"no-popup\";\n clearTimeout(menuOpenPendingTimeout.current);\n menuOpenPendingTimeout.current = undefined;\n } else if (state === \"popup-pending\" && isGroup) {\n clearTimeout(menuOpenPendingTimeout.current);\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (state === \"popup-open\") {\n const [{ id: parentMenuId }, { id: openMenuId }] =\n openMenus.current.slice(-2);\n if (\n parentMenuId === menuId &&\n menuState.current[openMenuId] !== \"pending-close\" &&\n sameLevel\n ) {\n scheduleClose(openMenuId, menuId, itemId);\n if (isGroup && !isOpen) {\n scheduleOpen(menuId, itemId, listItemEl);\n }\n } else if (\n parentMenuId === menuId &&\n isGroup &&\n itemId !== openMenuId &&\n menuState.current[openMenuId] === \"pending-close\"\n ) {\n // if there is already an item queued for opening cancel it\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (isGroup) {\n closeMenus(menuId, itemId);\n scheduleOpen(menuId, itemId, listItemEl);\n } else if (\n !(menuState.current[openMenuId] === \"pending-close\" && sameLevel)\n ) {\n closeMenus(menuId, itemId);\n }\n }\n\n if (state === \"pending-close\") {\n if (menuOpenPendingTimeout.current) {\n clearTimeout(menuOpenPendingTimeout.current);\n menuOpenPendingTimeout.current = undefined;\n }\n clearTimeout(menuClosePendingTimeout.current);\n menuClosePendingTimeout.current = undefined;\n menuState.current[menuId] = \"popup-open\";\n }\n\n onMouseEnterItem(evt, itemId);\n },\n\n onClick: (evt: SyntheticEvent) => {\n const targetElement = evt.target as HTMLElement;\n const listItemEl = closestListItem(targetElement);\n const idx = listItemIndex(listItemEl);\n console.log(\n `list item click [${idx}] hasPopup ${listItemEl.ariaHasPopup}`\n );\n if (listItemEl.ariaHasPopup === \"true\") {\n if (listItemEl.ariaExpanded !== \"true\") {\n openMenu(idx);\n } else {\n // do nothing\n }\n } else {\n onActivate(getItemId(listItemEl.id));\n }\n },\n }),\n [\n closeMenus,\n onActivate,\n\n onMouseEnterItem,\n openMenu,\n scheduleClose,\n scheduleOpen,\n ]\n );\n\n return {\n closeMenu,\n handleRender,\n listItemProps,\n openMenu,\n openMenus: openMenus.current,\n };\n};\n", "// const listItemElement = (listEl: HTMLElement, listItemIdx: number) =>\n// listEl.querySelector(`:scope > [data-idx=\"${listItemIdx}\"]`);\n\nexport function listItemIndex(listItemEl: HTMLElement) {\n if (listItemEl) {\n const idx = listItemEl.dataset.idx;\n if (idx) {\n return parseInt(idx, 10);\n // eslint-disable-next-line no-cond-assign\n } else if (listItemEl.ariaPosInSet) {\n return parseInt(listItemEl.ariaPosInSet, 10) - 1;\n }\n }\n}\n\nconst listItemId = (el: HTMLElement | null | undefined) => el?.id;\n\nexport const closestListItem = (el: HTMLElement | null | undefined) =>\n el?.closest(\"[data-idx],[aria-posinset]\") as HTMLElement;\n\nexport const closestListItemId = (el: HTMLElement) =>\n listItemId(closestListItem(el));\n\nexport const closestListItemIndex = (el: HTMLElement) =>\n listItemIndex(closestListItem(el));\n", "import { useEffect } from \"react\";\n\nexport interface ClickAwayHookProps {\n containerClassName: string;\n isOpen: boolean;\n onClose?: (target: string) => void;\n}\n\nexport const useClickAway = ({\n containerClassName,\n isOpen,\n onClose,\n}: ClickAwayHookProps) => {\n useEffect(() => {\n let clickHandler: (evt: MouseEvent) => void;\n if (isOpen) {\n clickHandler = (evt) => {\n const target = evt.target as HTMLElement;\n const container = target.closest(`.${containerClassName}`);\n if (container === null) {\n onClose?.(\"root\");\n }\n };\n\n document.body.addEventListener(\"click\", clickHandler, true);\n }\n\n return () => {\n if (clickHandler) {\n document.body.removeEventListener(\"click\", clickHandler, true);\n }\n };\n }, [containerClassName, isOpen, onClose]);\n};\n", "import { createContext, ReactNode, useCallback, useMemo } from \"react\";\n\nexport type MenuActionHandler = (\n type: string,\n options: unknown\n) => boolean | undefined;\nexport type MenuBuilder<L = string, O = unknown> = (\n location: L,\n options: O\n) => ContextMenuItemDescriptor[];\n\nexport interface ContextMenuContext {\n menuBuilders: MenuBuilder[];\n menuActionHandler: MenuActionHandler;\n}\n\nexport const ContextMenuContext = createContext<ContextMenuContext | null>(\n null\n);\n\nexport interface ContextMenuItemBase {\n icon?: string;\n label: string;\n location?: string;\n}\n\nexport interface ContextMenuLeafItemDescriptor extends ContextMenuItemBase {\n action: string;\n options?: unknown;\n}\n\nexport interface ContextMenuGroupItemDescriptor extends ContextMenuItemBase {\n children: ContextMenuItemDescriptor[];\n}\n\nexport type ContextMenuItemDescriptor =\n | ContextMenuLeafItemDescriptor\n | ContextMenuGroupItemDescriptor;\n\nexport const isGroupMenuItemDescriptor = (\n menuItem?: ContextMenuItemDescriptor\n): menuItem is ContextMenuGroupItemDescriptor =>\n menuItem !== undefined && \"children\" in menuItem;\n\nexport interface ContextMenuProviderProps {\n children: ReactNode;\n label?: string;\n menuActionHandler?: MenuActionHandler;\n menuBuilder: MenuBuilder;\n}\n\ninterface ProviderProps extends ContextMenuProviderProps {\n context: ContextMenuContext | null;\n}\n\nconst Provider = ({\n children,\n context,\n menuActionHandler,\n menuBuilder,\n}: ProviderProps) => {\n const menuBuilders = useMemo(() => {\n if (context?.menuBuilders && menuBuilder) {\n return context.menuBuilders.concat(menuBuilder);\n } else if (menuBuilder) {\n return [menuBuilder];\n } else {\n return context?.menuBuilders || [];\n }\n }, [context, menuBuilder]);\n\n const handleMenuAction = useCallback(\n (type, options) => {\n if (menuActionHandler?.(type, options)) {\n return true;\n }\n\n if (context?.menuActionHandler?.(type, options)) {\n return true;\n }\n },\n [context, menuActionHandler]\n );\n\n return (\n <ContextMenuContext.Provider\n value={{\n menuActionHandler: handleMenuAction,\n menuBuilders,\n }}\n >\n {children}\n </ContextMenuContext.Provider>\n );\n};\n\n// Need an option for local menu to override higher-level menu, rather than extend\nexport const ContextMenuProvider = ({\n children,\n label,\n menuActionHandler,\n menuBuilder,\n}: ContextMenuProviderProps) => {\n return (\n <ContextMenuContext.Consumer>\n {(parentContext) => (\n <Provider\n context={parentContext}\n label={label}\n menuActionHandler={menuActionHandler}\n menuBuilder={menuBuilder}\n >\n {children}\n </Provider>\n )}\n </ContextMenuContext.Consumer>\n );\n};\n", "// The menuBuilder will always be supplied by the code that will display the local\n// context menu. It will be passed all configured menu descriptors. It is free to\n\nimport { MouseEvent, useCallback, useContext } from \"react\";\nimport { PopupService } from \"../popup\";\nimport {\n ContextMenuContext,\n ContextMenuItemDescriptor,\n isGroupMenuItemDescriptor,\n MenuActionHandler,\n MenuBuilder,\n} from \"./context-menu-provider\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { MenuItem, MenuItemGroup } from \"./MenuList\";\n\n// The argument allows a top-level menuBuilder to operate outside the Contect\nexport const useContextMenu = (menuBuilder?: MenuBuilder) => {\n const ctx = useContext(ContextMenuContext);\n\n const buildMenuOptions = useCallback(\n (menuBuilders: MenuBuilder[], location, options) => {\n let results: ContextMenuItemDescriptor[] = [];\n for (const menuBuilder of menuBuilders) {\n // Maybe we should leave the concatenation to the menuBuilder, then it can control menuItem order\n results = results.concat(menuBuilder(location, options));\n }\n return results;\n },\n []\n );\n\n const handleShowContextMenu = useCallback(\n (e: MouseEvent<HTMLElement>, location: string, options: unknown) => {\n e.stopPropagation();\n e.preventDefault();\n const menuBuilders =\n ctx?.menuBuilders ?? (menuBuilder ? [menuBuilder] : undefined);\n if (Array.isArray(menuBuilders) && menuBuilders.length > 0) {\n const menuItemDescriptors = buildMenuOptions(\n menuBuilders,\n location,\n options\n );\n console.log({\n menuItemDescriptors,\n });\n if (menuItemDescriptors.length && ctx?.menuActionHandler) {\n console.log(`showContextMenu ${location}`, {\n options,\n });\n showContextMenu(e, menuItemDescriptors, ctx.menuActionHandler);\n }\n } else {\n console.warn(\n \"useContextMenu, no menuBuilders configured. These should be supplied via the ContextMenuProvider(s)\"\n );\n }\n },\n [buildMenuOptions, ctx?.menuActionHandler, ctx?.menuBuilders, menuBuilder]\n );\n\n return handleShowContextMenu;\n};\n\nconst showContextMenu = (\n e: MouseEvent<HTMLElement>,\n menuDescriptors: ContextMenuItemDescriptor[],\n handleContextMenuAction: MenuActionHandler\n) => {\n const { clientX: left, clientY: top } = e;\n const menuItems = (menuDescriptors: ContextMenuItemDescriptor[]) => {\n const fromDescriptor = (menuItem: ContextMenuItemDescriptor, i: number) =>\n isGroupMenuItemDescriptor(menuItem) ? (\n <MenuItemGroup key={i} label={menuItem.label}>\n {menuItem.children.map(fromDescriptor)}\n </MenuItemGroup>\n ) : (\n <MenuItem\n key={i}\n action={menuItem.action}\n data-icon={menuItem.icon}\n options={menuItem.options}\n >\n {menuItem.label}\n </MenuItem>\n );\n\n return menuDescriptors.map(fromDescriptor);\n };\n\n const handleClose = (menuId?: string, options?: unknown) => {\n if (menuId) {\n handleContextMenuAction(menuId, options);\n PopupService.hidePopup();\n }\n };\n\n const component = (\n <ContextMenu onClose={handleClose} position={{ x: left, y: top }}>\n {menuItems(menuDescriptors)}\n </ContextMenu>\n );\n PopupService.showPopup({ left: 0, top: 0, component });\n};\n", "import cx from \"classnames\";\nimport React, {\n createElement,\n CSSProperties,\n HTMLAttributes,\n ReactElement,\n useEffect,\n useRef,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { renderPortal } from \"../portal\";\n\nimport \"./popup-service.css\";\n\nlet _dialogOpen = false;\nconst _popups: string[] = [];\n\nfunction specialKeyHandler(e: KeyboardEvent) {\n if (e.key === \"Esc\") {\n if (_popups.length) {\n closeAllPopups();\n } else if (_dialogOpen) {\n const dialogRoot = document.body.querySelector(\".vuuDialog\");\n if (dialogRoot) {\n ReactDOM.unmountComponentAtNode(dialogRoot);\n }\n }\n }\n}\n\nfunction outsideClickHandler(e: MouseEvent) {\n if (_popups.length) {\n // onsole.log(`Popup.outsideClickHandler`);\n const popupContainers = document.body.querySelectorAll(\".vuuPopup\");\n for (let i = 0; i < popupContainers.length; i++) {\n if (popupContainers[i].contains(e.target as HTMLElement)) {\n return;\n }\n }\n closeAllPopups();\n }\n}\n\nfunction closeAllPopups() {\n if (_popups.length) {\n // onsole.log(`closeAllPopups`);\n const popupContainers = document.body.querySelectorAll(\".vuuPopup\");\n for (let i = 0; i < popupContainers.length; i++) {\n ReactDOM.unmountComponentAtNode(popupContainers[i]);\n }\n popupClosed(\"*\");\n }\n}\n\nfunction dialogOpened() {\n if (_dialogOpen === false) {\n _dialogOpen = true;\n window.addEventListener(\"keydown\", specialKeyHandler, true);\n }\n}\n\nfunction dialogClosed() {\n if (_dialogOpen) {\n _dialogOpen = false;\n window.removeEventListener(\"keydown\", specialKeyHandler, true);\n }\n}\n\nfunction popupOpened(name: string) {\n if (_popups.indexOf(name) === -1) {\n _popups.push(name);\n //onsole.log('PopupService, popup opened ' + name + ' popups : ' + _popups);\n if (_dialogOpen === false) {\n window.addEventListener(\"keydown\", specialKeyHandler, true);\n window.addEventListener(\"click\", outsideClickHandler, true);\n }\n }\n}\n\nfunction popupClosed(name: string /*, group=null*/) {\n if (_popups.length) {\n if (name === \"*\") {\n _popups.length = 0;\n } else {\n const pos = _popups.indexOf(name);\n if (pos !== -1) {\n _popups.splice(pos, 1);\n }\n }\n //onsole.log('PopupService, popup closed ' + name + ' popups : ' + _popups);\n if (_popups.length === 0 && _dialogOpen === false) {\n window.removeEventListener(\"keydown\", specialKeyHandler, true);\n window.removeEventListener(\"click\", outsideClickHandler, true);\n }\n }\n}\n\nconst PopupComponent = ({\n children,\n position,\n style,\n}: HTMLAttributes<HTMLDivElement> & {\n position?: \"above\" | \"below\" | \"\";\n style?: CSSProperties;\n}) => {\n const className = cx(\"hwPopup\", \"hwPopupContainer\", position);\n return createElement(\"div\", { className, style }, children);\n};\n\nlet incrementingKey = 1;\n\nexport class PopupService {\n static showPopup({\n name = \"anon\",\n group = \"all\",\n position = \"\",\n left = 0,\n right = \"auto\",\n top = 0,\n width = \"auto\",\n component,\n }: {\n depth?: number;\n name?: string;\n group?: string;\n position?: \"above\" | \"below\" | \"\";\n left?: number;\n right?: \"auto\" | number;\n top?: number;\n component: ReactElement;\n width?: number | \"auto\";\n }) {\n if (!component) {\n throw Error(`PopupService showPopup, no component supplied`);\n }\n popupOpened(name);\n let el = document.body.querySelector(\".vuuPopup.\" + group) as HTMLElement;\n if (el === null) {\n el = document.createElement(\"div\") as HTMLElement;\n el.className = \"vuuPopup \" + group;\n document.body.appendChild(el);\n }\n\n const style = { width };\n\n renderPortal(\n createElement(\n PopupComponent,\n { key: incrementingKey++, position, style },\n component\n ),\n el,\n left,\n top,\n () => {\n PopupService.keepWithinThePage(el, right);\n }\n );\n }\n\n static hidePopup(name = \"anon\", group = \"all\") {\n //onsole.log('PopupService.hidePopup name=' + name + ', group=' + group)\n\n if (_popups.indexOf(name) !== -1) {\n popupClosed(name);\n const popupRoot = document.body.querySelector(`.vuuPopup.${group}`);\n if (popupRoot) {\n ReactDOM.unmountComponentAtNode(popupRoot);\n }\n }\n }\n\n static keepWithinThePage(el: HTMLElement, right: number | \"auto\" = \"auto\") {\n const target = el.querySelector(\".vuuPopupContainer > *\") as HTMLElement;\n if (target) {\n const {\n top,\n left,\n width,\n height,\n right: currentRight,\n } = target.getBoundingClientRect();\n\n const w = window.innerWidth;\n const h = window.innerHeight;\n\n const overflowH = h - (top + height);\n if (overflowH < 0) {\n target.style.top = Math.round(top) + overflowH + \"px\";\n }\n\n const overflowW = w - (left + width);\n if (overflowW < 0) {\n target.style.left = Math.round(left) + overflowW + \"px\";\n }\n\n if (typeof right === \"number\" && right !== currentRight) {\n const adjustment = right - currentRight;\n target.style.left = left + adjustment + \"px\";\n }\n }\n }\n}\n\nexport class DialogService {\n static showDialog(dialog: ReactElement) {\n const containerEl = \".vuuDialog\";\n const onClose = dialog.props.onClose;\n\n dialogOpened();\n\n ReactDOM.render(\n React.cloneElement(dialog, {\n container: containerEl,\n onClose: () => {\n DialogService.closeDialog();\n if (onClose) {\n onClose();\n }\n },\n }),\n document.body.querySelector(containerEl)\n );\n }\n\n static closeDialog() {\n dialogClosed();\n const dialogRoot = document.body.querySelector(\".vuuDialog\");\n if (dialogRoot) {\n ReactDOM.unmountComponentAtNode(dialogRoot);\n }\n }\n}\n\nexport interface PopupProps {\n children: ReactElement;\n close?: boolean;\n depth: number;\n group?: string;\n name: string;\n position?: \"above\" | \"below\" | \"\";\n width: number;\n}\n\nexport const Popup = (props: PopupProps) => {\n const pendingTask = useRef<number | undefined>();\n const ref = useRef<HTMLElement>(null);\n\n const show = (props: PopupProps, boundingClientRect: DOMRect) => {\n const { name, group, depth, width } = props;\n let left: number | undefined;\n let top: number | undefined;\n\n if (pendingTask.current) {\n window.clearTimeout(pendingTask.current);\n pendingTask.current = undefined;\n }\n\n if (props.close === true) {\n PopupService.hidePopup(name, group);\n } else {\n const { position, children: component } = props;\n const {\n left: targetLeft,\n top: targetTop,\n width: clientWidth,\n bottom: targetBottom,\n } = boundingClientRect;\n\n if (position === \"below\") {\n left = targetLeft;\n top = targetBottom;\n } else if (position === \"above\") {\n left = targetLeft;\n top = targetTop;\n }\n\n pendingTask.current = window.setTimeout(() => {\n PopupService.showPopup({\n name,\n group,\n depth,\n position,\n left,\n top,\n width: width || clientWidth,\n component,\n });\n }, 10);\n }\n };\n\n useEffect(() => {\n if (ref.current) {\n const el = ref.current.parentElement;\n const boundingClientRect = el?.getBoundingClientRect();\n if (boundingClientRect) {\n show(props, boundingClientRect);\n }\n }\n\n return () => {\n PopupService.hidePopup(props.name, props.group);\n };\n }, [props]);\n\n return React.createElement(\"div\", { className: \"popup-proxy\", ref });\n};\n"],
5
+ "mappings": ";AAAA,SAAS,OAAO,SAAS,qBAAqB;AAC9C,SAAS,YAAY;AACrB,OAAO,QAAQ;AACf,SAAyB,aAAa,QAAQ,gBAAgB;;;ACH9D,SAAuB,iBAAiB,eAAe;AACvD,YAAYA,eAAc;;;ACD1B,YAAY,cAAc;AAC1B,SAAS,oBAAoB;AA0BzB;AAvBJ,IAAI,cAAc;AAElB,IAAM,qBAAqB,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,WAAW;AACzD,QAAM,KAAK,IAAI,SAAS,cAAc,KAAK;AAC3C,KAAG,YAAY,cAAc;AAC7B,KAAG,MAAM,UAAU,QAAQ,YAAY;AACvC,MAAI,SAAS,KAAK,YAAY,EAAE;AAChC,SAAO;AACT;AAEA,IAAM,qBAAqB,CAAC,GAAY,MAAe,mBAAmB,GAAG,CAAC;AAEvE,IAAM,eAAe,CAC1B,WACA,WACA,GACA,GACA,aACG;AAEH,YAAU,MAAM,UAAU,QAAQ,YAAY;AAE9C,EAAS;AAAA,IACP,oBAAC,gBAAa,gBAAe,SAAS,qBAAU;AAAA,IAChD;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,kBAAkB;;;ADtBxB,IAAM,SAAS,SAASC,QAAO;AAAA,EACpC;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ;AACF,GAAgB;AAEd,QAAM,kBAAkB,QAAQ,MAAM;AACpC,WAAO,gBAAgB;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,kBAAgB,MAAM;AACpB,iBAAa,UAAU,iBAAiB,GAAG,GAAG,QAAQ;AAAA,EACxD,GAAG,CAAC,UAAU,UAAU,iBAAiB,GAAG,CAAC,CAAC;AAE9C,kBAAgB,MAAM;AACpB,WAAO,MAAM;AA3BjB;AA4BM,UAAI,iBAAiB;AACnB,QAAS,iCAAuB,eAAe;AAC/C,YAAI,gBAAgB,UAAU,SAAS,UAAU,GAAG;AAClD,gCAAgB,kBAAhB,mBAA+B,YAAY;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAepB,SAAO;AACT;;;AEnDO,IAAM,eAAe,CAAC,YAAoB;AAC/C,QAAM,kBAAkB,iBAAiB,SAAS,IAAI,EAAE;AAAA,IACtD;AAAA,EACF;AACA,WAAS,KAAK,MAAM;AAAA,IAClB;AAAA,IACA,GAAG,mBAAmB;AAAA,EACxB;AACF;;;AH0CU,SACE,OAAAC,MADF;AA1CV,IAAM,YAAY;AAOX,IAAM,SAAS,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAmB;AACjB,QAAM,OAAO,OAAuB,IAAI;AACxC,QAAM,CAAC,IAAI,IAAI,SAAS,CAAC;AACzB,QAAM,CAAC,IAAI,IAAI,SAAS,CAAC;AAEzB,QAAM,QAAQ,YAAY,MAAM;AAC9B;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,eAAe,YAAY,MAAM;AAAA,EASvC,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SACE,gBAAAA,KAAC,UAAO,UAAU,cAAc,GAAG,MAAM,GAAG,MAC1C,0BAAAA,KAAC,SAAM,WAAW,GAAG,mBAAmB,MAAM,QAC5C,+BAAC,SAAK,GAAG,OAAO,WAAW,GAAG,WAAW,SAAS,GAAG,KAAK,MACxD;AAAA,yBAAC,WAAQ,WAAW,GAAG,oBACrB;AAAA,sBAAAA,KAAC,QAAM,iBAAM;AAAA,MACb,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,SAAS;AAAA,UACT,kBAAc;AAAA,UACd,aAAU;AAAA;AAAA,QAHN;AAAA,MAIN;AAAA,OACF;AAAA,IACC;AAAA,KACH,GACF,GACF;AAEJ;;;AIhEA,SAAS,aAAaC,cAAa;AACnC,SAAS,eAAAC,cAAa,UAAAC,eAAc;;;ACDpC,OAAOC;AAAA,EAIL,mBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,OACK;AACP,OAAOC,SAAQ;AACf,SAAS,aAAa,aAAa;;;ACTnC;AAAA,EAGE,eAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;;;ACPA,IAAM,SAAS,CAAC,OACrB,GAAG,QAAQ,oBAAoB,MAAM;AAEhC,IAAM,WAAW,CAAC,IAAiB,QAAa;AAHvD;AAIG,YAAG,iBAAiB,YAAU,QAAG,YAAH,mBAAY,SAAQ,GAAG,SACtD,GAAG,cAAc,uBAAuB,6BAA6B,MACnE;AAAA;;;ACNJ,SAAS,MAAM,SAAsB,MAAqB;AACxD,QAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,aAAW,OAAO,MAAM;AACtB,eAAW,WAAW,KAAK;AACzB,aAAO,IAAI,OAAO;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAOO,IAAM,QAAQ;AAEd,IAAM,SAAS;AAEtB,IAAM,aAAa,oBAAI,IAAI,CAAC,OAAO,MAAM,CAAC;AAC1C,IAAM,YAAY,oBAAI,IAAI,CAAC,KAAK,CAAC;AAEjC,IAAM,qBAAqB,oBAAI,IAAI,CAAC,cAAc,WAAW,CAAC;AAC9D,IAAM,yBAAyB,oBAAI,IAAI,CAAC,QAAQ,OAAO,aAAa,SAAS,CAAC;AAC9E,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,IAAM,kBAAkB,CAC7B,EAAE,IAAI,GACN,cAAc,eACX;AACH,QAAM,iBACJ,gBAAgB,aACZ,yBACA;AACN,SAAO,eAAe,IAAI,GAAG;AAC/B;;;AF7BO,IAAM,wBAAwB,CAAC;AAAA,EACpC,yBAAyB;AAAA,EACzB;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AACF,MAAqD;AAEnD,QAAM,sBAAsBC;AAAA,KAC1B,sDAAwB,0BAAyB,IAAI;AAAA,EACvD;AACA,QAAM,CAAC,EAAE,WAAW,IAAIC,UAAkB,IAAI;AAC9C,QAAM,yBAAyB,yBAAyB;AAUxD,QAAM,oBAAoBC;AAAA,IACxB,CAAC,QAAQ;AACP,0BAAoB,UAAU;AAC9B,iDAAc;AACd,kBAAY,CAAC,CAAC;AAAA,IAChB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,sBAAsBA;AAAA,IAC1B,CAAC,QAAQ;AACP,UAAI,QAAQ,oBAAoB,SAAS;AACvC,YAAI,CAAC,wBAAwB;AAC3B,4BAAkB,GAAG;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,wBAAwB,iBAAiB;AAAA,EAC5C;AAGA,QAAM,qBAAqBF,QAAO,IAAI;AACtC,QAAM,cAAcA,QAAO,KAAK;AAChC,QAAM,iBAAiB,CAAC,UAAoB,YAAY,UAAU;AAElE,QAAM,mBAAmB,yBACrB,uBACA,oBAAoB;AAExB,QAAM,uBAAuBE;AAAA,IAC3B,CAAC,MAAqB;AACpB,YAAM,UAAU,YAAY,OAAO,EAAE,KAAK,oBAAoB,OAAO;AACrE,UAAI,YAAY,oBAAoB,SAAS;AAC3C,4BAAoB,OAAO;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,OAAO,mBAAmB;AAAA,EAC7B;AAEA,QAAM,gBAAgBA;AAAA,IACpB,CAAC,MAAqB;AACpB,UAAI,gBAAgB,CAAC,GAAG;AACtB,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB,2BAAmB,UAAU;AAC7B,6BAAqB,CAAC;AAAA,MACxB,YACG,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,YACrC,SAAS,EAAE,QAAuB,gBAAgB,GAClD;AACA,mBAAW,gBAAgB;AAAA,MAC7B,WAAW,EAAE,QAAQ,eAAe,CAAC,OAAO,EAAE,MAAqB,GAAG;AACpE,oBAAY,gBAAgB;AAAA,MAC9B,WAAW,EAAE,QAAQ,SAAS;AAC5B,sBAAc,WAAW,gBAAgB;AAAA,MAC3C;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAmCC;AAAA,IACvC,OAAO;AAAA,MACL,SAAS,MAAM;AACb,YAAI,qBAAqB,IAAI;AAC3B,4BAAkB,CAAC;AAAA,QACrB;AAAA,MACF;AAAA,MACA,WAAW;AAAA,MACX,oBAAoB,MAAM;AACxB,2BAAmB,UAAU;AAC7B,uBAAe,IAAI;AAAA,MACrB;AAAA;AAAA,MAGA,aAAa,MAAM;AACjB,YAAI,mBAAmB,SAAS;AAC9B,6BAAmB,UAAU;AAAA,QAC/B;AAAA,MACF;AAAA,MACA,cAAc,MAAM;AAElB,2BAAmB,UAAU;AAC7B,uBAAe,KAAK;AACpB,4BAAoB,EAAE;AAAA,MACxB;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAOA,SAAO;AAAA,IACL,cAAc,mBAAmB,UAAU,mBAAmB;AAAA,IAC9D;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,EACF;AACF;AAGA,SAAS,YAAY,OAAe,KAAa,KAAa;AAC5D,MAAI,QAAQ,WAAW;AACrB,QAAI,MAAM,GAAG;AACX,aAAO,MAAM;AAAA,IACf,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,OAAO;AACL,QAAI,QAAQ,MAAM;AAChB,aAAO;AAAA,IACT,WAAW,QAAQ,QAAQ,GAAG;AAC5B,aAAO;AAAA,IACT,OAAO;AACL,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;;;AG1MA,OAAO,SAAuB,eAAAC,cAAa,WAAAC,gBAAe;AAGnD,IAAM,kBAAkB,CAAC,UAC9B,MAAM,SAAS,iBAAiB,CAAC,CAAC,MAAM,MAAM,YAAY;AAKrD,IAAM,kBAAkB,CAC7B,iBACqB;AACrB,QAAM,oBAAoBC,aAAY,MAAM;AAC1C,UAAM,kBAAkB,CACtB,UACA,OAAO,QACPC,SAAe,CAAC,GAChBC,WAAmB,CAAC,MACjB;AACH,YAAM,OAAwBD,OAAM,IAAI,IAAI,CAAC;AAC7C,UAAI,MAAM;AACV,UAAI,eAAe;AAEnB,YAAM,SAAS,QAAQ,UAAU,CAAC,UAAU;AAC1C,YAAI,MAAM,SAAS,WAAW;AAC5B,yBAAe;AAAA,QACjB,OAAO;AACL,gBAAM,QAAQ,gBAAgB,KAAK;AACnC,gBAAM,YAAY,SAAS,SAAS,GAAG,QAAQ,GAAG,QAAQ;AAC1D,gBAAM;AAAA,YACJ,OAAO,EAAE,QAAQ,QAAQ;AAAA,UAC3B,IAAI;AACJ,gBAAM,EAAE,aAAa,cAAc,IAAI;AAAA,YACrC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,eAAK,KAAK,WAAW;AACrB,cAAI,eAAe;AACjB,4BAAgB,eAAe,WAAWA,QAAOC,QAAO;AAAA,UAC1D,OAAO;AACL,YAAAA,SAAQ,SAAS,IAAI,EAAE,QAAQ,QAAQ;AAAA,UACzC;AACA,iBAAO;AACP,yBAAe;AAAA,QACjB;AAAA,MACF,CAAC;AACD,aAAO,CAACD,QAAOC,QAAO;AAAA,IACxB;AAEA,UAAM,WAAW,CACf,OACA,MACA,OACA,eAAe,UACZ;AACH,YAAM;AAAA,QACJ,OAAO,EAAE,SAAS;AAAA,MACpB,IAAI;AACJ,aAAO;AAAA,QACL,aAAa,MAAM,aAAa,OAAO;AAAA,UACrC;AAAA,UACA,IAAI,GAAG;AAAA,UACP,KAAK;AAAA,UACL,UAAU,QAAQ,SAAY;AAAA,QAChC,CAAC;AAAA,QACD,eAAe,QAAQ,WAAW;AAAA,MACpC;AAAA,IACF;AAEA,WAAO,gBAAgB,YAAY;AAAA,EACrC,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,CAAC,OAAO,OAAO,IAAIC;AAAA,IACvB,MAAM,kBAAkB;AAAA,IACxB,CAAC,iBAAiB;AAAA,EACpB;AAEA,SAAO,CAAC,OAAO,OAAO;AACxB;;;AJ/D+B,gBAAAC,YAAA;AAF/B,IAAMC,aAAY;AAEX,IAAM,YAAY,MAAM,gBAAAD,KAAC,QAAG,WAAU,uBAAsB;AAc5D,IAAM,gBAAwC,MAAM;AAEpD,IAAM,WAAW,CAAC,EAAE,UAAU,KAAK,GAAG,MAAM,MAAqB;AACtE,SAAO,gBAAAA,KAAC,SAAK,GAAG,OAAQ,UAAS;AACnC;AAEA,IAAM,UAAU,CAAC,UAAwB,MAAM,MAAM,WAAW;AAgBhE,IAAM,WAAW,CAAC;AAAA,EAChB;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,IAAI;AAAA,EACJ,QAAAE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAqB;AACnB,QAAM,KAAK,MAAM,MAAM;AACvB,QAAM,OAAOC,QAAuB,IAAI;AAGxC,QAAM,aAAaC,SAAQ,MAAM,oBAAI,IAAI,GAAG,CAAC,CAAC;AAE9C,QAAM,iBAAiB,CAAC,QAAgB;AA3E1C;AA4EI,UAAM,MAAK,UAAK,YAAL,mBAAc,cAAc,uBAAuB;AAC9D,8BAAI,QAAM,yCAAa,GAAG;AAAA,EAC5B;AAEA,QAAM,iBAAiB,CAAC,QAAgB;AAhF1C;AAiFI,UAAM,MAAK,UAAK,YAAL,mBAAc,cAAc,uBAAuB;AAC9D,8BAAI,QAAM,yCAAa,GAAG;AAAA,EAC5B;AAEA,QAAM,EAAE,cAAc,kBAAkB,UAAU,IAAI,sBAAsB;AAAA,IAC1E,OAAOC,OAAM,SAAS,MAAM,QAAQ;AAAA,IACpC,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ;AAAA,EACF,CAAC;AAED,QAAM,sBAAsB,oBAAoB,KAAK,eAAe;AAEpE,EAAAC,iBAAgB,MAAM;AAhGxB;AAiGI,QAAI,qBAAqB,MAAM,qBAAqB;AAClD,iBAAK,YAAL,mBAAc;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,qBAAqB,gBAAgB,CAAC;AAE1C,QAAM,sBAAsB,MAC1B,qBAAqB,UAAa,qBAAqB,KACnD,SACA,WAAW,IAAI,gBAAgB;AAErC,SACE,gBAAAN;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACH,GAAG;AAAA,MACJ,yBAAuB,oBAAoB;AAAA,MAC3C,WAAWO,IAAGN,YAAW,WAAW;AAAA,QAClC,CAAC,GAAGA,6BAA4B,GAAG,qBAAqB;AAAA,MAC1D,CAAC;AAAA,MACD,aAAWC,WAAU;AAAA,MACrB,IAAI,GAAG,MAAM;AAAA,MACb,KAAK;AAAA,MACL,MAAK;AAAA,MACL,UAAU;AAAA,MAET,wBAAc;AAAA;AAAA,EACjB;AAGF,WAAS,gBAAgB;AACvB,UAAM,4BAA4B;AAAA,MAChC,GAAG;AAAA,MACH,MAAM;AAAA,IACR;AAEA,UAAM,YAAY,CAChB,cACA,UACA,aAEA,WACI;AAAA,MACE,gBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,aAAW;AAAA;AAAA,QACP;AAAA,MACN;AAAA,IACF,EAAE,OAAO,YAAY,IACrB;AAEN,aAAS,eACP,MACA,OACA,KACA,UACA;AAvJN;AAwJM,YAAM;AAAA,QACJ,UAAAQ;AAAA,QACA,WAAAC;AAAA,QACA,aAAa;AAAA,QACb,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,GAAGC;AAAA,MACL,IAAI,MAAM;AACV,YAAM,aAAa,gBAAgB,KAAK;AACxC,YAAM,iBAAiB,cAAc,qBAAqB;AAC1D,YAAM,eAAe,iBAAiB,GAAG,MAAM,WAAW;AAE1D,WAAK;AAAA,QACH,gBAAAV;AAAA,UAAC;AAAA;AAAA,YACE,GAAGU;AAAA,YACH,GAAG;AAAA,YACH,GAAG;AAAA,cACF,GAAG,MAAM;AAAA,cACT;AAAA,cACA;AAAA,eACA,WAAM,QAAN,YAAa;AAAA,cACb;AAAA,cACA;AAAA,cACAD;AAAA,cACA;AAAA,YACF;AAAA,YACA,iBAAe;AAAA,YACf,iBAAe,cAAc;AAAA,YAC7B,iBAAe,kBAAkB;AAAA,YAEhC,uBACG,UAAU,OAAO,UAAU,QAAQ,IACnC,UAAUD,WAAU,UAAU,QAAQ;AAAA;AAAA,QAC5C;AAAA,MACF;AAAA,IAEF;AAEA,UAAM,YAA4B,CAAC;AAEnC,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,WAAW,SAAS,KAAK,OAAO;AAEtC,eAAS,QAAQ,CAAC,OAAO,QAAQ;AAC/B,uBAAe,WAAW,OAAO,KAAK,QAAQ;AAAA,MAChD,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;AAEA,IAAM,mBAAmB,CACvB,QACA,QACA,KACA,KACA,gBACA,cACA,WACA,kBACI;AAAA,EACJ,IAAI,GAAG,UAAU;AAAA,EACjB,KAAK,oBAAO;AAAA,EACZ,YAAY;AAAA,EACZ,oBAAoB,QAAQ,kBAAkB;AAAA,EAC9C,WAAWD,IAAG,eAAe,WAAW;AAAA,IACtC,yBAAyB;AAAA,IACzB,cAAc,iBAAiB;AAAA,EACjC,CAAC;AACH;AAEA,SAAS,cAAc;AACvB,IAAO,mBAAQ;;;AKlOf;AAAA,EAGE,eAAAI;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;;;ACJA,SAAS,cAAc,YAAyB;AACrD,MAAI,YAAY;AACd,UAAM,MAAM,WAAW,QAAQ;AAC/B,QAAI,KAAK;AACP,aAAO,SAAS,KAAK,EAAE;AAAA,IAEzB,WAAW,WAAW,cAAc;AAClC,aAAO,SAAS,WAAW,cAAc,EAAE,IAAI;AAAA,IACjD;AAAA,EACF;AACF;AAIO,IAAM,kBAAkB,CAAC,OAC9B,yBAAI,QAAQ;;;ADJd,IAAM,QAAQ,CACZ,OACA,UACA,QACG;AACH,SAAO,MAAM;AAAA,IAAI,CAAC,GAAG,MACnB,MAAM,MAAM,SAAS,IACjB;AAAA,MACE,GAAG;AAAA,MACH,CAAC,GAAG,GAAG,EAAE,GAAG,IAAI;AAAA,IAClB,IACA;AAAA,EACN;AACF;AACA,IAAM,YAAY,CAAC,OAAgC,aACjD,MAAM,OAAO,UAAU,MAAM;AAC/B,IAAM,UAAU,CAAC,OAAgC,aAC/C,MAAM,OAAO,UAAU,KAAK;AAE9B,IAAM,YAAY,CAAC,IAAY,UAAmC;AAChE,QAAM,CAAC,YAAY,IAAI,IAAI,MAAM,MAAM,EAAE;AACzC,QAAM,KAAK,SAAS,eAAe,GAAG,MAAM,KAAK,IAAI;AACrD,MAAI,OAAO,MAAM;AACf,UAAM,MAAM,wCAAwC,KAAK,cAAc;AAAA,EACzE;AACA,QAAM,EAAE,MAAM,IAAI,GAAG,sBAAsB;AAC3C,SAAO,MAAM;AAAA,IAAI,CAAC,MAChB,MAAM,OACF;AAAA,MACE,GAAG;AAAA,MACH,MAAM,WAAW,QAAQ,QAAQ;AAAA,IACnC,IACA;AAAA,EACN;AACF;AAIA,IAAM,cAAc,CAAC,IAAiB,cAAuC;AAC3E,QAAM,CAAC,EAAE,MAAM,KAAK,QAAQ,CAAC,IAAI,UAAU,MAAM,EAAE;AAInD,QAAM,EAAE,aAAa,OAAO,WAAW,IAAI,IAAI;AAC/C,SAAO,EAAE,MAAM,OAAO,OAAO,KAAK,MAAM,QAAQ;AAClD;AAQO,IAAM,YAAY,CAAC,OAAe;AACvC,QAAM,MAAM,GAAG,YAAY,GAAG;AAC9B,SAAO,QAAQ,KAAK,KAAK,GAAG,MAAM,MAAM,CAAC;AAC3C;AAEO,IAAM,YAAY,CAAC,OAAe;AACvC,QAAM,SAAS,UAAU,EAAE;AAC3B,QAAM,MAAM,OAAO,YAAY,GAAG;AAClC,SAAO,MAAM,KAAK,OAAO,MAAM,GAAG,GAAG,IAAI;AAC3C;AAEA,IAAM,eAAe,CAAC,OAAe;AACnC,MAAI,QAAQ,GACV,MAAM,GAAG,QAAQ,KAAK,CAAC;AACzB,SAAO,QAAQ,IAAI;AACjB,aAAS;AACT,UAAM,GAAG,QAAQ,KAAK,MAAM,CAAC;AAAA,EAC/B;AACA,SAAO;AACT;AAEA,IAAM,eAAe,CAAC,QAAqB;AAAA,EACzC,QAAQ,UAAU,GAAG,EAAE;AAAA,EACvB,QAAQ,UAAU,GAAG,EAAE;AAAA,EACvB,SAAS,GAAG,iBAAiB;AAAA,EAC7B,QAAQ,GAAG,iBAAiB;AAAA,EAC5B,OAAO,aAAa,GAAG,EAAE;AAC3B;AAoBO,IAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,EAAE,GAAG,MAAM,GAAG,KAAK;AAC/B,MAA4C;AAC1C,QAAM,CAAC,EAAE,YAAY,IAAIC,UAAS,CAAC,CAAC;AACpC,QAAM,YAAYC,QAAgC;AAAA,IAChD,EAAE,IAAI,QAAQ,MAAM,MAAM,KAAK,KAAK;AAAA,EACtC,CAAC;AAED,QAAM,eAAeC,aAAY,CAAC,UAAmC;AACnE,cAAU,UAAU;AACpB,iBAAa,CAAC,CAAC;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,QAAM,yBAAyBD,QAA2B;AAC1D,QAAM,0BAA0BA,QAA2B;AAC3D,QAAM,YAAYA,QAAkB,EAAE,MAAM,WAAW,CAAC;AACxD,QAAM,YAAYA,QAAO,CAAC;AAI1B,QAAM,WAAWC;AAAA,IACf,CAAC,SAAS,QAAQ,SAAS,MAAM,aAAa,SAAS;AACrD,UAAI,WAAW,UAAU,WAAW,MAAM;AACxC,qBAAa,CAAC,EAAE,IAAI,QAAQ,MAAM,MAAM,KAAK,KAAK,CAAC,CAAC;AAAA,MACtD,OAAO;AACL,kBAAU,QAAQ,MAAM,IAAI;AAC5B,cAAM,MAAM,aAAa,WAAW,gBAAgB;AACpD,cAAM,KAAK,IAAI,eAAe,GAAG,MAAM,UAAU,QAAQ;AACzD,cAAM,EAAE,MAAM,IAAI,IAAI,YAAY,IAAI,UAAU,OAAO;AACvD,qBAAa,UAAU,QAAQ,OAAO,EAAE,IAAI,QAAQ,MAAM,IAAI,CAAC,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,IACA,CAAC,IAAI,MAAM,MAAM,YAAY;AAAA,EAC/B;AAEA,QAAM,YAAYA;AAAA,IAChB,CAAC,WAAoB;AACnB,UAAI,WAAW,QAAQ;AACrB,qBAAa,CAAC,CAAC;AAAA,MACjB,OAAO;AACL,qBAAa,UAAU,QAAQ,MAAM,GAAG,EAAE,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,aAAaA;AAAA,IACjB,CAAC,QAAQ,WAAW;AAClB,YAAM,QAAQ,UAAU,QAAQ,MAAM;AACtC,UAAI,EAAE,IAAI,WAAW,IAAI,MAAM,MAAM,SAAS,CAAC;AAC/C,aAAO,MAAM,SAAS,KAAK,CAAC,OAAO,WAAW,UAAU,GAAG;AACzD,cAAM,eAAe,UAAU,UAAU;AACzC,cAAM,IAAI;AACV,kBAAU,QAAQ,UAAU,IAAI;AAChC,kBAAU,QAAQ,YAAY,IAAI;AAClC,SAAC,EAAE,IAAI,WAAW,IAAI,MAAM,MAAM,SAAS,CAAC;AAAA,MAC9C;AACA,UAAI,MAAM,SAAS,UAAU,QAAQ,QAAQ;AAC3C,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,eAAeA;AAAA,IACnB,CAAC,QAAQ,QAAQ,eAAe;AAC9B,UAAI,uBAAuB,SAAS;AAClC,qBAAa,uBAAuB,OAAO;AAAA,MAC7C;AACA,6BAAuB,UAAU,OAAO,WAAW,MAAM;AACvD,gBAAQ,IAAI,kCAAkC,QAAQ;AACtD,mBAAW,QAAQ,MAAM;AACzB,kBAAU,QAAQ,MAAM,IAAI;AAC5B,kBAAU,QAAQ,MAAM,IAAI;AAC5B,iBAAS,QAAQ,QAAQ,UAAU;AAAA,MACrC,GAAG,GAAG;AAAA,IACR;AAAA,IACA,CAAC,YAAY,QAAQ;AAAA,EACvB;AAEA,QAAM,gBAAgBA;AAAA,IACpB,CAAC,YAAY,QAAQ,WAAW;AAC9B,cAAQ;AAAA,QACN,4BAA4B,qBAAqB,iBAAiB;AAAA,MACpE;AACA,gBAAU,QAAQ,UAAU,IAAI;AAChC,8BAAwB,UAAU,OAAO,WAAW,MAAM;AACxD,mBAAW,QAAQ,MAAM;AAAA,MAC3B,GAAG,GAAG;AAAA,IACR;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,eAAeA,aAAY,MAAM;AACrC,UAAM,EAAE,SAAS,MAAM,IAAI;AAC3B,UAAM,CAAC,IAAI,IAAI,MAAM,MAAM,EAAE;AAC7B,UAAM,KAAK,SAAS,eAAe,GAAG,MAAM,KAAK,IAAI;AACrD,QAAI,IAAI;AACN,YAAM,EAAE,OAAO,OAAO,IAAI,GAAG,sBAAsB;AACnD,YAAM,EAAE,cAAc,YAAY,IAAI,SAAS;AAC/C,UAAI,QAAQ,aAAa;AACvB,cAAM,WACJ,MAAM,SAAS,IACX,UAAU,IAAI,KAAK,IACnB,UAAU,OAAO,QAAQ,WAAW;AAC1C,qBAAa,QAAQ;AAAA,MACvB,WAAW,SAAS,cAAc;AAChC,cAAM,WAAW,QAAQ,OAAO,SAAS,YAAY;AACrD,qBAAa,QAAQ;AAAA,MACvB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,IAAI,YAAY,CAAC;AAErB,QAAM,gBAAwCC;AAAA,IAC5C,OAAO;AAAA,MACL,cAAc,CAAC,QAAoB;AACjC,cAAM,aAAa,gBAAgB,IAAI,MAAqB;AAC5D,cAAM,EAAE,QAAQ,QAAQ,SAAS,QAAQ,MAAM,IAC7C,aAAa,UAAU;AACzB,cAAM,YAAY,UAAU,YAAY;AACxC,cAAM;AAAA,UACJ,SAAS,EAAE,CAAC,MAAM,GAAG,MAAM;AAAA,QAC7B,IAAI;AACJ,kBAAU,UAAU;AAUpB,YAAI,UAAU,cAAc,SAAS;AAEnC,oBAAU,QAAQ,MAAM,IAAI;AAC5B,uBAAa,QAAQ,QAAQ,UAAU;AAAA,QACzC,WAAW,UAAU,mBAAmB,CAAC,SAAS;AAChD,oBAAU,QAAQ,MAAM,IAAI;AAC5B,uBAAa,uBAAuB,OAAO;AAC3C,iCAAuB,UAAU;AAAA,QACnC,WAAW,UAAU,mBAAmB,SAAS;AAC/C,uBAAa,uBAAuB,OAAO;AAC3C,uBAAa,QAAQ,QAAQ,UAAU;AAAA,QACzC,WAAW,UAAU,cAAc;AACjC,gBAAM,CAAC,EAAE,IAAI,aAAa,GAAG,EAAE,IAAI,WAAW,CAAC,IAC7C,UAAU,QAAQ,MAAM,EAAE;AAC5B,cACE,iBAAiB,UACjB,UAAU,QAAQ,UAAU,MAAM,mBAClC,WACA;AACA,0BAAc,YAAY,QAAQ,MAAM;AACxC,gBAAI,WAAW,CAAC,QAAQ;AACtB,2BAAa,QAAQ,QAAQ,UAAU;AAAA,YACzC;AAAA,UACF,WACE,iBAAiB,UACjB,WACA,WAAW,cACX,UAAU,QAAQ,UAAU,MAAM,iBAClC;AAEA,yBAAa,QAAQ,QAAQ,UAAU;AAAA,UACzC,WAAW,SAAS;AAClB,uBAAW,QAAQ,MAAM;AACzB,yBAAa,QAAQ,QAAQ,UAAU;AAAA,UACzC,WACE,EAAE,UAAU,QAAQ,UAAU,MAAM,mBAAmB,YACvD;AACA,uBAAW,QAAQ,MAAM;AAAA,UAC3B;AAAA,QACF;AAEA,YAAI,UAAU,iBAAiB;AAC7B,cAAI,uBAAuB,SAAS;AAClC,yBAAa,uBAAuB,OAAO;AAC3C,mCAAuB,UAAU;AAAA,UACnC;AACA,uBAAa,wBAAwB,OAAO;AAC5C,kCAAwB,UAAU;AAClC,oBAAU,QAAQ,MAAM,IAAI;AAAA,QAC9B;AAEA,yBAAiB,KAAK,MAAM;AAAA,MAC9B;AAAA,MAEA,SAAS,CAAC,QAAwB;AAChC,cAAM,gBAAgB,IAAI;AAC1B,cAAM,aAAa,gBAAgB,aAAa;AAChD,cAAM,MAAM,cAAc,UAAU;AACpC,gBAAQ;AAAA,UACN,oBAAoB,iBAAiB,WAAW;AAAA,QAClD;AACA,YAAI,WAAW,iBAAiB,QAAQ;AACtC,cAAI,WAAW,iBAAiB,QAAQ;AACtC,qBAAS,GAAG;AAAA,UACd,OAAO;AAAA,UAEP;AAAA,QACF,OAAO;AACL,qBAAW,UAAU,WAAW,EAAE,CAAC;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,UAAU;AAAA,EACvB;AACF;;;AEpVA,SAAS,iBAAiB;AAQnB,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,MAA0B;AACxB,YAAU,MAAM;AACd,QAAI;AACJ,QAAI,QAAQ;AACV,qBAAe,CAAC,QAAQ;AACtB,cAAM,SAAS,IAAI;AACnB,cAAM,YAAY,OAAO,QAAQ,IAAI,oBAAoB;AACzD,YAAI,cAAc,MAAM;AACtB,6CAAU;AAAA,QACZ;AAAA,MACF;AAEA,eAAS,KAAK,iBAAiB,SAAS,cAAc,IAAI;AAAA,IAC5D;AAEA,WAAO,MAAM;AACX,UAAI,cAAc;AAChB,iBAAS,KAAK,oBAAoB,SAAS,cAAc,IAAI;AAAA,MAC/D;AAAA,IACF;AAAA,EACF,GAAG,CAAC,oBAAoB,QAAQ,OAAO,CAAC;AAC1C;;;AR8DI,mBAKM,OAAAC,YALN;AAMQ;AAvFZ,IAAM,OAAO,MAAM;AAEZ,IAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,IAAI;AAAA,EACJ,UAAU,MAAM;AAAA,EAChB,WAAW,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACxB;AAAA,EACA,GAAG;AACL,MAAwB;AACtB,QAAM,KAAKC,OAAM,MAAM;AACvB,QAAM,eAAeC,QAAoC,IAAI;AAC7D,QAAM,CAAC,OAAO,OAAO,IAAI,gBAAgB,YAAY;AACrD,QAAM,yBAAyBA,QAAO,mBAAmB;AACzD,QAAM,uBAAuBC,aAAY,MAAM;AAC7C,2BAAuB,UAAU;AAAA,EACnC,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiBA;AAAA,IACrB,CAAC,WAAmB;AAClB,YAAM,EAAE,QAAQ,QAAQ,IAAI,QAAQ,MAAM;AAC1C,mBAAa,QAAQ,MAAM;AAC3B,cAAQ,QAAQ,OAAO;AAAA,IACzB;AAAA,IACA,CAAC,SAAS,OAAO;AAAA,EACnB;AAEA,QAAM,EAAE,WAAW,eAAe,UAAU,WAAW,aAAa,IAClE,WAAW;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB;AAAA,EACF,CAAC;AACH,eAAa,UAAU;AAEvB,UAAQ,IAAI,EAAE,UAAU,CAAC;AAEzB,QAAM,cAAcA,aAAY,MAAM;AACpC,cAAU;AACV,YAAQ;AAAA,EACV,GAAG,CAAC,WAAW,OAAO,CAAC;AAEvB,eAAa;AAAA,IACX,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,QAAQ,UAAU,SAAS;AAAA,EAC7B,CAAC;AAED,QAAM,iBAAiB,CAACC,QAAe;AACrC,UAAM,SAAS,UAAUA,GAAE;AAC3B,UAAM,SAAS,UAAU,MAAM;AAC/B,2BAAuB,UAAU;AACjC,aAAS,QAAQ,MAAM;AAAA,EACzB;AACA,QAAM,kBAAkB,MAAM;AAC5B,2BAAuB,UAAU;AACjC,cAAU;AAAA,EACZ;AAEA,QAAM,0BAA0B,MAAM;AAAA,EAEtC;AAEA,QAAM,WAAW,UAAU,SAAS;AAEpC,QAAM,oBAAoB,CAAC,MAAc;AACvC,QAAI,KAAK,UAAU;AACjB,aAAO;AAAA,IACT,OAAO;AACL,YAAM,EAAE,IAAI,OAAO,IAAI,UAAU,IAAI,CAAC;AACtC,YAAM,MAAM,OAAO,YAAY,GAAG;AAClC,YAAM,MACJ,QAAQ,KAAK,SAAS,QAAQ,EAAE,IAAI,SAAS,OAAO,MAAM,CAAC,GAAG,GAAG,EAAE;AACrE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SACE,gBAAAJ,KAAA,YACG,oBAAU,IAAI,CAAC,EAAE,IAAI,QAAQ,MAAM,IAAI,GAAG,MAAM;AAC/C,UAAM,iBAAiB,kBAAkB,CAAC;AAE1C,WACE,gBAAAA,KAAC,UAAe,GAAG,MAAM,GAAG,KAAK,UAAU,cACzC;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,qBAAqB,uBAAuB;AAAA,QAC5C,kBAAkB;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,MAAM;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA,YAAY;AAAA,QACZ,qBAAqB;AAAA,QACrB,aAAa;AAAA,QACb,YAAY;AAAA,QACZ;AAAA;AAAA,MAEC,MAAM,MAAM;AAAA,IACf,KAlBW,CAmBb;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEA,YAAY,cAAc;;;AS9H1B,SAAS,eAA0B,eAAAK,cAAa,WAAAC,gBAAe;AAqF3D,gBAAAC,YAAA;AArEG,IAAM,qBAAqB;AAAA,EAChC;AACF;AAqBO,IAAM,4BAA4B,CACvC,aAEA,aAAa,UAAa,cAAc;AAa1C,IAAM,WAAW,CAAC;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,QAAM,eAAeD,SAAQ,MAAM;AACjC,SAAI,mCAAS,iBAAgB,aAAa;AACxC,aAAO,QAAQ,aAAa,OAAO,WAAW;AAAA,IAChD,WAAW,aAAa;AACtB,aAAO,CAAC,WAAW;AAAA,IACrB,OAAO;AACL,cAAO,mCAAS,iBAAgB,CAAC;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,SAAS,WAAW,CAAC;AAEzB,QAAM,mBAAmBD;AAAA,IACvB,CAAC,MAAM,YAAY;AAxEvB;AAyEM,UAAI,uDAAoB,MAAM,UAAU;AACtC,eAAO;AAAA,MACT;AAEA,WAAI,wCAAS,sBAAT,iCAA6B,MAAM,UAAU;AAC/C,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,CAAC,SAAS,iBAAiB;AAAA,EAC7B;AAEA,SACE,gBAAAE;AAAA,IAAC,mBAAmB;AAAA,IAAnB;AAAA,MACC,OAAO;AAAA,QACL,mBAAmB;AAAA,QACnB;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAGO,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAgC;AAC9B,SACE,gBAAAA,KAAC,mBAAmB,UAAnB,EACE,WAAC,kBACA,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,EACH,GAEJ;AAEJ;;;AClHA,SAAqB,eAAAC,cAAa,kBAAkB;;;ACHpD,OAAOC,SAAQ;AACf,OAAOC;AAAA,EACL,iBAAAC;AAAA,EAIA,aAAAC;AAAA,EACA,UAAAC;AAAA,OACK;AACP,OAAOC,eAAc;AAKrB,IAAI,cAAc;AAClB,IAAM,UAAoB,CAAC;AAE3B,SAAS,kBAAkB,GAAkB;AAC3C,MAAI,EAAE,QAAQ,OAAO;AACnB,QAAI,QAAQ,QAAQ;AAClB,qBAAe;AAAA,IACjB,WAAW,aAAa;AACtB,YAAM,aAAa,SAAS,KAAK,cAAc,YAAY;AAC3D,UAAI,YAAY;AACd,QAAAC,UAAS,uBAAuB,UAAU;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,GAAe;AAC1C,MAAI,QAAQ,QAAQ;AAElB,UAAM,kBAAkB,SAAS,KAAK,iBAAiB,WAAW;AAClE,aAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,UAAI,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAqB,GAAG;AACxD;AAAA,MACF;AAAA,IACF;AACA,mBAAe;AAAA,EACjB;AACF;AAEA,SAAS,iBAAiB;AACxB,MAAI,QAAQ,QAAQ;AAElB,UAAM,kBAAkB,SAAS,KAAK,iBAAiB,WAAW;AAClE,aAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,MAAAA,UAAS,uBAAuB,gBAAgB,CAAC,CAAC;AAAA,IACpD;AACA,gBAAY,GAAG;AAAA,EACjB;AACF;AAEA,SAAS,eAAe;AACtB,MAAI,gBAAgB,OAAO;AACzB,kBAAc;AACd,WAAO,iBAAiB,WAAW,mBAAmB,IAAI;AAAA,EAC5D;AACF;AAEA,SAAS,eAAe;AACtB,MAAI,aAAa;AACf,kBAAc;AACd,WAAO,oBAAoB,WAAW,mBAAmB,IAAI;AAAA,EAC/D;AACF;AAEA,SAAS,YAAY,MAAc;AACjC,MAAI,QAAQ,QAAQ,IAAI,MAAM,IAAI;AAChC,YAAQ,KAAK,IAAI;AAEjB,QAAI,gBAAgB,OAAO;AACzB,aAAO,iBAAiB,WAAW,mBAAmB,IAAI;AAC1D,aAAO,iBAAiB,SAAS,qBAAqB,IAAI;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,SAAS,YAAY,MAA+B;AAClD,MAAI,QAAQ,QAAQ;AAClB,QAAI,SAAS,KAAK;AAChB,cAAQ,SAAS;AAAA,IACnB,OAAO;AACL,YAAM,MAAM,QAAQ,QAAQ,IAAI;AAChC,UAAI,QAAQ,IAAI;AACd,gBAAQ,OAAO,KAAK,CAAC;AAAA,MACvB;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,KAAK,gBAAgB,OAAO;AACjD,aAAO,oBAAoB,WAAW,mBAAmB,IAAI;AAC7D,aAAO,oBAAoB,SAAS,qBAAqB,IAAI;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,IAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,MAGM;AACJ,QAAM,YAAYC,IAAG,WAAW,oBAAoB,QAAQ;AAC5D,SAAOC,eAAc,OAAO,EAAE,WAAW,MAAM,GAAG,QAAQ;AAC5D;AAEA,IAAI,kBAAkB;AAEf,IAAM,eAAN,MAAmB;AAAA,EACxB,OAAO,UAAU;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR;AAAA,EACF,GAUG;AACD,QAAI,CAAC,WAAW;AACd,YAAM,MAAM,+CAA+C;AAAA,IAC7D;AACA,gBAAY,IAAI;AAChB,QAAI,KAAK,SAAS,KAAK,cAAc,eAAe,KAAK;AACzD,QAAI,OAAO,MAAM;AACf,WAAK,SAAS,cAAc,KAAK;AACjC,SAAG,YAAY,cAAc;AAC7B,eAAS,KAAK,YAAY,EAAE;AAAA,IAC9B;AAEA,UAAM,QAAQ,EAAE,MAAM;AAEtB;AAAA,MACEA;AAAA,QACE;AAAA,QACA,EAAE,KAAK,mBAAmB,UAAU,MAAM;AAAA,QAC1C;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AACJ,qBAAa,kBAAkB,IAAI,KAAK;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,UAAU,OAAO,QAAQ,QAAQ,OAAO;AAG7C,QAAI,QAAQ,QAAQ,IAAI,MAAM,IAAI;AAChC,kBAAY,IAAI;AAChB,YAAM,YAAY,SAAS,KAAK,cAAc,aAAa,OAAO;AAClE,UAAI,WAAW;AACb,QAAAF,UAAS,uBAAuB,SAAS;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,kBAAkB,IAAiB,QAAyB,QAAQ;AACzE,UAAM,SAAS,GAAG,cAAc,wBAAwB;AACxD,QAAI,QAAQ;AACV,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT,IAAI,OAAO,sBAAsB;AAEjC,YAAM,IAAI,OAAO;AACjB,YAAM,IAAI,OAAO;AAEjB,YAAM,YAAY,KAAK,MAAM;AAC7B,UAAI,YAAY,GAAG;AACjB,eAAO,MAAM,MAAM,KAAK,MAAM,GAAG,IAAI,YAAY;AAAA,MACnD;AAEA,YAAM,YAAY,KAAK,OAAO;AAC9B,UAAI,YAAY,GAAG;AACjB,eAAO,MAAM,OAAO,KAAK,MAAM,IAAI,IAAI,YAAY;AAAA,MACrD;AAEA,UAAI,OAAO,UAAU,YAAY,UAAU,cAAc;AACvD,cAAM,aAAa,QAAQ;AAC3B,eAAO,MAAM,OAAO,OAAO,aAAa;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACzB,OAAO,WAAW,QAAsB;AACtC,UAAM,cAAc;AACpB,UAAM,UAAU,OAAO,MAAM;AAE7B,iBAAa;AAEb,IAAAA,UAAS;AAAA,MACPG,OAAM,aAAa,QAAQ;AAAA,QACzB,WAAW;AAAA,QACX,SAAS,MAAM;AACb,wBAAc,YAAY;AAC1B,cAAI,SAAS;AACX,oBAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MACD,SAAS,KAAK,cAAc,WAAW;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,OAAO,cAAc;AACnB,iBAAa;AACb,UAAM,aAAa,SAAS,KAAK,cAAc,YAAY;AAC3D,QAAI,YAAY;AACd,MAAAH,UAAS,uBAAuB,UAAU;AAAA,IAC5C;AAAA,EACF;AACF;AAYO,IAAM,QAAQ,CAAC,UAAsB;AAC1C,QAAM,cAAcI,QAA2B;AAC/C,QAAM,MAAMA,QAAoB,IAAI;AAEpC,QAAM,OAAO,CAACC,QAAmB,uBAAgC;AAC/D,UAAM,EAAE,MAAM,OAAO,OAAO,MAAM,IAAIA;AACtC,QAAI;AACJ,QAAI;AAEJ,QAAI,YAAY,SAAS;AACvB,aAAO,aAAa,YAAY,OAAO;AACvC,kBAAY,UAAU;AAAA,IACxB;AAEA,QAAIA,OAAM,UAAU,MAAM;AACxB,mBAAa,UAAU,MAAM,KAAK;AAAA,IACpC,OAAO;AACL,YAAM,EAAE,UAAU,UAAU,UAAU,IAAIA;AAC1C,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,IAAI;AAEJ,UAAI,aAAa,SAAS;AACxB,eAAO;AACP,cAAM;AAAA,MACR,WAAW,aAAa,SAAS;AAC/B,eAAO;AACP,cAAM;AAAA,MACR;AAEA,kBAAY,UAAU,OAAO,WAAW,MAAM;AAC5C,qBAAa,UAAU;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO,SAAS;AAAA,UAChB;AAAA,QACF,CAAC;AAAA,MACH,GAAG,EAAE;AAAA,IACP;AAAA,EACF;AAEA,EAAAC,WAAU,MAAM;AACd,QAAI,IAAI,SAAS;AACf,YAAM,KAAK,IAAI,QAAQ;AACvB,YAAM,qBAAqB,yBAAI;AAC/B,UAAI,oBAAoB;AACtB,aAAK,OAAO,kBAAkB;AAAA,MAChC;AAAA,IACF;AAEA,WAAO,MAAM;AACX,mBAAa,UAAU,MAAM,MAAM,MAAM,KAAK;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,SAAOH,OAAM,cAAc,OAAO,EAAE,WAAW,eAAe,IAAI,CAAC;AACrE;;;AD1OQ,gBAAAI,YAAA;AAzDD,IAAM,iBAAiB,CAAC,gBAA8B;AAC3D,QAAM,MAAM,WAAW,kBAAkB;AAEzC,QAAM,mBAAmBC;AAAA,IACvB,CAAC,cAA6B,UAAU,YAAY;AAClD,UAAI,UAAuC,CAAC;AAC5C,iBAAWC,gBAAe,cAAc;AAEtC,kBAAU,QAAQ,OAAOA,aAAY,UAAU,OAAO,CAAC;AAAA,MACzD;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,wBAAwBD;AAAA,IAC5B,CAAC,GAA4B,UAAkB,YAAqB;AAhCxE;AAiCM,QAAE,gBAAgB;AAClB,QAAE,eAAe;AACjB,YAAM,gBACJ,gCAAK,iBAAL,YAAsB,cAAc,CAAC,WAAW,IAAI;AACtD,UAAI,MAAM,QAAQ,YAAY,KAAK,aAAa,SAAS,GAAG;AAC1D,cAAM,sBAAsB;AAAA,UAC1B;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,gBAAQ,IAAI;AAAA,UACV;AAAA,QACF,CAAC;AACD,YAAI,oBAAoB,WAAU,2BAAK,oBAAmB;AACxD,kBAAQ,IAAI,mBAAmB,YAAY;AAAA,YACzC;AAAA,UACF,CAAC;AACD,0BAAgB,GAAG,qBAAqB,IAAI,iBAAiB;AAAA,QAC/D;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,kBAAkB,2BAAK,mBAAmB,2BAAK,cAAc,WAAW;AAAA,EAC3E;AAEA,SAAO;AACT;AAEA,IAAM,kBAAkB,CACtB,GACA,iBACA,4BACG;AACH,QAAM,EAAE,SAAS,MAAM,SAAS,IAAI,IAAI;AACxC,QAAM,YAAY,CAACE,qBAAiD;AAClE,UAAM,iBAAiB,CAAC,UAAqC,MAC3D,0BAA0B,QAAQ,IAChC,gBAAAH,KAAC,iBAAsB,OAAO,SAAS,OACpC,mBAAS,SAAS,IAAI,cAAc,KADnB,CAEpB,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,QAAQ,SAAS;AAAA,QACjB,aAAW,SAAS;AAAA,QACpB,SAAS,SAAS;AAAA,QAEjB,mBAAS;AAAA;AAAA,MALL;AAAA,IAMP;AAGJ,WAAOG,iBAAgB,IAAI,cAAc;AAAA,EAC3C;AAEA,QAAM,cAAc,CAAC,QAAiB,YAAsB;AAC1D,QAAI,QAAQ;AACV,8BAAwB,QAAQ,OAAO;AACvC,mBAAa,UAAU;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,YACJ,gBAAAH,KAAC,eAAY,SAAS,aAAa,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI,GAC5D,oBAAU,eAAe,GAC5B;AAEF,eAAa,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,CAAC;AACvD;",
6
+ "names": ["ReactDOM", "Portal", "jsx", "useId", "useCallback", "useRef", "React", "useLayoutEffect", "useMemo", "useRef", "cx", "useCallback", "useMemo", "useRef", "useState", "useRef", "useState", "useCallback", "useMemo", "useCallback", "useMemo", "useCallback", "menus", "actions", "useMemo", "jsx", "classBase", "isRoot", "useRef", "useMemo", "React", "useLayoutEffect", "cx", "children", "className", "props", "useCallback", "useMemo", "useRef", "useState", "useState", "useRef", "useCallback", "useMemo", "jsx", "useId", "useRef", "useCallback", "id", "useCallback", "useMemo", "jsx", "useCallback", "cx", "React", "createElement", "useEffect", "useRef", "ReactDOM", "ReactDOM", "cx", "createElement", "React", "useRef", "props", "useEffect", "jsx", "useCallback", "menuBuilder", "menuDescriptors"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vuu-ui/vuu-popups",
3
- "version": "0.7.0-debug",
3
+ "version": "0.7.1-debug",
4
4
  "description": "VUU popup components - Context Menu, Dialog etc",
5
5
  "author": "heswell",
6
6
  "license": "Apache-2.0",
@@ -8,7 +8,7 @@
8
8
  "@salt-ds/core": "1.2.0",
9
9
  "@salt-ds/icons": "1.1.0",
10
10
  "@heswell/salt-lab": "1.0.0-alpha.2",
11
- "@vuu-ui/vuu-utils": "0.7.0-debug"
11
+ "@vuu-ui/vuu-utils": "0.7.1-debug"
12
12
  },
13
13
  "peerDependencies": {
14
14
  "classnames": "^2.2.6",
@@ -1,2 +1,3 @@
1
1
  import { MouseEvent } from "react";
2
- export declare const useContextMenu: () => (e: MouseEvent<HTMLElement>, location: string, options: unknown) => void;
2
+ import { MenuBuilder } from "./context-menu-provider";
3
+ export declare const useContextMenu: (menuBuilder?: MenuBuilder) => (e: MouseEvent<HTMLElement>, location: string, options: unknown) => void;