{"mappings":"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","sources":["packages/@adobe/react-spectrum/src/menu/Menu.tsx"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {ActionButton} from '../button/ActionButton';\n\nimport {AriaMenuProps, useMenu} from 'react-aria/useMenu';\nimport ArrowDownSmall from '@spectrum-icons/ui/ArrowDownSmall';\nimport {classNames} from '../utils/classNames';\nimport {DOMRef, StyleProps} from '@react-types/shared';\nimport {FocusScope} from 'react-aria/FocusScope';\nimport intlMessages from '../../intl/menu/*.json';\nimport {MenuContext, MenuStateContext, useMenuStateContext} from './context';\nimport {MenuItem} from './MenuItem';\n// @ts-ignore\nimport {MenuSection} from './MenuSection';\nimport {mergeProps} from 'react-aria/mergeProps';\nimport React, {\n  KeyboardEventHandler,\n  ReactElement,\n  ReactNode,\n  RefObject,\n  useContext,\n  useEffect,\n  useRef,\n  useState\n} from 'react';\nimport {RootMenuTriggerState} from 'react-stately/useMenuTriggerState';\nimport styles from '@adobe/spectrum-css-temp/components/menu/vars.css';\nimport {TreeState, useTreeState} from 'react-stately/useTreeState';\nimport {useDOMRef} from '../utils/useDOMRef';\nimport {useIsMobileDevice} from '../utils/useIsMobileDevice';\nimport {useLayoutEffect} from 'react-aria/private/utils/useLayoutEffect';\nimport {useLocale} from 'react-aria/I18nProvider';\nimport {useLocalizedStringFormatter} from 'react-aria/useLocalizedStringFormatter';\nimport {useSlotId} from 'react-aria/private/utils/useId';\nimport {useStyleProps} from '../utils/styleProps';\nimport {useSyncRef} from 'react-aria/private/utils/useSyncRef';\n\nexport interface SpectrumMenuProps<T> extends AriaMenuProps<T>, StyleProps {}\n\n/**\n * Menus display a list of actions or options that a user can choose.\n */\n// forwardRef doesn't support generic parameters, so cast the result to the correct type\n// https://stackoverflow.com/questions/58469229/react-with-typescript-generics-while-using-react-forwardref\nexport const Menu = React.forwardRef(function Menu<T extends object>(\n  props: SpectrumMenuProps<T>,\n  ref: DOMRef<HTMLDivElement>\n) {\n  let isSubmenu = true;\n  let contextProps = useContext(MenuContext);\n  let parentMenuContext = useMenuStateContext();\n  let {rootMenuTriggerState, state: parentMenuTreeState} = parentMenuContext || {\n    rootMenuTriggerState: contextProps.state\n  };\n  if (!parentMenuContext) {\n    isSubmenu = false;\n  }\n  let completeProps = {\n    ...mergeProps(contextProps, props)\n  };\n  let domRef = useDOMRef(ref);\n  let [popoverContainer, setPopoverContainer] = useState<HTMLElement | null>(null);\n  let trayContainerRef = useRef<HTMLDivElement | null>(null);\n  let state = useTreeState(completeProps);\n  let submenuRef = useRef<HTMLDivElement>(null);\n  let {menuProps} = useMenu(completeProps, state, domRef);\n  let {styleProps} = useStyleProps(completeProps);\n  useSyncRef(contextProps, domRef);\n  let [leftOffset, setLeftOffset] = useState({left: 0});\n  let prevPopoverContainer = useRef<HTMLElement | null>(null);\n\n  useLayoutEffect(() => {\n    if (\n      popoverContainer &&\n      prevPopoverContainer.current !== popoverContainer &&\n      leftOffset.left === 0\n    ) {\n      prevPopoverContainer.current = popoverContainer;\n      let {left} = popoverContainer.getBoundingClientRect();\n      setLeftOffset({left: -1 * left});\n    }\n  }, [leftOffset, popoverContainer]);\n\n  let menuLevel = contextProps.submenuLevel ?? -1;\n  let nextMenuLevelKey = rootMenuTriggerState?.expandedKeysStack[menuLevel + 1];\n  let hasOpenSubmenu = false;\n  if (nextMenuLevelKey != null) {\n    let nextMenuLevel = state.collection.getItem(nextMenuLevelKey);\n    hasOpenSubmenu = nextMenuLevel != null;\n  }\n\n  return (\n    <MenuStateContext.Provider\n      value={{\n        popoverContainer,\n        trayContainerRef,\n        menu: domRef,\n        submenu: submenuRef,\n        rootMenuTriggerState,\n        state\n      }}>\n      <div style={{height: hasOpenSubmenu ? '100%' : undefined}} ref={trayContainerRef} />\n      <FocusScope>\n        <TrayHeaderWrapper\n          onBackButtonPress={contextProps.onBackButtonPress}\n          hasOpenSubmenu={hasOpenSubmenu}\n          isSubmenu={isSubmenu}\n          parentMenuTreeState={parentMenuTreeState}\n          rootMenuTriggerState={rootMenuTriggerState}\n          menuRef={domRef}>\n          <div\n            {...menuProps}\n            style={mergeProps(styleProps.style, menuProps.style)}\n            ref={domRef}\n            className={classNames(styles, 'spectrum-Menu', styleProps.className)}>\n            {[...state.collection].map(item => {\n              if (item.type === 'section') {\n                return <MenuSection key={item.key} item={item} state={state} />;\n              }\n\n              let menuItem = <MenuItem key={item.key} item={item} state={state} />;\n\n              if (item.wrapper) {\n                menuItem = item.wrapper(menuItem);\n              }\n\n              return menuItem;\n            })}\n          </div>\n        </TrayHeaderWrapper>\n        {rootMenuTriggerState?.isOpen && (\n          <div\n            ref={setPopoverContainer}\n            style={{width: '100vw', position: 'absolute', top: -5, ...leftOffset}}\n          />\n        )}\n      </FocusScope>\n    </MenuStateContext.Provider>\n  );\n}) as <T>(props: SpectrumMenuProps<T> & {ref?: DOMRef<HTMLDivElement>}) => ReactElement;\n\nexport function TrayHeaderWrapper(props: {\n  children: ReactNode;\n  isSubmenu?: boolean;\n  hasOpenSubmenu?: boolean;\n  parentMenuTreeState?: TreeState<any>;\n  rootMenuTriggerState?: RootMenuTriggerState;\n  onBackButtonPress?: () => void;\n  wrapperKeyDown?: KeyboardEventHandler<HTMLDivElement> | undefined;\n  menuRef?: RefObject<HTMLDivElement | null>;\n}): ReactNode {\n  let {\n    children,\n    isSubmenu,\n    hasOpenSubmenu,\n    parentMenuTreeState,\n    rootMenuTriggerState,\n    onBackButtonPress,\n    wrapperKeyDown,\n    menuRef\n  } = props;\n  let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/menu');\n  let lastKey = rootMenuTriggerState?.expandedKeysStack.slice(-1)[0];\n  let backButtonText = '';\n  if (lastKey != null) {\n    backButtonText = parentMenuTreeState?.collection.getItem(lastKey)?.textValue ?? '';\n  }\n  let backButtonLabel = stringFormatter.format('backButton', {\n    prevMenuButton: backButtonText ?? ''\n  });\n  let headingId = useSlotId();\n  let isMobile = useIsMobileDevice();\n  let {direction} = useLocale();\n\n  let [traySubmenuAnimation, setTraySubmenuAnimation] = useState('');\n  useLayoutEffect(() => {\n    if (!hasOpenSubmenu) {\n      setTraySubmenuAnimation('spectrum-TraySubmenu-enter');\n    }\n  }, [hasOpenSubmenu, isMobile]);\n\n  let timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  let handleBackButtonPress = () => {\n    setTraySubmenuAnimation('spectrum-TraySubmenu-exit');\n    timeoutRef.current = setTimeout(() => {\n      onBackButtonPress?.();\n    }, 220); // Matches transition duration\n  };\n\n  useEffect(() => {\n    return () => {\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n      }\n    };\n  }, []);\n\n  // When opening submenu in tray, focus the first item in the submenu after animation completes\n  // This fixes an issue with iOS VO where the closed submenu was getting focus\n  let focusTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  useEffect(() => {\n    if (\n      isMobile &&\n      isSubmenu &&\n      !hasOpenSubmenu &&\n      traySubmenuAnimation === 'spectrum-TraySubmenu-enter'\n    ) {\n      focusTimeoutRef.current = setTimeout(() => {\n        let firstItem = menuRef?.current?.querySelector(\n          '[role=\"menuitem\"], [role=\"menuitemcheckbox\"], [role=\"menuitemradio\"]'\n        ) as HTMLElement;\n        firstItem?.focus();\n      }, 220);\n    }\n    return () => {\n      if (focusTimeoutRef.current) {\n        clearTimeout(focusTimeoutRef.current);\n      }\n    };\n  }, [hasOpenSubmenu, isMobile, isSubmenu, menuRef, traySubmenuAnimation]);\n\n  return (\n    <>\n      <div\n        role={headingId ? 'dialog' : undefined}\n        aria-labelledby={headingId}\n        aria-hidden={isMobile && hasOpenSubmenu}\n        data-testid=\"menu-wrapper\"\n        className={classNames(styles, 'spectrum-Menu-wrapper', {\n          'spectrum-Menu-wrapper--isMobile': isMobile,\n          'is-expanded': hasOpenSubmenu,\n          [traySubmenuAnimation]: isMobile\n        })}>\n        <div\n          role=\"presentation\"\n          className={classNames(styles, 'spectrum-Submenu-wrapper', {\n            'spectrum-Submenu-wrapper--isMobile': isMobile\n          })}\n          onKeyDown={wrapperKeyDown}>\n          {isMobile && isSubmenu && !hasOpenSubmenu && (\n            <div className={classNames(styles, 'spectrum-Submenu-headingWrapper')}>\n              <ActionButton aria-label={backButtonLabel} isQuiet onPress={handleBackButtonPress}>\n                {/* We don't have a ArrowLeftSmall so make due with ArrowDownSmall and transforms */}\n                {direction === 'rtl' ? (\n                  <ArrowDownSmall UNSAFE_style={{rotate: '270deg'}} />\n                ) : (\n                  <ArrowDownSmall UNSAFE_style={{rotate: '90deg'}} />\n                )}\n              </ActionButton>\n              <h1 id={headingId} className={classNames(styles, 'spectrum-Submenu-heading')}>\n                {backButtonText}\n              </h1>\n            </div>\n          )}\n          {children}\n        </div>\n      </div>\n    </>\n  );\n}\n"],"names":[],"version":3,"file":"Menu.cjs.map"}