@weni/unnnic-system 3.2.9-alpha.7 → 3.2.9

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 (196) hide show
  1. package/CHANGELOG.md +2 -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 +27 -149
  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 -28
  65. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  66. package/dist/components/Input/Input.vue.d.ts +27 -149
  67. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  68. package/dist/components/Input/TextInput.vue.d.ts +13 -67
  69. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  70. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +37 -159
  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 +35 -157
  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 +7 -7
  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 +2 -2
  84. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +27 -81
  85. package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +8 -8
  86. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +4 -4
  87. package/dist/components/SelectTime/index.vue.d.ts +13 -67
  88. package/dist/components/SkeletonLoading/skeletonTheme.vue.d.ts +1 -1
  89. package/dist/components/Slider/Slider.vue.d.ts +2 -2
  90. package/dist/components/StarRating/StarRating.vue.d.ts +1 -1
  91. package/dist/components/Switch/Switch.vue.d.ts +2 -2
  92. package/dist/components/Tab/Tab.vue.d.ts +2 -13
  93. package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
  94. package/dist/components/TableNext/TablePagination.vue.d.ts +6 -6
  95. package/dist/components/TabsExpanded/TabsExpanded.vue.d.ts +1 -1
  96. package/dist/components/Tag/BrandTag.vue.d.ts +2 -2
  97. package/dist/components/Tag/DefaultTag.vue.d.ts +2 -2
  98. package/dist/components/Tag/IndicatorTag.vue.d.ts +2 -2
  99. package/dist/components/Tag/Tag.vue.d.ts +8 -8
  100. package/dist/components/TextArea/TextArea.vue.d.ts +32 -38
  101. package/dist/components/TextArea/TextArea.vue.d.ts.map +1 -1
  102. package/dist/components/ToolTip/ToolTip.vue.d.ts +1 -1
  103. package/dist/components/Tour/Tour.vue.d.ts +6 -6
  104. package/dist/components/Tour/TourPopover.vue.d.ts +6 -6
  105. package/dist/components/UploadArea/UploadArea.vue.d.ts +7 -7
  106. package/dist/components/index.d.ts +1079 -1889
  107. package/dist/components/index.d.ts.map +1 -1
  108. package/dist/{es-1bd57600.js → es-1ca6f2cf.mjs} +1 -1
  109. package/dist/{index-4cd729ce.js → index-ca7d12b1.mjs} +8247 -8577
  110. package/dist/locales/en.json.d.ts +1 -2
  111. package/dist/locales/es.json.d.ts +1 -2
  112. package/dist/locales/pt_br.json.d.ts +1 -2
  113. package/dist/{pt-br-59f06c05.js → pt-br-2d5000b1.mjs} +1 -1
  114. package/dist/style.css +1 -1
  115. package/dist/unnnic.mjs +182 -0
  116. package/dist/{unnnic.umd.cjs → unnnic.umd.js} +41 -42
  117. package/dist/utils/call.d.ts +1 -2
  118. package/dist/utils/call.d.ts.map +1 -1
  119. package/package.json +3 -3
  120. package/src/assets/scss/scheme-colors.scss +4 -131
  121. package/src/assets/tokens/colors.json +2 -2
  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/Button/Button.vue +108 -60
  129. package/src/components/Button/types.ts +1 -0
  130. package/src/components/FormElement/FormElement.vue +91 -51
  131. package/src/components/Input/BaseInput.vue +14 -22
  132. package/src/components/Input/Input.scss +21 -19
  133. package/src/components/Input/Input.vue +29 -85
  134. package/src/components/Input/TextInput.vue +42 -39
  135. package/src/components/Input/__test__/TextInput.spec.js +5 -5
  136. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +3 -12
  137. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -1
  138. package/src/components/Label/Label.vue +21 -52
  139. package/src/components/Label/__tests__/Label.spec.js +1 -1
  140. package/src/components/Label/__tests__/__snapshots__/Label.spec.js.snap +1 -1
  141. package/src/components/ModalDialog/ModalDialog.vue +0 -1
  142. package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -1
  143. package/src/components/Tab/Tab.vue +23 -37
  144. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
  145. package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
  146. package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
  147. package/src/components/TextArea/TextArea.vue +9 -13
  148. package/src/components/TextArea/__test__/__snapshots__/TextArea.spec.js.snap +2 -7
  149. package/src/components/index.ts +4 -18
  150. package/src/locales/en.json +1 -2
  151. package/src/locales/es.json +1 -2
  152. package/src/locales/pt_br.json +1 -2
  153. package/src/stories/Alert.stories.js +67 -6
  154. package/src/stories/Button.stories.js +17 -2
  155. package/src/stories/Input.stories.js +3 -16
  156. package/src/stories/Label.stories.js +0 -7
  157. package/src/stories/Tab.stories.js +4 -11
  158. package/src/types/scheme-colors.d.ts +14 -120
  159. package/src/utils/call.js +18 -46
  160. package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts +0 -9
  161. package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts.map +0 -1
  162. package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts +0 -15
  163. package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts.map +0 -1
  164. package/dist/components/Toast/Toast.vue.d.ts +0 -16
  165. package/dist/components/Toast/Toast.vue.d.ts.map +0 -1
  166. package/dist/components/Toast/ToastManager.d.ts +0 -14
  167. package/dist/components/Toast/ToastManager.d.ts.map +0 -1
  168. package/dist/components/Toast/types.d.ts +0 -35
  169. package/dist/components/Toast/types.d.ts.map +0 -1
  170. package/dist/unnnic.js +0 -188
  171. package/src/assets/img/previews/doc-preview.png +0 -0
  172. package/src/assets/img/previews/image-preview.png +0 -0
  173. package/src/assets/img/previews/video-preview.png +0 -0
  174. package/src/components/Popover/__tests__/Popover.spec.js +0 -147
  175. package/src/components/Popover/__tests__/__snapshots__/Popover.spec.js.snap +0 -8
  176. package/src/components/Popover/index.vue +0 -146
  177. package/src/components/Select/SelectOption.vue +0 -65
  178. package/src/components/Select/__tests__/Select.spec.js +0 -412
  179. package/src/components/Select/__tests__/SelectItem.spec.js +0 -330
  180. package/src/components/Select/__tests__/SelectOption.spec.js +0 -174
  181. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +0 -93
  182. package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +0 -15
  183. package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +0 -25
  184. package/src/components/Select/index.vue +0 -243
  185. package/src/components/TemplatePreview/TemplatePreview.vue +0 -252
  186. package/src/components/TemplatePreview/TemplatePreviewModal.vue +0 -51
  187. package/src/components/TemplatePreview/types.d.ts +0 -16
  188. package/src/components/Toast/Toast.vue +0 -236
  189. package/src/components/Toast/ToastManager.ts +0 -110
  190. package/src/components/Toast/types.ts +0 -57
  191. package/src/stories/Popover.stories.js +0 -39
  192. package/src/stories/Select.stories.js +0 -91
  193. package/src/stories/TemplatePreview.stories.js +0 -94
  194. package/src/stories/TemplatePreviewModal.stories.js +0 -110
  195. package/src/stories/Toast.mdx +0 -123
  196. package/src/stories/Toast.stories.js +0 -126
