61 lines
1.9 KiB
Vue
61 lines
1.9 KiB
Vue
import { LiteralUnion, tuple } from '../_util/type';
|
|
import { PresetColorType } from '../_util/colors';
|
|
import { isPresetColor } from './utils';
|
|
import { defaultConfigProvider } from '../config-provider';
|
|
import { HTMLAttributes, FunctionalComponent, VNodeTypes, inject, CSSProperties } from 'vue';
|
|
import PropTypes from '../_util/vue-types';
|
|
|
|
type RibbonPlacement = 'start' | 'end';
|
|
|
|
export interface RibbonProps extends HTMLAttributes {
|
|
prefixCls?: string;
|
|
text?: VNodeTypes;
|
|
color?: LiteralUnion<PresetColorType, string>;
|
|
placement?: RibbonPlacement;
|
|
}
|
|
|
|
const Ribbon: FunctionalComponent<RibbonProps> = (props, { attrs, slots }) => {
|
|
const { prefixCls: customizePrefixCls, color, text = slots.text?.(), placement = 'end' } = props;
|
|
const { class: className, style } = attrs;
|
|
const children = slots.default?.();
|
|
const { getPrefixCls, direction } = inject('configProvider', defaultConfigProvider);
|
|
|
|
const prefixCls = getPrefixCls('ribbon', customizePrefixCls);
|
|
const colorInPreset = isPresetColor(color);
|
|
const ribbonCls = [
|
|
prefixCls,
|
|
`${prefixCls}-placement-${placement}`,
|
|
{
|
|
[`${prefixCls}-rtl`]: direction === 'rtl',
|
|
[`${prefixCls}-color-${color}`]: colorInPreset,
|
|
},
|
|
className,
|
|
];
|
|
const colorStyle: CSSProperties = {};
|
|
const cornerColorStyle: CSSProperties = {};
|
|
if (color && !colorInPreset) {
|
|
colorStyle.background = color;
|
|
cornerColorStyle.color = color;
|
|
}
|
|
return (
|
|
<div class={`${prefixCls}-wrapper`}>
|
|
{children}
|
|
<div class={ribbonCls} style={{ ...colorStyle, ...(style as CSSProperties) }}>
|
|
<span class={`${prefixCls}-text`}>{text}</span>
|
|
<div class={`${prefixCls}-corner`} style={cornerColorStyle} />
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
Ribbon.displayName = 'ABadgeRibbon';
|
|
Ribbon.inheritAttrs = false;
|
|
Ribbon.props = {
|
|
prefix: PropTypes.string,
|
|
color: PropTypes.string,
|
|
text: PropTypes.any,
|
|
placement: PropTypes.oneOf(tuple('start', 'end')),
|
|
};
|
|
|
|
export default Ribbon;
|