@douyinfe/semi-ui 2.11.1 → 2.12.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 (60) hide show
  1. package/README.md +1 -1
  2. package/button/Button.tsx +1 -1
  3. package/dist/css/semi.css +33 -0
  4. package/dist/css/semi.min.css +1 -1
  5. package/dist/umd/semi-ui.js +2334 -322
  6. package/dist/umd/semi-ui.js.map +1 -1
  7. package/dist/umd/semi-ui.min.js +1 -1
  8. package/dist/umd/semi-ui.min.js.map +1 -1
  9. package/form/_story/FormSubmit/index.tsx +45 -0
  10. package/form/_story/form.stories.js +2 -1
  11. package/lib/cjs/button/Button.d.ts +1 -1
  12. package/lib/cjs/modal/Modal.js +3 -2
  13. package/lib/cjs/modal/ModalContent.d.ts +2 -0
  14. package/lib/cjs/modal/ModalContent.js +17 -9
  15. package/lib/cjs/progress/index.js +1 -1
  16. package/lib/cjs/select/index.js +1 -1
  17. package/lib/cjs/slider/index.js +9 -5
  18. package/lib/cjs/tabs/TabBar.d.ts +1 -0
  19. package/lib/cjs/tabs/TabBar.js +8 -1
  20. package/lib/cjs/tabs/TabPane.js +2 -1
  21. package/lib/cjs/tabs/index.js +2 -1
  22. package/lib/cjs/tabs/interface.d.ts +1 -0
  23. package/lib/cjs/tag/index.d.ts +2 -0
  24. package/lib/cjs/tag/index.js +60 -11
  25. package/lib/cjs/tag/interface.d.ts +1 -0
  26. package/lib/cjs/tagInput/index.js +3 -2
  27. package/lib/cjs/treeSelect/index.js +3 -3
  28. package/lib/es/button/Button.d.ts +1 -1
  29. package/lib/es/modal/Modal.js +3 -2
  30. package/lib/es/modal/ModalContent.d.ts +2 -0
  31. package/lib/es/modal/ModalContent.js +16 -9
  32. package/lib/es/progress/index.js +1 -1
  33. package/lib/es/select/index.js +1 -1
  34. package/lib/es/slider/index.js +9 -5
  35. package/lib/es/tabs/TabBar.d.ts +1 -0
  36. package/lib/es/tabs/TabBar.js +8 -1
  37. package/lib/es/tabs/TabPane.js +2 -1
  38. package/lib/es/tabs/index.js +2 -1
  39. package/lib/es/tabs/interface.d.ts +1 -0
  40. package/lib/es/tag/index.d.ts +2 -0
  41. package/lib/es/tag/index.js +56 -9
  42. package/lib/es/tag/interface.d.ts +1 -0
  43. package/lib/es/tagInput/index.js +3 -2
  44. package/lib/es/treeSelect/index.js +2 -2
  45. package/modal/Modal.tsx +2 -1
  46. package/modal/ModalContent.tsx +14 -8
  47. package/package.json +9 -9
  48. package/progress/index.tsx +1 -1
  49. package/select/index.tsx +1 -2
  50. package/slider/index.tsx +5 -3
  51. package/table/_story/v2/index.js +2 -1
  52. package/table/_story/v2/radioRowSelection.tsx +107 -0
  53. package/tabs/TabBar.tsx +7 -0
  54. package/tabs/TabPane.tsx +1 -0
  55. package/tabs/index.tsx +2 -1
  56. package/tabs/interface.ts +1 -0
  57. package/tag/index.tsx +32 -2
  58. package/tag/interface.ts +1 -0
  59. package/tagInput/index.tsx +1 -0
  60. package/treeSelect/index.tsx +1 -1
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import { Form, Tooltip, Button } from '@douyinfe/semi-ui';
3
+ import { IconHelpCircle } from '@douyinfe/semi-icons';
4
+
5
+ /**
6
+ * @description input, button may trigger submit of form
7
+ *
8
+ * case 1: 当 form 中只有一个 input,在 input 上敲击 enter 会触发 form submit
9
+ * case 2: 当 form 中有 2 个 input,在任意一个 input 上敲击 enter 都不会触发 form submit
10
+ * case 3: 当 from 中有一个 input 和一个 button,在 input 上敲击 enter 会触发 form submit
11
+ *
12
+ * @summary 如果不想触发 form submit,监听 input key down,如果 `e.key` 等于 `Enter` 则调用 e.preventDefault
13
+ *
14
+ * @see https://github.com/DouyinFE/semi-design/issues/767#issuecomment-1098836675
15
+ */
16
+ const App = () => {
17
+ const { Option } = Form.Select;
18
+
19
+ return (
20
+ <Form onSubmit={() => { console.log('submit');} }>
21
+ <Form.Select field="Role" label='角色' style={{ width:176 }}>
22
+ <Option value="admin">管理员</Option>
23
+ <Option value="user">普通用户</Option>
24
+ <Option value="guest">访客</Option>
25
+ </Form.Select>
26
+ <Form.Input field='UserName' label='用户名' style={{ width:80 }} onKeyDown={e => {
27
+ if (e.key === 'Enter') {
28
+ e.preventDefault();
29
+ }
30
+ }} />
31
+ <Form.Input
32
+ field='Password'
33
+ label={{
34
+ text: '密码',
35
+ extra: <Tooltip content='详情'><IconHelpCircle style={{ color: '--semi-color-text-1' }}/></Tooltip>
36
+ }}
37
+ style={{ width:176 }}
38
+ />
39
+ <Button>提交</Button>
40
+ </Form>
41
+ );
42
+ };
43
+ App.storyName = 'form submit';
44
+
45
+ export default App;
@@ -91,6 +91,7 @@ import { SetValuesDemo, SetValuesWithArrayField } from './FormApi/setValuesDemo'
91
91
  import { SetValueUsingParentPath } from './FormApi/formApiDemo';
