@tiny-design/react 1.3.0 → 1.4.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 (41) hide show
  1. package/es/button/style/_index.scss +16 -11
  2. package/es/button/style/index.css +26 -5
  3. package/es/pop-confirm/style/_index.scss +4 -0
  4. package/es/pop-confirm/style/index.css +4 -0
  5. package/es/slider/style/_index.scss +1 -9
  6. package/es/slider/style/index.css +1 -6
  7. package/es/speed-dial/style/_index.scss +6 -7
  8. package/es/speed-dial/style/index.css +5 -5
  9. package/es/style/base.css +24 -3
  10. package/es/tag/style/_index.scss +24 -0
  11. package/es/tag/style/index.css +20 -0
  12. package/es/tag/types.d.ts +2 -1
  13. package/es/tag/types.js +7 -2
  14. package/es/tag/types.js.map +1 -1
  15. package/es/time-picker/style/_index.scss +13 -0
  16. package/es/time-picker/style/index.css +10 -0
  17. package/es/time-picker/time-panel.js +28 -28
  18. package/es/time-picker/time-panel.js.map +1 -1
  19. package/es/time-picker/time-picker.js +50 -29
  20. package/es/time-picker/time-picker.js.map +1 -1
  21. package/lib/button/style/_index.scss +16 -11
  22. package/lib/button/style/index.css +26 -5
  23. package/lib/pop-confirm/style/_index.scss +4 -0
  24. package/lib/pop-confirm/style/index.css +4 -0
  25. package/lib/slider/style/_index.scss +1 -9
  26. package/lib/slider/style/index.css +1 -6
  27. package/lib/speed-dial/style/_index.scss +6 -7
  28. package/lib/speed-dial/style/index.css +5 -5
  29. package/lib/style/base.css +24 -3
  30. package/lib/tag/style/_index.scss +24 -0
  31. package/lib/tag/style/index.css +20 -0
  32. package/lib/tag/types.d.ts +2 -1
  33. package/lib/tag/types.js +7 -2
  34. package/lib/tag/types.js.map +1 -1
  35. package/lib/time-picker/style/_index.scss +13 -0
  36. package/lib/time-picker/style/index.css +10 -0
  37. package/lib/time-picker/time-panel.js +28 -28
  38. package/lib/time-picker/time-panel.js.map +1 -1
  39. package/lib/time-picker/time-picker.js +50 -29
  40. package/lib/time-picker/time-picker.js.map +1 -1
  41. package/package.json +3 -3
@@ -24,7 +24,7 @@ $btn-prefix: #{$prefix}-btn;
24
24
  line-height: $btn-line-height;
25
25
 
26
26
  &__loader {
27
- @include loader();
27
+ @include loader;
28
28
  }
29
29
 
30
30
  &__icon-container, &__loader {
@@ -91,19 +91,27 @@ $btn-prefix: #{$prefix}-btn;
91
91
  }
92
92
 
