plugin-ui-for-kzt 0.0.53 → 0.0.55

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 (32) hide show
  1. package/dist/components/BaseBadge/BaseBadge.vue.d.ts +1 -1
  2. package/dist/components/BaseButton/BaseButton.vue.d.ts +6 -2
  3. package/dist/components/BaseCalendar/BaseCalendar.vue.d.ts +2 -2
  4. package/dist/components/BaseCheckbox/BaseCheckbox.vue.d.ts +6 -2
  5. package/dist/components/BaseDropdown/BaseDropdown.vue.d.ts +6 -2
  6. package/dist/components/BaseField/BaseField.vue.d.ts +3 -3
  7. package/dist/components/BaseInput/BaseInput.vue.d.ts +2 -2
  8. package/dist/components/BaseInputCalendar/BaseInputCalendar.vue.d.ts +2 -2
  9. package/dist/components/BaseInputCurrency/BaseInputCurrency.vue.d.ts +3 -3
  10. package/dist/components/BaseInputEmail/BaseInputEmail.vue.d.ts +2 -2
  11. package/dist/components/BaseInputPhone/BaseInputPhone.vue.d.ts +2 -2
  12. package/dist/components/BaseInputWithSelector/BaseInputWithSelector.vue.d.ts +45 -0
  13. package/dist/components/BaseOpenedListItem/BaseOpenedListItem.vue.d.ts +6 -2
  14. package/dist/components/BaseRadio/BaseRadio.vue.d.ts +6 -2
  15. package/dist/components/BaseSegmentedButtons/BaseSegmentedButtons.vue.d.ts +6 -2
  16. package/dist/components/BaseSelect/BaseSelect.vue.d.ts +12 -4
  17. package/dist/components/BaseTextarea/BaseTextarea.vue.d.ts +2 -2
  18. package/dist/components/BaseToggle/BaseToggle.vue.d.ts +6 -2
  19. package/dist/index.d.ts +2 -1
  20. package/dist/index.js +1 -1
  21. package/dist/sprite.svg +1 -1
  22. package/dist/store/modal.d.ts +13 -13
  23. package/dist/utils/debounce.d.ts +1 -0
  24. package/example/App.vue +26 -1
  25. package/package.json +1 -1
  26. package/src/assets/icons/arrow-down-white.svg +3 -0
  27. package/src/components/BaseInputWithSelector/BaseInputWithSelector.vue +167 -0
  28. package/src/components/BaseInputWithSelector/README.md +61 -0
  29. package/src/components/BaseOpenedListItem/BaseOpenedListItem.vue +148 -148
  30. package/src/components/BaseSelect/BaseSelect.vue +11 -5
  31. package/src/index.ts +5 -2
  32. package/src/utils/debounce.ts +8 -0