92
92
  import { FieldPathWithArrayDemo } from './Debug/bugDemo';
93
93
  import ChildDidMount from './Debug/childDidMount';
94
+ export { default as FormSubmit } from './FormSubmit';
94
95
 
95
96
  export default {
96
97
  title: 'Form'
@@ -429,4 +430,4 @@ export const _ChildDidMount = () => <ChildDidMount />;
429
430
 
430
431
  _ChildDidMount.story = {
431
432
  name: 'child did mount',
432
- };
433
+ };
@@ -6,7 +6,7 @@ export declare type HtmlType = 'button' | 'reset' | 'submit';
6
6
  export declare type Size = 'default' | 'small' | 'large';
7
7
  export declare type Theme = 'solid' | 'borderless' | 'light';
8
8
  export declare type Type = 'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger';
9
- export interface ButtonProps {
9
+ export interface ButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {
10
10
  id?: string;
11
11
  block?: boolean;
12
12
  circle?: boolean;
@@ -117,7 +117,8 @@ class Modal extends _baseComponent.default {
117
117
  "aria-label": "cancel",
118
118
  onClick: this.handleCancel,
119
119
  loading: cancelLoading,
120
- type: "tertiary"
120
+ type: "tertiary",
121
+ autoFocus: true
121
122
  }, this.props.cancelButtonProps), cancelText || locale.cancel);
122
123
  }
123
124
  };
@@ -400,7 +401,7 @@ Modal.defaultProps = {
400
401
  onOk: _noop2.default,
401
402
  afterClose: _noop2.default,
402
403
  maskFixed: false,
403
- closeOnEsc: false,
404
+ closeOnEsc: true,
404
405
  size: 'small',
405
406
  keepDOM: false,
406
407
  lazyRender: true,
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
3
3
  import { ContextValue } from '../configProvider/context';
4
4
  import BaseComponent from '../_base/baseComponent';
5
5
  import ModalContentFoundation, { ModalContentAdapter, ModalContentProps, ModalContentState } from '@douyinfe/semi-foundation/lib/cjs/modal/modalContentFoundation';
6
+ import FocusTrapHandle from '@douyinfe/semi-foundation/lib/cjs/utils/FocusHandle';
6
7
  export interface ModalContentReactProps extends ModalContentProps {
7
8
  children?: React.ReactNode;
8
9
  }
@@ -26,6 +27,7 @@ export default class ModalContent extends BaseComponent<ModalContentReactProps,
26
27
  modalDialogRef: React.MutableRefObject<HTMLDivElement>;
27
28
  foundation: ModalContentFoundation;
28
29
  context: ContextValue;
30
+ focusTrapHandle: FocusTrapHandle;
29
31
  constructor(props: ModalContentProps);
30
32
  get adapter(): ModalContentAdapter;
31
33
  componentDidMount(): void;
@@ -22,11 +22,11 @@ var _setTimeout2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-j
22
22
 
23
23
  var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));
