@semcore/dropdown-menu 16.1.14-prerelease.1 → 16.2.0-prerelease.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.
@@ -18,43 +18,39 @@ import { forkRef } from "@semcore/core/lib/utils/ref";
18
18
  import { useUID } from "@semcore/core/lib/utils/uniqueID";
19
19
  import Dropdown, { enhance, selectedIndexContext, AbstractDropdown } from "@semcore/dropdown";
20
20
  import { Box, Flex } from "@semcore/flex-box";
21
- import ScrollAreaComponent, { hideScrollBarsFromScreenReadersContext } from "@semcore/scroll-area";
21
+ import ScrollAreaComponent from "@semcore/scroll-area";
22
22
  import { Text } from "@semcore/typography";
23
23
  import React from "react";
24
+ import { ListBoxContextProvider } from "./components/Context.mjs";
25
+ import { VirtualList } from "./components/VirtualList.mjs";
24
26
  import { localizedMessages } from "./translations/__intergalactic-dynamic-locales.mjs";
25
27
  /*!__reshadow-styles__:"./style/dropdown-menu.shadow.css"*/
26
28
  var style = (
27
29
  /*__reshadow_css_start__*/
28
30
  (sstyled.insert(
29
31
  /*__inner_css_start__*/
30
- ".___SDropdownMenuList_1tow4_gg_{max-height:240px;padding:var(--intergalactic-spacing-1x, 4px)0;position:relative;min-height:26px;min-width:32px;box-sizing:content-box;z-index:0;color:var(--intergalactic-text-primary, #191b23)}.___SDropdownMenuList_1tow4_gg_ .___SBar_1tow4_gg_{z-index:3}.___SDropdownMenuList_1tow4_gg_ .___SShadowHorizontal_1tow4_gg_:after,.___SDropdownMenuList_1tow4_gg_ .___SShadowHorizontal_1tow4_gg_:before,.___SDropdownMenuList_1tow4_gg_ .___SShadowVertical_1tow4_gg_:after,.___SDropdownMenuList_1tow4_gg_ .___SShadowVertical_1tow4_gg_:before{border-radius:var(--intergalactic-control-rounded, 6px)}.___SDropdownMenuItemContainer_1tow4_gg_ .___SItemContent_1tow4_gg_:focus-visible{outline:0}.___SDropdownMenuItemContainer_1tow4_gg_.__nesting-trigger_1tow4_gg_{justify-content:space-between}.___SDropdownMenuItemAddon_1tow4_gg_,.___SItemContentText_1tow4_gg_{display:inline-flex;margin-left:var(--intergalactic-spacing-1x, 4px);margin-right:var(--intergalactic-spacing-1x, 4px)}.___SDropdownMenuItemAddon_1tow4_gg_:first-child,.___SItemContentText_1tow4_gg_:first-child{margin-left:0}.___SDropdownMenuItemAddon_1tow4_gg_:last-child,.___SItemContentText_1tow4_gg_:last-child{margin-right:0}.___SDropdownMenuNesting_1tow4_gg_,.___SDropdownMenuNesting_1tow4_gg_._size_l_1tow4_gg_,.___SDropdownMenuNesting_1tow4_gg_._size_m_1tow4_gg_{padding:0}.___SDropdownMenuNesting_1tow4_gg_.__highlighted_1tow4_gg_{z-index:1;outline-color:var(--intergalactic-keyboard-focus-outline, #008ff8);outline-style:solid;outline-width:2px;outline-offset:-2px;transition-duration:calc(var(--intergalactic-duration-extra-fast, 100)*1ms);transition-timing-function:ease-in-out;transition-property:outline-color,outline-width,outline-offset}.___SDropdownNestingItem_1tow4_gg_._size_l_1tow4_gg_,.___SDropdownNestingItem_1tow4_gg_._size_m_1tow4_gg_{padding-right:0}.___SDropdownNestingItem_1tow4_gg_ .___SDropdownMenuItemContainer_1tow4_gg_{width:auto;padding-top:0;padding-bottom:0;padding-left:0;min-height:auto}.___SItemHint_1tow4_gg_{color:var(--intergalactic-text-secondary, #6c6e79)}",
32
+ ".___SDropdownMenuList_1d1ud_gg_{max-height:240px;padding:var(--intergalactic-spacing-1x, 4px)0;position:relative;min-height:26px;min-width:32px;box-sizing:content-box;z-index:0;color:var(--intergalactic-text-primary, #191b23)}.___SDropdownMenuList_1d1ud_gg_ .___SBar_1d1ud_gg_{z-index:3}.___SDropdownMenuList_1d1ud_gg_ .___SShadowHorizontal_1d1ud_gg_:after,.___SDropdownMenuList_1d1ud_gg_ .___SShadowHorizontal_1d1ud_gg_:before,.___SDropdownMenuList_1d1ud_gg_ .___SShadowVertical_1d1ud_gg_:after,.___SDropdownMenuList_1d1ud_gg_ .___SShadowVertical_1d1ud_gg_:before{border-radius:var(--intergalactic-control-rounded, 6px)}.___SDropdownMenuItemContainer_1d1ud_gg_ .___SItemContent_1d1ud_gg_:focus-visible{outline:0}.___SDropdownMenuItemContainer_1d1ud_gg_.__nesting-trigger_1d1ud_gg_{justify-content:space-between}.___SDropdownMenuItemAddon_1d1ud_gg_,.___SItemContentText_1d1ud_gg_{display:inline-flex;margin-left:var(--intergalactic-spacing-1x, 4px);margin-right:var(--intergalactic-spacing-1x, 4px)}.___SDropdownMenuItemAddon_1d1ud_gg_:first-child,.___SItemContentText_1d1ud_gg_:first-child{margin-left:0}.___SDropdownMenuItemAddon_1d1ud_gg_:last-child,.___SItemContentText_1d1ud_gg_:last-child{margin-right:0}.___SDropdownMenuNesting_1d1ud_gg_,.___SDropdownMenuNesting_1d1ud_gg_._size_l_1d1ud_gg_,.___SDropdownMenuNesting_1d1ud_gg_._size_m_1d1ud_gg_{padding:0}.___SDropdownMenuNesting_1d1ud_gg_.__highlighted_1d1ud_gg_{z-index:1;outline-color:var(--intergalactic-keyboard-focus-outline, #008ff8);outline-style:solid;outline-width:2px;outline-offset:-2px;transition-duration:calc(var(--intergalactic-duration-extra-fast, 100)*1ms);transition-timing-function:ease-in-out;transition-property:outline-color,outline-width,outline-offset}.___SDropdownNestingItem_1d1ud_gg_._size_l_1d1ud_gg_,.___SDropdownNestingItem_1d1ud_gg_._size_m_1d1ud_gg_{padding-right:0}.___SDropdownNestingItem_1d1ud_gg_ .___SDropdownMenuItemContainer_1d1ud_gg_{width:auto;padding-top:0;padding-bottom:0;padding-left:0;min-height:auto}.___SItemHint_1d1ud_gg_{color:var(--intergalactic-text-secondary, #6c6e79)}",
31
33
  /*__inner_css_end__*/
32
- "1tow4_gg_"
34
+ "1d1ud_gg_"
33
35
  ), /*__reshadow_css_end__*/
34
36
  {
35
- "__SDropdownMenuItemContainer": "___SDropdownMenuItemContainer_1tow4_gg_",
36
- "_nesting-trigger": "__nesting-trigger_1tow4_gg_",
37
- "__SDropdownMenuNesting": "___SDropdownMenuNesting_1tow4_gg_",
38
- "_size_l": "_size_l_1tow4_gg_",
39
- "_size_m": "_size_m_1tow4_gg_",
40
- "_highlighted": "__highlighted_1tow4_gg_",
41
- "__SDropdownNestingItem": "___SDropdownNestingItem_1tow4_gg_",
42
- "__SItemHint": "___SItemHint_1tow4_gg_",
43
- "__SDropdownMenuList": "___SDropdownMenuList_1tow4_gg_",
44
- "__SBar": "___SBar_1tow4_gg_",
45
- "__SShadowHorizontal": "___SShadowHorizontal_1tow4_gg_",
46
- "__SShadowVertical": "___SShadowVertical_1tow4_gg_",
47
- "__SItemContent": "___SItemContent_1tow4_gg_",
48
- "__SDropdownMenuItemAddon": "___SDropdownMenuItemAddon_1tow4_gg_",
49
- "__SItemContentText": "___SItemContentText_1tow4_gg_"
37
+ "__SDropdownMenuItemContainer": "___SDropdownMenuItemContainer_1d1ud_gg_",
38
+ "_nesting-trigger": "__nesting-trigger_1d1ud_gg_",
39
+ "__SDropdownMenuNesting": "___SDropdownMenuNesting_1d1ud_gg_",
40
+ "_size_l": "_size_l_1d1ud_gg_",
41
+ "_size_m": "_size_m_1d1ud_gg_",
42
+ "_highlighted": "__highlighted_1d1ud_gg_",
43
+ "__SDropdownNestingItem": "___SDropdownNestingItem_1d1ud_gg_",
44
+ "__SItemHint": "___SItemHint_1d1ud_gg_",
45
+ "__SDropdownMenuList": "___SDropdownMenuList_1d1ud_gg_",
46
+ "__SBar": "___SBar_1d1ud_gg_",
47
+ "__SShadowHorizontal": "___SShadowHorizontal_1d1ud_gg_",
48
+ "__SShadowVertical": "___SShadowVertical_1d1ud_gg_",
49
+ "__SItemContent": "___SItemContent_1d1ud_gg_",
50
+ "__SDropdownMenuItemAddon": "___SDropdownMenuItemAddon_1d1ud_gg_",
51
+ "__SItemContentText": "___SItemContentText_1d1ud_gg_"
50
52
  })
51
53
  );
