@fluentui-react-native/menu 0.14.7 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.json +46 -1
  2. package/CHANGELOG.md +26 -2
  3. package/lib/Menu/Menu.types.d.ts +9 -0
  4. package/lib/Menu/Menu.types.d.ts.map +1 -1
  5. package/lib/MenuItem/MenuItem.d.ts +2 -0
  6. package/lib/MenuItem/MenuItem.d.ts.map +1 -1
  7. package/lib/MenuItem/MenuItem.js +18 -6
  8. package/lib/MenuItem/MenuItem.js.map +1 -1
  9. package/lib/MenuItem/MenuItem.types.d.ts +15 -5
  10. package/lib/MenuItem/MenuItem.types.d.ts.map +1 -1
  11. package/lib/MenuItem/useMenuItem.d.ts.map +1 -1
  12. package/lib/MenuItem/useMenuItem.js +1 -1
  13. package/lib/MenuItem/useMenuItem.js.map +1 -1
  14. package/lib/MenuItemCheckbox/MenuItemCheckbox.d.ts +1 -0
  15. package/lib/MenuItemCheckbox/MenuItemCheckbox.d.ts.map +1 -1
  16. package/lib/MenuItemCheckbox/MenuItemCheckbox.js +7 -5
  17. package/lib/MenuItemCheckbox/MenuItemCheckbox.js.map +1 -1
  18. package/lib/MenuItemCheckbox/MenuItemCheckbox.types.d.ts +18 -5
  19. package/lib/MenuItemCheckbox/MenuItemCheckbox.types.d.ts.map +1 -1
  20. package/lib/MenuItemCheckbox/useMenuItemCheckbox.d.ts.map +1 -1
  21. package/lib/MenuItemCheckbox/useMenuItemCheckbox.js +2 -2
  22. package/lib/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
  23. package/lib/MenuList/MenuList.types.d.ts +17 -0
  24. package/lib/MenuList/MenuList.types.d.ts.map +1 -1
  25. package/lib/__tests__/Menu.test.js +18 -18
  26. package/lib/__tests__/Menu.test.js.map +1 -1
  27. package/lib-commonjs/Menu/Menu.types.d.ts +9 -0
  28. package/lib-commonjs/Menu/Menu.types.d.ts.map +1 -1
  29. package/lib-commonjs/MenuItem/MenuItem.d.ts +2 -0
  30. package/lib-commonjs/MenuItem/MenuItem.d.ts.map +1 -1
  31. package/lib-commonjs/MenuItem/MenuItem.js +17 -5
  32. package/lib-commonjs/MenuItem/MenuItem.js.map +1 -1
  33. package/lib-commonjs/MenuItem/MenuItem.types.d.ts +15 -5
  34. package/lib-commonjs/MenuItem/MenuItem.types.d.ts.map +1 -1
  35. package/lib-commonjs/MenuItem/useMenuItem.d.ts.map +1 -1
  36. package/lib-commonjs/MenuItem/useMenuItem.js +1 -1
  37. package/lib-commonjs/MenuItem/useMenuItem.js.map +1 -1
  38. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.d.ts +1 -0
  39. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.d.ts.map +1 -1
  40. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.js +6 -4
  41. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.js.map +1 -1
  42. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.types.d.ts +18 -5
  43. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.types.d.ts.map +1 -1
  44. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.d.ts.map +1 -1
  45. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.js +2 -2
  46. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
  47. package/lib-commonjs/MenuList/MenuList.types.d.ts +17 -0
  48. package/lib-commonjs/MenuList/MenuList.types.d.ts.map +1 -1
  49. package/lib-commonjs/__tests__/Menu.test.js +18 -18
  50. package/lib-commonjs/__tests__/Menu.test.js.map +1 -1
  51. package/package.json +2 -2
  52. package/src/Menu/Menu.types.ts +15 -0
  53. package/src/MenuItem/MenuItem.tsx +22 -5
  54. package/src/MenuItem/MenuItem.types.ts +18 -7
  55. package/src/MenuItem/useMenuItem.ts +0 -1
  56. package/src/MenuItemCheckbox/MenuItemCheckbox.tsx +8 -4
  57. package/src/MenuItemCheckbox/MenuItemCheckbox.types.ts +22 -7
  58. package/src/MenuItemCheckbox/useMenuItemCheckbox.ts +2 -1
  59. package/src/MenuList/MenuList.types.ts +20 -0
  60. package/src/__tests__/Menu.test.tsx +20 -18
  61. package/src/__tests__/__snapshots__/Menu.test.tsx.snap +0 -13
  62. package/SPEC.md +0 -344
