| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- <script setup lang="ts">
- import type { MenuRecordBadgeRaw } from '@vben-core/typings';
- import { computed } from 'vue';
- import { isValidColor } from '@vben-core/shared/color';
- import BadgeDot from './menu-badge-dot.vue';
- interface Props extends MenuRecordBadgeRaw {
- hasChildren?: boolean;
- }
- const props = withDefaults(defineProps<Props>(), {});
- const variantsMap: Record<string, string> = {
- default: 'bg-green-500',
- destructive: 'bg-destructive',
- primary: 'bg-primary',
- success: 'bg-green-500',
- warning: 'bg-yellow-500',
- };
- const isDot = computed(() => props.badgeType === 'dot');
- const badgeClass = computed(() => {
- const { badgeVariants } = props;
- if (!badgeVariants) {
- return variantsMap.default;
- }
- return variantsMap[badgeVariants] || badgeVariants;
- });
- const badgeStyle = computed(() => {
- if (badgeClass.value && isValidColor(badgeClass.value)) {
- return {
- backgroundColor: badgeClass.value,
- };
- }
- return {};
- });
- </script>
- <template>
- <span v-if="isDot || badge" :class="$attrs.class" class="absolute">
- <BadgeDot v-if="isDot" :dot-class="badgeClass" :dot-style="badgeStyle" />
- <div
- v-else
- :class="badgeClass"
- :style="badgeStyle"
- class="text-primary-foreground flex-center rounded-xl px-1.5 py-0.5 text-[10px]"
- >
- {{ badge }}
- </div>
- </span>
- </template>
|