@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.
- package/CHANGELOG.md +10 -0
- package/lib/cjs/DropdownMenu.js +107 -67
- package/lib/cjs/DropdownMenu.js.map +1 -1
- package/lib/cjs/components/Context.js +16 -0
- package/lib/cjs/components/Context.js.map +1 -0
- package/lib/cjs/components/VirtualList.js +141 -0
- package/lib/cjs/components/VirtualList.js.map +1 -0
- package/lib/cjs/index.d.js.map +1 -1
- package/lib/es6/DropdownMenu.js +102 -62
- package/lib/es6/DropdownMenu.js.map +1 -1
- package/lib/es6/components/Context.js +9 -0
- package/lib/es6/components/Context.js.map +1 -0
- package/lib/es6/components/VirtualList.js +136 -0
- package/lib/es6/components/VirtualList.js.map +1 -0
- package/lib/es6/index.d.js.map +1 -1
- package/lib/esm/DropdownMenu.mjs +82 -50
- package/lib/esm/components/Context.mjs +11 -0
- package/lib/esm/components/VirtualList.mjs +132 -0
- package/lib/types/components/Context.d.ts +2 -0
- package/lib/types/components/VirtualList.d.ts +25 -0
- package/lib/types/index.d.ts +9 -0
- package/lib/types/translations/__intergalactic-dynamic-locales.d.ts +42 -0
- package/package.json +11 -11
package/lib/esm/DropdownMenu.mjs
CHANGED
|
@@ -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
|
|
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
|
-
".
|
|
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
|
-
"
|
|
34
|
+
"1d1ud_gg_"
|
|
33
35
|
), /*__reshadow_css_end__*/
|
|
34
36
|
{
|
|
35
|
-
"__SDropdownMenuItemContainer": "
|
|
36
|
-
"_nesting-trigger": "__nesting-
|
|
37
|
-
"__SDropdownMenuNesting": "
|
|
38
|
-
"_size_l": "
|
|
39
|
-
"_size_m": "
|
|
40
|
-
"_highlighted": "
|
|
41
|
-
"__SDropdownNestingItem": "
|
|
42
|
-
"__SItemHint": "
|
|
43
|
-
"__SDropdownMenuList": "
|
|
44
|
-
"__SBar": "
|
|
45
|
-
"__SShadowHorizontal": "
|
|
46
|
-
"__SShadowVertical": "
|
|
47
|
-
"__SItemContent": "
|
|
48
|
-
"__SDropdownMenuItemAddon": "
|
|
49
|
-
"__SItemContentText": "
|
|
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
|
-
},
|
|
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.
|
|
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.
|
|
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:
|
|
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(
|
|
312
|
+
function List(_ref22) {
|
|
284
313
|
var _ref2 = arguments[0], _ref13;
|
|
285
|
-
var styles =
|
|
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(
|
|
329
|
+
function Actions(_ref23) {
|
|
301
330
|
var _ref3 = arguments[0], _ref14;
|
|
302
|
-
var 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(
|
|
351
|
+
function Item(_ref24) {
|
|
323
352
|
var _ref5 = arguments[0], _ref15;
|
|
324
|
-
var id =
|
|
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(
|
|
430
|
+
function ItemContent(_ref25) {
|
|
401
431
|
var _ref8 = arguments[0], _ref17;
|
|
402
|
-
var 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(
|
|
465
|
+
function ItemContentText(_ref26) {
|
|
435
466
|
var _ref9 = arguments[0], _ref18;
|
|
436
|
-
var 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(
|
|
471
|
+
function ItemHint(_ref27) {
|
|
441
472
|
var _ref0 = arguments[0], _ref19;
|
|
442
|
-
var 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(
|
|
495
|
+
function Nesting(_ref28) {
|
|
465
496
|
var _ref11 = arguments[0];
|
|
466
|
-
var 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(
|
|
502
|
+
function NestingTrigger(_ref29) {
|
|
472
503
|
var _ref12 = arguments[0];
|
|
473
|
-
var 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,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 {};
|
package/lib/types/index.d.ts
CHANGED
|
@@ -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.
|
|
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
|
|
18
|
-
"@semcore/dropdown": "16.1.
|
|
19
|
-
"@semcore/icon": "16.7.3-prerelease.
|
|
20
|
-
"@semcore/typography": "16.3.2
|
|
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.
|
|
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/
|
|
36
|
+
"@semcore/base-trigger": "16.4.4",
|
|
37
37
|
"@semcore/core": "16.5.1",
|
|
38
|
-
"@semcore/
|
|
39
|
-
"@semcore/
|
|
40
|
-
"@semcore/icon": "16.7.3-prerelease.
|
|
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
|
}
|