@commercetools-uikit/dropdown-menu 19.4.0 → 19.6.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 CHANGED
@@ -11,7 +11,10 @@ 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 is that, when the panel is open, the document scroll is blocked.
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
15
18
 
16
19
  ## Installation
17
20
 
@@ -9,6 +9,8 @@ var react = require('react');
9
9
  var hooks = require('@commercetools-uikit/hooks');
10
10
  var jsxRuntime = require('@emotion/react/jsx-runtime');
11
11
  var _concatInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/concat');
12
+ var _setTimeout = require('@babel/runtime-corejs3/core-js-stable/set-timeout');
13
+ var _forEachInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/for-each');
12
14
  var react$1 = require('@emotion/react');
13
15
  var designSystem = require('@commercetools-uikit/design-system');
14
16
  var Constraints = require('@commercetools-uikit/constraints');
@@ -20,6 +22,8 @@ function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e };
20
22
  var _styled__default = /*#__PURE__*/_interopDefault(_styled);
21
23
  var _pt__default = /*#__PURE__*/_interopDefault(_pt);
22
24
  var _concatInstanceProperty__default = /*#__PURE__*/_interopDefault(_concatInstanceProperty);
25
+ var _setTimeout__default = /*#__PURE__*/_interopDefault(_setTimeout);
26
+ var _forEachInstanceProperty__default = /*#__PURE__*/_interopDefault(_forEachInstanceProperty);
23
27
  var Constraints__default = /*#__PURE__*/_interopDefault(Constraints);
24
28
  var SpacingsStack__default = /*#__PURE__*/_interopDefault(SpacingsStack);
25
29
  var AccessibleButton__default = /*#__PURE__*/_interopDefault(AccessibleButton);
@@ -50,27 +54,104 @@ DropDownTrigger.displayName = 'DropDownTrigger';
50
54
  var DropdownTrigger = DropDownTrigger;
51
55
 
52
56
  const boxShadowBottomSize = '5px';
