@commercetools-uikit/dropdown-menu 19.11.0 → 19.12.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/README.md +1 -4
- package/dist/commercetools-uikit-dropdown-menu.cjs.dev.js +12 -21
- package/dist/commercetools-uikit-dropdown-menu.cjs.prod.js +12 -21
- package/dist/commercetools-uikit-dropdown-menu.esm.js +12 -20
- package/dist/declarations/src/menu/dropdown-menu-menu.d.ts +1 -1
- package/package.json +9 -9
package/README.md
CHANGED
|
@@ -11,10 +11,7 @@ It allows to use any component as the element used to trigger the floating panel
|
|
|
11
11
|
|
|
12
12
|
The panel can be customized to render whatever is needed. However, as a common use case would be to render a list of elements and select one of them, this component provides some helpers to easily implement such use case.
|
|
13
13
|
|
|
14
|
-
Something to bear in mind
|
|
15
|
-
|
|
16
|
-
- when the panel is open, the document scroll is blocked
|
|
17
|
-
- if there is limited screen estate, the `menuPosition` may be adjusted to ensure the menu is displayed properly
|
|
14
|
+
Something to bear in mind is that, when the panel is open, the document scroll is blocked.
|
|
18
15
|
|
|
19
16
|
## Installation
|
|
20
17
|
|
|
@@ -18,7 +18,6 @@ var react = require('react');
|
|
|
18
18
|
var utils = require('@commercetools-uikit/utils');
|
|
19
19
|
var hooks = require('@commercetools-uikit/hooks');
|
|
20
20
|
var jsxRuntime = require('@emotion/react/jsx-runtime');
|
|
21
|
-
var _concatInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/concat');
|
|
22
21
|
var _setTimeout = require('@babel/runtime-corejs3/core-js-stable/set-timeout');
|
|
23
22
|
var react$1 = require('@emotion/react');
|
|
24
23
|
var designSystem = require('@commercetools-uikit/design-system');
|
|
@@ -38,7 +37,6 @@ var _Object$defineProperties__default = /*#__PURE__*/_interopDefault(_Object$def
|
|
|
38
37
|
var _Object$defineProperty__default = /*#__PURE__*/_interopDefault(_Object$defineProperty);
|
|
39
38
|
var _styled__default = /*#__PURE__*/_interopDefault(_styled);
|
|
40
39
|
var _pt__default = /*#__PURE__*/_interopDefault(_pt);
|
|
41
|
-
var _concatInstanceProperty__default = /*#__PURE__*/_interopDefault(_concatInstanceProperty);
|
|
42
40
|
var _setTimeout__default = /*#__PURE__*/_interopDefault(_setTimeout);
|
|
43
41
|
var Constraints__default = /*#__PURE__*/_interopDefault(Constraints);
|
|
44
42
|
var SpacingsStack__default = /*#__PURE__*/_interopDefault(SpacingsStack);
|
|
@@ -70,7 +68,7 @@ DropDownTrigger.displayName = 'DropDownTrigger';
|
|
|
70
68
|
var DropdownTrigger = DropDownTrigger;
|
|
71
69
|
|
|
72
70
|
function ownKeys$2(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
73
|
-
function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var
|
|
71
|
+
function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var _context2, _context3; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context2 = ownKeys$2(Object(t), !0)).call(_context2, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context3 = ownKeys$2(Object(t))).call(_context3, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
|
|
74
72
|
const boxShadowBottomSize = '5px';
|
|
75
73
|
const outerMargin = designSystem.designTokens.spacing20;
|
|
76
74
|
function getDropdownMenuBaseStyles(params) {
|
|
@@ -91,10 +89,9 @@ function DropdownBaseMenu(props) {
|
|
|
91
89
|
// By default, the menu is not exceeding the viewport, this can change though
|
|
92
90
|
let menuIsExceedingViewport = false;
|
|
93
91
|
if (menuDOMRect.width >= document.body.scrollWidth) {
|
|
94
|
-
var _context;
|
|
95
92
|
// If the menu width is greater than the body width, we need to set the width of the menu to the body width
|
|
96
93
|
// to prevent the menu from overflowing, this happens usually when the horizontalConstraint is set to 'auto'
|
|
97
|
-
menuEl.style.width =
|
|
94
|
+
menuEl.style.width = `calc(${document.body.scrollWidth}px - 2 * ${outerMargin})`;
|
|
98
95
|
menuIsExceedingViewport = true;
|
|
99
96
|
}
|
|
100
97
|
|
|
@@ -133,40 +130,36 @@ function DropdownBaseMenu(props) {
|
|
|
133
130
|
// the trigger
|
|
134
131
|
const scrollWidthDiff = (document.body.scrollWidth - scrollWidthBefore) * 0.5;
|
|
135
132
|
if (menuIsExceedingViewport) {
|
|
136
|
-
|
|
137
|
-
menuEl.style.left = _concatInstanceProperty__default["default"](_context2 = "calc( ".concat(outerMargin, " + ")).call(_context2, scrollWidthDiff, "px)");
|
|
133
|
+
menuEl.style.left = `calc( ${outerMargin} + ${scrollWidthDiff}px)`;
|
|
138
134
|
} else if (menuXPosition === 'left') {
|
|
139
|
-
menuEl.style.left =
|
|
135
|
+
menuEl.style.left = `${triggerDOMRect.left + scrollWidthDiff}px`;
|
|
140
136
|
menuEl.style.removeProperty('right');
|
|
141
137
|
} else {
|
|
142
|
-
menuEl.style.right =
|
|
138
|
+
menuEl.style.right = `${window.innerWidth - triggerDOMRect.right - scrollWidthDiff}px`;
|
|
143
139
|
menuEl.style.removeProperty('left');
|
|
144
140
|
}
|
|
145
141
|
if (menuYPosition === 'below') {
|
|
146
|
-
|
|
147
|
-
menuEl.style.top = _concatInstanceProperty__default["default"](_context3 = "calc(".concat(triggerDOMRect.top + triggerDOMRect.height, "px + ")).call(_context3, outerMargin, ")");
|
|
142
|
+
menuEl.style.top = `calc(${triggerDOMRect.top + triggerDOMRect.height}px + ${outerMargin})`;
|
|
148
143
|
} else {
|
|
149
|
-
var _context4;
|
|
150
144
|
// Need to re-request getBoundingClientRect() because the menu height
|
|
151
145
|
// might have changed when the dropdown is in 'auto' mode;
|
|
152
146
|
let desiredMenuHeight = menuMaxHeight || menuEl.getBoundingClientRect().height;
|
|
153
|
-
menuEl.style.top =
|
|
147
|
+
menuEl.style.top = `calc(${triggerDOMRect.top - desiredMenuHeight}px - ${outerMargin})`;
|
|
154
148
|
}
|
|
155
149
|
if (menuMaxHeight) {
|
|
156
150
|
// Apply the manual max-width
|
|
157
151
|
menuEl.style.maxHeight = menuMaxHeight + 'px';
|
|
158
152
|
} else {
|
|
159
|
-
var _context5, _context6, _context7, _context8;
|
|
160
153
|
// Make sure max-height does not exceed the available top- or bottom-space
|
|
161
|
-
menuEl.style.maxHeight = menuYPosition === 'below' ?
|
|
154
|
+
menuEl.style.maxHeight = menuYPosition === 'below' ? `calc(${window.innerHeight - triggerDOMRect.bottom}px - ${outerMargin} - ${boxShadowBottomSize})` : `calc(${triggerDOMRect.top}px - ${outerMargin} - ${boxShadowBottomSize})`;
|
|
162
155
|
}
|
|
163
156
|
|
|
164
157
|
// All positioning operations done, make menu visible again
|
|
165
158
|
menuEl.style.visibility = 'visible';
|
|
166
159
|
}, 0);
|
|
167
160
|
return () => {
|
|
168
|
-
var
|
|
169
|
-
_forEachInstanceProperty__default["default"](
|
|
161
|
+
var _context;
|
|
162
|
+
_forEachInstanceProperty__default["default"](_context = ['top', 'left', 'right', 'bottom', 'width', 'height', 'maxHeight', 'visibility']).call(_context, prop => {
|
|
170
163
|
menuEl.style.removeProperty(prop);
|
|
171
164
|
});
|
|
172
165
|
};
|
|
@@ -244,9 +237,8 @@ function DropdownListMenuItem(props) {
|
|
|
244
237
|
return jsxRuntime.jsx(AccessibleButton__default["default"], _objectSpread$1(_objectSpread$1({
|
|
245
238
|
label: props.children,
|
|
246
239
|
onClick: () => {
|
|
247
|
-
var _props$onClick;
|
|
248
240
|
toggle();
|
|
249
|
-
|
|
241
|
+
props.onClick?.();
|
|
250
242
|
},
|
|
251
243
|
isDisabled: props.isDisabled,
|
|
252
244
|
css: getDropdownListMenuItemStyles(props)
|
|
@@ -327,9 +319,8 @@ function DropdownMenu(props) {
|
|
|
327
319
|
|
|
328
320
|
// Close the dropdown when clicking outside of it
|
|
329
321
|
const handleGlobalClick = react.useCallback(event => {
|
|
330
|
-
var _triggerElement$paren;
|
|
331
322
|
const triggerElement = triggerRef.current;
|
|
332
|
-
if (isOpen && triggerElement && event.target !== triggerElement && window.document.contains(event.target) && !
|
|
323
|
+
if (isOpen && triggerElement && event.target !== triggerElement && window.document.contains(event.target) && !triggerElement.parentElement?.contains(event.target)) {
|
|
333
324
|
toggle(false);
|
|
334
325
|
}
|
|
335
326
|
}, [triggerRef, toggle, isOpen]);
|
|
@@ -18,7 +18,6 @@ var react = require('react');
|
|
|
18
18
|
var utils = require('@commercetools-uikit/utils');
|
|
19
19
|
var hooks = require('@commercetools-uikit/hooks');
|
|
20
20
|
var jsxRuntime = require('@emotion/react/jsx-runtime');
|
|
21
|
-
var _concatInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/concat');
|
|
22
21
|
var _setTimeout = require('@babel/runtime-corejs3/core-js-stable/set-timeout');
|
|
23
22
|
var react$1 = require('@emotion/react');
|
|
24
23
|
var designSystem = require('@commercetools-uikit/design-system');
|
|
@@ -37,7 +36,6 @@ var _Object$getOwnPropertyDescriptors__default = /*#__PURE__*/_interopDefault(_O
|
|
|
37
36
|
var _Object$defineProperties__default = /*#__PURE__*/_interopDefault(_Object$defineProperties);
|
|
38
37
|
var _Object$defineProperty__default = /*#__PURE__*/_interopDefault(_Object$defineProperty);
|
|
39
38
|
var _styled__default = /*#__PURE__*/_interopDefault(_styled);
|
|
40
|
-
var _concatInstanceProperty__default = /*#__PURE__*/_interopDefault(_concatInstanceProperty);
|
|
41
39
|
var _setTimeout__default = /*#__PURE__*/_interopDefault(_setTimeout);
|
|
42
40
|
var Constraints__default = /*#__PURE__*/_interopDefault(Constraints);
|
|
43
41
|
var SpacingsStack__default = /*#__PURE__*/_interopDefault(SpacingsStack);
|
|
@@ -69,7 +67,7 @@ DropDownTrigger.displayName = 'DropDownTrigger';
|
|
|
69
67
|
var DropdownTrigger = DropDownTrigger;
|
|
70
68
|
|
|
71
69
|
function ownKeys$2(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
72
|
-
function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var
|
|
70
|
+
function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var _context2, _context3; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context2 = ownKeys$2(Object(t), !0)).call(_context2, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context3 = ownKeys$2(Object(t))).call(_context3, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
|
|
73
71
|
const boxShadowBottomSize = '5px';
|
|
74
72
|
const outerMargin = designSystem.designTokens.spacing20;
|
|
75
73
|
function getDropdownMenuBaseStyles(params) {
|
|
@@ -90,10 +88,9 @@ function DropdownBaseMenu(props) {
|
|
|
90
88
|
// By default, the menu is not exceeding the viewport, this can change though
|
|
91
89
|
let menuIsExceedingViewport = false;
|
|
92
90
|
if (menuDOMRect.width >= document.body.scrollWidth) {
|
|
93
|
-
var _context;
|
|
94
91
|
// If the menu width is greater than the body width, we need to set the width of the menu to the body width
|
|
95
92
|
// to prevent the menu from overflowing, this happens usually when the horizontalConstraint is set to 'auto'
|
|
96
|
-
menuEl.style.width =
|
|
93
|
+
menuEl.style.width = `calc(${document.body.scrollWidth}px - 2 * ${outerMargin})`;
|
|
97
94
|
menuIsExceedingViewport = true;
|
|
98
95
|
}
|
|
99
96
|
|
|
@@ -132,40 +129,36 @@ function DropdownBaseMenu(props) {
|
|
|
132
129
|
// the trigger
|
|
133
130
|
const scrollWidthDiff = (document.body.scrollWidth - scrollWidthBefore) * 0.5;
|
|
134
131
|
if (menuIsExceedingViewport) {
|
|
135
|
-
|
|
136
|
-
menuEl.style.left = _concatInstanceProperty__default["default"](_context2 = "calc( ".concat(outerMargin, " + ")).call(_context2, scrollWidthDiff, "px)");
|
|
132
|
+
menuEl.style.left = `calc( ${outerMargin} + ${scrollWidthDiff}px)`;
|
|
137
133
|
} else if (menuXPosition === 'left') {
|
|
138
|
-
menuEl.style.left =
|
|
134
|
+
menuEl.style.left = `${triggerDOMRect.left + scrollWidthDiff}px`;
|
|
139
135
|
menuEl.style.removeProperty('right');
|
|
140
136
|
} else {
|
|
141
|
-
menuEl.style.right =
|
|
137
|
+
menuEl.style.right = `${window.innerWidth - triggerDOMRect.right - scrollWidthDiff}px`;
|
|
142
138
|
menuEl.style.removeProperty('left');
|
|
143
139
|
}
|
|
144
140
|
if (menuYPosition === 'below') {
|
|
145
|
-
|
|
146
|
-
menuEl.style.top = _concatInstanceProperty__default["default"](_context3 = "calc(".concat(triggerDOMRect.top + triggerDOMRect.height, "px + ")).call(_context3, outerMargin, ")");
|
|
141
|
+
menuEl.style.top = `calc(${triggerDOMRect.top + triggerDOMRect.height}px + ${outerMargin})`;
|
|
147
142
|
} else {
|
|
148
|
-
var _context4;
|
|
149
143
|
// Need to re-request getBoundingClientRect() because the menu height
|
|
150
144
|
// might have changed when the dropdown is in 'auto' mode;
|
|
151
145
|
let desiredMenuHeight = menuMaxHeight || menuEl.getBoundingClientRect().height;
|
|
152
|
-
menuEl.style.top =
|
|
146
|
+
menuEl.style.top = `calc(${triggerDOMRect.top - desiredMenuHeight}px - ${outerMargin})`;
|
|
153
147
|
}
|
|
154
148
|
if (menuMaxHeight) {
|
|
155
149
|
// Apply the manual max-width
|
|
156
150
|
menuEl.style.maxHeight = menuMaxHeight + 'px';
|
|
157
151
|
} else {
|
|
158
|
-
var _context5, _context6, _context7, _context8;
|
|
159
152
|
// Make sure max-height does not exceed the available top- or bottom-space
|
|
160
|
-
menuEl.style.maxHeight = menuYPosition === 'below' ?
|
|
153
|
+
menuEl.style.maxHeight = menuYPosition === 'below' ? `calc(${window.innerHeight - triggerDOMRect.bottom}px - ${outerMargin} - ${boxShadowBottomSize})` : `calc(${triggerDOMRect.top}px - ${outerMargin} - ${boxShadowBottomSize})`;
|
|
161
154
|
}
|
|
162
155
|
|
|
163
156
|
// All positioning operations done, make menu visible again
|
|
164
157
|
menuEl.style.visibility = 'visible';
|
|
165
158
|
}, 0);
|
|
166
159
|
return () => {
|
|
167
|
-
var
|
|
168
|
-
_forEachInstanceProperty__default["default"](
|
|
160
|
+
var _context;
|
|
161
|
+
_forEachInstanceProperty__default["default"](_context = ['top', 'left', 'right', 'bottom', 'width', 'height', 'maxHeight', 'visibility']).call(_context, prop => {
|
|
169
162
|
menuEl.style.removeProperty(prop);
|
|
170
163
|
});
|
|
171
164
|
};
|
|
@@ -221,9 +214,8 @@ function DropdownListMenuItem(props) {
|
|
|
221
214
|
return jsxRuntime.jsx(AccessibleButton__default["default"], _objectSpread$1(_objectSpread$1({
|
|
222
215
|
label: props.children,
|
|
223
216
|
onClick: () => {
|
|
224
|
-
var _props$onClick;
|
|
225
217
|
toggle();
|
|
226
|
-
|
|
218
|
+
props.onClick?.();
|
|
227
219
|
},
|
|
228
220
|
isDisabled: props.isDisabled,
|
|
229
221
|
css: getDropdownListMenuItemStyles(props)
|
|
@@ -295,9 +287,8 @@ function DropdownMenu(props) {
|
|
|
295
287
|
|
|
296
288
|
// Close the dropdown when clicking outside of it
|
|
297
289
|
const handleGlobalClick = react.useCallback(event => {
|
|
298
|
-
var _triggerElement$paren;
|
|
299
290
|
const triggerElement = triggerRef.current;
|
|
300
|
-
if (isOpen && triggerElement && event.target !== triggerElement && window.document.contains(event.target) && !
|
|
291
|
+
if (isOpen && triggerElement && event.target !== triggerElement && window.document.contains(event.target) && !triggerElement.parentElement?.contains(event.target)) {
|
|
301
292
|
toggle(false);
|
|
302
293
|
}
|
|
303
294
|
}, [triggerRef, toggle, isOpen]);
|
|
@@ -14,7 +14,6 @@ import { useContext, createContext, forwardRef, useRef, useLayoutEffect, useMemo
|
|
|
14
14
|
import { filterDataAttributes } from '@commercetools-uikit/utils';
|
|
15
15
|
import { useToggleState } from '@commercetools-uikit/hooks';
|
|
16
16
|
import { jsx, jsxs } from '@emotion/react/jsx-runtime';
|
|
17
|
-
import _concatInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/concat';
|
|
18
17
|
import _setTimeout from '@babel/runtime-corejs3/core-js-stable/set-timeout';
|
|
19
18
|
import { css } from '@emotion/react';
|
|
20
19
|
import { designTokens } from '@commercetools-uikit/design-system';
|
|
@@ -48,7 +47,7 @@ DropDownTrigger.displayName = 'DropDownTrigger';
|
|
|
48
47
|
var DropdownTrigger = DropDownTrigger;
|
|
49
48
|
|
|
50
49
|
function ownKeys$2(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
51
|
-
function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var
|
|
50
|
+
function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var _context2, _context3; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context2 = ownKeys$2(Object(t), !0)).call(_context2, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context3 = ownKeys$2(Object(t))).call(_context3, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
52
51
|
const boxShadowBottomSize = '5px';
|
|
53
52
|
const outerMargin = designTokens.spacing20;
|
|
54
53
|
function getDropdownMenuBaseStyles(params) {
|
|
@@ -69,10 +68,9 @@ function DropdownBaseMenu(props) {
|
|
|
69
68
|
// By default, the menu is not exceeding the viewport, this can change though
|
|
70
69
|
let menuIsExceedingViewport = false;
|
|
71
70
|
if (menuDOMRect.width >= document.body.scrollWidth) {
|
|
72
|
-
var _context;
|
|
73
71
|
// If the menu width is greater than the body width, we need to set the width of the menu to the body width
|
|
74
72
|
// to prevent the menu from overflowing, this happens usually when the horizontalConstraint is set to 'auto'
|
|
75
|
-
menuEl.style.width =
|
|
73
|
+
menuEl.style.width = `calc(${document.body.scrollWidth}px - 2 * ${outerMargin})`;
|
|
76
74
|
menuIsExceedingViewport = true;
|
|
77
75
|
}
|
|
78
76
|
|
|
@@ -111,40 +109,36 @@ function DropdownBaseMenu(props) {
|
|
|
111
109
|
// the trigger
|
|
112
110
|
const scrollWidthDiff = (document.body.scrollWidth - scrollWidthBefore) * 0.5;
|
|
113
111
|
if (menuIsExceedingViewport) {
|
|
114
|
-
|
|
115
|
-
menuEl.style.left = _concatInstanceProperty(_context2 = "calc( ".concat(outerMargin, " + ")).call(_context2, scrollWidthDiff, "px)");
|
|
112
|
+
menuEl.style.left = `calc( ${outerMargin} + ${scrollWidthDiff}px)`;
|
|
116
113
|
} else if (menuXPosition === 'left') {
|
|
117
|
-
menuEl.style.left =
|
|
114
|
+
menuEl.style.left = `${triggerDOMRect.left + scrollWidthDiff}px`;
|
|
118
115
|
menuEl.style.removeProperty('right');
|
|
119
116
|
} else {
|
|
120
|
-
menuEl.style.right =
|
|
117
|
+
menuEl.style.right = `${window.innerWidth - triggerDOMRect.right - scrollWidthDiff}px`;
|
|
121
118
|
menuEl.style.removeProperty('left');
|
|
122
119
|
}
|
|
123
120
|
if (menuYPosition === 'below') {
|
|
124
|
-
|
|
125
|
-
menuEl.style.top = _concatInstanceProperty(_context3 = "calc(".concat(triggerDOMRect.top + triggerDOMRect.height, "px + ")).call(_context3, outerMargin, ")");
|
|
121
|
+
menuEl.style.top = `calc(${triggerDOMRect.top + triggerDOMRect.height}px + ${outerMargin})`;
|
|
126
122
|
} else {
|
|
127
|
-
var _context4;
|
|
128
123
|
// Need to re-request getBoundingClientRect() because the menu height
|
|
129
124
|
// might have changed when the dropdown is in 'auto' mode;
|
|
130
125
|
let desiredMenuHeight = menuMaxHeight || menuEl.getBoundingClientRect().height;
|
|
131
|
-
menuEl.style.top =
|
|
126
|
+
menuEl.style.top = `calc(${triggerDOMRect.top - desiredMenuHeight}px - ${outerMargin})`;
|
|
132
127
|
}
|
|
133
128
|
if (menuMaxHeight) {
|
|
134
129
|
// Apply the manual max-width
|
|
135
130
|
menuEl.style.maxHeight = menuMaxHeight + 'px';
|
|
136
131
|
} else {
|
|
137
|
-
var _context5, _context6, _context7, _context8;
|
|
138
132
|
// Make sure max-height does not exceed the available top- or bottom-space
|
|
139
|
-
menuEl.style.maxHeight = menuYPosition === 'below' ?
|
|
133
|
+
menuEl.style.maxHeight = menuYPosition === 'below' ? `calc(${window.innerHeight - triggerDOMRect.bottom}px - ${outerMargin} - ${boxShadowBottomSize})` : `calc(${triggerDOMRect.top}px - ${outerMargin} - ${boxShadowBottomSize})`;
|
|
140
134
|
}
|
|
141
135
|
|
|
142
136
|
// All positioning operations done, make menu visible again
|
|
143
137
|
menuEl.style.visibility = 'visible';
|
|
144
138
|
}, 0);
|
|
145
139
|
return () => {
|
|
146
|
-
var
|
|
147
|
-
_forEachInstanceProperty(
|
|
140
|
+
var _context;
|
|
141
|
+
_forEachInstanceProperty(_context = ['top', 'left', 'right', 'bottom', 'width', 'height', 'maxHeight', 'visibility']).call(_context, prop => {
|
|
148
142
|
menuEl.style.removeProperty(prop);
|
|
149
143
|
});
|
|
150
144
|
};
|
|
@@ -222,9 +216,8 @@ function DropdownListMenuItem(props) {
|
|
|
222
216
|
return jsx(AccessibleButton, _objectSpread$1(_objectSpread$1({
|
|
223
217
|
label: props.children,
|
|
224
218
|
onClick: () => {
|
|
225
|
-
var _props$onClick;
|
|
226
219
|
toggle();
|
|
227
|
-
|
|
220
|
+
props.onClick?.();
|
|
228
221
|
},
|
|
229
222
|
isDisabled: props.isDisabled,
|
|
230
223
|
css: getDropdownListMenuItemStyles(props)
|
|
@@ -305,9 +298,8 @@ function DropdownMenu(props) {
|
|
|
305
298
|
|
|
306
299
|
// Close the dropdown when clicking outside of it
|
|
307
300
|
const handleGlobalClick = useCallback(event => {
|
|
308
|
-
var _triggerElement$paren;
|
|
309
301
|
const triggerElement = triggerRef.current;
|
|
310
|
-
if (isOpen && triggerElement && event.target !== triggerElement && window.document.contains(event.target) && !
|
|
302
|
+
if (isOpen && triggerElement && event.target !== triggerElement && window.document.contains(event.target) && !triggerElement.parentElement?.contains(event.target)) {
|
|
311
303
|
toggle(false);
|
|
312
304
|
}
|
|
313
305
|
}, [triggerRef, toggle, isOpen]);
|
|
@@ -3,7 +3,7 @@ import { type TMaxProp } from '@commercetools-uikit/constraints';
|
|
|
3
3
|
export declare function getDropdownMenuBaseStyles(params: {
|
|
4
4
|
isOpen: boolean;
|
|
5
5
|
horizontalConstraint: TMaxProp;
|
|
6
|
-
}): import("@emotion/
|
|
6
|
+
}): import("@emotion/react").SerializedStyles;
|
|
7
7
|
export type TDropdownContentMenuProps = {
|
|
8
8
|
children: ReactNode;
|
|
9
9
|
horizontalConstraint: TMaxProp;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@commercetools-uikit/dropdown-menu",
|
|
3
3
|
"description": "The Dropdown Menu component represents a component that triggers the rendering of a floating menu.",
|
|
4
|
-
"version": "19.
|
|
4
|
+
"version": "19.12.0",
|
|
5
5
|
"bugs": "https://github.com/commercetools/ui-kit/issues",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -21,14 +21,14 @@
|
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@babel/runtime": "^7.20.13",
|
|
23
23
|
"@babel/runtime-corejs3": "^7.20.13",
|
|
24
|
-
"@commercetools-uikit/accessible-button": "19.
|
|
25
|
-
"@commercetools-uikit/constraints": "19.
|
|
26
|
-
"@commercetools-uikit/design-system": "19.
|
|
27
|
-
"@commercetools-uikit/hooks": "19.
|
|
28
|
-
"@commercetools-uikit/secondary-button": "19.
|
|
29
|
-
"@commercetools-uikit/spacings-inline": "19.
|
|
30
|
-
"@commercetools-uikit/spacings-stack": "19.
|
|
31
|
-
"@commercetools-uikit/utils": "19.
|
|
24
|
+
"@commercetools-uikit/accessible-button": "19.12.0",
|
|
25
|
+
"@commercetools-uikit/constraints": "19.12.0",
|
|
26
|
+
"@commercetools-uikit/design-system": "19.12.0",
|
|
27
|
+
"@commercetools-uikit/hooks": "19.12.0",
|
|
28
|
+
"@commercetools-uikit/secondary-button": "19.12.0",
|
|
29
|
+
"@commercetools-uikit/spacings-inline": "19.12.0",
|
|
30
|
+
"@commercetools-uikit/spacings-stack": "19.12.0",
|
|
31
|
+
"@commercetools-uikit/utils": "19.12.0",
|
|
32
32
|
"@emotion/react": "^11.10.5",
|
|
33
33
|
"@emotion/styled": "^11.10.5",
|
|
34
34
|
"prop-types": "15.8.1",
|