@surfside/ads-core-web 0.1.0 → 0.1.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 (51) hide show
  1. package/README.md +15 -15
  2. package/lib/cjs/debug/carousel.js +74 -0
  3. package/lib/cjs/debug/carousel.js.map +1 -0
  4. package/lib/cjs/helpers/Dom.js +52 -0
  5. package/lib/cjs/helpers/Dom.js.map +1 -0
  6. package/lib/cjs/helpers/Trackers.js +20 -0
  7. package/lib/cjs/helpers/Trackers.js.map +1 -0
  8. package/lib/cjs/helpers/index.js +19 -0
  9. package/lib/cjs/helpers/index.js.map +1 -0
  10. package/lib/cjs/index.js +49 -6099
  11. package/lib/cjs/index.js.map +1 -0
  12. package/lib/cjs/rendering/Banner.js +93 -0
  13. package/lib/cjs/rendering/Banner.js.map +1 -0
  14. package/lib/cjs/rendering/Carousel.js +350 -0
  15. package/lib/cjs/rendering/Carousel.js.map +1 -0
  16. package/lib/cjs/rendering/Framework.js +90 -0
  17. package/lib/cjs/rendering/Framework.js.map +1 -0
  18. package/lib/cjs/rendering/ProductCard.js +106 -0
  19. package/lib/cjs/rendering/ProductCard.js.map +1 -0
  20. package/lib/cjs/rendering/Video.js +299 -0
  21. package/lib/cjs/rendering/Video.js.map +1 -0
  22. package/lib/cjs/rendering/Watermark.js +59 -0
  23. package/lib/cjs/rendering/Watermark.js.map +1 -0
  24. package/lib/cjs/rendering/index.js +23 -0
  25. package/lib/cjs/rendering/index.js.map +1 -0
  26. package/lib/esm/debug/carousel.js +72 -0
  27. package/lib/esm/debug/carousel.js.map +1 -0
  28. package/lib/esm/helpers/Dom.js +43 -0
  29. package/lib/esm/helpers/Dom.js.map +1 -0
  30. package/lib/esm/helpers/Trackers.js +15 -0
  31. package/lib/esm/helpers/Trackers.js.map +1 -0
  32. package/lib/esm/helpers/index.js +3 -0
  33. package/lib/esm/helpers/index.js.map +1 -0
  34. package/lib/esm/index.js +26 -6063
  35. package/lib/esm/index.js.map +1 -0
  36. package/lib/esm/rendering/Banner.js +88 -0
  37. package/lib/esm/rendering/Banner.js.map +1 -0
  38. package/lib/esm/rendering/Carousel.js +344 -0
  39. package/lib/esm/rendering/Carousel.js.map +1 -0
  40. package/lib/esm/rendering/Framework.js +83 -0
  41. package/lib/esm/rendering/Framework.js.map +1 -0
  42. package/lib/esm/rendering/ProductCard.js +101 -0
  43. package/lib/esm/rendering/ProductCard.js.map +1 -0
  44. package/lib/esm/rendering/Video.js +295 -0
  45. package/lib/esm/rendering/Video.js.map +1 -0
  46. package/lib/esm/rendering/Watermark.js +55 -0
  47. package/lib/esm/rendering/Watermark.js.map +1 -0
  48. package/lib/esm/rendering/index.js +7 -0
  49. package/lib/esm/rendering/index.js.map +1 -0
  50. package/package.json +35 -27
  51. package/lib/types/debug/dist/index-7was9ptg.d.ts +0 -2
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MissingTrackersError = exports.RenderProductCard = void 0;
4
+ const ads_core_client_1 = require("@surfside/ads-core-client");
5
+ const Framework_1 = require("./Framework");
6
+ const Trackers_1 = require("../helpers/Trackers");
7
+ const RenderProductCard = (logger, stylesheet, javascriptCallbacks, evaluateProductCardTemplate, productCard) => {
8
+ const log = (0, ads_core_client_1.Ctx)(logger)?.with('RenderProductCard');
9
+ log?.info('Rendering product card');
10
+ log?.debug(productCard);
11
+ const container = document.createElement('div');
12
+ log?.info('product card container', container);
13
+ const shadow = container.attachShadow({ mode: 'open' });
14
+ const productCardHtml = evaluateProductCardTemplate(productCard.product, productCard.clickthrough);
15
+ if (!productCardHtml.ok) {
16
+ return productCardHtml;
17
+ }
18
+ logger?.info('productCardHtml', productCardHtml);
19
+ const productCardDomRes = (0, Framework_1.Template)(log, 'surf-product-card', productCardHtml.value, style + '\n' + stylesheet, {
20
+ callbacks: javascriptCallbacks,
21
+ product: productCard.product
22
+ });
23
+ if (!productCardDomRes.ok) {
24
+ return productCardDomRes;
25
+ }
26
+ if (productCard.sponsored) {
27
+ productCardDomRes.value.classList.add('sponsored');
28
+ }
29
+ else {
30
+ log?.debug('Recommended', productCard);
31
+ }
32
+ productCardDomRes.value.style.display = 'flex';
33
+ log?.debug('Product Card Rendered');
34
+ shadow.appendChild(productCardDomRes.value);
35
+ attachClickthroughNotifiers(log, productCardDomRes.value, productCard.clickthrough);
36
+ if (productCard.trackers !== undefined) {
37
+ appendTrackers(log, productCardDomRes.value, productCard.trackers);
38
+ }
39
+ else if (productCard.sponsored) {
40
+ return (0, ads_core_client_1.Err)(new MissingTrackersError(productCard));
41
+ }
42
+ container.productData = productCard;
43
+ return (0, ads_core_client_1.Ok)(container);
44
+ };
45
+ exports.RenderProductCard = RenderProductCard;
46
+ const attachClickthroughNotifiers = (logger, root, clickthrough) => root.querySelectorAll('[_click]').forEach(e => e.addEventListener('click', callClickthroughNotifier(logger)(clickthrough)));
47
+ const callClickthroughNotifier = (logger) => (clickthrough) => () => {
48
+ const log = (0, ads_core_client_1.Ctx)(logger)?.with('callClickthroughNotifier');
49
+ fetch(clickthrough)
50
+ .then(() => log?.debug('Called clickthrough notification'))
51
+ .catch(() => log?.debug('Called clickthrough handler, but got an error code. This is not ' +
52
+ 'necessarily a problem, the clickthrough probably fired correctly.'));
53
+ };
54
+ const appendTrackers = (logger, root, trackers) => {
55
+ const log = (0, ads_core_client_1.Ctx)(logger)?.with('appendTrackers');
56
+ log?.info('Appending trackers', trackers);
57
+ log?.debug('Appending win tracker', trackers.win);
58
+ root.appendChild((0, Trackers_1.PixelTracker)(trackers.win));
59
+ log?.debug('Appending impression trackers', trackers.imp);
60
+ trackers.imp
61
+ .map(Trackers_1.PixelTracker)
62
+ .forEach(tracker => root.appendChild(tracker));
63
+ // Other javascript trackers
64
+ log?.debug('Appending other js trackers', trackers.others);
65
+ trackers.others.filter(t => t.type === ads_core_client_1.EventTrackingMethods.JS)
66
+ .map(t => t.url)
67
+ .map(Trackers_1.ScriptTracker)
68
+ .forEach(tracker => root.appendChild(tracker));
69
+ // Other pixel trackers
70
+ log?.debug('Appending other pixel trackers', trackers.others);
71
+ trackers.others.filter(t => t.type === ads_core_client_1.EventTrackingMethods.Img)
72
+ .map(t => t.url)
73
+ .map(Trackers_1.PixelTracker)
74
+ .forEach(tracker => root.appendChild(tracker));
75
+ };
76
+ class MissingTrackersError extends Error {
77
+ productCardResponse;
78
+ constructor(productCardResponse) {
79
+ super('Sponsored product card response is missing trackers - cannot render card as it would ' +
80
+ 'result in uncounted impressions');
81
+ this.productCardResponse = productCardResponse;
82
+ }
83
+ }
84
+ exports.MissingTrackersError = MissingTrackersError;
85
+ ;
86
+ const style = `.surf-product-card {
87
+ width: 100%;
88
+
89
+ &.sponsored {
90
+ position: relative;
91
+
92
+ &::after {
93
+ content: 'Sponsored';
94
+ position: absolute;
95
+ font-family: Verdana, Helvetica, 'sans-serif';
96
+ font-weight: 100;
97
+ color: rgba(0, 0, 0, 0.6);
98
+ font-size: 12px;
99
+ box-sizing: border-box;
100
+ bottom: -24px;
101
+ width: 100%;
102
+ text-align: center;
103
+ }
104
+ }
105
+ }`;
106
+ //# sourceMappingURL=ProductCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductCard.js","sourceRoot":"src/","sources":["rendering/ProductCard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenderVideo = void 0;
4
+ const ads_core_client_1 = require("@surfside/ads-core-client");
5
+ const Framework_1 = require("./Framework");
6
+ ;
7
+ ;
8
+ const RenderVideo = (logger, deviceInfo, geo, userAgent, builtVideo) => {
9
+ const log = (0, ads_core_client_1.Ctx)(logger)?.with('RenderVideo');
10
+ log?.info('Rendering video');
11
+ log?.debug(builtVideo);
12
+ const videoContainer = document.createElement('div');
13
+ const shadow = videoContainer.attachShadow({ mode: 'open' });
14
+ const creativeContainerResult = (0, Framework_1.Template)(log, 'surfside-video', template, style);
15
+ if (!creativeContainerResult.ok) {
16
+ log?.error('Failed to load video player template', builtVideo, template, style);
17
+ return creativeContainerResult;
18
+ }
19
+ const creativeContainer = creativeContainerResult.value;
20
+ shadow.appendChild(creativeContainer);
21
+ const video = (0, Framework_1.QuerySelectorResult)(creativeContainer, '#surf-video-container');
22
+ if (!video.ok) {
23
+ log?.error('Failed to find video player element', builtVideo, creativeContainer);
24
+ return video;
25
+ }
26
+ const linearRes = (0, ads_core_client_1.WrapValue)(builtVideo.video.ads[0]?.inline.creatives[0]);
27
+ if (!linearRes.ok) {
28
+ return linearRes;
29
+ }
30
+ const linear = linearRes.value;
31
+ for (const mediaFile of linear.mediaFiles) {
32
+ const source = document.createElement('source');
33
+ source.src = mediaFile.url;
34
+ source.type = mediaFile.type;
35
+ source.id = mediaFile.id;
36
+ video.value.appendChild(source);
37
+ }
38
+ // Attach callbacks
39
+ const surfVideoContainerRes = (0, Framework_1.QuerySelectorResult)(videoContainer, '#surf-video-container');
40
+ if (!surfVideoContainerRes.ok) {
41
+ return surfVideoContainerRes;
42
+ }
43
+ surfVideoContainerRes.value.addEventListener('loadeddata', () => loadInteractiveElements(logger, deviceInfo, geo, userAgent, videoContainer, linear));
44
+ return (0, ads_core_client_1.Ok)(videoContainer);
45
+ };
46
+ exports.RenderVideo = RenderVideo;
47
+ const loadInteractiveElements = (logger, deviceInfo, geo, userAgent, element, linear) => {
48
+ const log = (0, ads_core_client_1.Ctx)(logger)?.with('loadInteractiveElements');
49
+ log?.info('Video loaded. Adding interactive elements to the video player');
50
+ const videoElementRes = (0, Framework_1.QuerySelectorResult)(element, '#surf-video-container');
51
+ if (!videoElementRes.ok) {
52
+ return videoElementRes;
53
+ }
54
+ const videoElement = videoElementRes.value;
55
+ const duration = videoElement.duration;
56
+ const timerValueRes = (0, Framework_1.QuerySelectorResult)(element, '.timer-value');
57
+ if (!timerValueRes.ok) {
58
+ return timerValueRes;
59
+ }
60
+ const timerValue = timerValueRes.value;
61
+ timerValue.innerHTML = String(duration);
62
+ const trackersRes = initializeTrackers(log, linear.trackingEvents);
63
+ if (!trackersRes.ok) {
64
+ return trackersRes;
65
+ }
66
+ const trackers = trackersRes.value;
67
+ videoElement.onplay = () => fireTracker(log, deviceInfo, geo, userAgent, trackers, 'start');
68
+ videoElement.onended = () => fireTracker(log, deviceInfo, geo, userAgent, trackers, 'complete');
69
+ videoElement.ontimeupdate = async () => {
70
+ const currentTime = Math.floor(videoElement.currentTime);
71
+ timerValue.innerHTML = String(currentTime);
72
+ const percent = currentTime / videoElement.duration;
73
+ if (percent >= 0.25 && percent < 0.5) {
74
+ fireTracker(log, deviceInfo, geo, userAgent, trackers, 'firstQuartile');
75
+ }
76
+ else if (percent >= 0.5 && percent < 0.75) {
77
+ fireTracker(log, deviceInfo, geo, userAgent, trackers, 'midpoint');
78
+ }
79
+ else if (percent >= 0.75) {
80
+ fireTracker(log, deviceInfo, geo, userAgent, trackers, 'thirdQuartile');
81
+ }
82
+ };
83
+ const muteButton = (0, Framework_1.QuerySelectorResult)(element, '.mute-button');
84
+ if (muteButton.ok) {
85
+ log?.info('Adding mute handler');
86
+ muteButton.value.addEventListener('click', toggleMute.bind(undefined, log, videoElement));
87
+ }
88
+ else {
89
+ log?.info('Missing mute button');
90
+ }
91
+ const timerCircleRes = (0, Framework_1.QuerySelectorResult)(element, '.timer-circle');
92
+ if (!timerCircleRes.ok) {
93
+ return timerCircleRes;
94
+ }
95
+ const timerCircle = timerCircleRes.value;
96
+ timerCircle.style.animationDuration = `${videoElement.duration}s`;
97
+ log?.info('timerCircle.style.animationDuration', timerCircle.style.animationDuration);
98
+ videoElement.play()
99
+ .then(() => {
100
+ timerCircle.style.animationPlayState = 'running';
101
+ })
102
+ .catch(err => console.warn('User disallowed auto playing of video', err));
103
+ fireTracker(log, deviceInfo, geo, userAgent, trackers, 'impression');
104
+ return (0, ads_core_client_1.Ok)(true);
105
+ };
106
+ const initializeTrackers = (logger, trackers) => {
107
+ const log = (0, ads_core_client_1.Ctx)(logger)?.with('initializeTrackers');
108
+ log?.info('Initiailizing trackers', trackers);
109
+ const videoTrackers = {
110
+ start: { fired: false },
111
+ firstQuartile: { fired: false },
112
+ midpoint: { fired: false },
113
+ thirdQuartile: { fired: false },
114
+ complete: { fired: false },
115
+ impression: { fired: false },
116
+ stop: { fired: false }
117
+ };
118
+ for (const tracker of trackers) {
119
+ const eventName = tracker.event;
120
+ const url = tracker.url;
121
+ videoTrackers[eventName].url = url;
122
+ }
123
+ return (0, ads_core_client_1.Ok)(videoTrackers);
124
+ };
125
+ const fireTracker = (logger, deviceInfo, geo, userAgent, trackers, trackerName) => {
126
+ const log = (0, ads_core_client_1.Ctx)(logger)?.with('fireTracker');
127
+ log?.info('Firing video tracker [' + trackerName + ']');
128
+ const trackerData = trackers[trackerName];
129
+ if (trackerData.fired) {
130
+ return;
131
+ }
132
+ const urlString = trackerData.url;
133
+ if (urlString === undefined) {
134
+ log?.error('urlstring was undefined for tracker [' + trackerName + ']');
135
+ return;
136
+ }
137
+ const url = new URL(urlString);
138
+ const { os, osv, make, model } = deviceInfo ?? {};
139
+ const { latitude, longitude } = geo?.coords ?? {};
140
+ const addParam = (param, value) => value !== undefined
141
+ ? url.searchParams.set(param, value)
142
+ : undefined;
143
+ addParam('os', os);
144
+ addParam('os', osv);
145
+ addParam('make', make);
146
+ addParam('model', model);
147
+ addParam('ua', userAgent);
148
+ addParam('lat', latitude?.toString());
149
+ addParam('lon', longitude?.toString());
150
+ trackerData.fired = true;
151
+ fetch(url, {
152
+ method: 'GET',
153
+ mode: 'no-cors'
154
+ }).then(() => {
155
+ log?.debug('Successfully fired tracker [' + trackerName + ']');
156
+ }).catch(err => {
157
+ log?.error('Failed to fire tracker [' + trackerName + ']', err);
158
+ });
159
+ };
160
+ const toggleMute = (logger, videoElement, e) => {
161
+ const log = (0, ads_core_client_1.Ctx)(logger)?.with('toggleMute');
162
+ log?.info('Toggling mute button');
163
+ videoElement.muted = !videoElement.muted;
164
+ const element = e.target;
165
+ if (videoElement.muted) {
166
+ log?.debug('Muted');
167
+ element.classList.add('muted');
168
+ element.classList.remove('unmuted');
169
+ }
170
+ else {
171
+ log?.debug('Unmuted');
172
+ element.classList.add('unmuted');
173
+ element.classList.remove('muted');
174
+ }
175
+ };
176
+ const template = `<div>
177
+ <video id="surf-video-container" autoplay muted></video>
178
+
179
+ <div class="timer">
180
+ <svg
181
+ width="36"
182
+ height="36"
183
+ viewBox="-2 2 36 36"
184
+ >
185
+ <circle
186
+ cx="16"
187
+ cy="16"
188
+ r="15"
189
+ stroke="#7b4af4"
190
+ stroke-width="4"
191
+ fill="none"
192
+ class="timer-circle"
193
+ />
194
+ </svg>
195
+ <div class="timer-value"></div>
196
+ </div>
197
+
198
+ <div class="watermark"></div>
199
+ <div class="mute-button muted"></div>
200
+ </div>`;
201
+ const style = `@keyframes grow-arc {
202
+ 0% {
203
+ stroke-dasharray: 0 94; /* 0% of the circumference */
204
+ stroke-dashoffset: 0;
205
+ }
206
+ 50% {
207
+ stroke-dasharray: 47 94; /* 90 degrees of the circle */
208
+ stroke-dashoffset: 0;
209
+ }
210
+ 100% {
211
+ stroke-dasharray: 94 94; /* Full circle */
212
+ stroke-dashoffset: 0;
213
+ }
214
+ }
215
+
216
+
217
+ .surfside-video {
218
+ --icon-muted: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none'%3E%3Cpath fill='currentColor' fill-rule='evenodd' d='M9.586 3.586C10.846 2.326 13 3.218 13 5v14c0 1.782-2.154 2.674-3.414 1.414L5.172 16H4a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h1.172l4.414-4.414ZM11 5 6.293 9.707a1 1 0 0 1-.707.293H4v4h1.586a1 1 0 0 1 .707.293L11 19V5Zm5.293 4.293a1 1 0 0 1 1.414 0L19 10.586l1.293-1.293a1 1 0 1 1 1.414 1.414L20.414 12l1.293 1.293a1 1 0 0 1-1.414 1.414L19 13.414l-1.293 1.293a1 1 0 0 1-1.414-1.414L17.586 12l-1.293-1.293a1 1 0 0 1 0-1.414Z' clip-rule='evenodd'/%3E%3C/svg%3E");
219
+ --icon-unmuted: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none'%3E%3Cpath fill='currentColor' fill-rule='evenodd' d='M9.586 3.586C10.846 2.326 13 3.218 13 5v14c0 1.782-2.154 2.674-3.414 1.414L5.172 16H4a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h1.172l4.414-4.414ZM11 5 6.293 9.707a1 1 0 0 1-.707.293H4v4h1.586a1 1 0 0 1 .707.293L11 19V5Zm6.657-.071a1 1 0 0 1 1.414 0c3.905 3.905 3.905 10.237 0 14.142a1 1 0 0 1-1.414-1.414 8 8 0 0 0 0-11.314 1 1 0 0 1 0-1.414Zm-2.829 2.828a1 1 0 0 1 1.415 0 6 6 0 0 1 0 8.486 1 1 0 1 1-1.415-1.415 4 4 0 0 0 0-5.656 1 1 0 0 1 0-1.415Z' clip-rule='evenodd'/%3E%3C/svg%3E");
220
+
221
+ position: relative;
222
+ overflow: hidden;
223
+
224
+ video {
225
+ width: 100%;
226
+ height: auto;
227
+ }
228
+
229
+ .timer {
230
+ position: absolute;
231
+ left: 5px;
232
+ top: 5px;
233
+ width: 32px;
234
+ height: 32px;
235
+
236
+ .timer-value {
237
+ position: absolute;
238
+ top: 0px;
239
+ left: 0;
240
+ width: 36px;
241
+ height: 36px;
242
+
243
+ color: white;
244
+
245
+ font-family: Poppins, Arial;
246
+ text-align: center;
247
+ font-size: 12px;
248
+ line-height: 36px;
249
+ }
250
+
251
+ .timer-circle {
252
+ fill: none;
253
+ stroke-width: 4;
254
+ animation-name: grow-arc;
255
+ animation-iteration-count: 1;
256
+ animation-timing-function: linear;
257
+ animation-fill-mode: forwards;
258
+ transform: rotate(-90deg);
259
+ transform-origin: 50% 50%;
260
+ }
261
+
262
+ }
263
+
264
+ .mute-button {
265
+ position: absolute;
266
+ width: 24px;
267
+ height: 24px;
268
+ right: 5px;
269
+ bottom: 5px;
270
+ cursor: pointer;
271
+ transition: transform 0.2s;
272
+ filter: drop-shadow(0 0 2px white) drop-shadow(0 0 4px white);
273
+
274
+ &:hover {
275
+ transform: scale(1.3);
276
+ }
277
+
278
+ &:active {
279
+ transform: scale(0.8);
280
+ }
281
+
282
+ &.muted {
283
+ background-image: var(--icon-muted);
284
+
285
+ &:hover {
286
+ background-image: var(--icon-unmuted);
287
+ }
288
+ }
289
+
290
+ &.unmuted {
291
+ background-image: var(--icon-unmuted);
292
+
293
+ &:hover {
294
+ background-image: var(--icon-muted);
295
+ }
296
+ }
297
+ }
298
+ }`;
299
+ //# sourceMappingURL=Video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Video.js","sourceRoot":"src/","sources":["rendering/Video.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenderWatermark = void 0;
4
+ const ads_core_1 = require("@surfside/ads-core");
5
+ const RenderWatermark = (logger) => {
6
+ const log = (0, ads_core_1.Ctx)(logger)?.with('RenderWatermark');
7
+ const parser = new DOMParser();
8
+ const doc = parser.parseFromString(template, 'text/html');
9
+ const wrapper = document.createElement('div');
10
+ const shadow = wrapper.attachShadow({ mode: 'open' });
11
+ const stylesheet = document.createElement('style');
12
+ stylesheet.innerHTML = style;
13
+ shadow.appendChild(stylesheet);
14
+ for (let i = 0; i < doc.body.children.length; i++) {
15
+ const element = doc.body.children.item(i);
16
+ if (element === null) {
17
+ log?.warn('Child returned null for some reason', i);
18
+ continue;
19
+ }
20
+ shadow.appendChild(element);
21
+ }
22
+ return (0, ads_core_1.Ok)(wrapper);
23
+ };
24
+ exports.RenderWatermark = RenderWatermark;
25
+ const template = `<div class="watermark">
26
+ <a href="https://surfside.io/contact" target="_blank">
27
+ <div class="watermark-svg">
28
+ <img src="https://cdn.surfside.io/assets/surfside-logo.svg" alt="Surfside logo"/>
29
+ </div>
30
+ </a>
31
+ </div>
32
+ `;
33
+ const style = `.watermark {
34
+ background: rgba(255, 255, 255, 0.7);
35
+
36
+ position: absolute;
37
+ right: -67px;
38
+ width: 85px;
39
+ /* transform: scale(0.8); */
40
+ transform-origin: bottom right;
41
+ bottom: 0;
42
+
43
+ padding: 3px 2px 0px 6px;
44
+ border-radius: 5px 0 0 5px !important;
45
+ transition: right 300ms ease-out;
46
+
47
+ &:hover {
48
+ right: 0
49
+ }
50
+ }
51
+
52
+ .surfside-video .watermark {
53
+ top: 0;
54
+ height: auto;
55
+ bottom: initial;
56
+ overflow: hidden;
57
+ }
58
+ `;
59
+ //# sourceMappingURL=Watermark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Watermark.js","sourceRoot":"src/","sources":["rendering/Watermark.ts"],"names":[],"mappings":";;;AAAA,iDAAwE;AAEjE,MAAM,eAAe,GAAG,CAAC,MAA2B,EAAuB,EAAE;IAChF,MAAM,GAAG,GAAG,IAAA,cAAG,EAAC,MAAM,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAEjD,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE1D,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACnD,UAAU,CAAC,SAAS,GAAG,KAAK,CAAC;IAC7B,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACnB,GAAG,EAAE,IAAI,CAAC,qCAAqC,EAAE,CAAC,CAAC,CAAC;YACpD,SAAS;QACb,CAAC;QAED,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,IAAA,aAAE,EAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC;AAxBW,QAAA,eAAe,mBAwB1B;AAEF,MAAM,QAAQ,GAAG;;;;;;;CAOhB,CAAC;AAEF,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBb,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Banner"), exports);
18
+ __exportStar(require("./Carousel"), exports);
19
+ __exportStar(require("./Framework"), exports);
20
+ __exportStar(require("./ProductCard"), exports);
21
+ __exportStar(require("./Video"), exports);
22
+ __exportStar(require("./Watermark"), exports);
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"src/","sources":["rendering/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,6CAA2B;AAC3B,8CAA4B;AAC5B,gDAA8B;AAC9B,0CAAwB;AACxB,8CAA4B"}
@@ -0,0 +1,72 @@
1
+ import { AsyncPipe, GetValueOrThrow, InitLogger, WrapValue } from '@surfside/ads-core-client';
2
+ import { InitSurfAdsWebInternal } from '..';
3
+ import { InitSurfAdsCoreMock } from '@surfside/ads-core-mock';
4
+ await (async () => {
5
+ const { buildHybridCarousel, startRequest, defaultNative, buildBannerResponse, requestBids, renderCarousel, renderBanner, buildVideoResponse, renderVideo } = GetValueOrThrow(await InitSurfAdsWebInternal(InitSurfAdsCoreMock('ec981', // Account ID
6
+ '544fa', // Channel ID
7
+ 'bf9bc', // Site ID
8
+ 'greengoddess', // Location ID
9
+ undefined, InitLogger())));
10
+ /* ===== Carousel ===== */
11
+ /* Make request, build response */
12
+ const carouselRes = await buildHybridCarousel({
13
+ type: 'top-products',
14
+ }, startRequest('my-zone') // Zone ID
15
+ .withNative(defaultNative()
16
+ .withMetaProduct()
17
+ .build())
18
+ .build());
19
+ if (!carouselRes.ok) {
20
+ console.error(carouselRes.error);
21
+ return;
22
+ }
23
+ const carousel = carouselRes.value;
24
+ /* Render carousel */
25
+ const rendered = GetValueOrThrow(await renderCarousel(carousel, 300, {
26
+ type: 'infinite'
27
+ }, 'page'));
28
+ /* Add to page */
29
+ document.querySelector('.carousel-container').appendChild(rendered.element);
30
+ const success = await rendered.init();
31
+ if (!success.ok) {
32
+ throw success.error;
33
+ }
34
+ /* ===== Banner ===== */
35
+ const bidRes = await requestBids(startRequest('banner-zone')
36
+ .withBanner(4, 1)
37
+ .build());
38
+ if (!bidRes.ok) {
39
+ console.error('No banners');
40
+ return;
41
+ }
42
+ const bid = bidRes.value.seatbid?.[0]?.bid?.[0];
43
+ if (bid === undefined) {
44
+ console.log('no bids');
45
+ return;
46
+ }
47
+ const banner = renderBanner(GetValueOrThrow(buildBannerResponse(bid)));
48
+ if (!banner.ok) {
49
+ throw banner.error;
50
+ }
51
+ document.querySelector('.banner-container')?.appendChild(banner.value);
52
+ const video = await AsyncPipe(requestBids(startRequest('video-zone')
53
+ .withVideo(320, 240, 0, 30)
54
+ .build()))
55
+ .then(resp => WrapValue(resp.seatbid?.[0]?.bid?.[0]))
56
+ .then(buildVideoResponse)
57
+ .then(renderVideo)
58
+ .result();
59
+ if (!video.ok) {
60
+ console.error('Video failed!');
61
+ throw video.error;
62
+ }
63
+ document.querySelector('.video-container')?.appendChild(video.value);
64
+ /* Dynamic Zones */
65
+ // const dynamicZone = GetValueOrThrow(await getDynamicZone('my-zone'));
66
+ // const dynamicZoneRequest = GetValueOrThrow(buildDynamicZoneRequest('my-zone', dynamicZone));
67
+ // const dynamicResponse = GetValueOrThrow(await buildDynamicResponse(dynamicZoneRequest));
68
+ // const htmlElement = buildDynamicCreative(dynamicResponse);
69
+ // const htmlElement = await getDynamicCreative('my-zone');
70
+ // console.log(dynamicResponse);
71
+ })();
72
+ //# sourceMappingURL=carousel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel.js","sourceRoot":"src/","sources":["debug/carousel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { Err, GetValue, Ok } from '@surfside/ads-core-client';
2
+ export const GetAttribute = (element, attributeName) => {
3
+ const attribute = element.getAttribute(attributeName);
4
+ if (attribute === null) {
5
+ return Err(new MissingAttributeError(element, attributeName));
6
+ }
7
+ return Ok(attribute);
8
+ };
9
+ export const GetAttributeOr = (element, attributeName, or) => GetValue(GetAttribute(element, attributeName)) ?? or;
10
+ export const GetNumberAttribute = (element, attributeName) => {
11
+ const attribute = GetAttribute(element, attributeName);
12
+ if (!attribute.ok) {
13
+ return attribute;
14
+ }
15
+ const num = Number(attribute.value);
16
+ if (Number.isNaN(num)) {
17
+ return Err(new NotANumberError(element, attributeName, attribute.value));
18
+ }
19
+ return Ok(num);
20
+ };
21
+ export const GetNumberAttributeOr = (element, attributeName, or) => GetValue(GetNumberAttribute(element, attributeName)) ?? or;
22
+ export class MissingAttributeError extends Error {
23
+ element;
24
+ attributeName;
25
+ constructor(element, attributeName) {
26
+ super(`Failed to get attribute ${attributeName} on element ${element.tagName}`);
27
+ this.element = element;
28
+ this.attributeName = attributeName;
29
+ }
30
+ }
31
+ export class NotANumberError extends Error {
32
+ element;
33
+ attributeName;
34
+ value;
35
+ constructor(element, attributeName, value) {
36
+ super(`Attribute ${attributeName} on element ${element.tagName} was NaN. Value was '${value}'`);
37
+ this.element = element;
38
+ this.attributeName = attributeName;
39
+ this.value = value;
40
+ }
41
+ }
42
+ ;
43
+ //# sourceMappingURL=Dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dom.js","sourceRoot":"src/","sources":["helpers/Dom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAe,MAAM,2BAA2B,CAAC;AAE3E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,aAAqB,EAAkB,EAAE;IACpF,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IACtD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC,IAAI,qBAAqB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAE,aAAqB,EAAE,EAAU,EAAU,EAAE,CAC1F,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;AAEzD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAE,aAAqB,EAAkB,EAAE;IAC1F,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACvD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAgB,EAAE,aAAqB,EAAE,EAAU,EAAU,EAAE,CAChG,QAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;AAE/D,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAChB;IAAkC;IAA9D,YAA4B,OAAgB,EAAkB,aAAqB;QAC/E,KAAK,CAAC,2BAA2B,aAAa,eAAe,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QADxD,YAAO,GAAP,OAAO,CAAS;QAAkB,kBAAa,GAAb,aAAa,CAAQ;IAEnF,CAAC;CACJ;AAED,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAElB;IACA;IACA;IAHpB,YACoB,OAAgB,EAChB,aAAqB,EACrB,KAAa;QAE7B,KAAK,CAAC,aAAa,aAAa,eAAe,OAAO,CAAC,OAAO,wBAAwB,KAAK,GAAG,CAAC,CAAC;QAJhF,YAAO,GAAP,OAAO,CAAS;QAChB,kBAAa,GAAb,aAAa,CAAQ;QACrB,UAAK,GAAL,KAAK,CAAQ;IAGjC,CAAC;CACJ;AAAA,CAAC"}