@adsterra-ad/vue 0.1.2 → 0.1.4
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/index.cjs +68 -15
- package/dist/index.d.cts +38 -2
- package/dist/index.d.ts +38 -2
- package/dist/index.js +68 -15
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -37,6 +37,8 @@ var AdBanner = (0, import_vue.defineComponent)({
|
|
|
37
37
|
adLabel: { type: String, default: "Advertisement" },
|
|
38
38
|
showAdLabel: { type: Boolean, default: true },
|
|
39
39
|
adLabelPosition: { type: String, default: "top-left" },
|
|
40
|
+
showFallbackPlaceholder: { type: Boolean, default: false },
|
|
41
|
+
fallbackPlaceholderText: { type: String, default: "Test advertisement" },
|
|
40
42
|
className: { type: String, default: "" }
|
|
41
43
|
},
|
|
42
44
|
emits: ["load", "error"],
|
|
@@ -45,9 +47,14 @@ var AdBanner = (0, import_vue.defineComponent)({
|
|
|
45
47
|
const adLoaded = (0, import_vue.ref)(false);
|
|
46
48
|
const adFailed = (0, import_vue.ref)(false);
|
|
47
49
|
const activeProvider = (0, import_vue.ref)(props.provider);
|
|
48
|
-
(0, import_vue.watch)(
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
(0, import_vue.watch)(
|
|
51
|
+
() => [props.provider, props.format, props.adKey],
|
|
52
|
+
([nextProvider]) => {
|
|
53
|
+
activeProvider.value = nextProvider;
|
|
54
|
+
adLoaded.value = false;
|
|
55
|
+
adFailed.value = false;
|
|
56
|
+
}
|
|
57
|
+
);
|
|
51
58
|
const config = (0, import_vue.computed)(() => (0, import_core.resolveAdConfig)(props.format, props.adKey || void 0));
|
|
52
59
|
const srcDoc = (0, import_vue.computed)(
|
|
53
60
|
() => (0, import_core.buildSrcDoc)({ format: props.format, provider: activeProvider.value, config: config.value, bannerId })
|
|
@@ -56,9 +63,6 @@ var AdBanner = (0, import_vue.defineComponent)({
|
|
|
56
63
|
width: typeof config.value.width === "number" ? `${config.value.width}px` : config.value.width,
|
|
57
64
|
height: typeof config.value.height === "number" ? `${config.value.height}px` : config.value.height,
|
|
58
65
|
overflow: "hidden",
|
|
59
|
-
borderRadius: "6px",
|
|
60
|
-
border: "1px solid #e5e7eb",
|
|
61
|
-
background: "#f3f4f6",
|
|
62
66
|
display: "flex",
|
|
63
67
|
alignItems: "center",
|
|
64
68
|
justifyContent: "center"
|
|
@@ -66,21 +70,22 @@ var AdBanner = (0, import_vue.defineComponent)({
|
|
|
66
70
|
const wrapperStyle = (0, import_vue.computed)(() => ({
|
|
67
71
|
display: "inline-flex",
|
|
68
72
|
flexDirection: "column",
|
|
69
|
-
alignItems:
|
|
73
|
+
alignItems: "flex-start",
|
|
74
|
+
width: typeof config.value.width === "number" ? `${config.value.width}px` : config.value.width
|
|
70
75
|
}));
|
|
71
76
|
const labelStyle = (0, import_vue.computed)(() => ({
|
|
72
77
|
fontSize: "10px",
|
|
73
78
|
fontWeight: "600",
|
|
74
79
|
letterSpacing: "0.1em",
|
|
75
80
|
textTransform: "uppercase",
|
|
76
|
-
|
|
81
|
+
opacity: "0.6",
|
|
77
82
|
marginBottom: props.adLabelPosition.startsWith("top") ? "4px" : "0",
|
|
78
83
|
marginTop: props.adLabelPosition.startsWith("bottom") ? "4px" : "0",
|
|
79
84
|
textAlign: props.adLabelPosition.endsWith("left") ? "left" : props.adLabelPosition.endsWith("right") ? "right" : "center",
|
|
80
85
|
width: "100%"
|
|
81
86
|
}));
|
|
82
87
|
const visibilityStyle = (0, import_vue.computed)(
|
|
83
|
-
() => adLoaded.value ? { opacity: "1", transform: "scale(1)" } : {
|
|
88
|
+
() => adLoaded.value || adFailed.value && props.showFallbackPlaceholder ? { opacity: "1", transform: "scale(1)" } : {
|
|
84
89
|
opacity: "0",
|
|
85
90
|
transform: "scale(0.95)",
|
|
86
91
|
pointerEvents: "none",
|
|
@@ -106,18 +111,26 @@ var AdBanner = (0, import_vue.defineComponent)({
|
|
|
106
111
|
(0, import_vue.onMounted)(() => window.addEventListener("message", onMessage));
|
|
107
112
|
(0, import_vue.onUnmounted)(() => window.removeEventListener("message", onMessage));
|
|
108
113
|
return () => {
|
|
109
|
-
if (adFailed.value) return null;
|
|
114
|
+
if (adFailed.value && !props.showFallbackPlaceholder) return null;
|
|
110
115
|
const topLabel = props.showAdLabel && props.adLabelPosition.startsWith("top");
|
|
111
116
|
const bottomLabel = props.showAdLabel && props.adLabelPosition.startsWith("bottom");
|
|
117
|
+
const isPlaceholderVisible = adFailed.value && props.showFallbackPlaceholder;
|
|
112
118
|
return (0, import_vue.h)("div", { class: props.className, style: { ...wrapperStyle.value, ...visibilityStyle.value } }, [
|
|
113
119
|
topLabel ? (0, import_vue.h)("span", { style: labelStyle.value }, props.adLabel) : null,
|
|
114
120
|
(0, import_vue.h)("div", { "data-testid": "ad-banner", style: style.value }, [
|
|
115
|
-
(0, import_vue.h)("iframe", {
|
|
121
|
+
isPlaceholderVisible ? (0, import_vue.h)(FallbackPlaceholder, { format: props.format, text: props.fallbackPlaceholderText }) : (0, import_vue.h)("iframe", {
|
|
116
122
|
title: "Advertisement",
|
|
117
123
|
srcdoc: srcDoc.value,
|
|
124
|
+
width: "100%",
|
|
125
|
+
height: "100%",
|
|
118
126
|
frameborder: "0",
|
|
119
127
|
scrolling: "no",
|
|
120
|
-
sandbox: "allow-scripts allow-forms allow-same-origin allow-popups allow-modals"
|
|
128
|
+
sandbox: "allow-scripts allow-forms allow-same-origin allow-popups allow-modals",
|
|
129
|
+
style: {
|
|
130
|
+
display: "block",
|
|
131
|
+
width: "100%",
|
|
132
|
+
height: "100%"
|
|
133
|
+
}
|
|
121
134
|
})
|
|
122
135
|
]),
|
|
123
136
|
bottomLabel ? (0, import_vue.h)("span", { style: labelStyle.value }, props.adLabel) : null
|
|
@@ -134,14 +147,16 @@ var AdContainer = (0, import_vue.defineComponent)({
|
|
|
134
147
|
className: { type: String, default: "" },
|
|
135
148
|
adLabel: { type: String, default: "Advertisement" },
|
|
136
149
|
showAdLabel: { type: Boolean, default: true },
|
|
137
|
-
adLabelPosition: { type: String, default: "top-left" }
|
|
150
|
+
adLabelPosition: { type: String, default: "top-left" },
|
|
151
|
+
showFallbackPlaceholder: { type: Boolean, default: false },
|
|
152
|
+
fallbackPlaceholderText: { type: String, default: "Test advertisement" }
|
|
138
153
|
},
|
|
139
154
|
setup(props) {
|
|
140
155
|
const adLoaded = (0, import_vue.ref)(false);
|
|
141
156
|
const adFailed = (0, import_vue.ref)(false);
|
|
142
157
|
return () => {
|
|
143
|
-
if (adFailed.value) return null;
|
|
144
|
-
const containerVisibilityStyle = adLoaded.value ? { opacity: "1", transform: "scale(1)" } : {
|
|
158
|
+
if (adFailed.value && !props.showFallbackPlaceholder) return null;
|
|
159
|
+
const containerVisibilityStyle = adLoaded.value || adFailed.value && props.showFallbackPlaceholder ? { opacity: "1", transform: "scale(1)" } : {
|
|
145
160
|
opacity: "0",
|
|
146
161
|
transform: "scale(0.95)",
|
|
147
162
|
pointerEvents: "none",
|
|
@@ -159,6 +174,8 @@ var AdContainer = (0, import_vue.defineComponent)({
|
|
|
159
174
|
adLabel: props.adLabel,
|
|
160
175
|
showAdLabel: props.showAdLabel,
|
|
161
176
|
adLabelPosition: props.adLabelPosition,
|
|
177
|
+
showFallbackPlaceholder: props.showFallbackPlaceholder,
|
|
178
|
+
fallbackPlaceholderText: props.fallbackPlaceholderText,
|
|
162
179
|
onLoad: () => {
|
|
163
180
|
adLoaded.value = true;
|
|
164
181
|
},
|
|
@@ -170,6 +187,42 @@ var AdContainer = (0, import_vue.defineComponent)({
|
|
|
170
187
|
};
|
|
171
188
|
}
|
|
172
189
|
});
|
|
190
|
+
var FallbackPlaceholder = (0, import_vue.defineComponent)({
|
|
191
|
+
name: "FallbackPlaceholder",
|
|
192
|
+
props: {
|
|
193
|
+
format: { type: String, required: true },
|
|
194
|
+
text: { type: String, required: true }
|
|
195
|
+
},
|
|
196
|
+
setup(props) {
|
|
197
|
+
return () => (0, import_vue.h)(
|
|
198
|
+
"div",
|
|
199
|
+
{
|
|
200
|
+
role: "img",
|
|
201
|
+
"aria-label": `${props.text} placeholder`,
|
|
202
|
+
style: {
|
|
203
|
+
width: "100%",
|
|
204
|
+
height: "100%",
|
|
205
|
+
display: "flex",
|
|
206
|
+
flexDirection: "column",
|
|
207
|
+
alignItems: "center",
|
|
208
|
+
justifyContent: "center",
|
|
209
|
+
gap: "6px",
|
|
210
|
+
boxSizing: "border-box",
|
|
211
|
+
padding: "12px",
|
|
212
|
+
border: "1px dashed currentColor",
|
|
213
|
+
opacity: "0.7",
|
|
214
|
+
background: "transparent",
|
|
215
|
+
textAlign: "center",
|
|
216
|
+
fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif'
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
[
|
|
220
|
+
(0, import_vue.h)("strong", { style: { fontSize: "13px", lineHeight: "1.2" } }, props.text),
|
|
221
|
+
(0, import_vue.h)("span", { style: { fontSize: "11px", lineHeight: "1.2" } }, props.format)
|
|
222
|
+
]
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
173
226
|
var index_default = AdBanner;
|
|
174
227
|
// Annotate the CommonJS export names for ESM import in node:
|
|
175
228
|
0 && (module.exports = {
|
package/dist/index.d.cts
CHANGED
|
@@ -29,6 +29,14 @@ declare const AdBanner: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
29
29
|
type: PropType<AdLabelPosition>;
|
|
30
30
|
default: string;
|
|
31
31
|
};
|
|
32
|
+
showFallbackPlaceholder: {
|
|
33
|
+
type: BooleanConstructor;
|
|
34
|
+
default: boolean;
|
|
35
|
+
};
|
|
36
|
+
fallbackPlaceholderText: {
|
|
37
|
+
type: StringConstructor;
|
|
38
|
+
default: string;
|
|
39
|
+
};
|
|
32
40
|
className: {
|
|
33
41
|
type: StringConstructor;
|
|
34
42
|
default: string;
|
|
@@ -60,6 +68,14 @@ declare const AdBanner: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
60
68
|
type: PropType<AdLabelPosition>;
|
|
61
69
|
default: string;
|
|
62
70
|
};
|
|
71
|
+
showFallbackPlaceholder: {
|
|
72
|
+
type: BooleanConstructor;
|
|
73
|
+
default: boolean;
|
|
74
|
+
};
|
|
75
|
+
fallbackPlaceholderText: {
|
|
76
|
+
type: StringConstructor;
|
|
77
|
+
default: string;
|
|
78
|
+
};
|
|
63
79
|
className: {
|
|
64
80
|
type: StringConstructor;
|
|
65
81
|
default: string;
|
|
@@ -68,11 +84,13 @@ declare const AdBanner: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
68
84
|
onLoad?: ((...args: any[]) => any) | undefined;
|
|
69
85
|
onError?: ((...args: any[]) => any) | undefined;
|
|
70
86
|
}>, {
|
|
71
|
-
provider:
|
|
87
|
+
provider: "adsterra";
|
|
72
88
|
adKey: string;
|
|
73
89
|
adLabel: string;
|
|
74
90
|
showAdLabel: boolean;
|
|
75
91
|
adLabelPosition: AdLabelPosition;
|
|
92
|
+
showFallbackPlaceholder: boolean;
|
|
93
|
+
fallbackPlaceholderText: string;
|
|
76
94
|
className: string;
|
|
77
95
|
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
78
96
|
declare const AdContainer: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
@@ -104,6 +122,14 @@ declare const AdContainer: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
104
122
|
type: PropType<AdLabelPosition>;
|
|
105
123
|
default: string;
|
|
106
124
|
};
|
|
125
|
+
showFallbackPlaceholder: {
|
|
126
|
+
type: BooleanConstructor;
|
|
127
|
+
default: boolean;
|
|
128
|
+
};
|
|
129
|
+
fallbackPlaceholderText: {
|
|
130
|
+
type: StringConstructor;
|
|
131
|
+
default: string;
|
|
132
|
+
};
|
|
107
133
|
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
108
134
|
[key: string]: any;
|
|
109
135
|
}> | null, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
@@ -135,12 +161,22 @@ declare const AdContainer: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
135
161
|
type: PropType<AdLabelPosition>;
|
|
136
162
|
default: string;
|
|
137
163
|
};
|
|
164
|
+
showFallbackPlaceholder: {
|
|
165
|
+
type: BooleanConstructor;
|
|
166
|
+
default: boolean;
|
|
167
|
+
};
|
|
168
|
+
fallbackPlaceholderText: {
|
|
169
|
+
type: StringConstructor;
|
|
170
|
+
default: string;
|
|
171
|
+
};
|
|
138
172
|
}>> & Readonly<{}>, {
|
|
139
|
-
provider:
|
|
173
|
+
provider: "adsterra";
|
|
140
174
|
adKey: string;
|
|
141
175
|
adLabel: string;
|
|
142
176
|
showAdLabel: boolean;
|
|
143
177
|
adLabelPosition: AdLabelPosition;
|
|
178
|
+
showFallbackPlaceholder: boolean;
|
|
179
|
+
fallbackPlaceholderText: string;
|
|
144
180
|
className: string;
|
|
145
181
|
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
146
182
|
|
package/dist/index.d.ts
CHANGED
|
@@ -29,6 +29,14 @@ declare const AdBanner: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
29
29
|
type: PropType<AdLabelPosition>;
|
|
30
30
|
default: string;
|
|
31
31
|
};
|
|
32
|
+
showFallbackPlaceholder: {
|
|
33
|
+
type: BooleanConstructor;
|
|
34
|
+
default: boolean;
|
|
35
|
+
};
|
|
36
|
+
fallbackPlaceholderText: {
|
|
37
|
+
type: StringConstructor;
|
|
38
|
+
default: string;
|
|
39
|
+
};
|
|
32
40
|
className: {
|
|
33
41
|
type: StringConstructor;
|
|
34
42
|
default: string;
|
|
@@ -60,6 +68,14 @@ declare const AdBanner: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
60
68
|
type: PropType<AdLabelPosition>;
|
|
61
69
|
default: string;
|
|
62
70
|
};
|
|
71
|
+
showFallbackPlaceholder: {
|
|
72
|
+
type: BooleanConstructor;
|
|
73
|
+
default: boolean;
|
|
74
|
+
};
|
|
75
|
+
fallbackPlaceholderText: {
|
|
76
|
+
type: StringConstructor;
|
|
77
|
+
default: string;
|
|
78
|
+
};
|
|
63
79
|
className: {
|
|
64
80
|
type: StringConstructor;
|
|
65
81
|
default: string;
|
|
@@ -68,11 +84,13 @@ declare const AdBanner: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
68
84
|
onLoad?: ((...args: any[]) => any) | undefined;
|
|
69
85
|
onError?: ((...args: any[]) => any) | undefined;
|
|
70
86
|
}>, {
|
|
71
|
-
provider:
|
|
87
|
+
provider: "adsterra";
|
|
72
88
|
adKey: string;
|
|
73
89
|
adLabel: string;
|
|
74
90
|
showAdLabel: boolean;
|
|
75
91
|
adLabelPosition: AdLabelPosition;
|
|
92
|
+
showFallbackPlaceholder: boolean;
|
|
93
|
+
fallbackPlaceholderText: string;
|
|
76
94
|
className: string;
|
|
77
95
|
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
78
96
|
declare const AdContainer: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
@@ -104,6 +122,14 @@ declare const AdContainer: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
104
122
|
type: PropType<AdLabelPosition>;
|
|
105
123
|
default: string;
|
|
106
124
|
};
|
|
125
|
+
showFallbackPlaceholder: {
|
|
126
|
+
type: BooleanConstructor;
|
|
127
|
+
default: boolean;
|
|
128
|
+
};
|
|
129
|
+
fallbackPlaceholderText: {
|
|
130
|
+
type: StringConstructor;
|
|
131
|
+
default: string;
|
|
132
|
+
};
|
|
107
133
|
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
108
134
|
[key: string]: any;
|
|
109
135
|
}> | null, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
@@ -135,12 +161,22 @@ declare const AdContainer: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
135
161
|
type: PropType<AdLabelPosition>;
|
|
136
162
|
default: string;
|
|
137
163
|
};
|
|
164
|
+
showFallbackPlaceholder: {
|
|
165
|
+
type: BooleanConstructor;
|
|
166
|
+
default: boolean;
|
|
167
|
+
};
|
|
168
|
+
fallbackPlaceholderText: {
|
|
169
|
+
type: StringConstructor;
|
|
170
|
+
default: string;
|
|
171
|
+
};
|
|
138
172
|
}>> & Readonly<{}>, {
|
|
139
|
-
provider:
|
|
173
|
+
provider: "adsterra";
|
|
140
174
|
adKey: string;
|
|
141
175
|
adLabel: string;
|
|
142
176
|
showAdLabel: boolean;
|
|
143
177
|
adLabelPosition: AdLabelPosition;
|
|
178
|
+
showFallbackPlaceholder: boolean;
|
|
179
|
+
fallbackPlaceholderText: string;
|
|
144
180
|
className: string;
|
|
145
181
|
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
146
182
|
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,8 @@ var AdBanner = defineComponent({
|
|
|
15
15
|
adLabel: { type: String, default: "Advertisement" },
|
|
16
16
|
showAdLabel: { type: Boolean, default: true },
|
|
17
17
|
adLabelPosition: { type: String, default: "top-left" },
|
|
18
|
+
showFallbackPlaceholder: { type: Boolean, default: false },
|
|
19
|
+
fallbackPlaceholderText: { type: String, default: "Test advertisement" },
|
|
18
20
|
className: { type: String, default: "" }
|
|
19
21
|
},
|
|
20
22
|
emits: ["load", "error"],
|
|
@@ -23,9 +25,14 @@ var AdBanner = defineComponent({
|
|
|
23
25
|
const adLoaded = ref(false);
|
|
24
26
|
const adFailed = ref(false);
|
|
25
27
|
const activeProvider = ref(props.provider);
|
|
26
|
-
watch(
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
watch(
|
|
29
|
+
() => [props.provider, props.format, props.adKey],
|
|
30
|
+
([nextProvider]) => {
|
|
31
|
+
activeProvider.value = nextProvider;
|
|
32
|
+
adLoaded.value = false;
|
|
33
|
+
adFailed.value = false;
|
|
34
|
+
}
|
|
35
|
+
);
|
|
29
36
|
const config = computed(() => resolveAdConfig(props.format, props.adKey || void 0));
|
|
30
37
|
const srcDoc = computed(
|
|
31
38
|
() => buildSrcDoc({ format: props.format, provider: activeProvider.value, config: config.value, bannerId })
|
|
@@ -34,9 +41,6 @@ var AdBanner = defineComponent({
|
|
|
34
41
|
width: typeof config.value.width === "number" ? `${config.value.width}px` : config.value.width,
|
|
35
42
|
height: typeof config.value.height === "number" ? `${config.value.height}px` : config.value.height,
|
|
36
43
|
overflow: "hidden",
|
|
37
|
-
borderRadius: "6px",
|
|
38
|
-
border: "1px solid #e5e7eb",
|
|
39
|
-
background: "#f3f4f6",
|
|
40
44
|
display: "flex",
|
|
41
45
|
alignItems: "center",
|
|
42
46
|
justifyContent: "center"
|
|
@@ -44,21 +48,22 @@ var AdBanner = defineComponent({
|
|
|
44
48
|
const wrapperStyle = computed(() => ({
|
|
45
49
|
display: "inline-flex",
|
|
46
50
|
flexDirection: "column",
|
|
47
|
-
alignItems:
|
|
51
|
+
alignItems: "flex-start",
|
|
52
|
+
width: typeof config.value.width === "number" ? `${config.value.width}px` : config.value.width
|
|
48
53
|
}));
|
|
49
54
|
const labelStyle = computed(() => ({
|
|
50
55
|
fontSize: "10px",
|
|
51
56
|
fontWeight: "600",
|
|
52
57
|
letterSpacing: "0.1em",
|
|
53
58
|
textTransform: "uppercase",
|
|
54
|
-
|
|
59
|
+
opacity: "0.6",
|
|
55
60
|
marginBottom: props.adLabelPosition.startsWith("top") ? "4px" : "0",
|
|
56
61
|
marginTop: props.adLabelPosition.startsWith("bottom") ? "4px" : "0",
|
|
57
62
|
textAlign: props.adLabelPosition.endsWith("left") ? "left" : props.adLabelPosition.endsWith("right") ? "right" : "center",
|
|
58
63
|
width: "100%"
|
|
59
64
|
}));
|
|
60
65
|
const visibilityStyle = computed(
|
|
61
|
-
() => adLoaded.value ? { opacity: "1", transform: "scale(1)" } : {
|
|
66
|
+
() => adLoaded.value || adFailed.value && props.showFallbackPlaceholder ? { opacity: "1", transform: "scale(1)" } : {
|
|
62
67
|
opacity: "0",
|
|
63
68
|
transform: "scale(0.95)",
|
|
64
69
|
pointerEvents: "none",
|
|
@@ -84,18 +89,26 @@ var AdBanner = defineComponent({
|
|
|
84
89
|
onMounted(() => window.addEventListener("message", onMessage));
|
|
85
90
|
onUnmounted(() => window.removeEventListener("message", onMessage));
|
|
86
91
|
return () => {
|
|
87
|
-
if (adFailed.value) return null;
|
|
92
|
+
if (adFailed.value && !props.showFallbackPlaceholder) return null;
|
|
88
93
|
const topLabel = props.showAdLabel && props.adLabelPosition.startsWith("top");
|
|
89
94
|
const bottomLabel = props.showAdLabel && props.adLabelPosition.startsWith("bottom");
|
|
95
|
+
const isPlaceholderVisible = adFailed.value && props.showFallbackPlaceholder;
|
|
90
96
|
return h("div", { class: props.className, style: { ...wrapperStyle.value, ...visibilityStyle.value } }, [
|
|
91
97
|
topLabel ? h("span", { style: labelStyle.value }, props.adLabel) : null,
|
|
92
98
|
h("div", { "data-testid": "ad-banner", style: style.value }, [
|
|
93
|
-
h("iframe", {
|
|
99
|
+
isPlaceholderVisible ? h(FallbackPlaceholder, { format: props.format, text: props.fallbackPlaceholderText }) : h("iframe", {
|
|
94
100
|
title: "Advertisement",
|
|
95
101
|
srcdoc: srcDoc.value,
|
|
102
|
+
width: "100%",
|
|
103
|
+
height: "100%",
|
|
96
104
|
frameborder: "0",
|
|
97
105
|
scrolling: "no",
|
|
98
|
-
sandbox: "allow-scripts allow-forms allow-same-origin allow-popups allow-modals"
|
|
106
|
+
sandbox: "allow-scripts allow-forms allow-same-origin allow-popups allow-modals",
|
|
107
|
+
style: {
|
|
108
|
+
display: "block",
|
|
109
|
+
width: "100%",
|
|
110
|
+
height: "100%"
|
|
111
|
+
}
|
|
99
112
|
})
|
|
100
113
|
]),
|
|
101
114
|
bottomLabel ? h("span", { style: labelStyle.value }, props.adLabel) : null
|
|
@@ -112,14 +125,16 @@ var AdContainer = defineComponent({
|
|
|
112
125
|
className: { type: String, default: "" },
|
|
113
126
|
adLabel: { type: String, default: "Advertisement" },
|
|
114
127
|
showAdLabel: { type: Boolean, default: true },
|
|
115
|
-
adLabelPosition: { type: String, default: "top-left" }
|
|
128
|
+
adLabelPosition: { type: String, default: "top-left" },
|
|
129
|
+
showFallbackPlaceholder: { type: Boolean, default: false },
|
|
130
|
+
fallbackPlaceholderText: { type: String, default: "Test advertisement" }
|
|
116
131
|
},
|
|
117
132
|
setup(props) {
|
|
118
133
|
const adLoaded = ref(false);
|
|
119
134
|
const adFailed = ref(false);
|
|
120
135
|
return () => {
|
|
121
|
-
if (adFailed.value) return null;
|
|
122
|
-
const containerVisibilityStyle = adLoaded.value ? { opacity: "1", transform: "scale(1)" } : {
|
|
136
|
+
if (adFailed.value && !props.showFallbackPlaceholder) return null;
|
|
137
|
+
const containerVisibilityStyle = adLoaded.value || adFailed.value && props.showFallbackPlaceholder ? { opacity: "1", transform: "scale(1)" } : {
|
|
123
138
|
opacity: "0",
|
|
124
139
|
transform: "scale(0.95)",
|
|
125
140
|
pointerEvents: "none",
|
|
@@ -137,6 +152,8 @@ var AdContainer = defineComponent({
|
|
|
137
152
|
adLabel: props.adLabel,
|
|
138
153
|
showAdLabel: props.showAdLabel,
|
|
139
154
|
adLabelPosition: props.adLabelPosition,
|
|
155
|
+
showFallbackPlaceholder: props.showFallbackPlaceholder,
|
|
156
|
+
fallbackPlaceholderText: props.fallbackPlaceholderText,
|
|
140
157
|
onLoad: () => {
|
|
141
158
|
adLoaded.value = true;
|
|
142
159
|
},
|
|
@@ -148,6 +165,42 @@ var AdContainer = defineComponent({
|
|
|
148
165
|
};
|
|
149
166
|
}
|
|
150
167
|
});
|
|
168
|
+
var FallbackPlaceholder = defineComponent({
|
|
169
|
+
name: "FallbackPlaceholder",
|
|
170
|
+
props: {
|
|
171
|
+
format: { type: String, required: true },
|
|
172
|
+
text: { type: String, required: true }
|
|
173
|
+
},
|
|
174
|
+
setup(props) {
|
|
175
|
+
return () => h(
|
|
176
|
+
"div",
|
|
177
|
+
{
|
|
178
|
+
role: "img",
|
|
179
|
+
"aria-label": `${props.text} placeholder`,
|
|
180
|
+
style: {
|
|
181
|
+
width: "100%",
|
|
182
|
+
height: "100%",
|
|
183
|
+
display: "flex",
|
|
184
|
+
flexDirection: "column",
|
|
185
|
+
alignItems: "center",
|
|
186
|
+
justifyContent: "center",
|
|
187
|
+
gap: "6px",
|
|
188
|
+
boxSizing: "border-box",
|
|
189
|
+
padding: "12px",
|
|
190
|
+
border: "1px dashed currentColor",
|
|
191
|
+
opacity: "0.7",
|
|
192
|
+
background: "transparent",
|
|
193
|
+
textAlign: "center",
|
|
194
|
+
fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif'
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
[
|
|
198
|
+
h("strong", { style: { fontSize: "13px", lineHeight: "1.2" } }, props.text),
|
|
199
|
+
h("span", { style: { fontSize: "11px", lineHeight: "1.2" } }, props.format)
|
|
200
|
+
]
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
151
204
|
var index_default = AdBanner;
|
|
152
205
|
export {
|
|
153
206
|
AdBanner,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adsterra-ad/vue",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"vue": "^3.4.0"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@adsterra-ad/core": "0.1.
|
|
34
|
+
"@adsterra-ad/core": "0.1.4"
|
|
35
35
|
},
|
|
36
36
|
"scripts": {
|
|
37
37
|
"build": "tsup src/index.ts --format esm,cjs --dts",
|
|
@@ -43,4 +43,4 @@
|
|
|
43
43
|
"typescript": "^5.5.4",
|
|
44
44
|
"vue": "^3.4.38"
|
|
45
45
|
}
|
|
46
|
-
}
|
|
46
|
+
}
|