@weni/unnnic-system 3.12.2 → 3.12.3-alpha-teleports.1

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 (199) hide show
  1. package/dist/components/Alert/Alert.vue.d.ts +3 -3
  2. package/dist/components/Alert/Version1dot1.vue.d.ts +1 -1
  3. package/dist/components/AudioRecorder/AudioHandler.vue.d.ts +92 -18
  4. package/dist/components/AudioRecorder/AudioRecorder.vue.d.ts +184 -36
  5. package/dist/components/AvatarIcon/AvatarIcon.vue.d.ts +1 -1
  6. package/dist/components/Button/Button.vue.d.ts +2 -2
  7. package/dist/components/Card/AccountCard.vue.d.ts +2 -2
  8. package/dist/components/Card/Card.vue.d.ts +103 -29
  9. package/dist/components/Card/CardCompany.vue.d.ts +2 -2
  10. package/dist/components/Card/CardStatusesContainer.vue.d.ts +93 -19
  11. package/dist/components/Card/ContentCard.vue.d.ts +1 -1
  12. package/dist/components/Card/DashCard.vue.d.ts +2 -2
  13. package/dist/components/Card/DefaultCard.vue.d.ts +1 -1
  14. package/dist/components/Card/MarketplaceCard.vue.d.ts +1 -1
  15. package/dist/components/Card/SimpleCard.vue.d.ts +92 -18
  16. package/dist/components/Card/StatusCard.vue.d.ts +1 -1
  17. package/dist/components/Card/TitleCard.vue.d.ts +92 -18
  18. package/dist/components/CardImage/CardImage.vue.d.ts +5 -5
  19. package/dist/components/CardInformation/CardInformation.vue.d.ts +93 -19
  20. package/dist/components/CardProject/CardProject.vue.d.ts +2 -2
  21. package/dist/components/Carousel/Carousel.vue.d.ts +2 -2
  22. package/dist/components/Carousel/TagCarousel.vue.d.ts +2 -2
  23. package/dist/components/ChartBar/ChartBar.vue.d.ts +98 -24
  24. package/dist/components/ChartFunnel/DefaultFunnel/ChartDefaultFunnelBase.vue.d.ts.map +1 -1
  25. package/dist/components/ChartLine/ChartLine.vue.d.ts +92 -18
  26. package/dist/components/ChatText/ChatText.vue.d.ts +92 -18
  27. package/dist/components/ChatsContact/ChatsContact.vue.d.ts +6 -6
  28. package/dist/components/ChatsMessage/ChatsMessage.vue.d.ts +92 -18
  29. package/dist/components/ChatsUserAvatar/ChatsUserAvatar.vue.d.ts +1 -1
  30. package/dist/components/Checkbox/Checkbox.vue.d.ts +3 -3
  31. package/dist/components/Checkbox/Checkbox.vue.d.ts.map +1 -1
  32. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts.map +1 -1
  33. package/dist/components/DataArea/DataArea.vue.d.ts +92 -18
  34. package/dist/components/DataTable/index.vue.d.ts +1 -1
  35. package/dist/components/DataTable/index.vue.d.ts.map +1 -1
  36. package/dist/components/DateFilter/DateFilter.vue.d.ts +13 -13
  37. package/dist/components/Drawer/Drawer.vue.d.ts +37 -207
  38. package/dist/components/Drawer/Drawer.vue.d.ts.map +1 -1
  39. package/dist/components/Dropdown/Dropdown.vue.d.ts +1 -1
  40. package/dist/components/FormElement/FormElement.vue.d.ts +6 -6
  41. package/dist/components/FormElement/FormElement.vue.d.ts.map +1 -1
  42. package/dist/components/ImportCard/ImportCard.vue.d.ts +6 -6
  43. package/dist/components/Input/Input.vue.d.ts +12 -12
  44. package/dist/components/Input/TextInput.vue.d.ts +2 -2
  45. package/dist/components/InputNext/InputNext.vue.d.ts +3 -3
  46. package/dist/components/Label/Label.vue.d.ts +1 -1
  47. package/dist/components/Label/Label.vue.d.ts.map +1 -1
  48. package/dist/components/Modal/Modal.vue.d.ts +1 -1
  49. package/dist/components/ModalDialog/ModalDialog.vue.d.ts +209 -35
  50. package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
  51. package/dist/components/ModalNext/ModalNext.vue.d.ts +18 -18
  52. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +12 -12
  53. package/dist/components/MoodRating/MoodRating.vue.d.ts +92 -18
  54. package/dist/components/MultiSelect/MultiSelect.vue.d.ts +18 -18
  55. package/dist/components/Pagination/Pagination.vue.d.ts +6 -6
  56. package/dist/components/Radio/Radio.vue.d.ts +6 -6
  57. package/dist/components/Radio/Radio.vue.d.ts.map +1 -1
  58. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +11 -11
  59. package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +2 -2
  60. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +5 -5
  61. package/dist/components/SelectTime/index.vue.d.ts +3 -3
  62. package/dist/components/Slider/Slider.vue.d.ts +92 -18
  63. package/dist/components/Switch/Switch.vue.d.ts +3 -3
  64. package/dist/components/Switch/Switch.vue.d.ts.map +1 -1
  65. package/dist/components/Tab/Tab.vue.d.ts +92 -18
  66. package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
  67. package/dist/components/TableNext/TablePagination.vue.d.ts +6 -6
  68. package/dist/components/Tag/DefaultTag.vue.d.ts +1 -1
  69. package/dist/components/Tag/Tag.vue.d.ts +2 -2
  70. package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts.map +1 -1
  71. package/dist/components/TextArea/TextArea.vue.d.ts +8 -8
  72. package/dist/components/Toast/Toast.vue.d.ts +1 -1
  73. package/dist/components/Toast/Toast.vue.d.ts.map +1 -1
  74. package/dist/components/ToolTip/ToolTip.vue.d.ts +92 -18
  75. package/dist/components/ToolTip/ToolTip.vue.d.ts.map +1 -1
  76. package/dist/components/Tour/Tour.vue.d.ts +6 -6
  77. package/dist/components/Tour/TourPopover.vue.d.ts +6 -6
  78. package/dist/components/UploadArea/UploadArea.vue.d.ts +6 -6
  79. package/dist/components/ui/dialog/Dialog.vue.d.ts +23 -0
  80. package/dist/components/ui/dialog/Dialog.vue.d.ts.map +1 -0
  81. package/dist/components/ui/dialog/DialogClose.vue.d.ts +19 -0
  82. package/dist/components/ui/dialog/DialogClose.vue.d.ts.map +1 -0
  83. package/dist/components/ui/dialog/DialogContent.vue.d.ts +43 -0
  84. package/dist/components/ui/dialog/DialogContent.vue.d.ts.map +1 -0
  85. package/dist/components/ui/dialog/DialogFooter.vue.d.ts +25 -0
  86. package/dist/components/ui/dialog/DialogFooter.vue.d.ts.map +1 -0
  87. package/dist/components/ui/dialog/DialogHeader.vue.d.ts +29 -0
  88. package/dist/components/ui/dialog/DialogHeader.vue.d.ts.map +1 -0
  89. package/dist/components/ui/dialog/DialogTitle.vue.d.ts +23 -0
  90. package/dist/components/ui/dialog/DialogTitle.vue.d.ts.map +1 -0
  91. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts +19 -0
  92. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts.map +1 -0
  93. package/dist/components/ui/dialog/index.d.ts +8 -0
  94. package/dist/components/ui/dialog/index.d.ts.map +1 -0
  95. package/dist/components/ui/drawer/Drawer.vue.d.ts +35 -0
  96. package/dist/components/ui/drawer/Drawer.vue.d.ts.map +1 -0
  97. package/dist/components/ui/drawer/DrawerClose.vue.d.ts +19 -0
  98. package/dist/components/ui/drawer/DrawerClose.vue.d.ts.map +1 -0
  99. package/dist/components/ui/drawer/DrawerContent.vue.d.ts +43 -0
  100. package/dist/components/ui/drawer/DrawerContent.vue.d.ts.map +1 -0
  101. package/dist/components/ui/drawer/DrawerDescription.vue.d.ts +23 -0
  102. package/dist/components/ui/drawer/DrawerDescription.vue.d.ts.map +1 -0
  103. package/dist/components/ui/drawer/DrawerFooter.vue.d.ts +22 -0
  104. package/dist/components/ui/drawer/DrawerFooter.vue.d.ts.map +1 -0
  105. package/dist/components/ui/drawer/DrawerHeader.vue.d.ts +25 -0
  106. package/dist/components/ui/drawer/DrawerHeader.vue.d.ts.map +1 -0
  107. package/dist/components/ui/drawer/DrawerOverlay.vue.d.ts +8 -0
  108. package/dist/components/ui/drawer/DrawerOverlay.vue.d.ts.map +1 -0
  109. package/dist/components/ui/drawer/DrawerTitle.vue.d.ts +23 -0
  110. package/dist/components/ui/drawer/DrawerTitle.vue.d.ts.map +1 -0
  111. package/dist/components/ui/drawer/DrawerTrigger.vue.d.ts +19 -0
  112. package/dist/components/ui/drawer/DrawerTrigger.vue.d.ts.map +1 -0
  113. package/dist/components/ui/drawer/index.d.ts +11 -0
  114. package/dist/components/ui/drawer/index.d.ts.map +1 -0
  115. package/dist/components/ui/popover/PopoverContent.vue.d.ts +2 -2
  116. package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -1
  117. package/dist/components/ui/popover/PopoverTrigger.vue.d.ts.map +1 -1
  118. package/dist/components/ui/popover/index.d.ts +0 -1
  119. package/dist/components/ui/popover/index.d.ts.map +1 -1
  120. package/dist/components/ui/tooltip/Tooltip.vue.d.ts +23 -0
  121. package/dist/components/ui/tooltip/Tooltip.vue.d.ts.map +1 -0
  122. package/dist/components/ui/tooltip/TooltipContent.vue.d.ts +31 -0
  123. package/dist/components/ui/tooltip/TooltipContent.vue.d.ts.map +1 -0
  124. package/dist/components/ui/tooltip/TooltipTrigger.vue.d.ts +19 -0
  125. package/dist/components/ui/tooltip/TooltipTrigger.vue.d.ts.map +1 -0
  126. package/dist/components/ui/tooltip/index.d.ts +4 -0
  127. package/dist/components/ui/tooltip/index.d.ts.map +1 -0
  128. package/dist/{es-40d7aad6.mjs → es-4aa88754.mjs} +1 -1
  129. package/dist/{index-56b50ff8.mjs → index-ec96f88a.mjs} +99538 -96746
  130. package/dist/lib/layer-manager.d.ts +16 -0
  131. package/dist/lib/layer-manager.d.ts.map +1 -0
  132. package/dist/{pt-br-e6e2313f.mjs → pt-br-ec1ec185.mjs} +1 -1
  133. package/dist/style.css +1 -1
  134. package/dist/unnnic.mjs +233 -207
  135. package/dist/unnnic.umd.js +48 -44
  136. package/package.json +3 -2
  137. package/src/assets/scss/tailwind.scss +8 -0
  138. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +1 -1
  139. package/src/components/ChartFunnel/DefaultFunnel/ChartDefaultFunnelBase.vue +2 -1
  140. package/src/components/ChartFunnel/SvgFunnel/ChartFunnelTwoRows.vue +61 -60
  141. package/src/components/Checkbox/Checkbox.vue +2 -8
  142. package/src/components/CheckboxGroup/CheckboxGroup.vue +5 -7
  143. package/src/components/Chip/Chip.vue +1 -1
  144. package/src/components/Drawer/Drawer.vue +180 -270
  145. package/src/components/Drawer/__tests__/Drawer.spec.js +32 -43
  146. package/src/components/Drawer/__tests__/__snapshots__/Drawer.spec.js.snap +18 -19
  147. package/src/components/FormElement/FormElement.vue +87 -96
  148. package/src/components/Input/Input.vue +2 -2
  149. package/src/components/ModalDialog/ModalDialog.vue +64 -148
  150. package/src/components/ModalDialog/__tests__/ModalDialog.spec.js +11 -221
  151. package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -22
  152. package/src/components/Radio/Radio.vue +6 -12
  153. package/src/components/Radio/__test__/Radio.spec.js +1 -3
  154. package/src/components/RadioGroup/RadioGroup.vue +10 -18
  155. package/src/components/Switch/Switch.vue +3 -10
  156. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +3 -1
  157. package/src/components/TemplatePreview/TemplatePreview.vue +25 -28
  158. package/src/components/TemplatePreview/TemplatePreviewModal.vue +10 -10
  159. package/src/components/TemplatePreview/types.d.ts +3 -3
  160. package/src/components/Toast/Toast.vue +4 -1
  161. package/src/components/ToolTip/ToolTip.vue +25 -177
  162. package/src/components/ToolTip/__tests__/ToolTip.spec.js +339 -61
  163. package/src/components/index.ts +56 -0
  164. package/src/components/ui/dialog/Dialog.vue +19 -0
  165. package/src/components/ui/dialog/DialogClose.vue +29 -0
  166. package/src/components/ui/dialog/DialogContent.vue +140 -0
  167. package/src/components/ui/dialog/DialogFooter.vue +50 -0
  168. package/src/components/ui/dialog/DialogHeader.vue +83 -0
  169. package/src/components/ui/dialog/DialogTitle.vue +38 -0
  170. package/src/components/ui/dialog/DialogTrigger.vue +16 -0
  171. package/src/components/ui/dialog/index.ts +7 -0
  172. package/src/components/ui/drawer/Drawer.vue +27 -0
  173. package/src/components/ui/drawer/DrawerClose.vue +31 -0
  174. package/src/components/ui/drawer/DrawerContent.vue +111 -0
  175. package/src/components/ui/drawer/DrawerDescription.vue +40 -0
  176. package/src/components/ui/drawer/DrawerFooter.vue +38 -0
  177. package/src/components/ui/drawer/DrawerHeader.vue +57 -0
  178. package/src/components/ui/drawer/DrawerOverlay.vue +33 -0
  179. package/src/components/ui/drawer/DrawerTitle.vue +37 -0
  180. package/src/components/ui/drawer/DrawerTrigger.vue +31 -0
  181. package/src/components/ui/drawer/index.ts +10 -0
  182. package/src/components/ui/popover/PopoverContent.vue +4 -2
  183. package/src/components/ui/popover/PopoverTrigger.vue +5 -1
  184. package/src/components/ui/tooltip/Tooltip.vue +21 -0
  185. package/src/components/ui/tooltip/TooltipContent.vue +74 -0
  186. package/src/components/ui/tooltip/TooltipTrigger.vue +26 -0
  187. package/src/components/ui/tooltip/index.ts +3 -0
  188. package/src/lib/layer-manager.ts +92 -0
  189. package/src/stories/Dialog.stories.js +832 -0
  190. package/src/stories/Drawer.stories.js +1 -1
  191. package/src/stories/DrawerNext.stories.js +611 -0
  192. package/src/stories/LayerManager.docs.mdx +40 -0
  193. package/src/stories/LayerManager.stories.js +364 -0
  194. package/src/stories/ModalDialog.mdx +3 -0
  195. package/src/stories/ModalDialog.stories.js +1 -1
  196. package/src/stories/TemplatePreview.stories.js +27 -27
  197. package/src/stories/TemplatePreviewModal.stories.js +31 -31
  198. package/dist/components/ui/popover/PopoverOption.vue.d.ts +0 -18
  199. package/dist/components/ui/popover/PopoverOption.vue.d.ts.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { mount } from '@vue/test-utils';
