@weni/unnnic-system 3.1.0 → 3.1.2-alpha.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 (42) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/components/DatePicker/DatePicker.vue.d.ts +2 -2
  3. package/dist/components/DropArea/DropArea.vue.d.ts +2 -0
  4. package/dist/components/DropArea/DropArea.vue.d.ts.map +1 -1
  5. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +3 -3
  6. package/dist/components/ModalDialog/ModalDialog.vue.d.ts +1 -1
  7. package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
  8. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +6 -0
  9. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +18 -0
  10. package/dist/components/SelectSmart/SelectSmart.vue.d.ts.map +1 -1
  11. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +9 -0
  12. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts.map +1 -1
  13. package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts +9 -0
  14. package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts.map +1 -0
  15. package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts +15 -0
  16. package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts.map +1 -0
  17. package/dist/components/UploadArea/UploadArea.vue.d.ts +6 -0
  18. package/dist/{es-8ee8b336.mjs → es-a3fefe6b.mjs} +1 -1
  19. package/dist/{index-a9c4dc3e.mjs → index-5b99e353.mjs} +9151 -8978
  20. package/dist/{pt-br-1b500883.mjs → pt-br-8aded404.mjs} +1 -1
  21. package/dist/style.css +1 -1
  22. package/dist/unnnic.mjs +26 -24
  23. package/dist/unnnic.umd.js +44 -43
  24. package/package.json +2 -2
  25. package/src/assets/img/previews/doc-preview.png +0 -0
  26. package/src/assets/img/previews/image-preview.png +0 -0
  27. package/src/assets/img/previews/video-preview.png +0 -0
  28. package/src/components/DropArea/DropArea.vue +17 -0
  29. package/src/components/ModalDialog/ModalDialog.vue +27 -29
  30. package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -1
  31. package/src/components/SelectSmart/SelectSmart.vue +22 -1
  32. package/src/components/SelectSmart/SelectSmartMultipleHeader.vue +1 -1
  33. package/src/components/SelectSmart/SelectSmartOption.vue +5 -0
  34. package/src/components/TemplatePreview/TemplatePreview.vue +249 -0
  35. package/src/components/TemplatePreview/TemplatePreviewModal.vue +51 -0
  36. package/src/components/TemplatePreview/types.d.ts +16 -0
  37. package/src/components/index.ts +8 -2
  38. package/src/stories/SelectSmart.stories.js +1 -1
  39. package/src/stories/TemplatePreview.stories.js +94 -0
  40. package/src/stories/TemplatePreviewModal.stories.js +110 -0
  41. package/dist/components/index.d.ts +0 -40344
  42. package/dist/components/index.d.ts.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weni/unnnic-system",
3
- "version": "3.1.0",
3
+ "version": "3.1.2-alpha.1",
4
4
  "type": "commonjs",
5
5
  "files": [
6
6
  "dist",
@@ -99,4 +99,4 @@
99
99
  "vue-eslint-parser": "^9.4.2",
100
100
  "vue-tsc": "^3.0.5"
101
101
  }
102
- }
102
+ }
@@ -111,6 +111,11 @@ const props = defineProps({
111
111
  type: String,
112
112
  default: '',
113
113
  },
114
+
115
+ disabled: {
116
+ type: Boolean,
117
+ default: false,
118
+ }
114
119
  });
115
120
 
