From f78f29dee48134cf865a5daf29204cd018bed9ab Mon Sep 17 00:00:00 2001 From: Ilya Artamonov Date: Mon, 25 Sep 2023 19:38:41 +0300 Subject: [PATCH] refactor: Replaced classNames with tailwind merge in badge component --- src/components/Badge/Badge.vue | 31 +++---- .../Badge/composables/useBadgeClasses.ts | 82 ++++++++++--------- 2 files changed, 56 insertions(+), 57 deletions(-) diff --git a/src/components/Badge/Badge.vue b/src/components/Badge/Badge.vue index 66b91ac..2894663 100644 --- a/src/components/Badge/Badge.vue +++ b/src/components/Badge/Badge.vue @@ -1,33 +1,28 @@ diff --git a/src/components/Badge/composables/useBadgeClasses.ts b/src/components/Badge/composables/useBadgeClasses.ts index 4fde9d7..4996eb4 100644 --- a/src/components/Badge/composables/useBadgeClasses.ts +++ b/src/components/Badge/composables/useBadgeClasses.ts @@ -1,61 +1,65 @@ import type { BadgeType, BadgeSize } from '../types' -import { computed } from 'vue' -import type { Ref } from 'vue' -import classNames from 'classnames' +import { computed, type Ref, useAttrs } from 'vue' +import { twMerge } from 'tailwind-merge' const defaultBadgeClasses = 'mr-2 px-2.5 py-0.5 rounded flex items-center justify-center' const badgeLinkClasses = 'bg-blue-100 hover:bg-blue-200 text-blue-800 dark:text-blue-800 dark:hover:bg-blue-300' const onlyIconClasses = 'p-1 rounded-full mr-2' const badgeTextClasses: Record = { - default: 'text-blue-800 dark:text-blue-800', - dark: 'text-gray-800 dark:bg-gray-700', - red: 'text-red-800 dark:text-red-900', - green: 'text-green-800 dark:text-green-900', - yellow: 'text-yellow-800 dark:text-yellow-900', - indigo: 'text-indigo-800 dark:text-indigo-900', - purple: 'text-purple-800 dark:text-purple-900', - pink: 'text-pink-800 dark:text-pink-900', + default: 'text-blue-800 dark:text-blue-800', + dark: 'text-gray-800 dark:bg-gray-700', + red: 'text-red-800 dark:text-red-900', + green: 'text-green-800 dark:text-green-900', + yellow: 'text-yellow-800 dark:text-yellow-900', + indigo: 'text-indigo-800 dark:text-indigo-900', + purple: 'text-purple-800 dark:text-purple-900', + pink: 'text-pink-800 dark:text-pink-900', } const badgeTypeClasses: Record = { - default: 'bg-blue-100 dark:bg-blue-200', - dark: 'bg-gray-100 dark:bg-gray-700', - red: 'bg-red-100 dark:bg-red-200', - green: 'bg-green-100 dark:bg-green-200', - yellow: 'bg-yellow-100 dark:bg-yellow-200', - indigo: 'bg-indigo-100 dark:bg-indigo-200', - purple: 'bg-purple-100 dark:bg-purple-200', - pink: 'bg-pink-100 dark:bg-pink-200', + default: 'bg-blue-100 dark:bg-blue-200', + dark: 'bg-gray-100 dark:bg-gray-700', + red: 'bg-red-100 dark:bg-red-200', + green: 'bg-green-100 dark:bg-green-200', + yellow: 'bg-yellow-100 dark:bg-yellow-200', + indigo: 'bg-indigo-100 dark:bg-indigo-200', + purple: 'bg-purple-100 dark:bg-purple-200', + pink: 'bg-pink-100 dark:bg-pink-200', } const badgeSizeClasses: Record = { - xs: 'text-xs font-semibold', - sm: 'text-sm font-medium', + xs: 'text-xs font-semibold', + sm: 'text-sm font-medium', } export type UseBadgeClassesProps = { - type: Ref - size: Ref - href: Ref + type: BadgeType + size: BadgeSize + href: string | null } export type UseBadgeClassesOptions = { - isContentEmpty: Ref + isContentEmpty: Ref } -export function useBadgeClasses(props: UseBadgeClassesProps, options: UseBadgeClassesOptions): { - badgeClasses: Ref +export function useBadgeClasses( + props: UseBadgeClassesProps, + options: UseBadgeClassesOptions, +): { + badgeClasses: Ref } { - const badgeClasses = computed(() => { - return classNames( - badgeSizeClasses[props.size.value], - props.href.value ? '' : badgeTypeClasses[props.type.value], - props.href.value ? '' : badgeTextClasses[props.type.value], - props.href.value ? badgeLinkClasses : '', - options.isContentEmpty.value ? onlyIconClasses : defaultBadgeClasses, - ) - }) - return { - badgeClasses, - } + const attrs = useAttrs() + const badgeClasses = computed(() => { + return twMerge( + badgeSizeClasses[props.size], + props.href ? '' : badgeTypeClasses[props.type], + props.href ? '' : badgeTextClasses[props.type], + props.href ? badgeLinkClasses : '', + options.isContentEmpty.value ? onlyIconClasses : defaultBadgeClasses, + attrs.class as string, + ) + }) + return { + badgeClasses, + } }