@weni/unnnic-system 3.12.3-alpha.4 → 3.12.3-alpha.6

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 (49) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/components/DateFilter/DateFilter.vue.d.ts +37 -10
  3. package/dist/components/Input/BaseInput.vue.d.ts +12 -3
  4. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  5. package/dist/components/Input/Input.vue.d.ts +37 -10
  6. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  7. package/dist/components/Input/TextInput.vue.d.ts +25 -7
  8. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  9. package/dist/components/ModalNext/ModalNext.vue.d.ts +37 -10
  10. package/dist/components/MultiSelect/index.vue.d.ts +636 -1
  11. package/dist/components/MultiSelect/index.vue.d.ts.map +1 -1
  12. package/dist/components/Select/index.vue.d.ts +636 -1
  13. package/dist/components/Select/index.vue.d.ts.map +1 -1
  14. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +25 -7
  15. package/dist/components/SelectTime/index.vue.d.ts +25 -7
  16. package/dist/components/index.d.ts +234 -66
  17. package/dist/components/index.d.ts.map +1 -1
  18. package/dist/components/ui/popover/PopoverContent.vue.d.ts +4 -2
  19. package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -1
  20. package/dist/{es-e4e4f53d.mjs → es-ea43343d.mjs} +1 -1
  21. package/dist/{index-492e2532.mjs → index-f40272b0.mjs} +7614 -7515
  22. package/dist/{pt-br-ac2463c3.mjs → pt-br-fdb63719.mjs} +1 -1
  23. package/dist/style.css +1 -1
  24. package/dist/unnnic.mjs +1 -1
  25. package/dist/unnnic.umd.js +33 -33
  26. package/package.json +1 -1
  27. package/src/components/FormElement/FormElement.vue +1 -1
  28. package/src/components/Input/BaseInput.vue +7 -6
  29. package/src/components/Input/Input.scss +1 -1
  30. package/src/components/Input/Input.vue +7 -2
  31. package/src/components/Input/TextInput.vue +8 -5
  32. package/src/components/Input/__test__/TextInput.spec.js +1 -1
  33. package/src/components/ModalDialog/ModalDialog.vue +1 -1
  34. package/src/components/MultiSelect/__tests__/MultiSelect.spec.js +5 -4
  35. package/src/components/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +10 -10
  36. package/src/components/MultiSelect/index.vue +45 -4
  37. package/src/components/Radio/Radio.vue +1 -1
  38. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +8 -8
  39. package/src/components/Select/index.vue +13 -2
  40. package/src/components/Switch/Switch.vue +1 -1
  41. package/src/components/TemplatePreview/TemplatePreview.vue +2 -2
  42. package/src/components/TemplatePreview/TemplatePreviewModal.vue +1 -1
  43. package/src/components/ToolTip/ToolTip.vue +1 -1
  44. package/src/components/ui/popover/PopoverContent.vue +16 -13
  45. package/src/components/ui/popover/PopoverOption.vue +1 -1
  46. package/src/stories/Input.mdx +3 -0
  47. package/src/stories/MultiSelect.stories.js +4 -2
  48. package/src/stories/Popover.stories.js +5 -0
  49. package/src/stories/Select.stories.js +5 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weni/unnnic-system",
3
- "version": "3.12.3-alpha.4",
3
+ "version": "3.12.3-alpha.6",
4
4
  "type": "commonjs",
