plugin-ui-for-kzt 0.0.8 → 0.0.10

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 (90) hide show
  1. package/README.md +21 -9
  2. package/example/App.vue +355 -0
  3. package/example/index.html +12 -0
  4. package/example/main.ts +8 -0
  5. package/example/shims-vue.d.ts +5 -0
  6. package/package.json +17 -7
  7. package/src/assets/icons/arrow-down.svg +3 -0
  8. package/src/assets/icons/calendar.svg +12 -0
  9. package/src/assets/icons/checkbox-circle.svg +3 -0
  10. package/src/assets/icons/checkbox.svg +3 -0
  11. package/src/assets/icons/email-sms.svg +4 -0
  12. package/src/assets/icons/help.svg +3 -0
  13. package/src/assets/icons/kg.svg +16 -0
  14. package/src/assets/icons/kz.svg +42 -0
  15. package/src/assets/icons/loader.svg +13 -0
  16. package/src/assets/icons/ru.svg +12 -0
  17. package/src/assets/icons/uz.svg +26 -0
  18. package/src/components/BaseBreadCrumbs/BaseBreadCrumbs.vue +142 -0
  19. package/src/components/BaseBreadCrumbs/README.md +49 -0
  20. package/src/components/BaseButton/BaseButton.vue +489 -0
  21. package/src/components/BaseButton/README.md +53 -0
  22. package/src/components/BaseCalendar/BaseCalendar.vue +231 -0
  23. package/src/components/BaseCalendar/README.md +126 -0
  24. package/src/components/BaseCheckbox/BaseCheckbox.vue +252 -0
  25. package/src/components/BaseCheckbox/README.md +110 -0
  26. package/src/components/BaseDropdown/BaseDropdown.vue +160 -0
  27. package/src/components/BaseDropdown/README.md +91 -0
  28. package/src/components/BaseIcon/BaseIcon.vue +47 -0
  29. package/src/components/BaseIcon/README.md +35 -0
  30. package/src/components/BaseInput/BaseInput.vue +300 -0
  31. package/src/components/BaseInput/README.md +85 -0
  32. package/src/components/BaseInputCalendar/BaseInputCalendar.vue +242 -0
  33. package/src/components/BaseInputCalendar/README.md +84 -0
  34. package/src/components/BaseInputCurrency/BaseInputCurrency.vue +198 -0
  35. package/src/components/BaseInputCurrency/README.md +57 -0
  36. package/src/components/BaseInputEmail/BaseInputEmail.vue +89 -0
  37. package/src/components/BaseInputEmail/README.md +71 -0
  38. package/src/components/BaseInputPhone/BaseInputPhone.vue +175 -0
  39. package/src/components/BaseLoader/BaseLoader.vue +45 -0
  40. package/src/components/BaseLoader/README.md +29 -0
  41. package/src/components/BaseOpenedListItem/BaseOpenedListItem.vue +216 -0
  42. package/src/components/BaseOpenedListItem/README.md +67 -0
  43. package/src/components/BaseRadio/BaseRadio.vue +283 -0
  44. package/src/components/BaseRadio/README.md +74 -0
  45. package/src/components/BaseSegmentedButtons/BaseSegmentedButtons.vue +89 -0
  46. package/src/components/BaseSegmentedButtons/README.md +75 -0
  47. package/src/components/BaseSelect/BaseSelect.vue +370 -0
  48. package/src/components/BaseSelect/README.md +95 -0
  49. package/src/components/BaseSiteInput/BaseSiteInput.vue +153 -0
  50. package/src/components/BaseTextarea/BaseTextarea.vue +212 -0
  51. package/src/components/BaseTextarea/README.md +75 -0
  52. package/src/components/BaseToggle/BaseToggle.vue +271 -0
  53. package/src/components/BaseToggle/README.md +76 -0
  54. package/src/components/BaseTooltip/BaseTooltip.vue +318 -0
  55. package/src/components/BaseTooltip/README.md +74 -0
  56. package/src/components/Modal/Modal.vue +21 -23
  57. package/src/components/Spinner/Spinner.vue +2 -1
  58. package/src/composables/kit/color.ts +14 -0
  59. package/src/composables/kit/interactive.ts +53 -0
  60. package/src/composables/kit/size.ts +15 -0
  61. package/src/composables/kit/state.ts +28 -0
  62. package/src/composables/kit/style.ts +18 -0
  63. package/src/composables/kit/utils.ts +7 -0
  64. package/src/icons/index.ts +9 -0
  65. package/src/index.ts +93 -2
  66. package/src/plugins/modalPlugin.ts +22 -9
  67. package/src/shims-context.d.ts +19 -0
  68. package/src/styles/index.scss +2 -1
  69. package/src/styles/root.scss +167 -0
  70. package/src/styles/variables.scss +160 -0
  71. package/src/types/breadcrumbs.d.ts +13 -0
  72. package/src/types/button.d.ts +13 -0
  73. package/src/types/calendar.d.ts +16 -0
  74. package/src/types/checkbox-radio.d.ts +15 -0
  75. package/src/types/dropdown.d.ts +20 -0
  76. package/src/types/icon.d.ts +8 -0
  77. package/src/types/input.d.ts +56 -0
  78. package/src/types/toggle.d.ts +12 -0
  79. package/src/types/tooltip.d.ts +8 -0
  80. package/src/types/utils.d.ts +37 -0
  81. package/src/vue-virtual-scroller.d.ts +9 -0
  82. package/tsconfig.json +6 -3
  83. package/webpack.config.js +90 -35
  84. package/dist/index.js +0 -4922
  85. package/dist/types/components/Toaster/timer.d.ts +0 -12
  86. package/dist/types/index.d.ts +0 -11
  87. package/dist/types/plugins/modalPlugin.d.ts +0 -16
  88. package/dist/types/plugins/toasterPlugin.d.ts +0 -26
  89. package/dist/types/store/modal.d.ts +0 -11
  90. package/dist/types/types/index.d.ts +0 -4
