@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.
- package/CHANGELOG.json +16 -1
- package/CHANGELOG.md +10 -2
- package/lib/MenuItem/useMenuItem.d.ts.map +1 -1
- package/lib/MenuItem/useMenuItem.js +3 -2
- package/lib/MenuItem/useMenuItem.js.map +1 -1
- package/lib/MenuItemCheckbox/MenuItemCheckbox.styling.d.ts.map +1 -1
- package/lib/MenuItemCheckbox/MenuItemCheckbox.styling.js +1 -0
- package/lib/MenuItemCheckbox/MenuItemCheckbox.styling.js.map +1 -1
- package/lib/MenuItemCheckbox/MenuItemCheckbox.types.d.ts +3 -4
- package/lib/MenuItemCheckbox/MenuItemCheckbox.types.d.ts.map +1 -1
- package/lib/MenuItemCheckbox/useMenuItemCheckbox.d.ts.map +1 -1
- package/lib/MenuItemCheckbox/useMenuItemCheckbox.js +31 -13
- package/lib/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
- package/lib/MenuList/MenuList.d.ts.map +1 -1
- package/lib/MenuList/MenuList.js +8 -2
- package/lib/MenuList/MenuList.js.map +1 -1
- package/lib/MenuList/MenuList.types.d.ts +7 -0
- package/lib/MenuList/MenuList.types.d.ts.map +1 -1
- package/lib/MenuList/MenuList.types.js.map +1 -1
- package/lib/MenuList/useMenuContextValue.d.ts +4 -0
- package/lib/MenuList/useMenuContextValue.d.ts.map +1 -0
- package/lib/MenuList/useMenuContextValue.js +5 -0
- package/lib/MenuList/useMenuContextValue.js.map +1 -0
- package/lib/MenuList/useMenuList.d.ts +3 -0
- package/lib/MenuList/useMenuList.d.ts.map +1 -0
- package/lib/MenuList/useMenuList.js +31 -0
- package/lib/MenuList/useMenuList.js.map +1 -0
- package/lib/context/menuContext.d.ts.map +1 -1
- package/lib/context/menuContext.js +4 -0
- package/lib/context/menuContext.js.map +1 -1
- package/lib/context/menuListContext.d.ts +9 -0
- package/lib/context/menuListContext.d.ts.map +1 -1
- package/lib/context/menuListContext.js +10 -1
- package/lib/context/menuListContext.js.map +1 -1
- package/lib-commonjs/MenuItem/useMenuItem.d.ts.map +1 -1
- package/lib-commonjs/MenuItem/useMenuItem.js +3 -2
- package/lib-commonjs/MenuItem/useMenuItem.js.map +1 -1
- package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.styling.d.ts.map +1 -1
- package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.styling.js +1 -0
- package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.styling.js.map +1 -1
- package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.types.d.ts +3 -4
- package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.types.d.ts.map +1 -1
- package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.d.ts.map +1 -1
- package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.js +29 -11
- package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
- package/lib-commonjs/MenuList/MenuList.d.ts.map +1 -1
- package/lib-commonjs/MenuList/MenuList.js +8 -2
- package/lib-commonjs/MenuList/MenuList.js.map +1 -1
- package/lib-commonjs/MenuList/MenuList.types.d.ts +7 -0
- package/lib-commonjs/MenuList/MenuList.types.d.ts.map +1 -1
- package/lib-commonjs/MenuList/MenuList.types.js.map +1 -1
- package/lib-commonjs/MenuList/useMenuContextValue.d.ts +4 -0
- package/lib-commonjs/MenuList/useMenuContextValue.d.ts.map +1 -0
- package/lib-commonjs/MenuList/useMenuContextValue.js +9 -0
- package/lib-commonjs/MenuList/useMenuContextValue.js.map +1 -0
- package/lib-commonjs/MenuList/useMenuList.d.ts +3 -0
- package/lib-commonjs/MenuList/useMenuList.d.ts.map +1 -0
- package/lib-commonjs/MenuList/useMenuList.js +35 -0
- package/lib-commonjs/MenuList/useMenuList.js.map +1 -0
- package/lib-commonjs/context/menuContext.d.ts.map +1 -1
- package/lib-commonjs/context/menuContext.js +4 -0
- package/lib-commonjs/context/menuContext.js.map +1 -1
- package/lib-commonjs/context/menuListContext.d.ts +9 -0
- package/lib-commonjs/context/menuListContext.d.ts.map +1 -1
- package/lib-commonjs/context/menuListContext.js +14 -0
- package/lib-commonjs/context/menuListContext.js.map +1 -1
- package/package.json +1 -1
- package/src/MenuItem/useMenuItem.ts +3 -2
- package/src/MenuItemCheckbox/MenuItemCheckbox.styling.ts +1 -0
- package/src/MenuItemCheckbox/MenuItemCheckbox.types.ts +4 -6
- package/src/MenuItemCheckbox/useMenuItemCheckbox.ts +64 -16
- package/src/MenuList/MenuList.tsx +11 -2
- package/src/MenuList/MenuList.types.ts +8 -0
- package/src/MenuList/useMenuContextValue.ts +6 -0
- package/src/MenuList/useMenuList.ts +49 -0
- package/src/context/menuContext.ts +4 -0
- 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,
|
|
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;
|
|
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
|
|
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)(
|
|
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;
|
|
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;
|
|
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":";;;
|
|
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 @@
|
|
|
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 @@
|
|
|
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,
|
|
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
|
@@ -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 =
|
|
16
|
+
const hasCheckmarks = useMenuListContext().hasCheckmarks;
|
|
16
17
|
|
|
17
18
|
return {
|
|
18
19
|
props: {
|
|
19
20
|
...pressable.props,
|
|
20
21
|
accessible: true,
|
|
21
|
-
accessibilityRole: '
|
|
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,
|
|
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
|
-
*
|
|
39
|
+
* Identifier for the control
|
|
40
40
|
*/
|
|
41
|
-
|
|
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 {
|
|
6
|
-
|
|
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 {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
21
|
-
onAccessibilityTap: props.onAccessibilityTap || props.onClick,
|
|
68
|
+
accessibilityActions: accessibilityActionsProp,
|
|
22
69
|
accessibilityLabel: props.accessibilityLabel,
|
|
23
|
-
|
|
70
|
+
accessibilityRole: 'menuitem',
|
|
71
|
+
accessibilityState: getAccessibilityState(disabled, state.checked, accessibilityState),
|
|
24
72
|
enableFocusRing: true,
|
|
25
73
|
focusable: !disabled,
|
|
26
|
-
|
|
74
|
+
onAccessibilityAction: onAccessibilityActionProp,
|
|
75
|
+
ref: buttonRef,
|
|
27
76
|
...onKeyProps,
|
|
28
77
|
},
|
|
29
|
-
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
|
|
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
|
|
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,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);
|