@gits-id/button
Version:
GITS Button Component
463 lines (438 loc) • 13 kB
text/typescript
import {Meta, Story} from '@storybook/vue3';
import VBtn from './VBtn.vue';
import type {Props as VBtnProps} from './VBtn.vue';
import VIcon from '@gits-id/icon';
import {defaultColors} from '@gits-id/theme/defaultTheme';
import VBtnGroup from './VBtnGroup.vue';
import VBtnToolbar from './VBtnToolbar.vue';
import './VBtn.dark.scss';
const colors = defaultColors;
const defaultSizes = ['sm', 'md', 'lg'];
export default {
component: VBtn,
title: 'Forms/Button',
argTypes: {
color: {
control: 'select',
options: colors,
},
size: {
control: 'select',
options: defaultSizes,
},
},
parameters: {
docs: {
source: {
type: 'code',
},
},
},
} as Meta;
const Template: Story<VBtnProps> = (args) => ({
components: {VBtn},
setup() {
return {args, colors};
},
template: `<div class="space-x-2 space-y-2">
<VBtn v-for="color in colors" :key="color" v-bind="args" :color="color">
<span>{{ args.label || color }}</span>
</VBtn>
</div>
`,
});
export const Default = Template.bind({});
Default.args = {};
Default.parameters = {
docs: {
source: {
code: `<v-btn>Button</v-btn>
<v-btn color="primary">Button</v-btn>
<v-btn color="secondary">Button</v-btn>
<v-btn color="info">Button</v-btn>
<v-btn color="warning">Button</v-btn>
<v-btn color="success">Button</v-btn>
<v-btn color="error">Button</v-btn>
<v-btn color="dark">Button</v-btn>
`,
},
},
};
export const Outlined = Template.bind({});
Outlined.args = {color: 'primary', outlined: true};
Outlined.parameters = {
docs: {
source: {
code: '<v-btn color="primary" outlined>Button</v-btn>',
},
},
};
export const Text = Template.bind({});
Text.args = {color: 'primary', text: true};
Text.parameters = {
docs: {
source: {
code: '<v-btn color="primary" text>Button</v-btn>',
},
},
};
export const Rounded = Template.bind({});
Rounded.args = {color: 'primary', rounded: true};
Rounded.parameters = {
docs: {
source: {
code: '<v-btn color="primary" rounded>Button</v-btn>',
},
},
};
export const Tile = Template.bind({});
Tile.args = {color: 'primary', tile: true};
Tile.parameters = {
docs: {
source: {
code: '<v-btn color="primary" tile>Button</v-btn>',
},
},
};
export const Flush = Template.bind({});
Flush.args = {color: 'primary', flush: true, text: true};
Flush.parameters = {
docs: {
source: {
code: '<v-btn color="primary" flush text>Button</v-btn>',
},
},
};
export const Disabled = Template.bind({});
Disabled.args = {color: 'primary', disabled: true};
Disabled.parameters = {
docs: {
source: {
code: '<v-btn color="primary" disabled>Button</v-btn>',
},
},
};
export const OutlinedDisabled = Template.bind({});
OutlinedDisabled.args = {color: 'primary', disabled: true, outlined: true};
OutlinedDisabled.parameters = {
docs: {
source: {
code: '<v-btn color="primary" disabled outlined>Button</v-btn>',
},
},
};
export const Loading = Template.bind({});
Loading.args = {color: 'primary', loading: true};
Loading.parameters = {
docs: {
source: {
code: '<v-btn color="primary" loading>Button</v-btn>',
},
},
};
export const Block = Template.bind({});
Block.args = {color: 'primary', block: true};
Block.parameters = {
docs: {
source: {
code: '<v-btn color="primary" block>Button</v-btn>',
},
},
};
export const Shadow = Template.bind({});
Shadow.args = {color: 'primary', shadow: true};
Shadow.parameters = {
docs: {
source: {
code: '<v-btn color="primary" shadow>Button</v-btn>',
},
},
};
export const NoRingEffect = Template.bind({});
NoRingEffect.args = {color: 'primary', noRing: true};
NoRingEffect.parameters = {
docs: {
source: {
code: '<v-btn color="primary" no-ring>Button</v-btn>',
},
},
};
export const Sizes: Story<VBtnProps> = (args) => ({
components: {Button: VBtn},
setup() {
return {args, sizes: defaultSizes, defaultColors};
},
template: `
<div v-for="color in defaultColors" :key="color" class="mb-6">
<div>
<div class="font-semibold text-lg mb-2">{{color}}</div>
<div class="flex items-end gap-2">
<Button v-for="size in sizes" :key="size" v-bind="args" :color="color" :size="size">
{{ size }}
</Button>
</div>
</div>
</div>`,
});
Sizes.parameters = {
docs: {
source: {
code: `
<v-btn size="xs"> Button </v-btn>
<v-btn size="sm"> Button </v-btn>
<v-btn size="md"> Button </v-btn>
<v-btn size="lg"> Button </v-btn>
<v-btn size="xl"> Button </v-btn>
`,
},
},
};
export const Icons: Story<VBtnProps> = (args) => ({
components: {VBtn},
template: `
<div class="flex gap-2">
<VBtn prefix-icon="ri:search-2-line">
</VBtn>
<VBtn prefix-icon="ri:search-2-line">
Search
</VBtn>
<VBtn color="primary" suffix-icon="ri:download-2-line">
</VBtn>
<VBtn color="primary" suffix-icon="ri:download-2-line">
Download
</VBtn>
</div>
`,
});
Icons.parameters = {
docs: {
source: {
code: `
<VBtn prefix-icon="ri:search-2-line" />
<VBtn prefix-icon="ri:search-2-line">
Search
</VBtn>
<VBtn suffix-icon="ri:download-2-line" />
<VBtn suffix-icon="ri:download-2-line">
Download
</VBtn>
`,
},
},
};
export const Fab: Story<VBtnProps> = (args) => ({
components: {VBtn},
template: `
<div class="flex gap-2 items-end">
<VBtn size="sm" color="primary" prefix-icon="ri:search-2-line" fab />
<VBtn color="primary" prefix-icon="ri:search-2-line" fab />
<VBtn size="lg" color="primary" prefix-icon="ri:search-2-line" fab />
</div>
`,
});
Fab.parameters = {
docs: {
source: {
code: `
<div class="flex gap-2 items-end">
<VBtn size="sm" color="primary" prefix-icon="ri:search-2-line" fab />
<VBtn color="primary" prefix-icon="ri:search-2-line" fab />
<VBtn size="lg" color="primary" prefix-icon="ri:search-2-line" fab />
</div>
`,
},
},
};
export const Plugin: Story<VBtnProps> = () => ({
components: {VIcon},
setup() {
return {
colors: ['default', 'dark', ...defaultColors],
sizes: defaultSizes,
};
},
template: `
<h3 class="font-semibold text-lg mb-2">Colors</h3>
<div class="space-x-2 space-y-2 mb-5">
<button v-for="color in colors" :key="color" :class="\`btn btn-\${color}\`"> {{ color }} </button>
</div>
<h3 class="font-semibold text-lg mb-2">Shadow</h3>
<div class="space-x-2 space-y-2 mb-5">
<button v-for="color in colors" :key="color" :class="\`btn shadow-md btn-\${color}\`"> {{ color }} </button>
</div>
<h3 class="font-semibold text-lg mb-2">Outlined</h3>
<div class="space-x-2 space-y-2 mb-5">
<button v-for="color in colors" :key="color" :class="\`btn btn--outlined btn-\${color}\`"> {{ color }} </button>
</div>
<h3 class="font-semibold text-lg mb-2">Text</h3>
<div class="space-x-2 space-y-2 mb-5">
<button v-for="color in colors" :key="color" :class="\`btn btn--text btn-\${color}\`"> {{ color }} </button>
</div>
<h3 class="font-semibold text-lg mb-2">Rounded</h3>
<div class="space-x-2 space-y-2 mb-5">
<button v-for="color in colors" :key="color" :class="\`btn btn--rounded btn-\${color}\`"> {{ color }} </button>
</div>
<h3 class="font-semibold text-lg mb-2">Tile</h3>
<div class="space-x-2 space-y-2 mb-5">
<button v-for="color in colors" :key="color" :class="\`btn btn--tile btn-\${color}\`"> {{ color }} </button>
</div>
<h3 class="font-semibold text-lg mb-2">Sizes</h3>
<div class="flex items-end gap-2 mb-5">
<button v-for="size in sizes" :key="size" :class="\`btn btn-primary btn--\${size}\`"> Button </button>
</div>
<h3 class="font-semibold text-lg mb-2">Icon</h3>
<div class="flex items-end gap-2 mb-5">
<button v-for="size in sizes" :key="size" :class="\`btn btn-secondary btn--\${size}\`">
<v-icon name="ic:round-search" class="btn-icon" />
</button>
</div>
<h3 class="font-semibold text-lg mb-2">Icon FAB</h3>
<div class="flex items-end gap-2 mb-5">
<button v-for="size in sizes" :key="size" :class="\`btn btn-success btn--fab btn--\${size}\`">
<v-icon name="ic:round-search" class="btn-icon" />
</button>
</div>
`,
});
export const DynamicProps: Story<VBtnProps> = () => ({
components: {VIcon, VBtn},
template: `
<VBtn>Default</VBtn>
<VBtn disabled>Disabled</VBtn>
<VBtn to="/">Router Link</VBtn>
<VBtn href="https://google.com">Href Link</VBtn>
<VBtn href="https://google.com" new-tab>Href Link (New Tab)</VBtn>
`,
});
export const ButtonGroup: Story<VBtnProps> = () => ({
components: {VBtnGroup, VBtnToolbar, VBtn},
template: `
<h3 class="font-semibold">Default</h3>
<VBtnGroup class="w-full mt-2">
<VBtn>Button</VBtn>
<VBtn>Button</VBtn>
<VBtn>Button</VBtn>
</VBtnGroup>
<h3 class="font-semibold mt-5">Sizes:</h3>
<VBtnGroup class="w-full mt-2">
<VBtn size="sm">sm</VBtn>
<VBtn size="sm">sm</VBtn>
<VBtn size="sm">sm</VBtn>
</VBtnGroup>
<VBtnGroup class="w-full mt-2">
<VBtn size="lg">lg</VBtn>
<VBtn size="lg">lg</VBtn>
<VBtn size="lg">lg</VBtn>
</VBtnGroup>
<VBtnGroup class="w-full mt-5">
<VBtn color="primary">Button</VBtn>
<VBtn color="primary">Button</VBtn>
<VBtn color="primary">Button</VBtn>
</VBtnGroup>
<VBtnGroup class="w-full mt-5">
<VBtn color="primary">Button</VBtn>
<VBtn color="secondary">Button</VBtn>
<VBtn color="error">Button</VBtn>
</VBtnGroup>
<VBtnGroup class="w-full mt-5">
<VBtn outlined color="primary">Button</VBtn>
<VBtn outlined color="secondary">Button</VBtn>
<VBtn outlined color="error">Button</VBtn>
</VBtnGroup>
<VBtnGroup class="w-full mt-5">
<VBtn text color="primary">Button</VBtn>
<VBtn text color="secondary">Button</VBtn>
<VBtn text color="error">Button</VBtn>
</VBtnGroup>
<VBtnGroup class="mt-5">
<VBtn prefix-icon="ri:search-2-line"></VBtn>
<VBtn suffix-icon="ri:add-line"></VBtn>
<VBtn prefix-icon="ri:edit-line"></VBtn>
</VBtnGroup>
<VBtnToolbar class="mt-5">
<VBtnGroup>
<VBtn prefix-icon="ri:bold"></VBtn>
<VBtn suffix-icon="ri:italic"></VBtn>
<VBtn prefix-icon="ri:underline"></VBtn>
</VBtnGroup>
<VBtnGroup>
<VBtn suffix-icon="ri:list-ordered"></VBtn>
<VBtn prefix-icon="ri:list-check"></VBtn>
<VBtn prefix-icon="ri:align-left"></VBtn>
</VBtnGroup>
<VBtnGroup>
<VBtn prefix-icon="ri:link"></VBtn>
<VBtn suffix-icon="ri:image-line"></VBtn>
<VBtn prefix-icon="ri:video-line"></VBtn>
</VBtnGroup>
<VBtn prefix-icon="ri:format-clear"></VBtn>
</VBtnToolbar>
`,
});
export const DarkMode: Story<VBtnProps> = () => ({
components: {VBtnGroup, VBtnToolbar, VBtn},
template: `
<div class="dark dark:bg-neutral-900 dark:text-neutral-200 p-6">
<h3 class="font-semibold">Default</h3>
<VBtnGroup class="w-full mt-2">
<VBtn>Button</VBtn>
<VBtn>Button</VBtn>
<VBtn>Button</VBtn>
</VBtnGroup>
<h3 class="font-semibold mt-5">Sizes:</h3>
<VBtnGroup class="w-full mt-2">
<VBtn size="sm">sm</VBtn>
<VBtn size="sm">sm</VBtn>
<VBtn size="sm">sm</VBtn>
</VBtnGroup>
<VBtnGroup class="w-full mt-2">
<VBtn size="lg">lg</VBtn>
<VBtn size="lg">lg</VBtn>
<VBtn size="lg">lg</VBtn>
</VBtnGroup>
<VBtnGroup class="w-full mt-5">
<VBtn color="primary">Button</VBtn>
<VBtn color="primary">Button</VBtn>
<VBtn color="primary">Button</VBtn>
</VBtnGroup>
<VBtnGroup class="w-full mt-5">
<VBtn color="primary">Button</VBtn>
<VBtn color="secondary">Button</VBtn>
<VBtn color="error">Button</VBtn>
</VBtnGroup>
<VBtnGroup class="w-full mt-5">
<VBtn outlined color="primary">Button</VBtn>
<VBtn outlined color="secondary">Button</VBtn>
<VBtn outlined color="error">Button</VBtn>
</VBtnGroup>
<VBtnGroup class="w-full mt-5">
<VBtn text color="primary">Button</VBtn>
<VBtn text color="secondary">Button</VBtn>
<VBtn text color="error">Button</VBtn>
</VBtnGroup>
<VBtnGroup class="mt-5">
<VBtn prefix-icon="ri:search-2-line"></VBtn>
<VBtn suffix-icon="ri:add-line"></VBtn>
<VBtn prefix-icon="ri:edit-line"></VBtn>
</VBtnGroup>
<VBtnToolbar class="mt-5">
<VBtnGroup>
<VBtn prefix-icon="ri:bold"></VBtn>
<VBtn suffix-icon="ri:italic"></VBtn>
<VBtn prefix-icon="ri:underline"></VBtn>
</VBtnGroup>
<VBtnGroup>
<VBtn suffix-icon="ri:list-ordered"></VBtn>
<VBtn prefix-icon="ri:list-check"></VBtn>
<VBtn prefix-icon="ri:align-left"></VBtn>
</VBtnGroup>
<VBtnGroup>
<VBtn prefix-icon="ri:link"></VBtn>
<VBtn suffix-icon="ri:image-line"></VBtn>
<VBtn prefix-icon="ri:video-line"></VBtn>
</VBtnGroup>
<VBtn prefix-icon="ri:format-clear"></VBtn>
</VBtnToolbar>
</div>
`,
});