2
- import { describe, it, vi } from 'vitest';
2
+ import { describe, it } from 'vitest';
3
3
  import ModalDialog from '../ModalDialog.vue';
4
4
 
5
5
  describe('ModalDialog.vue', () => {
@@ -16,7 +16,12 @@ describe('ModalDialog.vue', () => {
16
16
  'onUpdate:modelValue': (e) => wrapper.setProps({ modelValue: e }),
17
17
  },
18
18
  global: {
19
- stubs: ['UnnnicIcon', 'UnnnicButton'],
19
+ stubs: [
20
+ 'teleport',
21
+ 'UnnnicIcon',
22
+ 'UnnnicButton',
23
+ 'UnnnicDialogContent',
24
+ ],
20
25
  },
21
26
  });
22
27
  });
@@ -26,231 +31,16 @@ describe('ModalDialog.vue', () => {
26
31
  expect(wrapper.html()).toMatchSnapshot();
27
32
  });
28
33
 
29
- it('should render correctly when modelValue is true', () => {
30
- const modal = wrapper.find('[data-testid="modal-dialog"]');
31
- expect(modal.exists()).toBe(true);
32
- });
33
-
34
- it('should not render when modelValue is false', async () => {
35
- await wrapper.setProps({ modelValue: false });
36
-
37
- const modal = wrapper.find('[data-testid="modal-dialog"]');
38
- expect(modal.exists()).toBe(false);
39
- });
40
-
41
34
  it('should apply the correct size class based on the size prop', async () => {
42
- const modalContainer = wrapper.find('[data-testid="modal-container"]');
43
- const defaultClass = 'unnnic-modal-dialog__container';
35
+ const modalContainer = wrapper.find('[data-testid="modal-dialog"]');
44
36
 
45
- expect(modalContainer.classes()).toContain(defaultClass + '--md');
37
+ expect(modalContainer.attributes('size')).toContain('medium');
46
38
 
47
39
  await wrapper.setProps({ size: 'lg' });
48
- expect(modalContainer.classes()).toContain(defaultClass + '--lg');
40
+ expect(modalContainer.attributes('size')).toContain('large');
49
41
 
50
42
  await wrapper.setProps({ size: 'sm' });
51
- expect(modalContainer.classes()).toContain(defaultClass + '--sm');
52
- });
53
-
54
- it('should render the icon and title when provided', () => {
55
- const title = wrapper.find('[data-testid="title-text"]');
56
- expect(title.exists()).toBe(true);
57
- expect(title.text()).toBe('Test Title');
58
-
59
- const icon = wrapper.findComponent('[data-testid="title-icon"]');
60
- expect(icon.exists()).toBe(true);
61
- expect(icon.props('icon')).toBe('test-icon');
62
- });
63
-
64
- it('should render the icon from iconsMapper when type prop is provided', async () => {
65
- await wrapper.setProps({
66
- type: 'success',
67
- icon: '',
68
- });
69
-
70
- const icon = wrapper.findComponent('[data-testid="title-icon"]');
71
- expect(icon.exists()).toBe(true);
72
- expect(icon.props().icon).toBe(wrapper.vm.iconsMapper['success'].icon);
73
- });
74
-
75
- it('should not render the icon when both icon and type props are not provided', async () => {
76
- await wrapper.setProps({
77
- icon: '',
78
- type: '',
79
- });
80
-
81
- const icon = wrapper.find('[data-testid="title-icon"]');
82
- expect(icon.exists()).toBe(false);
83
- });
84
-
85
- it('should render the close icon when showCloseIcon is true', () => {
86
- const closeIcon = wrapper.find('[data-testid="close-icon"]');
87
- expect(closeIcon.exists()).toBe(true);
88
- });
89
-
90
- it('should not render buttons when primaryButtonProps is not provided', async () => {
91
- await wrapper.setProps({ primaryButtonProps: undefined });
92
-
93
- const primaryButton = wrapper.find('[data-testid="primary-button"]');
94
- const secondaryButton = wrapper.find('[data-testid="secondary-button"]');
95
- expect(primaryButton.exists()).toBe(false);
96
- expect(secondaryButton.exists()).toBe(false);
97
- });
98
- });
99
-
100
- describe('Overlay behavior', () => {
101
- it('should close the modal when clicking on the overlay if persistent is false', async () => {
102
- expect(wrapper.props().modelValue).toBe(true);
103
-
104
- const overlay = wrapper.find('[data-testid="modal-overlay"]');
105
- await overlay.trigger('click');
106
-
107
- expect(wrapper.emitted('update:modelValue')).toBeTruthy();
108
- expect(wrapper.emitted('update:modelValue')[0]).toEqual([false]);
109
- expect(wrapper.props().modelValue).toBe(false);
110
- });
111
-
112
- it('should not close the modal when clicking on the overlay if persistent is true', async () => {
113
- await wrapper.setProps({ persistent: true });
114
-
115
- const overlay = wrapper.find('[data-testid="modal-overlay"]');
116
- await overlay.trigger('click');
117
-
118
- expect(wrapper.emitted('update:modelValue')).toBeFalsy();
119
- expect(wrapper.props().modelValue).toBe(true);
120
- });
121
- });
122
-
123
- describe('Slot rendering', () => {
124
- it('should render leftSidebar slot when provided', () => {
125
- const wrapper = mount(ModalDialog, {
126
- props: {
127
- modelValue: true,
128
- },
129
- slots: {
130
- leftSidebar:
131
- '<div data-testid="left-sidebar">Left Sidebar Content</div>',
132
- },
133
- });
134
-
135
- const leftSidebar = wrapper.find('[data-testid="left-sidebar"]');
136
- expect(leftSidebar.exists()).toBe(true);
137
- expect(leftSidebar.text()).toBe('Left Sidebar Content');
138
- });
139
-
140
- it('should render default slot content', () => {
141
- const wrapper = mount(ModalDialog, {
142
- props: {
143
- modelValue: true,
144
- },
145
- slots: {
146
- default: '<div data-testid="default-slot">Default Slot Content</div>',
147
- },
148
- });
149
-
150
- const defaultSlot = wrapper.find('[data-testid="default-slot"]');
151
- expect(defaultSlot.exists()).toBe(true);
152
- expect(defaultSlot.text()).toBe('Default Slot Content');
153
- });
154
- });
155
-
156
- describe('Buttons actions', () => {
157
- it('should close the modal when clicking on close icon', async () => {
158
- const closeIcon = wrapper.find('[data-testid="close-icon"]');
159
- await closeIcon.trigger('click');
160
-
161
- expect(wrapper.emitted('update:modelValue')).toBeTruthy();
162
- expect(wrapper.emitted('update:modelValue')[0]).toEqual([false]);
163
- expect(wrapper.props().modelValue).toBe(false);
164
- });
165
-
166
- it('should emit primaryButtonClick event when the primary button is clicked', async () => {
167
- const primaryButton = wrapper.find('[data-testid="primary-button"]');
168
- await primaryButton.trigger('click');
169
-
170
- expect(wrapper.emitted('primaryButtonClick')).toBeTruthy();
171
- });
172
-
173
- it('should emit secondaryButtonClick event when the secondary button is clicked', async () => {
174
- await wrapper.setProps({
175
- secondaryButtonProps: { text: 'Cancel' },
176
- });
177
-
178
- const secondaryButton = wrapper.find('[data-testid="secondary-button"]');
179
- await secondaryButton.trigger('click');
180
-
181
- expect(wrapper.emitted('secondaryButtonClick')).toBeTruthy();
182
- });
183
-
184
- it('should close the modal when the secondary button is clicked and no secondaryButtonClick event is provided', async () => {
185
- const secondaryButton = wrapper.find('[data-testid="secondary-button"]');
186
- await secondaryButton.trigger('click');
187
-
188
- const emittedValue = wrapper.emitted('update:modelValue');
189
-
190
- expect(emittedValue).toBeTruthy();
191
- expect(emittedValue[0][0]).toEqual(false);
192
- });
193
- });
194
-
195
- describe('Actions and appearance', () => {
196
- it('should not render the secondary button when hideSecondaryButton is true', async () => {
197
- await wrapper.setProps({
198
- hideSecondaryButton: true,
199
- });
200
- const secondaryButton = wrapper.find('[data-testid="secondary-button"]');
201
- expect(secondaryButton.exists()).toBe(false);
202
- });
203
-
204
- it('should apply a divider class to the actions section when showActionsDivider is true', async () => {
205
- await wrapper.setProps({
206
- showActionsDivider: true,
207
- });
208
-
209
- const actionsSection = wrapper.find('[data-testid="actions-section"]');
210
- expect(actionsSection.classes()).toContain(
211
- 'unnnic-modal-dialog__container__actions--divider',
212
- );
213
- });
214
- });
215
-
216
- describe('Body overflow', () => {
217
- it('should toggle body overflow based on modal visibility', async () => {
218
- await wrapper.setProps({ modelValue: false });
219
- const updateBodyOverflowSpy = vi.spyOn(wrapper.vm, 'updateBodyOverflow');
220
-
221
- await wrapper.setProps({ modelValue: true });
222
- expect(updateBodyOverflowSpy).toHaveBeenCalledWith(true);
223
-
224
- await wrapper.setProps({ modelValue: false });
225
- expect(updateBodyOverflowSpy).toHaveBeenCalledWith(false);
226
- });
227
- });
228
-
229
- describe('Validators', () => {
230
- describe('type prop validator', () => {
231
- it('should validate type prop when a valid value is provided', () => {
232
- const validTypes = ['success', 'warning', 'attention'];
233
- validTypes.forEach((validType) => {
234
- expect(ModalDialog.props.type.validate(validType)).toBe(true);
235
- });
236
- });
237
-
238
- it('should invalidate type prop when an invalid value is provided', () => {
239
- expect(ModalDialog.props.type.validate('invalidType')).toBe(false);
240
- });
241
- });
242
-
243
- describe('size prop validator', () => {
244
- it('should validate size prop when a valid value is provided', () => {
245
- const validSizes = ['sm', 'md', 'lg'];
246
- validSizes.forEach((validSize) => {
247
- expect(ModalDialog.props.size.validate(validSize)).toBe(true);
248
- });
249
- });
250
-
251
- it('should invalidate size prop when an invalid value is provided', () => {
252
- expect(ModalDialog.props.size.validate('invalidSize')).toBe(false);
253
- });
43
+ expect(modalContainer.attributes('size')).toContain('small');
254
44
  });
255
45
  });
