@douyinfe/semi-foundation 2.97.0 → 2.99.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 (180) hide show
  1. package/cascader/foundation.ts +3 -1
  2. package/codeHighlight/codeHighlight.scss +1 -1
  3. package/datePicker/foundation.ts +7 -0
  4. package/datePicker/inputFoundation.ts +5 -0
  5. package/form/foundation.ts +50 -4
  6. package/inputNumber/foundation.ts +119 -3
  7. package/jsonViewer/jsonViewer.scss +2 -2
  8. package/lib/cjs/aiChatInput/aiChatInput.css +7 -7
  9. package/lib/cjs/anchor/anchor.css +3 -3
  10. package/lib/cjs/autoComplete/autoComplete.css +1 -1
  11. package/lib/cjs/avatar/avatar.css +5 -5
  12. package/lib/cjs/badge/badge.css +1 -1
  13. package/lib/cjs/breadcrumb/breadcrumb.css +2 -2
  14. package/lib/cjs/calendar/calendar.css +9 -9
  15. package/lib/cjs/cascader/cascader.css +6 -6
  16. package/lib/cjs/cascader/foundation.js +4 -1
  17. package/lib/cjs/checkbox/checkbox.css +2 -2
  18. package/lib/cjs/codeHighlight/codeHighlight.css +1 -1
  19. package/lib/cjs/codeHighlight/codeHighlight.scss +1 -1
  20. package/lib/cjs/collapse/collapse.css +2 -2
  21. package/lib/cjs/datePicker/datePicker.css +8 -8
  22. package/lib/cjs/datePicker/foundation.d.ts +5 -0
  23. package/lib/cjs/datePicker/foundation.js +2 -0
  24. package/lib/cjs/datePicker/inputFoundation.d.ts +5 -0
  25. package/lib/cjs/descriptions/descriptions.css +6 -6
  26. package/lib/cjs/dropdown/dropdown.css +2 -2
  27. package/lib/cjs/form/form.css +4 -4
  28. package/lib/cjs/form/foundation.js +51 -3
  29. package/lib/cjs/hotKeys/hotKeys.css +2 -2
  30. package/lib/cjs/image/image.css +2 -2
  31. package/lib/cjs/input/input.css +8 -8
  32. package/lib/cjs/input/textarea.css +2 -2
  33. package/lib/cjs/inputNumber/foundation.d.ts +15 -0
  34. package/lib/cjs/inputNumber/foundation.js +113 -3
  35. package/lib/cjs/jsonViewer/jsonViewer.css +2 -2
  36. package/lib/cjs/jsonViewer/jsonViewer.scss +2 -2
  37. package/lib/cjs/list/list.css +1 -1
  38. package/lib/cjs/modal/modal.css +1 -1
  39. package/lib/cjs/navigation/navigation.css +2 -2
  40. package/lib/cjs/notification/notification.css +4 -4
  41. package/lib/cjs/pagination/pagination.css +5 -5
  42. package/lib/cjs/popconfirm/popconfirm.css +1 -1
  43. package/lib/cjs/popover/popover.css +5 -5
  44. package/lib/cjs/radio/radio.css +2 -2
  45. package/lib/cjs/scrollList/itemFoundation.js +12 -0
  46. package/lib/cjs/scrollList/scrollList.css +2 -2
  47. package/lib/cjs/select/select.css +6 -6
  48. package/lib/cjs/sideSheet/sideSheet.css +2 -2
  49. package/lib/cjs/sidebar/sidebar.css +11 -11
  50. package/lib/cjs/slider/foundation.js +46 -12
  51. package/lib/cjs/slider/rtl.scss +62 -0
  52. package/lib/cjs/slider/slider.css +45 -0
  53. package/lib/cjs/slider/slider.scss +2 -0
  54. package/lib/cjs/steps/steps.css +11 -11
  55. package/lib/cjs/table/foundation.d.ts +36 -0
  56. package/lib/cjs/table/foundation.js +162 -28
  57. package/lib/cjs/table/rtl.scss +21 -0
  58. package/lib/cjs/table/table.css +38 -2
  59. package/lib/cjs/table/table.scss +49 -0
  60. package/lib/cjs/tabs/tabs.css +2 -2
  61. package/lib/cjs/tag/tag.css +2 -2
  62. package/lib/cjs/tagInput/tagInput.css +2 -2
  63. package/lib/cjs/timePicker/timePicker.css +1 -1
  64. package/lib/cjs/timeline/timeline.css +2 -2
  65. package/lib/cjs/toast/toast.css +1 -1
  66. package/lib/cjs/tooltip/arrow.scss +4 -4
  67. package/lib/cjs/tooltip/foundation.js +72 -5
  68. package/lib/cjs/tooltip/tooltip.css +5 -5
  69. package/lib/cjs/transfer/constants.d.ts +3 -1
  70. package/lib/cjs/transfer/constants.js +3 -1
  71. package/lib/cjs/transfer/foundation.d.ts +3 -0
  72. package/lib/cjs/transfer/foundation.js +4 -0
  73. package/lib/cjs/transfer/transfer.css +14 -5
  74. package/lib/cjs/transfer/transfer.scss +10 -0
  75. package/lib/cjs/tree/foundation.d.ts +3 -0
  76. package/lib/cjs/tree/foundation.js +31 -4
  77. package/lib/cjs/tree/tree.css +1 -1
  78. package/lib/cjs/treeSelect/foundation.d.ts +1 -0
  79. package/lib/cjs/treeSelect/foundation.js +8 -1
  80. package/lib/cjs/treeSelect/treeSelect.css +36 -4
  81. package/lib/cjs/treeSelect/treeSelect.scss +49 -1
  82. package/lib/cjs/typography/typography.css +8 -8
  83. package/lib/cjs/upload/upload.css +8 -8
  84. package/lib/cjs/utils/Store.d.ts +1 -1
  85. package/lib/cjs/utils/Store.js +1 -0
  86. package/lib/es/aiChatInput/aiChatInput.css +7 -7
  87. package/lib/es/anchor/anchor.css +3 -3
  88. package/lib/es/autoComplete/autoComplete.css +1 -1
  89. package/lib/es/avatar/avatar.css +5 -5
  90. package/lib/es/badge/badge.css +1 -1
  91. package/lib/es/breadcrumb/breadcrumb.css +2 -2
  92. package/lib/es/calendar/calendar.css +9 -9
  93. package/lib/es/cascader/cascader.css +6 -6
  94. package/lib/es/cascader/foundation.js +4 -1
  95. package/lib/es/checkbox/checkbox.css +2 -2
  96. package/lib/es/codeHighlight/codeHighlight.css +1 -1
  97. package/lib/es/codeHighlight/codeHighlight.scss +1 -1
  98. package/lib/es/collapse/collapse.css +2 -2
  99. package/lib/es/datePicker/datePicker.css +8 -8
  100. package/lib/es/datePicker/foundation.d.ts +5 -0
  101. package/lib/es/datePicker/foundation.js +2 -0
  102. package/lib/es/datePicker/inputFoundation.d.ts +5 -0
  103. package/lib/es/descriptions/descriptions.css +6 -6
  104. package/lib/es/dropdown/dropdown.css +2 -2
  105. package/lib/es/form/form.css +4 -4
  106. package/lib/es/form/foundation.js +51 -3
  107. package/lib/es/hotKeys/hotKeys.css +2 -2
  108. package/lib/es/image/image.css +2 -2
  109. package/lib/es/input/input.css +8 -8
  110. package/lib/es/input/textarea.css +2 -2
  111. package/lib/es/inputNumber/foundation.d.ts +15 -0
  112. package/lib/es/inputNumber/foundation.js +113 -3
  113. package/lib/es/jsonViewer/jsonViewer.css +2 -2
  114. package/lib/es/jsonViewer/jsonViewer.scss +2 -2
  115. package/lib/es/list/list.css +1 -1
  116. package/lib/es/modal/modal.css +1 -1
  117. package/lib/es/navigation/navigation.css +2 -2
  118. package/lib/es/notification/notification.css +4 -4
  119. package/lib/es/pagination/pagination.css +5 -5
  120. package/lib/es/popconfirm/popconfirm.css +1 -1
  121. package/lib/es/popover/popover.css +5 -5
  122. package/lib/es/radio/radio.css +2 -2
  123. package/lib/es/scrollList/itemFoundation.js +12 -0
  124. package/lib/es/scrollList/scrollList.css +2 -2
  125. package/lib/es/select/select.css +6 -6
  126. package/lib/es/sideSheet/sideSheet.css +2 -2
  127. package/lib/es/sidebar/sidebar.css +11 -11
  128. package/lib/es/slider/foundation.js +46 -12
  129. package/lib/es/slider/rtl.scss +62 -0
  130. package/lib/es/slider/slider.css +45 -0
  131. package/lib/es/slider/slider.scss +2 -0
  132. package/lib/es/steps/steps.css +11 -11
  133. package/lib/es/table/foundation.d.ts +36 -0
  134. package/lib/es/table/foundation.js +162 -28
  135. package/lib/es/table/rtl.scss +21 -0
  136. package/lib/es/table/table.css +38 -2
  137. package/lib/es/table/table.scss +49 -0
  138. package/lib/es/tabs/tabs.css +2 -2
  139. package/lib/es/tag/tag.css +2 -2
  140. package/lib/es/tagInput/tagInput.css +2 -2
  141. package/lib/es/timePicker/timePicker.css +1 -1
  142. package/lib/es/timeline/timeline.css +2 -2
  143. package/lib/es/toast/toast.css +1 -1
  144. package/lib/es/tooltip/arrow.scss +4 -4
  145. package/lib/es/tooltip/foundation.js +72 -5
  146. package/lib/es/tooltip/tooltip.css +5 -5
  147. package/lib/es/transfer/constants.d.ts +3 -1
  148. package/lib/es/transfer/constants.js +3 -1
  149. package/lib/es/transfer/foundation.d.ts +3 -0
  150. package/lib/es/transfer/foundation.js +4 -0
  151. package/lib/es/transfer/transfer.css +14 -5
  152. package/lib/es/transfer/transfer.scss +10 -0
  153. package/lib/es/tree/foundation.d.ts +3 -0
  154. package/lib/es/tree/foundation.js +31 -4
  155. package/lib/es/tree/tree.css +1 -1
  156. package/lib/es/treeSelect/foundation.d.ts +1 -0
  157. package/lib/es/treeSelect/foundation.js +8 -1
  158. package/lib/es/treeSelect/treeSelect.css +36 -4
  159. package/lib/es/treeSelect/treeSelect.scss +49 -1
  160. package/lib/es/typography/typography.css +8 -8
  161. package/lib/es/upload/upload.css +8 -8
  162. package/lib/es/utils/Store.d.ts +1 -1
  163. package/lib/es/utils/Store.js +1 -0
  164. package/package.json +19 -4
  165. package/scrollList/itemFoundation.ts +12 -0
  166. package/slider/foundation.ts +55 -15
  167. package/slider/rtl.scss +62 -0
  168. package/slider/slider.scss +2 -0
  169. package/table/foundation.ts +197 -29
  170. package/table/rtl.scss +21 -0
  171. package/table/table.scss +49 -0
  172. package/tooltip/arrow.scss +4 -4
  173. package/tooltip/foundation.ts +86 -5
  174. package/transfer/constants.ts +3 -1
  175. package/transfer/foundation.ts +8 -1
  176. package/transfer/transfer.scss +10 -0
  177. package/tree/foundation.ts +34 -5
  178. package/treeSelect/foundation.ts +10 -1
  179. package/treeSelect/treeSelect.scss +49 -1
  180. package/utils/Store.ts +2 -1
