@synerise/ds-dropdown 1.0.33 → 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.
Files changed (75) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +1 -1
  3. package/dist/Dropdown.const.d.ts +14 -0
  4. package/dist/Dropdown.const.js +25 -0
  5. package/dist/Dropdown.d.ts +8 -14
  6. package/dist/Dropdown.js +72 -68
  7. package/dist/Dropdown.styles.d.ts +0 -1
  8. package/dist/Dropdown.styles.js +4 -5
  9. package/dist/Dropdown.types.d.ts +54 -0
  10. package/dist/components/BackAction/BackAction.d.ts +3 -0
  11. package/dist/{elements → components}/BackAction/BackAction.js +3 -6
  12. package/dist/{elements → components}/BackAction/BackAction.styles.js +7 -7
  13. package/dist/components/BottomAction/BottomAction.d.ts +3 -0
  14. package/dist/{elements → components}/BottomAction/BottomAction.js +2 -3
  15. package/dist/{elements → components}/BottomAction/BottomAction.styles.js +3 -3
  16. package/dist/components/DropdownFooter/DropdownFooter.d.ts +3 -0
  17. package/dist/components/DropdownFooter/DropdownFooter.js +10 -0
  18. package/dist/components/DropdownFooter/DropdownFooter.styles.d.ts +5 -0
  19. package/dist/components/DropdownFooter/DropdownFooter.styles.js +17 -0
  20. package/dist/components/DropdownFooter/DropdownFooter.types.d.ts +8 -0
  21. package/dist/components/DropdownFooter/DropdownFooter.types.js +1 -0
  22. package/dist/components/DropdownMenu/DropdownMenu.d.ts +4 -0
  23. package/dist/components/DropdownMenu/DropdownMenu.js +132 -0
  24. package/dist/components/DropdownMenu/DropdownMenu.types.d.ts +18 -0
  25. package/dist/components/DropdownMenu/DropdownMenu.types.js +1 -0
  26. package/dist/components/DropdownMenuList/DropdownMenuList.d.ts +4 -0
  27. package/dist/components/DropdownMenuList/DropdownMenuList.js +84 -0
  28. package/dist/components/DropdownMenuList/DropdownMenuList.styles.d.ts +40 -0
  29. package/dist/components/DropdownMenuList/DropdownMenuList.styles.js +23 -0
  30. package/dist/components/DropdownMenuList/DropdownMenuList.types.d.ts +7 -0
  31. package/dist/components/DropdownMenuList/DropdownMenuList.types.js +1 -0
  32. package/dist/components/DropdownOverlay/DropdownOverlay.d.ts +7 -0
  33. package/dist/components/DropdownOverlay/DropdownOverlay.js +73 -0
  34. package/dist/components/DropdownOverlay/DropdownOverlay.styles.d.ts +4 -0
  35. package/dist/components/DropdownOverlay/DropdownOverlay.styles.js +12 -0
  36. package/dist/components/DropdownOverlay/DropdownOverlay.types.d.ts +8 -0
  37. package/dist/components/DropdownOverlay/DropdownOverlay.types.js +1 -0
  38. package/dist/components/DropdownPopover/DropdownPopover.d.ts +3 -0
  39. package/dist/components/DropdownPopover/DropdownPopover.js +79 -0
  40. package/dist/components/DropdownPopover/DropdownPopover.types.d.ts +8 -0
  41. package/dist/components/DropdownPopover/DropdownPopover.types.js +1 -0
  42. package/dist/components/TextTrigger/TextTrigger.d.ts +3 -0
  43. package/dist/{elements → components}/TextTrigger/TextTrigger.js +6 -5
  44. package/dist/{elements → components}/TextTrigger/TextTrigger.styles.js +2 -2
  45. package/dist/{elements → components}/TextTrigger/TextTrigger.types.d.ts +1 -1
  46. package/dist/components/TextTrigger/TextTrigger.types.js +1 -0
  47. package/dist/hooks/useDefaultTexts.d.ts +2 -0
  48. package/dist/hooks/useDefaultTexts.js +21 -0
  49. package/dist/hooks/useDropdownVisibility.d.ts +10 -0
  50. package/dist/hooks/useDropdownVisibility.js +40 -0
  51. package/dist/index.d.ts +9 -1
  52. package/dist/index.js +6 -1
  53. package/dist/utils/getDropdownWidth.d.ts +2 -0
  54. package/dist/utils/getDropdownWidth.js +18 -0
  55. package/dist/utils/getPlacement.d.ts +3 -0
  56. package/dist/utils/getPlacement.js +4 -0
  57. package/dist/utils/getTransitionConfig.d.ts +4 -0
  58. package/dist/utils/getTransitionConfig.js +15 -0
  59. package/dist/utils/index.d.ts +4 -0
  60. package/dist/utils/index.js +4 -0
  61. package/dist/utils/isSplitFooter.d.ts +2 -0
  62. package/dist/utils/isSplitFooter.js +3 -0
  63. package/package.json +16 -8
  64. package/dist/elements/BackAction/BackAction.d.ts +0 -4
  65. package/dist/elements/BottomAction/BottomAction.d.ts +0 -4
  66. package/dist/elements/TextTrigger/TextTrigger.d.ts +0 -4
  67. package/dist/style/index.css +0 -1
  68. /package/dist/{elements/BackAction/BackAction.types.js → Dropdown.types.js} +0 -0
  69. /package/dist/{elements → components}/BackAction/BackAction.styles.d.ts +0 -0
  70. /package/dist/{elements → components}/BackAction/BackAction.types.d.ts +0 -0
  71. /package/dist/{elements/BottomAction/BottomAction.types.js → components/BackAction/BackAction.types.js} +0 -0
  72. /package/dist/{elements → components}/BottomAction/BottomAction.styles.d.ts +0 -0
  73. /package/dist/{elements → components}/BottomAction/BottomAction.types.d.ts +0 -0
  74. /package/dist/{elements/TextTrigger/TextTrigger.types.js → components/BottomAction/BottomAction.types.js} +0 -0
  75. /package/dist/{elements → components}/TextTrigger/TextTrigger.styles.d.ts +0 -0
