@douyinfe/semi-foundation 2.59.0 → 2.60.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.
@@ -283,6 +283,11 @@ $colors: 'amber', 'blue', 'cyan', 'green', 'grey', 'indigo', 'light-blue', 'ligh
283
283
  border-radius: var(--semi-border-radius-circle);
284
284
  line-height:normal;
285
285
  }
286
+ &-shape_circle-extra-small{
287
+ width:$width-avatar-bottom_slot_circle_extra_small;
288
+ height:$width-avatar-bottom_slot_circle_extra_small;
289
+ font-size: $font-avatar_bottom_slot-extra_small-fontSize;
290
+ }
286
291
  &-shape_circle-small{
287
292
  width:$width-avatar-bottom_slot_circle_small;
288
293
  height:$width-avatar-bottom_slot_circle_small;
@@ -324,6 +329,11 @@ $colors: 'amber', 'blue', 'cyan', 'green', 'grey', 'indigo', 'light-blue', 'ligh
324
329
  border-color: $color-avatar-bottom_slot_square-border;
325
330
  }
326
331
 
332
+ &-shape_square-extra_small{
333
+ font-size: $font-avatar_bottom_slot-extra_small-fontSize;
334
+ border-width: $width-avatar-bottom_slot_square_extra_small-border;
335
+ }
336
+
327
337
  &-shape_square-small{
328
338
  font-size: $font-avatar_bottom_slot-small-fontSize;
329
339
  border-width: $width-avatar-bottom_slot_square_small-border;
@@ -50,6 +50,7 @@ $width-avatar_additional-border: 1.5px; // 额外描边尺寸
50
50
  $color-avatar_additional-border: var(--semi-color-primary); // 额外描边颜色
51
51
  $spacing-avatar_additional-borderGap: 2px; // 额外描边与内侧间距
52
52
 
53
+ $width-avatar-bottom_slot_circle_extra_small: 12px; // extra small 头像底部 slot 圆形半径
53
54
  $width-avatar-bottom_slot_circle_small: 12px; // small 头像底部 slot 圆形半径
54
55
  $width-avatar-bottom_slot_circle_default: 16px; // default 头像底部 slot 圆形半径
55
56
  $width-avatar-bottom_slot_circle_medium: 18px; // medium 头像底部 slot 圆形半径
@@ -58,6 +59,7 @@ $width-avatar-bottom_slot_circle_extra_large: 28px; // extra large 头像底部
58
59
  $color-avatar-bottom_slot_bg:var(--semi-color-primary); // 头像底部 slot 背景色
59
60
 
60
61
  $radius-avatar-bottom_slot_square:4px; // 底部 slot square 圆角
62
+ $font-avatar_bottom_slot-extra_small-fontSize: 5px; // extra small 底部 slot 文字大小
61
63
  $font-avatar_bottom_slot-small-fontSize: 5px; // small 底部 slot 文字大小
62
64
  $font-avatar_bottom_slot-default-fontSize: 12px; // default 底部 slot 文字大小
63
65
  $font-avatar_bottom_slot-medium-fontSize: 12px; // medium 底部 slot 文字大小
@@ -79,6 +81,7 @@ $spacing-avatar-top_slot_large-content-marginTop: 0px; // large 顶部文字 mar
79
81
  $spacing-avatar-top_slot_extra_large-content-marginTop: 0px; // extra large 顶部文字 marginTop
80
82
 
81
83
  $color-avatar-bottom_slot_square-border:var(--semi-color-bg-0); // 底部 square 边框颜色
84
+ $width-avatar-bottom_slot_square_extra_small-border:2px; // small 头像底部 square 边框宽度
82
85
  $width-avatar-bottom_slot_square_small-border:2px; // small 头像底部 square 边框宽度
83
86
  $width-avatar-bottom_slot_square_default-border:2px; // default 头像底部 square 边框宽度
84
87
  $width-avatar-bottom_slot_square_medium-border:2px; // medium 头像底部 square 边框宽度
package/form/interface.ts CHANGED
@@ -36,22 +36,38 @@ export interface setValuesConfig {
36
36
  isOverride: boolean
37
37
  }
38
38
 
39
- type ExcludeStringNumberKeys<T> = {
40
- [K in keyof T as string extends K ? never : number extends K ? never : K]: T[K]
41
- }
42
-
43
- type CustomKeys<T> = { [K in keyof T]: string extends K ? never : number extends K ? never : K; } extends { [K in keyof T]: infer U } ? U : never;
44
-
45
- type FieldPath<T, K extends CustomKeys<T> = CustomKeys<T>> = K extends string ? T[K] extends Record<string, any> ? `${K}.${FieldPath<T[K], CustomKeys<T[K]>>}` | K : K : never;
39
+ // FieldPath 类型定义,用于生成对象字段的路径字符串
40
+ export type FieldPath<T> = T extends object ? {
41
+ // 遍历对象的每个键 K
42
+ [K in keyof T]: T[K] extends object
43
+ // 如果键 K 对应的值是对象,则生成嵌套路径(递归调用 FieldPath)
44
+ ? `${string & K}.${FieldPath<T[K]>}` | `${string & K}`
45
+ // 否则,仅生成当前键的路径
46
+ : `${string & K}`;
47
+ }[keyof T]
48
+ : never;
49
+
50
+ // FieldPathValue 类型定义,用于从路径字符串中推导出实际的类型
51
+ export type FieldPathValue<T, P extends FieldPath<T>> =
52
+ // 如果路径字符串 P 包含嵌套路径(使用模板字符串类型进行匹配)
53
+ P extends `${infer K}.${infer Rest}`
54
+ ? K extends keyof T
55
+ // 递归解析嵌套路径,逐层深入对象结构
56
+ ? Rest extends FieldPath<T[K]>
57
+ ? FieldPathValue<T[K], Rest>
58
+ : never
59
+ : never
60
+ // 如果路径字符串 P 是顶层键
61
+ : P extends keyof T
62
+ ? T[P]
63
+ : never;
46
64
 
47
65
  // use object replace Record<string, any>, fix issue 933
48
66
  export interface BaseFormApi<T extends object = any> {
49
- // export interface BaseFormApi<T extends object = any> {
50
67
  /** get value of field */
51
- getValue: <K extends keyof T>(field?: K) => T[K];
68
+ getValue: <P extends FieldPath<T>>(field?: P) => FieldPathValue<T, P>;
52
69
  /** set value of field */
53
- setValue: <K extends CustomKeys<T>>(field: FieldPath<T, K> | FieldPath<K>, newFieldValue: any) => void;
54
- // setValue: <K extends keyof T>(field: K, newFieldValue: T[K]) => void;
70
+ setValue: <K extends FieldPath<T>>(field: K, newFieldValue: any) => void;
55
71
  /** get error of field */
56
72
  getError: <K extends keyof T>(field: K) => any;
57
73
  /** set error of field */
package/input/input.scss CHANGED
@@ -61,7 +61,7 @@ $module: #{$prefix}-input;
61
61
 
62
62
  &-small {
63
63
  height: $height-input_wrapper_small;
64
- @include font-size-header-6;
64
+ @include font-size-regular;
65
65
  line-height: $height-input_small;
66
66
  }
67
67
 
@@ -236,6 +236,11 @@
236
236
  border-radius: var(--semi-border-radius-circle);
237
237
  line-height: normal;
238
238
  }
239
+ .semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-extra-small {
240
+ width: 12px;
241
+ height: 12px;
242
+ font-size: 5px;
243
+ }
239
244
  .semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-small {
240
245
  width: 12px;
241
246
  height: 12px;
@@ -272,6 +277,10 @@
272
277
  border-style: solid;
273
278
  border-color: var(--semi-color-bg-0);
274
279
  }
280
+ .semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-extra_small {
281
+ font-size: 5px;
282
+ border-width: 2px;
283
+ }
275
284
  .semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-small {
276
285
  font-size: 5px;
277
286
  border-width: 2px;
@@ -283,6 +283,11 @@ $colors: 'amber', 'blue', 'cyan', 'green', 'grey', 'indigo', 'light-blue', 'ligh
283
283
  border-radius: var(--semi-border-radius-circle);
284
284
  line-height:normal;
285
285
  }
286
+ &-shape_circle-extra-small{
287
+ width:$width-avatar-bottom_slot_circle_extra_small;
288
+ height:$width-avatar-bottom_slot_circle_extra_small;
289
+ font-size: $font-avatar_bottom_slot-extra_small-fontSize;
290
+ }
286
291
  &-shape_circle-small{
287
292
  width:$width-avatar-bottom_slot_circle_small;
288
293
  height:$width-avatar-bottom_slot_circle_small;
@@ -324,6 +329,11 @@ $colors: 'amber', 'blue', 'cyan', 'green', 'grey', 'indigo', 'light-blue', 'ligh
324
329
  border-color: $color-avatar-bottom_slot_square-border;
325
330
  }
326
331
 
332
+ &-shape_square-extra_small{
333
+ font-size: $font-avatar_bottom_slot-extra_small-fontSize;
334
+ border-width: $width-avatar-bottom_slot_square_extra_small-border;
335
+ }
336
+
327
337
  &-shape_square-small{
328
338
  font-size: $font-avatar_bottom_slot-small-fontSize;
329
339
  border-width: $width-avatar-bottom_slot_square_small-border;
@@ -50,6 +50,7 @@ $width-avatar_additional-border: 1.5px; // 额外描边尺寸
50
50
  $color-avatar_additional-border: var(--semi-color-primary); // 额外描边颜色
51
51
  $spacing-avatar_additional-borderGap: 2px; // 额外描边与内侧间距
52
52
 
53
+ $width-avatar-bottom_slot_circle_extra_small: 12px; // extra small 头像底部 slot 圆形半径
53
54
  $width-avatar-bottom_slot_circle_small: 12px; // small 头像底部 slot 圆形半径
54
55
  $width-avatar-bottom_slot_circle_default: 16px; // default 头像底部 slot 圆形半径
55
56
  $width-avatar-bottom_slot_circle_medium: 18px; // medium 头像底部 slot 圆形半径
@@ -58,6 +59,7 @@ $width-avatar-bottom_slot_circle_extra_large: 28px; // extra large 头像底部
58
59
  $color-avatar-bottom_slot_bg:var(--semi-color-primary); // 头像底部 slot 背景色
59
60
 
60
61
  $radius-avatar-bottom_slot_square:4px; // 底部 slot square 圆角
62
+ $font-avatar_bottom_slot-extra_small-fontSize: 5px; // extra small 底部 slot 文字大小
61
63
  $font-avatar_bottom_slot-small-fontSize: 5px; // small 底部 slot 文字大小
62
64
  $font-avatar_bottom_slot-default-fontSize: 12px; // default 底部 slot 文字大小
63
65
  $font-avatar_bottom_slot-medium-fontSize: 12px; // medium 底部 slot 文字大小
@@ -79,6 +81,7 @@ $spacing-avatar-top_slot_large-content-marginTop: 0px; // large 顶部文字 mar
79
81
  $spacing-avatar-top_slot_extra_large-content-marginTop: 0px; // extra large 顶部文字 marginTop
80
82
 
81
83
  $color-avatar-bottom_slot_square-border:var(--semi-color-bg-0); // 底部 square 边框颜色
84
+ $width-avatar-bottom_slot_square_extra_small-border:2px; // small 头像底部 square 边框宽度
82
85
  $width-avatar-bottom_slot_square_small-border:2px; // small 头像底部 square 边框宽度
83
86
  $width-avatar-bottom_slot_square_default-border:2px; // default 头像底部 square 边框宽度
84
87
  $width-avatar-bottom_slot_square_medium-border:2px; // medium 头像底部 square 边框宽度
@@ -31,17 +31,15 @@ export interface FormState<T extends Record<string, any> = any> {
31
31
  export interface setValuesConfig {
32
32
  isOverride: boolean;
33
33
  }
34
- type CustomKeys<T> = {
35
- [K in keyof T]: string extends K ? never : number extends K ? never : K;
36
- } extends {
37
- [K in keyof T]: infer U;
38
- } ? U : never;
39
- type FieldPath<T, K extends CustomKeys<T> = CustomKeys<T>> = K extends string ? T[K] extends Record<string, any> ? `${K}.${FieldPath<T[K], CustomKeys<T[K]>>}` | K : K : never;
34
+ export type FieldPath<T> = T extends object ? {
35
+ [K in keyof T]: T[K] extends object ? `${string & K}.${FieldPath<T[K]>}` | `${string & K}` : `${string & K}`;
36
+ }[keyof T] : never;
37
+ export type FieldPathValue<T, P extends FieldPath<T>> = P extends `${infer K}.${infer Rest}` ? K extends keyof T ? Rest extends FieldPath<T[K]> ? FieldPathValue<T[K], Rest> : never : never : P extends keyof T ? T[P] : never;
40
38
  export interface BaseFormApi<T extends object = any> {
41
39
  /** get value of field */
42
- getValue: <K extends keyof T>(field?: K) => T[K];
40
+ getValue: <P extends FieldPath<T>>(field?: P) => FieldPathValue<T, P>;
43
41
  /** set value of field */
44
- setValue: <K extends CustomKeys<T>>(field: FieldPath<T, K> | FieldPath<K>, newFieldValue: any) => void;
42
+ setValue: <K extends FieldPath<T>>(field: K, newFieldValue: any) => void;
45
43
  /** get error of field */
46
44
  getError: <K extends keyof T>(field: K) => any;
47
45
  /** set error of field */
@@ -128,4 +126,3 @@ export interface FormUpdaterContextType {
128
126
  getArrayField: (arrayField: string) => ArrayFieldStaff;
129
127
  updateArrayField: (arrayField: string, updateValue: any) => void;
130
128
  }
131
- export {};
@@ -50,8 +50,8 @@
50
50
  }
51
51
  .semi-input-wrapper-small {
52
52
  height: 24px;
53
- font-size: 16px;
54
- line-height: 22px;
53
+ font-size: 14px;
54
+ line-height: 20px;
55
55
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
56
56
  line-height: 22px;
57
57
  }
@@ -61,7 +61,7 @@ $module: #{$prefix}-input;
61
61
 
62
62
  &-small {
63
63
  height: $height-input_wrapper_small;
64
- @include font-size-header-6;
64
+ @include font-size-regular;
65
65
  line-height: $height-input_small;
66
66
  }
67
67
 
@@ -24,6 +24,7 @@
24
24
  color: var(--semi-color-primary);
25
25
  }
26
26
  .semi-spin-wrapper > svg {
27
+ display: inline;
27
28
  animation: 600ms linear infinite semi-animation-rotate;
28
29
  animation-fill-mode: forwards;
29
30
  vertical-align: top;
@@ -27,6 +27,7 @@ $module: #{$prefix}-spin;
27
27
  color: $color-spin-bg;
28
28
 
29
29
  & > svg {
30
+ display: inline;
30
31
  animation: $animation_duration-spin_wrapper-spin linear infinite #{$prefix}-animation-rotate;
31
32
  animation-fill-mode: forwards;
32
33
  vertical-align: top;
@@ -201,18 +201,18 @@
201
201
  .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start {
202
202
  margin-right: 4px;
203
203
  }
204
- .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start > .semi-button {
204
+ .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start > .semi-button[aria-disabled=false] {
205
205
  color: var(--semi-color-primary);
206
206
  padding: 8px;
207
207
  border: 0px solid transparent;
208
208
  background-color: transparent;
209
209
  }
210
- .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start > .semi-button:hover {
210
+ .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start > .semi-button[aria-disabled=false]:hover {
211
211
  background-color: var(--semi-color-fill-0);
212
212
  color: var(--semi-color-primary);
213
213
  border-color: transparent;
214
214
  }
215
- .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start > .semi-button:active {
215
+ .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start > .semi-button[aria-disabled=false]:active {
216
216
  background-color: var(--semi-color-fill-1);
217
217
  color: var(--semi-color-primary);
218
218
  border-color: transparent;
@@ -220,18 +220,18 @@
220
220
  .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end {
221
221
  margin-left: 4px;
222
222
  }
223
- .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end > .semi-button {
223
+ .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end > .semi-button[aria-disabled=false] {
224
224
  color: var(--semi-color-primary);
225
225
  padding: 8px;
226
226
  border: 0px solid transparent;
227
227
  background-color: transparent;
228
228
  }
229
- .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end > .semi-button:hover {
229
+ .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end > .semi-button[aria-disabled=false]:hover {
230
230
  background-color: var(--semi-color-fill-0);
231
231
  color: var(--semi-color-primary);
232
232
  border-color: transparent;
233
233
  }
234
- .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end > .semi-button:active {
234
+ .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end > .semi-button[aria-disabled=false]:active {
235
235
  background-color: var(--semi-color-fill-1);
236
236
  color: var(--semi-color-primary);
237
237
  border-color: transparent;
@@ -264,7 +264,7 @@ $ignoreIcon: '.#{$prefix}-icon-checkbox_tick, .#{$prefix}-icon-radio, .#{$prefix
264
264
 
265
265
  .#{$module}-bar-arrow-start {
266
266
  margin-right: $spacing-tabs_overflow_icon-marginRight;
267
- & > .#{$prefix}-button {
267
+ & > .#{$prefix}-button[aria-disabled=false] {
268
268
  color: $color-tabs_tab-pane_arrow-text-default;
269
269
  padding: $spacing-tabs_tab-pane_arrow;
270
270
  border: $width-tabs_tab-pane_arrow-border solid $color-tabs_tab-pane_arrow-border-default;
@@ -285,7 +285,7 @@ $ignoreIcon: '.#{$prefix}-icon-checkbox_tick, .#{$prefix}-icon-radio, .#{$prefix
285
285
 
286
286
  .#{$module}-bar-arrow-end {
287
287
  margin-left: $spacing-tabs_overflow_icon-marginLeft;
288
- & > .#{$prefix}-button {
288
+ & > .#{$prefix}-button[aria-disabled=false] {
289
289
  color: $color-tabs_tab-pane_arrow-text-default;
290
290
  padding: $spacing-tabs_tab-pane_arrow;
291
291
  border: $width-tabs_tab-pane_arrow-border solid $color-tabs_tab-pane_arrow-border-default;
@@ -16,6 +16,7 @@
16
16
  .semi-toast-wrapper .semi-toast-innerWrapper {
17
17
  width: fit-content;
18
18
  height: fit-content;
19
+ text-align: center;
19
20
  }
20
21
  .semi-toast-wrapper .semi-toast-innerWrapper-hover .semi-toast-zero-height-wrapper {
21
22
  perspective: unset;
@@ -18,6 +18,7 @@ $icon: #{$prefix}-toast-icon;
18
18
  .#{$module}-innerWrapper{
19
19
  width: fit-content;
20
20
  height: fit-content;
21
+ text-align: center;
21
22
  &-hover{
22
23
  .#{$module}-zero-height-wrapper{
23
24
  perspective: unset;
@@ -136,7 +136,7 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
136
136
  focusInput(bool: boolean): void;
137
137
  _notifyMultipleChange(key: string[], e: any): void;
138
138
  _notifyChange(key: any, e: any): void;
139
- _registerClickOutsideHandler: (e: any) => void;
139
+ _registerClickOutsideHandler: () => void;
140
140
  clearInputValue: () => void;
141
141
  _notifyFocus(e: any): void;
142
142
  handleTriggerFocus(e: any): void;
@@ -19,7 +19,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
19
19
  class TreeSelectFoundation extends _foundation.default {
20
20
  constructor(adapter) {
21
21
  super(Object.assign({}, adapter));
22
- this._registerClickOutsideHandler = e => {
22
+ this._registerClickOutsideHandler = () => {
23
23
  this._adapter.registerClickOutsideHandler(e => {
24
24
  this.handlerTriggerBlur(e);
25
25
  this.close(e);
@@ -41,11 +41,13 @@ class TreeSelectFoundation extends _foundation.default {
41
41
  const triggerSearch = searchPosition === _constants.strings.SEARCH_POSITION_TRIGGER && filterTreeNode;
42
42
  const triggerSearchAutoFocus = searchAutoFocus && triggerSearch;
43
43
  this._setDropdownWidth();
44
- const isOpen = (this.getProp('defaultOpen') || triggerSearchAutoFocus) && !this._isDisabled();
44
+ const able = !this._isDisabled();
45
+ const isOpen = (this.getProp('defaultOpen') || triggerSearchAutoFocus) && able;
45
46
  if (isOpen) {
46
47
  this.open();
48
+ this._registerClickOutsideHandler();
47
49
  }
48
- if (triggerSearchAutoFocus) {
50
+ if (triggerSearchAutoFocus && able) {
49
51
  this.handleTriggerFocus(null);
50
52
  }
51
53
  }
@@ -277,7 +279,7 @@ class TreeSelectFoundation extends _foundation.default {
277
279
  handleTriggerFocus(e) {
278
280
  this._adapter.updateIsFocus(true);
279
281
  this._notifyFocus(e);
280
- this._registerClickOutsideHandler(e);
282
+ this._registerClickOutsideHandler();
281
283
  }
282
284
  // Scenes that may trigger blur
283
285
  // 1、clickOutSide
@@ -287,6 +289,10 @@ class TreeSelectFoundation extends _foundation.default {
287
289
  this._adapter.notifyBlur(e);
288
290
  }
289
291
  handlerTriggerBlur(e) {
292
+ const isFocus = this.getState('isFocus');
293
+ if (!isFocus) {
294
+ return;
295
+ }
290
296
  this._adapter.updateIsFocus(false);
291
297
  this._notifyBlur(e);
292
298
  this._adapter.unregisterClickOutsideHandler();
@@ -236,6 +236,11 @@
236
236
  border-radius: var(--semi-border-radius-circle);
237
237
  line-height: normal;
238
238
  }
239
+ .semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-extra-small {
240
+ width: 12px;
241
+ height: 12px;
242
+ font-size: 5px;
243
+ }
239
244
  .semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-small {
240
245
  width: 12px;
241
246
  height: 12px;
@@ -272,6 +277,10 @@
272
277
  border-style: solid;
273
278
  border-color: var(--semi-color-bg-0);
274
279
  }
280
+ .semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-extra_small {
281
+ font-size: 5px;
282
+ border-width: 2px;
283
+ }
275
284
  .semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-small {
276
285
  font-size: 5px;
277
286
  border-width: 2px;
@@ -283,6 +283,11 @@ $colors: 'amber', 'blue', 'cyan', 'green', 'grey', 'indigo', 'light-blue', 'ligh
283
283
  border-radius: var(--semi-border-radius-circle);
284
284
  line-height:normal;
285
285
  }
286
+ &-shape_circle-extra-small{
287
+ width:$width-avatar-bottom_slot_circle_extra_small;
288
+ height:$width-avatar-bottom_slot_circle_extra_small;
289
+ font-size: $font-avatar_bottom_slot-extra_small-fontSize;
290
+ }
286
291
  &-shape_circle-small{
287
292
  width:$width-avatar-bottom_slot_circle_small;
288
293
  height:$width-avatar-bottom_slot_circle_small;
@@ -324,6 +329,11 @@ $colors: 'amber', 'blue', 'cyan', 'green', 'grey', 'indigo', 'light-blue', 'ligh
324
329
  border-color: $color-avatar-bottom_slot_square-border;
325
330
  }
326
331
 
332
+ &-shape_square-extra_small{
333
+ font-size: $font-avatar_bottom_slot-extra_small-fontSize;
334
+ border-width: $width-avatar-bottom_slot_square_extra_small-border;
335
+ }
336
+
327
337
  &-shape_square-small{
328
338
  font-size: $font-avatar_bottom_slot-small-fontSize;
329
339
  border-width: $width-avatar-bottom_slot_square_small-border;
@@ -50,6 +50,7 @@ $width-avatar_additional-border: 1.5px; // 额外描边尺寸
50
50
  $color-avatar_additional-border: var(--semi-color-primary); // 额外描边颜色
51
51
  $spacing-avatar_additional-borderGap: 2px; // 额外描边与内侧间距
52
52
 
53
+ $width-avatar-bottom_slot_circle_extra_small: 12px; // extra small 头像底部 slot 圆形半径
53
54
  $width-avatar-bottom_slot_circle_small: 12px; // small 头像底部 slot 圆形半径
54
55
  $width-avatar-bottom_slot_circle_default: 16px; // default 头像底部 slot 圆形半径
55
56
  $width-avatar-bottom_slot_circle_medium: 18px; // medium 头像底部 slot 圆形半径
@@ -58,6 +59,7 @@ $width-avatar-bottom_slot_circle_extra_large: 28px; // extra large 头像底部
58
59
  $color-avatar-bottom_slot_bg:var(--semi-color-primary); // 头像底部 slot 背景色
59
60
 
60
61
  $radius-avatar-bottom_slot_square:4px; // 底部 slot square 圆角
62
+ $font-avatar_bottom_slot-extra_small-fontSize: 5px; // extra small 底部 slot 文字大小
61
63
  $font-avatar_bottom_slot-small-fontSize: 5px; // small 底部 slot 文字大小
62
64
  $font-avatar_bottom_slot-default-fontSize: 12px; // default 底部 slot 文字大小
63
65
  $font-avatar_bottom_slot-medium-fontSize: 12px; // medium 底部 slot 文字大小
@@ -79,6 +81,7 @@ $spacing-avatar-top_slot_large-content-marginTop: 0px; // large 顶部文字 mar
79
81
  $spacing-avatar-top_slot_extra_large-content-marginTop: 0px; // extra large 顶部文字 marginTop
80
82
 
81
83
  $color-avatar-bottom_slot_square-border:var(--semi-color-bg-0); // 底部 square 边框颜色
84
+ $width-avatar-bottom_slot_square_extra_small-border:2px; // small 头像底部 square 边框宽度
82
85
  $width-avatar-bottom_slot_square_small-border:2px; // small 头像底部 square 边框宽度
83
86
  $width-avatar-bottom_slot_square_default-border:2px; // default 头像底部 square 边框宽度
84
87
  $width-avatar-bottom_slot_square_medium-border:2px; // medium 头像底部 square 边框宽度
@@ -31,17 +31,15 @@ export interface FormState<T extends Record<string, any> = any> {
31
31
  export interface setValuesConfig {
32
32
  isOverride: boolean;
33
33
  }
34
- type CustomKeys<T> = {
35
- [K in keyof T]: string extends K ? never : number extends K ? never : K;
36
- } extends {
37
- [K in keyof T]: infer U;
38
- } ? U : never;
39
- type FieldPath<T, K extends CustomKeys<T> = CustomKeys<T>> = K extends string ? T[K] extends Record<string, any> ? `${K}.${FieldPath<T[K], CustomKeys<T[K]>>}` | K : K : never;
34
+ export type FieldPath<T> = T extends object ? {
35
+ [K in keyof T]: T[K] extends object ? `${string & K}.${FieldPath<T[K]>}` | `${string & K}` : `${string & K}`;
36
+ }[keyof T] : never;
37
+ export type FieldPathValue<T, P extends FieldPath<T>> = P extends `${infer K}.${infer Rest}` ? K extends keyof T ? Rest extends FieldPath<T[K]> ? FieldPathValue<T[K], Rest> : never : never : P extends keyof T ? T[P] : never;
40
38
  export interface BaseFormApi<T extends object = any> {
41
39
  /** get value of field */
42
- getValue: <K extends keyof T>(field?: K) => T[K];
40
+ getValue: <P extends FieldPath<T>>(field?: P) => FieldPathValue<T, P>;
43
41
  /** set value of field */
44
- setValue: <K extends CustomKeys<T>>(field: FieldPath<T, K> | FieldPath<K>, newFieldValue: any) => void;
42
+ setValue: <K extends FieldPath<T>>(field: K, newFieldValue: any) => void;
45
43
  /** get error of field */
46
44
  getError: <K extends keyof T>(field: K) => any;
47
45
  /** set error of field */
@@ -128,4 +126,3 @@ export interface FormUpdaterContextType {
128
126
  getArrayField: (arrayField: string) => ArrayFieldStaff;
129
127
  updateArrayField: (arrayField: string, updateValue: any) => void;
130
128
  }
131
- export {};
@@ -50,8 +50,8 @@
50
50
  }
51
51
  .semi-input-wrapper-small {
52
52
  height: 24px;
53
- font-size: 16px;
54
- line-height: 22px;
53
+ font-size: 14px;
54
+ line-height: 20px;
55
55
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
56
56
  line-height: 22px;
57
57
  }
@@ -61,7 +61,7 @@ $module: #{$prefix}-input;
61
61
 
62
62
  &-small {
63
63
  height: $height-input_wrapper_small;
64
- @include font-size-header-6;
64
+ @include font-size-regular;
65
65
  line-height: $height-input_small;
66
66
  }
67
67
 
@@ -24,6 +24,7 @@
24
24
  color: var(--semi-color-primary);
25
25
  }
26
26
  .semi-spin-wrapper > svg {
27
+ display: inline;
27
28
  animation: 600ms linear infinite semi-animation-rotate;
28
29
  animation-fill-mode: forwards;
29
30
  vertical-align: top;
@@ -27,6 +27,7 @@ $module: #{$prefix}-spin;
27
27
  color: $color-spin-bg;
28
28
 
29
29
  & > svg {
30
+ display: inline;
30
31
  animation: $animation_duration-spin_wrapper-spin linear infinite #{$prefix}-animation-rotate;
31
32
  animation-fill-mode: forwards;
32
33
  vertical-align: top;
@@ -201,18 +201,18 @@
201
201
  .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start {
202
202
  margin-right: 4px;
203
203
  }
204
- .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start > .semi-button {
204
+ .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start > .semi-button[aria-disabled=false] {
205
205
  color: var(--semi-color-primary);
206
206
  padding: 8px;
207
207
  border: 0px solid transparent;
208
208
  background-color: transparent;
209
209
  }
210
- .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start > .semi-button:hover {
210
+ .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start > .semi-button[aria-disabled=false]:hover {
211
211
  background-color: var(--semi-color-fill-0);
212
212
  color: var(--semi-color-primary);
213
213
  border-color: transparent;
214
214
  }
215
- .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start > .semi-button:active {
215
+ .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start > .semi-button[aria-disabled=false]:active {
216
216
  background-color: var(--semi-color-fill-1);
217
217
  color: var(--semi-color-primary);
218
218
  border-color: transparent;
@@ -220,18 +220,18 @@
220
220
  .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end {
221
221
  margin-left: 4px;
222
222
  }
223
- .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end > .semi-button {
223
+ .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end > .semi-button[aria-disabled=false] {
224
224
  color: var(--semi-color-primary);
225
225
  padding: 8px;
226
226
  border: 0px solid transparent;
227
227
  background-color: transparent;
228
228
  }
229
- .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end > .semi-button:hover {
229
+ .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end > .semi-button[aria-disabled=false]:hover {
230
230
  background-color: var(--semi-color-fill-0);
231
231
  color: var(--semi-color-primary);
232
232
  border-color: transparent;
233
233
  }
234
- .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end > .semi-button:active {
234
+ .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end > .semi-button[aria-disabled=false]:active {
235
235
  background-color: var(--semi-color-fill-1);
236
236
  color: var(--semi-color-primary);
237
237
  border-color: transparent;
@@ -264,7 +264,7 @@ $ignoreIcon: '.#{$prefix}-icon-checkbox_tick, .#{$prefix}-icon-radio, .#{$prefix
264
264
 
265
265
  .#{$module}-bar-arrow-start {
266
266
  margin-right: $spacing-tabs_overflow_icon-marginRight;
267
- & > .#{$prefix}-button {
267
+ & > .#{$prefix}-button[aria-disabled=false] {
268
268
  color: $color-tabs_tab-pane_arrow-text-default;
269
269
  padding: $spacing-tabs_tab-pane_arrow;
270
270
  border: $width-tabs_tab-pane_arrow-border solid $color-tabs_tab-pane_arrow-border-default;
@@ -285,7 +285,7 @@ $ignoreIcon: '.#{$prefix}-icon-checkbox_tick, .#{$prefix}-icon-radio, .#{$prefix
285
285
 
286
286
  .#{$module}-bar-arrow-end {
287
287
  margin-left: $spacing-tabs_overflow_icon-marginLeft;
288
- & > .#{$prefix}-button {
288
+ & > .#{$prefix}-button[aria-disabled=false] {
289
289
  color: $color-tabs_tab-pane_arrow-text-default;
290
290
  padding: $spacing-tabs_tab-pane_arrow;
291
291
  border: $width-tabs_tab-pane_arrow-border solid $color-tabs_tab-pane_arrow-border-default;
@@ -16,6 +16,7 @@
16
16
  .semi-toast-wrapper .semi-toast-innerWrapper {
17
17
  width: fit-content;
18
18
  height: fit-content;
19
+ text-align: center;
19
20
  }
20
21
  .semi-toast-wrapper .semi-toast-innerWrapper-hover .semi-toast-zero-height-wrapper {
21
22
  perspective: unset;
@@ -18,6 +18,7 @@ $icon: #{$prefix}-toast-icon;
18
18
  .#{$module}-innerWrapper{
19
19
  width: fit-content;
20
20
  height: fit-content;
21
+ text-align: center;
21
22
  &-hover{
22
23
  .#{$module}-zero-height-wrapper{
23
24
  perspective: unset;
@@ -136,7 +136,7 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
136
136
  focusInput(bool: boolean): void;
137
137
  _notifyMultipleChange(key: string[], e: any): void;
138
138
  _notifyChange(key: any, e: any): void;
139
- _registerClickOutsideHandler: (e: any) => void;
139
+ _registerClickOutsideHandler: () => void;
140
140
  clearInputValue: () => void;
141
141
  _notifyFocus(e: any): void;
142
142
  handleTriggerFocus(e: any): void;
@@ -12,7 +12,7 @@ import isEnterPress from '../utils/isEnterPress';
12
12
  export default class TreeSelectFoundation extends BaseFoundation {
13
13
  constructor(adapter) {
14
14
  super(Object.assign({}, adapter));
15
- this._registerClickOutsideHandler = e => {
15
+ this._registerClickOutsideHandler = () => {
16
16
  this._adapter.registerClickOutsideHandler(e => {
17
17
  this.handlerTriggerBlur(e);
18
18
  this.close(e);
@@ -34,11 +34,13 @@ export default class TreeSelectFoundation extends BaseFoundation {
34
34
  const triggerSearch = searchPosition === strings.SEARCH_POSITION_TRIGGER && filterTreeNode;
35
35
  const triggerSearchAutoFocus = searchAutoFocus && triggerSearch;
36
36
  this._setDropdownWidth();
37
- const isOpen = (this.getProp('defaultOpen') || triggerSearchAutoFocus) && !this._isDisabled();
37
+ const able = !this._isDisabled();
38
+ const isOpen = (this.getProp('defaultOpen') || triggerSearchAutoFocus) && able;
38
39
  if (isOpen) {
39
40
  this.open();
41
+ this._registerClickOutsideHandler();
40
42
  }
41
- if (triggerSearchAutoFocus) {
43
+ if (triggerSearchAutoFocus && able) {
42
44
  this.handleTriggerFocus(null);
43
45
  }
44
46
  }
@@ -270,7 +272,7 @@ export default class TreeSelectFoundation extends BaseFoundation {
270
272
  handleTriggerFocus(e) {
271
273
  this._adapter.updateIsFocus(true);
272
274
  this._notifyFocus(e);
273
- this._registerClickOutsideHandler(e);
275
+ this._registerClickOutsideHandler();
274
276
  }
275
277
  // Scenes that may trigger blur
276
278
  // 1、clickOutSide
@@ -280,6 +282,10 @@ export default class TreeSelectFoundation extends BaseFoundation {
280
282
  this._adapter.notifyBlur(e);
281
283
  }
282
284
  handlerTriggerBlur(e) {
285
+ const isFocus = this.getState('isFocus');
286
+ if (!isFocus) {
287
+ return;
288
+ }
283
289
  this._adapter.updateIsFocus(false);
284
290
  this._notifyBlur(e);
285
291
  this._adapter.unregisterClickOutsideHandler();
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@douyinfe/semi-foundation",
3
- "version": "2.59.0",
3
+ "version": "2.60.0-beta.0",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "build:lib": "node ./scripts/compileLib.js",
7
7
  "prepublishOnly": "npm run build:lib"
8
8
  },
9
9
  "dependencies": {
10
- "@douyinfe/semi-animation": "2.59.0",
10
+ "@douyinfe/semi-animation": "2.60.0-beta.0",
11
11
  "async-validator": "^3.5.0",
12
12
  "classnames": "^2.2.6",
13
13
  "date-fns": "^2.29.3",
@@ -24,7 +24,7 @@
24
24
  "*.scss",
25
25
  "*.css"
26
26
  ],
27
- "gitHead": "b9a08d8581277fdc6ae9c33cdfc78b39938e5de1",
27
+ "gitHead": "4091f5bc7f66ef4668aeb0c95ae64ef6bea70393",
28
28
  "devDependencies": {
29
29
  "@babel/plugin-transform-runtime": "^7.15.8",
30
30
  "@babel/preset-env": "^7.15.8",
package/spin/spin.scss CHANGED
@@ -27,6 +27,7 @@ $module: #{$prefix}-spin;
27
27
  color: $color-spin-bg;
28
28
 
29
29
  & > svg {
30
+ display: inline;
30
31
  animation: $animation_duration-spin_wrapper-spin linear infinite #{$prefix}-animation-rotate;
31
32
  animation-fill-mode: forwards;
32
33
  vertical-align: top;
package/tabs/tabs.scss CHANGED
@@ -264,7 +264,7 @@ $ignoreIcon: '.#{$prefix}-icon-checkbox_tick, .#{$prefix}-icon-radio, .#{$prefix
264
264
 
265
265
  .#{$module}-bar-arrow-start {
266
266
  margin-right: $spacing-tabs_overflow_icon-marginRight;
267
- & > .#{$prefix}-button {
267
+ & > .#{$prefix}-button[aria-disabled=false] {
268
268
  color: $color-tabs_tab-pane_arrow-text-default;
269
269
  padding: $spacing-tabs_tab-pane_arrow;
270
270
  border: $width-tabs_tab-pane_arrow-border solid $color-tabs_tab-pane_arrow-border-default;
@@ -285,7 +285,7 @@ $ignoreIcon: '.#{$prefix}-icon-checkbox_tick, .#{$prefix}-icon-radio, .#{$prefix
285
285
 
286
286
  .#{$module}-bar-arrow-end {
287
287
  margin-left: $spacing-tabs_overflow_icon-marginLeft;
288
- & > .#{$prefix}-button {
288
+ & > .#{$prefix}-button[aria-disabled=false] {
289
289
  color: $color-tabs_tab-pane_arrow-text-default;
290
290
  padding: $spacing-tabs_tab-pane_arrow;
291
291
  border: $width-tabs_tab-pane_arrow-border solid $color-tabs_tab-pane_arrow-border-default;
package/toast/toast.scss CHANGED
@@ -18,6 +18,7 @@ $icon: #{$prefix}-toast-icon;
18
18
  .#{$module}-innerWrapper{
19
19
  width: fit-content;
20
20
  height: fit-content;
21
+ text-align: center;
21
22
  &-hover{
22
23
  .#{$module}-zero-height-wrapper{
23
24
  perspective: unset;
@@ -215,11 +215,13 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
215
215
  const triggerSearch = searchPosition === strings.SEARCH_POSITION_TRIGGER && filterTreeNode;
216
216
  const triggerSearchAutoFocus = searchAutoFocus && triggerSearch;
217
217
  this._setDropdownWidth();
218
- const isOpen = (this.getProp('defaultOpen') || triggerSearchAutoFocus) && !this._isDisabled();
218
+ const able = !this._isDisabled();
219
+ const isOpen = (this.getProp('defaultOpen') || triggerSearchAutoFocus) && able;
219
220
  if (isOpen) {
220
221
  this.open();
222
+ this._registerClickOutsideHandler();
221
223
  }
222
- if (triggerSearchAutoFocus) {
224
+ if (triggerSearchAutoFocus && able) {
223
225
  this.handleTriggerFocus(null);
224
226
  }
225
227
  }
@@ -429,7 +431,7 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
429
431
  }
430
432
  }
431
433
 
432
- _registerClickOutsideHandler = (e) => {
434
+ _registerClickOutsideHandler = () => {
433
435
  this._adapter.registerClickOutsideHandler(e => {
434
436
  this.handlerTriggerBlur(e);
435
437
  this.close(e);
@@ -450,7 +452,7 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
450
452
  handleTriggerFocus(e: any) {
451
453
  this._adapter.updateIsFocus(true);
452
454
  this._notifyFocus(e);
453
- this._registerClickOutsideHandler(e);
455
+ this._registerClickOutsideHandler();
454
456
  }
455
457
 
456
458
  // Scenes that may trigger blur
@@ -462,6 +464,10 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
462
464
  }
463
465
 
464
466
  handlerTriggerBlur(e) {
467
+ const isFocus = this.getState('isFocus');
468
+ if (!isFocus) {
469
+ return;
470
+ }
465
471
  this._adapter.updateIsFocus(false);
466
472
  this._notifyBlur(e);
467
473
  this._adapter.unregisterClickOutsideHandler();