63 lines
2.3 KiB
Vue
63 lines
2.3 KiB
Vue
|
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';
|
|||
![]()
feat: add ribbon (#3681)
* feat: add ribbon
* feat: ribbon support text slot
* test: add ribbon test
|
import PropTypes from '../_util/vue-types';
|
||
import useConfigInject from '../config-provider/hooks/useConfigInject';
|
|||
![]()
feat: add ribbon (#3681)
* feat: add ribbon
* feat: ribbon support text slot
* test: add ribbon test
|
|
||
export const ribbonProps = () => ({
|
|||
prefix: String,
|
|||
color: { type: String as PropType<LiteralUnion<PresetColorType>> },
|
|||
![]()
feat: add ribbon (#3681)
* feat: add ribbon
* feat: ribbon support text slot
* test: add ribbon test
|
text: PropTypes.any,
|
||
placement: { type: String as PropType<'start' | 'end'>, default: 'end' },
|
|||
});
|
|||
![]()
feat: add ribbon (#3681)
* feat: add ribbon
* feat: ribbon support text slot
* test: add ribbon test
|
|
||
export type RibbonProps = Partial<ExtractPropTypes<ReturnType<typeof ribbonProps>>>;
|
|||
|
|||
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(
|
|||
<div class={`${prefixCls.value}-wrapper ${hashId.value}`} {...restAttrs}>
|
|||
{slots.default?.()}
|
|||
<div
|
|||
class={[ribbonCls.value, className, hashId.value]}
|
|||
style={{ ...colorStyle, ...(style as CSSProperties) }}
|
|||
>
|
|||
<span class={`${prefixCls.value}-text`}>{props.text || slots.text?.()}</span>
|
|||
<div class={`${prefixCls.value}-corner`} style={cornerColorStyle} />
|
|||
</div>
|
|||
</div>,
|
|||
);
|
|||
};
|
|||
},
|
|||
});
|