@douyinfe/semi-foundation 2.97.0 → 2.98.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 (171) hide show
  1. package/codeHighlight/codeHighlight.scss +1 -1
  2. package/datePicker/foundation.ts +7 -0
  3. package/datePicker/inputFoundation.ts +5 -0
  4. package/form/foundation.ts +48 -4
  5. package/inputNumber/foundation.ts +119 -3
  6. package/jsonViewer/jsonViewer.scss +2 -2
  7. package/lib/cjs/aiChatInput/aiChatInput.css +7 -7
  8. package/lib/cjs/anchor/anchor.css +3 -3
  9. package/lib/cjs/autoComplete/autoComplete.css +1 -1
  10. package/lib/cjs/avatar/avatar.css +5 -5
  11. package/lib/cjs/badge/badge.css +1 -1
  12. package/lib/cjs/breadcrumb/breadcrumb.css +2 -2
  13. package/lib/cjs/calendar/calendar.css +9 -9
  14. package/lib/cjs/cascader/cascader.css +6 -6
  15. package/lib/cjs/checkbox/checkbox.css +2 -2
  16. package/lib/cjs/codeHighlight/codeHighlight.css +1 -1
  17. package/lib/cjs/codeHighlight/codeHighlight.scss +1 -1
  18. package/lib/cjs/collapse/collapse.css +2 -2
  19. package/lib/cjs/datePicker/datePicker.css +8 -8
  20. package/lib/cjs/datePicker/foundation.d.ts +5 -0
  21. package/lib/cjs/datePicker/foundation.js +2 -0
  22. package/lib/cjs/datePicker/inputFoundation.d.ts +5 -0
  23. package/lib/cjs/descriptions/descriptions.css +6 -6
  24. package/lib/cjs/dropdown/dropdown.css +2 -2
  25. package/lib/cjs/form/form.css +4 -4
  26. package/lib/cjs/form/foundation.js +49 -3
  27. package/lib/cjs/hotKeys/hotKeys.css +2 -2
  28. package/lib/cjs/image/image.css +2 -2
  29. package/lib/cjs/input/input.css +8 -8
  30. package/lib/cjs/input/textarea.css +2 -2
  31. package/lib/cjs/inputNumber/foundation.d.ts +15 -0
  32. package/lib/cjs/inputNumber/foundation.js +113 -3
  33. package/lib/cjs/jsonViewer/jsonViewer.css +2 -2
  34. package/lib/cjs/jsonViewer/jsonViewer.scss +2 -2
  35. package/lib/cjs/list/list.css +1 -1
  36. package/lib/cjs/modal/modal.css +1 -1
  37. package/lib/cjs/navigation/navigation.css +2 -2
  38. package/lib/cjs/notification/notification.css +4 -4
  39. package/lib/cjs/pagination/pagination.css +5 -5
  40. package/lib/cjs/popconfirm/popconfirm.css +1 -1
  41. package/lib/cjs/popover/popover.css +1 -1
  42. package/lib/cjs/radio/radio.css +2 -2
  43. package/lib/cjs/scrollList/itemFoundation.js +12 -0
  44. package/lib/cjs/scrollList/scrollList.css +2 -2
  45. package/lib/cjs/select/select.css +6 -6
  46. package/lib/cjs/sideSheet/sideSheet.css +2 -2
  47. package/lib/cjs/sidebar/sidebar.css +11 -11
  48. package/lib/cjs/slider/foundation.js +46 -12
  49. package/lib/cjs/slider/rtl.scss +62 -0
  50. package/lib/cjs/slider/slider.css +45 -0
  51. package/lib/cjs/slider/slider.scss +2 -0
  52. package/lib/cjs/steps/steps.css +11 -11
  53. package/lib/cjs/table/foundation.d.ts +36 -0
  54. package/lib/cjs/table/foundation.js +162 -28
  55. package/lib/cjs/table/table.css +10 -2
  56. package/lib/cjs/table/table.scss +17 -0
  57. package/lib/cjs/tabs/tabs.css +2 -2
  58. package/lib/cjs/tag/tag.css +2 -2
  59. package/lib/cjs/tagInput/tagInput.css +2 -2
  60. package/lib/cjs/timePicker/timePicker.css +1 -1
  61. package/lib/cjs/timeline/timeline.css +2 -2
  62. package/lib/cjs/toast/toast.css +1 -1
  63. package/lib/cjs/tooltip/foundation.js +8 -5
  64. package/lib/cjs/tooltip/tooltip.css +1 -1
  65. package/lib/cjs/transfer/constants.d.ts +3 -1
  66. package/lib/cjs/transfer/constants.js +3 -1
  67. package/lib/cjs/transfer/foundation.d.ts +3 -0
  68. package/lib/cjs/transfer/foundation.js +4 -0
  69. package/lib/cjs/transfer/transfer.css +14 -5
  70. package/lib/cjs/transfer/transfer.scss +10 -0
  71. package/lib/cjs/tree/foundation.d.ts +3 -0
  72. package/lib/cjs/tree/foundation.js +31 -4
  73. package/lib/cjs/tree/tree.css +1 -1
  74. package/lib/cjs/treeSelect/foundation.d.ts +1 -0
  75. package/lib/cjs/treeSelect/foundation.js +8 -1
  76. package/lib/cjs/treeSelect/treeSelect.css +36 -4
  77. package/lib/cjs/treeSelect/treeSelect.scss +49 -1
  78. package/lib/cjs/typography/typography.css +8 -8
  79. package/lib/cjs/upload/upload.css +8 -8
  80. package/lib/cjs/utils/Store.d.ts +1 -1
  81. package/lib/cjs/utils/Store.js +1 -0
  82. package/lib/es/aiChatInput/aiChatInput.css +7 -7
  83. package/lib/es/anchor/anchor.css +3 -3
  84. package/lib/es/autoComplete/autoComplete.css +1 -1
  85. package/lib/es/avatar/avatar.css +5 -5
  86. package/lib/es/badge/badge.css +1 -1
  87. package/lib/es/breadcrumb/breadcrumb.css +2 -2
  88. package/lib/es/calendar/calendar.css +9 -9
  89. package/lib/es/cascader/cascader.css +6 -6
  90. package/lib/es/checkbox/checkbox.css +2 -2
  91. package/lib/es/codeHighlight/codeHighlight.css +1 -1
  92. package/lib/es/codeHighlight/codeHighlight.scss +1 -1
  93. package/lib/es/collapse/collapse.css +2 -2
  94. package/lib/es/datePicker/datePicker.css +8 -8
  95. package/lib/es/datePicker/foundation.d.ts +5 -0
  96. package/lib/es/datePicker/foundation.js +2 -0
  97. package/lib/es/datePicker/inputFoundation.d.ts +5 -0
  98. package/lib/es/descriptions/descriptions.css +6 -6
  99. package/lib/es/dropdown/dropdown.css +2 -2
  100. package/lib/es/form/form.css +4 -4
  101. package/lib/es/form/foundation.js +49 -3
  102. package/lib/es/hotKeys/hotKeys.css +2 -2
  103. package/lib/es/image/image.css +2 -2
  104. package/lib/es/input/input.css +8 -8
  105. package/lib/es/input/textarea.css +2 -2
  106. package/lib/es/inputNumber/foundation.d.ts +15 -0
  107. package/lib/es/inputNumber/foundation.js +113 -3
  108. package/lib/es/jsonViewer/jsonViewer.css +2 -2
  109. package/lib/es/jsonViewer/jsonViewer.scss +2 -2
  110. package/lib/es/list/list.css +1 -1
  111. package/lib/es/modal/modal.css +1 -1
  112. package/lib/es/navigation/navigation.css +2 -2
  113. package/lib/es/notification/notification.css +4 -4
  114. package/lib/es/pagination/pagination.css +5 -5
  115. package/lib/es/popconfirm/popconfirm.css +1 -1
  116. package/lib/es/popover/popover.css +1 -1
  117. package/lib/es/radio/radio.css +2 -2
  118. package/lib/es/scrollList/itemFoundation.js +12 -0
  119. package/lib/es/scrollList/scrollList.css +2 -2
  120. package/lib/es/select/select.css +6 -6
  121. package/lib/es/sideSheet/sideSheet.css +2 -2
  122. package/lib/es/sidebar/sidebar.css +11 -11
  123. package/lib/es/slider/foundation.js +46 -12
  124. package/lib/es/slider/rtl.scss +62 -0
  125. package/lib/es/slider/slider.css +45 -0
  126. package/lib/es/slider/slider.scss +2 -0
  127. package/lib/es/steps/steps.css +11 -11
  128. package/lib/es/table/foundation.d.ts +36 -0
  129. package/lib/es/table/foundation.js +162 -28
  130. package/lib/es/table/table.css +10 -2
  131. package/lib/es/table/table.scss +17 -0
  132. package/lib/es/tabs/tabs.css +2 -2
  133. package/lib/es/tag/tag.css +2 -2
  134. package/lib/es/tagInput/tagInput.css +2 -2
  135. package/lib/es/timePicker/timePicker.css +1 -1
  136. package/lib/es/timeline/timeline.css +2 -2
  137. package/lib/es/toast/toast.css +1 -1
  138. package/lib/es/tooltip/foundation.js +8 -5
  139. package/lib/es/tooltip/tooltip.css +1 -1
  140. package/lib/es/transfer/constants.d.ts +3 -1
  141. package/lib/es/transfer/constants.js +3 -1
  142. package/lib/es/transfer/foundation.d.ts +3 -0
  143. package/lib/es/transfer/foundation.js +4 -0
  144. package/lib/es/transfer/transfer.css +14 -5
  145. package/lib/es/transfer/transfer.scss +10 -0
  146. package/lib/es/tree/foundation.d.ts +3 -0
  147. package/lib/es/tree/foundation.js +31 -4
  148. package/lib/es/tree/tree.css +1 -1
  149. package/lib/es/treeSelect/foundation.d.ts +1 -0
  150. package/lib/es/treeSelect/foundation.js +8 -1
  151. package/lib/es/treeSelect/treeSelect.css +36 -4
  152. package/lib/es/treeSelect/treeSelect.scss +49 -1
  153. package/lib/es/typography/typography.css +8 -8
  154. package/lib/es/upload/upload.css +8 -8
  155. package/lib/es/utils/Store.d.ts +1 -1
  156. package/lib/es/utils/Store.js +1 -0
  157. package/package.json +19 -4
  158. package/scrollList/itemFoundation.ts +12 -0
  159. package/slider/foundation.ts +55 -15
  160. package/slider/rtl.scss +62 -0
  161. package/slider/slider.scss +2 -0
  162. package/table/foundation.ts +197 -29
  163. package/table/table.scss +17 -0
  164. package/tooltip/foundation.ts +8 -5
  165. package/transfer/constants.ts +3 -1
  166. package/transfer/foundation.ts +8 -1
  167. package/transfer/transfer.scss +10 -0
  168. package/tree/foundation.ts +34 -5
  169. package/treeSelect/foundation.ts +10 -1
  170. package/treeSelect/treeSelect.scss +49 -1
  171. package/utils/Store.ts +2 -1
