diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index b580bf7..f037a76 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -38,6 +38,7 @@ function getComponents() { { text: 'Avatar', link: 'components/avatar/avatar.md' }, { text: 'Breadcrumb', link: 'components/breadcrumb/breadcrumb.md' }, { text: 'Button', link: '/components/button/button.md' }, + { text: 'Badge', link: 'components/badge/badge.md' }, { text: 'Button Group', link: '/components/buttonGroup/buttonGroup.md' }, { text: 'Dropdown', link: '/components/dropdown/dropdown.md' }, { text: 'Spinner', link: '/components/spinner/spinner.md' }, @@ -46,7 +47,7 @@ function getComponents() { { text: 'Toast', link: 'components/toast/toast.md' }, { text: '- Accordion', link: 'components/accordion/accordion.md' }, - { text: '- Badge', link: 'components/badge/badge.md' }, + { text: '- Breadcrumb', link: 'components/breadcrumb/breadcrumb.md' }, { text: '- Card', link: 'components/card/card.md' }, { text: '- Carousel', link: 'components/carousel/carousel.md' }, { text: '- Footer', link: 'components/footer/footer.md' }, 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'