5
5
  "files": [
6
6
  "dist",
@@ -18,8 +18,8 @@
18
18
  <slot></slot>
19
19
 
20
20
  <section
21
- class="unnnic-form-element__hints-container"
22
21
  v-if="message || error || !!$slots.rightMessage"
22
+ class="unnnic-form-element__hints-container"
23
23
  >
24
24
  <section class="unnnic-form-element__message-container">
25
25
  <p
@@ -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();
@@ -102,8 +102,8 @@ export default {
102
102
  UnnnicDialogTitle,
103
103
  UnnnicDialogFooter,
104
104
  },
105
- inheritAttrs: false,
106
105
  mixins: [UnnnicI18n],
106
+ inheritAttrs: false,
107
107
  props: {
108
108
  modelValue: {
109
109
  type: Boolean,
@@ -282,19 +282,20 @@ describe('UnnnicMultiSelect.vue', () => {
282
282
 
283
283
  describe('computed properties', () => {
284
284
  test('calculatedMaxHeight returns correct value', () => {
285
- const maxHeight = wrapper.vm.calculatedMaxHeight;
285
+ const maxHeight = wrapper.vm.calculatedPopoverHeight;
286
+ console.log(maxHeight);
286
287
  expect(maxHeight).toBe('228px');
287
288
  });
288
289
 
289
290
  test('calculatedMaxHeight includes search height when enabled', async () => {
290
291
  await wrapper.setProps({ enableSearch: true });
291
- const maxHeight = wrapper.vm.calculatedMaxHeight;
292
+ const maxHeight = wrapper.vm.calculatedPopoverHeight;
292
293
  expect(maxHeight).toBe('295px');
293
294
  });
294
295
 
295
296
  test('calculatedMaxHeight returns unset when no options', async () => {
296
297
  await wrapper.setProps({ options: [] });
297
- const maxHeight = wrapper.vm.calculatedMaxHeight;
298
+ const maxHeight = wrapper.vm.calculatedPopoverHeight;
298
299
  expect(maxHeight).toBe('unset');
299
300
  });
300
301
 
@@ -458,7 +459,7 @@ describe('UnnnicMultiSelect.vue', () => {
458
459
  test('handles empty options array', async () => {
459
460
  await wrapper.setProps({ options: [] });
460
461
  expect(wrapper.vm.filteredOptions).toEqual([]);
461
- expect(wrapper.vm.calculatedMaxHeight).toBe('unset');
462
+ expect(wrapper.vm.calculatedPopoverHeight).toBe('unset');
462
463
  });
463
464
 
464
465
  test('handles empty modelValue array', async () => {
@@ -1,10 +1,10 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
3
  exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with default props 1`] = `
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">
4
+ "<div data-v-03c7fb50="" class="unnnic-multi-select"><button data-v-9d52eef8="" data-v-03c7fb50="" class="unnnic-popover-trigger w-full" 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 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="">
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
9
  <section data-v-a0d36167="" class="icon-right-container">
10
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>
@@ -19,10 +19,10 @@ exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with defaul
19
19
  `;
20
20
 
21
21
  exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with disabled state 1`] = `
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">
22
+ "<div data-v-03c7fb50="" class="unnnic-multi-select"><button data-v-9d52eef8="" data-v-03c7fb50="" class="unnnic-popover-trigger w-full" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
23
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">
24
24
  <!--v-if-->
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 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="">
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="">
26
26
  <!--v-if-->
27
27
  <section data-v-a0d36167="" class="icon-right-container">
28
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>
@@ -37,10 +37,10 @@ exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with disabl
37
37
  `;
38
38
 
39
39
  exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with multiple selected values 1`] = `
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">
40
+ "<div data-v-03c7fb50="" class="unnnic-multi-select"><button data-v-9d52eef8="" data-v-03c7fb50="" class="unnnic-popover-trigger w-full" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
41
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">
42
42
  <!--v-if-->
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 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">
44
44
  <!--v-if-->
45
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>
46
46
  </div>
@@ -53,10 +53,10 @@ exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with multip
53
53
  `;
54
54
 
55
55
  exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with search enabled 1`] = `
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">
56
+ "<div data-v-03c7fb50="" class="unnnic-multi-select"><button data-v-9d52eef8="" data-v-03c7fb50="" class="unnnic-popover-trigger w-full" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
57
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">
58
58
  <!--v-if-->
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 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="">
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="">
60
60
  <!--v-if-->
61
61
  <section data-v-a0d36167="" class="icon-right-container">
62
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>
@@ -71,10 +71,10 @@ exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with search
71
71
  `;
72
72
 
73
73
  exports[`UnnnicMultiSelect.vue > snapshot testing > matches snapshot with selected values 1`] = `
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">
74
+ "<div data-v-03c7fb50="" class="unnnic-multi-select"><button data-v-9d52eef8="" data-v-03c7fb50="" class="unnnic-popover-trigger w-full" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
75
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">
76
76
  <!--v-if-->
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 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">
78
78
  <!--v-if-->
79
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>
80
80
  </div>
@@ -4,12 +4,14 @@
4
4
  :open="openPopover"
5
5
  @update:open="openPopover = $event"
6
6
  >
7
- <PopoverTrigger>
7
+ <PopoverTrigger class="w-full">
8
8
  <UnnnicInput
9
+ ref="multiSelectInputRef"
9
10
  :modelValue="inputValue"
10
11
  class="unnnic-multi-select__input"
11
12
  readonly
12
- :forceActiveStatus="openPopover"
13
+ useFocusProp
14
+ :focus="openPopover"
13
15
  :size="props.size"
14
16
  :placeholder="props.placeholder"
15
17
  :label="props.label"
@@ -23,7 +25,9 @@
23
25
  </PopoverTrigger>
24
26
  <PopoverContent
25
27
  align="start"
26
- :style="{ maxHeight: calculatedMaxHeight, overflow: 'auto' }"
28
+ class="h-full"
29
+ :style="popoverContentCustomStyles"
30
+ :width="inputWidthString"
27
31
  >
28
32
  <div class="unnnic-multi-select__content">
29
33
  <UnnnicInput
@@ -34,6 +38,12 @@
34
38
  iconLeft="search"
35
39
  @update:model-value="handleSearch"
36
40
  />
41
+ <p
42
+ v-if="filteredOptions.length === 0"
43
+ class="unnnic-multi-select__content-no-results"
44
+ >
45
+ {{ $t('without_results') }}
46
+ </p>
37
47
  <div class="unnnic-multi-select__options">
38
48
  <UnnnicMultiSelectOption
39
49
  v-for="(option, index) in filteredOptions"
@@ -58,6 +68,7 @@ import { computed, ref } from 'vue';
58
68
  import { Popover, PopoverTrigger, PopoverContent } from '../ui/popover';
59
69
  import UnnnicInput from '../Input/Input.vue';
60
70
  import UnnnicMultiSelectOption from './MultSelectOption.vue';
71
+ import { useElementSize } from '@vueuse/core';
61
72
 
62
73
  defineOptions({
63
74
  name: 'UnnnicMultiSelect',
@@ -102,8 +113,26 @@ const props = withDefaults(defineProps<MultiSelectProps>(), {
102
113
  });
103
114
 
104
115
  const openPopover = ref(false);
116
+ const multiSelectInputRef = ref<HTMLInputElement | null>(null);
117
+ const { width: inputWidth } = useElementSize(multiSelectInputRef);
105
118
 
106
- const calculatedMaxHeight = computed(() => {
119
+ const inputWidthString = computed(() => {
120
+ return `${inputWidth.value}px`;
121
+ });
122
+
123
+ const popoverContentCustomStyles = computed(() => {
124
+ const emptyFilteredOptions = filteredOptions.value?.length === 0;
125
+ return {
126
+ overflow: 'auto',
127
+ display: 'flex',
128
+ flexDirection: 'column',
129
+ minHeight: calculatedPopoverHeight.value,
130
+ maxHeight: emptyFilteredOptions ? 'unset' : calculatedPopoverHeight.value,
131
+ height: emptyFilteredOptions ? calculatedPopoverHeight.value : 'unset',
132
+ };
133
+ });
134
+
135
+ const calculatedPopoverHeight = computed(() => {
107
136
  if (!props.options || props.options.length === 0) return 'unset';
108
137
  const popoverSearchGap = props.enableSearch ? 16 : 0;
109
138
  const popoverGap = 24;
@@ -211,6 +240,18 @@ const handleSelectOption = (
211
240
  padding: 0;
212
241
  margin: 0;
213
242
  gap: $unnnic-space-4;
243
+
244
+ height: -webkit-fill-available;
245
+
246
+ &-no-results {
247
+ margin: 0;
248
+ display: flex;
249
+ align-items: center;
250
+ justify-content: center;
251
+ height: 100%;
252
+ font: $unnnic-font-emphasis;
253
+ color: $unnnic-color-fg-muted;
254
+ }
214
255
  }
215
256
 
216
257
  &__options {
@@ -12,9 +12,9 @@
12
12
  type="radio"
13
13
  :disabled="disabled"
14
14
  :checked="computedModelValue === value"
15
- @change="click"
16
15
  :name="computedName"
17
16
  v-bind="pick($attrs, ['id'])"
17
+ @change="click"
18
18
  />
19
19
 
20
20
  <p
@@ -1,10 +1,10 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
3
  exports[`UnnnicSelect.vue > snapshot testing > matches snapshot with default props 1`] = `
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">
4
+ "<div data-v-6077efb7="" class="unnnic-select"><button data-v-9d52eef8="" data-v-6077efb7="" class="unnnic-popover-trigger w-full" 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 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="">
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
9
  <section data-v-a0d36167="" class="icon-right-container">
10
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>
@@ -19,10 +19,10 @@ exports[`UnnnicSelect.vue > snapshot testing > matches snapshot with default pro
19
19
  `;
20
20
 
21
21
  exports[`UnnnicSelect.vue > snapshot testing > matches snapshot with disabled state 1`] = `
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">
22
+ "<div data-v-6077efb7="" class="unnnic-select"><button data-v-9d52eef8="" data-v-6077efb7="" class="unnnic-popover-trigger w-full" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
23
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">
24
24
  <!--v-if-->
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 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="">
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="">
26
26
  <!--v-if-->
27
27
  <section data-v-a0d36167="" class="icon-right-container">
28
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>
@@ -37,10 +37,10 @@ exports[`UnnnicSelect.vue > snapshot testing > matches snapshot with disabled st
37
37
  `;
38
38
 
39
39
  exports[`UnnnicSelect.vue > snapshot testing > matches snapshot with search enabled 1`] = `
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">
40
+ "<div data-v-6077efb7="" class="unnnic-select"><button data-v-9d52eef8="" data-v-6077efb7="" class="unnnic-popover-trigger w-full" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
41
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">
42
42
  <!--v-if-->
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 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="">
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="">
44
44
  <!--v-if-->
45
45
  <section data-v-a0d36167="" class="icon-right-container">
46
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>
@@ -55,10 +55,10 @@ exports[`UnnnicSelect.vue > snapshot testing > matches snapshot with search enab
55
55
  `;
56
56
 
57
57
  exports[`UnnnicSelect.vue > snapshot testing > matches snapshot with selected value 1`] = `
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">
58
+ "<div data-v-6077efb7="" class="unnnic-select"><button data-v-9d52eef8="" data-v-6077efb7="" class="unnnic-popover-trigger w-full" id="reka-popover-trigger-v-0" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="" data-state="closed">
59
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">
60
60
  <!--v-if-->
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 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">
62
62
  <!--v-if-->
63
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>
64
64
  </div>
@@ -7,12 +7,14 @@
7
7
  :open="openPopover"
8
8
  @update:open="openPopover = $event"
9
9
  >
10
- <PopoverTrigger>
10
+ <PopoverTrigger class="w-full">
11
11
  <UnnnicInput
12
+ ref="selectInputRef"
12
13
  :modelValue="inputValue"
13
14
  class="unnnic-select__input"
14
15
  readonly
15
- :forceActiveStatus="openPopover"
16
+ useFocusProp
17
+ :focus="openPopover"
16
18
  :size="props.size"
17
19
  :placeholder="props.placeholder"
18
20
  :label="props.label"
@@ -28,6 +30,7 @@
28
30
  align="start"
29
31
  :class="'h-full'"
30
32
  :style="popoverContentCustomStyles"
33
+ :width="inputWidthString"
31
34
  >
32
35
  <div class="unnnic-select__content">
33
36
  <UnnnicInput
@@ -66,6 +69,8 @@
66
69
 
67
70
  <script setup lang="ts">
68
71
  import { computed, ref, watch, nextTick } from 'vue';
72
+ import { useElementSize } from '@vueuse/core';
73
+
69
74
  import UnnnicInput from '../Input/Input.vue';
70
75
 
71
76
  import {
@@ -127,6 +132,12 @@ const emit = defineEmits<{
127
132
  }>();
128
133
 
129
134
  const openPopover = ref(false);
135
+ const selectInputRef = ref<HTMLInputElement | null>(null);
136
+ const { width: inputWidth } = useElementSize(selectInputRef);
137
+
138
+ const inputWidthString = computed(() => {
139
+ return `${inputWidth.value}px`;
140
+ });
130
141
 
131
142
  watch(openPopover, () => {
132
143
  if (!openPopover.value) {
@@ -19,8 +19,8 @@
19
19
  type="checkbox"
20
20
  :disabled="disabled"
21
21
  :checked="modelValue"
22
- @change="toggleState"
23
22
  v-bind="pick($attrs, ['id', 'name'])"
23
+ @change="toggleState"
24
24
  />
25
25
 
26
26
  <p
@@ -13,11 +13,11 @@
13
13
  }`"
14
14
  >
15
15
  <img
16
- class="unnnic-template-preview__header__media__preview"
17
16
  v-if="
18
17
  template?.header.type === 'MEDIA' &&
19
18
  template?.header.mediaType === 'IMAGE'
20
19
  "
20
+ class="unnnic-template-preview__header__media__preview"
21
21
  :src="template.header.src || imagePreview"
22
22
  />
23
23
  <template
@@ -50,8 +50,8 @@
50
50
  />
51
51
  </template>
52
52
  <h1
53
- class="unnnic-template-preview__header__text__preview"
54
53
  v-else-if="template?.header.type === 'TEXT'"
54
+ class="unnnic-template-preview__header__text__preview"
55
55
  >
56
56
  {{ template.header.text }}
57
57
  </h1>
@@ -1,10 +1,10 @@
1
1
  <template>
2
2
  <UnnnicModalDialog
3
3
  :modelValue="modelValue"
4
- @update:modelValue="$event === false && $emit('close')"
5
4
  :title="defaultTranslations.title[props.locale]"
6
5
  :showCloseIcon="true"
7
6
  class="unnnic-template-preview-modal"
7
+ @update:model-value="$event === false && $emit('close')"
8
8
  >
9
9
  <UnnnicTemplatePreview :template="template" />
10
10
  </UnnnicModalDialog>
@@ -17,8 +17,8 @@
17
17
  <template v-if="enableHtml">
18
18
  <!-- eslint-disable-next-line vue/no-v-html -->
19
19
  <section
20
- v-html="text"
21
20
  data-testid="tooltip-html-content"
21
+ v-html="text"
22
22
  ></section>
23
23
  </template>
24
24
  <template
@@ -2,14 +2,13 @@
2
2
  <PopoverPortal>
3
3
  <PopoverContent
4
4
  v-bind="{ ...forwarded, ...$attrs }"
5
+ :style="{ width: contentWidth, zIndex: popoverZIndex }"
5
6
  :class="
6
7
  cn(
7
8
  'unnnic-popover',
8
- `unnnic-popover--size-${props.size}`,
9
9
  'bg-popover text-popover-foreground outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
10
10
  )
11
11
  "
12
- :style="{ zIndex: popoverZIndex }"
13
12
  >
14
13
  <section :class="`unnnic-popover__content ${props.class || ''}`">
15
14
  <component
@@ -45,7 +44,8 @@ const props = withDefaults(
45
44
  defineProps<
46
45
  PopoverContentProps & {
47
46
  class?: HTMLAttributes['class'];
48
- size?: 'small' | 'medium' | 'large';
47
+ size?: string;
48
+ width?: string;
49
49
  }
50
50
  >(),
51
51
  {
@@ -53,6 +53,7 @@ const props = withDefaults(
53
53
  sideOffset: 4,
54
54
  size: 'medium',
55
55
  class: '',
56
+ width: '',
56
57
  },
57
58
  );
58
59
  const emits = defineEmits<PopoverContentEmits>();
@@ -83,6 +84,18 @@ const footerChildren = computed(() => {
83
84
  (vnode: VNode) => getComponentName(vnode) === 'UnnnicPopoverFooter',
84
85
  );
85
86
  });
87
+
88
+ const contentWidth = computed(() => {
89
+ if (props.width) return props.width;
90
+
91
+ const sizes = {
92
+ small: '240px',
93
+ medium: '320px',
94
+ large: '400px',
95
+ };
96
+
97
+ return sizes[props.size as keyof typeof sizes];
98
+ });
86
99
  </script>
87
100
 
88
101
  <style lang="scss">
@@ -109,16 +122,6 @@ $popover-space: $unnnic-space-4;
109
122
  border-radius: $unnnic-border-radius-pill;
110
123
  }
111
124
 
112
- &--size-small {
113
- width: 240px;
114
- }
115
- &--size-medium {
116
- width: 320px;
117
- }
118
- &--size-large {
119
- width: 400px;
120
- }
121
-
122
125
  &__content {
123
126
  padding: $popover-space;
124
127
  }
@@ -76,7 +76,7 @@ const schemeColor = computed(() => {
76
76
  .unnnic-popover-option {
77
77
  cursor: pointer;
78
78
  border-radius: $unnnic-radius-2;
79
- padding: $unnnic-space-2;
79
+ padding: $unnnic-space-2 $unnnic-space-4;
80
80
  font: $unnnic-font-emphasis;
81
81
  display: flex;
82
82
  gap: $unnnic-space-2;
@@ -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`