@weni/unnnic-system 3.3.1-alpha.3 → 3.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/dist/components/Accordion/Accordion.vue.d.ts +1 -1
  3. package/dist/components/Alert/Alert.vue.d.ts +119 -18
  4. package/dist/components/Alert/Alert.vue.d.ts.map +1 -1
  5. package/dist/components/Alert/Version1dot1.vue.d.ts +38 -2
  6. package/dist/components/Alert/Version1dot1.vue.d.ts.map +1 -1
  7. package/dist/components/AudioRecorder/AudioHandler.vue.d.ts +2 -2
  8. package/dist/components/AudioRecorder/AudioPlayer.vue.d.ts +1 -1
  9. package/dist/components/AudioRecorder/AudioRecorder.vue.d.ts +5 -5
  10. package/dist/components/AvatarIcon/AvatarIcon.vue.d.ts +2 -2
  11. package/dist/components/Banner/Banner.vue.d.ts +1 -1
  12. package/dist/components/Banner/InfoBanner.vue.d.ts +1 -1
  13. package/dist/components/Breadcrumb/Breadcrumb.vue.d.ts +1 -1
  14. package/dist/components/Button/Button.vue.d.ts +2 -2
  15. package/dist/components/Button/Button.vue.d.ts.map +1 -1
  16. package/dist/components/Button/ButtonIcon.vue.d.ts +1 -1
  17. package/dist/components/Button/types.d.ts +1 -1
  18. package/dist/components/Button/types.d.ts.map +1 -1
  19. package/dist/components/Card/AccountCard.vue.d.ts +3 -3
  20. package/dist/components/Card/BlankCard.vue.d.ts +1 -1
  21. package/dist/components/Card/Card.vue.d.ts +21 -21
  22. package/dist/components/Card/CardCompany.vue.d.ts +8 -8
  23. package/dist/components/Card/CardData.vue.d.ts +1 -1
  24. package/dist/components/Card/CardStatusesContainer.vue.d.ts +4 -4
  25. package/dist/components/Card/ContentCard.vue.d.ts +2 -2
  26. package/dist/components/Card/DashCard.vue.d.ts +4 -4
  27. package/dist/components/Card/DefaultCard.vue.d.ts +1 -1
  28. package/dist/components/Card/MarketplaceCard.vue.d.ts +2 -2
  29. package/dist/components/Card/SimpleCard.vue.d.ts +3 -3
  30. package/dist/components/Card/StatusCard.vue.d.ts +2 -2
  31. package/dist/components/Card/TitleCard.vue.d.ts +2 -2
  32. package/dist/components/CardImage/CardImage.vue.d.ts +8 -8
  33. package/dist/components/CardInformation/CardInformation.vue.d.ts +4 -4
  34. package/dist/components/CardProject/CardProject.vue.d.ts +3 -3
  35. package/dist/components/Carousel/Carousel.vue.d.ts +11 -11
  36. package/dist/components/Carousel/TagCarousel.vue.d.ts +9 -9
  37. package/dist/components/ChartBar/ChartBar.vue.d.ts +8 -8
  38. package/dist/components/ChartLine/ChartLine.vue.d.ts +1 -1
  39. package/dist/components/ChatText/ChatText.vue.d.ts +2 -2
  40. package/dist/components/ChatsContact/ChatsContact.vue.d.ts +15 -15
  41. package/dist/components/ChatsDashboardTagLive/ChatsDashboardTagLive.vue.d.ts +1 -1
  42. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts +1 -1
  43. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts.map +1 -1
  44. package/dist/components/ChatsMessage/ChatsMessage.vue.d.ts +5 -5
  45. package/dist/components/ChatsMessage/ChatsMessageStatusBackdrop.vue.d.ts +2 -2
  46. package/dist/components/ChatsNavbar/ChatsNavbar.vue.d.ts +1 -1
  47. package/dist/components/ChatsUserAvatar/ChatsUserAvatar.vue.d.ts +2 -2
  48. package/dist/components/Checkbox/Checkbox.vue.d.ts +3 -3
  49. package/dist/components/Comment/Comment.vue.d.ts +1 -1
  50. package/dist/components/DataArea/DataArea.vue.d.ts +2 -2
  51. package/dist/components/DataTable/index.vue.d.ts +1 -1
  52. package/dist/components/DataTable/index.vue.d.ts.map +1 -1
  53. package/dist/components/DateFilter/DateFilter.vue.d.ts +29 -176
  54. package/dist/components/DatePicker/DatePicker.vue.d.ts +8 -8
  55. package/dist/components/Drawer/Drawer.vue.d.ts +7 -7
  56. package/dist/components/Dropdown/Dropdown.vue.d.ts +1 -1
  57. package/dist/components/Dropdown/LanguageSelect.vue.d.ts +3 -3
  58. package/dist/components/Flag.vue.d.ts +2 -2
  59. package/dist/components/FormElement/FormElement.vue.d.ts +32 -38
  60. package/dist/components/FormElement/FormElement.vue.d.ts.map +1 -1
  61. package/dist/components/Icon.vue.d.ts +1 -1
  62. package/dist/components/IconLoading/IconLoading.vue.d.ts +1 -1
  63. package/dist/components/ImportCard/ImportCard.vue.d.ts +7 -7
  64. package/dist/components/Input/BaseInput.vue.d.ts +1 -32
  65. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  66. package/dist/components/Input/Input.vue.d.ts +29 -176
  67. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  68. package/dist/components/Input/TextInput.vue.d.ts +14 -83
  69. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  70. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +39 -186
  71. package/dist/components/InputNext/InputNext.vue.d.ts +4 -4
  72. package/dist/components/Label/Label.vue.d.ts +15 -9
  73. package/dist/components/Label/Label.vue.d.ts.map +1 -1
  74. package/dist/components/Modal/Modal.vue.d.ts +2 -2
  75. package/dist/components/ModalDialog/ModalDialog.vue.d.ts +9 -9
  76. package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
  77. package/dist/components/ModalNext/ModalNext.vue.d.ts +37 -184
  78. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +14 -14
  79. package/dist/components/MoodRating/MoodRating.vue.d.ts +1 -1
  80. package/dist/components/MultiSelect/MultiSelect.vue.d.ts +14 -20
  81. package/dist/components/Pagination/Pagination.vue.d.ts +6 -6
  82. package/dist/components/ProgressBar/ProgressBar.vue.d.ts +1 -1
  83. package/dist/components/Radio/Radio.vue.d.ts +6 -8
  84. package/dist/components/Radio/Radio.vue.d.ts.map +1 -1
  85. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +28 -97
  86. package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +8 -8
  87. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +4 -4
  88. package/dist/components/SelectTime/index.vue.d.ts +14 -83
  89. package/dist/components/SkeletonLoading/skeletonTheme.vue.d.ts +1 -1
  90. package/dist/components/Slider/Slider.vue.d.ts +2 -2
  91. package/dist/components/StarRating/StarRating.vue.d.ts +1 -1
  92. package/dist/components/Switch/Switch.vue.d.ts +2 -2
  93. package/dist/components/Tab/Tab.vue.d.ts +2 -13
  94. package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
  95. package/dist/components/TableNext/TablePagination.vue.d.ts +6 -6
  96. package/dist/components/TabsExpanded/TabsExpanded.vue.d.ts +1 -1
  97. package/dist/components/Tag/BrandTag.vue.d.ts +2 -2
  98. package/dist/components/Tag/DefaultTag.vue.d.ts +2 -2
  99. package/dist/components/Tag/IndicatorTag.vue.d.ts +2 -2
  100. package/dist/components/Tag/Tag.vue.d.ts +8 -8
  101. package/dist/components/TextArea/TextArea.vue.d.ts +32 -38
  102. package/dist/components/TextArea/TextArea.vue.d.ts.map +1 -1
  103. package/dist/components/ToolTip/ToolTip.vue.d.ts +1 -1
  104. package/dist/components/Tour/Tour.vue.d.ts +6 -6
  105. package/dist/components/Tour/TourPopover.vue.d.ts +6 -6
  106. package/dist/components/UploadArea/UploadArea.vue.d.ts +7 -7
  107. package/dist/components/index.d.ts +1110 -2132
  108. package/dist/components/index.d.ts.map +1 -1
  109. package/dist/{es-94ab560e.mjs → es-54ddaf5a.mjs} +1 -1
  110. package/dist/{index-5caf403e.mjs → index-a34da30f.mjs} +8094 -8447
  111. package/dist/locales/en.json.d.ts +1 -2
  112. package/dist/locales/es.json.d.ts +1 -2
  113. package/dist/locales/pt_br.json.d.ts +1 -2
  114. package/dist/{pt-br-3002df05.mjs → pt-br-ff00f945.mjs} +1 -1
  115. package/dist/style.css +1 -1
  116. package/dist/unnnic.mjs +120 -126
  117. package/dist/unnnic.umd.js +41 -42
  118. package/dist/utils/call.d.ts +1 -2
  119. package/dist/utils/call.d.ts.map +1 -1
  120. package/package.json +2 -2
  121. package/src/assets/scss/scheme-colors.scss +238 -115
  122. package/src/components/Alert/Alert.vue +135 -26
  123. package/src/components/Alert/AlertBanner.vue +182 -0
  124. package/src/components/Alert/AlertCaller.vue +49 -0
  125. package/src/components/Alert/Version1dot1.vue +36 -0
  126. package/src/components/Alert/__tests__/AlertBanner.spec.js +89 -0
  127. package/src/components/Alert/__tests__/AlertCaller.spec.js +98 -0
  128. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +7 -11
  129. package/src/components/Alert/__tests__/__snapshots__/Version1dot1.spec.js.snap +2 -2
  130. package/src/components/Button/Button.vue +108 -60
  131. package/src/components/Button/types.ts +1 -0
  132. package/src/components/FormElement/FormElement.vue +91 -51
  133. package/src/components/Input/BaseInput.vue +14 -31
  134. package/src/components/Input/Input.scss +21 -19
  135. package/src/components/Input/Input.vue +30 -94
  136. package/src/components/Input/TextInput.vue +58 -82
  137. package/src/components/Input/__test__/TextInput.spec.js +5 -5
  138. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +3 -16
  139. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -7
  140. package/src/components/Label/Label.vue +21 -52
  141. package/src/components/Label/__tests__/Label.spec.js +1 -1
  142. package/src/components/Label/__tests__/__snapshots__/Label.spec.js.snap +1 -1
  143. package/src/components/ModalDialog/ModalDialog.vue +0 -1
  144. package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -1
  145. package/src/components/Radio/Radio.vue +67 -80
  146. package/src/components/Radio/__test__/Radio.spec.js +20 -14
  147. package/src/components/Radio/__test__/__snapshots__/Radio.spec.js.snap +3 -3
  148. package/src/components/Tab/Tab.vue +23 -37
  149. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
  150. package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
  151. package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
  152. package/src/components/TextArea/TextArea.vue +9 -13
  153. package/src/components/TextArea/__test__/__snapshots__/TextArea.spec.js.snap +2 -7
  154. package/src/components/index.ts +4 -18
  155. package/src/locales/en.json +1 -2
  156. package/src/locales/es.json +1 -2
  157. package/src/locales/pt_br.json +1 -2
  158. package/src/stories/Alert.stories.js +67 -6
  159. package/src/stories/Button.stories.js +17 -2
  160. package/src/stories/Input.stories.js +3 -22
  161. package/src/stories/Label.stories.js +0 -7
  162. package/src/stories/Tab.stories.js +4 -11
  163. package/src/types/scheme-colors.d.ts +0 -1
  164. package/src/utils/call.js +18 -46
  165. package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts +0 -9
  166. package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts.map +0 -1
  167. package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts +0 -15
  168. package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts.map +0 -1
  169. package/dist/components/Toast/Toast.vue.d.ts +0 -16
  170. package/dist/components/Toast/Toast.vue.d.ts.map +0 -1
  171. package/dist/components/Toast/ToastManager.d.ts +0 -14
  172. package/dist/components/Toast/ToastManager.d.ts.map +0 -1
  173. package/dist/components/Toast/types.d.ts +0 -35
  174. package/dist/components/Toast/types.d.ts.map +0 -1
  175. package/src/assets/icons/radio-checked.svg +0 -3
  176. package/src/assets/img/previews/doc-preview.png +0 -0
  177. package/src/assets/img/previews/image-preview.png +0 -0
  178. package/src/assets/img/previews/video-preview.png +0 -0
  179. package/src/components/Popover/__tests__/Popover.spec.js +0 -147
  180. package/src/components/Popover/__tests__/__snapshots__/Popover.spec.js.snap +0 -8
  181. package/src/components/Popover/index.vue +0 -146
  182. package/src/components/RadioGroup/RadioGroup.vue +0 -110
  183. package/src/components/Select/SelectOption.vue +0 -65
  184. package/src/components/Select/__tests__/Select.spec.js +0 -412
  185. package/src/components/Select/__tests__/SelectItem.spec.js +0 -330
  186. package/src/components/Select/__tests__/SelectOption.spec.js +0 -174
  187. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +0 -97
  188. package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +0 -15
  189. package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +0 -25
  190. package/src/components/Select/index.vue +0 -245
  191. package/src/components/TemplatePreview/TemplatePreview.vue +0 -252
  192. package/src/components/TemplatePreview/TemplatePreviewModal.vue +0 -51
  193. package/src/components/TemplatePreview/types.d.ts +0 -16
  194. package/src/components/Toast/Toast.vue +0 -236
  195. package/src/components/Toast/ToastManager.ts +0 -110
  196. package/src/components/Toast/types.ts +0 -57
  197. package/src/stories/Popover.stories.js +0 -39
  198. package/src/stories/RadioGroup.stories.js +0 -139
  199. package/src/stories/Select.stories.js +0 -158
  200. package/src/stories/TemplatePreview.stories.js +0 -94
  201. package/src/stories/TemplatePreviewModal.stories.js +0 -110
  202. package/src/stories/Toast.mdx +0 -123
  203. package/src/stories/Toast.stories.js +0 -126