53
- const marginTop = designSystem.designTokens.spacing20;
57
+ const outerMargin = designSystem.designTokens.spacing20;
54
58
  function getDropdownMenuBaseStyles(params) {
55
- return /*#__PURE__*/react$1.css("background-color:", designSystem.designTokens.colorSurface, ";border:1px solid ", designSystem.designTokens.colorSurface, ";border-radius:", designSystem.designTokens.borderRadius4, ";box-shadow:0 2px ", boxShadowBottomSize, " 0px rgba(0, 0, 0, 0.15);display:", params.isOpen ? 'block' : 'none', ";margin-top:", marginTop, ";max-width:", Constraints__default["default"].getMaxPropTokenValue(params.horizontalConstraint), ";overflow-y:auto;position:fixed;width:", params.horizontalConstraint === 'auto' ? 'auto' : '100%', ";z-index:5;" + (process.env.NODE_ENV === "production" ? "" : ";label:getDropdownMenuBaseStyles;"), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyb3Bkb3duLW1lbnUtbWVudS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0JZIiwiZmlsZSI6ImRyb3Bkb3duLW1lbnUtbWVudS50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDU1NQcm9wZXJ0aWVzLFxuICBSZWFjdE5vZGUsXG4gIFJlZk9iamVjdCxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VSZWYsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNzcyB9IGZyb20gJ0BlbW90aW9uL3JlYWN0JztcbmltcG9ydCB7IGRlc2lnblRva2VucyB9IGZyb20gJ0Bjb21tZXJjZXRvb2xzLXVpa2l0L2Rlc2lnbi1zeXN0ZW0nO1xuaW1wb3J0IENvbnN0cmFpbnRzLCB7IHR5cGUgVE1heFByb3AgfSBmcm9tICdAY29tbWVyY2V0b29scy11aWtpdC9jb25zdHJhaW50cyc7XG5pbXBvcnQgU3BhY2luZ3NTdGFjayBmcm9tICdAY29tbWVyY2V0b29scy11aWtpdC9zcGFjaW5ncy1zdGFjayc7XG5cbi8vIFdlIGRlY2xhcmUgdGhpcyBzdHlsZSBwcm9wZXJ0aWVzIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRoZW0gYm90aCBmb3IgaW5pdGlhbCBjb21wb25lbnQgc3R5bGluZ1xuLy8gYnV0IGFsc28gZm9yIGNhbGN1bGF0aW5nIHRoZSBkZWZhdWx0IG1heCBoZWlnaHQgb2YgdGhlIGRyb3Bkb3duIG1lbnUgc28gd2UgbWFrZSBzdXJlIGl0IGZpdHNcbi8vIHdpdGhpbiB0aGUgdmlld3BvcnQuXG5jb25zdCBib3hTaGFkb3dCb3R0b21TaXplID0gJzVweCc7XG5jb25zdCBtYXJnaW5Ub3AgPSBkZXNpZ25Ub2tlbnMuc3BhY2luZzIwO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHJvcGRvd25NZW51QmFzZVN0eWxlcyhwYXJhbXM6IHtcbiAgaXNPcGVuOiBib29sZWFuO1xuICBob3Jpem9udGFsQ29uc3RyYWludDogVE1heFByb3A7XG59KSB7XG4gIHJldHVybiBjc3NgXG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtkZXNpZ25Ub2tlbnMuY29sb3JTdXJmYWNlfTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAke2Rlc2lnblRva2Vucy5jb2xvclN1cmZhY2V9O1xuICAgIGJvcmRlci1yYWRpdXM6ICR7ZGVzaWduVG9rZW5zLmJvcmRlclJhZGl1czR9O1xuICAgIGJveC1zaGFkb3c6IDAgMnB4ICR7Ym94U2hhZG93Qm90dG9tU2l6ZX0gMHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gICAgZGlzcGxheTogJHtwYXJhbXMuaXNPcGVuID8gJ2Jsb2NrJyA6ICdub25lJ307XG4gICAgbWFyZ2luLXRvcDogJHttYXJnaW5Ub3B9O1xuICAgIG1heC13aWR0aDogJHtDb25zdHJhaW50cy5nZXRNYXhQcm9wVG9rZW5WYWx1ZShwYXJhbXMuaG9yaXpvbnRhbENvbnN0cmFpbnQpfTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB3aWR0aDogJHtwYXJhbXMuaG9yaXpvbnRhbENvbnN0cmFpbnQgPT09ICdhdXRvJyA/ICdhdXRvJyA6ICcxMDAlJ307XG4gICAgei1pbmRleDogNTtcbiAgYDtcbn1cblxudHlwZSBURHJvcGRvd25CYXNlTWVudVByb3BzID0ge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICBjdXN0b21TdHlsZXM/OiBDU1NQcm9wZXJ0aWVzO1xuICBob3Jpem9udGFsQ29uc3RyYWludDogVE1heFByb3A7XG4gIGlzT3BlbjogYm9vbGVhbjtcbiAgbWVudVBvc2l0aW9uOiAnbGVmdCcgfCAncmlnaHQnO1xuICBtZW51TWF4SGVpZ2h0PzogbnVtYmVyO1xuICB0cmlnZ2VyRWxlbWVudFJlZjogUmVmT2JqZWN0PEhUTUxFbGVtZW50Pjtcbn07XG5mdW5jdGlvbiBEcm9wZG93bkJhc2VNZW51KHByb3BzOiBURHJvcGRvd25CYXNlTWVudVByb3BzKSB7XG4gIGNvbnN0IG1lbnVSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgLy8gVXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVudSB3aGVuIGl0IGlzIG9wZW5cbiAgICBpZiAocHJvcHMuaXNPcGVuICYmIHByb3BzLnRyaWdnZXJFbGVtZW50UmVmLmN1cnJlbnQgJiYgbWVudVJlZi5jdXJyZW50KSB7XG4gICAgICBjb25zdCB0cmlnZ2VyRWxlbWVudENvb3JkaW5hdGVzID1cbiAgICAgICAgcHJvcHMudHJpZ2dlckVsZW1lbnRSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgbWVudVJlZi5jdXJyZW50LnN0eWxlLnRvcCA9IGAke1xuICAgICAgICB0cmlnZ2VyRWxlbWVudENvb3JkaW5hdGVzLnRvcCArIHRyaWdnZXJFbGVtZW50Q29vcmRpbmF0ZXMuaGVpZ2h0XG4gICAgICB9cHhgO1xuICAgICAgaWYgKHByb3BzLm1lbnVQb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIG1lbnVSZWYuY3VycmVudC5zdHlsZS5sZWZ0ID0gYCR7dHJpZ2dlckVsZW1lbnRDb29yZGluYXRlcy5sZWZ0fXB4YDtcbiAgICAgICAgbWVudVJlZi5jdXJyZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdyaWdodCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVudVJlZi5jdXJyZW50LnN0eWxlLnJpZ2h0ID0gYCR7XG4gICAgICAgICAgd2luZG93LmlubmVyV2lkdGggLSB0cmlnZ2VyRWxlbWVudENvb3JkaW5hdGVzLnJpZ2h0XG4gICAgICAgIH1weGA7XG4gICAgICAgIG1lbnVSZWYuY3VycmVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO1xuICAgICAgfVxuICAgICAgbWVudVJlZi5jdXJyZW50LnN0eWxlLm1heEhlaWdodCA9IHByb3BzLm1lbnVNYXhIZWlnaHRcbiAgICAgICAgPyBgJHtwcm9wcy5tZW51TWF4SGVpZ2h0fXB4YFxuICAgICAgICA6IGBjYWxjKCR7XG4gICAgICAgICAgICB3aW5kb3cuaW5uZXJIZWlnaHQgLVxuICAgICAgICAgICAgKHRyaWdnZXJFbGVtZW50Q29vcmRpbmF0ZXMudG9wICsgdHJpZ2dlckVsZW1lbnRDb29yZGluYXRlcy5oZWlnaHQpXG4gICAgICAgICAgfXB4IC0gJHttYXJnaW5Ub3B9IC0gJHtib3hTaGFkb3dCb3R0b21TaXplfSlgO1xuICAgIH1cbiAgfSwgW1xuICAgIHByb3BzLmlzT3BlbixcbiAgICBwcm9wcy5tZW51UG9zaXRpb24sXG4gICAgcHJvcHMudHJpZ2dlckVsZW1lbnRSZWYsXG4gICAgcHJvcHMubWVudU1heEhlaWdodCxcbiAgXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjc3M9e2dldERyb3Bkb3duTWVudUJhc2VTdHlsZXMocHJvcHMpfVxuICAgICAgc3R5bGU9e3Byb3BzLmN1c3RvbVN0eWxlc31cbiAgICAgIHJlZj17bWVudVJlZn1cbiAgICA+XG4gICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmV4cG9ydCB0eXBlIFREcm9wZG93bkNvbnRlbnRNZW51UHJvcHMgPSB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGhvcml6b250YWxDb25zdHJhaW50OiBUTWF4UHJvcDtcbiAgbWVudVBvc2l0aW9uOiAnbGVmdCcgfCAncmlnaHQnO1xuICBtZW51TWF4SGVpZ2h0PzogbnVtYmVyO1xuICBpc09wZW46IGJvb2xlYW47XG4gIHRyaWdnZXJFbGVtZW50UmVmOiBSZWZPYmplY3Q8SFRNTEVsZW1lbnQ+O1xufTtcbmV4cG9ydCBjb25zdCBEcm9wZG93bkNvbnRlbnRNZW51ID0gKHByb3BzOiBURHJvcGRvd25Db250ZW50TWVudVByb3BzKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duQmFzZU1lbnVcbiAgICAgIGN1c3RvbVN0eWxlcz17e1xuICAgICAgICBwYWRkaW5nOiBkZXNpZ25Ub2tlbnMuc3BhY2luZzMwLFxuICAgICAgfX1cbiAgICAgIGhvcml6b250YWxDb25zdHJhaW50PXtwcm9wcy5ob3Jpem9udGFsQ29uc3RyYWludH1cbiAgICAgIGlzT3Blbj17cHJvcHMuaXNPcGVufVxuICAgICAgbWVudVBvc2l0aW9uPXtwcm9wcy5tZW51UG9zaXRpb259XG4gICAgICBtZW51TWF4SGVpZ2h0PXtwcm9wcy5tZW51TWF4SGVpZ2h0fVxuICAgICAgdHJpZ2dlckVsZW1lbnRSZWY9e3Byb3BzLnRyaWdnZXJFbGVtZW50UmVmfVxuICAgID5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L0Ryb3Bkb3duQmFzZU1lbnU+XG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBURHJvcGRvd25MaXN0TWVudVByb3BzID0ge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICBob3Jpem9udGFsQ29uc3RyYWludDogVE1heFByb3A7XG4gIG1lbnVQb3NpdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JztcbiAgbWVudU1heEhlaWdodD86IG51bWJlcjtcbiAgaXNPcGVuOiBib29sZWFuO1xuICB0cmlnZ2VyRWxlbWVudFJlZjogUmVmT2JqZWN0PEhUTUxFbGVtZW50Pjtcbn07XG5leHBvcnQgY29uc3QgRHJvcGRvd25MaXN0TWVudSA9IChwcm9wczogVERyb3Bkb3duTGlzdE1lbnVQcm9wcykgPT4ge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bkJhc2VNZW51XG4gICAgICBob3Jpem9udGFsQ29uc3RyYWludD17cHJvcHMuaG9yaXpvbnRhbENvbnN0cmFpbnR9XG4gICAgICBpc09wZW49e3Byb3BzLmlzT3Blbn1cbiAgICAgIG1lbnVQb3NpdGlvbj17cHJvcHMubWVudVBvc2l0aW9ufVxuICAgICAgbWVudU1heEhlaWdodD17cHJvcHMubWVudU1heEhlaWdodH1cbiAgICAgIHRyaWdnZXJFbGVtZW50UmVmPXtwcm9wcy50cmlnZ2VyRWxlbWVudFJlZn1cbiAgICA+XG4gICAgICA8U3BhY2luZ3NTdGFjayBzY2FsZT1cInhzXCI+e3Byb3BzLmNoaWxkcmVufTwvU3BhY2luZ3NTdGFjaz5cbiAgICA8L0Ryb3Bkb3duQmFzZU1lbnU+XG4gICk7XG59O1xuIl19 */");
59
+ return /*#__PURE__*/react$1.css("background-color:", designSystem.designTokens.colorSurface, ";border:1px solid ", designSystem.designTokens.colorSurface, ";border-radius:", designSystem.designTokens.borderRadius4, ";box-shadow:0 2px ", boxShadowBottomSize, " 0px rgba(0, 0, 0, 0.15);display:", params.isOpen ? 'block' : 'none', ";max-width:", Constraints__default["default"].getMaxPropTokenValue(params.horizontalConstraint), ";overflow-y:auto;position:fixed;visibility:hidden;width:", params.horizontalConstraint === 'auto' ? 'auto' : '100%', ";z-index:1;" + (process.env.NODE_ENV === "production" ? "" : ";label:getDropdownMenuBaseStyles;"), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyb3Bkb3duLW1lbnUtbWVudS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0JZIiwiZmlsZSI6ImRyb3Bkb3duLW1lbnUtbWVudS50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDU1NQcm9wZXJ0aWVzLFxuICBSZWFjdE5vZGUsXG4gIFJlZk9iamVjdCxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VSZWYsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNzcyB9IGZyb20gJ0BlbW90aW9uL3JlYWN0JztcbmltcG9ydCB7IGRlc2lnblRva2VucyB9IGZyb20gJ0Bjb21tZXJjZXRvb2xzLXVpa2l0L2Rlc2lnbi1zeXN0ZW0nO1xuaW1wb3J0IENvbnN0cmFpbnRzLCB7IHR5cGUgVE1heFByb3AgfSBmcm9tICdAY29tbWVyY2V0b29scy11aWtpdC9jb25zdHJhaW50cyc7XG5pbXBvcnQgU3BhY2luZ3NTdGFjayBmcm9tICdAY29tbWVyY2V0b29scy11aWtpdC9zcGFjaW5ncy1zdGFjayc7XG5cbi8vIFdlIGRlY2xhcmUgdGhpcyBzdHlsZSBwcm9wZXJ0aWVzIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRoZW0gYm90aCBmb3IgaW5pdGlhbCBjb21wb25lbnQgc3R5bGluZ1xuLy8gYnV0IGFsc28gZm9yIGNhbGN1bGF0aW5nIHRoZSBkZWZhdWx0IG1heCBoZWlnaHQgb2YgdGhlIGRyb3Bkb3duIG1lbnUgc28gd2UgbWFrZSBzdXJlIGl0IGZpdHNcbi8vIHdpdGhpbiB0aGUgdmlld3BvcnQuXG5jb25zdCBib3hTaGFkb3dCb3R0b21TaXplID0gJzVweCc7XG5jb25zdCBvdXRlck1hcmdpbiA9IGRlc2lnblRva2Vucy5zcGFjaW5nMjA7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREcm9wZG93bk1lbnVCYXNlU3R5bGVzKHBhcmFtczoge1xuICBpc09wZW46IGJvb2xlYW47XG4gIGhvcml6b250YWxDb25zdHJhaW50OiBUTWF4UHJvcDtcbn0pIHtcbiAgcmV0dXJuIGNzc2BcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2Rlc2lnblRva2Vucy5jb2xvclN1cmZhY2V9O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICR7ZGVzaWduVG9rZW5zLmNvbG9yU3VyZmFjZX07XG4gICAgYm9yZGVyLXJhZGl1czogJHtkZXNpZ25Ub2tlbnMuYm9yZGVyUmFkaXVzNH07XG4gICAgYm94LXNoYWRvdzogMCAycHggJHtib3hTaGFkb3dCb3R0b21TaXplfSAwcHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgICBkaXNwbGF5OiAke3BhcmFtcy5pc09wZW4gPyAnYmxvY2snIDogJ25vbmUnfTtcbiAgICBtYXgtd2lkdGg6ICR7Q29uc3RyYWludHMuZ2V0TWF4UHJvcFRva2VuVmFsdWUocGFyYW1zLmhvcml6b250YWxDb25zdHJhaW50KX07XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIHdpZHRoOiAke3BhcmFtcy5ob3Jpem9udGFsQ29uc3RyYWludCA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogJzEwMCUnfTtcbiAgICB6LWluZGV4OiAxO1xuICBgO1xufVxuXG50eXBlIFREcm9wZG93bkJhc2VNZW51UHJvcHMgPSB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGN1c3RvbVN0eWxlcz86IENTU1Byb3BlcnRpZXM7XG4gIGhvcml6b250YWxDb25zdHJhaW50OiBUTWF4UHJvcDtcbiAgaXNPcGVuOiBib29sZWFuO1xuICBtZW51UG9zaXRpb246ICdsZWZ0JyB8ICdyaWdodCc7XG4gIG1lbnVNYXhIZWlnaHQ/OiBudW1iZXI7XG4gIHRyaWdnZXJFbGVtZW50UmVmOiBSZWZPYmplY3Q8SFRNTEVsZW1lbnQ+O1xufTtcbmZ1bmN0aW9uIERyb3Bkb3duQmFzZU1lbnUocHJvcHM6IFREcm9wZG93bkJhc2VNZW51UHJvcHMpIHtcbiAgY29uc3QgbWVudVJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXByb3BzLmlzT3BlbiB8fCAhcHJvcHMudHJpZ2dlckVsZW1lbnRSZWYuY3VycmVudCB8fCAhbWVudVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVudU1heEhlaWdodCA9IHByb3BzLm1lbnVNYXhIZWlnaHQ7XG4gICAgY29uc3QgbWVudUVsID0gbWVudVJlZi5jdXJyZW50O1xuICAgIGNvbnN0IG1lbnVUcmlnZ2VyRWwgPSBwcm9wcy50cmlnZ2VyRWxlbWVudFJlZi5jdXJyZW50O1xuXG4gICAgY29uc3QgbWVudURPTVJlY3QgPSBtZW51RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdHJpZ2dlckRPTVJlY3QgPSBtZW51VHJpZ2dlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgLy8gQnkgZGVmYXVsdCwgdGhlIG1lbnUgaXMgbm90IGV4Y2VlZGluZyB0aGUgdmlld3BvcnQsIHRoaXMgY2FuIGNoYW5nZSB0aG91Z2hcbiAgICBsZXQgbWVudUlzRXhjZWVkaW5nVmlld3BvcnQgPSBmYWxzZTtcblxuICAgIGlmIChtZW51RE9NUmVjdC53aWR0aCA+PSBkb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoKSB7XG4gICAgICAvLyBJZiB0aGUgbWVudSB3aWR0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGJvZHkgd2lkdGgsIHdlIG5lZWQgdG8gc2V0IHRoZSB3aWR0aCBvZiB0aGUgbWVudSB0byB0aGUgYm9keSB3aWR0aFxuICAgICAgLy8gdG8gcHJldmVudCB0aGUgbWVudSBmcm9tIG92ZXJmbG93aW5nLCB0aGlzIGhhcHBlbnMgdXN1YWxseSB3aGVuIHRoZSBob3Jpem9udGFsQ29uc3RyYWludCBpcyBzZXQgdG8gJ2F1dG8nXG4gICAgICBtZW51RWwuc3R5bGUud2lkdGggPSBgY2FsYygke2RvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGh9cHggLSAyICogJHtvdXRlck1hcmdpbn0pYDtcbiAgICAgIG1lbnVJc0V4Y2VlZGluZ1ZpZXdwb3J0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcHJlZmVycmVkL2lkZWFsIGhlaWdodCBvZiB0aGUgbWVudSAod2hpY2ggbWlnaHQgY2hhbmdlIGxhdGVyIGlmIHRoZXJlIGlzXG4gICAgLy8gbm90IGVub3VnaCBzY3JlZW4gZXN0YXRlKVxuICAgIGxldCBkZXNpcmVkTWVudUhlaWdodCA9IG1lbnVNYXhIZWlnaHQgfHwgbWVudURPTVJlY3QuaGVpZ2h0O1xuICAgIGNvbnN0IG1lbnVXaWR0aCA9IG1lbnVET01SZWN0LndpZHRoO1xuXG4gICAgY29uc3QgYXZhaWxhYmxlU3BhY2VUb3AgPSB0cmlnZ2VyRE9NUmVjdC50b3A7XG4gICAgY29uc3QgYXZhaWxhYmxlU3BhY2VCb3R0b20gPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0cmlnZ2VyRE9NUmVjdC5ib3R0b207XG5cbiAgICAvLyBQcmVmZXIgcmVuZGVyaW5nIGJlbG93IHRoZSB0cmlnZ2VyIGVsZW1lbnQgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlXG4gICAgLy8gdG8gZGlzcGxheSB0aGUgd2hvbGUgbWVudSwgb3RoZXJ3aXNlIHJlbmRlciB3aGVyZXZlciB0aGVyZSBpcyBtb3JlIHNwYWNlXG4gICAgY29uc3QgbWVudVlQb3NpdGlvbiA9XG4gICAgICBhdmFpbGFibGVTcGFjZUJvdHRvbSA+PSBkZXNpcmVkTWVudUhlaWdodFxuICAgICAgICA/ICdiZWxvdydcbiAgICAgICAgOiBhdmFpbGFibGVTcGFjZUJvdHRvbSA+IGF2YWlsYWJsZVNwYWNlVG9wXG4gICAgICAgID8gJ2JlbG93J1xuICAgICAgICA6ICdhYm92ZSc7XG5cbiAgICBsZXQgbWVudVhQb3NpdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JztcblxuICAgIGlmIChwcm9wcy5tZW51UG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgY29uc3QgZGlzdGFuY2VUb1JpZ2h0RWRnZSA9IHdpbmRvdy5pbm5lcldpZHRoIC0gdHJpZ2dlckRPTVJlY3QubGVmdDtcbiAgICAgIG1lbnVYUG9zaXRpb24gPSBkaXN0YW5jZVRvUmlnaHRFZGdlID49IG1lbnVXaWR0aCA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm1lbnVQb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgY29uc3QgZGlzdGFuY2VUb0xlZnRFZGdlID0gdHJpZ2dlckRPTVJlY3QubGVmdCArIHRyaWdnZXJET01SZWN0LndpZHRoO1xuICAgICAgbWVudVhQb3NpdGlvbiA9IGRpc3RhbmNlVG9MZWZ0RWRnZSA+PSBtZW51V2lkdGggPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgIH1cbiAgICAvLyBTaW5jZSBzY3JvbGxpbmcgd2lsbCBiZSBkaXNhYmxlZCBieSBhIGhvb2ssIHBvc3NpYmx5IG9uIHRoZSBib2R5LWVsZW1lbnQsXG4gICAgLy8gdGhlIGF2YWlsYWJsZSB2aWV3cG9ydC13aWR0aCBtaWdodCBjaGFuZ2UsIHRodXMsIHRoZSBwb3NpdGlvbmluZyBvZiB0aGVcbiAgICAvLyBtZW51IHdvdWxkIGJlIGFmZmVjdGVkLCBoZW5jZSB3ZSBuZWVkIHRvIGdldCB0aGUgc2Nyb2xsLXdpZHRoIGJlZm9yZSB0aGVcbiAgICAvLyBtZW51IHJlbmRlcnNcbiAgICBjb25zdCBzY3JvbGxXaWR0aEJlZm9yZSA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGg7XG5cbiAgICAvLyBVc2luZyBzZXRUaW1lb3V0IGFsbG93cyB1cyB0byBnZXQgdGhlIGNvcnJlY3QgZGltZW5zaW9ucyAmIHBvc2l0aW9uc1xuICAgIC8vIG9mIHRoZSB0cmlnZ2VyLSAmIG1lbnUtZWxlbWVudCBmaXJzdCBiZWZvcmUgZG9pbmcgdGhlIGNhbGN1bGF0aW9ucyBmb3JcbiAgICAvLyBwb3NpdGlvbmluZyB0aGUgbWVudSBjb3JyZWN0bHlcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIGEgc2Nyb2xsV2lkdGhEaWZmLCBpdCBtZWFucyB0aGF0IHRoZSB3aWR0aCBvZiB0aGVcbiAgICAgIC8vIHZpZXdwb3J0cyBoYXMgY2hhbmdlZCBkdWUgdG8gcmVtb3ZlZCBzY3JvbGxiYXJzLCBhbmQgd2UgbmVlZCB0b1xuICAgICAgLy8gYWRqdXN0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVudSB0byBiZSBzdGlsbCBwcm9wZXJseSBhbGlnbmVkIHdpdGhcbiAgICAgIC8vIHRoZSB0cmlnZ2VyXG4gICAgICBjb25zdCBzY3JvbGxXaWR0aERpZmYgPVxuICAgICAgICAoZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aCAtIHNjcm9sbFdpZHRoQmVmb3JlKSAqIDAuNTtcblxuICAgICAgaWYgKG1lbnVJc0V4Y2VlZGluZ1ZpZXdwb3J0KSB7XG4gICAgICAgIG1lbnVFbC5zdHlsZS5sZWZ0ID0gYGNhbGMoICR7b3V0ZXJNYXJnaW59ICsgJHtzY3JvbGxXaWR0aERpZmZ9cHgpYDtcbiAgICAgIH0gZWxzZSBpZiAobWVudVhQb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIG1lbnVFbC5zdHlsZS5sZWZ0ID0gYCR7dHJpZ2dlckRPTVJlY3QubGVmdCArIHNjcm9sbFdpZHRoRGlmZn1weGA7XG4gICAgICAgIG1lbnVFbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgncmlnaHQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lbnVFbC5zdHlsZS5yaWdodCA9IGAke1xuICAgICAgICAgIHdpbmRvdy5pbm5lcldpZHRoIC0gdHJpZ2dlckRPTVJlY3QucmlnaHQgLSBzY3JvbGxXaWR0aERpZmZcbiAgICAgICAgfXB4YDtcbiAgICAgICAgbWVudUVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdsZWZ0Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtZW51WVBvc2l0aW9uID09PSAnYmVsb3cnKSB7XG4gICAgICAgIG1lbnVFbC5zdHlsZS50b3AgPSBgY2FsYygke1xuICAgICAgICAgIHRyaWdnZXJET01SZWN0LnRvcCArIHRyaWdnZXJET01SZWN0LmhlaWdodFxuICAgICAgICB9cHggKyAke291dGVyTWFyZ2lufSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTmVlZCB0byByZS1yZXF1ZXN0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIGJlY2F1c2UgdGhlIG1lbnUgaGVpZ2h0XG4gICAgICAgIC8vIG1pZ2h0IGhhdmUgY2hhbmdlZCB3aGVuIHRoZSBkcm9wZG93biBpcyBpbiAnYXV0bycgbW9kZTtcbiAgICAgICAgbGV0IGRlc2lyZWRNZW51SGVpZ2h0ID1cbiAgICAgICAgICBtZW51TWF4SGVpZ2h0IHx8IG1lbnVFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG5cbiAgICAgICAgbWVudUVsLnN0eWxlLnRvcCA9IGBjYWxjKCR7XG4gICAgICAgICAgdHJpZ2dlckRPTVJlY3QudG9wIC0gZGVzaXJlZE1lbnVIZWlnaHRcbiAgICAgICAgfXB4IC0gJHtvdXRlck1hcmdpbn0pYDtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lbnVNYXhIZWlnaHQpIHtcbiAgICAgICAgLy8gQXBwbHkgdGhlIG1hbnVhbCBtYXgtd2lkdGhcbiAgICAgICAgbWVudUVsLnN0eWxlLm1heEhlaWdodCA9IG1lbnVNYXhIZWlnaHQgKyAncHgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIG1heC1oZWlnaHQgZG9lcyBub3QgZXhjZWVkIHRoZSBhdmFpbGFibGUgdG9wLSBvciBib3R0b20tc3BhY2VcbiAgICAgICAgbWVudUVsLnN0eWxlLm1heEhlaWdodCA9XG4gICAgICAgICAgbWVudVlQb3NpdGlvbiA9PT0gJ2JlbG93J1xuICAgICAgICAgICAgPyBgY2FsYygke1xuICAgICAgICAgICAgICAgIHdpbmRvdy5pbm5lckhlaWdodCAtIHRyaWdnZXJET01SZWN0LmJvdHRvbVxuICAgICAgICAgICAgICB9cHggLSAke291dGVyTWFyZ2lufSAtICR7Ym94U2hhZG93Qm90dG9tU2l6ZX0pYFxuICAgICAgICAgICAgOiBgY2FsYygke3RyaWdnZXJET01SZWN0LnRvcH1weCAtICR7b3V0ZXJNYXJnaW59IC0gJHtib3hTaGFkb3dCb3R0b21TaXplfSlgO1xuICAgICAgfVxuXG4gICAgICAvLyBBbGwgcG9zaXRpb25pbmcgb3BlcmF0aW9ucyBkb25lLCBtYWtlIG1lbnUgdmlzaWJsZSBhZ2FpblxuICAgICAgbWVudUVsLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgfSwgMCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgW1xuICAgICAgICAndG9wJyxcbiAgICAgICAgJ2xlZnQnLFxuICAgICAgICAncmlnaHQnLFxuICAgICAgICAnYm90dG9tJyxcbiAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICdtYXhIZWlnaHQnLFxuICAgICAgICAndmlzaWJpbGl0eScsXG4gICAgICBdLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgbWVudUVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3ApO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSwgW1xuICAgIHByb3BzLmlzT3BlbixcbiAgICBwcm9wcy5tZW51UG9zaXRpb24sXG4gICAgcHJvcHMudHJpZ2dlckVsZW1lbnRSZWYsXG4gICAgcHJvcHMubWVudU1heEhlaWdodCxcbiAgXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjc3M9e2dldERyb3Bkb3duTWVudUJhc2VTdHlsZXMocHJvcHMpfVxuICAgICAgc3R5bGU9e3Byb3BzLmN1c3RvbVN0eWxlc31cbiAgICAgIHJlZj17bWVudVJlZn1cbiAgICA+XG4gICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmV4cG9ydCB0eXBlIFREcm9wZG93bkNvbnRlbnRNZW51UHJvcHMgPSB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGhvcml6b250YWxDb25zdHJhaW50OiBUTWF4UHJvcDtcbiAgbWVudVBvc2l0aW9uOiAnbGVmdCcgfCAncmlnaHQnO1xuICBtZW51TWF4SGVpZ2h0PzogbnVtYmVyO1xuICBpc09wZW46IGJvb2xlYW47XG4gIHRyaWdnZXJFbGVtZW50UmVmOiBSZWZPYmplY3Q8SFRNTEVsZW1lbnQ+O1xufTtcbmV4cG9ydCBjb25zdCBEcm9wZG93bkNvbnRlbnRNZW51ID0gKHByb3BzOiBURHJvcGRvd25Db250ZW50TWVudVByb3BzKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duQmFzZU1lbnVcbiAgICAgIGN1c3RvbVN0eWxlcz17e1xuICAgICAgICBwYWRkaW5nOiBkZXNpZ25Ub2tlbnMuc3BhY2luZzMwLFxuICAgICAgfX1cbiAgICAgIGhvcml6b250YWxDb25zdHJhaW50PXtwcm9wcy5ob3Jpem9udGFsQ29uc3RyYWludH1cbiAgICAgIGlzT3Blbj17cHJvcHMuaXNPcGVufVxuICAgICAgbWVudVBvc2l0aW9uPXtwcm9wcy5tZW51UG9zaXRpb259XG4gICAgICBtZW51TWF4SGVpZ2h0PXtwcm9wcy5tZW51TWF4SGVpZ2h0fVxuICAgICAgdHJpZ2dlckVsZW1lbnRSZWY9e3Byb3BzLnRyaWdnZXJFbGVtZW50UmVmfVxuICAgID5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L0Ryb3Bkb3duQmFzZU1lbnU+XG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBURHJvcGRvd25MaXN0TWVudVByb3BzID0ge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICBob3Jpem9udGFsQ29uc3RyYWludDogVE1heFByb3A7XG4gIG1lbnVQb3NpdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JztcbiAgbWVudU1heEhlaWdodD86IG51bWJlcjtcbiAgaXNPcGVuOiBib29sZWFuO1xuICB0cmlnZ2VyRWxlbWVudFJlZjogUmVmT2JqZWN0PEhUTUxFbGVtZW50Pjtcbn07XG5leHBvcnQgY29uc3QgRHJvcGRvd25MaXN0TWVudSA9IChwcm9wczogVERyb3Bkb3duTGlzdE1lbnVQcm9wcykgPT4ge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bkJhc2VNZW51XG4gICAgICBob3Jpem9udGFsQ29uc3RyYWludD17cHJvcHMuaG9yaXpvbnRhbENvbnN0cmFpbnR9XG4gICAgICBpc09wZW49e3Byb3BzLmlzT3Blbn1cbiAgICAgIG1lbnVQb3NpdGlvbj17cHJvcHMubWVudVBvc2l0aW9ufVxuICAgICAgbWVudU1heEhlaWdodD17cHJvcHMubWVudU1heEhlaWdodH1cbiAgICAgIHRyaWdnZXJFbGVtZW50UmVmPXtwcm9wcy50cmlnZ2VyRWxlbWVudFJlZn1cbiAgICA+XG4gICAgICA8U3BhY2luZ3NTdGFjayBzY2FsZT1cInhzXCI+e3Byb3BzLmNoaWxkcmVufTwvU3BhY2luZ3NTdGFjaz5cbiAgICA8L0Ryb3Bkb3duQmFzZU1lbnU+XG4gICk7XG59O1xuIl19 */");
56
60
  }
57
61
  function DropdownBaseMenu(props) {
58
62
  const menuRef = react.useRef(null);
59
63
  react.useLayoutEffect(() => {
60
- // Update the position of the menu when it is open
61
- if (props.isOpen && props.triggerElementRef.current && menuRef.current) {
62
- var _context, _context2;
63
- const triggerElementCoordinates = props.triggerElementRef.current.getBoundingClientRect();
64
- menuRef.current.style.top = "".concat(triggerElementCoordinates.top + triggerElementCoordinates.height, "px");
65
- if (props.menuPosition === 'left') {
66
- menuRef.current.style.left = "".concat(triggerElementCoordinates.left, "px");
67
- menuRef.current.style.removeProperty('right');
64
+ if (!props.isOpen || !props.triggerElementRef.current || !menuRef.current) {
65
+ return;
66
+ }
67
+ const menuMaxHeight = props.menuMaxHeight;
68
+ const menuEl = menuRef.current;
69
+ const menuTriggerEl = props.triggerElementRef.current;
70
+ const menuDOMRect = menuEl.getBoundingClientRect();
71
+ const triggerDOMRect = menuTriggerEl.getBoundingClientRect();
72
+
73
+ // By default, the menu is not exceeding the viewport, this can change though
74
+ let menuIsExceedingViewport = false;
75
+ if (menuDOMRect.width >= document.body.scrollWidth) {
76
+ var _context;
77
+ // If the menu width is greater than the body width, we need to set the width of the menu to the body width
78
+ // to prevent the menu from overflowing, this happens usually when the horizontalConstraint is set to 'auto'
79
+ menuEl.style.width = _concatInstanceProperty__default["default"](_context = "calc(".concat(document.body.scrollWidth, "px - 2 * ")).call(_context, outerMargin, ")");
80
+ menuIsExceedingViewport = true;
81
+ }
82
+
83
+ // The preferred/ideal height of the menu (which might change later if there is
84
+ // not enough screen estate)
85
+ let desiredMenuHeight = menuMaxHeight || menuDOMRect.height;
86
+ const menuWidth = menuDOMRect.width;
87
+ const availableSpaceTop = triggerDOMRect.top;
88
+ const availableSpaceBottom = window.innerHeight - triggerDOMRect.bottom;
89
+
90
+ // Prefer rendering below the trigger element if there is enough space
91
+ // to display the whole menu, otherwise render wherever there is more space
92
+ const menuYPosition = availableSpaceBottom >= desiredMenuHeight ? 'below' : availableSpaceBottom > availableSpaceTop ? 'below' : 'above';
93
+ let menuXPosition;
94
+ if (props.menuPosition === 'left') {
95
+ const distanceToRightEdge = window.innerWidth - triggerDOMRect.left;
96
+ menuXPosition = distanceToRightEdge >= menuWidth ? 'left' : 'right';
97
+ }
98
+ if (props.menuPosition === 'right') {
99
+ const distanceToLeftEdge = triggerDOMRect.left + triggerDOMRect.width;
100
+ menuXPosition = distanceToLeftEdge >= menuWidth ? 'right' : 'left';
101
+ }
102
+ // Since scrolling will be disabled by a hook, possibly on the body-element,
103
+ // the available viewport-width might change, thus, the positioning of the
104
+ // menu would be affected, hence we need to get the scroll-width before the
105
+ // menu renders
106
+ const scrollWidthBefore = document.body.scrollWidth;
107
+
108
+ // Using setTimeout allows us to get the correct dimensions & positions
109
+ // of the trigger- & menu-element first before doing the calculations for
110
+ // positioning the menu correctly
111
+ _setTimeout__default["default"](() => {
112
+ // If there is a scrollWidthDiff, it means that the width of the
113
+ // viewports has changed due to removed scrollbars, and we need to
114
+ // adjust the position of the menu to be still properly aligned with
115
+ // the trigger
116
+ const scrollWidthDiff = (document.body.scrollWidth - scrollWidthBefore) * 0.5;
117
+ if (menuIsExceedingViewport) {
118
+ var _context2;
119
+ menuEl.style.left = _concatInstanceProperty__default["default"](_context2 = "calc( ".concat(outerMargin, " + ")).call(_context2, scrollWidthDiff, "px)");
120
+ } else if (menuXPosition === 'left') {
121
+ menuEl.style.left = "".concat(triggerDOMRect.left + scrollWidthDiff, "px");
122
+ menuEl.style.removeProperty('right');
68
123
  } else {
69
- menuRef.current.style.right = "".concat(window.innerWidth - triggerElementCoordinates.right, "px");
70
- menuRef.current.style.removeProperty('left');
124
+ menuEl.style.right = "".concat(window.innerWidth - triggerDOMRect.right - scrollWidthDiff, "px");
125
+ menuEl.style.removeProperty('left');
71
126
  }
72
- menuRef.current.style.maxHeight = props.menuMaxHeight ? "".concat(props.menuMaxHeight, "px") : _concatInstanceProperty__default["default"](_context = _concatInstanceProperty__default["default"](_context2 = "calc(".concat(window.innerHeight - (triggerElementCoordinates.top + triggerElementCoordinates.height), "px - ")).call(_context2, marginTop, " - ")).call(_context, boxShadowBottomSize, ")");
73
- }
127
+ if (menuYPosition === 'below') {
128
+ var _context3;
129
+ menuEl.style.top = _concatInstanceProperty__default["default"](_context3 = "calc(".concat(triggerDOMRect.top + triggerDOMRect.height, "px + ")).call(_context3, outerMargin, ")");
130
+ } else {
131
+ var _context4;
132
+ // Need to re-request getBoundingClientRect() because the menu height
133
+ // might have changed when the dropdown is in 'auto' mode;
134
+ let desiredMenuHeight = menuMaxHeight || menuEl.getBoundingClientRect().height;
135
+ menuEl.style.top = _concatInstanceProperty__default["default"](_context4 = "calc(".concat(triggerDOMRect.top - desiredMenuHeight, "px - ")).call(_context4, outerMargin, ")");
136
+ }
137
+ if (menuMaxHeight) {
138
+ // Apply the manual max-width
139
+ menuEl.style.maxHeight = menuMaxHeight + 'px';
140
+ } else {
141
+ var _context5, _context6, _context7, _context8;
142
+ // Make sure max-height does not exceed the available top- or bottom-space
143
+ menuEl.style.maxHeight = menuYPosition === 'below' ? _concatInstanceProperty__default["default"](_context5 = _concatInstanceProperty__default["default"](_context6 = "calc(".concat(window.innerHeight - triggerDOMRect.bottom, "px - ")).call(_context6, outerMargin, " - ")).call(_context5, boxShadowBottomSize, ")") : _concatInstanceProperty__default["default"](_context7 = _concatInstanceProperty__default["default"](_context8 = "calc(".concat(triggerDOMRect.top, "px - ")).call(_context8, outerMargin, " - ")).call(_context7, boxShadowBottomSize, ")");
144
+ }
145
+
146
+ // All positioning operations done, make menu visible again
147
+ menuEl.style.visibility = 'visible';
148
+ }, 0);
149
+ return () => {
150
+ var _context9;
151
+ _forEachInstanceProperty__default["default"](_context9 = ['top', 'left', 'right', 'bottom', 'width', 'height', 'maxHeight', 'visibility']).call(_context9, prop => {
152
+ menuEl.style.removeProperty(prop);
153
+ });
154
+ };
74
155
  }, [props.isOpen, props.menuPosition, props.triggerElementRef, props.menuMaxHeight]);
75
156
  return jsxRuntime.jsx("div", {
76
157
  css: getDropdownMenuBaseStyles(props),
@@ -266,7 +347,7 @@ DropdownMenu.defaultProps = defaultProps;
266
347
  DropdownMenu.ListMenuItem = DropdownListMenuItem;
267
348
 
268
349
  // NOTE: This string will be replaced on build time with the package version.
269
- var version = "19.4.0";
350
+ var version = "19.6.0";
270
351
 
271
352
  exports["default"] = DropdownMenu;
272
353
  exports.useDropdownMenuContext = useDropdownMenuContext;
@@ -9,6 +9,8 @@ var react = require('react');
9
9
  var hooks = require('@commercetools-uikit/hooks');
10
10
  var jsxRuntime = require('@emotion/react/jsx-runtime');
11
11
  var _concatInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/concat');
12
+ var _setTimeout = require('@babel/runtime-corejs3/core-js-stable/set-timeout');
13
+ var _forEachInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/for-each');
12
14
  var react$1 = require('@emotion/react');
13
15
  var designSystem = require('@commercetools-uikit/design-system');
14
16
  var Constraints = require('@commercetools-uikit/constraints');
@@ -19,6 +21,8 @@ function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e };
19
21
 
20
22
  var _styled__default = /*#__PURE__*/_interopDefault(_styled);
21
23
  var _concatInstanceProperty__default = /*#__PURE__*/_interopDefault(_concatInstanceProperty);
24
+ var _setTimeout__default = /*#__PURE__*/_interopDefault(_setTimeout);
25
+ var _forEachInstanceProperty__default = /*#__PURE__*/_interopDefault(_forEachInstanceProperty);
22
26
  var Constraints__default = /*#__PURE__*/_interopDefault(Constraints);
23
27
  var SpacingsStack__default = /*#__PURE__*/_interopDefault(SpacingsStack);
24
28
  var AccessibleButton__default = /*#__PURE__*/_interopDefault(AccessibleButton);
@@ -49,27 +53,104 @@ DropDownTrigger.displayName = 'DropDownTrigger';
49
53
  var DropdownTrigger = DropDownTrigger;
50
54
 
51
55
  const boxShadowBottomSize = '5px';
52
- const marginTop = designSystem.designTokens.spacing20;
56
+ const outerMargin = designSystem.designTokens.spacing20;
53
57
  function getDropdownMenuBaseStyles(params) {
54
- return /*#__PURE__*/react$1.css("background-color:", designSystem.designTokens.colorSurface, ";border:1px solid ", designSystem.designTokens.colorSurface, ";border-radius:", designSystem.designTokens.borderRadius4, ";box-shadow:0 2px ", boxShadowBottomSize, " 0px rgba(0, 0, 0, 0.15);display:", params.isOpen ? 'block' : 'none', ";margin-top:", marginTop, ";max-width:", Constraints__default["default"].getMaxPropTokenValue(params.horizontalConstraint), ";overflow-y:auto;position:fixed;width:", params.horizontalConstraint === 'auto' ? 'auto' : '100%', ";z-index:5;" + ("" ), "" );
58
+ return /*#__PURE__*/react$1.css("background-color:", designSystem.designTokens.colorSurface, ";border:1px solid ", designSystem.designTokens.colorSurface, ";border-radius:", designSystem.designTokens.borderRadius4, ";box-shadow:0 2px ", boxShadowBottomSize, " 0px rgba(0, 0, 0, 0.15);display:", params.isOpen ? 'block' : 'none', ";max-width:", Constraints__default["default"].getMaxPropTokenValue(params.horizontalConstraint), ";overflow-y:auto;position:fixed;visibility:hidden;width:", params.horizontalConstraint === 'auto' ? 'auto' : '100%', ";z-index:1;" + ("" ), "" );
55
59
  }
56
60
  function DropdownBaseMenu(props) {
57
61
  const menuRef = react.useRef(null);
58
62
  react.useLayoutEffect(() => {
59
- // Update the position of the menu when it is open
60
- if (props.isOpen && props.triggerElementRef.current && menuRef.current) {
61
- var _context, _context2;
62
- const triggerElementCoordinates = props.triggerElementRef.current.getBoundingClientRect();
63
- menuRef.current.style.top = "".concat(triggerElementCoordinates.top + triggerElementCoordinates.height, "px");
64
- if (props.menuPosition === 'left') {
65
- menuRef.current.style.left = "".concat(triggerElementCoordinates.left, "px");
66
- menuRef.current.style.removeProperty('right');
63
+ if (!props.isOpen || !props.triggerElementRef.current || !menuRef.current) {
64
+ return;
65
+ }
66
+ const menuMaxHeight = props.menuMaxHeight;
67
+ const menuEl = menuRef.current;
68
+ const menuTriggerEl = props.triggerElementRef.current;
69
+ const menuDOMRect = menuEl.getBoundingClientRect();
70
+ const triggerDOMRect = menuTriggerEl.getBoundingClientRect();
71
+
72
+ // By default, the menu is not exceeding the viewport, this can change though
73
+ let menuIsExceedingViewport = false;
74
+ if (menuDOMRect.width >= document.body.scrollWidth) {
75
+ var _context;
76
+ // If the menu width is greater than the body width, we need to set the width of the menu to the body width
77
+ // to prevent the menu from overflowing, this happens usually when the horizontalConstraint is set to 'auto'
78
+ menuEl.style.width = _concatInstanceProperty__default["default"](_context = "calc(".concat(document.body.scrollWidth, "px - 2 * ")).call(_context, outerMargin, ")");
79
+ menuIsExceedingViewport = true;
80
+ }
81
+
82
+ // The preferred/ideal height of the menu (which might change later if there is
83
+ // not enough screen estate)
84
+ let desiredMenuHeight = menuMaxHeight || menuDOMRect.height;
85
+ const menuWidth = menuDOMRect.width;
86
+ const availableSpaceTop = triggerDOMRect.top;
87
+ const availableSpaceBottom = window.innerHeight - triggerDOMRect.bottom;
88
+
89
+ // Prefer rendering below the trigger element if there is enough space
90
+ // to display the whole menu, otherwise render wherever there is more space
91
+ const menuYPosition = availableSpaceBottom >= desiredMenuHeight ? 'below' : availableSpaceBottom > availableSpaceTop ? 'below' : 'above';
92
+ let menuXPosition;
93
+ if (props.menuPosition === 'left') {
94
+ const distanceToRightEdge = window.innerWidth - triggerDOMRect.left;
95
+ menuXPosition = distanceToRightEdge >= menuWidth ? 'left' : 'right';
96
+ }
97
+ if (props.menuPosition === 'right') {
98
+ const distanceToLeftEdge = triggerDOMRect.left + triggerDOMRect.width;
99
+ menuXPosition = distanceToLeftEdge >= menuWidth ? 'right' : 'left';
100
+ }
101
+ // Since scrolling will be disabled by a hook, possibly on the body-element,
102
+ // the available viewport-width might change, thus, the positioning of the
103
+ // menu would be affected, hence we need to get the scroll-width before the
104
+ // menu renders
105
+ const scrollWidthBefore = document.body.scrollWidth;
106
+
107
+ // Using setTimeout allows us to get the correct dimensions & positions
108
+ // of the trigger- & menu-element first before doing the calculations for
109
+ // positioning the menu correctly
110
+ _setTimeout__default["default"](() => {
111
+ // If there is a scrollWidthDiff, it means that the width of the
112
+ // viewports has changed due to removed scrollbars, and we need to
113
+ // adjust the position of the menu to be still properly aligned with
114
+ // the trigger
115
+ const scrollWidthDiff = (document.body.scrollWidth - scrollWidthBefore) * 0.5;
116
+ if (menuIsExceedingViewport) {
117
+ var _context2;
118
+ menuEl.style.left = _concatInstanceProperty__default["default"](_context2 = "calc( ".concat(outerMargin, " + ")).call(_context2, scrollWidthDiff, "px)");
119
+ } else if (menuXPosition === 'left') {
120
+ menuEl.style.left = "".concat(triggerDOMRect.left + scrollWidthDiff, "px");
121
+ menuEl.style.removeProperty('right');
67
122
  } else {
68
- menuRef.current.style.right = "".concat(window.innerWidth - triggerElementCoordinates.right, "px");
69
- menuRef.current.style.removeProperty('left');
123
+ menuEl.style.right = "".concat(window.innerWidth - triggerDOMRect.right - scrollWidthDiff, "px");
124
+ menuEl.style.removeProperty('left');
70
125
  }
71
- menuRef.current.style.maxHeight = props.menuMaxHeight ? "".concat(props.menuMaxHeight, "px") : _concatInstanceProperty__default["default"](_context = _concatInstanceProperty__default["default"](_context2 = "calc(".concat(window.innerHeight - (triggerElementCoordinates.top + triggerElementCoordinates.height), "px - ")).call(_context2, marginTop, " - ")).call(_context, boxShadowBottomSize, ")");
72
- }
126
+ if (menuYPosition === 'below') {
127
+ var _context3;
128
+ menuEl.style.top = _concatInstanceProperty__default["default"](_context3 = "calc(".concat(triggerDOMRect.top + triggerDOMRect.height, "px + ")).call(_context3, outerMargin, ")");
129
+ } else {
130
+ var _context4;
131
+ // Need to re-request getBoundingClientRect() because the menu height
132
+ // might have changed when the dropdown is in 'auto' mode;
133
+ let desiredMenuHeight = menuMaxHeight || menuEl.getBoundingClientRect().height;
134
+ menuEl.style.top = _concatInstanceProperty__default["default"](_context4 = "calc(".concat(triggerDOMRect.top - desiredMenuHeight, "px - ")).call(_context4, outerMargin, ")");
135
+ }
136
+ if (menuMaxHeight) {
137
+ // Apply the manual max-width
138
+ menuEl.style.maxHeight = menuMaxHeight + 'px';
139
+ } else {
140
+ var _context5, _context6, _context7, _context8;
141
+ // Make sure max-height does not exceed the available top- or bottom-space
142
+ menuEl.style.maxHeight = menuYPosition === 'below' ? _concatInstanceProperty__default["default"](_context5 = _concatInstanceProperty__default["default"](_context6 = "calc(".concat(window.innerHeight - triggerDOMRect.bottom, "px - ")).call(_context6, outerMargin, " - ")).call(_context5, boxShadowBottomSize, ")") : _concatInstanceProperty__default["default"](_context7 = _concatInstanceProperty__default["default"](_context8 = "calc(".concat(triggerDOMRect.top, "px - ")).call(_context8, outerMargin, " - ")).call(_context7, boxShadowBottomSize, ")");
143
+ }
144
+
145
+ // All positioning operations done, make menu visible again
146
+ menuEl.style.visibility = 'visible';
147
+ }, 0);
148
+ return () => {
149
+ var _context9;
150
+ _forEachInstanceProperty__default["default"](_context9 = ['top', 'left', 'right', 'bottom', 'width', 'height', 'maxHeight', 'visibility']).call(_context9, prop => {
151
+ menuEl.style.removeProperty(prop);
152
+ });
153
+ };
73
154
  }, [props.isOpen, props.menuPosition, props.triggerElementRef, props.menuMaxHeight]);
74
155
  return jsxRuntime.jsx("div", {
75
156
  css: getDropdownMenuBaseStyles(props),
@@ -227,7 +308,7 @@ DropdownMenu.defaultProps = defaultProps;
227
308
  DropdownMenu.ListMenuItem = DropdownListMenuItem;
228
309
 
229
310
  // NOTE: This string will be replaced on build time with the package version.
230
- var version = "19.4.0";
311
+ var version = "19.6.0";
231
312
 
232
313
  exports["default"] = DropdownMenu;
233
314
  exports.useDropdownMenuContext = useDropdownMenuContext;
@@ -5,6 +5,8 @@ import { useContext, createContext, forwardRef, useRef, useLayoutEffect, useMemo
5
5
  import { useToggleState } from '@commercetools-uikit/hooks';
6
6
  import { jsx, jsxs } from '@emotion/react/jsx-runtime';
7
7
  import _concatInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/concat';
8
+ import _setTimeout from '@babel/runtime-corejs3/core-js-stable/set-timeout';
9
+ import _forEachInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/for-each';
8
10
  import { css } from '@emotion/react';
9
11
  import { designTokens } from '@commercetools-uikit/design-system';
10
12
  import Constraints from '@commercetools-uikit/constraints';
@@ -37,27 +39,104 @@ DropDownTrigger.displayName = 'DropDownTrigger';
37
39
  var DropdownTrigger = DropDownTrigger;
38
40
 
39
41
  const boxShadowBottomSize = '5px';
40
- const marginTop = designTokens.spacing20;
42
+ const outerMargin = designTokens.spacing20;
41
43
  function getDropdownMenuBaseStyles(params) {
42
- return /*#__PURE__*/css("background-color:", designTokens.colorSurface, ";border:1px solid ", designTokens.colorSurface, ";border-radius:", designTokens.borderRadius4, ";box-shadow:0 2px ", boxShadowBottomSize, " 0px rgba(0, 0, 0, 0.15);display:", params.isOpen ? 'block' : 'none', ";margin-top:", marginTop, ";max-width:", Constraints.getMaxPropTokenValue(params.horizontalConstraint), ";overflow-y:auto;position:fixed;width:", params.horizontalConstraint === 'auto' ? 'auto' : '100%', ";z-index:5;" + (process.env.NODE_ENV === "production" ? "" : ";label:getDropdownMenuBaseStyles;"), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyb3Bkb3duLW1lbnUtbWVudS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0JZIiwiZmlsZSI6ImRyb3Bkb3duLW1lbnUtbWVudS50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDU1NQcm9wZXJ0aWVzLFxuICBSZWFjdE5vZGUsXG4gIFJlZk9iamVjdCxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VSZWYsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNzcyB9IGZyb20gJ0BlbW90aW9uL3JlYWN0JztcbmltcG9ydCB7IGRlc2lnblRva2VucyB9IGZyb20gJ0Bjb21tZXJjZXRvb2xzLXVpa2l0L2Rlc2lnbi1zeXN0ZW0nO1xuaW1wb3J0IENvbnN0cmFpbnRzLCB7IHR5cGUgVE1heFByb3AgfSBmcm9tICdAY29tbWVyY2V0b29scy11aWtpdC9jb25zdHJhaW50cyc7XG5pbXBvcnQgU3BhY2luZ3NTdGFjayBmcm9tICdAY29tbWVyY2V0b29scy11aWtpdC9zcGFjaW5ncy1zdGFjayc7XG5cbi8vIFdlIGRlY2xhcmUgdGhpcyBzdHlsZSBwcm9wZXJ0aWVzIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRoZW0gYm90aCBmb3IgaW5pdGlhbCBjb21wb25lbnQgc3R5bGluZ1xuLy8gYnV0IGFsc28gZm9yIGNhbGN1bGF0aW5nIHRoZSBkZWZhdWx0IG1heCBoZWlnaHQgb2YgdGhlIGRyb3Bkb3duIG1lbnUgc28gd2UgbWFrZSBzdXJlIGl0IGZpdHNcbi8vIHdpdGhpbiB0aGUgdmlld3BvcnQuXG5jb25zdCBib3hTaGFkb3dCb3R0b21TaXplID0gJzVweCc7XG5jb25zdCBtYXJnaW5Ub3AgPSBkZXNpZ25Ub2tlbnMuc3BhY2luZzIwO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHJvcGRvd25NZW51QmFzZVN0eWxlcyhwYXJhbXM6IHtcbiAgaXNPcGVuOiBib29sZWFuO1xuICBob3Jpem9udGFsQ29uc3RyYWludDogVE1heFByb3A7XG59KSB7XG4gIHJldHVybiBjc3NgXG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtkZXNpZ25Ub2tlbnMuY29sb3JTdXJmYWNlfTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAke2Rlc2lnblRva2Vucy5jb2xvclN1cmZhY2V9O1xuICAgIGJvcmRlci1yYWRpdXM6ICR7ZGVzaWduVG9rZW5zLmJvcmRlclJhZGl1czR9O1xuICAgIGJveC1zaGFkb3c6IDAgMnB4ICR7Ym94U2hhZG93Qm90dG9tU2l6ZX0gMHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gICAgZGlzcGxheTogJHtwYXJhbXMuaXNPcGVuID8gJ2Jsb2NrJyA6ICdub25lJ307XG4gICAgbWFyZ2luLXRvcDogJHttYXJnaW5Ub3B9O1xuICAgIG1heC13aWR0aDogJHtDb25zdHJhaW50cy5nZXRNYXhQcm9wVG9rZW5WYWx1ZShwYXJhbXMuaG9yaXpvbnRhbENvbnN0cmFpbnQpfTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB3aWR0aDogJHtwYXJhbXMuaG9yaXpvbnRhbENvbnN0cmFpbnQgPT09ICdhdXRvJyA/ICdhdXRvJyA6ICcxMDAlJ307XG4gICAgei1pbmRleDogNTtcbiAgYDtcbn1cblxudHlwZSBURHJvcGRvd25CYXNlTWVudVByb3BzID0ge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICBjdXN0b21TdHlsZXM/OiBDU1NQcm9wZXJ0aWVzO1xuICBob3Jpem9udGFsQ29uc3RyYWludDogVE1heFByb3A7XG4gIGlzT3BlbjogYm9vbGVhbjtcbiAgbWVudVBvc2l0aW9uOiAnbGVmdCcgfCAncmlnaHQnO1xuICBtZW51TWF4SGVpZ2h0PzogbnVtYmVyO1xuICB0cmlnZ2VyRWxlbWVudFJlZjogUmVmT2JqZWN0PEhUTUxFbGVtZW50Pjtcbn07XG5mdW5jdGlvbiBEcm9wZG93bkJhc2VNZW51KHByb3BzOiBURHJvcGRvd25CYXNlTWVudVByb3BzKSB7XG4gIGNvbnN0IG1lbnVSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgLy8gVXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVudSB3aGVuIGl0IGlzIG9wZW5cbiAgICBpZiAocHJvcHMuaXNPcGVuICYmIHByb3BzLnRyaWdnZXJFbGVtZW50UmVmLmN1cnJlbnQgJiYgbWVudVJlZi5jdXJyZW50KSB7XG4gICAgICBjb25zdCB0cmlnZ2VyRWxlbWVudENvb3JkaW5hdGVzID1cbiAgICAgICAgcHJvcHMudHJpZ2dlckVsZW1lbnRSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgbWVudVJlZi5jdXJyZW50LnN0eWxlLnRvcCA9IGAke1xuICAgICAgICB0cmlnZ2VyRWxlbWVudENvb3JkaW5hdGVzLnRvcCArIHRyaWdnZXJFbGVtZW50Q29vcmRpbmF0ZXMuaGVpZ2h0XG4gICAgICB9cHhgO1xuICAgICAgaWYgKHByb3BzLm1lbnVQb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIG1lbnVSZWYuY3VycmVudC5zdHlsZS5sZWZ0ID0gYCR7dHJpZ2dlckVsZW1lbnRDb29yZGluYXRlcy5sZWZ0fXB4YDtcbiAgICAgICAgbWVudVJlZi5jdXJyZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdyaWdodCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVudVJlZi5jdXJyZW50LnN0eWxlLnJpZ2h0ID0gYCR7XG4gICAgICAgICAgd2luZG93LmlubmVyV2lkdGggLSB0cmlnZ2VyRWxlbWVudENvb3JkaW5hdGVzLnJpZ2h0XG4gICAgICAgIH1weGA7XG4gICAgICAgIG1lbnVSZWYuY3VycmVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO1xuICAgICAgfVxuICAgICAgbWVudVJlZi5jdXJyZW50LnN0eWxlLm1heEhlaWdodCA9IHByb3BzLm1lbnVNYXhIZWlnaHRcbiAgICAgICAgPyBgJHtwcm9wcy5tZW51TWF4SGVpZ2h0fXB4YFxuICAgICAgICA6IGBjYWxjKCR7XG4gICAgICAgICAgICB3aW5kb3cuaW5uZXJIZWlnaHQgLVxuICAgICAgICAgICAgKHRyaWdnZXJFbGVtZW50Q29vcmRpbmF0ZXMudG9wICsgdHJpZ2dlckVsZW1lbnRDb29yZGluYXRlcy5oZWlnaHQpXG4gICAgICAgICAgfXB4IC0gJHttYXJnaW5Ub3B9IC0gJHtib3hTaGFkb3dCb3R0b21TaXplfSlgO1xuICAgIH1cbiAgfSwgW1xuICAgIHByb3BzLmlzT3BlbixcbiAgICBwcm9wcy5tZW51UG9zaXRpb24sXG4gICAgcHJvcHMudHJpZ2dlckVsZW1lbnRSZWYsXG4gICAgcHJvcHMubWVudU1heEhlaWdodCxcbiAgXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjc3M9e2dldERyb3Bkb3duTWVudUJhc2VTdHlsZXMocHJvcHMpfVxuICAgICAgc3R5bGU9e3Byb3BzLmN1c3RvbVN0eWxlc31cbiAgICAgIHJlZj17bWVudVJlZn1cbiAgICA+XG4gICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmV4cG9ydCB0eXBlIFREcm9wZG93bkNvbnRlbnRNZW51UHJvcHMgPSB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGhvcml6b250YWxDb25zdHJhaW50OiBUTWF4UHJvcDtcbiAgbWVudVBvc2l0aW9uOiAnbGVmdCcgfCAncmlnaHQnO1xuICBtZW51TWF4SGVpZ2h0PzogbnVtYmVyO1xuICBpc09wZW46IGJvb2xlYW47XG4gIHRyaWdnZXJFbGVtZW50UmVmOiBSZWZPYmplY3Q8SFRNTEVsZW1lbnQ+O1xufTtcbmV4cG9ydCBjb25zdCBEcm9wZG93bkNvbnRlbnRNZW51ID0gKHByb3BzOiBURHJvcGRvd25Db250ZW50TWVudVByb3BzKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duQmFzZU1lbnVcbiAgICAgIGN1c3RvbVN0eWxlcz17e1xuICAgICAgICBwYWRkaW5nOiBkZXNpZ25Ub2tlbnMuc3BhY2luZzMwLFxuICAgICAgfX1cbiAgICAgIGhvcml6b250YWxDb25zdHJhaW50PXtwcm9wcy5ob3Jpem9udGFsQ29uc3RyYWludH1cbiAgICAgIGlzT3Blbj17cHJvcHMuaXNPcGVufVxuICAgICAgbWVudVBvc2l0aW9uPXtwcm9wcy5tZW51UG9zaXRpb259XG4gICAgICBtZW51TWF4SGVpZ2h0PXtwcm9wcy5tZW51TWF4SGVpZ2h0fVxuICAgICAgdHJpZ2dlckVsZW1lbnRSZWY9e3Byb3BzLnRyaWdnZXJFbGVtZW50UmVmfVxuICAgID5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L0Ryb3Bkb3duQmFzZU1lbnU+XG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBURHJvcGRvd25MaXN0TWVudVByb3BzID0ge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICBob3Jpem9udGFsQ29uc3RyYWludDogVE1heFByb3A7XG4gIG1lbnVQb3NpdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JztcbiAgbWVudU1heEhlaWdodD86IG51bWJlcjtcbiAgaXNPcGVuOiBib29sZWFuO1xuICB0cmlnZ2VyRWxlbWVudFJlZjogUmVmT2JqZWN0PEhUTUxFbGVtZW50Pjtcbn07XG5leHBvcnQgY29uc3QgRHJvcGRvd25MaXN0TWVudSA9IChwcm9wczogVERyb3Bkb3duTGlzdE1lbnVQcm9wcykgPT4ge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bkJhc2VNZW51XG4gICAgICBob3Jpem9udGFsQ29uc3RyYWludD17cHJvcHMuaG9yaXpvbnRhbENvbnN0cmFpbnR9XG4gICAgICBpc09wZW49e3Byb3BzLmlzT3Blbn1cbiAgICAgIG1lbnVQb3NpdGlvbj17cHJvcHMubWVudVBvc2l0aW9ufVxuICAgICAgbWVudU1heEhlaWdodD17cHJvcHMubWVudU1heEhlaWdodH1cbiAgICAgIHRyaWdnZXJFbGVtZW50UmVmPXtwcm9wcy50cmlnZ2VyRWxlbWVudFJlZn1cbiAgICA+XG4gICAgICA8U3BhY2luZ3NTdGFjayBzY2FsZT1cInhzXCI+e3Byb3BzLmNoaWxkcmVufTwvU3BhY2luZ3NTdGFjaz5cbiAgICA8L0Ryb3Bkb3duQmFzZU1lbnU+XG4gICk7XG59O1xuIl19 */");
44
+ return /*#__PURE__*/css("background-color:", designTokens.colorSurface, ";border:1px solid ", designTokens.colorSurface, ";border-radius:", designTokens.borderRadius4, ";box-shadow:0 2px ", boxShadowBottomSize, " 0px rgba(0, 0, 0, 0.15);display:", params.isOpen ? 'block' : 'none', ";max-width:", Constraints.getMaxPropTokenValue(params.horizontalConstraint), ";overflow-y:auto;position:fixed;visibility:hidden;width:", params.horizontalConstraint === 'auto' ? 'auto' : '100%', ";z-index:1;" + (process.env.NODE_ENV === "production" ? "" : ";label:getDropdownMenuBaseStyles;"), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyb3Bkb3duLW1lbnUtbWVudS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0JZIiwiZmlsZSI6ImRyb3Bkb3duLW1lbnUtbWVudS50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDU1NQcm9wZXJ0aWVzLFxuICBSZWFjdE5vZGUsXG4gIFJlZk9iamVjdCxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VSZWYsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNzcyB9IGZyb20gJ0BlbW90aW9uL3JlYWN0JztcbmltcG9ydCB7IGRlc2lnblRva2VucyB9IGZyb20gJ0Bjb21tZXJjZXRvb2xzLXVpa2l0L2Rlc2lnbi1zeXN0ZW0nO1xuaW1wb3J0IENvbnN0cmFpbnRzLCB7IHR5cGUgVE1heFByb3AgfSBmcm9tICdAY29tbWVyY2V0b29scy11aWtpdC9jb25zdHJhaW50cyc7XG5pbXBvcnQgU3BhY2luZ3NTdGFjayBmcm9tICdAY29tbWVyY2V0b29scy11aWtpdC9zcGFjaW5ncy1zdGFjayc7XG5cbi8vIFdlIGRlY2xhcmUgdGhpcyBzdHlsZSBwcm9wZXJ0aWVzIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRoZW0gYm90aCBmb3IgaW5pdGlhbCBjb21wb25lbnQgc3R5bGluZ1xuLy8gYnV0IGFsc28gZm9yIGNhbGN1bGF0aW5nIHRoZSBkZWZhdWx0IG1heCBoZWlnaHQgb2YgdGhlIGRyb3Bkb3duIG1lbnUgc28gd2UgbWFrZSBzdXJlIGl0IGZpdHNcbi8vIHdpdGhpbiB0aGUgdmlld3BvcnQuXG5jb25zdCBib3hTaGFkb3dCb3R0b21TaXplID0gJzVweCc7XG5jb25zdCBvdXRlck1hcmdpbiA9IGRlc2lnblRva2Vucy5zcGFjaW5nMjA7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREcm9wZG93bk1lbnVCYXNlU3R5bGVzKHBhcmFtczoge1xuICBpc09wZW46IGJvb2xlYW47XG4gIGhvcml6b250YWxDb25zdHJhaW50OiBUTWF4UHJvcDtcbn0pIHtcbiAgcmV0dXJuIGNzc2BcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2Rlc2lnblRva2Vucy5jb2xvclN1cmZhY2V9O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICR7ZGVzaWduVG9rZW5zLmNvbG9yU3VyZmFjZX07XG4gICAgYm9yZGVyLXJhZGl1czogJHtkZXNpZ25Ub2tlbnMuYm9yZGVyUmFkaXVzNH07XG4gICAgYm94LXNoYWRvdzogMCAycHggJHtib3hTaGFkb3dCb3R0b21TaXplfSAwcHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgICBkaXNwbGF5OiAke3BhcmFtcy5pc09wZW4gPyAnYmxvY2snIDogJ25vbmUnfTtcbiAgICBtYXgtd2lkdGg6ICR7Q29uc3RyYWludHMuZ2V0TWF4UHJvcFRva2VuVmFsdWUocGFyYW1zLmhvcml6b250YWxDb25zdHJhaW50KX07XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIHdpZHRoOiAke3BhcmFtcy5ob3Jpem9udGFsQ29uc3RyYWludCA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogJzEwMCUnfTtcbiAgICB6LWluZGV4OiAxO1xuICBgO1xufVxuXG50eXBlIFREcm9wZG93bkJhc2VNZW51UHJvcHMgPSB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGN1c3RvbVN0eWxlcz86IENTU1Byb3BlcnRpZXM7XG4gIGhvcml6b250YWxDb25zdHJhaW50OiBUTWF4UHJvcDtcbiAgaXNPcGVuOiBib29sZWFuO1xuICBtZW51UG9zaXRpb246ICdsZWZ0JyB8ICdyaWdodCc7XG4gIG1lbnVNYXhIZWlnaHQ/OiBudW1iZXI7XG4gIHRyaWdnZXJFbGVtZW50UmVmOiBSZWZPYmplY3Q8SFRNTEVsZW1lbnQ+O1xufTtcbmZ1bmN0aW9uIERyb3Bkb3duQmFzZU1lbnUocHJvcHM6IFREcm9wZG93bkJhc2VNZW51UHJvcHMpIHtcbiAgY29uc3QgbWVudVJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXByb3BzLmlzT3BlbiB8fCAhcHJvcHMudHJpZ2dlckVsZW1lbnRSZWYuY3VycmVudCB8fCAhbWVudVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVudU1heEhlaWdodCA9IHByb3BzLm1lbnVNYXhIZWlnaHQ7XG4gICAgY29uc3QgbWVudUVsID0gbWVudVJlZi5jdXJyZW50O1xuICAgIGNvbnN0IG1lbnVUcmlnZ2VyRWwgPSBwcm9wcy50cmlnZ2VyRWxlbWVudFJlZi5jdXJyZW50O1xuXG4gICAgY29uc3QgbWVudURPTVJlY3QgPSBtZW51RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdHJpZ2dlckRPTVJlY3QgPSBtZW51VHJpZ2dlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgLy8gQnkgZGVmYXVsdCwgdGhlIG1lbnUgaXMgbm90IGV4Y2VlZGluZyB0aGUgdmlld3BvcnQsIHRoaXMgY2FuIGNoYW5nZSB0aG91Z2hcbiAgICBsZXQgbWVudUlzRXhjZWVkaW5nVmlld3BvcnQgPSBmYWxzZTtcblxuICAgIGlmIChtZW51RE9NUmVjdC53aWR0aCA+PSBkb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoKSB7XG4gICAgICAvLyBJZiB0aGUgbWVudSB3aWR0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGJvZHkgd2lkdGgsIHdlIG5lZWQgdG8gc2V0IHRoZSB3aWR0aCBvZiB0aGUgbWVudSB0byB0aGUgYm9keSB3aWR0aFxuICAgICAgLy8gdG8gcHJldmVudCB0aGUgbWVudSBmcm9tIG92ZXJmbG93aW5nLCB0aGlzIGhhcHBlbnMgdXN1YWxseSB3aGVuIHRoZSBob3Jpem9udGFsQ29uc3RyYWludCBpcyBzZXQgdG8gJ2F1dG8nXG4gICAgICBtZW51RWwuc3R5bGUud2lkdGggPSBgY2FsYygke2RvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGh9cHggLSAyICogJHtvdXRlck1hcmdpbn0pYDtcbiAgICAgIG1lbnVJc0V4Y2VlZGluZ1ZpZXdwb3J0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcHJlZmVycmVkL2lkZWFsIGhlaWdodCBvZiB0aGUgbWVudSAod2hpY2ggbWlnaHQgY2hhbmdlIGxhdGVyIGlmIHRoZXJlIGlzXG4gICAgLy8gbm90IGVub3VnaCBzY3JlZW4gZXN0YXRlKVxuICAgIGxldCBkZXNpcmVkTWVudUhlaWdodCA9IG1lbnVNYXhIZWlnaHQgfHwgbWVudURPTVJlY3QuaGVpZ2h0O1xuICAgIGNvbnN0IG1lbnVXaWR0aCA9IG1lbnVET01SZWN0LndpZHRoO1xuXG4gICAgY29uc3QgYXZhaWxhYmxlU3BhY2VUb3AgPSB0cmlnZ2VyRE9NUmVjdC50b3A7XG4gICAgY29uc3QgYXZhaWxhYmxlU3BhY2VCb3R0b20gPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0cmlnZ2VyRE9NUmVjdC5ib3R0b207XG5cbiAgICAvLyBQcmVmZXIgcmVuZGVyaW5nIGJlbG93IHRoZSB0cmlnZ2VyIGVsZW1lbnQgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlXG4gICAgLy8gdG8gZGlzcGxheSB0aGUgd2hvbGUgbWVudSwgb3RoZXJ3aXNlIHJlbmRlciB3aGVyZXZlciB0aGVyZSBpcyBtb3JlIHNwYWNlXG4gICAgY29uc3QgbWVudVlQb3NpdGlvbiA9XG4gICAgICBhdmFpbGFibGVTcGFjZUJvdHRvbSA+PSBkZXNpcmVkTWVudUhlaWdodFxuICAgICAgICA/ICdiZWxvdydcbiAgICAgICAgOiBhdmFpbGFibGVTcGFjZUJvdHRvbSA+IGF2YWlsYWJsZVNwYWNlVG9wXG4gICAgICAgID8gJ2JlbG93J1xuICAgICAgICA6ICdhYm92ZSc7XG5cbiAgICBsZXQgbWVudVhQb3NpdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JztcblxuICAgIGlmIChwcm9wcy5tZW51UG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgY29uc3QgZGlzdGFuY2VUb1JpZ2h0RWRnZSA9IHdpbmRvdy5pbm5lcldpZHRoIC0gdHJpZ2dlckRPTVJlY3QubGVmdDtcbiAgICAgIG1lbnVYUG9zaXRpb24gPSBkaXN0YW5jZVRvUmlnaHRFZGdlID49IG1lbnVXaWR0aCA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm1lbnVQb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgY29uc3QgZGlzdGFuY2VUb0xlZnRFZGdlID0gdHJpZ2dlckRPTVJlY3QubGVmdCArIHRyaWdnZXJET01SZWN0LndpZHRoO1xuICAgICAgbWVudVhQb3NpdGlvbiA9IGRpc3RhbmNlVG9MZWZ0RWRnZSA+PSBtZW51V2lkdGggPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgIH1cbiAgICAvLyBTaW5jZSBzY3JvbGxpbmcgd2lsbCBiZSBkaXNhYmxlZCBieSBhIGhvb2ssIHBvc3NpYmx5IG9uIHRoZSBib2R5LWVsZW1lbnQsXG4gICAgLy8gdGhlIGF2YWlsYWJsZSB2aWV3cG9ydC13aWR0aCBtaWdodCBjaGFuZ2UsIHRodXMsIHRoZSBwb3NpdGlvbmluZyBvZiB0aGVcbiAgICAvLyBtZW51IHdvdWxkIGJlIGFmZmVjdGVkLCBoZW5jZSB3ZSBuZWVkIHRvIGdldCB0aGUgc2Nyb2xsLXdpZHRoIGJlZm9yZSB0aGVcbiAgICAvLyBtZW51IHJlbmRlcnNcbiAgICBjb25zdCBzY3JvbGxXaWR0aEJlZm9yZSA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGg7XG5cbiAgICAvLyBVc2luZyBzZXRUaW1lb3V0IGFsbG93cyB1cyB0byBnZXQgdGhlIGNvcnJlY3QgZGltZW5zaW9ucyAmIHBvc2l0aW9uc1xuICAgIC8vIG9mIHRoZSB0cmlnZ2VyLSAmIG1lbnUtZWxlbWVudCBmaXJzdCBiZWZvcmUgZG9pbmcgdGhlIGNhbGN1bGF0aW9ucyBmb3JcbiAgICAvLyBwb3NpdGlvbmluZyB0aGUgbWVudSBjb3JyZWN0bHlcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIGEgc2Nyb2xsV2lkdGhEaWZmLCBpdCBtZWFucyB0aGF0IHRoZSB3aWR0aCBvZiB0aGVcbiAgICAgIC8vIHZpZXdwb3J0cyBoYXMgY2hhbmdlZCBkdWUgdG8gcmVtb3ZlZCBzY3JvbGxiYXJzLCBhbmQgd2UgbmVlZCB0b1xuICAgICAgLy8gYWRqdXN0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVudSB0byBiZSBzdGlsbCBwcm9wZXJseSBhbGlnbmVkIHdpdGhcbiAgICAgIC8vIHRoZSB0cmlnZ2VyXG4gICAgICBjb25zdCBzY3JvbGxXaWR0aERpZmYgPVxuICAgICAgICAoZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aCAtIHNjcm9sbFdpZHRoQmVmb3JlKSAqIDAuNTtcblxuICAgICAgaWYgKG1lbnVJc0V4Y2VlZGluZ1ZpZXdwb3J0KSB7XG4gICAgICAgIG1lbnVFbC5zdHlsZS5sZWZ0ID0gYGNhbGMoICR7b3V0ZXJNYXJnaW59ICsgJHtzY3JvbGxXaWR0aERpZmZ9cHgpYDtcbiAgICAgIH0gZWxzZSBpZiAobWVudVhQb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIG1lbnVFbC5zdHlsZS5sZWZ0ID0gYCR7dHJpZ2dlckRPTVJlY3QubGVmdCArIHNjcm9sbFdpZHRoRGlmZn1weGA7XG4gICAgICAgIG1lbnVFbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgncmlnaHQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lbnVFbC5zdHlsZS5yaWdodCA9IGAke1xuICAgICAgICAgIHdpbmRvdy5pbm5lcldpZHRoIC0gdHJpZ2dlckRPTVJlY3QucmlnaHQgLSBzY3JvbGxXaWR0aERpZmZcbiAgICAgICAgfXB4YDtcbiAgICAgICAgbWVudUVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdsZWZ0Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtZW51WVBvc2l0aW9uID09PSAnYmVsb3cnKSB7XG4gICAgICAgIG1lbnVFbC5zdHlsZS50b3AgPSBgY2FsYygke1xuICAgICAgICAgIHRyaWdnZXJET01SZWN0LnRvcCArIHRyaWdnZXJET01SZWN0LmhlaWdodFxuICAgICAgICB9cHggKyAke291dGVyTWFyZ2lufSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTmVlZCB0byByZS1yZXF1ZXN0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIGJlY2F1c2UgdGhlIG1lbnUgaGVpZ2h0XG4gICAgICAgIC8vIG1pZ2h0IGhhdmUgY2hhbmdlZCB3aGVuIHRoZSBkcm9wZG93biBpcyBpbiAnYXV0bycgbW9kZTtcbiAgICAgICAgbGV0IGRlc2lyZWRNZW51SGVpZ2h0ID1cbiAgICAgICAgICBtZW51TWF4SGVpZ2h0IHx8IG1lbnVFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG5cbiAgICAgICAgbWVudUVsLnN0eWxlLnRvcCA9IGBjYWxjKCR7XG4gICAgICAgICAgdHJpZ2dlckRPTVJlY3QudG9wIC0gZGVzaXJlZE1lbnVIZWlnaHRcbiAgICAgICAgfXB4IC0gJHtvdXRlck1hcmdpbn0pYDtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lbnVNYXhIZWlnaHQpIHtcbiAgICAgICAgLy8gQXBwbHkgdGhlIG1hbnVhbCBtYXgtd2lkdGhcbiAgICAgICAgbWVudUVsLnN0eWxlLm1heEhlaWdodCA9IG1lbnVNYXhIZWlnaHQgKyAncHgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIG1heC1oZWlnaHQgZG9lcyBub3QgZXhjZWVkIHRoZSBhdmFpbGFibGUgdG9wLSBvciBib3R0b20tc3BhY2VcbiAgICAgICAgbWVudUVsLnN0eWxlLm1heEhlaWdodCA9XG4gICAgICAgICAgbWVudVlQb3NpdGlvbiA9PT0gJ2JlbG93J1xuICAgICAgICAgICAgPyBgY2FsYygke1xuICAgICAgICAgICAgICAgIHdpbmRvdy5pbm5lckhlaWdodCAtIHRyaWdnZXJET01SZWN0LmJvdHRvbVxuICAgICAgICAgICAgICB9cHggLSAke291dGVyTWFyZ2lufSAtICR7Ym94U2hhZG93Qm90dG9tU2l6ZX0pYFxuICAgICAgICAgICAgOiBgY2FsYygke3RyaWdnZXJET01SZWN0LnRvcH1weCAtICR7b3V0ZXJNYXJnaW59IC0gJHtib3hTaGFkb3dCb3R0b21TaXplfSlgO1xuICAgICAgfVxuXG4gICAgICAvLyBBbGwgcG9zaXRpb25pbmcgb3BlcmF0aW9ucyBkb25lLCBtYWtlIG1lbnUgdmlzaWJsZSBhZ2FpblxuICAgICAgbWVudUVsLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgfSwgMCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgW1xuICAgICAgICAndG9wJyxcbiAgICAgICAgJ2xlZnQnLFxuICAgICAgICAncmlnaHQnLFxuICAgICAgICAnYm90dG9tJyxcbiAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICdtYXhIZWlnaHQnLFxuICAgICAgICAndmlzaWJpbGl0eScsXG4gICAgICBdLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgbWVudUVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3ApO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSwgW1xuICAgIHByb3BzLmlzT3BlbixcbiAgICBwcm9wcy5tZW51UG9zaXRpb24sXG4gICAgcHJvcHMudHJpZ2dlckVsZW1lbnRSZWYsXG4gICAgcHJvcHMubWVudU1heEhlaWdodCxcbiAgXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjc3M9e2dldERyb3Bkb3duTWVudUJhc2VTdHlsZXMocHJvcHMpfVxuICAgICAgc3R5bGU9e3Byb3BzLmN1c3RvbVN0eWxlc31cbiAgICAgIHJlZj17bWVudVJlZn1cbiAgICA+XG4gICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmV4cG9ydCB0eXBlIFREcm9wZG93bkNvbnRlbnRNZW51UHJvcHMgPSB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGhvcml6b250YWxDb25zdHJhaW50OiBUTWF4UHJvcDtcbiAgbWVudVBvc2l0aW9uOiAnbGVmdCcgfCAncmlnaHQnO1xuICBtZW51TWF4SGVpZ2h0PzogbnVtYmVyO1xuICBpc09wZW46IGJvb2xlYW47XG4gIHRyaWdnZXJFbGVtZW50UmVmOiBSZWZPYmplY3Q8SFRNTEVsZW1lbnQ+O1xufTtcbmV4cG9ydCBjb25zdCBEcm9wZG93bkNvbnRlbnRNZW51ID0gKHByb3BzOiBURHJvcGRvd25Db250ZW50TWVudVByb3BzKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duQmFzZU1lbnVcbiAgICAgIGN1c3RvbVN0eWxlcz17e1xuICAgICAgICBwYWRkaW5nOiBkZXNpZ25Ub2tlbnMuc3BhY2luZzMwLFxuICAgICAgfX1cbiAgICAgIGhvcml6b250YWxDb25zdHJhaW50PXtwcm9wcy5ob3Jpem9udGFsQ29uc3RyYWludH1cbiAgICAgIGlzT3Blbj17cHJvcHMuaXNPcGVufVxuICAgICAgbWVudVBvc2l0aW9uPXtwcm9wcy5tZW51UG9zaXRpb259XG4gICAgICBtZW51TWF4SGVpZ2h0PXtwcm9wcy5tZW51TWF4SGVpZ2h0fVxuICAgICAgdHJpZ2dlckVsZW1lbnRSZWY9e3Byb3BzLnRyaWdnZXJFbGVtZW50UmVmfVxuICAgID5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L0Ryb3Bkb3duQmFzZU1lbnU+XG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBURHJvcGRvd25MaXN0TWVudVByb3BzID0ge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICBob3Jpem9udGFsQ29uc3RyYWludDogVE1heFByb3A7XG4gIG1lbnVQb3NpdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JztcbiAgbWVudU1heEhlaWdodD86IG51bWJlcjtcbiAgaXNPcGVuOiBib29sZWFuO1xuICB0cmlnZ2VyRWxlbWVudFJlZjogUmVmT2JqZWN0PEhUTUxFbGVtZW50Pjtcbn07XG5leHBvcnQgY29uc3QgRHJvcGRvd25MaXN0TWVudSA9IChwcm9wczogVERyb3Bkb3duTGlzdE1lbnVQcm9wcykgPT4ge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bkJhc2VNZW51XG4gICAgICBob3Jpem9udGFsQ29uc3RyYWludD17cHJvcHMuaG9yaXpvbnRhbENvbnN0cmFpbnR9XG4gICAgICBpc09wZW49e3Byb3BzLmlzT3Blbn1cbiAgICAgIG1lbnVQb3NpdGlvbj17cHJvcHMubWVudVBvc2l0aW9ufVxuICAgICAgbWVudU1heEhlaWdodD17cHJvcHMubWVudU1heEhlaWdodH1cbiAgICAgIHRyaWdnZXJFbGVtZW50UmVmPXtwcm9wcy50cmlnZ2VyRWxlbWVudFJlZn1cbiAgICA+XG4gICAgICA8U3BhY2luZ3NTdGFjayBzY2FsZT1cInhzXCI+e3Byb3BzLmNoaWxkcmVufTwvU3BhY2luZ3NTdGFjaz5cbiAgICA8L0Ryb3Bkb3duQmFzZU1lbnU+XG4gICk7XG59O1xuIl19 */");
43
45
  }
44
46
  function DropdownBaseMenu(props) {
45
47
  const menuRef = useRef(null);
46
48
  useLayoutEffect(() => {
47
- // Update the position of the menu when it is open
48
- if (props.isOpen && props.triggerElementRef.current && menuRef.current) {
49
- var _context, _context2;
50
- const triggerElementCoordinates = props.triggerElementRef.current.getBoundingClientRect();
51
- menuRef.current.style.top = "".concat(triggerElementCoordinates.top + triggerElementCoordinates.height, "px");
52
- if (props.menuPosition === 'left') {
53
- menuRef.current.style.left = "".concat(triggerElementCoordinates.left, "px");
54
- menuRef.current.style.removeProperty('right');
49
+ if (!props.isOpen || !props.triggerElementRef.current || !menuRef.current) {
50
+ return;
51
+ }
52
+ const menuMaxHeight = props.menuMaxHeight;
53
+ const menuEl = menuRef.current;
54
+ const menuTriggerEl = props.triggerElementRef.current;
55
+ const menuDOMRect = menuEl.getBoundingClientRect();
56
+ const triggerDOMRect = menuTriggerEl.getBoundingClientRect();
57
+
58
+ // By default, the menu is not exceeding the viewport, this can change though
59
+ let menuIsExceedingViewport = false;
60
+ if (menuDOMRect.width >= document.body.scrollWidth) {
61
+ var _context;
62
+ // If the menu width is greater than the body width, we need to set the width of the menu to the body width
63
+ // to prevent the menu from overflowing, this happens usually when the horizontalConstraint is set to 'auto'
64
+ menuEl.style.width = _concatInstanceProperty(_context = "calc(".concat(document.body.scrollWidth, "px - 2 * ")).call(_context, outerMargin, ")");
65
+ menuIsExceedingViewport = true;
66
+ }
67
+
68
+ // The preferred/ideal height of the menu (which might change later if there is
69
+ // not enough screen estate)
70
+ let desiredMenuHeight = menuMaxHeight || menuDOMRect.height;
71
+ const menuWidth = menuDOMRect.width;
72
+ const availableSpaceTop = triggerDOMRect.top;
73
+ const availableSpaceBottom = window.innerHeight - triggerDOMRect.bottom;
74
+
75
+ // Prefer rendering below the trigger element if there is enough space
76
+ // to display the whole menu, otherwise render wherever there is more space
77
+ const menuYPosition = availableSpaceBottom >= desiredMenuHeight ? 'below' : availableSpaceBottom > availableSpaceTop ? 'below' : 'above';
78
+ let menuXPosition;
79
+ if (props.menuPosition === 'left') {
80
+ const distanceToRightEdge = window.innerWidth - triggerDOMRect.left;
81
+ menuXPosition = distanceToRightEdge >= menuWidth ? 'left' : 'right';
82
+ }
83
+ if (props.menuPosition === 'right') {
84
+ const distanceToLeftEdge = triggerDOMRect.left + triggerDOMRect.width;
85
+ menuXPosition = distanceToLeftEdge >= menuWidth ? 'right' : 'left';
86
+ }
87
+ // Since scrolling will be disabled by a hook, possibly on the body-element,
88
+ // the available viewport-width might change, thus, the positioning of the
89
+ // menu would be affected, hence we need to get the scroll-width before the
90
+ // menu renders
91
+ const scrollWidthBefore = document.body.scrollWidth;
92
+
93
+ // Using setTimeout allows us to get the correct dimensions & positions
94
+ // of the trigger- & menu-element first before doing the calculations for
95
+ // positioning the menu correctly
96
+ _setTimeout(() => {
97
+ // If there is a scrollWidthDiff, it means that the width of the
98
+ // viewports has changed due to removed scrollbars, and we need to
99
+ // adjust the position of the menu to be still properly aligned with
100
+ // the trigger
101
+ const scrollWidthDiff = (document.body.scrollWidth - scrollWidthBefore) * 0.5;
102
+ if (menuIsExceedingViewport) {
103
+ var _context2;
104
+ menuEl.style.left = _concatInstanceProperty(_context2 = "calc( ".concat(outerMargin, " + ")).call(_context2, scrollWidthDiff, "px)");
105
+ } else if (menuXPosition === 'left') {
106
+ menuEl.style.left = "".concat(triggerDOMRect.left + scrollWidthDiff, "px");
107
+ menuEl.style.removeProperty('right');
55
108
  } else {
56
- menuRef.current.style.right = "".concat(window.innerWidth - triggerElementCoordinates.right, "px");
57
- menuRef.current.style.removeProperty('left');
109
+ menuEl.style.right = "".concat(window.innerWidth - triggerDOMRect.right - scrollWidthDiff, "px");
110
+ menuEl.style.removeProperty('left');
58
111
  }
59
- menuRef.current.style.maxHeight = props.menuMaxHeight ? "".concat(props.menuMaxHeight, "px") : _concatInstanceProperty(_context = _concatInstanceProperty(_context2 = "calc(".concat(window.innerHeight - (triggerElementCoordinates.top + triggerElementCoordinates.height), "px - ")).call(_context2, marginTop, " - ")).call(_context, boxShadowBottomSize, ")");
60
- }
112
+ if (menuYPosition === 'below') {
113
+ var _context3;
114
+ menuEl.style.top = _concatInstanceProperty(_context3 = "calc(".concat(triggerDOMRect.top + triggerDOMRect.height, "px + ")).call(_context3, outerMargin, ")");
115
+ } else {
116
+ var _context4;
117
+ // Need to re-request getBoundingClientRect() because the menu height
118
+ // might have changed when the dropdown is in 'auto' mode;
119
+ let desiredMenuHeight = menuMaxHeight || menuEl.getBoundingClientRect().height;
120
+ menuEl.style.top = _concatInstanceProperty(_context4 = "calc(".concat(triggerDOMRect.top - desiredMenuHeight, "px - ")).call(_context4, outerMargin, ")");
121
+ }
122
+ if (menuMaxHeight) {
123
+ // Apply the manual max-width
124
+ menuEl.style.maxHeight = menuMaxHeight + 'px';
125
+ } else {
126
+ var _context5, _context6, _context7, _context8;
127
+ // Make sure max-height does not exceed the available top- or bottom-space
128
+ menuEl.style.maxHeight = menuYPosition === 'below' ? _concatInstanceProperty(_context5 = _concatInstanceProperty(_context6 = "calc(".concat(window.innerHeight - triggerDOMRect.bottom, "px - ")).call(_context6, outerMargin, " - ")).call(_context5, boxShadowBottomSize, ")") : _concatInstanceProperty(_context7 = _concatInstanceProperty(_context8 = "calc(".concat(triggerDOMRect.top, "px - ")).call(_context8, outerMargin, " - ")).call(_context7, boxShadowBottomSize, ")");
129
+ }
130
+
131
+ // All positioning operations done, make menu visible again
132
+ menuEl.style.visibility = 'visible';
133
+ }, 0);
134
+ return () => {
135
+ var _context9;
136
+ _forEachInstanceProperty(_context9 = ['top', 'left', 'right', 'bottom', 'width', 'height', 'maxHeight', 'visibility']).call(_context9, prop => {
137
+ menuEl.style.removeProperty(prop);
138
+ });
139
+ };
61
140
  }, [props.isOpen, props.menuPosition, props.triggerElementRef, props.menuMaxHeight]);
62
141
  return jsx("div", {
63
142
  css: getDropdownMenuBaseStyles(props),
@@ -253,6 +332,6 @@ DropdownMenu.defaultProps = defaultProps;
253
332
  DropdownMenu.ListMenuItem = DropdownListMenuItem;
254
333
 
255
334
  // NOTE: This string will be replaced on build time with the package version.
256
- var version = "19.4.0";
335
+ var version = "19.6.0";
257
336
 
258
337
  export { DropdownMenu as default, useDropdownMenuContext, version };
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  export type TDropdownMenuContextProps = {
3
2
  isOpen: boolean;
4
3
  toggle: () => void;
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.0",
4
+ "version": "19.6.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.4.0",
25
- "@commercetools-uikit/constraints": "19.4.0",
26
- "@commercetools-uikit/design-system": "19.4.0",
27
- "@commercetools-uikit/hooks": "19.4.0",
28
- "@commercetools-uikit/secondary-button": "19.4.0",
29
- "@commercetools-uikit/spacings-inline": "19.4.0",
30
- "@commercetools-uikit/spacings-stack": "19.4.0",
31
- "@commercetools-uikit/utils": "19.4.0",
24
+ "@commercetools-uikit/accessible-button": "19.6.0",
25
+ "@commercetools-uikit/constraints": "19.6.0",
26
+ "@commercetools-uikit/design-system": "19.6.0",
27
+ "@commercetools-uikit/hooks": "19.6.0",
28
+ "@commercetools-uikit/secondary-button": "19.6.0",
29
+ "@commercetools-uikit/spacings-inline": "19.6.0",
30
+ "@commercetools-uikit/spacings-stack": "19.6.0",
31
+ "@commercetools-uikit/utils": "19.6.0",
32
32
  "@emotion/react": "^11.10.5",
33
33
  "@emotion/styled": "^11.10.5",
34
34
  "prop-types": "15.8.1",