@@ -9,11 +9,29 @@ import { FontTokens, IBorderTokens, IColorTokens, LayoutTokens } from '@fluentui
9
9
  export const menuItemName = 'MenuItem';
10
10
 
11
11
  export interface MenuItemTokens extends LayoutTokens, FontTokens, IBorderTokens, IColorTokens {
12
+ /**
13
+ * Height and width in pixels of the space that is reserved to align the item's text with other items which have checkmarks
14
+ */
12
15
  checkmarkSize?: number;
16
+
17
+ /**
18
+ * Amount of space in pixels around the indicator that shows that an item has a submenu
19
+ */
13
20
  submenuIndicatorPadding?: number;
21
+
22
+ /**
23
+ * Height and width in pixels of the indicator that shows that an item has a submenu
24
+ */
14
25
  submenuIndicatorSize?: number;
26
+
27
+ /**
28
+ * Space between parts of the item control in pixels
29
+ */
15
30
  gap?: number;
16
31
 
32
+ /**
33
+ * States of the item control
34
+ */
17
35
  disabled?: MenuItemTokens;
18
36
  focused?: MenuItemTokens;
19
37
  hovered?: MenuItemTokens;
@@ -21,13 +39,6 @@ export interface MenuItemTokens extends LayoutTokens, FontTokens, IBorderTokens,
21
39
  }
22
40
 