93
93
  &_info {
94
- @include button-style(#fff, var(--ty-color-info), var(--ty-color-info));
94
+ @include button-style(#fff, var(--ty-color-info), var(--ty-color-info),
95
+ var(--ty-color-info-hover), var(--ty-color-info-hover), #fff,
96
+ var(--ty-color-info-active), var(--ty-color-info-active), #fff);
95
97
  }
96
98
 
97
99
  &_success {
98
- @include button-style(#fff, var(--ty-color-success), var(--ty-color-success));
100
+ @include button-style(#fff, var(--ty-color-success), var(--ty-color-success),
101
+ var(--ty-color-success-hover), var(--ty-color-success-hover), #fff,
102
+ var(--ty-color-success-active), var(--ty-color-success-active), #fff);
99
103
  }
100
104
 
101
105
  &_warning {
102
- @include button-style(#fff, var(--ty-color-warning), var(--ty-color-warning));
106
+ @include button-style(#fff, var(--ty-color-warning), var(--ty-color-warning),
107
+ var(--ty-color-warning-hover), var(--ty-color-warning-hover), #fff,
108
+ var(--ty-color-warning-active), var(--ty-color-warning-active), #fff);
103
109
  }
104
110
 
105
111
  &_danger {
106
- @include button-style(#fff, var(--ty-color-danger), var(--ty-color-danger));
112
+ @include button-style(#fff, var(--ty-color-danger), var(--ty-color-danger),
113
+ var(--ty-color-danger-hover), var(--ty-color-danger-hover), #fff,
114
+ var(--ty-color-danger-active), var(--ty-color-danger-active), #fff);
107
115
  }
108
116
 
109
117
  // Sizes
@@ -135,13 +143,10 @@ $btn-prefix: #{$prefix}-btn;
135
143
  position: relative;
136
144
  pointer-events: none;
137
145
 
138
- &:before {
146
+ &::before {
139
147
  content: '';
140
148
  position: absolute;
141
- top: -1px;
142
- right: -1px;
143
- bottom: -1px;
144
- left: -1px;
149
+ inset: -1px;
145
150
  z-index: 1;
146
151
  display: block;
147
152
  background: var(--ty-btn-loading-bg);
@@ -208,7 +213,7 @@ $btn-prefix: #{$prefix}-btn;
208
213
  &_danger {
209
214
  .#{$btn-prefix} {
210
215
  &:not(:first-child) {
211
- border-left-color: rgba(255, 255, 255, 0.2);
216
+ border-left-color: rgb(255 255 255 / 20%);
212
217
  }
213
218
  }
214
219
  }
@@ -212,13 +212,19 @@
212
212
  }
213
213
  .ty-btn_info:hover {
214
214
  color: #fff;
215
+ background: var(--ty-color-info-hover);
216
+ border-color: var(--ty-color-info-hover);
215
217
  }
216
218
  .ty-btn_info:focus {
217
219
  color: #fff;
220
+ background: var(--ty-color-info-hover);
221
+ border-color: var(--ty-color-info-hover);
218
222
  z-index: 1;
219
223
  }
220
224
  .ty-btn_info:active {
221
225
  color: #fff;
226
+ background: var(--ty-color-info-active);
227
+ border-color: var(--ty-color-info-active);
222
228
  }
223
229
  .ty-btn_info:disabled {
224
230
  color: var(--ty-btn-disabled-color);
@@ -232,13 +238,19 @@
232
238
  }
233
239
  .ty-btn_success:hover {
234
240
  color: #fff;
241
+ background: var(--ty-color-success-hover);
242
+ border-color: var(--ty-color-success-hover);
235
243
  }
236
244
  .ty-btn_success:focus {
237
245
  color: #fff;
246
+ background: var(--ty-color-success-hover);
247
+ border-color: var(--ty-color-success-hover);
238
248
  z-index: 1;
239
249
  }
240
250
  .ty-btn_success:active {
241
251
  color: #fff;
252
+ background: var(--ty-color-success-active);
253
+ border-color: var(--ty-color-success-active);
242
254
  }
243
255
  .ty-btn_success:disabled {
244
256
  color: var(--ty-btn-disabled-color);
@@ -252,13 +264,19 @@
252
264
  }
253
265
  .ty-btn_warning:hover {
254
266
  color: #fff;
267
+ background: var(--ty-color-warning-hover);
268
+ border-color: var(--ty-color-warning-hover);
255
269
  }
256
270
  .ty-btn_warning:focus {
257
271
  color: #fff;
272
+ background: var(--ty-color-warning-hover);
273
+ border-color: var(--ty-color-warning-hover);
258
274
  z-index: 1;
259
275
  }
260
276
  .ty-btn_warning:active {
261
277
  color: #fff;
278
+ background: var(--ty-color-warning-active);
279
+ border-color: var(--ty-color-warning-active);
262
280
  }
263
281
  .ty-btn_warning:disabled {
264
282
  color: var(--ty-btn-disabled-color);
@@ -272,13 +290,19 @@
272
290
  }
273
291
  .ty-btn_danger:hover {
274
292
  color: #fff;
293
+ background: var(--ty-color-danger-hover);
294
+ border-color: var(--ty-color-danger-hover);
275
295
  }
276
296
  .ty-btn_danger:focus {
277
297
  color: #fff;
298
+ background: var(--ty-color-danger-hover);
299
+ border-color: var(--ty-color-danger-hover);
278
300
  z-index: 1;
279
301
  }
280
302
  .ty-btn_danger:active {
281
303
  color: #fff;
304
+ background: var(--ty-color-danger-active);
305
+ border-color: var(--ty-color-danger-active);
282
306
  }
283
307
  .ty-btn_danger:disabled {
284
308
  color: var(--ty-btn-disabled-color);
@@ -313,13 +337,10 @@
313
337
  position: relative;
314
338
  pointer-events: none;
315
339
  }
316
- .ty-btn_loading:before {
340
+ .ty-btn_loading::before {
317
341
  content: "";
318
342
  position: absolute;
319
- top: -1px;
320
- right: -1px;
321
- bottom: -1px;
322
- left: -1px;
343
+ inset: -1px;
323
344
  z-index: 1;
324
345
  display: block;
325
346
  background: var(--ty-btn-loading-bg);
@@ -15,6 +15,10 @@
15
15
  }
16
16
 
17
17
  &__buttons {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: flex-end;
21
+ gap: 8px;
18
22
  text-align: right;
19
23
  }
20
24
 
@@ -11,6 +11,10 @@
11
11
  align-items: center;
12
12
  }
13
13
  .ty-pop-confirm__buttons {
14
+ display: flex;
15
+ align-items: center;
16
+ justify-content: flex-end;
17
+ gap: 8px;
14
18
  text-align: right;
15
19
  }
16
20
  .ty-pop-confirm__title {
@@ -5,21 +5,13 @@
5
5
  box-sizing: border-box;
6
6
  cursor: pointer;
7
7
 
8
- &_horizontal.#{$prefix}-slider {
9
- margin-bottom: $slider-margin-bottom-with-marks;
10
- }
11
-
12
- &_vertical.#{$prefix}-slider {
13
- margin-right: $slider-margin-bottom-with-marks;
14
- }
15
-
16
8
  &_horizontal {
9
+ width: 100%;
17
10
  min-height: $slider-size;
18
11
  margin: 13px 7px;
19
12
  padding: 4px 0;
20
13
 
21
14
  .#{$prefix}-slider {
22
-
23
15
  &__rail {
24
16
  width: 100%;
25
17
  height: $slider-track-size;
@@ -3,13 +3,8 @@
3
3
  box-sizing: border-box;
4
4
  cursor: pointer;
5
5
  }
6
- .ty-slider_horizontal.ty-slider {
7
- margin-bottom: 30px;
8
- }
9
- .ty-slider_vertical.ty-slider {
10
- margin-right: 30px;
11
- }
12
6
  .ty-slider_horizontal {
7
+ width: 100%;
13
8
  min-height: 12px;
14
9
  margin: 13px 7px;
15
10
  padding: 4px 0;
@@ -1,5 +1,4 @@
1
1
  @use "../../style/variables" as *;
2
- @use "sass:color";
3
2
 
4
3
  $speed-dial-fab-size: 56px;
5
4
  $speed-dial-action-size: 40px;
@@ -18,8 +17,8 @@ $speed-dial-actions-gap: 16px;
18
17
  height: $speed-dial-fab-size;
19
18
  border-radius: 50%;
20
19
  border: none;
21
- background-color: var(--ty-speed-dial-bg, #{$primary-color});
22
- color: var(--ty-speed-dial-color, #{$white-color});
20
+ background-color: var(--ty-speed-dial-bg, var(--ty-color-primary));
21
+ color: var(--ty-speed-dial-color, #fff);
23
22
  font-size: 24px;
24
23
  cursor: pointer;
25
24
  box-shadow: $box-shadow;
@@ -27,11 +26,11 @@ $speed-dial-actions-gap: 16px;
27
26
  outline: none;
28
27
 
29
28
  &:hover:not(.#{$prefix}-speed-dial__button_disabled) {
30
- background-color: var(--ty-speed-dial-bg-hover, #{color.adjust($primary-color, $lightness: -8%)});
29
+ background-color: var(--ty-speed-dial-bg-hover, var(--ty-color-primary-active));
31
30
  }
32
31
 
33
32
  &:focus-visible {
34
- box-shadow: 0 0 0 3px rgba($primary-color, 0.3), $box-shadow;
33
+ box-shadow: 0 0 0 3px var(--ty-input-focus-shadow, rgb(110 65 191 / 20%)), $box-shadow;
35
34
  }
36
35
 
37
36
  &_open {
@@ -59,7 +58,7 @@ $speed-dial-actions-gap: 16px;
59
58
  position: absolute;
60
59
  top: 50%;
61
60
  left: 50%;
62
- background-color: currentColor;
61
+ background-color: currentcolor;
63
62
  border-radius: 1px;
64
63
  translate: -50% -50%;
65
64
  }
@@ -183,7 +182,7 @@ $speed-dial-actions-gap: 16px;
183
182
  }
184
183
 
185
184
  &:focus-visible {
186
- box-shadow: 0 0 0 3px rgba($primary-color, 0.3), $box-shadow-sm;
185
+ box-shadow: 0 0 0 3px var(--ty-input-focus-shadow, rgb(110 65 191 / 20%)), $box-shadow-sm;
187
186
  }
188
187
 
189
188
  &_disabled {
@@ -10,7 +10,7 @@
10
10
  height: 56px;
11
11
  border-radius: 50%;
12
12
  border: none;
13
- background-color: var(--ty-speed-dial-bg, #6e41bf);
13
+ background-color: var(--ty-speed-dial-bg, var(--ty-color-primary));
14
14
  color: var(--ty-speed-dial-color, #fff);
15
15
  font-size: 24px;
16
16
  cursor: pointer;
@@ -19,10 +19,10 @@
19
19
  outline: none;
20
20
  }
21
21
  .ty-speed-dial__button:hover:not(.ty-speed-dial__button_disabled) {
22
- background-color: var(--ty-speed-dial-bg-hover, rgb(92.3496062992, 54.2236220472, 160.9763779528));
22
+ background-color: var(--ty-speed-dial-bg-hover, var(--ty-color-primary-active));
23
23
  }
24
24
  .ty-speed-dial__button:focus-visible {
25
- box-shadow: 0 0 0 3px rgba(110, 65, 191, 0.3), 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
25
+ box-shadow: 0 0 0 3px var(--ty-input-focus-shadow, rgba(110, 65, 191, 0.2)), 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
26
26
  }
27
27
  .ty-speed-dial__button_open .ty-speed-dial__icon-default {
28
28
  transform: rotate(45deg);
@@ -43,7 +43,7 @@
43
43
  position: absolute;
44
44
  top: 50%;
45
45
  left: 50%;
46
- background-color: currentColor;
46
+ background-color: currentcolor;
47
47
  border-radius: 1px;
48
48
  translate: -50% -50%;
49
49
  }
@@ -145,7 +145,7 @@
145
145
  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
146
146
  }
147
147
  .ty-speed-dial__action:focus-visible {
148
- box-shadow: 0 0 0 3px rgba(110, 65, 191, 0.3), 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
148
+ box-shadow: 0 0 0 3px var(--ty-input-focus-shadow, rgba(110, 65, 191, 0.2)), 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
149
149
  }
150
150
  .ty-speed-dial__action_disabled {
151
151
  opacity: 0.5;
package/es/style/base.css CHANGED
@@ -27,19 +27,26 @@
27
27
  --ty-color-fill-secondary: #f5f5f5;
28
28
  --ty-color-fill-tertiary: #f0f0f0;
29
29
  --ty-color-success: #52c41a;
30
+ --ty-color-success-hover: #73d13d;
31
+ --ty-color-success-active: #389e0d;
30
32
  --ty-color-success-bg: #f6ffed;
31
33
  --ty-color-success-border: #b7eb8f;
32
34
  --ty-color-success-text: #49b10e;
33
35
  --ty-color-warning: #ff9800;
36
+ --ty-color-warning-hover: #ffad33;
37
+ --ty-color-warning-active: #e68a00;
34
38
  --ty-color-warning-bg: #fffbe6;
35
39
  --ty-color-warning-border: #ffe58f;
36
40
  --ty-color-warning-text: #d48806;
37
41
  --ty-color-danger: #f44336;
42
+ --ty-color-danger-hover: #ff7875;
43
+ --ty-color-danger-active: #cf1322;
38
44
  --ty-color-danger-bg: #fff1f0;
39
45
  --ty-color-danger-border: #ffa39e;
40
46
  --ty-color-danger-text: #cf1322;
41
- --ty-color-danger-hover: #ff7875;
42
47
  --ty-color-info: #1890ff;
48
+ --ty-color-info-hover: #40a9ff;
49
+ --ty-color-info-active: #096dd9;
43
50
  --ty-color-info-bg: #e6f7ff;
44
51
  --ty-color-info-border: #91d5ff;
45
52
  --ty-color-info-text: #096dd9;
@@ -294,19 +301,26 @@ html[data-tiny-theme=dark] {
294
301
  --ty-color-fill-secondary: #2a2a2a;
295
302
  --ty-color-fill-tertiary: #303030;
296
303
  --ty-color-success: #49aa19;
304
+ --ty-color-success-hover: #6abe39;
305
+ --ty-color-success-active: #3c8c14;
297
306
  --ty-color-success-bg: #162312;
298
307
  --ty-color-success-border: #274916;
299
308
  --ty-color-success-text: #6abe39;
300
309
  --ty-color-warning: #d89614;
310
+ --ty-color-warning-hover: #e8b339;
311
+ --ty-color-warning-active: #b37a10;
301
312
  --ty-color-warning-bg: #2b2111;
302
313
  --ty-color-warning-border: #594214;
303
314
  --ty-color-warning-text: #e8b339;
304
315
  --ty-color-danger: #d32029;
316
+ --ty-color-danger-hover: #e84749;
317
+ --ty-color-danger-active: #ab1a20;
305
318
  --ty-color-danger-bg: #2a1215;
306
319
  --ty-color-danger-border: #58181c;
307
320
  --ty-color-danger-text: #e84749;
308
- --ty-color-danger-hover: #e84749;
309
321
  --ty-color-info: #177ddc;
322
+ --ty-color-info-hover: #3c9ae8;
323
+ --ty-color-info-active: #1268b3;
310
324
  --ty-color-info-bg: #111d2c;
311
325
  --ty-color-info-border: #15395b;
312
326
  --ty-color-info-text: #3c9ae8;
@@ -562,19 +576,26 @@ html[data-tiny-theme=dark] {
562
576
  --ty-color-fill-secondary: #2a2a2a;
563
577
  --ty-color-fill-tertiary: #303030;
564
578
  --ty-color-success: #49aa19;
579
+ --ty-color-success-hover: #6abe39;
580
+ --ty-color-success-active: #3c8c14;
565
581
  --ty-color-success-bg: #162312;
566
582
  --ty-color-success-border: #274916;
567
583
  --ty-color-success-text: #6abe39;
568
584
  --ty-color-warning: #d89614;
585
+ --ty-color-warning-hover: #e8b339;
586
+ --ty-color-warning-active: #b37a10;
569
587
  --ty-color-warning-bg: #2b2111;
570
588
  --ty-color-warning-border: #594214;
571
589
  --ty-color-warning-text: #e8b339;
572
590
  --ty-color-danger: #d32029;
591
+ --ty-color-danger-hover: #e84749;
592
+ --ty-color-danger-active: #ab1a20;
573
593
  --ty-color-danger-bg: #2a1215;
574
594
  --ty-color-danger-border: #58181c;
575
595
  --ty-color-danger-text: #e84749;
576
- --ty-color-danger-hover: #e84749;
577
596
  --ty-color-info: #177ddc;
597
+ --ty-color-info-hover: #3c9ae8;
598
+ --ty-color-info-active: #1268b3;
578
599
  --ty-color-info-bg: #111d2c;
579
600
  --ty-color-info-border: #15395b;
580
601
  --ty-color-info-text: #3c9ae8;
@@ -102,6 +102,30 @@
102
102
  background: var(--ty-tag-purple-bg);
103
103
  border-color: var(--ty-tag-purple-border);
104
104
  }
105
+
106
+ &_success {
107
+ color: var(--ty-color-success);
108
+ background: var(--ty-color-success-bg);
109
+ border-color: var(--ty-color-success-border);
110
+ }
111
+
112
+ &_info {
113
+ color: var(--ty-color-info);
114
+ background: var(--ty-color-info-bg);
115
+ border-color: var(--ty-color-info-border);
116
+ }
117
+
118
+ &_warning {
119
+ color: var(--ty-color-warning);
120
+ background: var(--ty-color-warning-bg);
121
+ border-color: var(--ty-color-warning-border);
122
+ }
123
+
124
+ &_danger {
125
+ color: var(--ty-color-danger);
126
+ background: var(--ty-color-danger-bg);
127
+ border-color: var(--ty-color-danger-border);
128
+ }
105
129
  }
106
130
 
107
131
  .#{$prefix}-checkable-tag {
@@ -88,6 +88,26 @@
88
88
  background: var(--ty-tag-purple-bg);
89
89
  border-color: var(--ty-tag-purple-border);
90
90
  }
91
+ .ty-tag_success {
92
+ color: var(--ty-color-success);
93
+ background: var(--ty-color-success-bg);
94
+ border-color: var(--ty-color-success-border);
95
+ }
96
+ .ty-tag_info {
97
+ color: var(--ty-color-info);
98
+ background: var(--ty-color-info-bg);
99
+ border-color: var(--ty-color-info-border);
100
+ }
101
+ .ty-tag_warning {
102
+ color: var(--ty-color-warning);
103
+ background: var(--ty-color-warning-bg);
104
+ border-color: var(--ty-color-warning-border);
105
+ }
106
+ .ty-tag_danger {
107
+ color: var(--ty-color-danger);
108
+ background: var(--ty-color-danger-bg);
109
+ border-color: var(--ty-color-danger-border);
110
+ }
91
111
 
92
112
  .ty-checkable-tag {
93
113
  background-color: var(--ty-tag-checkable-bg);
package/es/tag/types.d.ts CHANGED
@@ -8,8 +8,9 @@ interface CheckableTagProps extends BaseProps {
8
8
  onChange?: (checked: boolean, e: React.MouseEvent) => void;
9
9
  children?: React.ReactNode;
10
10
  }
11
+ type StatusColor = 'success' | 'warning' | 'info' | 'danger';
11
12
  interface TagProps extends BaseProps, React.PropsWithoutRef<JSX.IntrinsicElements['div']> {
12
- color?: string;
13
+ color?: string | StatusColor;
13
14
  closable?: boolean;
14
15
  onClose?: React.MouseEventHandler;
15
16
  onClick?: React.MouseEventHandler;
package/es/tag/types.js CHANGED
@@ -1,4 +1,3 @@
1
- //#region src/tag/types.ts
2
1
  const PresetColors = [
3
2
  "magenta",
4
3
  "red",
@@ -10,7 +9,13 @@ const PresetColors = [
10
9
  "cyan",
11
10
  "blue",
12
11
  "geekblue",
13
- "purple"
12
+ "purple",
13
+ ...[
14
+ "success",
15
+ "info",
16
+ "warning",
17
+ "danger"
18
+ ]
14
19
  ];
15
20
  //#endregion
16
21
  export { PresetColors };
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../src/tag/types.ts"],"sourcesContent":["import React from 'react';\nimport { BaseProps } from '../_utils/props';\n\nexport interface CheckableTagProps extends BaseProps {\n defaultChecked?: boolean;\n checked?: boolean;\n onChange?: (checked: boolean, e: React.MouseEvent) => void;\n children?: React.ReactNode;\n}\n\nexport const PresetColors = [\n 'magenta',\n 'red',\n 'volcano',\n 'orange',\n 'gold',\n 'lime',\n 'green',\n 'cyan',\n 'blue',\n 'geekblue',\n 'purple',\n];\n\nexport interface TagProps extends BaseProps, React.PropsWithoutRef<JSX.IntrinsicElements['div']> {\n color?: string;\n closable?: boolean;\n onClose?: React.MouseEventHandler;\n onClick?: React.MouseEventHandler;\n defaultVisible?: boolean;\n visible?: boolean;\n children?: React.ReactNode;\n}\n"],"mappings":";AAUA,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/tag/types.ts"],"sourcesContent":["import React from 'react';\nimport { BaseProps } from '../_utils/props';\n\nexport interface CheckableTagProps extends BaseProps {\n defaultChecked?: boolean;\n checked?: boolean;\n onChange?: (checked: boolean, e: React.MouseEvent) => void;\n children?: React.ReactNode;\n}\n\nexport type StatusColor = 'success' | 'warning' | 'info' | 'danger';\n\nexport const StatusColors: StatusColor[] = ['success', 'info', 'warning', 'danger'];\n\nexport const PresetColors = [\n 'magenta',\n 'red',\n 'volcano',\n 'orange',\n 'gold',\n 'lime',\n 'green',\n 'cyan',\n 'blue',\n 'geekblue',\n 'purple',\n ...StatusColors,\n];\n\nexport interface TagProps extends BaseProps, React.PropsWithoutRef<JSX.IntrinsicElements['div']> {\n color?: string | StatusColor;\n closable?: boolean;\n onClose?: React.MouseEventHandler;\n onClick?: React.MouseEventHandler;\n defaultVisible?: boolean;\n visible?: boolean;\n children?: React.ReactNode;\n}\n"],"mappings":"AAcA,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,GAdyC;EAAC;EAAW;EAAQ;EAAW;EAAS;CAelF"}
@@ -29,6 +29,10 @@ $tp: #{$prefix}-time-picker;
29
29
  box-shadow: var(--ty-input-focus-shadow);
30
30
  }
31
31
 
32
+ &_pending &__input-field {
33
+ color: var(--ty-color-text-tertiary);
34
+ }
35
+
32
36
  &__input-field {
33
37
  flex: 1;
34
38
  border: none;
@@ -191,6 +195,15 @@ $tp: #{$prefix}-time-picker;
191
195
  }
192
196
  }
193
197
 
198
+ &_pending {
199
+ background: var(--ty-color-primary-bg);
200
+ color: var(--ty-color-text-tertiary);
201
+
202
+ &:hover {
203
+ background: var(--ty-color-primary-bg-hover);
204
+ }
205
+ }
206
+
194
207
  &_disabled {
195
208
  color: var(--ty-color-text-quaternary);
196
209
  cursor: not-allowed;
@@ -21,6 +21,9 @@
21
21
  border-color: var(--ty-color-primary);
22
22
  box-shadow: var(--ty-input-focus-shadow);
23
23
  }
24
+ .ty-time-picker_pending .ty-time-picker__input-field {
25
+ color: var(--ty-color-text-tertiary);
26
+ }
24
27
  .ty-time-picker__input-field {
25
28
  flex: 1;
26
29
  border: none;
@@ -157,6 +160,13 @@
157
160
  .ty-time-picker__cell_selected:hover {
158
161
  background: var(--ty-color-primary-bg-hover);
159
162
  }
163
+ .ty-time-picker__cell_pending {
164
+ background: var(--ty-color-primary-bg);
165
+ color: var(--ty-color-text-tertiary);
166
+ }
167
+ .ty-time-picker__cell_pending:hover {
168
+ background: var(--ty-color-primary-bg-hover);
169
+ }
160
170
  .ty-time-picker__cell_disabled {
161
171
  color: var(--ty-color-text-quaternary);
162
172
  cursor: not-allowed;
@@ -4,14 +4,16 @@ import { jsx } from "react/jsx-runtime";
4
4
  //#region src/time-picker/time-panel.tsx
5
5
  const ITEM_HEIGHT = 28;
6
6
  const TimePanel = (props) => {
7
- const { prefixCls, value, items, disabledItems = [], loop = false, onChange } = props;
7
+ const { prefixCls, value, pendingValue, items, disabledItems = [], loop = false, onChange } = props;
8
8
  const panelRef = useRef(null);
9
9
  const itemRefs = useRef(/* @__PURE__ */ new Map());
10
10
  const isResetting = useRef(false);
11
11
  const clickedRef = useRef(false);
12
12
  const scrollToItemRef = useRef(null);
13
13
  const oneGroupHeight = items.length * ITEM_HEIGHT;
14
+ const displayValue = pendingValue ?? value;
14
15
  scrollToItemRef.current = (val) => {
16
+ if (val === null) return;
15
17
  const panel = panelRef.current;
16
18
  if (!panel) return;
17
19
  if (loop) {
@@ -39,8 +41,8 @@ const TimePanel = (props) => {
39
41
  clickedRef.current = false;
40
42
  return;
41
43
  }
42
- scrollToItemRef.current?.(value);
43
- }, [value]);
44
+ scrollToItemRef.current?.(displayValue);
45
+ }, [displayValue]);
44
46
  const handleScroll = useCallback(() => {
45
47
  if (!loop || isResetting.current) return;
46
48
  const panel = panelRef.current;
@@ -62,6 +64,16 @@ const TimePanel = (props) => {
62
64
  clickedRef.current = true;
63
65
  onChange(num);
64
66
  };
67
+ const isPending = pendingValue !== null;
68
+ const isCommitted = value !== null && pendingValue === null;
69
+ const cellCls = (num) => {
70
+ const isSelected = num === displayValue;
71
+ return classNames(`${prefixCls}__cell`, {
72
+ [`${prefixCls}__cell_selected`]: isSelected && isCommitted,
73
+ [`${prefixCls}__cell_pending`]: isSelected && isPending,
74
+ [`${prefixCls}__cell_disabled`]: disabledItems.includes(num)
75
+ });
76
+ };
65
77
  if (loop) return /* @__PURE__ */ jsx("div", {
66
78
  className: `${prefixCls}__column`,
67
79
  ref: panelRef,
@@ -72,17 +84,11 @@ const TimePanel = (props) => {
72
84
  0,
73
85
  1,
74
86
  2
75
- ].map((copyIdx) => items.map((num, i) => {
76
- const isDisabled = disabledItems.includes(num);
77
- return /* @__PURE__ */ jsx("li", {
78
- className: classNames(`${prefixCls}__cell`, {
79
- [`${prefixCls}__cell_selected`]: num === value,
80
- [`${prefixCls}__cell_disabled`]: isDisabled
81
- }),
82
- onClick: () => handleClick(num),
83
- children: String(num).padStart(2, "0")
84
- }, `c${copyIdx}-${i}`);
85
- }))
87
+ ].map((copyIdx) => items.map((num, i) => /* @__PURE__ */ jsx("li", {
88
+ className: cellCls(num),
89
+ onClick: () => handleClick(num),
90
+ children: String(num).padStart(2, "0")
91
+ }, `c${copyIdx}-${i}`)))
86
92
  })
87
93
  });
88
94
  return /* @__PURE__ */ jsx("div", {
@@ -90,20 +96,14 @@ const TimePanel = (props) => {
90
96
  ref: panelRef,
91
97
  children: /* @__PURE__ */ jsx("ul", {
92
98
  className: `${prefixCls}__column-list`,
93
- children: items.map((num) => {
94
- const isDisabled = disabledItems.includes(num);
95
- return /* @__PURE__ */ jsx("li", {
96
- ref: (el) => {
97
- if (el) itemRefs.current.set(num, el);
98
- },
99
- className: classNames(`${prefixCls}__cell`, {
100
- [`${prefixCls}__cell_selected`]: num === value,
101
- [`${prefixCls}__cell_disabled`]: isDisabled
102
- }),
103
- onClick: () => handleClick(num),
104
- children: String(num).padStart(2, "0")
105
- }, num);
106
- })
99
+ children: items.map((num) => /* @__PURE__ */ jsx("li", {
100
+ ref: (el) => {
101
+ if (el) itemRefs.current.set(num, el);
102
+ },
103
+ className: cellCls(num),
104
+ onClick: () => handleClick(num),
105
+ children: String(num).padStart(2, "0")
106
+ }, num))
107
107
  })
108
108
  });
109
109
  };
@@ -1 +1 @@
1
- {"version":3,"file":"time-panel.js","names":[],"sources":["../../src/time-picker/time-panel.tsx"],"sourcesContent":["import { useRef, useEffect, useCallback } from 'react';\nimport classNames from 'classnames';\n\nexport interface TimePanelProps {\n value: number;\n items: number[];\n disabledItems?: number[];\n loop?: boolean;\n onChange: (num: number) => void;\n prefixCls: string;\n}\n\nconst ITEM_HEIGHT = 28; // 4px padding-top + 20px line-height + 4px padding-bottom\n\nconst TimePanel = (props: TimePanelProps): React.ReactElement => {\n const { prefixCls, value, items, disabledItems = [], loop = false, onChange } = props;\n const panelRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<Map<number, HTMLLIElement>>(new Map());\n const isResetting = useRef(false);\n const clickedRef = useRef(false);\n const scrollToItemRef = useRef<((val: number) => void) | null>(null);\n\n const oneGroupHeight = items.length * ITEM_HEIGHT;\n\n scrollToItemRef.current = (val: number) => {\n const panel = panelRef.current;\n if (!panel) return;\n\n if (loop) {\n const idx = items.indexOf(val);\n if (idx === -1) return;\n const top = oneGroupHeight + idx * ITEM_HEIGHT;\n isResetting.current = true;\n panel.scrollTo({ top, behavior: 'auto' });\n requestAnimationFrame(() => { isResetting.current = false; });\n } else {\n const el = itemRefs.current.get(val);\n if (el) {\n panel.scrollTo({ top: el.offsetTop, behavior: 'auto' });\n }\n }\n };\n\n useEffect(() => {\n if (clickedRef.current) {\n clickedRef.current = false;\n return;\n }\n scrollToItemRef.current?.(value);\n }, [value]);\n\n // Scroll reset for loop mode\n const handleScroll = useCallback(() => {\n if (!loop || isResetting.current) return;\n const panel = panelRef.current;\n if (!panel) return;\n\n const st = panel.scrollTop;\n if (st < oneGroupHeight || st >= 2 * oneGroupHeight) {\n isResetting.current = true;\n panel.scrollTo({ top: (st % oneGroupHeight) + oneGroupHeight, behavior: 'auto' });\n requestAnimationFrame(() => { isResetting.current = false; });\n }\n }, [loop, oneGroupHeight]);\n\n const handleClick = (num: number) => {\n if (disabledItems.includes(num)) return;\n clickedRef.current = true;\n onChange(num);\n };\n\n if (loop) {\n const copies = [0, 1, 2];\n return (\n <div className={`${prefixCls}__column`} ref={panelRef} onScroll={handleScroll}>\n <ul className={`${prefixCls}__column-list`}>\n {copies.map((copyIdx) =>\n items.map((num, i) => {\n const isDisabled = disabledItems.includes(num);\n const cls = classNames(`${prefixCls}__cell`, {\n [`${prefixCls}__cell_selected`]: num === value,\n [`${prefixCls}__cell_disabled`]: isDisabled,\n });\n return (\n <li\n key={`c${copyIdx}-${i}`}\n className={cls}\n onClick={() => handleClick(num)}>\n {String(num).padStart(2, '0')}\n </li>\n );\n })\n )}\n </ul>\n </div>\n );\n }\n\n return (\n <div className={`${prefixCls}__column`} ref={panelRef}>\n <ul className={`${prefixCls}__column-list`}>\n {items.map((num) => {\n const isDisabled = disabledItems.includes(num);\n const cls = classNames(`${prefixCls}__cell`, {\n [`${prefixCls}__cell_selected`]: num === value,\n [`${prefixCls}__cell_disabled`]: isDisabled,\n });\n return (\n <li\n key={num}\n ref={(el) => {\n if (el) itemRefs.current.set(num, el);\n }}\n className={cls}\n onClick={() => handleClick(num)}>\n {String(num).padStart(2, '0')}\n </li>\n );\n })}\n </ul>\n </div>\n );\n};\n\nexport default TimePanel;\n"],"mappings":";;;;AAYA,MAAM,cAAc;AAEpB,MAAM,aAAa,UAA8C;CAC/D,MAAM,EAAE,WAAW,OAAO,OAAO,gBAAgB,EAAE,EAAE,OAAO,OAAO,aAAa;CAChF,MAAM,WAAW,OAAuB,KAAK;CAC7C,MAAM,WAAW,uBAAmC,IAAI,KAAK,CAAC;CAC9D,MAAM,cAAc,OAAO,MAAM;CACjC,MAAM,aAAa,OAAO,MAAM;CAChC,MAAM,kBAAkB,OAAuC,KAAK;CAEpE,MAAM,iBAAiB,MAAM,SAAS;AAEtC,iBAAgB,WAAW,QAAgB;EACzC,MAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,MAAO;AAEZ,MAAI,MAAM;GACR,MAAM,MAAM,MAAM,QAAQ,IAAI;AAC9B,OAAI,QAAQ,GAAI;GAChB,MAAM,MAAM,iBAAiB,MAAM;AACnC,eAAY,UAAU;AACtB,SAAM,SAAS;IAAE;IAAK,UAAU;IAAQ,CAAC;AACzC,+BAA4B;AAAE,gBAAY,UAAU;KAAS;SACxD;GACL,MAAM,KAAK,SAAS,QAAQ,IAAI,IAAI;AACpC,OAAI,GACF,OAAM,SAAS;IAAE,KAAK,GAAG;IAAW,UAAU;IAAQ,CAAC;;;AAK7D,iBAAgB;AACd,MAAI,WAAW,SAAS;AACtB,cAAW,UAAU;AACrB;;AAEF,kBAAgB,UAAU,MAAM;IAC/B,CAAC,MAAM,CAAC;CAGX,MAAM,eAAe,kBAAkB;AACrC,MAAI,CAAC,QAAQ,YAAY,QAAS;EAClC,MAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,MAAO;EAEZ,MAAM,KAAK,MAAM;AACjB,MAAI,KAAK,kBAAkB,MAAM,IAAI,gBAAgB;AACnD,eAAY,UAAU;AACtB,SAAM,SAAS;IAAE,KAAM,KAAK,iBAAkB;IAAgB,UAAU;IAAQ,CAAC;AACjF,+BAA4B;AAAE,gBAAY,UAAU;KAAS;;IAE9D,CAAC,MAAM,eAAe,CAAC;CAE1B,MAAM,eAAe,QAAgB;AACnC,MAAI,cAAc,SAAS,IAAI,CAAE;AACjC,aAAW,UAAU;AACrB,WAAS,IAAI;;AAGf,KAAI,KAEF,QACE,oBAAC,OAAD;EAAK,WAAW,GAAG,UAAU;EAAW,KAAK;EAAU,UAAU;YAC/D,oBAAC,MAAD;GAAI,WAAW,GAAG,UAAU;aAHjB;IAAC;IAAG;IAAG;IAAE,CAIV,KAAK,YACX,MAAM,KAAK,KAAK,MAAM;IACpB,MAAM,aAAa,cAAc,SAAS,IAAI;AAK9C,WACE,oBAAC,MAAD;KAEE,WAPQ,WAAW,GAAG,UAAU,SAAS;OAC1C,GAAG,UAAU,mBAAmB,QAAQ;OACxC,GAAG,UAAU,mBAAmB;MAClC,CAAC;KAKE,eAAe,YAAY,IAAI;eAC9B,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI;KAC1B,EAJE,IAAI,QAAQ,GAAG,IAIjB;KAEP,CACH;GACE,CAAA;EACD,CAAA;AAIV,QACE,oBAAC,OAAD;EAAK,WAAW,GAAG,UAAU;EAAW,KAAK;YAC3C,oBAAC,MAAD;GAAI,WAAW,GAAG,UAAU;aACzB,MAAM,KAAK,QAAQ;IAClB,MAAM,aAAa,cAAc,SAAS,IAAI;AAK9C,WACE,oBAAC,MAAD;KAEE,MAAM,OAAO;AACX,UAAI,GAAI,UAAS,QAAQ,IAAI,KAAK,GAAG;;KAEvC,WAVQ,WAAW,GAAG,UAAU,SAAS;OAC1C,GAAG,UAAU,mBAAmB,QAAQ;OACxC,GAAG,UAAU,mBAAmB;MAClC,CAAC;KAQE,eAAe,YAAY,IAAI;eAC9B,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI;KAC1B,EAPE,IAOF;KAEP;GACC,CAAA;EACD,CAAA"}
1
+ {"version":3,"file":"time-panel.js","names":[],"sources":["../../src/time-picker/time-panel.tsx"],"sourcesContent":["import { useRef, useEffect, useCallback } from 'react';\nimport classNames from 'classnames';\n\nexport interface TimePanelProps {\n value: number | null;\n pendingValue: number | null;\n items: number[];\n disabledItems?: number[];\n loop?: boolean;\n onChange: (num: number) => void;\n prefixCls: string;\n}\n\nconst ITEM_HEIGHT = 28; // 4px padding-top + 20px line-height + 4px padding-bottom\n\nconst TimePanel = (props: TimePanelProps): React.ReactElement => {\n const { prefixCls, value, pendingValue, items, disabledItems = [], loop = false, onChange } = props;\n const panelRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<Map<number, HTMLLIElement>>(new Map());\n const isResetting = useRef(false);\n const clickedRef = useRef(false);\n const scrollToItemRef = useRef<((val: number | null) => void) | null>(null);\n\n const oneGroupHeight = items.length * ITEM_HEIGHT;\n\n // The displayed value: pending takes priority, then committed\n const displayValue = pendingValue ?? value;\n\n scrollToItemRef.current = (val: number | null) => {\n if (val === null) return;\n const panel = panelRef.current;\n if (!panel) return;\n\n if (loop) {\n const idx = items.indexOf(val);\n if (idx === -1) return;\n const top = oneGroupHeight + idx * ITEM_HEIGHT;\n isResetting.current = true;\n panel.scrollTo({ top, behavior: 'auto' });\n requestAnimationFrame(() => { isResetting.current = false; });\n } else {\n const el = itemRefs.current.get(val);\n if (el) {\n panel.scrollTo({ top: el.offsetTop, behavior: 'auto' });\n }\n }\n };\n\n useEffect(() => {\n if (clickedRef.current) {\n clickedRef.current = false;\n return;\n }\n scrollToItemRef.current?.(displayValue);\n }, [displayValue]);\n\n // Scroll reset for loop mode\n const handleScroll = useCallback(() => {\n if (!loop || isResetting.current) return;\n const panel = panelRef.current;\n if (!panel) return;\n\n const st = panel.scrollTop;\n if (st < oneGroupHeight || st >= 2 * oneGroupHeight) {\n isResetting.current = true;\n panel.scrollTo({ top: (st % oneGroupHeight) + oneGroupHeight, behavior: 'auto' });\n requestAnimationFrame(() => { isResetting.current = false; });\n }\n }, [loop, oneGroupHeight]);\n\n const handleClick = (num: number) => {\n if (disabledItems.includes(num)) return;\n clickedRef.current = true;\n onChange(num);\n };\n\n const isPending = pendingValue !== null;\n const isCommitted = value !== null && pendingValue === null;\n\n const cellCls = (num: number) => {\n const isSelected = num === displayValue;\n return classNames(`${prefixCls}__cell`, {\n [`${prefixCls}__cell_selected`]: isSelected && isCommitted,\n [`${prefixCls}__cell_pending`]: isSelected && isPending,\n [`${prefixCls}__cell_disabled`]: disabledItems.includes(num),\n });\n };\n\n if (loop) {\n const copies = [0, 1, 2];\n return (\n <div className={`${prefixCls}__column`} ref={panelRef} onScroll={handleScroll}>\n <ul className={`${prefixCls}__column-list`}>\n {copies.map((copyIdx) =>\n items.map((num, i) => (\n <li\n key={`c${copyIdx}-${i}`}\n className={cellCls(num)}\n onClick={() => handleClick(num)}>\n {String(num).padStart(2, '0')}\n </li>\n ))\n )}\n </ul>\n </div>\n );\n }\n\n return (\n <div className={`${prefixCls}__column`} ref={panelRef}>\n <ul className={`${prefixCls}__column-list`}>\n {items.map((num) => (\n <li\n key={num}\n ref={(el) => {\n if (el) itemRefs.current.set(num, el);\n }}\n className={cellCls(num)}\n onClick={() => handleClick(num)}>\n {String(num).padStart(2, '0')}\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\nexport default TimePanel;\n"],"mappings":"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"}