diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 492e67d..38db977 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -47,6 +47,7 @@ function getComponents() { { text: 'Progress', link: 'components/progress' }, { text: 'Rating', link: 'components/rating' }, { text: 'Spinner', link: '/components/spinner' }, + { text: 'Table', link: 'components/table' }, { text: 'Tabs', link: '/components/tabs' }, { text: 'ListGroup', link: 'components/list-group' }, { text: 'Toast', link: 'components/toast' }, @@ -57,7 +58,6 @@ function getComponents() { { text: '- Footer', link: 'components/footer' }, { text: '- Pagination', link: 'components/pagination' }, { text: '- Sidebar', link: 'components/sidebar' }, - { text: '- Table', link: 'components/table' }, { text: '- Timeline', link: 'components/timeline' }, ] } diff --git a/docs/components/table.md b/docs/components/table.md index 163ec9d..3d9f3a2 100644 --- a/docs/components/table.md +++ b/docs/components/table.md @@ -1,15 +1,219 @@ # Vue Table Component - Flowbite -```vue - - -``` +#### Button groups are a Tailwind CSS powered set of buttons sticked together in a horizontal line + +--- + +:::tip +Original reference: [https://flowbite.com/docs/components/tables/](https://flowbite.com/docs/components/tables/) +::: + +## Basic example + +```vue + + + +``` + +## Striped example + + + +```vue + + + +``` + +## Striped columns example + + + +```vue + + + +``` + +## Hoverable example + + + +```vue + + + +``` diff --git a/docs/components/table/examples/TableExample.vue b/docs/components/table/examples/TableExample.vue index e2c2921..0258b50 100644 --- a/docs/components/table/examples/TableExample.vue +++ b/docs/components/table/examples/TableExample.vue @@ -1,8 +1,43 @@ diff --git a/docs/components/table/examples/TableHoverableExample.vue b/docs/components/table/examples/TableHoverableExample.vue new file mode 100644 index 0000000..40488b0 --- /dev/null +++ b/docs/components/table/examples/TableHoverableExample.vue @@ -0,0 +1,43 @@ + + diff --git a/docs/components/table/examples/TableStripedColumnsExample.vue b/docs/components/table/examples/TableStripedColumnsExample.vue new file mode 100644 index 0000000..7508083 --- /dev/null +++ b/docs/components/table/examples/TableStripedColumnsExample.vue @@ -0,0 +1,43 @@ + + diff --git a/docs/components/table/examples/TableStripedExample.vue b/docs/components/table/examples/TableStripedExample.vue new file mode 100644 index 0000000..bfbb7d5 --- /dev/null +++ b/docs/components/table/examples/TableStripedExample.vue @@ -0,0 +1,43 @@ + + diff --git a/src/components/Table/Table.vue b/src/components/Table/Table.vue index ff2de14..cb190ec 100644 --- a/src/components/Table/Table.vue +++ b/src/components/Table/Table.vue @@ -1,104 +1,29 @@ diff --git a/src/components/Table/TableBody.vue b/src/components/Table/TableBody.vue new file mode 100644 index 0000000..9a1b1f0 --- /dev/null +++ b/src/components/Table/TableBody.vue @@ -0,0 +1,7 @@ + + diff --git a/src/components/Table/TableCell.vue b/src/components/Table/TableCell.vue new file mode 100644 index 0000000..9bc5e9a --- /dev/null +++ b/src/components/Table/TableCell.vue @@ -0,0 +1,11 @@ + + diff --git a/src/components/Table/TableHead.vue b/src/components/Table/TableHead.vue new file mode 100644 index 0000000..16aba62 --- /dev/null +++ b/src/components/Table/TableHead.vue @@ -0,0 +1,9 @@ + + diff --git a/src/components/Table/TableHeadCell.vue b/src/components/Table/TableHeadCell.vue new file mode 100644 index 0000000..b8e08b6 --- /dev/null +++ b/src/components/Table/TableHeadCell.vue @@ -0,0 +1,10 @@ + + diff --git a/src/components/Table/TableRow.vue b/src/components/Table/TableRow.vue new file mode 100644 index 0000000..f129b2a --- /dev/null +++ b/src/components/Table/TableRow.vue @@ -0,0 +1,10 @@ + + diff --git a/src/components/Table/composables/useTableCellClasses.ts b/src/components/Table/composables/useTableCellClasses.ts new file mode 100644 index 0000000..86cd6c8 --- /dev/null +++ b/src/components/Table/composables/useTableCellClasses.ts @@ -0,0 +1,20 @@ +import { computed, inject } from 'vue' +import type { Ref } from 'vue' +import classNames from 'classnames' + +const baseClasses = 'px-6 py-4 first:font-medium first:text-gray-900 first:dark:text-white first:whitespace-nowrap last:text-right' +const stripedCellClasses = 'even:bg-gray-white even:dark:bg-gray-900 odd:dark:bg-gray-800 odd:bg-gray-50' + +export function useTableCellClasses(): { tableCellClasses: Ref } { + const isColumnsStriped = inject('stripedColumns') + + const tableCellClasses = computed(() => { + return classNames(baseClasses, { + [stripedCellClasses]: isColumnsStriped, + }) + }) + + return { + tableCellClasses, + } +} diff --git a/src/components/Table/composables/useTableHeadCellClasses.ts b/src/components/Table/composables/useTableHeadCellClasses.ts new file mode 100644 index 0000000..f928fe8 --- /dev/null +++ b/src/components/Table/composables/useTableHeadCellClasses.ts @@ -0,0 +1,20 @@ +import { computed, inject } from 'vue' +import type { Ref } from 'vue' +import classNames from 'classnames' + +const baseClasses = 'px-6 py-3 text-xs uppercase' +const stripedHeadCellClasses = 'even:bg-white even:dark:bg-gray-900 odd:dark:bg-gray-800 odd:bg-gray-50' + +export function useTableHeadCellClasses(): { tableHeadCellClasses: Ref } { + const isColumnsStriped = inject('stripedColumns') + + const tableHeadCellClasses = computed(() => { + return classNames(baseClasses, { + [stripedHeadCellClasses]: isColumnsStriped, + }) + }) + + return { + tableHeadCellClasses, + } +} diff --git a/src/components/Table/composables/useTableRowClasses.ts b/src/components/Table/composables/useTableRowClasses.ts new file mode 100644 index 0000000..75209e5 --- /dev/null +++ b/src/components/Table/composables/useTableRowClasses.ts @@ -0,0 +1,23 @@ +import { computed, inject } from 'vue' +import type { Ref } from 'vue' +import classNames from 'classnames' + +const baseClasses = 'bg-white dark:bg-gray-800 [&:not(:last-child)]:border-b [&:not(:last-child)]:dark:border-gray-700' +const stripedClasses = 'odd:bg-white even:bg-gray-50 odd:dark:bg-gray-800 even:dark:bg-gray-700' +const hoverableClasses = 'hover:bg-gray-50 dark:hover:bg-gray-600' + +export function useTableRowClasses(): { tableRowClasses: Ref } { + const isStriped = inject('striped') + const isHoverable = inject('hoverable') + + const tableRowClasses = computed(() => { + return classNames(baseClasses, { + [stripedClasses]: isStriped, + [hoverableClasses]: isHoverable, + }) + }) + + return { + tableRowClasses, + } +} diff --git a/src/index.ts b/src/index.ts index 9de0f19..466a0a8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -32,6 +32,11 @@ export { default as Progress } from './components/Progress/Progress.vue' export { default as Rating } from './components/Rating/Rating.vue' export { default as Sidebar } from './components/Sidebar/Sidebar.vue' export { default as Table } from './components/Table/Table.vue' +export { default as TableHead } from './components/Table/TableHead.vue' +export { default as TableBody } from './components/Table/TableBody.vue' +export { default as TableHeadCell } from './components/Table/TableHeadCell.vue' +export { default as TableRow } from './components/Table/TableRow.vue' +export { default as TableCell } from './components/Table/TableCell.vue' export { default as Timeline } from './components/Timeline/Timeline.vue' export { default as Toast } from './components/Toast/Toast.vue' export { default as ToastProvider } from './components/Toast/components/ToastProvider/ToastProvider.vue'