@fluentui/react-menu-grid-preview 0.1.1 → 0.2.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 (86) hide show
  1. package/CHANGELOG.md +37 -2
  2. package/lib/components/MenuGrid/MenuGrid.js +1 -0
  3. package/lib/components/MenuGrid/MenuGrid.js.map +1 -1
  4. package/lib/components/MenuGrid/useMenuGrid.js +8 -4
  5. package/lib/components/MenuGrid/useMenuGrid.js.map +1 -1
  6. package/lib/components/MenuGrid/useMenuGridContextValues.js +1 -0
  7. package/lib/components/MenuGrid/useMenuGridContextValues.js.map +1 -1
  8. package/lib/components/MenuGrid/useMenuGridStyles.styles.js +2 -0
  9. package/lib/components/MenuGrid/useMenuGridStyles.styles.js.map +1 -1
  10. package/lib/components/MenuGrid/useMenuGridStyles.styles.raw.js +1 -0
  11. package/lib/components/MenuGrid/useMenuGridStyles.styles.raw.js.map +1 -1
  12. package/lib/components/MenuGridCell/MenuGridCell.js +1 -0
  13. package/lib/components/MenuGridCell/MenuGridCell.js.map +1 -1
  14. package/lib/components/MenuGridCell/useMenuGridCell.js +17 -3
  15. package/lib/components/MenuGridCell/useMenuGridCell.js.map +1 -1
  16. package/lib/components/MenuGridCell/useMenuGridCellStyles.styles.js +2 -0
  17. package/lib/components/MenuGridCell/useMenuGridCellStyles.styles.js.map +1 -1
  18. package/lib/components/MenuGridCell/useMenuGridCellStyles.styles.raw.js +1 -0
  19. package/lib/components/MenuGridCell/useMenuGridCellStyles.styles.raw.js.map +1 -1
  20. package/lib/components/MenuGridGroup/MenuGridGroup.js +1 -0
  21. package/lib/components/MenuGridGroup/MenuGridGroup.js.map +1 -1
  22. package/lib/components/MenuGridGroup/useMenuGridGroupContextValues.js +1 -0
  23. package/lib/components/MenuGridGroup/useMenuGridGroupContextValues.js.map +1 -1
  24. package/lib/components/MenuGridGroupHeader/MenuGridGroupHeader.js +1 -0
  25. package/lib/components/MenuGridGroupHeader/MenuGridGroupHeader.js.map +1 -1
  26. package/lib/components/MenuGridGroupHeader/useMenuGridGroupHeader.js +1 -0
  27. package/lib/components/MenuGridGroupHeader/useMenuGridGroupHeader.js.map +1 -1
  28. package/lib/components/MenuGridItem/MenuGridItem.js +1 -0
  29. package/lib/components/MenuGridItem/MenuGridItem.js.map +1 -1
  30. package/lib/components/MenuGridItem/useMenuGridItem.js +5 -2
  31. package/lib/components/MenuGridItem/useMenuGridItem.js.map +1 -1
  32. package/lib/components/MenuGridRow/MenuGridRow.js +1 -0
  33. package/lib/components/MenuGridRow/MenuGridRow.js.map +1 -1
  34. package/lib/components/MenuGridRow/useMenuGridRow.js +5 -2
  35. package/lib/components/MenuGridRow/useMenuGridRow.js.map +1 -1
  36. package/lib/contexts/menuGridContext.js +1 -0
  37. package/lib/contexts/menuGridContext.js.map +1 -1
  38. package/lib/contexts/menuGridGroupContext.js +1 -0
  39. package/lib/contexts/menuGridGroupContext.js.map +1 -1
  40. package/lib/utils/index.js +1 -0
  41. package/lib/utils/index.js.map +1 -0
  42. package/lib/utils/useValidateNesting.js +91 -0
  43. package/lib/utils/useValidateNesting.js.map +1 -0
  44. package/lib-commonjs/components/MenuGrid/MenuGrid.js +1 -0
  45. package/lib-commonjs/components/MenuGrid/MenuGrid.js.map +1 -1
  46. package/lib-commonjs/components/MenuGrid/useMenuGrid.js +7 -3
  47. package/lib-commonjs/components/MenuGrid/useMenuGrid.js.map +1 -1
  48. package/lib-commonjs/components/MenuGrid/useMenuGridContextValues.js +1 -0
  49. package/lib-commonjs/components/MenuGrid/useMenuGridContextValues.js.map +1 -1
  50. package/lib-commonjs/components/MenuGrid/useMenuGridStyles.styles.js +1 -0
  51. package/lib-commonjs/components/MenuGrid/useMenuGridStyles.styles.js.map +1 -1
  52. package/lib-commonjs/components/MenuGrid/useMenuGridStyles.styles.raw.js +1 -0
  53. package/lib-commonjs/components/MenuGrid/useMenuGridStyles.styles.raw.js.map +1 -1
  54. package/lib-commonjs/components/MenuGridCell/MenuGridCell.js +1 -0
  55. package/lib-commonjs/components/MenuGridCell/MenuGridCell.js.map +1 -1
  56. package/lib-commonjs/components/MenuGridCell/useMenuGridCell.js +16 -2
  57. package/lib-commonjs/components/MenuGridCell/useMenuGridCell.js.map +1 -1
  58. package/lib-commonjs/components/MenuGridCell/useMenuGridCellStyles.styles.js +1 -0
  59. package/lib-commonjs/components/MenuGridCell/useMenuGridCellStyles.styles.js.map +1 -1
  60. package/lib-commonjs/components/MenuGridCell/useMenuGridCellStyles.styles.raw.js +1 -0
  61. package/lib-commonjs/components/MenuGridCell/useMenuGridCellStyles.styles.raw.js.map +1 -1
  62. package/lib-commonjs/components/MenuGridGroup/MenuGridGroup.js +1 -0
  63. package/lib-commonjs/components/MenuGridGroup/MenuGridGroup.js.map +1 -1
  64. package/lib-commonjs/components/MenuGridGroup/useMenuGridGroupContextValues.js +1 -0
  65. package/lib-commonjs/components/MenuGridGroup/useMenuGridGroupContextValues.js.map +1 -1
  66. package/lib-commonjs/components/MenuGridGroupHeader/MenuGridGroupHeader.js +1 -0
  67. package/lib-commonjs/components/MenuGridGroupHeader/MenuGridGroupHeader.js.map +1 -1
  68. package/lib-commonjs/components/MenuGridGroupHeader/useMenuGridGroupHeader.js +1 -0
  69. package/lib-commonjs/components/MenuGridGroupHeader/useMenuGridGroupHeader.js.map +1 -1
  70. package/lib-commonjs/components/MenuGridItem/MenuGridItem.js +1 -0
  71. package/lib-commonjs/components/MenuGridItem/MenuGridItem.js.map +1 -1
  72. package/lib-commonjs/components/MenuGridItem/useMenuGridItem.js +4 -1
  73. package/lib-commonjs/components/MenuGridItem/useMenuGridItem.js.map +1 -1
  74. package/lib-commonjs/components/MenuGridRow/MenuGridRow.js +1 -0
  75. package/lib-commonjs/components/MenuGridRow/MenuGridRow.js.map +1 -1
  76. package/lib-commonjs/components/MenuGridRow/useMenuGridRow.js +4 -1
  77. package/lib-commonjs/components/MenuGridRow/useMenuGridRow.js.map +1 -1
  78. package/lib-commonjs/contexts/menuGridContext.js +1 -0
  79. package/lib-commonjs/contexts/menuGridContext.js.map +1 -1
  80. package/lib-commonjs/contexts/menuGridGroupContext.js +1 -0
  81. package/lib-commonjs/contexts/menuGridGroupContext.js.map +1 -1
  82. package/lib-commonjs/utils/index.js +11 -0
  83. package/lib-commonjs/utils/index.js.map +1 -0
  84. package/lib-commonjs/utils/useValidateNesting.js +102 -0
  85. package/lib-commonjs/utils/useValidateNesting.js.map +1 -0
  86. package/package.json +8 -7