@@ -1,3 +1,4 @@
1
+ import _throttle from "lodash/throttle";
1
2
  import _get from "lodash/get";
2
3
  import _pick from "lodash/pick";
3
4
  import _difference from "lodash/difference";
@@ -18,6 +19,27 @@ export default class TreeFoundation extends BaseFoundation {
18
19
  dragging: false
19
20
  });
20
21
  };
22
+ // Throttle drag over state updates to improve performance during fast dragging
23
+ // 16ms ≈ 60fps, ensuring smooth updates without excessive re-renders
24
+ this.throttledDragOverUpdate = _throttle(dropPosition => {
25
+ this._adapter.updateState({
26
+ dropPosition
27
+ });
28
+ }, 16);
29
+ }
30
+ destroy() {
31
+ super.destroy();
32
+ // Cancel any pending throttled updates
33
+ if (this.throttledDragOverUpdate) {
34
+ this.throttledDragOverUpdate.cancel();
35
+ }
36
+ // Clear pending delayed drag enter timers to avoid updates after unmount
37
+ if (this.delayedDragEnterLogic) {
38
+ Object.keys(this.delayedDragEnterLogic).forEach(key => {
39
+ clearTimeout(this.delayedDragEnterLogic[key]);
40
+ });
41
+ this.delayedDragEnterLogic = null;
42
+ }
21
43
  }
