@polymarbot/nuxt-layer-shadcn-ui 0.1.10 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/app/assets/styles/colors.css +10 -10
  2. package/app/components/ui/Accordion/index.stories.ts +60 -56
  3. package/app/components/ui/Accordion/index.vue +1 -1
  4. package/app/components/ui/AdminLayout/SidebarMenus.vue +0 -2
  5. package/app/components/ui/AdminLayout/index.stories.ts +9 -8
  6. package/app/components/ui/Alert/index.stories.ts +28 -26
  7. package/app/components/ui/Alert/index.vue +6 -6
  8. package/app/components/ui/Alert/types.ts +2 -1
  9. package/app/components/ui/AlertDialog/index.stories.ts +85 -50
  10. package/app/components/ui/AsyncDataTable/index.stories.ts +53 -36
  11. package/app/components/ui/Avatar/index.stories.ts +56 -51
  12. package/app/components/ui/Avatar/index.vue +1 -1
  13. package/app/components/ui/Avatar/types.ts +5 -2
  14. package/app/components/ui/Badge/index.stories.ts +41 -41
  15. package/app/components/ui/Badge/index.vue +1 -1
  16. package/app/components/ui/Badge/types.ts +3 -1
  17. package/app/components/ui/Breadcrumb/index.stories.ts +48 -37
  18. package/app/components/ui/Breadcrumb/index.vue +1 -1
  19. package/app/components/ui/Button/index.stories.ts +94 -90
  20. package/app/components/ui/Button/index.vue +1 -1
  21. package/app/components/ui/Button/types.ts +4 -1
  22. package/app/components/ui/ButtonGroup/index.stories.ts +61 -49
  23. package/app/components/ui/Card/index.stories.ts +55 -47
  24. package/app/components/ui/Card/index.vue +1 -1
  25. package/app/components/ui/Checkbox/index.stories.ts +69 -46
  26. package/app/components/ui/Checkbox/index.vue +1 -1
  27. package/app/components/ui/CopyButton/index.stories.ts +89 -31
  28. package/app/components/ui/DataTable/index.stories.ts +218 -168
  29. package/app/components/ui/DataTable/index.vue +1 -1
  30. package/app/components/ui/DatePicker/index.stories.ts +131 -37
  31. package/app/components/ui/DateRangePicker/index.stories.ts +107 -33
  32. package/app/components/ui/Divider/index.stories.ts +46 -24
  33. package/app/components/ui/Divider/index.vue +1 -1
  34. package/app/components/ui/Drawer/index.stories.ts +131 -81
  35. package/app/components/ui/Drawer/index.vue +1 -1
  36. package/app/components/ui/Drawer/types.ts +1 -1
  37. package/app/components/ui/Dropdown/index.stories.ts +134 -89
  38. package/app/components/ui/Dropdown/index.vue +5 -1
  39. package/app/components/ui/Dropdown/types.ts +1 -1
  40. package/app/components/ui/FormItem/index.stories.ts +87 -43
  41. package/app/components/ui/FormItem/index.vue +1 -1
  42. package/app/components/ui/Help/index.stories.ts +46 -35
  43. package/app/components/ui/Icon/index.stories.ts +41 -43
  44. package/app/components/ui/Input/index.stories.ts +95 -41
  45. package/app/components/ui/Input/index.vue +1 -1
  46. package/app/components/ui/InputCurrency/index.stories.ts +89 -49
  47. package/app/components/ui/InputNumber/index.stories.ts +93 -29
  48. package/app/components/ui/InputNumber/index.vue +1 -1
  49. package/app/components/ui/InputOtp/index.stories.ts +6 -7
  50. package/app/components/ui/InputOtp/index.vue +1 -1
  51. package/app/components/ui/InputPercent/index.stories.ts +6 -7
  52. package/app/components/ui/InputRange/index.stories.ts +6 -7
  53. package/app/components/ui/Loading/index.stories.ts +19 -19
  54. package/app/components/ui/Markdown/index.stories.ts +7 -10
  55. package/app/components/ui/Modal/index.stories.ts +135 -80
  56. package/app/components/ui/Modal/index.vue +1 -1
  57. package/app/components/ui/Modal/types.ts +1 -1
  58. package/app/components/ui/ModalContent/index.stories.ts +54 -26
  59. package/app/components/ui/ModalContent/index.vue +2 -2
  60. package/app/components/ui/PageCard/index.stories.ts +177 -67
  61. package/app/components/ui/Pagination/index.stories.ts +68 -51
  62. package/app/components/ui/Pagination/index.vue +2 -2
  63. package/app/components/ui/Popover/index.stories.ts +47 -45
  64. package/app/components/ui/Popover/index.vue +1 -1
  65. package/app/components/ui/Qrcode/index.stories.ts +42 -34
  66. package/app/components/ui/RadioCardGroup/index.stories.ts +23 -32
  67. package/app/components/ui/RadioCardGroup/index.vue +1 -1
  68. package/app/components/ui/RadioGroup/index.stories.ts +123 -0
  69. package/app/components/ui/RadioGroup/index.vue +73 -0
  70. package/app/components/ui/RadioGroup/types.ts +13 -0
  71. package/app/components/ui/ScrollArea/index.stories.ts +69 -37
  72. package/app/components/ui/ScrollArea/index.vue +1 -1
  73. package/app/components/ui/SearchSelect/index.stories.ts +104 -66
  74. package/app/components/ui/Select/index.stories.ts +152 -98
  75. package/app/components/ui/Select/index.vue +3 -3
  76. package/app/components/ui/Skeleton/index.stories.ts +27 -30
  77. package/app/components/ui/Skeleton/index.vue +1 -1
  78. package/app/components/ui/Slider/index.stories.ts +73 -31
  79. package/app/components/ui/Slider/index.vue +1 -1
  80. package/app/components/ui/Surface/index.stories.ts +47 -21
  81. package/app/components/ui/Surface/index.vue +39 -28
  82. package/app/components/ui/Surface/types.ts +2 -2
  83. package/app/components/ui/Switch/index.stories.ts +6 -7
  84. package/app/components/ui/Switch/index.vue +1 -1
  85. package/app/components/ui/Tabs/index.stories.ts +103 -61
  86. package/app/components/ui/Tabs/index.vue +1 -1
  87. package/app/components/ui/Tag/index.stories.ts +42 -25
  88. package/app/components/ui/Tag/index.vue +39 -28
  89. package/app/components/ui/Tag/types.ts +2 -2
  90. package/app/components/ui/Textarea/index.stories.ts +73 -9
  91. package/app/components/ui/Textarea/index.vue +1 -1
  92. package/app/components/ui/Toast/index.stories.ts +71 -18
  93. package/app/components/ui/Toast/index.vue +1 -1
  94. package/app/components/ui/Tooltip/index.stories.ts +45 -38
  95. package/app/components/ui/Tooltip/index.vue +1 -1
  96. package/app/components/ui/WebLink/index.stories.ts +76 -41
  97. package/app/components/ui/WebLink/index.vue +1 -1
  98. package/package.json +2 -2
  99. package/app/components/ui/Radio/index.stories.ts +0 -71
  100. package/app/components/ui/Radio/index.vue +0 -10
  101. package/app/components/ui/Radio/types.ts +0 -3
