From ac84ca2353242d52ba6191d543221e5216ee2a51 Mon Sep 17 00:00:00 2001 From: Ilya Sosidka Date: Sat, 3 Sep 2022 10:23:50 +0300 Subject: [PATCH] feat: Added badge component --- docs/components/badge/badge.md | 105 +++++++++++++++++- .../badge/examples/BadgeExample.vue | 8 -- .../badge/examples/BadgeIconsExample.vue | 19 ++++ .../badge/examples/BadgeLinksExample.vue | 9 ++ .../badge/examples/BadgeOnlyIconsExample.vue | 22 ++++ .../badge/examples/BadgeSizesExample.vue | 15 +++ .../badge/examples/BadgeTypesExample.vue | 15 +++ src/components/Badge/Badge.vue | 38 +++---- .../Badge/composables/useBadgeClasses.ts | 61 ++++++++++ src/components/Badge/types.ts | 2 + 10 files changed, 264 insertions(+), 30 deletions(-) delete mode 100644 docs/components/badge/examples/BadgeExample.vue create mode 100644 docs/components/badge/examples/BadgeIconsExample.vue create mode 100644 docs/components/badge/examples/BadgeLinksExample.vue create mode 100644 docs/components/badge/examples/BadgeOnlyIconsExample.vue create mode 100644 docs/components/badge/examples/BadgeSizesExample.vue create mode 100644 docs/components/badge/examples/BadgeTypesExample.vue create mode 100644 src/components/Badge/composables/useBadgeClasses.ts create mode 100644 src/components/Badge/types.ts diff --git a/docs/components/badge/badge.md b/docs/components/badge/badge.md index 04fab9b..5ba67ce 100644 --- a/docs/components/badge/badge.md +++ b/docs/components/badge/badge.md @@ -1,15 +1,114 @@ # Badge +#### Use Tailwind CSS badges as elements to show counts or labels separately or inside other components +--- + +:::tip +Original reference: [https://flowbite.com/docs/components/badge/](https://flowbite.com/docs/components/badge/) +::: + +The badge component can be used to complement other elements such as buttons or text elements as a label or to show the count of a given data, such as the number of comments for an article or how much time has passed by since a comment has been made. +Alternatively, badges can also be used as standalone elements that link to a certain page by using the anchor tag instead of a span element. + + + +## Default badge +Prop – type + + + ```vue ``` - +## Large badges +Prop – size + + + +```vue + + +``` + +## Badges as links +You can also use badges as anchor elements to link to another page. +Prop – href + +```vue + + +``` + + + +## Badges with icon +You can also use SVG icons inside the badge elements. +slot icon + +```vue + + +``` + + + +## Badge with icon only + +```vue + + +``` + + diff --git a/docs/components/badge/examples/BadgeExample.vue b/docs/components/badge/examples/BadgeExample.vue deleted file mode 100644 index bd3201a..0000000 --- a/docs/components/badge/examples/BadgeExample.vue +++ /dev/null @@ -1,8 +0,0 @@ - - diff --git a/docs/components/badge/examples/BadgeIconsExample.vue b/docs/components/badge/examples/BadgeIconsExample.vue new file mode 100644 index 0000000..7691718 --- /dev/null +++ b/docs/components/badge/examples/BadgeIconsExample.vue @@ -0,0 +1,19 @@ + + diff --git a/docs/components/badge/examples/BadgeLinksExample.vue b/docs/components/badge/examples/BadgeLinksExample.vue new file mode 100644 index 0000000..81da5b9 --- /dev/null +++ b/docs/components/badge/examples/BadgeLinksExample.vue @@ -0,0 +1,9 @@ + + diff --git a/docs/components/badge/examples/BadgeOnlyIconsExample.vue b/docs/components/badge/examples/BadgeOnlyIconsExample.vue new file mode 100644 index 0000000..88bc01f --- /dev/null +++ b/docs/components/badge/examples/BadgeOnlyIconsExample.vue @@ -0,0 +1,22 @@ + + diff --git a/docs/components/badge/examples/BadgeSizesExample.vue b/docs/components/badge/examples/BadgeSizesExample.vue new file mode 100644 index 0000000..9a27e57 --- /dev/null +++ b/docs/components/badge/examples/BadgeSizesExample.vue @@ -0,0 +1,15 @@ + + diff --git a/docs/components/badge/examples/BadgeTypesExample.vue b/docs/components/badge/examples/BadgeTypesExample.vue new file mode 100644 index 0000000..1c864b8 --- /dev/null +++ b/docs/components/badge/examples/BadgeTypesExample.vue @@ -0,0 +1,15 @@ + + diff --git a/src/components/Badge/Badge.vue b/src/components/Badge/Badge.vue index b5749a0..66b91ac 100644 --- a/src/components/Badge/Badge.vue +++ b/src/components/Badge/Badge.vue @@ -1,33 +1,33 @@ diff --git a/src/components/Badge/composables/useBadgeClasses.ts b/src/components/Badge/composables/useBadgeClasses.ts new file mode 100644 index 0000000..4fde9d7 --- /dev/null +++ b/src/components/Badge/composables/useBadgeClasses.ts @@ -0,0 +1,61 @@ +import type { BadgeType, BadgeSize } from '../types' +import { computed } from 'vue' +import type { Ref } from 'vue' +import classNames from 'classnames' + +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', +} + +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', +} + +const badgeSizeClasses: Record = { + xs: 'text-xs font-semibold', + sm: 'text-sm font-medium', +} + +export type UseBadgeClassesProps = { + type: Ref + size: Ref + href: Ref +} +export type UseBadgeClassesOptions = { + isContentEmpty: 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, + } +} diff --git a/src/components/Badge/types.ts b/src/components/Badge/types.ts new file mode 100644 index 0000000..388848c --- /dev/null +++ b/src/components/Badge/types.ts @@ -0,0 +1,2 @@ +export type BadgeType = 'default' | 'dark' | 'red' | 'green' | 'yellow' | 'indigo' | 'purple' | 'pink' +export type BadgeSize = 'xs' | 'sm'