22
44
  _isMultiple() {
23
45
  return this.getProp('multiple');
@@ -587,30 +609,35 @@ export default class TreeFoundation extends BaseFoundation {
587
609
  if (dragNodesKeys.has(eventKey)) {
588
610
  return;
589
611
  }
590
- // Update the drag position
612
+ // Update the drag position with throttle to improve performance
591
613
  if (dragNode && eventKey === dragOverNodeKey) {
592
614
  const newPos = calcDropRelativePosition(e, treeNode);
593
615
  if (dropPosition === newPos) {
594
616
  return;
595
617
  }
596
- this._adapter.updateState({
597
- dropPosition: newPos
598
- });
618
+ // Use throttled update to reduce re-renders during fast dragging
619
+ this.throttledDragOverUpdate(newPos);
599
620
  }
600
621
  this.triggerDragEvent('onDragOver', e, treeNode);
601
622
  }
602
623
  handleNodeDragLeave(e, treeNode) {
624
+ // Cancel pending throttled updates when leaving a node
625
+ this.throttledDragOverUpdate.cancel();
603
626
  this._adapter.updateState({
604
627
  dragOverNodeKey: ''
605
628
  });
606
629
  this.triggerDragEvent('onDragLeave', e, treeNode);
607
630
  }
608
631
  handleNodeDragEnd(e, treeNode) {
632
+ // Flush any pending throttled updates before clearing drag state
633
+ this.throttledDragOverUpdate.flush();
609
634
  this.clearDragState();
610
635
  this.triggerDragEvent('onDragEnd', e, treeNode);
611
636
  this._adapter.setDragNode(null);
612
637
  }
613
638
  handleNodeDrop(e, treeNode, dragNode) {
639
+ // Flush any pending throttled updates to ensure accurate drop position
640
+ this.throttledDragOverUpdate.flush();
614
641
  const {
615
642
  dropPosition,
616
643
  dragNodesKeys
@@ -50,7 +50,7 @@
50
50
  transform: scale(var(--semi-transform_scale-none));
51
51
  font-size: 14px;
52
52
  line-height: 20px;
53
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
53
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
54
54
  word-break: break-word;
55
55
  color: var(--semi-color-text-0);
56
56
  position: relative;
@@ -49,6 +49,7 @@ export interface BasicTreeSelectProps extends Pick<BasicTreeProps, 'virtualize'
49
49
  outerTopSlot?: any;
50
50
  placeholder?: string;
51
51
  prefix?: any;
52
+ remote?: boolean;
52
53
  searchAutoFocus?: boolean;
53
54
  searchPlaceholder?: string;
54
55
  showSearchClear?: boolean;
@@ -481,8 +481,15 @@ export default class TreeSelectFoundation extends BaseFoundation {
481
481
  showFilteredOnly,
482
482
  filterTreeNode,
483
483
  treeNodeFilterProp,
484
- keyMaps
484
+ keyMaps,
485
+ remote
485
486
  } = this.getProps();
487
+ // When remote is true, skip local filtering, only update inputValue and trigger onSearch callback
488
+ if (remote) {
489
+ this._adapter.notifySearch(sugInput, [], []);
490
+ this._adapter.rePositionDropdown();
491
+ return;
492
+ }
486
493
  const realFilterProp = treeNodeFilterProp !== 'label' ? treeNodeFilterProp : _get(keyMaps, 'label', 'label');
487
494
  const newExpandedKeys = new Set(expandedKeys);
488
495
  let filteredNodes = [];
@@ -14,6 +14,10 @@
14
14
  align-items: center;
15
15
  position: relative;
16
16
  cursor: pointer;
17
+ /**
18
+ * Enable wrapping selected tags in trigger.
19
+ * Only takes effect in multiple + searchPosition="trigger" mode (class added by component).
20
+ */
17
21
  }
18
22
  .semi-tree-select:hover {
19
23
  background-color: var(--semi-color-fill-1);
@@ -92,7 +96,7 @@
92
96
  .semi-tree-select-selection {
93
97
  font-size: 14px;
94
98
  line-height: 20px;
95
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
99
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
96
100
  height: 100%;
97
101
  display: inline-flex;
98
102
  align-items: center;
@@ -200,6 +204,34 @@
200
204
  .semi-tree-select-multiple .semi-tree-select-selection-placeholder {
201
205
  padding-left: 8px;
202
206
  }
207
+ .semi-tree-select-triggerTagWrap {
208
+ max-width: 100%;
209
+ }
210
+ .semi-tree-select-triggerTagWrap .semi-tree-select-selection {
211
+ min-width: 0;
212
+ }
213
+ .semi-tree-select-triggerTagWrap.semi-tree-select-multiple {
214
+ height: auto;
215
+ }
216
+ .semi-tree-select-triggerTagWrap.semi-tree-select-multiple .semi-tree-select-selection {
217
+ height: auto;
218
+ min-height: 30px;
219
+ overflow: visible;
220
+ }
221
+ .semi-tree-select-triggerTagWrap.semi-tree-select-multiple.semi-tree-select-small .semi-tree-select-selection {
222
+ min-height: 22px;
223
+ }
224
+ .semi-tree-select-triggerTagWrap.semi-tree-select-multiple.semi-tree-select-large .semi-tree-select-selection {
225
+ min-height: 38px;
226
+ }
227
+ .semi-tree-select-triggerTagWrap .semi-tagInput {
228
+ min-width: 0;
229
+ max-width: 100%;
230
+ flex: 1 1 auto;
231
+ }
232
+ .semi-tree-select-triggerTagWrap .semi-tagInput .semi-tagInput-wrapper-input {
233
+ max-width: 100%;
234
+ }
203
235
  .semi-tree-select-small {
204
236
  min-height: 24px;
205
237
  line-height: 24px;
@@ -211,7 +243,7 @@
211
243
  .semi-tree-select-large .semi-tree-select-selection {
212
244
  font-size: 16px;
213
245
  line-height: 22px;
214
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
246
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
215
247
  }
216
248
  .semi-tree-select-arrow {
217
249
  display: inline-flex;
@@ -228,7 +260,7 @@
228
260
  font-weight: 600;
229
261
  font-size: 14px;
230
262
  line-height: 20px;
231
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
263
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
232
264
  color: var(--semi-color-text-2);
233
265
  flex-shrink: 0;
234
266
  white-space: nowrap;
@@ -263,7 +295,7 @@
263
295
  font-weight: 600;
264
296
  font-size: 14px;
265
297
  line-height: 20px;
266
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
298
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
267
299
  margin: 0px 12px;
268
300
  }
269
301
  .semi-tree-select-prefix-icon, .semi-tree-select-suffix-icon {
@@ -258,7 +258,6 @@ $module: #{$prefix}-tree-select;
258
258
 
259
259
  &-multiple {
260
260
  display: inline-flex;
261
-
262
261
  .#{$module}-selection {
263
262
  padding-left: $spacing-treeSelect_selection_multiple-paddingLeft;
264
263
  padding-right: 0;
@@ -269,6 +268,55 @@ $module: #{$prefix}-tree-select;
269
268
  }
270
269
  }
271
270
 
271
+ /**
272
+ * Enable wrapping selected tags in trigger.
273
+ * Only takes effect in multiple + searchPosition="trigger" mode (class added by component).
274
+ */
275
+ &-triggerTagWrap {
276
+ // Prevent trigger from expanding beyond its container
277
+ max-width: 100%;
278
+
279
+ .#{$module}-selection {
280
+ // Allow selection area to shrink so inner TagInput can wrap
281
+ min-width: 0;
282
+ }
283
+
284
+ &.#{$module}-multiple {
285
+ // multiple tags may wrap to multiple lines
286
+ height: auto;
287
+
288
+ .#{$module}-selection {
289
+ // allow height to grow when wrapping
290
+ height: auto;
291
+ min-height: $height-treeSelect_default - 2 * $width-treeSelect-border;
292
+ overflow: visible;
293
+ }
294
+
295
+ &.#{$module}-small {
296
+ .#{$module}-selection {
297
+ min-height: $height-treeSelect_small - 2 * $width-treeSelect-border;
298
+ }
299
+ }
300
+
301
+ &.#{$module}-large {
302
+ .#{$module}-selection {
303
+ min-height: $height-treeSelect_large - 2 * $width-treeSelect-border;
304
+ }
305
+ }
306
+ }
307
+
308
+ // Make TagInput shrinkable as a flex item, and constrain measured input width
309
+ .#{$prefix}-tagInput {
310
+ min-width: 0;
311
+ max-width: 100%;
312
+ flex: 1 1 auto;
313
+
314
+ .#{$prefix}-tagInput-wrapper-input {
315
+ max-width: 100%;
316
+ }
317
+ }
318
+ }
319
+
272
320
  &-small {
273
321
  min-height: $height-treeSelect_small;
274
322
  line-height: $font-treeSelect_small-lineHeight;
@@ -5,7 +5,7 @@
5
5
  color: var(--semi-color-text-0);
6
6
  font-size: 14px;
7
7
  line-height: 20px;
8
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
8
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
9
9
  }
