its_ui_vite 1.0.18 → 1.1.2

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/README.md CHANGED
@@ -90,6 +90,28 @@ slots: ['successIcon' <!-- есть дефольное значение -->, 'er
90
90
 
91
91
  ```
92
92
 
93
+ * CInput2
94
+
95
+ ```
96
+ {
97
+ <!-- реактивна -->
98
+ status?: 'static' | 'focus' | 'error' | 'success',
99
+ <!-- для v-mode -->
100
+ modelValue?: '',
101
+
102
+ iconPosition?: Array<'left' | 'right'>
103
+ size?: 'lg' | 'md' | 'sm',
104
+ width?: string,
105
+ disabled?: boolean,
106
+ type?: InputTypeHTMLAttribute,
107
+ name?: string,
108
+ placeholder?: string,
109
+ }
110
+
111
+ slots: ['successIcon' <!-- есть дефольное значение -->, 'errorIcon' <!-- есть дефольное значение -->, 'customIcon-left', 'customIcon-right']
112
+
113
+ ```
114
+
93
115
  * CCheckbox
94
116
 
95
117
  ```
@@ -130,6 +152,52 @@ slots: ['без имени' <!-- есть дефольное значение (p
130
152
  slots: ['customIcon' <!-- есть дефольное значение -->]
131
153
  ```
132
154
 
155
+ * CDropdown
156
+
157
+ ```
158
+ {
159
+ options?: Array,
160
+ size?: 'lg' | 'md' | 'sm',
161
+ autocomplete?: boolean,
162
+ disabled?: boolean,
163
+ transformVal?: boolean,
164
+ iconPosition?: Array<'left' | 'right'>,
165
+ iconLeftName?: keyof TIcon,
166
+ iconRightName?: keyof TIcon,
167
+ isOpen?: boolean,
168
+ locale?: 'rus' | 'usa' | 'tur' | 'spa',
169
+ placeholder?: string,
170
+ width?: string,
171
+ modelValue?: any,
172
+ }
173
+
174
+ slots: ['customIcon-left', 'customIcon-right' <!-- есть дефольное значение -->]
175
+ ```
176
+
177
+
178
+ * CInput2Select
179
+
180
+ ```
181
+ {
182
+ options?: Array,
183
+ size?: 'lg' | 'md' | 'sm',
184
+ variant?: 'default' | 'multiple',
185
+ autocomplete?: boolean,
186
+ disabled?: boolean,
187
+ transformVal?: boolean,
188
+ iconPosition?: Array<'left' | 'right'>,
189
+ iconLeftName?: keyof TIcon,
190
+ iconRightName?: keyof TIcon,
191
+ isOpen?: boolean,
192
+ locale?: 'rus' | 'usa' | 'tur' | 'spa',
193
+ placeholder?: string,
194
+ width?: string,
195
+ modelValue?: any,
196
+ }
197
+
198
+ slots: ['customIcon' <!-- есть дефольное значение -->]
199
+ ```
200
+
133
201
  * CDatepicker
134
202
 
135
203
  ```
@@ -220,14 +288,14 @@ slots: ['без имени' <!-- есть дефольное значение (p
220
288
 
221
289
  * Push to Docker registry:
222
290
  ```shell
223
- docker login https://ca-sim-docker.appmath.ru
224
- docker tag its-ui-kit-3 ca-sim-docker.appmath.ru/its-ui-kit-3
225
- docker push ca-sim-docker.appmath.ru/its-ui-kit-3
291
+ docker login https://docker-registry.compass.msk.ru
292
+ docker tag its-ui-kit-3 docker-registry.compass.msk.ru/its-ui-kit-3
293
+ docker push docker-registry.compass.msk.ru/its-ui-kit-3
226
294
  ```
227
295
 
228
296
  * Use on client-side (as DevOps):
229
297
  ```shell
230
- docker login https://ca-sim-docker.appmath.ru
298
+ docker login https://docker-registry.compass.msk.ru
231
299
  docker compose -f docker-compose-ui-kit-stage.yml up
232
300
  ```
233
301
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "its_ui_vite",
3
- "version": "1.0.18",
3
+ "version": "1.1.2",
4
4
  "main": "./src/libIndex.js",
5
5
  "module": "./src/libIndex.js",
6
6
  "files": [
@@ -83,7 +83,7 @@ export function addTracingElement(target, moveFn = () => {}) {
83
83
  }
84
84
 
85
85
  function dispatch() {
86
- const position = target.value.getBoundingClientRect()
86
+ const position = target.value?.getBoundingClientRect()
87
87
 
88
88
  if (!position) return;
89
89
 
@@ -5,11 +5,13 @@
5
5
  --green-dark: #02423C;
6
6
  --green-low: #123234;
7
7
  --green-bg: #152829;
8
+ --brand-500: #04975C;
8
9
 
9
10
  // red
10
11
  --red: #EA1246;
11
12
  --red-medium: #920023;
12
13
  --red-dark: #490012;
14
+ --danger-500: #CC2C17;
13
15
 
14
16
  // orange
15
17
  --orange: #E2670D;
@@ -35,6 +37,13 @@
35
37
  --scroll: rgba(55, 120, 113, 0.45);
36
38
  --hover: #0A8A54;
37
39
  --disable: #084A36;
40
+ --neutral-50: #F6F6F7;
41
+ --neutral-200: #E3E3E7;
42
+ --neutral-300: #CFCFD6;
43
+ --neutral-400: #76758A;
44
+ --neutral-500: #49485C;
45
+ --neutral-700: #2D2C3D;
46
+ --grey-20: #76758A33;
38
47
 
39
48
  --transition: .2s;
40
49
  }
@@ -1,5 +1,8 @@
1
1
  <template>
2
- <label :class="['c-checkbox__wrap', variant, size, {disabled}]">
2
+ <label
3
+ :class="['c-checkbox__wrap', variant, size, {disabled}]"
4
+ @dblclick="handleDblclick"
5
+ >
3
6
  <input
4
7
  class="c-checkbox__inp"
5
8
  :type="variant === 'radio' ? 'radio' : 'checkbox'"
@@ -7,7 +10,7 @@
7
10
  :value="modelValue || value"
8
11
  :checked="isRadio ? value === modelValue : modelValue"
9
12
  :disabled="disabled"
10
- @change="({ target }) => $emit('update:modelValue', isRadio ? value : (target as HTMLInputElement).checked)"
13
+ @change="({ target }) => dispatchEmit(target as HTMLInputElement)"
11
14
  />
12
15
  <div class="c-checkbox__checkmark"></div>
13
16
  <div class="c-checkbox__text">
@@ -45,6 +48,17 @@ const emits = defineEmits<{
45
48
 
46
49
  const isRadio = props.variant === 'radio'
47
50
 
51
+ function handleDblclick() {
52
+ if (!isRadio) return;
53
+
54
+ emits('update:modelValue', null)
55
+ }
56
+
57
+ function dispatchEmit(target: HTMLInputElement) {
58
+ emits('update:checked', target.checked)
59
+ emits('update:modelValue', isRadio ? props.value : target.checked)
60
+ }
61
+
48
62
  </script>
49
63
 
50
64
  <style lang="scss">
@@ -57,11 +71,13 @@ const isRadio = props.variant === 'radio'
57
71
  --border-width: 1px;
58
72
  --toggle-indentation: 1px;
59
73
  --toggle-padding: calc(var(--border-width) + var(--toggle-indentation) * 2);
74
+ --checkmark-width: calc((var(--size) * 2) - (var(--border-width) + var(--toggle-indentation)) * 2);
75
+ --checkmark-distance: 12px;
60
76
 
61
77
  display: flex;
62
78
  align-items: center;
63
79
 
64
- gap: 12px;
80
+ gap: var(--checkmark-distance);
65
81
 
66
82
  cursor: pointer;
67
83
 
@@ -149,7 +165,7 @@ const isRadio = props.variant === 'radio'
149
165
  }
150
166
 
151
167
  .c-checkbox__checkmark {
152
- width: calc((var(--size) * 2) - (var(--border-width) + var(--toggle-indentation)) * 2);
168
+ width: var(--checkmark-width);
153
169
 
154
170
  border-radius: var(--size);
155
171
 
@@ -196,14 +212,14 @@ const isRadio = props.variant === 'radio'
196
212
  border-color: transparent;
197
213
 
198
214
  &::after {
199
- background: var(--black-dark);
215
+ background: var(--disable);
200
216
 
201
217
  opacity: 1;
202
218
  }
203
219
  }
204
220
 
205
221
  &~ .c-checkbox__text {
206
- color: var(--black-dark);
222
+ color: var(--disable);
207
223
  }
208
224
  }
209
225
  }
@@ -241,6 +257,8 @@ const isRadio = props.variant === 'radio'
241
257
  }
242
258
 
243
259
  &__text {
260
+ width: calc(100% - var(--checkmark-width) - var(--checkmark-distance));
261
+
244
262
  font-size: var(--font-size);
245
263
 
246
264
  color: var(--white);
@@ -0,0 +1,313 @@
1
+ <template>
2
+ <label
3
+ :class="['c-checkbox-2__wrap', `text-${textPosition}`, `${indeterminate ? 'indeterminate' : ''}`, variant, {disabled}]"
4
+ @dblclick="handleDblclick"
5
+ >
6
+ <input
7
+ class="c-checkbox-2__inp"
8
+ :type="variant === 'radio' ? 'radio' : 'checkbox'"
9
+ :name="name"
10
+ :value="modelValue || value"
11
+ :checked="isRadio ? value === modelValue : modelValue"
12
+ :disabled="disabled"
13
+ @change="({ target }) => dispatchEmit(target as HTMLInputElement)"
14
+ />
15
+ <div class="c-checkbox-2__checkmark"></div>
16
+ <div class="c-checkbox-2__text">
17
+ <slot>{{ text }}</slot>
18
+ </div>
19
+ </label>
20
+ </template>
21
+
22
+ <script setup lang="ts">
23
+
24
+ type TProps = {
25
+ variant?: 'checkbox' | 'radio' | 'toggle',
26
+ textPosition?: 'left' | 'right',
27
+ disabled?: boolean,
28
+ indeterminate?: boolean,
29
+ text?: string,
30
+ name?: string,
31
+ value?: any,
32
+ modelValue?: any,
33
+ }
34
+
35
+ const props = withDefaults(defineProps<TProps>(), {
36
+ variant: 'checkbox',
37
+ textPosition: 'right',
38
+ indeterminate: false,
39
+ disabled: false,
40
+ text: '',
41
+ name: 'c_checkbox-2',
42
+ value: '',
43
+ modelValue: '',
44
+ });
45
+
46
+ const emits = defineEmits<{
47
+ (name: 'update:checked', value: boolean): void,
48
+ (name: 'update:modelValue', value: any): void,
49
+ }>();
50
+
51
+ const isRadio = props.variant === 'radio'
52
+
53
+ function handleDblclick() {
54
+ if (!isRadio) return;
55
+
56
+ emits('update:modelValue', null)
57
+ }
58
+
59
+ function dispatchEmit(target: HTMLInputElement) {
60
+ emits('update:checked', target.checked)
61
+ emits('update:modelValue', isRadio ? props.value : target.checked)
62
+ }
63
+
64
+ </script>
65
+
66
+ <style lang="scss">
67
+ // этого элемента нет
68
+ .c-checkbox-2 {
69
+
70
+ // родительский элемент
71
+ &__wrap {
72
+ // для toggle
73
+ --border-width: 1px;
74
+ --toggle-indentation: 1px;
75
+ --toggle-padding: calc(var(--border-width) + var(--toggle-indentation) * 2);
76
+ --checkmark-width: calc((var(--size) * 2) + (var(--border-width) + var(--toggle-indentation)) * 2);
77
+ --checkmark-distance: 6px;
78
+ --size: 20px;
79
+
80
+ --font-size: 14px;
81
+
82
+ display: flex;
83
+ align-items: center;
84
+
85
+ gap: var(--checkmark-distance);
86
+
87
+ cursor: pointer;
88
+
89
+ button,
90
+ input,
91
+ div,
92
+ a {
93
+ font-family: inherit;
94
+ font-weight: inherit;
95
+ }
96
+
97
+ &.disabled {
98
+ cursor: default;
99
+ }
100
+
101
+ // prop.textPosition
102
+ &.text-right {
103
+ flex-direction: row;
104
+ }
105
+
106
+ &.text-left {
107
+ flex-direction: row-reverse;
108
+ }
109
+ // ./prop.textPosition
110
+
111
+ // prop.variant
112
+ &.checkbox {
113
+ &.indeterminate {
114
+ .c-checkbox-2__checkmark::after {
115
+ background: var(--green-light) url("data:image/svg+xml,%3Csvg width='10' height='2' viewBox='0 0 10 2' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.75 0.75H8.75' stroke='%23F6F6F7' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") center no-repeat;
116
+ }
117
+
118
+ .c-checkbox-2__inp {
119
+ &:disabled ~ .c-checkbox-2__checkmark::after {
120
+ background-color: var(--neutral-500);
121
+ }
122
+ }
123
+ }
124
+
125
+ .c-checkbox-2__checkmark {
126
+ border-radius: 4px;
127
+
128
+ &::after {
129
+ background: var(--green-light) url("data:image/svg+xml,%3Csvg width='11' height='9' viewBox='0 0 11 9' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.75 4.75L3.84858 7.40593C4.06656 7.59277 4.39676 7.55808 4.57116 7.33002L10.25 0.75' stroke='%23F6F6F7' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") center no-repeat;
130
+ }
131
+ }
132
+
133
+ .c-checkbox-2__inp {
134
+ &:checked {
135
+ &~ .c-checkbox-2__checkmark::after {
136
+ opacity: 1;
137
+ }
138
+ }
139
+
140
+ &:disabled:not(:checked) {
141
+ &~ .c-checkbox-2__checkmark::after {
142
+ background-image: none;
143
+ }
144
+ }
145
+ }
146
+ }
147
+
148
+ &.radio {
149
+ .c-checkbox-2__inp:checked ~ .c-checkbox-2__checkmark {
150
+ &::before {
151
+ display: flex;
152
+ }
153
+ }
154
+
155
+ .c-checkbox-2__checkmark {
156
+ border-radius: 50%;
157
+
158
+ &::before {
159
+ content: '';
160
+ position: absolute;
161
+ z-index: 1;
162
+
163
+ left: 4px;
164
+ top: 4px;
165
+
166
+ display: none;
167
+
168
+ width: 10px;
169
+ height: 10px;
170
+
171
+ border-radius: 50%;
172
+
173
+ background: var(--white);
174
+ }
175
+
176
+ &::after{
177
+ background: var(--green-light);
178
+ }
179
+ }
180
+ }
181
+
182
+ &.toggle {
183
+ .c-checkbox-2__inp {
184
+ &:checked {
185
+ &~ .c-checkbox-2__checkmark {
186
+ background: var(--brand-500);
187
+
188
+ &::after {
189
+ left: 24px;
190
+ }
191
+ }
192
+ }
193
+ }
194
+
195
+ .c-checkbox-2__inp {
196
+ &:disabled {
197
+ background: var(--neutral-500);
198
+
199
+ &~ .c-checkbox-2__checkmark::after {
200
+ background: var(--neutral-400);
201
+ }
202
+
203
+ &:checked {
204
+ &~ .c-checkbox-2__checkmark {
205
+ background: var(--neutral-500);
206
+
207
+ &::after {
208
+ left: 24px;
209
+ }
210
+ }
211
+ }
212
+ }
213
+ }
214
+
215
+ .c-checkbox-2__checkmark {
216
+ width: 42px;
217
+
218
+ border-radius: var(--size);
219
+ border: none;
220
+
221
+ background: var(--neutral-500);
222
+
223
+ &::after {
224
+ position: absolute;
225
+ left: 2px;
226
+ top: 2px;
227
+
228
+ width: 16px;
229
+ height: 16px;
230
+
231
+ border-radius: 50%;
232
+
233
+ background: var(--neutral-200);
234
+
235
+ opacity: 1;
236
+ }
237
+ }
238
+ }
239
+ // ./prop.variant
240
+ }
241
+
242
+ &__inp {
243
+ display: none;
244
+
245
+ &:checked {
246
+ &~ .c-checkbox-2__checkmark {
247
+ border-color: var(--brand-500);
248
+
249
+ &::after {
250
+ opacity: 1;
251
+ }
252
+ }
253
+ }
254
+
255
+ &:disabled {
256
+ &~ .c-checkbox-2__checkmark {
257
+ border-color: transparent;
258
+
259
+ &::after {
260
+ background-color: var(--neutral-500);
261
+
262
+ opacity: 1;
263
+ }
264
+ }
265
+
266
+ &~ .c-checkbox-2__text {
267
+ color: var(--neutral-400);
268
+ }
269
+ }
270
+ }
271
+
272
+ &__checkmark {
273
+ box-sizing: border-box;
274
+ display: flex;
275
+
276
+ position: relative;
277
+
278
+ width: var(--size);
279
+ height: var(--size);
280
+
281
+ flex-shrink: 0;
282
+
283
+ border: var(--border-width) solid var(--neutral-400);
284
+ border-radius: 4px;
285
+
286
+ overflow: hidden;
287
+ transition: var(--transition);
288
+
289
+ &::after {
290
+ content: '';
291
+ display: flex;
292
+
293
+ width: 100%;
294
+ height: 100%;
295
+
296
+ background: var(--green-bg);
297
+
298
+ opacity: 0;
299
+
300
+ transition: var(--transition);
301
+ }
302
+ }
303
+
304
+ &__text {
305
+ width: calc(100% - var(--checkmark-width) - var(--checkmark-distance));
306
+
307
+ font-size: var(--font-size);
308
+
309
+ color: var(--neutral-50);
310
+ }
311
+ }
312
+
313
+ </style>
@@ -35,6 +35,7 @@
35
35
 
36
36
 
37
37
  <div
38
+ v-if="showTime"
38
39
  ref="time"
39
40
  :class="['c-datepicker__time_wrap', { open: isOpenTime }]"
40
41
  >
@@ -60,7 +61,10 @@
60
61
  @blur="setIsOpenTime(false)"
61
62
  />
62
63
  </div>
63
- <Teleport :to="teleportTo">
64
+ <Teleport
65
+ v-if="showTime"
66
+ :to="teleportTo"
67
+ >
64
68
  <div
65
69
  class="c-datepicker__time_list-wrap"
66
70
  ref="timeContent"
@@ -206,6 +210,7 @@ import { computed, ref, watch, onMounted, onUnmounted, Teleport } from 'vue';
206
210
 
207
211
  type TProps = {
208
212
  date?: string,
213
+ showTime: boolean,
209
214
  locale?: 'rus' | 'usa' | 'tur' | 'spa',
210
215
  max?: string,
211
216
  min?: string,
@@ -217,6 +222,7 @@ type TProps = {
217
222
 
218
223
  const props = withDefaults(defineProps<TProps>(), {
219
224
  locale: 'rus',
225
+ showTime: true,
220
226
  isOpen: false,
221
227
  width: '100%',
222
228
  modelValue: () => [],
@@ -754,6 +760,8 @@ $timeWidth: 54px;
754
760
  &_wrap {
755
761
  position: relative;
756
762
 
763
+ flex-grow: 1;
764
+
757
765
  cursor: pointer;
758
766
 
759
767
  &.open,