@douyinfe/semi-ui 2.50.0-alpha.0 → 2.50.0-beta.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 (99) hide show
  1. package/dist/css/semi.css +76 -160
  2. package/dist/css/semi.min.css +1 -1
  3. package/dist/umd/semi-ui.js +582 -418
  4. package/dist/umd/semi-ui.js.map +1 -1
  5. package/dist/umd/semi-ui.min.js +1 -1
  6. package/dist/umd/semi-ui.min.js.map +1 -1
  7. package/lib/cjs/anchor/index.d.ts +1 -1
  8. package/lib/cjs/autoComplete/index.d.ts +1 -1
  9. package/lib/cjs/button/Button.d.ts +1 -1
  10. package/lib/cjs/button/index.d.ts +1 -1
  11. package/lib/cjs/carousel/index.d.ts +1 -1
  12. package/lib/cjs/datePicker/datePicker.d.ts +1 -1
  13. package/lib/cjs/datePicker/yearAndMonth.js +1 -5
  14. package/lib/cjs/dropdown/index.d.ts +1 -1
  15. package/lib/cjs/form/baseForm.d.ts +2 -2
  16. package/lib/cjs/form/field.d.ts +2 -2
  17. package/lib/cjs/image/interface.d.ts +3 -3
  18. package/lib/cjs/image/previewFooter.js +5 -8
  19. package/lib/cjs/image/previewHeader.d.ts +2 -2
  20. package/lib/cjs/image/previewHeader.js +9 -8
  21. package/lib/cjs/image/previewImage.d.ts +1 -12
  22. package/lib/cjs/image/previewImage.js +23 -83
  23. package/lib/cjs/image/previewInner.d.ts +11 -2
  24. package/lib/cjs/image/previewInner.js +60 -42
  25. package/lib/cjs/index.d.ts +2 -0
  26. package/lib/cjs/index.js +14 -0
  27. package/lib/cjs/modal/confirm.d.ts +17 -17
  28. package/lib/cjs/notification/index.d.ts +8 -8
  29. package/lib/cjs/notification/index.js +6 -5
  30. package/lib/cjs/notification/notice.d.ts +1 -1
  31. package/lib/cjs/notification/notice.js +1 -1
  32. package/lib/cjs/popover/index.d.ts +1 -1
  33. package/lib/cjs/select/index.d.ts +2 -2
  34. package/lib/cjs/table/Table.d.ts +1 -1
  35. package/lib/cjs/timePicker/TimePicker.d.ts +3 -3
  36. package/lib/cjs/timePicker/TimeShape.d.ts +1 -1
  37. package/lib/cjs/timePicker/index.d.ts +2 -2
  38. package/lib/cjs/tooltip/index.d.ts +1 -1
  39. package/lib/cjs/tree/indent.d.ts +9 -0
  40. package/lib/cjs/tree/indent.js +37 -0
  41. package/lib/cjs/tree/index.d.ts +2 -0
  42. package/lib/cjs/tree/index.js +8 -3
  43. package/lib/cjs/tree/interface.d.ts +2 -0
  44. package/lib/cjs/tree/treeNode.d.ts +3 -0
  45. package/lib/cjs/tree/treeNode.js +34 -6
  46. package/lib/cjs/treeSelect/index.d.ts +4 -3
  47. package/lib/cjs/treeSelect/index.js +124 -31
  48. package/lib/cjs/typography/base.d.ts +1 -1
  49. package/lib/cjs/typography/numeral.d.ts +1 -1
  50. package/lib/cjs/typography/paragraph.d.ts +1 -1
  51. package/lib/cjs/typography/text.d.ts +1 -1
  52. package/lib/cjs/typography/title.d.ts +1 -1
  53. package/lib/es/anchor/index.d.ts +1 -1
  54. package/lib/es/autoComplete/index.d.ts +1 -1
  55. package/lib/es/button/Button.d.ts +1 -1
  56. package/lib/es/button/index.d.ts +1 -1
  57. package/lib/es/carousel/index.d.ts +1 -1
  58. package/lib/es/datePicker/datePicker.d.ts +1 -1
  59. package/lib/es/datePicker/yearAndMonth.js +1 -5
  60. package/lib/es/dropdown/index.d.ts +1 -1
  61. package/lib/es/form/baseForm.d.ts +2 -2
  62. package/lib/es/form/field.d.ts +2 -2
  63. package/lib/es/image/interface.d.ts +3 -3
  64. package/lib/es/image/previewFooter.js +5 -8
  65. package/lib/es/image/previewHeader.d.ts +2 -2
  66. package/lib/es/image/previewHeader.js +4 -3
  67. package/lib/es/image/previewImage.d.ts +1 -12
  68. package/lib/es/image/previewImage.js +23 -83
  69. package/lib/es/image/previewInner.d.ts +11 -2
  70. package/lib/es/image/previewInner.js +60 -42
  71. package/lib/es/index.d.ts +2 -0
  72. package/lib/es/index.js +2 -0
  73. package/lib/es/modal/confirm.d.ts +17 -17
  74. package/lib/es/notification/index.d.ts +8 -8
  75. package/lib/es/notification/index.js +6 -5
  76. package/lib/es/notification/notice.d.ts +1 -1
  77. package/lib/es/notification/notice.js +1 -1
  78. package/lib/es/popover/index.d.ts +1 -1
  79. package/lib/es/select/index.d.ts +2 -2
  80. package/lib/es/table/Table.d.ts +1 -1
  81. package/lib/es/timePicker/TimePicker.d.ts +3 -3
  82. package/lib/es/timePicker/TimeShape.d.ts +1 -1
  83. package/lib/es/timePicker/index.d.ts +2 -2
  84. package/lib/es/tooltip/index.d.ts +1 -1
  85. package/lib/es/tree/indent.d.ts +9 -0
  86. package/lib/es/tree/indent.js +27 -0
  87. package/lib/es/tree/index.d.ts +2 -0
  88. package/lib/es/tree/index.js +8 -3
  89. package/lib/es/tree/interface.d.ts +2 -0
  90. package/lib/es/tree/treeNode.d.ts +3 -0
  91. package/lib/es/tree/treeNode.js +34 -6
  92. package/lib/es/treeSelect/index.d.ts +4 -3
  93. package/lib/es/treeSelect/index.js +125 -32
  94. package/lib/es/typography/base.d.ts +1 -1
  95. package/lib/es/typography/numeral.d.ts +1 -1
  96. package/lib/es/typography/paragraph.d.ts +1 -1
  97. package/lib/es/typography/text.d.ts +1 -1
  98. package/lib/es/typography/title.d.ts +1 -1
  99. package/package.json +8 -8