@@ -0,0 +1,61 @@
1
+ # BaseInputWithSelector
2
+
3
+ Vue-компонент, объединяющий текстовое поле ввода и выпадающий список выбора типа. Используется для сценариев, где пользователь вводит значение и одновременно выбирает его категорию, тип или фильтр (например, поиск по ИИН, БИН, номеру документа и т.д.).
4
+
5
+ Компонент состоит из `<base-input>` слева и `<base-select>` справа, визуально объединённых в единый элемент.
6
+
7
+ ---
8
+
9
+ ## Пропсы
10
+
11
+ | Проп | Тип | По умолчанию | Описание |
12
+ |---------------------|---------------------------------------------|--------------|----------|
13
+ | `id` | `string` | `undefined` | Уникальный идентификатор поля ввода. |
14
+ | `modelValue` | `string` | `''` | Значение поля ввода. Поддерживает двустороннюю привязку через `v-model`. |
15
+ | `selectedOptionId` | `string \| number` | `''` | ID выбранной опции в селекторе. Поддерживает двустороннюю привязку. |
16
+ | `options` | `{ id, label, value }[]` | `[]` | Список доступных опций для выбора в селекторе. |
17
+ | `placeholder` | `string` | `''` | Текст-заполнитель поля ввода. |
18
+ | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | Размер компонента. |
19
+ | `error` | `string` | `undefined` | Сообщение об ошибке. |
20
+
21
+ ---
22
+
23
+ ## Emits
24
+
25
+ Компонент генерирует следующие события:
26
+
27
+ | Событие | Payload | Описание |
28
+ |--------|---------|----------|
29
+ | `update:modelValue` | `string` | Вызывается при изменении текста в поле ввода. Используется для поддержки `v-model`. |
30
+ | `update:selectedOptionId` | `string \| number` | Вызывается при изменении выбранной опции. Используется для поддержки `v-model:selectedOptionId`. |
31
+ | `search` | `{ value: string; type: string \| number }` | Вызывается при изменении текста или выбранной опции (с debounce 500ms). Используется для выполнения поиска или фильтрации. |
32
+
33
+ ---
34
+
35
+ ## Использование
36
+
37
+ ### Базовый пример
38
+
39
+ ```vue
40
+ <template>
41
+ <base-input-with-selector
42
+ id="search"
43
+ v-model="searchValue"
44
+ v-model:selectedOptionId="selectedType"
45
+ :options="options"
46
+ />
47
+ </template>
48
+
49
+ <script setup lang="ts">
50
+ import { ref } from 'vue'
51
+
52
+ const searchValue = ref('')
53
+ const selectedType = ref('iin')
54
+
55
+ const options = [
56
+ { id: 'iin', label: 'ИИН', value: 'iin' },
57
+ { id: 'bin', label: 'БИН', value: 'bin' },
58
+ { id: 'doc', label: 'Документ', value: 'doc' },
59
+ ]
60
+ </script>
61
+
@@ -1,38 +1,38 @@
1
1
  <template>
2
- <component
3
- :is="actualComponent"
4
- v-bind="componentAttrs"
5
- class="base-opened-list-item"
6
- :class="classList"
7
- >
8
- <div class="base-opened-list-item__wrapper">
9
- <div
10
- v-if="$slots.icon || icon"
11
- class="base-opened-list-item__icon"
12
- >
13
- <slot
14
- name="icon"
15
- :icon="icon"
16
- >
17
- </slot>
18
- </div>
19
-
20
- <span class="base-opened-list-item__text">
2
+ <component
3
+ :is="actualComponent"
4
+ v-bind="componentAttrs"
5
+ class="base-opened-list-item"
6
+ :class="classList"
7
+ >
8
+ <div class="base-opened-list-item__wrapper">
9
+ <div
10
+ v-if="$slots.icon || icon"
11
+ class="base-opened-list-item__icon"
12
+ >
13
+ <slot
14
+ name="icon"
15
+ :icon="icon"
16
+ >
17
+ </slot>
18
+ </div>
19
+
20
+ <span class="base-opened-list-item__text">
21
21
  <slot />
22
22
  </span>
23
23
 
24
- <div
25
- v-if="active"
26
- class="base-opened-list-item__postfix-icon"
27
- >
28
-
29
- <base-icon
30
- name="checkbox-circle"
31
- :size="size"
32
- />
33
- </div>
34
- </div>
35
- </component>
24
+ <div
25
+ v-if="active"
26
+ class="base-opened-list-item__postfix-icon"
27
+ >
28
+
29
+ <base-icon
30
+ name="checkbox-circle"
31
+ :size="size"
32
+ />
33
+ </div>
34
+ </div>
35
+ </component>
36
36
  </template>
37
37
 
38
38
  <script setup lang="ts">
@@ -80,137 +80,137 @@ const actualComponent = computed(() => {
80
80
  @import '../../styles/root';
81
81
 
82
82
  .base-opened-list-item {
83
- $item: &;
84
-
85
- display: block;
86
- padding: 0;
87
- user-select: none;
88
- background-color: transparent;
89
- border: none;
90
- border-radius: 0;
91
- outline: none;
92
- width: 100%;
83
+ $item: &;
84
+
85
+ display: block;
86
+ padding: 0;
87
+ user-select: none;
88
+ background-color: transparent;
89
+ border: none;
90
+ border-radius: 0;
91
+ outline: none;
92
+ width: 100%;
93
+ display: flex;
94
+
95
+ &__wrapper {
93
96
  display: flex;
97
+ align-items: center;
98
+ width: 100%;
99
+ height: 100%;
100
+ text-align: left;
101
+ transition: all var(--transition);
94
102
 
95
- &__wrapper {
96
- display: flex;
97
- align-items: center;
98
- width: 100%;
99
- height: 100%;
100
- text-align: left;
101
- transition: all var(--transition);
102
-
103
- @include hover {
104
- background: var(--primary-black-100);
105
- }
106
-
107
- @include pressed {
108
- background: var(--primary-blue-100);
109
- }
110
- }
111
-
112
- &__icon,
113
- &__postfix-icon {
114
- display: flex;
115
- flex-shrink: 0;
116
- align-items: center;
117
- justify-content: center;
118
- transition: inherit;
103
+ @include hover {
104
+ background: var(--primary-black-100);
119
105
  }
120
106
 
121
- &__text {
122
- flex: 1;
123
- font: var(--ui-typography-body-regular);
124
- color: var(--primary-text-primary);
125
- transition: inherit;
107
+ @include pressed {
108
+ background: var(--primary-blue-100);
126
109
  }
110
+ }
127
111
 
128
- &.--is-active,
129
- &.router-link-active,
130
- &.router-link-exact-active {
131
- #{$item} {
132
- &__wrapper {
133
- background: var(--primary-black-50);
134
- }
135
- }
112
+ &__icon,
113
+ &__postfix-icon {
114
+ display: flex;
115
+ flex-shrink: 0;
116
+ align-items: center;
117
+ justify-content: center;
118
+ transition: inherit;
119
+ }
120
+
121
+ &__text {
122
+ flex: 1;
123
+ font: var(--ui-typography-body-regular);
124
+ color: var(--primary-text-primary);
125
+ transition: inherit;
126
+ }
127
+
128
+ &.--is-active,
129
+ &.router-link-active,
130
+ &.router-link-exact-active {
131
+ #{$item} {
132
+ &__wrapper {
133
+ background: var(--primary-black-50);
134
+ }
136
135
  }
136
+ }
137
137
 
138
- &.--is-disabled {
139
- #{$item} {
140
- &__text {
141
- color: var(--primary-text-quaternary);
142
- }
138
+ &.--is-disabled {
139
+ #{$item} {
140
+ &__text {
141
+ color: var(--primary-text-quaternary);
142
+ }
143
143
 
144
- @include is-disabled-state;
145
- }
144
+ @include is-disabled-state;
146
145
  }
146
+ }
147
147
 
148
- &.--is-active.--is-disabled {
149
- #{$item} {
150
- &__wrapper {
151
- background: var(--primary-black-100);
152
- }
153
- }
148
+ &.--is-active.--is-disabled {
149
+ #{$item} {
150
+ &__wrapper {
151
+ background: var(--primary-black-100);
152
+ }
154
153
  }
155
-
156
- &.--small-size {
157
- #{$item} {
158
- &__wrapper {
159
- gap: var(--spacing-s);
160
- min-height: 40px;
161
- padding: var(--spacing-s) var(--spacing-2l);
162
- }
163
-
164
- &__text {
165
- font: var(--typography-text-m-regular);
166
- }
167
-
168
- &__icon,
169
- &__postfix-icon {
170
- width: 20px;
171
- height: 20px;
172
- }
173
- }
154
+ }
155
+
156
+ &.--small-size {
157
+ #{$item} {
158
+ &__wrapper {
159
+ gap: var(--spacing-s);
160
+ min-height: 40px;
161
+ padding: var(--spacing-s) var(--spacing-2l);
162
+ }
163
+
164
+ &__text {
165
+ font: var(--typography-text-m-regular);
166
+ }
167
+
168
+ &__icon,
169
+ &__postfix-icon {
170
+ width: 20px;
171
+ height: 20px;
172
+ }
174
173
  }
175
-
176
- &.--medium-size {
177
- #{$item} {
178
- &__wrapper {
179
- gap: var(--spacing-m);
180
- min-height: 48px;
181
- padding: var(--spacing-m) var(--spacing-2l);
182
- }
183
-
184
- &__text {
185
- font: var(--typography-text-m-regular);
186
- }
187
-
188
- &__icon,
189
- &__postfix-icon {
190
- width: 24px;
191
- height: 24px;
192
- }
193
- }
174
+ }
175
+
176
+ &.--medium-size {
177
+ #{$item} {
178
+ &__wrapper {
179
+ gap: var(--spacing-m);
180
+ min-height: 48px;
181
+ padding: var(--spacing-m) var(--spacing-2l);
182
+ }
183
+
184
+ &__text {
185
+ font: var(--typography-text-m-regular);
186
+ }
187
+
188
+ &__icon,
189
+ &__postfix-icon {
190
+ width: 24px;
191
+ height: 24px;
192
+ }
194
193
  }
195
-
196
- &.--large-size {
197
- #{$item} {
198
- &__wrapper {
199
- gap: var(--spacing-l);
200
- min-height: 60px;
201
- padding: var(--spacing-2l) var(--spacing-l);
202
- }
203
-
204
- &__text {
205
- font: var(--typography-text-l-regular);
206
- }
207
-
208
- &__icon,
209
- &__postfix-icon {
210
- width: 32px;
211
- height: 32px;
212
- }
213
- }
194
+ }
195
+
196
+ &.--large-size {
197
+ #{$item} {
198
+ &__wrapper {
199
+ gap: var(--spacing-l);
200
+ min-height: 60px;
201
+ padding: var(--spacing-2l) var(--spacing-l);
202
+ }
203
+
204
+ &__text {
205
+ font: var(--typography-text-l-regular);
206
+ }
207
+
208
+ &__icon,
209
+ &__postfix-icon {
210
+ width: 32px;
211
+ height: 32px;
212
+ }
214
213
  }
214
+ }
215
215
  }
216
216
  </style>
@@ -48,10 +48,12 @@
48
48
  class="base-select__arrow-wrapper"
49
49
  >
50
50
  <div class="base-select__arrow">
51
- <base-icon
52
- name="arrow-down"
53
- :size="size"
54
- />
51
+ <slot name="arrow">
52
+ <base-icon
53
+ name="arrow-down"
54
+ :size="size"
55
+ />
56
+ </slot>
55
57
  </div>
56
58
  </div>
57
59
  </div>
@@ -299,6 +301,7 @@ defineSlots<{
299
301
  header( props: { value: ICoreSelectProps['options'] } ): any;
300
302
  headerIcon(): any;
301
303
  empty(): any;
304
+ arrow(): any;
302
305
  }>();
303
306
  </script>
304
307
 
@@ -390,9 +393,12 @@ defineSlots<{
390
393
  &__arrow {
391
394
  position: absolute;
392
395
  top: 50%;
396
+ display: flex;
397
+ align-items: center;
398
+ justify-content: center;
393
399
  color: var(--ui-colors-input-icon-default);
394
400
  transition: transform var(--transition);
395
- transform: translate3d(0, -50%, 0);
401
+ transform: translateY(-50%);
396
402
  }
397
403
 
398
404
  &__input {
package/src/index.ts CHANGED
@@ -39,6 +39,7 @@ import BasePageLoader from "./components/BasePageLoader/BasePageLoader.vue";
39
39
  import BaseTabs from "./components/BaseTabs/BaseTabs.vue";
40
40
  import BaseTable from "./components/BaseTable/BaseTable.vue";
41
41
  import BaseDefaultPages from "./components/BaseDefaultPages/BaseDefaultPages.vue";
42
+ import BaseInputWithSelector from "./components/BaseInputWithSelector/BaseInputWithSelector.vue";
42
43
 
43
44
  const components = {
44
45
  BaseModal,
@@ -74,7 +75,8 @@ const components = {
74
75
  BasePageLoader,
75
76
  BaseTabs,
76
77
  BaseTable,
77
- BaseDefaultPages
78
+ BaseDefaultPages,
79
+ BaseInputWithSelector,
78
80
  };
79
81
 
80
82
  // Функция для загрузки sprite.svg
@@ -163,5 +165,6 @@ export {
163
165
  BasePageLoader,
164
166
  BaseTabs,
165
167
  BaseTable,
166
- BaseDefaultPages
168
+ BaseDefaultPages,
169
+ BaseInputWithSelector,
167
170
  };
@@ -0,0 +1,8 @@
1
+ export function debounce<T extends (...args: any[]) => void>(fn: T, delay = 400) {
2
+ let timeout: ReturnType<typeof setTimeout>
3
+
4
+ return (...args: Parameters<T>) => {
5
+ clearTimeout(timeout)
6
+ timeout = setTimeout(() => fn(...args), delay)
7
+ }
8
+ }