@douyinfe/semi-ui 2.5.0 → 2.6.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 (68) hide show
  1. package/calendar/monthCalendar.tsx +14 -13
  2. package/cascader/index.tsx +21 -3
  3. package/cascader/item.tsx +25 -5
  4. package/datePicker/dateInput.tsx +8 -5
  5. package/datePicker/datePicker.tsx +6 -1
  6. package/datePicker/month.tsx +14 -7
  7. package/datePicker/monthsGrid.tsx +17 -5
  8. package/datePicker/navigation.tsx +8 -4
  9. package/datePicker/quickControl.tsx +1 -0
  10. package/datePicker/yearAndMonth.tsx +1 -1
  11. package/dist/css/semi.css +21 -8
  12. package/dist/css/semi.min.css +1 -1
  13. package/dist/umd/semi-ui.js +232 -92
  14. package/dist/umd/semi-ui.js.map +1 -1
  15. package/dist/umd/semi-ui.min.js +1 -1
  16. package/dist/umd/semi-ui.min.js.map +1 -1
  17. package/form/__test__/formApi.test.js +182 -0
  18. package/form/_story/FormApi/arrayDemo.jsx +4 -7
  19. package/form/_story/Layout/slotDemo.jsx +2 -2
  20. package/form/_story/demo.jsx +18 -1
  21. package/form/_story/form.stories.js +6 -6
  22. package/form/baseForm.tsx +2 -2
  23. package/form/hoc/withField.tsx +1 -1
  24. package/lib/cjs/_base/base.css +5 -5
  25. package/lib/cjs/calendar/monthCalendar.js +21 -5
  26. package/lib/cjs/cascader/index.d.ts +9 -2
  27. package/lib/cjs/cascader/index.js +14 -1
  28. package/lib/cjs/cascader/item.d.ts +6 -2
  29. package/lib/cjs/cascader/item.js +33 -4
  30. package/lib/cjs/datePicker/dateInput.d.ts +0 -2
  31. package/lib/cjs/datePicker/dateInput.js +17 -6
  32. package/lib/cjs/datePicker/datePicker.js +15 -12
  33. package/lib/cjs/datePicker/month.d.ts +1 -0
  34. package/lib/cjs/datePicker/month.js +18 -2
  35. package/lib/cjs/datePicker/monthsGrid.js +16 -4
  36. package/lib/cjs/datePicker/navigation.js +8 -0
  37. package/lib/cjs/datePicker/quickControl.js +1 -0
  38. package/lib/cjs/datePicker/yearAndMonth.js +1 -0
  39. package/lib/cjs/form/baseForm.js +2 -2
  40. package/lib/cjs/form/hoc/withField.js +1 -1
  41. package/lib/cjs/scrollList/scrollItem.d.ts +2 -1
  42. package/lib/cjs/scrollList/scrollItem.js +13 -3
  43. package/lib/es/_base/base.css +5 -5
  44. package/lib/es/calendar/monthCalendar.js +22 -5
  45. package/lib/es/cascader/index.d.ts +9 -2
  46. package/lib/es/cascader/index.js +14 -1
  47. package/lib/es/cascader/item.d.ts +6 -2
  48. package/lib/es/cascader/item.js +31 -4
  49. package/lib/es/datePicker/dateInput.d.ts +0 -2
  50. package/lib/es/datePicker/dateInput.js +17 -6
  51. package/lib/es/datePicker/datePicker.js +15 -12
  52. package/lib/es/datePicker/month.d.ts +1 -0
  53. package/lib/es/datePicker/month.js +18 -2
  54. package/lib/es/datePicker/monthsGrid.js +16 -4
  55. package/lib/es/datePicker/navigation.js +8 -0
  56. package/lib/es/datePicker/quickControl.js +2 -0
  57. package/lib/es/datePicker/yearAndMonth.js +1 -0
  58. package/lib/es/form/baseForm.js +2 -2
  59. package/lib/es/form/hoc/withField.js +1 -1
  60. package/lib/es/scrollList/scrollItem.d.ts +2 -1
  61. package/lib/es/scrollList/scrollItem.js +13 -3
  62. package/package.json +9 -9
  63. package/scrollList/_story/ScrollList/index.js +3 -0
  64. package/scrollList/_story/WheelList/index.js +3 -0
  65. package/scrollList/scrollItem.tsx +30 -9
  66. package/table/_story/Perf/Virtualized/index.jsx +6 -0
  67. package/table/_story/v2/FixedHeaderMerge/index.jsx +1 -1
  68. package/table/_story/v2/defaultFilteredValue.tsx +0 -9
@@ -20,6 +20,8 @@ var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-st
20
20
 
21
21
  var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
22
22
 
23
+ var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign"));
24
+
23
25
  var _includes2 = _interopRequireDefault(require("lodash/includes"));
24
26
 
25
27
  var _react = _interopRequireWildcard(require("react"));
