Skip to content

Commit 4b2ffd7

Browse files
authored
refactor(result): less to cssinjs (#6246)
* refactor(result): less to cssinjs * fix: class name is overridden
1 parent a5389a2 commit 4b2ffd7

File tree

6 files changed

+171
-110
lines changed

6 files changed

+171
-110
lines changed

components/result/index.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import unauthorized from './unauthorized';
1111
import useConfigInject from '../config-provider/hooks/useConfigInject';
1212
import classNames from '../_util/classNames';
1313

14+
import useStyle from './style';
15+
1416
export const IconMap = {
1517
success: CheckCircleFilled,
1618
error: CloseCircleFilled,
@@ -61,12 +63,16 @@ const renderExtra = (prefixCls: string, extra: VNodeTypes) =>
6163
const Result = defineComponent({
6264
compatConfig: { MODE: 3 },
6365
name: 'AResult',
66+
inheritAttrs: false,
6467
props: resultProps(),
6568
slots: ['title', 'subTitle', 'icon', 'extra'],
66-
setup(props, { slots }) {
69+
setup(props, { slots, attrs }) {
6770
const { prefixCls, direction } = useConfigInject('result', props);
71+
72+
const [wrapSSR, hashId] = useStyle(prefixCls);
73+
6874
const className = computed(() =>
69-
classNames(prefixCls.value, `${prefixCls.value}-${props.status}`, {
75+
classNames(prefixCls.value, hashId.value, `${prefixCls.value}-${props.status}`, {
7076
[`${prefixCls.value}-rtl`]: direction.value === 'rtl',
7177
}),
7278
);
@@ -76,14 +82,14 @@ const Result = defineComponent({
7682
const icon = props.icon ?? slots.icon?.();
7783
const extra = props.extra ?? slots.extra?.();
7884
const pre = prefixCls.value;
79-
return (
80-
<div class={className.value}>
85+
return wrapSSR(
86+
<div {...attrs} class={[className.value, attrs.class]}>
8187
{renderIcon(pre, { status: props.status, icon })}
8288
<div class={`${pre}-title`}>{title}</div>
8389
{subTitle && <div class={`${pre}-subtitle`}>{subTitle}</div>}
8490
{renderExtra(pre, extra)}
8591
{slots.default && <div class={`${pre}-content`}>{slots.default()}</div>}
86-
</div>
92+
</div>,
8793
);
8894
};
8995
},

components/result/style/index.less

Lines changed: 0 additions & 75 deletions
This file was deleted.

components/result/style/index.tsx

Lines changed: 157 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,157 @@
1-
import '../../style/index.less';
2-
import './index.less';
1+
import type { CSSObject } from '../../_util/cssinjs';
2+
import type { FullToken, GenerateStyle } from '../../theme/internal';
3+
import { genComponentStyleHook, mergeToken } from '../../theme/internal';
4+
5+
export interface ComponentToken {
6+
imageWidth: number;
7+
imageHeight: number;
8+
}
9+
10+
interface ResultToken extends FullToken<'Result'> {
11+
resultTitleFontSize: number;
12+
resultSubtitleFontSize: number;
13+
resultIconFontSize: number;
14+
15+
resultExtraMargin: string;
16+
17+
resultInfoIconColor: string;
18+
resultSuccessIconColor: string;
19+
resultWarningIconColor: string;
20+
resultErrorIconColor: string;
21+
}
22+
23+
// ============================== Styles ==============================
24+
const genBaseStyle: GenerateStyle<ResultToken> = (token): CSSObject => {
25+
const {
26+
componentCls,
27+
lineHeightHeading3,
28+
iconCls,
29+
padding,
30+
paddingXL,
31+
paddingXS,
32+
paddingLG,
33+
marginXS,
34+
lineHeight,
35+
} = token;
36+
37+
return {
38+
// Result
39+
[componentCls]: {
40+
padding: `${paddingLG * 2}px ${paddingXL}px`,
41+
42+
// RTL
43+
'&-rtl': {
44+
direction: 'rtl',
45+
},
46+
},
47+
48+
// Exception Status image
49+
[`${componentCls} ${componentCls}-image`]: {
50+
width: token.imageWidth,
51+
height: token.imageHeight,
52+
margin: 'auto',
53+
},
54+
55+
[`${componentCls} ${componentCls}-icon`]: {
56+
marginBottom: paddingLG,
57+
textAlign: 'center',
58+
59+
[`& > ${iconCls}`]: {
60+
fontSize: token.resultIconFontSize,
61+
},
62+
},
63+
64+
[`${componentCls} ${componentCls}-title`]: {
65+
color: token.colorTextHeading,
66+
fontSize: token.resultTitleFontSize,
67+
lineHeight: lineHeightHeading3,
68+
marginBlock: marginXS,
69+
textAlign: 'center',
70+
},
71+
72+
[`${componentCls} ${componentCls}-subtitle`]: {
73+
color: token.colorTextDescription,
74+
fontSize: token.resultSubtitleFontSize,
75+
lineHeight,
76+
textAlign: 'center',
77+
},
78+
79+
[`${componentCls} ${componentCls}-content`]: {
80+
marginTop: paddingLG,
81+
padding: `${paddingLG}px ${padding * 2.5}px`,
82+
backgroundColor: token.colorFillAlter,
83+
},
84+
85+
[`${componentCls} ${componentCls}-extra`]: {
86+
margin: token.resultExtraMargin,
87+
textAlign: 'center',
88+
89+
'& > *': {
90+
marginInlineEnd: paddingXS,
91+
92+
'&:last-child': {
93+
marginInlineEnd: 0,
94+
},
95+
},
96+
},
97+
};
98+
};
99+
100+
const genStatusIconStyle: GenerateStyle<ResultToken> = token => {
101+
const { componentCls, iconCls } = token;
102+
103+
return {
104+
[`${componentCls}-success ${componentCls}-icon > ${iconCls}`]: {
105+
color: token.resultSuccessIconColor,
106+
},
107+
[`${componentCls}-error ${componentCls}-icon > ${iconCls}`]: {
108+
color: token.resultErrorIconColor,
109+
},
110+
[`${componentCls}-info ${componentCls}-icon > ${iconCls}`]: {
111+
color: token.resultInfoIconColor,
112+
},
113+
[`${componentCls}-warning ${componentCls}-icon > ${iconCls}`]: {
114+
color: token.resultWarningIconColor,
115+
},
116+
};
117+
};
118+
119+
const genResultStyle: GenerateStyle<ResultToken> = token => [
120+
genBaseStyle(token),
121+
genStatusIconStyle(token),
122+
];
123+
124+
// ============================== Export ==============================
125+
const getStyle: GenerateStyle<ResultToken> = token => genResultStyle(token);
126+
127+
export default genComponentStyleHook(
128+
'Result',
129+
token => {
130+
const { paddingLG, fontSizeHeading3 } = token;
131+
132+
const resultSubtitleFontSize = token.fontSize;
133+
const resultExtraMargin = `${paddingLG}px 0 0 0`;
134+
135+
const resultInfoIconColor = token.colorInfo;
136+
const resultErrorIconColor = token.colorError;
137+
const resultSuccessIconColor = token.colorSuccess;
138+
const resultWarningIconColor = token.colorWarning;
139+
140+
const resultToken = mergeToken<ResultToken>(token, {
141+
resultTitleFontSize: fontSizeHeading3,
142+
resultSubtitleFontSize,
143+
resultIconFontSize: fontSizeHeading3 * 3,
144+
resultExtraMargin,
145+
resultInfoIconColor,
146+
resultErrorIconColor,
147+
resultSuccessIconColor,
148+
resultWarningIconColor,
149+
});
150+
151+
return [getStyle(resultToken)];
152+
},
153+
{
154+
imageWidth: 250,
155+
imageHeight: 295,
156+
},
157+
);

components/result/style/rtl.less

Lines changed: 0 additions & 25 deletions
This file was deleted.

components/style.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ import './drawer/style';
5454
// import './config-provider/style';
5555
import './empty/style';
5656
// import './statistic/style';
57-
import './result/style';
57+
// import './result/style';
5858
// import './descriptions/style';
5959
// import './page-header/style';
6060
import './form/style';

components/theme/interface/components.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import type { ComponentToken as PopoverComponentToken } from '../../popover/styl
2929
import type { ComponentToken as ProgressComponentToken } from '../../progress/style';
3030
// import type { ComponentToken as RadioComponentToken } from '../../radio/style';
3131
import type { ComponentToken as RateComponentToken } from '../../rate/style';
32-
// import type { ComponentToken as ResultComponentToken } from '../../result/style';
32+
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';
3535
import type { ComponentToken as SkeletonComponentToken } from '../../skeleton/style';
@@ -87,7 +87,7 @@ export interface ComponentTokenMap {
8787
Popconfirm?: PopconfirmComponentToken;
8888
Rate?: RateComponentToken;
8989
// Radio?: RadioComponentToken;
90-
// Result?: ResultComponentToken;
90+
Result?: ResultComponentToken;
9191
// Segmented?: SegmentedComponentToken;
9292
// Select?: SelectComponentToken;
9393
Skeleton?: SkeletonComponentToken;

0 commit comments

Comments
 (0)