52
- var ListBoxContextProvider = function ListBoxContextProvider2(_ref22) {
53
- var children = _ref22.children;
54
- return /* @__PURE__ */ React.createElement(hideScrollBarsFromScreenReadersContext.Provider, {
55
- value: true
56
- }, children);
57
- };
58
54
  var menuItemContext = /* @__PURE__ */ React.createContext({});
59
55
  var DropdownMenuRoot = /* @__PURE__ */ (function(_AbstractDropdown) {
60
56
  function DropdownMenuRoot2() {
@@ -66,6 +62,7 @@ var DropdownMenuRoot = /* @__PURE__ */ (function(_AbstractDropdown) {
66
62
  _this = _callSuper(this, DropdownMenuRoot2, [].concat(args));
67
63
  _defineProperty(_this, "actionsRef", /* @__PURE__ */ React.createRef());
68
64
  _defineProperty(_this, "role", "menu");
65
+ _defineProperty(_this, "shouldRecalculateItemTabIndex", false);
69
66
  return _this;
70
67
  }
71
68
  _inherits(DropdownMenuRoot2, _AbstractDropdown);
@@ -78,7 +75,7 @@ var DropdownMenuRoot = /* @__PURE__ */ (function(_AbstractDropdown) {
78
75
  if (visible === true) {
79
76
  setTimeout(function() {
80
77
  _this2.focusAndScrollToSelected();
81
- }, 30);
78
+ }, 50);
82
79
  }
83
80
  }]
84
81
  });
