@weni/unnnic-system 3.1.1 → 3.1.2-alpha.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.
- package/dist/components/DatePicker/DatePicker.vue.d.ts +2 -2
- package/dist/components/DropArea/DropArea.vue.d.ts +2 -0
- package/dist/components/DropArea/DropArea.vue.d.ts.map +1 -1
- package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +3 -3
- package/dist/components/ModalDialog/ModalDialog.vue.d.ts +1 -1
- package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
- package/dist/components/ModalUpload/ModalUpload.vue.d.ts +6 -0
- package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts +9 -0
- package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts.map +1 -0
- package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts +15 -0
- package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts.map +1 -0
- package/dist/components/UploadArea/UploadArea.vue.d.ts +6 -0
- package/dist/{es-b95265ef.mjs → es-447c22a1.mjs} +1 -1
- package/dist/{index-d6c4fffb.mjs → index-7ff7db46.mjs} +9268 -9108
- package/dist/{pt-br-80b6b07a.mjs → pt-br-b9850dfb.mjs} +1 -1
- package/dist/style.css +1 -1
- package/dist/unnnic.mjs +26 -24
- package/dist/unnnic.umd.js +44 -43
- package/package.json +2 -2
- package/src/assets/img/previews/doc-preview.png +0 -0
- package/src/assets/img/previews/image-preview.png +0 -0
- package/src/assets/img/previews/video-preview.png +0 -0
- package/src/components/DropArea/DropArea.vue +26 -2
- package/src/components/ModalDialog/ModalDialog.vue +27 -29
- package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -1
- package/src/components/TemplatePreview/TemplatePreview.vue +249 -0
- package/src/components/TemplatePreview/TemplatePreviewModal.vue +51 -0
- package/src/components/TemplatePreview/types.d.ts +16 -0
- package/src/components/index.ts +8 -2
- package/src/stories/TemplatePreview.stories.js +94 -0
- package/src/stories/TemplatePreviewModal.stories.js +110 -0
- package/dist/components/index.d.ts +0 -40344
- package/dist/components/index.d.ts.map +0 -1
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
@dragleave.stop.prevent="dragleave"
|
|
12
12
|
@dragend.stop.prevent="dragend"
|
|
13
13
|
@drop.stop.prevent="drop"
|
|
14
|
-
@click="
|
|
14
|
+
@click="handleDropzoneClick"
|
|
15
15
|
>
|
|
16
16
|
<UnnnicIcon
|
|
17
17
|
class="unnnic-upload-area__dropzone__icon"
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
</template>
|
|
65
65
|
|
|
66
66
|
<script setup>
|
|
67
|
-
import { ref, computed, getCurrentInstance } from 'vue';
|
|
67
|
+
import { ref, computed, getCurrentInstance, useTemplateRef } from 'vue';
|
|
68
68
|
import mime from 'mime';
|
|
69
69
|
|
|
70
70
|
import UnnnicIcon from '../Icon.vue';
|
|
@@ -73,6 +73,7 @@ const isDragging = ref(false);
|
|
|
73
73
|
const hasError = ref(false);
|
|
74
74
|
const dragEnterCounter = ref(0);
|
|
75
75
|
const file = ref();
|
|
76
|
+
const fileRef = useTemplateRef('file');
|
|
76
77
|
|
|
77
78
|
const props = defineProps({
|
|
78
79
|
acceptMultiple: {
|
|
@@ -111,6 +112,11 @@ const props = defineProps({
|
|
|
111
112
|
type: String,
|
|
112
113
|
default: '',
|
|
113
114
|
},
|
|
115
|
+
|
|
116
|
+
disabled: {
|
|
117
|
+
type: Boolean,
|
|
118
|
+
default: false,
|
|
119
|
+
}
|
|
114
120
|
});
|
|
115
121
|
|
|
116
122
|
const emit = defineEmits([
|
|
@@ -135,15 +141,21 @@ const formattedSupportedFormats = computed(() => {
|
|
|
135
141
|
});
|
|
136
142
|
|
|
137
143
|
function dragenter() {
|
|
144
|
+
if (props.disabled) return;
|
|
145
|
+
|
|
138
146
|
dragEnterCounter.value += 1;
|
|
139
147
|
isDragging.value = true;
|
|
140
148
|
}
|
|
141
149
|
|
|
142
150
|
function dragover() {
|
|
151
|
+
if (props.disabled) return;
|
|
152
|
+
|
|
143
153
|
isDragging.value = true;
|
|
144
154
|
}
|
|
145
155
|
|
|
146
156
|
function dragleave() {
|
|
157
|
+
if (props.disabled) return;
|
|
158
|
+
|
|
147
159
|
dragEnterCounter.value -= 1;
|
|
148
160
|
if (dragEnterCounter.value === 0) {
|
|
149
161
|
isDragging.value = false;
|
|
@@ -151,10 +163,14 @@ function dragleave() {
|
|
|
151
163
|
}
|
|
152
164
|
|
|
153
165
|
function dragend() {
|
|
166
|
+
if (props.disabled) return;
|
|
167
|
+
|
|
154
168
|
isDragging.value = false;
|
|
155
169
|
}
|
|
156
170
|
|
|
157
171
|
function drop(event) {
|
|
172
|
+
if (props.disabled) return;
|
|
173
|
+
|
|
158
174
|
isDragging.value = false;
|
|
159
175
|
|
|
160
176
|
const { files } = event.dataTransfer;
|
|
@@ -164,7 +180,15 @@ function drop(event) {
|
|
|
164
180
|
}
|
|
165
181
|
}
|
|
166
182
|
|
|
183
|
+
function handleDropzoneClick() {
|
|
184
|
+
if (props.disabled) return;
|
|
185
|
+
|
|
186
|
+
fileRef.value.click();
|
|
187
|
+
}
|
|
188
|
+
|
|
167
189
|
function handleFileChange(event) {
|
|
190
|
+
if (props.disabled) return;
|
|
191
|
+
|
|
168
192
|
const { files } = event.target;
|
|
169
193
|
|
|
170
194
|
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
|
|
102
|
-
import UnnnicButton from
|
|
103
|
-
import UnnnicI18n from
|
|
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:
|
|
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 [
|
|
123
|
+
return ["success", "warning", "attention"].includes(type);
|
|
126
124
|
},
|
|
127
125
|
},
|
|
128
126
|
size: {
|
|
129
127
|
type: String,
|
|
130
|
-
default:
|
|
128
|
+
default: "md",
|
|
131
129
|
validate(size) {
|
|
132
|
-
return [
|
|
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: [
|
|
166
|
+
emits: ["primaryButtonClick", "secondaryButtonClick", "update:modelValue"],
|
|
169
167
|
|
|
170
168
|
data() {
|
|
171
169
|
return {
|
|
172
170
|
defaultTranslations: {
|
|
173
171
|
cancel: {
|
|
174
|
-
|
|
175
|
-
en:
|
|
176
|
-
es:
|
|
172
|
+
"pt-br": "Cancelar",
|
|
173
|
+
en: "Cancel",
|
|
174
|
+
es: "Cancelar",
|
|
177
175
|
},
|
|
178
176
|
},
|
|
179
177
|
iconsMapper: {
|
|
180
|
-
success: { icon:
|
|
181
|
-
warning: { icon:
|
|
182
|
-
attention: { icon:
|
|
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:
|
|
186
|
-
warning:
|
|
187
|
-
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(
|
|
196
|
+
this.$emit("update:modelValue", false);
|
|
199
197
|
},
|
|
200
198
|
updateBodyOverflow(isHidden) {
|
|
201
|
-
document.body.style.overflow = isHidden ?
|
|
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
|
|
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:
|
|
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-
|
|
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">
|
|
@@ -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
|
+
}
|
package/src/components/index.ts
CHANGED
|
@@ -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
|
|
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;
|