diff --git a/src/stories/components/Table/Table.stories.ts b/src/stories/components/Table/Table.stories.ts new file mode 100644 index 0000000000000000000000000000000000000000..f4d0a1d79d469b30df5acf0040845d3063ac6a5f --- /dev/null +++ b/src/stories/components/Table/Table.stories.ts @@ -0,0 +1,212 @@ +import type { Meta, StoryObj } from '@storybook/vue3'; + +import Table from './Table.vue'; + +const meta: Meta = { + title: 'Components/Table', + component: Table, + tags: ['autodocs'], + parameters: { + docs: { + description: { + component: 'A component that is used as a Table. Can be used with icon.', + }, + }, + }, + argTypes: { + columns: { control: 'object' }, + data: { control: 'object' }, + size: { control: 'select', options: ['small', 'normal', 'large', 'huge'] }, + fontSize: { control: 'text' }, + gap: { control: 'text' }, + width: { control: 'text' }, + showAllLines: { control: 'boolean' }, + darknessTheme: { control: 'select', options: ['100', '200', '300', '400', '500', '600', '700', '800', '900'] }, + darknessTextColor: { + control: 'select', + options: ['100', '200', '300', '400', '500', '600', '700', '800', '900'], + }, + theme: { + control: 'select', + options: [ + 'white', + 'blue', + 'sky', + 'cyan', + 'teal', + 'green', + 'yellow', + 'orange', + 'pink', + 'fuchsia', + 'purple', + 'indigo', + 'rose', + 'red', + 'black', + ], + }, + textColor: { + control: 'select', + options: [ + 'white', + 'blue', + 'sky', + 'cyan', + 'teal', + 'green', + 'yellow', + 'orange', + 'pink', + 'fuchsia', + 'purple', + 'indigo', + 'rose', + 'red', + 'black', + ], + }, + border: { + control: 'select', + options: [ + 'white', + 'blue', + 'sky', + 'cyan', + 'teal', + 'green', + 'yellow', + 'orange', + 'pink', + 'fuchsia', + 'purple', + 'indigo', + 'rose', + 'red', + 'black', + ], + }, + }, + args: {}, +} satisfies Meta<typeof Table>; + +export default meta; + +type Story = StoryObj<typeof meta>; + +export const Primary: Story = { + args: { + columns: [ + { + name: 'Name', + type: 'text', + }, + { + name: 'Age', + type: 'text', + }, + { + name: 'Hobbies', + type: 'text', + }, + ], + data: [ + [ + { + value: 'Pete', + }, + { + value: '30', + }, + { + value: 'Chess', + }, + ], + [ + { + value: 'John', + }, + { + value: '25', + }, + { + value: 'Football', + }, + ], + ], + }, +}; + +export const Full: Story = { + args: { + columns: [ + { + name: 'Name', + type: 'text', + }, + { + name: 'Age', + type: 'text', + }, + { + name: 'Hobbies', + type: 'text', + }, + { + name: 'Country', + type: 'text', + }, + ], + + data: [ + [ + { + value: 'Pete', + }, + { + value: '30', + }, + { + value: 'Chess', + }, + { + value: 'USA', + }, + ], + [ + { + value: 'John', + }, + { + value: '25', + }, + { + value: 'Football', + }, + { + value: 'Canada', + }, + ], + [ + { + value: 'Дима', + }, + { + value: '22', + }, + { + value: 'Frontend', + }, + { + value: 'Russia', + }, + ], + ], + + fontSize: '32px', + showAllLines: true, + gap: '70px', + border: 'fuchsia', + theme: 'black', + }, +}; diff --git a/src/stories/components/Table/Table.vue b/src/stories/components/Table/Table.vue new file mode 100644 index 0000000000000000000000000000000000000000..2372edc753c179565c5e22c674d90edbdf957050 --- /dev/null +++ b/src/stories/components/Table/Table.vue @@ -0,0 +1,98 @@ +<script setup lang="ts"> +import type { ITableProps } from '@interfaces/componentsProps'; +import { computed } from 'vue'; +import { convertThemeToColor, convertThemeToSecondaryColor, convertThemeToTextColor } from '@helpers/common'; + +const props = withDefaults(defineProps<ITableProps>(), { + gap: '5px', + theme: 'white', + darknessTheme: 500, + fontSize: '16px', +}); +const gap = computed(() => props.gap); +// const emit = defineEmits(['']); +const data = defineModel('data'); +// watch(, () => {}); +const themeColor = computed(() => convertThemeToColor(props.theme, props.darknessTheme)); +const color = computed(() => + props.textColor + ? convertThemeToColor(props.textColor, props.darknessTextColor) + : convertThemeToTextColor(props.theme, props.darknessTheme), +); +const borderColor = computed(() => convertThemeToSecondaryColor(props.theme, props.darknessTheme)); +</script> + +<template> + <table + :style="`background-color: ${themeColor}; color: ${color}`" + :class="{ + tableLines: showAllLines, + }" + > + <thead> + <tr> + <th + :class="{ + leftBorder: showAllLines, + }" + v-for="column of columns" + :key="column.name" + class="columnHeader" + style="padding: 5px 0 5px 5px" + > + <div class="columnFlex"> + {{ column.name }} + <div></div> + </div> + </th> + </tr> + </thead> + <tbody> + <tr v-for="(row, index) of data" :key="index"> + <td + :class="{ + leftBorder: showAllLines, + }" + v-for="item of row" + :key="item.value" + style="padding: 5px" + > + {{ item.value }} + </td> + </tr> + </tbody> + </table> +</template> + +<style scoped> +table { + border-collapse: collapse; +} +table * { + font-size: v-bind(fontSize); +} +tr { + position: relative; +} +tr::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 1px; + background-color: v-bind(borderColor); +} +.columnFlex { + display: flex; + gap: v-bind(gap); + font-weight: bold; +} +.tableLines { + border-top: 1px solid v-bind(borderColor); + border-right: 1px solid v-bind(borderColor); +} +.leftBorder { + border-left: 1px solid v-bind(borderColor); +} +</style>