@@ -1,243 +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
- />
24
- </template>
25
- <template #content>
26
- <div class="unnnic-select__content">
27
- <UnnnicInput
28
- v-if="props.enableSearch"
29
- class="unnnic-select__input-search"
30
- :modelValue="props.search"
31
- :placeholder="$t('search')"
32
- iconLeft="search"
33
- @update:modelValue="handleSearch"
34
- />
35
- <UnnnicSelectOption
36
- v-for="(option, index) in filteredOptions"
37
- :key="option[props.itemValue]"
38
- :data-option-index="index"
39
- :label="option[props.itemLabel]"
40
- :active="
41
- option[props.itemValue] === selectedItem?.[props.itemValue]
42
- "
43
- :focused="focusedOptionIndex === index"
44
- :disabled="option.disabled"
45
- @click="handleSelectOption(option)"
46
- />
47
- </div>
48
- </template>
49
- </UnnnicPopover>
50
- </div>
51
- </template>
52
-
53
- <script setup lang="ts">
54
- import { computed, ref, watch, nextTick } from 'vue';
55
- import UnnnicInput from '../Input/Input.vue';
56
- import UnnnicPopover from '../Popover/index.vue';
57
- import UnnnicSelectOption from './SelectOption.vue';
58
- import UnnnicI18n from '../../mixins/i18n';
59
-
60
- defineOptions({
61
- name: 'UnnnicSelect',
62
- mixins: [UnnnicI18n],
63
- });
64
-
65
- interface SelectProps {
66
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
67
- options: Array<{ [key: string]: any }>;
68
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
- modelValue: any;
70
- returnObject?: boolean;
71
- itemLabel?: string;
72
- itemValue?: string;
73
- placeholder?: string;
74
- label?: string;
75
- type?: 'normal' | 'error';
76
- errors?: string | Array<string>;
77
- message?: string;
78
- size?: 'sm' | 'md';
79
- optionsLines?: number;
80
- enableSearch?: boolean;
81
- search?: string;
82
- locale?: string;
83
- disabled?: boolean;
84
- }
85
-
86
- const props = withDefaults(defineProps<SelectProps>(), {
87
- size: 'md',
88
- type: 'normal',
89
- placeholder: '',
90
- optionsLines: 5,
91
- returnObject: false,
92
- itemLabel: 'label',
93
- itemValue: 'value',
94
- locale: 'en',
95
- enableSearch: false,
96
- disabled: false,
97
- });
98
-
99
- const emit = defineEmits<{
100
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
101
- 'update:modelValue': [value: any];
102
- 'update:search': [value: string];
103
- }>();
104
-
105
- const openPopover = ref(false);
106
-
107
- watch(openPopover, () => {
108
- if (!openPopover.value) {
109
- handleSearch('');
110
- } else {
111
- focusedOptionIndex.value = -1;
112
- }
113
-
114
- if (openPopover.value && props.modelValue) {
115
- const selectedOptionIndex = props.options.findIndex(
116
- (option) =>
117
- option[props.itemValue] === selectedItem.value[props.itemValue],
118
- );
119
- scrollToOption(selectedOptionIndex, 'instant', 'center');
120
- }
121
- });
122
-
123
- const handleKeyDown = (event) => {
124
- const { key } = event;
125
- const validKeys = ['ArrowUp', 'ArrowDown', 'Enter'];
126
- if (validKeys.includes(key)) {
127
- event.preventDefault();
128
- if (key === 'ArrowUp') {
129
- if (focusedOptionIndex.value === 0) return;
130
- focusedOptionIndex.value--;
131
- scrollToOption(focusedOptionIndex.value);
132
- }
133
- if (key === 'ArrowDown') {
134
- if (focusedOptionIndex.value === filteredOptions.value.length - 1) return;
135
- focusedOptionIndex.value++;
136
- scrollToOption(focusedOptionIndex.value);
137
- }
138
- if (key === 'Enter') {
139
- handleSelectOption(filteredOptions.value[focusedOptionIndex.value]);
140
- }
141
- }
142
- };
143
-
144
- const focusedOptionIndex = ref<number>(-1);
145
-
146
- const scrollToOption = (
147
- index: number,
148
- behavior: 'smooth' | 'instant' = 'smooth',
149
- block: 'center' | 'start' | 'end' | 'nearest' = 'center',
150
- ) => {
151
- nextTick(() => {
152
- const option = document.querySelector(`[data-option-index="${index}"]`);
153
- if (option) {
154
- option.scrollIntoView({ behavior, block });
155
- }
156
- });
157
- };
158
-
159
- const calculatedMaxHeight = computed(() => {
160
- if (!props.options || props.options.length === 0) return 'unset';
161
- const popoverPadding = 32;
162
- const popoverGap = 4;
163
- // 37 = 21px (height) + 16px (padding)
164
- const fieldsHeight = 37 * props.optionsLines;
165
- const size =
166
- fieldsHeight + popoverPadding + (popoverGap * props.optionsLines - 2);
167
- return `${props.enableSearch ? size + 54 : size}px`;
168
- });
169
-
170
- const selectedItem = computed(() => {
171
- if (props.returnObject) return props.modelValue;
172
-
173
- return props.options.find(
174
- (option) => option[props.itemValue] === props.modelValue,
175
- );
176
- });
177
-
178
- const inputValue = computed(() => {
179
- return selectedItem.value?.[props.itemLabel];
180
- });
181
-
182
- const handleSelectOption = (option) => {
183
- if (
184
- option[props.itemValue] === selectedItem.value?.[props.itemValue] ||
185
- option.disabled
186
- )
187
- return;
188
-
189
- emit(
190
- 'update:modelValue',
191
- props.returnObject ? option : option[props.itemValue],
192
- );
193
- openPopover.value = false;
194
- };
195
-
196
- const handleSearch = (value: string) => {
197
- emit('update:search', value);
198
- };
199
-
200
- const filteredOptions = computed(() => {
201
- if (!props.enableSearch || !props.search) return props.options;
202
-
203
- return props.options.filter(
204
- (option) =>
205
- option[props.itemLabel]
206
- .toLowerCase()
207
- .includes(props.search?.toLowerCase()) ||
208
- option[props.itemValue]
209
- .toLowerCase()
210
- .includes(props.search?.toLowerCase()),
211
- );
212
- });
213
- </script>
214
-
215
- <style lang="scss" scoped>
216
- @use '@/assets/scss/unnnic' as *;
217
-
218
- :deep(.unnnic-select__input) {
219
- cursor: pointer;
220
- }
221
-
222
- :deep(.unnnic-select__input-search) {
223
- > .icon-left {
224
- color: $unnnic-color-fg-base;
225
- }
226
- }
227
-
228
- :deep(.unnnic-select__input) {
229
- > .icon-right {
230
- color: $unnnic-color-fg-base;
231
- }
232
- }
233
-
234
- .unnnic-select {
235
- &__content {
236
- display: flex;
237
- flex-direction: column;
238
- padding: 0;
239
- margin: 0;
240
- gap: $unnnic-space-1;
241
- }
242
- }
243
- </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
- class="unnnic-template-preview__header__media__preview"
17
- v-if="
18
- template?.header.type === 'MEDIA' &&
19
- template?.header.mediaType === 'IMAGE'
20
- "
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
- class="unnnic-template-preview__header__text__preview"
54
- v-else-if="template?.header.type === 'TEXT'"
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
- @update:modelValue="$event === false && $emit('close')"
5
- :title="defaultTranslations.title[props.locale]"
6
- :showCloseIcon="true"
7
- class="unnnic-template-preview-modal"
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
- }