@a-vision-software/vue-input-components 1.3.6 → 1.3.8

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a-vision-software/vue-input-components",
3
- "version": "1.3.6",
3
+ "version": "1.3.8",
4
4
  "description": "A collection of reusable Vue 3 input components with TypeScript support",
5
5
  "author": "A-Vision Software",
6
6
  "license": "MIT",
@@ -7,11 +7,11 @@
7
7
  'dropdown--has-error': error,
8
8
  }" :style="{
9
9
  '--dropdown-color': error ? 'var(--danger-color)' : color,
10
- '--dropdown-hover-color': hoverColor,
11
- '--dropdown-active-color': activeColor,
10
+ '--dropdown-hover-color': hoverColor ? hoverColor : 'var(--dropdown-color)',
11
+ '--dropdown-active-color': activeColor ? activeColor : 'var(--dropdown-color)',
12
12
  '--dropdown-disabled-color': disabledColor,
13
13
  '--dropdown-background-color': backgroundColor,
14
- '--dropdown-border-radius': error ? `${borderRadius} ${borderRadius} 0 0` : borderRadius,
14
+ '--dropdown-border-radius': borderRadius,
15
15
  '--dropdown-padding': padding,
16
16
  '--dropdown-max-height': maxHeight,
17
17
  '--dropdown-width': width,
@@ -42,14 +42,17 @@
42
42
  @click.stop="clearSelection" />
43
43
  <font-awesome-icon icon="chevron-down" class="dropdown__arrow" :class="{ 'dropdown__arrow--open': isOpen }" />
44
44
  </div>
45
- <span v-if="required && !showSaved && !showChanged" class="status-indicator required-indicator">required</span>
45
+ <span v-if="required && !showSaved && !showChanged && !error"
46
+ class="status-indicator required-indicator">required</span>
46
47
  <transition name="fade">
47
48
  <span v-if="showSaved && !error" class="status-indicator saved-indicator">saved</span>
48
49
  </transition>
49
50
  <transition name="fade">
50
51
  <span v-if="showChanged && !error" class="status-indicator changed-indicator">changed</span>
51
52
  </transition>
52
- <div v-if="error" class="error-message">{{ error }}</div>
53
+ <transition name="fade">
54
+ <span v-if="error" class="status-indicator error-indicator" :data-error="error">error</span>
55
+ </transition>
53
56
  </div>
54
57
 
55
58
  <div v-if="isOpen" class="dropdown__content">
@@ -82,8 +85,8 @@ const props = withDefaults(defineProps<DropdownProps>(), {
82
85
  maxHeight: '300px',
83
86
  width: '100%',
84
87
  color: 'var(--text-primary)',
85
- hoverColor: 'var(--primary)',
86
- activeColor: 'var(--primary)',
88
+ hoverColor: '',
89
+ activeColor: '',
87
90
  disabledColor: 'var(--text-disabled)',
88
91
  backgroundColor: 'white',
89
92
  borderRadius: '0.375rem',
@@ -264,6 +267,39 @@ onUnmounted(() => {
264
267
  cursor: pointer;
265
268
  user-select: none;
266
269
  outline: none;
270
+
271
+ &.dropdown--has-error {
272
+ border-color: var(--danger-color);
273
+
274
+ .icon {
275
+ color: var(--danger-color);
276
+ }
277
+
278
+ &:hover .error-indicator::after {
279
+ content: attr(data-error);
280
+ display: block;
281
+ position: absolute;
282
+ bottom: 0.25rem;
283
+ right: 0;
284
+ padding: 0.25rem 0.75rem;
285
+ color: white;
286
+ background-color: var(--danger-color);
287
+ line-height: var(--line-height);
288
+ min-width: 200px;
289
+ border-radius: 0.25rem;
290
+ z-index: 1;
291
+ }
292
+ }
293
+
294
+ .dropdown__selected:hover {
295
+ border-color: var(--dropdown-hover-color);
296
+ box-shadow: 0 0 2px var(--dropdown-hover-color) inset;
297
+ }
298
+
299
+ .dropdown__selected:focus-within {
300
+ border-color: var(--dropdown-active-color);
301
+ box-shadow: 0 0 2px var(--dropdown-hover-color) inset;
302
+ }
267
303
  }
268
304
 
269
305
  .dropdown--disabled {
@@ -488,30 +524,18 @@ onUnmounted(() => {
488
524
  color: var(--text-muted);
489
525
  background-color: var(--dropdown-background-color);
490
526
  padding: 0 0.25rem;
491
- }
492
527
 
493
- .saved-indicator {
494
- color: var(--success-color);
495
- }
528
+ &.saved-indicator {
529
+ color: var(--success-color);
530
+ }
496
531
 
497
- .changed-indicator {
498
- color: var(--warning-color);
499
- }
532
+ &.changed-indicator {
533
+ color: var(--warning-color);
534
+ }
500
535
 
501
- .error-message {
502
- position: absolute;
503
- bottom: 0;
504
- left: 0;
505
- right: 0;
506
- padding: 0.25rem 0.75rem;
507
- background-color: var(--danger-color);
508
- color: white;
509
- font-size: 0.75rem;
510
- border-radius: 0 0 0.5rem 0.5rem;
511
- transform: translateY(100%);
512
- transition: transform 0.2s ease;
513
- line-height: var(--line-height);
514
- z-index: 1;
536
+ &.error-indicator {
537
+ color: var(--danger-color);
538
+ }
515
539
  }
516
540
 
517
541
  .fade-enter-active,
@@ -30,15 +30,17 @@
30
30
  @input="handleInput" @focus="handleFocus" @blur="handleBlur" @keydown="handleKeydown" ref="inputRef" />
31
31
  <textarea v-else :id="id" :value="modelValue" :placeholder="placeholder" :required="required" :disabled="disabled"
32
32
  class="input" @input="handleInput" ref="inputRef"></textarea>
33
- <span v-if="required && !showSaved && !showChanged" class="status-indicator required-indicator">required</span>
33
+ <span v-if="required && !showSaved && !showChanged && !error"
34
+ class="status-indicator required-indicator">required</span>
34
35
  <transition name="fade">
35
36
  <span v-if="showSaved && !error" class="status-indicator saved-indicator">saved</span>
36
37
  </transition>
37
38
  <transition name="fade">
38
39
  <span v-if="showChanged && !error" class="status-indicator changed-indicator">changed</span>
39
40
  </transition>
40
- <div v-if="error" class="error-message">{{ error }}</div>
41
- <span v-if="success" class="message success-message">{{ success }}</span>
41
+ <transition name="fade">
42
+ <span v-if="error" class="status-indicator error-indicator" :data-error="error">error</span>
43
+ </transition>
42
44
  </div>
43
45
  </div>
44
46
  </template>
@@ -264,24 +266,42 @@ defineExpose({
264
266
  width: 100%;
265
267
  min-height: 2rem;
266
268
  background: var(--input-bg-color);
267
- }
268
269
 
269
- .input-wrapper.has-icon {
270
- grid-template-columns: auto 1fr;
271
- }
270
+ &.has-icon {
271
+ grid-template-columns: auto 1fr;
272
+ }
272
273
 
273
- .input-wrapper:focus-within {
274
- border-color: var(--primary-color);
275
- box-shadow: 0 0 0 3px var(--shadow-color);
276
- }
274
+ &:hover {
275
+ border-color: var(--primary-color);
276
+ box-shadow: 0 0 2px var(--primary-color) inset;
277
+ }
277
278
 
278
- .input-wrapper.has-error {
279
- border-color: var(--danger-color);
280
- border-bottom-left-radius: 0;
281
- border-bottom-right-radius: 0;
279
+ &:focus-within {
280
+ border-color: var(--primary-color);
281
+ box-shadow: 0 0 2px var(--primary-color) inset;
282
+ }
282
283
 
283
- .icon {
284
- color: var(--danger-color);
284
+ &.has-error {
285
+ border-color: var(--danger-color);
286
+
287
+ .icon {
288
+ color: var(--danger-color);
289
+ }
290
+
291
+ &:hover .error-indicator::after {
292
+ content: attr(data-error);
293
+ display: block;
294
+ position: absolute;
295
+ bottom: 0.25rem;
296
+ right: 0;
297
+ padding: 0.25rem 0.75rem;
298
+ color: white;
299
+ background-color: var(--danger-color);
300
+ line-height: var(--line-height);
301
+ min-width: 200px;
302
+ border-radius: 0.25rem;
303
+ z-index: 1;
304
+ }
285
305
  }
286
306
  }
287
307
 
@@ -292,15 +312,15 @@ defineExpose({
292
312
  border-right: 1px solid rgb(from var(--border-color) r g b / 20%);
293
313
  cursor: pointer;
294
314
  overflow: hidden;
295
- }
296
315
 
297
- .icon-wrapper:hover {
298
- background-color: var(--input-bg-hover);
299
- }
316
+ &:hover {
317
+ background-color: var(--input-bg-hover);
318
+ }
300
319
 
301
- .icon {
302
- color: var(--text-muted);
303
- font-size: 1rem;
320
+ .icon {
321
+ color: var(--text-muted);
322
+ font-size: 1rem;
323
+ }
304
324
  }
305
325
 
306
326
  .input {
@@ -313,52 +333,20 @@ defineExpose({
313
333
  background: transparent;
314
334
  width: 100%;
315
335
  line-height: var(--line-height);
316
- }
317
-
318
- .input::placeholder {
319
- color: var(--text-muted);
320
- }
321
336
 
322
- .input:disabled {
323
- background-color: var(--input-bg-disabled);
324
- cursor: not-allowed;
325
- }
326
-
327
- .message {
328
- position: absolute;
329
- bottom: -1.5rem;
330
- left: 0;
331
- font-size: 0.75rem;
332
- white-space: nowrap;
333
- }
334
-
335
- .error-message {
336
- position: absolute;
337
- bottom: 0;
338
- left: 0;
339
- right: 0;
340
- padding: 0.25rem 0.75rem;
341
- background-color: var(--danger-color);
342
- color: white;
343
- font-size: 0.75rem;
344
- border-radius: 0 0 0.5rem 0.5rem;
345
- transform: translateY(100%);
346
- transition: transform 0.2s ease;
347
- line-height: var(--line-height);
348
- z-index: 1;
349
- }
337
+ &::placeholder {
338
+ color: var(--text-muted);
339
+ }
350
340
 
351
- .success-message {
352
- position: absolute;
353
- bottom: -1.5rem;
354
- left: 0;
355
- color: var(--success-color);
356
- font-size: 0.75rem;
357
- line-height: var(--line-height);
341
+ &:disabled {
342
+ background-color: var(--input-bg-disabled);
343
+ cursor: not-allowed;
344
+ }
358
345
  }
359
346
 
360
347
  .status-indicator {
361
348
  position: absolute;
349
+ display: block;
362
350
  top: -1px;
363
351
  line-height: 1px;
364
352
  right: 0.5rem;
@@ -366,14 +354,18 @@ defineExpose({
366
354
  color: var(--text-muted);
367
355
  background-color: var(--input-bg-color);
368
356
  padding: 0 0.25rem;
369
- }
370
357
 
371
- .saved-indicator {
372
- color: var(--success-color);
373
- }
358
+ &.saved-indicator {
359
+ color: var(--success-color);
360
+ }
361
+
362
+ &.changed-indicator {
363
+ color: var(--warning-color);
364
+ }
374
365
 
375
- .changed-indicator {
376
- color: var(--warning-color);
366
+ &.error-indicator {
367
+ color: var(--danger-color);
368
+ }
377
369
  }
378
370
 
379
371
  .fade-enter-active,
@@ -22,4 +22,7 @@ export interface DropdownProps {
22
22
  padding?: string
23
23
  icon?: string
24
24
  iconSize?: 'normal' | 'large'
25
+ error?: string
26
+ required?: boolean
27
+ autosave?: (value: string | string[]) => Promise<void>
25
28
  }