@weni/unnnic-system 3.12.3-alpha.3 → 3.12.3-alpha.5

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 (40) hide show
  1. package/dist/components/DateFilter/DateFilter.vue.d.ts +37 -10
  2. package/dist/components/Input/BaseInput.vue.d.ts +12 -3
  3. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  4. package/dist/components/Input/Input.vue.d.ts +37 -10
  5. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  6. package/dist/components/Input/TextInput.vue.d.ts +25 -7
  7. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  8. package/dist/components/ModalNext/ModalNext.vue.d.ts +37 -10
  9. package/dist/components/MultiSelect/index.vue.d.ts.map +1 -1
  10. package/dist/components/Select/index.vue.d.ts.map +1 -1
  11. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +25 -7
  12. package/dist/components/SelectTime/index.vue.d.ts +25 -7
  13. package/dist/components/index.d.ts +222 -60
  14. package/dist/components/index.d.ts.map +1 -1
  15. package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -1
  16. package/dist/{es-282e1be1.mjs → es-a9e51a05.mjs} +1 -1
  17. package/dist/{index-3e8b73e8.mjs → index-ade761d4.mjs} +3332 -3306
  18. package/dist/locales/en.json.d.ts +2 -1
  19. package/dist/locales/es.json.d.ts +2 -1
  20. package/dist/locales/pt_br.json.d.ts +2 -1
  21. package/dist/{pt-br-accccfeb.mjs → pt-br-5395459d.mjs} +1 -1
  22. package/dist/style.css +1 -1
  23. package/dist/unnnic.mjs +1 -1
  24. package/dist/unnnic.umd.js +23 -23
  25. package/package.json +1 -1
  26. package/src/components/Input/BaseInput.vue +7 -6
  27. package/src/components/Input/Input.scss +1 -1
  28. package/src/components/Input/Input.vue +7 -2
  29. package/src/components/Input/TextInput.vue +8 -5
  30. package/src/components/Input/__test__/TextInput.spec.js +1 -1
  31. package/src/components/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +14 -8
  32. package/src/components/MultiSelect/index.vue +3 -2
  33. package/src/components/Select/__tests__/Select.spec.js +8 -8
  34. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +13 -7
  35. package/src/components/Select/index.vue +47 -10
  36. package/src/components/ui/popover/PopoverContent.vue +15 -0
  37. package/src/locales/en.json +2 -1
  38. package/src/locales/es.json +2 -1
  39. package/src/locales/pt_br.json +2 -1
  40. package/src/stories/Input.mdx +3 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weni/unnnic-system",
3
- "version": "3.12.3-alpha.3",
3
+ "version": "3.12.3-alpha.5",
4
4
  "type": "commonjs",