@@ -0,0 +1,132 @@
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, useEffect, useMemo, useState } from 'react';
3
+ import { useTheme } from '@synerise/ds-core';
4
+ import Icon, { SearchM } from '@synerise/ds-icon';
5
+ import SearchBar from '@synerise/ds-search-bar';
6
+ import { DEFAULT_MATCHING_FUNCTION, MAX_VISIBLE_ITEMS } from '../../Dropdown.const';
7
+ import { useDefaultTexts } from '../../hooks/useDefaultTexts';
8
+ import { DropdownFooter } from '../DropdownFooter/DropdownFooter';
9
+ import { DropdownMenuList } from '../DropdownMenuList/DropdownMenuList';
10
+ import { DropdownPopover } from '../DropdownPopover/DropdownPopover';
11
+ export var DropdownMenu = function DropdownMenu(_ref) {
12
+ var dataSource = _ref.dataSource,
13
+ withSearch = _ref.withSearch,
14
+ texts = _ref.texts,
15
+ children = _ref.children,
16
+ _ref$trigger = _ref.trigger,
17
+ trigger = _ref$trigger === void 0 ? 'click' : _ref$trigger,
18
+ _ref$placement = _ref.placement,
19
+ placement = _ref$placement === void 0 ? 'bottomLeft' : _ref$placement,
20
+ _ref$maxVisibleItems = _ref.maxVisibleItems,
21
+ maxVisibleItems = _ref$maxVisibleItems === void 0 ? MAX_VISIBLE_ITEMS : _ref$maxVisibleItems,
22
+ _ref$size = _ref.size,
23
+ size = _ref$size === void 0 ? 'auto' : _ref$size,
24
+ open = _ref.open,
25
+ onOpenChange = _ref.onOpenChange,
26
+ onDismiss = _ref.onDismiss,
27
+ onSearchQueryChange = _ref.onSearchQueryChange,
28
+ getPopupContainer = _ref.getPopupContainer,
29
+ virtualised = _ref.virtualised,
30
+ disabled = _ref.disabled,
31
+ asChild = _ref.asChild,
32
+ _ref$hideOnItemClick = _ref.hideOnItemClick,
33
+ hideOnItemClick = _ref$hideOnItemClick === void 0 ? true : _ref$hideOnItemClick,
34
+ _ref$itemMatchesSearc = _ref.itemMatchesSearchQuery,
35
+ itemMatchesSearchQuery = _ref$itemMatchesSearc === void 0 ? DEFAULT_MATCHING_FUNCTION : _ref$itemMatchesSearc,
36
+ footer = _ref.footer,
37
+ overlayStyle = _ref.overlayStyle,
38
+ overlayClassName = _ref.overlayClassName,
39
+ overlayHTMLAttributes = _ref.overlayHTMLAttributes,
40
+ popoverProps = _ref.popoverProps,
41
+ popoverTriggerProps = _ref.popoverTriggerProps;
42
+ var _useState = useState(null),
43
+ activeIndex = _useState[0],
44
+ setActiveIndex = _useState[1];
45
+ var _useState2 = useState(''),
46
+ searchQuery = _useState2[0],
47
+ setSearchQuery = _useState2[1];
48
+ var _useState3 = useState(open),
49
+ isOpen = _useState3[0],
50
+ setIsOpen = _useState3[1];
51
+ var allTexts = useDefaultTexts(texts);
52
+ var theme = useTheme();
53
+ var toggleOpen = useCallback(function (openState) {
54
+ onOpenChange == null || onOpenChange(openState);
55
+ setIsOpen(openState);
56
+ }, [onOpenChange]);
57
+ useEffect(function () {
58
+ if (open !== undefined) {
59
+ setIsOpen(open);
60
+ }
61
+ }, [open, toggleOpen]);
62
+ var handleSearchChange = useCallback(function (query) {
63
+ onSearchQueryChange == null || onSearchQueryChange(query);
64
+ setSearchQuery(query);
65
+ }, [onSearchQueryChange]);
66
+ var filteredItems = useMemo(function () {
67
+ return searchQuery ? dataSource.filter(function (item) {
68
+ return itemMatchesSearchQuery(item, searchQuery);
69
+ }).map(function (item) {
70
+ var props = _extends({}, item, {
71
+ highlight: searchQuery
72
+ });
73
+ return props;
74
+ }) : dataSource;
75
+ }, [dataSource, itemMatchesSearchQuery, searchQuery]);
76
+ var handleSearchFocus = useCallback(function (ref) {
77
+ setTimeout(function () {
78
+ var _ref$current;
79
+ activeIndex != null ? activeIndex : ref == null || (_ref$current = ref.current) == null ? void 0 : _ref$current.focus();
80
+ }, 10);
81
+ }, [activeIndex]);
82
+ var overlay = useMemo(function () {
83
+ return /*#__PURE__*/React.createElement(React.Fragment, null, withSearch && /*#__PURE__*/React.createElement(SearchBar, {
84
+ placeholder: allTexts.searchPlaceholder,
85
+ value: searchQuery,
86
+ handleInputRef: handleSearchFocus,
87
+ onSearchChange: handleSearchChange,
88
+ iconLeft: /*#__PURE__*/React.createElement(Icon, {
89
+ component: /*#__PURE__*/React.createElement(SearchM, null),
90
+ color: theme.palette['grey-600']
91
+ }),
92
+ onClearInput: function onClearInput() {
93
+ return setSearchQuery('');
94
+ },
95
+ clearTooltip: allTexts.searchClearTooltip
96
+ }), /*#__PURE__*/React.createElement(DropdownMenuList, {
97
+ maxVisibleItems: maxVisibleItems,
98
+ hideOnItemClick: hideOnItemClick,
99
+ dataSource: filteredItems,
100
+ closeOverlay: function closeOverlay() {
101
+ return toggleOpen(false);
102
+ },
103
+ texts: allTexts,
104
+ virtualised: virtualised
105
+ }), footer && /*#__PURE__*/React.createElement(DropdownFooter, {
106
+ footer: footer
107
+ }));
108
+ }, [withSearch, allTexts, searchQuery, handleSearchFocus, handleSearchChange, theme.palette, maxVisibleItems, hideOnItemClick, filteredItems, virtualised, footer, toggleOpen]);
109
+ return disabled || dataSource.length === 0 ? /*#__PURE__*/React.createElement(React.Fragment, null, children) : /*#__PURE__*/React.createElement(DropdownPopover, {
110
+ getPopupContainer: getPopupContainer,
111
+ overlayHTMLAttributes: overlayHTMLAttributes,
112
+ overlayStyle: overlayStyle,
113
+ overlayClassName: overlayClassName,
114
+ trigger: trigger,
115
+ open: isOpen,
116
+ size: size,
117
+ placement: placement,
118
+ asChild: asChild,
119
+ onDismiss: onDismiss,
120
+ overlay: overlay,
121
+ handleOpenChange: toggleOpen,
122
+ handleTriggerClick: function handleTriggerClick() {
123
+ toggleOpen(!isOpen);
124
+ },
125
+ activeIndex: activeIndex,
126
+ setActiveIndex: setActiveIndex,
127
+ popoverProps: _extends({}, popoverProps, {
128
+ componentId: 'dropdown-menu'
129
+ }),
130
+ popoverTriggerProps: popoverTriggerProps
131
+ }, children);
132
+ };
@@ -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,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,4 @@
1
+ export declare const OverlayWrapper: import("styled-components").StyledComponent<"div", any, {
2
+ $width?: number;
3
+ widthProperty: string;
4
+ }, never>;
@@ -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,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,3 @@
1
+ import React from 'react';
2
+ import { type TextTriggerProps } from './TextTrigger.types';
3
+ export declare const TextTrigger: React.ForwardRefExoticComponent<TextTriggerProps & React.RefAttributes<HTMLDivElement>>;
@@ -1,9 +1,9 @@
1
- import React from 'react';
2
- import { theme } from '@synerise/ds-core';
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 TextTrigger(_ref) {
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-4ebj2t-0"
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-4ebj2t-1"
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
  });
@@ -3,7 +3,7 @@ export type TextTriggerProps = {
3
3
  value: string | React.ReactNode | undefined;
4
4
  inactiveColor?: string;
5
5
  size: 1 | 2 | 3 | 4 | 5 | 6;
6
- onClick: () => void;
6
+ onClick?: () => void;
7
7
  onFocus?: () => void;
8
8
  expanded?: boolean;
9
9
  isDisabled?: boolean;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import { type DropdownMenuTexts } from '../components/DropdownMenu/DropdownMenu.types';
2
+ export declare const useDefaultTexts: (customTexts?: Partial<DropdownMenuTexts>) => DropdownMenuTexts;
@@ -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 {};