@douyinfe/semi-ui 2.11.0 → 2.12.0-alpha.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 (210) hide show
  1. package/README.md +1 -1
  2. package/avatar/index.tsx +2 -2
  3. package/backtop/index.tsx +11 -7
  4. package/badge/index.tsx +1 -1
  5. package/banner/index.tsx +5 -5
  6. package/breadcrumb/index.tsx +5 -3
  7. package/button/Button.tsx +10 -8
  8. package/card/index.tsx +43 -41
  9. package/carousel/CarouselArrow.tsx +2 -0
  10. package/carousel/index.tsx +1 -0
  11. package/cascader/index.tsx +101 -123
  12. package/cascader/item.tsx +1 -1
  13. package/checkbox/checkbox.tsx +13 -2
  14. package/collapsible/index.tsx +8 -1
  15. package/datePicker/dateInput.tsx +1 -0
  16. package/datePicker/datePicker.tsx +13 -5
  17. package/dist/css/semi.css +33 -0
  18. package/dist/css/semi.min.css +1 -1
  19. package/dist/umd/semi-ui.js +694 -384
  20. package/dist/umd/semi-ui.js.map +1 -1
  21. package/dist/umd/semi-ui.min.js +1 -1
  22. package/dist/umd/semi-ui.min.js.map +1 -1
  23. package/divider/index.tsx +8 -4
  24. package/dropdown/index.tsx +1 -1
  25. package/empty/index.tsx +13 -5
  26. package/form/_story/FormSubmit/index.tsx +45 -0
  27. package/form/_story/form.stories.js +2 -1
  28. package/form/hoc/withField.tsx +1 -1
  29. package/form/label.tsx +1 -1
  30. package/grid/col.tsx +1 -1
  31. package/grid/row.tsx +1 -1
  32. package/iconButton/index.tsx +2 -1
  33. package/input/index.tsx +38 -11
  34. package/lib/cjs/avatar/index.js +4 -2
  35. package/lib/cjs/backtop/index.js +2 -1
  36. package/lib/cjs/badge/index.js +2 -1
  37. package/lib/cjs/banner/index.js +9 -4
  38. package/lib/cjs/breadcrumb/index.js +4 -3
  39. package/lib/cjs/button/Button.js +13 -3
  40. package/lib/cjs/card/index.js +10 -5
  41. package/lib/cjs/carousel/CarouselArrow.js +6 -2
  42. package/lib/cjs/carousel/index.js +2 -1
  43. package/lib/cjs/cascader/index.js +9 -6
  44. package/lib/cjs/cascader/item.js +2 -1
  45. package/lib/cjs/checkbox/checkbox.js +8 -4
  46. package/lib/cjs/collapsible/index.js +2 -1
  47. package/lib/cjs/datePicker/dateInput.d.ts +1 -1
  48. package/lib/cjs/datePicker/dateInput.js +2 -1
  49. package/lib/cjs/datePicker/datePicker.d.ts +1 -1
  50. package/lib/cjs/datePicker/datePicker.js +4 -2
  51. package/lib/cjs/datePicker/monthsGrid.d.ts +2 -2
  52. package/lib/cjs/divider/index.js +2 -1
  53. package/lib/cjs/dropdown/index.js +2 -1
  54. package/lib/cjs/empty/index.js +8 -4
  55. package/lib/cjs/form/baseForm.d.ts +1 -1
  56. package/lib/cjs/form/field.d.ts +1 -1
  57. package/lib/cjs/form/hoc/withField.js +2 -1
  58. package/lib/cjs/form/label.js +2 -1
  59. package/lib/cjs/grid/col.js +2 -1
  60. package/lib/cjs/grid/row.js +2 -1
  61. package/lib/cjs/iconButton/index.js +3 -1
  62. package/lib/cjs/input/index.js +9 -5
  63. package/lib/cjs/list/index.js +6 -3
  64. package/lib/cjs/modal/ConfirmModal.js +2 -1
  65. package/lib/cjs/modal/Modal.js +6 -2
  66. package/lib/cjs/modal/ModalContent.js +13 -6
  67. package/lib/cjs/navigation/Item.d.ts +1 -1
  68. package/lib/cjs/notification/notice.js +6 -3
  69. package/lib/cjs/pagination/index.js +4 -2
  70. package/lib/cjs/popconfirm/index.js +6 -3
  71. package/lib/cjs/radio/radio.d.ts +1 -1
  72. package/lib/cjs/radio/radio.js +4 -2
  73. package/lib/cjs/radio/radioGroup.d.ts +1 -1
  74. package/lib/cjs/rating/item.js +2 -1
  75. package/lib/cjs/scrollList/index.js +6 -3
  76. package/lib/cjs/select/index.js +9 -5
  77. package/lib/cjs/select/option.js +2 -1
  78. package/lib/cjs/sideSheet/SideSheetContent.js +6 -3
  79. package/lib/cjs/skeleton/index.js +3 -1
  80. package/lib/cjs/slider/index.js +9 -5
  81. package/lib/cjs/space/index.js +2 -1
  82. package/lib/cjs/spin/index.js +7 -3
  83. package/lib/cjs/switch/index.js +6 -4
  84. package/lib/cjs/table/Table.d.ts +1 -1
  85. package/lib/cjs/table/Table.js +6 -3
  86. package/lib/cjs/tabs/TabBar.d.ts +1 -0
  87. package/lib/cjs/tabs/TabBar.js +10 -2
  88. package/lib/cjs/tabs/TabPane.js +7 -3
  89. package/lib/cjs/tabs/index.js +2 -1
  90. package/lib/cjs/tabs/interface.d.ts +1 -0
  91. package/lib/cjs/tag/index.d.ts +2 -0
  92. package/lib/cjs/tag/index.js +60 -11
  93. package/lib/cjs/tag/interface.d.ts +1 -0
  94. package/lib/cjs/tagInput/index.js +7 -4
  95. package/lib/cjs/timePicker/Combobox.js +3 -1
  96. package/lib/cjs/toast/toast.js +6 -3
  97. package/lib/cjs/transfer/index.js +2 -1
  98. package/lib/cjs/tree/treeNode.js +2 -1
  99. package/lib/cjs/treeSelect/index.js +9 -6
  100. package/lib/cjs/typography/base.js +2 -1
  101. package/lib/cjs/typography/title.d.ts +1 -1
  102. package/lib/cjs/upload/index.d.ts +1 -1
  103. package/lib/cjs/upload/index.js +13 -6
  104. package/lib/es/avatar/index.js +4 -2
  105. package/lib/es/backtop/index.js +2 -1
  106. package/lib/es/badge/index.js +2 -1
  107. package/lib/es/banner/index.js +9 -4
  108. package/lib/es/breadcrumb/index.js +4 -3
  109. package/lib/es/button/Button.js +11 -3
  110. package/lib/es/card/index.js +10 -5
  111. package/lib/es/carousel/CarouselArrow.js +6 -2
  112. package/lib/es/carousel/index.js +2 -1
  113. package/lib/es/cascader/index.js +9 -6
  114. package/lib/es/cascader/item.js +2 -1
  115. package/lib/es/checkbox/checkbox.js +8 -4
  116. package/lib/es/collapsible/index.js +2 -1
  117. package/lib/es/datePicker/dateInput.d.ts +1 -1
  118. package/lib/es/datePicker/dateInput.js +2 -1
  119. package/lib/es/datePicker/datePicker.d.ts +1 -1
  120. package/lib/es/datePicker/datePicker.js +4 -2
  121. package/lib/es/datePicker/monthsGrid.d.ts +2 -2
  122. package/lib/es/divider/index.js +2 -1
  123. package/lib/es/dropdown/index.js +2 -1
  124. package/lib/es/empty/index.js +8 -4
  125. package/lib/es/form/baseForm.d.ts +1 -1
  126. package/lib/es/form/field.d.ts +1 -1
  127. package/lib/es/form/hoc/withField.js +2 -1
  128. package/lib/es/form/label.js +2 -1
  129. package/lib/es/grid/col.js +2 -1
  130. package/lib/es/grid/row.js +2 -1
  131. package/lib/es/iconButton/index.js +3 -1
  132. package/lib/es/input/index.js +9 -5
  133. package/lib/es/list/index.js +6 -3
  134. package/lib/es/modal/ConfirmModal.js +2 -1
  135. package/lib/es/modal/Modal.js +6 -2
  136. package/lib/es/modal/ModalContent.js +13 -6
  137. package/lib/es/navigation/Item.d.ts +1 -1
  138. package/lib/es/notification/notice.js +6 -3
  139. package/lib/es/pagination/index.js +4 -2
  140. package/lib/es/popconfirm/index.js +6 -3
  141. package/lib/es/radio/radio.d.ts +1 -1
  142. package/lib/es/radio/radio.js +4 -2
  143. package/lib/es/radio/radioGroup.d.ts +1 -1
  144. package/lib/es/rating/item.js +2 -1
  145. package/lib/es/scrollList/index.js +6 -3
  146. package/lib/es/select/index.js +9 -5
  147. package/lib/es/select/option.js +2 -1
  148. package/lib/es/sideSheet/SideSheetContent.js +6 -3
  149. package/lib/es/skeleton/index.js +3 -1
  150. package/lib/es/slider/index.js +9 -5
  151. package/lib/es/space/index.js +2 -1
  152. package/lib/es/spin/index.js +7 -3
  153. package/lib/es/switch/index.js +6 -4
  154. package/lib/es/table/Table.d.ts +1 -1
  155. package/lib/es/table/Table.js +6 -3
  156. package/lib/es/tabs/TabBar.d.ts +1 -0
  157. package/lib/es/tabs/TabBar.js +10 -2
  158. package/lib/es/tabs/TabPane.js +7 -3
  159. package/lib/es/tabs/index.js +2 -1
  160. package/lib/es/tabs/interface.d.ts +1 -0
  161. package/lib/es/tag/index.d.ts +2 -0
  162. package/lib/es/tag/index.js +56 -9
  163. package/lib/es/tag/interface.d.ts +1 -0
  164. package/lib/es/tagInput/index.js +7 -4
  165. package/lib/es/timePicker/Combobox.js +3 -1
  166. package/lib/es/toast/toast.js +6 -3
  167. package/lib/es/transfer/index.js +2 -1
  168. package/lib/es/tree/treeNode.js +2 -1
  169. package/lib/es/treeSelect/index.js +8 -5
  170. package/lib/es/typography/base.js +2 -1
  171. package/lib/es/typography/title.d.ts +1 -1
  172. package/lib/es/upload/index.d.ts +1 -1
  173. package/lib/es/upload/index.js +13 -6
  174. package/list/index.tsx +16 -4
  175. package/modal/ConfirmModal.tsx +1 -1
  176. package/modal/Modal.tsx +2 -0
  177. package/modal/ModalContent.tsx +33 -21
  178. package/navigation/Item.tsx +1 -1
  179. package/notification/notice.tsx +16 -4
  180. package/package.json +9 -9
  181. package/pagination/index.tsx +16 -2
  182. package/popconfirm/index.tsx +11 -3
  183. package/radio/radio.tsx +10 -2
  184. package/rating/item.tsx +1 -1
  185. package/scrollList/index.tsx +19 -3
  186. package/select/index.tsx +13 -6
  187. package/select/option.tsx +5 -1
  188. package/sideSheet/SideSheetContent.tsx +3 -3
  189. package/skeleton/index.tsx +1 -1
  190. package/slider/index.tsx +5 -3
  191. package/space/index.tsx +1 -1
  192. package/spin/index.tsx +15 -9
  193. package/switch/index.tsx +9 -14
  194. package/table/Table.tsx +5 -3
  195. package/table/_story/v2/index.js +2 -1
  196. package/table/_story/v2/radioRowSelection.tsx +107 -0
  197. package/tabs/TabBar.tsx +8 -1
  198. package/tabs/TabPane.tsx +10 -4
  199. package/tabs/index.tsx +2 -1
  200. package/tabs/interface.ts +1 -0
  201. package/tag/index.tsx +32 -2
  202. package/tag/interface.ts +1 -0
  203. package/tagInput/index.tsx +3 -2
  204. package/timePicker/Combobox.tsx +6 -1
  205. package/toast/toast.tsx +3 -3
  206. package/transfer/index.tsx +1 -0
  207. package/tree/treeNode.tsx +1 -1
  208. package/treeSelect/index.tsx +16 -4
  209. package/typography/base.tsx +1 -1
  210. package/upload/index.tsx +107 -38