5
5
  "files": [
6
6
  "dist",
@@ -4,7 +4,7 @@
4
4
  v-mask="mask"
5
5
  v-bind="attributes"
6
6
  :value="fullySanitize(modelValue)"
7
- :class="[classes, { focus: forceActiveStatus }]"
7
+ :class="[classes, { focus, 'use-focus-prop': useFocusProp }]"
8
8
  :type="nativeType"
9
9
  :readonly="readonly"
10
10
  />
@@ -12,7 +12,7 @@
12
12
  v-else
13
13
  v-bind="attributes"
14
14
  :value="fullySanitize(modelValue)"
15
- :class="[classes, { focus: forceActiveStatus }]"
15
+ :class="[classes, { focus, 'use-focus-prop': useFocusProp }]"
16
16
  :type="nativeType"
17
17
  :maxlength="maxlength"
18
18
  :readonly="readonly"
@@ -60,15 +60,16 @@ export default {
60
60
  type: Boolean,
61
61
  default: false,
62
62
  },
63
- forceActiveStatus: {
63
+ useFocusProp: {
64
+ type: Boolean,
65
+ default: false,
66
+ },
67
+ focus: {
64
68
  type: Boolean,
65
69
  default: false,
66
70
  },
67
71
  },
68
72
  emits: ['update:modelValue'],
69
- data() {
70
- return {};
71
- },
72
73
  computed: {
73
74
  attributes() {
74
75
  return {
@@ -9,7 +9,7 @@
9
9
  caret-color: $unnnic-color-fg-muted;
10
10
  font: $unnnic-font-body;
11
11
 
12
- &:focus,
12
+ &:focus:not(.use-focus-prop),
13
13
  &.focus {
14
14
  border-color: $unnnic-color-border-active;
15
15
  }
@@ -13,7 +13,8 @@
13
13
  v-bind="$attrs"
14
14
  v-model="val"
15
15
  class="unnnic-form-input"
16
- :forceActiveStatus="forceActiveStatus"
16
+ :useFocusProp="useFocusProp"
17
+ :focus="focus"
17
18
  :placeholder="placeholder"
18
19
  :iconLeft="iconLeft"
19
20
  :iconRight="iconRight"
@@ -135,7 +136,11 @@ export default {
135
136
  type: Boolean,
136
137
  default: false,
137
138
  },
138
- forceActiveStatus: {
139
+ useFocusProp: {
140
+ type: Boolean,
141
+ default: false,
142
+ },
143
+ focus: {
139
144
  type: Boolean,
140
145
  default: false,
141
146
  },
@@ -15,9 +15,8 @@
15
15
  :hasClearIcon="showClear"
16
16
  :maxlength="maxlength"
17
17
  :readonly="readonly"
18
- :forceActiveStatus="forceActiveStatus"
19
- @focus="onFocus"
20
- @blur="onBlur"
18
+ :useFocusProp="useFocusProp"
19
+ :focus="focus"
21
20
  />
22
21
 
23
22
  <UnnnicIcon
@@ -120,7 +119,11 @@ export default {
120
119
  type: Boolean,
121
120
  default: false,
122
121
  },
123
- forceActiveStatus: {
122
+ useFocusProp: {
123
+ type: Boolean,
124
+ default: false,
125
+ },
126
+ focus: {
124
127
  type: Boolean,
125
128
  default: false,
126
129
  },
@@ -162,7 +165,7 @@ export default {
162
165
  },
163
166
 
164
167
  methods: {
165
- focus() {
168
+ focusInput() {
166
169
  this.$refs['base-input'].$el.focus();
167
170
  },
168
171
 
@@ -129,7 +129,7 @@ describe('TextInput.vue', () => {
129
129
 
130
130
  test('focus method calls focus on base input element', () => {
131
131
  const focusSpy = vi.spyOn(wrapper.vm.$refs['base-input'].$el, 'focus');
132
- wrapper.vm.focus();
132
+ wrapper.vm.focusInput();
133
133
 
134
134
  expect(focusSpy).toHaveBeenCalled();
135
135
  focusSpy.mockRestore();
@@ -4,9 +4,11 @@ exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with defaul
4
4
  "<div data-v-03c7fb50="" class="unnnic-multi-select"><button data-v-9d52eef8="" data-v-03c7fb50="" class="unnnic-popover-trigger" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
5
5
  <section data-v-9f8d6c86="" data-v-d890ad85="" data-v-03c7fb50="" class="unnnic-form-element unnnic-form md unnnic-multi-select__input" data-testid="form-element">
6
6
  <!--v-if-->
7
- <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-multi-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-multi-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right input--has-clear-icon unnnic-multi-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="true" type="text" readonly="" value="">
7
+ <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-multi-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-multi-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right use-focus-prop unnnic-multi-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="false" type="text" readonly="" value="">
8
8
  <!--v-if-->
9
- <section data-v-a0d36167="" class="icon-right-container"><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant unnnic--clickable icon-clear" data-testid="material-icon" translate="no">close</span><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span></section>
9
+ <section data-v-a0d36167="" class="icon-right-container">
10
+ <!--v-if--><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span>
11
+ </section>
10
12
  </div>
11
13
  <!--v-if-->
12
14
  </section>
@@ -20,9 +22,11 @@ exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with disabl
20
22
  "<div data-v-03c7fb50="" class="unnnic-multi-select"><button data-v-9d52eef8="" data-v-03c7fb50="" class="unnnic-popover-trigger" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
21
23
  <section data-v-9f8d6c86="" data-v-d890ad85="" data-v-03c7fb50="" class="unnnic-form-element unnnic-form-element--disabled unnnic-form md unnnic-multi-select__input" data-testid="form-element">
22
24
  <!--v-if-->
23
- <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-multi-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-multi-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right input--has-clear-icon unnnic-multi-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="true" type="text" readonly="" value="" disabled="">
25
+ <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-multi-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-multi-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right use-focus-prop unnnic-multi-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="false" type="text" readonly="" value="" disabled="">
24
26
  <!--v-if-->
25
- <section data-v-a0d36167="" class="icon-right-container"><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-muted unnnic-icon-size--ant unnnic-icon__size--ant unnnic--clickable icon-clear" data-testid="material-icon" translate="no">close</span><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-muted unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span></section>
27
+ <section data-v-a0d36167="" class="icon-right-container">
28
+ <!--v-if--><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-muted unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span>
29
+ </section>
26
30
  </div>
27
31
  <!--v-if-->
28
32
  </section>
@@ -36,7 +40,7 @@ exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with multip
36
40
  "<div data-v-03c7fb50="" class="unnnic-multi-select"><button data-v-9d52eef8="" data-v-03c7fb50="" class="unnnic-popover-trigger" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
37
41
  <section data-v-9f8d6c86="" data-v-d890ad85="" data-v-03c7fb50="" class="unnnic-form-element unnnic-form md unnnic-multi-select__input" data-testid="form-element">
38
42
  <!--v-if-->
39
- <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-multi-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-multi-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right input--has-clear-icon unnnic-multi-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="true" type="text" readonly="" value="Option 1, Option 2">
43
+ <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-multi-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-multi-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right input--has-clear-icon use-focus-prop unnnic-multi-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="true" type="text" readonly="" value="Option 1, Option 2">
40
44
  <!--v-if-->
41
45
  <section data-v-a0d36167="" class="icon-right-container"><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant unnnic--clickable icon-clear" data-testid="material-icon" translate="no">close</span><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span></section>
42
46
  </div>
@@ -52,9 +56,11 @@ exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with search
52
56
  "<div data-v-03c7fb50="" class="unnnic-multi-select"><button data-v-9d52eef8="" data-v-03c7fb50="" class="unnnic-popover-trigger" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
53
57
  <section data-v-9f8d6c86="" data-v-d890ad85="" data-v-03c7fb50="" class="unnnic-form-element unnnic-form md unnnic-multi-select__input" data-testid="form-element">
54
58
  <!--v-if-->
55
- <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-multi-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-multi-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right input--has-clear-icon unnnic-multi-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="true" type="text" readonly="" value="">
59
+ <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-multi-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-multi-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right use-focus-prop unnnic-multi-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="false" type="text" readonly="" value="">
56
60
  <!--v-if-->
57
- <section data-v-a0d36167="" class="icon-right-container"><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant unnnic--clickable icon-clear" data-testid="material-icon" translate="no">close</span><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span></section>
61
+ <section data-v-a0d36167="" class="icon-right-container">
62
+ <!--v-if--><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span>
63
+ </section>
58
64
  </div>
59
65
  <!--v-if-->
60
66
  </section>
@@ -68,7 +74,7 @@ exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with select
68
74
  "<div data-v-03c7fb50="" class="unnnic-multi-select"><button data-v-9d52eef8="" data-v-03c7fb50="" class="unnnic-popover-trigger" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
69
75
  <section data-v-9f8d6c86="" data-v-d890ad85="" data-v-03c7fb50="" class="unnnic-form-element unnnic-form md unnnic-multi-select__input" data-testid="form-element">
70
76
  <!--v-if-->
71
- <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-multi-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-multi-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right input--has-clear-icon unnnic-multi-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="true" type="text" readonly="" value="Option 1">
77
+ <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-multi-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-multi-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right input--has-clear-icon use-focus-prop unnnic-multi-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="true" type="text" readonly="" value="Option 1">
72
78
  <!--v-if-->
73
79
  <section data-v-a0d36167="" class="icon-right-container"><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant unnnic--clickable icon-clear" data-testid="material-icon" translate="no">close</span><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span></section>
74
80
  </div>
@@ -9,7 +9,8 @@
9
9
  :modelValue="inputValue"
10
10
  class="unnnic-multi-select__input"
11
11
  readonly
12
- :forceActiveStatus="openPopover"
12
+ useFocusProp
13
+ :focus="openPopover"
13
14
  :size="props.size"
14
15
  :placeholder="props.placeholder"
15
16
  :label="props.label"
@@ -17,7 +18,7 @@
17
18
  :message="props.message"
18
19
  :iconRight="openPopover ? 'keyboard_arrow_up' : 'keyboard_arrow_down'"
19
20
  :disabled="props.disabled"
20
- showClear
21
+ :showClear="!!selectedItems.length"
21
22
  @clear="emit('update:modelValue', [])"
22
23
  />
23
24
  </PopoverTrigger>
@@ -245,20 +245,20 @@ describe('UnnnicSelect.vue', () => {
245
245
  });
246
246
 
247
247
  describe('computed properties', () => {
248
- test('calculatedMaxHeight returns correct value', () => {
249
- const maxHeight = wrapper.vm.calculatedMaxHeight;
248
+ test('calculatedPopoverHeight returns correct value', () => {
249
+ const maxHeight = wrapper.vm.calculatedPopoverHeight;
250
250
  expect(maxHeight).toBe('235px');
251
251
  });
252
252
 
253
- test('calculatedMaxHeight includes search height when enabled', async () => {
253
+ test('calculatedPopoverHeight includes search height when enabled', async () => {
254
254
  await wrapper.setProps({ enableSearch: true });
255
- const maxHeight = wrapper.vm.calculatedMaxHeight;
256
- expect(maxHeight).toBe('289px');
255
+ const maxHeight = wrapper.vm.calculatedPopoverHeight;
256
+ expect(maxHeight).toBe('282px');
257
257
  });
258
258
 
259
- test('calculatedMaxHeight returns unset when no options', async () => {
259
+ test('calculatedPopoverHeight returns unset when no options', async () => {
260
260
  await wrapper.setProps({ options: [] });
261
- const maxHeight = wrapper.vm.calculatedMaxHeight;
261
+ const maxHeight = wrapper.vm.calculatedPopoverHeight;
262
262
  expect(maxHeight).toBe('unset');
263
263
  });
264
264
 
@@ -360,7 +360,7 @@ describe('UnnnicSelect.vue', () => {
360
360
  test('handles empty options array', async () => {
361
361
  await wrapper.setProps({ options: [] });
362
362
  expect(wrapper.vm.filteredOptions).toEqual([]);
363
- expect(wrapper.vm.calculatedMaxHeight).toBe('unset');
363
+ expect(wrapper.vm.calculatedPopoverHeight).toBe('unset');
364
364
  });
365
365
 
366
366
  test('handles null modelValue', async () => {
@@ -4,9 +4,11 @@ exports[`UnnnicSelect.vue > snapshot testing > matches snapshot with default pro
4
4
  "<div data-v-6077efb7="" class="unnnic-select"><button data-v-9d52eef8="" data-v-6077efb7="" class="unnnic-popover-trigger" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
5
5
  <section data-v-9f8d6c86="" data-v-d890ad85="" data-v-6077efb7="" class="unnnic-form-element unnnic-form md unnnic-select__input" data-testid="form-element">
6
6
  <!--v-if-->
7
- <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right input--has-clear-icon unnnic-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="true" type="text" readonly="" value="">
7
+ <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right use-focus-prop unnnic-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="false" type="text" readonly="" value="">
8
8
  <!--v-if-->
9
- <section data-v-a0d36167="" class="icon-right-container"><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant unnnic--clickable icon-clear" data-testid="material-icon" translate="no">close</span><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span></section>
9
+ <section data-v-a0d36167="" class="icon-right-container">
10
+ <!--v-if--><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span>
11
+ </section>
10
12
  </div>
11
13
  <!--v-if-->
12
14
  </section>
@@ -20,9 +22,11 @@ exports[`UnnnicSelect.vue > snapshot testing > matches snapshot with disabled st
20
22
  "<div data-v-6077efb7="" class="unnnic-select"><button data-v-9d52eef8="" data-v-6077efb7="" class="unnnic-popover-trigger" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
21
23
  <section data-v-9f8d6c86="" data-v-d890ad85="" data-v-6077efb7="" class="unnnic-form-element unnnic-form-element--disabled unnnic-form md unnnic-select__input" data-testid="form-element">
22
24
  <!--v-if-->
23
- <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right input--has-clear-icon unnnic-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="true" type="text" readonly="" value="" disabled="">
25
+ <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right use-focus-prop unnnic-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="false" type="text" readonly="" value="" disabled="">
24
26
  <!--v-if-->
25
- <section data-v-a0d36167="" class="icon-right-container"><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-muted unnnic-icon-size--ant unnnic-icon__size--ant unnnic--clickable icon-clear" data-testid="material-icon" translate="no">close</span><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-muted unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span></section>
27
+ <section data-v-a0d36167="" class="icon-right-container">
28
+ <!--v-if--><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-muted unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span>
29
+ </section>
26
30
  </div>
27
31
  <!--v-if-->
28
32
  </section>
@@ -36,9 +40,11 @@ exports[`UnnnicSelect.vue > snapshot testing > matches snapshot with search enab
36
40
  "<div data-v-6077efb7="" class="unnnic-select"><button data-v-9d52eef8="" data-v-6077efb7="" class="unnnic-popover-trigger" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
37
41
  <section data-v-9f8d6c86="" data-v-d890ad85="" data-v-6077efb7="" class="unnnic-form-element unnnic-form md unnnic-select__input" data-testid="form-element">
38
42
  <!--v-if-->
39
- <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right input--has-clear-icon unnnic-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="true" type="text" readonly="" value="">
43
+ <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right use-focus-prop unnnic-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="false" type="text" readonly="" value="">
40
44
  <!--v-if-->
41
- <section data-v-a0d36167="" class="icon-right-container"><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant unnnic--clickable icon-clear" data-testid="material-icon" translate="no">close</span><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span></section>
45
+ <section data-v-a0d36167="" class="icon-right-container">
46
+ <!--v-if--><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span>
47
+ </section>
42
48
  </div>
43
49
  <!--v-if-->
44
50
  </section>
@@ -52,7 +58,7 @@ exports[`UnnnicSelect.vue > snapshot testing > matches snapshot with selected va
52
58
  "<div data-v-6077efb7="" class="unnnic-select"><button data-v-9d52eef8="" data-v-6077efb7="" class="unnnic-popover-trigger" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
53
59
  <section data-v-9f8d6c86="" data-v-d890ad85="" data-v-6077efb7="" class="unnnic-form-element unnnic-form md unnnic-select__input" data-testid="form-element">
54
60
  <!--v-if-->
55
- <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right input--has-clear-icon unnnic-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="true" type="text" readonly="" value="Option 1">
61
+ <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-select__input unnnic-form-input" hascloudycolor="false" mask=""><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-select__input unnnic-form-input input-itself input size-md normal input--has-icon-right input--has-clear-icon use-focus-prop unnnic-select__input unnnic-form-input input-itself" hascloudycolor="false" placeholder="" iconleft="" iconright="keyboard_arrow_down" iconleftclickable="false" iconrightclickable="false" showclear="true" type="text" readonly="" value="Option 1">
56
62
  <!--v-if-->
57
63
  <section data-v-a0d36167="" class="icon-right-container"><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant unnnic--clickable icon-clear" data-testid="material-icon" translate="no">close</span><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant icon-right" data-testid="material-icon" translate="no">keyboard_arrow_down</span></section>
58
64
  </div>
@@ -12,7 +12,8 @@
12
12
  :modelValue="inputValue"
13
13
  class="unnnic-select__input"
14
14
  readonly
15
- :forceActiveStatus="openPopover"
15
+ useFocusProp
16
+ :focus="openPopover"
16
17
  :size="props.size"
17
18
  :placeholder="props.placeholder"
18
19
  :label="props.label"
@@ -20,16 +21,14 @@
20
21
  :message="props.message"
21
22
  :iconRight="openPopover ? 'keyboard_arrow_up' : 'keyboard_arrow_down'"
22
23
  :disabled="props.disabled"
23
- showClear
24
+ :showClear="!!selectedItem"
24
25
  @clear="emit('update:modelValue', '')"
25
26
  />
26
27
  </PopoverTrigger>
27
28
  <PopoverContent
28
29
  align="start"
29
- :style="{
30
- maxHeight: calculatedMaxHeight,
31
- overflow: 'auto',
32
- }"
30
+ :class="'h-full'"
31
+ :style="popoverContentCustomStyles"
33
32
  >
34
33
  <div class="unnnic-select__content">
35
34
  <UnnnicInput
@@ -40,8 +39,15 @@
40
39
  iconLeft="search"
41
40
  @update:model-value="handleSearch"
42
41
  />
42
+ <p
43
+ v-if="filteredOptions.length === 0"
44
+ class="unnnic-select__content-no-results"
45
+ >
46
+ {{ $t('without_results') }}
47
+ </p>
43
48
  <PopoverOption
44
49
  v-for="(option, index) in filteredOptions"
50
+ v-else
45
51
  :key="option[props.itemValue]"
46
52
  :data-option-index="index"
47
53
  data-testid="select-option"
@@ -69,6 +75,7 @@ import {
69
75
  PopoverContent,
70
76
  PopoverOption,
71
77
  } from '../ui/popover/index';
78
+
72
79
  import UnnnicI18n from '../../mixins/i18n';
73
80
 
74
81
  defineOptions({
@@ -141,6 +148,7 @@ watch(openPopover, () => {
141
148
  const handleKeyDown = (event) => {
142
149
  const { key } = event;
143
150
  const validKeys = ['ArrowUp', 'ArrowDown', 'Enter'];
151
+
144
152
  if (validKeys.includes(key)) {
145
153
  event.preventDefault();
146
154
  if (key === 'ArrowUp') {
@@ -153,7 +161,7 @@ const handleKeyDown = (event) => {
153
161
  focusedOptionIndex.value++;
154
162
  scrollToOption(focusedOptionIndex.value);
155
163
  }
156
- if (key === 'Enter') {
164
+ if (key === 'Enter' && focusedOptionIndex.value !== -1) {
157
165
  handleSelectOption(filteredOptions.value[focusedOptionIndex.value]);
158
166
  }
159
167
  }
@@ -174,15 +182,32 @@ const scrollToOption = (
174
182
  });
175
183
  };
176
184
 
177
- const calculatedMaxHeight = computed(() => {
185
+ const calculatedPopoverHeight = computed(() => {
178
186
  if (!props.options || props.options.length === 0) return 'unset';
179
187
  const popoverPadding = 32;
180
188
  const popoverGap = 4;
181
189
  // 37 = 21px (height) + 16px (padding)
182
190
  const fieldsHeight = 37 * props.optionsLines;
191
+ const gapsCompensation = props.enableSearch ? 1 : 2;
192
+
183
193
  const size =
184
- fieldsHeight + popoverPadding + (popoverGap * props.optionsLines - 2);
185
- return `${props.enableSearch ? size + 54 : size}px`;
194
+ fieldsHeight +
195
+ popoverPadding +
196
+ (popoverGap * props.optionsLines - gapsCompensation);
197
+
198
+ return `${props.enableSearch ? size + 45 + 1 : size}px`;
199
+ });
200
+
201
+ const popoverContentCustomStyles = computed(() => {
202
+ const emptyFilteredOptions = filteredOptions.value?.length === 0;
203
+ return {
204
+ overflow: 'auto',
205
+ display: 'flex',
206
+ flexDirection: 'column',
207
+ minHeight: calculatedPopoverHeight.value,
208
+ maxHeight: emptyFilteredOptions ? 'unset' : calculatedPopoverHeight.value,
209
+ height: emptyFilteredOptions ? calculatedPopoverHeight.value : 'unset',
210
+ };
186
211
  });
187
212
 
188
213
  const selectedItem = computed(() => {
@@ -256,6 +281,18 @@ const filteredOptions = computed(() => {
256
281
  padding: 0;
257
282
  margin: 0;
258
283
  gap: $unnnic-space-1;
284
+
285
+ height: -webkit-fill-available;
286
+
287
+ &-no-results {
288
+ margin: 0;
289
+ display: flex;
290
+ align-items: center;
291
+ justify-content: center;
292
+ height: 100%;
293
+ font: $unnnic-font-emphasis;
294
+ color: $unnnic-color-fg-muted;
295
+ }
259
296
  }
260
297
  }
261
298
  </style>
@@ -93,6 +93,21 @@ $popover-space: $unnnic-space-4;
93
93
  .unnnic-popover {
94
94
  border-radius: $unnnic-radius-2;
95
95
  box-shadow: $unnnic-shadow-1;
96
+ border: 1px solid $unnnic-color-border-soft;
97
+
98
+ &::-webkit-scrollbar {
99
+ width: $unnnic-spacing-inline-nano;
100
+ }
101
+
102
+ &::-webkit-scrollbar-thumb {
103
+ background: $unnnic-color-neutral-cleanest;
104
+ border-radius: $unnnic-border-radius-pill;
105
+ }
106
+
107
+ &::-webkit-scrollbar-track {
108
+ background: $unnnic-color-neutral-soft;
109
+ border-radius: $unnnic-border-radius-pill;
110
+ }
96
111
 
97
112
  &--size-small {
98
113
  width: 240px;
@@ -42,5 +42,6 @@
42
42
  "custom": "Custom"
43
43
  }
44
44
  },
45
- "search": "Search"
45
+ "search": "Search",
46
+ "without_results": "No results found"
46
47
  }
@@ -42,5 +42,6 @@
42
42
  "custom": "Personalizados"
43
43
  }
44
44
  },
45
- "search": "Buscar"
45
+ "search": "Buscar",
46
+ "without_results": "No se encontró ningún resultado"
46
47
  }
@@ -42,5 +42,6 @@
42
42
  "custom": "Personalizados"
43
43
  }
44
44
  },
45
- "search": "Buscar"
45
+ "search": "Buscar",
46
+ "without_results": "Nenhum resultado encontrado"
46
47
  }
@@ -42,6 +42,9 @@ The `Input` component is designed to provide an input field for users to enter t
42
42
  | placeholder | `String` of the native input placeholder | `String` | `''` |
43
43
  | iconLeft | `String` of the left icon | `String` | `undefined` |
44
44
  | iconRight | `String` of the right icon | `String` | `false` |
45
+ | useFocusProp | `Boolean` to enable use focus by prop (ignore native css) | `true` \| `false` | `false` |
46
+ | focus | `Boolean` to enable focus component status | `true` \| `false` | `false` |
47
+
45
48
 
46
49
  ## Example
47
50
  Some examples of uses of the `UnnnicInput`