@@ -0,0 +1,489 @@
1
+ <template>
2
+ <Component
3
+ :is="componentTag"
4
+ v-bind="componentAttrs"
5
+ class="base-button"
6
+ :class="[classList]"
7
+ >
8
+ <template v-if="!loading">
9
+ <slot></slot>
10
+ </template>
11
+
12
+ <base-loader
13
+ v-else
14
+ class="base-button__loader"
15
+ />
16
+ </Component>
17
+ </template>
18
+
19
+ <script setup lang="ts">
20
+ import BaseLoader from '../BaseLoader/BaseLoader.vue';
21
+ import type { ICoreButtonProps } from '../../types/button';
22
+ import { useKitInteractive } from '../../composables/kit/interactive';
23
+ import { useAttrs, computed } from 'vue';
24
+ import { useKitSize } from '../../composables/kit/size'
25
+ import { useKitColor } from '../../composables/kit/color'
26
+ import { useKitState } from '../../composables/kit/state'
27
+ import { useKitStyle } from '../../composables/kit/style'
28
+
29
+ const props = withDefaults(defineProps<ICoreButtonProps>(), {
30
+ tag: 'button',
31
+ color: 'primary',
32
+ size: 'medium',
33
+ });
34
+
35
+ const { componentTag, interactiveClassList } = useKitInteractive(props);
36
+ const { sizeClassList } = useKitSize(props);
37
+ const { colorClassList } = useKitColor(props);
38
+ const { stateClassList, stateAttrs } = useKitState(props);
39
+ const { styleClassList } = useKitStyle(props);
40
+ const attrs = useAttrs();
41
+
42
+ const externalLink = computed(() => {
43
+ if (attrs.to) {
44
+ return {
45
+ href: attrs.to,
46
+ };
47
+ }
48
+ return {};
49
+ });
50
+
51
+ const componentAttrs = computed(() => ({
52
+ ...attrs,
53
+ ...stateAttrs.value,
54
+ ...externalLink.value,
55
+
56
+ ...(props.tag === 'button' && {
57
+ type: attrs.type || 'button',
58
+ }),
59
+ }));
60
+
61
+ const classList = computed(() => [
62
+ interactiveClassList.value,
63
+ sizeClassList.value,
64
+ colorClassList.value,
65
+ stateClassList.value,
66
+ styleClassList.value,
67
+ ]);
68
+ </script>
69
+
70
+ <style lang="scss">
71
+ @import '@/styles/variables';
72
+ @import '@/styles/root';
73
+
74
+ .base-button {
75
+ @include reset-button;
76
+ @include is-disabled-state;
77
+
78
+ display: inline-flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ text-align: center;
82
+ text-decoration: none;
83
+ appearance: none;
84
+ cursor: pointer;
85
+ user-select: none;
86
+ transition: all var(--ui-transition);
87
+
88
+ &.--is-loading {
89
+ @include loading-element;
90
+ }
91
+
92
+ &__loader {
93
+ margin: auto;
94
+ }
95
+
96
+ &.--is-underline {
97
+ text-decoration: underline;
98
+ }
99
+
100
+ &.--extra-small-size {
101
+ column-gap: var(--spacing-xs);
102
+ height: 32px;
103
+ padding: var(--spacing-2s) var(--spacing-m);
104
+ font: var(--typography-text-s-medium);
105
+ border-radius: var(--corner-radius-xs);
106
+
107
+ .loader__circle-icon {
108
+ width: 20px;
109
+ height: 20px;
110
+ }
111
+ }
112
+
113
+ &.--small-size {
114
+ column-gap: var(--spacing-xs);
115
+ height: 40px;
116
+ padding: var(--spacing-2m) var(--spacing-l);
117
+ font: var(--typography-text-m-medium);
118
+ border-radius: var(--corner-radius-s);
119
+
120
+ .loader__circle-icon {
121
+ width: 20px;
122
+ height: 20px;
123
+ }
124
+ }
125
+
126
+ &.--medium-size {
127
+ column-gap: var(--spacing-xs);
128
+ height: 48px;
129
+ padding: var(--spacing-m) var(--spacing-l);
130
+ font: var(--typography-text-l-medium);
131
+ border-radius: var(--corner-radius-m);
132
+
133
+ .loader__circle-icon {
134
+ width: 24px;
135
+ height: 24px;
136
+ }
137
+ }
138
+
139
+ &.--large-size {
140
+ column-gap: var(--spacing-xs);
141
+ height: 56px;
142
+ padding: var(--spacing-m) var(--spacing-l);
143
+ font: var(--typography-text-l-medium);
144
+ border-radius: var(--corner-radius-m);
145
+
146
+ .loader__circle-icon {
147
+ width: 32px;
148
+ height: 32px;
149
+ }
150
+ }
151
+
152
+ &.--is-interactive {
153
+ height: 22px;
154
+ padding: 0;
155
+ }
156
+
157
+ &.--primary-color {
158
+ color: var(--primary-black-white);
159
+ background: var(--primary-blue);
160
+
161
+ i,svg {
162
+ color: var(--primary-black-white) !important;
163
+ }
164
+
165
+ @include hover {
166
+ background: var(--primary-blue-800);
167
+ }
168
+
169
+ @include pressed {
170
+ background: var(--primary-blue-deep);
171
+ }
172
+
173
+ @include focused {
174
+ outline: 4px solid var(--effects-primary-focus);
175
+ }
176
+
177
+ @include is-disabled-state {
178
+ color: var(--primary-blue-100);
179
+ background: var(--primary-blue-300);
180
+
181
+ i,svg {
182
+ color: var(--primary-blue-100) !important;
183
+ }
184
+ }
185
+ }
186
+
187
+ &.--secondary-color {
188
+ color: var(--primary-black-800);
189
+ background: var(--primary-black-200);
190
+
191
+ i,svg {
192
+ color: var(--primary-black-800) !important;
193
+ }
194
+
195
+ @include hover {
196
+ color: var(--primary-black-900);
197
+ background: var(--primary-black-300);
198
+ }
199
+
200
+ @include pressed {
201
+ background: var(--primary-black-400);
202
+ }
203
+
204
+ @include focused {
205
+ outline: 4px solid var(--effects-primary-focus);
206
+ }
207
+
208
+ @include is-disabled-state {
209
+ color: var(--primary-black-400);
210
+ background: var(--primary-black-100);
211
+
212
+ i,svg {
213
+ color: var(--primary-black-400) !important;
214
+ }
215
+ }
216
+ }
217
+
218
+ &.--tertiary-gray-color {
219
+ color: var(--primary-black-600);
220
+ background: transparent;
221
+ border: 1px solid var(--primary-black-400);
222
+
223
+ i,svg {
224
+ color: var(--primary-black-600) !important;
225
+ }
226
+
227
+ @include hover {
228
+ color: var(--primary-black-700);
229
+ text-decoration: none;
230
+ border: 1px solid var(--primary-black-500);
231
+
232
+ i,svg {
233
+ color: var(--primary-black-700) !important;
234
+ }
235
+ }
236
+
237
+ @include pressed {
238
+ color: var(--primary-black-800);
239
+ border: 1px solid var(--primary-black-600);
240
+ }
241
+
242
+ @include focused {
243
+ border: 1px solid var(--primary-black-400);
244
+ outline: 4px solid var(--effects-primary-focus);
245
+ }
246
+
247
+ @include is-disabled-state {
248
+ color: var(--primary-black-400);
249
+ border: 1px solid var(--primary-black-300);
250
+
251
+ i,svg {
252
+ color: var(--primary-black-400) !important;
253
+ }
254
+ }
255
+ }
256
+
257
+ &.--tertiary-blue-color {
258
+ color: var(--primary-blue);
259
+ background: transparent;
260
+ border: 1px solid var(--primary-blue);
261
+
262
+ i,svg {
263
+ color: var(--primary-blue) !important;
264
+ }
265
+
266
+ @include hover {
267
+ color: var(--primary-blue-800);
268
+ text-decoration: none;
269
+ border: 1px solid var(--primary-blue-800);
270
+
271
+ i,svg {
272
+ color: var(--primary-blue-800) !important;
273
+ }
274
+ }
275
+
276
+ @include pressed {
277
+ color: var(--primary-blue-deep);
278
+ border: 1px solid var(--primary-blue-deep);
279
+ }
280
+
281
+ @include focused {
282
+ outline: 4px solid var(--effects-primary-focus);
283
+ }
284
+
285
+ @include is-disabled-state {
286
+ color: var(--primary-black-400);
287
+ border: 1px solid var(--primary-black-300);
288
+
289
+ i,svg {
290
+ color: var(--primary-black-400) !important;
291
+ }
292
+ }
293
+ }
294
+
295
+ &.--quaternary-gray-color {
296
+ color: var(--primary-black-600);
297
+ background: transparent;
298
+
299
+ i,svg {
300
+ color: var(--primary-black-600) !important;
301
+ }
302
+
303
+ @include hover {
304
+ color: var(--primary-black-700);
305
+ background: var(--primary-black-100);
306
+
307
+ i,svg {
308
+ color: var(--primary-black-700) !important;
309
+ }
310
+ }
311
+
312
+ @include pressed {
313
+ color: var(--primary-black-800);
314
+ background: var(--primary-black-200);
315
+ }
316
+
317
+ @include focused {
318
+ background: rgb(255 255 255 / 10%);
319
+ outline: 4px solid var(--effects-primary-focus);
320
+ }
321
+
322
+ @include is-disabled-state {
323
+ color: var(--primary-black-400);
324
+
325
+ i,svg {
326
+ color: var(--primary-black-400) !important;
327
+ }
328
+ }
329
+ }
330
+
331
+ &.--quaternary-blue-color {
332
+ color: var(--primary-blue);
333
+ background: transparent;
334
+
335
+ i,svg {
336
+ color: var(--primary-blue) !important;
337
+ }
338
+
339
+ @include hover {
340
+ color: var(--primary-blue-900);
341
+ text-decoration: none;
342
+ background: var(--primary-blue-100);
343
+
344
+ i,svg {
345
+ color: var(--primary-blue-900) !important;
346
+ }
347
+ }
348
+
349
+ @include pressed {
350
+ color: var(--primary-blue-deep);
351
+ background: var(--primary-blue-200);
352
+ }
353
+
354
+ @include focused {
355
+ background: rgb(255 255 255 / 10%);
356
+ outline: 4px solid var(--effects-primary-focus);
357
+ }
358
+
359
+ @include is-disabled-state {
360
+ color: var(--primary-black-400);
361
+
362
+ i,svg {
363
+ color: var(--primary-black-400) !important;
364
+ }
365
+ }
366
+ }
367
+
368
+ &.--link-blue-color {
369
+ color: var(--secondary-text-link-default-focus);
370
+ text-decoration: none;
371
+ background: transparent;
372
+ padding: var(--corner-radius-xxs);
373
+
374
+ i,svg {
375
+ color: var(--primary-blue) !important;
376
+ }
377
+
378
+ @include hover {
379
+ color: var(--secondary-text-link-hover);
380
+
381
+ i,svg {
382
+ color: var(--primary-blue-700) !important;
383
+ }
384
+ }
385
+
386
+ @include pressed {
387
+ color: var(--secondary-text-link-pressed);
388
+
389
+ i,svg {
390
+ color: var(--primary-blue-700) !important;
391
+ }
392
+ }
393
+
394
+ @include focused {
395
+ background: rgb(255 255 255 / 10%);
396
+ outline: 4px solid var(--effects-primary-focus);
397
+ }
398
+
399
+ @include is-disabled-state {
400
+ color: var(--secondary-text-link-disabled);
401
+
402
+ i,svg {
403
+ color: var(--primary-black-400) !important;
404
+ }
405
+ }
406
+ }
407
+
408
+ &.--link-critical-color {
409
+ color: var(--error-red);
410
+ text-decoration: none;
411
+ background: transparent;
412
+ padding: var(--corner-radius-xxs);
413
+
414
+ i,svg {
415
+ color: var(--error-red) !important;
416
+ }
417
+
418
+ @include hover {
419
+ color: var(--error-red-light-01);
420
+
421
+ i,svg {
422
+ color: var(--error-red-light-01) !important;
423
+ }
424
+ }
425
+
426
+ @include pressed {
427
+ color: var(--error-red-deep);
428
+
429
+ i,svg {
430
+ color: var(--error-red-deep) !important;
431
+ }
432
+ }
433
+
434
+ @include focused {
435
+ background: rgb(255 255 255 / 10%);
436
+ outline: 4px solid var(--effects-error-focus);
437
+ }
438
+
439
+ @include is-disabled-state {
440
+ color: var(--primary-black-400);
441
+
442
+ i,svg {
443
+ color: var(--primary-black-400) !important;
444
+ }
445
+ }
446
+ }
447
+
448
+ &.--link-gray-color {
449
+ color: var(--secondary-text-gray-link-default-focus);
450
+ background: transparent;
451
+ text-decoration: underline;
452
+ padding: var(--corner-radius-xxs);
453
+
454
+ i,svg {
455
+ color: var(--primary-black) !important;
456
+ }
457
+
458
+ @include hover {
459
+ color: var(--secondary-text-gray-link-hover);
460
+
461
+ i,svg {
462
+ color: var(--primary-black-500) !important;
463
+ }
464
+ }
465
+
466
+ @include pressed {
467
+ color: var(--secondary-text-gray-link-pressed);
468
+
469
+ i,svg {
470
+ color: var(--primary-black-700) !important;
471
+ }
472
+ }
473
+
474
+ @include focused {
475
+ background: rgb(255 255 255 / 10%);
476
+ outline: 4px solid var(--effects-gray-focus);
477
+ }
478
+
479
+ @include is-disabled-state {
480
+ color: var(--secondary-text-gray-link-disabled);
481
+ border-bottom: none;
482
+
483
+ i,svg {
484
+ color: var(--primary-black-400) !important;
485
+ }
486
+ }
487
+ }
488
+ }
489
+ </style>
@@ -0,0 +1,53 @@
1
+ Компонент `BaseButton.vue` представляет собой гибкую кнопку с возможностью настройки, включая цвет, размер и состояния взаимодействия. Вот разбор того, как работает этот компонент и как его можно использовать:
2
+
3
+ ### Шаблон:
4
+ - Компонент динамически рендерит правильный HTML-элемент в зависимости от свойства `tag` (например, `button`, `a` и т. д.).
5
+ - Если свойство `loading` установлено в `true`, отображается загрузчик (`base-loader`), в противном случае показывается основной контент кнопки (через `slot`).
6
+ - Атрибуты компонента связываются через объект `componentAttrs`, включая такие атрибуты, как `href` для внешних ссылок.
7
+
8
+ ### Скрипт:
9
+ - **Props**: Компонент принимает различные свойства, включая `tag`, `color`, `size`, `loading`, `disabled` и другие. Это позволяет полностью настроить внешний вид и поведение кнопки.
10
+ - **Composables**: Используются несколько composables:
11
+ - `useKitInteractive`: Обрабатывает взаимодействие и генерирует список классов для интерактивности.
12
+ - `useKitSize`: Определяет класс для размера кнопки и применяет его.
13
+ - `useKitColor`: Определяет класс для цвета кнопки и применяет его.
14
+ - `useKitState`: Обрабатывает состояния кнопки, включая загрузку, отключение и т. д.
15
+ - `useKitStyle`: Отвечает за дополнительные стили.
16
+ - **Вычисляемые свойства**:
17
+ - `componentTag`: Определяет, какой HTML-элемент рендерить (например, `button`, `a`).
18
+ - `classList`: Объединяет сгенерированные классы из composables.
19
+ - `externalLink`: Динамически добавляет атрибут `href`, если кнопка используется как ссылка (тег `a`).
20
+ - `componentAttrs`: Объединяет атрибуты (например, `href`, `type` и другие) и привязывает их к элементу.
21
+
22
+ ### Стили:
23
+ - **Размеры кнопки**: Компонент поддерживает несколько размеров кнопок: `--extra-small-size`, `--small-size`, `--medium-size` и `--large-size`. Каждый размер имеет разные отступы, шрифт и размер загрузчика.
24
+ - **Цветовые варианты**: Кнопка поддерживает различные варианты цветов (основной, вторичный, третичный, четвертичный и ссылки с несколькими цветами).
25
+ - **Состояние загрузки**: Когда свойство `loading` установлено в `true`, отображается загрузчик.
26
+ - **Состояния**: Кнопка включает состояния для наведения, нажатия, фокуса и отключения.
27
+
28
+ ### Как использовать:
29
+ ```vue
30
+ <BaseButton
31
+ tag="button"
32
+ color="primary"
33
+ size="medium"
34
+ :loading="isLoading"
35
+ @click="handleClick"
36
+ >
37
+ Отправить
38
+ </BaseButton>
39
+
40
+ <BaseButton
41
+ tag="a"
42
+ :to="'/somewhere'"
43
+ color="link-blue"
44
+ size="small"
45
+ >
46
+ Перейти в Панель управления
47
+ </BaseButton>
48
+ ```
49
+
50
+ ### Возможные улучшения:
51
+ - **Пользовательский загрузчик**: Можно добавить возможность передачи пользовательского компонента загрузчика для большей гибкости.
52
+
53
+ - **Типы TypeScript**: Типы, используемые в props, достаточно обширны, но стоит проверить, покрывают ли они все возможные случаи, особенно с логикой взаимодействия и внешними ссылками.