@aloudata/aloudata-design 2.9.1 → 2.10.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.
@@ -53,5 +53,5 @@ export declare function getShape(ButtonShape: 'circle' | 'default'): 'circle' |
53
53
  export declare const setIcon: (iconNode: React.ReactElement, loading: boolean | {
54
54
  delay?: number | undefined;
55
55
  }) => React.JSX.Element;
56
- declare function Button(props: IButtonProps): React.JSX.Element;
57
- export default Button;
56
+ declare const _default: React.ForwardRefExoticComponent<IButtonProps & React.RefAttributes<HTMLElement>>;
57
+ export default _default;
@@ -11,7 +11,7 @@ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input ==
11
11
  import { Button as AntdButton } from 'antd';
12
12
  import { useCompactItemContext } from 'antd/lib/space/Compact';
13
13
  import classNames from 'classnames';
14
- import React, { useContext } from 'react';
14
+ import React, { forwardRef, useContext } from 'react';
15
15
  import { ConfigContext } from "../ConfigProvider";
16
16
  import SizeContext from "../ConfigProvider/sizeContext";
17
17
  import { LoadingLine } from "../Icon";
@@ -61,7 +61,7 @@ export var setIcon = function setIcon(iconNode, loading) {
61
61
  }
62
62
  return /*#__PURE__*/React.createElement(React.Fragment, null);
63
63
  };
64
- function Button(props) {
64
+ function Button(props, ref) {
65
65
  var _props$type = props.type,
66
66
  type = _props$type === void 0 ? 'secondary' : _props$type,
67
67
  customSize = props.size,
@@ -90,7 +90,8 @@ function Button(props) {
90
90
  type: getButtonType(type),
91
91
  className: classNames(btnPrefix, "".concat(btnPrefix, "-").concat(type), className, getButtonSizeClass(size), compactItemClassnames),
92
92
  danger: getDangerStatus(type),
93
- shape: getShape(shape)
93
+ shape: getShape(shape),
94
+ ref: ref
94
95
  }), props.children);
95
96
  }
96
- export default Button;
97
+ export default /*#__PURE__*/forwardRef(Button);
@@ -1,28 +1,17 @@
1
+ import { OffsetOptions } from '@floating-ui/react';
1
2
  import React from 'react';
2
3
  import { MenuProps } from '../Menu';