116
121
  const emit = defineEmits([
@@ -135,15 +140,21 @@ const formattedSupportedFormats = computed(() => {
135
140
  });
136
141
 
137
142
  function dragenter() {
143
+ if (props.disabled) return;
144
+
138
145
  dragEnterCounter.value += 1;
139
146
  isDragging.value = true;
140
147
  }
141
148
 
142
149
  function dragover() {
150
+ if (props.disabled) return;
151
+
143
152
  isDragging.value = true;
144
153
  }
145
154
 
146
155
  function dragleave() {
156
+ if (props.disabled) return;
157
+
147
158
  dragEnterCounter.value -= 1;
148
159
  if (dragEnterCounter.value === 0) {
149
160
  isDragging.value = false;
@@ -151,10 +162,14 @@ function dragleave() {
151
162
  }
152
163
 
153
164
  function dragend() {
165
+ if (props.disabled) return;
166
+
154
167
  isDragging.value = false;
155
168
  }
156
169
 
157
170
  function drop(event) {
171
+ if (props.disabled) return;
172
+
158
173
  isDragging.value = false;
159
174
 
160
175
  const { files } = event.dataTransfer;
@@ -165,6 +180,8 @@ function drop(event) {
165
180
  }
166
181
 
167
182
  function handleFileChange(event) {
183
+ if (props.disabled) return;
184
+
168
185
  const { files } = event.target;
169
186
 
170
187
  if (validateFiles(files)) {
@@ -24,10 +24,7 @@
24
24
  </section>
25
25
 
26
26
  <section class="unnnic-modal-dialog__container__body">
27
- <header
28
- v-if="title"
29
- class="unnnic-modal-dialog__container__header"
30
- >
27
+ <header v-if="title" class="unnnic-modal-dialog__container__header">
31
28
  <section class="unnnic-modal-dialog__container__title-container">
32
29
  <UnnnicIcon
33
30
  v-if="icon || type"
@@ -49,6 +46,7 @@
49
46
  data-testid="close-icon"
50
47
  icon="close"
51
48
  clickable
49
+ scheme="neutral-cloudy"
52
50
  @click="close()"
53
51
  />
54
52
  </header>
@@ -98,12 +96,12 @@
98
96
  </template>
99
97
 
100
98
  <script>
101
- import UnnnicIcon from '../Icon.vue';
102
- import UnnnicButton from '../Button/Button.vue';
103
- import UnnnicI18n from '../../mixins/i18n';
99
+ import UnnnicIcon from "../Icon.vue";
100
+ import UnnnicButton from "../Button/Button.vue";
101
+ import UnnnicI18n from "../../mixins/i18n";
104
102
 
105
103
  export default {
106
- name: 'UnnnicModalDialog',
104
+ name: "UnnnicModalDialog",
107
105
  components: {
108
106
  UnnnicIcon,
109
107
  UnnnicButton,
@@ -120,29 +118,29 @@ export default {
120
118
  },
121
119
  type: {
122
120
  type: String,
123
- default: '',
121
+ default: "",
124
122
  validate(type) {
125
- return ['success', 'warning', 'attention'].includes(type);
123
+ return ["success", "warning", "attention"].includes(type);
126
124
  },
127
125
  },
128
126
  size: {
129
127
  type: String,
130
- default: 'md',
128
+ default: "md",
131
129
  validate(size) {
132
- return ['sm', 'md', 'lg'].includes(size);
130
+ return ["sm", "md", "lg"].includes(size);
133
131
  },
134
132
  },
135
133
  title: {
136
134
  type: String,
137
- default: '',
135
+ default: "",
138
136
  },
139
137
  icon: {
140
138
  type: String,
141
- default: '',
139
+ default: "",
142
140
  },
143
141
  iconScheme: {
144
142
  type: String,
145
- default: '',
143
+ default: "",
146
144
  },
147
145
  showCloseIcon: {
148
146
  type: Boolean,
@@ -165,26 +163,26 @@ export default {
165
163
  default: () => ({}),
166
164
  },
167
165
  },
168
- emits: ['primaryButtonClick', 'secondaryButtonClick', 'update:modelValue'],
166
+ emits: ["primaryButtonClick", "secondaryButtonClick", "update:modelValue"],
169
167
 
170
168
  data() {
171
169
  return {
172
170
  defaultTranslations: {
173
171
  cancel: {
174
- 'pt-br': 'Cancelar',
175
- en: 'Cancel',
176
- es: 'Cancelar',
172
+ "pt-br": "Cancelar",
173
+ en: "Cancel",
174
+ es: "Cancelar",
177
175
  },
178
176
  },
179
177
  iconsMapper: {
180
- success: { icon: 'check_circle', scheme: 'aux-green-500' },
181
- warning: { icon: 'warning', scheme: 'aux-red-500' },
182
- attention: { icon: 'error', scheme: 'aux-yellow-500' },
178
+ success: { icon: "check_circle", scheme: "aux-green-500" },
179
+ warning: { icon: "warning", scheme: "aux-red-500" },
180
+ attention: { icon: "error", scheme: "aux-yellow-500" },
183
181
  },
184
182
  primaryButtonTypeMapper: {
185
- success: 'primary',
186
- warning: 'warning',
187
- attention: 'attention',
183
+ success: "primary",
184
+ warning: "warning",
185
+ attention: "attention",
188
186
  },
189
187
  };
190
188
  },
@@ -195,17 +193,17 @@ export default {
195
193
  },
196
194
  methods: {
197
195
  close() {
198
- this.$emit('update:modelValue', false);
196
+ this.$emit("update:modelValue", false);
199
197
  },
200
198
  updateBodyOverflow(isHidden) {
201
- document.body.style.overflow = isHidden ? 'hidden' : '';
199
+ document.body.style.overflow = isHidden ? "hidden" : "";
202
200
  },
203
201
  },
204
202
  };
205
203
  </script>
206
204
 
207
205
  <style lang="scss" scoped>
208
- @use '@/assets/scss/unnnic' as *;
206
+ @use "@/assets/scss/unnnic" as *;
209
207
  * {
210
208
  margin: 0;
211
209
  padding: 0;
@@ -312,7 +310,7 @@ export default {
312
310
  &__actions {
313
311
  display: grid;
314
312
  grid-template-columns: 1fr 1fr;
315
- grid-template-areas: 'secondary-button primary-button';
313
+ grid-template-areas: "secondary-button primary-button";
316
314
  gap: $unnnic-spacing-sm;
317
315
  padding: $unnnic-spacing-md;
318
316
  flex-shrink: 0;
@@ -11,7 +11,7 @@ exports[`ModalDialog.vue > Elements rendering > matches the snapshot 1`] = `
11
11
  <unnnic-icon-stub data-v-68ebadeb="" filled="false" next="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
12
  <h1 data-v-68ebadeb="" class="unnnic-modal-dialog__container__title-text" data-testid="title-text">Test Title</h1>
13
13
  </section>
14
- <unnnic-icon-stub data-v-68ebadeb="" filled="false" next="false" icon="close" clickable="true" size="md" scheme="neutral-darkest" data-testid="close-icon"></unnnic-icon-stub>
14
+ <unnnic-icon-stub data-v-68ebadeb="" filled="false" next="false" icon="close" clickable="true" size="md" scheme="neutral-cloudy" data-testid="close-icon"></unnnic-icon-stub>
15
15
  </header>
16
16
  <section data-v-68ebadeb="" class="unnnic-modal-dialog__container__content"></section>
17
17
  <section data-v-68ebadeb="" data-testid="actions-section" class="unnnic-modal-dialog__container__actions">
@@ -86,6 +86,7 @@
86
86
  :active="
87
87
  option.value === modelValue || optionIsSelected(option)
88
88
  "
89
+ :disabled="optionIsSelected(option) && option.disableRemove"
89
90
  :focused="focusedOption && focusedOption.value === option.value"
90
91
  :allowCheckbox="!!multiple"
91
92
  :activeColor="type === 'secondary' ? 'secondary' : 'primary'"
@@ -142,6 +143,10 @@ export default {
142
143
  value: 'option1',
143
144
  label: 'Option1',
144
145
  },
146
+ {
147
+ value: 'option2',
148
+ label: 'Option2',
149
+ },
145
150
  ],
146
151
  },
147
152
  modelValue: {
@@ -203,6 +208,10 @@ export default {
203
208
  type: Boolean,
204
209
  default: false,
205
210
  },
211
+ multipleLimit: {
212
+ type: [Number, null],
213
+ default: null,
214
+ },
206
215
  },
207
216
 
208
217
  emits: ['update:searchValue', 'onChange', 'update:modelValue'],
@@ -363,11 +372,23 @@ export default {
363
372
 
364
373
  handleSelect(option) {
365
374
  if (option) {
366
- if (this.multiple && this.optionIsSelected(option)) {
375
+ if (
376
+ this.multiple &&
377
+ this.optionIsSelected(option) &&
378
+ !option.disableRemove
379
+ ) {
367
380
  this.unselectOption(option);
368
381
  return;
369
382
  }
370
383
 
384
+ if(this.multiple && option.disableRemove && this.optionIsSelected(option)) {
385
+ return;
386
+ }
387
+
388
+ if (this.multipleLimit && this.modelValue.length >= this.multipleLimit) {
389
+ return;
390
+ }
391
+
371
392
  this.selectOption(option);
372
393
  }
373
394
  },
@@ -10,7 +10,7 @@
10
10
  :key="option.value"
11
11
  class="unnnic-select-smart__options__multiple__selecteds__option"
12
12
  :text="option.label"
13
- hasCloseIcon
13
+ :hasCloseIcon="!option.disableRemove"
14
14
  @close="unselectOption(option)"
15
15
  />
16
16
  <p
@@ -19,6 +19,7 @@
19
19
  data-testid="checkbox"
20
20
  :modelValue="active"
21
21
  :size="size"
22
+ :disabled="disabled"
22
23
  />
23
24
  <div>
24
25
  <span
@@ -77,6 +78,10 @@ export default {
77
78
  type: Boolean,
78
79
  default: null,
79
80
  },
81
+ disabled: {
82
+ type: Boolean,
83
+ default: false,
84
+ },
80
85
  allowCheckbox: {
81
86
  type: Boolean,
82
87
  default: false,
@@ -0,0 +1,249 @@
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 v-if="hasButtons" class="unnnic-template-preview__buttons">
79
+ <section
80
+ v-for="(button, index) in template?.buttons"
81
+ :key="`button-${index}`"
82
+ class="unnnic-template-preview__buttons__button"
83
+ >
84
+ <UnnnicIcon
85
+ class="unnnic-template-preview__buttons__button__icon"
86
+ :icon="getButtonIcon(button.type)"
87
+ scheme="aux-blue-500"
88
+ size="ant"
89
+ />
90
+ <p class="unnnic-template-preview__buttons__button__text">
91
+ {{ button.text }}
92
+ </p>
93
+ </section>
94
+ </footer>
95
+ </section>
96
+ </template>
97
+
98
+ <script lang="ts" setup>
99
+ import { computed } from "vue";
100
+
101
+ import type { Template } from "./types";
102
+
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";
106
+
107
+ import UnnnicIcon from "../Icon.vue";
108
+
109
+ interface Props {
110
+ template?: Template | null;
111
+ }
112
+
113
+ const props = withDefaults(defineProps<Props>(), {
114
+ template: null,
115
+ });
116
+
117
+ const hasHeader = computed(
118
+ () => props.template?.header && props.template.header.type
119
+ );
120
+ const hasHeaderMedia = computed(
121
+ () => !!props.template?.header && props.template.header.type === "MEDIA"
122
+ );
123
+ const hasBody = computed(
124
+ () => !!props.template?.body && props.template.body.length > 0
125
+ );
126
+ const hasFooter = computed(
127
+ () => !!props.template?.footer && props.template.footer.length > 0
128
+ );
129
+ const hasButtons = computed(
130
+ () => !!props.template?.buttons && props.template.buttons.length > 0
131
+ );
132
+ const parsedBody = computed(() => {
133
+ if (!hasBody.value) return "";
134
+
135
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
136
+ const result = props
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>")
142
+ .replaceAll(/{{.*?}}/g, (match) => `<strong>${match}</strong>`);
143
+
144
+ return result;
145
+ });
146
+
147
+ const getButtonIcon = (buttonType) => {
148
+ const buttonMapper = {
149
+ PHONE_NUMBER: "phone",
150
+ URL: "open_in_new",
151
+ COPY_CODE: "content_copy",
152
+ FLOW: "",
153
+ QUICK_REPLY: "reply",
154
+ };
155
+
156
+ return buttonMapper[buttonType] || "";
157
+ };
158
+ </script>
159
+
160
+ <style lang="scss" scoped>
161
+ @use "@/assets/scss/unnnic" as *;
162
+
163
+ .unnnic-template-preview {
164
+ display: flex;
165
+ flex-direction: column;
166
+ box-shadow: $unnnic-shadow-level-near;
167
+ background-color: $unnnic-color-background-white;
168
+ width: 368px;
169
+ border-radius: $unnnic-border-radius-md;
170
+
171
+ &__content {
172
+ display: flex;
173
+ flex-direction: column;
174
+ gap: $unnnic-space-3;
175
+ padding: $unnnic-space-4 $unnnic-space-3;
176
+
177
+ &--has-media {
178
+ padding: $unnnic-space-1;
179
+ }
180
+ }
181
+
182
+ &__header {
183
+ &__text {
184
+ &__preview {
185
+ font-family: $unnnic-font-family-secondary;
186
+ font-weight: $unnnic-font-weight-bold;
187
+ font-size: $unnnic-font-size-body-gt;
188
+ line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
189
+ color: $unnnic-color-neutral-dark;
190
+
191
+ margin: $unnnic-space-0;
192
+ }
193
+ }
194
+
195
+ &__media {
196
+ &__preview {
197
+ width: 100%;
198
+ object-fit: cover;
199
+ }
200
+ }
201
+ }
202
+
203
+ &__body {
204
+ font-family: $unnnic-font-family-secondary;
205
+ font-weight: $unnnic-font-weight-regular;
206
+ font-size: $unnnic-font-size-body-gt;
207
+ line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
208
+ color: $unnnic-color-neutral-cloudy;
209
+
210
+ &--has-media {
211
+ padding: $unnnic-space-0 $unnnic-space-2;
212
+ }
213
+ }
214
+
215
+ &__footer {
216
+ font-family: $unnnic-font-family-secondary;
217
+ font-weight: $unnnic-font-weight-regular;
218
+ font-size: $unnnic-font-size-body-md;
219
+ line-height: $unnnic-font-size-body-md + $unnnic-line-height-medium;
220
+ color: $unnnic-color-neutral-clean;
221
+
222
+ &--has-media {
223
+ padding: $unnnic-space-0 $unnnic-space-3 $unnnic-space-2;
224
+ }
225
+ }
226
+
227
+ &__buttons {
228
+ font-family: $unnnic-font-family-secondary;
229
+ font-weight: $unnnic-font-weight-bold;
230
+ font-size: $unnnic-font-size-body-gt;
231
+ line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
232
+
233
+ &__button {
234
+ margin: 0;
235
+ display: flex;
236
+ align-items: center;
237
+ justify-content: center;
238
+ gap: $unnnic-space-2;
239
+ padding: $unnnic-space-3;
240
+ border-top: 1px solid $unnnic-color-neutral-light;
241
+
242
+ &__text {
243
+ color: $unnnic-color-aux-blue-500;
244
+ margin: $unnnic-space-0;
245
+ }
246
+ }
247
+ }
248
+ }
249
+ </style>
@@ -0,0 +1,51 @@
1
+ <template>
2
+ <UnnnicModalDialog
3
+ :model-value="modelValue"
4
+ @update:modelValue="$event === false && $emit('close')"
5
+ :title="defaultTranslations.title[props.locale]"
6
+ :show-close-icon="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>
@@ -0,0 +1,16 @@
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
+ }
@@ -88,7 +88,9 @@ import ModalDialog from "./ModalDialog/ModalDialog.vue";
88
88
  import Tour from "./Tour/Tour.vue";
89
89
  import Navigator from "./Navigator/index.vue";
90
90
  import SelectTime from "./SelectTime/index.vue";
91
- import DataTable from "./DataTable/index.vue";
91
+ import TemplatePreview from "./TemplatePreview/TemplatePreview.vue";
92
+ import TemplatePreviewModal from "./TemplatePreview/TemplatePreviewModal.vue";
93
+ import DataTable from './DataTable/index.vue';
92
94
 
93
95
  type VueComponent = Component;
94
96
 
@@ -187,6 +189,8 @@ export const components: ComponentsMap = {
187
189
  unnnicTour: Tour,
188
190
  unnnicNavigator: Navigator,
189
191
  unnnicSelectTime: SelectTime,
192
+ unnnicTemplatePreview: TemplatePreview,
193
+ unnnicTemplatePreviewModal: TemplatePreviewModal,
190
194
  unnnicDataTable: DataTable,
191
195
  };
192
196
 
@@ -280,5 +284,7 @@ export const unnnicDrawer = Drawer;
280
284
  export const unnnicTableNext = TableNext;
281
285
  export const unnnicTour = Tour;
282
286
  export const unnnicNavigator = Navigator;
283
- export const unnnicDataTable = DataTable as VueComponent;
284
287
  export const unnnicSelectTime = SelectTime as VueComponent;
288
+ export const unnnicTemplatePreview = TemplatePreview as VueComponent;
289
+ export const unnnicTemplatePreviewModal = TemplatePreviewModal as VueComponent;
290
+ export const unnnicDataTable = DataTable;
@@ -284,7 +284,7 @@ export const Multiple = {
284
284
  { value: 'spain', label: 'Espanha' },
285
285
  { value: 'saudi_arabia', label: 'Arábia Saudita' },
286
286
  ],
287
- multiple: true,
287
+ multiple:true,
288
288
  multipleWithoutSelectsMessage: 'No country selected yet :(',
289
289
  },
290
290
  };