Skip to content

Commit c98bf95

Browse files
lh01217311claude
andcommitted
fix: avoid selected item text color lagging behind thumb motion (#37192)
Split the text color of the selected item into a dedicated `item-selected-text` class that follows the value immediately, instead of being gated by `thumbShow` like the background. This prevents the text color from lagging behind the thumb animation when a custom dark background + light text is used. ant-design/ant-design#37192 Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 13dcd71 commit c98bf95

4 files changed

Lines changed: 26 additions & 12 deletions

File tree

assets/index.less

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@
4747
color: @text-color;
4848
}
4949

50+
&-selected-text {
51+
color: @text-color;
52+
}
53+
5054
&:hover,
5155
&:focus {
5256
color: @text-color;

src/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
288288
{
289289
[`${prefixCls}-item-selected`]:
290290
optionValue === rawValue && !thumbShow,
291+
[`${prefixCls}-item-selected-text`]: optionValue === rawValue,
291292
[`${prefixCls}-item-focused`]:
292293
isFocused && isKeyboard && optionValue === rawValue,
293294
},

tests/__snapshots__/index.test.tsx.snap

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ exports[`rc-segmented render label with ReactNode 1`] = `
2424
class="rc-segmented-group"
2525
>
2626
<label
27-
class="rc-segmented-item rc-segmented-item-selected"
27+
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-selected-text"
2828
>
2929
<input
3030
checked=""
@@ -91,7 +91,7 @@ exports[`rc-segmented render segmented ok 1`] = `
9191
class="rc-segmented-group"
9292
>
9393
<label
94-
class="rc-segmented-item rc-segmented-item-selected"
94+
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-selected-text"
9595
>
9696
<input
9797
checked=""
@@ -154,7 +154,7 @@ exports[`rc-segmented render segmented with CSSMotion basic 1`] = `
154154
class="rc-segmented-group"
155155
>
156156
<label
157-
class="rc-segmented-item rc-segmented-item-selected"
157+
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-selected-text"
158158
>
159159
<input
160160
checked=""
@@ -217,7 +217,7 @@ exports[`rc-segmented render segmented with options 1`] = `
217217
class="rc-segmented-group"
218218
>
219219
<label
220-
class="rc-segmented-item rc-segmented-item-selected"
220+
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-selected-text"
221221
>
222222
<input
223223
checked=""
@@ -279,7 +279,7 @@ exports[`rc-segmented render segmented with options null/undefined 1`] = `
279279
class="rc-segmented-group"
280280
>
281281
<label
282-
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-disabled"
282+
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-selected-text rc-segmented-item-disabled"
283283
>
284284
<input
285285
checked=""
@@ -337,7 +337,7 @@ exports[`rc-segmented render segmented with options: 1 1`] = `
337337
class="rc-segmented-group"
338338
>
339339
<label
340-
class="rc-segmented-item rc-segmented-item-selected"
340+
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-selected-text"
341341
>
342342
<input
343343
checked=""
@@ -432,7 +432,7 @@ exports[`rc-segmented render segmented with options: 2 1`] = `
432432
class="rc-segmented-group"
433433
>
434434
<label
435-
class="rc-segmented-item rc-segmented-item-selected"
435+
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-selected-text"
436436
>
437437
<input
438438
checked=""
@@ -495,7 +495,7 @@ exports[`rc-segmented render segmented with options: disabled 1`] = `
495495
class="rc-segmented-group"
496496
>
497497
<label
498-
class="rc-segmented-item rc-segmented-item-selected"
498+
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-selected-text"
499499
>
500500
<input
501501
checked=""
@@ -559,7 +559,7 @@ exports[`rc-segmented render segmented with title 1`] = `
559559
class="rc-segmented-group"
560560
>
561561
<label
562-
class="rc-segmented-item rc-segmented-item-selected"
562+
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-selected-text"
563563
>
564564
<input
565565
checked=""
@@ -654,7 +654,7 @@ exports[`rc-segmented render segmented: disabled 1`] = `
654654
class="rc-segmented-group"
655655
>
656656
<label
657-
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-disabled"
657+
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-selected-text rc-segmented-item-disabled"
658658
>
659659
<input
660660
checked=""
@@ -720,7 +720,7 @@ exports[`rc-segmented should render vertical segmented 1`] = `
720720
class="rc-segmented-group"
721721
>
722722
<label
723-
class="rc-segmented-item rc-segmented-item-selected"
723+
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-selected-text"
724724
>
725725
<input
726726
checked=""
@@ -783,7 +783,7 @@ exports[`rc-segmented should render vertical segmented and handle thumb animatio
783783
class="rc-segmented-group"
784784
>
785785
<label
786-
class="rc-segmented-item rc-segmented-item-selected"
786+
class="rc-segmented-item rc-segmented-item-selected rc-segmented-item-selected-text"
787787
>
788788
<input
789789
checked=""

tests/index.test.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,10 +323,19 @@ describe('rc-segmented', () => {
323323
);
324324
expect(handleValueChange).toBeCalledWith('Web3');
325325
expectMatchChecked(container, [false, false, true]);
326+
expect(container.querySelectorAll('.rc-segmented-item')[2]).toHaveClass(
327+
'rc-segmented-item-selected-text',
328+
);
326329

327330
expect(container.querySelectorAll('.rc-segmented-thumb')[0]).toHaveClass(
328331
'rc-segmented-thumb-motion',
329332
);
333+
expect(
334+
container.querySelectorAll('.rc-segmented-item')[2],
335+
).not.toHaveClass('rc-segmented-item-selected');
336+
expect(container.querySelectorAll('.rc-segmented-item')[2]).toHaveClass(
337+
'rc-segmented-item-selected-text',
338+
);
330339

331340
// thumb appeared at `iOS`
332341
exceptThumbHaveStyle(container, {

0 commit comments

Comments
 (0)