@fluentui-react-native/menu 0.9.2 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/CHANGELOG.json +114 -1
  2. package/CHANGELOG.md +40 -2
  3. package/lib/Menu/useMenu.d.ts.map +1 -1
  4. package/lib/Menu/useMenu.js +5 -1
  5. package/lib/Menu/useMenu.js.map +1 -1
  6. package/lib/MenuItem/MenuItem.d.ts.map +1 -1
  7. package/lib/MenuItem/MenuItem.js +4 -2
  8. package/lib/MenuItem/MenuItem.js.map +1 -1
  9. package/lib/MenuItem/MenuItem.styling.d.ts.map +1 -1
  10. package/lib/MenuItem/MenuItem.styling.js +6 -0
  11. package/lib/MenuItem/MenuItem.styling.js.map +1 -1
  12. package/lib/MenuItem/MenuItem.types.d.ts +2 -0
  13. package/lib/MenuItem/MenuItem.types.d.ts.map +1 -1
  14. package/lib/MenuItem/MenuItemTokens.d.ts.map +1 -1
  15. package/lib/MenuItem/MenuItemTokens.js +2 -0
  16. package/lib/MenuItem/MenuItemTokens.js.map +1 -1
  17. package/lib/MenuItem/MenuItemTokens.win32.d.ts.map +1 -1
  18. package/lib/MenuItem/MenuItemTokens.win32.js +2 -0
  19. package/lib/MenuItem/MenuItemTokens.win32.js.map +1 -1
  20. package/lib/MenuItem/useMenuItem.d.ts.map +1 -1
  21. package/lib/MenuItem/useMenuItem.js +3 -1
  22. package/lib/MenuItem/useMenuItem.js.map +1 -1
  23. package/lib/MenuItemCheckbox/MenuItemCheckbox.d.ts +4 -2
  24. package/lib/MenuItemCheckbox/MenuItemCheckbox.d.ts.map +1 -1
  25. package/lib/MenuItemCheckbox/MenuItemCheckbox.js +11 -8
  26. package/lib/MenuItemCheckbox/MenuItemCheckbox.js.map +1 -1
  27. package/lib/MenuItemCheckbox/useMenuItemCheckbox.d.ts +10 -0
  28. package/lib/MenuItemCheckbox/useMenuItemCheckbox.d.ts.map +1 -1
  29. package/lib/MenuItemCheckbox/useMenuItemCheckbox.js +28 -14
  30. package/lib/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
  31. package/lib/MenuItemRadio/MenuItemRadio.d.ts +4 -0
  32. package/lib/MenuItemRadio/MenuItemRadio.d.ts.map +1 -0
  33. package/lib/MenuItemRadio/MenuItemRadio.js +12 -0
  34. package/lib/MenuItemRadio/MenuItemRadio.js.map +1 -0
  35. package/lib/MenuItemRadio/useMenuItemRadio.d.ts +3 -0
  36. package/lib/MenuItemRadio/useMenuItemRadio.d.ts.map +1 -0
  37. package/lib/MenuItemRadio/useMenuItemRadio.js +15 -0
  38. package/lib/MenuItemRadio/useMenuItemRadio.js.map +1 -0
  39. package/lib/MenuList/MenuList.d.ts +0 -1
  40. package/lib/MenuList/MenuList.d.ts.map +1 -1
  41. package/lib/MenuList/MenuList.js +23 -5
  42. package/lib/MenuList/MenuList.js.map +1 -1
  43. package/lib/MenuList/MenuList.styling.d.ts.map +1 -1
  44. package/lib/MenuList/MenuList.styling.js +2 -1
  45. package/lib/MenuList/MenuList.styling.js.map +1 -1
  46. package/lib/MenuList/MenuList.types.d.ts +5 -1
  47. package/lib/MenuList/MenuList.types.d.ts.map +1 -1
  48. package/lib/MenuList/MenuListTokens.d.ts.map +1 -1
  49. package/lib/MenuList/MenuListTokens.js +1 -0
  50. package/lib/MenuList/MenuListTokens.js.map +1 -1
  51. package/lib/MenuList/useMenuList.d.ts.map +1 -1
  52. package/lib/MenuList/useMenuList.js +13 -3
  53. package/lib/MenuList/useMenuList.js.map +1 -1
  54. package/lib/MenuList/{useMenuContextValue.d.ts → useMenuListContextValue.d.ts} +1 -1
  55. package/lib/MenuList/useMenuListContextValue.d.ts.map +1 -0
  56. package/lib/MenuList/{useMenuContextValue.js → useMenuListContextValue.js} +1 -1
  57. package/lib/MenuList/useMenuListContextValue.js.map +1 -0
  58. package/lib/MenuPopover/MenuPopover.d.ts.map +1 -1
  59. package/lib/MenuPopover/MenuPopover.js +1 -1
  60. package/lib/MenuPopover/MenuPopover.js.map +1 -1
  61. package/lib/MenuPopover/MenuPopover.types.d.ts +4 -1
  62. package/lib/MenuPopover/MenuPopover.types.d.ts.map +1 -1
  63. package/lib/MenuPopover/useMenuPopover.d.ts.map +1 -1
  64. package/lib/MenuPopover/useMenuPopover.js +16 -1
  65. package/lib/MenuPopover/useMenuPopover.js.map +1 -1
  66. package/lib/MenuTrigger/MenuTrigger.d.ts.map +1 -1
  67. package/lib/MenuTrigger/MenuTrigger.js +4 -3
  68. package/lib/MenuTrigger/MenuTrigger.js.map +1 -1
  69. package/lib/MenuTrigger/MenuTrigger.types.d.ts +11 -2
  70. package/lib/MenuTrigger/MenuTrigger.types.d.ts.map +1 -1
  71. package/lib/MenuTrigger/MenuTrigger.types.js.map +1 -1
  72. package/lib/MenuTrigger/useMenuTrigger.d.ts +2 -8
  73. package/lib/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
  74. package/lib/MenuTrigger/useMenuTrigger.js +14 -1
  75. package/lib/MenuTrigger/useMenuTrigger.js.map +1 -1
  76. package/lib/context/menuTriggerContext.d.ts +9 -0
  77. package/lib/context/menuTriggerContext.d.ts.map +1 -0
  78. package/lib/context/menuTriggerContext.js +9 -0
  79. package/lib/context/menuTriggerContext.js.map +1 -0
  80. package/lib/index.d.ts +1 -0
  81. package/lib/index.d.ts.map +1 -1
  82. package/lib/index.js +1 -0
  83. package/lib/index.js.map +1 -1
  84. package/lib-commonjs/Menu/useMenu.d.ts.map +1 -1
  85. package/lib-commonjs/Menu/useMenu.js +5 -1
  86. package/lib-commonjs/Menu/useMenu.js.map +1 -1
  87. package/lib-commonjs/MenuItem/MenuItem.d.ts.map +1 -1
  88. package/lib-commonjs/MenuItem/MenuItem.js +3 -1
  89. package/lib-commonjs/MenuItem/MenuItem.js.map +1 -1
  90. package/lib-commonjs/MenuItem/MenuItem.styling.d.ts.map +1 -1
  91. package/lib-commonjs/MenuItem/MenuItem.styling.js +6 -0
  92. package/lib-commonjs/MenuItem/MenuItem.styling.js.map +1 -1
  93. package/lib-commonjs/MenuItem/MenuItem.types.d.ts +2 -0
  94. package/lib-commonjs/MenuItem/MenuItem.types.d.ts.map +1 -1
  95. package/lib-commonjs/MenuItem/MenuItemTokens.d.ts.map +1 -1
  96. package/lib-commonjs/MenuItem/MenuItemTokens.js +2 -0
  97. package/lib-commonjs/MenuItem/MenuItemTokens.js.map +1 -1
  98. package/lib-commonjs/MenuItem/MenuItemTokens.win32.d.ts.map +1 -1
  99. package/lib-commonjs/MenuItem/MenuItemTokens.win32.js +2 -0
  100. package/lib-commonjs/MenuItem/MenuItemTokens.win32.js.map +1 -1
  101. package/lib-commonjs/MenuItem/useMenuItem.d.ts.map +1 -1
  102. package/lib-commonjs/MenuItem/useMenuItem.js +3 -1
  103. package/lib-commonjs/MenuItem/useMenuItem.js.map +1 -1
  104. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.d.ts +4 -2
  105. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.d.ts.map +1 -1
  106. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.js +12 -8
  107. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.js.map +1 -1
  108. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.d.ts +10 -0
  109. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.d.ts.map +1 -1
  110. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.js +31 -16
  111. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
  112. package/lib-commonjs/MenuItemRadio/MenuItemRadio.d.ts +4 -0
  113. package/lib-commonjs/MenuItemRadio/MenuItemRadio.d.ts.map +1 -0
  114. package/lib-commonjs/MenuItemRadio/MenuItemRadio.js +15 -0
  115. package/lib-commonjs/MenuItemRadio/MenuItemRadio.js.map +1 -0
  116. package/lib-commonjs/MenuItemRadio/useMenuItemRadio.d.ts +3 -0
  117. package/lib-commonjs/MenuItemRadio/useMenuItemRadio.d.ts.map +1 -0
  118. package/lib-commonjs/MenuItemRadio/useMenuItemRadio.js +20 -0
  119. package/lib-commonjs/MenuItemRadio/useMenuItemRadio.js.map +1 -0
  120. package/lib-commonjs/MenuList/MenuList.d.ts +0 -1
  121. package/lib-commonjs/MenuList/MenuList.d.ts.map +1 -1
  122. package/lib-commonjs/MenuList/MenuList.js +22 -4
  123. package/lib-commonjs/MenuList/MenuList.js.map +1 -1
  124. package/lib-commonjs/MenuList/MenuList.styling.d.ts.map +1 -1
  125. package/lib-commonjs/MenuList/MenuList.styling.js +2 -1
  126. package/lib-commonjs/MenuList/MenuList.styling.js.map +1 -1
  127. package/lib-commonjs/MenuList/MenuList.types.d.ts +5 -1
  128. package/lib-commonjs/MenuList/MenuList.types.d.ts.map +1 -1
  129. package/lib-commonjs/MenuList/MenuListTokens.d.ts.map +1 -1
  130. package/lib-commonjs/MenuList/MenuListTokens.js +1 -0
  131. package/lib-commonjs/MenuList/MenuListTokens.js.map +1 -1
  132. package/lib-commonjs/MenuList/useMenuList.d.ts.map +1 -1
  133. package/lib-commonjs/MenuList/useMenuList.js +13 -3
  134. package/lib-commonjs/MenuList/useMenuList.js.map +1 -1
  135. package/lib-commonjs/MenuList/{useMenuContextValue.d.ts → useMenuListContextValue.d.ts} +1 -1
  136. package/lib-commonjs/MenuList/useMenuListContextValue.d.ts.map +1 -0
  137. package/lib-commonjs/MenuList/{useMenuContextValue.js → useMenuListContextValue.js} +1 -1
  138. package/lib-commonjs/MenuList/useMenuListContextValue.js.map +1 -0
  139. package/lib-commonjs/MenuPopover/MenuPopover.d.ts.map +1 -1
  140. package/lib-commonjs/MenuPopover/MenuPopover.js +1 -1
  141. package/lib-commonjs/MenuPopover/MenuPopover.js.map +1 -1
  142. package/lib-commonjs/MenuPopover/MenuPopover.types.d.ts +4 -1
  143. package/lib-commonjs/MenuPopover/MenuPopover.types.d.ts.map +1 -1
  144. package/lib-commonjs/MenuPopover/useMenuPopover.d.ts.map +1 -1
  145. package/lib-commonjs/MenuPopover/useMenuPopover.js +16 -1
  146. package/lib-commonjs/MenuPopover/useMenuPopover.js.map +1 -1
  147. package/lib-commonjs/MenuTrigger/MenuTrigger.d.ts.map +1 -1
  148. package/lib-commonjs/MenuTrigger/MenuTrigger.js +4 -3
  149. package/lib-commonjs/MenuTrigger/MenuTrigger.js.map +1 -1
  150. package/lib-commonjs/MenuTrigger/MenuTrigger.types.d.ts +11 -2
  151. package/lib-commonjs/MenuTrigger/MenuTrigger.types.d.ts.map +1 -1
  152. package/lib-commonjs/MenuTrigger/MenuTrigger.types.js.map +1 -1
  153. package/lib-commonjs/MenuTrigger/useMenuTrigger.d.ts +2 -8
  154. package/lib-commonjs/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
  155. package/lib-commonjs/MenuTrigger/useMenuTrigger.js +14 -1
  156. package/lib-commonjs/MenuTrigger/useMenuTrigger.js.map +1 -1
  157. package/lib-commonjs/context/menuTriggerContext.d.ts +9 -0
  158. package/lib-commonjs/context/menuTriggerContext.d.ts.map +1 -0
  159. package/lib-commonjs/context/menuTriggerContext.js +14 -0
  160. package/lib-commonjs/context/menuTriggerContext.js.map +1 -0
  161. package/lib-commonjs/index.d.ts +1 -0
  162. package/lib-commonjs/index.d.ts.map +1 -1
  163. package/lib-commonjs/index.js +3 -1
  164. package/lib-commonjs/index.js.map +1 -1
  165. package/package.json +7 -7
  166. package/src/Menu/useMenu.ts +6 -0
  167. package/src/MenuItem/MenuItem.styling.ts +7 -0
  168. package/src/MenuItem/MenuItem.tsx +10 -5
  169. package/src/MenuItem/MenuItem.types.ts +2 -0
  170. package/src/MenuItem/MenuItemTokens.ts +2 -0
  171. package/src/MenuItem/MenuItemTokens.win32.ts +2 -0
  172. package/src/MenuItem/useMenuItem.ts +3 -1
  173. package/src/MenuItemCheckbox/MenuItemCheckbox.tsx +29 -16
  174. package/src/MenuItemCheckbox/useMenuItemCheckbox.ts +39 -20
  175. package/src/MenuItemRadio/MenuItemRadio.tsx +16 -0
  176. package/src/MenuItemRadio/useMenuItemRadio.ts +21 -0
  177. package/src/MenuList/MenuList.styling.ts +2 -1
  178. package/src/MenuList/MenuList.tsx +23 -5
  179. package/src/MenuList/MenuList.types.ts +5 -2
  180. package/src/MenuList/MenuListTokens.ts +1 -0
  181. package/src/MenuList/useMenuList.ts +22 -3
  182. package/src/MenuList/{useMenuContextValue.ts → useMenuListContextValue.ts} +0 -0
  183. package/src/MenuPopover/MenuPopover.tsx +3 -0
  184. package/src/MenuPopover/MenuPopover.types.ts +4 -1
  185. package/src/MenuPopover/useMenuPopover.ts +21 -2
  186. package/src/MenuTrigger/MenuTrigger.tsx +4 -3
  187. package/src/MenuTrigger/MenuTrigger.types.ts +14 -3
  188. package/src/MenuTrigger/useMenuTrigger.ts +18 -3
  189. package/src/context/menuTriggerContext.ts +10 -0
  190. package/src/index.ts +1 -0
  191. package/lib/MenuList/useMenuContextValue.d.ts.map +0 -1
  192. package/lib/MenuList/useMenuContextValue.js.map +0 -1
  193. package/lib-commonjs/MenuList/useMenuContextValue.d.ts.map +0 -1
  194. package/lib-commonjs/MenuList/useMenuContextValue.js.map +0 -1
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useMenuPopover = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var react_1 = (0, tslib_1.__importDefault)(require("react"));
6
+ var react_native_1 = require("react-native");
6
7
  var menuContext_1 = require("../context/menuContext");