@@ -90,6 +90,7 @@ export interface TreeState extends BasicTreeInnerData {
90
90
  export interface TreeNodeProps extends BasicTreeNodeProps {
91
91
  children?: TreeNodeData[];
92
92
  icon?: ReactNode;
93
+ isEnd?: boolean[];
93
94
  }
94
95
  export interface TreeNodeState {
95
96
  [x: string]: any;
@@ -104,6 +105,7 @@ export interface FlattenNode extends BasicFlattenNode {
104
105
  data?: BasicTreeNodeData;
105
106
  label?: ReactNode;
106
107
  parent?: null | FlattenNode;
108
+ isEnd?: boolean[];
107
109
  }
108
110
  export interface NodeListProps {
109
111
  [x: string]: any;
@@ -22,6 +22,8 @@ export default class TreeNode extends PureComponent<TreeNodeProps, TreeNodeState
22
22
  treeNodeFilterProp: PropTypes.Requireable<string>;
23
23
  selectedKey: PropTypes.Requireable<string>;
24
24
  motionKey: PropTypes.Requireable<NonNullable<string | string[]>>;
25
+ isEnd: PropTypes.Requireable<boolean[]>;
26
+ showLine: PropTypes.Requireable<boolean>;
25
27
  };
26
28
  static defaultProps: {
27
29
  selectedKey: string;
@@ -56,6 +58,7 @@ export default class TreeNode extends PureComponent<TreeNodeProps, TreeNodeState
56
58
  isDisabled: () => boolean;
57
59
  renderArrow(): JSX.Element;
58
60
  renderCheckbox(): JSX.Element;
61
+ renderSwitcher: () => JSX.Element;
59
62
  renderIcon(): any;
60
63
  renderEmptyNode(): JSX.Element;
61
64
  renderRealLabel: () => any;
@@ -19,6 +19,7 @@ var _checkbox = require("../checkbox");
19
19
  var _treeContext = _interopRequireDefault(require("./treeContext"));
20
20
  var _spin = _interopRequireDefault(require("../spin"));
21
21
  var _index = require("../_utils/index");
22
+ var _indent = _interopRequireDefault(require("./indent"));
22
23
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
24
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
24
25
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -204,6 +205,18 @@ class TreeNode extends _react.PureComponent {
204
205
  }
205
206
  return Boolean(treeDisabled || disabled);
206
207
  };
208
+ // Switcher
209
+ this.renderSwitcher = () => {
210
+ if (this.isLeaf()) {
211
+ // if switcherIconDom is null, no render switcher span
212
+ return /*#__PURE__*/_react.default.createElement("span", {
213
+ className: (0, _classnames.default)(`${prefixcls}-switcher`)
214
+ }, /*#__PURE__*/_react.default.createElement("span", {
215
+ className: `${prefixcls}-switcher-leaf-line`
216
+ }));
217
+ }
218
+ return null;
219
+ };
207
220
  this.renderRealLabel = () => {
208
221
  const {
209
222
  renderLabel
@@ -243,7 +256,8 @@ class TreeNode extends _react.PureComponent {
243
256
  const showIcon = !this.isLeaf();
244
257
  const {
245
258
  loading,
246
- expanded
259
+ expanded,
260
+ showLine
247
261
  } = this.props;
248
262
  if (loading) {
249
263
  return /*#__PURE__*/_react.default.createElement(_spin.default, {
@@ -259,6 +273,9 @@ class TreeNode extends _react.PureComponent {
259
273
  onClick: this.onExpand
260
274
  });
261
275
  }
276
+ if (showLine) {
277
+ return this.renderSwitcher();
278
+ }
262
279
  return /*#__PURE__*/_react.default.createElement("span", {
263
280
  className: `${prefixcls}-empty-icon`
264
281
  });
@@ -342,9 +359,11 @@ class TreeNode extends _react.PureComponent {
342
359
  filtered,
343
360
  treeNodeFilterProp,
344
361
  display,
345
- style
362
+ style,
363
+ isEnd,
364
+ showLine
346
365
  } = _a,
347
- rest = __rest(_a, ["eventKey", "expanded", "selected", "checked", "halfChecked", "loading", "active", "level", "empty", "filtered", "treeNodeFilterProp", "display", "style"]);
366
+ rest = __rest(_a, ["eventKey", "expanded", "selected", "checked", "halfChecked", "loading", "active", "level", "empty", "filtered", "treeNodeFilterProp", "display", "style", "isEnd", "showLine"]);
348
367
  if (empty) {
349
368
  return this.renderEmptyNode();
350
369
  }
@@ -356,6 +375,7 @@ class TreeNode extends _react.PureComponent {
356
375
  dropPosition,
357
376
  labelEllipsis
358
377
  } = this.context;
378
+ const isEndNode = isEnd[isEnd.length - 1];
359
379
  const disabled = this.isDisabled();
360
380
  const dragOver = dragOverNodeKey === eventKey && dropPosition === 0;
361
381
  const dragOverGapTop = dragOverNodeKey === eventKey && dropPosition === -1;
@@ -373,7 +393,8 @@ class TreeNode extends _react.PureComponent {
373
393
  [`${prefixcls}-fullLabel-draggable`]: !disabled && draggable && renderFullLabel,
374
394
  // When draggable + renderFullLabel is turned on, the style of dragover
375
395
  [`${prefixcls}-fullLabel-drag-over-gap-top`]: !disabled && dragOverGapTop && renderFullLabel,
376
- [`${prefixcls}-fullLabel-drag-over-gap-bottom`]: !disabled && dragOverGapBottom && renderFullLabel
396
+ [`${prefixcls}-fullLabel-drag-over-gap-bottom`]: !disabled && dragOverGapBottom && renderFullLabel,
397
+ [`${prefixcls}-tree-node-last-leaf`]: isEndNode
377
398
  });
378
399
  const labelProps = {
379
400
  onClick: this.onClick,
@@ -449,7 +470,12 @@ class TreeNode extends _react.PureComponent {
449
470
  onDoubleClick: this.onDoubleClick,
450
471
  ref: this.setRef,
451
472
  style: style
452
- }, dragProps), this.renderArrow(), /*#__PURE__*/_react.default.createElement("span", {
473
+ }, dragProps), /*#__PURE__*/_react.default.createElement(_indent.default, {
474
+ showLine: showLine,
475
+ prefixcls: prefixcls,
476
+ level: level,
477
+ isEnd: isEnd
478
+ }), this.renderArrow(), /*#__PURE__*/_react.default.createElement("span", {
453
479
  className: labelCls
454
480
  }, multiple ? this.renderCheckbox() : null, this.renderIcon(), /*#__PURE__*/_react.default.createElement("span", {
455
481
  className: `${prefixcls}-label-text`
@@ -475,7 +501,9 @@ TreeNode.propTypes = {
475
501
  keyword: _propTypes.default.string,
476
502
  treeNodeFilterProp: _propTypes.default.string,
477
503
  selectedKey: _propTypes.default.string,
478
- motionKey: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.string)])
504
+ motionKey: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.string)]),
505
+ isEnd: _propTypes.default.arrayOf(_propTypes.default.bool),
506
+ showLine: _propTypes.default.bool
479
507
  };
480
508
  TreeNode.defaultProps = {
481
509
  selectedKey: '',
@@ -29,7 +29,7 @@ export type RenderSelectedItemInMultiple = (treeNode: TreeNodeData, otherProps:
29
29
  content: React.ReactNode;
30
30
  };
31
31
  export type RenderSelectedItem = RenderSelectedItemInSingle | RenderSelectedItemInMultiple;
32
- export type OverrideCommonProps = 'renderFullLabel' | 'renderLabel' | 'defaultValue' | 'emptyContent' | 'filterTreeNode' | 'style' | 'treeData' | 'value' | 'onExpand' | 'keyMaps';
32
+ export type OverrideCommonProps = 'renderFullLabel' | 'renderLabel' | 'defaultValue' | 'emptyContent' | 'filterTreeNode' | 'style' | 'treeData' | 'value' | 'onExpand' | 'keyMaps' | 'showLine';
33
33
  /**
34
34
  * Type definition description:
35
35
  * TreeSelectProps inherits some properties from BasicTreeSelectProps (from foundation) and TreeProps (from semi-ui-react).
@@ -77,7 +77,7 @@ export interface TreeSelectProps extends Omit<BasicTreeSelectProps, OverrideComm
77
77
  onSelect?: (selectedKey: string, selected: boolean, selectedNode: TreeNodeData) => void;
78
78
  renderSelectedItem?: RenderSelectedItem;
79
79
  getPopupContainer?: () => HTMLElement;
80
- triggerRender?: (props?: TriggerRenderProps) => React.ReactNode;
80
+ triggerRender?: (props: TriggerRenderProps) => React.ReactNode;
81
81
  onBlur?: (e: React.MouseEvent) => void;
82
82
  onChange?: OnChange;
83
83
  onFocus?: (e: React.MouseEvent) => void;
@@ -134,6 +134,7 @@ declare class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState>
134
134
  showSearchClear: PropTypes.Requireable<boolean>;
135
135
  autoAdjustOverflow: PropTypes.Requireable<boolean>;
136
136
  showFilteredOnly: PropTypes.Requireable<boolean>;
137
+ showLine: PropTypes.Requireable<boolean>;
137
138
  motionExpand: PropTypes.Requireable<boolean>;
138
139
  emptyContent: PropTypes.Requireable<PropTypes.ReactNodeLike>;
139
140
  keyMaps: PropTypes.Requireable<object>;
@@ -190,7 +191,6 @@ declare class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState>
190
191
  triggerRef: React.RefObject<HTMLDivElement>;
191
192
  optionsRef: React.RefObject<any>;
192
193
  clickOutsideHandler: any;
193
- _flattenNodes: TreeState['flattenNodes'];
194
194
  onNodeClick: any;
195
195
  onNodeDoubleClick: any;
196
196
  onMotionEnd: any;
@@ -247,6 +247,7 @@ declare class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState>
247
247
  };
248
248
  getTreeNodeKey: (treeNode: TreeNodeData) => string;
249
249
  handlePopoverClose: (isVisible: any) => void;
250
+ afterClose: () => void;
250
251
  renderTreeNode: (treeNode: FlattenNode, ind: number, style: React.CSSProperties) => JSX.Element;
251
252
  itemKey: (index: number, data: Record<string, any>) => any;
252
253
  renderNodeList: () => JSX.Element;
@@ -689,23 +689,40 @@ class TreeSelect extends _baseComponent.default {
689
689
  searchAutoFocus,
690
690
  searchPosition
691
691
  } = this.props;
692
- if (isVisible === false && Boolean(filterTreeNode)) {
693
- this.foundation.clearInput();
692
+ // inputValue 清空,如果有选中值的话,选中项能够快速回显
693
+ // Clear the inputValue. If there is a selected value, the selected item can be quickly echoed.
694
+ if (isVisible === false && filterTreeNode) {
695
+ this.foundation.clearInputValue();
694
696
  }
695
697
  if (filterTreeNode && searchPosition === _constants.strings.SEARCH_POSITION_DROPDOWN && isVisible && searchAutoFocus) {
696
698
  this.foundation.focusInput(true);
697
699
  }
698
700
  };
701
+ this.afterClose = () => {
702
+ // flattenNode 的变化将导致弹出层面板中的选项数目变化
703
+ // 在弹层完全收起之后,再通过 clearInput 重新计算 state 中的 expandedKey, flattenNode
704
+ // 防止在弹出层未收起时弹层面板中选项数目变化导致视觉上出现弹层闪动问题
705
+ // Changes to flattenNode will cause the number of options in the popup panel to change
706
+ // After the pop-up layer is completely closed, recalculate the expandedKey and flattenNode in the state through clearInput.
707
+ // Prevent the pop-up layer from flickering visually due to changes in the number of options in the pop-up panel when the pop-up layer is not collapsed.
708
+ const {
709
+ filterTreeNode
710
+ } = this.props;
711
+ filterTreeNode && this.foundation.clearInput();
712
+ };
699
713
  this.renderTreeNode = (treeNode, ind, style) => {
700
714
  const {
701
715
  data,
702
716
  key
703
717
  } = treeNode;
704
718
  const treeNodeProps = this.foundation.getTreeNodeProps(key);
719
+ const {
720
+ showLine
721
+ } = this.props;
705
722
  if (!treeNodeProps) {
706
723
  return null;
707
724
  }
708
- const props = (0, _pick2.default)(treeNode, ['key', 'label', 'disabled', 'isLeaf', 'icon']);
725
+ const props = (0, _pick2.default)(treeNode, ['key', 'label', 'disabled', 'isLeaf', 'icon', 'isEnd']);
709
726
  const {
710
727
  keyMaps
711
728
  } = this.props;
@@ -713,7 +730,8 @@ class TreeSelect extends _baseComponent.default {
713
730
  !(0, _isUndefined2.default)(children) && (props.children = children);
714
731
  return /*#__PURE__*/_react.default.createElement(_treeNode.default, Object.assign({}, treeNodeProps, data, props, {
715
732
  data: data,
716
- style: style
733
+ style: style,
734
+ showLine: showLine
717
735
  }));
718
736
  };
719
737
  this.itemKey = (index, data) => {
@@ -728,6 +746,7 @@ class TreeSelect extends _baseComponent.default {
728
746
  this.renderNodeList = () => {
729
747
  const {
730
748
  flattenNodes,
749
+ cachedFlattenNodes,
731
750
  motionKeys,
732
751
  motionType,
733
752
  filteredKeys
@@ -743,7 +762,7 @@ class TreeSelect extends _baseComponent.default {
743
762
  if (!virtualize || (0, _isEmpty2.default)(virtualize)) {
744
763
  return /*#__PURE__*/_react.default.createElement(_nodeList.default, {
745
764
  flattenNodes: flattenNodes,
746
- flattenList: this._flattenNodes,
765
+ flattenList: cachedFlattenNodes,
747
766
  motionKeys: motionExpand ? motionKeys : new Set([]),
748
767
  motionType: motionType,
749
768
  // When motionKeys is empty, but filteredKeys is not empty (that is, the search hits), this situation should be distinguished from ordinary motionKeys
@@ -862,6 +881,7 @@ class TreeSelect extends _baseComponent.default {
862
881
  keyEntities: {},
863
882
  treeData: [],
864
883
  flattenNodes: [],
884
+ cachedFlattenNodes: undefined,
865
885
  selectedKeys: [],
866
886
  checkedKeys: new Set(),
867
887
  halfCheckedKeys: new Set(),
@@ -891,6 +911,7 @@ class TreeSelect extends _baseComponent.default {
891
911
  };
892
912
  }
893
913
  static getDerivedStateFromProps(props, prevState) {
914
+ var _a;
894
915
  const {
895
916
  prevProps,
896
917
  rePosKey
@@ -908,6 +929,8 @@ class TreeSelect extends _baseComponent.default {
908
929
  };
909
930
  const needUpdateTreeData = needUpdate('treeData');
910
931
  const needUpdateExpandedKeys = needUpdate('expandedKeys');
932
+ const isExpandControlled = ('expandedKeys' in props);
933
+ const isSearching = Boolean(props.filterTreeNode && prevState.inputValue && prevState.inputValue.length);
911
934
  // TreeNode
912
935
  if (needUpdateTreeData) {
913
936
  treeData = props.treeData;
@@ -926,31 +949,97 @@ class TreeSelect extends _baseComponent.default {
926
949
  }
927
950
  }
928
951
  const expandAllWhenDataChange = needUpdateTreeData && props.expandAll;
929
- // expandedKeys
930
- if (needUpdateExpandedKeys || prevProps && needUpdate('autoExpandParent')) {
931
- newState.expandedKeys = (0, _treeUtil.calcExpandedKeys)(props.expandedKeys, keyEntities, props.autoExpandParent || !prevProps);
932
- // only show animation when treeData does not change
933
- if (prevProps && props.motion && !treeData) {
934
- const {
935
- motionKeys,
936
- motionType
937
- } = (0, _treeUtil.calcMotionKeys)(prevState.expandedKeys, newState.expandedKeys, keyEntities);
938
- newState.motionKeys = new Set(motionKeys);
939
- newState.motionType = motionType;
952
+ if (!isSearching) {
953
+ // expandedKeys
954
+ if (needUpdateExpandedKeys || prevProps && needUpdate('autoExpandParent')) {
955
+ newState.expandedKeys = (0, _treeUtil.calcExpandedKeys)(props.expandedKeys, keyEntities, props.autoExpandParent || !prevProps);
956
+ // only show animation when treeData does not change
957
+ if (prevProps && props.motion && !treeData) {
958
+ const {
959
+ motionKeys,
960
+ motionType
961
+ } = (0, _treeUtil.calcMotionKeys)(prevState.expandedKeys, newState.expandedKeys, keyEntities);
962
+ newState.motionKeys = new Set(motionKeys);
963
+ newState.motionType = motionType;
964
+ if (motionType === 'hide') {
965
+ // cache flatten nodes: expandedKeys changed may not be triggered by interaction
966
+ newState.cachedFlattenNodes = (0, _treeUtil2.cloneDeep)(prevState.flattenNodes);
967
+ }
968
+ }
969
+ } else if (!prevProps && (props.defaultExpandAll || props.expandAll) || expandAllWhenDataChange) {
970
+ newState.expandedKeys = new Set(Object.keys(keyEntities));
971
+ } else if (!prevProps && props.defaultExpandedKeys) {
972
+ newState.expandedKeys = (0, _treeUtil.calcExpandedKeys)(props.defaultExpandedKeys, keyEntities);
973
+ } else if (!prevProps && props.defaultValue) {
974
+ newState.expandedKeys = (0, _treeUtil.calcExpandedKeysForValues)((0, _treeUtil.normalizeValue)(props.defaultValue, withObject, keyMaps), keyEntities, props.multiple, valueEntities);
975
+ } else if (!prevProps && props.value) {
976
+ newState.expandedKeys = (0, _treeUtil.calcExpandedKeysForValues)((0, _treeUtil.normalizeValue)(props.value, withObject, keyMaps), keyEntities, props.multiple, valueEntities);
977
+ } else if (!isExpandControlled && needUpdateTreeData && props.value) {
978
+ // 当 treeData 已经设置具体的值,并且设置了 props.loadData ,则认为 treeData 的更新是因为 loadData 导致的
979
+ // 如果是因为 loadData 导致 treeData改变, 此时在这里重新计算 key 会导致为未选中的展开项目被收起
980
+ // 所以此时不需要重新计算 expandedKeys,因为在点击展开按钮时候已经把被展开的项添加到 expandedKeys 中
981
+ // When treeData has a specific value and props.loadData is set, it is considered that the update of treeData is caused by loadData
982
+ // If the treeData is changed because of loadData, recalculating the key here will cause the unselected expanded items to be collapsed
983
+ // So there is no need to recalculate expandedKeys at this time, because the expanded item has been added to expandedKeys when the expand button is clicked
984
+ if (!(prevState.treeData && ((_a = prevState.treeData) === null || _a === void 0 ? void 0 : _a.length) > 0 && props.loadData)) {
985
+ newState.expandedKeys = (0, _treeUtil.calcExpandedKeysForValues)(props.value, keyEntities, props.multiple, valueEntities);
986
+ }
987
+ }
988
+ if (!newState.expandedKeys) {
989
+ delete newState.expandedKeys;
990
+ }
991
+ if (treeData || newState.expandedKeys) {
992
+ const flattenNodes = (0, _treeUtil.flattenTreeData)(treeData || prevState.treeData, newState.expandedKeys || prevState.expandedKeys, keyMaps);
993
+ newState.flattenNodes = flattenNodes;
994
+ }
995
+ } else {
996
+ let filteredState;
997
+ // treeData changed while searching
998
+ if (treeData) {
999
+ // Get filter data
1000
+ filteredState = (0, _treeUtil.filterTreeData)({
1001
+ treeData,
1002
+ inputValue: prevState.inputValue,
1003
+ filterTreeNode: props.filterTreeNode,
1004
+ filterProps: props.treeNodeFilterProp,
1005
+ showFilteredOnly: props.showFilteredOnly,
1006
+ keyEntities: newState.keyEntities,
1007
+ prevExpandedKeys: [...prevState.filteredExpandedKeys],
1008
+ keyMaps: keyMaps
1009
+ });
1010
+ newState.flattenNodes = filteredState.flattenNodes;
1011
+ newState.motionKeys = new Set([]);
1012
+ newState.filteredKeys = filteredState.filteredKeys;
1013
+ newState.filteredShownKeys = filteredState.filteredShownKeys;
1014
+ newState.filteredExpandedKeys = filteredState.filteredExpandedKeys;
1015
+ }
1016
+ // expandedKeys changed while searching
1017
+ if (props.expandedKeys) {
1018
+ newState.filteredExpandedKeys = (0, _treeUtil.calcExpandedKeys)(props.expandedKeys, keyEntities, props.autoExpandParent || !prevProps);
1019
+ if (prevProps && props.motion) {
1020
+ const prevKeys = prevState ? prevState.filteredExpandedKeys : new Set([]);
1021
+ // only show animation when treeData does not change
1022
+ if (!treeData) {
1023
+ const motionResult = (0, _treeUtil.calcMotionKeys)(prevKeys, newState.filteredExpandedKeys, keyEntities);
1024
+ let {
1025
+ motionKeys
1026
+ } = motionResult;
1027
+ const {
1028
+ motionType
1029
+ } = motionResult;
1030
+ if (props.showFilteredOnly) {
1031
+ motionKeys = motionKeys.filter(key => prevState.filteredShownKeys.has(key));
1032
+ }
1033
+ if (motionType === 'hide') {
1034
+ // cache flatten nodes: expandedKeys changed may not be triggered by interaction
1035
+ newState.cachedFlattenNodes = (0, _treeUtil2.cloneDeep)(prevState.flattenNodes);
1036
+ }
1037
+ newState.motionKeys = new Set(motionKeys);
1038
+ newState.motionType = motionType;
1039
+ }
1040
+ }
1041
+ newState.flattenNodes = (0, _treeUtil.flattenTreeData)(treeData || prevState.treeData, newState.filteredExpandedKeys || prevState.filteredExpandedKeys, keyMaps, props.showFilteredOnly && prevState.filteredShownKeys);
940
1042
  }
941
- } else if (!prevProps && (props.defaultExpandAll || props.expandAll) || expandAllWhenDataChange) {
942
- newState.expandedKeys = new Set(Object.keys(keyEntities));
943
- } else if (!prevProps && props.defaultExpandedKeys) {
944
- newState.expandedKeys = (0, _treeUtil.calcExpandedKeys)(props.defaultExpandedKeys, keyEntities);
945
- } else if (!prevProps && props.defaultValue) {
946
- newState.expandedKeys = (0, _treeUtil.calcExpandedKeysForValues)((0, _treeUtil.normalizeValue)(props.defaultValue, withObject, keyMaps), keyEntities, props.multiple, valueEntities);
947
- } else if (!prevProps && props.value) {
948
- newState.expandedKeys = (0, _treeUtil.calcExpandedKeysForValues)((0, _treeUtil.normalizeValue)(props.value, withObject, keyMaps), keyEntities, props.multiple, valueEntities);
949
- }
950
- // flattenNodes
951
- if (treeData || needUpdateExpandedKeys) {
952
- const flattenNodes = (0, _treeUtil.flattenTreeData)(treeData || prevState.treeData, newState.expandedKeys || prevState.expandedKeys, keyMaps);
953
- newState.flattenNodes = flattenNodes;
954
1043
  }
955
1044
  // selectedKeys: single mode controlled
956
1045
  const isMultiple = props.multiple;
@@ -1057,7 +1146,9 @@ class TreeSelect extends _baseComponent.default {
1057
1146
  this.props.onSearch && this.props.onSearch(input, filteredExpandedKeys);
1058
1147
  },
1059
1148
  cacheFlattenNodes: bool => {
1060
- this._flattenNodes = bool ? (0, _treeUtil2.cloneDeep)(this.state.flattenNodes) : null;
1149
+ this.setState({
1150
+ cachedFlattenNodes: bool ? (0, _treeUtil2.cloneDeep)(this.state.flattenNodes) : undefined
1151
+ });
1061
1152
  },
1062
1153
  notifyLoad: (newLoadedKeys, data) => {
1063
1154
  const {
@@ -1202,7 +1293,8 @@ class TreeSelect extends _baseComponent.default {
1202
1293
  autoAdjustOverflow: autoAdjustOverflow,
1203
1294
  mouseLeaveDelay: mouseLeaveDelay,
1204
1295
  mouseEnterDelay: mouseEnterDelay,
1205
- onVisibleChange: this.handlePopoverClose
1296
+ onVisibleChange: this.handlePopoverClose,
1297
+ afterClose: this.afterClose
1206
1298
  }, selection);
1207
1299
  }
1208
1300
  }
@@ -1247,6 +1339,7 @@ TreeSelect.propTypes = {
1247
1339
  showSearchClear: _propTypes.default.bool,
1248
1340
  autoAdjustOverflow: _propTypes.default.bool,
1249
1341
  showFilteredOnly: _propTypes.default.bool,
1342
+ showLine: _propTypes.default.bool,
1250
1343
  motionExpand: _propTypes.default.bool,
1251
1344
  emptyContent: _propTypes.default.node,
1252
1345
  keyMaps: _propTypes.default.object,
@@ -85,7 +85,7 @@ export default class Base extends Component<BaseTypographyProps, BaseTypographyS
85
85
  spacing: PropTypes.Requireable<"normal" | "extended">;
86
86
  strong: PropTypes.Requireable<boolean>;
87
87
  size: PropTypes.Requireable<"small" | "normal">;
88
- type: PropTypes.Requireable<"warning" | "success" | "primary" | "secondary" | "tertiary" | "danger" | "quaternary">;
88
+ type: PropTypes.Requireable<"warning" | "success" | "primary" | "tertiary" | "secondary" | "danger" | "quaternary">;
89
89
  style: PropTypes.Requireable<object>;
90
90
  className: PropTypes.Requireable<string>;
91
91
  icon: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike>>;
@@ -38,7 +38,7 @@ export default class Numeral extends PureComponent<NumeralProps> {
38
38
  underline: PropTypes.Requireable<boolean>;
39
39
  link: PropTypes.Requireable<NonNullable<boolean | object>>;
40
40
  strong: PropTypes.Requireable<boolean>;
41
- type: PropTypes.Requireable<"warning" | "success" | "primary" | "secondary" | "tertiary" | "danger" | "quaternary">;
41
+ type: PropTypes.Requireable<"warning" | "success" | "primary" | "tertiary" | "secondary" | "danger" | "quaternary">;
42
42
  size: PropTypes.Requireable<"small" | "normal">;
43
43
  style: PropTypes.Requireable<object>;
44
44
  className: PropTypes.Requireable<string>;
@@ -50,7 +50,7 @@ export default class Paragraph extends PureComponent<ParagraphProps> {
50
50
  link: PropTypes.Requireable<NonNullable<boolean | object>>;
51
51
  underline: PropTypes.Requireable<boolean>;
52
52
  strong: PropTypes.Requireable<boolean>;
53
- type: PropTypes.Requireable<"warning" | "success" | "primary" | "secondary" | "tertiary" | "danger" | "quaternary">;
53
+ type: PropTypes.Requireable<"warning" | "success" | "primary" | "tertiary" | "secondary" | "danger" | "quaternary">;
54
54
  size: PropTypes.Requireable<"small" | "normal">;
55
55
  spacing: PropTypes.Requireable<"normal" | "extended">;
56
56
  style: PropTypes.Requireable<object>;
@@ -53,7 +53,7 @@ export default class Text extends PureComponent<TextProps> {
53
53
  underline: PropTypes.Requireable<boolean>;
54
54
  link: PropTypes.Requireable<NonNullable<boolean | object>>;
55
55
  strong: PropTypes.Requireable<boolean>;
56
- type: PropTypes.Requireable<"warning" | "success" | "primary" | "secondary" | "tertiary" | "danger" | "quaternary">;
56
+ type: PropTypes.Requireable<"warning" | "success" | "primary" | "tertiary" | "secondary" | "danger" | "quaternary">;
57
57
  size: PropTypes.Requireable<"small" | "normal">;
58
58
  style: PropTypes.Requireable<object>;
59
59
  className: PropTypes.Requireable<string>;
@@ -59,7 +59,7 @@ export default class Title extends PureComponent<TitleProps> {
59
59
  link: PropTypes.Requireable<NonNullable<boolean | object>>;
60
60
  underline: PropTypes.Requireable<boolean>;
61
61
  strong: PropTypes.Requireable<boolean>;
62
- type: PropTypes.Requireable<"warning" | "success" | "primary" | "secondary" | "tertiary" | "danger" | "quaternary">;
62
+ type: PropTypes.Requireable<"warning" | "success" | "primary" | "tertiary" | "secondary" | "danger" | "quaternary">;
63
63
  heading: PropTypes.Requireable<1 | 2 | 3 | 4 | 5 | 6>;
64
64
  style: PropTypes.Requireable<object>;
65
65
  className: PropTypes.Requireable<string>;
@@ -49,7 +49,7 @@ declare class Anchor extends BaseComponent<AnchorProps, AnchorState> {
49
49
  offsetTop: PropTypes.Requireable<number>;
50
50
  targetOffset: PropTypes.Requireable<number>;
51
51
  showTooltip: PropTypes.Requireable<boolean>;
52
- position: PropTypes.Requireable<"left" | "right" | "top" | "topLeft" | "topRight" | "leftTop" | "leftBottom" | "rightTop" | "rightBottom" | "bottom" | "bottomLeft" | "bottomRight" | "leftTopOver" | "rightTopOver">;
52
+ position: PropTypes.Requireable<"left" | "right" | "top" | "bottom" | "topLeft" | "topRight" | "leftTop" | "leftBottom" | "rightTop" | "rightBottom" | "bottomLeft" | "bottomRight" | "leftTopOver" | "rightTopOver">;
53
53
  maxWidth: PropTypes.Requireable<NonNullable<string | number>>;
54
54
  maxHeight: PropTypes.Requireable<NonNullable<string | number>>;
55
55
  getContainer: PropTypes.Requireable<(...args: any[]) => any>;
@@ -116,7 +116,7 @@ declare class AutoComplete<T extends AutoCompleteItems> extends BaseComponent<Au
116
116
  onFocus: PropTypes.Requireable<(...args: any[]) => any>;
117
117
  onChange: PropTypes.Requireable<(...args: any[]) => any>;
118
118
  onKeyDown: PropTypes.Requireable<(...args: any[]) => any>;
119
- position: PropTypes.Requireable<"left" | "right" | "top" | "topLeft" | "topRight" | "leftTop" | "leftBottom" | "rightTop" | "rightBottom" | "bottom" | "bottomLeft" | "bottomRight" | "leftTopOver" | "rightTopOver" | "leftBottomOver" | "rightBottomOver">;
119
+ position: PropTypes.Requireable<"left" | "right" | "top" | "bottom" | "topLeft" | "topRight" | "leftTop" | "leftBottom" | "rightTop" | "rightBottom" | "bottomLeft" | "bottomRight" | "leftTopOver" | "rightTopOver" | "leftBottomOver" | "rightBottomOver">;
120
120
  placeholder: PropTypes.Requireable<string>;
121
121
  prefix: PropTypes.Requireable<PropTypes.ReactNodeLike>;
122
122
  onChangeWithObject: PropTypes.Requireable<boolean>;
@@ -48,7 +48,7 @@ export default class Button extends PureComponent<ButtonProps> {
48
48
  prefixCls: PropTypes.Requireable<string>;
49
49
  style: PropTypes.Requireable<object>;
50
50
  size: PropTypes.Requireable<"default" | "small" | "large">;
51
- type: PropTypes.Requireable<"warning" | "primary" | "secondary" | "tertiary" | "danger">;
51
+ type: PropTypes.Requireable<"warning" | "primary" | "tertiary" | "secondary" | "danger">;
52
52
  block: PropTypes.Requireable<boolean>;
53
53
  onClick: PropTypes.Requireable<(...args: any[]) => any>;
54
54
  onMouseDown: PropTypes.Requireable<(...args: any[]) => any>;
@@ -23,7 +23,7 @@ declare class Button extends React.PureComponent<ButtonProps> {
23
23
  onMouseLeave: import("prop-types").Requireable<(...args: any[]) => any>;
24
24
  disabled: import("prop-types").Requireable<boolean>;
25
25
  size: import("prop-types").Requireable<"default" | "small" | "large">;
26
- type: import("prop-types").Requireable<"warning" | "primary" | "secondary" | "tertiary" | "danger">;
26
+ type: import("prop-types").Requireable<"warning" | "primary" | "tertiary" | "secondary" | "danger">;
27
27
  block: import("prop-types").Requireable<boolean>;
28
28
  onClick: import("prop-types").Requireable<(...args: any[]) => any>;
29
29
  onMouseDown: import("prop-types").Requireable<(...args: any[]) => any>;
@@ -24,7 +24,7 @@ declare class Carousel extends BaseComponent<CarouselProps, CarouselState> {
24
24
  indicatorType: PropTypes.Requireable<"line" | "dot" | "columnar">;
25
25
  theme: PropTypes.Requireable<"dark" | "light" | "primary">;
26
26
  onChange: PropTypes.Requireable<(...args: any[]) => any>;
27
- arrowType: PropTypes.Requireable<"hover" | "always">;
27
+ arrowType: PropTypes.Requireable<"always" | "hover">;
28
28
  showArrow: PropTypes.Requireable<boolean>;
29
29
  showIndicator: PropTypes.Requireable<boolean>;
30
30
  slideDirection: PropTypes.Requireable<"left" | "right">;
@@ -91,7 +91,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
91
91
  insetLabel: PropTypes.Requireable<PropTypes.ReactNodeLike>;
92
92
  insetLabelId: PropTypes.Requireable<string>;
93
93
  zIndex: PropTypes.Requireable<number>;
94
- position: PropTypes.Requireable<"left" | "right" | "top" | "topLeft" | "topRight" | "leftTop" | "leftBottom" | "rightTop" | "rightBottom" | "bottom" | "bottomLeft" | "bottomRight" | "leftTopOver" | "rightTopOver">;
94
+ position: PropTypes.Requireable<"left" | "right" | "top" | "bottom" | "topLeft" | "topRight" | "leftTop" | "leftBottom" | "rightTop" | "rightBottom" | "bottomLeft" | "bottomRight" | "leftTopOver" | "rightTopOver">;
95
95
  getPopupContainer: PropTypes.Requireable<(...args: any[]) => any>;
96
96
  onCancel: PropTypes.Requireable<(...args: any[]) => any>;
97
97
  onConfirm: PropTypes.Requireable<(...args: any[]) => any>;
@@ -124,11 +124,7 @@ class YearAndMonth extends BaseComponent {
124
124
  const right = strings.PANEL_TYPE_RIGHT;
125
125
  const needDisabled = year => {
126
126
  if (panelType === right && currentYear[left]) {
127
- if (currentMonth[left] <= currentMonth[right]) {
128
- return currentYear[left] > year;
129
- } else {
130
- return currentYear[left] >= year;
131
- }
127
+ return currentYear[left] > year;
132
128
  }
133
129
  return false;
134
130
  };
@@ -66,7 +66,7 @@ declare class Dropdown extends BaseComponent<DropdownProps, DropdownState> {
66
66
  motion: PropTypes.Requireable<NonNullable<boolean | object>>;
67
67
  onVisibleChange: PropTypes.Requireable<(...args: any[]) => any>;
68
68
  prefixCls: PropTypes.Requireable<string>;
69
- position: PropTypes.Requireable<"left" | "right" | "top" | "topLeft" | "topRight" | "leftTop" | "leftBottom" | "rightTop" | "rightBottom" | "bottom" | "bottomLeft" | "bottomRight" | "leftTopOver" | "rightTopOver" | "leftBottomOver" | "rightBottomOver">;
69
+ position: PropTypes.Requireable<"left" | "right" | "top" | "bottom" | "topLeft" | "topRight" | "leftTop" | "leftBottom" | "rightTop" | "rightBottom" | "bottomLeft" | "bottomRight" | "leftTopOver" | "rightTopOver" | "leftBottomOver" | "rightBottomOver">;
70
70
  rePosKey: PropTypes.Requireable<NonNullable<string | number>>;
71
71
  render: PropTypes.Requireable<PropTypes.ReactNodeLike>;
72
72
  spacing: PropTypes.Requireable<NonNullable<number | object>>;
@@ -85,7 +85,7 @@ declare class Form<Values extends Record<string, any> = any> extends BaseCompone
85
85
  expandRestTagsOnClick?: boolean;
86
86
  onDropdownVisibleChange?: (visible: boolean) => void;
87
87
  zIndex?: number;
88
- position?: "left" | "right" | "top" | "topLeft" | "topRight" | "leftTop" | "leftBottom" | "rightTop" | "rightBottom" | "bottom" | "bottomLeft" | "bottomRight" | "leftTopOver" | "rightTopOver" | "leftBottomOver" | "rightBottomOver";
88
+ position?: "left" | "right" | "top" | "bottom" | "topLeft" | "topRight" | "leftTop" | "leftBottom" | "rightTop" | "rightBottom" | "bottomLeft" | "bottomRight" | "leftTopOver" | "rightTopOver" | "leftBottomOver" | "rightBottomOver";
89
89
  onSearch?: (value: string, event: React.KeyboardEvent<Element> | React.MouseEvent<Element, MouseEvent>) => void;
90
90
  dropdownClassName?: string;
91
91
  dropdownStyle?: React.CSSProperties;
@@ -130,7 +130,7 @@ declare class Form<Values extends Record<string, any> = any> extends BaseCompone
130
130
  onDeselect?: (value: string | number | any[] | Record<string, any>, option: Record<string, any>) => void;
131
131
  onSelect?: (value: string | number | any[] | Record<string, any>, option: Record<string, any>) => void;
132
132
  allowCreate?: boolean;
133
- triggerRender?: (props?: import("../select").TriggerRenderProps) => React.ReactNode;
133
+ triggerRender?: (props: import("../select").TriggerRenderProps) => React.ReactNode;
134
134
  onClear?: () => void;
135
135
  virtualize?: import("../select").virtualListProps;
136
136
  onFocus?: (e: React.FocusEvent<Element, Element>) => void;
@@ -31,7 +31,7 @@ declare const FormSelect: import("react").ComponentType<import("utility-types").
31
31
  expandRestTagsOnClick?: boolean;
32
32
  onDropdownVisibleChange?: (visible: boolean) => void;
33
33
  zIndex?: number;
34
- position?: "left" | "right" | "top" | "topLeft" | "topRight" | "leftTop" | "leftBottom" | "rightTop" | "rightBottom" | "bottom" | "bottomLeft" | "bottomRight" | "leftTopOver" | "rightTopOver" | "leftBottomOver" | "rightBottomOver";
34
+ position?: "left" | "right" | "top" | "bottom" | "topLeft" | "topRight" | "leftTop" | "leftBottom" | "rightTop" | "rightBottom" | "bottomLeft" | "bottomRight" | "leftTopOver" | "rightTopOver" | "leftBottomOver" | "rightBottomOver";
35
35
  onSearch?: (value: string, event: import("react").KeyboardEvent<Element> | import("react").MouseEvent<Element, MouseEvent>) => void;
36
36
  dropdownClassName?: string;
37
37
  dropdownStyle?: import("react").CSSProperties;
@@ -76,7 +76,7 @@ declare const FormSelect: import("react").ComponentType<import("utility-types").
76
76
  onDeselect?: (value: string | number | any[] | Record<string, any>, option: Record<string, any>) => void;
77
77
  onSelect?: (value: string | number | any[] | Record<string, any>, option: Record<string, any>) => void;
78
78
  allowCreate?: boolean;
79
- triggerRender?: (props?: import("../select/index").TriggerRenderProps) => import("react").ReactNode;
79
+ triggerRender?: (props: import("../select/index").TriggerRenderProps) => import("react").ReactNode;
80
80
  onClear?: () => void;
81
81
  virtualize?: import("../select/index").virtualListProps;
82
82
  onFocus?: (e: import("react").FocusEvent<Element, Element>) => void;
@@ -53,6 +53,8 @@ export interface PreviewProps extends BaseProps {
53
53
  zIndex?: number;
54
54
  children?: ReactNode;
55
55
  crossOrigin?: "anonymous" | "use-credentials";
56
+ maxZoom?: number;
57
+ minZoom?: number;
56
58
  renderHeader?: (info: any) => ReactNode;
57
59
  renderPreviewMenu?: (props: MenuProps) => ReactNode;
58
60
  getPopupContainer?: () => HTMLElement;
@@ -138,14 +140,12 @@ export interface FooterProps extends SliderProps {
138
140
  onRotate?: (direction: string) => void;
139
141
  onDownload?: () => void;
140
142
  renderPreviewMenu?: (props: MenuProps) => ReactNode;
143
+ forwardRef?: React.RefObject<HTMLElement>;
141
144
  }
142
145
  export interface PreviewImageProps {
143
146
  src?: string;
144
147
  rotation?: number;
145
148
  style?: React.CSSProperties;
146
- maxZoom?: number;
147
- minZoom?: number;
148
- zoomStep?: number;
149
149
  zoom?: number;
150
150
  ratio?: RatioType;
151
151
  disableDownload?: boolean;