@fluentui/react-menu 0.0.0-nightly-20230529-0417.1 → 0.0.0-nightly-20230530-0415.1

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.
Files changed (254) hide show
  1. package/CHANGELOG.json +25 -25
  2. package/CHANGELOG.md +15 -15
  3. package/lib/Menu.js +1 -0
  4. package/lib/Menu.js.map +1 -1
  5. package/lib/MenuDivider.js +1 -0
  6. package/lib/MenuDivider.js.map +1 -1
  7. package/lib/MenuGroup.js +1 -0
  8. package/lib/MenuGroup.js.map +1 -1
  9. package/lib/MenuGroupHeader.js +1 -0
  10. package/lib/MenuGroupHeader.js.map +1 -1
  11. package/lib/MenuItem.js +1 -0
  12. package/lib/MenuItem.js.map +1 -1
  13. package/lib/MenuItemCheckbox.js +1 -0
  14. package/lib/MenuItemCheckbox.js.map +1 -1
  15. package/lib/MenuItemRadio.js +1 -0
  16. package/lib/MenuItemRadio.js.map +1 -1
  17. package/lib/MenuList.js +1 -0
  18. package/lib/MenuList.js.map +1 -1
  19. package/lib/MenuPopover.js +1 -0
  20. package/lib/MenuPopover.js.map +1 -1
  21. package/lib/MenuSplitGroup.js +1 -0
  22. package/lib/MenuSplitGroup.js.map +1 -1
  23. package/lib/MenuTrigger.js +1 -0
  24. package/lib/MenuTrigger.js.map +1 -1
  25. package/lib/components/Menu/Menu.js +5 -5
  26. package/lib/components/Menu/Menu.js.map +1 -1
  27. package/lib/components/Menu/Menu.types.js +1 -0
  28. package/lib/components/Menu/Menu.types.js.map +1 -1
  29. package/lib/components/Menu/index.js +1 -0
  30. package/lib/components/Menu/index.js.map +1 -1
  31. package/lib/components/Menu/renderMenu.js +5 -5
  32. package/lib/components/Menu/renderMenu.js.map +1 -1
  33. package/lib/components/Menu/useMenu.js +243 -235
  34. package/lib/components/Menu/useMenu.js.map +1 -1
  35. package/lib/components/Menu/useMenuContextValues.js +23 -38
  36. package/lib/components/Menu/useMenuContextValues.js.map +1 -1
  37. package/lib/components/MenuDivider/MenuDivider.js +6 -6
  38. package/lib/components/MenuDivider/MenuDivider.js.map +1 -1
  39. package/lib/components/MenuDivider/MenuDivider.types.js +2 -1
  40. package/lib/components/MenuDivider/MenuDivider.types.js.map +1 -1
  41. package/lib/components/MenuDivider/index.js +1 -0
  42. package/lib/components/MenuDivider/index.js.map +1 -1
  43. package/lib/components/MenuDivider/renderMenuDivider.js +5 -8
  44. package/lib/components/MenuDivider/renderMenuDivider.js.map +1 -1
  45. package/lib/components/MenuDivider/useMenuDivider.js +13 -13
  46. package/lib/components/MenuDivider/useMenuDivider.js.map +1 -1
  47. package/lib/components/MenuDivider/useMenuDividerStyles.styles.js.map +1 -1
  48. package/lib/components/MenuGroup/MenuGroup.js +7 -7
  49. package/lib/components/MenuGroup/MenuGroup.js.map +1 -1
  50. package/lib/components/MenuGroup/MenuGroup.types.js +2 -1
  51. package/lib/components/MenuGroup/MenuGroup.types.js.map +1 -1
  52. package/lib/components/MenuGroup/index.js +1 -0
  53. package/lib/components/MenuGroup/index.js.map +1 -1
  54. package/lib/components/MenuGroup/renderMenuGroup.js +7 -10
  55. package/lib/components/MenuGroup/renderMenuGroup.js.map +1 -1
  56. package/lib/components/MenuGroup/useMenuGroup.js +15 -15
  57. package/lib/components/MenuGroup/useMenuGroup.js.map +1 -1
  58. package/lib/components/MenuGroup/useMenuGroupContextValues.js +10 -9
  59. package/lib/components/MenuGroup/useMenuGroupContextValues.js.map +1 -1
  60. package/lib/components/MenuGroupHeader/MenuGroupHeader.js +6 -6
  61. package/lib/components/MenuGroupHeader/MenuGroupHeader.js.map +1 -1
  62. package/lib/components/MenuGroupHeader/MenuGroupHeader.types.js +2 -1
  63. package/lib/components/MenuGroupHeader/MenuGroupHeader.types.js.map +1 -1
  64. package/lib/components/MenuGroupHeader/index.js +1 -0
  65. package/lib/components/MenuGroupHeader/index.js.map +1 -1
  66. package/lib/components/MenuGroupHeader/renderMenuGroupHeader.js +5 -8
  67. package/lib/components/MenuGroupHeader/renderMenuGroupHeader.js.map +1 -1
  68. package/lib/components/MenuGroupHeader/useMenuGroupHeader.js +13 -15
  69. package/lib/components/MenuGroupHeader/useMenuGroupHeader.js.map +1 -1
  70. package/lib/components/MenuGroupHeader/useMenuGroupHeaderStyles.styles.js.map +1 -1
  71. package/lib/components/MenuItem/MenuItem.js +6 -6
  72. package/lib/components/MenuItem/MenuItem.js.map +1 -1
  73. package/lib/components/MenuItem/MenuItem.types.js +2 -1
  74. package/lib/components/MenuItem/MenuItem.types.js.map +1 -1
  75. package/lib/components/MenuItem/index.js +1 -0
  76. package/lib/components/MenuItem/index.js.map +1 -1
  77. package/lib/components/MenuItem/renderMenuItem.js +5 -8
  78. package/lib/components/MenuItem/renderMenuItem.js.map +1 -1
  79. package/lib/components/MenuItem/useCharacterSearch.js +15 -16
  80. package/lib/components/MenuItem/useCharacterSearch.js.map +1 -1
  81. package/lib/components/MenuItem/useMenuItem.js +80 -87
  82. package/lib/components/MenuItem/useMenuItem.js.map +1 -1
  83. package/lib/components/MenuItem/useMenuItemStyles.styles.js.map +1 -1
  84. package/lib/components/MenuItemCheckbox/MenuItemCheckbox.js +6 -6
  85. package/lib/components/MenuItemCheckbox/MenuItemCheckbox.js.map +1 -1
  86. package/lib/components/MenuItemCheckbox/MenuItemCheckbox.types.js +2 -1
  87. package/lib/components/MenuItemCheckbox/MenuItemCheckbox.types.js.map +1 -1
  88. package/lib/components/MenuItemCheckbox/index.js +1 -0
  89. package/lib/components/MenuItemCheckbox/index.js.map +1 -1
  90. package/lib/components/MenuItemCheckbox/renderMenuItemCheckbox.js +5 -8
  91. package/lib/components/MenuItemCheckbox/renderMenuItemCheckbox.js.map +1 -1
  92. package/lib/components/MenuItemCheckbox/useMenuItemCheckbox.js +32 -35
  93. package/lib/components/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
  94. package/lib/components/MenuItemRadio/MenuItemRadio.js +6 -6
  95. package/lib/components/MenuItemRadio/MenuItemRadio.js.map +1 -1
  96. package/lib/components/MenuItemRadio/MenuItemRadio.types.js +2 -1
  97. package/lib/components/MenuItemRadio/MenuItemRadio.types.js.map +1 -1
  98. package/lib/components/MenuItemRadio/index.js +1 -0
  99. package/lib/components/MenuItemRadio/index.js.map +1 -1
  100. package/lib/components/MenuItemRadio/renderMenuItemRadio.js +5 -8
  101. package/lib/components/MenuItemRadio/renderMenuItemRadio.js.map +1 -1
  102. package/lib/components/MenuItemRadio/useMenuItemRadio.js +30 -33
  103. package/lib/components/MenuItemRadio/useMenuItemRadio.js.map +1 -1
  104. package/lib/components/MenuList/MenuList.js +7 -7
  105. package/lib/components/MenuList/MenuList.js.map +1 -1
  106. package/lib/components/MenuList/MenuList.types.js +1 -0
  107. package/lib/components/MenuList/MenuList.types.js.map +1 -1
  108. package/lib/components/MenuList/index.js +1 -0
  109. package/lib/components/MenuList/index.js.map +1 -1
  110. package/lib/components/MenuList/renderMenuList.js +7 -10
  111. package/lib/components/MenuList/renderMenuList.js.map +1 -1
  112. package/lib/components/MenuList/useMenuList.js +131 -125
  113. package/lib/components/MenuList/useMenuList.js.map +1 -1
  114. package/lib/components/MenuList/useMenuListContextValues.js +14 -20
  115. package/lib/components/MenuList/useMenuListContextValues.js.map +1 -1
  116. package/lib/components/MenuList/useMenuListStyles.styles.js.map +1 -1
  117. package/lib/components/MenuPopover/MenuPopover.js +6 -6
  118. package/lib/components/MenuPopover/MenuPopover.js.map +1 -1
  119. package/lib/components/MenuPopover/MenuPopover.types.js +2 -1
  120. package/lib/components/MenuPopover/MenuPopover.types.js.map +1 -1
  121. package/lib/components/MenuPopover/index.js +1 -0
  122. package/lib/components/MenuPopover/index.js.map +1 -1
  123. package/lib/components/MenuPopover/renderMenuPopover.js +10 -13
  124. package/lib/components/MenuPopover/renderMenuPopover.js.map +1 -1
  125. package/lib/components/MenuPopover/useMenuPopover.js +88 -90
  126. package/lib/components/MenuPopover/useMenuPopover.js.map +1 -1
  127. package/lib/components/MenuPopover/useMenuPopoverStyles.styles.js.map +1 -1
  128. package/lib/components/MenuSplitGroup/MenuSplitGroup.js +6 -6
  129. package/lib/components/MenuSplitGroup/MenuSplitGroup.js.map +1 -1
  130. package/lib/components/MenuSplitGroup/MenuSplitGroup.types.js +2 -1
  131. package/lib/components/MenuSplitGroup/MenuSplitGroup.types.js.map +1 -1
  132. package/lib/components/MenuSplitGroup/index.js +1 -0
  133. package/lib/components/MenuSplitGroup/index.js.map +1 -1
  134. package/lib/components/MenuSplitGroup/renderMenuSplitGroup.js +5 -8
  135. package/lib/components/MenuSplitGroup/renderMenuSplitGroup.js.map +1 -1
  136. package/lib/components/MenuSplitGroup/useMenuSplitGroup.js +46 -46
  137. package/lib/components/MenuSplitGroup/useMenuSplitGroup.js.map +1 -1
  138. package/lib/components/MenuSplitGroup/useMenuSplitGroupStyles.styles.js.map +1 -1
  139. package/lib/components/MenuTrigger/MenuTrigger.js +4 -4
  140. package/lib/components/MenuTrigger/MenuTrigger.js.map +1 -1
  141. package/lib/components/MenuTrigger/MenuTrigger.types.js +1 -0
  142. package/lib/components/MenuTrigger/MenuTrigger.types.js.map +1 -1
  143. package/lib/components/MenuTrigger/index.js +1 -0
  144. package/lib/components/MenuTrigger/index.js.map +1 -1
  145. package/lib/components/MenuTrigger/renderMenuTrigger.js +5 -5
  146. package/lib/components/MenuTrigger/renderMenuTrigger.js.map +1 -1
  147. package/lib/components/index.js +1 -0
  148. package/lib/components/index.js.map +1 -1
  149. package/lib/contexts/menuContext.js +22 -21
  150. package/lib/contexts/menuContext.js.map +1 -1
  151. package/lib/contexts/menuGroupContext.js +4 -3
  152. package/lib/contexts/menuGroupContext.js.map +1 -1
  153. package/lib/contexts/menuListContext.js +9 -8
  154. package/lib/contexts/menuListContext.js.map +1 -1
  155. package/lib/contexts/menuTriggerContext.js +3 -3
  156. package/lib/contexts/menuTriggerContext.js.map +1 -1
  157. package/lib/index.js +1 -0
  158. package/lib/index.js.map +1 -1
  159. package/lib/selectable/index.js +1 -0
  160. package/lib/selectable/index.js.map +1 -1
  161. package/lib/selectable/types.js +1 -0
  162. package/lib/selectable/types.js.map +1 -1
  163. package/lib/selectable/useCheckmarkStyles.styles.js.map +1 -1
  164. package/lib/utils/index.js +1 -0
  165. package/lib/utils/index.js.map +1 -1
  166. package/lib/utils/useIsSubmenu.js +5 -5
  167. package/lib/utils/useIsSubmenu.js.map +1 -1
  168. package/lib/utils/useOnMenuEnter.js +40 -43
  169. package/lib/utils/useOnMenuEnter.js.map +1 -1
  170. package/lib-commonjs/Menu.js.map +1 -1
  171. package/lib-commonjs/MenuDivider.js.map +1 -1
  172. package/lib-commonjs/MenuGroup.js.map +1 -1
  173. package/lib-commonjs/MenuGroupHeader.js.map +1 -1
  174. package/lib-commonjs/MenuItem.js.map +1 -1
  175. package/lib-commonjs/MenuItemCheckbox.js.map +1 -1
  176. package/lib-commonjs/MenuItemRadio.js.map +1 -1
  177. package/lib-commonjs/MenuList.js.map +1 -1
  178. package/lib-commonjs/MenuPopover.js.map +1 -1
  179. package/lib-commonjs/MenuSplitGroup.js.map +1 -1
  180. package/lib-commonjs/MenuTrigger.js.map +1 -1
  181. package/lib-commonjs/components/Menu/Menu.js.map +1 -1
  182. package/lib-commonjs/components/Menu/Menu.types.js.map +1 -1
  183. package/lib-commonjs/components/Menu/index.js.map +1 -1
  184. package/lib-commonjs/components/Menu/renderMenu.js.map +1 -1
  185. package/lib-commonjs/components/Menu/useMenu.js +1 -2
  186. package/lib-commonjs/components/Menu/useMenu.js.map +1 -1
  187. package/lib-commonjs/components/Menu/useMenuContextValues.js.map +1 -1
  188. package/lib-commonjs/components/MenuDivider/MenuDivider.js.map +1 -1
  189. package/lib-commonjs/components/MenuDivider/MenuDivider.types.js.map +1 -1
  190. package/lib-commonjs/components/MenuDivider/index.js.map +1 -1
  191. package/lib-commonjs/components/MenuDivider/renderMenuDivider.js.map +1 -1
  192. package/lib-commonjs/components/MenuDivider/useMenuDivider.js.map +1 -1
  193. package/lib-commonjs/components/MenuGroup/MenuGroup.js.map +1 -1
  194. package/lib-commonjs/components/MenuGroup/MenuGroup.types.js.map +1 -1
  195. package/lib-commonjs/components/MenuGroup/index.js.map +1 -1
  196. package/lib-commonjs/components/MenuGroup/renderMenuGroup.js.map +1 -1
  197. package/lib-commonjs/components/MenuGroup/useMenuGroup.js.map +1 -1
  198. package/lib-commonjs/components/MenuGroup/useMenuGroupContextValues.js.map +1 -1
  199. package/lib-commonjs/components/MenuGroupHeader/MenuGroupHeader.js.map +1 -1
  200. package/lib-commonjs/components/MenuGroupHeader/MenuGroupHeader.types.js.map +1 -1
  201. package/lib-commonjs/components/MenuGroupHeader/index.js.map +1 -1
  202. package/lib-commonjs/components/MenuGroupHeader/renderMenuGroupHeader.js.map +1 -1
  203. package/lib-commonjs/components/MenuGroupHeader/useMenuGroupHeader.js.map +1 -1
  204. package/lib-commonjs/components/MenuItem/MenuItem.js.map +1 -1
  205. package/lib-commonjs/components/MenuItem/MenuItem.types.js.map +1 -1
  206. package/lib-commonjs/components/MenuItem/index.js.map +1 -1
  207. package/lib-commonjs/components/MenuItem/renderMenuItem.js.map +1 -1
  208. package/lib-commonjs/components/MenuItem/useCharacterSearch.js.map +1 -1
  209. package/lib-commonjs/components/MenuItem/useMenuItem.js +2 -2
  210. package/lib-commonjs/components/MenuItem/useMenuItem.js.map +1 -1
  211. package/lib-commonjs/components/MenuItemCheckbox/MenuItemCheckbox.js.map +1 -1
  212. package/lib-commonjs/components/MenuItemCheckbox/MenuItemCheckbox.types.js.map +1 -1
  213. package/lib-commonjs/components/MenuItemCheckbox/index.js.map +1 -1
  214. package/lib-commonjs/components/MenuItemCheckbox/renderMenuItemCheckbox.js.map +1 -1
  215. package/lib-commonjs/components/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
  216. package/lib-commonjs/components/MenuItemRadio/MenuItemRadio.js.map +1 -1
  217. package/lib-commonjs/components/MenuItemRadio/MenuItemRadio.types.js.map +1 -1
  218. package/lib-commonjs/components/MenuItemRadio/index.js.map +1 -1
  219. package/lib-commonjs/components/MenuItemRadio/renderMenuItemRadio.js.map +1 -1
  220. package/lib-commonjs/components/MenuItemRadio/useMenuItemRadio.js.map +1 -1
  221. package/lib-commonjs/components/MenuList/MenuList.js.map +1 -1
  222. package/lib-commonjs/components/MenuList/MenuList.types.js.map +1 -1
  223. package/lib-commonjs/components/MenuList/index.js.map +1 -1
  224. package/lib-commonjs/components/MenuList/renderMenuList.js.map +1 -1
  225. package/lib-commonjs/components/MenuList/useMenuList.js.map +1 -1
  226. package/lib-commonjs/components/MenuList/useMenuListContextValues.js.map +1 -1
  227. package/lib-commonjs/components/MenuPopover/MenuPopover.js.map +1 -1
  228. package/lib-commonjs/components/MenuPopover/MenuPopover.types.js.map +1 -1
  229. package/lib-commonjs/components/MenuPopover/index.js.map +1 -1
  230. package/lib-commonjs/components/MenuPopover/renderMenuPopover.js.map +1 -1
  231. package/lib-commonjs/components/MenuPopover/useMenuPopover.js.map +1 -1
  232. package/lib-commonjs/components/MenuSplitGroup/MenuSplitGroup.js.map +1 -1
  233. package/lib-commonjs/components/MenuSplitGroup/MenuSplitGroup.types.js.map +1 -1
  234. package/lib-commonjs/components/MenuSplitGroup/index.js.map +1 -1
  235. package/lib-commonjs/components/MenuSplitGroup/renderMenuSplitGroup.js.map +1 -1
  236. package/lib-commonjs/components/MenuSplitGroup/useMenuSplitGroup.js.map +1 -1
  237. package/lib-commonjs/components/MenuTrigger/MenuTrigger.js.map +1 -1
  238. package/lib-commonjs/components/MenuTrigger/MenuTrigger.types.js.map +1 -1
  239. package/lib-commonjs/components/MenuTrigger/index.js.map +1 -1
  240. package/lib-commonjs/components/MenuTrigger/renderMenuTrigger.js.map +1 -1
  241. package/lib-commonjs/components/index.js.map +1 -1
  242. package/lib-commonjs/contexts/menuContext.js +1 -1
  243. package/lib-commonjs/contexts/menuContext.js.map +1 -1
  244. package/lib-commonjs/contexts/menuGroupContext.js.map +1 -1
  245. package/lib-commonjs/contexts/menuListContext.js +1 -1
  246. package/lib-commonjs/contexts/menuListContext.js.map +1 -1
  247. package/lib-commonjs/contexts/menuTriggerContext.js.map +1 -1
  248. package/lib-commonjs/index.js.map +1 -1
  249. package/lib-commonjs/selectable/index.js.map +1 -1
  250. package/lib-commonjs/selectable/types.js.map +1 -1
  251. package/lib-commonjs/utils/index.js.map +1 -1
  252. package/lib-commonjs/utils/useIsSubmenu.js.map +1 -1
  253. package/lib-commonjs/utils/useOnMenuEnter.js.map +1 -1
  254. package/package.json +12 -12