@@ -0,0 +1,102 @@
1
+ 'use client';
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "useValidateNesting", {
7
+ enumerable: true,
8
+ get: function() {
9
+ return useValidateNesting;
10
+ }
11
+ });
12
+ const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
13
+ const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
14
+ const _reactsharedcontexts = require("@fluentui/react-shared-contexts");
15
+ const _reactmenu = require("@fluentui/react-menu");
16
+ const menuItemRoleToNameMapping = {
17
+ menuitem: 'MenuItem',
18
+ menuitemcheckbox: 'MenuItemCheckbox',
19
+ menuitemradio: 'MenuItemRadio'
20
+ };
21
+ const useValidateNesting = (componentName)=>{
22
+ 'use no memo';
23
+ const { targetDocument } = (0, _reactsharedcontexts.useFluent_unstable)();
24
+ const triggerRef = (0, _reactmenu.useMenuContext_unstable)((context)=>context.triggerRef);
25
+ const inline = (0, _reactmenu.useMenuContext_unstable)((context)=>context.inline);
26
+ const ref = _react.useRef(null);
27
+ if (process.env.NODE_ENV !== 'production') {
28
+ // This check should run only in development mode
29
+ // It's okay to disable the ESLint rule because we ar checking env variable statically (not at runtime)
30
+ // eslint-disable-next-line react-hooks/rules-of-hooks
31
+ _react.useEffect(()=>{
32
+ let ancestor = ref.current;
33
+ let ancestorRole;
34
+ do {
35
+ var _ancestor_parentElement;
36
+ ancestor = (_ancestor_parentElement = ancestor === null || ancestor === void 0 ? void 0 : ancestor.parentElement) !== null && _ancestor_parentElement !== void 0 ? _ancestor_parentElement : null;
37
+ ancestorRole = ancestor === null || ancestor === void 0 ? void 0 : ancestor.getAttribute('role');
38
+ if (ancestor === null || ancestor === void 0 ? void 0 : ancestor.classList.contains('fui-MenuGrid')) {
39
+ if (componentName === 'MenuGridCell') {
40
+ throw new Error('MenuGridCell is incorrectly nested within MenuGrid. You probably want to wrap it in a MenuGridRow.');
41
+ }
42
+ break;
43
+ }
44
+ if ((ancestor === null || ancestor === void 0 ? void 0 : ancestor.classList.contains('fui-MenuGridRow')) && componentName === 'MenuGridCell') {
45
+ break;
46
+ }
47
+ if ([
48
+ 'menuitem',
49
+ 'menuitemcheckbox',
50
+ 'menuitemradio'
51
+ ].includes(ancestorRole !== null && ancestorRole !== void 0 ? ancestorRole : '')) {
52
+ throw new Error(`${componentName} is incorrectly nested within ${menuItemRoleToNameMapping[ancestorRole]} or within an element with the "${ancestorRole}" role.`);
53
+ }
54
+ if (ancestorRole === 'menu') {
55
+ let message = '';
56
+ let breakAncestorTraversal = false;
57
+ switch(componentName){
58
+ case 'MenuGrid':
59
+ if (inline && getMenuOfTrigger(triggerRef.current, targetDocument) === ancestor) {
60
+ // Handle the case when MenuGrid is inline next to its menu trigger which is a submenu item of the parent menu
61
+ breakAncestorTraversal = true;
62
+ break;
63
+ }
64
+ message = 'MenuGrid is incorrectly nested within MenuList or within an element with the "menu" role.';
65
+ break;
66
+ case 'MenuGridCell':
67
+ message = 'MenuGridCell is incorrectly nested within MenuList or within an element with the "menu" role. You probably want to wrap it in a MenuGridRow.';
68
+ break;
69
+ case 'MenuGridItem':
70
+ message = 'MenuGridItem is incorrectly nested within MenuList or within an element with the "menu" role. You probably want to wrap it in a MenuGrid instead.';
71
+ break;
72
+ case 'MenuGridRow':
73
+ message = 'MenuGridRow is incorrectly nested within MenuList or within an element with the "menu" role. You probably want to wrap it in a MenuGrid instead.';
74
+ break;
75
+ }
76
+ if (breakAncestorTraversal) {
77
+ break;
78
+ }
79
+ throw new Error(message);
80
+ }
81
+ }while (ancestor && ancestor !== (targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.body))
82
+ }, [
83
+ componentName,
84
+ ref,
85
+ triggerRef,
86
+ inline,
87
+ targetDocument
88
+ ]);
89
+ }
90
+ return ref;
91
+ };
92
+ const getMenuOfTrigger = (trigger, targetDocument)=>{
93
+ let ancestor = trigger === null || trigger === void 0 ? void 0 : trigger.parentElement;
94
+ while(ancestor && ancestor !== (targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.body)){
95
+ if ((ancestor === null || ancestor === void 0 ? void 0 : ancestor.getAttribute('role')) === 'menu') {
96
+ return ancestor;
97
+ }
98
+ var _ancestor_parentElement;
99
+ ancestor = (_ancestor_parentElement = ancestor === null || ancestor === void 0 ? void 0 : ancestor.parentElement) !== null && _ancestor_parentElement !== void 0 ? _ancestor_parentElement : null;
100
+ }
101
+ return null;
102
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/useValidateNesting.ts"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\n\nimport type { MenuContextValue } from '@fluentui/react-menu';\nimport { useMenuContext_unstable } from '@fluentui/react-menu';\n\ntype NestingComponentName = 'MenuGrid' | 'MenuGridCell' | 'MenuGridItem' | 'MenuGridRow';\ntype MenuItemRoles = 'menuitem' | 'menuitemcheckbox' | 'menuitemradio';\n\nconst menuItemRoleToNameMapping = {\n menuitem: 'MenuItem',\n menuitemcheckbox: 'MenuItemCheckbox',\n menuitemradio: 'MenuItemRadio',\n};\n\nexport const useValidateNesting = (componentName: NestingComponentName): React.RefObject<HTMLElement | null> => {\n 'use no memo';\n\n const { targetDocument } = useFluent();\n const triggerRef = useMenuContext_unstable((context: MenuContextValue) => context.triggerRef);\n const inline = useMenuContext_unstable((context: MenuContextValue) => context.inline);\n const ref = React.useRef<HTMLElement | null>(null);\n\n if (process.env.NODE_ENV !== 'production') {\n // This check should run only in development mode\n // It's okay to disable the ESLint rule because we ar checking env variable statically (not at runtime)\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useEffect(() => {\n let ancestor = ref.current;\n let ancestorRole;\n\n do {\n ancestor = ancestor?.parentElement ?? null;\n ancestorRole = ancestor?.getAttribute('role');\n if (ancestor?.classList.contains('fui-MenuGrid')) {\n if (componentName === 'MenuGridCell') {\n throw new Error(\n 'MenuGridCell is incorrectly nested within MenuGrid. You probably want to wrap it in a MenuGridRow.',\n );\n }\n break;\n }\n if (ancestor?.classList.contains('fui-MenuGridRow') && componentName === 'MenuGridCell') {\n break;\n }\n if (['menuitem', 'menuitemcheckbox', 'menuitemradio'].includes(ancestorRole ?? '')) {\n throw new Error(\n `${componentName} is incorrectly nested within ${\n menuItemRoleToNameMapping[ancestorRole as MenuItemRoles]\n } or within an element with the \"${ancestorRole}\" role.`,\n );\n }\n if (ancestorRole === 'menu') {\n let message = '';\n let breakAncestorTraversal = false;\n switch (componentName) {\n case 'MenuGrid':\n if (inline && getMenuOfTrigger(triggerRef.current, targetDocument) === ancestor) {\n // Handle the case when MenuGrid is inline next to its menu trigger which is a submenu item of the parent menu\n breakAncestorTraversal = true;\n break;\n }\n message = 'MenuGrid is incorrectly nested within MenuList or within an element with the \"menu\" role.';\n break;\n case 'MenuGridCell':\n message =\n 'MenuGridCell is incorrectly nested within MenuList or within an element with the \"menu\" role. You probably want to wrap it in a MenuGridRow.';\n break;\n case 'MenuGridItem':\n message =\n 'MenuGridItem is incorrectly nested within MenuList or within an element with the \"menu\" role. You probably want to wrap it in a MenuGrid instead.';\n break;\n case 'MenuGridRow':\n message =\n 'MenuGridRow is incorrectly nested within MenuList or within an element with the \"menu\" role. You probably want to wrap it in a MenuGrid instead.';\n break;\n }\n if (breakAncestorTraversal) {\n break;\n }\n throw new Error(message);\n }\n } while (ancestor && ancestor !== targetDocument?.body);\n }, [componentName, ref, triggerRef, inline, targetDocument]);\n }\n return ref;\n};\n\nconst getMenuOfTrigger = (trigger: HTMLElement | null, targetDocument?: Document): HTMLElement | null => {\n let ancestor = trigger?.parentElement;\n while (ancestor && ancestor !== targetDocument?.body) {\n if (ancestor?.getAttribute('role') === 'menu') {\n return ancestor;\n }\n ancestor = ancestor?.parentElement ?? null;\n }\n return null;\n};\n"],"names":["React","useFluent_unstable","useFluent","useMenuContext_unstable","menuItemRoleToNameMapping","menuitem","menuitemcheckbox","menuitemradio","useValidateNesting","componentName","targetDocument","triggerRef","context","inline","ref","useRef","process","env","NODE_ENV","useEffect","ancestor","current","ancestorRole","parentElement","getAttribute","classList","contains","Error","includes","message","breakAncestorTraversal","getMenuOfTrigger","body","trigger"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui/react-menu-grid-preview",
3
- "version": "0.1.1",
3
+ "version": "0.2.1",
4
4
  "description": "New fluentui react package",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "module": "lib/index.js",
@@ -24,13 +24,14 @@
24
24
  "@fluentui/scripts-api-extractor": "*"
25
25
  },
26
26
  "dependencies": {
27
- "@fluentui/react-menu": "^9.19.6",
28
- "@fluentui/react-table": "^9.18.6",
29
- "@fluentui/react-tabster": "^9.26.5",
30
- "@fluentui/react-jsx-runtime": "^9.2.0",
31
- "@fluentui/react-shared-contexts": "^9.25.1",
27
+ "@fluentui/keyboard-keys": "^9.0.8",
28
+ "@fluentui/react-menu": "^9.20.1",
29
+ "@fluentui/react-table": "^9.19.1",
30
+ "@fluentui/react-tabster": "^9.26.7",
31
+ "@fluentui/react-jsx-runtime": "^9.2.2",
32
+ "@fluentui/react-shared-contexts": "^9.25.2",
32
33
  "@fluentui/react-theme": "^9.2.0",
33
- "@fluentui/react-utilities": "^9.24.1",
34
+ "@fluentui/react-utilities": "^9.25.1",
34
35
  "@griffel/react": "^1.5.22",
35
36
  "@swc/helpers": "^0.5.1"
36
37
  },