10
10
  .semi-typography.semi-typography-secondary {
11
11
  color: var(--semi-color-text-1);
@@ -45,7 +45,7 @@
45
45
  .semi-typography-small {
46
46
  font-size: 12px;
47
47
  line-height: 16px;
48
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
48
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
49
49
  font-weight: 400;
50
50
  }
51
51
  .semi-typography-small.semi-typography-paragraph {
@@ -146,7 +146,7 @@ h1.semi-typography,
146
146
  .semi-typography-h1.semi-typography {
147
147
  font-size: 32px;
148
148
  line-height: 44px;
149
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
149
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
150
150
  font-weight: 600;
151
151
  margin: 0;
152
152
  }
@@ -175,7 +175,7 @@ h2.semi-typography,
175
175
  .semi-typography-h2.semi-typography {
176
176
  font-size: 28px;
177
177
  line-height: 40px;
178
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
178
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
179
179
  font-weight: 600;
180
180
  margin: 0;
181
181
  }
@@ -204,7 +204,7 @@ h3.semi-typography,
204
204
  .semi-typography-h3.semi-typography {
205
205
  font-size: 24px;
206
206
  line-height: 32px;
207
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
207
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
208
208
  font-weight: 600;
209
209
  margin: 0;
210
210
  }
@@ -233,7 +233,7 @@ h4.semi-typography,
233
233
  .semi-typography-h4.semi-typography {
234
234
  font-size: 20px;
235
235
  line-height: 28px;
236
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
236
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
237
237
  font-weight: 600;
238
238
  margin: 0;
239
239
  }
@@ -262,7 +262,7 @@ h5.semi-typography,
262
262
  .semi-typography-h5.semi-typography {
263
263
  font-size: 18px;
264
264
  line-height: 24px;
265
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
265
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
266
266
  font-weight: 600;
267
267
  margin: 0;
268
268
  }
@@ -291,7 +291,7 @@ h6.semi-typography,
291
291
  .semi-typography-h6.semi-typography {
292
292
  font-size: 16px;
293
293
  line-height: 22px;
294
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
294
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
295
295
  font-weight: 600;
296
296
  margin: 0;
297
297
  }
@@ -88,7 +88,7 @@
88
88
  .semi-upload-file-list-title {
89
89
  font-size: 12px;
90
90
  line-height: 16px;
91
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
91
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
92
92
  color: var(--semi-color-text-2);
93
93
  margin-bottom: 4px;
94
94
  }
@@ -164,14 +164,14 @@
164
164
  display: inline-block;
165
165
  font-size: 14px;
166
166
  line-height: 20px;
167
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
167
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
168
168
  font-weight: 600;
169
169
  color: var(--semi-color-text-0);
170
170
  }
171
171
  .semi-upload-file-card-info-size {
172
172
  font-size: 12px;
173
173
  line-height: 16px;
174
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
174
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
175
175
  font-weight: 400;
176
176
  margin-left: 8px;
177
177
  color: var(--semi-color-text-2);
@@ -185,7 +185,7 @@
185
185
  .semi-upload-file-card-info-validate-message {
186
186
  font-size: 12px;
187
187
  line-height: 16px;
188
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
188
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
189
189
  display: flex;
190
190
  align-items: center;
191
191
  color: var(--semi-color-text-0);
@@ -193,7 +193,7 @@
193
193
  .semi-upload-file-card-info-retry {
194
194
  font-size: 12px;
195
195
  line-height: 16px;
196
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
196
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
197
197
  color: var(--semi-color-primary);
198
198
  cursor: pointer;
199
199
  margin-left: 8px;
@@ -468,7 +468,7 @@
468
468
  cursor: pointer;
469
469
  font-size: 14px;
470
470
  line-height: 20px;
471
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
471
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
472
472
  margin-bottom: 4px;
473
473
  color: var(--semi-color-text-0);
474
474
  }
@@ -482,7 +482,7 @@
482
482
  cursor: pointer;
483
483
  font-size: 12px;
484
484
  line-height: 16px;
485
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
485
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
486
486
  color: var(--semi-color-text-0);
487
487
  }
488
488
  .semi-upload-drag-area-sub-text:hover {
@@ -494,7 +494,7 @@
494
494
  .semi-upload-drag-area-tips {
495
495
  font-size: 12px;
496
496
  line-height: 16px;
497
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
497
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
498
498
  font-weight: 600;
499
499
  }
500
500
  .semi-upload-drag-area-tips-legal {
@@ -2,7 +2,7 @@ declare class Store<T = Record<string, any>> {
2
2
  _state: T;
3
3
  _listeners: any[];
4
4
  constructor(initialState: T);
5
- subscribe(listener: (state: T) => () => void): () => void;
5
+ subscribe(listener: (state: T) => void | (() => void)): () => void;
6
6
  setState(state: T): void;
7
7
  getState(): T;
8
8
  }
@@ -4,6 +4,7 @@ class Store {
4
4
  this._state = Object.assign({}, initialState);
5
5
  this._listeners = [];
6
6
  }
7
+ // Listener return value is ignored, but keep type compatible with older signature
7
8
  subscribe(listener) {
8
9
  this._listeners.push(listener);
9
10
  const unsubscribe = () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@douyinfe/semi-foundation",
3
- "version": "2.97.0",
3
+ "version": "2.98.0",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "clean": "rimraf lib",
@@ -10053,6 +10053,21 @@
10053
10053
  "import": "./lib/es/slider/foundation.js",
10054
10054
  "require": "./lib/cjs/slider/foundation.js"
10055
10055
  },
10056
+ "./lib/es/slider/rtl.scss": {
10057
+ "import": "./lib/es/slider/rtl.scss",
10058
+ "require": "./lib/cjs/slider/rtl.scss",
10059
+ "default": "./lib/es/slider/rtl.scss"
10060
+ },
10061
+ "./lib/cjs/slider/rtl.scss": {
10062
+ "import": "./lib/es/slider/rtl.scss",
10063
+ "require": "./lib/cjs/slider/rtl.scss",
10064
+ "default": "./lib/es/slider/rtl.scss"
10065
+ },
10066
+ "./slider/rtl.scss": {
10067
+ "import": "./lib/es/slider/rtl.scss",
10068
+ "require": "./lib/cjs/slider/rtl.scss",
10069
+ "default": "./lib/es/slider/rtl.scss"
10070
+ },
10056
10071
  "./lib/es/slider/slider.css": {
10057
10072
  "import": "./lib/es/slider/slider.css",
10058
10073
  "require": "./lib/cjs/slider/slider.css",
@@ -14210,8 +14225,8 @@
14210
14225
  }
14211
14226
  },
14212
14227
  "dependencies": {
14213
- "@douyinfe/semi-animation": "2.97.0",
14214
- "@douyinfe/semi-json-viewer-core": "2.97.0",
14228
+ "@douyinfe/semi-animation": "2.98.0",
14229
+ "@douyinfe/semi-json-viewer-core": "2.98.0",
14215
14230
  "@mdx-js/mdx": "^3.0.1",
14216
14231
  "async-validator": "^3.5.0",
14217
14232
  "classnames": "^2.2.6",
@@ -14232,7 +14247,7 @@
14232
14247
  "*.scss",
14233
14248
  "*.css"
14234
14249
  ],
14235
- "gitHead": "fefc4b3e8ea823bc99f68bfee02f3f8cc314726c",
14250
+ "gitHead": "e33a947a4e0745a7ad15d3e773355cc19d23b174",
14236
14251
  "devDependencies": {
14237
14252
  "@babel/plugin-transform-runtime": "^7.15.8",
14238
14253
  "@babel/preset-env": "^7.15.8",
@@ -91,6 +91,12 @@ export default class ItemFoundation<P = Record<string, any>, S = Record<string,
91
91
  const lastRect = lastNode.getBoundingClientRect();
92
92
 
93
93
  const listHeight = lastRect.height * list.length;
94
+ // Guard against environments where layout is not computed
95
+ // (e.g. jsdom returns all-zero rects), which would otherwise
96
+ // make `baseTop += listHeight` a no-op and loop forever.
97
+ if (listHeight <= 0) {
98
+ return 0;
99
+ }
94
100
  let baseTop = lastRect.top;
95
101
  let count = 0;
96
102
 
@@ -127,6 +133,12 @@ export default class ItemFoundation<P = Record<string, any>, S = Record<string,
127
133
  const firstRect = firstNode.getBoundingClientRect();
128
134
 
129
135
  const listHeight = firstRect.height * list.length;
136
+ // Guard against environments where layout is not computed
137
+ // (e.g. jsdom returns all-zero rects), which would otherwise
138
+ // make `baseTop -= listHeight` a no-op and loop forever.
139
+ if (listHeight <= 0) {
140
+ return 0;
141
+ }
130
142
 
131
143
  let baseTop = firstRect.top;
132
144
  let count = 0;
@@ -147,6 +147,8 @@ export default class SliderFoundation extends BaseFoundation<SliderAdapter> {
147
147
  getMinAndMaxPercent = (value: number | number[]) => {
148
148
  // debugger
149
149
  const { range, min, max } = this._adapter.getProps();
150
+ // Percent always increases with value, independent of visual direction.
151
+ // UI layer decides whether to use `left` or `right` to place elements.
150
152
  const minPercent = range ? (value[0] - min) / (max - min) : (value as number - min) / (max - min);
151
153
  const maxPercent = range ? (value[1] - min) / (max - min) : 1;
152
154
  return { min: this._checkValidity(minPercent), max: this._checkValidity(maxPercent) };
@@ -264,6 +266,8 @@ export default class SliderFoundation extends BaseFoundation<SliderAdapter> {
264
266
 
265
267
  // Returns the length of the distance to the left
266
268
  const { vertical, verticalReverse, range } = this._adapter.getProps();
269
+ const direction = this._adapter.getContext('direction');
270
+ const isRTL = direction === 'rtl' && !vertical;
267
271
  const value = this._adapter.getState('currentValue');
268
272
  const currentPos = this.transValueToPos(value);
269
273
  const { sliderX, sliderY, sliderWidth, sliderHeight } = this._adapter.getSliderLengths();
@@ -272,6 +276,9 @@ export default class SliderFoundation extends BaseFoundation<SliderAdapter> {
272
276
  let startPos;
273
277
  if (vertical && verticalReverse) {
274
278
  startPos = sliderY + len;
279
+ } else if (isRTL) {
280
+ // In RTL mode, start from right (sliderX + sliderWidth)
281
+ startPos = sliderX + len;
275
282
  } else {
276
283
  startPos = vertical ? sliderY : sliderX;
277
284
  }
@@ -279,13 +286,16 @@ export default class SliderFoundation extends BaseFoundation<SliderAdapter> {
279
286
  let endPos;
280
287
  if (vertical && verticalReverse) {
281
288
  endPos = sliderY;
289
+ } else if (isRTL) {
290
+ // In RTL mode, end at left (sliderX)
291
+ endPos = sliderX;
282
292
  } else {
283
293
  endPos = vertical ? sliderY + sliderHeight : sliderX + sliderWidth;
284
294
  }
285
295
  // endPos = chooseMovePos === 'min' && isDrag && range ? currentPos[1] : endPos;
286
296
 
287
297
 
288
- if (vertical && verticalReverse) {
298
+ if ((vertical && verticalReverse) || isRTL) {
289
299
  if (position >= startPos) {
290
300
  position = startPos;
291
301
  } else if (position <= endPos) {
@@ -310,6 +320,8 @@ export default class SliderFoundation extends BaseFoundation<SliderAdapter> {
310
320
  const pos = this.checkMeetMinMax(mousePos);
311
321
  const { min, max, currentValue } = this._adapter.getStates();
312
322
  const { range, vertical, step, verticalReverse } = this._adapter.getProps();
323
+ const direction = this._adapter.getContext('direction');
324
+ const isRTL = direction === 'rtl' && !vertical;
313
325
  const { sliderX, sliderY, sliderWidth, sliderHeight } = this._adapter.getSliderLengths();
314
326
  const startPos = vertical ? sliderY : sliderX;
315
327
  const len = vertical ? sliderHeight : sliderWidth;
@@ -317,6 +329,9 @@ export default class SliderFoundation extends BaseFoundation<SliderAdapter> {
317
329
  if (vertical && verticalReverse) {
318
330
  //isMin = !isMin;
319
331
  stepValue = ((startPos + len - pos) / len) * (max - min) + min;
332
+ } else if (isRTL) {
333
+ // In RTL mode, position is calculated from right to left
334
+ stepValue = ((startPos + len - pos) / len) * (max - min) + min;
320
335
  } else {
321
336
  stepValue = ((pos - startPos) / len) * (max - min) + min;
322
337
  }
@@ -347,13 +362,29 @@ export default class SliderFoundation extends BaseFoundation<SliderAdapter> {
347
362
  transValueToPos = (value: SliderProps['value']) => {
348
363
  const { min, max } = this._adapter.getStates();
349
364
  const { vertical, range, verticalReverse } = this._adapter.getProps();
365
+ const direction = this._adapter.getContext('direction');
366
+ const isRTL = direction === 'rtl' && !vertical;
350
367
  const { sliderX, sliderY, sliderWidth, sliderHeight } = this._adapter.getSliderLengths();
368
+
351
369
  const startPos = vertical ? sliderY : sliderX;
352
370
  const len = vertical ? sliderHeight : sliderWidth;
371
+
372
+ const transSingle = (val: number) => {
373
+ const percent = (val - min) / (max - min);
374
+ if (vertical && verticalReverse) {
375
+ // Reverse direction in vertical mode
376
+ return startPos + len - percent * len;
377
+ }
378
+ if (isRTL) {
379
+ // Reverse direction in horizontal RTL
380
+ return startPos + len - percent * len;
381
+ }
382
+ return startPos + percent * len;
383
+ };
353
384
  if (range) {
354
- return [((value[0] - min) * len) / (max - min) + startPos, ((value[1] - min) * len) / (max - min) + startPos];
385
+ return [transSingle(value[0]), transSingle(value[1])];
355
386
  } else {
356
- return ((value as number - min) * len) / (max - min) + startPos;
387
+ return transSingle(value as number);
357
388
  }
358
389
  };
359
390
 
@@ -649,22 +680,34 @@ export default class SliderFoundation extends BaseFoundation<SliderAdapter> {
649
680
 
650
681
  handleKeyDown = (event: any, handler: 'min'| 'max') => {
651
682
  const { min, max, currentValue } = this.getStates();
652
- const { step, range } = this.getProps();
683
+ const { step, range, vertical } = this.getProps();
684
+ const direction = this._adapter.getContext('direction');
685
+ const isRTL = direction === 'rtl' && !vertical;
653
686
  let outputValue;
654
687
  switch (event.key) {
655
688
  case "ArrowLeft":
656
689
  case "ArrowDown":
657
- outputValue = this._handleValueDecreaseWithKeyBoard(step, handler);
690
+ // In RTL mode, ArrowLeft and ArrowDown should increase value
691
+ outputValue = isRTL ?
692
+ this._handleValueIncreaseWithKeyBoard(step, handler) :
693
+ this._handleValueDecreaseWithKeyBoard(step, handler);
658
694
  break;
659
695
  case "ArrowRight":
660
696
  case "ArrowUp":
661
- outputValue = this._handleValueIncreaseWithKeyBoard(step, handler);
697
+ // In RTL mode, ArrowRight and ArrowUp should decrease value
698
+ outputValue = isRTL ?
699
+ this._handleValueDecreaseWithKeyBoard(step, handler) :
700
+ this._handleValueIncreaseWithKeyBoard(step, handler);
662
701
  break;
663
702
  case "PageUp":
664
- outputValue = this._handleValueIncreaseWithKeyBoard(10 * step, handler);
703
+ outputValue = isRTL ?
704
+ this._handleValueDecreaseWithKeyBoard(10 * step, handler) :
705
+ this._handleValueIncreaseWithKeyBoard(10 * step, handler);
665
706
  break;
666
707
  case "PageDown":
667
- outputValue = this._handleValueDecreaseWithKeyBoard(10 * step, handler);
708
+ outputValue = isRTL ?
709
+ this._handleValueIncreaseWithKeyBoard(10 * step, handler) :
710
+ this._handleValueDecreaseWithKeyBoard(10 * step, handler);
668
711
  break;
669
712
  case "Home":
670
713
  outputValue = this._handleHomeKey(handler);
@@ -775,13 +818,10 @@ export default class SliderFoundation extends BaseFoundation<SliderAdapter> {
775
818
  const currentPos = this.transValueToPos(currentValue);
776
819
  let isMin = true;
777
820
  if (Array.isArray(currentPos)) {
778
- // Slide on both sides
779
- if (
780
- pagePos > currentPos[1] ||
781
- Math.abs(pagePos - currentPos[0]) > Math.abs(pagePos - currentPos[1])
782
- ) {
783
- isMin = false;
784
- }
821
+ // Choose the nearest handle regardless of ordering (LTR/RTL/verticalReverse)
822
+ const distToFirst = Math.abs(pagePos - currentPos[0]);
823
+ const distToSecond = Math.abs(pagePos - currentPos[1]);
824
+ isMin = distToFirst <= distToSecond;
785
825
  }
786
826
  if (vertical && verticalReverse) {
787
827
  isMin = !isMin;