3
- import DropdownButton from './Button';
4
- type Align = {
5
- points?: [string, string];
6
- offset?: [number, number];
7
- targetOffset?: [number, number];
8
- overflow?: {
9
- adjustX?: boolean;
10
- adjustY?: boolean;
11
- };
12
- useCssRight?: boolean;
13
- useCssBottom?: boolean;
14
- useCssTransform?: boolean;
15
- };
16
- export type ActionType = 'hover' | 'click' | 'contextMenu';
17
- export type PlacementType = 'bottomLeft' | 'bottom' | 'bottomRight' | 'topLeft' | 'top' | 'topRight';
4
+ import './style/index.less';
5
+ export type ActionType = 'hover' | 'click';
6
+ export type PlacementType = 'top' | 'bottom' | 'left' | 'right' | 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end' | 'left-start' | 'left-end' | 'right-start' | 'right-end';
18
7
  export interface IDropdownProps {
8
+ children: React.ReactNode;
19
9
  /**
20
- * @description 位置状态
21
- * @default {}
10
+ * @description 菜单弹出位置的偏移量
22
11
  */
23
- align?: Align;
12
+ offset?: OffsetOptions;
24
13
  /**
25
- * @description 关闭后是否销毁Dropdown
14
+ * @description 关闭后是否销毁 Dropdown
26
15
  * @default false
27
16
  */
28
17
  destroyPopupOnHide?: boolean;
@@ -30,7 +19,7 @@ export interface IDropdownProps {
30
19
  * @description 菜单渲染父节点。默认渲染到 body 上,如果你遇到菜单滚动定位问题,试试修改为滚动的区域,并相对其定位
31
20
  * @default () => document.body
32
21
  */
33
- getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;
22
+ getPopupContainer?: () => HTMLElement;
34
23
  /**
35
24
  * @description 菜单
36
25
  * @type Menu | () => Menu
@@ -46,13 +35,13 @@ export interface IDropdownProps {
46
35
  * @description 菜单弹出位置
47
36
  * @default bottomLeft
48
37
  */
49
- placement?: 'bottomLeft' | 'bottom' | 'bottomRight' | 'topLeft' | 'top' | 'topRight';
38
+ placement?: PlacementType;
50
39
  /**
51
40
  * @description 触发下拉的行为
52
- * @type ActionType[], 其中 ActionType 为 'hover' | 'click' | 'contextMenu';
53
- * @default [hover]
41
+ * @type ActionType, 其中 ActionType 为 'hover' | 'click' | 'contextMenu';
42
+ * @default click
54
43
  */
55
- trigger?: ActionType[];
44
+ trigger?: ActionType;
56
45
  /**
57
46
  * @description 菜单是否显示
58
47
  * @default -
@@ -68,12 +57,6 @@ export interface IDropdownProps {
68
57
  * @default -
69
58
  */
70
59
  overlayStyle?: React.CSSProperties;
71
- /**
72
- * @description 是否强制渲染
73
- * @default -
74
- */
75
- forceRender?: boolean;
76
- children?: React.ReactNode;
77
60
  /**
78
61
  * @description 自定义下拉框内容
79
62
  * @default -
@@ -85,8 +68,4 @@ export interface IDropdownProps {
85
68
  */
86
69
  disabled?: boolean;
87
70
  }
88
- declare function Dropdown(props: IDropdownProps): React.JSX.Element;
89
- declare namespace Dropdown {
90
- var Button: typeof DropdownButton;
91
- }
92
- export default Dropdown;
71
+ export default function Dropdown(props: IDropdownProps): React.JSX.Element;
@@ -1,5 +1,4 @@
1
1
  function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
- var _excluded = ["children", "open", "overlayClassName", "menu", "align", "placement", "trigger", "dropdownRender", "destroyPopupOnHide", "onOpenChange"];
3
2
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
4
3
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
5
4
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -12,48 +11,103 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
12
11
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
13
12
  function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
14
13
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
15
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
16
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
17
- import { Dropdown as AntdDropdown } from 'antd';
18
- import getPlacements from 'antd/lib/_util/placements';
14
+ import { FloatingFocusManager, autoUpdate, flip, offset, safePolygon, shift, useClick, useDismiss, useFloating, useHover, useId, useInteractions, useRole } from '@floating-ui/react';
15
+ import { useMemoizedFn } from 'ahooks';
19
16
  import classNames from 'classnames';
20
- import React, { useCallback, useMemo, useState } from 'react';
17
+ import ResizeObserver from 'rc-resize-observer';
18
+ import React, { cloneElement, useCallback, useEffect, useMemo, useState } from 'react';
19
+ import ReactDOM from 'react-dom';
21
20
  import Menu from "../Menu";
22
- import DropdownButton from "./Button";
21
+ import "./style/index.less";
23
22
  export default function Dropdown(props) {
24
23
  var children = props.children,
25
- open = props.open,
26
- overlayClassName = props.overlayClassName,
24
+ _props$destroyPopupOn = props.destroyPopupOnHide,
25
+ destroyPopupOnHide = _props$destroyPopupOn === void 0 ? true : _props$destroyPopupOn,
26
+ getPopupContainer = props.getPopupContainer,
27
27
  menu = props.menu,
28
- align = props.align,
29
- placement = props.placement,
28
+ overlayClassName = props.overlayClassName,
29
+ _props$placement = props.placement,
30
+ placement = _props$placement === void 0 ? 'bottom-start' : _props$placement,
30
31
  _props$trigger = props.trigger,
31
- trigger = _props$trigger === void 0 ? ['click'] : _props$trigger,
32
+ trigger = _props$trigger === void 0 ? 'click' : _props$trigger,
33
+ open = props.open,
34
+ _props$onOpenChange = props.onOpenChange,
35
+ onOpenChange = _props$onOpenChange === void 0 ? function () {} : _props$onOpenChange,
36
+ overlayStyle = props.overlayStyle,
32
37
  dropdownRender = props.dropdownRender,
33
- _props$destroyPopupOn = props.destroyPopupOnHide,
34
- destroyPopupOnHide = _props$destroyPopupOn === void 0 ? true : _props$destroyPopupOn,
35
- onOpenChange = props.onOpenChange,
36
- otherProps = _objectWithoutProperties(props, _excluded);
37
- // antd 根据 open 字段是否存在来判断 open 是否是可控模式
38
- var antdDropdownProps = otherProps;
39
- var defaultAlign = useMemo(function () {
40
- var _getPlacements;
41
- if (align) {
42
- return align;
43
- }
44
- return {
45
- offset: ((_getPlacements = getPlacements({
46
- arrowWidth: 0,
47
- offset: 4,
48
- borderRadius: 0
49
- })[placement || 'bottomLeft']) === null || _getPlacements === void 0 ? void 0 : _getPlacements['offset']) || [0, 4]
50
- };
51
- }, [align, placement]);
52
- var isOpenControlled = open !== undefined;
53
- var _useState = useState(open),
38
+ disabled = props.disabled,
39
+ _props$offset = props.offset,
40
+ offsetProps = _props$offset === void 0 ? 4 : _props$offset;
41
+ var _useState = useState(open || false),
54
42
  _useState2 = _slicedToArray(_useState, 2),
55
- dropdownOpen = _useState2[0],
56
- setDropdownOpen = _useState2[1];
43
+ isOpen = _useState2[0],
44
+ setIsOpen = _useState2[1];
45
+ var onOpenChangeFn = useMemoizedFn(onOpenChange);
46
+ var isOpenControlled = open !== undefined;
47
+ useEffect(function () {
48
+ if (isOpenControlled) {
49
+ setIsOpen(open);
50
+ }
51
+ }, [open, isOpenControlled]);
52
+ var onChangeOpen = useCallback(function (newOpen) {
53
+ if (!isOpenControlled) {
54
+ setIsOpen(newOpen);
55
+ }
56
+ onOpenChangeFn(newOpen);
57
+ }, [isOpenControlled, onOpenChangeFn]);
58
+ var _useFloating = useFloating({
59
+ placement: placement,
60
+ open: isOpen,
61
+ onOpenChange: onChangeOpen,
62
+ middleware: [offset(offsetProps), flip({
63
+ fallbackAxisSideDirection: 'end'
64
+ }), shift()],
65
+ whileElementsMounted: autoUpdate
66
+ }),
67
+ refs = _useFloating.refs,
68
+ floatingStyles = _useFloating.floatingStyles,
69
+ context = _useFloating.context;
70
+ var click = useClick(context);
71
+ var hover = useHover(context, {
72
+ enabled: trigger === 'hover',
73
+ handleClose: safePolygon({})
74
+ });
75
+ var dismiss = useDismiss(context);
76
+ var role = useRole(context);
77
+ var propsList = useMemo(function () {
78
+ var res = [dismiss, role];
79
+ var finalTrigger = trigger;
80
+ if (Array.isArray(trigger)) {
81
+ // 对于数组形式的 trigger,告警
82
+ console.error('trigger should be a string, support "hover" or "click" now.');
83
+ finalTrigger = 'click';
84
+ }
85
+ if (finalTrigger === 'hover') {
86
+ res.unshift(hover);
87
+ } else if (finalTrigger === 'click') {
88
+ res.unshift(click);
89
+ }
90
+ return res;
91
+ }, [trigger, click, dismiss, role, hover]);
92
+ var _useInteractions = useInteractions(propsList),
93
+ getReferenceProps = _useInteractions.getReferenceProps,
94
+ getFloatingProps = _useInteractions.getFloatingProps;
95
+ var headingId = useId();
96
+ var child = children;
97
+ var childProps = child.props || {};
98
+ var referenceProps = getReferenceProps();
99
+ var modifiedChild = /*#__PURE__*/cloneElement(child, _objectSpread(_objectSpread(_objectSpread({}, childProps), {}, {
100
+ disabled: disabled
101
+ }, referenceProps), {}, {
102
+ onClick: function onClick(event) {
103
+ var _childProps$onClick;
104
+ (_childProps$onClick = childProps.onClick) === null || _childProps$onClick === void 0 ? void 0 : _childProps$onClick.call(childProps, event);
105
+ var referenceOnClick = referenceProps.onClick;
106
+ if (typeof referenceOnClick === 'function') {
107
+ referenceOnClick(event);
108
+ }
109
+ }
110
+ }));
57
111
  var onMenuItemClick = useCallback(function (info) {
58
112
  if (menu !== null && menu !== void 0 && menu.onClick) {
59
113
  menu.onClick(info);
@@ -62,17 +116,9 @@ export default function Dropdown(props) {
62
116
  return;
63
117
  }
64
118
  if (!isOpenControlled) {
65
- setDropdownOpen(false);
119
+ setIsOpen(false);
66
120
  }
67
121
  }, [isOpenControlled, menu]);
68
- var onDropdownOpenChange = useCallback(function (isDropdownOpen) {
69
- if (onOpenChange) {
70
- onOpenChange(isDropdownOpen);
71
- }
72
- if (!isOpenControlled) {
73
- setDropdownOpen(isDropdownOpen);
74
- }
75
- }, [isOpenControlled, onOpenChange]);
76
122
  var menuInstance = useMemo(function () {
77
123
  var menuProps = _objectSpread(_objectSpread({}, menu), {}, {
78
124
  items: (menu === null || menu === void 0 ? void 0 : menu.items) || []
@@ -81,24 +127,30 @@ export default function Dropdown(props) {
81
127
  onClick: onMenuItemClick
82
128
  }));
83
129
  }, [menu, onMenuItemClick]);
84
- var menuRender = useCallback(function () {
85
- if (dropdownRender) {
86
- return dropdownRender(menuInstance);
87
- }
88
- if (menu) {
89
- return menuInstance;
90
- }
91
- return undefined;
92
- }, [menuInstance, dropdownRender, menu]);
93
- return /*#__PURE__*/React.createElement(AntdDropdown, _extends({
94
- overlayClassName: classNames('ald-dropdown-overlay', overlayClassName),
95
- align: defaultAlign,
96
- trigger: trigger,
97
- placement: placement,
98
- dropdownRender: menuRender,
99
- destroyPopupOnHide: destroyPopupOnHide,
100
- open: !!(isOpenControlled ? open : dropdownOpen),
101
- onOpenChange: onDropdownOpenChange
102
- }, antdDropdownProps), children);
103
- }
104
- Dropdown.Button = DropdownButton;
130
+ var popupElement = useMemo(function () {
131
+ return typeof dropdownRender === 'function' ? dropdownRender(menuInstance) : menuInstance;
132
+ }, [dropdownRender, menuInstance]);
133
+
134
+ // 渲染浮动内容到自定义容器
135
+ var renderFloatingContent = useCallback(function () {
136
+ var popupElem = /*#__PURE__*/React.createElement(FloatingFocusManager, {
137
+ context: context,
138
+ modal: false
139
+ }, /*#__PURE__*/React.createElement("div", _extends({
140
+ className: classNames('ald-dropdown-overlay', overlayClassName, _defineProperty({}, 'ald-dropdown-overlay-hidden', !isOpen)),
141
+ ref: refs.setFloating,
142
+ style: _objectSpread(_objectSpread({}, floatingStyles), overlayStyle),
143
+ "aria-labelledby": headingId
144
+ }, getFloatingProps()), popupElement));
145
+ var popupContainer = typeof getPopupContainer === 'function' ? getPopupContainer() : document.body;
146
+ return /*#__PURE__*/ReactDOM.createPortal(popupElem, popupContainer);
147
+ }, [context, floatingStyles, getFloatingProps, getPopupContainer, headingId, popupElement, refs.setFloating, overlayClassName, overlayStyle, isOpen]);
148
+ var popup = destroyPopupOnHide ? isOpen && renderFloatingContent() : renderFloatingContent();
149
+ var setTargetRef = useCallback(function (node) {
150
+ refs.setReference(node);
151
+ }, [refs]);
152
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ResizeObserver, {
153
+ disabled: !isOpen,
154
+ ref: setTargetRef
155
+ }, modifiedChild), popup);
156
+ }
@@ -5,6 +5,10 @@
5
5
  .ald-dropdown-overlay {
6
6
  .menuContainerStyle();
7
7
 
8
+ &.ald-dropdown-overlay-hidden {
9
+ visibility: hidden;
10
+ }
11
+
8
12
  padding: 4px 0 !important;
9
13
  animation-duration: 0s !important;
10
14
  max-width: none;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { IDropdownProps } from '../Dropdown';
2
+ import { IDropdownProps } from '../Dropdown/index';
3
3
  import { TSize } from '../Input';
4
4
  import { ITooltipProps } from '../Tooltip';
5
5
  interface IIconButtonProps {
@@ -13,7 +13,7 @@ interface IIconButtonProps {
13
13
  id?: string;
14
14
  mode?: 'light' | 'dark';
15
15
  }
16
- declare const DropdownButton: React.ForwardRefExoticComponent<IIconButtonProps & IDropdownProps & {
16
+ declare const DropdownButton: React.ForwardRefExoticComponent<IIconButtonProps & Omit<IDropdownProps, "children"> & {
17
17
  showArrow?: boolean | undefined;
18
18
  } & React.RefAttributes<HTMLDivElement>>;
19
19
  declare const IconButton: React.ForwardRefExoticComponent<IIconButtonProps & React.RefAttributes<HTMLDivElement>> & {
@@ -1,10 +1,10 @@
1
- var _excluded = ["icon", "onClick", "disabled", "size", "menu", "className", "onOpenChange", "tooltip", "id", "trigger", "showArrow", "mode"];
1
+ var _excluded = ["icon", "onClick", "disabled", "size", "menu", "className", "onOpenChange", "tooltip", "id", "showArrow", "mode"];
2
2
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
3
3
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
4
4
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
5
5
  import classnames from 'classnames';
6
6
  import React, { forwardRef, useMemo } from 'react';
7
- import Dropdown from "../Dropdown";
7
+ import Dropdown from "../Dropdown/index";
8
8
  import { FoldDownFill } from "../Icon";
9
9
  import { getSizeType } from "../Input/components/Input";
10
10
  import Tooltip from "../Tooltip";
@@ -57,8 +57,6 @@ var DropdownButton = /*#__PURE__*/forwardRef(function (props, ref) {
57
57
  onOpenChange = props.onOpenChange,
58
58
  tooltip = props.tooltip,
59
59
  id = props.id,
60
- _props$trigger = props.trigger,
61
- trigger = _props$trigger === void 0 ? ['click'] : _props$trigger,
62
60
  showArrow = props.showArrow,
63
61
  _props$mode2 = props.mode,
64
62
  mode = _props$mode2 === void 0 ? 'light' : _props$mode2,
@@ -94,7 +92,6 @@ var DropdownButton = /*#__PURE__*/forwardRef(function (props, ref) {
94
92
  title: tooltip === null || tooltip === void 0 ? void 0 : tooltip.title
95
93
  }), /*#__PURE__*/React.createElement(Dropdown, _extends({
96
94
  menu: menu,
97
- trigger: trigger,
98
95
  onOpenChange: onOpenChange
99
96
  }, restDropdownProps), /*#__PURE__*/React.createElement("div", {
100
97
  id: id,
@@ -18,7 +18,8 @@
18
18
  background: var(--alias-colors-bg-skeleton-subtler, #fff);
19
19
  box-shadow: 0 10px 18px -2px #00000014;
20
20
  min-width: @menu-width;
21
- z-index: 999;
21
+ font-size: 14px;
22
+ z-index: 1001;
22
23
  }
23
24
 
24
25
  .ald-menu {