23
41
  export interface MenuItemProps extends Omit<IWithPressableOptions<ViewProps>, 'onPress'> {
24
- content: string;
25
-
26
- /**
27
- * Applies disabled styles to menu item but remains focusable
28
- */
29
- disabled?: boolean;
30
-
31
42
  /**
32
43
  * A RefObject to access the IButton interface. Use this to access the public methods and properties of the component.
33
44
  */
@@ -68,7 +68,6 @@ export const useMenuItem = (props: MenuItemProps): MenuItemState => {
68
68
  accessible: true,
69
69
  accessibilityRole: 'menuitem',
70
70
  onAccessibilityTap: props.onAccessibilityTap || onInvoke,
71
- accessibilityLabel: props.accessibilityLabel || props.content,
72
71
  accessibilityState: getAccessibilityState(disabled, accessibilityState),
73
72
  enableFocusRing: Platform.select({
74
73
  macos: false,
@@ -12,6 +12,8 @@ import {
12
12
  } from './MenuItemCheckbox.types';
13
13
  import { useMenuItemCheckbox } from './useMenuItemCheckbox';
14
14
  import { stylingSettings } from './MenuItemCheckbox.styling';
15
+ import { getAccessibilityLabel } from '../MenuItem/MenuItem';
16
+ import React from 'react';
15
17
 
16
18
  export const MenuItemCheckbox = compose<MenuItemCheckboxType>({
17
19
  displayName: menuItemCheckboxName,
@@ -33,17 +35,19 @@ export const menuItemFinalRender = (
33
35
  menuItem: MenuItemCheckboxState,
34
36
  Slots: Slots<MenuItemCheckboxSlotProps>,
35
37
  ): React.FunctionComponent<MenuItemCheckboxProps> => {
36
- return (final: MenuItemCheckboxProps) => {
37
- const mergedProps = mergeProps(menuItem.props, final);
38
+ return (final: MenuItemCheckboxProps, children: React.ReactNode) => {
39
+ const { accessibilityLabel, ...mergedProps } = mergeProps(menuItem.props, final);
38
40
  const checkmarkXml = `
39
41
  <svg>
40
42
  <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
43
  </svg>`;
42
44
 
45
+ const label = getAccessibilityLabel(accessibilityLabel, children[0]);
46
+
43
47
  return (
44
- <Slots.root {...mergedProps}>
48
+ <Slots.root {...mergedProps} accessibilityLabel={label}>
45
49
  <Slots.checkmark xml={checkmarkXml} />
46
- {mergedProps.content && <Slots.content>{mergedProps.content}</Slots.content>}
50
+ {children && <Slots.content>{children}</Slots.content>}
47
51
  </Slots.root>
48
52
  );
49
53
  };
@@ -9,12 +9,34 @@ import { FontTokens, IBorderTokens, IColorTokens, LayoutTokens } from '@fluentui
9
9
  export const menuItemCheckboxName = 'MenuItemCheckbox';
10
10
 
11
11
  export interface MenuItemCheckboxTokens extends LayoutTokens, FontTokens, IBorderTokens, IColorTokens {
12
+ /**
13
+ * Color of the checkmark icon
14
+ */
12
15
  checkmarkColor?: ColorValue;
16
+
17
+ /**
18
+ * Amount of space in pixels around the checkmark icon
19
+ */
13
20
  checkmarkPadding?: number;
21
+
22
+ /**
23
+ * Height and width in pixels of the checkmark icon
24
+ */
14
25
  checkmarkSize?: number;
26
+
27
+ /**
28
+ * Visibility of the checkmark icon from 0 to 1
29
+ */
15
30
  checkmarkVisibility?: number;
31
+
32
+ /**
33
+ * Space between parts of the item control in pixels
34
+ */
16
35
  gap?: number;
17
36
 
37
+ /**
38
+ * States of the item control
39
+ */
18
40
  checked?: MenuItemCheckboxTokens;
19
41
  disabled?: MenuItemCheckboxTokens;
20
42
  focused?: MenuItemCheckboxTokens;
@@ -23,13 +45,6 @@ export interface MenuItemCheckboxTokens extends LayoutTokens, FontTokens, IBorde
23
45
  }
24
46
 
25
47
  export interface MenuItemCheckboxProps extends Omit<IWithPressableOptions<ViewProps>, 'onPress'> {
26
- content: string;
27
-
28
- /**
29
- * Applies disabled styles to menu item but remains focusable
30
- */
31
- disabled?: boolean;
32
-
33
48
  /**
34
49
  * A RefObject to access the IButton interface. Use this to access the public methods and properties of the component.
35
50
  */
@@ -54,6 +54,7 @@ export const useMenuCheckboxInteraction = (
54
54
  const defaultComponentRef = React.useRef(null);
55
55
  const {
56
56
  accessibilityActions,
57
+ accessibilityLabel,
57
58
  accessibilityState,
58
59
  componentRef = defaultComponentRef,
59
60
  disabled,
@@ -97,7 +98,7 @@ export const useMenuCheckboxInteraction = (
97
98
  ...pressable.props,
98
99
  accessible: true,
99
100
  accessibilityActions: accessibilityActionsProp,
100
- accessibilityLabel: props.accessibilityLabel || props.content,
101
+ accessibilityLabel,
101
102
  accessibilityRole: 'menuitem',
102
103
  accessibilityState: getAccessibilityState(disabled, state.checked, accessibilityState),
103
104
  enableFocusRing: Platform.select({
@@ -6,13 +6,33 @@ import React from 'react';
6
6
  export const menuListName = 'MenuList';
7
7
 
8
8
  export interface MenuListTokens extends LayoutTokens, IBackgroundColorTokens {
9
+ /**
10
+ * Space between items in pixels
11
+ */
9
12
  gap?: number;
10
13
  }
11
14
 
12
15
  export interface MenuListProps extends Omit<IViewProps, 'onPress'> {
16
+ /**
17
+ * Array of all checked items
18
+ */
13
19
  checked?: string[];
20
+
21
+ /**
22
+ * Default items to be checked on mount
23
+ */
14
24
  defaultChecked?: string[];
25
+
26
+ /**
27
+ * States that menu items can contain selectable items and reserves space for item alignment
28
+ */
15
29
  hasCheckmarks?: boolean;
30
+
31
+ /**
32
+ * Callback when checked items change
33
+ *
34
+ * @param checked Array of all currently checked values
35
+ */
16
36
  onCheckedChange?: (e: InteractionEvent, checked: string[]) => void;
17
37
  }
18
38
 
@@ -22,7 +22,7 @@ describe('Checkbox component tests', () => {
22
22
  </MenuTrigger>
23
23
  <MenuPopover>
24
24
  <MenuList>
25
- <MenuItem content="Option 1" />
25
+ <MenuItem>Option 1</MenuItem>
26
26
  </MenuList>
27
27
  </MenuPopover>
28
28
  </Menu>,
@@ -40,7 +40,7 @@ describe('Checkbox component tests', () => {
40
40
  </MenuTrigger>
41
41
  <MenuPopover>
42
42
  <MenuList>
43
- <MenuItem content="Option 1" />
43
+ <MenuItem>Option 1</MenuItem>
44
44
  </MenuList>
45
45
  </MenuPopover>
46
46
  </Menu>,
@@ -58,8 +58,8 @@ describe('Checkbox component tests', () => {
58
58
  </MenuTrigger>
59
59
  <MenuPopover>
60
60
  <MenuList>
61
- <MenuItem content="Option 1" />
62
- <MenuItem disabled content="Option 2" />
61
+ <MenuItem>Option 1</MenuItem>
62
+ <MenuItem disabled>Option 2</MenuItem>
63
63
  </MenuList>
64
64
  </MenuPopover>
65
65
  </Menu>,
@@ -77,9 +77,11 @@ describe('Checkbox component tests', () => {
77
77
  </MenuTrigger>
78
78
  <MenuPopover>
79
79
  <MenuList>
80
- <MenuItemCheckbox content="Option 1" name="Option 1" />
80
+ <MenuItemCheckbox name="Option 1">Option 1</MenuItemCheckbox>
81
81
  <MenuDivider />
82
- <MenuItemCheckbox disabled content="Option 2" name="Option 2" />
82
+ <MenuItemCheckbox disabled name="Option 2">
83
+ Option 2
84
+ </MenuItemCheckbox>
83
85
  </MenuList>
84
86
  </MenuPopover>
85
87
  </Menu>,
@@ -97,8 +99,8 @@ describe('Checkbox component tests', () => {
97
99
  </MenuTrigger>
98
100
  <MenuPopover>
99
101
  <MenuList>
100
- <MenuItemRadio content="Option 1" name="Option 1" />
101
- <MenuItemRadio content="Option 2" name="Option 2" />
102
+ <MenuItemRadio name="Option 1">Option 1</MenuItemRadio>
103
+ <MenuItemRadio name="Option 2">Option 2</MenuItemRadio>
102
104
  </MenuList>
103
105
  </MenuPopover>
104
106
  </Menu>,
@@ -116,9 +118,9 @@ describe('Checkbox component tests', () => {
116
118
  </MenuTrigger>
117
119
  <MenuPopover>
118
120
  <MenuList>
119
- <MenuItemCheckbox content="Option 1" name="Option 1" />
121
+ <MenuItemCheckbox name="Option 1">Option 1</MenuItemCheckbox>
120
122
  <MenuDivider />
121
- <MenuItemCheckbox content="Option 2" name="Option 2" />
123
+ <MenuItemCheckbox name="Option 2">Option 2</MenuItemCheckbox>
122
124
  </MenuList>
123
125
  </MenuPopover>
124
126
  </Menu>,
@@ -136,9 +138,9 @@ describe('Checkbox component tests', () => {
136
138
  </MenuTrigger>
137
139
  <MenuPopover>
138
140
  <MenuList>
139
- <MenuItemCheckbox content="Option 1" name="Option 1" />
141
+ <MenuItemCheckbox name="Option 1">Option 1</MenuItemCheckbox>
140
142
  <MenuDivider />
141
- <MenuItemCheckbox content="Option 2" name="Option 2" />
143
+ <MenuItemCheckbox name="Option 2">Option 2</MenuItemCheckbox>
142
144
  </MenuList>
143
145
  </MenuPopover>
144
146
  </Menu>,
@@ -156,14 +158,14 @@ describe('Checkbox component tests', () => {
156
158
  </MenuTrigger>
157
159
  <MenuPopover>
158
160
  <MenuList>
159
- <MenuItem content="Option 1" />
161
+ <MenuItem>Option 1</MenuItem>
160
162
  <Menu>
161
163
  <MenuTrigger>
162
- <MenuItem content="Option 2" />
164
+ <MenuItem>Option 2</MenuItem>
163
165
  </MenuTrigger>
164
166
  <MenuPopover>
165
167
  <MenuList>
166
- <MenuItem content="Option 1" />
168
+ <MenuItem>Option 1</MenuItem>
167
169
  </MenuList>
168
170
  </MenuPopover>
169
171
  </Menu>
@@ -186,7 +188,7 @@ describe('Menu rerender tests', () => {
186
188
  </MenuTrigger>
187
189
  <MenuPopover>
188
190
  <MenuList>
189
- <MenuItem content="Option 1" />
191
+ <MenuItem>Option 1</MenuItem>
190
192
  </MenuList>
191
193
  </MenuPopover>
192
194
  </Menu>
@@ -205,7 +207,7 @@ describe('Menu rerender tests', () => {
205
207
  </MenuTrigger>
206
208
  <MenuPopover>
207
209
  <MenuList>
208
- <MenuItem content="Option 1" />
210
+ <MenuItem>Option 1</MenuItem>
209
211
  </MenuList>
210
212
  </MenuPopover>
211
213
  </Menu>
@@ -224,7 +226,7 @@ describe('Menu rerender tests', () => {
224
226
  </MenuTrigger>
225
227
  <MenuPopover>
226
228
  <MenuList>
227
- <MenuItem accessibilityActions={action} content="Option 1" />
229
+ <MenuItem accessibilityActions={action}>Option 1</MenuItem>
228
230
  </MenuList>
229
231
  </MenuPopover>
230
232
  </Menu>
@@ -178,7 +178,6 @@ Array [
178
178
  }
179
179
  }
180
180
  accessible={true}
181
- content="Option 1"
182
181
  enableFocusRing={true}
183
182
  focusable={true}
184
183
  onAccessibilityTap={[Function]}
@@ -232,7 +231,6 @@ Array [
232
231
  }
233
232
  }
234
233
  accessible={true}
235
- content="Option 2"
236
234
  disabled={true}
237
235
  enableFocusRing={true}
238
236
  focusable={true}
@@ -400,7 +398,6 @@ Array [
400
398
  }
401
399
  }
402
400
  accessible={true}
403
- content="Option 1"
404
401
  enableFocusRing={true}
405
402
  focusable={true}
406
403
  onAccessibilityTap={[Function]}
@@ -574,7 +571,6 @@ Array [
574
571
  }
575
572
  }
576
573
  accessible={true}
577
- content="Option 1"
578
574
  enableFocusRing={true}
579
575
  focusable={true}
580
576
  onAccessibilityAction={[Function]}
@@ -700,7 +696,6 @@ Array [
700
696
  }
701
697
  }
702
698
  accessible={true}
703
- content="Option 2"
704
699
  disabled={true}
705
700
  enableFocusRing={true}
706
701
  focusable={true}
@@ -928,7 +923,6 @@ Array [
928
923
  }
929
924
  }
930
925
  accessible={true}
931
- content="Option 1"
932
926
  enableFocusRing={true}
933
927
  focusable={true}
934
928
  onAccessibilityAction={[Function]}
@@ -1054,7 +1048,6 @@ Array [
1054
1048
  }
1055
1049
  }
1056
1050
  accessible={true}
1057
- content="Option 2"
1058
1051
  enableFocusRing={true}
1059
1052
  focusable={true}
1060
1053
  onAccessibilityAction={[Function]}
@@ -1281,7 +1274,6 @@ Array [
1281
1274
  }
1282
1275
  }
1283
1276
  accessible={true}
1284
- content="Option 1"
1285
1277
  enableFocusRing={true}
1286
1278
  focusable={true}
1287
1279
  onAccessibilityAction={[Function]}
@@ -1407,7 +1399,6 @@ Array [
1407
1399
  }
1408
1400
  }
1409
1401
  accessible={true}
1410
- content="Option 2"
1411
1402
  enableFocusRing={true}
1412
1403
  focusable={true}
1413
1404
  onAccessibilityAction={[Function]}
@@ -1634,7 +1625,6 @@ Array [
1634
1625
  }
1635
1626
  }
1636
1627
  accessible={true}
1637
- content="Option 1"
1638
1628
  enableFocusRing={true}
1639
1629
  focusable={true}
1640
1630
  onAccessibilityAction={[Function]}
@@ -1748,7 +1738,6 @@ Array [
1748
1738
  }
1749
1739
  }
1750
1740
  accessible={true}
1751
- content="Option 2"
1752
1741
  enableFocusRing={true}
1753
1742
  focusable={true}
1754
1743
  onAccessibilityAction={[Function]}
@@ -1967,7 +1956,6 @@ Array [
1967
1956
  }
1968
1957
  }
1969
1958
  accessible={true}
1970
- content="Option 1"
1971
1959
  enableFocusRing={true}
1972
1960
  focusable={true}
1973
1961
  onAccessibilityTap={[Function]}
@@ -2023,7 +2011,6 @@ Array [
2023
2011
  }
2024
2012
  }
2025
2013
  accessible={true}
2026
- content="Option 2"
2027
2014
  enableFocusRing={true}
2028
2015
  focusable={true}
2029
2016
  onAccessibilityAction={[Function]}