24
24
 
25
- var _get2 = _interopRequireDefault(require("lodash/get"));
25
+ var _noop2 = _interopRequireDefault(require("lodash/noop"));
26
26
 
27
27
  var _isFunction2 = _interopRequireDefault(require("lodash/isFunction"));
28
28
 
29
- var _noop2 = _interopRequireDefault(require("lodash/noop"));
29
+ var _get2 = _interopRequireDefault(require("lodash/get"));
30
30
 
31
31
  var _react = _interopRequireDefault(require("react"));
32
32
 
@@ -48,7 +48,7 @@ var _modalContentFoundation = _interopRequireDefault(require("@douyinfe/semi-fou
48
48
 
49
49
  var _semiIcons = require("@douyinfe/semi-icons");
50
50
 
51
- var _utils = require("../_utils");
51
+ var _FocusHandle = _interopRequireDefault(require("@douyinfe/semi-foundation/lib/cjs/utils/FocusHandle"));
52
52
 
53
53
  var __rest = void 0 && (void 0).__rest || function (s, e) {
54
54
  var t = {};
@@ -233,6 +233,7 @@ class ModalContent extends _baseComponent.default {
233
233
  }, /*#__PURE__*/_react.default.createElement("div", {
234
234
  role: "dialog",
235
235
  ref: this.modalDialogRef,
236
+ tabIndex: -1,
236
237
  "aria-modal": "true",
237
238
  "aria-labelledby": "".concat(_constants.cssClasses.DIALOG, "-title"),
238
239
  "aria-describedby": "".concat(_constants.cssClasses.DIALOG, "-body"),
@@ -248,7 +249,7 @@ class ModalContent extends _baseComponent.default {
248
249
 
249
250
  this.state = {
250
251
  dialogMouseDown: false,
251
- prevFocusElement: (0, _utils.getActiveElement)()
252
+ prevFocusElement: _FocusHandle.default.getActiveElement()
252
253
  };
253
254
  this.foundation = new _modalContentFoundation.default(this.adapter);
254
255
  this.dialogId = "dialog-".concat(uuid++);
@@ -291,19 +292,27 @@ class ModalContent extends _baseComponent.default {
291
292
  },
292
293
  getMouseState: () => this.state.dialogMouseDown,
293
294
  modalDialogFocus: () => {
295
+ var _a, _b, _c;
296
+
294
297
  let activeElementInDialog;
295
298
 
296
299
  if (this.modalDialogRef) {
297
- const activeElement = (0, _utils.getActiveElement)();
300
+ const activeElement = _FocusHandle.default.getActiveElement();
301
+
298
302
  activeElementInDialog = this.modalDialogRef.current.contains(activeElement);
303
+ (_a = this.focusTrapHandle) === null || _a === void 0 ? void 0 : _a.destroy();
304
+ this.focusTrapHandle = new _FocusHandle.default(this.modalDialogRef.current);
299
305
  }
300
306
 
301
307
  if (!activeElementInDialog) {
302
- this.modalDialogRef && this.modalDialogRef.current.focus();
308
+ (_c = (_b = this.modalDialogRef) === null || _b === void 0 ? void 0 : _b.current) === null || _c === void 0 ? void 0 : _c.focus();
303
309
  }
304
310
  },
305
311
  modalDialogBlur: () => {
306
- this.modalDialogRef && this.modalDialogRef.current.blur();
312
+ var _a, _b;
313
+
314
+ (_a = this.modalDialogRef) === null || _a === void 0 ? void 0 : _a.current.blur();
315
+ (_b = this.focusTrapHandle) === null || _b === void 0 ? void 0 : _b.destroy();
307
316
  },
308
317
  prevFocusElementReFocus: () => {
309
318
  const {
@@ -351,8 +360,7 @@ class ModalContent extends _baseComponent.default {
351
360
  className: "".concat(_constants.cssClasses.DIALOG, "-wrap"),
352
361
  onClick: maskClosable ? this.onMaskClick : null,
353
362
  onMouseUp: maskClosable ? this.onMaskMouseUp : null
354
- }, this.getDialogElement())); // @ts-ignore Unreachable branch
355
- // eslint-disable-next-line max-len
363
+ }, this.getDialogElement())); // eslint-disable-next-line max-len
356
364
 
357
365
 
358
366
  return containerContext && containerContext.Provider ? /*#__PURE__*/_react.default.createElement(containerContext.Provider, {
@@ -246,7 +246,7 @@ class Progress extends _react.Component {
246
246
  const perc = this.calcPercent(percent);
247
247
  const percNumber = this.calcPercent(percentNumber);
248
248
  const innerStyle = {
249
- backgroundColor: stroke
249
+ background: stroke
250
250
  };
251
251
 
252
252
  if (direction === _constants.strings.DEFAULT_DIRECTION) {
@@ -681,7 +681,7 @@ class Select extends _baseComponent.default {
681
681
  role: "listbox",
682
682
  "aria-multiselectable": multiple,
683
683
  onScroll: e => this.foundation.handleListScroll(e)
684
- }, innerTopSlot, !loading ? listContent : this.renderLoading(), isEmpty && !loading ? this.renderEmpty() : null, innerBottomSlot), outerBottomSlot);
684
+ }, innerTopSlot, loading ? this.renderLoading() : isEmpty ? this.renderEmpty() : listContent, innerBottomSlot), outerBottomSlot);
685
685
  }
686
686
 
687
687
  renderSingleSelection(selections, filterable) {
@@ -273,7 +273,7 @@ class Slider extends _baseComponent.default {
273
273
  _react.default.createElement("div", {
274
274
  className: _constants.cssClasses.TRACK,
275
275
  style: trackStyle,
276
- onClick: e => this.foundation.handleWrapClick(e)
276
+ onClick: this.foundation.handleWrapClick
277
277
  })
278
278
  );
279
279
  };
@@ -301,7 +301,7 @@ class Slider extends _baseComponent.default {
301
301
  // eslint-disable-next-line jsx-a11y/no-static-element-interactions
302
302
  _react.default.createElement("span", {
303
303
  key: mark,
304
- onClick: e => this.foundation.handleWrapClick(e),
304
+ onClick: this.foundation.handleWrapClick,
305
305
  className: markClass,
306
306
  style: {
307
307
  [stylePos]: "calc(".concat(markPercent * 100, "% - 2px)")
@@ -329,12 +329,16 @@ class Slider extends _baseComponent.default {
329
329
 
330
330
  const activeResult = this.foundation.isMarkActive(Number(mark));
331
331
  const markPercent = (Number(mark) - min) / (max - min);
332
- return activeResult ? /*#__PURE__*/_react.default.createElement("span", {
332
+ return activeResult ?
333
+ /*#__PURE__*/
334
+ // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
335
+ _react.default.createElement("span", {
333
336
  key: mark,
334
337
  className: (0, _classnames.default)((0, _concat.default)(_context3 = "".concat(prefixCls, "-mark")).call(_context3, vertical && verticalReverse ? '-reverse' : '')),
335
338
  style: {
336
339
  [stylePos]: "".concat(markPercent * 100, "%")
337
- }
340
+ },
341
+ onClick: this.foundation.handleWrapClick
338
342
  }, marks[mark]) : null;
339
343
  })) : null;
340
344
  return labelContent;
@@ -614,7 +618,7 @@ class Slider extends _baseComponent.default {
614
618
  onMouseLeave: () => this.foundation.handleWrapperLeave()
615
619
  }, /*#__PURE__*/_react.default.createElement("div", {
616
620
  className: "".concat(prefixCls, "-rail"),
617
- onClick: e => this.foundation.handleWrapClick(e),
621
+ onClick: this.foundation.handleWrapClick,
618
622
  style: this.props.railStyle
619
623
  }), this.renderTrack(), this.renderStepDot(), /*#__PURE__*/_react.default.createElement("div", null, this.renderHandle()), this.renderLabel(), /*#__PURE__*/_react.default.createElement("div", {
620
624
  className: boundaryClass
@@ -30,6 +30,7 @@ declare class TabBar extends React.Component<TabBarProps, TabBarState> {
30
30
  renderIcon(icon: ReactNode): ReactNode;
31
31
  renderExtra(): ReactNode;
32
32
  handleItemClick: (itemKey: string, e: MouseEvent<Element>) => void;
33
+ handleKeyDown: (event: React.KeyboardEvent, itemKey: string, closable: boolean) => void;
33
34
  renderTabItem: (panel: PlainTab) => ReactNode;
34
35
  renderTabComponents: (list: Array<PlainTab>) => Array<ReactNode>;
35
36
  handleArrowClick: (items: Array<OverflowItem>, pos: 'start' | 'end') => void;
@@ -75,6 +75,10 @@ class TabBar extends _react.default.Component {
75
75
  }
76
76
  };
77
77
 
78
+ this.handleKeyDown = (event, itemKey, closable) => {
79
+ this.props.handleKeyDown(event, itemKey, closable);
80
+ };
81
+
78
82
  this.renderTabItem = panel => {
79
83
  const {
80
84
  size,
@@ -108,9 +112,12 @@ class TabBar extends _react.default.Component {
108
112
  return /*#__PURE__*/_react.default.createElement("div", (0, _assign.default)({
109
113
  role: "tab",
110
114
  id: "semiTab".concat(key),
115
+ "data-tabkey": "semiTab".concat(key),
111
116
  "aria-controls": "semiTabPanel".concat(key),
112
117
  "aria-disabled": panel.disabled ? 'true' : 'false',
113
- "aria-selected": isSelected ? 'true' : 'false'
118
+ "aria-selected": isSelected ? 'true' : 'false',
119
+ tabIndex: isSelected ? 0 : -1,
120
+ onKeyDown: e => this.handleKeyDown(e, key, panel.closable)
114
121
  }, events, {
115
122
  className: className,
116
123
  key: this._getItemKey(key)
@@ -141,7 +141,8 @@ class TabPane extends _react.PureComponent {
141
141
  "aria-labelledby": "semiTab".concat(itemKey),
142
142
  className: classNames,
143
143
  style: style,
144
- "aria-hidden": active ? 'false' : 'true'
144
+ "aria-hidden": active ? 'false' : 'true',
145
+ tabIndex: 0
145
146
  }, (0, _getDataAttr.default)(restProps)), motion ? /*#__PURE__*/_react.default.createElement(_TabPaneTransition.default, {
146
147
  direction: this.getDirection(this.context.activeKey, itemKey, this.context.panes),
147
148
  motion: motion,
@@ -372,7 +372,8 @@ class Tabs extends _baseComponent.default {
372
372
  tabBarExtraContent,
373
373
  tabPosition,
374
374
  type,
375
- deleteTabItem: this.deleteTabItem
375
+ deleteTabItem: this.deleteTabItem,
376
+ handleKeyDown: this.foundation.handleKeyDown
376
377
  };
377
378
  const tabBar = renderTabBar ? renderTabBar(tabBarProps, _TabBar.default) : /*#__PURE__*/_react.default.createElement(_TabBar.default, (0, _assign.default)({}, tabBarProps));
378
379
  const content = keepDOM ? children : this.getActiveItem();
@@ -48,6 +48,7 @@ export interface TabBarProps {
48
48
  dropdownStyle?: CSSProperties;
49
49
  closable?: boolean;
50
50
  deleteTabItem?: (tabKey: string, event: MouseEvent<Element>) => void;
51
+ handleKeyDown?: (event: React.KeyboardEvent, itemKey: string, closable: boolean) => void;
51
52
  }
52
53
  export interface TabPaneProps {
53
54
  className?: string;
@@ -21,6 +21,7 @@ export default class Tag extends Component<TagProps, TagState> {
21
21
  className: PropTypes.Requireable<string>;
22
22
  avatarSrc: PropTypes.Requireable<string>;
23
23
  avatarShape: PropTypes.Requireable<string>;
24
+ 'aria-label': PropTypes.Requireable<string>;
24
25
  };
25
26
  constructor(props: TagProps);
26
27
  static getDerivedStateFromProps(nextProps: TagProps): {
@@ -28,6 +29,7 @@ export default class Tag extends Component<TagProps, TagState> {
28
29
  };
29
30
  setVisible(visible: boolean): void;
30
31
  close(e: React.MouseEvent<HTMLElement>, value: React.ReactNode): void;
32
+ handleKeyDown(event: any): void;
31
33
  renderAvatar(): JSX.Element;
32
34
  render(): JSX.Element;
33
35
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- var _context6;
3
+ var _context8;
4
4
 
5
5
  var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
6
6
 
@@ -31,6 +31,8 @@ var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-sta
31
31
 
32
32
  var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
33
33
 
34
+ var _isString2 = _interopRequireDefault(require("lodash/isString"));
35
+
34
36
  var _react = _interopRequireWildcard(require("react"));
35
37
 
36
38
  var _classnames = _interopRequireDefault(require("classnames"));
@@ -43,11 +45,13 @@ var _index = _interopRequireDefault(require("../avatar/index"));
43
45
 
44
46
  var _semiIcons = require("@douyinfe/semi-icons");
45
47
 
48
+ var _a11y = require("@douyinfe/semi-foundation/lib/cjs/utils/a11y");
49
+
46
50
  require("@douyinfe/semi-foundation/lib/cjs/tag/tag.css");
47
51
 
48
52
  var _interface = require("./interface");
49
53
 
50
- _forEachInstanceProperty(_context6 = _Object$keys(_interface)).call(_context6, function (key) {
54
+ _forEachInstanceProperty(_context8 = _Object$keys(_interface)).call(_context8, function (key) {
51
55
  if (key === "default" || key === "__esModule") return;
52
56
  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
53
57
  if (key in exports && exports[key] === _interface[key]) return;
@@ -74,6 +78,8 @@ var __rest = void 0 && (void 0).__rest || function (s, e) {
74
78
  }
75
79
  return t;
76
80
  };
81
+ /* eslint-disable jsx-a11y/no-static-element-interactions */
82
+
77
83
  /* eslint-disable no-unused-vars */
78
84
 
79
85
  /* eslint-disable max-len */
@@ -87,13 +93,14 @@ const avatarShapeSet = _constants.strings.AVATAR_SHAPE;
87
93
 
88
94
  class Tag extends _react.Component {
89
95
  constructor(props) {
90
- var _context;
96
+ var _context, _context2;
91
97
 
92
98
  super(props);
93
99
  this.state = {
94
100
  visible: true
95
101
  };
96
102
  this.close = (0, _bind.default)(_context = this.close).call(_context, this);
103
+ this.handleKeyDown = (0, _bind.default)(_context2 = this.handleKeyDown).call(_context2, this);
97
104
  } // any other way to achieve this?
98
105
 
99
106
 
@@ -130,6 +137,33 @@ class Tag extends _react.Component {
130
137
  this.setVisible(false);
131
138
  }
132
139
 
140
+ handleKeyDown(event) {
141
+ const {
142
+ closable,
143
+ onClick
144
+ } = this.props;
145
+
146
+ switch (event.key) {
147
+ case "Backspace":
148
+ case "Delete":
149
+ closable && this.close(event, this.props.children);
150
+ (0, _a11y.handlePrevent)(event);
151
+ break;
152
+
153
+ case "Enter":
154
+ onClick(event);
155
+ (0, _a11y.handlePrevent)(event);
156
+ break;
157
+
158
+ case 'Escape':
159
+ event.target.blur();
160
+ break;
161
+
162
+ default:
163
+ break;
164
+ }
165
+ }
166
+
133
167
  renderAvatar() {
134
168
  const {
135
169
  avatarShape,
@@ -145,7 +179,7 @@ class Tag extends _react.Component {
145
179
  }
146
180
 
147
181
  render() {
148
- var _context2, _context3, _context4, _context5;
182
+ var _context3, _context4, _context5, _context6, _context7;
149
183
 
150
184
  const _a = this.props,
151
185
  {
@@ -155,35 +189,49 @@ class Tag extends _react.Component {
155
189
  closable,
156
190
  visible,
157
191
  onClose,
192
+ onClick,
158
193
  className,
159
194
  type,
160
195
  avatarSrc,
161
196
  avatarShape
162
197
  } = _a,
163
- attr = __rest(_a, ["children", "size", "color", "closable", "visible", "onClose", "className", "type", "avatarSrc", "avatarShape"]);
198
+ attr = __rest(_a, ["children", "size", "color", "closable", "visible", "onClose", "onClick", "className", "type", "avatarSrc", "avatarShape"]);
164
199
 
165
200
  const {
166
201
  visible: isVisible
167
202
  } = this.state;
203
+ const clickable = onClick !== Tag.defaultProps.onClick || closable;
204
+ const a11yProps = {
205
+ role: 'button',
206
+ tabIndex: 0,
207
+ onKeyDown: this.handleKeyDown
208
+ };
168
209
  const baseProps = (0, _assign.default)((0, _assign.default)({}, attr), {
210
+ onClick,
169
211
  className: (0, _classnames.default)(prefixCls, {
170
212
  ["".concat(prefixCls, "-default")]: size === 'default',
171
213
  ["".concat(prefixCls, "-small")]: size === 'small',
172
214
  ["".concat(prefixCls, "-large")]: size === 'large',
173
- [(0, _concat.default)(_context2 = "".concat(prefixCls, "-")).call(_context2, type)]: type,
174
- [(0, _concat.default)(_context3 = (0, _concat.default)(_context4 = "".concat(prefixCls, "-")).call(_context4, color, "-")).call(_context3, type)]: color && type,
215
+ [(0, _concat.default)(_context3 = "".concat(prefixCls, "-")).call(_context3, type)]: type,
216
+ [(0, _concat.default)(_context4 = (0, _concat.default)(_context5 = "".concat(prefixCls, "-")).call(_context5, color, "-")).call(_context4, type)]: color && type,
175
217
  ["".concat(prefixCls, "-closable")]: closable,
176
218
  ["".concat(prefixCls, "-invisible")]: !isVisible,
177
- [(0, _concat.default)(_context5 = "".concat(prefixCls, "-avatar-")).call(_context5, avatarShape)]: avatarSrc
219
+ [(0, _concat.default)(_context6 = "".concat(prefixCls, "-avatar-")).call(_context6, avatarShape)]: avatarSrc
178
220
  }, className)
179
221
  });
180
- const closeIcon = closable ? /*#__PURE__*/_react.default.createElement("div", {
222
+ const wrapProps = clickable ? (0, _assign.default)((0, _assign.default)({}, baseProps), a11yProps) : baseProps;
223
+ const closeIcon = closable ?
224
+ /*#__PURE__*/
225
+ // eslint-disable-next-line jsx-a11y/click-events-have-key-events
226
+ _react.default.createElement("div", {
181
227
  className: "".concat(prefixCls, "-close"),
182
228
  onClick: e => this.close(e, children)
183
229
  }, /*#__PURE__*/_react.default.createElement(_semiIcons.IconClose, {
184
230
  size: "small"
185
231
  })) : null;
186
- return /*#__PURE__*/_react.default.createElement("div", (0, _assign.default)({}, baseProps), /*#__PURE__*/_react.default.createElement("div", {
232
+ return /*#__PURE__*/_react.default.createElement("div", (0, _assign.default)({
233
+ "aria-label": this.props['aria-label'] || (0, _isString2.default)(children) ? (0, _concat.default)(_context7 = "".concat(closable ? 'Closable ' : '', "Tag: ")).call(_context7, children) : ''
234
+ }, wrapProps), /*#__PURE__*/_react.default.createElement("div", {
187
235
  className: "".concat(prefixCls, "-content")
188
236
  }, avatarSrc ? this.renderAvatar() : null, children, closeIcon));
189
237
  }
@@ -215,5 +263,6 @@ Tag.propTypes = {
215
263
  style: _propTypes.default.object,
216
264
  className: _propTypes.default.string,
217
265
  avatarSrc: _propTypes.default.string,
218
- avatarShape: _propTypes.default.oneOf(avatarShapeSet)
266
+ avatarShape: _propTypes.default.oneOf(avatarShapeSet),
267
+ 'aria-label': _propTypes.default.string
219
268
  };
@@ -16,6 +16,7 @@ export interface TagProps {
16
16
  className?: string;
17
17
  avatarSrc?: string;
18
18
  avatarShape?: AvatarShape;
19
+ 'aria-label'?: React.AriaAttributes['aria-label'];
19
20
  }
20
21
  export interface TagGroupProps {
21
22
  style?: React.CSSProperties;
@@ -283,7 +283,7 @@ class TagInput extends _baseComponent.default {
283
283
  if ((0, _isFunction2.default)(renderTagItem)) {
284
284
  item = renderTagItem(value, index);
285
285
  } else {
286
- var _context2;
286
+ var _context2, _context3;
287
287
 
288
288
  item = /*#__PURE__*/_react.default.createElement(_tag.default, {
289
289
  className: tagCls,
@@ -295,7 +295,8 @@ class TagInput extends _baseComponent.default {
295
295
  },
296
296
  closable: !disabled,
297
297
  key: (0, _concat.default)(_context2 = "".concat(index)).call(_context2, value),
298
- visible: true
298
+ visible: true,
299
+ "aria-label": (0, _concat.default)(_context3 = "".concat(!disabled ? 'Closable ' : '', "Tag: ")).call(_context3, value)
299
300
  }, /*#__PURE__*/_react.default.createElement(_paragraph.default, {
300
301
  className: typoCls,
301
302
  ellipsis: {
@@ -16,6 +16,8 @@ exports.default = void 0;
16
16
 
17
17
  var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign"));
18
18
 
19
+ var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));
20
+
19
21
  var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
20
22
 
21
23
  var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
@@ -28,8 +30,6 @@ var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable
28
30
 
29
31
  var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
30
32
 
31
- var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));
32
-
33
33
  var _isFunction2 = _interopRequireDefault(require("lodash/isFunction"));
34
34
 
35
35
  var _get2 = _interopRequireDefault(require("lodash/get"));
@@ -238,7 +238,7 @@ class TreeSelect extends _baseComponent.default {
238
238
 
239
239
  if (checkRelation === 'related') {
240
240
  renderKeys = (0, _treeUtil.normalizeKeyList)([...checkedKeys], keyEntities, leafOnly);
241
- } else if (checkRelation === 'unRelated') {
241
+ } else if (checkRelation === 'unRelated' && (0, _keys.default)(keyEntities).length > 0) {
242
242
  renderKeys = [...realCheckedKeys];
243
243
  }
244
244
 
@@ -6,7 +6,7 @@ export declare type HtmlType = 'button' | 'reset' | 'submit';
6
6
  export declare type Size = 'default' | 'small' | 'large';
7
7
  export declare type Theme = 'solid' | 'borderless' | 'light';
8
8
  export declare type Type = 'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger';
9
- export interface ButtonProps {
9
+ export interface ButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {
10
10
  id?: string;
11
11
  block?: boolean;
12
12
  circle?: boolean;
@@ -78,7 +78,8 @@ class Modal extends BaseComponent {
78
78
  "aria-label": "cancel",
79
79
  onClick: this.handleCancel,
80
80
  loading: cancelLoading,
81
- type: "tertiary"
81
+ type: "tertiary",
82
+ autoFocus: true
82
83
  }, this.props.cancelButtonProps), cancelText || locale.cancel);
83
84
  }
84
85
  };
@@ -361,7 +362,7 @@ Modal.defaultProps = {
361
362
  onOk: _noop,
362
363
  afterClose: _noop,
363
364
  maskFixed: false,
364
- closeOnEsc: false,
365
+ closeOnEsc: true,
365
366
  size: 'small',
366
367
  keepDOM: false,
367
368
  lazyRender: true,
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
3
3
  import { ContextValue } from '../configProvider/context';
4
4
  import BaseComponent from '../_base/baseComponent';
5
5
  import ModalContentFoundation, { ModalContentAdapter, ModalContentProps, ModalContentState } from '@douyinfe/semi-foundation/lib/es/modal/modalContentFoundation';
6
+ import FocusTrapHandle from '@douyinfe/semi-foundation/lib/es/utils/FocusHandle';
6
7
  export interface ModalContentReactProps extends ModalContentProps {
7
8
  children?: React.ReactNode;
8
9
  }
@@ -26,6 +27,7 @@ export default class ModalContent extends BaseComponent<ModalContentReactProps,
26
27
  modalDialogRef: React.MutableRefObject<HTMLDivElement>;
27
28
  foundation: ModalContentFoundation;
28
29
  context: ContextValue;
30
+ focusTrapHandle: FocusTrapHandle;
29
31
  constructor(props: ModalContentProps);
30
32
  get adapter(): ModalContentAdapter;
31
33
  componentDidMount(): void;