diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 77bc3cf..8e0c1f8 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -53,3 +53,18 @@ jobs: cache: 'npm' - run: npm i - run: npm run build:package + build-types: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [ 16.x, 18.x ] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm i + - run: npm run build:types diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index b4f2b3a..fe1830a 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -11,17 +11,23 @@ function buildSidebar() { { text: 'Components', collapsible: true, - items: [...getComponents()], + items: [ + ...getComponents(), + ], }, { text: 'Form', collapsible: true, - items: [...getFormComponents()], + items: [ + ...getFormComponents(), + ], }, { text: 'Utils', collapsible: true, - items: [...getUtils()], + items: [ + ...getUtils(), + ], }, ] } @@ -41,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: 'Timeline', link: 'components/timeline' }, @@ -52,18 +59,19 @@ function getComponents() { { text: '- Footer', link: 'components/footer' }, { text: '- Pagination', link: 'components/pagination' }, { text: '- Sidebar', link: 'components/sidebar' }, - { text: '- Table', link: 'components/table' }, ] } function getFormComponents() { - return [{ text: 'Input', link: 'components/input' }] + return [ + { text: 'Input', link: 'components/input' }, + ] } function getUtils() { return [ { text: 'Flowbite Themable', link: '/components/flowbiteThemable/flowbiteThemable.md' }, - { text: 'Toast Provider', link: '/components/toastProvider/toastProvider.md' }, + { text: 'Toast Provider', link: '/components/toastProvider/toastProvider.md' } ] } @@ -74,18 +82,21 @@ function getUtils() { export default defineConfig({ title: 'Flowbite Vue 3', cleanUrls: 'without-subfolders', - head: [['link', { rel: 'icon', type: 'image/svg', href: '/assets/logo.svg' }]], + head: [ + ['link', { rel: "icon", type: "image/svg", href: "/assets/logo.svg"}], + ], themeConfig: { sidebar: buildSidebar(), logo: '/assets/logo.svg', socialLinks: [ { icon: 'github', link: 'https://github.com/themesberg/flowbite-vue' }, - { icon: 'discord', link: 'https://discord.gg/4eeurUVvTy' }, + { icon: 'discord', link: 'https://discord.gg/4eeurUVvTy' } ], footer: { message: 'Released under the MIT License.', - copyright: 'Copyright © 2022 Flowbite™', + copyright: 'Copyright © 2022 Flowbite™' }, + }, }) 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/package-lock.json b/package-lock.json index 8832eaf..b856eee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "flowbite-vue", - "version": "0.0.9", + "version": "0.0.10", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "flowbite-vue", - "version": "0.0.9", + "version": "0.0.10", "license": "MIT", "dependencies": { "@vueuse/core": "9.3.0", @@ -42,8 +42,8 @@ "vue-tsc": "0.30.0" }, "engines": { - "node": "14.x", - "npm": "8.x" + "node": ">=14.x", + "npm": ">=6.x" }, "peerDependencies": { "tailwindcss": "^3", @@ -357,15 +357,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -393,9 +393,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -2811,9 +2811,9 @@ } }, "node_modules/globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -4768,14 +4768,14 @@ "dev": true }, "node_modules/vitepress/node_modules/@vueuse/core": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.6.0.tgz", - "integrity": "sha512-qGUcjKQXHgN+jqXEgpeZGoxdCbIDCdVPz3QiF1uyecVGbMuM63o96I1GjYx5zskKgRI0FKSNsVWM7rwrRMTf6A==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.7.0.tgz", + "integrity": "sha512-/AGY/t7jJPxCyRoVTygNKoroTiCvRaaZIW+yeSlBCnI7QRpQ9cvXNTdNaSl3GvSyFbn83+XwZwEZvI1OpQfeGw==", "dev": true, "dependencies": { "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.6.0", - "@vueuse/shared": "9.6.0", + "@vueuse/metadata": "9.7.0", + "@vueuse/shared": "9.7.0", "vue-demi": "*" }, "funding": { @@ -4809,18 +4809,18 @@ } }, "node_modules/vitepress/node_modules/@vueuse/metadata": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.6.0.tgz", - "integrity": "sha512-sIC8R+kWkIdpi5X2z2Gk8TRYzmczDwHRhEFfCu2P+XW2JdPoXrziqsGpDDsN7ykBx4ilwieS7JUIweVGhvZ93w==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.7.0.tgz", + "integrity": "sha512-M7WsAgw28FNtTH0bzsGuHEtJOPJqPpyeHS6PHq+8UesLgNjZ9waMAntiUrgUQlxt09M4i2lH7y9sRi0jkfeXGA==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/vitepress/node_modules/@vueuse/shared": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.6.0.tgz", - "integrity": "sha512-/eDchxYYhkHnFyrb00t90UfjCx94kRHxc7J1GtBCqCG4HyPMX+krV9XJgVtWIsAMaxKVU4fC8NSUviG1JkwhUQ==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.7.0.tgz", + "integrity": "sha512-pwmt1y3TJ2s5KqWmkv9ZKEV59GwuZQZk8XLiU+hGswz0jej318ozbea9E4A/A50ksyM26swSFr7sZ9llNPsZHg==", "dev": true, "dependencies": { "vue-demi": "*" @@ -4988,9 +4988,9 @@ } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", - "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", "dev": true }, "node_modules/vscode-languageserver-types": { @@ -5048,9 +5048,9 @@ } }, "node_modules/vscode-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.6.tgz", - "integrity": "sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", "dev": true }, "node_modules/vscode-vue-languageservice": { @@ -5641,15 +5641,15 @@ "optional": true }, "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -5671,9 +5671,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -7400,9 +7400,9 @@ } }, "globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -8801,14 +8801,14 @@ "dev": true }, "@vueuse/core": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.6.0.tgz", - "integrity": "sha512-qGUcjKQXHgN+jqXEgpeZGoxdCbIDCdVPz3QiF1uyecVGbMuM63o96I1GjYx5zskKgRI0FKSNsVWM7rwrRMTf6A==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.7.0.tgz", + "integrity": "sha512-/AGY/t7jJPxCyRoVTygNKoroTiCvRaaZIW+yeSlBCnI7QRpQ9cvXNTdNaSl3GvSyFbn83+XwZwEZvI1OpQfeGw==", "dev": true, "requires": { "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.6.0", - "@vueuse/shared": "9.6.0", + "@vueuse/metadata": "9.7.0", + "@vueuse/shared": "9.7.0", "vue-demi": "*" }, "dependencies": { @@ -8822,15 +8822,15 @@ } }, "@vueuse/metadata": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.6.0.tgz", - "integrity": "sha512-sIC8R+kWkIdpi5X2z2Gk8TRYzmczDwHRhEFfCu2P+XW2JdPoXrziqsGpDDsN7ykBx4ilwieS7JUIweVGhvZ93w==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.7.0.tgz", + "integrity": "sha512-M7WsAgw28FNtTH0bzsGuHEtJOPJqPpyeHS6PHq+8UesLgNjZ9waMAntiUrgUQlxt09M4i2lH7y9sRi0jkfeXGA==", "dev": true }, "@vueuse/shared": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.6.0.tgz", - "integrity": "sha512-/eDchxYYhkHnFyrb00t90UfjCx94kRHxc7J1GtBCqCG4HyPMX+krV9XJgVtWIsAMaxKVU4fC8NSUviG1JkwhUQ==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.7.0.tgz", + "integrity": "sha512-pwmt1y3TJ2s5KqWmkv9ZKEV59GwuZQZk8XLiU+hGswz0jej318ozbea9E4A/A50ksyM26swSFr7sZ9llNPsZHg==", "dev": true, "requires": { "vue-demi": "*" @@ -8938,9 +8938,9 @@ } }, "vscode-languageserver-textdocument": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", - "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", "dev": true }, "vscode-languageserver-types": { @@ -8996,9 +8996,9 @@ } }, "vscode-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.6.tgz", - "integrity": "sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", "dev": true }, "vscode-vue-languageservice": { diff --git a/package.json b/package.json index 4fba9f5..c96214f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flowbite-vue", - "version": "0.0.9", + "version": "0.0.10", "repository": "https://github.com/themesberg/flowbite-vue.git", "author": "themesberg", "license": "MIT", @@ -74,7 +74,7 @@ "tailwindcss": "^3" }, "engines": { - "node": "14.x", - "npm": "8.x" + "node": ">=14.x", + "npm": ">=6.x" } } diff --git a/src/components/Accordion/AccordionContent.vue b/src/components/Accordion/AccordionContent.vue index 25e9274..8360fe5 100644 --- a/src/components/Accordion/AccordionContent.vue +++ b/src/components/Accordion/AccordionContent.vue @@ -12,11 +12,10 @@ 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 7d76c84..1a34345 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 TimelineItem } from './components/Timeline/TimelineItem.vue' export { default as TimelinePoint } from './components/Timeline/TimelinePoint.vue'