7
8
  var useMenuPopover = function (_props) {
8
9
  var context = (0, menuContext_1.useMenuContext)();
@@ -12,7 +13,21 @@ var useMenuPopover = function (_props) {
12
13
  var dismissBehaviors = context.isControlled
13
14
  ? ['preventDismissOnKeyDown', 'preventDismissOnClickOutside']
14
15
  : undefined;
15
- return { triggerRef: triggerRef, onDismiss: onDismiss, dismissBehaviors: dismissBehaviors };
16
+ var directionalHint = getDirectionalHint(context.isSubmenu, react_native_1.I18nManager.isRTL);
17
+ // Initial focus behavior differs per platform, Windows platforms move focus
18
+ // automatically onto first element of Callout
19
+ var setInitialFocus = react_native_1.Platform.OS === 'win32' || react_native_1.Platform.OS === 'windows';
20
+ var doNotTakePointerCapture = context.openOnHover;
21
+ return { triggerRef: triggerRef, onDismiss: onDismiss, directionalHint: directionalHint, dismissBehaviors: dismissBehaviors, doNotTakePointerCapture: doNotTakePointerCapture, setInitialFocus: setInitialFocus };
16
22
  };
17
23
  exports.useMenuPopover = useMenuPopover;
24
+ var getDirectionalHint = function (isSubmenu, isRtl) {
25
+ if (!isSubmenu) {
26
+ return undefined;
27
+ }
28
+ if (isRtl) {
29
+ return 'leftTopEdge';
30
+ }
31
+ return 'rightTopEdge';
32
+ };
18
33
  //# sourceMappingURL=useMenuPopover.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMenuPopover.js","sourceRoot":"","sources":["../../src/MenuPopover/useMenuPopover.ts"],"names":[],"mappings":";;;;AAAA,6DAA0B;AAE1B,sDAAwD;AAGjD,IAAM,cAAc,GAAG,UAAC,MAAwB;IACrD,IAAM,OAAO,GAAG,IAAA,4BAAc,GAAE,CAAC;IACjC,IAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,IAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,IAAM,SAAS,GAAG,eAAK,CAAC,WAAW,CAAC,cAAM,OAAA,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,EAAtC,CAAsC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7F,IAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY;QAC3C,CAAC,CAAE,CAAC,yBAAyB,EAAE,8BAA8B,CAAwB;QACrF,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,EAAE,UAAU,YAAA,EAAE,SAAS,WAAA,EAAE,gBAAgB,kBAAA,EAAE,CAAC;AACrD,CAAC,CAAC;AAXW,QAAA,cAAc,kBAWzB"}
1
+ {"version":3,"file":"useMenuPopover.js","sourceRoot":"","sources":["../../src/MenuPopover/useMenuPopover.ts"],"names":[],"mappings":";;;;AAAA,6DAA0B;AAC1B,6CAAqD;AAErD,sDAAwD;AAGjD,IAAM,cAAc,GAAG,UAAC,MAAwB;IACrD,IAAM,OAAO,GAAG,IAAA,4BAAc,GAAE,CAAC;IACjC,IAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,IAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,IAAM,SAAS,GAAG,eAAK,CAAC,WAAW,CAAC,cAAM,OAAA,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,EAAtC,CAAsC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7F,IAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY;QAC3C,CAAC,CAAE,CAAC,yBAAyB,EAAE,8BAA8B,CAAwB;QACrF,CAAC,CAAC,SAAS,CAAC;IACd,IAAM,eAAe,GAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS,EAAE,0BAAW,CAAC,KAAK,CAAC,CAAC;IAEjF,4EAA4E;IAC5E,8CAA8C;IAC9C,IAAM,eAAe,GAAG,uBAAQ,CAAC,EAAE,KAAM,OAAe,IAAI,uBAAQ,CAAC,EAAE,KAAK,SAAS,CAAC;IACtF,IAAM,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IAEpD,OAAO,EAAE,UAAU,YAAA,EAAE,SAAS,WAAA,EAAE,eAAe,iBAAA,EAAE,gBAAgB,kBAAA,EAAE,uBAAuB,yBAAA,EAAE,eAAe,iBAAA,EAAE,CAAC;AAChH,CAAC,CAAC;AAjBW,QAAA,cAAc,kBAiBzB;AAEF,IAAM,kBAAkB,GAAG,UAAC,SAAkB,EAAE,KAAc;IAC5D,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,SAAS,CAAC;KAClB;IAED,IAAI,KAAK,EAAE;QACT,OAAO,aAAa,CAAC;KACtB;IAED,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuTrigger.d.ts","sourceRoot":"","sources":["../../src/MenuTrigger/MenuTrigger.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAmB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGxE,eAAO,MAAM,WAAW,iFAiBtB,CAAC;AAGH,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"MenuTrigger.d.ts","sourceRoot":"","sources":["../../src/MenuTrigger/MenuTrigger.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAmB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAIxE,eAAO,MAAM,WAAW,iFAiBtB,CAAC;AAGH,eAAe,WAAW,CAAC"}
@@ -6,8 +6,9 @@ var react_1 = (0, tslib_1.__importDefault)(require("react"));
6
6
  var framework_1 = require("@fluentui-react-native/framework");
7
7
  var MenuTrigger_types_1 = require("./MenuTrigger.types");
8
8
  var useMenuTrigger_1 = require("./useMenuTrigger");
9
+ var menuTriggerContext_1 = require("../context/menuTriggerContext");
9
10
  exports.MenuTrigger = (0, framework_1.stagedComponent)(function (props) {
10
- var state = (0, useMenuTrigger_1.useMenuTrigger)(props);
11
+ var menuTrigger = (0, useMenuTrigger_1.useMenuTrigger)(props);
11
12
  return function (_rest, children) {
12
13
  var childrenArray = react_1.default.Children.toArray(children);
13
14
  if (__DEV__) {
@@ -16,8 +17,8 @@ exports.MenuTrigger = (0, framework_1.stagedComponent)(function (props) {
16
17
  }
17
18
  }
18
19
  var child = childrenArray[0];
19
- var revised = react_1.default.cloneElement(child, state);
20
- return react_1.default.createElement(react_1.default.Fragment, null, revised);
20
+ var revised = react_1.default.cloneElement(child, menuTrigger.props);
21
+ return react_1.default.createElement(menuTriggerContext_1.MenuTriggerProvider, { value: menuTrigger.hasSubmenu }, revised);
21
22
  };
22
23
  });
23
24
  exports.MenuTrigger.displayName = MenuTrigger_types_1.menuTriggerName;
@@ -1 +1 @@
1
- {"version":3,"file":"MenuTrigger.js","sourceRoot":"","sources":["../../src/MenuTrigger/MenuTrigger.tsx"],"names":[],"mappings":";;;;AAAA,6DAA0B;AAC1B,8DAAmE;AACnE,yDAAwE;AACxE,mDAAkD;AAErC,QAAA,WAAW,GAAG,IAAA,2BAAe,EAAC,UAAC,KAAuB;IACjE,IAAM,KAAK,GAAG,IAAA,+BAAc,EAAC,KAAK,CAAC,CAAC;IAEpC,OAAO,UAAC,KAAuB,EAAE,QAAyB;QACxD,IAAM,aAAa,GAAG,eAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAyB,CAAC;QAE/E,IAAI,OAAO,EAAE;YACX,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;aACzD;SACF;QAED,IAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAM,OAAO,GAAG,eAAK,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEjD,OAAO,8DAAG,OAAO,CAAI,CAAC;IACxB,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,mBAAW,CAAC,WAAW,GAAG,mCAAe,CAAC;AAE1C,kBAAe,mBAAW,CAAC"}
1
+ {"version":3,"file":"MenuTrigger.js","sourceRoot":"","sources":["../../src/MenuTrigger/MenuTrigger.tsx"],"names":[],"mappings":";;;;AAAA,6DAA0B;AAC1B,8DAAmE;AACnE,yDAAwE;AACxE,mDAAkD;AAClD,oEAAoE;AAEvD,QAAA,WAAW,GAAG,IAAA,2BAAe,EAAC,UAAC,KAAuB;IACjE,IAAM,WAAW,GAAG,IAAA,+BAAc,EAAC,KAAK,CAAC,CAAC;IAE1C,OAAO,UAAC,KAAuB,EAAE,QAAyB;QACxD,IAAM,aAAa,GAAG,eAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAyB,CAAC;QAE/E,IAAI,OAAO,EAAE;YACX,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;aACzD;SACF;QAED,IAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAM,OAAO,GAAG,eAAK,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;QAE7D,OAAO,8BAAC,wCAAmB,IAAC,KAAK,EAAE,WAAW,CAAC,UAAU,IAAG,OAAO,CAAuB,CAAC;IAC7F,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,mBAAW,CAAC,WAAW,GAAG,mCAAe,CAAC;AAE1C,kBAAe,mBAAW,CAAC"}
@@ -1,7 +1,16 @@
1
- import type { IViewProps } from '@fluentui-react-native/adapters';
1
+ /// <reference types="react" />
2
+ import { InteractionEvent, IWithPressableOptions } from '@fluentui-react-native/interactive-hooks';
3
+ import { ViewProps } from 'react-native';
2
4
  export declare const menuTriggerName = "MenuTrigger";
3
- export interface MenuTriggerProps extends Omit<IViewProps, 'onPress'> {
5
+ export interface MenuTriggerProps extends Omit<IWithPressableOptions<ViewProps>, 'onPress'> {
6
+ /**
7
+ * A RefObject to refer to the trigger component.
8
+ */
9
+ componentRef?: React.RefObject<React.Component>;
10
+ onClick?: (e: InteractionEvent) => void;
4
11
  }
5
12
  export interface MenuTriggerState {
13
+ props: MenuTriggerProps;
14
+ hasSubmenu: boolean;
6
15
  }
7
16
  //# sourceMappingURL=MenuTrigger.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MenuTrigger.types.d.ts","sourceRoot":"","sources":["../../src/MenuTrigger/MenuTrigger.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;CAAG;AAExE,MAAM,WAAW,gBAAgB;CAAG"}
1
+ {"version":3,"file":"MenuTrigger.types.d.ts","sourceRoot":"","sources":["../../src/MenuTrigger/MenuTrigger.types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IACzF;;OAEG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEhD,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuTrigger.types.js","sourceRoot":"","sources":["../../src/MenuTrigger/MenuTrigger.types.ts"],"names":[],"mappings":";;;AAEa,QAAA,eAAe,GAAG,aAAa,CAAC"}
1
+ {"version":3,"file":"MenuTrigger.types.js","sourceRoot":"","sources":["../../src/MenuTrigger/MenuTrigger.types.ts"],"names":[],"mappings":";;;AAGa,QAAA,eAAe,GAAG,aAAa,CAAC"}
@@ -1,9 +1,3 @@
1
- /// <reference types="react" />
2
- import { InteractionEvent } from '@fluentui-react-native/interactive-hooks';
3
- import { MenuTriggerProps } from './MenuTrigger.types';
4
- export declare const useMenuTrigger: (_props: MenuTriggerProps) => {
5
- onClick: (e: InteractionEvent) => void;
6
- onHoverIn: (e: InteractionEvent) => void;
7
- componentRef: import("react").RefObject<import("react").Component<{}, {}, any>>;
8
- };
1
+ import { MenuTriggerProps, MenuTriggerState } from './MenuTrigger.types';
2
+ export declare const useMenuTrigger: (_props: MenuTriggerProps) => MenuTriggerState;
9
3
  //# sourceMappingURL=useMenuTrigger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMenuTrigger.d.ts","sourceRoot":"","sources":["../../src/MenuTrigger/useMenuTrigger.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,eAAO,MAAM,cAAc,WAAY,gBAAgB;iBAcjC,gBAAgB;mBANd,gBAAgB;;CAWvC,CAAC"}
1
+ {"version":3,"file":"useMenuTrigger.d.ts","sourceRoot":"","sources":["../../src/MenuTrigger/useMenuTrigger.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,eAAO,MAAM,cAAc,WAAY,gBAAgB,KAAG,gBAiCzD,CAAC"}
@@ -2,21 +2,34 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useMenuTrigger = void 0;
4
4
  var menuContext_1 = require("../context/menuContext");
5
+ var react_native_1 = require("react-native");
5
6
  var useMenuTrigger = function (_props) {
6
7
  var context = (0, menuContext_1.useMenuContext)();
7
8
  var setOpen = context.setOpen;
8
9
  var open = context.open;
9
10
  var openOnHover = context.openOnHover;
10
11
  var triggerRef = context.triggerRef;
12
+ var delayHover = react_native_1.Platform.select({
13
+ macos: 100,
14
+ default: 500, // win32
15
+ });
11
16
  var onHoverIn = function (e) {
12
17
  if (openOnHover) {
13
18
  setOpen(e, true /* isOpen */);
14
19
  }
15
20
  };
21
+ var onHoverOut = function (e) {
22
+ if (openOnHover) {
23
+ setOpen(e, false /* isOpen */);
24
+ }
25
+ };
16
26
  var onClick = function (e) {
17
27
  setOpen(e, !open);
18
28
  };
19
- return { onClick: onClick, onHoverIn: onHoverIn, componentRef: triggerRef };
29
+ return {
30
+ props: { onClick: onClick, onHoverIn: onHoverIn, onHoverOut: onHoverOut, componentRef: triggerRef, delayHoverIn: delayHover, delayHoverOut: delayHover },
31
+ hasSubmenu: context.isSubmenu,
32
+ };
20
33
  };
21
34
  exports.useMenuTrigger = useMenuTrigger;
22
35
  //# sourceMappingURL=useMenuTrigger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMenuTrigger.js","sourceRoot":"","sources":["../../src/MenuTrigger/useMenuTrigger.ts"],"names":[],"mappings":";;;AAAA,sDAAwD;AAIjD,IAAM,cAAc,GAAG,UAAC,MAAwB;IACrD,IAAM,OAAO,GAAG,IAAA,4BAAc,GAAE,CAAC;IAEjC,IAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,IAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACxC,IAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAEtC,IAAM,SAAS,GAAG,UAAC,CAAmB;QACpC,IAAI,WAAW,EAAE;YACf,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;SAC/B;IACH,CAAC,CAAC;IAEF,IAAM,OAAO,GAAG,UAAC,CAAmB;QAClC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,OAAO,EAAE,OAAO,SAAA,EAAE,SAAS,WAAA,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AAC1D,CAAC,CAAC;AAnBW,QAAA,cAAc,kBAmBzB"}
1
+ {"version":3,"file":"useMenuTrigger.js","sourceRoot":"","sources":["../../src/MenuTrigger/useMenuTrigger.ts"],"names":[],"mappings":";;;AAAA,sDAAwD;AAGxD,6CAAwC;AAEjC,IAAM,cAAc,GAAG,UAAC,MAAwB;IACrD,IAAM,OAAO,GAAG,IAAA,4BAAc,GAAE,CAAC;IAEjC,IAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,IAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACxC,IAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAEtC,IAAM,UAAU,GAAG,uBAAQ,CAAC,MAAM,CAAC;QACjC,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,GAAG,EAAE,QAAQ;KACvB,CAAC,CAAC;IAEH,IAAM,SAAS,GAAG,UAAC,CAAmB;QACpC,IAAI,WAAW,EAAE;YACf,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;SAC/B;IACH,CAAC,CAAC;IAEF,IAAM,UAAU,GAAG,UAAC,CAAmB;QACrC,IAAI,WAAW,EAAE;YACf,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;SAChC;IACH,CAAC,CAAC;IAEF,IAAM,OAAO,GAAG,UAAC,CAAmB;QAClC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,EAAE,OAAO,SAAA,EAAE,SAAS,WAAA,EAAE,UAAU,YAAA,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE;QACxH,UAAU,EAAE,OAAO,CAAC,SAAS;KAC9B,CAAC;AACJ,CAAC,CAAC;AAjCW,QAAA,cAAc,kBAiCzB"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ /**
3
+ * This context keeps track of whether a trigger component is for a submenu.
4
+ * This allows the trigger to show a submenu indicator.
5
+ */
6
+ export declare const MenuTriggerContext: React.Context<boolean>;
7
+ export declare const MenuTriggerProvider: React.Provider<boolean>;
8
+ export declare const useMenuTriggerContext: () => boolean;
9
+ //# sourceMappingURL=menuTriggerContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menuTriggerContext.d.ts","sourceRoot":"","sources":["../../src/context/menuTriggerContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AACH,eAAO,MAAM,kBAAkB,wBAAsC,CAAC;AAEtE,eAAO,MAAM,mBAAmB,yBAA8B,CAAC;AAC/D,eAAO,MAAM,qBAAqB,eAA6C,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useMenuTriggerContext = exports.MenuTriggerProvider = exports.MenuTriggerContext = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = (0, tslib_1.__importDefault)(require("react"));
6
+ /**
7
+ * This context keeps track of whether a trigger component is for a submenu.
8
+ * This allows the trigger to show a submenu indicator.
9
+ */
10
+ exports.MenuTriggerContext = react_1.default.createContext(false);
11
+ exports.MenuTriggerProvider = exports.MenuTriggerContext.Provider;
12
+ var useMenuTriggerContext = function () { return react_1.default.useContext(exports.MenuTriggerContext); };
13
+ exports.useMenuTriggerContext = useMenuTriggerContext;
14
+ //# sourceMappingURL=menuTriggerContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menuTriggerContext.js","sourceRoot":"","sources":["../../src/context/menuTriggerContext.ts"],"names":[],"mappings":";;;;AAAA,6DAA0B;AAE1B;;;GAGG;AACU,QAAA,kBAAkB,GAAG,eAAK,CAAC,aAAa,CAAU,KAAK,CAAC,CAAC;AAEzD,QAAA,mBAAmB,GAAG,0BAAkB,CAAC,QAAQ,CAAC;AACxD,IAAM,qBAAqB,GAAG,cAAM,OAAA,eAAK,CAAC,UAAU,CAAC,0BAAkB,CAAC,EAApC,CAAoC,CAAC;AAAnE,QAAA,qBAAqB,yBAA8C"}
@@ -3,6 +3,7 @@ export { MenuTrigger } from './MenuTrigger/MenuTrigger';
3
3
  export { MenuPopover } from './MenuPopover/MenuPopover';
4
4
  export { MenuItem } from './MenuItem/MenuItem';
5
5
  export { MenuItemCheckbox } from './MenuItemCheckbox/MenuItemCheckbox';
6
+ export { MenuItemRadio } from './MenuItemRadio/MenuItemRadio';
6
7
  export { MenuList } from './MenuList/MenuList';
7
8
  export { MenuDivider } from './MenuDivider/MenuDivider';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MenuDivider = exports.MenuList = exports.MenuItemCheckbox = exports.MenuItem = exports.MenuPopover = exports.MenuTrigger = exports.Menu = void 0;
3
+ exports.MenuDivider = exports.MenuList = exports.MenuItemRadio = exports.MenuItemCheckbox = exports.MenuItem = exports.MenuPopover = exports.MenuTrigger = exports.Menu = void 0;
4
4
  var Menu_1 = require("./Menu/Menu");
5
5
  Object.defineProperty(exports, "Menu", { enumerable: true, get: function () { return Menu_1.Menu; } });
6
6
  var MenuTrigger_1 = require("./MenuTrigger/MenuTrigger");
@@ -11,6 +11,8 @@ var MenuItem_1 = require("./MenuItem/MenuItem");
11
11
  Object.defineProperty(exports, "MenuItem", { enumerable: true, get: function () { return MenuItem_1.MenuItem; } });
12
12
  var MenuItemCheckbox_1 = require("./MenuItemCheckbox/MenuItemCheckbox");
13
13
  Object.defineProperty(exports, "MenuItemCheckbox", { enumerable: true, get: function () { return MenuItemCheckbox_1.MenuItemCheckbox; } });
14
+ var MenuItemRadio_1 = require("./MenuItemRadio/MenuItemRadio");
15
+ Object.defineProperty(exports, "MenuItemRadio", { enumerable: true, get: function () { return MenuItemRadio_1.MenuItemRadio; } });
14
16
  var MenuList_1 = require("./MenuList/MenuList");
15
17
  Object.defineProperty(exports, "MenuList", { enumerable: true, get: function () { return MenuList_1.MenuList; } });
16
18
  var MenuDivider_1 = require("./MenuDivider/MenuDivider");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,oCAAmC;AAA1B,4FAAA,IAAI,OAAA;AACb,yDAAwD;AAA/C,0GAAA,WAAW,OAAA;AACpB,yDAAwD;AAA/C,0GAAA,WAAW,OAAA;AACpB,gDAA+C;AAAtC,oGAAA,QAAQ,OAAA;AACjB,wEAAuE;AAA9D,oHAAA,gBAAgB,OAAA;AACzB,gDAA+C;AAAtC,oGAAA,QAAQ,OAAA;AACjB,yDAAwD;AAA/C,0GAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,oCAAmC;AAA1B,4FAAA,IAAI,OAAA;AACb,yDAAwD;AAA/C,0GAAA,WAAW,OAAA;AACpB,yDAAwD;AAA/C,0GAAA,WAAW,OAAA;AACpB,gDAA+C;AAAtC,oGAAA,QAAQ,OAAA;AACjB,wEAAuE;AAA9D,oHAAA,gBAAgB,OAAA;AACzB,+DAA8D;AAArD,8GAAA,aAAa,OAAA;AACtB,gDAA+C;AAAtC,oGAAA,QAAQ,OAAA;AACjB,yDAAwD;AAA/C,0GAAA,WAAW,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui-react-native/menu",
3
- "version": "0.9.2",
3
+ "version": "0.11.0",
4
4
  "description": "A cross-platform Menu component using the Fluent Design System",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "module": "lib/index.js",
@@ -23,12 +23,12 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@fluentui-react-native/adapters": ">=0.8.5 <1.0.0",
26
- "@fluentui-react-native/callout": ">=0.20.2 <1.0.0",
27
- "@fluentui-react-native/experimental-text": ">=0.7.28 <1.0.0",
28
- "@fluentui-react-native/framework": "0.7.28",
29
- "@fluentui-react-native/interactive-hooks": ">=0.15.8 <1.0.0",
30
- "@fluentui-react-native/theme-tokens": ">=0.16.3 <1.0.0",
31
- "@fluentui-react-native/tokens": ">=0.12.2 <1.0.0",
26
+ "@fluentui-react-native/callout": ">=0.20.4 <1.0.0",
27
+ "@fluentui-react-native/experimental-text": ">=0.9.0 <1.0.0",
28
+ "@fluentui-react-native/framework": "0.7.30",
29
+ "@fluentui-react-native/interactive-hooks": ">=0.16.0 <1.0.0",
30
+ "@fluentui-react-native/theme-tokens": ">=0.18.0 <1.0.0",
31
+ "@fluentui-react-native/tokens": ">=0.14.0 <1.0.0",
32
32
  "@fluentui-react-native/use-styling": ">=0.8.3 <1.0.0",
33
33
  "react-native-svg": "^12.3.0",
34
34
  "tslib": "^2.3.1"
@@ -10,7 +10,13 @@ export const useMenu = (props: MenuProps): MenuState => {
10
10
  const isControlled = typeof props.open !== 'undefined';
11
11
  const [open, setOpen] = useMenuOpenState(isControlled, props);
12
12
 
13
+ // Default behaviot for submenu is to open on hover
14
+ // the ...props line below will override this behavior for a submenu
15
+ // or apply openOnHover if passed into a root Menu.
16
+ const openOnHover = isSubmenu;
17
+
13
18
  return {
19
+ openOnHover,
14
20
  ...props,
15
21
  open,
16
22
  setOpen,
@@ -47,6 +47,13 @@ export const stylingSettings: UseStylingOptions<MenuItemProps, MenuItemSlotProps
47
47
  (tokens: MenuItemTokens) => {
48
48
  return {
49
49
  color: tokens.color,
50
+ height: 16,
51
+ width: 16,
52
+ viewBox:
53
+ '0 0 ' +
54
+ (tokens.submenuIndicatorSize - tokens.submenuIndicatorPadding * 2) +
55
+ ' ' +
56
+ (tokens.submenuIndicatorSize - tokens.submenuIndicatorPadding * 2),
50
57
  };
51
58
  },
52
59
  ['color'],
@@ -1,5 +1,5 @@
1
1
  /** @jsx withSlots */
2
- import { View } from 'react-native';
2
+ import { I18nManager, View } from 'react-native';
3
3
  import { SvgXml } from 'react-native-svg';
4
4
  import { compose, mergeProps, UseSlots, withSlots } from '@fluentui-react-native/framework';
5
5
  import { Text } from '@fluentui-react-native/experimental-text';
@@ -22,10 +22,15 @@ export const MenuItem = compose<MenuItemType>({
22
22
 
23
23
  return (final: MenuItemProps) => {
24
24
  const mergedProps = mergeProps(menuItem.props, final);
25
- const chevronXml = `
26
- <svg width="12" height="16" viewBox="0 0 11 6">
27
- <path fill='currentColor' d='M0.646447 0.646447C0.841709 0.451184 1.15829 0.451184 1.35355 0.646447L5.5 4.79289L9.64645 0.646447C9.84171 0.451185 10.1583 0.451185 10.3536 0.646447C10.5488 0.841709 10.5488 1.15829 10.3536 1.35355L5.85355 5.85355C5.65829 6.04882 5.34171 6.04882 5.14645 5.85355L0.646447 1.35355C0.451184 1.15829 0.451184 0.841709 0.646447 0.646447Z' />
28
- </svg>`;
25
+ const chevronXml = I18nManager.isRTL
26
+ ? `
27
+ <svg>
28
+ <path fill='currentColor' d='M7.35355 2.14645C7.54882 2.34171 7.54882 2.65829 7.35355 2.85355L4.20711 6L7.35355 9.14645C7.54882 9.34171 7.54882 9.65829 7.35355 9.85355C7.15829 10.0488 6.84171 10.0488 6.64645 9.85355L3.14645 6.35355C2.95118 6.15829 2.95118 5.84171 3.14645 5.64645L6.64645 2.14645C6.84171 1.95118 7.15829 1.95118 7.35355 2.14645Z' />
29
+ </svg>`
30
+ : `
31
+ <svg>
32
+ <path fill='currentColor' d='M4.64645 2.14645C4.45118 2.34171 4.45118 2.65829 4.64645 2.85355L7.79289 6L4.64645 9.14645C4.45118 9.34171 4.45118 9.65829 4.64645 9.85355C4.84171 10.0488 5.15829 10.0488 5.35355 9.85355L8.85355 6.35355C9.04882 6.15829 9.04882 5.84171 8.85355 5.64645L5.35355 2.14645C5.15829 1.95118 4.84171 1.95118 4.64645 2.14645Z' />
33
+ </svg>`;
29
34
 
30
35
  return (
31
36
  <Slots.root {...mergedProps}>
@@ -10,6 +10,8 @@ export const menuItemName = 'MenuItem';
10
10
 
11
11
  export interface MenuItemTokens extends LayoutTokens, FontTokens, IBorderTokens, IColorTokens {
12
12
  checkmarkSize?: number;
13
+ submenuIndicatorPadding?: number;
14
+ submenuIndicatorSize?: number;
13
15
  gap?: number;
14
16
 
15
17
  disabled?: MenuItemTokens;
@@ -7,6 +7,8 @@ export const defaultMenuItemTokens: TokenSettings<MenuItemTokens, Theme> = (t: T
7
7
  backgroundColor: t.colors.neutralBackground1,
8
8
  borderRadius: globalTokens.corner.radius.medium,
9
9
  checkmarkSize: 16,
10
+ submenuIndicatorPadding: globalTokens.spacing.none,
11
+ submenuIndicatorSize: 16,
10
12
  color: t.colors.neutralForeground2,
11
13
  fontFamily: t.typography.families.primary,
12
14
  fontSize: globalTokens.font.size[300],
@@ -7,6 +7,8 @@ export const defaultMenuItemTokens: TokenSettings<MenuItemTokens, Theme> = (t: T
7
7
  backgroundColor: t.colors.neutralBackground1,
8
8
  borderRadius: globalTokens.corner.radius.none,
9
9
  checkmarkSize: 16,
10
+ submenuIndicatorPadding: globalTokens.spacing.xxs,
11
+ submenuIndicatorSize: 16,
10
12
  color: t.colors.neutralForeground1,
11
13
  fontFamily: t.typography.families.primary,
12
14
  fontSize: globalTokens.font.size[200],
@@ -5,6 +5,7 @@ import { memoize } from '@fluentui-react-native/framework';
5
5
  import { useAsPressable, useKeyProps } from '@fluentui-react-native/interactive-hooks';
6
6
  import { useMenuContext } from '../context/menuContext';
7
7
  import { useMenuListContext } from '../context/menuListContext';
8
+ import { useMenuTriggerContext } from '../context/menuTriggerContext';
8
9
 
9
10
  export const useMenuItem = (props: MenuItemProps): MenuItemState => {
10
11
  // attach the pressable state handlers
@@ -12,7 +13,8 @@ export const useMenuItem = (props: MenuItemProps): MenuItemState => {
12
13
  const { onClick, accessibilityState, componentRef = defaultComponentRef, disabled, ...rest } = props;
13
14
  const pressable = useAsPressable({ ...rest, disabled, onPress: onClick });
14
15
  const onKeyProps = useKeyProps(onClick, ' ', 'Enter');
15
- const hasSubmenu = useMenuContext().isSubmenu;
16
+ const isTrigger = useMenuTriggerContext();
17
+ const hasSubmenu = useMenuContext().isSubmenu && isTrigger;
16
18
  const hasCheckmarks = useMenuListContext().hasCheckmarks;
17
19
 
18
20
  return {
@@ -1,9 +1,15 @@
1
1
  /** @jsx withSlots */
2
2
  import { View } from 'react-native';
3
3
  import { SvgXml } from 'react-native-svg';
4
- import { compose, mergeProps, UseSlots, withSlots } from '@fluentui-react-native/framework';
4
+ import { compose, mergeProps, Slots, UseSlots, withSlots } from '@fluentui-react-native/framework';
5
5
  import { Text } from '@fluentui-react-native/experimental-text';
6
- import { menuItemCheckboxName, MenuItemCheckboxProps, MenuItemCheckboxType } from './MenuItemCheckbox.types';
6
+ import {
7
+ menuItemCheckboxName,
8
+ MenuItemCheckboxProps,
9
+ MenuItemCheckboxSlotProps,
10
+ MenuItemCheckboxState,
11
+ MenuItemCheckboxType,
12
+ } from './MenuItemCheckbox.types';
7
13
  import { useMenuItemCheckbox } from './useMenuItemCheckbox';
8
14
  import { stylingSettings } from './MenuItemCheckbox.styling';
9
15
 
@@ -19,19 +25,26 @@ export const MenuItemCheckbox = compose<MenuItemCheckboxType>({
19
25
  const menuItem = useMenuItemCheckbox(userProps);
20
26
  const Slots = useSlots(userProps, (layer): boolean => menuItem.state[layer]);
21
27
 
22
- return (final: MenuItemCheckboxProps) => {
23
- const mergedProps = mergeProps(menuItem.props, final);
24
- const chevronXml = `
25
- <svg>
26
- <path fill='currentColor' d='M9.85355 3.14645C10.0488 3.34171 10.0488 3.65829 9.85355 3.85355L5.35355 8.35355C5.15829 8.54882 4.84171 8.54882 4.64645 8.35355L2.64645 6.35355C2.45118 6.15829 2.45118 5.84171 2.64645 5.64645C2.84171 5.45118 3.15829 5.45118 3.35355 5.64645L5 7.29289L9.14645 3.14645C9.34171 2.95118 9.65829 2.95118 9.85355 3.14645Z' />
27
- </svg>`;
28
-
29
- return (
30
- <Slots.root {...mergedProps}>
31
- <Slots.checkmark xml={chevronXml} />
32
- {mergedProps.content && <Slots.content>{mergedProps.content}</Slots.content>}
33
- </Slots.root>
34
- );
35
- };
28
+ return menuItemFinalRender(menuItem, Slots);
36
29
  },
37
30
  });
31
+
32
+ export const menuItemFinalRender = (
33
+ menuItem: MenuItemCheckboxState,
34
+ Slots: Slots<MenuItemCheckboxSlotProps>,
35
+ ): React.FunctionComponent<MenuItemCheckboxProps> => {
36
+ return (final: MenuItemCheckboxProps) => {
37
+ const mergedProps = mergeProps(menuItem.props, final);
38
+ const checkmarkXml = `
39
+ <svg>
40
+ <path fill='currentColor' d='M9.85355 3.14645C10.0488 3.34171 10.0488 3.65829 9.85355 3.85355L5.35355 8.35355C5.15829 8.54882 4.84171 8.54882 4.64645 8.35355L2.64645 6.35355C2.45118 6.15829 2.45118 5.84171 2.64645 5.64645C2.84171 5.45118 3.15829 5.45118 3.35355 5.64645L5 7.29289L9.14645 3.14645C9.34171 2.95118 9.65829 2.95118 9.85355 3.14645Z' />
41
+ </svg>`;
42
+
43
+ return (
44
+ <Slots.root {...mergedProps}>
45
+ <Slots.checkmark xml={checkmarkXml} />
46
+ {mergedProps.content && <Slots.content>{mergedProps.content}</Slots.content>}
47
+ </Slots.root>
48
+ );
49
+ };
50
+ };
@@ -14,7 +14,41 @@ import { useMenuListContext } from '../context/menuListContext';
14
14
  const defaultAccessibilityActions = [{ name: 'Toggle' }];
15
15
 
16
16
  export const useMenuItemCheckbox = (props: MenuItemCheckboxProps): MenuItemCheckboxState => {
17
- // attach the pressable state handlers
17
+ const { name } = props;
18
+ const context = useMenuListContext();
19
+ const checked = context.checked?.[name];
20
+ const onCheckedChange = context.onCheckedChange;
21
+
22
+ const toggleChecked = React.useCallback(
23
+ (e: InteractionEvent) => {
24
+ onCheckedChange(e, name, !checked);
25
+ },
26
+ [checked, name, onCheckedChange],
27
+ );
28
+
29
+ return useMenuCheckboxInteraction(props, toggleChecked);
30
+ };
31
+
32
+ const getAccessibilityState = memoize(getAccessibilityStateWorker);
33
+ function getAccessibilityStateWorker(disabled: boolean, checked: boolean, accessibilityState?: AccessibilityState) {
34
+ if (accessibilityState) {
35
+ return { disabled, checked, ...accessibilityState };
36
+ }
37
+ return { disabled, checked };
38
+ }
39
+
40
+ /**
41
+ * Create interactivity and accessibility props to be passed into the inner render.
42
+ * This logic is shared between Checkbox and Radio versions of MenuItem.
43
+ *
44
+ * @param props Props passed into the outer compoennt
45
+ * @param toggleCallback Function to be called when item is toggled
46
+ * @returns Props and additional state needed to render the component
47
+ */
48
+ export const useMenuCheckboxInteraction = (
49
+ props: MenuItemCheckboxProps,
50
+ toggleCallback: (e: InteractionEvent) => void,
51
+ ): MenuItemCheckboxState => {
18
52
  const defaultComponentRef = React.useRef(null);
19
53
  const {
20
54
  accessibilityActions,
@@ -27,32 +61,25 @@ export const useMenuItemCheckbox = (props: MenuItemCheckboxProps): MenuItemCheck
27
61
  } = props;
28
62
  const context = useMenuListContext();
29
63
  const checked = context.checked?.[name];
30
- const onCheckedChange = context.onCheckedChange;
31
64
 
32
- const toggleChecked = React.useCallback(
33
- (e: InteractionEvent) => {
34
- onCheckedChange(e, name, !checked);
35
- },
36
- [checked, name, onCheckedChange],
37
- );
38
65
  // Ensure focus is placed on checkbox after click
39
- const toggleCheckedWithFocus = useOnPressWithFocus(componentRef, toggleChecked);
66
+ const toggleCheckedWithFocus = useOnPressWithFocus(componentRef, toggleCallback);
40
67
 
41
68
  const pressable = useAsPressable({ onPress: toggleCheckedWithFocus, ...rest });
42
69
  const buttonRef = useViewCommandFocus(componentRef);
43
70
 
44
- const onKeyProps = useKeyProps(toggleChecked, ' ');
71
+ const onKeyProps = useKeyProps(toggleCallback, ' ');
45
72
  const accessibilityActionsProp = accessibilityActions
46
73
  ? [...defaultAccessibilityActions, ...accessibilityActions]
47
74
  : defaultAccessibilityActions;
48
75
  const onAccessibilityActionProp = React.useCallback(
49
76
  (event: AccessibilityActionEvent) => {
50
77
  if (event.nativeEvent.actionName === 'Toggle') {
51
- toggleChecked(event);
78
+ toggleCallback(event);
52
79
  }
53
80
  onAccessibilityAction && onAccessibilityAction(event);
54
81
  },
55
- [toggleChecked, onAccessibilityAction],
82
+ [toggleCallback, onAccessibilityAction],
56
83
  );
57
84
 
58
85
  const state = {
@@ -78,11 +105,3 @@ export const useMenuItemCheckbox = (props: MenuItemCheckboxProps): MenuItemCheck
78
105
  state: state,
79
106
  };
80
107
  };
81
-
82
- const getAccessibilityState = memoize(getAccessibilityStateWorker);
83
- function getAccessibilityStateWorker(disabled: boolean, checked: boolean, accessibilityState?: AccessibilityState) {
84
- if (accessibilityState) {
85
- return { disabled, checked, ...accessibilityState };
86
- }
87
- return { disabled, checked };
88
- }
@@ -0,0 +1,16 @@
1
+ import { UseSlots } from '@fluentui-react-native/framework';
2
+ import { useMenuItemRadio } from './useMenuItemRadio';
3
+ import { MenuItemCheckbox, menuItemFinalRender } from '../MenuItemCheckbox/MenuItemCheckbox';
4
+ import { MenuItemCheckboxProps, MenuItemCheckboxType } from '../MenuItemCheckbox/MenuItemCheckbox.types';
5
+
6
+ export const menuItemRadioName = 'MenuItemRadio';
7
+
8
+ export const MenuItemRadio = MenuItemCheckbox.compose({
9
+ displayName: menuItemRadioName,
10
+ useRender: (userProps: MenuItemCheckboxProps, useSlots: UseSlots<MenuItemCheckboxType>) => {
11
+ const menuItem = useMenuItemRadio(userProps);
12
+ const Slots = useSlots(userProps, (layer): boolean => menuItem.state[layer]);
13
+
14
+ return menuItemFinalRender(menuItem, Slots);
15
+ },
16
+ });
@@ -0,0 +1,21 @@
1
+ import * as React from 'react';
2
+ import { InteractionEvent } from '@fluentui-react-native/interactive-hooks';
3
+ import { useMenuListContext } from '../context/menuListContext';
4
+ import { MenuItemCheckboxProps, MenuItemCheckboxState } from '../MenuItemCheckbox/MenuItemCheckbox.types';
5
+ import { useMenuCheckboxInteraction } from '../MenuItemCheckbox/useMenuItemCheckbox';
6
+
7
+ export const useMenuItemRadio = (props: MenuItemCheckboxProps): MenuItemCheckboxState => {
8
+ const { name } = props;
9
+ const context = useMenuListContext();
10
+ const checked = context.checked?.[name];
11
+ const selectRadio = context.selectRadio;
12
+
13
+ const toggleChecked = React.useCallback(
14
+ (e: InteractionEvent) => {
15
+ selectRadio(e, name, !checked);
16
+ },
17
+ [checked, name, selectRadio],
18
+ );
19
+
20
+ return useMenuCheckboxInteraction(props, toggleChecked);
21
+ };
@@ -13,8 +13,9 @@ export const stylingSettings: UseStylingOptions<MenuListProps, MenuListSlotProps
13
13
  display: 'flex',
14
14
  ...layoutStyles.from(tokens, theme),
15
15
  },
16
+ gap: tokens.gap,
16
17
  }),
17
- ['backgroundColor', ...layoutStyles.keys],
18
+ ['backgroundColor', 'gap', ...layoutStyles.keys],
18
19
  ),
19
20
  },
20
21
  };
@@ -1,18 +1,38 @@
1
1
  /** @jsx withSlots */
2
2
  import React from 'react';
3
3
  import { View } from 'react-native';
4
- import { compose, UseSlots, withSlots } from '@fluentui-react-native/framework';
4
+ import { compose, mergeProps, stagedComponent, UseSlots, withSlots } from '@fluentui-react-native/framework';
5
5
  import { menuListName, MenuListProps, MenuListType } from './MenuList.types';
6
6
  import { stylingSettings } from './MenuList.styling';
7
7
  import { MenuListProvider } from '../context/menuListContext';
8
8
  import { useMenuList } from './useMenuList';
9
- import { useMenuListContextValue } from './useMenuContextValue';
9
+ import { useMenuListContextValue } from './useMenuListContextValue';
10
+ import { IViewProps } from '@fluentui-react-native/adapters';
11
+
12
+ const MenuStack = stagedComponent((props: React.PropsWithRef<IViewProps> & { gap?: number }) => {
13
+ const { gap, ...rest } = props;
14
+ return (final: React.PropsWithRef<IViewProps> & { gap?: number }, children: React.ReactNode) => {
15
+ if (gap && gap > 0 && children) {
16
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
17
+ // @ts-ignore - GH:1684, fix typing error
18
+ children = React.Children.map(children, (child: React.ReactChild, index: number) => {
19
+ if (React.isValidElement(child) && index > 0) {
20
+ return React.cloneElement(child, mergeProps(child.props, { style: { marginTop: gap } }));
21
+ }
22
+ return child;
23
+ });
24
+ }
25
+
26
+ return <View {...mergeProps(rest, final)}>{children}</View>;
27
+ };
28
+ });
29
+ MenuStack.displayName = 'MenuStack';
10
30
 
11
31
  export const MenuList = compose<MenuListType>({
12
32
  displayName: menuListName,
13
33
  ...stylingSettings,
14
34
  slots: {
15
- root: View,
35
+ root: MenuStack,
16
36
  },
17
37
  useRender: (userProps: MenuListProps, useSlots: UseSlots<MenuListType>) => {
18
38
  const menuList = useMenuList(userProps);
@@ -28,5 +48,3 @@ export const MenuList = compose<MenuListType>({
28
48
  };
29
49
  },
30
50
  });
31
-
32
- export default MenuList;