import type { CustomSlotsType, LiteralUnion } from '../_util/type'; import type { PresetColorType } from '../_util/colors'; import useStyle from './style'; import { isPresetColor } from '../_util/colors'; import type { CSSProperties, PropType, ExtractPropTypes } from 'vue'; import { defineComponent, computed } from 'vue'; import PropTypes from '../_util/vue-types'; import useConfigInject from '../config-provider/hooks/useConfigInject'; export const ribbonProps = () => ({ prefix: String, color: { type: String as PropType> }, text: PropTypes.any, placement: { type: String as PropType<'start' | 'end'>, default: 'end' }, }); export type RibbonProps = Partial>>; export default defineComponent({ compatConfig: { MODE: 3 }, name: 'ABadgeRibbon', inheritAttrs: false, props: ribbonProps(), slots: Object as CustomSlotsType<{ text: any; default: any; }>, setup(props, { attrs, slots }) { const { prefixCls, direction } = useConfigInject('ribbon', props); const [wrapSSR, hashId] = useStyle(prefixCls); const colorInPreset = computed(() => isPresetColor(props.color, false)); const ribbonCls = computed(() => [ prefixCls.value, `${prefixCls.value}-placement-${props.placement}`, { [`${prefixCls.value}-rtl`]: direction.value === 'rtl', [`${prefixCls.value}-color-${props.color}`]: colorInPreset.value, }, ]); return () => { const { class: className, style, ...restAttrs } = attrs; const colorStyle: CSSProperties = {}; const cornerColorStyle: CSSProperties = {}; if (props.color && !colorInPreset.value) { colorStyle.background = props.color; cornerColorStyle.color = props.color; } return wrapSSR(
{slots.default?.()}
{props.text || slots.text?.()}
, ); }; }, });