256
46
  });
@@ -1,24 +1,3 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`ModalDialog.vue > Elements rendering > matches the snapshot 1`] = `
4
- "<section data-v-68ebadeb="" class="unnnic-modal-dialog" data-testid="modal-dialog">
5
- <section data-v-68ebadeb="" class="unnnic-modal-dialog__overlay" data-testid="modal-overlay"></section>
6
- <section data-v-68ebadeb="" class="unnnic-modal-dialog__container unnnic-modal-dialog__container--md" data-testid="modal-container">
7
- <!--v-if-->
8
- <section data-v-68ebadeb="" class="unnnic-modal-dialog__container__body">
9
- <header data-v-68ebadeb="" class="unnnic-modal-dialog__container__header">
10
- <section data-v-68ebadeb="" class="unnnic-modal-dialog__container__title-container">
11
- <unnnic-icon-stub data-v-68ebadeb="" filled="false" icon="test-icon" clickable="false" size="md" scheme="neutral-darkest" data-testid="title-icon" class="unnnic-modal-dialog__container__title-icon"></unnnic-icon-stub>
12
- <h1 data-v-68ebadeb="" class="unnnic-modal-dialog__container__title-text" data-testid="title-text">Test Title</h1>
13
- </section>
14
- <unnnic-icon-stub data-v-68ebadeb="" filled="false" icon="close" clickable="true" size="md" scheme="neutral-cloudy" data-testid="close-icon"></unnnic-icon-stub>
15
- </header>
16
- <section data-v-68ebadeb="" class="unnnic-modal-dialog__container__content"></section>
17
- <section data-v-68ebadeb="" data-testid="actions-section" class="unnnic-modal-dialog__container__actions">
18
- <unnnic-button-stub data-v-68ebadeb="" size="large" text="Cancel" type="tertiary" float="false" iconleft="" iconright="" iconcenter="" iconsfilled="false" disabled="false" loading="false" data-testid="secondary-button" class="unnnic-modal-dialog__container__actions__secondary-button"></unnnic-button-stub>
19
- <unnnic-button-stub data-v-68ebadeb="" size="large" text="Confirm" type="primary" float="false" iconleft="" iconright="" iconcenter="" iconsfilled="false" disabled="false" loading="false" data-testid="primary-button" class="unnnic-modal-dialog__container__actions__primary-button"></unnnic-button-stub>
20
- </section>
21
- </section>
22
- </section>
23
- </section>"
24
- `;
3
+ exports[`ModalDialog.vue > Elements rendering > matches the snapshot 1`] = `"<unnnic-dialog-content-stub data-v-68ebadeb="" forcemount="false" disableoutsidepointerevents="false" aschild="false" parentclass="unnnic-modal-dialog," class="unnnic-modal-dialog__container" size="medium" data-testid="modal-dialog"></unnnic-dialog-content-stub>"`;
@@ -1,12 +1,7 @@
1
1
  <!-- eslint-disable vue/multi-word-component-names -->