@@ -30,6 +32,8 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
30
32
 
31
33
  var _constants = require("@douyinfe/semi-foundation/lib/cjs/cascader/constants");
32
34
 
35
+ var _isEnterPress = _interopRequireDefault(require("@douyinfe/semi-foundation/lib/cjs/utils/isEnterPress"));
36
+
33
37
  var _context7 = _interopRequireDefault(require("../configProvider/context"));
34
38
 
35
39
  var _localeConsumer = _interopRequireDefault(require("../locale/localeConsumer"));
@@ -61,6 +65,16 @@ class Item extends _react.PureComponent {
61
65
 
62
66
  onItemClick(e, item);
63
67
  };
68
+ /**
69
+ * A11y: simulate item click
70
+ */
71
+
72
+
73
+ this.handleItemEnterPress = (keyboardEvent, item) => {
74
+ if ((0, _isEnterPress.default)(keyboardEvent)) {
75
+ this.onClick(keyboardEvent, item);
76
+ }
77
+ };
64
78
 
65
79
  this.onHover = (e, item) => {
66
80
  const {
@@ -140,6 +154,7 @@ class Item extends _react.PureComponent {
140
154
 
141
155
  case 'empty':
142
156
  return /*#__PURE__*/_react.default.createElement("span", {
157
+ "aria-hidden": true,
143
158
  className: (0, _concat.default)(_context3 = "".concat(prefixcls, "-icon ")).call(_context3, prefixcls, "-icon-empty")
144
159
  });
145
160
 
@@ -202,11 +217,13 @@ class Item extends _react.PureComponent {
202
217
  ["".concat(prefixcls, "-disabled")]: disabled
203
218
  });
204
219
  return /*#__PURE__*/_react.default.createElement("li", {
220
+ role: 'menuitem',
205
221
  className: className,
206
222
  key: key,
207
223
  onClick: e => {
208
224
  this.onClick(e, item);
209
- }
225
+ },
226
+ onKeyPress: e => this.handleItemEnterPress(e, item)
210
227
  }, /*#__PURE__*/_react.default.createElement("span", {
211
228
  className: "".concat(prefixcls, "-label")
212
229
  }, !multiple && this.renderIcon('empty'), multiple && /*#__PURE__*/_react.default.createElement(_checkbox.default, {
@@ -232,13 +249,15 @@ class Item extends _react.PureComponent {
232
249
  let showChildItem;
233
250
  const ind = content.length;
234
251
  content.push( /*#__PURE__*/_react.default.createElement("ul", {
252
+ role: 'menu',
235
253
  className: "".concat(prefixcls, "-list"),
236
254
  key: renderData[0].key,
237
255
  onScroll: e => this.props.onListScroll(e, ind)
238
256
  }, (0, _map.default)(renderData).call(renderData, item => {
239
257
  const {
240
258
  data,
241
- key
259
+ key,
260
+ parentKey
242
261
  } = item;
243
262
  const {
244
263
  children,
@@ -263,16 +282,26 @@ class Item extends _react.PureComponent {
263
282
  ["".concat(prefixcls, "-select")]: selected && !multiple,
264
283
  ["".concat(prefixcls, "-disabled")]: disabled
265
284
  });
266
- return /*#__PURE__*/_react.default.createElement("li", {
285
+ const otherAriaProps = parentKey ? {
286
+ ['aria-owns']: "cascaderItem-".concat(parentKey)
287
+ } : {};
288
+ return /*#__PURE__*/_react.default.createElement("li", (0, _assign.default)({
289
+ role: 'menuitem',
290
+ id: "cascaderItem-".concat(key),
291
+ "aria-expanded": active,
292
+ "aria-haspopup": Boolean(showExpand),
293
+ "aria-disabled": disabled
294
+ }, otherAriaProps, {
267
295
  className: className,
268
296
  key: key,
269
297
  onClick: e => {
270
298
  this.onClick(e, item);
271
299
  },
300
+ onKeyPress: e => this.handleItemEnterPress(e, item),
272
301
  onMouseEnter: e => {
273
302
  this.onHover(e, item);
274
303
  }
275
- }, /*#__PURE__*/_react.default.createElement("span", {
304
+ }), /*#__PURE__*/_react.default.createElement("span", {
276
305
  className: "".concat(prefixcls, "-label")
277
306
  }, selected && !multiple && this.renderIcon('tick'), !selected && !multiple && this.renderIcon('empty'), multiple && /*#__PURE__*/_react.default.createElement(_checkbox.default, {
278
307
  onChange: e => this.onCheckboxChange(e, item),
@@ -25,7 +25,6 @@ export default class DateInput extends BaseComponent<DateInputProps, {}> {
25
25
  value: PropTypes.Requireable<any[]>;
26
26
  disabled: PropTypes.Requireable<boolean>;
27
27
  type: PropTypes.Requireable<"dateTime" | "date" | "month" | "dateRange" | "year" | "dateTimeRange">;
28
- multiple: PropTypes.Requireable<boolean>;
29
28
  showClear: PropTypes.Requireable<boolean>;
30
29
  format: PropTypes.Requireable<string>;
31
30
  inputStyle: PropTypes.Requireable<object>;
@@ -49,7 +48,6 @@ export default class DateInput extends BaseComponent<DateInputProps, {}> {
49
48
  onBlur: typeof noop;
50
49
  onClear: typeof noop;
51
50
  onFocus: typeof noop;
52
- multiple: boolean;
53
51
  type: string;
54
52
  inputStyle: {};
55
53
  inputReadOnly: boolean;
@@ -52,6 +52,8 @@ var __rest = void 0 && (void 0).__rest || function (s, e) {
52
52
  }
53
53
  return t;
54
54
  };
55
+ /* eslint-disable jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions,jsx-a11y/interactive-supports-focus */
56
+
55
57
  /* eslint-disable max-lines-per-function */
56
58
 
57
59
  /* eslint-disable no-unused-vars */
@@ -195,9 +197,14 @@ class DateInput extends _baseComponent.default {
195
197
  } = this.props;
196
198
  const allowClear = (rangeStart || rangeEnd) && showClear;
197
199
  return allowClear && !disabled ? /*#__PURE__*/_react.default.createElement("div", {
200
+ role: "button",
201
+ tabIndex: 0,
202
+ "aria-label": "Clear range input value",
198
203
  className: "".concat(prefixCls, "-range-input-clearbtn"),
199
204
  onMouseDown: e => !disabled && this.handleRangeInputClear(e)
200
- }, /*#__PURE__*/_react.default.createElement(_semiIcons.IconClear, null)) : null;
205
+ }, /*#__PURE__*/_react.default.createElement(_semiIcons.IconClear, {
206
+ "aria-hidden": true
207
+ })) : null;
201
208
  }
202
209
 
203
210
  renderRangeSuffix(suffix) {
@@ -298,6 +305,8 @@ class DateInput extends _baseComponent.default {
298
305
  validateStatus,
299
306
  block,
300
307
  prefixCls,
308
+ multiple,
309
+ // Whether to allow multiple values for email and file types
301
310
  dateFnsLocale,
302
311
  // No need to pass to input
303
312
  onBlur,
@@ -315,11 +324,15 @@ class DateInput extends _baseComponent.default {
315
324
  rangeInputFocus,
316
325
  rangeSeparator
317
326
  } = _a,
318
- rest = __rest(_a, ["placeholder", "type", "value", "inputValue", "inputStyle", "disabled", "showClear", "inputReadOnly", "insetLabel", "validateStatus", "block", "prefixCls", "dateFnsLocale", "onBlur", "onClear", "onFocus", "prefix", "autofocus", "size", "rangeInputStartRef", "rangeInputEndRef", "onRangeClear", "onRangeBlur", "onRangeEndTabPress", "rangeInputFocus", "rangeSeparator"]);
327
+ rest = __rest(_a, ["placeholder", "type", "value", "inputValue", "inputStyle", "disabled", "showClear", "inputReadOnly", "insetLabel", "validateStatus", "block", "prefixCls", "multiple", "dateFnsLocale", "onBlur", "onClear", "onFocus", "prefix", "autofocus", "size", "rangeInputStartRef", "rangeInputEndRef", "onRangeClear", "onRangeBlur", "onRangeEndTabPress", "rangeInputFocus", "rangeSeparator"]);
319
328
 
320
- const dateIcon = /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendar, null);
329
+ const dateIcon = /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendar, {
330
+ "aria-hidden": true
331
+ });
321
332
 
322
- const dateTimeIcon = /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendarClock, null);
333
+ const dateTimeIcon = /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendarClock, {
334
+ "aria-hidden": true
335
+ });
323
336
 
324
337
  const suffix = (0, _includes.default)(type).call(type, 'Time') ? dateTimeIcon : dateIcon;
325
338
  let text = '';
@@ -375,7 +388,6 @@ DateInput.propTypes = {
375
388
  value: _propTypes.default.array,
376
389
  disabled: _propTypes.default.bool,
377
390
  type: _propTypes.default.oneOf(_constants.strings.TYPE_SET),
378
- multiple: _propTypes.default.bool,
379
391
  showClear: _propTypes.default.bool,
380
392
  format: _propTypes.default.string,
381
393
  inputStyle: _propTypes.default.object,
@@ -399,7 +411,6 @@ DateInput.defaultProps = {
399
411
  onBlur: _function.noop,
400
412
  onClear: _function.noop,
401
413
  onFocus: _function.noop,
402
- multiple: false,
403
414
  type: 'date',
404
415
  inputStyle: {},
405
416
  inputReadOnly: false,
@@ -62,6 +62,8 @@ var _yearAndMonth = _interopRequireDefault(require("./yearAndMonth"));
62
62
 
63
63
  require("@douyinfe/semi-foundation/lib/cjs/datePicker/datePicker.css");
64
64
 
65
+ /* eslint-disable jsx-a11y/click-events-have-key-events,jsx-a11y/interactive-supports-focus */
66
+
65
67
  /* eslint-disable max-len */
66
68
  class DatePicker extends _baseComponent.default {
67
69
  constructor(props) {
@@ -608,18 +610,19 @@ class DatePicker extends _baseComponent.default {
608
610
  onRangeClear: this.handleRangeInputClear,
609
611
  onRangeEndTabPress: this.handleRangeEndTabPress
610
612
  });
611
- return (
612
- /*#__PURE__*/
613
- // eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events
614
- _react.default.createElement("div", {
615
- onClick: this.handleTriggerWrapperClick,
616
- className: inputCls
617
- }, typeof triggerRender === 'function' ? /*#__PURE__*/_react.default.createElement(_trigger.default, (0, _assign.default)({}, props, {
618
- triggerRender: triggerRender,
619
- componentName: "DatePicker",
620
- componentProps: (0, _assign.default)({}, this.props)
621
- })) : /*#__PURE__*/_react.default.createElement(_dateInput.default, (0, _assign.default)({}, props)))
622
- );
613
+ return /*#__PURE__*/_react.default.createElement("div", {
614
+ // tooltip will mount a11y props to children
615
+ // eslint-disable-next-line jsx-a11y/role-has-required-aria-props
616
+ role: "combobox",
617
+ "aria-label": (0, _isArray.default)(value) && value.length ? "Change date" : "Choose date",
618
+ "aria-disabled": disabled,
619
+ onClick: this.handleTriggerWrapperClick,
620
+ className: inputCls
621
+ }, typeof triggerRender === 'function' ? /*#__PURE__*/_react.default.createElement(_trigger.default, (0, _assign.default)({}, props, {
622
+ triggerRender: triggerRender,
623
+ componentName: "DatePicker",
624
+ componentProps: (0, _assign.default)({}, this.props)
625
+ })) : /*#__PURE__*/_react.default.createElement(_dateInput.default, (0, _assign.default)({}, props)));
623
626
  }
624
627
 
625
628
  render() {
@@ -33,6 +33,7 @@ export default class Month extends BaseComponent<MonthProps, MonthState> {
33
33
  endDateOffset: PropTypes.Requireable<(...args: any[]) => any>;
34
34
  rangeInputFocus: PropTypes.Requireable<string | boolean>;
35
35
  focusRecordsRef: PropTypes.Requireable<object>;
36
+ multiple: PropTypes.Requireable<boolean>;
36
37
  };
37
38
  static defaultProps: {
38
39
  month: Date;
@@ -40,6 +40,8 @@ var _index = require("@douyinfe/semi-foundation/lib/cjs/datePicker/_utils/index"
40
40
 
41
41
  var _dateFns = require("date-fns");
42
42
 
43
+ /* eslint-disable jsx-a11y/click-events-have-key-events,jsx-a11y/no-noninteractive-element-interactions */
44
+
43
45
  /* eslint-disable max-len */
44
46
  const prefixCls = _constants.cssClasses.PREFIX;
45
47
 
@@ -353,8 +355,10 @@ class Month extends _baseComponent.default {
353
355
 
354
356
  const weekdaysText = (0, _map.default)(weekdays).call(weekdays, key => locale.weeks[key]);
355
357
  return /*#__PURE__*/_react.default.createElement("div", {
358
+ role: "row",
356
359
  className: weekdayCls
357
360
  }, (0, _map.default)(weekdaysText).call(weekdaysText, (E, i) => /*#__PURE__*/_react.default.createElement("div", {
361
+ role: "columnheader",
358
362
  key: E + i,
359
363
  className: weekdayItemCls
360
364
  }, E)));
@@ -389,6 +393,7 @@ class Month extends _baseComponent.default {
389
393
  renderWeek(week, weekIndex) {
390
394
  const weekCls = _constants.cssClasses.WEEK;
391
395
  return /*#__PURE__*/_react.default.createElement("div", {
396
+ role: "row",
392
397
  className: weekCls,
393
398
  key: weekIndex
394
399
  }, (0, _map.default)(week).call(week, (day, dayIndex) => this.renderDay(day, dayIndex)));
@@ -409,6 +414,8 @@ class Month extends _baseComponent.default {
409
414
 
410
415
  if (!fullDate) {
411
416
  return /*#__PURE__*/_react.default.createElement("div", {
417
+ role: "gridcell",
418
+ tabIndex: -1,
412
419
  key: dayNumber + dayIndex,
413
420
  className: _constants.cssClasses.DAY
414
421
  }, /*#__PURE__*/_react.default.createElement("span", null));
@@ -444,6 +451,11 @@ class Month extends _baseComponent.default {
444
451
  const fullDateArgs = [dayNumber, fullDate, dayStatus];
445
452
  const customRender = (0, _isFunction2.default)(renderFullDate);
446
453
  return /*#__PURE__*/_react.default.createElement("div", {
454
+ role: "gridcell",
455
+ tabIndex: dayStatus.isDisabled ? -1 : 0,
456
+ "aria-disabled": dayStatus.isDisabled,
457
+ "aria-selected": dayStatus.isSelected,
458
+ "aria-label": fullDate,
447
459
  className: !customRender ? dayCls : _constants.cssClasses.DAY,
448
460
  title: fullDate,
449
461
  key: dayNumber + dayIndex,
@@ -457,13 +469,16 @@ class Month extends _baseComponent.default {
457
469
 
458
470
  render() {
459
471
  const {
460
- forwardRef
472
+ forwardRef,
473
+ multiple
461
474
  } = this.props;
462
475
  const weekday = this.renderDayOfWeek();
463
476
  const weeks = this.renderWeeks();
464
477
  const monthCls = (0, _classnames.default)(_constants.cssClasses.MONTH);
465
478
  const ref = forwardRef || this.monthRef;
466
479
  return /*#__PURE__*/_react.default.createElement("div", {
480
+ role: "grid",
481
+ "aria-multiselectable": multiple,
467
482
  ref: ref,
468
483
  className: monthCls
469
484
  }, weekday, weeks);
@@ -491,7 +506,8 @@ Month.propTypes = {
491
506
  startDateOffset: _propTypes.default.func,
492
507
  endDateOffset: _propTypes.default.func,
493
508
  rangeInputFocus: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
494
- focusRecordsRef: _propTypes.default.object
509
+ focusRecordsRef: _propTypes.default.object,
510
+ multiple: _propTypes.default.bool
495
511
  };
496
512
  Month.defaultProps = {
497
513
  month: new Date(),
@@ -54,6 +54,8 @@ var _semiIcons = require("@douyinfe/semi-icons");
54
54
 
55
55
  var _getDefaultFormatToken = require("@douyinfe/semi-foundation/lib/cjs/datePicker/_utils/getDefaultFormatToken");
56
56
 
57
+ /* eslint-disable jsx-a11y/interactive-supports-focus,jsx-a11y/click-events-have-key-events */
58
+
57
59
  /* eslint-disable react/no-did-update-set-state */
58
60
 
59
61
  /* eslint-disable max-len */
@@ -395,7 +397,8 @@ class MonthsGrid extends _baseComponent.default {
395
397
  endDateOffset,
396
398
  density,
397
399
  rangeInputFocus,
398
- syncSwitchMonth
400
+ syncSwitchMonth,
401
+ multiple
399
402
  } = this.props;
400
403
  let monthText = ''; // i18n monthText
401
404
 
@@ -461,7 +464,8 @@ class MonthsGrid extends _baseComponent.default {
461
464
  onWeeksRowNumChange: weeksRowNum => this.handleWeeksRowNumChange(weeksRowNum, panelType),
462
465
  startDateOffset: startDateOffset,
463
466
  endDateOffset: endDateOffset,
464
- focusRecordsRef: this.props.focusRecordsRef
467
+ focusRecordsRef: this.props.focusRecordsRef,
468
+ multiple: multiple
465
469
  }));
466
470
  }
467
471
 
@@ -613,14 +617,22 @@ class MonthsGrid extends _baseComponent.default {
613
617
  className: switchCls,
614
618
  ref: current => this.adapter.setCache("switch-".concat(panelType), current)
615
619
  }, /*#__PURE__*/_react.default.createElement("div", {
620
+ role: "button",
621
+ "aria-label": "Switch to date panel",
616
622
  className: dateCls,
617
623
  onClick: e => this.foundation.showDatePanel(panelType)
618
- }, showSwithIcon && /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendar, null), /*#__PURE__*/_react.default.createElement("span", {
624
+ }, showSwithIcon && /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendar, {
625
+ "aria-hidden": true
626
+ }), /*#__PURE__*/_react.default.createElement("span", {
619
627
  className: textCls
620
628
  }, dateText || monthText)), /*#__PURE__*/_react.default.createElement("div", {
629
+ role: "button",
630
+ "aria-label": "Switch to time panel",
621
631
  className: timeCls,
622
632
  onClick: e => this.foundation.showTimePicker(panelType, true)
623
- }, showSwithIcon && /*#__PURE__*/_react.default.createElement(_semiIcons.IconClock, null), /*#__PURE__*/_react.default.createElement("span", {
633
+ }, showSwithIcon && /*#__PURE__*/_react.default.createElement(_semiIcons.IconClock, {
634
+ "aria-hidden": true
635
+ }), /*#__PURE__*/_react.default.createElement("span", {
624
636
  className: textCls
625
637
  }, timeText)));
626
638
  }
@@ -82,7 +82,9 @@ class Navigation extends _react.PureComponent {
82
82
  ref: ref
83
83
  }, /*#__PURE__*/_react.default.createElement(_iconButton.default, {
84
84
  key: "double-chevron-left",
85
+ "aria-label": "Previous year",
85
86
  icon: /*#__PURE__*/_react.default.createElement(_semiIcons.IconDoubleChevronLeft, {
87
+ "aria-hidden": true,
86
88
  size: iconBtnSize
87
89
  }),
88
90
  size: buttonSize,
@@ -92,7 +94,9 @@ class Navigation extends _react.PureComponent {
92
94
  style: leftButtonStyle
93
95
  }), /*#__PURE__*/_react.default.createElement(_iconButton.default, {
94
96
  key: "chevron-left",
97
+ "aria-label": "Previous month",
95
98
  icon: /*#__PURE__*/_react.default.createElement(_semiIcons.IconChevronLeft, {
99
+ "aria-hidden": true,
96
100
  size: iconBtnSize
97
101
  }),
98
102
  size: buttonSize,
@@ -108,7 +112,9 @@ class Navigation extends _react.PureComponent {
108
112
  size: buttonSize
109
113
  }, /*#__PURE__*/_react.default.createElement("span", null, monthText))), /*#__PURE__*/_react.default.createElement(_iconButton.default, {
110
114
  key: "chevron-right",
115
+ "aria-label": "Next month",
111
116
  icon: /*#__PURE__*/_react.default.createElement(_semiIcons.IconChevronRight, {
117
+ "aria-hidden": true,
112
118
  size: iconBtnSize
113
119
  }),
114
120
  size: buttonSize,
@@ -118,7 +124,9 @@ class Navigation extends _react.PureComponent {
118
124
  style: rightButtonStyle
119
125
  }), /*#__PURE__*/_react.default.createElement(_iconButton.default, {
120
126
  key: "double-chevron-right",
127
+ "aria-label": "Next year",
121
128
  icon: /*#__PURE__*/_react.default.createElement(_semiIcons.IconDoubleChevronRight, {
129
+ "aria-hidden": true,
122
130
  size: iconBtnSize
123
131
  }),
124
132
  size: buttonSize,
@@ -34,6 +34,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "functi
34
34
 
35
35
  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; }
36
36
 
37
+ /* eslint-disable jsx-a11y/no-static-element-interactions,jsx-a11y/click-events-have-key-events */
37
38
  const prefixCls = _constants.cssClasses.PREFIX;
38
39
 
39
40
  class QuickControl extends _react.PureComponent {
@@ -249,6 +249,7 @@ class YearAndMonth extends _baseComponent.default {
249
249
  }, /*#__PURE__*/_react.default.createElement(_iconButton.default, {
250
250
  noHorizontalPadding: false,
251
251
  icon: /*#__PURE__*/_react.default.createElement(_semiIcons.IconChevronLeft, {
252
+ "aria-hidden": true,
252
253
  size: iconSize
253
254
  }),
254
255
  size: buttonSize,
@@ -115,8 +115,8 @@ class Form extends _baseComponent.default {
115
115
  notifySubmitFail: (errors, values) => {
116
116
  this.props.onSubmitFail(errors, values);
117
117
  },
118
- forceUpdate: () => {
119
- this.forceUpdate();
118
+ forceUpdate: callback => {
119
+ this.forceUpdate(callback);
120
120
  },
121
121
  notifyChange: formState => {
122
122
  this.props.onChange(formState);
@@ -531,7 +531,7 @@ function withField(Component, opts) {
531
531
  text: label || field,
532
532
  id: labelId,
533
533
  required: required,
534
- name: name || field,
534
+ name: a11yId || name || field,
535
535
  width: mergeLabelWidth,
536
536
  align: mergeLabelAlign
537
537
  }, needSpread));
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { AriaAttributes } from 'react';
2
2
  import BaseComponent from '../_base/baseComponent';
3
3
  import PropTypes from 'prop-types';
4
4
  import { Item, ScrollItemAdapter } from '@douyinfe/semi-foundation/lib/cjs/scrollList/itemFoundation';
@@ -18,6 +18,7 @@ export interface ScrollItemProps<T extends Item> {
18
18
  motion?: Motion;
19
19
  style?: React.CSSProperties;
20
20
  type?: string | number;
21
+ 'aria-label'?: AriaAttributes['aria-label'];
21
22
  }
22
23
  export interface ScrollItemState {
23
24
  prependCount: number;
@@ -299,13 +299,14 @@ class ScrollItem extends _baseComponent.default {
299
299
  transform: itemTrans
300
300
  } = item;
301
301
  const transform = typeof itemTrans === 'function' ? itemTrans : commonTrans;
302
+ const selected = selectedIndex === index;
302
303
  const cls = (0, _classnames.default)({
303
- ["".concat(_constants.cssClasses.PREFIX, "-item-sel")]: selectedIndex === index && mode !== wheelMode,
304
+ ["".concat(_constants.cssClasses.PREFIX, "-item-sel")]: selected && mode !== wheelMode,
304
305
  ["".concat(_constants.cssClasses.PREFIX, "-item-disabled")]: Boolean(item.disabled)
305
306
  });
306
307
  let text = '';
307
308
 
308
- if (selectedIndex === index) {
309
+ if (selected) {
309
310
  if (typeof transform === 'function') {
310
311
  text = transform(item.value, item.text);
311
312
  } else {
@@ -329,7 +330,10 @@ class ScrollItem extends _baseComponent.default {
329
330
  _react.default.createElement("li", (0, _assign.default)({
330
331
  key: prefixKey + index
331
332
  }, events, {
332
- className: cls
333
+ className: cls,
334
+ role: "option",
335
+ "aria-selected": selected,
336
+ "aria-disabled": item.disabled
333
337
  }), text)
334
338
  );
335
339
  });
@@ -348,6 +352,9 @@ class ScrollItem extends _baseComponent.default {
348
352
  className: wrapperCls,
349
353
  ref: this._cacheWrapperNode
350
354
  }, /*#__PURE__*/_react.default.createElement("ul", {
355
+ role: "listbox",
356
+ "aria-multiselectable": false,
357
+ "aria-label": this.props['aria-label'],
351
358
  ref: this._cacheListNode
352
359
  }, inner));
353
360
  };
@@ -402,6 +409,9 @@ class ScrollItem extends _baseComponent.default {
402
409
  ref: this._cacheWrapperNode,
403
410
  onScroll: this.scrollToSelectItem
404
411
  }, /*#__PURE__*/_react.default.createElement("ul", {
412
+ role: "listbox",
413
+ "aria-label": this.props['aria-label'],
414
+ "aria-multiselectable": false,
405
415
  ref: this._cacheListNode,
406
416
  onClick: this.clickToSelectItem
407
417
  }, prependList, inner, appendList)));
@@ -19,7 +19,7 @@ body .semi-always-light {
19
19
  --semi-blue-2: 152,205,253;
20
20
  --semi-blue-3: 101,178,252;
21
21
  --semi-blue-4: 50,149,251;
22
- --semi-blue-5: 0,119,250;
22
+ --semi-blue-5: 0,100,250;
23
23
  --semi-blue-6: 0,98,214;
24
24
  --semi-blue-7: 0,79,179;
25
25
  --semi-blue-8: 0,61,143;
@@ -410,7 +410,7 @@ body, body[theme-mode=dark] .semi-always-light {
410
410
  --semi-color-bg-4: rgba(var(--semi-white), 1);
411
411
  --semi-color-text-0: rgba(var(--semi-grey-9), 1);
412
412
  --semi-color-text-1: rgba(var(--semi-grey-9), .8);
413
- --semi-color-text-2: rgba(var(--semi-grey-9), .6);
413
+ --semi-color-text-2: rgba(var(--semi-grey-9), .62);
414
414
  --semi-color-text-3: rgba(var(--semi-grey-9), .35);
415
415
  --semi-shadow-elevated: 0 0 1px rgba(0, 0, 0, .3), 0 4px 14px rgba(0, 0, 0, .1);
416
416
  --semi-border-radius-extra-small: 3px;
@@ -487,9 +487,9 @@ body[theme-mode=dark], body .semi-always-dark {
487
487
  --semi-color-nav-bg: rgba(35, 36, 41, 1);
488
488
  --semi-shadow-elevated: inset 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 14px rgba(0, 0, 0, .25);
489
489
  --semi-color-overlay-bg: rgba(22, 22, 26, .6);
490
- --semi-color-fill-0: rgba(var(--semi-white), .05);
491
- --semi-color-fill-1: rgba(var(--semi-white), .09);
492
- --semi-color-fill-2: rgba(var(--semi-white), .13);
490
+ --semi-color-fill-0: rgba(var(--semi-white), .12);
491
+ --semi-color-fill-1: rgba(var(--semi-white), .16);
492
+ --semi-color-fill-2: rgba(var(--semi-white), .20);
493
493
  --semi-color-border: rgba(var(--semi-white), .08);
494
494
  --semi-color-shadow: rgba(var(--semi-black), .04);
495
495
  --semi-color-bg-0: rgba(22, 22, 26, 1);
@@ -6,6 +6,8 @@ import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
6
6
  import _bindInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/bind";
7
7
  import _Map from "@babel/runtime-corejs3/core-js-stable/map";
8
8
  import _Object$assign from "@babel/runtime-corejs3/core-js-stable/object/assign";
9
+
10
+ /* eslint-disable jsx-a11y/no-noninteractive-element-to-interactive-role */
9
11
  import React from 'react';
10
12
  import ReactDOM from 'react-dom';
11
13
  import cls from 'classnames';
@@ -62,11 +64,13 @@ export default class monthCalendar extends BaseComponent {
62
64
  } = this.props;
63
65
  this.monthlyData = this.foundation.getMonthlyData(displayValue, dateFnsLocale);
64
66
  return /*#__PURE__*/React.createElement("div", {
65
- className: "".concat(prefixCls, "-header")
67
+ className: "".concat(prefixCls, "-header"),
68
+ role: "presentation"
66
69
  }, /*#__PURE__*/React.createElement("div", {
67
- role: "gridcell",
70
+ role: "presentation",
68
71
  className: "".concat(prefixCls, "-grid")
69
72
  }, /*#__PURE__*/React.createElement("ul", {
73
+ role: "row",
70
74
  className: "".concat(prefixCls, "-grid-row")
71
75
  }, _mapInstanceProperty(_context = this.monthlyData[0]).call(_context, day => {
72
76
  const {
@@ -76,6 +80,8 @@ export default class monthCalendar extends BaseComponent {
76
80
  ["".concat(cssClasses.PREFIX, "-weekend")]: markWeekend && day.isWeekend
77
81
  });
78
82
  return /*#__PURE__*/React.createElement("li", {
83
+ role: "columnheader",
84
+ "aria-label": weekday,
79
85
  key: "".concat(weekday, "-monthheader"),
80
86
  className: listCls
81
87
  }, /*#__PURE__*/React.createElement("span", null, weekday));
@@ -158,7 +164,10 @@ export default class monthCalendar extends BaseComponent {
158
164
  const pos = showCard && showCard[key] ? showCard[key][1] : 'leftTopOver';
159
165
  const text = /*#__PURE__*/React.createElement(LocaleConsumer, {
160
166
  componentName: "Calendar"
161
- }, locale => /*#__PURE__*/React.createElement("div", {
167
+ }, locale =>
168
+ /*#__PURE__*/
169
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
170
+ React.createElement("div", {
162
171
  className: "".concat(cardCls, "-wrapper"),
163
172
  style: {
164
173
  bottom: 0
@@ -226,11 +235,12 @@ export default class monthCalendar extends BaseComponent {
226
235
  day
227
236
  } = events;
228
237
  return /*#__PURE__*/React.createElement("div", {
229
- role: "gridcell",
238
+ role: "presentation",
230
239
  className: "".concat(prefixCls, "-weekrow"),
231
240
  ref: _this.cellDom,
232
241
  key: "".concat(index, "-weekrow")
233
242
  }, /*#__PURE__*/React.createElement("ul", {
243
+ role: "row",
234
244
  className: "".concat(prefixCls, "-skeleton")
235
245
  }, _mapInstanceProperty(weekDay).call(weekDay, each => {
236
246
  const {
@@ -249,6 +259,9 @@ export default class monthCalendar extends BaseComponent {
249
259
  });
250
260
  const shouldRenderCollapsed = Boolean(day && day[ind] && day[ind].length > itemLimit);
251
261
  const inner = /*#__PURE__*/React.createElement("li", {
262
+ role: "gridcell",
263
+ "aria-label": date.toLocaleDateString(),
264
+ "aria-current": isToday ? "date" : false,
252
265
  key: "".concat(date, "-weeksk"),
253
266
  className: listCls,
254
267
  onClick: e => _this.handleClick(e, [date])
@@ -271,9 +284,10 @@ export default class monthCalendar extends BaseComponent {
271
284
  parsedEvents
272
285
  } = this.state;
273
286
  return /*#__PURE__*/React.createElement("div", {
274
- role: "gridcell",
287
+ role: "presentation",
275
288
  className: "".concat(prefixCls, "-week")
276
289
  }, /*#__PURE__*/React.createElement("ul", {
290
+ role: "presentation",
277
291
  className: "".concat(prefixCls, "-grid-col")
278
292
  }, _mapInstanceProperty(_context3 = _Object$keys(this.monthlyData)).call(_context3, weekInd => this.renderWeekRow(weekInd, this.monthlyData[weekInd], parsedEvents[weekInd]))));
279
293
  };
@@ -404,12 +418,15 @@ export default class monthCalendar extends BaseComponent {
404
418
  return /*#__PURE__*/React.createElement(LocaleConsumer, {
405
419
  componentName: "Calendar"
406
420
  }, (locale, localeCode, dateFnsLocale) => /*#__PURE__*/React.createElement("div", {
421
+ role: "grid",
407
422
  className: monthCls,
408
423
  key: this.state.itemLimit,
409
424
  style: monthStyle
410
425
  }, /*#__PURE__*/React.createElement("div", {
426
+ role: "presentation",
411
427
  className: "".concat(prefixCls, "-sticky-top")
412
428
  }, header, this.renderHeader(dateFnsLocale)), /*#__PURE__*/React.createElement("div", {
429
+ role: "presentation",
413
430
  className: "".concat(prefixCls, "-grid-wrapper")
414
431
  }, this.renderMonthGrid())));
415
432
  }