@fluentui/react-menu 9.7.15 → 9.7.16
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.json +64 -1
- package/CHANGELOG.md +19 -2
- package/lib/Menu.js +0 -1
- package/lib/Menu.js.map +1 -1
- package/lib/MenuDivider.js +0 -1
- package/lib/MenuDivider.js.map +1 -1
- package/lib/MenuGroup.js +0 -1
- package/lib/MenuGroup.js.map +1 -1
- package/lib/MenuGroupHeader.js +0 -1
- package/lib/MenuGroupHeader.js.map +1 -1
- package/lib/MenuItem.js +0 -1
- package/lib/MenuItem.js.map +1 -1
- package/lib/MenuItemCheckbox.js +0 -1
- package/lib/MenuItemCheckbox.js.map +1 -1
- package/lib/MenuItemRadio.js +0 -1
- package/lib/MenuItemRadio.js.map +1 -1
- package/lib/MenuList.js +0 -1
- package/lib/MenuList.js.map +1 -1
- package/lib/MenuPopover.js +0 -1
- package/lib/MenuPopover.js.map +1 -1
- package/lib/MenuSplitGroup.js +0 -1
- package/lib/MenuSplitGroup.js.map +1 -1
- package/lib/MenuTrigger.js +0 -1
- package/lib/MenuTrigger.js.map +1 -1
- package/lib/components/Menu/Menu.js +4 -6
- package/lib/components/Menu/Menu.js.map +1 -1
- package/lib/components/Menu/Menu.types.js +0 -1
- package/lib/components/Menu/Menu.types.js.map +1 -1
- package/lib/components/Menu/index.js +0 -1
- package/lib/components/Menu/index.js.map +1 -1
- package/lib/components/Menu/renderMenu.js +4 -6
- package/lib/components/Menu/renderMenu.js.map +1 -1
- package/lib/components/Menu/useMenu.js +242 -236
- package/lib/components/Menu/useMenu.js.map +1 -1
- package/lib/components/Menu/useMenuContextValues.js +22 -39
- package/lib/components/Menu/useMenuContextValues.js.map +1 -1
- package/lib/components/MenuDivider/MenuDivider.js +5 -7
- package/lib/components/MenuDivider/MenuDivider.js.map +1 -1
- package/lib/components/MenuDivider/MenuDivider.types.js +1 -2
- package/lib/components/MenuDivider/MenuDivider.types.js.map +1 -1
- package/lib/components/MenuDivider/index.js +0 -1
- package/lib/components/MenuDivider/index.js.map +1 -1
- package/lib/components/MenuDivider/renderMenuDivider.js +4 -9
- package/lib/components/MenuDivider/renderMenuDivider.js.map +1 -1
- package/lib/components/MenuDivider/useMenuDivider.js +12 -14
- package/lib/components/MenuDivider/useMenuDivider.js.map +1 -1
- package/lib/components/MenuDivider/useMenuDividerStyles.styles.js.map +1 -1
- package/lib/components/MenuGroup/MenuGroup.js +6 -8
- package/lib/components/MenuGroup/MenuGroup.js.map +1 -1
- package/lib/components/MenuGroup/MenuGroup.types.js +1 -2
- package/lib/components/MenuGroup/MenuGroup.types.js.map +1 -1
- package/lib/components/MenuGroup/index.js +0 -1
- package/lib/components/MenuGroup/index.js.map +1 -1
- package/lib/components/MenuGroup/renderMenuGroup.js +6 -11
- package/lib/components/MenuGroup/renderMenuGroup.js.map +1 -1
- package/lib/components/MenuGroup/useMenuGroup.js +14 -16
- package/lib/components/MenuGroup/useMenuGroup.js.map +1 -1
- package/lib/components/MenuGroup/useMenuGroupContextValues.js +9 -10
- package/lib/components/MenuGroup/useMenuGroupContextValues.js.map +1 -1
- package/lib/components/MenuGroup/useMenuGroupStyles.styles.js.map +1 -1
- package/lib/components/MenuGroupHeader/MenuGroupHeader.js +5 -7
- package/lib/components/MenuGroupHeader/MenuGroupHeader.js.map +1 -1
- package/lib/components/MenuGroupHeader/MenuGroupHeader.types.js +1 -2
- package/lib/components/MenuGroupHeader/MenuGroupHeader.types.js.map +1 -1
- package/lib/components/MenuGroupHeader/index.js +0 -1
- package/lib/components/MenuGroupHeader/index.js.map +1 -1
- package/lib/components/MenuGroupHeader/renderMenuGroupHeader.js +4 -9
- package/lib/components/MenuGroupHeader/renderMenuGroupHeader.js.map +1 -1
- package/lib/components/MenuGroupHeader/useMenuGroupHeader.js +12 -16
- package/lib/components/MenuGroupHeader/useMenuGroupHeader.js.map +1 -1
- package/lib/components/MenuGroupHeader/useMenuGroupHeaderStyles.styles.js.map +1 -1
- package/lib/components/MenuItem/MenuItem.js +5 -7
- package/lib/components/MenuItem/MenuItem.js.map +1 -1
- package/lib/components/MenuItem/MenuItem.types.js +1 -2
- package/lib/components/MenuItem/MenuItem.types.js.map +1 -1
- package/lib/components/MenuItem/index.js +0 -1
- package/lib/components/MenuItem/index.js.map +1 -1
- package/lib/components/MenuItem/renderMenuItem.js +4 -9
- package/lib/components/MenuItem/renderMenuItem.js.map +1 -1
- package/lib/components/MenuItem/useCharacterSearch.js +14 -17
- package/lib/components/MenuItem/useCharacterSearch.js.map +1 -1
- package/lib/components/MenuItem/useMenuItem.js +79 -88
- package/lib/components/MenuItem/useMenuItem.js.map +1 -1
- package/lib/components/MenuItem/useMenuItemStyles.styles.js +5 -5
- package/lib/components/MenuItem/useMenuItemStyles.styles.js.map +1 -1
- package/lib/components/MenuItemCheckbox/MenuItemCheckbox.js +5 -7
- package/lib/components/MenuItemCheckbox/MenuItemCheckbox.js.map +1 -1
- package/lib/components/MenuItemCheckbox/MenuItemCheckbox.types.js +1 -2
- package/lib/components/MenuItemCheckbox/MenuItemCheckbox.types.js.map +1 -1
- package/lib/components/MenuItemCheckbox/index.js +0 -1
- package/lib/components/MenuItemCheckbox/index.js.map +1 -1
- package/lib/components/MenuItemCheckbox/renderMenuItemCheckbox.js +4 -9
- package/lib/components/MenuItemCheckbox/renderMenuItemCheckbox.js.map +1 -1
- package/lib/components/MenuItemCheckbox/useMenuItemCheckbox.js +31 -36
- package/lib/components/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
- package/lib/components/MenuItemCheckbox/useMenuItemCheckboxStyles.styles.js.map +1 -1
- package/lib/components/MenuItemRadio/MenuItemRadio.js +5 -7
- package/lib/components/MenuItemRadio/MenuItemRadio.js.map +1 -1
- package/lib/components/MenuItemRadio/MenuItemRadio.types.js +1 -2
- package/lib/components/MenuItemRadio/MenuItemRadio.types.js.map +1 -1
- package/lib/components/MenuItemRadio/index.js +0 -1
- package/lib/components/MenuItemRadio/index.js.map +1 -1
- package/lib/components/MenuItemRadio/renderMenuItemRadio.js +4 -9
- package/lib/components/MenuItemRadio/renderMenuItemRadio.js.map +1 -1
- package/lib/components/MenuItemRadio/useMenuItemRadio.js +29 -34
- package/lib/components/MenuItemRadio/useMenuItemRadio.js.map +1 -1
- package/lib/components/MenuItemRadio/useMenuItemRadioStyles.styles.js.map +1 -1
- package/lib/components/MenuList/MenuList.js +6 -8
- package/lib/components/MenuList/MenuList.js.map +1 -1
- package/lib/components/MenuList/MenuList.types.js +0 -1
- package/lib/components/MenuList/MenuList.types.js.map +1 -1
- package/lib/components/MenuList/index.js +0 -1
- package/lib/components/MenuList/index.js.map +1 -1
- package/lib/components/MenuList/renderMenuList.js +6 -11
- package/lib/components/MenuList/renderMenuList.js.map +1 -1
- package/lib/components/MenuList/useMenuList.js +130 -126
- package/lib/components/MenuList/useMenuList.js.map +1 -1
- package/lib/components/MenuList/useMenuListContextValues.js +13 -21
- package/lib/components/MenuList/useMenuListContextValues.js.map +1 -1
- package/lib/components/MenuList/useMenuListStyles.styles.js.map +1 -1
- package/lib/components/MenuPopover/MenuPopover.js +5 -7
- package/lib/components/MenuPopover/MenuPopover.js.map +1 -1
- package/lib/components/MenuPopover/MenuPopover.types.js +1 -2
- package/lib/components/MenuPopover/MenuPopover.types.js.map +1 -1
- package/lib/components/MenuPopover/index.js +0 -1
- package/lib/components/MenuPopover/index.js.map +1 -1
- package/lib/components/MenuPopover/renderMenuPopover.js +9 -14
- package/lib/components/MenuPopover/renderMenuPopover.js.map +1 -1
- package/lib/components/MenuPopover/useMenuPopover.js +87 -91
- package/lib/components/MenuPopover/useMenuPopover.js.map +1 -1
- package/lib/components/MenuPopover/useMenuPopoverStyles.styles.js.map +1 -1
- package/lib/components/MenuSplitGroup/MenuSplitGroup.js +5 -7
- package/lib/components/MenuSplitGroup/MenuSplitGroup.js.map +1 -1
- package/lib/components/MenuSplitGroup/MenuSplitGroup.types.js +1 -2
- package/lib/components/MenuSplitGroup/MenuSplitGroup.types.js.map +1 -1
- package/lib/components/MenuSplitGroup/index.js +0 -1
- package/lib/components/MenuSplitGroup/index.js.map +1 -1
- package/lib/components/MenuSplitGroup/renderMenuSplitGroup.js +4 -9
- package/lib/components/MenuSplitGroup/renderMenuSplitGroup.js.map +1 -1
- package/lib/components/MenuSplitGroup/useMenuSplitGroup.js +45 -47
- package/lib/components/MenuSplitGroup/useMenuSplitGroup.js.map +1 -1
- package/lib/components/MenuSplitGroup/useMenuSplitGroupStyles.styles.js.map +1 -1
- package/lib/components/MenuTrigger/MenuTrigger.js +3 -5
- package/lib/components/MenuTrigger/MenuTrigger.js.map +1 -1
- package/lib/components/MenuTrigger/MenuTrigger.types.js +0 -1
- package/lib/components/MenuTrigger/MenuTrigger.types.js.map +1 -1
- package/lib/components/MenuTrigger/index.js +0 -1
- package/lib/components/MenuTrigger/index.js.map +1 -1
- package/lib/components/MenuTrigger/renderMenuTrigger.js +4 -6
- package/lib/components/MenuTrigger/renderMenuTrigger.js.map +1 -1
- package/lib/components/MenuTrigger/useMenuTrigger.styles.js.map +1 -1
- package/lib/components/index.js +0 -1
- package/lib/components/index.js.map +1 -1
- package/lib/contexts/menuContext.js +21 -22
- package/lib/contexts/menuContext.js.map +1 -1
- package/lib/contexts/menuGroupContext.js +3 -4
- package/lib/contexts/menuGroupContext.js.map +1 -1
- package/lib/contexts/menuListContext.js +8 -9
- package/lib/contexts/menuListContext.js.map +1 -1
- package/lib/contexts/menuTriggerContext.js +2 -4
- package/lib/contexts/menuTriggerContext.js.map +1 -1
- package/lib/index.js +0 -1
- package/lib/index.js.map +1 -1
- package/lib/selectable/index.js +0 -1
- package/lib/selectable/index.js.map +1 -1
- package/lib/selectable/types.js +0 -1
- package/lib/selectable/types.js.map +1 -1
- package/lib/selectable/useCheckmarkStyles.styles.js.map +1 -1
- package/lib/utils/index.js +0 -1
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/useIsSubmenu.js +4 -6
- package/lib/utils/useIsSubmenu.js.map +1 -1
- package/lib/utils/useOnMenuEnter.js +39 -44
- package/lib/utils/useOnMenuEnter.js.map +1 -1
- package/lib-commonjs/Menu.js +0 -3
- package/lib-commonjs/Menu.js.map +1 -1
- package/lib-commonjs/MenuDivider.js +0 -3
- package/lib-commonjs/MenuDivider.js.map +1 -1
- package/lib-commonjs/MenuGroup.js +0 -3
- package/lib-commonjs/MenuGroup.js.map +1 -1
- package/lib-commonjs/MenuGroupHeader.js +0 -3
- package/lib-commonjs/MenuGroupHeader.js.map +1 -1
- package/lib-commonjs/MenuItem.js +0 -3
- package/lib-commonjs/MenuItem.js.map +1 -1
- package/lib-commonjs/MenuItemCheckbox.js +0 -3
- package/lib-commonjs/MenuItemCheckbox.js.map +1 -1
- package/lib-commonjs/MenuItemRadio.js +0 -3
- package/lib-commonjs/MenuItemRadio.js.map +1 -1
- package/lib-commonjs/MenuList.js +0 -3
- package/lib-commonjs/MenuList.js.map +1 -1
- package/lib-commonjs/MenuPopover.js +0 -3
- package/lib-commonjs/MenuPopover.js.map +1 -1
- package/lib-commonjs/MenuSplitGroup.js +0 -3
- package/lib-commonjs/MenuSplitGroup.js.map +1 -1
- package/lib-commonjs/MenuTrigger.js +0 -3
- package/lib-commonjs/MenuTrigger.js.map +1 -1
- package/lib-commonjs/components/Menu/Menu.js +1 -3
- package/lib-commonjs/components/Menu/Menu.js.map +1 -1
- package/lib-commonjs/components/Menu/Menu.types.js +0 -3
- package/lib-commonjs/components/Menu/Menu.types.js.map +1 -1
- package/lib-commonjs/components/Menu/index.js +0 -3
- package/lib-commonjs/components/Menu/index.js.map +1 -1
- package/lib-commonjs/components/Menu/renderMenu.js +1 -3
- package/lib-commonjs/components/Menu/renderMenu.js.map +1 -1
- package/lib-commonjs/components/Menu/useMenu.js +2 -5
- package/lib-commonjs/components/Menu/useMenu.js.map +1 -1
- package/lib-commonjs/components/Menu/useMenuContextValues.js +1 -3
- package/lib-commonjs/components/Menu/useMenuContextValues.js.map +1 -1
- package/lib-commonjs/components/MenuDivider/MenuDivider.js +1 -3
- package/lib-commonjs/components/MenuDivider/MenuDivider.js.map +1 -1
- package/lib-commonjs/components/MenuDivider/MenuDivider.types.js +0 -3
- package/lib-commonjs/components/MenuDivider/MenuDivider.types.js.map +1 -1
- package/lib-commonjs/components/MenuDivider/index.js +0 -3
- package/lib-commonjs/components/MenuDivider/index.js.map +1 -1
- package/lib-commonjs/components/MenuDivider/renderMenuDivider.js +1 -3
- package/lib-commonjs/components/MenuDivider/renderMenuDivider.js.map +1 -1
- package/lib-commonjs/components/MenuDivider/useMenuDivider.js +1 -3
- package/lib-commonjs/components/MenuDivider/useMenuDivider.js.map +1 -1
- package/lib-commonjs/components/MenuDivider/useMenuDividerStyles.styles.js +0 -2
- package/lib-commonjs/components/MenuDivider/useMenuDividerStyles.styles.js.map +1 -1
- package/lib-commonjs/components/MenuGroup/MenuGroup.js +1 -3
- package/lib-commonjs/components/MenuGroup/MenuGroup.js.map +1 -1
- package/lib-commonjs/components/MenuGroup/MenuGroup.types.js +0 -3
- package/lib-commonjs/components/MenuGroup/MenuGroup.types.js.map +1 -1
- package/lib-commonjs/components/MenuGroup/index.js +0 -3
- package/lib-commonjs/components/MenuGroup/index.js.map +1 -1
- package/lib-commonjs/components/MenuGroup/renderMenuGroup.js +1 -3
- package/lib-commonjs/components/MenuGroup/renderMenuGroup.js.map +1 -1
- package/lib-commonjs/components/MenuGroup/useMenuGroup.js +1 -3
- package/lib-commonjs/components/MenuGroup/useMenuGroup.js.map +1 -1
- package/lib-commonjs/components/MenuGroup/useMenuGroupContextValues.js +1 -3
- package/lib-commonjs/components/MenuGroup/useMenuGroupContextValues.js.map +1 -1
- package/lib-commonjs/components/MenuGroup/useMenuGroupStyles.styles.js +0 -2
- package/lib-commonjs/components/MenuGroup/useMenuGroupStyles.styles.js.map +1 -1
- package/lib-commonjs/components/MenuGroupHeader/MenuGroupHeader.js +1 -3
- package/lib-commonjs/components/MenuGroupHeader/MenuGroupHeader.js.map +1 -1
- package/lib-commonjs/components/MenuGroupHeader/MenuGroupHeader.types.js +0 -3
- package/lib-commonjs/components/MenuGroupHeader/MenuGroupHeader.types.js.map +1 -1
- package/lib-commonjs/components/MenuGroupHeader/index.js +0 -3
- package/lib-commonjs/components/MenuGroupHeader/index.js.map +1 -1
- package/lib-commonjs/components/MenuGroupHeader/renderMenuGroupHeader.js +1 -3
- package/lib-commonjs/components/MenuGroupHeader/renderMenuGroupHeader.js.map +1 -1
- package/lib-commonjs/components/MenuGroupHeader/useMenuGroupHeader.js +1 -3
- package/lib-commonjs/components/MenuGroupHeader/useMenuGroupHeader.js.map +1 -1
- package/lib-commonjs/components/MenuGroupHeader/useMenuGroupHeaderStyles.styles.js +0 -2
- package/lib-commonjs/components/MenuGroupHeader/useMenuGroupHeaderStyles.styles.js.map +1 -1
- package/lib-commonjs/components/MenuItem/MenuItem.js +1 -3
- package/lib-commonjs/components/MenuItem/MenuItem.js.map +1 -1
- package/lib-commonjs/components/MenuItem/MenuItem.types.js +0 -3
- package/lib-commonjs/components/MenuItem/MenuItem.types.js.map +1 -1
- package/lib-commonjs/components/MenuItem/index.js +0 -3
- package/lib-commonjs/components/MenuItem/index.js.map +1 -1
- package/lib-commonjs/components/MenuItem/renderMenuItem.js +1 -3
- package/lib-commonjs/components/MenuItem/renderMenuItem.js.map +1 -1
- package/lib-commonjs/components/MenuItem/useCharacterSearch.js +1 -3
- package/lib-commonjs/components/MenuItem/useCharacterSearch.js.map +1 -1
- package/lib-commonjs/components/MenuItem/useMenuItem.js +3 -5
- package/lib-commonjs/components/MenuItem/useMenuItem.js.map +1 -1
- package/lib-commonjs/components/MenuItem/useMenuItemStyles.styles.js +12 -14
- package/lib-commonjs/components/MenuItem/useMenuItemStyles.styles.js.map +1 -1
- package/lib-commonjs/components/MenuItemCheckbox/MenuItemCheckbox.js +1 -3
- package/lib-commonjs/components/MenuItemCheckbox/MenuItemCheckbox.js.map +1 -1
- package/lib-commonjs/components/MenuItemCheckbox/MenuItemCheckbox.types.js +0 -3
- package/lib-commonjs/components/MenuItemCheckbox/MenuItemCheckbox.types.js.map +1 -1
- package/lib-commonjs/components/MenuItemCheckbox/index.js +0 -3
- package/lib-commonjs/components/MenuItemCheckbox/index.js.map +1 -1
- package/lib-commonjs/components/MenuItemCheckbox/renderMenuItemCheckbox.js +1 -3
- package/lib-commonjs/components/MenuItemCheckbox/renderMenuItemCheckbox.js.map +1 -1
- package/lib-commonjs/components/MenuItemCheckbox/useMenuItemCheckbox.js +1 -3
- package/lib-commonjs/components/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
- package/lib-commonjs/components/MenuItemCheckbox/useMenuItemCheckboxStyles.styles.js +0 -2
- package/lib-commonjs/components/MenuItemCheckbox/useMenuItemCheckboxStyles.styles.js.map +1 -1
- package/lib-commonjs/components/MenuItemRadio/MenuItemRadio.js +1 -3
- package/lib-commonjs/components/MenuItemRadio/MenuItemRadio.js.map +1 -1
- package/lib-commonjs/components/MenuItemRadio/MenuItemRadio.types.js +0 -3
- package/lib-commonjs/components/MenuItemRadio/MenuItemRadio.types.js.map +1 -1
- package/lib-commonjs/components/MenuItemRadio/index.js +0 -3
- package/lib-commonjs/components/MenuItemRadio/index.js.map +1 -1
- package/lib-commonjs/components/MenuItemRadio/renderMenuItemRadio.js +1 -3
- package/lib-commonjs/components/MenuItemRadio/renderMenuItemRadio.js.map +1 -1
- package/lib-commonjs/components/MenuItemRadio/useMenuItemRadio.js +1 -3
- package/lib-commonjs/components/MenuItemRadio/useMenuItemRadio.js.map +1 -1
- package/lib-commonjs/components/MenuItemRadio/useMenuItemRadioStyles.styles.js +0 -2
- package/lib-commonjs/components/MenuItemRadio/useMenuItemRadioStyles.styles.js.map +1 -1
- package/lib-commonjs/components/MenuList/MenuList.js +1 -3
- package/lib-commonjs/components/MenuList/MenuList.js.map +1 -1
- package/lib-commonjs/components/MenuList/MenuList.types.js +0 -3
- package/lib-commonjs/components/MenuList/MenuList.types.js.map +1 -1
- package/lib-commonjs/components/MenuList/index.js +0 -3
- package/lib-commonjs/components/MenuList/index.js.map +1 -1
- package/lib-commonjs/components/MenuList/renderMenuList.js +1 -3
- package/lib-commonjs/components/MenuList/renderMenuList.js.map +1 -1
- package/lib-commonjs/components/MenuList/useMenuList.js +1 -3
- package/lib-commonjs/components/MenuList/useMenuList.js.map +1 -1
- package/lib-commonjs/components/MenuList/useMenuListContextValues.js +1 -3
- package/lib-commonjs/components/MenuList/useMenuListContextValues.js.map +1 -1
- package/lib-commonjs/components/MenuList/useMenuListStyles.styles.js +0 -2
- package/lib-commonjs/components/MenuList/useMenuListStyles.styles.js.map +1 -1
- package/lib-commonjs/components/MenuPopover/MenuPopover.js +1 -3
- package/lib-commonjs/components/MenuPopover/MenuPopover.js.map +1 -1
- package/lib-commonjs/components/MenuPopover/MenuPopover.types.js +0 -3
- package/lib-commonjs/components/MenuPopover/MenuPopover.types.js.map +1 -1
- package/lib-commonjs/components/MenuPopover/index.js +0 -3
- package/lib-commonjs/components/MenuPopover/index.js.map +1 -1
- package/lib-commonjs/components/MenuPopover/renderMenuPopover.js +1 -3
- package/lib-commonjs/components/MenuPopover/renderMenuPopover.js.map +1 -1
- package/lib-commonjs/components/MenuPopover/useMenuPopover.js +1 -3
- package/lib-commonjs/components/MenuPopover/useMenuPopover.js.map +1 -1
- package/lib-commonjs/components/MenuPopover/useMenuPopoverStyles.styles.js +0 -2
- package/lib-commonjs/components/MenuPopover/useMenuPopoverStyles.styles.js.map +1 -1
- package/lib-commonjs/components/MenuSplitGroup/MenuSplitGroup.js +1 -3
- package/lib-commonjs/components/MenuSplitGroup/MenuSplitGroup.js.map +1 -1
- package/lib-commonjs/components/MenuSplitGroup/MenuSplitGroup.types.js +0 -3
- package/lib-commonjs/components/MenuSplitGroup/MenuSplitGroup.types.js.map +1 -1
- package/lib-commonjs/components/MenuSplitGroup/index.js +0 -3
- package/lib-commonjs/components/MenuSplitGroup/index.js.map +1 -1
- package/lib-commonjs/components/MenuSplitGroup/renderMenuSplitGroup.js +1 -3
- package/lib-commonjs/components/MenuSplitGroup/renderMenuSplitGroup.js.map +1 -1
- package/lib-commonjs/components/MenuSplitGroup/useMenuSplitGroup.js +1 -3
- package/lib-commonjs/components/MenuSplitGroup/useMenuSplitGroup.js.map +1 -1
- package/lib-commonjs/components/MenuSplitGroup/useMenuSplitGroupStyles.styles.js +0 -2
- package/lib-commonjs/components/MenuSplitGroup/useMenuSplitGroupStyles.styles.js.map +1 -1
- package/lib-commonjs/components/MenuTrigger/MenuTrigger.js +1 -3
- package/lib-commonjs/components/MenuTrigger/MenuTrigger.js.map +1 -1
- package/lib-commonjs/components/MenuTrigger/MenuTrigger.types.js +0 -3
- package/lib-commonjs/components/MenuTrigger/MenuTrigger.types.js.map +1 -1
- package/lib-commonjs/components/MenuTrigger/index.js +0 -3
- package/lib-commonjs/components/MenuTrigger/index.js.map +1 -1
- package/lib-commonjs/components/MenuTrigger/renderMenuTrigger.js +1 -3
- package/lib-commonjs/components/MenuTrigger/renderMenuTrigger.js.map +1 -1
- package/lib-commonjs/components/MenuTrigger/useMenuTrigger.styles.js +0 -2
- package/lib-commonjs/components/MenuTrigger/useMenuTrigger.styles.js.map +1 -1
- package/lib-commonjs/components/index.js +0 -3
- package/lib-commonjs/components/index.js.map +1 -1
- package/lib-commonjs/contexts/menuContext.js +2 -4
- package/lib-commonjs/contexts/menuContext.js.map +1 -1
- package/lib-commonjs/contexts/menuGroupContext.js +1 -3
- package/lib-commonjs/contexts/menuGroupContext.js.map +1 -1
- package/lib-commonjs/contexts/menuListContext.js +2 -4
- package/lib-commonjs/contexts/menuListContext.js.map +1 -1
- package/lib-commonjs/contexts/menuTriggerContext.js +1 -3
- package/lib-commonjs/contexts/menuTriggerContext.js.map +1 -1
- package/lib-commonjs/index.js +0 -3
- package/lib-commonjs/index.js.map +1 -1
- package/lib-commonjs/selectable/index.js +0 -3
- package/lib-commonjs/selectable/index.js.map +1 -1
- package/lib-commonjs/selectable/types.js +0 -3
- package/lib-commonjs/selectable/types.js.map +1 -1
- package/lib-commonjs/selectable/useCheckmarkStyles.styles.js +0 -2
- package/lib-commonjs/selectable/useCheckmarkStyles.styles.js.map +1 -1
- package/lib-commonjs/utils/index.js +0 -3
- package/lib-commonjs/utils/index.js.map +1 -1
- package/lib-commonjs/utils/useIsSubmenu.js +1 -3
- package/lib-commonjs/utils/useIsSubmenu.js.map +1 -1
- package/lib-commonjs/utils/useOnMenuEnter.js +1 -3
- package/lib-commonjs/utils/useOnMenuEnter.js.map +1 -1
- package/package.json +10 -10
@@ -9,7 +9,14 @@ import { MENU_ENTER_EVENT, useOnMenuMouseEnter } from '../../utils/index';
|
|
9
9
|
import { useIsSubmenu } from '../../utils/useIsSubmenu';
|
10
10
|
// If it's not possible to position the submenu in smaller viewports, try
|
11
11
|
// and fallback to this order of positions
|
12
|
-
const submenuFallbackPositions = [
|
12
|
+
const submenuFallbackPositions = [
|
13
|
+
'after',
|
14
|
+
'after-bottom',
|
15
|
+
'before-top',
|
16
|
+
'before',
|
17
|
+
'before-bottom',
|
18
|
+
'above'
|
19
|
+
];
|
13
20
|
/**
|
14
21
|
* Create the state required to render Menu.
|
15
22
|
*
|
@@ -17,252 +24,251 @@ const submenuFallbackPositions = ['after', 'after-bottom', 'before-top', 'before
|
|
17
24
|
* before being passed to renderMenu_unstable.
|
18
25
|
*
|
19
26
|
* @param props - props from this instance of Menu
|
20
|
-
*/
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
...resolvePositioningShorthand(props.positioning)
|
43
|
-
};
|
44
|
-
const children = React.Children.toArray(props.children);
|
45
|
-
if (process.env.NODE_ENV !== 'production') {
|
46
|
-
if (children.length === 0) {
|
47
|
-
// eslint-disable-next-line no-console
|
48
|
-
console.warn('Menu must contain at least one child');
|
27
|
+
*/ export const useMenu_unstable = (props)=>{
|
28
|
+
const isSubmenu = useIsSubmenu();
|
29
|
+
const { hoverDelay =500 , inline =false , hasCheckmarks =false , hasIcons =false , closeOnScroll =false , openOnContext =false , persistOnItemClick =false , openOnHover =isSubmenu , defaultCheckedValues , mountNode =null } = props;
|
30
|
+
const triggerId = useId('menu');
|
31
|
+
const [contextTarget, setContextTarget] = usePositioningMouseTarget();
|
32
|
+
const positioningState = {
|
33
|
+
position: isSubmenu ? 'after' : 'below',
|
34
|
+
align: isSubmenu ? 'top' : 'start',
|
35
|
+
target: props.openOnContext ? contextTarget : undefined,
|
36
|
+
fallbackPositions: isSubmenu ? submenuFallbackPositions : undefined,
|
37
|
+
...resolvePositioningShorthand(props.positioning)
|
38
|
+
};
|
39
|
+
const children = React.Children.toArray(props.children);
|
40
|
+
if (process.env.NODE_ENV !== 'production') {
|
41
|
+
if (children.length === 0) {
|
42
|
+
// eslint-disable-next-line no-console
|
43
|
+
console.warn('Menu must contain at least one child');
|
44
|
+
}
|
45
|
+
if (children.length > 2) {
|
46
|
+
// eslint-disable-next-line no-console
|
47
|
+
console.warn('Menu must contain at most two children');
|
48
|
+
}
|
49
49
|
}
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
let menuTrigger = undefined;
|
51
|
+
let menuPopover = undefined;
|
52
|
+
if (children.length === 2) {
|
53
|
+
menuTrigger = children[0];
|
54
|
+
menuPopover = children[1];
|
55
|
+
} else if (children.length === 1) {
|
56
|
+
menuPopover = children[0];
|
53
57
|
}
|
54
|
-
}
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
menuPopover,
|
98
|
-
mountNode,
|
99
|
-
triggerRef,
|
100
|
-
menuPopoverRef,
|
101
|
-
components: {},
|
102
|
-
openOnContext,
|
103
|
-
open,
|
104
|
-
setOpen,
|
105
|
-
checkedValues,
|
106
|
-
onCheckedValueChange,
|
107
|
-
persistOnItemClick
|
108
|
-
};
|
58
|
+
const { targetRef: triggerRef , containerRef: menuPopoverRef } = usePositioning(positioningState);
|
59
|
+
// TODO Better way to narrow types ?
|
60
|
+
const [open, setOpen] = useMenuOpenState({
|
61
|
+
hoverDelay,
|
62
|
+
isSubmenu,
|
63
|
+
setContextTarget,
|
64
|
+
closeOnScroll,
|
65
|
+
menuPopoverRef,
|
66
|
+
triggerRef,
|
67
|
+
open: props.open,
|
68
|
+
defaultOpen: props.defaultOpen,
|
69
|
+
onOpenChange: props.onOpenChange,
|
70
|
+
openOnContext
|
71
|
+
});
|
72
|
+
const [checkedValues, onCheckedValueChange] = useMenuSelectableState({
|
73
|
+
checkedValues: props.checkedValues,
|
74
|
+
defaultCheckedValues,
|
75
|
+
onCheckedValueChange: props.onCheckedValueChange
|
76
|
+
});
|
77
|
+
return {
|
78
|
+
inline,
|
79
|
+
hoverDelay,
|
80
|
+
triggerId,
|
81
|
+
isSubmenu,
|
82
|
+
openOnHover,
|
83
|
+
contextTarget,
|
84
|
+
setContextTarget,
|
85
|
+
hasCheckmarks,
|
86
|
+
hasIcons,
|
87
|
+
closeOnScroll,
|
88
|
+
menuTrigger,
|
89
|
+
menuPopover,
|
90
|
+
mountNode,
|
91
|
+
triggerRef,
|
92
|
+
menuPopoverRef,
|
93
|
+
components: {},
|
94
|
+
openOnContext,
|
95
|
+
open,
|
96
|
+
setOpen,
|
97
|
+
checkedValues,
|
98
|
+
onCheckedValueChange,
|
99
|
+
persistOnItemClick
|
100
|
+
};
|
109
101
|
};
|
110
102
|
/**
|
111
103
|
* Adds appropriate state values and handlers for selectable items
|
112
104
|
* i.e checkboxes and radios
|
113
|
-
*/
|
114
|
-
const
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
initialState: {}
|
119
|
-
});
|
120
|
-
const onCheckedValueChange = useEventCallback((e, {
|
121
|
-
name,
|
122
|
-
checkedItems
|
123
|
-
}) => {
|
124
|
-
var _props_onCheckedValueChange;
|
125
|
-
(_props_onCheckedValueChange = props.onCheckedValueChange) === null || _props_onCheckedValueChange === void 0 ? void 0 : _props_onCheckedValueChange.call(props, e, {
|
126
|
-
name,
|
127
|
-
checkedItems
|
105
|
+
*/ const useMenuSelectableState = (props)=>{
|
106
|
+
const [checkedValues, setCheckedValues] = useControllableState({
|
107
|
+
state: props.checkedValues,
|
108
|
+
defaultState: props.defaultCheckedValues,
|
109
|
+
initialState: {}
|
128
110
|
});
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
111
|
+
const onCheckedValueChange = useEventCallback((e, { name , checkedItems })=>{
|
112
|
+
var _props_onCheckedValueChange;
|
113
|
+
(_props_onCheckedValueChange = props.onCheckedValueChange) === null || _props_onCheckedValueChange === void 0 ? void 0 : _props_onCheckedValueChange.call(props, e, {
|
114
|
+
name,
|
115
|
+
checkedItems
|
116
|
+
});
|
117
|
+
setCheckedValues((currentValue)=>({
|
118
|
+
...currentValue,
|
119
|
+
[name]: checkedItems
|
120
|
+
}));
|
121
|
+
});
|
122
|
+
return [
|
123
|
+
checkedValues,
|
124
|
+
onCheckedValueChange
|
125
|
+
];
|
135
126
|
};
|
136
|
-
const useMenuOpenState = state
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
var _state_onOpenChange;
|
143
|
-
return (_state_onOpenChange = state.onOpenChange) === null || _state_onOpenChange === void 0 ? void 0 : _state_onOpenChange.call(state, e, data);
|
144
|
-
});
|
145
|
-
const setOpenTimeout = React.useRef(0);
|
146
|
-
const enteringTriggerRef = React.useRef(false);
|
147
|
-
const [open, setOpenState] = useControllableState({
|
148
|
-
state: state.open,
|
149
|
-
defaultState: state.defaultOpen,
|
150
|
-
initialState: false
|
151
|
-
});
|
152
|
-
const trySetOpen = useEventCallback((e, data) => {
|
153
|
-
const event = e instanceof CustomEvent && e.type === MENU_ENTER_EVENT ? e.detail.nativeEvent : e;
|
154
|
-
onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(event, {
|
155
|
-
...data
|
127
|
+
const useMenuOpenState = (state)=>{
|
128
|
+
const { targetDocument } = useFluent();
|
129
|
+
const parentSetOpen = useMenuContext_unstable((context)=>context.setOpen);
|
130
|
+
const onOpenChange = useEventCallback((e, data)=>{
|
131
|
+
var _state_onOpenChange;
|
132
|
+
return (_state_onOpenChange = state.onOpenChange) === null || _state_onOpenChange === void 0 ? void 0 : _state_onOpenChange.call(state, e, data);
|
156
133
|
});
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
setOpenState(data.open);
|
169
|
-
});
|
170
|
-
const setOpen = useEventCallback((e, data) => {
|
171
|
-
clearTimeout(setOpenTimeout.current);
|
172
|
-
if (!(e instanceof Event) && e.persist) {
|
173
|
-
// < React 17 still uses pooled synthetic events
|
174
|
-
e.persist();
|
175
|
-
}
|
176
|
-
if (e.type === 'mouseleave' || e.type === 'mouseenter' || e.type === 'mousemove' || e.type === MENU_ENTER_EVENT) {
|
177
|
-
var _state_triggerRef_current;
|
178
|
-
if ((_state_triggerRef_current = state.triggerRef.current) === null || _state_triggerRef_current === void 0 ? void 0 : _state_triggerRef_current.contains(e.target)) {
|
179
|
-
enteringTriggerRef.current = e.type === 'mouseenter' || e.type === 'mousemove';
|
180
|
-
}
|
181
|
-
// FIXME leaking Node timeout type
|
182
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
183
|
-
// @ts-ignore
|
184
|
-
setOpenTimeout.current = setTimeout(() => trySetOpen(e, data), state.hoverDelay);
|
185
|
-
} else {
|
186
|
-
trySetOpen(e, data);
|
187
|
-
}
|
188
|
-
});
|
189
|
-
useOnClickOutside({
|
190
|
-
contains: elementContains,
|
191
|
-
disabled: !open,
|
192
|
-
element: targetDocument,
|
193
|
-
refs: [state.menuPopoverRef, !state.openOnContext && state.triggerRef].filter(Boolean),
|
194
|
-
callback: event => setOpen(event, {
|
195
|
-
open: false,
|
196
|
-
type: 'clickOutside',
|
197
|
-
event
|
198
|
-
})
|
199
|
-
});
|
200
|
-
// only close on scroll for context, or when closeOnScroll is specified
|
201
|
-
const closeOnScroll = state.openOnContext || state.closeOnScroll;
|
202
|
-
useOnScrollOutside({
|
203
|
-
contains: elementContains,
|
204
|
-
element: targetDocument,
|
205
|
-
callback: event => setOpen(event, {
|
206
|
-
open: false,
|
207
|
-
type: 'scrollOutside',
|
208
|
-
event
|
209
|
-
}),
|
210
|
-
refs: [state.menuPopoverRef, !state.openOnContext && state.triggerRef].filter(Boolean),
|
211
|
-
disabled: !open || !closeOnScroll
|
212
|
-
});
|
213
|
-
useOnMenuMouseEnter({
|
214
|
-
element: targetDocument,
|
215
|
-
callback: event => {
|
216
|
-
// When moving from a menu directly back to its trigger, this handler can close the menu
|
217
|
-
// Explicitly check a flag to see if this situation happens
|
218
|
-
if (!enteringTriggerRef.current) {
|
219
|
-
setOpen(event, {
|
220
|
-
open: false,
|
221
|
-
type: 'menuMouseEnter',
|
222
|
-
event
|
134
|
+
const setOpenTimeout = React.useRef(0);
|
135
|
+
const enteringTriggerRef = React.useRef(false);
|
136
|
+
const [open, setOpenState] = useControllableState({
|
137
|
+
state: state.open,
|
138
|
+
defaultState: state.defaultOpen,
|
139
|
+
initialState: false
|
140
|
+
});
|
141
|
+
const trySetOpen = useEventCallback((e, data)=>{
|
142
|
+
const event = e instanceof CustomEvent && e.type === MENU_ENTER_EVENT ? e.detail.nativeEvent : e;
|
143
|
+
onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(event, {
|
144
|
+
...data
|
223
145
|
});
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
146
|
+
if (data.open && e.type === 'contextmenu') {
|
147
|
+
state.setContextTarget(e);
|
148
|
+
}
|
149
|
+
if (!data.open) {
|
150
|
+
state.setContextTarget(undefined);
|
151
|
+
}
|
152
|
+
if (data.bubble) {
|
153
|
+
parentSetOpen(e, {
|
154
|
+
...data
|
155
|
+
});
|
156
|
+
}
|
157
|
+
setOpenState(data.open);
|
158
|
+
});
|
159
|
+
const setOpen = useEventCallback((e, data)=>{
|
160
|
+
clearTimeout(setOpenTimeout.current);
|
161
|
+
if (!(e instanceof Event) && e.persist) {
|
162
|
+
// < React 17 still uses pooled synthetic events
|
163
|
+
e.persist();
|
164
|
+
}
|
165
|
+
if (e.type === 'mouseleave' || e.type === 'mouseenter' || e.type === 'mousemove' || e.type === MENU_ENTER_EVENT) {
|
166
|
+
var _state_triggerRef_current;
|
167
|
+
if ((_state_triggerRef_current = state.triggerRef.current) === null || _state_triggerRef_current === void 0 ? void 0 : _state_triggerRef_current.contains(e.target)) {
|
168
|
+
enteringTriggerRef.current = e.type === 'mouseenter' || e.type === 'mousemove';
|
169
|
+
}
|
170
|
+
// FIXME leaking Node timeout type
|
171
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
172
|
+
// @ts-ignore
|
173
|
+
setOpenTimeout.current = setTimeout(()=>trySetOpen(e, data), state.hoverDelay);
|
174
|
+
} else {
|
175
|
+
trySetOpen(e, data);
|
176
|
+
}
|
177
|
+
});
|
178
|
+
useOnClickOutside({
|
179
|
+
contains: elementContains,
|
180
|
+
disabled: !open,
|
181
|
+
element: targetDocument,
|
182
|
+
refs: [
|
183
|
+
state.menuPopoverRef,
|
184
|
+
!state.openOnContext && state.triggerRef
|
185
|
+
].filter(Boolean),
|
186
|
+
callback: (event)=>setOpen(event, {
|
187
|
+
open: false,
|
188
|
+
type: 'clickOutside',
|
189
|
+
event
|
190
|
+
})
|
191
|
+
});
|
192
|
+
// only close on scroll for context, or when closeOnScroll is specified
|
193
|
+
const closeOnScroll = state.openOnContext || state.closeOnScroll;
|
194
|
+
useOnScrollOutside({
|
195
|
+
contains: elementContains,
|
196
|
+
element: targetDocument,
|
197
|
+
callback: (event)=>setOpen(event, {
|
198
|
+
open: false,
|
199
|
+
type: 'scrollOutside',
|
200
|
+
event
|
201
|
+
}),
|
202
|
+
refs: [
|
203
|
+
state.menuPopoverRef,
|
204
|
+
!state.openOnContext && state.triggerRef
|
205
|
+
].filter(Boolean),
|
206
|
+
disabled: !open || !closeOnScroll
|
207
|
+
});
|
208
|
+
useOnMenuMouseEnter({
|
209
|
+
element: targetDocument,
|
210
|
+
callback: (event)=>{
|
211
|
+
// When moving from a menu directly back to its trigger, this handler can close the menu
|
212
|
+
// Explicitly check a flag to see if this situation happens
|
213
|
+
if (!enteringTriggerRef.current) {
|
214
|
+
setOpen(event, {
|
215
|
+
open: false,
|
216
|
+
type: 'menuMouseEnter',
|
217
|
+
event
|
218
|
+
});
|
219
|
+
}
|
220
|
+
},
|
221
|
+
disabled: !open,
|
222
|
+
refs: [
|
223
|
+
state.menuPopoverRef
|
224
|
+
]
|
225
|
+
});
|
226
|
+
// Clear timeout on unmount
|
227
|
+
// Setting state after a component unmounts can cause memory leaks
|
228
|
+
React.useEffect(()=>{
|
229
|
+
return ()=>{
|
230
|
+
clearTimeout(setOpenTimeout.current);
|
231
|
+
};
|
232
|
+
}, []);
|
233
|
+
// Manage focus for open state
|
234
|
+
const { findFirstFocusable } = useFocusFinders();
|
235
|
+
const focusFirst = React.useCallback(()=>{
|
236
|
+
const firstFocusable = findFirstFocusable(state.menuPopoverRef.current);
|
237
|
+
firstFocusable === null || firstFocusable === void 0 ? void 0 : firstFocusable.focus();
|
238
|
+
}, [
|
239
|
+
findFirstFocusable,
|
240
|
+
state.menuPopoverRef
|
241
|
+
]);
|
242
|
+
const firstMount = useFirstMount();
|
243
|
+
React.useEffect(()=>{
|
244
|
+
if (open) {
|
245
|
+
focusFirst();
|
246
|
+
} else {
|
247
|
+
if (!firstMount) {
|
248
|
+
if ((targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.activeElement) === (targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.body)) {
|
249
|
+
var // We know that React effects are sync so we focus the trigger here
|
250
|
+
// after any event handler (event handlers will update state and re-render).
|
251
|
+
// Since the browser only performs the default behaviour for the Tab key once
|
252
|
+
// keyboard events have fully bubbled up the window, the browser will move
|
253
|
+
// focus to the next tabbable element before/after the trigger if needed.
|
254
|
+
// If the Tab key was not pressed, focus will remain on the trigger as expected.
|
255
|
+
_state_triggerRef_current;
|
256
|
+
(_state_triggerRef_current = state.triggerRef.current) === null || _state_triggerRef_current === void 0 ? void 0 : _state_triggerRef_current.focus();
|
257
|
+
}
|
258
|
+
}
|
260
259
|
}
|
261
|
-
}
|
262
|
-
}
|
263
260
|
// firstMount change should not re-run this effect
|
264
261
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
265
|
-
|
266
|
-
|
262
|
+
}, [
|
263
|
+
state.triggerRef,
|
264
|
+
state.isSubmenu,
|
265
|
+
open,
|
266
|
+
focusFirst,
|
267
|
+
targetDocument,
|
268
|
+
state.menuPopoverRef
|
269
|
+
]);
|
270
|
+
return [
|
271
|
+
open,
|
272
|
+
setOpen
|
273
|
+
];
|
267
274
|
};
|
268
|
-
//# sourceMappingURL=useMenu.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["React","usePositioningMouseTarget","usePositioning","resolvePositioningShorthand","useControllableState","useId","useOnClickOutside","useEventCallback","useOnScrollOutside","useFirstMount","useFluent_unstable","useFluent","elementContains","useFocusFinders","useMenuContext_unstable","MENU_ENTER_EVENT","useOnMenuMouseEnter","useIsSubmenu","submenuFallbackPositions","useMenu_unstable","props","isSubmenu","hoverDelay","inline","hasCheckmarks","hasIcons","closeOnScroll","openOnContext","persistOnItemClick","openOnHover","defaultCheckedValues","mountNode","triggerId","contextTarget","setContextTarget","positioningState","position","align","target","undefined","fallbackPositions","positioning","children","Children","toArray","process","env","NODE_ENV","length","console","warn","menuTrigger","menuPopover","targetRef","triggerRef","containerRef","menuPopoverRef","open","setOpen","useMenuOpenState","defaultOpen","onOpenChange","checkedValues","onCheckedValueChange","useMenuSelectableState","components","setCheckedValues","state","defaultState","initialState","e","name","checkedItems","_props_onCheckedValueChange","call","currentValue","targetDocument","parentSetOpen","context","data","_state_onOpenChange","setOpenTimeout","useRef","enteringTriggerRef","setOpenState","trySetOpen","event","CustomEvent","type","detail","nativeEvent","bubble","clearTimeout","current","Event","persist","_state_triggerRef_current","contains","setTimeout","disabled","element","refs","filter","Boolean","callback","useEffect","findFirstFocusable","focusFirst","useCallback","firstFocusable","focus","firstMount","activeElement","body"],"sources":["../../../src/components/Menu/useMenu.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n usePositioningMouseTarget,\n usePositioning,\n resolvePositioningShorthand,\n PositioningShorthandValue,\n} from '@fluentui/react-positioning';\nimport {\n useControllableState,\n useId,\n useOnClickOutside,\n useEventCallback,\n useOnScrollOutside,\n useFirstMount,\n} from '@fluentui/react-utilities';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\nimport { elementContains } from '@fluentui/react-portal';\nimport { useFocusFinders } from '@fluentui/react-tabster';\nimport { useMenuContext_unstable } from '../../contexts/menuContext';\nimport { MENU_ENTER_EVENT, useOnMenuMouseEnter } from '../../utils/index';\nimport { useIsSubmenu } from '../../utils/useIsSubmenu';\nimport type { MenuOpenChangeData, MenuOpenEvent, MenuProps, MenuState } from './Menu.types';\n\n// If it's not possible to position the submenu in smaller viewports, try\n// and fallback to this order of positions\nconst submenuFallbackPositions: PositioningShorthandValue[] = [\n 'after',\n 'after-bottom',\n 'before-top',\n 'before',\n 'before-bottom',\n 'above',\n];\n\n/**\n * Create the state required to render Menu.\n *\n * The returned state can be modified with hooks such as useMenuStyles,\n * before being passed to renderMenu_unstable.\n *\n * @param props - props from this instance of Menu\n */\nexport const useMenu_unstable = (props: MenuProps): MenuState => {\n const isSubmenu = useIsSubmenu();\n const {\n hoverDelay = 500,\n inline = false,\n hasCheckmarks = false,\n hasIcons = false,\n closeOnScroll = false,\n openOnContext = false,\n persistOnItemClick = false,\n openOnHover = isSubmenu,\n defaultCheckedValues,\n mountNode = null,\n } = props;\n const triggerId = useId('menu');\n const [contextTarget, setContextTarget] = usePositioningMouseTarget();\n\n const positioningState = {\n position: isSubmenu ? 'after' : 'below',\n align: isSubmenu ? 'top' : 'start',\n target: props.openOnContext ? contextTarget : undefined,\n fallbackPositions: isSubmenu ? submenuFallbackPositions : undefined,\n ...resolvePositioningShorthand(props.positioning),\n } as const;\n\n const children = React.Children.toArray(props.children) as React.ReactElement[];\n\n if (process.env.NODE_ENV !== 'production') {\n if (children.length === 0) {\n // eslint-disable-next-line no-console\n console.warn('Menu must contain at least one child');\n }\n\n if (children.length > 2) {\n // eslint-disable-next-line no-console\n console.warn('Menu must contain at most two children');\n }\n }\n\n let menuTrigger: React.ReactElement | undefined = undefined;\n let menuPopover: React.ReactElement | undefined = undefined;\n if (children.length === 2) {\n menuTrigger = children[0];\n menuPopover = children[1];\n } else if (children.length === 1) {\n menuPopover = children[0];\n }\n\n const { targetRef: triggerRef, containerRef: menuPopoverRef } = usePositioning(positioningState);\n\n // TODO Better way to narrow types ?\n const [open, setOpen] = useMenuOpenState({\n hoverDelay,\n isSubmenu,\n setContextTarget,\n closeOnScroll,\n menuPopoverRef,\n triggerRef,\n open: props.open,\n defaultOpen: props.defaultOpen,\n onOpenChange: props.onOpenChange,\n openOnContext,\n });\n\n const [checkedValues, onCheckedValueChange] = useMenuSelectableState({\n checkedValues: props.checkedValues,\n defaultCheckedValues,\n onCheckedValueChange: props.onCheckedValueChange,\n });\n\n return {\n inline,\n hoverDelay,\n triggerId,\n isSubmenu,\n openOnHover,\n contextTarget,\n setContextTarget,\n hasCheckmarks,\n hasIcons,\n closeOnScroll,\n menuTrigger,\n menuPopover,\n mountNode,\n triggerRef,\n menuPopoverRef,\n components: {},\n openOnContext,\n open,\n setOpen,\n checkedValues,\n onCheckedValueChange,\n persistOnItemClick,\n };\n};\n\n/**\n * Adds appropriate state values and handlers for selectable items\n * i.e checkboxes and radios\n */\nconst useMenuSelectableState = (\n props: Pick<MenuProps, 'checkedValues' | 'defaultCheckedValues' | 'onCheckedValueChange'>,\n) => {\n const [checkedValues, setCheckedValues] = useControllableState({\n state: props.checkedValues,\n defaultState: props.defaultCheckedValues,\n initialState: {},\n });\n const onCheckedValueChange: MenuState['onCheckedValueChange'] = useEventCallback((e, { name, checkedItems }) => {\n props.onCheckedValueChange?.(e, { name, checkedItems });\n\n setCheckedValues(currentValue => ({\n ...currentValue,\n [name]: checkedItems,\n }));\n });\n\n return [checkedValues, onCheckedValueChange] as const;\n};\n\nconst useMenuOpenState = (\n state: Pick<\n MenuState,\n | 'isSubmenu'\n | 'menuPopoverRef'\n | 'setContextTarget'\n | 'triggerRef'\n | 'openOnContext'\n | 'closeOnScroll'\n | 'hoverDelay'\n > &\n Pick<MenuProps, 'open' | 'defaultOpen' | 'onOpenChange'>,\n) => {\n const { targetDocument } = useFluent();\n const parentSetOpen = useMenuContext_unstable(context => context.setOpen);\n const onOpenChange: MenuProps['onOpenChange'] = useEventCallback((e, data) => state.onOpenChange?.(e, data));\n\n const setOpenTimeout = React.useRef(0);\n const enteringTriggerRef = React.useRef(false);\n\n const [open, setOpenState] = useControllableState({\n state: state.open,\n defaultState: state.defaultOpen,\n initialState: false,\n });\n\n const trySetOpen = useEventCallback((e: MenuOpenEvent, data: MenuOpenChangeData) => {\n const event = e instanceof CustomEvent && e.type === MENU_ENTER_EVENT ? e.detail.nativeEvent : e;\n onOpenChange?.(event, { ...data });\n if (data.open && e.type === 'contextmenu') {\n state.setContextTarget(e as React.MouseEvent);\n }\n\n if (!data.open) {\n state.setContextTarget(undefined);\n }\n\n if (data.bubble) {\n parentSetOpen(e, { ...data });\n }\n\n setOpenState(data.open);\n });\n\n const setOpen = useEventCallback((e: MenuOpenEvent, data: MenuOpenChangeData) => {\n clearTimeout(setOpenTimeout.current);\n if (!(e instanceof Event) && e.persist) {\n // < React 17 still uses pooled synthetic events\n e.persist();\n }\n\n if (e.type === 'mouseleave' || e.type === 'mouseenter' || e.type === 'mousemove' || e.type === MENU_ENTER_EVENT) {\n if (state.triggerRef.current?.contains(e.target as HTMLElement)) {\n enteringTriggerRef.current = e.type === 'mouseenter' || e.type === 'mousemove';\n }\n\n // FIXME leaking Node timeout type\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n setOpenTimeout.current = setTimeout(() => trySetOpen(e, data), state.hoverDelay);\n } else {\n trySetOpen(e, data);\n }\n });\n\n useOnClickOutside({\n contains: elementContains,\n disabled: !open,\n element: targetDocument,\n refs: [state.menuPopoverRef, !state.openOnContext && state.triggerRef].filter(\n Boolean,\n ) as React.MutableRefObject<HTMLElement>[],\n callback: event => setOpen(event, { open: false, type: 'clickOutside', event }),\n });\n\n // only close on scroll for context, or when closeOnScroll is specified\n const closeOnScroll = state.openOnContext || state.closeOnScroll;\n useOnScrollOutside({\n contains: elementContains,\n element: targetDocument,\n callback: event => setOpen(event, { open: false, type: 'scrollOutside', event }),\n refs: [state.menuPopoverRef, !state.openOnContext && state.triggerRef].filter(\n Boolean,\n ) as React.MutableRefObject<HTMLElement>[],\n disabled: !open || !closeOnScroll,\n });\n\n useOnMenuMouseEnter({\n element: targetDocument,\n callback: event => {\n // When moving from a menu directly back to its trigger, this handler can close the menu\n // Explicitly check a flag to see if this situation happens\n if (!enteringTriggerRef.current) {\n setOpen(event, { open: false, type: 'menuMouseEnter', event });\n }\n },\n disabled: !open,\n refs: [state.menuPopoverRef],\n });\n\n // Clear timeout on unmount\n // Setting state after a component unmounts can cause memory leaks\n React.useEffect(() => {\n return () => {\n clearTimeout(setOpenTimeout.current);\n };\n }, []);\n\n // Manage focus for open state\n const { findFirstFocusable } = useFocusFinders();\n const focusFirst = React.useCallback(() => {\n const firstFocusable = findFirstFocusable(state.menuPopoverRef.current);\n firstFocusable?.focus();\n }, [findFirstFocusable, state.menuPopoverRef]);\n\n const firstMount = useFirstMount();\n React.useEffect(() => {\n if (open) {\n focusFirst();\n } else {\n if (!firstMount) {\n if (targetDocument?.activeElement === targetDocument?.body) {\n // We know that React effects are sync so we focus the trigger here\n // after any event handler (event handlers will update state and re-render).\n // Since the browser only performs the default behaviour for the Tab key once\n // keyboard events have fully bubbled up the window, the browser will move\n // focus to the next tabbable element before/after the trigger if needed.\n // If the Tab key was not pressed, focus will remain on the trigger as expected.\n state.triggerRef.current?.focus();\n }\n }\n }\n // firstMount change should not re-run this effect\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.triggerRef, state.isSubmenu, open, focusFirst, targetDocument, state.menuPopoverRef]);\n\n return [open, setOpen] as const;\n};\n"],"mappings":"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"}
|
1
|
+
{"version":3,"sources":["useMenu.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n usePositioningMouseTarget,\n usePositioning,\n resolvePositioningShorthand,\n PositioningShorthandValue,\n} from '@fluentui/react-positioning';\nimport {\n useControllableState,\n useId,\n useOnClickOutside,\n useEventCallback,\n useOnScrollOutside,\n useFirstMount,\n} from '@fluentui/react-utilities';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\nimport { elementContains } from '@fluentui/react-portal';\nimport { useFocusFinders } from '@fluentui/react-tabster';\nimport { useMenuContext_unstable } from '../../contexts/menuContext';\nimport { MENU_ENTER_EVENT, useOnMenuMouseEnter } from '../../utils/index';\nimport { useIsSubmenu } from '../../utils/useIsSubmenu';\nimport type { MenuOpenChangeData, MenuOpenEvent, MenuProps, MenuState } from './Menu.types';\n\n// If it's not possible to position the submenu in smaller viewports, try\n// and fallback to this order of positions\nconst submenuFallbackPositions: PositioningShorthandValue[] = [\n 'after',\n 'after-bottom',\n 'before-top',\n 'before',\n 'before-bottom',\n 'above',\n];\n\n/**\n * Create the state required to render Menu.\n *\n * The returned state can be modified with hooks such as useMenuStyles,\n * before being passed to renderMenu_unstable.\n *\n * @param props - props from this instance of Menu\n */\nexport const useMenu_unstable = (props: MenuProps): MenuState => {\n const isSubmenu = useIsSubmenu();\n const {\n hoverDelay = 500,\n inline = false,\n hasCheckmarks = false,\n hasIcons = false,\n closeOnScroll = false,\n openOnContext = false,\n persistOnItemClick = false,\n openOnHover = isSubmenu,\n defaultCheckedValues,\n mountNode = null,\n } = props;\n const triggerId = useId('menu');\n const [contextTarget, setContextTarget] = usePositioningMouseTarget();\n\n const positioningState = {\n position: isSubmenu ? 'after' : 'below',\n align: isSubmenu ? 'top' : 'start',\n target: props.openOnContext ? contextTarget : undefined,\n fallbackPositions: isSubmenu ? submenuFallbackPositions : undefined,\n ...resolvePositioningShorthand(props.positioning),\n } as const;\n\n const children = React.Children.toArray(props.children) as React.ReactElement[];\n\n if (process.env.NODE_ENV !== 'production') {\n if (children.length === 0) {\n // eslint-disable-next-line no-console\n console.warn('Menu must contain at least one child');\n }\n\n if (children.length > 2) {\n // eslint-disable-next-line no-console\n console.warn('Menu must contain at most two children');\n }\n }\n\n let menuTrigger: React.ReactElement | undefined = undefined;\n let menuPopover: React.ReactElement | undefined = undefined;\n if (children.length === 2) {\n menuTrigger = children[0];\n menuPopover = children[1];\n } else if (children.length === 1) {\n menuPopover = children[0];\n }\n\n const { targetRef: triggerRef, containerRef: menuPopoverRef } = usePositioning(positioningState);\n\n // TODO Better way to narrow types ?\n const [open, setOpen] = useMenuOpenState({\n hoverDelay,\n isSubmenu,\n setContextTarget,\n closeOnScroll,\n menuPopoverRef,\n triggerRef,\n open: props.open,\n defaultOpen: props.defaultOpen,\n onOpenChange: props.onOpenChange,\n openOnContext,\n });\n\n const [checkedValues, onCheckedValueChange] = useMenuSelectableState({\n checkedValues: props.checkedValues,\n defaultCheckedValues,\n onCheckedValueChange: props.onCheckedValueChange,\n });\n\n return {\n inline,\n hoverDelay,\n triggerId,\n isSubmenu,\n openOnHover,\n contextTarget,\n setContextTarget,\n hasCheckmarks,\n hasIcons,\n closeOnScroll,\n menuTrigger,\n menuPopover,\n mountNode,\n triggerRef,\n menuPopoverRef,\n components: {},\n openOnContext,\n open,\n setOpen,\n checkedValues,\n onCheckedValueChange,\n persistOnItemClick,\n };\n};\n\n/**\n * Adds appropriate state values and handlers for selectable items\n * i.e checkboxes and radios\n */\nconst useMenuSelectableState = (\n props: Pick<MenuProps, 'checkedValues' | 'defaultCheckedValues' | 'onCheckedValueChange'>,\n) => {\n const [checkedValues, setCheckedValues] = useControllableState({\n state: props.checkedValues,\n defaultState: props.defaultCheckedValues,\n initialState: {},\n });\n const onCheckedValueChange: MenuState['onCheckedValueChange'] = useEventCallback((e, { name, checkedItems }) => {\n props.onCheckedValueChange?.(e, { name, checkedItems });\n\n setCheckedValues(currentValue => ({\n ...currentValue,\n [name]: checkedItems,\n }));\n });\n\n return [checkedValues, onCheckedValueChange] as const;\n};\n\nconst useMenuOpenState = (\n state: Pick<\n MenuState,\n | 'isSubmenu'\n | 'menuPopoverRef'\n | 'setContextTarget'\n | 'triggerRef'\n | 'openOnContext'\n | 'closeOnScroll'\n | 'hoverDelay'\n > &\n Pick<MenuProps, 'open' | 'defaultOpen' | 'onOpenChange'>,\n) => {\n const { targetDocument } = useFluent();\n const parentSetOpen = useMenuContext_unstable(context => context.setOpen);\n const onOpenChange: MenuProps['onOpenChange'] = useEventCallback((e, data) => state.onOpenChange?.(e, data));\n\n const setOpenTimeout = React.useRef(0);\n const enteringTriggerRef = React.useRef(false);\n\n const [open, setOpenState] = useControllableState({\n state: state.open,\n defaultState: state.defaultOpen,\n initialState: false,\n });\n\n const trySetOpen = useEventCallback((e: MenuOpenEvent, data: MenuOpenChangeData) => {\n const event = e instanceof CustomEvent && e.type === MENU_ENTER_EVENT ? e.detail.nativeEvent : e;\n onOpenChange?.(event, { ...data });\n if (data.open && e.type === 'contextmenu') {\n state.setContextTarget(e as React.MouseEvent);\n }\n\n if (!data.open) {\n state.setContextTarget(undefined);\n }\n\n if (data.bubble) {\n parentSetOpen(e, { ...data });\n }\n\n setOpenState(data.open);\n });\n\n const setOpen = useEventCallback((e: MenuOpenEvent, data: MenuOpenChangeData) => {\n clearTimeout(setOpenTimeout.current);\n if (!(e instanceof Event) && e.persist) {\n // < React 17 still uses pooled synthetic events\n e.persist();\n }\n\n if (e.type === 'mouseleave' || e.type === 'mouseenter' || e.type === 'mousemove' || e.type === MENU_ENTER_EVENT) {\n if (state.triggerRef.current?.contains(e.target as HTMLElement)) {\n enteringTriggerRef.current = e.type === 'mouseenter' || e.type === 'mousemove';\n }\n\n // FIXME leaking Node timeout type\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n setOpenTimeout.current = setTimeout(() => trySetOpen(e, data), state.hoverDelay);\n } else {\n trySetOpen(e, data);\n }\n });\n\n useOnClickOutside({\n contains: elementContains,\n disabled: !open,\n element: targetDocument,\n refs: [state.menuPopoverRef, !state.openOnContext && state.triggerRef].filter(\n Boolean,\n ) as React.MutableRefObject<HTMLElement>[],\n callback: event => setOpen(event, { open: false, type: 'clickOutside', event }),\n });\n\n // only close on scroll for context, or when closeOnScroll is specified\n const closeOnScroll = state.openOnContext || state.closeOnScroll;\n useOnScrollOutside({\n contains: elementContains,\n element: targetDocument,\n callback: event => setOpen(event, { open: false, type: 'scrollOutside', event }),\n refs: [state.menuPopoverRef, !state.openOnContext && state.triggerRef].filter(\n Boolean,\n ) as React.MutableRefObject<HTMLElement>[],\n disabled: !open || !closeOnScroll,\n });\n\n useOnMenuMouseEnter({\n element: targetDocument,\n callback: event => {\n // When moving from a menu directly back to its trigger, this handler can close the menu\n // Explicitly check a flag to see if this situation happens\n if (!enteringTriggerRef.current) {\n setOpen(event, { open: false, type: 'menuMouseEnter', event });\n }\n },\n disabled: !open,\n refs: [state.menuPopoverRef],\n });\n\n // Clear timeout on unmount\n // Setting state after a component unmounts can cause memory leaks\n React.useEffect(() => {\n return () => {\n clearTimeout(setOpenTimeout.current);\n };\n }, []);\n\n // Manage focus for open state\n const { findFirstFocusable } = useFocusFinders();\n const focusFirst = React.useCallback(() => {\n const firstFocusable = findFirstFocusable(state.menuPopoverRef.current);\n firstFocusable?.focus();\n }, [findFirstFocusable, state.menuPopoverRef]);\n\n const firstMount = useFirstMount();\n React.useEffect(() => {\n if (open) {\n focusFirst();\n } else {\n if (!firstMount) {\n if (targetDocument?.activeElement === targetDocument?.body) {\n // We know that React effects are sync so we focus the trigger here\n // after any event handler (event handlers will update state and re-render).\n // Since the browser only performs the default behaviour for the Tab key once\n // keyboard events have fully bubbled up the window, the browser will move\n // focus to the next tabbable element before/after the trigger if needed.\n // If the Tab key was not pressed, focus will remain on the trigger as expected.\n state.triggerRef.current?.focus();\n }\n }\n }\n // firstMount change should not re-run this effect\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.triggerRef, state.isSubmenu, open, focusFirst, targetDocument, state.menuPopoverRef]);\n\n return [open, setOpen] as const;\n};\n"],"names":["React","usePositioningMouseTarget","usePositioning","resolvePositioningShorthand","useControllableState","useId","useOnClickOutside","useEventCallback","useOnScrollOutside","useFirstMount","useFluent_unstable","useFluent","elementContains","useFocusFinders","useMenuContext_unstable","MENU_ENTER_EVENT","useOnMenuMouseEnter","useIsSubmenu","submenuFallbackPositions","useMenu_unstable","props","isSubmenu","hoverDelay","inline","hasCheckmarks","hasIcons","closeOnScroll","openOnContext","persistOnItemClick","openOnHover","defaultCheckedValues","mountNode","triggerId","contextTarget","setContextTarget","positioningState","position","align","target","undefined","fallbackPositions","positioning","children","Children","toArray","process","env","NODE_ENV","length","console","warn","menuTrigger","menuPopover","targetRef","triggerRef","containerRef","menuPopoverRef","open","setOpen","useMenuOpenState","defaultOpen","onOpenChange","checkedValues","onCheckedValueChange","useMenuSelectableState","components","setCheckedValues","state","defaultState","initialState","e","name","checkedItems","currentValue","targetDocument","parentSetOpen","context","data","setOpenTimeout","useRef","enteringTriggerRef","setOpenState","trySetOpen","event","CustomEvent","type","detail","nativeEvent","bubble","clearTimeout","current","Event","persist","contains","setTimeout","disabled","element","refs","filter","Boolean","callback","useEffect","findFirstFocusable","focusFirst","useCallback","firstFocusable","focus","firstMount","activeElement","body"],"mappings":"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"}
|