From 3876d64b936399e3ead2d7a3e045fe1a343a668b Mon Sep 17 00:00:00 2001 From: Ilya Sosidka Date: Fri, 16 Sep 2022 17:09:08 +0300 Subject: [PATCH] feat: Implemented breadcrumbs component --- docs/.vitepress/config.ts | 2 +- docs/components/breadcrumb/breadcrumb.md | 48 ++++++++++++++++++- .../examples/BreadcrumbCustomIconsExample.vue | 26 ++++++++++ .../breadcrumb/examples/BreadcrumbExample.vue | 14 +++++- .../examples/BreadcrumbSolidExample.vue | 18 +++++++ src/components/Breadcrumb/Breadcrumb.vue | 33 ++++--------- src/components/Breadcrumb/BreadcrumbItem.vue | 35 ++++++++++++++ .../composables/useBreadcrumbClasses.ts | 35 ++++++++++++++ .../composables/useBreadcrumbItemClasses.ts | 26 ++++++++++ src/components/Breadcrumb/types.ts | 1 + src/index.ts | 3 +- 11 files changed, 212 insertions(+), 29 deletions(-) create mode 100644 docs/components/breadcrumb/examples/BreadcrumbCustomIconsExample.vue create mode 100644 docs/components/breadcrumb/examples/BreadcrumbSolidExample.vue create mode 100644 src/components/Breadcrumb/BreadcrumbItem.vue create mode 100644 src/components/Breadcrumb/composables/useBreadcrumbClasses.ts create mode 100644 src/components/Breadcrumb/composables/useBreadcrumbItemClasses.ts create mode 100644 src/components/Breadcrumb/types.ts diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index f1b615d..b580bf7 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -36,6 +36,7 @@ function getComponents() { return [ { text: 'Alert', link: '/components/alert/alert.md' }, { text: 'Avatar', link: 'components/avatar/avatar.md' }, + { text: 'Breadcrumb', link: 'components/breadcrumb/breadcrumb.md' }, { text: 'Button', link: '/components/button/button.md' }, { text: 'Button Group', link: '/components/buttonGroup/buttonGroup.md' }, { text: 'Dropdown', link: '/components/dropdown/dropdown.md' }, @@ -46,7 +47,6 @@ function getComponents() { { 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/breadcrumb/breadcrumb.md b/docs/components/breadcrumb/breadcrumb.md index 6e293c4..ed78a57 100644 --- a/docs/components/breadcrumb/breadcrumb.md +++ b/docs/components/breadcrumb/breadcrumb.md @@ -1,15 +1,59 @@ # Breadcrumb +The breadcrumb component is an important part of any website or application that can be used to show the current location of a page in a hierarchical structure of pages. + +Flowbite includes two styles of breadcrumb elements, one that has a transparent background and a few more that come with a background in different colors. + +## Default breadcrumb + + ```vue ``` - +## Solid Breadcrumb + + + +```vue + + +``` + +## Custom Icons + + diff --git a/docs/components/breadcrumb/examples/BreadcrumbCustomIconsExample.vue b/docs/components/breadcrumb/examples/BreadcrumbCustomIconsExample.vue new file mode 100644 index 0000000..bb61f9f --- /dev/null +++ b/docs/components/breadcrumb/examples/BreadcrumbCustomIconsExample.vue @@ -0,0 +1,26 @@ + + diff --git a/docs/components/breadcrumb/examples/BreadcrumbExample.vue b/docs/components/breadcrumb/examples/BreadcrumbExample.vue index 058a910..b39ba9a 100644 --- a/docs/components/breadcrumb/examples/BreadcrumbExample.vue +++ b/docs/components/breadcrumb/examples/BreadcrumbExample.vue @@ -1,8 +1,18 @@ diff --git a/docs/components/breadcrumb/examples/BreadcrumbSolidExample.vue b/docs/components/breadcrumb/examples/BreadcrumbSolidExample.vue new file mode 100644 index 0000000..2875c2d --- /dev/null +++ b/docs/components/breadcrumb/examples/BreadcrumbSolidExample.vue @@ -0,0 +1,18 @@ + + diff --git a/src/components/Breadcrumb/Breadcrumb.vue b/src/components/Breadcrumb/Breadcrumb.vue index 4424076..5f0027c 100644 --- a/src/components/Breadcrumb/Breadcrumb.vue +++ b/src/components/Breadcrumb/Breadcrumb.vue @@ -1,33 +1,20 @@ diff --git a/src/components/Breadcrumb/BreadcrumbItem.vue b/src/components/Breadcrumb/BreadcrumbItem.vue new file mode 100644 index 0000000..04c13de --- /dev/null +++ b/src/components/Breadcrumb/BreadcrumbItem.vue @@ -0,0 +1,35 @@ + + + diff --git a/src/components/Breadcrumb/composables/useBreadcrumbClasses.ts b/src/components/Breadcrumb/composables/useBreadcrumbClasses.ts new file mode 100644 index 0000000..779f779 --- /dev/null +++ b/src/components/Breadcrumb/composables/useBreadcrumbClasses.ts @@ -0,0 +1,35 @@ +import type { BreadcrumbType } from '../types' +import type { Ref } from 'vue' +import { computed } from 'vue' +import classNames from 'classnames' + +const breadcrumbDefaultClasses = 'inline-flex items-center space-x-1 md:space-x-3' +const breadcrumbWrapperVariantClasses: Record = { + default: 'flex', + solid: 'flex px-5 py-3 text-gray-700 border border-gray-200 rounded-lg bg-gray-50 dark:bg-gray-800 dark:border-gray-700', +} +export type useBreadcrumbProps = { + solid: Ref +} +export function useBreadcrumbClasses(props: useBreadcrumbProps): { + breadcrumbClasses: Ref + breadcrumbWrapperClasses: Ref +} { + const breadcrumbClasses = computed(() => { + return classNames( + breadcrumbDefaultClasses, + ) + }) + const breadcrumbWrapperClasses = computed(() => { + return classNames( + breadcrumbWrapperVariantClasses[props.solid.value ? 'solid' : 'defauilt' as BreadcrumbType], + ) + }) + + return { + breadcrumbClasses, + breadcrumbWrapperClasses, + } +} + + diff --git a/src/components/Breadcrumb/composables/useBreadcrumbItemClasses.ts b/src/components/Breadcrumb/composables/useBreadcrumbItemClasses.ts new file mode 100644 index 0000000..4bdb6b2 --- /dev/null +++ b/src/components/Breadcrumb/composables/useBreadcrumbItemClasses.ts @@ -0,0 +1,26 @@ +import type { Ref } from 'vue' +import { computed } from 'vue' +import classNames from 'classnames' + + +const breadcrumbItemDefaultClasses = 'ml-1 inline-flex items-center text-sm font-medium dark:text-gray-400' +const breadcrumbItemLinkClasses = 'text-gray-700 hover:text-gray-900 dark:hover:text-white' +const breadcrumbSpanClasses = 'text-gray-500' +export type useBreadcrumbItemProps = { + href: Ref + home: Ref +} +export function useBreadcrumbItemClasses(props: useBreadcrumbItemProps): { + breadcrumbItemClasses: Ref +} { + const breadcrumbItemClasses = computed(() => { + return classNames( + breadcrumbItemDefaultClasses, + props.href.value ? breadcrumbItemLinkClasses : breadcrumbSpanClasses, + ) + }) + + return { + breadcrumbItemClasses, + } +} diff --git a/src/components/Breadcrumb/types.ts b/src/components/Breadcrumb/types.ts new file mode 100644 index 0000000..6332b1c --- /dev/null +++ b/src/components/Breadcrumb/types.ts @@ -0,0 +1 @@ +export type BreadcrumbType = 'default' | 'solid' diff --git a/src/index.ts b/src/index.ts index 34a6643..c428d4c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,13 +7,14 @@ export { default as Tab } from './components/Tabs/components/Tab/Tab.vue' export { default as Dropdown } from './components/Dropdown/Dropdown.vue' export { default as FlowbiteThemable } from './components/utils/FlowbiteThemable/FlowbiteThemable.vue' export { default as FlowbiteThemableChild } from './components/utils/FlowbiteThemable/components/FlowbiteThemableChild/FlowbiteThemableChild.vue' +export { default as Breadcrumb } from './components/Breadcrumb/Breadcrumb.vue' +export { default as BreadcrumbItem } from './components/Breadcrumb/BreadcrumbItem.vue' export { default as Avatar } from './components/Avatar/Avatar.vue' export { default as StackedAvatars } from './components/Avatar/StackedAvatars.vue' export { default as StackedAvatarsCounter } from './components/Avatar/StackedAvatarsCounter.vue' export { default as Accordion } from './components/Accordion/Accordion.vue' export { default as Badge } from './components/Badge/Badge.vue' -export { default as Breadcrumb } from './components/Breadcrumb/Breadcrumb.vue' export { default as Card } from './components/Card/Card.vue' export { default as Carousel } from './components/Carousel/Carousel.vue' export { default as Footer } from './components/Footer/Footer.vue'