2
2
  <template>
3
3
  <section class="unnnic-radio">
4
- <label
5
- :class="[
6
- 'unnnic-radio__input-wrapper',
7
- { 'unnnic-radio__input-wrapper--disabled': disabled },
8
- ]"
9
- >
4
+ <label :class="['unnnic-radio__input-wrapper', {'unnnic-radio__input-wrapper--disabled': disabled}]">
10
5
  <input
11
6
  class="unnnic-radio__input"
12
7
  type="radio"
@@ -17,12 +12,10 @@
17
12
  v-bind="pick($attrs, ['id'])"
18
13
  />
19
14
 
20
- <p
21
- :class="[
22
- 'unnnic-radio__label',
23
- { 'unnnic-radio__label--disabled': disabled },
24
- ]"
25
- >
15
+ <p :class="[
16
+ 'unnnic-radio__label',
17
+ { 'unnnic-radio__label--disabled': disabled },
18
+ ]">
26
19
  {{ label }}
27
20
  <slot />
28
21
  </p>
@@ -116,6 +109,7 @@ $radio-size: 21px;
116
109
  cursor: not-allowed;
117
110
  }
118
111
  }
112
+
119
113
 
120
114
  &__input {
121
115
  appearance: none;
@@ -43,9 +43,7 @@ describe('Radio.vue', () => {
43
43
 
44
44
  test('applies disabled class when disabled prop is true', async () => {
45
45
  await wrapper.setProps({ disabled: true });
46
- expect(wrapper.find('.unnnic-radio__label').classes()).toContain(
47
- 'unnnic-radio__label--disabled',
48
- );
46
+ expect(wrapper.find('.unnnic-radio__label').classes()).toContain('unnnic-radio__label--disabled');
49
47
  });
50
48
 
51
49
  test('icon changes based on valueName', async () => {
@@ -1,10 +1,8 @@
1
1
  <template>
2
- <section
3
- :class="[
4
- 'unnnic-radio-group__container',
5
- `unnnic-radio-group--state-${state}`,
6
- ]"
7
- >
2
+ <section :class="[
3
+ 'unnnic-radio-group__container',
4
+ `unnnic-radio-group--state-${state}`
5
+ ]">
8
6
  <UnnnicLabel
9
7
  v-if="label"
10
8
  :label="label"
@@ -70,14 +68,11 @@ const emit = defineEmits(['update:modelValue']);
70
68
 
71
69
  const contextModelValue = ref(props.modelValue);
72
70
 
73
- watch(
74
- () => props.modelValue,
75
- (newVal) => {
76
- if (newVal !== contextModelValue.value) {
77
- contextModelValue.value = newVal;
78
- }
79
- },
80
- );
71
+ watch(() => props.modelValue, (newVal) => {
72
+ if (newVal !== contextModelValue.value) {
73
+ contextModelValue.value = newVal;
74
+ }
75
+ });
81
76
 
82
77
  watch(contextModelValue, (newVal) => {
83
78
  if (newVal !== props.modelValue) {
@@ -86,10 +81,7 @@ watch(contextModelValue, (newVal) => {
86
81
  });
87
82
 
88
83
  const computedName = computed(() => {
89
- return (
90
- props.name ||
91
- `unnnic-radio-group-${Math.random().toString(36).substring(2, 15)}`
92
- );
84
+ return props.name || `unnnic-radio-group-${Math.random().toString(36).substring(2, 15)}`;
93
85
  });
94
86
 
95
87
  provide('contextModelValue', contextModelValue);
@@ -8,12 +8,7 @@
8
8
  class="unnnic-switch__label"
9
9
  />
10
10
 
11
- <label
12
- :class="[
13
- 'unnnic-switch__input-wrapper',
14
- { 'unnnic-switch__input-wrapper--disabled': disabled },
15
- ]"
16
- >
11
+ <label :class="['unnnic-switch__input-wrapper', {'unnnic-switch__input-wrapper--disabled': disabled}]">
17
12
  <input
18
13
  class="unnnic-switch__input"
19
14
  type="checkbox"
@@ -83,7 +78,7 @@ export default {
83
78
  type: String,
84
79
  default: '',
85
80
  },
86
-
81
+
87
82
  helper: {
88
83
  type: String,
89
84
  default: '',
@@ -181,9 +176,7 @@ $switch-height: 20px;
181
176
  background-repeat: no-repeat;
182
177
  background-position: 4px center;
183
178
 
184
- transition:
185
- 120ms linear background-position,
186
- 120ms linear background-color;
179
+ transition: 120ms linear background-position, 120ms linear background-color;
187
180
 
188
181
  cursor: pointer;
189
182
 
@@ -4,7 +4,9 @@ exports[`Tab.vue > matches the snapshot 1`] = `
4
4
  "<div data-v-b4e39fac="" class="tab size-md">
5
5
  <header data-v-b4e39fac="" class="tab-header">
6
6
  <ul data-v-b4e39fac="" class="tab-content">
7
- <li data-v-b4e39fac="" class="tab-head">tab1<div data-v-bf0cf546="" data-v-b4e39fac="" class="unnnic-tooltip"><span data-v-26446d8e="" data-v-b4e39fac="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--sm unnnic-icon__size--sm" data-testid="material-icon" translate="no">help</span><span data-v-bf0cf546="" class="unnnic-tooltip-label unnnic-tooltip-label-bottom" data-testid="tooltip-label" style="left: 0px; top: 8px;">Tooltip text <br data-v-bf0cf546=""><!--v-if--></span></div>
7
+ <li data-v-b4e39fac="" class="tab-head">tab1<div data-v-b3d24f2b="" class="unnnic-tooltip-trigger" data-testid="tooltip-trigger" data-state="closed" data-grace-area-trigger=""><span data-v-26446d8e="" data-v-b4e39fac="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--sm unnnic-icon__size--sm" data-testid="material-icon" translate="no">help</span></div>
8
+ <!--teleport start-->
9
+ <!--teleport end-->
8
10
  </li>
9
11
  <li data-v-b4e39fac="" class="tab-head tab-head--active">tab2
10
12
  <!--v-if-->
@@ -75,10 +75,7 @@
75
75
  {{ template?.footer }}
76
76
  </footer>
77
77
  </section>
78
- <footer
79
- v-if="hasButtons"
80
- class="unnnic-template-preview__buttons"
81
- >
78
+ <footer v-if="hasButtons" class="unnnic-template-preview__buttons">
82
79
  <section
83
80
  v-for="(button, index) in template?.buttons"
84
81
  :key="`button-${index}`"
@@ -99,15 +96,15 @@
99
96
  </template>
100
97
 
101
98
  <script lang="ts" setup>
102
- import { computed } from 'vue';
99
+ import { computed } from "vue";
103
100
 
104
- import type { Template } from './types';
101
+ import type { Template } from "./types";
105
102
 
106
- import imagePreview from '../../assets/img/previews/image-preview.png';
107
- import documentPreview from '../../assets/img/previews/doc-preview.png';
108
- import videoPreview from '../../assets/img/previews/video-preview.png';
103
+ import imagePreview from "../../assets/img/previews/image-preview.png";
104
+ import documentPreview from "../../assets/img/previews/doc-preview.png";
105
+ import videoPreview from "../../assets/img/previews/video-preview.png";
109
106
 
110
- import UnnnicIcon from '../Icon.vue';
107
+ import UnnnicIcon from "../Icon.vue";
111
108
 
112
109
  interface Props {
113
110
  template?: Template | null;
@@ -118,30 +115,30 @@ const props = withDefaults(defineProps<Props>(), {
118
115
  });
119
116
 
120
117
  const hasHeader = computed(
121
- () => props.template?.header && props.template.header.type,
118
+ () => props.template?.header && props.template.header.type
122
119
  );
123
120
  const hasHeaderMedia = computed(
124
- () => !!props.template?.header && props.template.header.type === 'MEDIA',
121
+ () => !!props.template?.header && props.template.header.type === "MEDIA"
125
122
  );
126
123
  const hasBody = computed(
127
- () => !!props.template?.body && props.template.body.length > 0,
124
+ () => !!props.template?.body && props.template.body.length > 0
128
125
  );
129
126
  const hasFooter = computed(
130
- () => !!props.template?.footer && props.template.footer.length > 0,
127
+ () => !!props.template?.footer && props.template.footer.length > 0
131
128
  );
132
129
  const hasButtons = computed(
133
- () => !!props.template?.buttons && props.template.buttons.length > 0,
130
+ () => !!props.template?.buttons && props.template.buttons.length > 0
134
131
  );
135
132
  const parsedBody = computed(() => {
136
- if (!hasBody.value) return '';
133
+ if (!hasBody.value) return "";
137
134
 
138
135
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
139
136
  const result = props
140
- .template!.body!.replaceAll('\n', '<br/>')
141
- .replaceAll(/(?:\*)([^*<\n]+)(?:\*)/g, '<strong>$1</strong>')
142
- .replaceAll(/(?:_)([^_<\n]+)(?:_)/g, '<i>$1</i>')
143
- .replaceAll(/(?:~)([^~<\n]+)(?:~)/g, '<s>$1</s>')
144
- .replaceAll(/(?:```)([^```<\n]+)(?:```)/g, '<tt>$1</tt>')
137
+ .template!.body!.replaceAll("\n", "<br/>")
138
+ .replaceAll(/(?:\*)([^*<\n]+)(?:\*)/g, "<strong>$1</strong>")
139
+ .replaceAll(/(?:_)([^_<\n]+)(?:_)/g, "<i>$1</i>")
140
+ .replaceAll(/(?:~)([^~<\n]+)(?:~)/g, "<s>$1</s>")
141
+ .replaceAll(/(?:```)([^```<\n]+)(?:```)/g, "<tt>$1</tt>")
145
142
  .replaceAll(/{{.*?}}/g, (match) => `<strong>${match}</strong>`);
146
143
 
147
144
  return result;
@@ -149,19 +146,19 @@ const parsedBody = computed(() => {
149
146
 
150
147
  const getButtonIcon = (buttonType) => {
151
148
  const buttonMapper = {
152
- PHONE_NUMBER: 'phone',
153
- URL: 'open_in_new',
154
- COPY_CODE: 'content_copy',
155
- FLOW: '',
156
- QUICK_REPLY: 'reply',
149
+ PHONE_NUMBER: "phone",
150
+ URL: "open_in_new",
151
+ COPY_CODE: "content_copy",
152
+ FLOW: "",
153
+ QUICK_REPLY: "reply",
157
154
  };
158
155
 
159
- return buttonMapper[buttonType] || '';
156
+ return buttonMapper[buttonType] || "";
160
157
  };
161
158
  </script>
162
159
 
163
160
  <style lang="scss" scoped>
164
- @use '@/assets/scss/unnnic' as *;
161
+ @use "@/assets/scss/unnnic" as *;
165
162
 
166
163
  .unnnic-template-preview {
167
164
  display: flex;
@@ -1,9 +1,9 @@
1
1
  <template>
2
2
  <UnnnicModalDialog
3
- :modelValue="modelValue"
3
+ :model-value="modelValue"
4
4
  @update:modelValue="$event === false && $emit('close')"
5
5
  :title="defaultTranslations.title[props.locale]"
6
- :showCloseIcon="true"
6
+ :show-close-icon="true"
7
7
  class="unnnic-template-preview-modal"
8
8
  >
9
9
  <UnnnicTemplatePreview :template="template" />
@@ -11,16 +11,16 @@
11
11
  </template>
12
12
 
13
13
  <script lang="ts" setup>
14
- import UnnnicTemplatePreview from './TemplatePreview.vue';
15
- import UnnnicModalDialog from '../ModalDialog/ModalDialog.vue';
14
+ import UnnnicTemplatePreview from "./TemplatePreview.vue";
15
+ import UnnnicModalDialog from "../ModalDialog/ModalDialog.vue";
16
16
 
17
- import type { Template } from './types';
17
+ import type { Template } from "./types";
18
18
 
19
19
  const defaultTranslations = {
20
20
  title: {
21
- 'pt-br': 'Visualizar modelo',
22
- en: 'Template preview',
23
- es: 'Vista previa de plantilla',
21
+ "pt-br": "Visualizar modelo",
22
+ en: "Template preview",
23
+ es: "Vista previa de plantilla",
24
24
  },
25
25
  };
26
26
 
@@ -31,7 +31,7 @@ interface Props {
31
31
  }
32
32
 
33
33
  const props = withDefaults(defineProps<Props>(), {
34
- locale: 'en',
34
+ locale: "en",
35
35
  });
36
36
 
37
37
  defineEmits<{
@@ -40,7 +40,7 @@ defineEmits<{
40
40
  </script>
41
41
 
42
42
  <style lang="scss" scoped>
43
- @use '@/assets/scss/unnnic' as *;
43
+ @use "@/assets/scss/unnnic" as *;
44
44
 
45
45
  :deep(.unnnic-modal-dialog__container__content) {
46
46
  display: flex;
@@ -1,14 +1,14 @@
1
1
  export interface Template {
2
2
  header: {
3
- type: 'TEXT' | 'MEDIA';
4
- mediaType?: 'IMAGE' | 'VIDEO' | 'DOCUMENT';
3
+ type: "TEXT" | "MEDIA";
4
+ mediaType?: "IMAGE" | "VIDEO" | "DOCUMENT";
5
5
  text?: string | null;
6
6
  src?: string | null;
7
7
  };
8
8
  body?: string;
9
9
  footer?: string;
10
10
  buttons?: Array<{
11
- type: 'QUICK_REPLY' | 'PHONE_NUMBER';
11
+ type: "QUICK_REPLY" | "PHONE_NUMBER";
12
12
  text: string;
13
13
  countryCode?: string;
14
14
  phoneNumber?: string;
@@ -11,6 +11,7 @@
11
11
  :role="type === 'error' ? 'alert' : 'status'"
12
12
  :aria-live="type === 'error' ? 'assertive' : 'polite'"
13
13
  data-testid="toast"
14
+ :style="{ zIndex: toastZIndex }"
14
15
  >
15
16
  <section
16
17
  class="unnnic-toast__content"
@@ -74,6 +75,7 @@ import { ref, computed, onMounted, onUnmounted } from 'vue';
74
75
 
75
76
  import UnnnicIcon from '@/components/Icon.vue';
76
77
  import UnnnicButton from '@/components/Button/Button.vue';
78
+ import { useLayerZIndex } from '@/lib/layer-manager';
77
79
 
78
80
  import type { ToastProps, ToastEmits } from './types';
79
81
  import type { SchemeColor } from '@/types/scheme-colors';
@@ -109,6 +111,8 @@ const typeConfig = computed(() => {
109
111
  };
110
112
  });
111
113
 
114
+ const toastZIndex = useLayerZIndex('toast');
115
+
112
116
  const handleClose = () => {
113
117
  isVisible.value = false;
114
118
  emit('close');
@@ -152,7 +156,6 @@ onUnmounted(() => {
152
156
  position: fixed;
153
157
  bottom: $unnnic-space-4;
154
158
  right: $unnnic-space-4;
155
- z-index: 9999;
156
159
 
157
160
  display: flex;
158
161
  align-items: flex-end;