edvoyui-component-library-test-flight 0.0.168 → 0.0.170
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.
- package/package.json +10 -3
- package/src/App.vue +0 -16
- package/src/assets/svg/CheckTick.vue +0 -21
- package/src/assets/svg/ChevronBigDown.vue +0 -22
- package/src/assets/svg/ChevronDownSolid.vue +0 -19
- package/src/assets/svg/ChevronDownStroke.vue +0 -22
- package/src/assets/svg/ChevronDownStrokeSolid.vue +0 -19
- package/src/assets/svg/SearchBigZoomIn.vue +0 -21
- package/src/assets/svg/SortArrow.vue +0 -24
- package/src/assets/svg/Student.vue +0 -30
- package/src/assets/svg/partner.vue +0 -33
- package/src/assets/svg/people.vue +0 -25
- package/src/components/HelloWorld.vue +0 -1974
- package/src/components/accordion/EUIAccordion.vue +0 -152
- package/src/components/alerts/EUIAlerts.vue +0 -194
- package/src/components/avatar/EUIAvatar.vue +0 -96
- package/src/components/breadcrumb/EUIBreadcrumb.vue +0 -59
- package/src/components/button/EUIButton.vue +0 -154
- package/src/components/button/EUIButtonGroup.vue +0 -287
- package/src/components/button/buttonAnimateTab.vue +0 -74
- package/src/components/checkbox/EUICheckbox.vue +0 -110
- package/src/components/datepicker/EUIDatepicker.vue +0 -295
- package/src/components/delete.vue +0 -262
- package/src/components/dragModal/EUIDrag.vue +0 -179
- package/src/components/dropdown/EUIMultiDropdown.vue +0 -174
- package/src/components/errorMessage/EUIErrorMessage.vue +0 -25
- package/src/components/input/EUIInput.vue +0 -223
- package/src/components/input/EUINumberInput.vue +0 -250
- package/src/components/loader/EUICircleLoader.vue +0 -31
- package/src/components/loader/EUICubeLoader.vue +0 -237
- package/src/components/loader/EUILoader.vue +0 -17
- package/src/components/loader/EUISquareLoader.vue +0 -47
- package/src/components/modal/EUIModal.vue +0 -224
- package/src/components/pillSelect/EUIPillSelect.vue +0 -149
- package/src/components/popover/EUIPopover.vue +0 -297
- package/src/components/radio/EUIRadio.vue +0 -75
- package/src/components/searchInput/EUISearch.vue +0 -223
- package/src/components/searchTagSelect/EUISearchTagSelect.vue +0 -642
- package/src/components/searchTagSelect/SearchInput.vue +0 -167
- package/src/components/searchexpand/EUISearchExpand.vue +0 -148
- package/src/components/searchexpand/EUISearchToggle.vue +0 -86
- package/src/components/select/EUISelect.vue +0 -1092
- package/src/components/selectSearch/EUISelectSearch.vue +0 -23
- package/src/components/slideover/EUISlideover.vue +0 -207
- package/src/components/stepperTimeline/EUIStepperHorizontal.vue +0 -242
- package/src/components/stepperTimeline/EUIStepperTimeline.vue +0 -16
- package/src/components/stepperTimeline/EUIStepperVertical.vue +0 -112
- package/src/components/table/ColumnResizeTable.vue +0 -740
- package/src/components/table/EUIDashboardTable.vue +0 -514
- package/src/components/table/EUIPageLimit.vue +0 -66
- package/src/components/table/EUIPagination.vue +0 -175
- package/src/components/table/EUIStudentPagination.vue +0 -172
- package/src/components/table/EUITable.vue +0 -559
- package/src/components/table/EUITableCheckbox.vue +0 -98
- package/src/components/table/GrowthTable.vue +0 -575
- package/src/components/table/GrowthTableView.vue +0 -108
- package/src/components/table/ResizeTableview.vue +0 -198
- package/src/components/table/UCheckbox.vue +0 -169
- package/src/components/table/UTable.vue +0 -611
- package/src/components/table/UTableview.vue +0 -189
- package/src/components/tabs/EUITabOutline.vue +0 -263
- package/src/components/tabs/EUITabs.vue +0 -226
- package/src/components/tag/EUITag.vue +0 -88
- package/src/components/telephone/EUITelephone.vue +0 -299
- package/src/components/textArea/EUITextArea.vue +0 -155
- package/src/components/timeLine/EUITimeLine.vue +0 -148
- package/src/components/toggle/EUIToggle.vue +0 -101
- package/src/components/tooltip/EUITooltip.vue +0 -111
- package/src/components/uidemo/select-com.vue +0 -120
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div>
|
|
3
|
-
<div
|
|
4
|
-
class="inline-flex items-center gap-2 px-2 py-2 overflow-hidden transition-all duration-200 ease-in bg-white shadow-xl w-max shadow-purple-50"
|
|
5
|
-
:class="[rounded ? 'rounded-full' : 'rounded-lg']"
|
|
6
|
-
v-bind="$attrs"
|
|
7
|
-
>
|
|
8
|
-
<slot name="before" />
|
|
9
|
-
<nav
|
|
10
|
-
ref="navContainer"
|
|
11
|
-
class="relative z-0 inline-flex flex-row items-center gap-2"
|
|
12
|
-
>
|
|
13
|
-
<div
|
|
14
|
-
ref="navIndicator"
|
|
15
|
-
class="absolute left-0 top-0 h-full w-auto -z-[1] transition-all duration-350 ease-[cubic-bezier(0.15,0.3,0.25,1)]"
|
|
16
|
-
:class="[
|
|
17
|
-
getBtnClass(activeBtnName),
|
|
18
|
-
rounded ? 'rounded-full' : 'rounded-lg',
|
|
19
|
-
]"
|
|
20
|
-
></div>
|
|
21
|
-
<button
|
|
22
|
-
v-for="(data, index) in items"
|
|
23
|
-
:key="`data-${index}`"
|
|
24
|
-
v-bind="buttonAttrs"
|
|
25
|
-
:type="type"
|
|
26
|
-
:size="size"
|
|
27
|
-
:iconType="iconType"
|
|
28
|
-
:data-name="data.name"
|
|
29
|
-
:class="[
|
|
30
|
-
'capitalize box-border border-none inline-flex flex-row gap-x-2 items-center !bg-transparent',
|
|
31
|
-
rounded ? 'rounded-full' : 'rounded-lg',
|
|
32
|
-
getBtnClass(data.name || ''),
|
|
33
|
-
{ 'bar-indicator': data.name !== activeBtnName },
|
|
34
|
-
]"
|
|
35
|
-
:disabled="disabled"
|
|
36
|
-
:loading="loading"
|
|
37
|
-
:icon="icon"
|
|
38
|
-
@click="handleOnChange(data || '')"
|
|
39
|
-
style="transition: all 350ms cubic-bezier(0.15, 0.3, 0.25, 1)"
|
|
40
|
-
>
|
|
41
|
-
<component
|
|
42
|
-
:is="icon"
|
|
43
|
-
v-if="iconType === 'icon' || iconType === 'startIcon'"
|
|
44
|
-
:class="[iconWidth]"
|
|
45
|
-
/>
|
|
46
|
-
<slot :data="data" :activeName="activeBtnName">
|
|
47
|
-
{{ data?.name }}
|
|
48
|
-
</slot>
|
|
49
|
-
<component
|
|
50
|
-
:is="icon"
|
|
51
|
-
v-if="iconType === 'endIcon'"
|
|
52
|
-
:class="[iconWidth]"
|
|
53
|
-
/>
|
|
54
|
-
<svg
|
|
55
|
-
v-if="loading"
|
|
56
|
-
class="animate-spin"
|
|
57
|
-
:class="[iconWidth]"
|
|
58
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
59
|
-
fill="none"
|
|
60
|
-
viewBox="0 0 24 24"
|
|
61
|
-
>
|
|
62
|
-
<circle
|
|
63
|
-
class="opacity-25"
|
|
64
|
-
cx="12"
|
|
65
|
-
cy="12"
|
|
66
|
-
r="10"
|
|
67
|
-
stroke="currentColor"
|
|
68
|
-
stroke-width="4"
|
|
69
|
-
/>
|
|
70
|
-
<path
|
|
71
|
-
fill="currentColor"
|
|
72
|
-
class="opacity-75"
|
|
73
|
-
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"
|
|
74
|
-
/>
|
|
75
|
-
</svg>
|
|
76
|
-
</button>
|
|
77
|
-
</nav>
|
|
78
|
-
<slot name="after" />
|
|
79
|
-
</div>
|
|
80
|
-
</div>
|
|
81
|
-
</template>
|
|
82
|
-
|
|
83
|
-
<script setup lang="ts">
|
|
84
|
-
import {
|
|
85
|
-
computed,
|
|
86
|
-
nextTick,
|
|
87
|
-
onMounted,
|
|
88
|
-
PropType,
|
|
89
|
-
reactive,
|
|
90
|
-
ref,
|
|
91
|
-
toRefs,
|
|
92
|
-
useAttrs,
|
|
93
|
-
} from "vue";
|
|
94
|
-
|
|
95
|
-
interface Item {
|
|
96
|
-
name: string;
|
|
97
|
-
[key: string]: any;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const props = defineProps({
|
|
101
|
-
items: {
|
|
102
|
-
type: Array as () => Item[],
|
|
103
|
-
default: () => [],
|
|
104
|
-
},
|
|
105
|
-
defaultActive: {
|
|
106
|
-
type: String,
|
|
107
|
-
default: "",
|
|
108
|
-
},
|
|
109
|
-
type: {
|
|
110
|
-
type: String as PropType<"button" | "submit" | "reset">,
|
|
111
|
-
default: "button",
|
|
112
|
-
},
|
|
113
|
-
size: {
|
|
114
|
-
type: String as PropType<"xs" | "sm" | "md" | "lg">,
|
|
115
|
-
default: "md",
|
|
116
|
-
},
|
|
117
|
-
activeColor: {
|
|
118
|
-
type: String as PropType<
|
|
119
|
-
| "danger"
|
|
120
|
-
| "success"
|
|
121
|
-
| "black"
|
|
122
|
-
| "white"
|
|
123
|
-
| "purple"
|
|
124
|
-
| "secondary"
|
|
125
|
-
| "tertiary"
|
|
126
|
-
>,
|
|
127
|
-
default: "white",
|
|
128
|
-
},
|
|
129
|
-
iconType: {
|
|
130
|
-
type: String as PropType<"startIcon" | "endIcon" | "icon">,
|
|
131
|
-
default: "",
|
|
132
|
-
},
|
|
133
|
-
icon: {
|
|
134
|
-
type: [String, Object, Function],
|
|
135
|
-
default: "",
|
|
136
|
-
},
|
|
137
|
-
rounded: {
|
|
138
|
-
type: Boolean,
|
|
139
|
-
default: false,
|
|
140
|
-
},
|
|
141
|
-
loading: Boolean,
|
|
142
|
-
disabled: Boolean,
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
defineOptions({
|
|
146
|
-
inheritAttrs: false,
|
|
147
|
-
});
|
|
148
|
-
const attrs = useAttrs();
|
|
149
|
-
const buttonAttrs = computed(() => {
|
|
150
|
-
const { class: _class, style: _style, id: _id, ...rest } = attrs;
|
|
151
|
-
return rest;
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
const emit = defineEmits<{
|
|
155
|
-
(event: "update:activeButton", activeButton: Item): void;
|
|
156
|
-
}>();
|
|
157
|
-
|
|
158
|
-
const navIndicator = ref<HTMLElement | null>(null);
|
|
159
|
-
const navContainer = ref<HTMLElement | null>(null);
|
|
160
|
-
|
|
161
|
-
const { items, defaultActive } = toRefs(props);
|
|
162
|
-
const activeBtnName = ref(defaultActive.value || items.value[0]?.name || "");
|
|
163
|
-
|
|
164
|
-
const marker = (el: HTMLElement) => {
|
|
165
|
-
const indicator = navIndicator.value;
|
|
166
|
-
if (indicator && el) {
|
|
167
|
-
indicator.style.left = el.offsetLeft + "px";
|
|
168
|
-
indicator.style.width = el.offsetWidth + "px";
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
const updateMarkerPosition = () => {
|
|
173
|
-
const activeBtn = navContainer.value?.querySelector(
|
|
174
|
-
`button[data-name="${activeBtnName.value}"]`
|
|
175
|
-
);
|
|
176
|
-
if (activeBtn) {
|
|
177
|
-
marker(activeBtn as HTMLElement);
|
|
178
|
-
}
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
const handleOnChange = (val: any) => {
|
|
182
|
-
activeBtnName.value = val?.name;
|
|
183
|
-
emit("update:activeButton", val);
|
|
184
|
-
nextTick(() => {
|
|
185
|
-
updateMarkerPosition();
|
|
186
|
-
});
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
onMounted(() => {
|
|
190
|
-
nextTick(() => {
|
|
191
|
-
requestAnimationFrame(() => {
|
|
192
|
-
updateMarkerPosition();
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
// Computed classes for button size
|
|
198
|
-
const sizeClasses = reactive({
|
|
199
|
-
xs: "text-xs font-medium leading-[normal]", //24
|
|
200
|
-
sm: "text-sm font-medium", //32
|
|
201
|
-
md: "text-base font-semibold", //40
|
|
202
|
-
lg: "text-base font-semibold", //48
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
const btnColors = {
|
|
206
|
-
black: {
|
|
207
|
-
enabled:
|
|
208
|
-
"text-white bg-gray-900 hover:bg-gray-800 active:bg-black cursor-pointer active:shadow-black/50",
|
|
209
|
-
disabled: "bg-opacity-60 cursor-not-allowed text-gray-200 bg-gray-800",
|
|
210
|
-
},
|
|
211
|
-
white: {
|
|
212
|
-
enabled:
|
|
213
|
-
"bg-white hover:bg-gray-100 text-gray-500 hover:text-gray-900 cursor-pointer active:shadow-white/50 active:bg-transparent",
|
|
214
|
-
disabled: "bg-opacity-80 cursor-not-allowed text-gray-400 bg-gray-200",
|
|
215
|
-
},
|
|
216
|
-
danger: {
|
|
217
|
-
enabled:
|
|
218
|
-
"bg-red-500 hover:bg-red-600 active:bg-red-500 text-white cursor-pointer active:shadow-red-500/50",
|
|
219
|
-
disabled: "bg-opacity-60 cursor-not-allowed text-gray-200 bg-red-500",
|
|
220
|
-
},
|
|
221
|
-
success: {
|
|
222
|
-
enabled:
|
|
223
|
-
"bg-green-600 hover:bg-green-700 active:bg-green-600 text-white cursor-pointer active:shadow-green-500/50",
|
|
224
|
-
disabled: "bg-opacity-60 cursor-not-allowed text-gray-200 bg-green-600",
|
|
225
|
-
},
|
|
226
|
-
purple: {
|
|
227
|
-
enabled:
|
|
228
|
-
"bg-purple-700 hover:bg-purple-800 active:bg-purple-700 text-white cursor-pointer active:shadow-purple-500/50",
|
|
229
|
-
disabled: "bg-opacity-60 cursor-not-allowed text-gray-200 bg-purple-500",
|
|
230
|
-
},
|
|
231
|
-
secondary: {
|
|
232
|
-
enabled:
|
|
233
|
-
"bg-purple-100 hover:bg-purple-50 active:bg-purple-100 cursor-pointer text-gray-700 active:shadow-purple-200",
|
|
234
|
-
disabled: "bg-opacity-75 cursor-not-allowed text-gray-400 bg-purple-50",
|
|
235
|
-
},
|
|
236
|
-
tertiary: {
|
|
237
|
-
enabled:
|
|
238
|
-
"bg-gray-100 hover:bg-gray-50 active:bg-gray-100 text-gray-700 cursor-pointer active:shadow-bg-gray-200/50 ring-1 ring-gray-200",
|
|
239
|
-
disabled:
|
|
240
|
-
"bg-opacity-75 cursor-not-allowed text-gray-400 bg-gray-50 ring-1 ring-gray-100",
|
|
241
|
-
},
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
const iconClasses = {
|
|
245
|
-
lg: props.iconType === "icon" ? "p-3" : "px-6 py-3",
|
|
246
|
-
md: props.iconType === "icon" ? "p-2" : "px-4 py-2",
|
|
247
|
-
sm: props.iconType === "icon" ? "p-1.5" : "px-4 py-1.5",
|
|
248
|
-
xs: props.iconType === "icon" ? "p-1" : "px-3 py-1",
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
const iconWidthClasses = reactive({
|
|
252
|
-
xs: "w-4 h-4 text-current",
|
|
253
|
-
sm: "w-5 h-5 text-current",
|
|
254
|
-
md: "w-6 h-6 text-current",
|
|
255
|
-
lg: "w-6 h-6 text-current",
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
const iconWidth = computed(() => {
|
|
259
|
-
return iconWidthClasses[props.size] || "";
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
const getBtnClass = (btnName: string) => {
|
|
263
|
-
const isActive = btnName === activeBtnName.value;
|
|
264
|
-
const colorKey = isActive ? props.activeColor : "white";
|
|
265
|
-
const state = props.disabled ? "disabled" : "enabled";
|
|
266
|
-
const colorClass = btnColors[colorKey] ? btnColors[colorKey][state] : "";
|
|
267
|
-
const sizeClass = sizeClasses[props.size] || "";
|
|
268
|
-
const typeClass = iconClasses[props.size] || "";
|
|
269
|
-
return `${colorClass} ${sizeClass} ${typeClass}`;
|
|
270
|
-
};
|
|
271
|
-
</script>
|
|
272
|
-
|
|
273
|
-
<style lang="scss" scoped>
|
|
274
|
-
.bar-indicator {
|
|
275
|
-
@apply relative;
|
|
276
|
-
&::before {
|
|
277
|
-
content: "";
|
|
278
|
-
transition: 0.4s;
|
|
279
|
-
will-change: opacity;
|
|
280
|
-
@apply absolute -bottom-4 left-0 w-full h-[0.1875rem] rounded-t-xl bg-gray-300 z-[-1] origin-bottom opacity-0;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
.bar-indicator:hover::before {
|
|
285
|
-
@apply opacity-100 -bottom-2;
|
|
286
|
-
}
|
|
287
|
-
</style>
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="inline-flex flex-col items-end w-full space-y-20">
|
|
3
|
-
<div
|
|
4
|
-
class="inline-flex items-center gap-2 px-3 py-3 transition-colors duration-100 ease-in bg-white rounded-full shadow-xl w-max shadow-purple-50"
|
|
5
|
-
>
|
|
6
|
-
<slot name="before" />
|
|
7
|
-
<nav class="relative inline-flex flex-row items-center gap-2">
|
|
8
|
-
<div id="nav-indicator"></div>
|
|
9
|
-
<EUIBtnGroup
|
|
10
|
-
v-for="(data, index) in allDays"
|
|
11
|
-
:key="`data-${index}`"
|
|
12
|
-
size="sm"
|
|
13
|
-
:data-name="data.name"
|
|
14
|
-
:color="activeDays === data.name ? 'tertiary' : 'white'"
|
|
15
|
-
rounded
|
|
16
|
-
@click="handleOnChange(data.name)"
|
|
17
|
-
>
|
|
18
|
-
{{ data.name }}
|
|
19
|
-
<small class="opacity-75">({{ data.count }})</small></EUIBtnGroup
|
|
20
|
-
>
|
|
21
|
-
</nav>
|
|
22
|
-
<slot name="after" />
|
|
23
|
-
</div>
|
|
24
|
-
</div>
|
|
25
|
-
</template>
|
|
26
|
-
|
|
27
|
-
<script setup lang="ts">
|
|
28
|
-
import { nextTick, onMounted, ref } from "vue";
|
|
29
|
-
import EUIBtnGroup from "./EUIBtnGroup.vue";
|
|
30
|
-
|
|
31
|
-
const allDays = ref([
|
|
32
|
-
{ name: "7 days", count: 5 },
|
|
33
|
-
{ name: "15 days", count: 10 },
|
|
34
|
-
{ name: "16-30 days", count: 20 },
|
|
35
|
-
{ name: "31-60 days", count: 121 },
|
|
36
|
-
{ name: "61-90 days", count: 40 },
|
|
37
|
-
]);
|
|
38
|
-
|
|
39
|
-
const activeDays = ref(allDays.value[0].name);
|
|
40
|
-
|
|
41
|
-
onMounted(() => {
|
|
42
|
-
nextTick(() => {
|
|
43
|
-
const activeBtn = document.querySelector(
|
|
44
|
-
`nav button[data-name="${activeDays.value}"]`
|
|
45
|
-
);
|
|
46
|
-
if (activeBtn) marker(activeBtn as HTMLElement);
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
const marker = (el: HTMLElement) => {
|
|
51
|
-
const indicator = document.querySelector("#nav-indicator") as HTMLElement;
|
|
52
|
-
if (indicator && el) {
|
|
53
|
-
indicator.style.left = el.offsetLeft + "px";
|
|
54
|
-
indicator.style.width = el.offsetWidth + "px";
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const handleOnChange = (val: string) => {
|
|
59
|
-
activeDays.value = val;
|
|
60
|
-
nextTick(() => {
|
|
61
|
-
const activeBtn = document.querySelector(
|
|
62
|
-
`nav button[data-name="${activeDays.value}"]`
|
|
63
|
-
);
|
|
64
|
-
if (activeBtn) marker(activeBtn as HTMLElement);
|
|
65
|
-
});
|
|
66
|
-
};
|
|
67
|
-
</script>
|
|
68
|
-
|
|
69
|
-
<style lang="scss" scoped>
|
|
70
|
-
#nav-indicator {
|
|
71
|
-
transition: all 350ms cubic-bezier(0.15, 0.3, 0.25, 1);
|
|
72
|
-
@apply absolute w-auto h-1 bg-gray-500 rounded-t-lg -bottom-3;
|
|
73
|
-
}
|
|
74
|
-
</style>
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div>
|
|
3
|
-
<label class="flex flex-row items-center scale-100 translate-x-0 translate-y-0 eui-checkbox">
|
|
4
|
-
<input v-model="isChecked" type="checkbox" id="checkbox" class="appearance-none sr-only input-checkbox" :disabled="disabled"
|
|
5
|
-
@change="toggle($event)" />
|
|
6
|
-
<div class="cbx-icon" for="checkbox">
|
|
7
|
-
<span>
|
|
8
|
-
<svg width="14px" height="14px">
|
|
9
|
-
<use xlink:href="#check-box"></use>
|
|
10
|
-
</svg>
|
|
11
|
-
</span>
|
|
12
|
-
<svg class="absolute pointer-events-none select-none inline-svg size-0">
|
|
13
|
-
<symbol id="check-box" viewbox="0 0 14 14">
|
|
14
|
-
<polyline points="1.5 6 4.5 9 10.5 1"></polyline>
|
|
15
|
-
</symbol>
|
|
16
|
-
</svg>
|
|
17
|
-
</div>
|
|
18
|
-
<slot name="label">
|
|
19
|
-
<span v-if="label" class="text-sm font-medium tracking-wide text-gray-700 ms-2 first-letter:capitalize">{{ label }}</span>
|
|
20
|
-
</slot>
|
|
21
|
-
</label>
|
|
22
|
-
<template v-if="errors && Object.keys(errors).length">
|
|
23
|
-
<EUIErrorMessage :errors="errors" :name="name" />
|
|
24
|
-
</template>
|
|
25
|
-
</div>
|
|
26
|
-
</template>
|
|
27
|
-
|
|
28
|
-
<script setup lang="ts">
|
|
29
|
-
import { PropType, watch,ref } from "vue";
|
|
30
|
-
import EUIErrorMessage from "../errorMessage/EUIErrorMessage.vue";
|
|
31
|
-
|
|
32
|
-
const props = defineProps({
|
|
33
|
-
errors: { type: Object, required: false, default: () => {} },
|
|
34
|
-
name: {
|
|
35
|
-
type: String,
|
|
36
|
-
required: false,
|
|
37
|
-
default: "",
|
|
38
|
-
},
|
|
39
|
-
modelValue: {
|
|
40
|
-
type: Boolean as PropType<boolean>,
|
|
41
|
-
required: true,
|
|
42
|
-
default: false,
|
|
43
|
-
},
|
|
44
|
-
disabled: {
|
|
45
|
-
type: Boolean,
|
|
46
|
-
default: false,
|
|
47
|
-
},
|
|
48
|
-
label: { type: String as PropType<string>, required: true, default: "" },
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
const emit = defineEmits(["update:modelValue", "toggle"]);
|
|
52
|
-
const isChecked = ref<boolean>(props.modelValue);
|
|
53
|
-
|
|
54
|
-
watch(isChecked, (newValue) => {
|
|
55
|
-
emit("update:modelValue", newValue);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
const toggle = ($event: Event) => {
|
|
59
|
-
if($event) {
|
|
60
|
-
emit("toggle", isChecked.value);
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
watch(props, (newValue) => {
|
|
65
|
-
isChecked.value = newValue.modelValue;
|
|
66
|
-
});
|
|
67
|
-
</script>
|
|
68
|
-
|
|
69
|
-
<style lang="scss">
|
|
70
|
-
.eui-checkbox .cbx-icon {
|
|
71
|
-
transition: all 0.2s ease;
|
|
72
|
-
@apply select-none cursor-pointer p-px rounded-md overflow-hidden inline-block scale-110;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
.eui-checkbox .cbx-icon span {
|
|
76
|
-
transform: translate3d(0, 0, 0);
|
|
77
|
-
transition: all 0.2s ease;
|
|
78
|
-
@apply float-left align-middle relative size-5 border-[1.5px] border-gray-400 rounded scale-100;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
.eui-checkbox .cbx-icon span > svg {
|
|
82
|
-
top: 3.5px;
|
|
83
|
-
left: 2.5px;
|
|
84
|
-
stroke-width: 1.75;
|
|
85
|
-
stroke-linecap: round;
|
|
86
|
-
stroke-linejoin: round;
|
|
87
|
-
stroke-dasharray: 18px;
|
|
88
|
-
stroke-dashoffset: 18px;
|
|
89
|
-
transition: all 0.3s ease;
|
|
90
|
-
transition-delay: 0.1s;
|
|
91
|
-
transform: translate3d(0, 0, 0);
|
|
92
|
-
@apply absolute fill-none stroke-white;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
.eui-checkbox .input-checkbox:checked + .cbx-icon > span {
|
|
96
|
-
animation: anim 0.4s ease;
|
|
97
|
-
@apply bg-purple-700 border-purple-700;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
.eui-checkbox .input-checkbox:checked + .cbx-icon span > svg {
|
|
101
|
-
stroke-dashoffset: 0;
|
|
102
|
-
transition: rotate(8deg);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
@keyframes anim {
|
|
106
|
-
50% {
|
|
107
|
-
transform: scale(0.85);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
</style>
|