@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.
Files changed (75) hide show
  1. package/CHANGELOG.md +11 -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,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 {};
@@ -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, type DropdownProps } 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';
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,2 @@
1
+ import { type DropdownSize } from '../Dropdown.types';
2
+ export declare const getDropdownWidth: (size?: DropdownSize | number) => number | null;
@@ -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,3 @@
1
+ import { type Placement } from '@floating-ui/react';
2
+ import { type DropdownPlacement } from '../Dropdown.types';
3
+ export declare const getPlacement: (placement: DropdownPlacement) => Placement;
@@ -0,0 +1,4 @@
1
+ import { PLACEMENT_MAP } from '../Dropdown.const';
2
+ export var getPlacement = function getPlacement(placement) {
3
+ return PLACEMENT_MAP[placement];
4
+ };
@@ -0,0 +1,4 @@
1
+ import { type Placement, type UseTransitionStylesProps } from '@floating-ui/react';
2
+ export declare const getTransitionConfig: ({ placement, }: {
3
+ placement: Placement;
4
+ }) => Partial<UseTransitionStylesProps>;
@@ -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
+ };
@@ -0,0 +1,4 @@
1
+ export * from './getPlacement';
2
+ export * from './getTransitionConfig';
3
+ export * from './isSplitFooter';
4
+ export * from './getDropdownWidth';