@fluentui-react-native/menu 0.7.0 → 0.8.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 (77) hide show
  1. package/CHANGELOG.json +16 -1
  2. package/CHANGELOG.md +10 -2
  3. package/lib/MenuItem/useMenuItem.d.ts.map +1 -1
  4. package/lib/MenuItem/useMenuItem.js +3 -2
  5. package/lib/MenuItem/useMenuItem.js.map +1 -1
  6. package/lib/MenuItemCheckbox/MenuItemCheckbox.styling.d.ts.map +1 -1
  7. package/lib/MenuItemCheckbox/MenuItemCheckbox.styling.js +1 -0
  8. package/lib/MenuItemCheckbox/MenuItemCheckbox.styling.js.map +1 -1
  9. package/lib/MenuItemCheckbox/MenuItemCheckbox.types.d.ts +3 -4
  10. package/lib/MenuItemCheckbox/MenuItemCheckbox.types.d.ts.map +1 -1
  11. package/lib/MenuItemCheckbox/useMenuItemCheckbox.d.ts.map +1 -1
  12. package/lib/MenuItemCheckbox/useMenuItemCheckbox.js +31 -13
  13. package/lib/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
  14. package/lib/MenuList/MenuList.d.ts.map +1 -1
  15. package/lib/MenuList/MenuList.js +8 -2
  16. package/lib/MenuList/MenuList.js.map +1 -1
  17. package/lib/MenuList/MenuList.types.d.ts +7 -0
  18. package/lib/MenuList/MenuList.types.d.ts.map +1 -1
  19. package/lib/MenuList/MenuList.types.js.map +1 -1
  20. package/lib/MenuList/useMenuContextValue.d.ts +4 -0
  21. package/lib/MenuList/useMenuContextValue.d.ts.map +1 -0
  22. package/lib/MenuList/useMenuContextValue.js +5 -0
  23. package/lib/MenuList/useMenuContextValue.js.map +1 -0
  24. package/lib/MenuList/useMenuList.d.ts +3 -0
  25. package/lib/MenuList/useMenuList.d.ts.map +1 -0
  26. package/lib/MenuList/useMenuList.js +31 -0
  27. package/lib/MenuList/useMenuList.js.map +1 -0
  28. package/lib/context/menuContext.d.ts.map +1 -1
  29. package/lib/context/menuContext.js +4 -0
  30. package/lib/context/menuContext.js.map +1 -1
  31. package/lib/context/menuListContext.d.ts +9 -0
  32. package/lib/context/menuListContext.d.ts.map +1 -1
  33. package/lib/context/menuListContext.js +10 -1
  34. package/lib/context/menuListContext.js.map +1 -1
  35. package/lib-commonjs/MenuItem/useMenuItem.d.ts.map +1 -1
  36. package/lib-commonjs/MenuItem/useMenuItem.js +3 -2
  37. package/lib-commonjs/MenuItem/useMenuItem.js.map +1 -1
  38. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.styling.d.ts.map +1 -1
  39. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.styling.js +1 -0
  40. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.styling.js.map +1 -1
  41. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.types.d.ts +3 -4
  42. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.types.d.ts.map +1 -1
  43. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.d.ts.map +1 -1
  44. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.js +29 -11
  45. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
  46. package/lib-commonjs/MenuList/MenuList.d.ts.map +1 -1
  47. package/lib-commonjs/MenuList/MenuList.js +8 -2
  48. package/lib-commonjs/MenuList/MenuList.js.map +1 -1
  49. package/lib-commonjs/MenuList/MenuList.types.d.ts +7 -0
  50. package/lib-commonjs/MenuList/MenuList.types.d.ts.map +1 -1
  51. package/lib-commonjs/MenuList/MenuList.types.js.map +1 -1
  52. package/lib-commonjs/MenuList/useMenuContextValue.d.ts +4 -0
  53. package/lib-commonjs/MenuList/useMenuContextValue.d.ts.map +1 -0
  54. package/lib-commonjs/MenuList/useMenuContextValue.js +9 -0
  55. package/lib-commonjs/MenuList/useMenuContextValue.js.map +1 -0
  56. package/lib-commonjs/MenuList/useMenuList.d.ts +3 -0
  57. package/lib-commonjs/MenuList/useMenuList.d.ts.map +1 -0
  58. package/lib-commonjs/MenuList/useMenuList.js +35 -0
  59. package/lib-commonjs/MenuList/useMenuList.js.map +1 -0
  60. package/lib-commonjs/context/menuContext.d.ts.map +1 -1
  61. package/lib-commonjs/context/menuContext.js +4 -0
  62. package/lib-commonjs/context/menuContext.js.map +1 -1
  63. package/lib-commonjs/context/menuListContext.d.ts +9 -0
  64. package/lib-commonjs/context/menuListContext.d.ts.map +1 -1
  65. package/lib-commonjs/context/menuListContext.js +14 -0
  66. package/lib-commonjs/context/menuListContext.js.map +1 -1
  67. package/package.json +1 -1
  68. package/src/MenuItem/useMenuItem.ts +3 -2
  69. package/src/MenuItemCheckbox/MenuItemCheckbox.styling.ts +1 -0
  70. package/src/MenuItemCheckbox/MenuItemCheckbox.types.ts +4 -6
  71. package/src/MenuItemCheckbox/useMenuItemCheckbox.ts +64 -16
  72. package/src/MenuList/MenuList.tsx +11 -2
  73. package/src/MenuList/MenuList.types.ts +8 -0
  74. package/src/MenuList/useMenuContextValue.ts +6 -0
  75. package/src/MenuList/useMenuList.ts +49 -0
  76. package/src/context/menuContext.ts +4 -0
  77. package/src/context/menuListContext.ts +18 -0
