edvoyui-component-library-test-flight 0.0.22 → 0.0.24

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 (125) hide show
  1. package/dist/EUIButton.vue.d.ts.map +1 -0
  2. package/dist/inputNormal/EUIInputNormal.vue.d.ts.map +1 -0
  3. package/dist/library-vue-ts.cjs.js +1 -0
  4. package/dist/library-vue-ts.es.js +1 -0
  5. package/dist/library-vue-ts.umd.js +1 -0
  6. package/package.json +16 -13
  7. package/src/App.vue +16 -0
  8. package/src/assets/fonts/gilroy/GilroyBold/font.woff +0 -0
  9. package/src/assets/fonts/gilroy/GilroyBold/font.woff2 +0 -0
  10. package/src/assets/fonts/gilroy/GilroyBoldItalic/font.woff +0 -0
  11. package/src/assets/fonts/gilroy/GilroyBoldItalic/font.woff2 +0 -0
  12. package/src/assets/fonts/gilroy/GilroyExtraBold/font.woff +0 -0
  13. package/src/assets/fonts/gilroy/GilroyExtraBold/font.woff2 +0 -0
  14. package/src/assets/fonts/gilroy/GilroyExtraBoldItalic/font.woff +0 -0
  15. package/src/assets/fonts/gilroy/GilroyExtraBoldItalic/font.woff2 +0 -0
  16. package/src/assets/fonts/gilroy/GilroyMedium/font.woff +0 -0
  17. package/src/assets/fonts/gilroy/GilroyMedium/font.woff2 +0 -0
  18. package/src/assets/fonts/gilroy/GilroyRegular/font.woff +0 -0
  19. package/src/assets/fonts/gilroy/GilroyRegular/font.woff2 +0 -0
  20. package/src/assets/fonts/gilroy/GilroySemiBold/font.woff +0 -0
  21. package/src/assets/fonts/gilroy/GilroySemiBold/font.woff2 +0 -0
  22. package/src/assets/fonts/inter/Inter-Bold.woff +0 -0
  23. package/src/assets/fonts/inter/Inter-Bold.woff2 +0 -0
  24. package/src/assets/fonts/inter/Inter-Italic.woff +0 -0
  25. package/src/assets/fonts/inter/Inter-Italic.woff2 +0 -0
  26. package/src/assets/fonts/inter/Inter-Medium.woff +0 -0
  27. package/src/assets/fonts/inter/Inter-Medium.woff2 +0 -0
  28. package/src/assets/fonts/inter/Inter-MediumItalic.woff +0 -0
  29. package/src/assets/fonts/inter/Inter-MediumItalic.woff2 +0 -0
  30. package/src/assets/fonts/inter/Inter-Regular.woff +0 -0
  31. package/src/assets/fonts/inter/Inter-Regular.woff2 +0 -0
  32. package/src/assets/fonts/inter/Inter-SemiBold.woff +0 -0
  33. package/src/assets/fonts/inter/Inter-SemiBold.woff2 +0 -0
  34. package/src/assets/fonts/inter/Inter-SemiBoldItalic.woff +0 -0
  35. package/src/assets/fonts/inter/Inter-SemiBoldItalic.woff2 +0 -0
  36. package/src/assets/scss/body.scss +15 -0
  37. package/src/assets/svg/ChevronDownSolid.vue +19 -0
  38. package/src/assets/svg/ChevronDownStroke.vue +22 -0
  39. package/src/assets/svg/SortArrow.vue +24 -0
  40. package/src/assets/svg/Student.vue +30 -0
  41. package/src/assets/svg/partner.vue +33 -0
  42. package/src/assets/svg/people.vue +25 -0
  43. package/src/assets/vue.svg +1 -0
  44. package/src/components/HelloWorld.vue +999 -0
  45. package/src/components/accordion/EUIAccordion.stories.ts +157 -0
  46. package/src/components/accordion/EUIAccordion.vue +90 -0
  47. package/src/components/avatar/EUIAvatar.stories.ts +157 -0
  48. package/src/components/avatar/EUIAvatar.vue +96 -0
  49. package/src/components/button/EUIButton.stories.ts +252 -0
  50. package/src/components/button/EUIButton.vue +151 -0
  51. package/src/components/checkbox/EUICheckbox.stories.ts +58 -0
  52. package/src/components/checkbox/EUICheckbox.vue +103 -0
  53. package/src/components/datepicker/EUIDatepicker.stories.ts +280 -0
  54. package/src/components/datepicker/EUIDatepicker.vue +192 -0
  55. package/src/components/delete.vue +158 -0
  56. package/src/components/dropdown/EUIMultiDropdown.stories.ts +187 -0
  57. package/src/components/dropdown/EUIMultiDropdown.vue +129 -0
  58. package/src/components/errorMessage/EUIErrorMessage.scss +0 -0
  59. package/src/components/errorMessage/EUIErrorMessage.stories.ts +41 -0
  60. package/src/components/errorMessage/EUIErrorMessage.vue +25 -0
  61. package/src/components/index.ts +46 -0
  62. package/src/components/input/EUIInput.stories.ts +174 -0
  63. package/src/components/input/EUIInput.vue +169 -0
  64. package/src/components/inputNormal/EUIInputNormal.stories.ts +164 -0
  65. package/src/components/inputNormal/EUIInputNormal.vue +161 -0
  66. package/src/components/loader/EUICircleLoader.vue +31 -0
  67. package/src/components/loader/EUICubeLoader.vue +237 -0
  68. package/src/components/loader/EUILoader.stories.ts +99 -0
  69. package/src/components/loader/EUILoader.vue +17 -0
  70. package/src/components/loader/EUISquareLoader.vue +47 -0
  71. package/src/components/modal/EUIModal.stories.ts +372 -0
  72. package/src/components/modal/EUIModal.vue +163 -0
  73. package/src/components/pillSelect/EUIPillSelect.stories.ts +74 -0
  74. package/src/components/pillSelect/EUIPillSelect.vue +149 -0
  75. package/src/components/popover/EUIPopover.stories.ts +247 -0
  76. package/src/components/popover/EUIPopover.vue +159 -0
  77. package/src/components/radio/EUIRadio.stories.ts +54 -0
  78. package/src/components/radio/EUIRadio.vue +78 -0
  79. package/src/components/searchInput/EUISearch.stories.ts +24 -0
  80. package/src/components/searchInput/EUISearch.vue +215 -0
  81. package/src/components/select/EUISelect.scss +0 -0
  82. package/src/components/select/EUISelect.stories.ts +49 -0
  83. package/src/components/select/EUISelect.vue +682 -0
  84. package/src/components/selectSearch/EUISelectSearch.vue +23 -0
  85. package/src/components/slideover/EUISlideover.stories.ts +318 -0
  86. package/src/components/slideover/EUISlideover.vue +207 -0
  87. package/src/components/stepperTimeline/EUIStepperHorizontal.vue +112 -0
  88. package/src/components/stepperTimeline/EUIStepperTimeline.stories.ts +54 -0
  89. package/src/components/stepperTimeline/EUIStepperTimeline.vue +16 -0
  90. package/src/components/stepperTimeline/EUIStepperVertical.vue +112 -0
  91. package/src/components/table/EUIDashboardTable.vue +482 -0
  92. package/src/components/table/EUIPageLimit.vue +66 -0
  93. package/src/components/table/EUIPagination.vue +175 -0
  94. package/src/components/table/EUIStudentPagination.vue +172 -0
  95. package/src/components/table/EUITable.stories.ts +190 -0
  96. package/src/components/table/EUITable.vue +508 -0
  97. package/src/components/table/EUITableCheckbox.vue +97 -0
  98. package/src/components/tabs/EUITabs.vue +128 -0
  99. package/src/components/tabs/EUItabs.stories.ts +123 -0
  100. package/src/components/tag/EUITag.stories.ts +46 -0
  101. package/src/components/tag/EUITag.vue +46 -0
  102. package/src/components/telephone/EUITelephone.stories.ts +202 -0
  103. package/src/components/telephone/EUITelephone.vue +280 -0
  104. package/src/components/textArea/EUITextArea.stories.ts +82 -0
  105. package/src/components/textArea/EUITextArea.vue +122 -0
  106. package/src/components/timeLine/EUITimeLine.stories.ts +247 -0
  107. package/src/components/timeLine/EUITimeLine.vue +43 -0
  108. package/src/components/timeLine/EUITimeLineItem.vue +124 -0
  109. package/src/components/toggle/EUIToggle.stories.ts +63 -0
  110. package/src/components/toggle/EUIToggle.vue +99 -0
  111. package/src/components/tooltip/EUITooltip.stories.ts +53 -0
  112. package/src/components/tooltip/EUITooltip.vue +108 -0
  113. package/src/data/books.ts +163 -0
  114. package/src/data/tab.ts +33 -0
  115. package/src/data/table.ts +5392 -0
  116. package/src/main.ts +5 -0
  117. package/src/utils/lodash.ts +9 -0
  118. package/src/utils/types.ts +9 -0
  119. package/src/vite-env.d.ts +5 -0
  120. package/dist/EUIInputNormal.vue.d.ts.map +0 -1
  121. package/dist/button/EUIButton.vue.d.ts.map +0 -1
  122. package/dist/library-vue-ts.css +0 -1
  123. /package/dist/{button/EUIButton.vue.d.ts → EUIButton.vue.d.ts} +0 -0
  124. /package/dist/{EUIInputNormal.vue.d.ts → inputNormal/EUIInputNormal.vue.d.ts} +0 -0
  125. /package/{dist → src}/style.scss +0 -0