@@ -122,7 +122,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
122
122
  PropTypes.shape({
123
123
  value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
124
124
  label: PropTypes.any,
125
- }),
125
+ })
126
126
  ),
127
127
  treeNodeFilterProp: PropTypes.string,
128
128
  suffix: PropTypes.node,
@@ -199,7 +199,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
199
199
  onDropdownVisibleChange: noop,
200
200
  onListScroll: noop,
201
201
  enableLeafClick: false,
202
- 'aria-label': 'Cascader'
202
+ 'aria-label': 'Cascader',
203
203
  };
204
204
 
205
205
  options: any;
@@ -247,7 +247,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
247
247
  /* Keys of loading item */
248
248
  loadingKeys: new Set(),
249
249
  /* Mark whether this rendering has triggered asynchronous loading of data */
250
- loading: false
250
+ loading: false,
251
251
  };
252
252
  this.options = {};
253
253
  this.isEmpty = false;
@@ -274,10 +274,9 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
274
274
  }
275
275
  },
276
276
  };
277
- const cascaderAdapter: Pick<CascaderAdapter,
278
- 'registerClickOutsideHandler'
279
- | 'unregisterClickOutsideHandler'
280
- | 'rePositionDropdown'
277
+ const cascaderAdapter: Pick<
278
+ CascaderAdapter,
279
+ 'registerClickOutsideHandler' | 'unregisterClickOutsideHandler' | 'rePositionDropdown'
281
280
  > = {
282
281
  registerClickOutsideHandler: cb => {
283
282
  const clickOutsideHandler = (e: Event) => {
@@ -368,17 +367,10 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
368
367
  }
369
368
 
370
369
  static getDerivedStateFromProps(props: CascaderProps, prevState: CascaderState) {
371
- const {
372
- multiple,
373
- value,
374
- defaultValue,
375
- onChangeWithObject,
376
- leafOnly,
377
- autoMergeValue,
378
- } = props;
370
+ const { multiple, value, defaultValue, onChangeWithObject, leafOnly, autoMergeValue } = props;
379
371
  const { prevProps } = prevState;
380
372
  let keyEntities = prevState.keyEntities || {};
381
- const newState: Partial<CascaderState> = { };
373
+ const newState: Partial<CascaderState> = {};
382
374
  const needUpdate = (name: string) => {
383
375
  const firstInProps = isEmpty(prevProps) && name in props;
384
376
  const nameHasChange = prevProps && !isEqual(prevProps[name], props[name]);
@@ -408,18 +400,18 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
408
400
  const realValue = needUpdate('value') ? value : defaultValue;
409
401
  // eslint-disable-next-line max-depth
410
402
  if (Array.isArray(realValue)) {
411
- normallizedValue = Array.isArray(realValue[0]) ?
412
- realValue as SimpleValueType[][] :
413
- [realValue] as SimpleValueType[][];
403
+ normallizedValue = Array.isArray(realValue[0])
404
+ ? (realValue as SimpleValueType[][])
405
+ : ([realValue] as SimpleValueType[][]);
414
406
  } else {
415
407
  normallizedValue = [[realValue]];
416
408
  }
417
409
  // formatValuePath is used to save value of valuePath
418
410
  const formatValuePath: (string | number)[][] = [];
419
411
  normallizedValue.forEach((valueItem: SimpleValueType[]) => {
420
- const formatItem: (string | number)[] = onChangeWithObject ?
421
- (valueItem as CascaderData[]).map(i => i.value) :
422
- valueItem as (string | number)[];
412
+ const formatItem: (string | number)[] = onChangeWithObject
413
+ ? (valueItem as CascaderData[]).map(i => i.value)
414
+ : (valueItem as (string | number)[]);
423
415
  formatValuePath.push(formatItem);
424
416
  });
425
417
  // formatKeys is used to save key of value
@@ -480,12 +472,9 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
480
472
  renderTagItem = (value: string | Array<string>, idx: number, type: string) => {
481
473
  const { keyEntities, disabledKeys } = this.state;
482
474
  const { size, disabled, displayProp, displayRender, disableStrictly } = this.props;
483
- const nodeKey = type === strings.IS_VALUE ?
484
- findKeysForValues(value, keyEntities)[0] :
485
- value;
486
- const isDsiabled = disabled ||
487
- keyEntities[nodeKey].data.disabled ||
488
- (disableStrictly && disabledKeys.has(nodeKey));
475
+ const nodeKey = type === strings.IS_VALUE ? findKeysForValues(value, keyEntities)[0] : value;
476
+ const isDsiabled =
477
+ disabled || keyEntities[nodeKey].data.disabled || (disableStrictly && disabledKeys.has(nodeKey));
489
478
  if (!isEmpty(keyEntities) && !isEmpty(keyEntities[nodeKey])) {
490
479
  const tagCls = cls(`${prefixcls}-selection-tag`, {
491
480
  [`${prefixcls}-selection-tag-disabled`]: isDsiabled,
@@ -493,7 +482,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
493
482
  // custom render tags
494
483
  if (isFunction(displayRender)) {
495
484
  return displayRender(keyEntities[nodeKey], idx);
496
- // default render tags
485
+ // default render tags
497
486
  } else {
498
487
  return (
499
488
  <Tag
@@ -517,25 +506,11 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
517
506
  };
518
507
 
519
508
  renderTagInput() {
520
- const {
521
- size,
522
- disabled,
523
- placeholder,
524
- maxTagCount,
525
- showRestTagsPopover,
526
- restTagsPopoverProps,
527
- } = this.props;
528
- const {
529
- inputValue,
530
- checkedKeys,
531
- keyEntities,
532
- resolvedCheckedKeys
533
- } = this.state;
509
+ const { size, disabled, placeholder, maxTagCount, showRestTagsPopover, restTagsPopoverProps } = this.props;
510
+ const { inputValue, checkedKeys, keyEntities, resolvedCheckedKeys } = this.state;
534
511
  const tagInputcls = cls(`${prefixcls}-tagInput-wrapper`);
535
512
  const tagValue: Array<Array<string>> = [];
536
- const realKeys = this.mergeType === strings.NONE_MERGE_TYPE
537
- ? checkedKeys
538
- : resolvedCheckedKeys;
513
+ const realKeys = this.mergeType === strings.NONE_MERGE_TYPE ? checkedKeys : resolvedCheckedKeys;
539
514
  [...realKeys].forEach(checkedKey => {
540
515
  if (!isEmpty(keyEntities[checkedKey])) {
541
516
  tagValue.push(keyEntities[checkedKey].valuePath);
@@ -548,7 +523,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
548
523
  disabled={disabled}
549
524
  size={size}
550
525
  // TODO Modify logic, not modify type
551
- value={tagValue as unknown as string[]}
526
+ value={(tagValue as unknown) as string[]}
552
527
  showRestTagsPopover={showRestTagsPopover}
553
528
  restTagsPopoverProps={restTagsPopoverProps}
554
529
  maxTagCount={maxTagCount}
@@ -556,7 +531,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
556
531
  inputValue={inputValue}
557
532
  onInputChange={this.handleInputChange}
558
533
  // TODO Modify logic, not modify type
559
- onRemove={v => this.handleTagRemove(null, v as unknown as (string | number)[])}
534
+ onRemove={v => this.handleTagRemove(null, (v as unknown) as (string | number)[])}
560
535
  placeholder={placeholder}
561
536
  />
562
537
  );
@@ -578,11 +553,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
578
553
  });
579
554
  return (
580
555
  <div className={wrappercls}>
581
- <Input
582
- ref={this.inputRef as any}
583
- size={size}
584
- {...inputProps}
585
- />
556
+ <Input ref={this.inputRef as any} size={size} {...inputProps} />
586
557
  </div>
587
558
  );
588
559
  }
@@ -612,7 +583,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
612
583
  checkedKeys,
613
584
  halfCheckedKeys,
614
585
  loadedKeys,
615
- loadingKeys
586
+ loadingKeys,
616
587
  } = this.state;
617
588
  const {
618
589
  filterTreeNode,
@@ -624,7 +595,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
624
595
  topSlot,
625
596
  bottomSlot,
626
597
  showNext,
627
- multiple
598
+ multiple,
628
599
  } = this.props;
629
600
  const searchable = Boolean(filterTreeNode) && isSearching;
630
601
  const popoverCls = cls(dropdownClassName, `${prefixcls}-popover`);
@@ -661,37 +632,29 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
661
632
  renderPlusN = (hiddenTag: Array<ReactNode>) => {
662
633
  const { disabled, showRestTagsPopover, restTagsPopoverProps } = this.props;
663
634
  const plusNCls = cls(`${prefixcls}-selection-n`, {
664
- [`${prefixcls}-selection-n-disabled`]: disabled
635
+ [`${prefixcls}-selection-n-disabled`]: disabled,
665
636
  });
666
- const renderPlusNChildren = (
667
- <span className={plusNCls}>
668
- +{hiddenTag.length}
669
- </span>
670
- );
671
- return (
672
- showRestTagsPopover && !disabled ?
673
- (
674
- <Popover
675
- content={hiddenTag}
676
- showArrow
677
- trigger="hover"
678
- position="top"
679
- autoAdjustOverflow
680
- {...restTagsPopoverProps}
681
- >
682
- {renderPlusNChildren}
683
- </Popover>
684
- ) :
685
- renderPlusNChildren
637
+ const renderPlusNChildren = <span className={plusNCls}>+{hiddenTag.length}</span>;
638
+ return showRestTagsPopover && !disabled ? (
639
+ <Popover
640
+ content={hiddenTag}
641
+ showArrow
642
+ trigger="hover"
643
+ position="top"
644
+ autoAdjustOverflow
645
+ {...restTagsPopoverProps}
646
+ >
647
+ {renderPlusNChildren}
648
+ </Popover>
649
+ ) : (
650
+ renderPlusNChildren
686
651
  );
687
652
  };
688
653
 
689
654
  renderMultipleTags = () => {
690
655
  const { autoMergeValue, maxTagCount } = this.props;
691
656
  const { checkedKeys, resolvedCheckedKeys } = this.state;
692
- const realKeys = this.mergeType === strings.NONE_MERGE_TYPE
693
- ? checkedKeys
694
- : resolvedCheckedKeys;
657
+ const realKeys = this.mergeType === strings.NONE_MERGE_TYPE ? checkedKeys : resolvedCheckedKeys;
695
658
  const displayTag: Array<ReactNode> = [];
696
659
  const hiddenTag: Array<ReactNode> = [];
697
660
  [...realKeys].forEach((checkedKey, idx) => {
@@ -720,19 +683,22 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
720
683
  if (displayRender && typeof displayRender === 'function') {
721
684
  displayText = displayRender(displayPath);
722
685
  } else {
723
- displayText = displayPath.map((path: ReactNode, index: number)=>(
686
+ displayText = displayPath.map((path: ReactNode, index: number) => (
724
687
  <Fragment key={`${path}-${index}`}>
725
- {
726
- index<displayPath.length-1
727
- ? <>{path}{separator}</>
728
- : path
729
- }
688
+ {index < displayPath.length - 1 ? (
689
+ <>
690
+ {path}
691
+ {separator}
692
+ </>
693
+ ) : (
694
+ path
695
+ )}
730
696
  </Fragment>
731
697
  ));
732
698
  }
733
699
  }
734
700
  return displayText;
735
- }
701
+ };
736
702
 
737
703
  renderSelectContent = () => {
738
704
  const { placeholder, filterTreeNode, multiple } = this.props;
@@ -763,7 +729,11 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
763
729
  [`${prefixcls}-suffix-text`]: suffix && isString(suffix),
764
730
  [`${prefixcls}-suffix-icon`]: isSemiIcon(suffix),
765
731
  });
766
- return <div className={suffixWrapperCls}>{suffix}</div>;
732
+ return (
733
+ <div className={suffixWrapperCls} x-semi-prop="suffix">
734
+ {suffix}
735
+ </div>
736
+ );
767
737
  };
768
738
 
769
739
  renderPrefix = () => {
@@ -778,7 +748,11 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
778
748
  [`${prefixcls}-prefix-icon`]: isSemiIcon(labelNode),
779
749
  });
780
750
 
781
- return <div className={prefixWrapperCls} id={insetLabelId}>{labelNode}</div>;
751
+ return (
752
+ <div className={prefixWrapperCls} id={insetLabelId} x-semi-prop="prefix,insetLabel">
753
+ {labelNode}
754
+ </div>
755
+ );
782
756
  };
783
757
 
784
758
  renderCustomTrigger = () => {
@@ -847,7 +821,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
847
821
  className={clearCls}
848
822
  onClick={this.handleClear}
849
823
  onKeyPress={this.handleClearEnterPress}
850
- role='button'
824
+ role="button"
851
825
  tabIndex={0}
852
826
  >
853
827
  <IconClear />
@@ -863,7 +837,11 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
863
837
  if (showClearBtn) {
864
838
  return null;
865
839
  }
866
- return arrowIcon ? <div className={cls(`${prefixcls}-arrow`)}>{arrowIcon}</div> : null;
840
+ return arrowIcon ? (
841
+ <div className={cls(`${prefixcls}-arrow`)} x-semi-prop="arrowIcon">
842
+ {arrowIcon}
843
+ </div>
844
+ ) : null;
867
845
  };
868
846
 
869
847
  renderSelection = () => {
@@ -885,40 +863,40 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
885
863
  const { isOpen, isFocus, isInput, checkedKeys } = this.state;
886
864
  const filterable = Boolean(filterTreeNode);
887
865
  const useCustomTrigger = typeof triggerRender === 'function';
888
- const classNames = useCustomTrigger ?
889
- cls(className) :
890
- cls(prefixcls, className, {
891
- [`${prefixcls}-focus`]: isFocus || (isOpen && !isInput),
892
- [`${prefixcls}-disabled`]: disabled,
893
- [`${prefixcls}-single`]: true,
894
- [`${prefixcls}-filterable`]: filterable,
895
- [`${prefixcls}-error`]: validateStatus === 'error',
896
- [`${prefixcls}-warning`]: validateStatus === 'warning',
897
- [`${prefixcls}-small`]: size === 'small',
898
- [`${prefixcls}-large`]: size === 'large',
899
- [`${prefixcls}-with-prefix`]: prefix || insetLabel,
900
- [`${prefixcls}-with-suffix`]: suffix,
901
- });
902
- const mouseEvent = showClear ?
903
- {
904
- onMouseEnter: () => this.handleMouseOver(),
905
- onMouseLeave: () => this.handleMouseLeave(),
906
- } :
907
- {};
866
+ const classNames = useCustomTrigger
867
+ ? cls(className)
868
+ : cls(prefixcls, className, {
869
+ [`${prefixcls}-focus`]: isFocus || (isOpen && !isInput),
870
+ [`${prefixcls}-disabled`]: disabled,
871
+ [`${prefixcls}-single`]: true,
872
+ [`${prefixcls}-filterable`]: filterable,
873
+ [`${prefixcls}-error`]: validateStatus === 'error',
874
+ [`${prefixcls}-warning`]: validateStatus === 'warning',
875
+ [`${prefixcls}-small`]: size === 'small',
876
+ [`${prefixcls}-large`]: size === 'large',
877
+ [`${prefixcls}-with-prefix`]: prefix || insetLabel,
878
+ [`${prefixcls}-with-suffix`]: suffix,
879
+ });
880
+ const mouseEvent = showClear
881
+ ? {
882
+ onMouseEnter: () => this.handleMouseOver(),
883
+ onMouseLeave: () => this.handleMouseLeave(),
884
+ }
885
+ : {};
908
886
  const sectionCls = cls(`${prefixcls}-selection`, {
909
887
  [`${prefixcls}-selection-multiple`]: multiple && !isEmpty(checkedKeys),
910
888
  });
911
- const inner = useCustomTrigger ?
912
- this.renderCustomTrigger() :
913
- [
914
- <Fragment key={'prefix'}>{prefix || insetLabel ? this.renderPrefix() : null}</Fragment>,
915
- <Fragment key={'selection'}>
916
- <div className={sectionCls}>{this.renderSelectContent()}</div>
917
- </Fragment>,
918
- <Fragment key={'clearbtn'}>{this.renderClearBtn()}</Fragment>,
919
- <Fragment key={'suffix'}>{suffix ? this.renderSuffix() : null}</Fragment>,
920
- <Fragment key={'arrow'}>{this.renderArrow()}</Fragment>,
921
- ];
889
+ const inner = useCustomTrigger
890
+ ? this.renderCustomTrigger()
891
+ : [
892
+ <Fragment key={'prefix'}>{prefix || insetLabel ? this.renderPrefix() : null}</Fragment>,
893
+ <Fragment key={'selection'}>
894
+ <div className={sectionCls}>{this.renderSelectContent()}</div>
895
+ </Fragment>,
896
+ <Fragment key={'clearbtn'}>{this.renderClearBtn()}</Fragment>,
897
+ <Fragment key={'suffix'}>{suffix ? this.renderSuffix() : null}</Fragment>,
898
+ <Fragment key={'arrow'}>{this.renderArrow()}</Fragment>,
899
+ ];
922
900
  /**
923
901
  * Reasons for disabling the a11y eslint rule:
924
902
  * The following attributes(aria-controls,aria-expanded) will be automatically added by Tooltip, no need to declare here
@@ -934,12 +912,12 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
934
912
  aria-errormessage={this.props['aria-errormessage']}
935
913
  aria-label={this.props['aria-label']}
936
914
  aria-labelledby={this.props['aria-labelledby']}
937
- aria-describedby={this.props["aria-describedby"]}
915
+ aria-describedby={this.props['aria-describedby']}
938
916
  aria-required={this.props['aria-required']}
939
917
  id={id}
940
918
  {...mouseEvent}
941
919
  // eslint-disable-next-line jsx-a11y/role-has-required-aria-props
942
- role='combobox'
920
+ role="combobox"
943
921
  tabIndex={0}
944
922
  >
945
923
  {inner}
package/cascader/item.tsx CHANGED
@@ -291,7 +291,7 @@ export default class Item extends PureComponent<CascaderItemProps> {
291
291
  <LocaleConsumer componentName="Cascader">
292
292
  {(locale: Locale['Cascader']) => (
293
293
  <ul className={`${prefixcls} ${prefixcls}-empty`} key={'empty-list'}>
294
- <span className={`${prefixcls}-label`}>
294
+ <span className={`${prefixcls}-label`} x-semi-prop="emptyContent">
295
295
  {emptyContent || locale.emptyText}
296
296
  </span>
297
297
  </ul>
@@ -203,10 +203,21 @@ class Checkbox extends BaseComponent<CheckboxProps, CheckboxState> {
203
203
  [`${prefix}-cardType_extra_noChildren`]: props.isCardType && !children,
204
204
  });
205
205
 
206
+ const name = inGroup && this.context.checkboxGroup.name;
207
+ const xSemiPropChildren = this.props['x-semi-children-alias'] || 'children';
208
+
206
209
  const renderContent = () => (
207
210
  <>
208
- {children ? <span id={addonId} className={`${prefix}-addon`}>{children}</span> : null}
209
- {extra ? <div id={extraId} className={extraCls}>{extra}</div> : null}
211
+ {children ? (
212
+ <span id={this.addonId} className={`${prefix}-addon`} x-semi-prop={xSemiPropChildren}>
213
+ {children}
214
+ </span>
215
+ ) : null}
216
+ {extra ? (
217
+ <div id={this.extraId} className={extraCls} x-semi-prop="extra">
218
+ {extra}
219
+ </div>
220
+ ) : null}
210
221
  </>
211
222
  );
212
223
  return (
@@ -92,7 +92,14 @@ const Collapsible = (props: CollapsibleProps) => {
92
92
  const wrapperCls = cls(`${cssClasses.PREFIX}-wrapper`, className);
93
93
  return (
94
94
  <div style={wrapperstyle} className={wrapperCls} ref={ref}>
95
- <div ref={setHeight} style={{ overflow: 'hidden' }} id={id}>{children}</div>
95
+ <div
96
+ ref={setHeight}
97
+ style={{ overflow: 'hidden' }}
98
+ id={id}
99
+ x-semi-prop="children"
100
+ >
101
+ {children}
102
+ </div>
96
103
  </div>
97
104
  );
98
105
  };
@@ -172,6 +172,7 @@ export default class DateInput extends BaseComponent<DateInputProps, {}> {
172
172
  <div
173
173
  className={`${prefixCls}-range-input-prefix`}
174
174
  onClick={e => !disabled && !rangeInputFocus && this.handleRangeStartFocus(e)}
175
+ x-semi-prop="prefix,insetLabel"
175
176
  >
176
177
  {labelNode}
177
178
  </div>
@@ -653,13 +653,21 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
653
653
 
654
654
  return (
655
655
  <div ref={this.panelRef} className={wrapCls} style={dropdownStyle}>
656
- {topSlot && <div className={`${cssClasses.PREFIX}-topSlot`}>{topSlot}</div>}
656
+ {topSlot && (
657
+ <div className={`${cssClasses.PREFIX}-topSlot`} x-semi-prop="topSlot">
658
+ {topSlot}
659
+ </div>
660
+ )}
657
661
  {insetInput && <DateInput {...insetInputProps} insetInput={true} />}
658
- {this.adapter.typeIsYearOrMonth() ?
659
- this.renderYearMonthPanel(locale, localeCode) :
660
- this.renderMonthGrid(locale, localeCode, dateFnsLocale)}
662
+ {this.adapter.typeIsYearOrMonth()
663
+ ? this.renderYearMonthPanel(locale, localeCode)
664
+ : this.renderMonthGrid(locale, localeCode, dateFnsLocale)}
661
665
  {this.renderQuickControls()}
662
- {bottomSlot && <div className={`${cssClasses.PREFIX}-bottomSlot`}>{bottomSlot}</div>}
666
+ {bottomSlot && (
667
+ <div className={`${cssClasses.PREFIX}-bottomSlot`} x-semi-prop="bottomSlot">
668
+ {bottomSlot}
669
+ </div>
670
+ )}
663
671
  {this.renderFooter(locale, localeCode)}
664
672
  </div>
665
673
  );
package/dist/css/semi.css CHANGED
@@ -17270,6 +17270,10 @@ body[theme-mode=dark], body .semi-always-dark {
17270
17270
  width: 0;
17271
17271
  height: 0;
17272
17272
  }
17273
+ .semi-tabs-bar-collapse .semi-overflow-list .semi-overflow-list-scroll-wrapper:focus-visible {
17274
+ outline: 2px solid var(--semi-color-primary-light-active);
17275
+ outline-offset: -2px;
17276
+ }
17273
17277
  .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start {
17274
17278
  margin-right: 4px;
17275
17279
  }
@@ -17299,6 +17303,10 @@ body[theme-mode=dark], body .semi-always-dark {
17299
17303
  .semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:hover {
17300
17304
  border-bottom: 2px solid var(--semi-color-fill-0);
17301
17305
  }
17306
+ .semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:focus-visible {
17307
+ outline: 2px solid var(--semi-color-primary-light-active);
17308
+ outline-offset: -1px;
17309
+ }
17302
17310
  .semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:active {
17303
17311
  border-bottom: 2px solid var(--semi-color-fill-1);
17304
17312
  }
@@ -17325,6 +17333,10 @@ body[theme-mode=dark], body .semi-always-dark {
17325
17333
  border-left: 2px solid var(--semi-color-fill-0);
17326
17334
  background-color: var(--semi-color-fill-0);
17327
17335
  }
17336
+ .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:focus-visible {
17337
+ outline: 2px solid var(--semi-color-primary-light-active);
17338
+ outline-offset: -2px;
17339
+ }
17328
17340
  .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:active {
17329
17341
  border-left: 2px solid var(--semi-color-fill-1);
17330
17342
  background-color: var(--semi-color-fill-1);
@@ -17410,6 +17422,10 @@ body[theme-mode=dark], body .semi-always-dark {
17410
17422
  .semi-tabs-bar-card .semi-tabs-tab:hover {
17411
17423
  background: var(--semi-color-fill-0);
17412
17424
  }
17425
+ .semi-tabs-bar-card .semi-tabs-tab:focus-visible {
17426
+ outline: 2px solid var(--semi-color-primary-light-active);
17427
+ outline-offset: -2px;
17428
+ }
17413
17429
  .semi-tabs-bar-card .semi-tabs-tab:active {
17414
17430
  background: var(--semi-color-fill-1);
17415
17431
  }
@@ -17432,6 +17448,10 @@ body[theme-mode=dark], body .semi-always-dark {
17432
17448
  border: none;
17433
17449
  background-color: var(--semi-color-fill-0);
17434
17450
  }
17451
+ .semi-tabs-bar-button .semi-tabs-tab:focus-visible {
17452
+ outline: 2px solid var(--semi-color-primary-light-active);
17453
+ outline-offset: -2px;
17454
+ }
17435
17455
  .semi-tabs-bar-button .semi-tabs-tab:active {
17436
17456
  background-color: var(--semi-color-fill-1);
17437
17457
  }
@@ -17452,6 +17472,9 @@ body[theme-mode=dark], body .semi-always-dark {
17452
17472
  width: 100%;
17453
17473
  overflow: hidden;
17454
17474
  }
17475
+ .semi-tabs-pane:focus-visible {
17476
+ outline: 2px solid var(--semi-color-primary-light-active);
17477
+ }
17455
17478
  .semi-tabs-pane-inactive, .semi-tabs-content-no-animated .semi-tabs-pane-inactive {
17456
17479
  display: none;
17457
17480
  }
@@ -17564,6 +17587,9 @@ body[theme-mode=dark], body .semi-always-dark {
17564
17587
  height: 20px;
17565
17588
  padding: 2px 8px;
17566
17589
  }
17590
+ .semi-tag-default:focus-visible, .semi-tag-small:focus-visible {
17591
+ outline: 2px solid var(--semi-color-primary-light-active);
17592
+ }
17567
17593
  .semi-tag-large {
17568
17594
  font-size: 12px;
17569
17595
  line-height: 16px;
@@ -17571,6 +17597,9 @@ body[theme-mode=dark], body .semi-always-dark {
17571
17597
  padding: 4px 8px;
17572
17598
  height: 24px;
17573
17599
  }
17600
+ .semi-tag-large:focus-visible {
17601
+ outline: 2px solid var(--semi-color-primary-light-active);
17602
+ }
17574
17603
  .semi-tag-invisible {
17575
17604
  display: none;
17576
17605
  }
@@ -17937,6 +17966,10 @@ body[theme-mode=dark], body .semi-always-dark {
17937
17966
  color: var(--semi-color-text-0);
17938
17967
  }
17939
17968
 
17969
+ .semi-tag-solid .semi-tag-close {
17970
+ color: var(--semi-color-white);
17971
+ }
17972
+
17940
17973
  .semi-rtl .semi-tag,
17941
17974
  .semi-portal-rtl .semi-tag {
17942
17975
  direction: rtl;