plugin-ui-for-kzt 0.0.17 → 0.0.18
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/dist/components/BaseBadge/BaseBadge.vue.d.ts +49 -0
- package/dist/components/BaseBadge/BaseBadgeGroup.vue.d.ts +30 -0
- package/dist/components/BaseButton/BaseButton.vue.d.ts +1 -1
- package/dist/components/BaseCalendar/BaseCalendar.vue.d.ts +1 -1
- package/dist/components/BaseCheckbox/BaseCheckbox.vue.d.ts +1 -1
- package/dist/components/BaseChips/BaseChips.vue.d.ts +1 -1
- package/dist/components/BaseDropdown/BaseDropdown.vue.d.ts +1 -1
- package/dist/components/BaseInput/BaseInput.vue.d.ts +2 -2
- package/dist/components/BaseInputCalendar/BaseInputCalendar.vue.d.ts +3 -3
- package/dist/components/BaseInputCurrency/BaseInputCurrency.vue.d.ts +2 -2
- package/dist/components/BaseInputEmail/BaseInputEmail.vue.d.ts +2 -2
- package/dist/components/BaseInputPhone/BaseInputPhone.vue.d.ts +2 -2
- package/dist/components/BaseModal/BaseModal.vue.d.ts +4 -0
- package/dist/components/BaseOpenedListItem/BaseOpenedListItem.vue.d.ts +1 -1
- package/dist/components/BasePagination/BasePagination.vue.d.ts +1 -1
- package/dist/components/BaseRadio/BaseRadio.vue.d.ts +1 -1
- package/dist/components/BaseSegmentedButtons/BaseSegmentedButtons.vue.d.ts +2 -2
- package/dist/components/BaseSelect/BaseSelect.vue.d.ts +2 -2
- package/dist/components/BaseTag/BaseTag.vue.d.ts +61 -0
- package/dist/components/BaseTextarea/BaseTextarea.vue.d.ts +1 -1
- package/dist/components/BaseToggle/BaseToggle.vue.d.ts +1 -1
- package/dist/components/BaseTooltip/BaseTooltip.vue.d.ts +1 -1
- package/dist/components/BaseUpload/BaseUpload.vue.d.ts +31 -0
- package/dist/components/{Modal/Modal.vue.d.ts → BaseUpload/ImageModal.vue.d.ts} +2 -10
- package/dist/components/Toaster/Toaster.vue.d.ts +1 -1
- package/dist/composables/useModal.d.ts +7 -0
- package/dist/index.d.ts +7 -3
- package/dist/index.js +1 -1
- package/dist/plugins/modalPlugin.d.ts +0 -13
- package/dist/sprite.svg +1 -1
- package/dist/store/modal.d.ts +154 -9
- package/example/App.vue +123 -311
- package/example/MyCustomModal.vue +37 -0
- package/package.json +1 -1
- package/src/assets/icons/add.svg +4 -0
- package/src/assets/icons/arrow-up.svg +4 -0
- package/src/assets/icons/close-circle.svg +5 -0
- package/src/assets/icons/close.svg +4 -0
- package/src/assets/icons/document-text.svg +4 -0
- package/src/assets/icons/export.svg +5 -0
- package/src/assets/icons/gallery.svg +5 -0
- package/src/assets/icons/notification-icon.svg +7 -0
- package/src/assets/icons/search-zoom-in.svg +6 -0
- package/src/assets/icons/trash.svg +7 -0
- package/src/assets/icons/upload.svg +5 -0
- package/src/components/BaseBadge/BaseBadge.vue +188 -0
- package/src/components/BaseBadge/BaseBadgeGroup.vue +120 -0
- package/src/components/BaseBadge/README.md +127 -0
- package/src/components/BaseBreadCrumbs/BaseBreadCrumbs.vue +2 -1
- package/src/components/BaseButton/BaseButton.vue +0 -112
- package/src/components/BaseInput/BaseInput.vue +4 -3
- package/src/components/BaseModal/BaseModal.vue +189 -0
- package/src/components/BaseTag/BaseTag.vue +245 -0
- package/src/components/BaseTag/README.md +125 -0
- package/src/components/BaseTextarea/BaseTextarea.vue +7 -14
- package/src/components/BaseUpload/BaseUpload.vue +392 -0
- package/src/components/BaseUpload/ImageModal.vue +25 -0
- package/src/composables/useModal.ts +14 -0
- package/src/index.ts +32 -19
- package/src/plugins/modalPlugin.ts +92 -76
- package/src/store/modal.ts +39 -16
- package/src/styles/root.scss +1 -0
- package/src/types/badge.d.ts +19 -0
- package/src/types/modal.d.ts +8 -0
- package/src/types/tag.d.ts +14 -0
- package/src/types/uploadedFile.d.ts +13 -0
- package/src/types/utils.d.ts +1 -1
- package/dist/types/index.d.ts +0 -5
- package/src/components/Modal/Modal.vue +0 -149
- package/src/components/Modal/README.md +0 -47
- package/src/types/index.ts +0 -7
|
@@ -159,10 +159,6 @@ const classList = computed(() => [
|
|
|
159
159
|
color: var(--primary-black-white);
|
|
160
160
|
background: var(--primary-blue);
|
|
161
161
|
|
|
162
|
-
i,svg {
|
|
163
|
-
color: var(--primary-black-white) !important;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
162
|
@include hover {
|
|
167
163
|
background: var(--primary-blue-800);
|
|
168
164
|
}
|
|
@@ -180,10 +176,6 @@ const classList = computed(() => [
|
|
|
180
176
|
@include is-disabled-state {
|
|
181
177
|
color: var(--primary-blue-100);
|
|
182
178
|
background: var(--primary-blue-300);
|
|
183
|
-
|
|
184
|
-
i,svg {
|
|
185
|
-
color: var(--primary-blue-100) !important;
|
|
186
|
-
}
|
|
187
179
|
}
|
|
188
180
|
}
|
|
189
181
|
|
|
@@ -191,10 +183,6 @@ const classList = computed(() => [
|
|
|
191
183
|
color: var(--primary-black-800);
|
|
192
184
|
background: var(--primary-black-200);
|
|
193
185
|
|
|
194
|
-
i,svg {
|
|
195
|
-
color: var(--primary-black-800) !important;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
186
|
@include hover {
|
|
199
187
|
color: var(--primary-black-900);
|
|
200
188
|
background: var(--primary-black-300);
|
|
@@ -213,10 +201,6 @@ const classList = computed(() => [
|
|
|
213
201
|
@include is-disabled-state {
|
|
214
202
|
color: var(--primary-black-400);
|
|
215
203
|
background: var(--primary-black-100);
|
|
216
|
-
|
|
217
|
-
i,svg {
|
|
218
|
-
color: var(--primary-black-400) !important;
|
|
219
|
-
}
|
|
220
204
|
}
|
|
221
205
|
}
|
|
222
206
|
|
|
@@ -225,18 +209,10 @@ const classList = computed(() => [
|
|
|
225
209
|
background: transparent;
|
|
226
210
|
border: 1px solid var(--primary-black-400);
|
|
227
211
|
|
|
228
|
-
i,svg {
|
|
229
|
-
color: var(--primary-black-600) !important;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
212
|
@include hover {
|
|
233
213
|
color: var(--primary-black-700);
|
|
234
214
|
text-decoration: none;
|
|
235
215
|
border: 1px solid var(--primary-black-500);
|
|
236
|
-
|
|
237
|
-
i,svg {
|
|
238
|
-
color: var(--primary-black-700) !important;
|
|
239
|
-
}
|
|
240
216
|
}
|
|
241
217
|
|
|
242
218
|
@include pressed {
|
|
@@ -254,10 +230,6 @@ const classList = computed(() => [
|
|
|
254
230
|
@include is-disabled-state {
|
|
255
231
|
color: var(--primary-black-400);
|
|
256
232
|
border: 1px solid var(--primary-black-300);
|
|
257
|
-
|
|
258
|
-
i,svg {
|
|
259
|
-
color: var(--primary-black-400) !important;
|
|
260
|
-
}
|
|
261
233
|
}
|
|
262
234
|
}
|
|
263
235
|
|
|
@@ -266,18 +238,10 @@ const classList = computed(() => [
|
|
|
266
238
|
background: transparent;
|
|
267
239
|
border: 1px solid var(--primary-blue);
|
|
268
240
|
|
|
269
|
-
i,svg {
|
|
270
|
-
color: var(--primary-blue) !important;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
241
|
@include hover {
|
|
274
242
|
color: var(--primary-blue-800);
|
|
275
243
|
text-decoration: none;
|
|
276
244
|
border: 1px solid var(--primary-blue-800);
|
|
277
|
-
|
|
278
|
-
i,svg {
|
|
279
|
-
color: var(--primary-blue-800) !important;
|
|
280
|
-
}
|
|
281
245
|
}
|
|
282
246
|
|
|
283
247
|
@include pressed {
|
|
@@ -294,10 +258,6 @@ const classList = computed(() => [
|
|
|
294
258
|
@include is-disabled-state {
|
|
295
259
|
color: var(--primary-black-400);
|
|
296
260
|
border: 1px solid var(--primary-black-300);
|
|
297
|
-
|
|
298
|
-
i,svg {
|
|
299
|
-
color: var(--primary-black-400) !important;
|
|
300
|
-
}
|
|
301
261
|
}
|
|
302
262
|
}
|
|
303
263
|
|
|
@@ -305,17 +265,9 @@ const classList = computed(() => [
|
|
|
305
265
|
color: var(--primary-black-600);
|
|
306
266
|
background: transparent;
|
|
307
267
|
|
|
308
|
-
i,svg {
|
|
309
|
-
color: var(--primary-black-600) !important;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
268
|
@include hover {
|
|
313
269
|
color: var(--primary-black-700);
|
|
314
270
|
background: var(--primary-black-100);
|
|
315
|
-
|
|
316
|
-
i,svg {
|
|
317
|
-
color: var(--primary-black-700) !important;
|
|
318
|
-
}
|
|
319
271
|
}
|
|
320
272
|
|
|
321
273
|
@include pressed {
|
|
@@ -332,10 +284,6 @@ const classList = computed(() => [
|
|
|
332
284
|
|
|
333
285
|
@include is-disabled-state {
|
|
334
286
|
color: var(--primary-black-400);
|
|
335
|
-
|
|
336
|
-
i,svg {
|
|
337
|
-
color: var(--primary-black-400) !important;
|
|
338
|
-
}
|
|
339
287
|
}
|
|
340
288
|
}
|
|
341
289
|
|
|
@@ -343,18 +291,10 @@ const classList = computed(() => [
|
|
|
343
291
|
color: var(--primary-blue);
|
|
344
292
|
background: transparent;
|
|
345
293
|
|
|
346
|
-
i,svg {
|
|
347
|
-
color: var(--primary-blue) !important;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
294
|
@include hover {
|
|
351
295
|
color: var(--primary-blue-900);
|
|
352
296
|
text-decoration: none;
|
|
353
297
|
background: var(--primary-blue-100);
|
|
354
|
-
|
|
355
|
-
i,svg {
|
|
356
|
-
color: var(--primary-blue-900) !important;
|
|
357
|
-
}
|
|
358
298
|
}
|
|
359
299
|
|
|
360
300
|
@include pressed {
|
|
@@ -371,10 +311,6 @@ const classList = computed(() => [
|
|
|
371
311
|
|
|
372
312
|
@include is-disabled-state {
|
|
373
313
|
color: var(--primary-black-400);
|
|
374
|
-
|
|
375
|
-
i,svg {
|
|
376
|
-
color: var(--primary-black-400) !important;
|
|
377
|
-
}
|
|
378
314
|
}
|
|
379
315
|
}
|
|
380
316
|
|
|
@@ -384,24 +320,12 @@ const classList = computed(() => [
|
|
|
384
320
|
background: transparent;
|
|
385
321
|
padding: var(--corner-radius-xxs);
|
|
386
322
|
|
|
387
|
-
i,svg {
|
|
388
|
-
color: var(--primary-blue) !important;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
323
|
@include hover {
|
|
392
324
|
color: var(--secondary-text-link-hover);
|
|
393
|
-
|
|
394
|
-
i,svg {
|
|
395
|
-
color: var(--primary-blue-700) !important;
|
|
396
|
-
}
|
|
397
325
|
}
|
|
398
326
|
|
|
399
327
|
@include pressed {
|
|
400
328
|
color: var(--secondary-text-link-pressed);
|
|
401
|
-
|
|
402
|
-
i,svg {
|
|
403
|
-
color: var(--primary-blue-700) !important;
|
|
404
|
-
}
|
|
405
329
|
}
|
|
406
330
|
|
|
407
331
|
@include focused {
|
|
@@ -413,10 +337,6 @@ const classList = computed(() => [
|
|
|
413
337
|
|
|
414
338
|
@include is-disabled-state {
|
|
415
339
|
color: var(--secondary-text-link-disabled);
|
|
416
|
-
|
|
417
|
-
i,svg {
|
|
418
|
-
color: var(--primary-black-400) !important;
|
|
419
|
-
}
|
|
420
340
|
}
|
|
421
341
|
}
|
|
422
342
|
|
|
@@ -426,24 +346,12 @@ const classList = computed(() => [
|
|
|
426
346
|
background: transparent;
|
|
427
347
|
padding: var(--corner-radius-xxs);
|
|
428
348
|
|
|
429
|
-
i,svg {
|
|
430
|
-
color: var(--error-red) !important;
|
|
431
|
-
}
|
|
432
|
-
|
|
433
349
|
@include hover {
|
|
434
350
|
color: var(--error-red-light-01);
|
|
435
|
-
|
|
436
|
-
i,svg {
|
|
437
|
-
color: var(--error-red-light-01) !important;
|
|
438
|
-
}
|
|
439
351
|
}
|
|
440
352
|
|
|
441
353
|
@include pressed {
|
|
442
354
|
color: var(--error-red-deep);
|
|
443
|
-
|
|
444
|
-
i,svg {
|
|
445
|
-
color: var(--error-red-deep) !important;
|
|
446
|
-
}
|
|
447
355
|
}
|
|
448
356
|
|
|
449
357
|
@include focused {
|
|
@@ -455,10 +363,6 @@ const classList = computed(() => [
|
|
|
455
363
|
|
|
456
364
|
@include is-disabled-state {
|
|
457
365
|
color: var(--primary-black-400);
|
|
458
|
-
|
|
459
|
-
i,svg {
|
|
460
|
-
color: var(--primary-black-400) !important;
|
|
461
|
-
}
|
|
462
366
|
}
|
|
463
367
|
}
|
|
464
368
|
|
|
@@ -468,24 +372,12 @@ const classList = computed(() => [
|
|
|
468
372
|
text-decoration: underline;
|
|
469
373
|
padding: var(--corner-radius-xxs);
|
|
470
374
|
|
|
471
|
-
i,svg {
|
|
472
|
-
color: var(--primary-black) !important;
|
|
473
|
-
}
|
|
474
|
-
|
|
475
375
|
@include hover {
|
|
476
376
|
color: var(--secondary-text-gray-link-hover);
|
|
477
|
-
|
|
478
|
-
i,svg {
|
|
479
|
-
color: var(--primary-black-500) !important;
|
|
480
|
-
}
|
|
481
377
|
}
|
|
482
378
|
|
|
483
379
|
@include pressed {
|
|
484
380
|
color: var(--secondary-text-gray-link-pressed);
|
|
485
|
-
|
|
486
|
-
i,svg {
|
|
487
|
-
color: var(--primary-black-700) !important;
|
|
488
|
-
}
|
|
489
381
|
}
|
|
490
382
|
|
|
491
383
|
@include focused {
|
|
@@ -498,10 +390,6 @@ const classList = computed(() => [
|
|
|
498
390
|
@include is-disabled-state {
|
|
499
391
|
color: var(--secondary-text-gray-link-disabled);
|
|
500
392
|
border-bottom: none;
|
|
501
|
-
|
|
502
|
-
i,svg {
|
|
503
|
-
color: var(--primary-black-400) !important;
|
|
504
|
-
}
|
|
505
393
|
}
|
|
506
394
|
}
|
|
507
395
|
}
|
|
@@ -83,7 +83,7 @@ function handleInput(event: Event) {
|
|
|
83
83
|
@import '../../styles/root';
|
|
84
84
|
|
|
85
85
|
.base-input {
|
|
86
|
-
width:
|
|
86
|
+
width: 100%;
|
|
87
87
|
$input: &;
|
|
88
88
|
|
|
89
89
|
&__wrapper {
|
|
@@ -91,12 +91,12 @@ function handleInput(event: Event) {
|
|
|
91
91
|
display: flex;
|
|
92
92
|
flex-direction: column;
|
|
93
93
|
align-items: flex-start;
|
|
94
|
-
width:
|
|
94
|
+
width: 100%;
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
&__field {
|
|
98
98
|
flex: 1;
|
|
99
|
-
width:
|
|
99
|
+
width: 100%;
|
|
100
100
|
height: 100%;
|
|
101
101
|
color: var(--primary-text-primary);
|
|
102
102
|
background: var(--bg-light);
|
|
@@ -152,6 +152,7 @@ function handleInput(event: Event) {
|
|
|
152
152
|
display: flex;
|
|
153
153
|
flex-direction: column;
|
|
154
154
|
gap: 6px;
|
|
155
|
+
width: 100%;
|
|
155
156
|
}
|
|
156
157
|
|
|
157
158
|
&__label-text {
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<Teleport to="body">
|
|
3
|
+
<div
|
|
4
|
+
v-for="modal in modals"
|
|
5
|
+
:key="modal.id"
|
|
6
|
+
v-show="modal.isOpen"
|
|
7
|
+
class="base-modal__overlay"
|
|
8
|
+
@click.self="handleOverlayClick(modal.id)"
|
|
9
|
+
>
|
|
10
|
+
<div class="base-modal" @click.stop>
|
|
11
|
+
<div class="base-modal__wrapper">
|
|
12
|
+
<base-icon
|
|
13
|
+
v-if="modal.props?.closable"
|
|
14
|
+
name="close-circle"
|
|
15
|
+
class="base-modal__close"
|
|
16
|
+
size="custom"
|
|
17
|
+
@click="handleClose(modal.id)"
|
|
18
|
+
/>
|
|
19
|
+
<div class="base-modal__content">
|
|
20
|
+
<component :is="modal.component" v-if="modal.component" :modal-props="modal.props" />
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</Teleport>
|
|
26
|
+
</template>
|
|
27
|
+
|
|
28
|
+
<script setup lang="ts">
|
|
29
|
+
import { computed } from 'vue';
|
|
30
|
+
import { useModalStore } from '../../store/modal';
|
|
31
|
+
import BaseIcon from '../BaseIcon/BaseIcon.vue';
|
|
32
|
+
|
|
33
|
+
const modalStore = useModalStore();
|
|
34
|
+
|
|
35
|
+
const modals = computed(() => modalStore.modals);
|
|
36
|
+
|
|
37
|
+
const handleClose = (id: string) => {
|
|
38
|
+
modalStore.closeModal(id);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const handleOverlayClick = (id: string) => {
|
|
42
|
+
const topModal = modals.value[modals.value.length - 1];
|
|
43
|
+
if (topModal?.id === id && topModal.props?.closable) {
|
|
44
|
+
handleClose(id);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
</script>
|
|
48
|
+
|
|
49
|
+
<style lang="scss" scoped>
|
|
50
|
+
@import '../../styles/variables';
|
|
51
|
+
@import '../../styles/root';
|
|
52
|
+
|
|
53
|
+
.base-modal__overlay {
|
|
54
|
+
position: fixed;
|
|
55
|
+
top: 0;
|
|
56
|
+
left: 0;
|
|
57
|
+
width: 100%;
|
|
58
|
+
height: 100%;
|
|
59
|
+
background: rgba(0, 0, 0, 0.5);
|
|
60
|
+
display: flex;
|
|
61
|
+
justify-content: center;
|
|
62
|
+
align-items: center;
|
|
63
|
+
z-index: 1000;
|
|
64
|
+
animation: fadeIn 0.3s ease;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.base-modal {
|
|
68
|
+
background: var(--primary-black-white);
|
|
69
|
+
border-radius: var(--corner-radius-m);
|
|
70
|
+
overflow: hidden;
|
|
71
|
+
min-width: 335px;
|
|
72
|
+
transform: scale(0.7);
|
|
73
|
+
animation: slideIn 0.3s ease forwards;
|
|
74
|
+
margin: 0 20px;
|
|
75
|
+
max-height: 90vh;
|
|
76
|
+
|
|
77
|
+
@media #{$tablet} {
|
|
78
|
+
min-width: 588px;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
&__wrapper {
|
|
82
|
+
position: relative;
|
|
83
|
+
display: flex;
|
|
84
|
+
flex-direction: column;
|
|
85
|
+
justify-content: center;
|
|
86
|
+
align-items: center;
|
|
87
|
+
max-width: 100%;
|
|
88
|
+
min-height: 224px;
|
|
89
|
+
height: 100%;
|
|
90
|
+
padding: 24px;
|
|
91
|
+
|
|
92
|
+
@media #{$mobile-landscape} {
|
|
93
|
+
padding: 56px 68px;
|
|
94
|
+
min-height: 332px;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
&__header {
|
|
99
|
+
display: flex;
|
|
100
|
+
justify-content: space-between;
|
|
101
|
+
align-items: center;
|
|
102
|
+
text-align: center;
|
|
103
|
+
color: var(--primary-text-primary);
|
|
104
|
+
font: var(--typography-l-medium);
|
|
105
|
+
|
|
106
|
+
@media #{$mobile-landscape} {
|
|
107
|
+
font: var(--typography-h4-medium);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
&__close {
|
|
112
|
+
position: absolute;
|
|
113
|
+
top: 24px;
|
|
114
|
+
right: 24px;
|
|
115
|
+
width: 32px;
|
|
116
|
+
height: 32px;
|
|
117
|
+
border: none;
|
|
118
|
+
background: none;
|
|
119
|
+
cursor: pointer;
|
|
120
|
+
color: var(--primary-gray-600);
|
|
121
|
+
|
|
122
|
+
&:hover {
|
|
123
|
+
color: var(--primary-black-900);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
@media #{$mobile-landscape} {
|
|
127
|
+
width: 48px;
|
|
128
|
+
height: 48px;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
&__content {
|
|
133
|
+
max-height: 70vh;
|
|
134
|
+
overflow-y: auto;
|
|
135
|
+
color: var(--primary-text-tertiary);
|
|
136
|
+
font: var(--typography-text-s-regular);
|
|
137
|
+
|
|
138
|
+
@media #{$mobile-landscape} {
|
|
139
|
+
font: var(--typography-text-l-regular);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
&__footer {
|
|
144
|
+
display: flex;
|
|
145
|
+
justify-content: center;
|
|
146
|
+
align-items: flex-end;
|
|
147
|
+
flex-grow: 1;
|
|
148
|
+
gap: 24px;
|
|
149
|
+
width: 100%;
|
|
150
|
+
margin-top: 24px;
|
|
151
|
+
|
|
152
|
+
:deep(.base-button) {
|
|
153
|
+
width: 100%;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Анимации
|
|
159
|
+
@keyframes fadeIn {
|
|
160
|
+
from {
|
|
161
|
+
opacity: 0;
|
|
162
|
+
}
|
|
163
|
+
to {
|
|
164
|
+
opacity: 1;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
@keyframes slideIn {
|
|
169
|
+
from {
|
|
170
|
+
transform: scale(0.7);
|
|
171
|
+
opacity: 0;
|
|
172
|
+
}
|
|
173
|
+
to {
|
|
174
|
+
transform: scale(1);
|
|
175
|
+
opacity: 1;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
@keyframes slideOut {
|
|
180
|
+
to {
|
|
181
|
+
transform: scale(0.7);
|
|
182
|
+
opacity: 0;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.base-modal-leave-active {
|
|
187
|
+
animation: slideOut 0.3s ease reverse;
|
|
188
|
+
}
|
|
189
|
+
</style>
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="base-tag" :class="classList">
|
|
3
|
+
<div class="base-tag__wrapper">
|
|
4
|
+
<div class="base-tag__text">{{ text }}</div>
|
|
5
|
+
<div v-if="closable" class="base-tag__icon" @click="handleClose">
|
|
6
|
+
<base-icon name="close" size="custom" />
|
|
7
|
+
</div>
|
|
8
|
+
<div v-if="addingTag" class="base-tag__icon">
|
|
9
|
+
<base-icon name="add" size="custom" class="base-tag__add-icon" @click="handleAddTag" />
|
|
10
|
+
</div>
|
|
11
|
+
<div v-if="isHasAddTag" class="base-tag__input-wrapper">
|
|
12
|
+
<input
|
|
13
|
+
class="base-tag__input"
|
|
14
|
+
type="text"
|
|
15
|
+
v-model="inputText"
|
|
16
|
+
@input="handleInput"
|
|
17
|
+
@keypress.enter="handleCreateTag"
|
|
18
|
+
/>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
</template>
|
|
23
|
+
|
|
24
|
+
<script setup lang="ts">
|
|
25
|
+
import { computed, ref } from 'vue';
|
|
26
|
+
import BaseIcon from '../BaseIcon/BaseIcon.vue';
|
|
27
|
+
import type { ICoreTagProps } from '../../types/tag';
|
|
28
|
+
import { useKitSize } from '../../composables/kit/size';
|
|
29
|
+
import { useKitColor } from '../../composables/kit/color';
|
|
30
|
+
|
|
31
|
+
const props = withDefaults(defineProps<ICoreTagProps>(), {
|
|
32
|
+
size: 'medium',
|
|
33
|
+
color: 'primary',
|
|
34
|
+
closable: false,
|
|
35
|
+
isHasAddTag: false,
|
|
36
|
+
addingTag: false,
|
|
37
|
+
text: '',
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const emit = defineEmits<{
|
|
41
|
+
updateInput: [value: ICoreTagProps['inputText']];
|
|
42
|
+
close: [];
|
|
43
|
+
addTag: [];
|
|
44
|
+
}>();
|
|
45
|
+
|
|
46
|
+
const inputText = ref<string>(props.inputText || '');
|
|
47
|
+
|
|
48
|
+
const { sizeClassList } = useKitSize(props);
|
|
49
|
+
const { colorClassList } = useKitColor(props);
|
|
50
|
+
|
|
51
|
+
const classList = computed(() => [
|
|
52
|
+
sizeClassList.value,
|
|
53
|
+
colorClassList.value,
|
|
54
|
+
{'--adding-tag': props.addingTag},
|
|
55
|
+
]);
|
|
56
|
+
|
|
57
|
+
const handleClose = () => {
|
|
58
|
+
emit('close');
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const handleInput = (event: Event) => {
|
|
62
|
+
const target = event.target as HTMLInputElement;
|
|
63
|
+
emit('updateInput', target.value);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const handleCreateTag = () => {
|
|
67
|
+
if (inputText.value.trim()) {
|
|
68
|
+
emit('updateInput', inputText.value.trim());
|
|
69
|
+
inputText.value = '';
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const handleAddTag = () => {
|
|
74
|
+
emit('addTag');
|
|
75
|
+
};
|
|
76
|
+
</script>
|
|
77
|
+
|
|
78
|
+
<style scoped lang="scss">
|
|
79
|
+
@import '@/styles/variables';
|
|
80
|
+
@import '@/styles/root';
|
|
81
|
+
|
|
82
|
+
.base-tag {
|
|
83
|
+
display: inline-flex;
|
|
84
|
+
align-items: center;
|
|
85
|
+
cursor: pointer;
|
|
86
|
+
|
|
87
|
+
&__wrapper {
|
|
88
|
+
display: flex;
|
|
89
|
+
align-items: center;
|
|
90
|
+
transition: all var(--transition);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
&__text {
|
|
94
|
+
white-space: nowrap;
|
|
95
|
+
overflow: hidden;
|
|
96
|
+
text-overflow: ellipsis;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
&__icon {
|
|
100
|
+
display: flex;
|
|
101
|
+
align-items: center;
|
|
102
|
+
justify-content: center;
|
|
103
|
+
margin-left: var(--spacing-xs);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
&__input-wrapper {
|
|
107
|
+
display: flex;
|
|
108
|
+
align-items: center;
|
|
109
|
+
|
|
110
|
+
.base-tag__input {
|
|
111
|
+
border: none;
|
|
112
|
+
background: transparent;
|
|
113
|
+
outline: none;
|
|
114
|
+
color: var(--primary-blue);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
&.--primary-color {
|
|
119
|
+
.base-tag__wrapper {
|
|
120
|
+
background: var(--primary-black-100);
|
|
121
|
+
color: var(--primary-black-700);
|
|
122
|
+
|
|
123
|
+
@include hover {
|
|
124
|
+
background: var(--primary-black-200);
|
|
125
|
+
color: var(--primary-black-900);
|
|
126
|
+
|
|
127
|
+
.base-tag__icon {
|
|
128
|
+
color: var(--primary-black-900);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.base-tag__icon {
|
|
134
|
+
color: var(--primary-black-500);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
&.--secondary-color {
|
|
139
|
+
.base-tag__wrapper {
|
|
140
|
+
background: var(--primary-black-white);
|
|
141
|
+
color: var(--primary-black-700); // same
|
|
142
|
+
|
|
143
|
+
@include hover {
|
|
144
|
+
background: var(--primary-black-200);
|
|
145
|
+
color: var(--primary-black-900);
|
|
146
|
+
|
|
147
|
+
.base-tag__icon {
|
|
148
|
+
color: var(--primary-black-900);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.base-tag__icon {
|
|
154
|
+
color: var(--primary-black-500);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
&.--adding-tag {
|
|
159
|
+
.base-tag__wrapper {
|
|
160
|
+
color: var(--primary-black-500);
|
|
161
|
+
|
|
162
|
+
@include hover {
|
|
163
|
+
color: var(--primary-black-900);
|
|
164
|
+
|
|
165
|
+
.base-tag__icon {
|
|
166
|
+
color: var(--primary-black-900);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
&.--extra-small-size {
|
|
174
|
+
.base-tag__text,
|
|
175
|
+
.base-tag__input {
|
|
176
|
+
font: var(--typography-text-xs-medium);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.base-tag__wrapper {
|
|
180
|
+
border-radius: var(--corner-radius-xxs);
|
|
181
|
+
padding: var(--spacing-2xs) var(--spacing-s);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.base-tag__icon,
|
|
185
|
+
.base-tag__add-icon {
|
|
186
|
+
width: 12px;
|
|
187
|
+
height: 12px;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
&.--small-size {
|
|
192
|
+
.base-tag__text,
|
|
193
|
+
.base-tag__input {
|
|
194
|
+
font: var(--typography-text-s-medium);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.base-tag__wrapper {
|
|
198
|
+
border-radius: var(--corner-radius-xxs);
|
|
199
|
+
padding: var(--spacing-2xs) var(--spacing-s);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.base-tag__icon,
|
|
203
|
+
.base-tag__add-icon {
|
|
204
|
+
width: 14px;
|
|
205
|
+
height: 14px;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
&.--medium-size {
|
|
210
|
+
.base-tag__text,
|
|
211
|
+
.base-tag__input {
|
|
212
|
+
font: var(--typography-text-s-medium);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.base-tag__wrapper {
|
|
216
|
+
border-radius: var(--corner-radius-2xs);
|
|
217
|
+
padding: var(--spacing-xs) var(--spacing-2m);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.base-tag__icon,
|
|
221
|
+
.base-tag__add-icon {
|
|
222
|
+
width: 16px;
|
|
223
|
+
height: 16px;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
&.--large-size {
|
|
228
|
+
.base-tag__text,
|
|
229
|
+
.base-tag__input {
|
|
230
|
+
font: var(--typography-text-m-medium);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.base-tag__wrapper {
|
|
234
|
+
border-radius: var(--corner-radius-2xs);
|
|
235
|
+
padding: var(--spacing-xs) var(--spacing-2m);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.base-tag__icon,
|
|
239
|
+
.base-tag__add-icon {
|
|
240
|
+
width: 16px;
|
|
241
|
+
height: 16px;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
</style>
|