@@ -0,0 +1,252 @@
1
+ import type { Meta, StoryObj } from "@storybook/vue3";
2
+ import EUIButton from "./EUIButton.vue"; // Adjust the path if necessary
3
+ import { HomeIcon } from "@heroicons/vue/24/outline";
4
+
5
+ const meta = {
6
+ title: "Example/Button",
7
+ component: EUIButton,
8
+ tags: ["autodocs"],
9
+ argTypes: {
10
+ type: {
11
+ control: { type: "select", options: ["button", "submit", "reset"] },
12
+ description: "The type of button.",
13
+ },
14
+ size: {
15
+ control: { type: "select", options: ["xs", "sm", "md", "lg"] },
16
+ description: "Size of the button.",
17
+ },
18
+ color: {
19
+ control: {
20
+ type: "select",
21
+ options: ["black", "white", "danger", "success", "purple", "primary"],
22
+ },
23
+ description: "The color theme of the button.",
24
+ },
25
+ iconType: {
26
+ control: {
27
+ type: "select",
28
+ options: ["", "startIcon", "endIcon", "icon"],
29
+ },
30
+ description:
31
+ "Defines the position of the icon. It can be placed at the `start` or `end` and `icon` of the button.",
32
+ },
33
+ icon: {
34
+ control: { type: "text" },
35
+ description:
36
+ "Specifies an SVG icon or icon component to be displayed inside the input field.",
37
+ },
38
+ loading: {
39
+ control: "boolean",
40
+ description: "Shows a loading spinner if true.",
41
+ },
42
+ rounded: {
43
+ control: "boolean",
44
+ description: "button rounded if true.",
45
+ },
46
+ disabled: {
47
+ control: "boolean",
48
+ description: "Disables the button if true.",
49
+ },
50
+ onClick: { action: "clicked" },
51
+ },
52
+ } satisfies Meta<typeof EUIButton>;
53
+
54
+ export default meta;
55
+ type Story = StoryObj<typeof meta>;
56
+
57
+ // Default button story with default slot content
58
+ export const Default: Story = {
59
+ argTypes: {
60
+ type: {
61
+ control: "select",
62
+ options: ["button", "submit", "reset"],
63
+ },
64
+ size: {
65
+ control: "select",
66
+ options: ["xs", "sm", "md", "lg"],
67
+ },
68
+ color: {
69
+ control: "select",
70
+ options: ["black", "white", "danger", "success", "purple", "primary"],
71
+ },
72
+ iconType: {
73
+ control: "select",
74
+ options: ["", "startIcon", "endIcon", "icon"],
75
+ },
76
+ },
77
+ args: {
78
+ type: "button",
79
+ size: "md",
80
+ color: "purple",
81
+ },
82
+ render: (args) => ({
83
+ components: { EUIButton },
84
+ setup() {
85
+ return { args };
86
+ },
87
+ template: `<EUIButton v-bind="args">Button</EUIButton>`,
88
+ }),
89
+ };
90
+
91
+ export const Size: Story = {
92
+ args: {
93
+ color: "purple",
94
+ size: "md",
95
+ },
96
+ render: (args) => ({
97
+ components: { EUIButton },
98
+ setup() {
99
+ return { args };
100
+ },
101
+ template: `<div class="space-x-4 inline-flex items-end">
102
+ <EUIButton v-bind="args" size="xs">Button</EUIButton>
103
+ <EUIButton v-bind="args" size="sm">Button</EUIButton>
104
+ <EUIButton v-bind="args" size="md">Button</EUIButton>
105
+ <EUIButton v-bind="args" size="lg">Button</EUIButton>
106
+ </div>`,
107
+ }),
108
+ parameters: {
109
+ docs: {
110
+ source: {
111
+ code: `<template>
112
+ <EUIButton type="button" size="xs" color="black">Button</EUIButton>
113
+ <EUIButton type="button" size="sm" color="white">Button</EUIButton>
114
+ <EUIButton type="button" size="md" color="success">Button</EUIButton>
115
+ <EUIButton type="button" size="lg" color="danger">Button</EUIButton>
116
+ </template>`,
117
+ },
118
+ },
119
+ },
120
+ };
121
+
122
+ export const Colors: Story = {
123
+ args: {
124
+ size: "md",
125
+ color: "purple",
126
+ },
127
+ render: (args) => ({
128
+ components: { EUIButton },
129
+ setup() {
130
+ return { args };
131
+ },
132
+ template: `<div class="space-x-4 inline-flex items-end">
133
+ <EUIButton v-bind="args" color="black">Button</EUIButton>
134
+ <EUIButton v-bind="args" color="white">Button</EUIButton>
135
+ <EUIButton v-bind="args" color="success">Button</EUIButton>
136
+ <EUIButton v-bind="args" color="danger">Button</EUIButton>
137
+ <EUIButton v-bind="args" color="purple">Button</EUIButton>
138
+ <EUIButton v-bind="args" color="primary">Button</EUIButton>
139
+ </div>`,
140
+ }),
141
+ parameters: {
142
+ docs: {
143
+ source: {
144
+ code: `<template>
145
+ <EUIButton type="button" size="md" color="black">Button</EUIButton>
146
+ <EUIButton type="button" size="md" color="white">Button</EUIButton>
147
+ <EUIButton type="button" size="md" color="success">Button</EUIButton>
148
+ <EUIButton type="button" size="md" color="danger">Button</EUIButton>
149
+ <EUIButton type="button" size="md" color="purple">Button</EUIButton>
150
+ <EUIButton type="button" size="md" color="primary">Button</EUIButton>
151
+ </template>`,
152
+ },
153
+ },
154
+ },
155
+ };
156
+
157
+ export const Icons: Story = {
158
+ args: {
159
+ type: "button",
160
+ size: "md",
161
+ color: "primary",
162
+ iconType: "startIcon",
163
+ icon: HomeIcon,
164
+ },
165
+ render: (args) => ({
166
+ components: { EUIButton },
167
+ setup() {
168
+ return { args };
169
+ },
170
+ template: `<div class="space-x-4 inline-flex items-end">
171
+ <EUIButton v-bind="args" iconType="startIcon">Home</EUIButton>
172
+ <EUIButton v-bind="args" iconType="endIcon">Home</EUIButton>
173
+ <EUIButton v-bind="args" iconType="icon"></EUIButton>
174
+ </div>`,
175
+ }),
176
+ parameters: {
177
+ docs: {
178
+ source: {
179
+ code: `<template>
180
+ <EUIButton color="primary" size="md" iconType="startIcon" :icon="HomeIcon">Home</EUIButton>
181
+ <EUIButton color="primary" size="md" iconType="endIcon" :icon="HomeIcon">Home</EUIButton>
182
+ <EUIButton color="primary" size="md" iconType="icon" :icon="HomeIcon"></EUIButton>
183
+ </template>`,
184
+ },
185
+ },
186
+ },
187
+ };
188
+
189
+ export const RoundedButton: Story = {
190
+ args: {
191
+ type: "button",
192
+ size: "md",
193
+ color: "primary",
194
+ rounded: true,
195
+ iconType: "startIcon",
196
+ icon: HomeIcon,
197
+ },
198
+ render: (args) => ({
199
+ components: { EUIButton },
200
+ setup() {
201
+ return { args };
202
+ },
203
+ template: `<div class="space-x-4 inline-flex items-end">
204
+ <EUIButton v-bind="args" iconType="startIcon">Home</EUIButton>
205
+ <EUIButton v-bind="args" iconType="endIcon">Home</EUIButton>
206
+ <EUIButton v-bind="args" iconType="icon"></EUIButton>
207
+ </div>`,
208
+ }),
209
+ parameters: {
210
+ docs: {
211
+ source: {
212
+ code: `<template>
213
+ <EUIButton color="primary" rounded size="md" iconType="startIcon" :icon="HomeIcon">Home</EUIButton>
214
+ <EUIButton color="primary" rounded size="md" iconType="endIcon" :icon="HomeIcon">Home</EUIButton>
215
+ <EUIButton color="primary" rounded size="md" iconType="icon" :icon="HomeIcon"></EUIButton>
216
+ </template>`,
217
+ },
218
+ },
219
+ },
220
+ };
221
+
222
+ export const Loading: Story = {
223
+ args: {
224
+ type: "button",
225
+ size: "md",
226
+ color: "primary",
227
+ loading: true,
228
+ },
229
+ render: (args) => ({
230
+ components: { EUIButton },
231
+ setup() {
232
+ return { args };
233
+ },
234
+ template: `<EUIButton v-bind="args">Loading...</EUIButton>`,
235
+ }),
236
+ };
237
+
238
+ export const Disabled: Story = {
239
+ args: {
240
+ type: "button",
241
+ size: "md",
242
+ color: "purple",
243
+ disabled: true,
244
+ },
245
+ render: (args) => ({
246
+ components: { EUIButton },
247
+ setup() {
248
+ return { args };
249
+ },
250
+ template: `<EUIButton v-bind="args">Disabled</EUIButton>`,
251
+ }),
252
+ };
@@ -0,0 +1,151 @@
1
+ <template>
2
+ <button
3
+ :type="type"
4
+ :size="size"
5
+ :color="color"
6
+ :iconType="iconType"
7
+ v-bind="$attrs"
8
+ :class="['capitalize box-border border-none inline-flex flex-row gap-x-2 items-center active:scale-[.97] active:shadow-md transition duration-150 ease-in-out active:translate-y-0.5', rounded ?'rounded-full':'rounded-md', btnClass]"
9
+ :disabled="disabled"
10
+ :loading="loading"
11
+ :icon="icon"
12
+ @click="handleClick()"
13
+ >
14
+ <component
15
+ :is="icon"
16
+ v-if="iconType === 'icon' || iconType === 'startIcon'"
17
+ :class="[iconWidth]"
18
+ />
19
+ <slot />
20
+ <component :is="icon" v-if="iconType === 'endIcon'" :class="[iconWidth]" />
21
+
22
+ <svg
23
+ v-if="loading"
24
+ class="animate-spin"
25
+ :class="[iconWidth]"
26
+ xmlns="http://www.w3.org/2000/svg"
27
+ fill="none"
28
+ viewBox="0 0 24 24"
29
+ >
30
+ <circle
31
+ class="opacity-25"
32
+ cx="12"
33
+ cy="12"
34
+ r="10"
35
+ stroke="currentColor"
36
+ stroke-width="4"
37
+ />
38
+ <path
39
+ class="opacity-75"
40
+ fill="currentColor"
41
+ d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
42
+ />
43
+ </svg>
44
+ </button>
45
+ </template>
46
+
47
+ <script setup lang="ts">
48
+ import { reactive, computed, PropType } from "vue";
49
+
50
+ const emit = defineEmits(["click"]);
51
+ const handleClick = () => [emit("click")];
52
+
53
+ const props = defineProps({
54
+ type: {
55
+ type: String as PropType<"button" | "submit" | "reset">,
56
+ default: "button",
57
+ },
58
+ size: {
59
+ type: String as PropType<"xs" | "sm" | "md" | "lg">,
60
+ default: "md",
61
+ },
62
+ color: {
63
+ type: String as PropType<
64
+ "danger" | "success" | "black" | "white" | "purple" | 'primary'>,
65
+ default: "purple",
66
+ },
67
+ iconType: {
68
+ type: String as PropType<"startIcon" | "endIcon" | "icon">,
69
+ default: "",
70
+ },
71
+ icon: {
72
+ type: [String, Object, Function],
73
+ default: "",
74
+ },
75
+ rounded:Boolean,
76
+ loading: Boolean,
77
+ disabled: Boolean,
78
+ });
79
+
80
+ const sizeClasses = reactive({
81
+ xs: "text-sm font-medium leading-[normal]", // 24
82
+ sm: "text-sm font-medium", // 32
83
+ md: "text-base font-semibold", // 40
84
+ lg: "text-base font-semibold", // 52
85
+ });
86
+
87
+ const btnClass = computed(() => {
88
+ const btnDisabled = props.disabled;
89
+ const btnColor = {
90
+ black: btnDisabled
91
+ ? "bg-opacity-60 cursor-not-allowed text-gray-200 bg-gray-800"
92
+ : "text-white bg-gray-900 hover:bg-gray-800 active:bg-black cursor-pointer active:shadow-black/50",
93
+ white: btnDisabled
94
+ ? "bg-opacity-80 cursor-not-allowed text-gray-400 bg-gray-200"
95
+ : "bg-white hover:bg-gray-100 active:bg-gray-50 text-black cursor-pointer active:shadow-white/50 active:bg-transparent",
96
+ danger: btnDisabled
97
+ ? "bg-opacity-60 cursor-not-allowed text-gray-200 bg-red-500"
98
+ : "bg-red-500 hover:bg-red-600 active:bg-red-500 text-white cursor-pointer active:shadow-red-500/50",
99
+ success: btnDisabled
100
+ ? "bg-opacity-60 cursor-not-allowed text-gray-200 bg-green-600"
101
+ : "bg-green-600 hover:bg-green-700 active:bg-green-600 text-white cursor-pointer active:shadow-green-500/50",
102
+ purple: btnDisabled
103
+ ? "bg-opacity-60 cursor-not-allowed text-gray-200 bg-purple-500"
104
+ : "bg-purple-700 hover:bg-purple-800 active:bg-purple-700 text-white cursor-pointer active:shadow-purple-500/50",
105
+ primary: btnDisabled
106
+ ? "bg-opacity-60 cursor-not-allowed text-gray-200 bg-purple-500"
107
+ : "primary-btn text-white cursor-pointer active:shadow-purple-500/50",
108
+ };
109
+
110
+ // background: linear-gradient(107.63deg, #321386 0%, #9C20D7 100%, #9C20D7 100%);
111
+
112
+
113
+ const iconClasses = {
114
+ lg: props.iconType === "icon" ? "p-3.5" : "px-6 py-3.5",
115
+ md: props.iconType === "icon" ? "p-2" : "px-4 py-2",
116
+ sm: props.iconType === "icon" ? "p-1.5" : "px-4 py-1.5",
117
+ xs: props.iconType === "icon" ? "p-1" : "px-3 py-1",
118
+ };
119
+
120
+ const colorClass = btnColor[props.color] || "";
121
+ const sizeClass = sizeClasses[props.size] || "";
122
+ const typeClass = iconClasses[props.size] || "";
123
+ const disabledClass =
124
+ props.disabled === true
125
+ ? "active:!translate-y-0 active:!scale-100 active:!shadow-none"
126
+ : "";
127
+ return `${colorClass} ${sizeClass} ${typeClass} ${disabledClass}`;
128
+ });
129
+
130
+ const iconWidthClasses = reactive({
131
+ xs: "w-4 h-4 text-current",
132
+ sm: "w-5 h-5 text-current",
133
+ md: "w-6 h-6 text-current",
134
+ lg: "w-6 h-6 text-current",
135
+ });
136
+
137
+ const iconWidth = computed(() => {
138
+ const iconClass = iconWidthClasses[props.size] || "";
139
+ return iconClass;
140
+ });
141
+ </script>
142
+
143
+ <style lang="scss">
144
+ .primary-btn {
145
+ background: linear-gradient(107.63deg, #321386 0%, #9C20D7 100%, #9C20D7 100%);
146
+ @apply bg-[#321386] hover:opacity-90;
147
+ &:active {
148
+ background: linear-gradient(-135deg,#321386 0%, #9c20d7 100%, #9c20d7 100%);
149
+ }
150
+ }
151
+ </style>
@@ -0,0 +1,58 @@
1
+ import type { Meta, StoryObj } from "@storybook/vue3";
2
+ import EUICheckbox from "./EUICheckbox.vue";
3
+
4
+ // Meta configuration for the component's stories
5
+ const meta = {
6
+ title: "Forms/Checkbox",
7
+ component: EUICheckbox,
8
+ tags: ["autodocs"],
9
+ argTypes: {
10
+ label: {
11
+ description: "The label displayed next to the checkbox",
12
+ control: "text",
13
+ },
14
+ disabled: {
15
+ description: "Disables the checkbox when set to true",
16
+ control: "boolean",
17
+ },
18
+ modelValue: {
19
+ description: "Controls the checked state of the checkbox",
20
+ control: "boolean",
21
+ },
22
+ errors: {
23
+ description:
24
+ "An object that contains error messages or validation information",
25
+ control: "object",
26
+ },
27
+ name: {
28
+ description:
29
+ "The name attribute for the checkbox input, useful for forms",
30
+ control: "text",
31
+ },
32
+ },
33
+ } satisfies Meta<typeof EUICheckbox>;
34
+
35
+ export default meta;
36
+ type Story = StoryObj<typeof meta>;
37
+
38
+ // Default story with minimum props
39
+ export const Default: Story = {
40
+ args: {
41
+ label: "Accept Terms & Conditions",
42
+ modelValue: false,
43
+ disabled: false,
44
+ name: "checkbox",
45
+ errors: {
46
+ message: "Checkbok not checked",
47
+ },
48
+ },
49
+ };
50
+
51
+ // Disabled state story
52
+ export const Disabled: Story = {
53
+ args: {
54
+ label: "Disabled Checkbox",
55
+ modelValue: false,
56
+ disabled: true,
57
+ },
58
+ };
@@ -0,0 +1,103 @@
1
+ <template>
2
+ <label class="flex flex-wrap items-center scale-100 translate-x-0 translate-y-0 eui-checkbox">
3
+ <input v-model="isChecked" type="checkbox" id="checkbox" class="appearance-none sr-only input-checkbox" :disabled="disabled"
4
+ @change="toggle($event)" />
5
+ <div class="cbx-icon" for="checkbox">
6
+ <span>
7
+ <svg width="14px" height="14px">
8
+ <use xlink:href="#check-box"></use>
9
+ </svg>
10
+ </span>
11
+ <svg class="absolute pointer-events-none select-none inline-svg size-0">
12
+ <symbol id="check-box" viewbox="0 0 14 14">
13
+ <polyline points="1.5 6 4.5 9 10.5 1"></polyline>
14
+ </symbol>
15
+ </svg>
16
+ </div>
17
+ <span v-if="label" class="text-sm font-medium tracking-wide text-gray-700 ms-2 first-letter:capitalize">{{ label }}</span>
18
+ </label>
19
+ <EUIErrorMessage :errors="errors" :name="name" />
20
+ </template>
21
+
22
+ <script setup lang="ts">
23
+ import { PropType, watch,ref } from "vue";
24
+ import EUIErrorMessage from "../errorMessage/EUIErrorMessage.vue";
25
+
26
+ const props = defineProps({
27
+ errors: { type: Object, required: false, default: () => {} },
28
+ name: {
29
+ type: String,
30
+ required: false,
31
+ default: "",
32
+ },
33
+ modelValue: {
34
+ type: Boolean as PropType<boolean>,
35
+ required: true,
36
+ default: false,
37
+ },
38
+ disabled: {
39
+ type: Boolean,
40
+ default: false,
41
+ },
42
+ label: { type: String as PropType<string>, required: true, default: "" },
43
+ });
44
+
45
+ const emit = defineEmits(["update:modelValue", "toggle"]);
46
+ const isChecked = ref<boolean>(props.modelValue);
47
+
48
+ watch(isChecked, (newValue) => {
49
+ emit("update:modelValue", newValue);
50
+ });
51
+
52
+ const toggle = ($event: Event) => {
53
+ if($event) {
54
+ emit("toggle", isChecked.value);
55
+ }
56
+ };
57
+
58
+ watch(props, (newValue) => {
59
+ isChecked.value = newValue.modelValue;
60
+ });
61
+ </script>
62
+
63
+ <style lang="scss">
64
+ .eui-checkbox .cbx-icon {
65
+ transition: all 0.2s ease;
66
+ @apply select-none cursor-pointer p-0.5 rounded-md overflow-hidden inline-block scale-110;
67
+ }
68
+
69
+ .eui-checkbox .cbx-icon span {
70
+ transform: translate3d(0, 0, 0);
71
+ transition: all 0.2s ease;
72
+ @apply float-left align-middle relative size-5 border-[1.5px] border-gray-400 rounded scale-100;
73
+ }
74
+
75
+ .eui-checkbox .cbx-icon span > svg {
76
+ top: 3.5px;
77
+ left: 2.5px;
78
+ stroke-width: 1.75;
79
+ stroke-linecap: round;
80
+ stroke-linejoin: round;
81
+ stroke-dasharray: 18px;
82
+ stroke-dashoffset: 18px;
83
+ transition: all 0.3s ease;
84
+ transition-delay: 0.1s;
85
+ transform: translate3d(0, 0, 0);
86
+ @apply absolute fill-none stroke-white
87
+ }
88
+
89
+ .eui-checkbox .input-checkbox:checked + .cbx-icon > span {
90
+ animation: anim 0.4s ease;
91
+ @apply bg-purple-700 border-purple-700;
92
+ }
93
+
94
+ .eui-checkbox .input-checkbox:checked + .cbx-icon span > svg {
95
+ stroke-dashoffset: 0;
96
+ }
97
+
98
+ @keyframes anim {
99
+ 50% {
100
+ transform: scale(0.85);
101
+ }
102
+ }
103
+ </style>