Skip to content

Commit 5dbc1da

Browse files
committed
feat(ui): badge support custom text
1 parent b56080b commit 5dbc1da

9 files changed

Lines changed: 110 additions & 4 deletions

File tree

packages/ui/src/components/badge/Badge.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { getClassName } from '@react-devui/utils';
55
import { registerComponentMate, TTANSITION_DURING_BASE } from '../../utils';
66
import { DTransition } from '../_transition';
77
import { useComponentConfig, usePrefixConfig } from '../root';
8+
import { DBadgeText } from './BadgeText';
89
import { DNumber } from './Number';
910

1011
export interface DBadgeProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
@@ -19,7 +20,10 @@ export interface DBadgeProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
1920
}
2021

2122
const { COMPONENT_NAME } = registerComponentMate({ COMPONENT_NAME: 'DBadge' as const });
22-
export function DBadge(props: DBadgeProps): JSX.Element | null {
23+
export const DBadge: {
24+
(props: DBadgeProps): JSX.Element | null;
25+
Text: typeof DBadgeText;
26+
} = (props) => {
2327
const {
2428
dValue,
2529
dTheme = 'danger',
@@ -122,4 +126,6 @@ export function DBadge(props: DBadgeProps): JSX.Element | null {
122126
}}
123127
</DTransition>
124128
);
125-
}
129+
};
130+
131+
DBadge.Text = DBadgeText;
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import { getClassName } from '@react-devui/utils';
2+
3+
import { registerComponentMate, TTANSITION_DURING_BASE } from '../../utils';
4+
import { DTransition } from '../_transition';
5+
import { useComponentConfig, usePrefixConfig } from '../root';
6+
7+
export interface DBadgeTextProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
8+
dText: string;
9+
dTheme?: 'primary' | 'success' | 'warning' | 'danger';
10+
dColor?: string;
11+
dOffset?: [number | string, number | string];
12+
dAlone?: boolean;
13+
}
14+
15+
const { COMPONENT_NAME } = registerComponentMate({ COMPONENT_NAME: 'DBadge.Text' as const });
16+
export function DBadgeText(props: DBadgeTextProps): JSX.Element | null {
17+
const {
18+
dText,
19+
dTheme = 'danger',
20+
dColor,
21+
dOffset = [0, '100%'],
22+
dAlone = false,
23+
24+
...restProps
25+
} = useComponentConfig(COMPONENT_NAME, props);
26+
27+
//#region Context
28+
const dPrefix = usePrefixConfig();
29+
//#endregion
30+
31+
return (
32+
<DTransition dIn={dText.length > 0} dDuring={TTANSITION_DURING_BASE}>
33+
{(state) => {
34+
let transitionStyle: React.CSSProperties = {};
35+
switch (state) {
36+
case 'enter':
37+
transitionStyle = { transform: 'scale(0)', opacity: 0 };
38+
break;
39+
40+
case 'entering':
41+
transitionStyle = {
42+
transition: ['transform', 'opacity'].map((attr) => `${attr} ${TTANSITION_DURING_BASE}ms ease-out`).join(', '),
43+
};
44+
break;
45+
46+
case 'leaving':
47+
transitionStyle = {
48+
transform: 'scale(0)',
49+
opacity: 0,
50+
transition: ['transform', 'opacity'].map((attr) => `${attr} ${TTANSITION_DURING_BASE}ms ease-in`).join(', '),
51+
};
52+
break;
53+
54+
default:
55+
break;
56+
}
57+
58+
return state === 'leaved' ? null : (
59+
<div
60+
{...restProps}
61+
className={getClassName(restProps.className, `${dPrefix}badge`, {
62+
[`t-${dTheme}`]: dTheme,
63+
[`${dPrefix}badge--alone`]: dAlone,
64+
})}
65+
style={{
66+
...restProps.style,
67+
...(dAlone
68+
? {}
69+
: {
70+
top: dOffset[0],
71+
left: dOffset[1],
72+
}),
73+
[`--${dPrefix}badge-color`]: dColor,
74+
}}
75+
title={restProps.title ?? dText}
76+
>
77+
<div className={`${dPrefix}badge__wrapper`} style={transitionStyle}>
78+
{dText}
79+
</div>
80+
</div>
81+
);
82+
}}
83+
</DTransition>
84+
);
85+
}

packages/ui/src/components/badge/demos/1.Basic.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ export default function Demo() {
2424
<div className="app-demo-badge">
2525
<DBadge dValue={5} />
2626
</div>
27+
<div className="app-demo-badge">
28+
<DBadge.Text dText="M" />
29+
</div>
2730
</>
2831
);
2932
}

packages/ui/src/components/badge/demos/2.Theme.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ export default function Demo() {
3838
<div className="app-demo-badge">
3939
<DBadge dValue={5} dTheme={theme} />
4040
</div>
41+
<div className="app-demo-badge">
42+
<DBadge.Text dText="M" dTheme={theme} />
43+
</div>
4144
</>
4245
);
4346
}

packages/ui/src/components/badge/demos/3.Color.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,18 @@ export default function Demo() {
2424
<div className="app-demo-badge">
2525
<DBadge dValue={5} dColor="#21b0b5" />
2626
</div>
27+
<div className="app-demo-badge">
28+
<DBadge.Text dText="M" dColor="#21b0b5" />
29+
</div>
2730
<div className="app-demo-badge">
2831
<DBadge dValue={5} dDot dColor="#7b4acb" />
2932
</div>
3033
<div className="app-demo-badge">
3134
<DBadge dValue={5} dColor="#7b4acb" />
3235
</div>
36+
<div className="app-demo-badge">
37+
<DBadge.Text dText="M" dColor="#7b4acb" />
38+
</div>
3339
</>
3440
);
3541
}

packages/ui/src/components/badge/demos/7.Alone.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export default function Demo() {
2020
<>
2121
<DBadge dValue={5} dDot dAlone />
2222
<DBadge dValue={5} dAlone />
23+
<DBadge.Text dText="M" dAlone />
2324
</>
2425
);
2526
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './Badge';
2+
export * from './BadgeText';

packages/ui/src/components/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export { DAutoComplete } from './auto-complete';
1616
export type { DAvatarProps } from './avatar';
1717
export { DAvatar } from './avatar';
1818

19-
export type { DBadgeProps } from './badge';
19+
export type { DBadgeProps, DBadgeTextProps } from './badge';
2020
export { DBadge } from './badge';
2121

2222
export type { DBreadcrumbProps } from './breadcrumb';

packages/ui/src/components/root/contex.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type { DAlertProps } from '../alert';
66
import type { DAnchorProps } from '../anchor';
77
import type { DAutoCompleteProps } from '../auto-complete';
88
import type { DAvatarProps } from '../avatar';
9-
import type { DBadgeProps } from '../badge';
9+
import type { DBadgeProps, DBadgeTextProps } from '../badge';
1010
import type { DBreadcrumbProps } from '../breadcrumb';
1111
import type { DButtonProps } from '../button';
1212
import type { DCardProps, DCardActionsProps, DCardActionProps, DCardHeaderProps, DCardContentProps } from '../card';
@@ -74,6 +74,7 @@ export type DComponentConfig = {
7474
DAutoComplete: DAutoCompleteProps<any>;
7575
DAvatar: DAvatarProps;
7676
DBadge: DBadgeProps;
77+
'DBadge.Text': DBadgeTextProps;
7778
DBreadcrumb: DBreadcrumbProps<any, any>;
7879
DButton: DButtonProps;
7980
DCard: DCardProps;

0 commit comments

Comments
 (0)