@synerise/ds-dropdown 1.0.34 → 1.1.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 +11 -0
- package/README.md +1 -1
- package/dist/Dropdown.const.d.ts +14 -0
- package/dist/Dropdown.const.js +25 -0
- package/dist/Dropdown.d.ts +8 -14
- package/dist/Dropdown.js +72 -68
- package/dist/Dropdown.styles.d.ts +0 -1
- package/dist/Dropdown.styles.js +4 -5
- package/dist/Dropdown.types.d.ts +54 -0
- package/dist/components/BackAction/BackAction.d.ts +3 -0
- package/dist/{elements → components}/BackAction/BackAction.js +3 -6
- package/dist/{elements → components}/BackAction/BackAction.styles.js +7 -7
- package/dist/components/BottomAction/BottomAction.d.ts +3 -0
- package/dist/{elements → components}/BottomAction/BottomAction.js +2 -3
- package/dist/{elements → components}/BottomAction/BottomAction.styles.js +3 -3
- package/dist/components/DropdownFooter/DropdownFooter.d.ts +3 -0
- package/dist/components/DropdownFooter/DropdownFooter.js +10 -0
- package/dist/components/DropdownFooter/DropdownFooter.styles.d.ts +5 -0
- package/dist/components/DropdownFooter/DropdownFooter.styles.js +17 -0
- package/dist/components/DropdownFooter/DropdownFooter.types.d.ts +8 -0
- package/dist/components/DropdownFooter/DropdownFooter.types.js +1 -0
- package/dist/components/DropdownMenu/DropdownMenu.d.ts +4 -0
- package/dist/components/DropdownMenu/DropdownMenu.js +132 -0
- package/dist/components/DropdownMenu/DropdownMenu.types.d.ts +18 -0
- package/dist/components/DropdownMenu/DropdownMenu.types.js +1 -0
- package/dist/components/DropdownMenuList/DropdownMenuList.d.ts +4 -0
- package/dist/components/DropdownMenuList/DropdownMenuList.js +84 -0
- package/dist/components/DropdownMenuList/DropdownMenuList.styles.d.ts +40 -0
- package/dist/components/DropdownMenuList/DropdownMenuList.styles.js +23 -0
- package/dist/components/DropdownMenuList/DropdownMenuList.types.d.ts +7 -0
- package/dist/components/DropdownMenuList/DropdownMenuList.types.js +1 -0
- package/dist/components/DropdownOverlay/DropdownOverlay.d.ts +7 -0
- package/dist/components/DropdownOverlay/DropdownOverlay.js +73 -0
- package/dist/components/DropdownOverlay/DropdownOverlay.styles.d.ts +4 -0
- package/dist/components/DropdownOverlay/DropdownOverlay.styles.js +12 -0
- package/dist/components/DropdownOverlay/DropdownOverlay.types.d.ts +8 -0
- package/dist/components/DropdownOverlay/DropdownOverlay.types.js +1 -0
- package/dist/components/DropdownPopover/DropdownPopover.d.ts +3 -0
- package/dist/components/DropdownPopover/DropdownPopover.js +79 -0
- package/dist/components/DropdownPopover/DropdownPopover.types.d.ts +8 -0
- package/dist/components/DropdownPopover/DropdownPopover.types.js +1 -0
- package/dist/components/TextTrigger/TextTrigger.d.ts +3 -0
- package/dist/{elements → components}/TextTrigger/TextTrigger.js +6 -5
- package/dist/{elements → components}/TextTrigger/TextTrigger.styles.js +2 -2
- package/dist/{elements → components}/TextTrigger/TextTrigger.types.d.ts +1 -1
- package/dist/components/TextTrigger/TextTrigger.types.js +1 -0
- package/dist/hooks/useDefaultTexts.d.ts +2 -0
- package/dist/hooks/useDefaultTexts.js +21 -0
- package/dist/hooks/useDropdownVisibility.d.ts +10 -0
- package/dist/hooks/useDropdownVisibility.js +40 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.js +6 -1
- package/dist/utils/getDropdownWidth.d.ts +2 -0
- package/dist/utils/getDropdownWidth.js +18 -0
- package/dist/utils/getPlacement.d.ts +3 -0
- package/dist/utils/getPlacement.js +4 -0
- package/dist/utils/getTransitionConfig.d.ts +4 -0
- package/dist/utils/getTransitionConfig.js +15 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/isSplitFooter.d.ts +2 -0
- package/dist/utils/isSplitFooter.js +3 -0
- package/package.json +16 -8
- package/dist/elements/BackAction/BackAction.d.ts +0 -4
- package/dist/elements/BottomAction/BottomAction.d.ts +0 -4
- package/dist/elements/TextTrigger/TextTrigger.d.ts +0 -4
- package/dist/style/index.css +0 -1
- /package/dist/{elements/BackAction/BackAction.types.js → Dropdown.types.js} +0 -0
- /package/dist/{elements → components}/BackAction/BackAction.styles.d.ts +0 -0
- /package/dist/{elements → components}/BackAction/BackAction.types.d.ts +0 -0
- /package/dist/{elements/BottomAction/BottomAction.types.js → components/BackAction/BackAction.types.js} +0 -0
- /package/dist/{elements → components}/BottomAction/BottomAction.styles.d.ts +0 -0
- /package/dist/{elements → components}/BottomAction/BottomAction.types.d.ts +0 -0
- /package/dist/{elements/TextTrigger/TextTrigger.types.js → components/BottomAction/BottomAction.types.js} +0 -0
- /package/dist/{elements → components}/TextTrigger/TextTrigger.styles.d.ts +0 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { ListItemProps } from '@synerise/ds-list-item';
|
|
3
|
+
import { type DropdownSharedProps } from '../../Dropdown.types';
|
|
4
|
+
export type DropdownMenuTexts = {
|
|
5
|
+
searchPlaceholder: string;
|
|
6
|
+
noSearchResults: ReactNode;
|
|
7
|
+
searchClearTooltip: ReactNode;
|
|
8
|
+
};
|
|
9
|
+
export type DropdownMenuProps<ItemType extends ListItemProps> = Omit<DropdownSharedProps, 'overlay' | 'dropdownRender' | 'defaultOpen' | 'align' | 'hideOnItemClick'> & {
|
|
10
|
+
dataSource: ItemType[];
|
|
11
|
+
hideOnItemClick?: boolean;
|
|
12
|
+
virtualised?: boolean;
|
|
13
|
+
withSearch?: boolean;
|
|
14
|
+
maxVisibleItems?: number;
|
|
15
|
+
texts?: Partial<DropdownMenuTexts>;
|
|
16
|
+
itemMatchesSearchQuery?: (item: ItemType, query: string) => boolean;
|
|
17
|
+
onSearchQueryChange?: (query: string) => void;
|
|
18
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type ListItemProps } from '@synerise/ds-list-item';
|
|
3
|
+
import { type DropdownMenuListProps } from './DropdownMenuList.types';
|
|
4
|
+
export declare const DropdownMenuList: <ItemType extends ListItemProps>({ dataSource, maxVisibleItems, hideOnItemClick, virtualised, closeOverlay, texts, }: DropdownMenuListProps<ItemType>) => React.JSX.Element;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
import React, { useCallback, useMemo } from 'react';
|
|
3
|
+
import { VariableSizeList } from 'react-window';
|
|
4
|
+
import { SearchNoResultsL } from '@synerise/ds-icon';
|
|
5
|
+
import { LIST_ITEM_SIZE_MAPPING } from '@synerise/ds-list-item';
|
|
6
|
+
import Scrollbar from '@synerise/ds-scrollbar';
|
|
7
|
+
import { MAX_VISIBLE_ITEMS, SCROLLBAR_OFFSET } from '../../Dropdown.const';
|
|
8
|
+
import * as S from './DropdownMenuList.styles';
|
|
9
|
+
export var DropdownMenuList = function DropdownMenuList(_ref) {
|
|
10
|
+
var dataSource = _ref.dataSource,
|
|
11
|
+
_ref$maxVisibleItems = _ref.maxVisibleItems,
|
|
12
|
+
maxVisibleItems = _ref$maxVisibleItems === void 0 ? MAX_VISIBLE_ITEMS : _ref$maxVisibleItems,
|
|
13
|
+
hideOnItemClick = _ref.hideOnItemClick,
|
|
14
|
+
virtualised = _ref.virtualised,
|
|
15
|
+
closeOverlay = _ref.closeOverlay,
|
|
16
|
+
texts = _ref.texts;
|
|
17
|
+
var getItemSize = useCallback(function (index) {
|
|
18
|
+
return dataSource[index].type === 'divider' ? 17 : LIST_ITEM_SIZE_MAPPING[dataSource[index].size || 'default'];
|
|
19
|
+
}, [dataSource]);
|
|
20
|
+
var handleItemClick = useCallback(function () {
|
|
21
|
+
if (hideOnItemClick) {
|
|
22
|
+
setTimeout(function () {
|
|
23
|
+
closeOverlay();
|
|
24
|
+
}, 10);
|
|
25
|
+
}
|
|
26
|
+
}, [hideOnItemClick, closeOverlay]);
|
|
27
|
+
var _useMemo = useMemo(function () {
|
|
28
|
+
var height = 0;
|
|
29
|
+
var maxHeight = 0;
|
|
30
|
+
var visibleItems = 0;
|
|
31
|
+
dataSource.forEach(function (item, index) {
|
|
32
|
+
var itemHeight = getItemSize(index);
|
|
33
|
+
height += itemHeight;
|
|
34
|
+
if (visibleItems < maxVisibleItems) {
|
|
35
|
+
maxHeight += itemHeight;
|
|
36
|
+
}
|
|
37
|
+
if (item.type !== 'divider') {
|
|
38
|
+
visibleItems += 1;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
listHeight: height,
|
|
43
|
+
listMaxHeight: maxHeight
|
|
44
|
+
};
|
|
45
|
+
}, [dataSource, getItemSize, maxVisibleItems]),
|
|
46
|
+
listHeight = _useMemo.listHeight,
|
|
47
|
+
listMaxHeight = _useMemo.listMaxHeight;
|
|
48
|
+
return /*#__PURE__*/React.createElement(S.ScrollableMenuWrapper, null, dataSource.length ? /*#__PURE__*/React.createElement(Scrollbar, {
|
|
49
|
+
absolute: true,
|
|
50
|
+
maxHeight: listMaxHeight + SCROLLBAR_OFFSET
|
|
51
|
+
}, /*#__PURE__*/React.createElement(S.DropdownMenuList, null, virtualised ? /*#__PURE__*/React.createElement(VariableSizeList, {
|
|
52
|
+
height: listHeight,
|
|
53
|
+
itemData: dataSource,
|
|
54
|
+
itemCount: dataSource.length,
|
|
55
|
+
itemSize: getItemSize,
|
|
56
|
+
width: "100%",
|
|
57
|
+
style: {
|
|
58
|
+
paddingRight: '8px'
|
|
59
|
+
}
|
|
60
|
+
}, function (listItemData) {
|
|
61
|
+
var data = listItemData.data,
|
|
62
|
+
index = listItemData.index;
|
|
63
|
+
var item = data[index];
|
|
64
|
+
return item.type === 'divider' ? /*#__PURE__*/React.createElement(S.DropdownMenuListItem, item) : /*#__PURE__*/React.createElement(S.DropdownMenuListItem, _extends({}, item, {
|
|
65
|
+
itemKey: item.key,
|
|
66
|
+
onClick: function onClick(itemData) {
|
|
67
|
+
item.onClick == null || item.onClick(itemData);
|
|
68
|
+
handleItemClick();
|
|
69
|
+
}
|
|
70
|
+
}));
|
|
71
|
+
}) : /*#__PURE__*/React.createElement(React.Fragment, null, dataSource.map(function (item) {
|
|
72
|
+
return item.type === 'divider' ? /*#__PURE__*/React.createElement(S.DropdownMenuListItem, item) : /*#__PURE__*/React.createElement(S.DropdownMenuListItem, _extends({}, item, {
|
|
73
|
+
itemKey: item.key,
|
|
74
|
+
onClick: function onClick(itemData) {
|
|
75
|
+
item.onClick == null || item.onClick(itemData);
|
|
76
|
+
handleItemClick();
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
})))) : /*#__PURE__*/React.createElement(S.EmptyStates, {
|
|
80
|
+
iconPosition: "top",
|
|
81
|
+
customIcon: /*#__PURE__*/React.createElement(SearchNoResultsL, null),
|
|
82
|
+
label: texts.noSearchResults
|
|
83
|
+
}));
|
|
84
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export declare const ScrollableMenuWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
2
|
+
export declare const MenuWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
3
|
+
export declare const EmptyStates: import("styled-components").StyledComponent<({ size, label, text, button, fontSize, customIcon, className, mode, iconPosition, textAlign, }: import("@synerise/ds-empty-states").EmptyStatesProps) => React.JSX.Element, any, {}, never>;
|
|
4
|
+
export declare const DropdownMenuListItem: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<import("@synerise/ds-list-item/dist/ListItem.types").ListItemDividerProps & {
|
|
5
|
+
checked?: boolean;
|
|
6
|
+
selected?: boolean;
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
className?: string;
|
|
9
|
+
copyable?: boolean | import("@synerise/ds-list-item/dist/ListItem.types").Copyable;
|
|
10
|
+
copyValue?: string;
|
|
11
|
+
copyHint?: React.ReactNode;
|
|
12
|
+
copyTooltip?: React.ReactNode;
|
|
13
|
+
timeToHideTooltip?: number;
|
|
14
|
+
tooltipProps?: import("@synerise/ds-tooltip").TooltipProps;
|
|
15
|
+
description?: React.ReactNode;
|
|
16
|
+
direction?: "ltr" | "rtl";
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
highlight?: string;
|
|
19
|
+
hoverTooltipProps?: Pick<import("rc-trigger").TriggerProps, "onPopupVisibleChange" | "onPopupClick" | "mouseEnterDelay" | "mouseLeaveDelay" | "defaultPopupVisible" | "action" | "afterPopupVisibleChange" | "popupPlacement" | "getPopupContainer" | "forceRender"> & {
|
|
20
|
+
ref?: React.LegacyRef<import("@synerise/ds-list-item/dist/ListItem.types").TriggerHandle>;
|
|
21
|
+
};
|
|
22
|
+
key?: React.Key;
|
|
23
|
+
itemKey?: React.Key;
|
|
24
|
+
noHover?: boolean;
|
|
25
|
+
onItemHover?: import("@synerise/ds-list-item").ListItemEventHandler<import("react").MouseEvent<HTMLDivElement>>;
|
|
26
|
+
onClick?: import("@synerise/ds-list-item").ListItemEventHandler<import("react").MouseEvent<HTMLDivElement> | import("react").KeyboardEvent<HTMLDivElement>>;
|
|
27
|
+
ordered?: boolean;
|
|
28
|
+
parent?: boolean;
|
|
29
|
+
prefixel?: React.ReactNode | import("@synerise/ds-list-item/dist/ListItem.types").AddonRenderer;
|
|
30
|
+
prefixVisibilityTrigger?: "hover" | "default";
|
|
31
|
+
renderHoverTooltip?: () => JSX.Element;
|
|
32
|
+
size?: import("@synerise/ds-list-item").ItemSize;
|
|
33
|
+
suffixel?: React.ReactNode | import("@synerise/ds-list-item/dist/ListItem.types").AddonRenderer;
|
|
34
|
+
suffixVisibilityTrigger?: "hover" | "default";
|
|
35
|
+
text?: React.ReactNode;
|
|
36
|
+
type?: import("@synerise/ds-list-item").ItemType;
|
|
37
|
+
subMenu?: import("@synerise/ds-list-item").ListItemProps[];
|
|
38
|
+
indentLevel?: number;
|
|
39
|
+
} & Omit<import("react").HTMLAttributes<HTMLDivElement>, "className" | "children" | "onClick" | "disabled" | "size" | keyof import("@synerise/ds-list-item/dist/ListItem.types").ListItemDividerProps | "checked" | "selected" | "copyable" | "copyValue" | "copyHint" | "copyTooltip" | "timeToHideTooltip" | "tooltipProps" | "description" | "direction" | "highlight" | "hoverTooltipProps" | "key" | "itemKey" | "noHover" | "onItemHover" | "ordered" | "parent" | "prefixel" | "prefixVisibilityTrigger" | "renderHoverTooltip" | "suffixel" | "suffixVisibilityTrigger" | "text" | "type" | "subMenu" | "indentLevel"> & import("@synerise/ds-utils").DataAttributes & import("react").RefAttributes<HTMLDivElement>>, any, {}, never>;
|
|
40
|
+
export declare const DropdownMenuList: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
import EmptyStatesBase from '@synerise/ds-empty-states';
|
|
3
|
+
import ListItemBase from '@synerise/ds-list-item';
|
|
4
|
+
export var ScrollableMenuWrapper = styled.div.withConfig({
|
|
5
|
+
displayName: "DropdownMenuListstyles__ScrollableMenuWrapper",
|
|
6
|
+
componentId: "sc-1lf08nj-0"
|
|
7
|
+
})(["padding:8px 0 8px 8px;"]);
|
|
8
|
+
export var MenuWrapper = styled.div.withConfig({
|
|
9
|
+
displayName: "DropdownMenuListstyles__MenuWrapper",
|
|
10
|
+
componentId: "sc-1lf08nj-1"
|
|
11
|
+
})(["padding:8px;"]);
|
|
12
|
+
export var EmptyStates = styled(EmptyStatesBase).withConfig({
|
|
13
|
+
displayName: "DropdownMenuListstyles__EmptyStates",
|
|
14
|
+
componentId: "sc-1lf08nj-2"
|
|
15
|
+
})(["margin:48px 0;"]);
|
|
16
|
+
export var DropdownMenuListItem = styled(ListItemBase).withConfig({
|
|
17
|
+
displayName: "DropdownMenuListstyles__DropdownMenuListItem",
|
|
18
|
+
componentId: "sc-1lf08nj-3"
|
|
19
|
+
})(["min-width:0;"]);
|
|
20
|
+
export var DropdownMenuList = styled.div.withConfig({
|
|
21
|
+
displayName: "DropdownMenuListstyles__DropdownMenuList",
|
|
22
|
+
componentId: "sc-1lf08nj-4"
|
|
23
|
+
})(["padding-right:8px;"]);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ListItemProps } from '@synerise/ds-list-item';
|
|
2
|
+
import { type DropdownMenuProps, type DropdownMenuTexts } from '../DropdownMenu/DropdownMenu.types';
|
|
3
|
+
export type DropdownMenuListItemProps = ListItemProps;
|
|
4
|
+
export type DropdownMenuListProps<ItemType extends DropdownMenuListItemProps> = Pick<DropdownMenuProps<ItemType>, 'dataSource' | 'hideOnItemClick' | 'virtualised' | 'maxVisibleItems'> & {
|
|
5
|
+
closeOverlay: () => void;
|
|
6
|
+
texts: DropdownMenuTexts;
|
|
7
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare const DropdownOverlay: React.ForwardRefExoticComponent<Pick<import("../..").DropdownProps, "overlayStyle" | "overlayClassName" | "size" | "hideOnItemClick"> & {
|
|
3
|
+
content: React.ReactNode;
|
|
4
|
+
triggerRef: React.RefObject<HTMLElement>;
|
|
5
|
+
htmlAttributes?: React.HTMLAttributes<HTMLDivElement>;
|
|
6
|
+
handleItemClick?: () => void;
|
|
7
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
import classnames from 'classnames';
|
|
3
|
+
import React, { forwardRef, useEffect, useRef, useState } from 'react';
|
|
4
|
+
import { useMergeRefs } from '@floating-ui/react';
|
|
5
|
+
import { getDropdownWidth } from '../../utils';
|
|
6
|
+
import { OverlayWrapper } from './DropdownOverlay.styles';
|
|
7
|
+
export var DropdownOverlay = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
8
|
+
var _getDropdownWidth;
|
|
9
|
+
var content = _ref.content,
|
|
10
|
+
size = _ref.size,
|
|
11
|
+
overlayStyle = _ref.overlayStyle,
|
|
12
|
+
overlayClassName = _ref.overlayClassName,
|
|
13
|
+
htmlAttributes = _ref.htmlAttributes,
|
|
14
|
+
hideOnItemClick = _ref.hideOnItemClick,
|
|
15
|
+
handleItemClick = _ref.handleItemClick,
|
|
16
|
+
triggerRef = _ref.triggerRef;
|
|
17
|
+
var overlayWrapperRef = useRef(null);
|
|
18
|
+
var mergedRef = useMergeRefs([overlayWrapperRef, ref]);
|
|
19
|
+
var _useState = useState((_getDropdownWidth = getDropdownWidth(size)) != null ? _getDropdownWidth : 0),
|
|
20
|
+
overlaySize = _useState[0],
|
|
21
|
+
setOverlaySize = _useState[1];
|
|
22
|
+
useEffect(function () {
|
|
23
|
+
if (triggerRef.current && (size === 'match-trigger' || size === 'min-match-trigger')) {
|
|
24
|
+
setOverlaySize(triggerRef.current.clientWidth);
|
|
25
|
+
} else {
|
|
26
|
+
var _getDropdownWidth2;
|
|
27
|
+
setOverlaySize((_getDropdownWidth2 = getDropdownWidth(size)) != null ? _getDropdownWidth2 : 0);
|
|
28
|
+
}
|
|
29
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
30
|
+
}, [size]);
|
|
31
|
+
useEffect(function () {
|
|
32
|
+
var handleItemSelect = function handleItemSelect(element) {
|
|
33
|
+
var _overlayWrapperRef$cu;
|
|
34
|
+
var itemSelector = typeof hideOnItemClick === 'string' ? hideOnItemClick : '[role="menuitem"]';
|
|
35
|
+
var listItem = element.closest(itemSelector);
|
|
36
|
+
if ((_overlayWrapperRef$cu = overlayWrapperRef.current) != null && _overlayWrapperRef$cu.contains(listItem)) {
|
|
37
|
+
setTimeout(function () {
|
|
38
|
+
handleItemClick == null || handleItemClick();
|
|
39
|
+
}, 0);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
var handleOverlayClick = function handleOverlayClick(event) {
|
|
43
|
+
if (overlayWrapperRef.current && typeof hideOnItemClick === 'string' && event.target instanceof HTMLElement) {
|
|
44
|
+
handleItemSelect(event.target);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
var handleItemEnterPress = function handleItemEnterPress(event) {
|
|
48
|
+
if (event.key === 'Enter') {
|
|
49
|
+
if (overlayWrapperRef.current && typeof hideOnItemClick === 'string' && event.target instanceof HTMLElement) {
|
|
50
|
+
handleItemSelect(event.target);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
var overlayNode = overlayWrapperRef.current;
|
|
55
|
+
if (overlayNode) {
|
|
56
|
+
overlayNode.addEventListener('click', handleOverlayClick);
|
|
57
|
+
overlayNode.addEventListener('keydown', handleItemEnterPress);
|
|
58
|
+
}
|
|
59
|
+
return function () {
|
|
60
|
+
if (overlayNode) {
|
|
61
|
+
overlayNode.removeEventListener('click', handleOverlayClick);
|
|
62
|
+
overlayNode.removeEventListener('keydown', handleItemEnterPress);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
return /*#__PURE__*/React.createElement(OverlayWrapper, _extends({
|
|
67
|
+
style: overlayStyle,
|
|
68
|
+
className: classnames(overlayClassName, htmlAttributes == null ? void 0 : htmlAttributes.className),
|
|
69
|
+
$width: overlaySize,
|
|
70
|
+
widthProperty: size === 'min-match-trigger' ? 'min-width' : 'width',
|
|
71
|
+
ref: mergedRef
|
|
72
|
+
}, htmlAttributes), content);
|
|
73
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
import { Wrapper as ListItemWrapper } from '@synerise/ds-list-item/dist/components/Text/Text.styles';
|
|
3
|
+
export var OverlayWrapper = styled.div.withConfig({
|
|
4
|
+
displayName: "DropdownOverlaystyles__OverlayWrapper",
|
|
5
|
+
componentId: "sc-hy0f4i-0"
|
|
6
|
+
})(["background:", ";box-shadow:", ";border-radius:3px;", ";overflow:hidden;", "{min-width:0;}"], function (props) {
|
|
7
|
+
return props.theme.palette.white;
|
|
8
|
+
}, function (props) {
|
|
9
|
+
return props.theme.variables['box-shadow-2'];
|
|
10
|
+
}, function (props) {
|
|
11
|
+
return props.$width && props.widthProperty + ": " + props.$width + "px";
|
|
12
|
+
}, ListItemWrapper);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type HTMLAttributes, type ReactNode, type RefObject } from 'react';
|
|
2
|
+
import { type DropdownProps } from '../../Dropdown.types';
|
|
3
|
+
export type DropdownOverlayProps = Pick<DropdownProps, 'size' | 'overlayStyle' | 'hideOnItemClick' | 'overlayClassName'> & {
|
|
4
|
+
content: ReactNode;
|
|
5
|
+
triggerRef: RefObject<HTMLElement>;
|
|
6
|
+
htmlAttributes?: HTMLAttributes<HTMLDivElement>;
|
|
7
|
+
handleItemClick?: () => void;
|
|
8
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type DropdownPopoverProps } from './DropdownPopover.types';
|
|
3
|
+
export declare const DropdownPopover: ({ placement, children, popoverProps, popoverTriggerProps, getPopupContainer, trigger, open, onDismiss, overlay, handleOpenChange, size, handleItemClick, handleTriggerClick, hideOnItemClick, asChild, overlayStyle, overlayClassName, overlayHTMLAttributes, activeIndex, setActiveIndex, }: DropdownPopoverProps) => React.JSX.Element;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
import React, { useRef } from 'react';
|
|
3
|
+
import { FloatingList } from '@floating-ui/react';
|
|
4
|
+
import { DropdownContextProvider } from '@synerise/ds-core';
|
|
5
|
+
import { Popover, PopoverContent, PopoverTrigger } from '@synerise/ds-popover';
|
|
6
|
+
import { POPOVER_FLIP_CONFIG, POPOVER_OFFSET_CONFIG, POPOVER_SHIFT_CONFIG, POPOVER_TRANSITION_DURATION } from '../../Dropdown.const';
|
|
7
|
+
import { getPlacement, getTransitionConfig } from '../../utils';
|
|
8
|
+
import { DropdownOverlay } from '../DropdownOverlay/DropdownOverlay';
|
|
9
|
+
export var DropdownPopover = function DropdownPopover(_ref) {
|
|
10
|
+
var _ref$placement = _ref.placement,
|
|
11
|
+
placement = _ref$placement === void 0 ? 'bottomLeft' : _ref$placement,
|
|
12
|
+
children = _ref.children,
|
|
13
|
+
popoverProps = _ref.popoverProps,
|
|
14
|
+
popoverTriggerProps = _ref.popoverTriggerProps,
|
|
15
|
+
getPopupContainer = _ref.getPopupContainer,
|
|
16
|
+
trigger = _ref.trigger,
|
|
17
|
+
open = _ref.open,
|
|
18
|
+
onDismiss = _ref.onDismiss,
|
|
19
|
+
overlay = _ref.overlay,
|
|
20
|
+
handleOpenChange = _ref.handleOpenChange,
|
|
21
|
+
size = _ref.size,
|
|
22
|
+
handleItemClick = _ref.handleItemClick,
|
|
23
|
+
handleTriggerClick = _ref.handleTriggerClick,
|
|
24
|
+
hideOnItemClick = _ref.hideOnItemClick,
|
|
25
|
+
asChild = _ref.asChild,
|
|
26
|
+
overlayStyle = _ref.overlayStyle,
|
|
27
|
+
overlayClassName = _ref.overlayClassName,
|
|
28
|
+
overlayHTMLAttributes = _ref.overlayHTMLAttributes,
|
|
29
|
+
activeIndex = _ref.activeIndex,
|
|
30
|
+
setActiveIndex = _ref.setActiveIndex;
|
|
31
|
+
var floatingPlacement = getPlacement(placement);
|
|
32
|
+
var triggerRef = useRef(null);
|
|
33
|
+
var elementsRef = useRef([]);
|
|
34
|
+
var listNavigationConfig = {
|
|
35
|
+
enabled: true,
|
|
36
|
+
activeIndex: activeIndex,
|
|
37
|
+
onNavigate: function onNavigate(newIndex) {
|
|
38
|
+
setActiveIndex(newIndex);
|
|
39
|
+
},
|
|
40
|
+
listRef: elementsRef
|
|
41
|
+
};
|
|
42
|
+
return /*#__PURE__*/React.createElement(Popover, _extends({
|
|
43
|
+
placement: floatingPlacement,
|
|
44
|
+
trigger: trigger,
|
|
45
|
+
modal: false,
|
|
46
|
+
open: open,
|
|
47
|
+
onOpenChange: handleOpenChange,
|
|
48
|
+
onDismiss: onDismiss,
|
|
49
|
+
transitionDuration: POPOVER_TRANSITION_DURATION,
|
|
50
|
+
autoUpdate: true,
|
|
51
|
+
offsetConfig: POPOVER_OFFSET_CONFIG,
|
|
52
|
+
flipConfig: POPOVER_FLIP_CONFIG,
|
|
53
|
+
shiftConfig: POPOVER_SHIFT_CONFIG,
|
|
54
|
+
getTransitionConfig: getTransitionConfig,
|
|
55
|
+
getPopupContainer: getPopupContainer,
|
|
56
|
+
listNavigationConfig: listNavigationConfig,
|
|
57
|
+
testId: "dropdown"
|
|
58
|
+
}, popoverProps), /*#__PURE__*/React.createElement(PopoverTrigger, _extends({
|
|
59
|
+
ref: triggerRef,
|
|
60
|
+
asChild: asChild,
|
|
61
|
+
onClick: handleTriggerClick
|
|
62
|
+
}, popoverTriggerProps), children), /*#__PURE__*/React.createElement(PopoverContent, null, /*#__PURE__*/React.createElement(DropdownContextProvider, {
|
|
63
|
+
hideOnItemClick: hideOnItemClick,
|
|
64
|
+
activeIndex: activeIndex,
|
|
65
|
+
setIsOpen: handleOpenChange,
|
|
66
|
+
isOpen: !!open
|
|
67
|
+
}, /*#__PURE__*/React.createElement(FloatingList, {
|
|
68
|
+
elementsRef: elementsRef
|
|
69
|
+
}, /*#__PURE__*/React.createElement(DropdownOverlay, {
|
|
70
|
+
size: size,
|
|
71
|
+
triggerRef: triggerRef,
|
|
72
|
+
htmlAttributes: overlayHTMLAttributes,
|
|
73
|
+
overlayStyle: overlayStyle,
|
|
74
|
+
overlayClassName: overlayClassName,
|
|
75
|
+
hideOnItemClick: hideOnItemClick,
|
|
76
|
+
content: overlay,
|
|
77
|
+
handleItemClick: handleItemClick
|
|
78
|
+
})))));
|
|
79
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type DropdownProps } from '../../Dropdown.types';
|
|
2
|
+
export type DropdownPopoverProps = Pick<DropdownProps, 'asChild' | 'children' | 'onDismiss' | 'onOpenChange' | 'getPopupContainer' | 'placement' | 'popoverProps' | 'popoverTriggerProps' | 'overlay' | 'overlayClassName' | 'overlayHTMLAttributes' | 'overlayStyle' | 'open' | 'hideOnItemClick' | 'size' | 'trigger'> & {
|
|
3
|
+
handleOpenChange: (newVal: boolean) => void;
|
|
4
|
+
handleItemClick?: () => void;
|
|
5
|
+
handleTriggerClick: () => void;
|
|
6
|
+
setActiveIndex: (index: number | null) => void;
|
|
7
|
+
activeIndex: number | null;
|
|
8
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import {
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import { useTheme } from '@synerise/ds-core';
|
|
3
3
|
import Icon, { AngleDownS } from '@synerise/ds-icon';
|
|
4
4
|
import { Title } from '@synerise/ds-typography';
|
|
5
5
|
import * as S from './TextTrigger.styles';
|
|
6
|
-
var TextTrigger = function
|
|
6
|
+
export var TextTrigger = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
7
7
|
var value = _ref.value,
|
|
8
8
|
expanded = _ref.expanded,
|
|
9
9
|
size = _ref.size,
|
|
@@ -13,10 +13,12 @@ var TextTrigger = function TextTrigger(_ref) {
|
|
|
13
13
|
onFocus = _ref.onFocus,
|
|
14
14
|
_ref$isDisabled = _ref.isDisabled,
|
|
15
15
|
isDisabled = _ref$isDisabled === void 0 ? false : _ref$isDisabled;
|
|
16
|
+
var theme = useTheme();
|
|
16
17
|
return /*#__PURE__*/React.createElement(S.TextTrigger, {
|
|
17
18
|
onFocus: isDisabled ? undefined : onFocus,
|
|
18
19
|
inactiveColor: theme.palette[inactiveColor],
|
|
19
20
|
tabIndex: 0,
|
|
21
|
+
ref: ref,
|
|
20
22
|
onClick: isDisabled ? undefined : onClick,
|
|
21
23
|
isDisabled: isDisabled
|
|
22
24
|
}, /*#__PURE__*/React.createElement(Title, {
|
|
@@ -26,5 +28,4 @@ var TextTrigger = function TextTrigger(_ref) {
|
|
|
26
28
|
}, /*#__PURE__*/React.createElement(Icon, {
|
|
27
29
|
component: /*#__PURE__*/React.createElement(AngleDownS, null)
|
|
28
30
|
})));
|
|
29
|
-
};
|
|
30
|
-
export default TextTrigger;
|
|
31
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import styled from 'styled-components';
|
|
2
2
|
export var TextTrigger = styled.div.withConfig({
|
|
3
3
|
displayName: "TextTriggerstyles__TextTrigger",
|
|
4
|
-
componentId: "sc-
|
|
4
|
+
componentId: "sc-xuqby2-0"
|
|
5
5
|
})(["display:flex;flex-direction:row;align-items:center;justify-content:center;cursor:", ";opacity:", ";.ds-title{margin:0;}.ds-title,svg{color:", ";fill:", ";}&&&:focus{.ds-title,svg{color:", ";fill:", ";}}}&:hover{.ds-title,svg{color:", ";fill:", ";}}"], function (props) {
|
|
6
6
|
return props.isDisabled ? 'default' : 'pointer';
|
|
7
7
|
}, function (props) {
|
|
@@ -21,7 +21,7 @@ export var TextTrigger = styled.div.withConfig({
|
|
|
21
21
|
});
|
|
22
22
|
export var IconWrapper = styled.div.withConfig({
|
|
23
23
|
displayName: "TextTriggerstyles__IconWrapper",
|
|
24
|
-
componentId: "sc-
|
|
24
|
+
componentId: "sc-xuqby2-1"
|
|
25
25
|
})(["&&&{svg{transition:transform 0.1s linear;transform:rotateZ( ", " );}}"], function (props) {
|
|
26
26
|
return props.expanded ? '180deg' : '0deg';
|
|
27
27
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { FormattedMessage, useIntl } from 'react-intl';
|
|
4
|
+
export var useDefaultTexts = function useDefaultTexts(customTexts) {
|
|
5
|
+
var _useIntl = useIntl(),
|
|
6
|
+
formatMessage = _useIntl.formatMessage;
|
|
7
|
+
return _extends({
|
|
8
|
+
noSearchResults: /*#__PURE__*/React.createElement(FormattedMessage, {
|
|
9
|
+
id: "DS.DROPDOWN-MENU.NO-SEARCH-RESULTS",
|
|
10
|
+
defaultMessage: "No results"
|
|
11
|
+
}),
|
|
12
|
+
searchClearTooltip: /*#__PURE__*/React.createElement(FormattedMessage, {
|
|
13
|
+
id: "DS.CONFIRMATION.SEARCH-CLEAR-TOOLTIP",
|
|
14
|
+
defaultMessage: "Clear"
|
|
15
|
+
}),
|
|
16
|
+
searchPlaceholder: formatMessage({
|
|
17
|
+
id: 'DS.DROPDOWN-MENU.SEARCH-PLACEHOLDER',
|
|
18
|
+
defaultMessage: 'Search'
|
|
19
|
+
})
|
|
20
|
+
}, customTexts || {});
|
|
21
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type UseDropdownVisibilityProps = {
|
|
2
|
+
open?: boolean;
|
|
3
|
+
defaultOpen?: boolean;
|
|
4
|
+
onOpenChange?: (newState: boolean) => void;
|
|
5
|
+
};
|
|
6
|
+
export declare const useDropdownVisibility: ({ open, onOpenChange, }: UseDropdownVisibilityProps) => {
|
|
7
|
+
toggleOpen: (openState: boolean) => void;
|
|
8
|
+
open: boolean | undefined;
|
|
9
|
+
};
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
+
export var useDropdownVisibility = function useDropdownVisibility(_ref) {
|
|
3
|
+
var open = _ref.open,
|
|
4
|
+
onOpenChange = _ref.onOpenChange;
|
|
5
|
+
var _useState = useState(open),
|
|
6
|
+
internalOpen = _useState[0],
|
|
7
|
+
setInternalOpen = _useState[1];
|
|
8
|
+
var skipDuplicates = useRef(0);
|
|
9
|
+
var controlledComponent = open !== undefined;
|
|
10
|
+
var actualOpen = controlledComponent ? open : internalOpen;
|
|
11
|
+
useEffect(function () {
|
|
12
|
+
skipDuplicates.current = 0;
|
|
13
|
+
}, [internalOpen]);
|
|
14
|
+
useEffect(function () {
|
|
15
|
+
if (controlledComponent && open !== internalOpen) {
|
|
16
|
+
if (skipDuplicates.current === 0) {
|
|
17
|
+
skipDuplicates.current += 1;
|
|
18
|
+
onOpenChange == null || onOpenChange(open);
|
|
19
|
+
}
|
|
20
|
+
setInternalOpen(open);
|
|
21
|
+
}
|
|
22
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
23
|
+
}, [controlledComponent, open]);
|
|
24
|
+
var toggleOpen = useCallback(function (openState) {
|
|
25
|
+
if (openState !== internalOpen) {
|
|
26
|
+
setInternalOpen(openState);
|
|
27
|
+
}
|
|
28
|
+
// PopupTrigger fires toggleOpen onClick
|
|
29
|
+
// the trigger in the implementation may or may not have an onClick that changes `open` state
|
|
30
|
+
// this prevents duplicated onOpenChange calls if both have onClicks defined
|
|
31
|
+
if (skipDuplicates.current === 0) {
|
|
32
|
+
skipDuplicates.current += 1;
|
|
33
|
+
onOpenChange == null || onOpenChange(openState);
|
|
34
|
+
}
|
|
35
|
+
}, [internalOpen, onOpenChange]);
|
|
36
|
+
return {
|
|
37
|
+
toggleOpen: toggleOpen,
|
|
38
|
+
open: actualOpen
|
|
39
|
+
};
|
|
40
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1,9 @@
|
|
|
1
|
-
export { default,
|
|
1
|
+
export { default, Dropdown } from './Dropdown';
|
|
2
|
+
export { DropdownMenu } from './components/DropdownMenu/DropdownMenu';
|
|
3
|
+
export { DropdownOverlay } from './components/DropdownOverlay/DropdownOverlay';
|
|
4
|
+
export { TextTrigger } from './components/TextTrigger/TextTrigger';
|
|
5
|
+
export { BackAction } from './components/BackAction/BackAction';
|
|
6
|
+
export { BottomAction } from './components/BottomAction/BottomAction';
|
|
7
|
+
export type { DropdownPlacement, DropdownProps, DropdownSharedProps, DropdownSize, } from './Dropdown.types';
|
|
8
|
+
export { type DropdownMenuProps } from './components/DropdownMenu/DropdownMenu.types';
|
|
9
|
+
export { type DropdownMenuListItemProps } from './components/DropdownMenuList/DropdownMenuList.types';
|
package/dist/index.js
CHANGED
|
@@ -1 +1,6 @@
|
|
|
1
|
-
export { default } from './Dropdown';
|
|
1
|
+
export { default, Dropdown } from './Dropdown';
|
|
2
|
+
export { DropdownMenu } from './components/DropdownMenu/DropdownMenu';
|
|
3
|
+
export { DropdownOverlay } from './components/DropdownOverlay/DropdownOverlay';
|
|
4
|
+
export { TextTrigger } from './components/TextTrigger/TextTrigger';
|
|
5
|
+
export { BackAction } from './components/BackAction/BackAction';
|
|
6
|
+
export { BottomAction } from './components/BottomAction/BottomAction';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export var getDropdownWidth = function getDropdownWidth(size) {
|
|
2
|
+
if (typeof size === 'number') {
|
|
3
|
+
return size;
|
|
4
|
+
}
|
|
5
|
+
switch (size) {
|
|
6
|
+
case 'small':
|
|
7
|
+
return 216;
|
|
8
|
+
case 'large':
|
|
9
|
+
return 588;
|
|
10
|
+
case 'medium':
|
|
11
|
+
return 282;
|
|
12
|
+
case 'auto':
|
|
13
|
+
case 'match-trigger':
|
|
14
|
+
case 'min-match-trigger':
|
|
15
|
+
default:
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export var getTransitionConfig = function getTransitionConfig(_ref) {
|
|
2
|
+
var placement = _ref.placement;
|
|
3
|
+
var isTop = placement.indexOf('top');
|
|
4
|
+
return {
|
|
5
|
+
open: {
|
|
6
|
+
transform: 'scaleY(1)'
|
|
7
|
+
},
|
|
8
|
+
initial: {
|
|
9
|
+
transform: 'scaleY(0)'
|
|
10
|
+
},
|
|
11
|
+
common: {
|
|
12
|
+
transformOrigin: isTop ? 'top' : 'bottom'
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
};
|