@@ -40,7 +40,9 @@ export interface TransferAdapter<P = Record<string, any>, S = Record<string, any
40
40
  notifyDeselect: (items: BasicDataItem) => void;
41
41
  updateInput: (input: string) => void;
42
42
  updateSearchResult: (searchResult: Set<number | string>) => void;
43
- searchTree: (keyword: string) => void
43
+ searchTree: (keyword: string) => void;
44
+ updateCurrentPage: (currentPage: number) => void;
45
+ notifyPageChange: (currentPage: number) => void;
44
46
  }
45
47
 
46
48
  export default class TransferFoundation<P = Record<string, any>, S = Record<string, any>> extends BaseFoundation<TransferAdapter<P, S>> {
@@ -253,4 +255,9 @@ export default class TransferFoundation<P = Record<string, any>, S = Record<stri
253
255
  this._notifyChange(newSelectedItems);
254
256
  }
255
257
 
258
+ handlePageChange(currentPage: number) {
259
+ this._adapter.updateCurrentPage(currentPage);
260
+ this._adapter.notifyPageChange(currentPage);
261
+ }
262
+
256
263
  }
@@ -118,6 +118,16 @@ $module: #{$prefix}-transfer;
118
118
  flex-grow: 1;
119
119
  }
120
120
 
121
+ &-pagination {
122
+ padding-top: $spacing-base-tight;
123
+ padding-bottom: $spacing-base-tight;
124
+ padding-left: $spacing-base-tight;
125
+ padding-right: $spacing-base-tight;
126
+ flex-shrink: 0;
127
+ display: flex;
128
+ justify-content: center;
129
+ }
130
+
121
131
  &-empty {
122
132
  height: $height-transfer_left_empty;
123
133
  }
