@weni/unnnic-system 3.14.0-alpha-teleports.0 → 3.14.0
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/README.md +1 -9
- package/dist/{es-0d53b5b2.mjs → es-91ae9eed.mjs} +1 -1
- package/dist/{index-d7070de8.mjs → index-3b503557.mjs} +26122 -28965
- package/dist/index.d.ts +1485 -4826
- package/dist/{pt-br-bf4e1f97.mjs → pt-br-9553a558.mjs} +1 -1
- package/dist/style.css +1 -1
- package/dist/unnnic.mjs +204 -232
- package/dist/unnnic.umd.js +44 -48
- package/package.json +2 -3
- package/src/assets/scss/tailwind.scss +0 -8
- package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +1 -1
- package/src/components/ChartFunnel/DefaultFunnel/ChartDefaultFunnelBase.vue +1 -2
- package/src/components/ChartFunnel/SvgFunnel/ChartFunnelTwoRows.vue +60 -61
- package/src/components/CheckboxGroup/CheckboxGroup.vue +7 -5
- package/src/components/Chip/Chip.vue +1 -1
- package/src/components/DatePicker/DatePicker.vue +1 -10
- package/src/components/Drawer/Drawer.vue +270 -180
- package/src/components/Drawer/__tests__/Drawer.spec.js +43 -32
- package/src/components/Drawer/__tests__/__snapshots__/Drawer.spec.js.snap +19 -18
- package/src/components/FormElement/FormElement.vue +96 -87
- package/src/components/InputDatePicker/InputDatePicker.vue +73 -68
- package/src/components/InputDatePicker/__test__/InputDatePicker.spec.js +24 -31
- package/src/components/ModalDialog/ModalDialog.vue +154 -63
- package/src/components/ModalDialog/__tests__/ModalDialog.spec.js +210 -30
- package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +22 -1
- package/src/components/Radio/Radio.vue +12 -6
- package/src/components/Radio/__test__/Radio.spec.js +3 -1
- package/src/components/RadioGroup/RadioGroup.vue +18 -10
- package/src/components/Select/__tests__/SelectItem.spec.js +35 -15
- package/src/components/Switch/Switch.vue +10 -3
- package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -3
- package/src/components/TemplatePreview/TemplatePreview.vue +28 -25
- package/src/components/TemplatePreview/TemplatePreviewModal.vue +10 -10
- package/src/components/TemplatePreview/types.d.ts +3 -3
- package/src/components/Toast/Toast.vue +1 -4
- package/src/components/Toast/ToastManager.ts +1 -4
- package/src/components/Toast/__tests__/ToastManager.spec.js +6 -10
- package/src/components/ToolTip/ToolTip.vue +177 -25
- package/src/components/ToolTip/__tests__/ToolTip.spec.js +61 -339
- package/src/components/index.ts +0 -56
- package/src/components/ui/popover/PopoverContent.vue +4 -7
- package/src/components/ui/popover/PopoverTrigger.vue +1 -5
- package/src/index.ts +2 -9
- package/src/stories/Drawer.stories.js +1 -1
- package/src/stories/ModalDialog.mdx +0 -3
- package/src/stories/ModalDialog.stories.js +1 -96
- package/src/stories/TemplatePreview.stories.js +27 -27
- package/src/stories/TemplatePreviewModal.stories.js +31 -31
- package/src/components/ui/dialog/Dialog.vue +0 -19
- package/src/components/ui/dialog/DialogClose.vue +0 -29
- package/src/components/ui/dialog/DialogContent.vue +0 -140
- package/src/components/ui/dialog/DialogFooter.vue +0 -50
- package/src/components/ui/dialog/DialogHeader.vue +0 -83
- package/src/components/ui/dialog/DialogTitle.vue +0 -38
- package/src/components/ui/dialog/DialogTrigger.vue +0 -16
- package/src/components/ui/dialog/index.ts +0 -7
- package/src/components/ui/drawer/Drawer.vue +0 -27
- package/src/components/ui/drawer/DrawerClose.vue +0 -31
- package/src/components/ui/drawer/DrawerContent.vue +0 -113
- package/src/components/ui/drawer/DrawerDescription.vue +0 -40
- package/src/components/ui/drawer/DrawerFooter.vue +0 -38
- package/src/components/ui/drawer/DrawerHeader.vue +0 -57
- package/src/components/ui/drawer/DrawerOverlay.vue +0 -33
- package/src/components/ui/drawer/DrawerTitle.vue +0 -37
- package/src/components/ui/drawer/DrawerTrigger.vue +0 -31
- package/src/components/ui/drawer/index.ts +0 -10
- package/src/components/ui/tooltip/Tooltip.vue +0 -21
- package/src/components/ui/tooltip/TooltipContent.vue +0 -77
- package/src/components/ui/tooltip/TooltipTrigger.vue +0 -24
- package/src/components/ui/tooltip/index.ts +0 -3
- package/src/lib/__tests__/teleport-target.spec.ts +0 -73
- package/src/lib/layer-manager.ts +0 -64
- package/src/lib/teleport-target.ts +0 -46
- package/src/stories/Dialog.stories.js +0 -832
- package/src/stories/DrawerNext.stories.js +0 -611
- package/src/stories/LayerManager.docs.mdx +0 -40
- package/src/stories/LayerManager.stories.js +0 -407
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<section
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
<section
|
|
3
|
+
:class="[
|
|
4
|
+
'unnnic-radio-group__container',
|
|
5
|
+
`unnnic-radio-group--state-${state}`,
|
|
6
|
+
]"
|
|
7
|
+
>
|
|
6
8
|
<UnnnicLabel
|
|
7
9
|
v-if="label"
|
|
8
10
|
:label="label"
|
|
@@ -68,11 +70,14 @@ const emit = defineEmits(['update:modelValue']);
|
|
|
68
70
|
|
|
69
71
|
const contextModelValue = ref(props.modelValue);
|
|
70
72
|
|
|
71
|
-
watch(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
watch(
|
|
74
|
+
() => props.modelValue,
|
|
75
|
+
(newVal) => {
|
|
76
|
+
if (newVal !== contextModelValue.value) {
|
|
77
|
+
contextModelValue.value = newVal;
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
);
|
|
76
81
|
|
|
77
82
|
watch(contextModelValue, (newVal) => {
|
|
78
83
|
if (newVal !== props.modelValue) {
|
|
@@ -81,7 +86,10 @@ watch(contextModelValue, (newVal) => {
|
|
|
81
86
|
});
|
|
82
87
|
|
|
83
88
|
const computedName = computed(() => {
|
|
84
|
-
return
|
|
89
|
+
return (
|
|
90
|
+
props.name ||
|
|
91
|
+
`unnnic-radio-group-${Math.random().toString(36).substring(2, 15)}`
|
|
92
|
+
);
|
|
85
93
|
});
|
|
86
94
|
|
|
87
95
|
provide('contextModelValue', contextModelValue);
|
|
@@ -3,9 +3,9 @@ import { beforeEach, describe, expect, test } from 'vitest';
|
|
|
3
3
|
import SelectItem from '../SelectItem.vue';
|
|
4
4
|
|
|
5
5
|
const createWrapper = (props = {}, slots = {}) => {
|
|
6
|
-
return mount(SelectItem, {
|
|
6
|
+
return mount(SelectItem, {
|
|
7
7
|
props,
|
|
8
|
-
slots: slots.default ? { default: slots.default } : {}
|
|
8
|
+
slots: slots.default ? { default: slots.default } : {},
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
|
|
@@ -76,8 +76,12 @@ describe('SelectItem.vue', () => {
|
|
|
76
76
|
test('does not apply size class when size is empty', async () => {
|
|
77
77
|
await wrapper.setProps({ size: '' });
|
|
78
78
|
const labelElement = wrapper.find('.unnnic-select-item__label');
|
|
79
|
-
expect(labelElement.classes()).not.toContain(
|
|
80
|
-
|
|
79
|
+
expect(labelElement.classes()).not.toContain(
|
|
80
|
+
'unnnic-select-item__label--md',
|
|
81
|
+
);
|
|
82
|
+
expect(labelElement.classes()).not.toContain(
|
|
83
|
+
'unnnic-select-item__label--sm',
|
|
84
|
+
);
|
|
81
85
|
});
|
|
82
86
|
});
|
|
83
87
|
|
|
@@ -128,7 +132,10 @@ describe('SelectItem.vue', () => {
|
|
|
128
132
|
});
|
|
129
133
|
|
|
130
134
|
test('emits click event even when selectable is false', async () => {
|
|
131
|
-
const clickWrapper = createWrapper(
|
|
135
|
+
const clickWrapper = createWrapper(
|
|
136
|
+
{ selectable: false },
|
|
137
|
+
{ default: 'Test Item' },
|
|
138
|
+
);
|
|
132
139
|
await clickWrapper.trigger('click');
|
|
133
140
|
expect(clickWrapper.emitted('click')).toBeTruthy();
|
|
134
141
|
expect(clickWrapper.emitted('click').length).toBeGreaterThanOrEqual(1);
|
|
@@ -194,7 +201,7 @@ describe('SelectItem.vue', () => {
|
|
|
194
201
|
test('has proper semantic structure', () => {
|
|
195
202
|
const div = wrapper.find('.unnnic-select-item');
|
|
196
203
|
const span = wrapper.find('.unnnic-select-item__label');
|
|
197
|
-
|
|
204
|
+
|
|
198
205
|
expect(div.exists()).toBe(true);
|
|
199
206
|
expect(span.exists()).toBe(true);
|
|
200
207
|
expect(span.element.tagName).toBe('SPAN');
|
|
@@ -214,7 +221,8 @@ describe('SelectItem.vue', () => {
|
|
|
214
221
|
});
|
|
215
222
|
|
|
216
223
|
test('handles long slot content', async () => {
|
|
217
|
-
const longText =
|
|
224
|
+
const longText =
|
|
225
|
+
'This is a very long text content that should be handled properly by the component';
|
|
218
226
|
const longWrapper = createWrapper({}, { default: longText });
|
|
219
227
|
const labelElement = longWrapper.find('.unnnic-select-item__label');
|
|
220
228
|
expect(labelElement.text()).toBe(longText);
|
|
@@ -237,8 +245,12 @@ describe('SelectItem.vue', () => {
|
|
|
237
245
|
|
|
238
246
|
describe('CSS class combinations', () => {
|
|
239
247
|
test('applies correct classes for non-selectable inactive item', async () => {
|
|
240
|
-
await wrapper.setProps({
|
|
241
|
-
|
|
248
|
+
await wrapper.setProps({
|
|
249
|
+
selectable: false,
|
|
250
|
+
active: false,
|
|
251
|
+
textFocused: false,
|
|
252
|
+
});
|
|
253
|
+
|
|
242
254
|
expect(wrapper.classes()).toContain('unnnic-select-item');
|
|
243
255
|
expect(wrapper.classes()).not.toContain('unnnic-select-item--selectable');
|
|
244
256
|
expect(wrapper.classes()).not.toContain('unnnic--clickable');
|
|
@@ -247,8 +259,12 @@ describe('SelectItem.vue', () => {
|
|
|
247
259
|
});
|
|
248
260
|
|
|
249
261
|
test('applies correct classes for selectable active item', async () => {
|
|
250
|
-
await wrapper.setProps({
|
|
251
|
-
|
|
262
|
+
await wrapper.setProps({
|
|
263
|
+
selectable: true,
|
|
264
|
+
active: true,
|
|
265
|
+
textFocused: false,
|
|
266
|
+
});
|
|
267
|
+
|
|
252
268
|
expect(wrapper.classes()).toContain('unnnic-select-item');
|
|
253
269
|
expect(wrapper.classes()).toContain('unnnic-select-item--selectable');
|
|
254
270
|
expect(wrapper.classes()).toContain('unnnic--clickable');
|
|
@@ -257,8 +273,12 @@ describe('SelectItem.vue', () => {
|
|
|
257
273
|
});
|
|
258
274
|
|
|
259
275
|
test('applies correct classes for text-focused item', async () => {
|
|
260
|
-
await wrapper.setProps({
|
|
261
|
-
|
|
276
|
+
await wrapper.setProps({
|
|
277
|
+
selectable: true,
|
|
278
|
+
active: false,
|
|
279
|
+
textFocused: true,
|
|
280
|
+
});
|
|
281
|
+
|
|
262
282
|
expect(wrapper.classes()).toContain('unnnic-select-item');
|
|
263
283
|
expect(wrapper.classes()).toContain('unnnic-select-item--selectable');
|
|
264
284
|
expect(wrapper.classes()).toContain('unnnic--clickable');
|
|
@@ -298,11 +318,11 @@ describe('SelectItem.vue', () => {
|
|
|
298
318
|
});
|
|
299
319
|
|
|
300
320
|
test('matches snapshot with all states combined', async () => {
|
|
301
|
-
await wrapper.setProps({
|
|
321
|
+
await wrapper.setProps({
|
|
302
322
|
size: 'md',
|
|
303
323
|
selectable: true,
|
|
304
324
|
active: true,
|
|
305
|
-
textFocused: true
|
|
325
|
+
textFocused: true,
|
|
306
326
|
});
|
|
307
327
|
expect(wrapper.html()).toMatchSnapshot();
|
|
308
328
|
});
|
|
@@ -8,7 +8,12 @@
|
|
|
8
8
|
class="unnnic-switch__label"
|
|
9
9
|
/>
|
|
10
10
|
|
|
11
|
-
<label
|
|
11
|
+
<label
|
|
12
|
+
:class="[
|
|
13
|
+
'unnnic-switch__input-wrapper',
|
|
14
|
+
{ 'unnnic-switch__input-wrapper--disabled': disabled },
|
|
15
|
+
]"
|
|
16
|
+
>
|
|
12
17
|
<input
|
|
13
18
|
class="unnnic-switch__input"
|
|
14
19
|
type="checkbox"
|
|
@@ -78,7 +83,7 @@ export default {
|
|
|
78
83
|
type: String,
|
|
79
84
|
default: '',
|
|
80
85
|
},
|
|
81
|
-
|
|
86
|
+
|
|
82
87
|
helper: {
|
|
83
88
|
type: String,
|
|
84
89
|
default: '',
|
|
@@ -176,7 +181,9 @@ $switch-height: 20px;
|
|
|
176
181
|
background-repeat: no-repeat;
|
|
177
182
|
background-position: 4px center;
|
|
178
183
|
|
|
179
|
-
transition:
|
|
184
|
+
transition:
|
|
185
|
+
120ms linear background-position,
|
|
186
|
+
120ms linear background-color;
|
|
180
187
|
|
|
181
188
|
cursor: pointer;
|
|
182
189
|
|
|
@@ -4,9 +4,7 @@ exports[`Tab.vue > matches the snapshot 1`] = `
|
|
|
4
4
|
"<div data-v-b4e39fac="" class="tab size-md">
|
|
5
5
|
<header data-v-b4e39fac="" class="tab-header">
|
|
6
6
|
<ul data-v-b4e39fac="" class="tab-content">
|
|
7
|
-
<li data-v-b4e39fac="" class="tab-head">tab1<div data-v-
|
|
8
|
-
<!--teleport start-->
|
|
9
|
-
<!--teleport end-->
|
|
7
|
+
<li data-v-b4e39fac="" class="tab-head">tab1<div data-v-bf0cf546="" data-v-b4e39fac="" class="unnnic-tooltip"><span data-v-26446d8e="" data-v-b4e39fac="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--sm unnnic-icon__size--sm" data-testid="material-icon" translate="no">help</span><span data-v-bf0cf546="" class="unnnic-tooltip-label unnnic-tooltip-label-bottom" data-testid="tooltip-label" style="left: 0px; top: 8px;">Tooltip text <br data-v-bf0cf546=""><!--v-if--></span></div>
|
|
10
8
|
</li>
|
|
11
9
|
<li data-v-b4e39fac="" class="tab-head tab-head--active">tab2
|
|
12
10
|
<!--v-if-->
|
|
@@ -75,7 +75,10 @@
|
|
|
75
75
|
{{ template?.footer }}
|
|
76
76
|
</footer>
|
|
77
77
|
</section>
|
|
78
|
-
<footer
|
|
78
|
+
<footer
|
|
79
|
+
v-if="hasButtons"
|
|
80
|
+
class="unnnic-template-preview__buttons"
|
|
81
|
+
>
|
|
79
82
|
<section
|
|
80
83
|
v-for="(button, index) in template?.buttons"
|
|
81
84
|
:key="`button-${index}`"
|
|
@@ -96,15 +99,15 @@
|
|
|
96
99
|
</template>
|
|
97
100
|
|
|
98
101
|
<script lang="ts" setup>
|
|
99
|
-
import { computed } from
|
|
102
|
+
import { computed } from 'vue';
|
|
100
103
|
|
|
101
|
-
import type { Template } from
|
|
104
|
+
import type { Template } from './types';
|
|
102
105
|
|
|
103
|
-
import imagePreview from
|
|
104
|
-
import documentPreview from
|
|
105
|
-
import videoPreview from
|
|
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';
|
|
106
109
|
|
|
107
|
-
import UnnnicIcon from
|
|
110
|
+
import UnnnicIcon from '../Icon.vue';
|
|
108
111
|
|
|
109
112
|
interface Props {
|
|
110
113
|
template?: Template | null;
|
|
@@ -115,30 +118,30 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
115
118
|
});
|
|
116
119
|
|
|
117
120
|
const hasHeader = computed(
|
|
118
|
-
() => props.template?.header && props.template.header.type
|
|
121
|
+
() => props.template?.header && props.template.header.type,
|
|
119
122
|
);
|
|
120
123
|
const hasHeaderMedia = computed(
|
|
121
|
-
() => !!props.template?.header && props.template.header.type ===
|
|
124
|
+
() => !!props.template?.header && props.template.header.type === 'MEDIA',
|
|
122
125
|
);
|
|
123
126
|
const hasBody = computed(
|
|
124
|
-
() => !!props.template?.body && props.template.body.length > 0
|
|
127
|
+
() => !!props.template?.body && props.template.body.length > 0,
|
|
125
128
|
);
|
|
126
129
|
const hasFooter = computed(
|
|
127
|
-
() => !!props.template?.footer && props.template.footer.length > 0
|
|
130
|
+
() => !!props.template?.footer && props.template.footer.length > 0,
|
|
128
131
|
);
|
|
129
132
|
const hasButtons = computed(
|
|
130
|
-
() => !!props.template?.buttons && props.template.buttons.length > 0
|
|
133
|
+
() => !!props.template?.buttons && props.template.buttons.length > 0,
|
|
131
134
|
);
|
|
132
135
|
const parsedBody = computed(() => {
|
|
133
|
-
if (!hasBody.value) return
|
|
136
|
+
if (!hasBody.value) return '';
|
|
134
137
|
|
|
135
138
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
136
139
|
const result = props
|
|
137
|
-
.template!.body!.replaceAll(
|
|
138
|
-
.replaceAll(/(?:\*)([^*<\n]+)(?:\*)/g,
|
|
139
|
-
.replaceAll(/(?:_)([^_<\n]+)(?:_)/g,
|
|
140
|
-
.replaceAll(/(?:~)([^~<\n]+)(?:~)/g,
|
|
141
|
-
.replaceAll(/(?:```)([^```<\n]+)(?:```)/g,
|
|
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>')
|
|
142
145
|
.replaceAll(/{{.*?}}/g, (match) => `<strong>${match}</strong>`);
|
|
143
146
|
|
|
144
147
|
return result;
|
|
@@ -146,19 +149,19 @@ const parsedBody = computed(() => {
|
|
|
146
149
|
|
|
147
150
|
const getButtonIcon = (buttonType) => {
|
|
148
151
|
const buttonMapper = {
|
|
149
|
-
PHONE_NUMBER:
|
|
150
|
-
URL:
|
|
151
|
-
COPY_CODE:
|
|
152
|
-
FLOW:
|
|
153
|
-
QUICK_REPLY:
|
|
152
|
+
PHONE_NUMBER: 'phone',
|
|
153
|
+
URL: 'open_in_new',
|
|
154
|
+
COPY_CODE: 'content_copy',
|
|
155
|
+
FLOW: '',
|
|
156
|
+
QUICK_REPLY: 'reply',
|
|
154
157
|
};
|
|
155
158
|
|
|
156
|
-
return buttonMapper[buttonType] ||
|
|
159
|
+
return buttonMapper[buttonType] || '';
|
|
157
160
|
};
|
|
158
161
|
</script>
|
|
159
162
|
|
|
160
163
|
<style lang="scss" scoped>
|
|
161
|
-
@use
|
|
164
|
+
@use '@/assets/scss/unnnic' as *;
|
|
162
165
|
|
|
163
166
|
.unnnic-template-preview {
|
|
164
167
|
display: flex;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<UnnnicModalDialog
|
|
3
|
-
:
|
|
3
|
+
:modelValue="modelValue"
|
|
4
4
|
@update:modelValue="$event === false && $emit('close')"
|
|
5
5
|
:title="defaultTranslations.title[props.locale]"
|
|
6
|
-
:
|
|
6
|
+
:showCloseIcon="true"
|
|
7
7
|
class="unnnic-template-preview-modal"
|
|
8
8
|
>
|
|
9
9
|
<UnnnicTemplatePreview :template="template" />
|
|
@@ -11,16 +11,16 @@
|
|
|
11
11
|
</template>
|
|
12
12
|
|
|
13
13
|
<script lang="ts" setup>
|
|
14
|
-
import UnnnicTemplatePreview from
|
|
15
|
-
import UnnnicModalDialog from
|
|
14
|
+
import UnnnicTemplatePreview from './TemplatePreview.vue';
|
|
15
|
+
import UnnnicModalDialog from '../ModalDialog/ModalDialog.vue';
|
|
16
16
|
|
|
17
|
-
import type { Template } from
|
|
17
|
+
import type { Template } from './types';
|
|
18
18
|
|
|
19
19
|
const defaultTranslations = {
|
|
20
20
|
title: {
|
|
21
|
-
|
|
22
|
-
en:
|
|
23
|
-
es:
|
|
21
|
+
'pt-br': 'Visualizar modelo',
|
|
22
|
+
en: 'Template preview',
|
|
23
|
+
es: 'Vista previa de plantilla',
|
|
24
24
|
},
|
|
25
25
|
};
|
|
26
26
|
|
|
@@ -31,7 +31,7 @@ interface Props {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
const props = withDefaults(defineProps<Props>(), {
|
|
34
|
-
locale:
|
|
34
|
+
locale: 'en',
|
|
35
35
|
});
|
|
36
36
|
|
|
37
37
|
defineEmits<{
|
|
@@ -40,7 +40,7 @@ defineEmits<{
|
|
|
40
40
|
</script>
|
|
41
41
|
|
|
42
42
|
<style lang="scss" scoped>
|
|
43
|
-
@use
|
|
43
|
+
@use '@/assets/scss/unnnic' as *;
|
|
44
44
|
|
|
45
45
|
:deep(.unnnic-modal-dialog__container__content) {
|
|
46
46
|
display: flex;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
export interface Template {
|
|
2
2
|
header: {
|
|
3
|
-
type:
|
|
4
|
-
mediaType?:
|
|
3
|
+
type: 'TEXT' | 'MEDIA';
|
|
4
|
+
mediaType?: 'IMAGE' | 'VIDEO' | 'DOCUMENT';
|
|
5
5
|
text?: string | null;
|
|
6
6
|
src?: string | null;
|
|
7
7
|
};
|
|
8
8
|
body?: string;
|
|
9
9
|
footer?: string;
|
|
10
10
|
buttons?: Array<{
|
|
11
|
-
type:
|
|
11
|
+
type: 'QUICK_REPLY' | 'PHONE_NUMBER';
|
|
12
12
|
text: string;
|
|
13
13
|
countryCode?: string;
|
|
14
14
|
phoneNumber?: string;
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
:role="type === 'error' ? 'alert' : 'status'"
|
|
12
12
|
:aria-live="type === 'error' ? 'assertive' : 'polite'"
|
|
13
13
|
data-testid="toast"
|
|
14
|
-
:style="{ zIndex: toastZIndex }"
|
|
15
14
|
>
|
|
16
15
|
<section
|
|
17
16
|
class="unnnic-toast__content"
|
|
@@ -75,7 +74,6 @@ import { ref, computed, onMounted, onUnmounted } from 'vue';
|
|
|
75
74
|
|
|
76
75
|
import UnnnicIcon from '@/components/Icon.vue';
|
|
77
76
|
import UnnnicButton from '@/components/Button/Button.vue';
|
|
78
|
-
import { useLayerZIndex } from '@/lib/layer-manager';
|
|
79
77
|
|
|
80
78
|
import type { ToastProps, ToastEmits } from './types';
|
|
81
79
|
import type { SchemeColor } from '@/types/scheme-colors';
|
|
@@ -111,8 +109,6 @@ const typeConfig = computed(() => {
|
|
|
111
109
|
};
|
|
112
110
|
});
|
|
113
111
|
|
|
114
|
-
const toastZIndex = useLayerZIndex();
|
|
115
|
-
|
|
116
112
|
const handleClose = () => {
|
|
117
113
|
isVisible.value = false;
|
|
118
114
|
emit('close');
|
|
@@ -156,6 +152,7 @@ onUnmounted(() => {
|
|
|
156
152
|
position: fixed;
|
|
157
153
|
bottom: $unnnic-space-4;
|
|
158
154
|
right: $unnnic-space-4;
|
|
155
|
+
z-index: 9999;
|
|
159
156
|
|
|
160
157
|
display: flex;
|
|
161
158
|
align-items: flex-end;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { createApp } from 'vue';
|
|
2
|
-
import { getTeleportContainer } from '@/lib/teleport-target';
|
|
3
2
|
import Toast from './Toast.vue';
|
|
4
3
|
import type {
|
|
5
4
|
ToastProps,
|
|
@@ -21,9 +20,7 @@ class ToastManager implements ToastManager {
|
|
|
21
20
|
this.container = document.createElement('div');
|
|
22
21
|
this.container.setAttribute('unnnic-toast-container', 'true');
|
|
23
22
|
|
|
24
|
-
|
|
25
|
-
host?.appendChild(this.container);
|
|
26
|
-
|
|
23
|
+
document.body.appendChild(this.container);
|
|
27
24
|
return this.container;
|
|
28
25
|
}
|
|
29
26
|
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, afterEach, test, vi } from 'vitest';
|
|
2
2
|
|
|
3
|
-
vi.mock('vue',
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
unmount: vi.fn(),
|
|
10
|
-
})),
|
|
11
|
-
};
|
|
12
|
-
});
|
|
3
|
+
vi.mock('vue', () => ({
|
|
4
|
+
createApp: vi.fn(() => ({
|
|
5
|
+
mount: vi.fn(),
|
|
6
|
+
unmount: vi.fn(),
|
|
7
|
+
})),
|
|
8
|
+
}));
|
|
13
9
|
|
|
14
10
|
vi.mock('../Toast.vue', () => ({
|
|
15
11
|
default: {
|