@@ -7,12 +7,45 @@ import ButtonGroup from './index.vue'
7
7
  const meta = {
8
8
  title: 'UI/ButtonGroup',
9
9
  component: ButtonGroup,
10
+ argTypes: {
11
+ class: { control: 'text' },
12
+ },
13
+ args: {
14
+ class: '',
15
+ },
16
+ render: args => ({
17
+ components: { ButtonGroup, Button },
18
+ setup: () => ({ args }),
19
+ template: `
20
+ <ButtonGroup v-bind="args">
21
+ <Button variant="outline">Left</Button>
22
+ <Button variant="outline">Center</Button>
23
+ <Button variant="outline">Right</Button>
24
+ </ButtonGroup>
25
+ `,
26
+ }),
10
27
  } satisfies Meta<typeof ButtonGroup>
11
28
 
12
29
  export default meta
13
30
  type Story = StoryObj<typeof meta>
14
31
 
15
- export const Default: Story = {
32
+ export const Default: Story = {}
33
+
34
+ export const WithIcons: Story = {
35
+ render: () => ({
36
+ components: { ButtonGroup, Button, Icon },
37
+ template: `
38
+ <ButtonGroup>
39
+ <Button variant="outline" size="icon"><Icon name="bold" /></Button>
40
+ <Button variant="outline" size="icon"><Icon name="italic" /></Button>
41
+ <Button variant="outline" size="icon"><Icon name="underline" /></Button>
42
+ <Button variant="outline" size="icon"><Icon name="strikethrough" /></Button>
43
+ </ButtonGroup>
44
+ `,
45
+ }),
46
+ }
47
+
48
+ export const InputWithButton: Story = {
16
49
  render: () => ({
17
50
  components: { ButtonGroup, Button, Input, Icon },
18
51
  setup () {
@@ -20,56 +53,35 @@ export const Default: Story = {
20
53
  return { search }
21
54
  },
22
55
  template: `
23
- <div class="space-y-10">
24
- <!-- Button Group -->
25
- <section>
26
- <h3 class="mb-4 text-lg font-medium">Buttons</h3>
27
- <ButtonGroup>
28
- <Button variant="outline">Left</Button>
29
- <Button variant="outline">Center</Button>
30
- <Button variant="outline">Right</Button>
31
- </ButtonGroup>
32
- </section>
33
-
34
- <!-- With Icons -->
35
- <section>
36
- <h3 class="mb-4 text-lg font-medium">With Icons</h3>
37
- <ButtonGroup>
38
- <Button variant="outline" size="icon"><Icon name="bold" /></Button>
39
- <Button variant="outline" size="icon"><Icon name="italic" /></Button>
40
- <Button variant="outline" size="icon"><Icon name="underline" /></Button>
41
- <Button variant="outline" size="icon"><Icon name="strikethrough" /></Button>
42
- </ButtonGroup>
43
- </section>
44
-
45
- <!-- Input + Button -->
46
- <section>
47
- <h3 class="mb-4 text-lg font-medium">Input + Button</h3>
48
- <ButtonGroup>
49
- <Input v-model="search" placeholder="Search..." />
50
- <Button variant="outline"><Icon name="search" /></Button>
51
- </ButtonGroup>
52
- </section>
56
+ <ButtonGroup>
57
+ <Input v-model="search" placeholder="Search..." />
58
+ <Button variant="outline"><Icon name="search" /></Button>
59
+ </ButtonGroup>
60
+ `,
61
+ }),
62
+ }
53
63
 
54
- <!-- Button + Input + Button -->
55
- <section>
56
- <h3 class="mb-4 text-lg font-medium">Button + Input + Button</h3>
57
- <ButtonGroup>
58
- <Button variant="outline" size="icon"><Icon name="minus" /></Button>
59
- <Input class="w-20 text-center" model-value="5" />
60
- <Button variant="outline" size="icon"><Icon name="plus" /></Button>
61
- </ButtonGroup>
62
- </section>
64
+ export const ButtonWithInputWithButton: Story = {
65
+ render: () => ({
66
+ components: { ButtonGroup, Button, Input, Icon },
67
+ template: `
68
+ <ButtonGroup>
69
+ <Button variant="outline" size="icon"><Icon name="minus" /></Button>
70
+ <Input class="w-20 text-center" model-value="5" />
71
+ <Button variant="outline" size="icon"><Icon name="plus" /></Button>
72
+ </ButtonGroup>
73
+ `,
74
+ }),
75
+ }
63
76
 
64
- <!-- Mixed Variants -->
65
- <section>
66
- <h3 class="mb-4 text-lg font-medium">Mixed Variants</h3>
67
- <ButtonGroup>
68
- <Button variant="outline">Save</Button>
69
- <Button>Submit</Button>
70
- </ButtonGroup>
71
- </section>
72
- </div>
77
+ export const MixedVariants: Story = {
78
+ render: () => ({
79
+ components: { ButtonGroup, Button },
80
+ template: `
81
+ <ButtonGroup>
82
+ <Button variant="outline">Save</Button>
83
+ <Button>Submit</Button>
84
+ </ButtonGroup>
73
85
  `,
74
86
  }),
75
87
  }
@@ -5,61 +5,69 @@ import Card from './index.vue'
5
5
  const meta = {
6
6
  title: 'UI/Card',
7
7
  component: Card,
8
+ argTypes: {
9
+ title: { control: 'text' },
10
+ },
11
+ args: {
12
+ title: 'Card Title',
13
+ },
14
+ render: args => ({
15
+ components: { Card },
16
+ setup: () => ({ args }),
17
+ template: `
18
+ <Card v-bind="args" class="max-w-md">
19
+ <p>This card has a title prop set.</p>
20
+ </Card>
21
+ `,
22
+ }),
8
23
  } satisfies Meta<typeof Card>
9
24
 
10
25
  export default meta
11
26
  type Story = StoryObj<typeof meta>
12
27
 
13
- export const Default: Story = {
14
- render: args => ({
15
- components: { Card, Button },
16
- setup: () => ({ args }),
17
- template: `
18
- <div class="space-y-10 max-w-md">
19
- <!-- Basic Card -->
20
- <section>
21
- <h3 class="mb-4 text-lg font-medium">Basic Card</h3>
22
- <Card>
23
- <p>This is a basic card with default content only.</p>
24
- </Card>
25
- </section>
28
+ export const Default: Story = {}
26
29
 
27
- <!-- Card with Title -->
28
- <section>
29
- <h3 class="mb-4 text-lg font-medium">Card with Title</h3>
30
- <Card title="Card Title">
31
- <p>This card has a title prop set.</p>
32
- </Card>
33
- </section>
30
+ export const WithTitle: Story = {
31
+ render: () => ({
32
+ components: { Card },
33
+ template: `
34
+ <Card title="Card Title" class="max-w-md">
35
+ <p>This card has a title prop set.</p>
36
+ </Card>
37
+ `,
38
+ }),
39
+ }
34
40
 
35
- <!-- Card with Custom Header -->
36
- <section>
37
- <h3 class="mb-4 text-lg font-medium">Card with Custom Header</h3>
38
- <Card>
39
- <template #header>
40
- <div class="flex items-center justify-between">
41
- <span class="text-lg font-semibold">Custom Header</span>
42
- <Button variant="ghost" size="sm">Action</Button>
43
- </div>
44
- </template>
45
- <p>This card uses the header slot for a custom layout.</p>
46
- </Card>
47
- </section>
41
+ export const CustomHeader: Story = {
42
+ render: () => ({
43
+ components: { Card, Button },
44
+ template: `
45
+ <Card class="max-w-md">
46
+ <template #header>
47
+ <div class="flex items-center justify-between">
48
+ <span class="text-lg font-semibold">Custom Header</span>
49
+ <Button variant="ghost" size="sm">Action</Button>
50
+ </div>
51
+ </template>
52
+ <p>This card uses the header slot for a custom layout.</p>
53
+ </Card>
54
+ `,
55
+ }),
56
+ }
48
57
 
49
- <!-- Card with Footer -->
50
- <section>
51
- <h3 class="mb-4 text-lg font-medium">Card with Footer</h3>
52
- <Card title="Settings">
53
- <p>Update your account settings here.</p>
54
- <template #footer>
55
- <div class="w-full flex justify-end gap-2">
56
- <Button variant="outline">Cancel</Button>
57
- <Button>Save</Button>
58
- </div>
59
- </template>
60
- </Card>
61
- </section>
62
- </div>
58
+ export const WithFooter: Story = {
59
+ render: () => ({
60
+ components: { Card, Button },
61
+ template: `
62
+ <Card title="Settings" class="max-w-md">
63
+ <p>Update your account settings here.</p>
64
+ <template #footer>
65
+ <div class="w-full flex justify-end gap-2">
66
+ <Button variant="outline">Cancel</Button>
67
+ <Button>Save</Button>
68
+ </div>
69
+ </template>
70
+ </Card>
63
71
  `,
64
72
  }),
65
73
  }
@@ -5,7 +5,7 @@ import {
5
5
  CardFooter as ShadcnCardFooter,
6
6
  CardHeader as ShadcnCardHeader,
7
7
  CardTitle as ShadcnCardTitle,
8
- } from '@polymarbot/nuxt-layer-shadcn-ui/app/components/shadcn/card'
8
+ } from '../../shadcn/card'
9
9
  import type { CardProps } from './types'
10
10
 
11
11
  defineProps<CardProps>()
@@ -4,64 +4,87 @@ import Checkbox from './index.vue'
4
4
  const meta = {
5
5
  title: 'UI/Checkbox',
6
6
  component: Checkbox,
7
+ argTypes: {
8
+ modelValue: { control: 'select', options: [ true, false, 'indeterminate' ]},
9
+ defaultValue: { control: 'select', options: [ true, false, 'indeterminate' ]},
10
+ disabled: { control: 'boolean' },
11
+ required: { control: 'boolean' },
12
+ name: { control: 'text' },
13
+ value: { control: 'text' },
14
+ },
15
+ args: {
16
+ modelValue: false,
17
+ defaultValue: false,
18
+ disabled: false,
19
+ required: false,
20
+ name: '',
21
+ value: '',
22
+ },
23
+ render: args => ({
24
+ components: { Checkbox },
25
+ setup: () => ({ args }),
26
+ template: `
27
+ <label class="flex items-center gap-2 cursor-pointer">
28
+ <Checkbox v-bind="args" />
29
+ <span class="text-sm">Accept terms and conditions</span>
30
+ </label>
31
+ `,
32
+ }),
7
33
  } satisfies Meta<typeof Checkbox>
8
34
 
9
35
  export default meta
10
36
  type Story = StoryObj<typeof meta>
11
37
 
12
- export const Default: Story = {
38
+ export const Default: Story = {}
39
+
40
+ export const Checked: Story = {
13
41
  render: () => ({
14
42
  components: { Checkbox },
15
43
  setup () {
16
- const checked = ref(false)
17
- const checkedOn = ref(true)
18
- return { checked, checkedOn }
44
+ const checked = ref(true)
45
+ return { checked }
19
46
  },
20
47
  template: `
21
- <div class="space-y-10">
22
- <section>
23
- <h3 class="mb-4 text-lg font-medium">Basic</h3>
24
- <label class="flex items-center gap-2 cursor-pointer">
25
- <Checkbox v-model="checked" />
26
- <span class="text-sm">Accept terms and conditions</span>
27
- </label>
28
- <div class="mt-2 text-sm text-muted-foreground">Value: {{ checked }}</div>
29
- </section>
30
-
31
- <section>
32
- <h3 class="mb-4 text-lg font-medium">Checked</h3>
33
- <label class="flex items-center gap-2 cursor-pointer">
34
- <Checkbox v-model="checkedOn" />
35
- <span class="text-sm">Enable notifications</span>
36
- </label>
37
- <div class="mt-2 text-sm text-muted-foreground">Value: {{ checkedOn }}</div>
38
- </section>
48
+ <div>
49
+ <label class="flex items-center gap-2 cursor-pointer">
50
+ <Checkbox v-model="checked" />
51
+ <span class="text-sm">Enable notifications</span>
52
+ </label>
53
+ <div class="mt-2 text-sm text-muted-foreground">Value: {{ checked }}</div>
54
+ </div>
55
+ `,
56
+ }),
57
+ }
39
58
 
40
- <section>
41
- <h3 class="mb-4 text-lg font-medium">Indeterminate</h3>
42
- <label class="flex items-center gap-2 cursor-pointer">
43
- <Checkbox model-value="indeterminate" />
44
- <span class="text-sm">Select all items</span>
45
- </label>
46
- </section>
59
+ export const Indeterminate: Story = {
60
+ render: () => ({
61
+ components: { Checkbox },
62
+ template: `
63
+ <label class="flex items-center gap-2 cursor-pointer">
64
+ <Checkbox model-value="indeterminate" />
65
+ <span class="text-sm">Select all items</span>
66
+ </label>
67
+ `,
68
+ }),
69
+ }
47
70
 
48
- <section>
49
- <h3 class="mb-4 text-lg font-medium">Disabled</h3>
50
- <div class="flex flex-col gap-3">
51
- <label class="flex items-center gap-2 cursor-not-allowed opacity-50">
52
- <Checkbox :model-value="false" disabled />
53
- <span class="text-sm">Unchecked disabled</span>
54
- </label>
55
- <label class="flex items-center gap-2 cursor-not-allowed opacity-50">
56
- <Checkbox :model-value="true" disabled />
57
- <span class="text-sm">Checked disabled</span>
58
- </label>
59
- <label class="flex items-center gap-2 cursor-not-allowed opacity-50">
60
- <Checkbox model-value="indeterminate" disabled />
61
- <span class="text-sm">Indeterminate disabled</span>
62
- </label>
63
- </div>
64
- </section>
71
+ export const Disabled: Story = {
72
+ render: () => ({
73
+ components: { Checkbox },
74
+ template: `
75
+ <div class="flex flex-col gap-3">
76
+ <label class="flex items-center gap-2 cursor-not-allowed opacity-50">
77
+ <Checkbox :model-value="false" disabled />
78
+ <span class="text-sm">Unchecked disabled</span>
79
+ </label>
80
+ <label class="flex items-center gap-2 cursor-not-allowed opacity-50">
81
+ <Checkbox :model-value="true" disabled />
82
+ <span class="text-sm">Checked disabled</span>
83
+ </label>
84
+ <label class="flex items-center gap-2 cursor-not-allowed opacity-50">
85
+ <Checkbox model-value="indeterminate" disabled />
86
+ <span class="text-sm">Indeterminate disabled</span>
87
+ </label>
65
88
  </div>
66
89
  `,
67
90
  }),
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { Checkbox as ShadcnCheckbox } from '@polymarbot/nuxt-layer-shadcn-ui/app/components/shadcn/checkbox'
2
+ import { Checkbox as ShadcnCheckbox } from '../../shadcn/checkbox'
3
3
  import type { CheckboxProps } from './types'
4
4
 
5
5
  defineProps<CheckboxProps>()
@@ -1,55 +1,113 @@
1
1
  import type { Meta, StoryObj } from '@storybook/vue3'
2
2
  import CopyButton from './index.vue'
3
3
 
4
+ const variants = [ 'default', 'destructive', 'outline', 'secondary', 'ghost', 'link' ] as const
5
+ const sizes = [ 'sm', 'default', 'lg', 'icon-sm', 'icon', 'icon-lg' ] as const
6
+
4
7
  const meta = {
5
8
  title: 'UI/CopyButton',
6
9
  component: CopyButton,
7
10
  argTypes: {
8
11
  copy: { control: 'text' },
9
- variant: { control: 'select', options: [ 'default', 'destructive', 'outline', 'secondary', 'ghost' ]},
10
- size: { control: 'select', options: [ 'default', 'sm', 'lg', 'icon' ]},
12
+ beforeCopyText: { control: 'text' },
13
+ afterCopyText: { control: 'text' },
14
+ variant: { control: 'select', options: variants },
15
+ size: { control: 'select', options: sizes },
16
+ rounded: { control: 'boolean' },
17
+ disabled: { control: 'boolean' },
18
+ loading: { control: 'boolean' },
11
19
  },
12
20
  args: {
13
21
  copy: 'Hello, World!',
22
+ beforeCopyText: '',
23
+ afterCopyText: '',
14
24
  variant: 'outline',
25
+ size: 'default',
26
+ rounded: false,
27
+ disabled: false,
28
+ loading: false,
15
29
  },
30
+ render: args => ({
31
+ components: { CopyButton },
32
+ setup: () => ({ args }),
33
+ template: '<CopyButton v-bind="args">Copy Text</CopyButton>',
34
+ }),
16
35
  } satisfies Meta<typeof CopyButton>
17
36
 
18
37
  export default meta
19
38
  type Story = StoryObj<typeof meta>
20
39
 
21
- export const Default: Story = {
22
- render: args => ({
40
+ export const Default: Story = {}
41
+
42
+ export const IconOnly: Story = {
43
+ render: () => ({
44
+ components: { CopyButton },
45
+ template: `
46
+ <div class="flex items-center gap-4">
47
+ <CopyButton copy="Hello, World!" variant="outline" />
48
+ <CopyButton copy="Hello, World!" variant="ghost" />
49
+ <CopyButton copy="Hello, World!" variant="secondary" />
50
+ </div>
51
+ `,
52
+ }),
53
+ }
54
+
55
+ export const WithLabel: Story = {
56
+ render: () => ({
23
57
  components: { CopyButton },
24
- setup: () => ({ args }),
25
58
  template: `
26
- <div class="space-y-10">
27
- <section>
28
- <h3 class="mb-4 text-lg font-medium">Icon Only (default)</h3>
29
- <div class="flex items-center gap-4">
30
- <CopyButton v-bind="args" />
31
- <CopyButton v-bind="args" variant="ghost" />
32
- <CopyButton v-bind="args" variant="secondary" />
33
- </div>
34
- </section>
35
-
36
- <section>
37
- <h3 class="mb-4 text-lg font-medium">With Label</h3>
38
- <div class="flex items-center gap-4">
39
- <CopyButton v-bind="args">Copy Text</CopyButton>
40
- <CopyButton v-bind="args" variant="secondary">Copy Address</CopyButton>
41
- </div>
42
- </section>
43
-
44
- <section>
45
- <h3 class="mb-4 text-lg font-medium">Sizes</h3>
46
- <div class="flex items-center gap-4">
47
- <CopyButton v-bind="args" size="sm">Small</CopyButton>
48
- <CopyButton v-bind="args" size="default">Default</CopyButton>
49
- <CopyButton v-bind="args" size="lg">Large</CopyButton>
50
- </div>
51
- </section>
59
+ <div class="flex items-center gap-4">
60
+ <CopyButton copy="Hello, World!" variant="outline">Copy Text</CopyButton>
61
+ <CopyButton copy="123 Main St" variant="secondary">Copy Address</CopyButton>
52
62
  </div>
53
63
  `,
54
64
  }),
55
65
  }
66
+
67
+ export const Variants: Story = {
68
+ render: () => ({
69
+ components: { CopyButton },
70
+ setup: () => ({ variants }),
71
+ template: `
72
+ <div class="flex flex-wrap items-center gap-3">
73
+ <CopyButton
74
+ v-for="v in variants"
75
+ :key="v"
76
+ :variant="v"
77
+ copy="Hello, World!"
78
+ >
79
+ {{ v }}
80
+ </CopyButton>
81
+ </div>
82
+ `,
83
+ }),
84
+ }
85
+
86
+ export const Sizes: Story = {
87
+ render: () => ({
88
+ components: { CopyButton },
89
+ template: `
90
+ <div class="flex items-center gap-4">
91
+ <CopyButton copy="Hello, World!" variant="outline" size="sm">Small</CopyButton>
92
+ <CopyButton copy="Hello, World!" variant="outline" size="default">Default</CopyButton>
93
+ <CopyButton copy="Hello, World!" variant="outline" size="lg">Large</CopyButton>
94
+ </div>
95
+ `,
96
+ }),
97
+ }
98
+
99
+ export const CustomTooltipText: Story = {
100
+ render: () => ({
101
+ components: { CopyButton },
102
+ template: `
103
+ <CopyButton
104
+ copy="secret-token-123"
105
+ before-copy-text="Click to copy token"
106
+ after-copy-text="Token copied!"
107
+ variant="outline"
108
+ >
109
+ Copy Token
110
+ </CopyButton>
111
+ `,
112
+ }),
113
+ }