@@ -1 +1 @@
1
- {"version":3,"file":"useMenuItemCheckbox.js","sourceRoot":"","sources":["../../src/MenuItemCheckbox/useMenuItemCheckbox.ts"],"names":[],"mappings":";;;;AAAA,wDAA+B;AAG/B,8DAA2D;AAC3D,8EAAuF;AACvF,sDAAwD;AAEjD,IAAM,mBAAmB,GAAG,UAAC,KAA4B;IAC9D,sCAAsC;IACtC,IAAM,mBAAmB,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,IAAA,OAAO,GAAgF,KAAK,QAArF,EAAE,kBAAkB,GAA4D,KAAK,mBAAjE,EAAE,KAA0D,KAAK,aAA7B,EAAlC,YAAY,mBAAG,mBAAmB,KAAA,EAAE,QAAQ,GAAc,KAAK,SAAnB,EAAK,IAAI,uBAAK,KAAK,EAA9F,6DAAsF,CAAF,CAAW;IACrG,IAAM,SAAS,GAAG,IAAA,kCAAc,kDAAM,IAAI,KAAE,QAAQ,UAAA,EAAE,OAAO,EAAE,OAAO,IAAG,CAAC;IAC1E,IAAM,UAAU,GAAG,IAAA,+BAAW,EAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACtD,IAAM,aAAa,GAAG,IAAA,4BAAc,GAAE,CAAC,aAAa,CAAC;IAErD,OAAO;QACL,KAAK,wEACA,SAAS,CAAC,KAAK,KAClB,UAAU,EAAE,IAAI,EAChB,iBAAiB,EAAE,QAAQ,EAC3B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,OAAO,EAC7D,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,EAC5C,kBAAkB,EAAE,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EACvE,eAAe,EAAE,IAAI,EACrB,SAAS,EAAE,CAAC,QAAQ,EACpB,GAAG,EAAE,YAAY,KACd,UAAU,CACd;QACD,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,aAAa,eAAA;KACd,CAAC;AACJ,CAAC,CAAC;AAxBW,QAAA,mBAAmB,uBAwB9B;AAEF,IAAM,qBAAqB,GAAG,IAAA,mBAAO,EAAC,2BAA2B,CAAC,CAAC;AACnE,SAAS,2BAA2B,CAAC,QAAiB,EAAE,kBAAuC;IAC7F,IAAI,kBAAkB,EAAE;QACtB,+BAAS,QAAQ,UAAA,IAAK,kBAAkB,EAAG;KAC5C;IACD,OAAO,EAAE,QAAQ,UAAA,EAAE,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"useMenuItemCheckbox.js","sourceRoot":"","sources":["../../src/MenuItemCheckbox/useMenuItemCheckbox.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuList.d.ts","sourceRoot":"","sources":["../../src/MenuList/MenuList.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAgB,aAAa,EAAgB,MAAM,kBAAkB,CAAC;AAG7E,eAAO,MAAM,QAAQ,gLAanB,CAAC;AAEH,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"MenuList.d.ts","sourceRoot":"","sources":["../../src/MenuList/MenuList.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAgB,aAAa,EAAgB,MAAM,kBAAkB,CAAC;AAM7E,eAAO,MAAM,QAAQ,gLAmBnB,CAAC;AAEH,eAAe,QAAQ,CAAC"}
@@ -6,12 +6,18 @@ var react_native_1 = require("react-native");
6
6
  var framework_1 = require("@fluentui-react-native/framework");
7
7
  var MenuList_types_1 = require("./MenuList.types");
8
8
  var MenuList_styling_1 = require("./MenuList.styling");
9
+ var menuListContext_1 = require("../context/menuListContext");
10
+ var useMenuList_1 = require("./useMenuList");
11
+ var useMenuContextValue_1 = require("./useMenuContextValue");
9
12
  exports.MenuList = (0, framework_1.compose)((0, tslib_1.__assign)((0, tslib_1.__assign)({ displayName: MenuList_types_1.menuListName }, MenuList_styling_1.stylingSettings), { slots: {
10
13
  root: react_native_1.View,
11
14
  }, useRender: function (userProps, useSlots) {
12
- var Slots = useSlots(userProps);
15
+ var menuList = (0, useMenuList_1.useMenuList)(userProps);
16
+ var contextValue = (0, useMenuContextValue_1.useMenuListContextValue)(menuList);
17
+ var Slots = useSlots(menuList);
13
18
  return function (_final, children) {
14
- return (0, framework_1.withSlots)(Slots.root, null, children);
19
+ return ((0, framework_1.withSlots)(menuListContext_1.MenuListProvider, { value: contextValue },
20
+ (0, framework_1.withSlots)(Slots.root, null, children)));
15
21
  };
16
22
  } }));
17
23
  exports.default = exports.MenuList;
@@ -1 +1 @@
1
- {"version":3,"file":"MenuList.js","sourceRoot":"","sources":["../../src/MenuList/MenuList.tsx"],"names":[],"mappings":";;;;AAEA,6CAAoC;AACpC,8DAAgF;AAChF,mDAA6E;AAC7E,uDAAqD;AAExC,QAAA,QAAQ,GAAG,IAAA,mBAAO,gDAC7B,WAAW,EAAE,6BAAY,IACtB,kCAAe,KAClB,KAAK,EAAE;QACL,IAAI,EAAE,mBAAI;KACX,EACD,SAAS,EAAE,UAAC,SAAwB,EAAE,QAAgC;QACpE,IAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QAElC,OAAO,UAAC,MAAqB,EAAE,QAAyB;YACtD,OAAO,2BAAC,KAAK,CAAC,IAAI,QAAE,QAAQ,CAAc,CAAC;QAC7C,CAAC,CAAC;IACJ,CAAC,IACD,CAAC;AAEH,kBAAe,gBAAQ,CAAC"}
1
+ {"version":3,"file":"MenuList.js","sourceRoot":"","sources":["../../src/MenuList/MenuList.tsx"],"names":[],"mappings":";;;;AAEA,6CAAoC;AACpC,8DAAgF;AAChF,mDAA6E;AAC7E,uDAAqD;AACrD,8DAA8D;AAC9D,6CAA4C;AAC5C,6DAAgE;AAEnD,QAAA,QAAQ,GAAG,IAAA,mBAAO,gDAC7B,WAAW,EAAE,6BAAY,IACtB,kCAAe,KAClB,KAAK,EAAE;QACL,IAAI,EAAE,mBAAI;KACX,EACD,SAAS,EAAE,UAAC,SAAwB,EAAE,QAAgC;QACpE,IAAM,QAAQ,GAAG,IAAA,yBAAW,EAAC,SAAS,CAAC,CAAC;QACxC,IAAM,YAAY,GAAG,IAAA,6CAAuB,EAAC,QAAQ,CAAC,CAAC;QACvD,IAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEjC,OAAO,UAAC,MAAqB,EAAE,QAAyB;YACtD,OAAO,CACL,2BAAC,kCAAgB,IAAC,KAAK,EAAE,YAAY;gBACnC,2BAAC,KAAK,CAAC,IAAI,QAAE,QAAQ,CAAc,CAClB,CACpB,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC,IACD,CAAC;AAEH,kBAAe,gBAAQ,CAAC"}
@@ -1,11 +1,18 @@
1
1
  /// <reference types="react" />
2
2
  import type { IViewProps } from '@fluentui-react-native/adapters';
3
+ import { InteractionEvent } from '@fluentui-react-native/interactive-hooks';
3
4
  import { IBackgroundColorTokens, LayoutTokens } from '@fluentui-react-native/tokens';
4
5
  export declare const menuListName = "MenuList";
5
6
  export interface MenuListTokens extends LayoutTokens, IBackgroundColorTokens {
6
7
  }
7
8
  export interface MenuListProps extends Omit<IViewProps, 'onPress'> {
9
+ checked?: Record<string, boolean>;
10
+ defaultChecked?: Record<string, boolean>;
8
11
  hasCheckmarks?: boolean;
12
+ onCheckedChange?: (e: InteractionEvent, name: string, isChecked: boolean) => void;
13
+ }
14
+ export interface MenuListState extends MenuListProps {
15
+ isCheckedControlled: boolean;
9
16
  }
10
17
  export interface MenuListSlotProps {
11
18
  root: React.PropsWithRef<IViewProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"MenuList.types.d.ts","sourceRoot":"","sources":["../../src/MenuList/MenuList.types.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAErF,eAAO,MAAM,YAAY,aAAa,CAAC;AAEvC,MAAM,WAAW,cAAe,SAAQ,YAAY,EAAE,sBAAsB;CAAG;AAE/E,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;IAChE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;CACtC;AACD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,iBAAiB,CAAC;CAC9B"}
1
+ {"version":3,"file":"MenuList.types.d.ts","sourceRoot":"","sources":["../../src/MenuList/MenuList.types.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAErF,eAAO,MAAM,YAAY,aAAa,CAAC;AAEvC,MAAM,WAAW,cAAe,SAAQ,YAAY,EAAE,sBAAsB;CAAG;AAE/E,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CACnF;AAED,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;CACtC;AACD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,iBAAiB,CAAC;CAC9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuList.types.js","sourceRoot":"","sources":["../../src/MenuList/MenuList.types.ts"],"names":[],"mappings":";;;AAGa,QAAA,YAAY,GAAG,UAAU,CAAC"}
1
+ {"version":3,"file":"MenuList.types.js","sourceRoot":"","sources":["../../src/MenuList/MenuList.types.ts"],"names":[],"mappings":";;;AAIa,QAAA,YAAY,GAAG,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { MenuListContextValue } from '../context/menuListContext';
2
+ import { MenuListState } from './MenuList.types';
3
+ export declare const useMenuListContextValue: (state: MenuListState) => MenuListContextValue;
4
+ //# sourceMappingURL=useMenuContextValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMenuContextValue.d.ts","sourceRoot":"","sources":["../../src/MenuList/useMenuContextValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,eAAO,MAAM,uBAAuB,UAAW,aAAa,KAAG,oBAE9D,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useMenuListContextValue = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var useMenuListContextValue = function (state) {
6
+ return (0, tslib_1.__assign)({}, state);
7
+ };
8
+ exports.useMenuListContextValue = useMenuListContextValue;
9
+ //# sourceMappingURL=useMenuContextValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMenuContextValue.js","sourceRoot":"","sources":["../../src/MenuList/useMenuContextValue.ts"],"names":[],"mappings":";;;;AAGO,IAAM,uBAAuB,GAAG,UAAC,KAAoB;IAC1D,iCAAY,KAAK,EAAG;AACtB,CAAC,CAAC;AAFW,QAAA,uBAAuB,2BAElC"}
@@ -0,0 +1,3 @@
1
+ import { MenuListProps, MenuListState } from './MenuList.types';
2
+ export declare const useMenuList: (_props: MenuListProps) => MenuListState;
3
+ //# sourceMappingURL=useMenuList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMenuList.d.ts","sourceRoot":"","sources":["../../src/MenuList/useMenuList.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEhE,eAAO,MAAM,WAAW,WAAY,aAAa,KAAG,aAcnD,CAAC"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useMenuList = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = (0, tslib_1.__importDefault)(require("react"));
6
+ var menuContext_1 = require("../context/menuContext");
7
+ var useMenuList = function (_props) {
8
+ var context = (0, menuContext_1.useMenuContext)();
9
+ // MenuList v2 needs to be able to be standalone, but this is not in scope for v1
10
+ // Assuming that checked information will come from parent Menu
11
+ var isCheckedControlled = typeof context.checked !== 'undefined';
12
+ var _a = useMenuCheckedState(isCheckedControlled, context), checked = _a[0], onCheckedChange = _a[1];
13
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, context), { isCheckedControlled: isCheckedControlled, checked: checked, onCheckedChange: onCheckedChange });
14
+ };
15
+ exports.useMenuList = useMenuList;
16
+ var useMenuCheckedState = function (isControlled, props) {
17
+ var _a;
18
+ var defaultChecked = props.defaultChecked, onCheckedChange = props.onCheckedChange, checked = props.checked;
19
+ var initialState = (_a = defaultChecked !== null && defaultChecked !== void 0 ? defaultChecked : checked) !== null && _a !== void 0 ? _a : {};
20
+ var _b = react_1.default.useState(initialState), checkedInternal = _b[0], setCheckedInternal = _b[1];
21
+ var state = isControlled ? checked : checkedInternal;
22
+ var setChecked = react_1.default.useCallback(function (e, name, isChecked) {
23
+ if (!isControlled) {
24
+ var curChecked = state;
25
+ curChecked[name] = isChecked;
26
+ var updatedChecked = (0, tslib_1.__assign)({}, curChecked);
27
+ setCheckedInternal(updatedChecked);
28
+ }
29
+ if (onCheckedChange) {
30
+ onCheckedChange(e, name, isChecked);
31
+ }
32
+ }, [isControlled, state, onCheckedChange, setCheckedInternal]);
33
+ return [state, setChecked];
34
+ };
35
+ //# sourceMappingURL=useMenuList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMenuList.js","sourceRoot":"","sources":["../../src/MenuList/useMenuList.ts"],"names":[],"mappings":";;;;AACA,6DAA0B;AAC1B,sDAAwD;AAGjD,IAAM,WAAW,GAAG,UAAC,MAAqB;IAC/C,IAAM,OAAO,GAAG,IAAA,4BAAc,GAAE,CAAC;IAEjC,iFAAiF;IACjF,+DAA+D;IAC/D,IAAM,mBAAmB,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,WAAW,CAAC;IAC7D,IAAA,KAA6B,mBAAmB,CAAC,mBAAmB,EAAE,OAAO,CAAC,EAA7E,OAAO,QAAA,EAAE,eAAe,QAAqD,CAAC;IAErF,uDACK,OAAO,KACV,mBAAmB,qBAAA,EACnB,OAAO,SAAA,EACP,eAAe,iBAAA,IACf;AACJ,CAAC,CAAC;AAdW,QAAA,WAAW,eActB;AAEF,IAAM,mBAAmB,GAAG,UAC1B,YAAqB,EACrB,KAAoB;;IAEZ,IAAA,cAAc,GAA+B,KAAK,eAApC,EAAE,eAAe,GAAc,KAAK,gBAAnB,EAAE,OAAO,GAAK,KAAK,QAAV,CAAW;IAC3D,IAAM,YAAY,GAAG,MAAA,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,OAAO,mCAAI,EAAE,CAAC;IAC/C,IAAA,KAAwC,eAAK,CAAC,QAAQ,CAA0B,YAAY,CAAC,EAA5F,eAAe,QAAA,EAAE,kBAAkB,QAAyD,CAAC;IAEpG,IAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;IAEvD,IAAM,UAAU,GAAG,eAAK,CAAC,WAAW,CAClC,UAAC,CAAmB,EAAE,IAAY,EAAE,SAAkB;QACpD,IAAI,CAAC,YAAY,EAAE;YACjB,IAAM,UAAU,GAAG,KAAK,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;YAC7B,IAAM,cAAc,6BAAQ,UAAU,CAAE,CAAC;YACzC,kBAAkB,CAAC,cAAc,CAAC,CAAC;SACpC;QAED,IAAI,eAAe,EAAE;YACnB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;SACrC;IACH,CAAC,EACD,CAAC,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAC3D,CAAC;IAEF,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AAC7B,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"menuContext.d.ts","sourceRoot":"","sources":["../../src/context/menuContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;GAEG;AACH,oBAAY,gBAAgB,GAAG,SAAS,CAAC;AAEzC,eAAO,MAAM,WAAW,0BAMtB,CAAC;AAEH,eAAO,MAAM,YAAY,2BAAuB,CAAC;AACjD,eAAO,MAAM,cAAc,iBAAsC,CAAC"}
1
+ {"version":3,"file":"menuContext.d.ts","sourceRoot":"","sources":["../../src/context/menuContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;GAEG;AACH,oBAAY,gBAAgB,GAAG,SAAS,CAAC;AAEzC,eAAO,MAAM,WAAW,0BAUtB,CAAC;AAEH,eAAO,MAAM,YAAY,2BAAuB,CAAC;AACjD,eAAO,MAAM,cAAc,iBAAsC,CAAC"}
@@ -5,8 +5,12 @@ var tslib_1 = require("tslib");
5
5
  var React = (0, tslib_1.__importStar)(require("react"));
6
6
  exports.MenuContext = React.createContext({
7
7
  isControlled: false,
8
+ checked: {},
9
+ defaultChecked: {},
10
+ hasCheckmarks: false,
8
11
  isSubmenu: false,
9
12
  open: false,
13
+ onCheckedChange: function () { return false; },
10
14
  setOpen: function () { return false; },
11
15
  triggerRef: null,
12
16
  });
@@ -1 +1 @@
1
- {"version":3,"file":"menuContext.js","sourceRoot":"","sources":["../../src/context/menuContext.ts"],"names":[],"mappings":";;;;AAAA,wDAA+B;AAQlB,QAAA,WAAW,GAAG,KAAK,CAAC,aAAa,CAAmB;IAC/D,YAAY,EAAE,KAAK;IACnB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK;IACpB,UAAU,EAAE,IAAI;CACjB,CAAC,CAAC;AAEU,QAAA,YAAY,GAAG,mBAAW,CAAC,QAAQ,CAAC;AAC1C,IAAM,cAAc,GAAG,cAAM,OAAA,KAAK,CAAC,UAAU,CAAC,mBAAW,CAAC,EAA7B,CAA6B,CAAC;AAArD,QAAA,cAAc,kBAAuC"}
1
+ {"version":3,"file":"menuContext.js","sourceRoot":"","sources":["../../src/context/menuContext.ts"],"names":[],"mappings":";;;;AAAA,wDAA+B;AAQlB,QAAA,WAAW,GAAG,KAAK,CAAC,aAAa,CAAmB;IAC/D,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,EAAE;IACX,cAAc,EAAE,EAAE;IAClB,aAAa,EAAE,KAAK;IACpB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,KAAK;IACX,eAAe,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK;IAC5B,OAAO,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK;IACpB,UAAU,EAAE,IAAI;CACjB,CAAC,CAAC;AAEU,QAAA,YAAY,GAAG,mBAAW,CAAC,QAAQ,CAAC;AAC1C,IAAM,cAAc,GAAG,cAAM,OAAA,KAAK,CAAC,UAAU,CAAC,mBAAW,CAAC,EAA7B,CAA6B,CAAC;AAArD,QAAA,cAAc,kBAAuC"}
@@ -1 +1,10 @@
1
+ import * as React from 'react';
2
+ import type { MenuListState } from '../MenuList/MenuList.types';
3
+ /**
4
+ * Context shared between Menu and its child components
5
+ */
6
+ export declare type MenuListContextValue = MenuListState;
7
+ export declare const MenuListContext: React.Context<MenuListState>;
8
+ export declare const MenuListProvider: React.Provider<MenuListState>;
9
+ export declare const useMenuListContext: () => MenuListState;
1
10
  //# sourceMappingURL=menuListContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"menuListContext.d.ts","sourceRoot":"","sources":["../../src/context/menuListContext.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"menuListContext.d.ts","sourceRoot":"","sources":["../../src/context/menuListContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE;;GAEG;AACH,oBAAY,oBAAoB,GAAG,aAAa,CAAC;AAEjD,eAAO,MAAM,eAAe,8BAM1B,CAAC;AAEH,eAAO,MAAM,gBAAgB,+BAA2B,CAAC;AACzD,eAAO,MAAM,kBAAkB,qBAA0C,CAAC"}
@@ -1,2 +1,16 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useMenuListContext = exports.MenuListProvider = exports.MenuListContext = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var React = (0, tslib_1.__importStar)(require("react"));
6
+ exports.MenuListContext = React.createContext({
7
+ isCheckedControlled: false,
8
+ checked: {},
9
+ defaultChecked: {},
10
+ hasCheckmarks: false,
11
+ onCheckedChange: function () { return false; },
12
+ });
13
+ exports.MenuListProvider = exports.MenuListContext.Provider;
14
+ var useMenuListContext = function () { return React.useContext(exports.MenuListContext); };
15
+ exports.useMenuListContext = useMenuListContext;
2
16
  //# sourceMappingURL=menuListContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"menuListContext.js","sourceRoot":"","sources":["../../src/context/menuListContext.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"menuListContext.js","sourceRoot":"","sources":["../../src/context/menuListContext.ts"],"names":[],"mappings":";;;;AAAA,wDAA+B;AAQlB,QAAA,eAAe,GAAG,KAAK,CAAC,aAAa,CAAuB;IACvE,mBAAmB,EAAE,KAAK;IAC1B,OAAO,EAAE,EAAE;IACX,cAAc,EAAE,EAAE;IAClB,aAAa,EAAE,KAAK;IACpB,eAAe,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK;CAC7B,CAAC,CAAC;AAEU,QAAA,gBAAgB,GAAG,uBAAe,CAAC,QAAQ,CAAC;AAClD,IAAM,kBAAkB,GAAG,cAAM,OAAA,KAAK,CAAC,UAAU,CAAC,uBAAe,CAAC,EAAjC,CAAiC,CAAC;AAA7D,QAAA,kBAAkB,sBAA2C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui-react-native/menu",
3
- "version": "0.7.0",
3
+ "version": "0.8.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",
@@ -4,6 +4,7 @@ import { MenuItemProps, MenuItemState } from './MenuItem.types';
4
4
  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
+ import { useMenuListContext } from '../context/menuListContext';
7
8
 
8
9
  export const useMenuItem = (props: MenuItemProps): MenuItemState => {
9
10
  // attach the pressable state handlers
@@ -12,13 +13,13 @@ export const useMenuItem = (props: MenuItemProps): MenuItemState => {
12
13
  const pressable = useAsPressable({ ...rest, disabled, onPress: onClick });
13
14
  const onKeyProps = useKeyProps(onClick, ' ', 'Enter');
14
15
  const hasSubmenu = useMenuContext().isSubmenu;
15
- const hasCheckmarks = useMenuContext().hasCheckmarks;
16
+ const hasCheckmarks = useMenuListContext().hasCheckmarks;
16
17
 
17
18
  return {
18
19
  props: {
19
20
  ...pressable.props,
20
21
  accessible: true,
21
- accessibilityRole: 'button',
22
+ accessibilityRole: 'menuitem',
22
23
  onAccessibilityTap: props.onAccessibilityTap || props.onClick,
23
24
  accessibilityLabel: props.accessibilityLabel,
24
25
  accessibilityState: getAccessibilityState(disabled, accessibilityState),
@@ -23,6 +23,7 @@ export const stylingSettings: UseStylingOptions<MenuItemCheckboxProps, MenuItemC
23
23
  ),
24
24
  checkmark: buildProps(
25
25
  (tokens: MenuItemCheckboxTokens) => ({
26
+ opacity: tokens.checkmarkVisibility,
26
27
  color: tokens.color,
27
28
  height: tokens.checkmarkSize,
28
29
  width: tokens.checkmarkSize,
@@ -3,7 +3,7 @@ import { ColorValue, ViewProps } from 'react-native';
3
3
  import { XmlProps } from 'react-native-svg';
4
4
  import type { IViewProps } from '@fluentui-react-native/adapters';
5
5
  import { TextProps } from '@fluentui-react-native/experimental-text';
6
- import { IFocusable, InteractionEvent, IPressableHooks, IWithPressableOptions } from '@fluentui-react-native/interactive-hooks';
6
+ import { IFocusable, IPressableHooks, IWithPressableOptions } from '@fluentui-react-native/interactive-hooks';
7
7
  import { FontTokens, IBorderTokens, IColorTokens, LayoutTokens } from '@fluentui-react-native/tokens';
8
8
 
9
9
  export const menuItemCheckboxName = 'MenuItemCheckbox';
@@ -36,14 +36,12 @@ export interface MenuItemCheckboxProps extends Omit<IWithPressableOptions<ViewPr
36
36
  componentRef?: React.RefObject<IFocusable>;
37
37
 
38
38
  /**
39
- * A callback to call on button click event
39
+ * Identifier for the control
40
40
  */
41
- onClick?: (e: InteractionEvent) => void;
41
+ name: string;
42
42
  }
43
43
 
44
- export interface MenuItemCheckboxState extends IPressableHooks<MenuItemCheckboxProps & React.ComponentPropsWithRef<any>> {
45
- hasCheckmarks?: boolean;
46
- }
44
+ export interface MenuItemCheckboxState extends IPressableHooks<MenuItemCheckboxProps & React.ComponentPropsWithRef<any>> {}
47
45
 
48
46
  export interface MenuItemCheckboxSlotProps {
49
47
  root: React.PropsWithRef<IViewProps>;
@@ -1,40 +1,88 @@
1
1
  import * as React from 'react';
2
- import { AccessibilityState } from 'react-native';
2
+ import { AccessibilityActionEvent, AccessibilityState } from 'react-native';
3
3
  import { MenuItemCheckboxProps, MenuItemCheckboxState } from './MenuItemCheckbox.types';
4
4
  import { memoize } from '@fluentui-react-native/framework';
5
- import { useAsPressable, useKeyProps } from '@fluentui-react-native/interactive-hooks';
6
- import { useMenuContext } from '../context/menuContext';
5
+ import {
6
+ InteractionEvent,
7
+ useAsPressable,
8
+ useKeyProps,
9
+ useOnPressWithFocus,
10
+ useViewCommandFocus,
11
+ } from '@fluentui-react-native/interactive-hooks';
12
+ import { useMenuListContext } from '../context/menuListContext';
13
+
14
+ const defaultAccessibilityActions = [{ name: 'Toggle' }];
7
15
 
8
16
  export const useMenuItemCheckbox = (props: MenuItemCheckboxProps): MenuItemCheckboxState => {
9
17
  // attach the pressable state handlers
10
18
  const defaultComponentRef = React.useRef(null);
11
- const { onClick, accessibilityState, componentRef = defaultComponentRef, disabled, ...rest } = props;
12
- const pressable = useAsPressable({ ...rest, disabled, onPress: onClick });
13
- const onKeyProps = useKeyProps(onClick, ' ', 'Enter');
14
- const hasCheckmarks = useMenuContext().hasCheckmarks;
19
+ const {
20
+ accessibilityActions,
21
+ accessibilityState,
22
+ componentRef = defaultComponentRef,
23
+ disabled,
24
+ name,
25
+ onAccessibilityAction,
26
+ ...rest
27
+ } = props;
28
+ const context = useMenuListContext();
29
+ const checked = context.checked?.[name];
30
+ const onCheckedChange = context.onCheckedChange;
31
+
32
+ const toggleChecked = React.useCallback(
33
+ (e: InteractionEvent) => {
34
+ onCheckedChange(e, name, !checked);
35
+ },
36
+ [checked, name, onCheckedChange],
37
+ );
38
+ // Ensure focus is placed on checkbox after click
39
+ const toggleCheckedWithFocus = useOnPressWithFocus(componentRef, toggleChecked);
40
+
41
+ const pressable = useAsPressable({ onPress: toggleCheckedWithFocus, ...rest });
42
+ const buttonRef = useViewCommandFocus(componentRef);
43
+
44
+ const onKeyProps = useKeyProps(toggleChecked, ' ');
45
+ const accessibilityActionsProp = accessibilityActions
46
+ ? [...defaultAccessibilityActions, ...accessibilityActions]
47
+ : defaultAccessibilityActions;
48
+ const onAccessibilityActionProp = React.useCallback(
49
+ (event: AccessibilityActionEvent) => {
50
+ if (event.nativeEvent.actionName === 'Toggle') {
51
+ toggleChecked(event);
52
+ }
53
+ onAccessibilityAction && onAccessibilityAction(event);
54
+ },
55
+ [toggleChecked, onAccessibilityAction],
56
+ );
57
+
58
+ const state = {
59
+ ...pressable.state,
60
+ disabled: !!props.disabled,
61
+ checked: checked,
62
+ };
15
63
 
16
64
  return {
17
65
  props: {
18
66
  ...pressable.props,
19
67
  accessible: true,
20
- accessibilityRole: 'button',
21
- onAccessibilityTap: props.onAccessibilityTap || props.onClick,
68
+ accessibilityActions: accessibilityActionsProp,
22
69
  accessibilityLabel: props.accessibilityLabel,
23
- accessibilityState: getAccessibilityState(disabled, accessibilityState),
70
+ accessibilityRole: 'menuitem',
71
+ accessibilityState: getAccessibilityState(disabled, state.checked, accessibilityState),
24
72
  enableFocusRing: true,
25
73
  focusable: !disabled,
26
- ref: componentRef,
74
+ onAccessibilityAction: onAccessibilityActionProp,
75
+ ref: buttonRef,
27
76
  ...onKeyProps,
28
77
  },
29
- state: pressable.state,
30
- hasCheckmarks,
78
+ state: state,
31
79
  };
32
80
  };
33
81
 
34
82
  const getAccessibilityState = memoize(getAccessibilityStateWorker);
35
- function getAccessibilityStateWorker(disabled: boolean, accessibilityState?: AccessibilityState) {
83
+ function getAccessibilityStateWorker(disabled: boolean, checked: boolean, accessibilityState?: AccessibilityState) {
36
84
  if (accessibilityState) {
37
- return { disabled, ...accessibilityState };
85
+ return { disabled, checked, ...accessibilityState };
38
86
  }
39
- return { disabled };
87
+ return { disabled, checked };
40
88
  }
@@ -4,6 +4,9 @@ import { View } from 'react-native';
4
4
  import { compose, UseSlots, withSlots } from '@fluentui-react-native/framework';
5
5
  import { menuListName, MenuListProps, MenuListType } from './MenuList.types';
6
6
  import { stylingSettings } from './MenuList.styling';
7
+ import { MenuListProvider } from '../context/menuListContext';
8
+ import { useMenuList } from './useMenuList';
9
+ import { useMenuListContextValue } from './useMenuContextValue';
7
10
 
8
11
  export const MenuList = compose<MenuListType>({
9
12
  displayName: menuListName,
@@ -12,10 +15,16 @@ export const MenuList = compose<MenuListType>({
12
15
  root: View,
13
16
  },
14
17
  useRender: (userProps: MenuListProps, useSlots: UseSlots<MenuListType>) => {
15
- const Slots = useSlots(userProps);
18
+ const menuList = useMenuList(userProps);
19
+ const contextValue = useMenuListContextValue(menuList);
20
+ const Slots = useSlots(menuList);
16
21
 
17
22
  return (_final: MenuListProps, children: React.ReactNode) => {
18
- return <Slots.root>{children}</Slots.root>;
23
+ return (
24
+ <MenuListProvider value={contextValue}>
25
+ <Slots.root>{children}</Slots.root>
26
+ </MenuListProvider>
27
+ );
19
28
  };
20
29
  },
21
30
  });
@@ -1,4 +1,5 @@
1
1
  import type { IViewProps } from '@fluentui-react-native/adapters';
2
+ import { InteractionEvent } from '@fluentui-react-native/interactive-hooks';
2
3
  import { IBackgroundColorTokens, LayoutTokens } from '@fluentui-react-native/tokens';
3
4
 
4
5
  export const menuListName = 'MenuList';
@@ -6,7 +7,14 @@ export const menuListName = 'MenuList';
6
7
  export interface MenuListTokens extends LayoutTokens, IBackgroundColorTokens {}
7
8
 
8
9
  export interface MenuListProps extends Omit<IViewProps, 'onPress'> {
10
+ checked?: Record<string, boolean>;
11
+ defaultChecked?: Record<string, boolean>;
9
12
  hasCheckmarks?: boolean;
13
+ onCheckedChange?: (e: InteractionEvent, name: string, isChecked: boolean) => void;
14
+ }
15
+
16
+ export interface MenuListState extends MenuListProps {
17
+ isCheckedControlled: boolean;
10
18
  }
11
19
 
12
20
  export interface MenuListSlotProps {
@@ -0,0 +1,6 @@
1
+ import { MenuListContextValue } from '../context/menuListContext';
2
+ import { MenuListState } from './MenuList.types';
3
+
4
+ export const useMenuListContextValue = (state: MenuListState): MenuListContextValue => {
5
+ return { ...state };
6
+ };
@@ -0,0 +1,49 @@
1
+ import { InteractionEvent } from '@fluentui-react-native/interactive-hooks';
2
+ import React from 'react';
3
+ import { useMenuContext } from '../context/menuContext';
4
+ import { MenuListProps, MenuListState } from './MenuList.types';
5
+
6
+ export const useMenuList = (_props: MenuListProps): MenuListState => {
7
+ const context = useMenuContext();
8
+
9
+ // MenuList v2 needs to be able to be standalone, but this is not in scope for v1
10
+ // Assuming that checked information will come from parent Menu
11
+ const isCheckedControlled = typeof context.checked !== 'undefined';
12
+ const [checked, onCheckedChange] = useMenuCheckedState(isCheckedControlled, context);
13
+
14
+ return {
15
+ ...context,
16
+ isCheckedControlled,
17
+ checked,
18
+ onCheckedChange,
19
+ };
20
+ };
21
+
22
+ const useMenuCheckedState = (
23
+ isControlled: boolean,
24
+ props: MenuListProps,
25
+ ): [Record<string, boolean>, (e: InteractionEvent, name: string, isChecked: boolean) => void] => {
26
+ const { defaultChecked, onCheckedChange, checked } = props;
27
+ const initialState = defaultChecked ?? checked ?? {};
28
+ const [checkedInternal, setCheckedInternal] = React.useState<Record<string, boolean>>(initialState);
29
+
30
+ const state = isControlled ? checked : checkedInternal;
31
+
32
+ const setChecked = React.useCallback(
33
+ (e: InteractionEvent, name: string, isChecked: boolean) => {
34
+ if (!isControlled) {
35
+ const curChecked = state;
36
+ curChecked[name] = isChecked;
37
+ const updatedChecked = { ...curChecked };
38
+ setCheckedInternal(updatedChecked);
39
+ }
40
+
41
+ if (onCheckedChange) {
42
+ onCheckedChange(e, name, isChecked);
43
+ }
44
+ },
45
+ [isControlled, state, onCheckedChange, setCheckedInternal],
46
+ );
47
+
48
+ return [state, setChecked];
49
+ };
@@ -8,8 +8,12 @@ export type MenuContextValue = MenuState;
8
8
 
9
9
  export const MenuContext = React.createContext<MenuContextValue>({
10
10
  isControlled: false,
11
+ checked: {},
12
+ defaultChecked: {},
13
+ hasCheckmarks: false,
11
14
  isSubmenu: false,
12
15
  open: false,
16
+ onCheckedChange: () => false,
13
17
  setOpen: () => false,
14
18
  triggerRef: null,
15
19
  });
@@ -0,0 +1,18 @@
1
+ import * as React from 'react';
2
+ import type { MenuListState } from '../MenuList/MenuList.types';
3
+
4
+ /**
5
+ * Context shared between Menu and its child components
6
+ */
7
+ export type MenuListContextValue = MenuListState;
8
+
9
+ export const MenuListContext = React.createContext<MenuListContextValue>({
10
+ isCheckedControlled: false,
11
+ checked: {},
12
+ defaultChecked: {},
13
+ hasCheckmarks: false,
14
+ onCheckedChange: () => false,
15
+ });
16
+
17
+ export const MenuListProvider = MenuListContext.Provider;
18
+ export const useMenuListContext = () => React.useContext(MenuListContext);