@@ -1,245 +0,0 @@
1
- <template>
2
- <div
3
- class="unnnic-select"
4
- @keydown="handleKeyDown"
5
- >
6
- <UnnnicPopover
7
- v-model="openPopover"
8
- :popoverBalloonProps="{ maxHeight: calculatedMaxHeight }"
9
- >
10
- <template #trigger>
11
- <UnnnicInput
12
- :modelValue="inputValue"
13
- class="unnnic-select__input"
14
- readonly
15
- :forceActiveStatus="openPopover"
16
- :size="props.size"
17
- :placeholder="props.placeholder"
18
- :label="props.label"
19
- :errors="props.errors"
20
- :message="props.message"
21
- :iconRight="openPopover ? 'keyboard_arrow_up' : 'keyboard_arrow_down'"
22
- :disabled="props.disabled"
23
- showClear
24
- @clear="emit('update:modelValue', '')"
25
- />
26
- </template>
27
- <template #content>
28
- <div class="unnnic-select__content">
29
- <UnnnicInput
30
- v-if="props.enableSearch"
31
- class="unnnic-select__input-search"
32
- :modelValue="props.search"
33
- :placeholder="$t('search')"
34
- iconLeft="search"
35
- @update:model-value="handleSearch"
36
- />
37
- <UnnnicSelectOption
38
- v-for="(option, index) in filteredOptions"
39
- :key="option[props.itemValue]"
40
- :data-option-index="index"
41
- :label="option[props.itemLabel]"
42
- :active="
43
- option[props.itemValue] === selectedItem?.[props.itemValue]
44
- "
45
- :focused="focusedOptionIndex === index"
46
- :disabled="option.disabled"
47
- @click="handleSelectOption(option)"
48
- />
49
- </div>
50
- </template>
51
- </UnnnicPopover>
52
- </div>
53
- </template>
54
-
55
- <script setup lang="ts">
56
- import { computed, ref, watch, nextTick } from 'vue';
57
- import UnnnicInput from '../Input/Input.vue';
58
- import UnnnicPopover from '../Popover/index.vue';
59
- import UnnnicSelectOption from './SelectOption.vue';
60
- import UnnnicI18n from '../../mixins/i18n';
61
-
62
- defineOptions({
63
- name: 'UnnnicSelect',
64
- mixins: [UnnnicI18n],
65
- });
66
-
67
- interface SelectProps {
68
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
- options: Array<{ [key: string]: any }>;
70
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
71
- modelValue: any;
72
- returnObject?: boolean;
73
- itemLabel?: string;
74
- itemValue?: string;
75
- placeholder?: string;
76
- label?: string;
77
- type?: 'normal' | 'error';
78
- errors?: string | Array<string>;
79
- message?: string;
80
- size?: 'sm' | 'md';
81
- optionsLines?: number;
82
- enableSearch?: boolean;
83
- search?: string;
84
- locale?: string;
85
- disabled?: boolean;
86
- }
87
-
88
- const props = withDefaults(defineProps<SelectProps>(), {
89
- size: 'md',
90
- type: 'normal',
91
- placeholder: '',
92
- optionsLines: 5,
93
- returnObject: false,
94
- itemLabel: 'label',
95
- itemValue: 'value',
96
- locale: 'en',
97
- enableSearch: false,
98
- disabled: false,
99
- });
100
-
101
- const emit = defineEmits<{
102
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
- 'update:modelValue': [value: any];
104
- 'update:search': [value: string];
105
- }>();
106
-
107
- const openPopover = ref(false);
108
-
109
- watch(openPopover, () => {
110
- if (!openPopover.value) {
111
- handleSearch('');
112
- } else {
113
- focusedOptionIndex.value = -1;
114
- }
115
-
116
- if (openPopover.value && props.modelValue) {
117
- const selectedOptionIndex = props.options.findIndex(
118
- (option) =>
119
- option[props.itemValue] === selectedItem.value[props.itemValue],
120
- );
121
- scrollToOption(selectedOptionIndex, 'instant', 'center');
122
- }
123
- });
124
-
125
- const handleKeyDown = (event) => {
126
- const { key } = event;
127
- const validKeys = ['ArrowUp', 'ArrowDown', 'Enter'];
128
- if (validKeys.includes(key)) {
129
- event.preventDefault();
130
- if (key === 'ArrowUp') {
131
- if (focusedOptionIndex.value === 0) return;
132
- focusedOptionIndex.value--;
133
- scrollToOption(focusedOptionIndex.value);
134
- }
135
- if (key === 'ArrowDown') {
136
- if (focusedOptionIndex.value === filteredOptions.value.length - 1) return;
137
- focusedOptionIndex.value++;
138
- scrollToOption(focusedOptionIndex.value);
139
- }
140
- if (key === 'Enter') {
141
- handleSelectOption(filteredOptions.value[focusedOptionIndex.value]);
142
- }
143
- }
144
- };
145
-
146
- const focusedOptionIndex = ref<number>(-1);
147
-
148
- const scrollToOption = (
149
- index: number,
150
- behavior: 'smooth' | 'instant' = 'smooth',
151
- block: 'center' | 'start' | 'end' | 'nearest' = 'center',
152
- ) => {
153
- nextTick(() => {
154
- const option = document.querySelector(`[data-option-index="${index}"]`);
155
- if (option) {
156
- option.scrollIntoView({ behavior, block });
157
- }
158
- });
159
- };
160
-
161
- const calculatedMaxHeight = computed(() => {
162
- if (!props.options || props.options.length === 0) return 'unset';
163
- const popoverPadding = 32;
164
- const popoverGap = 4;
165
- // 37 = 21px (height) + 16px (padding)
166
- const fieldsHeight = 37 * props.optionsLines;
167
- const size =
168
- fieldsHeight + popoverPadding + (popoverGap * props.optionsLines - 2);
169
- return `${props.enableSearch ? size + 54 : size}px`;
170
- });
171
-
172
- const selectedItem = computed(() => {
173
- if (props.returnObject) return props.modelValue;
174
-
175
- return props.options.find(
176
- (option) => option[props.itemValue] === props.modelValue,
177
- );
178
- });
179
-
180
- const inputValue = computed(() => {
181
- return selectedItem.value?.[props.itemLabel];
182
- });
183
-
184
- const handleSelectOption = (option) => {
185
- if (
186
- option[props.itemValue] === selectedItem.value?.[props.itemValue] ||
187
- option.disabled
188
- )
189
- return;
190
-
191
- emit(
192
- 'update:modelValue',
193
- props.returnObject ? option : option[props.itemValue],
194
- );
195
- openPopover.value = false;
196
- };
197
-
198
- const handleSearch = (value: string) => {
199
- emit('update:search', value);
200
- };
201
-
202
- const filteredOptions = computed(() => {
203
- if (!props.enableSearch || !props.search) return props.options;
204
-
205
- return props.options.filter(
206
- (option) =>
207
- option[props.itemLabel]
208
- .toLowerCase()
209
- .includes(props.search?.toLowerCase()) ||
210
- option[props.itemValue]
211
- .toLowerCase()
212
- .includes(props.search?.toLowerCase()),
213
- );
214
- });
215
- </script>
216
-
217
- <style lang="scss" scoped>
218
- @use '@/assets/scss/unnnic' as *;
219
-
220
- :deep(.unnnic-select__input) {
221
- cursor: pointer;
222
- }
223
-
224
- :deep(.unnnic-select__input-search) {
225
- > .icon-left {
226
- color: $unnnic-color-fg-base;
227
- }
228
- }
229
-
230
- :deep(.unnnic-select__input) {
231
- > .icon-right {
232
- color: $unnnic-color-fg-base;
233
- }
234
- }
235
-
236
- .unnnic-select {
237
- &__content {
238
- display: flex;
239
- flex-direction: column;
240
- padding: 0;
241
- margin: 0;
242
- gap: $unnnic-space-1;
243
- }
244
- }
245
- </style>
@@ -1,252 +0,0 @@
1
- <template>
2
- <section class="unnnic-template-preview">
3
- <section
4
- :class="[
5
- 'unnnic-template-preview__content',
6
- { 'unnnic-template-preview__content--has-media': hasHeaderMedia },
7
- ]"
8
- >
9
- <header
10
- v-if="hasHeader"
11
- :class="`unnnic-template-preview__header__${
12
- template?.header.type === 'TEXT' ? 'text' : 'media'
13
- }`"
14
- >
15
- <img
16
- v-if="
17
- template?.header.type === 'MEDIA' &&
18
- template?.header.mediaType === 'IMAGE'
19
- "
20
- class="unnnic-template-preview__header__media__preview"
21
- :src="template.header.src || imagePreview"
22
- />
23
- <template
24
- v-else-if="
25
- template?.header.type === 'MEDIA' &&
26
- template?.header.mediaType === 'VIDEO'
27
- "
28
- >
29
- <video
30
- v-if="template.header.src"
31
- class="unnnic-template-preview__header__media__preview"
32
- :src="template.header.src"
33
- controls
34
- />
35
- <img
36
- v-else
37
- class="unnnic-template-preview__header__media__preview"
38
- :src="videoPreview"
39
- />
40
- </template>
41
- <template
42
- v-else-if="
43
- template?.header.type === 'MEDIA' &&
44
- template?.header.mediaType === 'DOCUMENT'
45
- "
46
- >
47
- <img
48
- class="unnnic-template-preview__header__media__preview"
49
- :src="documentPreview"
50
- />
51
- </template>
52
- <h1
53
- v-else-if="template?.header.type === 'TEXT'"
54
- class="unnnic-template-preview__header__text__preview"
55
- >
56
- {{ template.header.text }}
57
- </h1>
58
- </header>
59
- <section
60
- v-if="hasBody"
61
- :class="[
62
- 'unnnic-template-preview__body',
63
- { 'unnnic-template-preview__body--has-media': hasHeaderMedia },
64
- ]"
65
- >
66
- <section v-html="parsedBody"></section>
67
- </section>
68
- <footer
69
- v-if="hasFooter"
70
- :class="[
71
- 'unnnic-template-preview__footer',
72
- { 'unnnic-template-preview__footer--has-media': hasHeaderMedia },
73
- ]"
74
- >
75
- {{ template?.footer }}
76
- </footer>
77
- </section>
78
- <footer
79
- v-if="hasButtons"
80
- class="unnnic-template-preview__buttons"
81
- >
82
- <section
83
- v-for="(button, index) in template?.buttons"
84
- :key="`button-${index}`"
85
- class="unnnic-template-preview__buttons__button"
86
- >
87
- <UnnnicIcon
88
- class="unnnic-template-preview__buttons__button__icon"
89
- :icon="getButtonIcon(button.type)"
90
- scheme="aux-blue-500"
91
- size="ant"
92
- />
93
- <p class="unnnic-template-preview__buttons__button__text">
94
- {{ button.text }}
95
- </p>
96
- </section>
97
- </footer>
98
- </section>
99
- </template>
100
-
101
- <script lang="ts" setup>
102
- import { computed } from 'vue';
103
-
104
- import type { Template } from './types';
105
-
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';
109
-
110
- import UnnnicIcon from '../Icon.vue';
111
-
112
- interface Props {
113
- template?: Template | null;
114
- }
115
-
116
- const props = withDefaults(defineProps<Props>(), {
117
- template: null,
118
- });
119
-
120
- const hasHeader = computed(
121
- () => props.template?.header && props.template.header.type,
122
- );
123
- const hasHeaderMedia = computed(
124
- () => !!props.template?.header && props.template.header.type === 'MEDIA',
125
- );
126
- const hasBody = computed(
127
- () => !!props.template?.body && props.template.body.length > 0,
128
- );
129
- const hasFooter = computed(
130
- () => !!props.template?.footer && props.template.footer.length > 0,
131
- );
132
- const hasButtons = computed(
133
- () => !!props.template?.buttons && props.template.buttons.length > 0,
134
- );
135
- const parsedBody = computed(() => {
136
- if (!hasBody.value) return '';
137
-
138
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
139
- 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>')
145
- .replaceAll(/{{.*?}}/g, (match) => `<strong>${match}</strong>`);
146
-
147
- return result;
148
- });
149
-
150
- const getButtonIcon = (buttonType) => {
151
- const buttonMapper = {
152
- PHONE_NUMBER: 'phone',
153
- URL: 'open_in_new',
154
- COPY_CODE: 'content_copy',
155
- FLOW: '',
156
- QUICK_REPLY: 'reply',
157
- };
158
-
159
- return buttonMapper[buttonType] || '';
160
- };
161
- </script>
162
-
163
- <style lang="scss" scoped>
164
- @use '@/assets/scss/unnnic' as *;
165
-
166
- .unnnic-template-preview {
167
- display: flex;
168
- flex-direction: column;
169
- box-shadow: $unnnic-shadow-level-near;
170
- background-color: $unnnic-color-background-white;
171
- width: 368px;
172
- border-radius: $unnnic-border-radius-md;
173
-
174
- &__content {
175
- display: flex;
176
- flex-direction: column;
177
- gap: $unnnic-space-3;
178
- padding: $unnnic-space-4 $unnnic-space-3;
179
-
180
- &--has-media {
181
- padding: $unnnic-space-1;
182
- }
183
- }
184
-
185
- &__header {
186
- &__text {
187
- &__preview {
188
- font-family: $unnnic-font-family-secondary;
189
- font-weight: $unnnic-font-weight-bold;
190
- font-size: $unnnic-font-size-body-gt;
191
- line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
192
- color: $unnnic-color-neutral-dark;
193
-
194
- margin: $unnnic-space-0;
195
- }
196
- }
197
-
198
- &__media {
199
- &__preview {
200
- width: 100%;
201
- object-fit: cover;
202
- }
203
- }
204
- }
205
-
206
- &__body {
207
- font-family: $unnnic-font-family-secondary;
208
- font-weight: $unnnic-font-weight-regular;
209
- font-size: $unnnic-font-size-body-gt;
210
- line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
211
- color: $unnnic-color-neutral-cloudy;
212
-
213
- &--has-media {
214
- padding: $unnnic-space-0 $unnnic-space-2;
215
- }
216
- }
217
-
218
- &__footer {
219
- font-family: $unnnic-font-family-secondary;
220
- font-weight: $unnnic-font-weight-regular;
221
- font-size: $unnnic-font-size-body-md;
222
- line-height: $unnnic-font-size-body-md + $unnnic-line-height-medium;
223
- color: $unnnic-color-neutral-clean;
224
-
225
- &--has-media {
226
- padding: $unnnic-space-0 $unnnic-space-3 $unnnic-space-2;
227
- }
228
- }
229
-
230
- &__buttons {
231
- font-family: $unnnic-font-family-secondary;
232
- font-weight: $unnnic-font-weight-bold;
233
- font-size: $unnnic-font-size-body-gt;
234
- line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
235
-
236
- &__button {
237
- margin: 0;
238
- display: flex;
239
- align-items: center;
240
- justify-content: center;
241
- gap: $unnnic-space-2;
242
- padding: $unnnic-space-3;
243
- border-top: 1px solid $unnnic-color-neutral-light;
244
-
245
- &__text {
246
- color: $unnnic-color-aux-blue-500;
247
- margin: $unnnic-space-0;
248
- }
249
- }
250
- }
251
- }
252
- </style>
@@ -1,51 +0,0 @@
1
- <template>
2
- <UnnnicModalDialog
3
- :modelValue="modelValue"
4
- :title="defaultTranslations.title[props.locale]"
5
- :showCloseIcon="true"
6
- class="unnnic-template-preview-modal"
7
- @update:model-value="$event === false && $emit('close')"
8
- >
9
- <UnnnicTemplatePreview :template="template" />
10
- </UnnnicModalDialog>
11
- </template>
12
-
13
- <script lang="ts" setup>
14
- import UnnnicTemplatePreview from './TemplatePreview.vue';
15
- import UnnnicModalDialog from '../ModalDialog/ModalDialog.vue';
16
-
17
- import type { Template } from './types';
18
-
19
- const defaultTranslations = {
20
- title: {
21
- 'pt-br': 'Visualizar modelo',
22
- en: 'Template preview',
23
- es: 'Vista previa de plantilla',
24
- },
25
- };
26
-
27
- interface Props {
28
- locale?: string;
29
- template: Template;
30
- modelValue: boolean;
31
- }
32
-
33
- const props = withDefaults(defineProps<Props>(), {
34
- locale: 'en',
35
- });
36
-
37
- defineEmits<{
38
- close: void;
39
- }>();
40
- </script>
41
-
42
- <style lang="scss" scoped>
43
- @use '@/assets/scss/unnnic' as *;
44
-
45
- :deep(.unnnic-modal-dialog__container__content) {
46
- display: flex;
47
- align-items: center;
48
- justify-content: center;
49
- background-color: $unnnic-color-neutral-lightest;
50
- }
51
- </style>
@@ -1,16 +0,0 @@
1
- export interface Template {
2
- header: {
3
- type: 'TEXT' | 'MEDIA';
4
- mediaType?: 'IMAGE' | 'VIDEO' | 'DOCUMENT';
5
- text?: string | null;
6
- src?: string | null;
7
- };
8
- body?: string;
9
- footer?: string;
10
- buttons?: Array<{
11
- type: 'QUICK_REPLY' | 'PHONE_NUMBER';
12
- text: string;
13
- countryCode?: string;
14
- phoneNumber?: string;
15
- }>;
16
- }