Skip to content

Commit dc480bd

Browse files
authored
refactor: rate style (#6254)
1 parent 1d77450 commit dc480bd

File tree

7 files changed

+144
-122
lines changed

7 files changed

+144
-122
lines changed

components/rate/index.tsx

+6-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import { useInjectFormItemContext } from '../form/FormItemContext';
1616
import type { Direction } from '../config-provider';
1717
import type { FocusEventHandler, KeyboardEventHandler } from '../_util/EventInterface';
1818

19+
import useStyle from './style';
20+
1921
export const rateProps = () => ({
2022
prefixCls: String,
2123
count: Number,
@@ -54,6 +56,7 @@ const Rate = defineComponent({
5456
// emits: ['hoverChange', 'update:value', 'change', 'focus', 'blur', 'keydown'],
5557
setup(props, { slots, attrs, emit, expose }) {
5658
const { prefixCls, direction } = useConfigInject('rate', props);
59+
const [wrapSSR, hashId] = useStyle(prefixCls);
5760
const formItemContext = useInjectFormItemContext();
5861
const rateRef = ref();
5962
const [setRef, starRefs] = useRefs();
@@ -224,9 +227,10 @@ const Rate = defineComponent({
224227
);
225228
}
226229
const rateClassName = classNames(prefixCls.value, disabledClass, className, {
230+
[hashId.value]: true,
227231
[`${prefixCls.value}-rtl`]: direction.value === 'rtl',
228232
});
229-
return (
233+
return wrapSSR(
230234
<ul
231235
{...attrs}
232236
id={id}
@@ -241,7 +245,7 @@ const Rate = defineComponent({
241245
role="radiogroup"
242246
>
243247
{stars}
244-
</ul>
248+
</ul>,
245249
);
246250
};
247251
},

components/rate/style/index.less

-91
This file was deleted.

components/rate/style/index.ts

+135
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import type { CSSObject } from '../../_util/cssinjs';
2+
import type { FullToken, GenerateStyle } from '../../theme/internal';
3+
import { genComponentStyleHook, mergeToken } from '../../theme/internal';
4+
import { resetComponent } from '../../_style';
5+
6+
export type ComponentToken = {};
7+
8+
interface RateToken extends FullToken<'Rate'> {
9+
rateStarColor: string;
10+
rateStarSize: number;
11+
rateStarHoverScale: CSSObject['transform'];
12+
defaultColor: string;
13+
}
14+
15+
const genRateStarStyle: GenerateStyle<RateToken, CSSObject> = token => {
16+
const { componentCls } = token;
17+
18+
return {
19+
[`${componentCls}-star`]: {
20+
position: 'relative',
21+
display: 'inline-block',
22+
color: 'inherit',
23+
cursor: 'pointer',
24+
25+
'&:not(:last-child)': {
26+
marginInlineEnd: token.marginXS,
27+
},
28+
29+
'> div': {
30+
transition: `all ${token.motionDurationMid}, outline 0s`,
31+
32+
'&:hover': {
33+
transform: token.rateStarHoverScale,
34+
},
35+
36+
'&:focus': {
37+
outline: 0,
38+
},
39+
40+
'&:focus-visible': {
41+
outline: `${token.lineWidth}px dashed ${token.rateStarColor}`,
42+
transform: token.rateStarHoverScale,
43+
},
44+
},
45+
46+
'&-first, &-second': {
47+
color: token.defaultColor,
48+
transition: `all ${token.motionDurationMid}`,
49+
userSelect: 'none',
50+
51+
[token.iconCls]: {
52+
verticalAlign: 'middle',
53+
},
54+
},
55+
56+
'&-first': {
57+
position: 'absolute',
58+
top: 0,
59+
insetInlineStart: 0,
60+
width: '50%',
61+
height: '100%',
62+
overflow: 'hidden',
63+
opacity: 0,
64+
},
65+
66+
[`&-half ${componentCls}-star-first, &-half ${componentCls}-star-second`]: {
67+
opacity: 1,
68+
},
69+
70+
[`&-half ${componentCls}-star-first, &-full ${componentCls}-star-second`]: {
71+
color: 'inherit',
72+
},
73+
},
74+
};
75+
};
76+
77+
const genRateRtlStyle = (token: RateToken): CSSObject => ({
78+
[`&-rtl${token.componentCls}`]: {
79+
direction: 'rtl',
80+
},
81+
});
82+
83+
const genRateStyle: GenerateStyle<RateToken> = token => {
84+
const { componentCls } = token;
85+
86+
return {
87+
[componentCls]: {
88+
...resetComponent(token),
89+
90+
display: 'inline-block',
91+
margin: 0,
92+
padding: 0,
93+
color: token.rateStarColor,
94+
fontSize: token.rateStarSize,
95+
lineHeight: 'unset',
96+
listStyle: 'none',
97+
outline: 'none',
98+
99+
// disable styles
100+
[`&-disabled${componentCls} ${componentCls}-star`]: {
101+
cursor: 'default',
102+
103+
'&:hover': {
104+
transform: 'scale(1)',
105+
},
106+
},
107+
108+
// star styles
109+
...genRateStarStyle(token),
110+
111+
// text styles
112+
[`+ ${componentCls}-text`]: {
113+
display: 'inline-block',
114+
marginInlineStart: token.marginXS,
115+
fontSize: token.fontSize,
116+
},
117+
118+
// rtl styles
119+
...genRateRtlStyle(token),
120+
},
121+
};
122+
};
123+
124+
// ============================== Export ==============================
125+
export default genComponentStyleHook('Rate', token => {
126+
const { colorFillContent } = token;
127+
128+
const rateToken = mergeToken<RateToken>(token, {
129+
rateStarColor: token['yellow-6'],
130+
rateStarSize: token.controlHeightLG * 0.5,
131+
rateStarHoverScale: 'scale(1.1)',
132+
defaultColor: colorFillContent,
133+
});
134+
return [genRateStyle(rateToken)];
135+
});

components/rate/style/index.tsx

-5
This file was deleted.

components/rate/style/rtl.less

-21
This file was deleted.

components/style.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import './radio/style';
44
import './checkbox/style';
55
// import './grid/style';
66
// import './tag/style';
7-
import './rate/style';
7+
// import './rate/style';
88
import './pagination/style';
99
// import './avatar/style';
1010
// import './badge/style';

components/theme/interface/components.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import type { ComponentToken as PopconfirmComponentToken } from '../../popconfir
2828
import type { ComponentToken as PopoverComponentToken } from '../../popover/style';
2929
import type { ComponentToken as ProgressComponentToken } from '../../progress/style';
3030
// import type { ComponentToken as RadioComponentToken } from '../../radio/style';
31-
// import type { ComponentToken as RateComponentToken } from '../../rate/style';
31+
import type { ComponentToken as RateComponentToken } from '../../rate/style';
3232
// import type { ComponentToken as ResultComponentToken } from '../../result/style';
3333
// import type { ComponentToken as SegmentedComponentToken } from '../../segmented/style';
3434
// import type { ComponentToken as SelectComponentToken } from '../../select/style';
@@ -85,7 +85,7 @@ export interface ComponentTokenMap {
8585
Pagination?: {};
8686
Popover?: PopoverComponentToken;
8787
Popconfirm?: PopconfirmComponentToken;
88-
// Rate?: RateComponentToken;
88+
Rate?: RateComponentToken;
8989
// Radio?: RadioComponentToken;
9090
// Result?: ResultComponentToken;
9191
// Segmented?: SegmentedComponentToken;

0 commit comments

Comments
 (0)