@adsterra-ad/vue 0.1.2 → 0.1.3

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 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)(() => props.provider, (next) => {
49
- activeProvider.value = next;
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 })
@@ -80,7 +87,7 @@ var AdBanner = (0, import_vue.defineComponent)({
80
87
  width: "100%"
81
88
  }));
82
89
  const visibilityStyle = (0, import_vue.computed)(
83
- () => adLoaded.value ? { opacity: "1", transform: "scale(1)" } : {
90
+ () => adLoaded.value || adFailed.value && props.showFallbackPlaceholder ? { opacity: "1", transform: "scale(1)" } : {
84
91
  opacity: "0",
85
92
  transform: "scale(0.95)",
86
93
  pointerEvents: "none",
@@ -106,18 +113,26 @@ var AdBanner = (0, import_vue.defineComponent)({
106
113
  (0, import_vue.onMounted)(() => window.addEventListener("message", onMessage));
107
114
  (0, import_vue.onUnmounted)(() => window.removeEventListener("message", onMessage));
108
115
  return () => {
109
- if (adFailed.value) return null;
116
+ if (adFailed.value && !props.showFallbackPlaceholder) return null;
110
117
  const topLabel = props.showAdLabel && props.adLabelPosition.startsWith("top");
111
118
  const bottomLabel = props.showAdLabel && props.adLabelPosition.startsWith("bottom");
119
+ const isPlaceholderVisible = adFailed.value && props.showFallbackPlaceholder;
112
120
  return (0, import_vue.h)("div", { class: props.className, style: { ...wrapperStyle.value, ...visibilityStyle.value } }, [
113
121
  topLabel ? (0, import_vue.h)("span", { style: labelStyle.value }, props.adLabel) : null,
114
122
  (0, import_vue.h)("div", { "data-testid": "ad-banner", style: style.value }, [
115
- (0, import_vue.h)("iframe", {
123
+ isPlaceholderVisible ? (0, import_vue.h)(FallbackPlaceholder, { format: props.format, text: props.fallbackPlaceholderText }) : (0, import_vue.h)("iframe", {
116
124
  title: "Advertisement",
117
125
  srcdoc: srcDoc.value,
126
+ width: "100%",
127
+ height: "100%",
118
128
  frameborder: "0",
119
129
  scrolling: "no",
120
- sandbox: "allow-scripts allow-forms allow-same-origin allow-popups allow-modals"
130
+ sandbox: "allow-scripts allow-forms allow-same-origin allow-popups allow-modals",
131
+ style: {
132
+ display: "block",
133
+ width: "100%",
134
+ height: "100%"
135
+ }
121
136
  })
122
137
  ]),
123
138
  bottomLabel ? (0, import_vue.h)("span", { style: labelStyle.value }, props.adLabel) : null
@@ -134,14 +149,16 @@ var AdContainer = (0, import_vue.defineComponent)({
134
149
  className: { type: String, default: "" },
135
150
  adLabel: { type: String, default: "Advertisement" },
136
151
  showAdLabel: { type: Boolean, default: true },
137
- adLabelPosition: { type: String, default: "top-left" }
152
+ adLabelPosition: { type: String, default: "top-left" },
153
+ showFallbackPlaceholder: { type: Boolean, default: false },
154
+ fallbackPlaceholderText: { type: String, default: "Test advertisement" }
138
155
  },
139
156
  setup(props) {
140
157
  const adLoaded = (0, import_vue.ref)(false);
141
158
  const adFailed = (0, import_vue.ref)(false);
142
159
  return () => {
143
- if (adFailed.value) return null;
144
- const containerVisibilityStyle = adLoaded.value ? { opacity: "1", transform: "scale(1)" } : {
160
+ if (adFailed.value && !props.showFallbackPlaceholder) return null;
161
+ const containerVisibilityStyle = adLoaded.value || adFailed.value && props.showFallbackPlaceholder ? { opacity: "1", transform: "scale(1)" } : {
145
162
  opacity: "0",
146
163
  transform: "scale(0.95)",
147
164
  pointerEvents: "none",
@@ -159,6 +176,8 @@ var AdContainer = (0, import_vue.defineComponent)({
159
176
  adLabel: props.adLabel,
160
177
  showAdLabel: props.showAdLabel,
161
178
  adLabelPosition: props.adLabelPosition,
179
+ showFallbackPlaceholder: props.showFallbackPlaceholder,
180
+ fallbackPlaceholderText: props.fallbackPlaceholderText,
162
181
  onLoad: () => {
163
182
  adLoaded.value = true;
164
183
  },
@@ -170,6 +189,41 @@ var AdContainer = (0, import_vue.defineComponent)({
170
189
  };
171
190
  }
172
191
  });
192
+ var FallbackPlaceholder = (0, import_vue.defineComponent)({
193
+ name: "FallbackPlaceholder",
194
+ props: {
195
+ format: { type: String, required: true },
196
+ text: { type: String, required: true }
197
+ },
198
+ setup(props) {
199
+ return () => (0, import_vue.h)(
200
+ "div",
201
+ {
202
+ role: "img",
203
+ "aria-label": `${props.text} placeholder`,
204
+ style: {
205
+ width: "100%",
206
+ height: "100%",
207
+ display: "flex",
208
+ flexDirection: "column",
209
+ alignItems: "center",
210
+ justifyContent: "center",
211
+ gap: "6px",
212
+ boxSizing: "border-box",
213
+ padding: "12px",
214
+ color: "#475569",
215
+ background: "repeating-linear-gradient(135deg, #f8fafc 0, #f8fafc 10px, #eef2f7 10px, #eef2f7 20px)",
216
+ textAlign: "center",
217
+ fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif'
218
+ }
219
+ },
220
+ [
221
+ (0, import_vue.h)("strong", { style: { fontSize: "13px", lineHeight: "1.2" } }, props.text),
222
+ (0, import_vue.h)("span", { style: { fontSize: "11px", lineHeight: "1.2" } }, props.format)
223
+ ]
224
+ );
225
+ }
226
+ });
173
227
  var index_default = AdBanner;
174
228
  // Annotate the CommonJS export names for ESM import in node:
175
229
  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;
@@ -73,6 +89,8 @@ declare const AdBanner: vue.DefineComponent<vue.ExtractPropTypes<{
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
173
  provider: AdProvider;
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;
@@ -73,6 +89,8 @@ declare const AdBanner: vue.DefineComponent<vue.ExtractPropTypes<{
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
173
  provider: AdProvider;
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(() => props.provider, (next) => {
27
- activeProvider.value = next;
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 })
@@ -58,7 +65,7 @@ var AdBanner = defineComponent({
58
65
  width: "100%"
59
66
  }));
60
67
  const visibilityStyle = computed(
61
- () => adLoaded.value ? { opacity: "1", transform: "scale(1)" } : {
68
+ () => adLoaded.value || adFailed.value && props.showFallbackPlaceholder ? { opacity: "1", transform: "scale(1)" } : {
62
69
  opacity: "0",
63
70
  transform: "scale(0.95)",
64
71
  pointerEvents: "none",
@@ -84,18 +91,26 @@ var AdBanner = defineComponent({
84
91
  onMounted(() => window.addEventListener("message", onMessage));
85
92
  onUnmounted(() => window.removeEventListener("message", onMessage));
86
93
  return () => {
87
- if (adFailed.value) return null;
94
+ if (adFailed.value && !props.showFallbackPlaceholder) return null;
88
95
  const topLabel = props.showAdLabel && props.adLabelPosition.startsWith("top");
89
96
  const bottomLabel = props.showAdLabel && props.adLabelPosition.startsWith("bottom");
97
+ const isPlaceholderVisible = adFailed.value && props.showFallbackPlaceholder;
90
98
  return h("div", { class: props.className, style: { ...wrapperStyle.value, ...visibilityStyle.value } }, [
91
99
  topLabel ? h("span", { style: labelStyle.value }, props.adLabel) : null,
92
100
  h("div", { "data-testid": "ad-banner", style: style.value }, [
93
- h("iframe", {
101
+ isPlaceholderVisible ? h(FallbackPlaceholder, { format: props.format, text: props.fallbackPlaceholderText }) : h("iframe", {
94
102
  title: "Advertisement",
95
103
  srcdoc: srcDoc.value,
104
+ width: "100%",
105
+ height: "100%",
96
106
  frameborder: "0",
97
107
  scrolling: "no",
98
- sandbox: "allow-scripts allow-forms allow-same-origin allow-popups allow-modals"
108
+ sandbox: "allow-scripts allow-forms allow-same-origin allow-popups allow-modals",
109
+ style: {
110
+ display: "block",
111
+ width: "100%",
112
+ height: "100%"
113
+ }
99
114
  })
100
115
  ]),
101
116
  bottomLabel ? h("span", { style: labelStyle.value }, props.adLabel) : null
@@ -112,14 +127,16 @@ var AdContainer = defineComponent({
112
127
  className: { type: String, default: "" },
113
128
  adLabel: { type: String, default: "Advertisement" },
114
129
  showAdLabel: { type: Boolean, default: true },
115
- adLabelPosition: { type: String, default: "top-left" }
130
+ adLabelPosition: { type: String, default: "top-left" },
131
+ showFallbackPlaceholder: { type: Boolean, default: false },
132
+ fallbackPlaceholderText: { type: String, default: "Test advertisement" }
116
133
  },
117
134
  setup(props) {
118
135
  const adLoaded = ref(false);
119
136
  const adFailed = ref(false);
120
137
  return () => {
121
- if (adFailed.value) return null;
122
- const containerVisibilityStyle = adLoaded.value ? { opacity: "1", transform: "scale(1)" } : {
138
+ if (adFailed.value && !props.showFallbackPlaceholder) return null;
139
+ const containerVisibilityStyle = adLoaded.value || adFailed.value && props.showFallbackPlaceholder ? { opacity: "1", transform: "scale(1)" } : {
123
140
  opacity: "0",
124
141
  transform: "scale(0.95)",
125
142
  pointerEvents: "none",
@@ -137,6 +154,8 @@ var AdContainer = defineComponent({
137
154
  adLabel: props.adLabel,
138
155
  showAdLabel: props.showAdLabel,
139
156
  adLabelPosition: props.adLabelPosition,
157
+ showFallbackPlaceholder: props.showFallbackPlaceholder,
158
+ fallbackPlaceholderText: props.fallbackPlaceholderText,
140
159
  onLoad: () => {
141
160
  adLoaded.value = true;
142
161
  },
@@ -148,6 +167,41 @@ var AdContainer = defineComponent({
148
167
  };
149
168
  }
150
169
  });
170
+ var FallbackPlaceholder = defineComponent({
171
+ name: "FallbackPlaceholder",
172
+ props: {
173
+ format: { type: String, required: true },
174
+ text: { type: String, required: true }
175
+ },
176
+ setup(props) {
177
+ return () => h(
178
+ "div",
179
+ {
180
+ role: "img",
181
+ "aria-label": `${props.text} placeholder`,
182
+ style: {
183
+ width: "100%",
184
+ height: "100%",
185
+ display: "flex",
186
+ flexDirection: "column",
187
+ alignItems: "center",
188
+ justifyContent: "center",
189
+ gap: "6px",
190
+ boxSizing: "border-box",
191
+ padding: "12px",
192
+ color: "#475569",
193
+ background: "repeating-linear-gradient(135deg, #f8fafc 0, #f8fafc 10px, #eef2f7 10px, #eef2f7 20px)",
194
+ textAlign: "center",
195
+ fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif'
196
+ }
197
+ },
198
+ [
199
+ h("strong", { style: { fontSize: "13px", lineHeight: "1.2" } }, props.text),
200
+ h("span", { style: { fontSize: "11px", lineHeight: "1.2" } }, props.format)
201
+ ]
202
+ );
203
+ }
204
+ });
151
205
  var index_default = AdBanner;
152
206
  export {
153
207
  AdBanner,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adsterra-ad/vue",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
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.2"
34
+ "@adsterra-ad/core": "0.1.3"
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
+ }