@@ -3,7 +3,7 @@
3
3
  * https://github.com/react-component/tree
4
4
  */
5
5
 
6
- import { isUndefined, difference, pick, get } from 'lodash';
6
+ import { isUndefined, difference, pick, get, throttle } from 'lodash';
7
7
  import BaseFoundation, { DefaultAdapter } from '../base/foundation';
8
8
  import {
9
9
  flattenTreeData,
@@ -322,11 +322,35 @@ export interface TreeAdapter extends DefaultAdapter<BasicTreeProps, BasicTreeInn
322
322
 
323
323
  export default class TreeFoundation extends BaseFoundation<TreeAdapter, BasicTreeProps, BasicTreeInnerData> {
324
324
  delayedDragEnterLogic: any;
325
+ throttledDragOverUpdate: ReturnType<typeof throttle>;
325
326
 
326
327
  constructor(adapter: TreeAdapter) {
327
328
  super({
328
329
  ...adapter,
329
330
  });
331
+ // Throttle drag over state updates to improve performance during fast dragging
332
+ // 16ms ≈ 60fps, ensuring smooth updates without excessive re-renders
333
+ this.throttledDragOverUpdate = throttle((dropPosition: number) => {
334
+ this._adapter.updateState({
335
+ dropPosition,
336
+ });
337
+ }, 16);
338
+ }
339
+
340
+ destroy() {
341
+ super.destroy();
342
+ // Cancel any pending throttled updates
343
+ if (this.throttledDragOverUpdate) {
344
+ this.throttledDragOverUpdate.cancel();
345
+ }
346
+
347
+ // Clear pending delayed drag enter timers to avoid updates after unmount
348
+ if (this.delayedDragEnterLogic) {
349
+ Object.keys(this.delayedDragEnterLogic).forEach(key => {
350
+ clearTimeout(this.delayedDragEnterLogic[key]);
351
+ });
352
+ this.delayedDragEnterLogic = null;
353
+ }
330
354
  }
331
355
 
332
356
  _isMultiple() {
@@ -863,21 +887,22 @@ export default class TreeFoundation extends BaseFoundation<TreeAdapter, BasicTre
863
887
  return;
864
888
  }
865
889
 
866
- // Update the drag position
890
+ // Update the drag position with throttle to improve performance
867
891
  if (dragNode && eventKey === dragOverNodeKey) {
868
892
  const newPos = calcDropRelativePosition(e, treeNode);
869
893
  if (dropPosition === newPos) {
870
894
  return;
871
895
  }
872
- this._adapter.updateState({
873
- dropPosition: newPos,
874
- });
896
+ // Use throttled update to reduce re-renders during fast dragging
897
+ this.throttledDragOverUpdate(newPos);
875
898
  }
876
899
 
877
900
  this.triggerDragEvent('onDragOver', e, treeNode);
878
901
  }
879
902
 
880
903
  handleNodeDragLeave(e: any, treeNode: BasicTreeNodeData) {
904
+ // Cancel pending throttled updates when leaving a node
905
+ this.throttledDragOverUpdate.cancel();
881
906
  this._adapter.updateState({
882
907
  dragOverNodeKey: '',
883
908
  });
@@ -885,12 +910,16 @@ export default class TreeFoundation extends BaseFoundation<TreeAdapter, BasicTre
885
910
  }
886
911
 
887
912
  handleNodeDragEnd(e: any, treeNode: BasicTreeNodeData) {
913
+ // Flush any pending throttled updates before clearing drag state
914
+ this.throttledDragOverUpdate.flush();
888
915
  this.clearDragState();
889
916
  this.triggerDragEvent('onDragEnd', e, treeNode);
890
917
  this._adapter.setDragNode(null);
891
918
  }
892
919
 
893
920
  handleNodeDrop(e: any, treeNode: BasicTreeNodeData, dragNode: any) {
921
+ // Flush any pending throttled updates to ensure accurate drop position
922
+ this.throttledDragOverUpdate.flush();
894
923
  const { dropPosition, dragNodesKeys } = this.getStates();
895
924
  const { eventKey, pos } = treeNode;
896
925
  this.clearDragState();
@@ -119,6 +119,7 @@ export interface BasicTreeSelectProps extends Pick<BasicTreeProps,
119
119
  outerTopSlot?: any;
120
120
  placeholder?: string;
121
121
  prefix?: any;
122
+ remote?: boolean;
122
123
  searchAutoFocus?: boolean;
123
124
  searchPlaceholder?: string;
124
125
  showSearchClear?: boolean;
@@ -626,7 +627,15 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
626
627
  // Input is used as controlled component
627
628
  this._adapter.updateInputValue(sugInput);
628
629
  const { flattenNodes, expandedKeys, selectedKeys, keyEntities, treeData } = this.getStates();
629
- const { showFilteredOnly, filterTreeNode, treeNodeFilterProp, keyMaps } = this.getProps();
630
+ const { showFilteredOnly, filterTreeNode, treeNodeFilterProp, keyMaps, remote } = this.getProps();
631
+
632
+ // When remote is true, skip local filtering, only update inputValue and trigger onSearch callback
633
+ if (remote) {
634
+ this._adapter.notifySearch(sugInput, [], []);
635
+ this._adapter.rePositionDropdown();
636
+ return;
637
+ }
638
+
630
639
  const realFilterProp = treeNodeFilterProp !== 'label' ? treeNodeFilterProp : get(keyMaps, 'label', 'label');
631
640
  const newExpandedKeys: Set<string> = new Set(expandedKeys);
632
641
  let filteredNodes: BasicTreeNodeData[] = [];
@@ -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;
package/utils/Store.ts CHANGED
@@ -7,7 +7,8 @@ class Store<T = Record<string, any>> {
7
7
  this._listeners = [];
8
8
  }
9
9
 
10
- subscribe(listener: (state: T) => () => void) {
10
+ // Listener return value is ignored, but keep type compatible with older signature
11
+ subscribe(listener: (state: T) => void | (() => void)) {
11
12
  this._listeners.push(listener);
12
13
  const unsubscribe = () => {
13
14
  const index = this._listeners.indexOf(listener);