@@ -94,7 +91,7 @@ var DropdownMenuRoot = /* @__PURE__ */ (function(_AbstractDropdown) {
94
91
  };
95
92
  }
96
93
  var options = menuElement.querySelectorAll('[role="menuitemcheckbox"], [role="menuitemradio"]');
97
- var selected = menuElement.querySelector('[aria-checked="true"]');
94
+ var selected = menuElement.querySelector('[aria-checked="true"]:not([disabled])');
98
95
  return {
99
96
  selected,
100
97
  options
@@ -103,10 +100,10 @@ var DropdownMenuRoot = /* @__PURE__ */ (function(_AbstractDropdown) {
103
100
  }, {
104
101
  key: "focusAndScrollToSelected",
105
102
  value: function focusAndScrollToSelected() {
106
- var _this3 = this;
103
+ var _this$menuRef$current, _this3 = this;
107
104
  var _this$menuElements = this.menuElements, selected = _this$menuElements.selected, options = _this$menuElements.options;
108
105
  var isFocusAlreadyInPopper = isFocusInside(this.popperRef.current);
109
- if (!selected || !options || this.asProps.itemsCount !== void 0 || isFocusAlreadyInPopper) return;
106
+ if (!selected || !options || (_this$menuRef$current = this.menuRef.current) !== null && _this$menuRef$current !== void 0 && _this$menuRef$current.dataset.isVirtual || isFocusAlreadyInPopper) return;
110
107
  this.scrollToNodeAsync(selected, true).then(function() {
111
108
  if (_this3.asProps.visible) {
112
109
  selected.focus({
@@ -122,8 +119,9 @@ var DropdownMenuRoot = /* @__PURE__ */ (function(_AbstractDropdown) {
122
119
  }, {
123
120
  key: "afterOpenPopper",
124
121
  value: function afterOpenPopper() {
122
+ var _this$menuRef$current2;
125
123
  var _this$menuElements2 = this.menuElements, selected = _this$menuElements2.selected, options = _this$menuElements2.options;
126
- if (selected && options && this.asProps.itemsCount === void 0) return;
124
+ if (selected && options && !((_this$menuRef$current2 = this.menuRef.current) !== null && _this$menuRef$current2 !== void 0 && _this$menuRef$current2.dataset.isVirtual)) return;
127
125
  _superPropGet(DropdownMenuRoot2, "afterOpenPopper", this, 3)([]);
128
126
  }
129
127
  }, {
@@ -153,6 +151,13 @@ var DropdownMenuRoot = /* @__PURE__ */ (function(_AbstractDropdown) {
153
151
  onKeyDown: callAllEventHandlers(this.handlePreventCommonKeyDown.bind(this), this.handleKeyDownForMenu("list"), this.handleArrowKeyDown.bind(this))
154
152
  });
155
153
  }
154
+ }, {
155
+ key: "getVirtualListProps",
156
+ value: function getVirtualListProps() {
157
+ return _objectSpread(_objectSpread({}, _superPropGet(DropdownMenuRoot2, "getListProps", this, 3)([])), {}, {
158
+ onKeyDown: callAllEventHandlers(this.handlePreventCommonKeyDown.bind(this), this.handleKeyDownForMenu("list"), this.handleArrowKeyDown.bind(this))
159
+ });
160
+ }
156
161
  }, {
157
162
  key: "getPopperProps",
158
163
  value: function getPopperProps() {
@@ -168,15 +173,32 @@ var DropdownMenuRoot = /* @__PURE__ */ (function(_AbstractDropdown) {
168
173
  onKeyDown: callAllEventHandlers(this.handlePreventTabOnActions.bind(this), this.handlePreventCommonKeyDown.bind(this), this.handleKeyDownForMenu("list"), this.handleArrowKeyDown.bind(this))
169
174
  });
170
175
  }
176
+ }, {
177
+ key: "getItemTabIndex",
178
+ value: function getItemTabIndex(props, itemIndex) {
179
+ var disabled = props.disabled, index = props.index;
180
+ var _this$asProps2 = this.asProps, highlightedIndex = _this$asProps2.highlightedIndex, visible = _this$asProps2.visible;
181
+ if (!visible) return -1;
182
+ var isHighlighted = (index !== null && index !== void 0 ? index : itemIndex) === highlightedIndex;
183
+ if (isHighlighted && !disabled) {
184
+ return 0;
185
+ }
186
+ if (disabled && isHighlighted) {
187
+ this.shouldRecalculateItemTabIndex = true;
188
+ }
189
+ if (!isHighlighted && !disabled && this.shouldRecalculateItemTabIndex) {
190
+ this.shouldRecalculateItemTabIndex = false;
191
+ return 0;
192
+ }
193
+ return -1;
194
+ }
171
195
  }, {
172
196
  key: "getItemProps",
173
197
  value: function getItemProps(props, index) {
174
198
  var _props$index, _this4 = this;
175
- var _this$asProps2 = this.asProps, highlightedIndex = _this$asProps2.highlightedIndex, visible = _this$asProps2.visible;
176
199
  var realIndex = (_props$index = props.index) !== null && _props$index !== void 0 ? _props$index : index;
177
- var isHighlighted = realIndex === highlightedIndex;
178
200
  var itemProps = _objectSpread(_objectSpread({}, _superPropGet(DropdownMenuRoot2, "getItemProps", this, 3)([props, realIndex])), {}, {
179
- tabIndex: isHighlighted && visible ? 0 : -1,
201
+ tabIndex: this.getItemTabIndex(props, index),
180
202
  ref: function ref(node) {
181
203
  return _this4.itemRef(props, realIndex, node);
182
204
  },
@@ -219,6 +241,13 @@ var DropdownMenuRoot = /* @__PURE__ */ (function(_AbstractDropdown) {
219
241
  setTimeout(function() {
220
242
  var _this5$itemRefs$highl;
221
243
  var highlightedIndex = _this5.asProps.highlightedIndex;
244
+ var highlightedIndexProps = _this5.itemProps[highlightedIndex];
245
+ if (highlightedIndexProps !== null && highlightedIndexProps !== void 0 && highlightedIndexProps.disabled) {
246
+ highlightedIndex = _this5.itemProps.findIndex(function(p) {
247
+ return !p.disabled;
248
+ });
249
+ }
250
+ if (highlightedIndex === -1) return;
222
251
  (_this5$itemRefs$highl = _this5.itemRefs[highlightedIndex]) === null || _this5$itemRefs$highl === void 0 || _this5$itemRefs$highl.focus();
223
252
  }, 0);
224
253
  e.preventDefault();
@@ -280,9 +309,9 @@ _defineProperty(DropdownMenuRoot, "nestedMenuInteraction", {
280
309
  trigger: [["onClick", "onMouseEnter"], ["onClick", "onMouseLeave"]],
281
310
  popper: [["onMouseEnter"], ["onMouseLeave"]]
282
311
  });
283
- function List(_ref23) {
312
+ function List(_ref22) {
284
313
  var _ref2 = arguments[0], _ref13;
285
- var styles = _ref23.styles, Children = _ref23.Children;
314
+ var styles = _ref22.styles, Children = _ref22.Children;
286
315
  var SDropdownMenuList = ScrollAreaComponent;
287
316
  var SBar = ScrollAreaComponent.Bar;
288
317
  return _ref13 = sstyled(styles), /* @__PURE__ */ React.createElement(ListBoxContextProvider, _ref13.cn("ListBoxContextProvider", {}), /* @__PURE__ */ React.createElement(SDropdownMenuList, _ref13.cn("SDropdownMenuList", _objectSpread({}, assignProps({
@@ -297,9 +326,9 @@ function List(_ref23) {
297
326
  "orientation": "vertical"
298
327
  }))));
299
328
  }
300
- function Actions(_ref24) {
329
+ function Actions(_ref23) {
301
330
  var _ref3 = arguments[0], _ref14;
302
- var styles = _ref24.styles;
331
+ var styles = _ref23.styles;
303
332
  var SDropdownMenuActions = Flex;
304
333
  return _ref14 = sstyled(styles), /* @__PURE__ */ React.createElement(SDropdownMenuActions, _ref14.cn("SDropdownMenuActions", _objectSpread({}, assignProps({}, _ref3))));
305
334
  }
@@ -319,9 +348,9 @@ function Menu(props) {
319
348
  role: null
320
349
  }), /* @__PURE__ */ React.createElement(DropdownMenu.List, assignProps({}, _ref4))));
321
350
  }
322
- function Item(_ref25) {
351
+ function Item(_ref24) {
323
352
  var _ref5 = arguments[0], _ref15;
324
- var id = _ref25.id, styles = _ref25.styles, disabled = _ref25.disabled, Children = _ref25.Children, forwardRef = _ref25.forwardRef, role = _ref25.role, tabIndex = _ref25.tabIndex, actionsRef = _ref25.actionsRef, ariaChecked = _ref25["aria-checked"];
353
+ var id = _ref24.id, styles = _ref24.styles, disabled = _ref24.disabled, Children = _ref24.Children, forwardRef = _ref24.forwardRef, role = _ref24.role, tabIndex = _ref24.tabIndex, actionsRef = _ref24.actionsRef, ariaChecked = _ref24["aria-checked"];
325
354
  var SDropdownMenuItemContainer = Dropdown.Item;
326
355
  var itemRef = React.useRef();
327
356
  var _React$useState = React.useState(false), _React$useState2 = _slicedToArray(_React$useState, 2), highlighted = _React$useState2[0], setHighlighted = _React$useState2[1];
@@ -330,7 +359,8 @@ function Item(_ref25) {
330
359
  ref: forkRef(forwardRef, itemRef),
331
360
  role,
332
361
  tabIndex,
333
- ariaChecked
362
+ ariaChecked,
363
+ disabled
334
364
  };
335
365
  var ariaDescribes = [];
336
366
  var hasSubMenu = isAdvanceMode(Children, [DropdownMenu.displayName], true);
@@ -397,9 +427,9 @@ function Trigger() {
397
427
  var _ref7 = arguments[0];
398
428
  return /* @__PURE__ */ React.createElement(Dropdown.Trigger, assignProps({}, _ref7));
399
429
  }
400
- function ItemContent(_ref26) {
430
+ function ItemContent(_ref25) {
401
431
  var _ref8 = arguments[0], _ref17;
402
- var styles = _ref26.styles;
432
+ var styles = _ref25.styles;
403
433
  var SItemContent = Flex;
404
434
  var ref = React.useRef();
405
435
  var menuItemCtxValue = React.useContext(menuItemContext);
@@ -428,18 +458,19 @@ function ItemContent(_ref26) {
428
458
  "aria-expanded": subMenu,
429
459
  "aria-checked": menuItemCtxValue.ariaChecked,
430
460
  "alignItems": "center",
431
- "justifyContent": menuItemCtxValue.hasSubMenu ? "space-between" : void 0
461
+ "justifyContent": menuItemCtxValue.hasSubMenu ? "space-between" : void 0,
462
+ "disabled": menuItemCtxValue.disabled
432
463
  }, _ref8))));
433
464
  }
434
- function ItemContentText(_ref27) {
465
+ function ItemContentText(_ref26) {
435
466
  var _ref9 = arguments[0], _ref18;
436
- var styles = _ref27.styles;
467
+ var styles = _ref26.styles;
437
468
  var SItemContentText = Text;
438
469
  return _ref18 = sstyled(styles), /* @__PURE__ */ React.createElement(SItemContentText, _ref18.cn("SItemContentText", _objectSpread({}, assignProps({}, _ref9))));
439
470
  }
440
- function ItemHint(_ref28) {
471
+ function ItemHint(_ref27) {
441
472
  var _ref0 = arguments[0], _ref19;
442
- var styles = _ref28.styles;
473
+ var styles = _ref27.styles;
443
474
  var SItemHint = Flex;
444
475
  var _React$useContext = React.useContext(menuItemContext), hintId = _React$useContext.hintId;
445
476
  return _ref19 = sstyled(styles), /* @__PURE__ */ React.createElement(SItemHint, _ref19.cn("SItemHint", _objectSpread({}, assignProps({
@@ -461,16 +492,16 @@ function Title(props) {
461
492
  "variant": "title"
462
493
  }, _ref10))));
463
494
  }
464
- function Nesting(_ref29) {
495
+ function Nesting(_ref28) {
465
496
  var _ref11 = arguments[0];
466
- var forwardRef = _ref29.forwardRef;
497
+ var forwardRef = _ref28.forwardRef;
467
498
  return /* @__PURE__ */ React.createElement(DropdownMenu.Item, assignProps({
468
499
  "ref": forwardRef
469
500
  }, _ref11));
470
501
  }
471
- function NestingTrigger(_ref30) {
502
+ function NestingTrigger(_ref29) {
472
503
  var _ref12 = arguments[0];
473
- var forwardRef = _ref30.forwardRef;
504
+ var forwardRef = _ref29.forwardRef;
474
505
  return /* @__PURE__ */ React.createElement(DropdownMenu.Item.Content, assignProps({
475
506
  "tag": DropdownMenu.Trigger,
476
507
  "ref": forwardRef,
@@ -481,6 +512,7 @@ var DropdownMenu = createComponent(DropdownMenuRoot, {
481
512
  Trigger,
482
513
  Popper: Dropdown.Popper,
483
514
  List,
515
+ VirtualList,
484
516
  Actions,
485
517
  Menu,
486
518
  Item: [Item, {
@@ -0,0 +1,11 @@
1
+ import { hideScrollBarsFromScreenReadersContext } from "@semcore/scroll-area";
2
+ import React from "react";
3
+ var ListBoxContextProvider = function ListBoxContextProvider2(_ref) {
4
+ var children = _ref.children;
5
+ return /* @__PURE__ */ React.createElement(hideScrollBarsFromScreenReadersContext.Provider, {
6
+ value: true
7
+ }, children);
8
+ };
9
+ export {
10
+ ListBoxContextProvider
11
+ };
@@ -0,0 +1,132 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
3
+ import _createClass from "@babel/runtime/helpers/esm/createClass";
4
+ import _callSuper from "@babel/runtime/helpers/esm/callSuper";
5
+ import _inherits from "@babel/runtime/helpers/esm/inherits";
6
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
7
+ import { createComponent, sstyled, assignProps, Component } from "@semcore/core";
8
+ import { Box } from "@semcore/base-components";
9
+ import ScrollAreaComponent from "@semcore/scroll-area";
10
+ import React from "react";
11
+ import { ListBoxContextProvider } from "./Context.mjs";
12
+ /*!__reshadow-styles__:"../style/dropdown-menu.shadow.css"*/
13
+ var style = (
14
+ /*__reshadow_css_start__*/
15
+ (sstyled.insert(
16
+ /*__inner_css_start__*/
17
+ ".___SDropdownMenuList_1d1ud_gg_{max-height:240px;padding:var(--intergalactic-spacing-1x, 4px)0;position:relative;min-height:26px;min-width:32px;box-sizing:content-box;z-index:0;color:var(--intergalactic-text-primary, #191b23)}.___SDropdownMenuList_1d1ud_gg_ .___SBar_1d1ud_gg_{z-index:3}.___SDropdownMenuList_1d1ud_gg_ .___SShadowHorizontal_1d1ud_gg_:after,.___SDropdownMenuList_1d1ud_gg_ .___SShadowHorizontal_1d1ud_gg_:before,.___SDropdownMenuList_1d1ud_gg_ .___SShadowVertical_1d1ud_gg_:after,.___SDropdownMenuList_1d1ud_gg_ .___SShadowVertical_1d1ud_gg_:before{border-radius:var(--intergalactic-control-rounded, 6px)}.___SDropdownMenuItemContainer_1d1ud_gg_ .___SItemContent_1d1ud_gg_:focus-visible{outline:0}.___SDropdownMenuItemContainer_1d1ud_gg_.__nesting-trigger_1d1ud_gg_{justify-content:space-between}.___SDropdownMenuItemAddon_1d1ud_gg_,.___SItemContentText_1d1ud_gg_{display:inline-flex;margin-left:var(--intergalactic-spacing-1x, 4px);margin-right:var(--intergalactic-spacing-1x, 4px)}.___SDropdownMenuItemAddon_1d1ud_gg_:first-child,.___SItemContentText_1d1ud_gg_:first-child{margin-left:0}.___SDropdownMenuItemAddon_1d1ud_gg_:last-child,.___SItemContentText_1d1ud_gg_:last-child{margin-right:0}.___SDropdownMenuNesting_1d1ud_gg_,.___SDropdownMenuNesting_1d1ud_gg_._size_l_1d1ud_gg_,.___SDropdownMenuNesting_1d1ud_gg_._size_m_1d1ud_gg_{padding:0}.___SDropdownMenuNesting_1d1ud_gg_.__highlighted_1d1ud_gg_{z-index:1;outline-color:var(--intergalactic-keyboard-focus-outline, #008ff8);outline-style:solid;outline-width:2px;outline-offset:-2px;transition-duration:calc(var(--intergalactic-duration-extra-fast, 100)*1ms);transition-timing-function:ease-in-out;transition-property:outline-color,outline-width,outline-offset}.___SDropdownNestingItem_1d1ud_gg_._size_l_1d1ud_gg_,.___SDropdownNestingItem_1d1ud_gg_._size_m_1d1ud_gg_{padding-right:0}.___SDropdownNestingItem_1d1ud_gg_ .___SDropdownMenuItemContainer_1d1ud_gg_{width:auto;padding-top:0;padding-bottom:0;padding-left:0;min-height:auto}.___SItemHint_1d1ud_gg_{color:var(--intergalactic-text-secondary, #6c6e79)}",
18
+ /*__inner_css_end__*/
19
+ "1d1ud_gg_"
20
+ ), /*__reshadow_css_end__*/
21
+ {
22
+ "__SDropdownMenuItemContainer": "___SDropdownMenuItemContainer_1d1ud_gg_",
23
+ "_nesting-trigger": "__nesting-trigger_1d1ud_gg_",
24
+ "__SDropdownMenuNesting": "___SDropdownMenuNesting_1d1ud_gg_",
25
+ "_size_l": "_size_l_1d1ud_gg_",
26
+ "_size_m": "_size_m_1d1ud_gg_",
27
+ "_highlighted": "__highlighted_1d1ud_gg_",
28
+ "__SDropdownNestingItem": "___SDropdownNestingItem_1d1ud_gg_",
29
+ "__SItemHint": "___SItemHint_1d1ud_gg_",
30
+ "__SDropdownMenuList": "___SDropdownMenuList_1d1ud_gg_",
31
+ "__SBar": "___SBar_1d1ud_gg_",
32
+ "__SShadowHorizontal": "___SShadowHorizontal_1d1ud_gg_",
33
+ "__SShadowVertical": "___SShadowVertical_1d1ud_gg_",
34
+ "__SItemContent": "___SItemContent_1d1ud_gg_",
35
+ "__SDropdownMenuItemAddon": "___SDropdownMenuItemAddon_1d1ud_gg_",
36
+ "__SItemContentText": "___SItemContentText_1d1ud_gg_"
37
+ })
38
+ );
39
+ var VirtualListRoot = /* @__PURE__ */ (function(_Component) {
40
+ function VirtualListRoot2() {
41
+ var _this;
42
+ _classCallCheck(this, VirtualListRoot2);
43
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
44
+ args[_key] = arguments[_key];
45
+ }
46
+ _this = _callSuper(this, VirtualListRoot2, [].concat(args));
47
+ _defineProperty(_this, "containerRef", /* @__PURE__ */ React.createRef());
48
+ _defineProperty(_this, "listRef", /* @__PURE__ */ React.createRef());
49
+ _defineProperty(_this, "state", {
50
+ scrollTop: 0,
51
+ scrollDirection: "down"
52
+ });
53
+ _defineProperty(_this, "handleScroll", function(e) {
54
+ if (e.target instanceof HTMLElement) {
55
+ var scrollDirection = e.target.scrollTop > _this.state.scrollTop ? "down" : "up";
56
+ _this.setState({
57
+ scrollDirection,
58
+ scrollTop: e.target.scrollTop
59
+ });
60
+ }
61
+ });
62
+ return _this;
63
+ }
64
+ _inherits(VirtualListRoot2, _Component);
65
+ return _createClass(VirtualListRoot2, [{
66
+ key: "componentDidMount",
67
+ value: function componentDidMount() {
68
+ var _this2 = this;
69
+ var _this$asProps = this.asProps, index = _this$asProps.index, rowHeight = _this$asProps.rowHeight;
70
+ setTimeout(function() {
71
+ var _this2$listRef$curren, _this2$listRef$curren2, _this2$containerRef$c;
72
+ var listHeight = ((_this2$listRef$curren = (_this2$listRef$curren2 = _this2.listRef.current) === null || _this2$listRef$curren2 === void 0 ? void 0 : _this2$listRef$curren2.getBoundingClientRect().height) !== null && _this2$listRef$curren !== void 0 ? _this2$listRef$curren : 0) / 2;
73
+ (_this2$containerRef$c = _this2.containerRef.current) === null || _this2$containerRef$c === void 0 || _this2$containerRef$c.scrollTo({
74
+ top: index * rowHeight - listHeight + rowHeight / 2
75
+ });
76
+ }, 10);
77
+ }
78
+ }, {
79
+ key: "render",
80
+ value: function render() {
81
+ var _ref = this.asProps, _ref2;
82
+ var SDropdownMenuList = ScrollAreaComponent;
83
+ var SBar = ScrollAreaComponent.Bar;
84
+ var _this$state = this.state, scrollDirection = _this$state.scrollDirection, scrollTop = _this$state.scrollTop;
85
+ var _this$asProps2 = this.asProps, rows = _this$asProps2.rows, rowHeight = _this$asProps2.rowHeight, rowsBuffer = _this$asProps2.rowsBuffer, styles = _this$asProps2.styles, RenderRow = _this$asProps2.renderRow, customData = _this$asProps2.customData;
86
+ var offsetHeight = 0;
87
+ var prevPrepared = scrollDirection === "up" ? rowsBuffer : 6;
88
+ var nextPrepared = scrollDirection === "up" ? 6 : rowsBuffer;
89
+ var startIndex = Math.max(Math.floor(scrollTop / rowHeight) - prevPrepared, 0);
90
+ var lastIndex = scrollDirection === "up" && scrollTop === 0 ? rowsBuffer : Math.min(Math.ceil((scrollTop + offsetHeight) / rowHeight) + nextPrepared, rows.length);
91
+ var rowsToRender = rows.slice(startIndex, lastIndex);
92
+ var rowMarginTop = rowHeight * startIndex;
93
+ var rowMarginBottom = rowHeight * (rows.length - lastIndex);
94
+ return _ref2 = sstyled(styles), /* @__PURE__ */ React.createElement(ListBoxContextProvider, _ref2.cn("ListBoxContextProvider", {}), /* @__PURE__ */ React.createElement(SDropdownMenuList, _ref2.cn("SDropdownMenuList", _objectSpread({}, assignProps({
95
+ "shadow": true,
96
+ "shadowSize": 16,
97
+ "shadowTheme": "light",
98
+ "onScroll": this.handleScroll,
99
+ "data-is-virtual": "true",
100
+ "ref": this.listRef
101
+ }, _ref))), /* @__PURE__ */ React.createElement(ScrollAreaComponent.Container, {
102
+ ref: this.containerRef,
103
+ tabIndex: void 0,
104
+ h: rows.length * rowHeight
105
+ }, /* @__PURE__ */ React.createElement(Box, _ref2.cn("Box", {
106
+ "h": rowMarginTop
107
+ })), rowsToRender.map(function(item, index) {
108
+ return /* @__PURE__ */ React.createElement(RenderRow, {
109
+ key: startIndex + index,
110
+ row: item,
111
+ index: startIndex + index,
112
+ data: customData
113
+ });
114
+ }), /* @__PURE__ */ React.createElement(Box, _ref2.cn("Box", {
115
+ "h": rowMarginBottom
116
+ }))), /* @__PURE__ */ React.createElement(SBar, _ref2.cn("SBar", {
117
+ "orientation": "horizontal"
118
+ })), /* @__PURE__ */ React.createElement(SBar, _ref2.cn("SBar", {
119
+ "orientation": "vertical"
120
+ }))));
121
+ }
122
+ }]);
123
+ })(Component);
124
+ _defineProperty(VirtualListRoot, "displayName", "VirtualList");
125
+ _defineProperty(VirtualListRoot, "style", style);
126
+ _defineProperty(VirtualListRoot, "defaultProps", {
127
+ rowsBuffer: 10
128
+ });
129
+ var VirtualList = createComponent(VirtualListRoot);
130
+ export {
131
+ VirtualList
132
+ };
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const ListBoxContextProvider: ({ children }: React.PropsWithChildren) => React.JSX.Element;
@@ -0,0 +1,25 @@
1
+ import { Box } from '@semcore/base-components';
2
+ import type { Intergalactic } from '@semcore/core';
3
+ import React from 'react';
4
+ export type RenderRowProps<T, D> = {
5
+ index: number;
6
+ row: T;
7
+ data: D;
8
+ };
9
+ type VirtualListProps<T, D extends object> = {
10
+ /** List of all rows in ddMenu */
11
+ rows: T[];
12
+ /** Method for render row, it's better to wrap it via React.memo */
13
+ renderRow: (props: RenderRowProps<T, D>) => React.ReactNode;
14
+ /** The height of row. For now, you should calculate it on your side. */
15
+ rowHeight: number;
16
+ /** The buffer of rows out of visible rows
17
+ * @default 10
18
+ */
19
+ rowsBuffer?: number;
20
+ /** Some custom data for each renderRow function */
21
+ customData: D;
22
+ };
23
+ export type VirtualListComponent = (<T = string, D extends object = {}>(props: Intergalactic.InternalTypings.EfficientOmit<Intergalactic.InternalTypings.ComponentProps<typeof Box, 'div', VirtualListProps<T, D>>, 'tag' | 'children'>) => Intergalactic.InternalTypings.ComponentRenderingResults) & Intergalactic.InternalTypings.ComponentAdditive<typeof Box, 'div', VirtualListProps<any, any>>;
24
+ export declare const VirtualList: VirtualListComponent;
25
+ export {};
@@ -12,6 +12,8 @@ import type { eventInteraction } from '@semcore/popper';
12
12
  import type { ScrollAreaProps } from '@semcore/scroll-area';
13
13
  import type { Text } from '@semcore/typography';
14
14
 
15
+ import type { VirtualList, RenderRowProps } from './components/VirtualList';
16
+
15
17
  export type DropdownMenuSize = 'm' | 'l';
16
18
 
17
19
  /** @deprecated */
@@ -204,6 +206,9 @@ declare const DropdownMenu: Intergalactic.Component<
204
206
  */
205
207
  ItemHint: Intergalactic.Component<'div', DropdownMenuItemHintProps>;
206
208
  Group: typeof Dropdown.Group;
209
+
210
+ VirtualList: typeof VirtualList;
211
+
207
212
  /**
208
213
  * @deprecated Use Item instead of Nesting
209
214
  */
@@ -232,3 +237,7 @@ declare const DropdownMenu: Intergalactic.Component<
232
237
  };
233
238
 
234
239
  export default DropdownMenu;
240
+
241
+ export {
242
+ RenderRowProps,
243
+ };
@@ -0,0 +1,42 @@
1
+ export declare const localizedMessages: {
2
+ de: {
3
+ triggerHint: string;
4
+ };
5
+ en: {};
6
+ es: {
7
+ triggerHint: string;
8
+ };
9
+ fr: {
10
+ triggerHint: string;
11
+ };
12
+ it: {
13
+ triggerHint: string;
14
+ };
15
+ ja: {
16
+ triggerHint: string;
17
+ };
18
+ ko: {
19
+ triggerHint: string;
20
+ };
21
+ nl: {
22
+ triggerHint: string;
23
+ };
24
+ pt: {
25
+ triggerHint: string;
26
+ };
27
+ tr: {
28
+ triggerHint: string;
29
+ };
30
+ vi: {
31
+ triggerHint: string;
32
+ };
33
+ zh: {
34
+ triggerHint: string;
35
+ };
36
+ pl: {
37
+ triggerHint: string;
38
+ };
39
+ sv: {
40
+ triggerHint: string;
41
+ };
42
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@semcore/dropdown-menu",
3
3
  "description": "Semrush DropdownMenu Component",
4
- "version": "16.1.14-prerelease.1",
4
+ "version": "16.2.0-prerelease.0",
5
5
  "main": "lib/cjs/index.js",
6
6
  "module": "lib/es6/index.js",
7
7
  "typings": "lib/types/index.d.ts",
@@ -14,17 +14,17 @@
14
14
  "types": "./lib/types/index.d.ts"
15
15
  },
16
16
  "dependencies": {
17
- "@semcore/button": "16.0.12-prerelease.1",
18
- "@semcore/dropdown": "16.1.3-prerelease.1",
19
- "@semcore/icon": "16.7.3-prerelease.1",
20
- "@semcore/typography": "16.3.2-prerelease.1",
17
+ "@semcore/button": "16.0.12",
18
+ "@semcore/dropdown": "16.1.4-prerelease.0",
19
+ "@semcore/icon": "16.7.3-prerelease.0",
20
+ "@semcore/typography": "16.3.2",
21
21
  "@semcore/popper": "16.0.11",
22
22
  "@semcore/flex-box": "16.0.11",
23
23
  "@semcore/scroll-area": "16.0.11",
24
24
  "classnames": "2.2.6"
25
25
  },
26
26
  "peerDependencies": {
27
- "@semcore/base-components": "^16.0.0"
27
+ "@semcore/base-components": "^16.4.2-prerelease.0"
28
28
  },
29
29
  "repository": {
30
30
  "type": "git",
@@ -33,13 +33,13 @@
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/classnames": "2.2.6",
36
- "@semcore/testing-utils": "1.0.0",
36
+ "@semcore/base-trigger": "16.4.4",
37
37
  "@semcore/core": "16.5.1",
38
- "@semcore/base-trigger": "16.4.4-prerelease.1",
39
- "@semcore/button": "16.0.12-prerelease.1",
40
- "@semcore/icon": "16.7.3-prerelease.1"
38
+ "@semcore/button": "16.0.12",
39
+ "@semcore/testing-utils": "1.0.0",
40
+ "@semcore/icon": "16.7.3-prerelease.0"
41
41
  },
42
42
  "scripts": {
43
- "build": "pnpm semcore-builder --source=js && pnpm vite build"
43
+ "build": "pnpm semcore-builder --source=js,ts && pnpm vite build"
44
44
  }
45
45
  }