@@ -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 = ['after', 'after-bottom', 'before-top', 'before', 'before-bottom', 'above'];
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,253 @@ 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
- export const useMenu_unstable = props => {
22
- const isSubmenu = useIsSubmenu();
23
- const {
24
- hoverDelay = 500,
25
- inline = false,
26
- hasCheckmarks = false,
27
- hasIcons = false,
28
- closeOnScroll = false,
29
- openOnContext = false,
30
- persistOnItemClick = false,
31
- openOnHover = isSubmenu,
32
- defaultCheckedValues,
33
- mountNode = null
34
- } = props;
35
- const triggerId = useId('menu');
36
- const [contextTarget, setContextTarget] = usePositioningMouseTarget();
37
- const positioningState = {
38
- position: isSubmenu ? 'after' : 'below',
39
- align: isSubmenu ? 'top' : 'start',
40
- target: props.openOnContext ? contextTarget : undefined,
41
- fallbackPositions: isSubmenu ? submenuFallbackPositions : undefined,
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
- if (children.length > 2) {
51
- // eslint-disable-next-line no-console
52
- console.warn('Menu must contain at most two children');
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
- let menuTrigger = undefined;
56
- let menuPopover = undefined;
57
- if (children.length === 2) {
58
- menuTrigger = children[0];
59
- menuPopover = children[1];
60
- } else if (children.length === 1) {
61
- menuPopover = children[0];
62
- }
63
- const {
64
- targetRef: triggerRef,
65
- containerRef: menuPopoverRef
66
- } = usePositioning(positioningState);
67
- // TODO Better way to narrow types ?
68
- const [open, setOpen] = useMenuOpenState({
69
- hoverDelay,
70
- isSubmenu,
71
- setContextTarget,
72
- closeOnScroll,
73
- menuPopoverRef,
74
- triggerRef,
75
- open: props.open,
76
- defaultOpen: props.defaultOpen,
77
- onOpenChange: props.onOpenChange,
78
- openOnContext
79
- });
80
- const [checkedValues, onCheckedValueChange] = useMenuSelectableState({
81
- checkedValues: props.checkedValues,
82
- defaultCheckedValues,
83
- onCheckedValueChange: props.onCheckedValueChange
84
- });
85
- return {
86
- inline,
87
- hoverDelay,
88
- triggerId,
89
- isSubmenu,
90
- openOnHover,
91
- contextTarget,
92
- setContextTarget,
93
- hasCheckmarks,
94
- hasIcons,
95
- closeOnScroll,
96
- menuTrigger,
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 useMenuSelectableState = props => {
115
- const [checkedValues, setCheckedValues] = useControllableState({
116
- state: props.checkedValues,
117
- defaultState: props.defaultCheckedValues,
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
- setCheckedValues(currentValue => ({
130
- ...currentValue,
131
- [name]: checkedItems
132
- }));
133
- });
134
- return [checkedValues, onCheckedValueChange];
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
- const {
138
- targetDocument
139
- } = useFluent();
140
- const parentSetOpen = useMenuContext_unstable(context => context.setOpen);
141
- const onOpenChange = useEventCallback((e, data) => {
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
- if (data.open && e.type === 'contextmenu') {
158
- state.setContextTarget(e);
159
- }
160
- if (!data.open) {
161
- state.setContextTarget(undefined);
162
- }
163
- if (data.bubble) {
164
- parentSetOpen(e, {
165
- ...data
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
- disabled: !open,
227
- refs: [state.menuPopoverRef]
228
- });
229
- // Clear timeout on unmount
230
- // Setting state after a component unmounts can cause memory leaks
231
- React.useEffect(() => {
232
- return () => {
233
- clearTimeout(setOpenTimeout.current);
234
- };
235
- }, []);
236
- // Manage focus for open state
237
- const {
238
- findFirstFocusable
239
- } = useFocusFinders();
240
- const focusFirst = React.useCallback(() => {
241
- const firstFocusable = findFirstFocusable(state.menuPopoverRef.current);
242
- firstFocusable === null || firstFocusable === void 0 ? void 0 : firstFocusable.focus();
243
- }, [findFirstFocusable, state.menuPopoverRef]);
244
- const firstMount = useFirstMount();
245
- React.useEffect(() => {
246
- if (open) {
247
- focusFirst();
248
- } else {
249
- if (!firstMount) {
250
- if ((targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.activeElement) === (targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.body)) {
251
- var
252
- // We know that React effects are sync so we focus the trigger here
253
- // after any event handler (event handlers will update state and re-render).
254
- // Since the browser only performs the default behaviour for the Tab key once
255
- // keyboard events have fully bubbled up the window, the browser will move
256
- // focus to the next tabbable element before/after the trigger if needed.
257
- // If the Tab key was not pressed, focus will remain on the trigger as expected.
258
- _state_triggerRef_current;
259
- (_state_triggerRef_current = state.triggerRef.current) === null || _state_triggerRef_current === void 0 ? void 0 : _state_triggerRef_current.focus();
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
- }, [state.triggerRef, state.isSubmenu, open, focusFirst, targetDocument, state.menuPopoverRef]);
266
- return [open, setOpen];
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
  };
275
+
268
276
  //# 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":["../../../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"],"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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"}