@gemx-dev/clarity-visualize 0.8.66 → 0.8.68
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/build/clarity.visualize.js +886 -1027
- package/build/clarity.visualize.min.js +1 -1
- package/build/clarity.visualize.module.js +886 -1027
- package/package.json +2 -2
- package/src/heatmap.ts +1 -1
- package/src/layout.ts +12 -3
- package/tsconfig.json +1 -0
|
@@ -16,20 +16,6 @@ PERFORMANCE OF THIS SOFTWARE.
|
|
|
16
16
|
***************************************************************************** */
|
|
17
17
|
/* global Reflect, Promise */
|
|
18
18
|
|
|
19
|
-
var extendStatics = function(d, b) {
|
|
20
|
-
extendStatics = Object.setPrototypeOf ||
|
|
21
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
22
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
23
|
-
return extendStatics(d, b);
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
function __extends(d, b) {
|
|
27
|
-
if (typeof b !== "function" && b !== null)
|
|
28
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
29
|
-
extendStatics(d, b);
|
|
30
|
-
function __() { this.constructor = d; }
|
|
31
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
32
|
-
}
|
|
33
19
|
|
|
34
20
|
function __awaiter(thisArg, _arguments, P, generator) {
|
|
35
21
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
@@ -39,34 +25,6 @@ function __awaiter(thisArg, _arguments, P, generator) {
|
|
|
39
25
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
40
26
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
41
27
|
});
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function __generator(thisArg, body) {
|
|
45
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
46
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
47
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
48
|
-
function step(op) {
|
|
49
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
50
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
51
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
52
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
53
|
-
switch (op[0]) {
|
|
54
|
-
case 0: case 1: t = op; break;
|
|
55
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
56
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
57
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
58
|
-
default:
|
|
59
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
60
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
61
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
62
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
63
|
-
if (t[2]) _.ops.pop();
|
|
64
|
-
_.trys.pop(); continue;
|
|
65
|
-
}
|
|
66
|
-
op = body.call(thisArg, _);
|
|
67
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
68
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
69
|
-
}
|
|
70
28
|
}
|
|
71
29
|
|
|
72
30
|
// tslint:disable: no-bitwise
|
|
@@ -99,8 +57,10 @@ function __spreadArray(to, from, pack) {
|
|
|
99
57
|
}
|
|
100
58
|
return to.concat(ar || Array.prototype.slice.call(from));
|
|
101
59
|
}
|
|
60
|
+
// Pre-computed exclude class names (replaces Constant.ExcludeClassNames.split())
|
|
61
|
+
var ExcludeClassNamesList = ["load", "active", "fixed", "visible", "focus", "show", "collaps", "animat"];
|
|
102
62
|
|
|
103
|
-
var excludeClassNames =
|
|
63
|
+
var excludeClassNames = ExcludeClassNamesList;
|
|
104
64
|
var extraExcludeClassNames = [];
|
|
105
65
|
var selectorMap = {};
|
|
106
66
|
function reset$8() {
|
|
@@ -151,19 +111,16 @@ function get$1(input, type) {
|
|
|
151
111
|
selectorMap[key].push(input.id);
|
|
152
112
|
}
|
|
153
113
|
selector = "".concat(key).concat("~" /* Constant.Tilde */).concat(selectorMap[key].indexOf(input.id));
|
|
154
|
-
console.log("\uD83D\uDE80 \uD83D\uDC25 ~ get ~ selector:", selector);
|
|
155
114
|
}
|
|
156
115
|
else {
|
|
157
116
|
// In Beta mode, we continue to look at query selectors in context of the full page
|
|
158
117
|
selector = "".concat(prefix).concat(input.tag, ".").concat(classes).concat(suffix);
|
|
159
|
-
console.log("\uD83D\uDE80 \uD83D\uDC25 ~ get ~ selector:", selector);
|
|
160
118
|
}
|
|
161
119
|
}
|
|
162
120
|
// Update selector to use "id" field when available. There are two exceptions:
|
|
163
121
|
// (1) if "id" appears to be an auto generated string token, e.g. guid or a random id containing digits
|
|
164
122
|
// (2) if "id" appears inside a shadow DOM, in which case we continue to prefix up to shadow DOM to prevent conflicts
|
|
165
123
|
selector = id && filter(id) ? "".concat(getDomPrefix(prefix)).concat("#" /* Constant.Hash */).concat(id) : selector;
|
|
166
|
-
console.log("\uD83D\uDE80 \uD83D\uDC25 ~ get ~ selector:", selector);
|
|
167
124
|
return selector;
|
|
168
125
|
}
|
|
169
126
|
}
|
|
@@ -191,7 +148,6 @@ function filter(value) {
|
|
|
191
148
|
return false;
|
|
192
149
|
} // Do not process empty strings
|
|
193
150
|
var excludeClassNames = getExcludeClassNames();
|
|
194
|
-
console.log("\uD83D\uDE80 \uD83D\uDC25 ~ filter ~ excludeClassNames:", excludeClassNames);
|
|
195
151
|
if (excludeClassNames.some(function (x) { return value.toLowerCase().indexOf(x) >= 0; })) {
|
|
196
152
|
return false;
|
|
197
153
|
}
|
|
@@ -204,8 +160,6 @@ function filter(value) {
|
|
|
204
160
|
return true;
|
|
205
161
|
}
|
|
206
162
|
function getExcludeClassNames() {
|
|
207
|
-
console.log("\uD83D\uDE80 \uD83D\uDC25 ~ getExcludeClassNames ~ extraExcludeClassNames:", extraExcludeClassNames);
|
|
208
|
-
console.log("\uD83D\uDE80 \uD83D\uDC25 ~ getExcludeClassNames ~ excludeClassNames:", excludeClassNames);
|
|
209
163
|
return __spreadArray(__spreadArray([], excludeClassNames, true), extraExcludeClassNames, true);
|
|
210
164
|
}
|
|
211
165
|
|
|
@@ -247,61 +201,59 @@ function lookup(hash) {
|
|
|
247
201
|
|
|
248
202
|
var helper = { hash: hash, selector: selector, get: get$2, getNode: getNode, lookup: lookup };
|
|
249
203
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
function DataHelper(state) {
|
|
253
|
-
var _this = this;
|
|
204
|
+
class DataHelper {
|
|
205
|
+
constructor(state) {
|
|
254
206
|
this.regionMap = {};
|
|
255
207
|
this.regions = {};
|
|
256
208
|
this.metrics = {};
|
|
257
209
|
this.lean = false;
|
|
258
|
-
this.reset =
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
210
|
+
this.reset = () => {
|
|
211
|
+
this.metrics = {};
|
|
212
|
+
this.lean = false;
|
|
213
|
+
this.regions = {};
|
|
214
|
+
this.regionMap = {};
|
|
263
215
|
};
|
|
264
|
-
this.metric =
|
|
216
|
+
this.metric = (event) => {
|
|
265
217
|
var _a;
|
|
266
|
-
if (
|
|
267
|
-
|
|
268
|
-
|
|
218
|
+
if (this.state.options.metadata) {
|
|
219
|
+
let metricMarkup = [];
|
|
220
|
+
let regionMarkup = [];
|
|
269
221
|
// Copy over metrics for future reference
|
|
270
|
-
for (
|
|
271
|
-
|
|
222
|
+
for (let m in event.data) {
|
|
223
|
+
const eventType = typeof event.data[m];
|
|
272
224
|
if (eventType === "number" || (event.event === 1 /* Data.Event.Dimension */ && m === 37 /* Data.Dimension.InteractionNextPaint */.toString())) {
|
|
273
|
-
if (!(m in
|
|
274
|
-
|
|
225
|
+
if (!(m in this.metrics)) {
|
|
226
|
+
this.metrics[m] = 0;
|
|
275
227
|
}
|
|
276
|
-
|
|
277
|
-
|
|
228
|
+
let key = parseInt(m, 10);
|
|
229
|
+
let value = eventType === "object" ? Number((_a = event.data[m]) === null || _a === void 0 ? void 0 : _a[0]) : event.data[m];
|
|
278
230
|
if (m in DataHelper.METRIC_MAP && (DataHelper.METRIC_MAP[m].unit === "html-price" || DataHelper.METRIC_MAP[m].unit === "ld-price")) {
|
|
279
|
-
|
|
231
|
+
this.metrics[m] = value;
|
|
280
232
|
}
|
|
281
233
|
else {
|
|
282
|
-
|
|
234
|
+
this.metrics[m] += value;
|
|
283
235
|
}
|
|
284
|
-
|
|
236
|
+
this.lean = key === 1 /* Data.Metric.Playback */ && value === 0 ? true : this.lean;
|
|
285
237
|
}
|
|
286
238
|
}
|
|
287
|
-
for (
|
|
239
|
+
for (let entry in this.metrics) {
|
|
288
240
|
if (entry in DataHelper.METRIC_MAP) {
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
metricMarkup.push(
|
|
241
|
+
let m = this.metrics[entry];
|
|
242
|
+
let map = DataHelper.METRIC_MAP[entry];
|
|
243
|
+
let unit = "unit" in map ? map.unit : "" /* Data.Constant.Empty */;
|
|
244
|
+
metricMarkup.push(`<li><h2>${this.value(m, unit)}<span>${this.key(unit)}</span></h2>${map.name}</li>`);
|
|
293
245
|
}
|
|
294
246
|
}
|
|
295
247
|
// Append region information to metadata
|
|
296
|
-
for (
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
regionMarkup.push(
|
|
248
|
+
for (let name in this.regions) {
|
|
249
|
+
let r = this.regions[name];
|
|
250
|
+
let className = (r.visibility === 10 /* Layout.RegionVisibility.Visible */ ? "visible" : (r.interaction === 20 /* Layout.InteractionState.Clicked */ ? "clicked" : "" /* Data.Constant.Empty */));
|
|
251
|
+
regionMarkup.push(`<span class="${className}">${name}</span>`);
|
|
300
252
|
}
|
|
301
|
-
|
|
253
|
+
this.state.options.metadata.innerHTML = `<ul>${metricMarkup.join("" /* Data.Constant.Empty */)}</ul><div>${regionMarkup.join("" /* Data.Constant.Empty */)}</div>`;
|
|
302
254
|
}
|
|
303
255
|
};
|
|
304
|
-
this.key =
|
|
256
|
+
this.key = (unit) => {
|
|
305
257
|
switch (unit) {
|
|
306
258
|
case "html-price":
|
|
307
259
|
case "ld-price":
|
|
@@ -310,7 +262,7 @@ var DataHelper = /** @class */ (function () {
|
|
|
310
262
|
default: return unit;
|
|
311
263
|
}
|
|
312
264
|
};
|
|
313
|
-
this.value =
|
|
265
|
+
this.value = (num, unit) => {
|
|
314
266
|
switch (unit) {
|
|
315
267
|
case "KB": return Math.round(num / 1024);
|
|
316
268
|
case "s": return Math.round(num / 10) / 100;
|
|
@@ -321,55 +273,52 @@ var DataHelper = /** @class */ (function () {
|
|
|
321
273
|
};
|
|
322
274
|
this.state = state;
|
|
323
275
|
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
for (
|
|
327
|
-
var r = data_1[_i];
|
|
276
|
+
region(event) {
|
|
277
|
+
let data = event.data;
|
|
278
|
+
for (let r of data) {
|
|
328
279
|
if (!(r.name in this.regions)) {
|
|
329
280
|
this.regions[r.name] = { interaction: r.interaction, visibility: r.visibility };
|
|
330
281
|
}
|
|
331
282
|
this.regionMap[r.id] = r.name;
|
|
332
283
|
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
_this.children = {};
|
|
354
|
-
_this.nodes = {};
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
DataHelper.METRIC_MAP = {
|
|
287
|
+
[2 /* Data.Metric.TotalBytes */]: { name: "Total Bytes", unit: "KB" },
|
|
288
|
+
[4 /* Data.Metric.TotalCost */]: { name: "Total Cost", unit: "ms" },
|
|
289
|
+
[3 /* Data.Metric.LayoutCost */]: { name: "Layout Cost", unit: "ms" },
|
|
290
|
+
[8 /* Data.Metric.LargestPaint */]: { name: "LCP", unit: "s" },
|
|
291
|
+
[9 /* Data.Metric.CumulativeLayoutShift */]: { name: "CLS", unit: "cls" },
|
|
292
|
+
[7 /* Data.Metric.LongTaskCount */]: { name: "Long Tasks" },
|
|
293
|
+
[24 /* Data.Metric.CartTotal */]: { name: "Cart Total", unit: "html-price" },
|
|
294
|
+
[13 /* Data.Metric.ProductPrice */]: { name: "Product Price", unit: "ld-price" },
|
|
295
|
+
[6 /* Data.Metric.ThreadBlockedTime */]: { name: "Thread Blocked", unit: "ms" },
|
|
296
|
+
[37 /* Data.Dimension.InteractionNextPaint */]: { name: "INP", unit: "ms" }
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
class EnrichHelper {
|
|
300
|
+
constructor() {
|
|
301
|
+
this.reset = () => {
|
|
302
|
+
this.children = {};
|
|
303
|
+
this.nodes = {};
|
|
355
304
|
helper.selector.reset();
|
|
356
305
|
};
|
|
357
|
-
this.selectors =
|
|
358
|
-
event.data.forEach && event.data.forEach(
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
306
|
+
this.selectors = (event) => {
|
|
307
|
+
event.data.forEach && event.data.forEach(d => {
|
|
308
|
+
let parent = this.nodes[d.parent];
|
|
309
|
+
let children = this.children[d.parent] || [];
|
|
310
|
+
let node = this.nodes[d.id] || { tag: d.tag, parent: d.parent, previous: d.previous };
|
|
311
|
+
let attributes = d.attributes || {};
|
|
363
312
|
/* Track parent-child relationship for this element */
|
|
364
313
|
if (node.parent !== d.parent) {
|
|
365
|
-
|
|
314
|
+
let childIndex = d.previous === null ? 0 : children.indexOf(d.previous) + 1;
|
|
366
315
|
children.splice(childIndex, 0, d.id);
|
|
367
316
|
// Stop tracking this node from children of previous parent
|
|
368
317
|
if (node.parent !== d.parent) {
|
|
369
|
-
|
|
370
|
-
|
|
318
|
+
let exParent = this.children[node.parent];
|
|
319
|
+
let nodeIndex = exParent ? exParent.indexOf(d.id) : -1;
|
|
371
320
|
if (nodeIndex >= 0) {
|
|
372
|
-
|
|
321
|
+
this.children[node.parent].splice(nodeIndex, 1);
|
|
373
322
|
}
|
|
374
323
|
}
|
|
375
324
|
node.parent = d.parent;
|
|
@@ -378,31 +327,31 @@ var EnrichHelper = /** @class */ (function () {
|
|
|
378
327
|
children.push(d.id);
|
|
379
328
|
}
|
|
380
329
|
/* Get current position */
|
|
381
|
-
node.position =
|
|
330
|
+
node.position = this.position(d.id, d.tag, node, children, children.map(c => this.nodes[c]));
|
|
382
331
|
/* For backward compatibility, continue populating current selector and hash like before in addition to beta selector and hash */
|
|
383
|
-
|
|
332
|
+
let input = { id: d.id, tag: d.tag, prefix: parent ? [parent.alpha, parent.beta] : null, position: node.position, attributes };
|
|
384
333
|
// Get stable selector
|
|
385
334
|
// We intentionally use "null" value for empty selectors to keep parity with v0.6.25 and before.
|
|
386
|
-
|
|
335
|
+
let selectorAlpha = helper.selector.get(input, 0 /* Layout.Selector.Alpha */);
|
|
387
336
|
d.selectorAlpha = selectorAlpha.length > 0 ? selectorAlpha : null;
|
|
388
337
|
d.hashAlpha = selectorAlpha.length > 0 ? helper.hash(d.selectorAlpha) : null;
|
|
389
338
|
// Get beta selector
|
|
390
|
-
|
|
339
|
+
let selectorBeta = helper.selector.get(input, 1 /* Layout.Selector.Beta */);
|
|
391
340
|
d.selectorBeta = selectorBeta.length > 0 ? selectorBeta : null;
|
|
392
341
|
d.hashBeta = selectorBeta.length > 0 ? helper.hash(d.selectorBeta) : null;
|
|
393
342
|
/* Track state for future reference */
|
|
394
343
|
node.alpha = selectorAlpha;
|
|
395
344
|
node.beta = selectorBeta;
|
|
396
|
-
|
|
345
|
+
this.nodes[d.id] = node;
|
|
397
346
|
if (d.parent) {
|
|
398
|
-
|
|
347
|
+
this.children[d.parent] = children;
|
|
399
348
|
}
|
|
400
349
|
});
|
|
401
350
|
return event;
|
|
402
351
|
};
|
|
403
|
-
this.position =
|
|
352
|
+
this.position = (id, tag, child, children, siblings) => {
|
|
404
353
|
child.position = 1;
|
|
405
|
-
|
|
354
|
+
let idx = children ? children.indexOf(id) : -1;
|
|
406
355
|
while (idx-- > 0) {
|
|
407
356
|
if (tag === siblings[idx].tag) {
|
|
408
357
|
child.position = siblings[idx].position + 1;
|
|
@@ -413,8 +362,7 @@ var EnrichHelper = /** @class */ (function () {
|
|
|
413
362
|
};
|
|
414
363
|
this.reset();
|
|
415
364
|
}
|
|
416
|
-
|
|
417
|
-
}());
|
|
365
|
+
}
|
|
418
366
|
|
|
419
367
|
/**
|
|
420
368
|
* Creates a canvas as sibling to the iframe (same parent container)
|
|
@@ -431,31 +379,31 @@ function createParentWindowCanvas(iframeDoc, portalCanvasId) {
|
|
|
431
379
|
throw new Error('Not in iframe: ' + iframeDoc.defaultView);
|
|
432
380
|
}
|
|
433
381
|
try {
|
|
434
|
-
|
|
435
|
-
|
|
382
|
+
const parentWindow = (_b = iframeDoc.defaultView) === null || _b === void 0 ? void 0 : _b.parent;
|
|
383
|
+
const parentDoc = parentWindow === null || parentWindow === void 0 ? void 0 : parentWindow.document;
|
|
436
384
|
if (!parentDoc)
|
|
437
385
|
throw new Error('Parent document not found');
|
|
438
|
-
|
|
439
|
-
|
|
386
|
+
const iframeId = `clarity-iframe-${portalCanvasId}`;
|
|
387
|
+
const iframe = parentDoc.getElementById(iframeId);
|
|
440
388
|
if (!iframe)
|
|
441
389
|
throw new Error('Iframe not found');
|
|
442
|
-
|
|
443
|
-
|
|
390
|
+
const targetIframe = iframe;
|
|
391
|
+
const iframeParent = targetIframe.parentElement;
|
|
444
392
|
if (!iframeParent)
|
|
445
393
|
throw new Error('Iframe parent not found');
|
|
446
394
|
// Create canvas as sibling to iframe
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
if (
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
395
|
+
const canvasId = `${"clarity-heatmap-canvas" /* Constant.HeatmapCanvas */}-${portalCanvasId}`;
|
|
396
|
+
let canvas = parentDoc.getElementById(canvasId);
|
|
397
|
+
if (canvas === null) {
|
|
398
|
+
canvas = parentDoc.createElement('canvas');
|
|
399
|
+
canvas.id = canvasId;
|
|
400
|
+
canvas.classList.add("clarity-heatmap-canvas" /* Constant.HeatmapCanvas */);
|
|
401
|
+
canvas.width = 0;
|
|
402
|
+
canvas.height = 0;
|
|
403
|
+
canvas.style.position = "absolute" /* Constant.Absolute */;
|
|
456
404
|
// canvas.style.zIndex = `${Setting.ZIndex}`;
|
|
457
|
-
|
|
458
|
-
iframeParent.appendChild(
|
|
405
|
+
canvas.style.pointerEvents = 'none'; // Allow clicks to pass through
|
|
406
|
+
iframeParent.appendChild(canvas);
|
|
459
407
|
}
|
|
460
408
|
// // Set canvas size to match iframe
|
|
461
409
|
// const updateCanvasSize = () => {
|
|
@@ -468,16 +416,16 @@ function createParentWindowCanvas(iframeDoc, portalCanvasId) {
|
|
|
468
416
|
// Update size on resize
|
|
469
417
|
// const handleUpdate = () => updateCanvasSize();
|
|
470
418
|
// parentWindow!.addEventListener('resize', handleUpdate, true);
|
|
471
|
-
|
|
419
|
+
const cleanup = () => {
|
|
472
420
|
// parentWindow!.removeEventListener('resize', handleUpdate, true);
|
|
473
|
-
if (
|
|
474
|
-
|
|
421
|
+
if (canvas.parentNode) {
|
|
422
|
+
canvas.parentNode.removeChild(canvas);
|
|
475
423
|
}
|
|
476
424
|
};
|
|
477
425
|
return {
|
|
478
|
-
canvas
|
|
426
|
+
canvas,
|
|
479
427
|
iframe: targetIframe,
|
|
480
|
-
cleanup
|
|
428
|
+
cleanup
|
|
481
429
|
};
|
|
482
430
|
}
|
|
483
431
|
catch (e) {
|
|
@@ -494,9 +442,9 @@ function createParentWindowCanvas(iframeDoc, portalCanvasId) {
|
|
|
494
442
|
* Used to track when all dialogs have finished rendering
|
|
495
443
|
* Uses Set to avoid counting the same dialog multiple times
|
|
496
444
|
*/
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
445
|
+
let pendingDialogs = new Set();
|
|
446
|
+
let resolveDialogsRendered = null;
|
|
447
|
+
let dialogsRenderedPromise = null;
|
|
500
448
|
/**
|
|
501
449
|
* Returns a promise that resolves when all pending dialogs are rendered
|
|
502
450
|
*/
|
|
@@ -510,7 +458,7 @@ function waitForDialogsRendered() {
|
|
|
510
458
|
return dialogsRenderedPromise;
|
|
511
459
|
}
|
|
512
460
|
// Create new promise
|
|
513
|
-
dialogsRenderedPromise = new Promise(
|
|
461
|
+
dialogsRenderedPromise = new Promise((resolve) => {
|
|
514
462
|
resolveDialogsRendered = resolve;
|
|
515
463
|
});
|
|
516
464
|
return dialogsRenderedPromise;
|
|
@@ -565,7 +513,7 @@ function showDialog(dialogElement, isModal, onError) {
|
|
|
565
513
|
dialogElement.show();
|
|
566
514
|
}
|
|
567
515
|
// Wait for animations/transitions to complete
|
|
568
|
-
waitForDialogAnimation(dialogElement).then(
|
|
516
|
+
waitForDialogAnimation(dialogElement).then(() => {
|
|
569
517
|
notifyDialogComplete(dialogElement);
|
|
570
518
|
});
|
|
571
519
|
}
|
|
@@ -583,10 +531,10 @@ function showDialog(dialogElement, isModal, onError) {
|
|
|
583
531
|
* Listens for animationend and transitionend events with timeout fallback
|
|
584
532
|
*/
|
|
585
533
|
function waitForDialogAnimation(dialogElement) {
|
|
586
|
-
return new Promise(
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
534
|
+
return new Promise((resolve) => {
|
|
535
|
+
let resolved = false;
|
|
536
|
+
const timeoutMs = 1000; // Maximum wait time for animations
|
|
537
|
+
const complete = () => {
|
|
590
538
|
if (resolved)
|
|
591
539
|
return;
|
|
592
540
|
resolved = true;
|
|
@@ -594,20 +542,20 @@ function waitForDialogAnimation(dialogElement) {
|
|
|
594
542
|
resolve();
|
|
595
543
|
};
|
|
596
544
|
// Fallback timeout in case no animation events fire
|
|
597
|
-
|
|
545
|
+
const timeout = setTimeout(complete, timeoutMs);
|
|
598
546
|
// Listen for animation end
|
|
599
|
-
|
|
547
|
+
const onAnimationEnd = (e) => {
|
|
600
548
|
if (e.target === dialogElement) {
|
|
601
549
|
complete();
|
|
602
550
|
}
|
|
603
551
|
};
|
|
604
552
|
// Listen for transition end
|
|
605
|
-
|
|
553
|
+
const onTransitionEnd = (TransitionEvent) => {
|
|
606
554
|
if (TransitionEvent.target === dialogElement) {
|
|
607
555
|
complete();
|
|
608
556
|
}
|
|
609
557
|
};
|
|
610
|
-
|
|
558
|
+
const cleanup = () => {
|
|
611
559
|
clearTimeout(timeout);
|
|
612
560
|
dialogElement.removeEventListener('animationend', onAnimationEnd);
|
|
613
561
|
dialogElement.removeEventListener('transitionend', onTransitionEnd);
|
|
@@ -615,10 +563,10 @@ function waitForDialogAnimation(dialogElement) {
|
|
|
615
563
|
dialogElement.addEventListener('animationend', onAnimationEnd, { once: true });
|
|
616
564
|
dialogElement.addEventListener('transitionend', onTransitionEnd, { once: true });
|
|
617
565
|
// If no animations/transitions, resolve after one frame
|
|
618
|
-
requestAnimationFrame(
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
566
|
+
requestAnimationFrame(() => {
|
|
567
|
+
const computedStyle = window.getComputedStyle(dialogElement);
|
|
568
|
+
const hasAnimation = computedStyle.animationName !== 'none';
|
|
569
|
+
const hasTransition = computedStyle.transitionDuration !== '0s';
|
|
622
570
|
if (!hasAnimation && !hasTransition) {
|
|
623
571
|
complete();
|
|
624
572
|
}
|
|
@@ -646,12 +594,12 @@ function notifyDialogComplete(dialogElement) {
|
|
|
646
594
|
* @param onError - Optional error callback
|
|
647
595
|
*/
|
|
648
596
|
function renderDialog(dialogElement, options, onError) {
|
|
649
|
-
|
|
597
|
+
const { isModal, shouldBeOpen, isExistingDialog } = options;
|
|
650
598
|
if (!shouldBeOpen)
|
|
651
599
|
return;
|
|
652
600
|
// Add dialog to pending set (Set automatically handles duplicates)
|
|
653
601
|
pendingDialogs.add(dialogElement);
|
|
654
|
-
|
|
602
|
+
const doShow = () => showDialog(dialogElement, isModal, onError);
|
|
655
603
|
if (isExistingDialog) {
|
|
656
604
|
doShow();
|
|
657
605
|
}
|
|
@@ -660,9 +608,8 @@ function renderDialog(dialogElement, options, onError) {
|
|
|
660
608
|
}
|
|
661
609
|
}
|
|
662
610
|
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
var _this = this;
|
|
611
|
+
class HeatmapHelper {
|
|
612
|
+
constructor(state, layout) {
|
|
666
613
|
this.data = null;
|
|
667
614
|
this.scrollData = null;
|
|
668
615
|
this.max = null;
|
|
@@ -675,35 +622,35 @@ var HeatmapHelper = /** @class */ (function () {
|
|
|
675
622
|
this.scrollAvgFold = null;
|
|
676
623
|
this.addScrollMakers = false;
|
|
677
624
|
this.parentCanvasInfo = null;
|
|
678
|
-
this.reset =
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
625
|
+
this.reset = () => {
|
|
626
|
+
this.data = null;
|
|
627
|
+
this.scrollData = null;
|
|
628
|
+
this.max = null;
|
|
629
|
+
this.offscreenRing = null;
|
|
630
|
+
this.gradientPixels = null;
|
|
631
|
+
this.timeout = null;
|
|
685
632
|
// Cleanup parent canvas if it exists
|
|
686
|
-
if (
|
|
687
|
-
|
|
688
|
-
|
|
633
|
+
if (this.parentCanvasInfo) {
|
|
634
|
+
this.parentCanvasInfo.cleanup();
|
|
635
|
+
this.parentCanvasInfo = null;
|
|
689
636
|
}
|
|
690
637
|
// Reset resize observer
|
|
691
|
-
if (
|
|
692
|
-
|
|
693
|
-
|
|
638
|
+
if (this.observer) {
|
|
639
|
+
this.observer.disconnect();
|
|
640
|
+
this.observer = null;
|
|
694
641
|
}
|
|
695
642
|
// Remove scroll and resize event listeners
|
|
696
|
-
if (
|
|
697
|
-
|
|
698
|
-
win.removeEventListener("scroll",
|
|
699
|
-
win.removeEventListener("resize",
|
|
643
|
+
if (this.state && this.state.window) {
|
|
644
|
+
let win = this.state.window;
|
|
645
|
+
win.removeEventListener("scroll", this.redraw, true);
|
|
646
|
+
win.removeEventListener("resize", this.redraw, true);
|
|
700
647
|
}
|
|
701
648
|
};
|
|
702
|
-
this.clear =
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
649
|
+
this.clear = () => {
|
|
650
|
+
let doc = this.state.window.document;
|
|
651
|
+
let win = this.state.window;
|
|
652
|
+
let canvas = doc.getElementById("clarity-heatmap-canvas" /* Constant.HeatmapCanvas */);
|
|
653
|
+
let de = doc.documentElement;
|
|
707
654
|
if (canvas) {
|
|
708
655
|
canvas.width = de.clientWidth;
|
|
709
656
|
canvas.height = de.clientHeight;
|
|
@@ -712,72 +659,59 @@ var HeatmapHelper = /** @class */ (function () {
|
|
|
712
659
|
canvas.getContext("2d" /* Constant.Context */).clearRect(0, 0, canvas.width, canvas.height);
|
|
713
660
|
}
|
|
714
661
|
// Cleanup parent canvas before reset
|
|
715
|
-
if (
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
};
|
|
721
|
-
this.scroll =
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
currentCombination = _a[_i];
|
|
744
|
-
huePercentView = 1 - (currentCombination.cumulativeSum / this.scrollData[0].cumulativeSum);
|
|
745
|
-
percentView = (currentCombination.scrollReachY / 100) * (height / canvas.height);
|
|
746
|
-
hue = huePercentView * 240 /* Setting.MaxHue */;
|
|
747
|
-
if (percentView <= 1) {
|
|
748
|
-
grd.addColorStop(percentView, "hsla(".concat(hue, ", 100%, 50%, 0.6)"));
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
// Fill with gradient
|
|
752
|
-
context.fillStyle = grd;
|
|
753
|
-
context.fillRect(0, 0, canvas.width, canvas.height);
|
|
754
|
-
if (this.addScrollMakers) {
|
|
755
|
-
this.addInfoMarkers(context, this.scrollData, canvas.width, canvas.height, this.scrollAvgFold);
|
|
756
|
-
}
|
|
757
|
-
}
|
|
662
|
+
if (this.parentCanvasInfo) {
|
|
663
|
+
this.parentCanvasInfo.cleanup();
|
|
664
|
+
this.parentCanvasInfo = null;
|
|
665
|
+
}
|
|
666
|
+
this.reset();
|
|
667
|
+
};
|
|
668
|
+
this.scroll = (activity, avgFold, addMarkers) => __awaiter(this, void 0, void 0, function* () {
|
|
669
|
+
yield this.waitForDialogs();
|
|
670
|
+
this.scrollData = this.scrollData || activity;
|
|
671
|
+
this.scrollAvgFold = avgFold != null ? avgFold : this.scrollAvgFold;
|
|
672
|
+
this.addScrollMakers = addMarkers != null ? addMarkers : this.addScrollMakers;
|
|
673
|
+
let canvas = this.overlay();
|
|
674
|
+
let context = canvas.getContext("2d" /* Constant.Context */);
|
|
675
|
+
let doc = this.state.window.document;
|
|
676
|
+
var body = doc.body;
|
|
677
|
+
var de = doc.documentElement;
|
|
678
|
+
var height = Math.max(body.scrollHeight, body.offsetHeight, de.clientHeight, de.scrollHeight, de.offsetHeight);
|
|
679
|
+
canvas.height = Math.min(height, 65535 /* Setting.ScrollCanvasMaxHeight */);
|
|
680
|
+
canvas.style.top = 0 + "px" /* Constant.Pixel */;
|
|
681
|
+
if (canvas.width > 0 && canvas.height > 0) {
|
|
682
|
+
if (this.scrollData) {
|
|
683
|
+
const grd = context.createLinearGradient(0, 0, 0, canvas.height);
|
|
684
|
+
for (const currentCombination of this.scrollData) {
|
|
685
|
+
const huePercentView = 1 - (currentCombination.cumulativeSum / this.scrollData[0].cumulativeSum);
|
|
686
|
+
const percentView = (currentCombination.scrollReachY / 100) * (height / canvas.height);
|
|
687
|
+
const hue = huePercentView * 240 /* Setting.MaxHue */;
|
|
688
|
+
if (percentView <= 1) {
|
|
689
|
+
grd.addColorStop(percentView, `hsla(${hue}, 100%, 50%, 0.6)`);
|
|
758
690
|
}
|
|
759
|
-
|
|
691
|
+
}
|
|
692
|
+
// Fill with gradient
|
|
693
|
+
context.fillStyle = grd;
|
|
694
|
+
context.fillRect(0, 0, canvas.width, canvas.height);
|
|
695
|
+
if (this.addScrollMakers) {
|
|
696
|
+
this.addInfoMarkers(context, this.scrollData, canvas.width, canvas.height, this.scrollAvgFold);
|
|
697
|
+
}
|
|
760
698
|
}
|
|
761
|
-
}
|
|
762
|
-
});
|
|
763
|
-
this.addInfoMarkers =
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
699
|
+
}
|
|
700
|
+
});
|
|
701
|
+
this.addInfoMarkers = (context, scrollMapInfo, width, height, avgFold) => {
|
|
702
|
+
this.addMarker(context, width, "Average Fold" /* Constant.AverageFold */, avgFold, 84 /* Setting.MarkerMediumWidth */);
|
|
703
|
+
const markers = [75, 50, 25];
|
|
704
|
+
for (const marker of markers) {
|
|
705
|
+
const closest = scrollMapInfo.reduce((prev, curr) => {
|
|
768
706
|
return ((Math.abs(curr.percUsers - marker)) < (Math.abs(prev.percUsers - marker)) ? curr : prev);
|
|
769
707
|
});
|
|
770
708
|
if (closest.percUsers >= marker - 2 /* Setting.MarkerRange */ && closest.percUsers <= marker + 2 /* Setting.MarkerRange */) {
|
|
771
|
-
|
|
772
|
-
|
|
709
|
+
const markerLine = (closest.scrollReachY / 100) * height;
|
|
710
|
+
this.addMarker(context, width, `${marker}%`, markerLine, 35 /* Setting.MarkerSmallWidth */);
|
|
773
711
|
}
|
|
774
|
-
};
|
|
775
|
-
for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
|
|
776
|
-
var marker = markers_1[_i];
|
|
777
|
-
_loop_1(marker);
|
|
778
712
|
}
|
|
779
713
|
};
|
|
780
|
-
this.addMarker =
|
|
714
|
+
this.addMarker = (context, heatmapWidth, label, markerY, markerWidth) => {
|
|
781
715
|
context.beginPath();
|
|
782
716
|
context.moveTo(0, markerY);
|
|
783
717
|
context.lineTo(heatmapWidth, markerY);
|
|
@@ -791,51 +725,52 @@ var HeatmapHelper = /** @class */ (function () {
|
|
|
791
725
|
context.font = "500 12px Segoe UI" /* Setting.CanvasTextFont */;
|
|
792
726
|
context.fillText(label, 5 /* Setting.MarkerPadding */, markerY + 5 /* Setting.MarkerPadding */);
|
|
793
727
|
};
|
|
794
|
-
this.click =
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
728
|
+
this.click = (activity) => __awaiter(this, void 0, void 0, function* () {
|
|
729
|
+
yield this.waitForDialogs();
|
|
730
|
+
this.data = this.data || activity;
|
|
731
|
+
let heat = this.transform();
|
|
732
|
+
let canvas = this.overlay();
|
|
733
|
+
let ctx = canvas.getContext("2d" /* Constant.Context */);
|
|
734
|
+
if (canvas.width > 0 && canvas.height > 0) {
|
|
735
|
+
// TODO: GEMX DEBUG Draw a test rectangle to verify canvas is working
|
|
736
|
+
// ctx.fillStyle = 'rgba(255, 0, 0, 0.3)';
|
|
737
|
+
// ctx.fillRect(10, 10, 100, 100);
|
|
738
|
+
// To speed up canvas rendering, we draw ring & gradient on an offscreen canvas, so we can use drawImage API
|
|
739
|
+
// Canvas performance tips: https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Optimizing_canvas
|
|
740
|
+
// Pre-render similar primitives or repeating objects on an offscreen canvas
|
|
741
|
+
let ring = this.getRing();
|
|
742
|
+
let gradient = this.getGradient();
|
|
743
|
+
// Render activity for each (x,y) coordinate in our data
|
|
744
|
+
for (let entry of heat) {
|
|
745
|
+
ctx.globalAlpha = entry.a;
|
|
746
|
+
ctx.drawImage(ring, entry.x - 20 /* Setting.Radius */, entry.y - 20 /* Setting.Radius */);
|
|
747
|
+
}
|
|
748
|
+
// Add color to the canvas based on alpha value of each pixel
|
|
749
|
+
let pixels = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
|
750
|
+
for (let i = 0; i < pixels.data.length; i += 4) {
|
|
751
|
+
// For each pixel, we have 4 entries in data array: (r,g,b,a)
|
|
752
|
+
// To pick the right color from gradient pixels, we look at the alpha value of the pixel
|
|
753
|
+
// Alpha value ranges from 0-255
|
|
754
|
+
let alpha = pixels.data[i + 3];
|
|
755
|
+
if (alpha > 0) {
|
|
756
|
+
let offset = (alpha - 1) * 4;
|
|
757
|
+
pixels.data[i] = gradient.data[offset];
|
|
758
|
+
pixels.data[i + 1] = gradient.data[offset + 1];
|
|
759
|
+
pixels.data[i + 2] = gradient.data[offset + 2];
|
|
760
|
+
}
|
|
827
761
|
}
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
762
|
+
ctx.putImageData(pixels, 0, 0);
|
|
763
|
+
}
|
|
764
|
+
});
|
|
765
|
+
this.overlay = () => {
|
|
831
766
|
// Create canvas for visualizing heatmap
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
767
|
+
let doc = this.state.window.document;
|
|
768
|
+
let win = this.state.window;
|
|
769
|
+
let de = doc.documentElement;
|
|
770
|
+
const isPortalCanvas = !!this.state.options.portalCanvasId;
|
|
836
771
|
if (isPortalCanvas)
|
|
837
|
-
return
|
|
838
|
-
|
|
772
|
+
return this.createPortalCanvas(doc, win, de);
|
|
773
|
+
let canvas = doc.getElementById("clarity-heatmap-canvas" /* Constant.HeatmapCanvas */);
|
|
839
774
|
if (canvas === null) {
|
|
840
775
|
canvas = doc.createElement("CANVAS" /* Constant.Canvas */);
|
|
841
776
|
canvas.id = "clarity-heatmap-canvas" /* Constant.HeatmapCanvas */;
|
|
@@ -843,13 +778,13 @@ var HeatmapHelper = /** @class */ (function () {
|
|
|
843
778
|
canvas.width = 0;
|
|
844
779
|
canvas.height = 0;
|
|
845
780
|
canvas.style.position = "absolute" /* Constant.Absolute */;
|
|
846
|
-
canvas.style.zIndex =
|
|
781
|
+
canvas.style.zIndex = `${2147483647 /* Setting.ZIndex */}`;
|
|
847
782
|
de.appendChild(canvas);
|
|
848
|
-
win.addEventListener("scroll",
|
|
849
|
-
win.addEventListener("resize",
|
|
850
|
-
|
|
851
|
-
if (
|
|
852
|
-
|
|
783
|
+
win.addEventListener("scroll", this.redraw, true);
|
|
784
|
+
win.addEventListener("resize", this.redraw, true);
|
|
785
|
+
this.observer = this.state.window["ResizeObserver"] ? new ResizeObserver(this.redraw) : null;
|
|
786
|
+
if (this.observer) {
|
|
787
|
+
this.observer.observe(doc.body);
|
|
853
788
|
}
|
|
854
789
|
}
|
|
855
790
|
// Ensure canvas is positioned correctly
|
|
@@ -860,13 +795,13 @@ var HeatmapHelper = /** @class */ (function () {
|
|
|
860
795
|
canvas.getContext("2d" /* Constant.Context */).clearRect(0, 0, canvas.width, canvas.height);
|
|
861
796
|
return canvas;
|
|
862
797
|
};
|
|
863
|
-
this.getRing =
|
|
864
|
-
if (
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
798
|
+
this.getRing = () => {
|
|
799
|
+
if (this.offscreenRing === null) {
|
|
800
|
+
let doc = this.state.window.document;
|
|
801
|
+
this.offscreenRing = doc.createElement("CANVAS" /* Constant.Canvas */);
|
|
802
|
+
this.offscreenRing.width = 20 /* Setting.Radius */ * 2;
|
|
803
|
+
this.offscreenRing.height = 20 /* Setting.Radius */ * 2;
|
|
804
|
+
let ctx = this.offscreenRing.getContext("2d" /* Constant.Context */);
|
|
870
805
|
ctx.shadowOffsetX = 20 /* Setting.Radius */ * 2;
|
|
871
806
|
ctx.shadowBlur = 20 /* Setting.Radius */ / 2;
|
|
872
807
|
ctx.shadowColor = "black" /* Constant.Black */;
|
|
@@ -875,90 +810,88 @@ var HeatmapHelper = /** @class */ (function () {
|
|
|
875
810
|
ctx.closePath();
|
|
876
811
|
ctx.fill();
|
|
877
812
|
}
|
|
878
|
-
return
|
|
813
|
+
return this.offscreenRing;
|
|
879
814
|
};
|
|
880
|
-
this.getGradient =
|
|
881
|
-
if (
|
|
882
|
-
|
|
883
|
-
|
|
815
|
+
this.getGradient = () => {
|
|
816
|
+
if (this.gradientPixels === null) {
|
|
817
|
+
let doc = this.state.window.document;
|
|
818
|
+
let offscreenGradient = doc.createElement("CANVAS" /* Constant.Canvas */);
|
|
884
819
|
offscreenGradient.width = 1;
|
|
885
820
|
offscreenGradient.height = 256 /* Setting.Colors */;
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
for (
|
|
821
|
+
let ctx = offscreenGradient.getContext("2d" /* Constant.Context */);
|
|
822
|
+
let gradient = ctx.createLinearGradient(0, 0, 0, 256 /* Setting.Colors */);
|
|
823
|
+
let step = 1 / HeatmapHelper.COLORS.length;
|
|
824
|
+
for (let i = 0; i < HeatmapHelper.COLORS.length; i++) {
|
|
890
825
|
gradient.addColorStop(step * (i + 1), HeatmapHelper.COLORS[i]);
|
|
891
826
|
}
|
|
892
827
|
ctx.fillStyle = gradient;
|
|
893
828
|
ctx.fillRect(0, 0, 1, 256 /* Setting.Colors */);
|
|
894
|
-
|
|
829
|
+
this.gradientPixels = ctx.getImageData(0, 0, 1, 256 /* Setting.Colors */);
|
|
895
830
|
}
|
|
896
|
-
return
|
|
831
|
+
return this.gradientPixels;
|
|
897
832
|
};
|
|
898
|
-
this.redraw =
|
|
899
|
-
if (
|
|
900
|
-
if (
|
|
901
|
-
clearTimeout(
|
|
833
|
+
this.redraw = (event) => {
|
|
834
|
+
if (this.data) {
|
|
835
|
+
if (this.timeout) {
|
|
836
|
+
clearTimeout(this.timeout);
|
|
902
837
|
}
|
|
903
|
-
|
|
838
|
+
this.timeout = setTimeout(this.click, 30 /* Setting.Interval */);
|
|
904
839
|
}
|
|
905
|
-
else if (
|
|
840
|
+
else if (this.scrollData) {
|
|
906
841
|
if (event.type != 'scroll') {
|
|
907
|
-
if (
|
|
908
|
-
clearTimeout(
|
|
842
|
+
if (this.timeout) {
|
|
843
|
+
clearTimeout(this.timeout);
|
|
909
844
|
}
|
|
910
|
-
|
|
845
|
+
this.timeout = setTimeout(this.scroll, 30 /* Setting.Interval */);
|
|
911
846
|
}
|
|
912
847
|
}
|
|
913
848
|
};
|
|
914
|
-
this.transform =
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
849
|
+
this.transform = () => {
|
|
850
|
+
let output = [];
|
|
851
|
+
let points = {};
|
|
852
|
+
let localMax = 0;
|
|
853
|
+
let height = this.state.window && this.state.window.document ? this.state.window.document.documentElement.clientHeight : 0;
|
|
919
854
|
// DEBUG LOG
|
|
920
|
-
console.group(
|
|
921
|
-
for (
|
|
922
|
-
|
|
923
|
-
var el = _this.layout.get(element.hash);
|
|
855
|
+
console.group(`[Heatmap] transform — total elements: ${this.data.length}, height: ${height}, max: ${this.max}`);
|
|
856
|
+
for (let element of this.data) {
|
|
857
|
+
let el = this.layout.get(element.hash);
|
|
924
858
|
if (!el) {
|
|
925
|
-
console.warn(
|
|
859
|
+
console.warn(`[Heatmap] SKIP hash="${element.hash}" — element not found in DOM`);
|
|
926
860
|
continue;
|
|
927
861
|
}
|
|
928
862
|
if (typeof el.getBoundingClientRect !== "function") {
|
|
929
|
-
console.warn(
|
|
863
|
+
console.warn(`[Heatmap] SKIP hash="${element.hash}" — getBoundingClientRect not available`, el);
|
|
930
864
|
continue;
|
|
931
865
|
}
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
if (!v &&
|
|
936
|
-
console.warn(
|
|
866
|
+
let r = el.getBoundingClientRect();
|
|
867
|
+
const isDebugHash = element.hash === "270qs0pw7";
|
|
868
|
+
let v = this.visible(el, r, height, isDebugHash ? element.hash : undefined);
|
|
869
|
+
if (!v && this.max !== null) {
|
|
870
|
+
console.warn(`[Heatmap] SKIP hash="${element.hash}" — not visible on re-render`, { rect: { top: r.top, left: r.left, width: r.width, height: r.height }, maxIsSet: this.max !== null });
|
|
937
871
|
continue;
|
|
938
872
|
}
|
|
939
873
|
if (el && typeof el.getBoundingClientRect === "function") {
|
|
940
|
-
console.log(
|
|
874
|
+
console.log(`[Heatmap] PROCESS hash="${element.hash}" visible=${v} points=${element.points}`, { rect: { top: r.top, left: r.left, width: r.width, height: r.height } });
|
|
941
875
|
// Process clicks for only visible elements
|
|
942
|
-
if (
|
|
943
|
-
for (
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
876
|
+
if (this.max === null || v) {
|
|
877
|
+
for (let i = 0; i < element.points; i++) {
|
|
878
|
+
let x = Math.round(r.left + (element.x[i] / 32767 /* Data.Setting.ClickPrecision */) * r.width);
|
|
879
|
+
let y = Math.round(r.top + (element.y[i] / 32767 /* Data.Setting.ClickPrecision */) * r.height);
|
|
880
|
+
let k = `${x}${"X" /* Constant.Separator */}${y}${"X" /* Constant.Separator */}${v ? 1 : 0}`;
|
|
947
881
|
points[k] = k in points ? points[k] + element.clicks[i] : element.clicks[i];
|
|
948
882
|
localMax = Math.max(points[k], localMax);
|
|
949
|
-
console.log(
|
|
883
|
+
console.log(` point[${i}] x=${x} y=${y} visible=${v} clicks=${element.clicks[i]}`);
|
|
950
884
|
}
|
|
951
885
|
}
|
|
952
886
|
}
|
|
953
887
|
}
|
|
954
888
|
// Set the max value from the firs t
|
|
955
|
-
|
|
889
|
+
this.max = this.max ? this.max : localMax;
|
|
956
890
|
// Once all points are accounted for, convert everything into absolute (x, y)
|
|
957
|
-
|
|
958
|
-
for (
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
var alpha = Math.min((points[coordinates] / _this.max) + 0.15 /* Setting.AlphaBoost */, 1);
|
|
891
|
+
let skippedInvisible = 0;
|
|
892
|
+
for (let coordinates of Object.keys(points)) {
|
|
893
|
+
let parts = coordinates.split("X" /* Constant.Separator */);
|
|
894
|
+
let alpha = Math.min((points[coordinates] / this.max) + 0.15 /* Setting.AlphaBoost */, 1);
|
|
962
895
|
if (parts[2] === "1") {
|
|
963
896
|
output.push({ x: parseInt(parts[0], 10), y: parseInt(parts[1], 10), a: alpha });
|
|
964
897
|
}
|
|
@@ -966,34 +899,33 @@ var HeatmapHelper = /** @class */ (function () {
|
|
|
966
899
|
skippedInvisible++;
|
|
967
900
|
}
|
|
968
901
|
}
|
|
969
|
-
console.log(
|
|
902
|
+
console.log(`[Heatmap] Result — drawn: ${output.length}, skipped invisible: ${skippedInvisible}, max: ${this.max}`);
|
|
970
903
|
console.groupEnd();
|
|
971
904
|
return output;
|
|
972
905
|
};
|
|
973
|
-
this.visible =
|
|
974
|
-
|
|
975
|
-
|
|
906
|
+
this.visible = (el, r, height, debugHash) => {
|
|
907
|
+
let doc = this.state.window.document;
|
|
908
|
+
let visibility = r.height > height ? true : false;
|
|
976
909
|
if (debugHash) {
|
|
977
|
-
console.group(
|
|
978
|
-
console.log(
|
|
979
|
-
console.log(
|
|
910
|
+
console.group(`[Heatmap visible] hash=${debugHash} tag=${el === null || el === void 0 ? void 0 : el.tagName}`);
|
|
911
|
+
console.log(` rect: top=${r.top.toFixed(1)} bottom=${r.bottom.toFixed(1)} left=${r.left.toFixed(1)} width=${r.width.toFixed(1)} height=${r.height.toFixed(1)}`);
|
|
912
|
+
console.log(` viewport height=${height} | r.height > height? ${r.height > height}`);
|
|
980
913
|
}
|
|
981
914
|
if (visibility === false && r.width > 0 && r.height > 0) {
|
|
982
|
-
|
|
983
|
-
|
|
915
|
+
const checkX = r.left + (r.width / 2);
|
|
916
|
+
const checkY = r.top + (r.height / 2);
|
|
984
917
|
if (debugHash) {
|
|
985
|
-
console.log(
|
|
918
|
+
console.log(` elementsFromPoint(${checkX.toFixed(1)}, ${checkY.toFixed(1)})`);
|
|
986
919
|
}
|
|
987
920
|
while (!visibility && doc) {
|
|
988
|
-
|
|
989
|
-
|
|
921
|
+
let shadowElement = null;
|
|
922
|
+
let elements = doc.elementsFromPoint(checkX, checkY);
|
|
990
923
|
if (debugHash) {
|
|
991
|
-
|
|
992
|
-
console.log(
|
|
993
|
-
console.log(
|
|
924
|
+
const topElements = elements.slice(0, 5).map(e => `${e.tagName}${e.id ? '#' + e.id : ''}${e.className ? '.' + String(e.className).trim().split(/\s+/).slice(0, 2).join('.') : ''}`);
|
|
925
|
+
console.log(` top elements at center: [${topElements.join(', ')}]`);
|
|
926
|
+
console.log(` is el in top elements? ${elements.includes(el)} | el matches first non-canvas? ${elements.find(e => !(e.tagName === "CANVAS" /* Constant.Canvas */ || (e.id && e.id.indexOf("clarity-" /* Constant.ClarityPrefix */) === 0))) === el}`);
|
|
994
927
|
}
|
|
995
|
-
for (
|
|
996
|
-
var e = elements_1[_i];
|
|
928
|
+
for (let e of elements) {
|
|
997
929
|
// Ignore if top element ends up being the canvas element we added for heatmap visualization
|
|
998
930
|
if (e.tagName === "CANVAS" /* Constant.Canvas */ || (e.id && e.id.indexOf("clarity-" /* Constant.ClarityPrefix */) === 0)) {
|
|
999
931
|
continue;
|
|
@@ -1009,46 +941,38 @@ var HeatmapHelper = /** @class */ (function () {
|
|
|
1009
941
|
}
|
|
1010
942
|
else if (debugHash) {
|
|
1011
943
|
if (r.width === 0 || r.height === 0) {
|
|
1012
|
-
console.log(
|
|
944
|
+
console.log(` SKIP elementsFromPoint — zero dimension: width=${r.width} height=${r.height}`);
|
|
1013
945
|
}
|
|
1014
946
|
}
|
|
1015
|
-
|
|
947
|
+
const result = visibility && r.bottom >= 0 && r.top <= height;
|
|
1016
948
|
if (debugHash) {
|
|
1017
|
-
console.log(
|
|
1018
|
-
console.log(
|
|
949
|
+
console.log(` visibility=${visibility} | r.bottom(${r.bottom.toFixed(1)}) >= 0? ${r.bottom >= 0} | r.top(${r.top.toFixed(1)}) <= height(${height})? ${r.top <= height}`);
|
|
950
|
+
console.log(` => final result: ${result}`);
|
|
1019
951
|
console.groupEnd();
|
|
1020
952
|
}
|
|
1021
953
|
return result;
|
|
1022
954
|
};
|
|
1023
|
-
this.waitForDialogs =
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
return [4 /*yield*/, waitForDialogsRendered()];
|
|
1032
|
-
case 1:
|
|
1033
|
-
_a.sent();
|
|
1034
|
-
return [2 /*return*/];
|
|
1035
|
-
}
|
|
1036
|
-
});
|
|
1037
|
-
}); };
|
|
1038
|
-
this.createPortalCanvas = function (doc, win, de) {
|
|
955
|
+
this.waitForDialogs = () => __awaiter(this, void 0, void 0, function* () {
|
|
956
|
+
const isPortalCanvas = !!this.state.options.portalCanvasId;
|
|
957
|
+
if (!isPortalCanvas)
|
|
958
|
+
return;
|
|
959
|
+
yield waitForDialogsRendered();
|
|
960
|
+
return;
|
|
961
|
+
});
|
|
962
|
+
this.createPortalCanvas = (doc, win, de) => {
|
|
1039
963
|
var _a;
|
|
1040
|
-
|
|
964
|
+
let canvas = null;
|
|
1041
965
|
try {
|
|
1042
|
-
canvas = (_a =
|
|
966
|
+
canvas = (_a = this.parentCanvasInfo) === null || _a === void 0 ? void 0 : _a.canvas;
|
|
1043
967
|
if (!canvas) {
|
|
1044
|
-
|
|
1045
|
-
canvas =
|
|
968
|
+
this.parentCanvasInfo = createParentWindowCanvas(doc, this.state.options.portalCanvasId);
|
|
969
|
+
canvas = this.parentCanvasInfo.canvas;
|
|
1046
970
|
// Add event listeners only once when canvas is created
|
|
1047
|
-
win.addEventListener("scroll",
|
|
1048
|
-
win.addEventListener("resize",
|
|
1049
|
-
|
|
1050
|
-
if (
|
|
1051
|
-
|
|
971
|
+
win.addEventListener("scroll", this.redraw, true);
|
|
972
|
+
win.addEventListener("resize", this.redraw, true);
|
|
973
|
+
this.observer = this.state.window["ResizeObserver"] ? new ResizeObserver(this.redraw) : null;
|
|
974
|
+
if (this.observer) {
|
|
975
|
+
this.observer.observe(doc.body);
|
|
1052
976
|
}
|
|
1053
977
|
}
|
|
1054
978
|
canvas.width = de.clientWidth;
|
|
@@ -1056,20 +980,19 @@ var HeatmapHelper = /** @class */ (function () {
|
|
|
1056
980
|
canvas.style.top = '0';
|
|
1057
981
|
canvas.style.left = '0';
|
|
1058
982
|
canvas.getContext("2d" /* Constant.Context */).clearRect(0, 0, canvas.width, canvas.height);
|
|
1059
|
-
|
|
983
|
+
this.parentCanvasInfo.canvas = canvas;
|
|
1060
984
|
return canvas;
|
|
1061
985
|
}
|
|
1062
986
|
catch (error) {
|
|
1063
|
-
console.error(
|
|
987
|
+
console.error(`[Heatmap] createPortalCanvas:`, error);
|
|
1064
988
|
}
|
|
1065
989
|
return null;
|
|
1066
990
|
};
|
|
1067
991
|
this.state = state;
|
|
1068
992
|
this.layout = layout;
|
|
1069
993
|
}
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
}());
|
|
994
|
+
}
|
|
995
|
+
HeatmapHelper.COLORS = ["blue", "cyan", "lime", "yellow", "red"];
|
|
1073
996
|
|
|
1074
997
|
var pointerSvg = `background: url("data:image/svg+xml,%3Csvg width='25' height='33' viewBox='0 0 25 33' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg filter='url(%23filter0_d_1588_56448)'%3E%3Cpath d='M4.01802 5.55275C4.01946 3.50367 6.4952 2.47998 7.93878 3.93422C11.8224 7.84649 15.637 11.722 19.5308 15.6444C20.9744 17.0986 19.9461 19.6118 17.8974 19.6538C16.3364 19.6858 14.7609 19.7179 13.1178 19.7275C12.4996 19.7312 11.9077 19.9799 11.4721 20.4186C10.3166 21.582 9.15585 22.7133 7.98174 23.8569C6.50994 25.2904 4.00066 24.2454 4.00207 22.1909C4.00592 16.5949 4.01415 11.0883 4.01802 5.55275Z' fill='%23D97705'/%3E%3Cpath d='M4.74233 6.01561C4.74223 4.45449 6.63136 3.6747 7.73247 4.78135C11.4175 8.48492 15.0357 12.1199 18.7088 15.7882C19.8134 16.8914 19.0329 18.8059 17.4722 18.8401C15.8726 18.8751 14.2495 18.9145 12.5497 18.9237C12.0819 18.9263 11.6339 19.1135 11.3029 19.4441C10.1408 20.6046 8.9704 21.7251 7.78073 22.8738C6.6557 23.96 4.74395 23.1646 4.74384 21.6008C4.7435 16.3797 4.74267 11.2488 4.74233 6.01561Z' fill='white'/%3E%3Cpath d='M17.6946 16.2002C18.322 16.8308 17.8753 17.913 16.9858 17.9268C15.4482 17.9505 13.8862 17.9868 12.2788 17.9971C11.7369 18.0006 11.2189 18.2206 10.8377 18.6059C9.7303 19.7249 8.58978 20.8151 7.42447 21.9628C6.78436 22.5932 5.68359 22.1428 5.68359 21.2443C5.68359 16.2568 5.68359 11.3772 5.68359 6.55071C5.68359 5.6585 6.76347 5.21291 7.3927 5.84545C10.813 9.28377 14.2599 12.7473 17.6946 16.2002Z' fill='%23FFC35F'/%3E%3C/g%3E%3Cdefs%3E%3Cfilter id='filter0_d_1588_56448' x='0.00390625' y='3.25171' width='24.1992' height='29.2681' filterUnits='userSpaceOnUse' color-interpolation-filters='sRGB'%3E%3CfeFlood flood-opacity='0' result='BackgroundImageFix'/%3E%3CfeColorMatrix in='SourceAlpha' type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0' result='hardAlpha'/%3E%3CfeOffset dy='4'/%3E%3CfeGaussianBlur stdDeviation='2'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0'/%3E%3CfeBlend mode='normal' in2='BackgroundImageFix' result='effect1_dropShadow_1588_56448'/%3E%3CfeBlend mode='normal' in='SourceGraphic' in2='effect1_dropShadow_1588_56448' result='shape'/%3E%3C/filter%3E%3C/defs%3E%3C/svg%3E%0A") no-repeat center center;`;
|
|
1075
998
|
|
|
@@ -1105,29 +1028,28 @@ var clickStyle = `.clarity-click,
|
|
|
1105
1028
|
transition: visibility 0s 1s, opacity 1s linear;
|
|
1106
1029
|
}`;
|
|
1107
1030
|
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
var _this = this;
|
|
1031
|
+
class InteractionHelper {
|
|
1032
|
+
constructor(state, layout, vnext) {
|
|
1111
1033
|
this.hoverId = null;
|
|
1112
1034
|
this.targetId = null;
|
|
1113
1035
|
this.points = [];
|
|
1114
1036
|
this.scrollPointIndex = 0;
|
|
1115
1037
|
this.clickAudio = null;
|
|
1116
1038
|
this.visualizedClicks = [];
|
|
1117
|
-
this.reset =
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
};
|
|
1125
|
-
this.scroll =
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1039
|
+
this.reset = () => {
|
|
1040
|
+
this.points = [];
|
|
1041
|
+
this.scrollPointIndex = 0;
|
|
1042
|
+
this.clickAudio = null;
|
|
1043
|
+
this.hoverId = null;
|
|
1044
|
+
this.targetId = null;
|
|
1045
|
+
this.layout.reset();
|
|
1046
|
+
};
|
|
1047
|
+
this.scroll = (event) => {
|
|
1048
|
+
let data = event.data;
|
|
1049
|
+
let doc = this.state.window.document;
|
|
1050
|
+
let de = doc.documentElement;
|
|
1051
|
+
let scrollTarget = this.layout.element(data.target) || doc.body;
|
|
1052
|
+
let scrollable = scrollTarget.scrollHeight > scrollTarget.clientHeight || scrollTarget.scrollWidth > scrollTarget.clientWidth;
|
|
1131
1053
|
if (scrollTarget && scrollable) {
|
|
1132
1054
|
scrollTarget.scrollTo(data.x, data.y);
|
|
1133
1055
|
// In an edge case, scrolling API doesn't work when css on HTML element has height:100% and overflow:auto
|
|
@@ -1140,36 +1062,36 @@ var InteractionHelper = /** @class */ (function () {
|
|
|
1140
1062
|
// Position canvas relative to scroll events on the parent page
|
|
1141
1063
|
if (scrollTarget === de || scrollTarget === doc.body) {
|
|
1142
1064
|
if (!scrollable) {
|
|
1143
|
-
|
|
1065
|
+
this.state.window.scrollTo(data.x, data.y);
|
|
1144
1066
|
}
|
|
1145
|
-
|
|
1067
|
+
let canvas = this.overlay();
|
|
1146
1068
|
if (canvas) {
|
|
1147
1069
|
canvas.style.left = data.x + "px" /* Constant.Pixel */;
|
|
1148
1070
|
canvas.style.top = data.y + "px" /* Constant.Pixel */;
|
|
1149
1071
|
canvas.width = de.clientWidth;
|
|
1150
1072
|
canvas.height = de.clientHeight;
|
|
1151
1073
|
}
|
|
1152
|
-
|
|
1074
|
+
this.scrollPointIndex = this.points.length;
|
|
1153
1075
|
}
|
|
1154
1076
|
};
|
|
1155
|
-
this.resize =
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
if (
|
|
1160
|
-
|
|
1077
|
+
this.resize = (event) => {
|
|
1078
|
+
let data = event.data;
|
|
1079
|
+
let width = data.width;
|
|
1080
|
+
let height = data.height;
|
|
1081
|
+
if (this.state.options.onresize) {
|
|
1082
|
+
this.state.options.onresize(width, height);
|
|
1161
1083
|
}
|
|
1162
1084
|
};
|
|
1163
|
-
this.visibility =
|
|
1164
|
-
|
|
1085
|
+
this.visibility = (event) => {
|
|
1086
|
+
let doc = this.state.window.document;
|
|
1165
1087
|
if (doc && doc.documentElement && event.data.visible === 0 /* BooleanFlag.False */) {
|
|
1166
1088
|
// if the website has styles on the <html> node then we need to save the reference to them before we change them
|
|
1167
1089
|
// to indicate the window was hidden. This is to ensure that we can restore the original styles when the window is visible again.
|
|
1168
|
-
|
|
1090
|
+
const bg = doc.documentElement.style.backgroundColor;
|
|
1169
1091
|
if (bg) {
|
|
1170
1092
|
doc.documentElement.setAttribute("data-clarity-background-color" /* Constant.OriginalBackgroundColor */, bg);
|
|
1171
1093
|
}
|
|
1172
|
-
|
|
1094
|
+
const o = doc.documentElement.style.opacity;
|
|
1173
1095
|
if (o) {
|
|
1174
1096
|
doc.documentElement.setAttribute("data-clarity-opacity" /* Constant.OriginalOpacity */, o);
|
|
1175
1097
|
}
|
|
@@ -1191,9 +1113,9 @@ var InteractionHelper = /** @class */ (function () {
|
|
|
1191
1113
|
}
|
|
1192
1114
|
}
|
|
1193
1115
|
};
|
|
1194
|
-
this.input =
|
|
1195
|
-
|
|
1196
|
-
|
|
1116
|
+
this.input = (event) => {
|
|
1117
|
+
let data = event.data;
|
|
1118
|
+
let el = this.layout.element(data.target);
|
|
1197
1119
|
if (el) {
|
|
1198
1120
|
switch (el.type) {
|
|
1199
1121
|
case "checkbox":
|
|
@@ -1209,73 +1131,72 @@ var InteractionHelper = /** @class */ (function () {
|
|
|
1209
1131
|
}
|
|
1210
1132
|
}
|
|
1211
1133
|
};
|
|
1212
|
-
this.selection =
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1134
|
+
this.selection = (event) => {
|
|
1135
|
+
let data = event.data;
|
|
1136
|
+
let doc = this.state.window.document;
|
|
1137
|
+
let s = doc.getSelection();
|
|
1216
1138
|
// Wrapping selection code inside a try / catch to avoid throwing errors when dealing with elements inside the shadow DOM.
|
|
1217
1139
|
try {
|
|
1218
|
-
s.setBaseAndExtent(
|
|
1140
|
+
s.setBaseAndExtent(this.layout.element(data.start), data.startOffset, this.layout.element(data.end), data.endOffset);
|
|
1219
1141
|
}
|
|
1220
1142
|
catch (ex) {
|
|
1221
1143
|
console.warn("Exception encountered while trying to set selection: " + ex);
|
|
1222
1144
|
}
|
|
1223
1145
|
};
|
|
1224
|
-
this.pointer =
|
|
1225
|
-
if (!
|
|
1146
|
+
this.pointer = (event) => {
|
|
1147
|
+
if (!this.state.options.pointer) {
|
|
1226
1148
|
return;
|
|
1227
1149
|
}
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1150
|
+
let data = event.data;
|
|
1151
|
+
let type = event.event;
|
|
1152
|
+
let doc = this.state.window.document;
|
|
1153
|
+
let de = doc.documentElement;
|
|
1154
|
+
let p = doc.getElementById("clarity-pointer" /* Constant.PointerLayer */);
|
|
1155
|
+
let pointerWidth = 29 /* Setting.PointerWidth */;
|
|
1156
|
+
let pointerHeight = 38 /* Setting.PointerHeight */;
|
|
1235
1157
|
if (p === null) {
|
|
1236
1158
|
p = doc.createElement("DIV");
|
|
1237
1159
|
p.id = "clarity-pointer" /* Constant.PointerLayer */;
|
|
1238
1160
|
de.appendChild(p);
|
|
1239
1161
|
// Add custom styles
|
|
1240
|
-
|
|
1162
|
+
let style = doc.createElement("STYLE");
|
|
1241
1163
|
style.textContent =
|
|
1242
1164
|
"@keyframes pulsate-one { 0% { transform: scale(1, 1); opacity: 1; } 100% { transform: scale(3, 3); opacity: 0; } }" +
|
|
1243
1165
|
"@keyframes pulsate-two { 0% { transform: scale(1, 1); opacity: 1; } 100% { transform: scale(5, 5); opacity: 0; } }" +
|
|
1244
1166
|
"@keyframes pulsate-touch { 0% { transform: scale(1, 1); opacity: 1; } 100% { transform: scale(2, 2); opacity: 0; } }" +
|
|
1245
1167
|
"@keyframes disappear { 90% { transform: scale(1, 1); opacity: 1; } 100% { transform: scale(1.3, 1.3); opacity: 0; } }" +
|
|
1246
|
-
"
|
|
1247
|
-
"
|
|
1248
|
-
|
|
1249
|
-
"
|
|
1250
|
-
"
|
|
1251
|
-
"
|
|
1252
|
-
"
|
|
1253
|
-
|
|
1168
|
+
`#${"clarity-interaction-canvas" /* Constant.InteractionCanvas */} { position: absolute; left: 0; top: 0; z-index: ${2147483647 /* Setting.ZIndex */}; background: none; }` +
|
|
1169
|
+
`#${"clarity-pointer" /* Constant.PointerLayer */} { position: absolute; z-index: ${2147483647 /* Setting.ZIndex */}; url(${"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAmCAYAAAA4LpBhAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASDSURBVHgB7VdPTCNlFH8z0/+FFmRatnFNiDGR4O4mBk08smZvXjjIxRueNME9eHGNxoLxSNwr4WyigYToQRJLjXDzQtDNmnhR4kWWAJm20ymddtrx94bvI9NBWAptsod9ycvM92fe73vv/b73fUP0DIlCfRQ1AMTtjwcHB1+gPgOT67oK6+TkZBjNbxRF+X1gYCCDPpX6IKdGAaTu7++HuG9tbe1ONBr9GR7r+Xy+98DsIRuemJiIjI6OJgH+3e7urruzs+OOjIw8SiaTNwRwz8OtQWPpdHoYoKt///ar2/jxaw84k8k8gt5YWVnRqEfi90BrtVph0Uetx0V67d9fqFAo3G6324XZ2VldLK4noK4AVqvVaoh8YZTAxWLxdiwW20CoM70IdceWicfjSpCxfuBEIrGxsLCQZR7QNcQDwFaRRhRmcXCSL9S3kN8CtlP2Oqz2QoWt4Q4NDanHx8cy3HQBMIe6sLS0pF811B7I5uYmhUKh1nmAQWAOteM4xcXFxczMzEzXHp+u9PDwUBHvymWBmVzr6+t6t9tJhtPzEEYuFaoguebm5nTqJOXFoMxEVCO50tMFXBaYcwwbGwAfRagv5bEKthK2igdUr9epG/EDYw//xKGmzoLz/6BQd3t7m5i9dAUJsJoLSPZp5PIGp6amXHjsVSaEirqVALk8jy/axx2hwAcMTlcRH/Ad5LfA24kEZ4JzudbySSJzyqDnomq37pH14utH/iUrCA5HCeRwHYXc8dzNNs5jfXp6uoD+e/Pz8zzfDYIqq6urihg4NyTaK2/Rw8fNo0/euWvBWI3TwGAiHW2RnjY7LRVjX+7t7d3nSWL8FFSKIj46I0r2ZXr4R/PoQT5f1TTtU3Q5OAbbbAxtV4BwXx07wUI5raJdTaVS5vLysmYYhlyMDJBHJBoeHpbFwQ0CfmuP04P8V1VVVb9AVwXGy/xE6SyHw2FuW9Aa2jYAHVx1HAZh78bGxs44wYkm0zS9PPrC1QE4+8HcPwD8HONPYNzEkAU1UX+raFcYmPswzhu9ISLmShIdHBx0lFfVH2s+SyWR/IBofgYvnmCIPTQjkYiBk8mARwYWU4aW8F5uNpslXHkstBncxjcOeyqJ6vfUO9oQd2avlyeKJj3A9z/8yAOE7uHKUgGoiRQYMFZCdEq2bZfgpYFnmd9xzprlcrnCOdV13cbWaWKezGVnAUBOmVBpkOAlPH/AxuYJu/DoPQDcxfubeB/ncZCDL+IpaDKgiVwul8AzDo1BI3RC1HPLIg+mYPQmvPke+hdY+S68ehuevIHQvYpV5/i2KIxKg5pUUew1AaL6wM4cl4oPFJjxFMJ0H6BbIIgBwAbeLSzABLBVKpVszGvSCf27r5dCNE7h1tYWX1U0ECHUaDT+REhryKENrTFbwdLj+skRxIAeM+ka4rGV2QWv2vCIjVoAryC0Jk6MCk6fGvoY0OkFoF80UDsG8AG8j/BtD78YWRSMNNoJQbSe/1Zw0tmwBB6kE0ZG+wXI4v1ECYAIdbKzf/+povypEui6t/jnwvIf5FVJ1Cj/1+UAAAAASUVORK5CYII=" /* Asset.Pointer */}) no-repeat left center; width: ${pointerWidth}px; height: ${pointerHeight}px; }` +
|
|
1170
|
+
this.getClickLayerStyle() +
|
|
1171
|
+
`.${"clarity-touch" /* Constant.TouchLayer */} { background: radial-gradient(rgba(242,97,12,1), transparent); }` +
|
|
1172
|
+
`.${"clarity-touch-ring" /* Constant.TouchRing */} { background: transparent; border: 1px solid rgba(242,97,12,0.8); }` +
|
|
1173
|
+
`.${"clarity-pointer-click" /* Constant.PointerClickLayer */} { background-image: url(${"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAmCAYAAAA4LpBhAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVoSURBVHgB7VdNTCRFGP2qe6aBGRhA5mfJ7kZcV0XQTQx68MYabl44yMWbetAY3IMX12gWMCZeSLwSEi/GiAHF1SjqMAhoshuTJbg/GkM0xMQIBMj8D/Nfvq+6enZmEtFdhsSDRT66q6qnXr33varqJvoPFUHHWIw6IK6/2tbWdg8dMzBJKQXHwMCAG9UPhBDXW1tbA2gz6BhKZVAAGTs7Oy5um5+fP9fU1LQExv6xsbHGAzNDHrivr88KhUJegH+0ubkp19fXZVdX1w2v13tCAzdcbhPR3N7e3gnQuY0ry3L7nRcUcCAQuIE4MTs7a1IDi9CgXuQxCNBPNq6uyF+HWuTO5IvVjEP6uSMXlk1qYCOVSnFOgYvRLUtmVmbp9HfvUSQSebS5uXkRwIFGSF2zZFpaWoTtWEHCcgvDclPm+4/p3qvvK2CPx7M4MTERZB/QEYoCxVJxBhHsYvwn0+2WKiyLslc+pfuufSjD4fAjyG+Y03AUVyupsDRkR0eHcXBwYMuNKQi3BaYIt5uYce6Hz8XZ63MMzFKHp6am/HcrtQJZWVkhl8tVIju/KqkmgBxAdQXr3LUv6exPl5XUxWIxMjk5GRgZGbljxpWZ7u3tCX3PPCuALDEYk2Ytij9+RQ9ufFEx18LCgv9Ol5PjXsUQg9hSsXubLA3IwC7JoVgjSjfD9PDm1xVzjY6O+qnWlIeDshOxGzkzVRNgeW2mdl6FfXVkxiQsKv/8LfX9sUScY4yxCPAQpP5XjA0GwFJRTLPZrG5mUFcln6Ytc+Uq0CdcLgAvyf4/lxUw1vA3LDVVpexQedfW1ojdW2m1N4cKM8PllqLKUMI0SRhCsuVKtyLUv7XsuJo3kOA/mUt1Dg4OsqRqZ4JUPJZtIttAaqMAMzQarH8NCzwqSzcjghlrcynGh63jGinwA5VP9efIaBr2vqgBnGeltH+nJonCjPts4HPIb5iXE2nP1IPyXssniZNTBhVq0RhC3p6QTd/oHxLpk4/t356yelQawijrecnek6fKOI/9w8PDYQw1ND4+zs/LelAxNzcndIdRLRwzs5kIYT7wJL17q7D/2tPn0+jIcDunRDMt6/SUmbQT6Htra2vrAj+k+yugFRT9I6qVEGxCZwCY3784dillmubr6CqWSqUyD4a61CDclsVKSGM7TaGe8vl8yenpaTMajTqTqeSUjUSdnZ3O5iCrYUXwDM1ke+ni2NspwzAuoTGBweN8xdYZd7vdXE8jMqjnAFjEq06RQZhdT08P1RdONCWTSaEFdeSyqQfvFzO5XnrupdHfAfgm+rcxeBJdaUQS+28K9QQDcxv6eaHntWLSMdHu7q6zxWorVGnNZ6nQVmVJmSEDovoGWGyjixkmLcuK4mSKglEUk4kjYriPFwqFGF550qgzeA6/KTJTx6jVTNXRBt3ZvSpP1OSlmYNeev7lVxQgYqtcLicAmkQKohgsBnViuVwuBpZRXON8j3M2GY/HE5xTv9+fw9Ip4DknlzXAnFM2VDtMcBrXz7Cw+YFNMHoWAOdx/wTue7kf5uAXcR/CWxee7u5uD64tiGaERbZR/3Zb5E4fBj0FNpcRv8GVz4DVU2DyOKR7CLPu5rdFPagzoOmE3uxNDWJUgYl6UFEFCswWH2S6ANBVGCQKwDzu05hAEsDpWCyWw3MFsu0v6S6LySlcXV3lVxUTRnDl8/lfIGkGOcwhMuxWuPQgax9BDKicSUcoyq3sLrAqgxEPmgZ4AtImcWIkcPpk0MaAxUYAVhcT1m4GeCvuu/htD58YQWwY7ah7tNEa/lnBSeeBHeA2sh3ZdFyAXNRHlAawqNadx/edqrc/wwE66lv8/4XLX3gjac6XP/Y1AAAAAElFTkSuQmCC" /* Asset.Click */}); }` +
|
|
1174
|
+
`.${"clarity-pointer-none" /* Constant.PointerNone */} { background: none; }` +
|
|
1175
|
+
this.getPointerStyle();
|
|
1254
1176
|
p.appendChild(style);
|
|
1255
1177
|
}
|
|
1256
1178
|
p.style.left = (data.x - 4 /* Setting.PointerOffset */) + "px" /* Constant.Pixel */;
|
|
1257
1179
|
p.style.top = (data.y - 4 /* Setting.PointerOffset */) + "px" /* Constant.Pixel */;
|
|
1258
|
-
|
|
1180
|
+
let title = "Pointer";
|
|
1259
1181
|
switch (type) {
|
|
1260
1182
|
case 9 /* Data.Event.Click */:
|
|
1261
1183
|
title = "Click";
|
|
1262
|
-
|
|
1184
|
+
this.visualizedClicks.push({
|
|
1263
1185
|
doc: de,
|
|
1264
|
-
click:
|
|
1186
|
+
click: this.drawClick(doc, data.x, data.y, title),
|
|
1265
1187
|
time: event.time
|
|
1266
1188
|
});
|
|
1267
|
-
if (
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
for (
|
|
1272
|
-
var elementUnderClick = elementsUnderClick_1[_i];
|
|
1189
|
+
if (this.state.options.onclickMismatch) {
|
|
1190
|
+
const originalTarget = this.layout.element(data.target);
|
|
1191
|
+
let correctTargetHit = false;
|
|
1192
|
+
const elementsUnderClick = doc.elementsFromPoint(data.x, data.y);
|
|
1193
|
+
for (const elementUnderClick of elementsUnderClick) {
|
|
1273
1194
|
if (originalTarget === elementUnderClick) {
|
|
1274
1195
|
correctTargetHit = true;
|
|
1275
1196
|
}
|
|
1276
1197
|
}
|
|
1277
1198
|
if (!correctTargetHit) {
|
|
1278
|
-
|
|
1199
|
+
this.state.options.onclickMismatch({
|
|
1279
1200
|
time: event.time,
|
|
1280
1201
|
x: data.x,
|
|
1281
1202
|
y: data.y,
|
|
@@ -1287,9 +1208,9 @@ var InteractionHelper = /** @class */ (function () {
|
|
|
1287
1208
|
break;
|
|
1288
1209
|
case 16 /* Data.Event.DoubleClick */:
|
|
1289
1210
|
title = "Click";
|
|
1290
|
-
|
|
1211
|
+
this.visualizedClicks.push({
|
|
1291
1212
|
doc: de,
|
|
1292
|
-
click:
|
|
1213
|
+
click: this.drawClick(doc, data.x, data.y, title),
|
|
1293
1214
|
time: event.time
|
|
1294
1215
|
});
|
|
1295
1216
|
p.className = "clarity-pointer-none" /* Constant.PointerNone */;
|
|
@@ -1298,9 +1219,9 @@ var InteractionHelper = /** @class */ (function () {
|
|
|
1298
1219
|
case 18 /* Data.Event.TouchEnd */:
|
|
1299
1220
|
case 20 /* Data.Event.TouchCancel */:
|
|
1300
1221
|
title = "Touch";
|
|
1301
|
-
|
|
1222
|
+
this.visualizedClicks.push({
|
|
1302
1223
|
doc: de,
|
|
1303
|
-
click:
|
|
1224
|
+
click: this.drawTouch(doc, data.x, data.y, title),
|
|
1304
1225
|
time: event.time
|
|
1305
1226
|
});
|
|
1306
1227
|
p.className = "clarity-pointer-none" /* Constant.PointerNone */;
|
|
@@ -1312,37 +1233,37 @@ var InteractionHelper = /** @class */ (function () {
|
|
|
1312
1233
|
case 12 /* Data.Event.MouseMove */:
|
|
1313
1234
|
title = "Mouse Move";
|
|
1314
1235
|
p.className = "clarity-pointer-move" /* Constant.PointerMove */;
|
|
1315
|
-
|
|
1316
|
-
|
|
1236
|
+
this.addPoint({ time: event.time, x: data.x, y: data.y });
|
|
1237
|
+
this.targetId = data.target;
|
|
1317
1238
|
break;
|
|
1318
1239
|
default:
|
|
1319
1240
|
p.className = "clarity-pointer-move" /* Constant.PointerMove */;
|
|
1320
1241
|
break;
|
|
1321
1242
|
}
|
|
1322
|
-
p.setAttribute("title" /* Constant.Title */,
|
|
1243
|
+
p.setAttribute("title" /* Constant.Title */, `${title} (${data.x}${"px" /* Constant.Pixel */}, ${data.y}${"px" /* Constant.Pixel */})`);
|
|
1323
1244
|
};
|
|
1324
|
-
this.clearOldClickVisualizations =
|
|
1325
|
-
if (
|
|
1326
|
-
while (
|
|
1327
|
-
|
|
1328
|
-
|
|
1245
|
+
this.clearOldClickVisualizations = (currentTimestamp) => {
|
|
1246
|
+
if (this.vnext) {
|
|
1247
|
+
while (this.visualizedClicks.length > 10 /* Setting.MaxClicksDisplayed */) {
|
|
1248
|
+
const visualizedClick = this.visualizedClicks.shift();
|
|
1249
|
+
this.fadeOutElement(visualizedClick.click, visualizedClick.doc);
|
|
1329
1250
|
}
|
|
1330
|
-
var tooOldClicks =
|
|
1331
|
-
tooOldClicks.forEach(
|
|
1332
|
-
|
|
1333
|
-
|
|
1251
|
+
var tooOldClicks = this.visualizedClicks.filter(click => currentTimestamp - click.time > 5000 /* Setting.MaxClickDisplayDuration */);
|
|
1252
|
+
tooOldClicks.forEach(click => {
|
|
1253
|
+
this.fadeOutElement(click.click, click.doc);
|
|
1254
|
+
this.visualizedClicks.splice(this.visualizedClicks.indexOf(click), 1);
|
|
1334
1255
|
});
|
|
1335
1256
|
}
|
|
1336
1257
|
};
|
|
1337
|
-
this.fadeOutElement =
|
|
1258
|
+
this.fadeOutElement = (element, document) => {
|
|
1338
1259
|
element.classList.add("clarity-click-hidden");
|
|
1339
|
-
setTimeout(
|
|
1260
|
+
setTimeout(() => { document.removeChild(element); }, 10000);
|
|
1340
1261
|
};
|
|
1341
|
-
this.hover =
|
|
1342
|
-
if (
|
|
1343
|
-
|
|
1262
|
+
this.hover = () => {
|
|
1263
|
+
if (this.targetId && this.targetId !== this.hoverId) {
|
|
1264
|
+
let depth = 0;
|
|
1344
1265
|
// First, remove any previous hover class assignments
|
|
1345
|
-
|
|
1266
|
+
let hoverNode = this.hoverId ? this.layout.element(this.hoverId) : null;
|
|
1346
1267
|
while (hoverNode && depth < 7 /* Setting.HoverDepth */) {
|
|
1347
1268
|
if ("removeAttribute" in hoverNode) {
|
|
1348
1269
|
hoverNode.removeAttribute("clarity-hover" /* Constant.HoverAttribute */);
|
|
@@ -1352,7 +1273,7 @@ var InteractionHelper = /** @class */ (function () {
|
|
|
1352
1273
|
}
|
|
1353
1274
|
// Then, add hover class on elements that are below the pointer
|
|
1354
1275
|
depth = 0;
|
|
1355
|
-
|
|
1276
|
+
let targetNode = this.targetId ? this.layout.element(this.targetId) : null;
|
|
1356
1277
|
while (targetNode && depth < 7 /* Setting.HoverDepth */) {
|
|
1357
1278
|
if ("setAttribute" in targetNode) {
|
|
1358
1279
|
targetNode.setAttribute("clarity-hover" /* Constant.HoverAttribute */, "" /* Layout.Constant.Empty */);
|
|
@@ -1361,30 +1282,30 @@ var InteractionHelper = /** @class */ (function () {
|
|
|
1361
1282
|
depth++;
|
|
1362
1283
|
}
|
|
1363
1284
|
// Finally, update hoverId to reflect the new node
|
|
1364
|
-
|
|
1285
|
+
this.hoverId = this.targetId;
|
|
1365
1286
|
}
|
|
1366
1287
|
};
|
|
1367
|
-
this.addPoint =
|
|
1368
|
-
|
|
1288
|
+
this.addPoint = (point) => {
|
|
1289
|
+
let last = this.points.length > 0 ? this.points[this.points.length - 1] : null;
|
|
1369
1290
|
if (last && point.x === last.x && point.y === last.y) {
|
|
1370
1291
|
last.time = point.time;
|
|
1371
1292
|
}
|
|
1372
1293
|
else {
|
|
1373
|
-
|
|
1294
|
+
this.points.push(point);
|
|
1374
1295
|
}
|
|
1375
1296
|
};
|
|
1376
|
-
this.drawTouch =
|
|
1377
|
-
|
|
1378
|
-
|
|
1297
|
+
this.drawTouch = (doc, x, y, title) => {
|
|
1298
|
+
let de = doc.documentElement;
|
|
1299
|
+
let touch = doc.createElement("DIV");
|
|
1379
1300
|
touch.className = "clarity-touch" /* Constant.TouchLayer */;
|
|
1380
|
-
touch.setAttribute("title" /* Constant.Title */,
|
|
1301
|
+
touch.setAttribute("title" /* Constant.Title */, `${title} (${x}${"px" /* Constant.Pixel */}, ${y}${"px" /* Constant.Pixel */})`);
|
|
1381
1302
|
touch.style.left = (x - 22 /* Setting.ClickRadius */ / 2) + "px" /* Constant.Pixel */;
|
|
1382
1303
|
touch.style.top = (y - 22 /* Setting.ClickRadius */ / 2) + "px" /* Constant.Pixel */;
|
|
1383
1304
|
touch.style.animation = "disappear 1 1s";
|
|
1384
1305
|
touch.style.animationFillMode = "forwards";
|
|
1385
1306
|
de.appendChild(touch);
|
|
1386
1307
|
// First pulsating ring
|
|
1387
|
-
|
|
1308
|
+
let ringOne = touch.cloneNode();
|
|
1388
1309
|
ringOne.className = "clarity-touch-ring" /* Constant.TouchRing */;
|
|
1389
1310
|
ringOne.style.left = "-0.5" + "px" /* Constant.Pixel */;
|
|
1390
1311
|
ringOne.style.top = "-0.5" + "px" /* Constant.Pixel */;
|
|
@@ -1393,48 +1314,48 @@ var InteractionHelper = /** @class */ (function () {
|
|
|
1393
1314
|
touch.appendChild(ringOne);
|
|
1394
1315
|
return touch;
|
|
1395
1316
|
};
|
|
1396
|
-
this.drawClick =
|
|
1397
|
-
|
|
1398
|
-
|
|
1317
|
+
this.drawClick = (doc, x, y, title) => {
|
|
1318
|
+
let de = doc.documentElement;
|
|
1319
|
+
let click = doc.createElement("DIV");
|
|
1399
1320
|
click.className = "clarity-click" /* Constant.ClickLayer */;
|
|
1400
|
-
click.setAttribute("title" /* Constant.Title */,
|
|
1321
|
+
click.setAttribute("title" /* Constant.Title */, `${title} (${x}${"px" /* Constant.Pixel */}, ${y}${"px" /* Constant.Pixel */})`);
|
|
1401
1322
|
click.style.left = (x - 22 /* Setting.ClickRadius */ / 2) + "px" /* Constant.Pixel */;
|
|
1402
1323
|
click.style.top = (y - 22 /* Setting.ClickRadius */ / 2) + "px" /* Constant.Pixel */;
|
|
1403
1324
|
// First pulsating ring
|
|
1404
|
-
|
|
1325
|
+
let ringOne = click.cloneNode();
|
|
1405
1326
|
ringOne.className = "clarity-click-ring" /* Constant.ClickRing */;
|
|
1406
1327
|
ringOne.style.left = "-0.5" + "px" /* Constant.Pixel */;
|
|
1407
1328
|
ringOne.style.top = "-0.5" + "px" /* Constant.Pixel */;
|
|
1408
1329
|
ringOne.style.animation = "pulsate-one 1 1s";
|
|
1409
1330
|
ringOne.style.animationFillMode = "forwards";
|
|
1410
1331
|
click.appendChild(ringOne);
|
|
1411
|
-
if (
|
|
1412
|
-
|
|
1413
|
-
center.className = "
|
|
1332
|
+
if (this.vnext) {
|
|
1333
|
+
let center = doc.createElement("DIV");
|
|
1334
|
+
center.className = `${"clarity-click" /* Constant.ClickLayer */}-center`;
|
|
1414
1335
|
click.appendChild(center);
|
|
1415
1336
|
}
|
|
1416
1337
|
else {
|
|
1417
1338
|
// Second pulsating ring
|
|
1418
|
-
|
|
1339
|
+
let ringTwo = ringOne.cloneNode();
|
|
1419
1340
|
ringTwo.style.animation = "pulsate-two 1 1s";
|
|
1420
1341
|
click.appendChild(ringTwo);
|
|
1421
1342
|
}
|
|
1422
1343
|
de.appendChild(click);
|
|
1423
1344
|
// Play sound
|
|
1424
1345
|
if (typeof Audio !== "undefined" /* Constant.Undefined */) {
|
|
1425
|
-
if (
|
|
1426
|
-
|
|
1427
|
-
click.appendChild(
|
|
1346
|
+
if (this.clickAudio === null) {
|
|
1347
|
+
this.clickAudio = new Audio("data:video/webm;base64,GkXfo59ChoEBQveBAULygQRC84EIQoKEd2VibUKHgQRChYECGFOAZwEAAAAAAA2GEU2bdKxNu4tTq4QVSalmU6yB5U27jFOrhBZUrmtTrIIBHE27jFOrhBJUw2dTrIIBg+wBAAAAAAAAqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVJqWayKtexgw9CQE2AjUxhdmY1OC4zMy4xMDBXQY1MYXZmNTguMzMuMTAwRImIQHWwAAAAAAAWVK5r4q4BAAAAAAAAWdeBAXPFgQGcgQAitZyDdW5khoZBX09QVVNWqoNjLqBWu4QExLQAg4EC4QEAAAAAAAARn4EBtYhA53AAAAAAAGJkgRBjopNPcHVzSGVhZAEBOAGAuwAAAAAAElTDZ0E3c3MBAAAAAAAApWPAAQAAAAAAAABnyAEAAAAAAAAwRaOKRU5DT0RFRF9CWUSHoEFkb2JlIFByZW1pZXJlIFBybyAyMDIwLjAgKE1hY2luZ8gBAAAAAAAAFUWjjlRJTUVfUkVGRVJFTkNFRIeBMGfIAQAAAAAAABRFo4REQVRFRIeKMjAyMC0wNS0xMWfIAQAAAAAAABpFo4dFTkNPREVSRIeNTGF2ZjU4LjMzLjEwMHNzAQAAAAAAADpjwAEAAAAAAAAEY8WBAWfIAQAAAAAAACJFo4dFTkNPREVSRIeVTGF2YzU4LjU5LjEwMiBsaWJvcHVzc3MBAAAAAAAAOmPAAQAAAAAAAARjxYEBZ8gBAAAAAAAAIkWjiERVUkFUSU9ORIeUMDA6MDA6MDAuMzQ3MDAwMDAwAAAfQ7Z1SsDngQCjh4EAAID4//6jh4EAFYD4//6jh4EAKYD4//6jh4EAPYD4//6jQTOBAFGA+Hf8sxqASCSh2FJGBfsZEwDIBdS8inu5b213iY0Dnu9jbest8S64kJlnCuNakokZYO8i1Wus5IXXTjHRTe0n/H904+RQTH0PGdXj50tRWTzoHv5wwgjWEduG7UuDBZeB3bb6VuqWZ1rcPJlfa5Kmrg0trnCEMbbrqATFPr3h9IjSfa8Pu2OtrPUA+sXcPf0eC79cRi9UGNxkIKf8NaiHGOxrbPyvsewpDmWLKFAwmqC/tYu7kznCSvyONWH1jFENoGGEFPrDYmM6V99Yk/71TEDwhtFjj4g+aGac1DwRBa7uDakJl6HGXL/vIR8z4qanutC0xZ8XY+PUFuBFAKy0YKZWhUOIRLy2A/2E40Q3LDRlcrVanhIf3e4v84VjIRAKAhfbLYMCTQ8G3Mu+ErEHo0E5gQBlgPh+GaacPkSEqd6zm8k76Jk8Aw8Pf7sK8lqg1Blt7hwsIfI0kefrJGluVOvxYxMZNZSiQSIOJptbwNjufeojLnvzUzNrqIBrghz4nHEFT0cYc/ZA0vWSHRgQSQD8WkqvD/vRHFCCmRh+SI6bVempNdNFloc6Uni4M58ZoiuYnmRdkSYtxJDdNOc0RhdFehBG7dNqXiTkSo0zIvdCK7XAsuJHLVMQOke7SWyPo1kFyBKoQyuK06K4VG2IqwlH138PKee8g6Wxtu+DENjWxG7HtMJf3iIo1aXOWaNdIyJMKqSAv2rUwYdPpaPtYyFMTAqH372Ocq7A4ixxMAwAksL+QaYeyss6V37dQaqtF6Skb4SggL9v4uOj0IVE+r1e/7Ooj2KAL3RG4B5WzE6TNoMNwrg+HQR8rqNBK4EAeYD4fMsrpfE2dU5rAKM3te90/U91Gt8Bn80e5ri5WSnxJ+Y8HffdtHkOib+JNvmr2AXc3De0EiMC/ecOgekxFMOiPYSEJxQLUMcMl23RySvdXXs+XM5U5+dmsrCvoNppK4JkZYiIOPI975i0OdA8q+XZlbQ+1Mz/q9GxUsjVo4t1W/bYOfr0+7kFIG8Wad0KcLAOaQN5UZq5uz4XCOoBiqkhg60DQ7c7x0eApCrx4n+aoc/1nZvWHsmumI4GAhVcyBNYOisYkyogtfPYFgoKrqvZMFB54/Xtw5AVBfUduVktZqY0HuSaFLhclAYYpEx/gPl8NGZ2YacOgAK35EJ7HMSIMZtcjbhn05lJHifyTuO7WIApoP50VdFPLw1oiofLS+j/iG6UDRvuo0DDgQCNgPhhOmsgpW2AnFd6vOCxqTjHmKAhblr1wX1IIPu5/1ftPUmPXFP+NcdIVclcWKJCMlxOyd0+2kc/EtIy6X43uooxYrcCUwj8TZgX1ooV1ZIV03qDRQmXELmp6vDXPOg+MWF4mXhMnCUAsRBoQlb/giRAIZl6+GRetMoAAvEnAFTrl2kALzo2aNfN35ESALpqn87BaA+XZdl2Da/0BXNzE5YXwfcorOXeOHLK6QBlj+7w2Q/fKiuZbwWZ+sE67NeUo0E1gQChgPh/KZRcKyQ9fyIqiewLQu0jhqZkXwEEyS1JfYtVxvZ6rhEqjbzwRqfczQjpHLJR7WVtEKi/NHwXZOYYCzbXHXszeAc7yI+i0hfTKOtqNz69nwX5PZ0weNjP4w6QbWoW8OzWPA2f8ZXfptK1Z6PUW/bNj+hdnd46OZzGK6qLr0EZQeSDluLYFSAoeywY65FGKsH51y0g3cQAeCm0Hznu62i4scicJcYqtavuPi6CJTSy+32DeRbWPB+YZqKpFfoTj87ga5TPE0w5lSOF/slzVzQuchTYUMSWIaBUewA6TipFaEOzi43vUclCGINiKi9lGX15S2bFeBb7rldhrBkNUw6/r4weukw7Fle08ZaAFG1BFocao5MxZ3NhYFU7rvjrgh8hL790E2gMLfCwFNTaJ5kfo0E9gQC1gPh7RQVaT+xi+Tfqby3j6v+Ws0ncRr8n07Sye0xZsosiFldqDH0aJIuw8DjUxc7oxvCAGAKQXyc+ukXJ4dFdBG/uiYYUGLTXR9UfvK0Aa/aPSaA0xm15ulCJG+OgPSgi73bhK/DEoLSKw6wMX/daeL7AuuvZAC4Lm+82QqkWaKXi+UKET1uykU8LjPeCFcJOr8tmsu8Na9zgyhX7sk+O72ILT3Tq6wtu0P/kBrkuSRVLDljecUtPGPd81nDxthyri0GHn1dGCQO/ryf9UO/d20YclmvvGBMzrm+q7e9OTsHVS/EQiYVfdUR3tB2585J3FkDJQGnksPMytaB5oLJYgsJgTwGMztB4U7Px4tsx+nO3yTjNTr9po0qxhXggVDFmcrkE9VUMcDYcaqi/ygCf2RTVud/egmVznRWjQTCBAMmA+Hzk3SIwInlcM2PFuCLBsYPmx3rbcIXqk7OkMk+s8oaWDdn62v0ln085oXKkuFLC/HALb7ByiqCblKgO86J2B/n+xC4RTNIO+5QV8nXidUXkdFiltBuoUUAa2zLh90VncpZQC0tLDxfV32+Igrrj7FZOu3RvtRy8Yw9TvSjOwlYkAMqydxC9O9qbyOecB4onpr62eH7mXD4AicyRmXzRG88GvsB09N7QEEBWNNBGHyC7i0Gkmn9h/b7ypju8iBp7ZSghXzmNyBsp9cmOTxiCgiO94OPMLe35NzmIoM/Rbzdgi7DT1q4n4/06JtDxcwbibc5PWaaoehRpZ41p6bcpJ15QrlKTfklR0P+FDioJIQ4NvzZlUKrJtJ3FjfEmcAoWz18pFvCPLaK0TK/Mo0EygQDdgPh9vdOMNo75kIEdfCwlJUwcZsrSyfZcQTEMDsHY9ozsBLRDSLmLSYpqA3Mt0LPpmMYOckcGC/acmIP52RObp1DjpAfXGotFeXzyTIVFcD/mF8f2gteywXt++dRJm04SU7wF5fr+qsirERDjxStbtnuICHN4+jXw2zy6KQAADCrLZHgcqOYBrgcferGAAAAAAAAAAAAAAAAAAAAAIHTo9YXVkUJ3lE/QiyCmhh4KpBCGpc3sSM0hW/uUNFxO744xxgjWWy+LksHodcnYT1+1M13MXq0oMnNJWSgWqbjbOWzfYGDFITcGvrPupQH266TUDffTYAFX/qLkruQ7UwGx66GwkbjBGwdc8y5PqdohY0JXzta+r8KGdVitaFYALTmJUqFc9URJ1WLGn2/0TX5Xo0ETgQDxgPh/3ztwqxbXHlZsp/yXeBDstIY8ov3IYo9ekn89p0yxz4ziLbp2PgwxkiZTBrJbXu1j7rNqjdVJ29SbxVQ96tdWZbh9xBr+bpL9fM8UBP5oljtFFlCrDNz5X/X2kcHm2EswzFpHwF4RqqFJEtiMJ10iTbW4nUbtKN8o4GBuFHBQb2aAXEQE8Slkx+z2KedA1NoEkeHLyC3RVTr4NhqC8xhZnPFSwTZy3Woo+gQCOac0AIAJ7me5hJ6P+5HimuFWwE8719kEheeataVAEAE28VJhAEAHvqn9MYAQAe+mOv9MAHgAHlJhu9NgA8ADar/Tw1UQAG0ACqMNVEKXOQAKoAEzjdI4ACqAAAAB+Y2WeOijh4EBBYD4//6jh4EBGYD4//6jh4EBLYD4//6jh4EBQYD4//6gAQAAAAAAABChh4EBVQD4//51ooQA14fI" /* Asset.Sound */);
|
|
1348
|
+
click.appendChild(this.clickAudio);
|
|
1428
1349
|
}
|
|
1429
|
-
|
|
1350
|
+
this.clickAudio.play();
|
|
1430
1351
|
}
|
|
1431
1352
|
return click;
|
|
1432
1353
|
};
|
|
1433
|
-
this.overlay =
|
|
1354
|
+
this.overlay = () => {
|
|
1434
1355
|
// Create canvas for visualizing interactions
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1356
|
+
let doc = this.state.window.document;
|
|
1357
|
+
let de = doc.documentElement;
|
|
1358
|
+
let canvas = doc.getElementById("clarity-interaction-canvas" /* Constant.InteractionCanvas */);
|
|
1438
1359
|
if (canvas === null) {
|
|
1439
1360
|
canvas = doc.createElement("canvas");
|
|
1440
1361
|
canvas.id = "clarity-interaction-canvas" /* Constant.InteractionCanvas */;
|
|
@@ -1448,13 +1369,13 @@ var InteractionHelper = /** @class */ (function () {
|
|
|
1448
1369
|
}
|
|
1449
1370
|
return canvas;
|
|
1450
1371
|
};
|
|
1451
|
-
this.match =
|
|
1452
|
-
|
|
1453
|
-
for (
|
|
1372
|
+
this.match = (time) => {
|
|
1373
|
+
let p = [];
|
|
1374
|
+
for (let i = this.points.length - 1; i > 0; i--) {
|
|
1454
1375
|
// Each pixel in the trail has a pixel life of 3s. The only exception to this is if the user scrolled.
|
|
1455
1376
|
// We reset the trail after every scroll event to avoid drawing weird looking trail.
|
|
1456
|
-
if (i >=
|
|
1457
|
-
p.push(
|
|
1377
|
+
if (i >= this.scrollPointIndex && time - this.points[i].time < 3000 /* Setting.PixelLife */) {
|
|
1378
|
+
p.push(this.points[i]);
|
|
1458
1379
|
}
|
|
1459
1380
|
else {
|
|
1460
1381
|
break;
|
|
@@ -1462,32 +1383,32 @@ var InteractionHelper = /** @class */ (function () {
|
|
|
1462
1383
|
}
|
|
1463
1384
|
return p.slice(0, 75 /* Setting.MaxTrailPoints */);
|
|
1464
1385
|
};
|
|
1465
|
-
this.trail =
|
|
1466
|
-
|
|
1467
|
-
if (
|
|
1468
|
-
|
|
1469
|
-
|
|
1386
|
+
this.trail = (now) => {
|
|
1387
|
+
const canvas = this.overlay();
|
|
1388
|
+
if (this.state.options.canvas && canvas) {
|
|
1389
|
+
const ctx = canvas.getContext('2d');
|
|
1390
|
+
const path = this.state.options.keyframes ? this.curve(this.points.reverse()) : this.curve(this.match(now));
|
|
1470
1391
|
// Update hovered elements
|
|
1471
|
-
|
|
1392
|
+
this.hover();
|
|
1472
1393
|
// We need at least two points to create a line
|
|
1473
1394
|
if (path.length > 1) {
|
|
1474
|
-
|
|
1395
|
+
let last = path[0];
|
|
1475
1396
|
// Start off by clearing whatever was on the canvas before
|
|
1476
1397
|
// The current implementation is inefficient. We have to redraw canvas all over again for every point.
|
|
1477
1398
|
// In future we should batch pointer events and minimize the number of times we have to redraw canvas.
|
|
1478
1399
|
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
for (
|
|
1483
|
-
|
|
1400
|
+
let count = path.length;
|
|
1401
|
+
let offsetX = canvas.offsetLeft;
|
|
1402
|
+
let offsetY = canvas.offsetTop;
|
|
1403
|
+
for (let i = 1; i < count; i++) {
|
|
1404
|
+
let current = path[i];
|
|
1484
1405
|
// Compute percentage position of these points compared to all points in the path
|
|
1485
|
-
|
|
1486
|
-
|
|
1406
|
+
let lastFactor = 1 - ((i - 1) / count);
|
|
1407
|
+
let currentFactor = 1 - (i / count);
|
|
1487
1408
|
// Generate a color gradient that goes from red -> yellow -> green -> light blue -> blue
|
|
1488
|
-
|
|
1489
|
-
gradient.addColorStop(1,
|
|
1490
|
-
gradient.addColorStop(0,
|
|
1409
|
+
let gradient = ctx.createLinearGradient(last.x, last.y, current.x, current.y);
|
|
1410
|
+
gradient.addColorStop(1, this.color(currentFactor));
|
|
1411
|
+
gradient.addColorStop(0, this.color(lastFactor));
|
|
1491
1412
|
// Line width of the trail shrinks as the position of the point goes farther away.
|
|
1492
1413
|
ctx.lineWidth = 6 /* Setting.TrailWidth */ * currentFactor;
|
|
1493
1414
|
ctx.lineCap = "round" /* Constant.Round */;
|
|
@@ -1505,25 +1426,25 @@ var InteractionHelper = /** @class */ (function () {
|
|
|
1505
1426
|
}
|
|
1506
1427
|
}
|
|
1507
1428
|
// If we are only rendering key frames, clear points array after each key frame
|
|
1508
|
-
if (
|
|
1509
|
-
|
|
1429
|
+
if (this.state.options.keyframes) {
|
|
1430
|
+
this.points = [];
|
|
1510
1431
|
}
|
|
1511
1432
|
}
|
|
1512
1433
|
};
|
|
1513
|
-
this.color =
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
for (
|
|
1434
|
+
this.color = (factor) => {
|
|
1435
|
+
let s = InteractionHelper.TRAIL_START_COLOR;
|
|
1436
|
+
let e = InteractionHelper.TRAIL_END_COLOR;
|
|
1437
|
+
let c = [];
|
|
1438
|
+
for (let i = 0; i < 3; i++) {
|
|
1518
1439
|
c[i] = Math.round(e[i] + factor * (s[i] - e[i]));
|
|
1519
1440
|
}
|
|
1520
|
-
return
|
|
1441
|
+
return `rgba(${c[0]}, ${c[1]}, ${c[2]}, ${factor})`;
|
|
1521
1442
|
};
|
|
1522
1443
|
// Reference: https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Cardinal_spline
|
|
1523
|
-
this.curve =
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1444
|
+
this.curve = (path) => {
|
|
1445
|
+
const tension = 0.5;
|
|
1446
|
+
let p = [];
|
|
1447
|
+
let output = [];
|
|
1527
1448
|
// Make a copy of the input points so we don't make any side effects
|
|
1528
1449
|
p = path.slice(0);
|
|
1529
1450
|
// The algorithm require a valid previous and next point for each point in the original input
|
|
@@ -1532,57 +1453,56 @@ var InteractionHelper = /** @class */ (function () {
|
|
|
1532
1453
|
p.unshift(path[0]);
|
|
1533
1454
|
p.push(path[path.length - 1]);
|
|
1534
1455
|
// Loop through the points, and generate intermediate points to make a smooth trail
|
|
1535
|
-
for (
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
for (
|
|
1456
|
+
for (let i = 1; i < p.length - 2; i++) {
|
|
1457
|
+
const time = p[i].time;
|
|
1458
|
+
const segments = Math.max(Math.min(Math.round(this.distance(p[i], p[i - 1])), 10), 1);
|
|
1459
|
+
for (let t = 0; t <= segments; t++) {
|
|
1539
1460
|
// Compute tension vectors
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1461
|
+
let t1 = { time, x: (p[i + 1].x - p[i - 1].x) * tension, y: (p[i + 1].y - p[i - 1].y) * tension };
|
|
1462
|
+
let t2 = { time, x: (p[i + 2].x - p[i].x) * tension, y: (p[i + 2].y - p[i].y) * tension };
|
|
1463
|
+
let step = t / segments;
|
|
1543
1464
|
// Compute cardinals
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1465
|
+
let c1 = 2 * Math.pow(step, 3) - 3 * Math.pow(step, 2) + 1;
|
|
1466
|
+
let c2 = -(2 * Math.pow(step, 3)) + 3 * Math.pow(step, 2);
|
|
1467
|
+
let c3 = Math.pow(step, 3) - 2 * Math.pow(step, 2) + step;
|
|
1468
|
+
let c4 = Math.pow(step, 3) - Math.pow(step, 2);
|
|
1548
1469
|
// Compute new point with common control vectors
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
output.push({ time
|
|
1470
|
+
let x = c1 * p[i].x + c2 * p[i + 1].x + c3 * t1.x + c4 * t2.x;
|
|
1471
|
+
let y = c1 * p[i].y + c2 * p[i + 1].y + c3 * t1.y + c4 * t2.y;
|
|
1472
|
+
output.push({ time, x, y });
|
|
1552
1473
|
}
|
|
1553
1474
|
}
|
|
1554
1475
|
return output;
|
|
1555
1476
|
};
|
|
1556
|
-
this.distance =
|
|
1557
|
-
|
|
1558
|
-
|
|
1477
|
+
this.distance = (a, b) => {
|
|
1478
|
+
const dx = a.x - b.x;
|
|
1479
|
+
const dy = a.y - b.y;
|
|
1559
1480
|
return Math.sqrt(dx * dx + dy * dy);
|
|
1560
1481
|
};
|
|
1561
|
-
this.getPointerStyle =
|
|
1562
|
-
if (
|
|
1563
|
-
return "
|
|
1482
|
+
this.getPointerStyle = () => {
|
|
1483
|
+
if (this.vnext) {
|
|
1484
|
+
return `.${"clarity-pointer-move" /* Constant.PointerMove */} { ${pointerSvg} }`;
|
|
1564
1485
|
}
|
|
1565
1486
|
else {
|
|
1566
|
-
return "
|
|
1487
|
+
return `.${"clarity-pointer-move" /* Constant.PointerMove */} { background-image: url(${"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAmCAYAAAA4LpBhAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASDSURBVHgB7VdPTCNlFH8z0/+FFmRatnFNiDGR4O4mBk08smZvXjjIxRueNME9eHGNxoLxSNwr4WyigYToQRJLjXDzQtDNmnhR4kWWAJm20ymddtrx94bvI9NBWAptsod9ycvM92fe73vv/b73fUP0DIlCfRQ1AMTtjwcHB1+gPgOT67oK6+TkZBjNbxRF+X1gYCCDPpX6IKdGAaTu7++HuG9tbe1ONBr9GR7r+Xy+98DsIRuemJiIjI6OJgH+3e7urruzs+OOjIw8SiaTNwRwz8OtQWPpdHoYoKt///ar2/jxaw84k8k8gt5YWVnRqEfi90BrtVph0Uetx0V67d9fqFAo3G6324XZ2VldLK4noK4AVqvVaoh8YZTAxWLxdiwW20CoM70IdceWicfjSpCxfuBEIrGxsLCQZR7QNcQDwFaRRhRmcXCSL9S3kN8CtlP2Oqz2QoWt4Q4NDanHx8cy3HQBMIe6sLS0pF811B7I5uYmhUKh1nmAQWAOteM4xcXFxczMzEzXHp+u9PDwUBHvymWBmVzr6+t6t9tJhtPzEEYuFaoguebm5nTqJOXFoMxEVCO50tMFXBaYcwwbGwAfRagv5bEKthK2igdUr9epG/EDYw//xKGmzoLz/6BQd3t7m5i9dAUJsJoLSPZp5PIGp6amXHjsVSaEirqVALk8jy/axx2hwAcMTlcRH/Ad5LfA24kEZ4JzudbySSJzyqDnomq37pH14utH/iUrCA5HCeRwHYXc8dzNNs5jfXp6uoD+e/Pz8zzfDYIqq6urihg4NyTaK2/Rw8fNo0/euWvBWI3TwGAiHW2RnjY7LRVjX+7t7d3nSWL8FFSKIj46I0r2ZXr4R/PoQT5f1TTtU3Q5OAbbbAxtV4BwXx07wUI5raJdTaVS5vLysmYYhlyMDJBHJBoeHpbFwQ0CfmuP04P8V1VVVb9AVwXGy/xE6SyHw2FuW9Aa2jYAHVx1HAZh78bGxs44wYkm0zS9PPrC1QE4+8HcPwD8HONPYNzEkAU1UX+raFcYmPswzhu9ISLmShIdHBx0lFfVH2s+SyWR/IBofgYvnmCIPTQjkYiBk8mARwYWU4aW8F5uNpslXHkstBncxjcOeyqJ6vfUO9oQd2avlyeKJj3A9z/8yAOE7uHKUgGoiRQYMFZCdEq2bZfgpYFnmd9xzprlcrnCOdV13cbWaWKezGVnAUBOmVBpkOAlPH/AxuYJu/DoPQDcxfubeB/ncZCDL+IpaDKgiVwul8AzDo1BI3RC1HPLIg+mYPQmvPke+hdY+S68ehuevIHQvYpV5/i2KIxKg5pUUew1AaL6wM4cl4oPFJjxFMJ0H6BbIIgBwAbeLSzABLBVKpVszGvSCf27r5dCNE7h1tYWX1U0ECHUaDT+REhryKENrTFbwdLj+skRxIAeM+ka4rGV2QWv2vCIjVoAryC0Jk6MCk6fGvoY0OkFoF80UDsG8AG8j/BtD78YWRSMNNoJQbSe/1Zw0tmwBB6kE0ZG+wXI4v1ECYAIdbKzf/+povypEui6t/jnwvIf5FVJ1Cj/1+UAAAAASUVORK5CYII=" /* Asset.Pointer */}); }`;
|
|
1567
1488
|
}
|
|
1568
1489
|
};
|
|
1569
|
-
this.getClickLayerStyle =
|
|
1570
|
-
if (
|
|
1490
|
+
this.getClickLayerStyle = () => {
|
|
1491
|
+
if (this.vnext) {
|
|
1571
1492
|
return clickStyle;
|
|
1572
1493
|
}
|
|
1573
1494
|
else {
|
|
1574
|
-
return "
|
|
1575
|
-
"
|
|
1495
|
+
return `.${"clarity-click" /* Constant.ClickLayer */}, .${"clarity-click-ring" /* Constant.ClickRing */}, .${"clarity-touch" /* Constant.TouchLayer */}, .${"clarity-touch-ring" /* Constant.TouchRing */} { position: absolute; z-index: ${2147483647 /* Setting.ZIndex */}; border-radius: 50%; background: radial-gradient(rgba(0,90,158,0.8), transparent); width: ${22 /* Setting.ClickRadius */}px; height: ${22 /* Setting.ClickRadius */}px;}` +
|
|
1496
|
+
`.${"clarity-click-ring" /* Constant.ClickRing */} { background: transparent; border: 1px solid rgba(0,90,158,0.8); }`;
|
|
1576
1497
|
}
|
|
1577
1498
|
};
|
|
1578
1499
|
this.state = state;
|
|
1579
1500
|
this.layout = layout;
|
|
1580
1501
|
this.vnext = vnext;
|
|
1581
1502
|
}
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
}());
|
|
1503
|
+
}
|
|
1504
|
+
InteractionHelper.TRAIL_START_COLOR = [242, 97, 12]; // rgb(242,97,12)
|
|
1505
|
+
InteractionHelper.TRAIL_END_COLOR = [249, 220, 209]; // rgb(249,220,209)
|
|
1586
1506
|
|
|
1587
1507
|
var sharedStyle = `iframe[data-clarity-unavailable-small], iframe[data-clarity-unavailable], img[data-clarity-blob-hide=sb], img[data-clarity-blob-hide=lb], img[data-clarity-hide=sb], img[data-clarity-hide=lb] {
|
|
1588
1508
|
background-color: #FBFBFE;
|
|
@@ -1675,7 +1595,7 @@ var imageMaskedSvgItalian = `background: url("data:image/svg+xml,%3Csvg width='1
|
|
|
1675
1595
|
|
|
1676
1596
|
var imageMaskedSvgPortuguese = `background: url("data:image/svg+xml,%3Csvg width='100%25' viewBox='0 0 100 80' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100' height='80' fill='%23FBFBFE'/%3E%3Cpath d='M40.2197 10.2197C39.9534 10.4859 39.9292 10.9026 40.1471 11.1962L40.2197 11.2803L44.2542 15.3149C42.3322 16.6644 40.8958 18.6799 40.2989 21.0644C40.1983 21.4662 40.4425 21.8735 40.8443 21.9741C41.2461 22.0746 41.6534 21.8305 41.754 21.4286C42.2835 19.3135 43.5911 17.5395 45.3342 16.3945L47.1438 18.2043C46.4363 18.9258 46 19.9143 46 21.0046C46 23.2138 47.7909 25.0046 50 25.0046C51.0904 25.0046 52.0788 24.5683 52.8004 23.8608L58.7197 29.7803C59.0126 30.0732 59.4874 30.0732 59.7803 29.7803C60.0466 29.5141 60.0708 29.0974 59.8529 28.8038L59.7803 28.7197L53.6668 22.6055L53.668 22.604L52.4679 21.4061L49.598 18.5368L49.6 18.536L46.7188 15.6578L46.72 15.656L45.5867 14.5255L41.2803 10.2197C40.9874 9.92678 40.5126 9.92678 40.2197 10.2197ZM48.2041 19.2655L51.7392 22.8006C51.2892 23.2364 50.6759 23.5046 50 23.5046C48.6193 23.5046 47.5 22.3853 47.5 21.0046C47.5 20.3287 47.7682 19.7154 48.2041 19.2655ZM50 13.5C48.9997 13.5 48.0291 13.6481 47.1111 13.925L48.3481 15.1612C48.8839 15.0553 49.4364 15 50 15C53.9231 15 57.3099 17.6803 58.2471 21.4332C58.3475 21.835 58.7546 22.0794 59.1565 21.9791C59.5584 21.8787 59.8028 21.4716 59.7024 21.0697C58.5994 16.6527 54.6155 13.5 50 13.5ZM50.1947 17.0093L53.996 20.81C53.8942 18.7531 52.2472 17.1076 50.1947 17.0093Z' fill='%23020057'/%3E%3Cpath d='M23.3281 53.1406C22.1367 53.1406 21.1816 52.748 20.4629 51.9629C19.748 51.1777 19.3906 50.1562 19.3906 48.8984C19.3906 47.5469 19.7559 46.4688 20.4863 45.6641C21.2168 44.8594 22.2109 44.457 23.4688 44.457C24.6289 44.457 25.5625 44.8477 26.2695 45.6289C26.9805 46.4102 27.3359 47.4316 27.3359 48.6934C27.3359 50.0645 26.9727 51.1484 26.2461 51.9453C25.5195 52.7422 24.5469 53.1406 23.3281 53.1406ZM23.3984 45.3477C22.5156 45.3477 21.7988 45.666 21.248 46.3027C20.6973 46.9395 20.4219 47.7754 20.4219 48.8105C20.4219 49.8457 20.6895 50.6797 21.2246 51.3125C21.7637 51.9414 22.4648 52.2559 23.3281 52.2559C24.25 52.2559 24.9766 51.9551 25.5078 51.3535C26.0391 50.752 26.3047 49.9102 26.3047 48.8281C26.3047 47.7188 26.0469 46.8613 25.5312 46.2559C25.0156 45.6504 24.3047 45.3477 23.3984 45.3477ZM36.9746 50.2402H32.7383C32.7539 50.9082 32.9336 51.4238 33.2773 51.7871C33.6211 52.1504 34.0938 52.332 34.6953 52.332C35.3711 52.332 35.9922 52.1094 36.5586 51.6641V52.5664C36.0312 52.9492 35.334 53.1406 34.4668 53.1406C33.6191 53.1406 32.9531 52.8691 32.4688 52.3262C31.9844 51.7793 31.7422 51.0117 31.7422 50.0234C31.7422 49.0898 32.0059 48.3301 32.5332 47.7441C33.0645 47.1543 33.7227 46.8594 34.5078 46.8594C35.293 46.8594 35.9004 47.1133 36.3301 47.6211C36.7598 48.1289 36.9746 48.834 36.9746 49.7363V50.2402ZM35.9902 49.4258C35.9863 48.8711 35.8516 48.4395 35.5859 48.1309C35.3242 47.8223 34.959 47.668 34.4902 47.668C34.0371 47.668 33.6523 47.8301 33.3359 48.1543C33.0195 48.4785 32.8242 48.9023 32.75 49.4258H35.9902ZM39.3945 53H38.4336V44.1172H39.3945V53ZM46.1621 50.2402H41.9258C41.9414 50.9082 42.1211 51.4238 42.4648 51.7871C42.8086 52.1504 43.2812 52.332 43.8828 52.332C44.5586 52.332 45.1797 52.1094 45.7461 51.6641V52.5664C45.2188 52.9492 44.5215 53.1406 43.6543 53.1406C42.8066 53.1406 42.1406 52.8691 41.6562 52.3262C41.1719 51.7793 40.9297 51.0117 40.9297 50.0234C40.9297 49.0898 41.1934 48.3301 41.7207 47.7441C42.252 47.1543 42.9102 46.8594 43.6953 46.8594C44.4805 46.8594 45.0879 47.1133 45.5176 47.6211C45.9473 48.1289 46.1621 48.834 46.1621 49.7363V50.2402ZM45.1777 49.4258C45.1738 48.8711 45.0391 48.4395 44.7734 48.1309C44.5117 47.8223 44.1465 47.668 43.6777 47.668C43.2246 47.668 42.8398 47.8301 42.5234 48.1543C42.207 48.4785 42.0117 48.9023 41.9375 49.4258H45.1777ZM56.1406 53H55.1797V49.5547C55.1797 48.8906 55.0762 48.4102 54.8691 48.1133C54.666 47.8164 54.3223 47.668 53.8379 47.668C53.4277 47.668 53.0781 47.8555 52.7891 48.2305C52.5039 48.6055 52.3613 49.0547 52.3613 49.5781V53H51.4004V49.4375C51.4004 48.2578 50.9453 47.668 50.0352 47.668C49.6133 47.668 49.2656 47.8457 48.9922 48.2012C48.7188 48.5527 48.582 49.0117 48.582 49.5781V53H47.6211V47H48.582V47.9492H48.6055C49.0312 47.2227 49.6523 46.8594 50.4688 46.8594C50.8789 46.8594 51.2363 46.9746 51.541 47.2051C51.8457 47.4316 52.0547 47.7305 52.168 48.1016C52.6133 47.2734 53.2773 46.8594 54.1602 46.8594C55.4805 46.8594 56.1406 47.6738 56.1406 49.3027V53ZM62.7793 50.2402H58.543C58.5586 50.9082 58.7383 51.4238 59.082 51.7871C59.4258 52.1504 59.8984 52.332 60.5 52.332C61.1758 52.332 61.7969 52.1094 62.3633 51.6641V52.5664C61.8359 52.9492 61.1387 53.1406 60.2715 53.1406C59.4238 53.1406 58.7578 52.8691 58.2734 52.3262C57.7891 51.7793 57.5469 51.0117 57.5469 50.0234C57.5469 49.0898 57.8105 48.3301 58.3379 47.7441C58.8691 47.1543 59.5273 46.8594 60.3125 46.8594C61.0977 46.8594 61.7051 47.1133 62.1348 47.6211C62.5645 48.1289 62.7793 48.834 62.7793 49.7363V50.2402ZM61.7949 49.4258C61.791 48.8711 61.6562 48.4395 61.3906 48.1309C61.1289 47.8223 60.7637 47.668 60.2949 47.668C59.8418 47.668 59.457 47.8301 59.1406 48.1543C58.8242 48.4785 58.6289 48.9023 58.5547 49.4258H61.7949ZM69.2188 53H68.2578V49.5781C68.2578 48.3047 67.793 47.668 66.8633 47.668C66.3828 47.668 65.9844 47.8496 65.668 48.2129C65.3555 48.5723 65.1992 49.0273 65.1992 49.5781V53H64.2383V47H65.1992V47.9961H65.2227C65.6758 47.2383 66.332 46.8594 67.1914 46.8594C67.8477 46.8594 68.3496 47.0723 68.6973 47.498C69.0449 47.9199 69.2188 48.5312 69.2188 49.332V53ZM73.8184 52.9414C73.5918 53.0664 73.293 53.1289 72.9219 53.1289C71.8711 53.1289 71.3457 52.543 71.3457 51.3711V47.8203H70.3145V47H71.3457V45.5352L72.3066 45.2246V47H73.8184V47.8203H72.3066V51.2012C72.3066 51.6035 72.375 51.8906 72.5117 52.0625C72.6484 52.2344 72.875 52.3203 73.1914 52.3203C73.4336 52.3203 73.6426 52.2539 73.8184 52.1211V52.9414ZM77.6094 53.1406C76.7227 53.1406 76.0137 52.8613 75.4824 52.3027C74.9551 51.7402 74.6914 50.9961 74.6914 50.0703C74.6914 49.0625 74.9668 48.2754 75.5176 47.709C76.0684 47.1426 76.8125 46.8594 77.75 46.8594C78.6445 46.8594 79.3418 47.1348 79.8418 47.6855C80.3457 48.2363 80.5977 49 80.5977 49.9766C80.5977 50.9336 80.3262 51.7012 79.7832 52.2793C79.2441 52.8535 78.5195 53.1406 77.6094 53.1406ZM77.6797 47.668C77.0625 47.668 76.5742 47.8789 76.2148 48.3008C75.8555 48.7188 75.6758 49.2969 75.6758 50.0352C75.6758 50.7461 75.8574 51.3066 76.2207 51.7168C76.584 52.127 77.0703 52.332 77.6797 52.332C78.3008 52.332 78.7773 52.1309 79.1094 51.7285C79.4453 51.3262 79.6133 50.7539 79.6133 50.0117C79.6133 49.2617 79.4453 48.6836 79.1094 48.2773C78.7773 47.8711 78.3008 47.668 77.6797 47.668ZM14.5918 66.2402H10.3555C10.3711 66.9082 10.5508 67.4238 10.8945 67.7871C11.2383 68.1504 11.7109 68.332 12.3125 68.332C12.9883 68.332 13.6094 68.1094 14.1758 67.6641V68.5664C13.6484 68.9492 12.9512 69.1406 12.084 69.1406C11.2363 69.1406 10.5703 68.8691 10.0859 68.3262C9.60156 67.7793 9.35938 67.0117 9.35938 66.0234C9.35938 65.0898 9.62305 64.3301 10.1504 63.7441C10.6816 63.1543 11.3398 62.8594 12.125 62.8594C12.9102 62.8594 13.5176 63.1133 13.9473 63.6211C14.377 64.1289 14.5918 64.834 14.5918 65.7363V66.2402ZM13.6074 65.4258C13.6035 64.8711 13.4688 64.4395 13.2031 64.1309C12.9414 63.8223 12.5762 63.668 12.1074 63.668C11.6543 63.668 11.2695 63.8301 10.9531 64.1543C10.6367 64.4785 10.4414 64.9023 10.3672 65.4258H13.6074ZM15.6875 68.7832V67.752C16.2109 68.1387 16.7871 68.332 17.416 68.332C18.2598 68.332 18.6816 68.0508 18.6816 67.4883C18.6816 67.3281 18.6445 67.1934 18.5703 67.084C18.5 66.9707 18.4023 66.8711 18.2773 66.7852C18.1562 66.6992 18.0117 66.623 17.8438 66.5566C17.6797 66.4863 17.502 66.4141 17.3105 66.3398C17.0449 66.2344 16.8105 66.1289 16.6074 66.0234C16.4082 65.9141 16.2402 65.793 16.1035 65.6602C15.9707 65.5234 15.8691 65.3691 15.7988 65.1973C15.7324 65.0254 15.6992 64.8242 15.6992 64.5938C15.6992 64.3125 15.7637 64.0645 15.8926 63.8496C16.0215 63.6309 16.1934 63.4492 16.4082 63.3047C16.623 63.1562 16.8672 63.0449 17.1406 62.9707C17.418 62.8965 17.7031 62.8594 17.9961 62.8594C18.5156 62.8594 18.9805 62.9492 19.3906 63.1289V64.1016C18.9492 63.8125 18.4414 63.668 17.8672 63.668C17.6875 63.668 17.5254 63.6895 17.3809 63.7324C17.2363 63.7715 17.1113 63.8281 17.0059 63.9023C16.9043 63.9766 16.8242 64.0664 16.7656 64.1719C16.7109 64.2734 16.6836 64.3867 16.6836 64.5117C16.6836 64.668 16.7109 64.7988 16.7656 64.9043C16.8242 65.0098 16.9082 65.1035 17.0176 65.1855C17.127 65.2676 17.2598 65.3418 17.416 65.4082C17.5723 65.4746 17.75 65.5469 17.9492 65.625C18.2148 65.7266 18.4531 65.832 18.6641 65.9414C18.875 66.0469 19.0547 66.168 19.2031 66.3047C19.3516 66.4375 19.4648 66.5918 19.543 66.7676C19.625 66.9434 19.666 67.1523 19.666 67.3945C19.666 67.6914 19.5996 67.9492 19.4668 68.168C19.3379 68.3867 19.1641 68.5684 18.9453 68.7129C18.7266 68.8574 18.4746 68.9648 18.1895 69.0352C17.9043 69.1055 17.6055 69.1406 17.293 69.1406C16.6758 69.1406 16.1406 69.0215 15.6875 68.7832ZM23.9316 68.9414C23.7051 69.0664 23.4062 69.1289 23.0352 69.1289C21.9844 69.1289 21.459 68.543 21.459 67.3711V63.8203H20.4277V63H21.459V61.5352L22.4199 61.2246V63H23.9316V63.8203H22.4199V67.2012C22.4199 67.6035 22.4883 67.8906 22.625 68.0625C22.7617 68.2344 22.9883 68.3203 23.3047 68.3203C23.5469 68.3203 23.7559 68.2539 23.9316 68.1211V68.9414ZM29.5098 69H28.5488V68.0625H28.5254C28.1074 68.7812 27.4922 69.1406 26.6797 69.1406C26.082 69.1406 25.6133 68.9824 25.2734 68.666C24.9375 68.3496 24.7695 67.9297 24.7695 67.4062C24.7695 66.2852 25.4297 65.6328 26.75 65.4492L28.5488 65.1973C28.5488 64.1777 28.1367 63.668 27.3125 63.668C26.5898 63.668 25.9375 63.9141 25.3555 64.4062V63.4219C25.9453 63.0469 26.625 62.8594 27.3945 62.8594C28.8047 62.8594 29.5098 63.6055 29.5098 65.0977V69ZM28.5488 65.9648L27.1016 66.1641C26.6562 66.2266 26.3203 66.3379 26.0938 66.498C25.8672 66.6543 25.7539 66.9336 25.7539 67.3359C25.7539 67.6289 25.8574 67.8691 26.0645 68.0566C26.2754 68.2402 26.5547 68.332 26.9023 68.332C27.3789 68.332 27.7715 68.166 28.0801 67.834C28.3926 67.498 28.5488 67.0742 28.5488 66.5625V65.9648ZM28.6777 59.9414L27.1426 61.8633H26.3984L27.7051 59.9414H28.6777ZM43.1328 69H42.1719V65.5547C42.1719 64.8906 42.0684 64.4102 41.8613 64.1133C41.6582 63.8164 41.3145 63.668 40.8301 63.668C40.4199 63.668 40.0703 63.8555 39.7812 64.2305C39.4961 64.6055 39.3535 65.0547 39.3535 65.5781V69H38.3926V65.4375C38.3926 64.2578 37.9375 63.668 37.0273 63.668C36.6055 63.668 36.2578 63.8457 35.9844 64.2012C35.7109 64.5527 35.5742 65.0117 35.5742 65.5781V69H34.6133V63H35.5742V63.9492H35.5977C36.0234 63.2227 36.6445 62.8594 37.4609 62.8594C37.8711 62.8594 38.2285 62.9746 38.5332 63.2051C38.8379 63.4316 39.0469 63.7305 39.1602 64.1016C39.6055 63.2734 40.2695 62.8594 41.1523 62.8594C42.4727 62.8594 43.1328 63.6738 43.1328 65.3027V69ZM49.2441 69H48.2832V68.0625H48.2598C47.8418 68.7812 47.2266 69.1406 46.4141 69.1406C45.8164 69.1406 45.3477 68.9824 45.0078 68.666C44.6719 68.3496 44.5039 67.9297 44.5039 67.4062C44.5039 66.2852 45.1641 65.6328 46.4844 65.4492L48.2832 65.1973C48.2832 64.1777 47.8711 63.668 47.0469 63.668C46.3242 63.668 45.6719 63.9141 45.0898 64.4062V63.4219C45.6797 63.0469 46.3594 62.8594 47.1289 62.8594C48.5391 62.8594 49.2441 63.6055 49.2441 65.0977V69ZM48.2832 65.9648L46.8359 66.1641C46.3906 66.2266 46.0547 66.3379 45.8281 66.498C45.6016 66.6543 45.4883 66.9336 45.4883 67.3359C45.4883 67.6289 45.5918 67.8691 45.7988 68.0566C46.0098 68.2402 46.2891 68.332 46.6367 68.332C47.1133 68.332 47.5059 68.166 47.8145 67.834C48.127 67.498 48.2832 67.0742 48.2832 66.5625V65.9648ZM50.6914 68.7832V67.752C51.2148 68.1387 51.791 68.332 52.4199 68.332C53.2637 68.332 53.6855 68.0508 53.6855 67.4883C53.6855 67.3281 53.6484 67.1934 53.5742 67.084C53.5039 66.9707 53.4062 66.8711 53.2812 66.7852C53.1602 66.6992 53.0156 66.623 52.8477 66.5566C52.6836 66.4863 52.5059 66.4141 52.3145 66.3398C52.0488 66.2344 51.8145 66.1289 51.6113 66.0234C51.4121 65.9141 51.2441 65.793 51.1074 65.6602C50.9746 65.5234 50.873 65.3691 50.8027 65.1973C50.7363 65.0254 50.7031 64.8242 50.7031 64.5938C50.7031 64.3125 50.7676 64.0645 50.8965 63.8496C51.0254 63.6309 51.1973 63.4492 51.4121 63.3047C51.627 63.1562 51.8711 63.0449 52.1445 62.9707C52.4219 62.8965 52.707 62.8594 53 62.8594C53.5195 62.8594 53.9844 62.9492 54.3945 63.1289V64.1016C53.9531 63.8125 53.4453 63.668 52.8711 63.668C52.6914 63.668 52.5293 63.6895 52.3848 63.7324C52.2402 63.7715 52.1152 63.8281 52.0098 63.9023C51.9082 63.9766 51.8281 64.0664 51.7695 64.1719C51.7148 64.2734 51.6875 64.3867 51.6875 64.5117C51.6875 64.668 51.7148 64.7988 51.7695 64.9043C51.8281 65.0098 51.9121 65.1035 52.0215 65.1855C52.1309 65.2676 52.2637 65.3418 52.4199 65.4082C52.5762 65.4746 52.7539 65.5469 52.9531 65.625C53.2188 65.7266 53.457 65.832 53.668 65.9414C53.8789 66.0469 54.0586 66.168 54.207 66.3047C54.3555 66.4375 54.4688 66.5918 54.5469 66.7676C54.6289 66.9434 54.6699 67.1523 54.6699 67.3945C54.6699 67.6914 54.6035 67.9492 54.4707 68.168C54.3418 68.3867 54.168 68.5684 53.9492 68.7129C53.7305 68.8574 53.4785 68.9648 53.1934 69.0352C52.9082 69.1055 52.6094 69.1406 52.2969 69.1406C51.6797 69.1406 51.1445 69.0215 50.6914 68.7832ZM60.2422 68.7246C59.7812 69.002 59.2344 69.1406 58.6016 69.1406C57.7461 69.1406 57.0547 68.8633 56.5273 68.3086C56.0039 67.75 55.7422 67.0273 55.7422 66.1406C55.7422 65.1523 56.0254 64.3594 56.5918 63.7617C57.1582 63.1602 57.9141 62.8594 58.8594 62.8594C59.3867 62.8594 59.8516 62.957 60.2539 63.1523V64.1367C59.8086 63.8242 59.332 63.668 58.8242 63.668C58.2109 63.668 57.707 63.8887 57.3125 64.3301C56.9219 64.7676 56.7266 65.3438 56.7266 66.0586C56.7266 66.7617 56.9102 67.3164 57.2773 67.7227C57.6484 68.1289 58.1445 68.332 58.7656 68.332C59.2891 68.332 59.7812 68.1582 60.2422 67.8105V68.7246ZM65.9902 69H65.0293V68.0625H65.0059C64.5879 68.7812 63.9727 69.1406 63.1602 69.1406C62.5625 69.1406 62.0938 68.9824 61.7539 68.666C61.418 68.3496 61.25 67.9297 61.25 67.4062C61.25 66.2852 61.9102 65.6328 63.2305 65.4492L65.0293 65.1973C65.0293 64.1777 64.6172 63.668 63.793 63.668C63.0703 63.668 62.418 63.9141 61.8359 64.4062V63.4219C62.4258 63.0469 63.1055 62.8594 63.875 62.8594C65.2852 62.8594 65.9902 63.6055 65.9902 65.0977V69ZM65.0293 65.9648L63.582 66.1641C63.1367 66.2266 62.8008 66.3379 62.5742 66.498C62.3477 66.6543 62.2344 66.9336 62.2344 67.3359C62.2344 67.6289 62.3379 67.8691 62.5449 68.0566C62.7559 68.2402 63.0352 68.332 63.3828 68.332C63.8594 68.332 64.252 68.166 64.5605 67.834C64.873 67.498 65.0293 67.0742 65.0293 66.5625V65.9648ZM70.9297 63.9727C70.7617 63.8438 70.5195 63.7793 70.2031 63.7793C69.793 63.7793 69.4492 63.9727 69.1719 64.3594C68.8984 64.7461 68.7617 65.2734 68.7617 65.9414V69H67.8008V63H68.7617V64.2363H68.7852C68.9219 63.8145 69.1309 63.4863 69.4121 63.252C69.6934 63.0137 70.0078 62.8945 70.3555 62.8945C70.6055 62.8945 70.7969 62.9219 70.9297 62.9766V63.9727ZM76.2676 69H75.3066V68.0625H75.2832C74.8652 68.7812 74.25 69.1406 73.4375 69.1406C72.8398 69.1406 72.3711 68.9824 72.0312 68.666C71.6953 68.3496 71.5273 67.9297 71.5273 67.4062C71.5273 66.2852 72.1875 65.6328 73.5078 65.4492L75.3066 65.1973C75.3066 64.1777 74.8945 63.668 74.0703 63.668C73.3477 63.668 72.6953 63.9141 72.1133 64.4062V63.4219C72.7031 63.0469 73.3828 62.8594 74.1523 62.8594C75.5625 62.8594 76.2676 63.6055 76.2676 65.0977V69ZM75.3066 65.9648L73.8594 66.1641C73.4141 66.2266 73.0781 66.3379 72.8516 66.498C72.625 66.6543 72.5117 66.9336 72.5117 67.3359C72.5117 67.6289 72.6152 67.8691 72.8223 68.0566C73.0332 68.2402 73.3125 68.332 73.6602 68.332C74.1367 68.332 74.5293 68.166 74.8379 67.834C75.1504 67.498 75.3066 67.0742 75.3066 66.5625V65.9648ZM83.1992 69H82.2383V67.9805H82.2148C81.7695 68.7539 81.082 69.1406 80.1523 69.1406C79.3984 69.1406 78.7949 68.873 78.3418 68.3379C77.8926 67.7988 77.668 67.0664 77.668 66.1406C77.668 65.1484 77.918 64.3535 78.418 63.7559C78.918 63.1582 79.584 62.8594 80.416 62.8594C81.2402 62.8594 81.8398 63.1836 82.2148 63.832H82.2383V60.1172H83.1992V69ZM82.2383 66.2871V65.4023C82.2383 64.918 82.0781 64.5078 81.7578 64.1719C81.4375 63.8359 81.0312 63.668 80.5391 63.668C79.9531 63.668 79.4922 63.8828 79.1562 64.3125C78.8203 64.7422 78.6523 65.3359 78.6523 66.0938C78.6523 66.7852 78.8125 67.332 79.1328 67.7344C79.457 68.1328 79.8906 68.332 80.4336 68.332C80.9688 68.332 81.4023 68.1387 81.7344 67.752C82.0703 67.3652 82.2383 66.877 82.2383 66.2871ZM87.6523 69.1406C86.7656 69.1406 86.0566 68.8613 85.5254 68.3027C84.998 67.7402 84.7344 66.9961 84.7344 66.0703C84.7344 65.0625 85.0098 64.2754 85.5605 63.709C86.1113 63.1426 86.8555 62.8594 87.793 62.8594C88.6875 62.8594 89.3848 63.1348 89.8848 63.6855C90.3887 64.2363 90.6406 65 90.6406 65.9766C90.6406 66.9336 90.3691 67.7012 89.8262 68.2793C89.2871 68.8535 88.5625 69.1406 87.6523 69.1406ZM87.7227 63.668C87.1055 63.668 86.6172 63.8789 86.2578 64.3008C85.8984 64.7188 85.7188 65.2969 85.7188 66.0352C85.7188 66.7461 85.9004 67.3066 86.2637 67.7168C86.627 68.127 87.1133 68.332 87.7227 68.332C88.3438 68.332 88.8203 68.1309 89.1523 67.7285C89.4883 67.3262 89.6562 66.7539 89.6562 66.0117C89.6562 65.2617 89.4883 64.6836 89.1523 64.2773C88.8203 63.8711 88.3438 63.668 87.7227 63.668Z' fill='%23020057'/%3E%3C/svg%3E%0A") no-repeat center center;`;
|
|
1677
1597
|
|
|
1678
|
-
|
|
1598
|
+
const blobUnavailableSvg = {
|
|
1679
1599
|
"de-de": blobUnavailableSvgGerman,
|
|
1680
1600
|
"en-gb": blobUnavailableSvgEnglish,
|
|
1681
1601
|
"en-us": blobUnavailableSvgEnglish,
|
|
@@ -1691,7 +1611,7 @@ var blobUnavailableSvg = {
|
|
|
1691
1611
|
"zh-hans": blobUnavailableSvgChineseSimplified,
|
|
1692
1612
|
"zh-hant": blobUnavailableSvgChineseTraditional,
|
|
1693
1613
|
};
|
|
1694
|
-
|
|
1614
|
+
const iframeUnavailableSvg = {
|
|
1695
1615
|
"de-de": iframeUnavailableSvgGerman,
|
|
1696
1616
|
"en-gb": iframeUnavailableSvgEnglish,
|
|
1697
1617
|
"en-us": iframeUnavailableSvgEnglish,
|
|
@@ -1707,7 +1627,7 @@ var iframeUnavailableSvg = {
|
|
|
1707
1627
|
"zh-hans": iframeUnavailableSvgChineseSimplified,
|
|
1708
1628
|
"zh-hant": iframeUnavailableSvgChineseTraditional,
|
|
1709
1629
|
};
|
|
1710
|
-
|
|
1630
|
+
const imageMaskedSvg = {
|
|
1711
1631
|
"de-de": imageMaskedSvgGerman,
|
|
1712
1632
|
"en-gb": imageMaskedSvgEnglish,
|
|
1713
1633
|
"en-us": imageMaskedSvgEnglish,
|
|
@@ -1724,12 +1644,8 @@ var imageMaskedSvg = {
|
|
|
1724
1644
|
"zh-hant": imageMaskedSvgChineseTraditional,
|
|
1725
1645
|
};
|
|
1726
1646
|
/* END imageMaskedSvgs */
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
if (isMobile === void 0) { isMobile = false; }
|
|
1730
|
-
if (vNext === void 0) { vNext = false; }
|
|
1731
|
-
if (locale === void 0) { locale = 'en-us'; }
|
|
1732
|
-
var _this = this;
|
|
1647
|
+
class LayoutHelper {
|
|
1648
|
+
constructor(state, isMobile = false, vNext = false, locale = 'en-us') {
|
|
1733
1649
|
this.primaryHtmlNodeId = null;
|
|
1734
1650
|
this.stylesheets = [];
|
|
1735
1651
|
this.fonts = [];
|
|
@@ -1742,44 +1658,44 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
1742
1658
|
this.state = null;
|
|
1743
1659
|
this.stylesToApply = {};
|
|
1744
1660
|
this.BackgroundImageEligibleElements = ['DIV', 'SECTION', 'ARTICLE', 'HEADER', 'FOOTER', 'ASIDE', 'NAV', 'SPAN', 'P', 'MAIN'];
|
|
1745
|
-
this.MaskedBackgroundImageStyle =
|
|
1746
|
-
this.reset =
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1661
|
+
this.MaskedBackgroundImageStyle = `#CCC no-repeat center url("${"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANvSURBVHgB7Ve9VhpREJ5dU6BNVqt0wS6dpEuX9QmiTyA+gfgE4BOgZSrJE4hlKvEJxDKVa2caoaSSfB87F4Z7dtmFhFTMOfcMe52Z+935u6PIhjb0dxTIihRFUQ2M6z0/dXuI9ay8PwTJklQaEADw0JMgCI4USFSkMx6Pe2BdrFtgS6QEFQICjirYGYDUc0AMcXCCvw8XAVVwHQD7IasAokfCMGzB0NmCA1o44N7T+wpwlwouT+80z2NbOWAaMHqDn7FuJcorapRATkej0bOvyz2s7zs7O2L0GbYXrCrscjUqlUoAuZ6vH3hAIr3diW4xHC3wW+w/KZhLgDmXEgRzbR6udvbBD/DdITB3UewfWm+FRpnIHwyYLo1A+Aq/vzkDWFdSni4krTjm1RnDOxgM9nFOS//OM++0YmeAFMydQw4gDSgeu7LVyprE3489je3u7t5waQFMifrQ6ehn7PZfX18v6BkFOwcq9MDQQKxeseRu0PXARJprBHxED2t7sPSol6p5YHs467OkXo8cqBA/rmXmmVO/atzZzk4G0Kond+DJJJLmStc3Sm+rpxLVbYcEoRu8xbWNp9U1B1rqyzzIRNQj5tAe84ZVKVmGZ6BoK5Vh2JADT1hjLny3rBL27nS/7RtUXZdDmb1H5Ug1rDgjrFMKrGGb2CzPt7e3C95gb2+vqeU/1Mor/UZpg21og50CsfYzATllsLY+E6TE60OTPoUqOV8EQNKKmuTTgifHAmO4GOokyDFah2BTTAOTNFcmIQFI3qyVoxurp+dIL3ZF72bYdzL1zKcDLb2P1n4rqUfcg/nB3Cre3t6uQeY3ZBOri72q87B7ULHY035CdmTs85H9BVlR23yWumVf+6YJo0/MK7qcI8al9RCqq9R4w4ICq9JDYZEwk44ly2TWFtGT+VKnF2PwB6cis8sUzkw+vSsrqNXQ0eUmxo+S5gEPfvQBSTpNLjU1rjzCLiKEYAAWMQRFA5m2GzdJxIUhW5H6yutFguhRToapcb8WQGwL5MwtDnt5cvQOZJuq0yHfkjUQWwHbAn5+AqgvKHGW/IsPRquR+ZdgcQIdrStkYh5tN1ocZYCpSto2Dqezl6yRMga/yQSpXToyYFzOrReQAcUhzp8E+E4eWzD/lTgxuPFGR5Wlm+Y/J3qL/7fJhja0RvoDR4Tn4Lo/zi8AAAAASUVORK5CYII=" /* Asset.Hide */}")`;
|
|
1662
|
+
this.reset = () => {
|
|
1663
|
+
this.nodes = {};
|
|
1664
|
+
this.stylesheets = [];
|
|
1665
|
+
this.fonts = [];
|
|
1666
|
+
this.events = {};
|
|
1667
|
+
this.hashMapAlpha = {};
|
|
1668
|
+
this.hashMapBeta = {};
|
|
1669
|
+
this.primaryHtmlNodeId = null;
|
|
1754
1670
|
// Reset dialog render state for new render cycle
|
|
1755
1671
|
resetDialogRenderState();
|
|
1756
1672
|
};
|
|
1757
|
-
this.get =
|
|
1758
|
-
if (hash in
|
|
1759
|
-
return
|
|
1673
|
+
this.get = (hash) => {
|
|
1674
|
+
if (hash in this.hashMapBeta && this.hashMapBeta[hash].isConnected) {
|
|
1675
|
+
return this.hashMapBeta[hash];
|
|
1760
1676
|
}
|
|
1761
|
-
else if (hash in
|
|
1762
|
-
return
|
|
1677
|
+
else if (hash in this.hashMapAlpha && this.hashMapAlpha[hash].isConnected) {
|
|
1678
|
+
return this.hashMapAlpha[hash];
|
|
1763
1679
|
}
|
|
1764
1680
|
return null;
|
|
1765
1681
|
};
|
|
1766
|
-
this.addToHashMap =
|
|
1682
|
+
this.addToHashMap = (data, parent) => {
|
|
1767
1683
|
// In case of selector collision, prefer the first inserted node
|
|
1768
|
-
|
|
1769
|
-
|
|
1684
|
+
this.hashMapAlpha[data.hashAlpha] = this.get(data.hashAlpha) || parent;
|
|
1685
|
+
this.hashMapBeta[data.hashBeta] = this.get(data.hashBeta) || parent;
|
|
1770
1686
|
};
|
|
1771
|
-
this.resize =
|
|
1687
|
+
this.resize = (el, width, height) => {
|
|
1772
1688
|
if (el && el.nodeType === 1 /* NodeType.ELEMENT_NODE */ && width && height) {
|
|
1773
1689
|
el.style.width = width + "px" /* Layout.Constant.Pixel */;
|
|
1774
1690
|
el.style.height = height + "px" /* Layout.Constant.Pixel */;
|
|
1775
1691
|
el.style.boxSizing = "border-box" /* Layout.Constant.BorderBox */; // Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing
|
|
1776
1692
|
}
|
|
1777
1693
|
};
|
|
1778
|
-
this.element =
|
|
1779
|
-
return nodeId !== null && nodeId > 0 && nodeId in
|
|
1694
|
+
this.element = (nodeId) => {
|
|
1695
|
+
return nodeId !== null && nodeId > 0 && nodeId in this.nodes ? this.nodes[nodeId] : null;
|
|
1780
1696
|
};
|
|
1781
|
-
this.animateChange =
|
|
1782
|
-
|
|
1697
|
+
this.animateChange = (event) => {
|
|
1698
|
+
let animation = this.animations[event.data.id];
|
|
1783
1699
|
if (!animation && event.data.operation !== 0 /* AnimationOperation.Create */) {
|
|
1784
1700
|
// We didn't have a reference to this animation. This shouldn't happen, but returning here
|
|
1785
1701
|
// to ensure we don't throw any errors.
|
|
@@ -1787,10 +1703,10 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
1787
1703
|
}
|
|
1788
1704
|
switch (event.data.operation) {
|
|
1789
1705
|
case 0 /* AnimationOperation.Create */:
|
|
1790
|
-
|
|
1706
|
+
let target = this.element(event.data.targetId);
|
|
1791
1707
|
// only create the animation if we successfully found the target, an animation without a target will throw an error
|
|
1792
1708
|
if (target) {
|
|
1793
|
-
|
|
1709
|
+
this.animations[event.data.id] = target.animate(JSON.parse(event.data.keyFrames), JSON.parse(event.data.timing));
|
|
1794
1710
|
}
|
|
1795
1711
|
break;
|
|
1796
1712
|
case 3 /* AnimationOperation.Cancel */:
|
|
@@ -1810,39 +1726,32 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
1810
1726
|
break;
|
|
1811
1727
|
}
|
|
1812
1728
|
};
|
|
1813
|
-
this.dom =
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
case 1:
|
|
1827
|
-
// Wait on all stylesheets and fonts to finish loading
|
|
1828
|
-
_a.sent();
|
|
1829
|
-
// Toggle back the visibility of target window
|
|
1830
|
-
doc.documentElement.style.visibility = "visible" /* Constant.Visible */;
|
|
1831
|
-
_a.label = 2;
|
|
1832
|
-
case 2: return [2 /*return*/];
|
|
1729
|
+
this.dom = (event, useproxy) => __awaiter(this, void 0, void 0, function* () {
|
|
1730
|
+
if (event) {
|
|
1731
|
+
// When setting up rendering for the first time, start off with hidden target window
|
|
1732
|
+
// This ensures we do not show flickers to the end user
|
|
1733
|
+
let doc = this.state.window.document;
|
|
1734
|
+
if (doc && doc.documentElement) {
|
|
1735
|
+
doc.documentElement.style.visibility = "hidden" /* Constant.Hidden */;
|
|
1736
|
+
// Render all DOM events to reconstruct the page
|
|
1737
|
+
this.markup(event, useproxy);
|
|
1738
|
+
// Wait on all stylesheets and fonts to finish loading
|
|
1739
|
+
yield Promise.all(this.stylesheets.concat(this.fonts));
|
|
1740
|
+
// Toggle back the visibility of target window
|
|
1741
|
+
doc.documentElement.style.visibility = "visible" /* Constant.Visible */;
|
|
1833
1742
|
}
|
|
1834
|
-
}
|
|
1835
|
-
});
|
|
1836
|
-
this.styleChange =
|
|
1743
|
+
}
|
|
1744
|
+
});
|
|
1745
|
+
this.styleChange = (event) => {
|
|
1837
1746
|
switch (event.event) {
|
|
1838
1747
|
case 46 /* Data.Event.StyleSheetUpdate */:
|
|
1839
|
-
|
|
1748
|
+
let styleSheet = this.adoptedStyleSheets[event.data.id];
|
|
1840
1749
|
if (!styleSheet && event.data.operation !== 0 /* StyleSheetOperation.Create */) {
|
|
1841
1750
|
return;
|
|
1842
1751
|
}
|
|
1843
1752
|
switch (event.data.operation) {
|
|
1844
1753
|
case 0 /* StyleSheetOperation.Create */:
|
|
1845
|
-
|
|
1754
|
+
this.adoptedStyleSheets[event.data.id] = new this.state.window.CSSStyleSheet();
|
|
1846
1755
|
break;
|
|
1847
1756
|
case 1 /* StyleSheetOperation.Replace */:
|
|
1848
1757
|
styleSheet.replace(event.data.cssRules);
|
|
@@ -1853,61 +1762,63 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
1853
1762
|
}
|
|
1854
1763
|
break;
|
|
1855
1764
|
case 45 /* Data.Event.StyleSheetAdoption */:
|
|
1856
|
-
|
|
1765
|
+
this.setDocumentStyles(event.data.id, event.data.newIds);
|
|
1857
1766
|
break;
|
|
1858
1767
|
}
|
|
1859
1768
|
};
|
|
1860
|
-
this.customElement =
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1769
|
+
this.customElement = (event) => {
|
|
1770
|
+
const tagName = event.data.name;
|
|
1771
|
+
if (!this.state.window.customElements.get(tagName)) {
|
|
1772
|
+
try {
|
|
1773
|
+
// Use eval to create class in target window context (avoids ES5 transpilation issues)
|
|
1774
|
+
const EmptyElement = this.state.window.eval('(class extends HTMLElement { constructor() { super(); } })');
|
|
1775
|
+
this.state.window.customElements.define(tagName, EmptyElement);
|
|
1776
|
+
}
|
|
1777
|
+
catch (e) {
|
|
1778
|
+
console.error(`Failed to define custom element ${tagName}:`, e);
|
|
1779
|
+
}
|
|
1869
1780
|
}
|
|
1870
1781
|
};
|
|
1871
|
-
this.exists =
|
|
1782
|
+
this.exists = (hash) => {
|
|
1872
1783
|
if (hash) {
|
|
1873
|
-
|
|
1784
|
+
let match = this.get(hash);
|
|
1874
1785
|
if (match) {
|
|
1875
|
-
|
|
1786
|
+
let rectangle = match.getBoundingClientRect();
|
|
1876
1787
|
return rectangle && rectangle.width > 0 && rectangle.height > 0;
|
|
1877
1788
|
}
|
|
1878
1789
|
}
|
|
1879
1790
|
return false;
|
|
1880
1791
|
};
|
|
1881
|
-
this.markup =
|
|
1792
|
+
this.markup = (event, useproxy) => {
|
|
1882
1793
|
var _a, _b, _c, _d, _e;
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1794
|
+
let data = event.data;
|
|
1795
|
+
let type = event.event;
|
|
1796
|
+
let doc = this.state.window.document;
|
|
1797
|
+
let retryEvent = {
|
|
1887
1798
|
data: [],
|
|
1888
1799
|
time: event.time,
|
|
1889
1800
|
event: event.event
|
|
1890
1801
|
};
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1802
|
+
for (let node of data) {
|
|
1803
|
+
let parent = this.element(node.parent);
|
|
1804
|
+
let pivot = this.element(node.previous);
|
|
1805
|
+
let insert = this.insertAfter;
|
|
1806
|
+
let tag = node.tag;
|
|
1896
1807
|
if (tag && tag.indexOf("iframe:" /* Layout.Constant.IFramePrefix */) === 0) {
|
|
1897
1808
|
tag = node.tag.substr("iframe:" /* Layout.Constant.IFramePrefix */.length);
|
|
1898
1809
|
}
|
|
1899
|
-
if (
|
|
1810
|
+
if (parent === null && node.parent !== null && node.parent > -1 && tag !== "HTML") {
|
|
1900
1811
|
// We are referencing a parent for this node that hasn't been created yet. Push it to a list of nodes to
|
|
1901
1812
|
// try once we are finished with other nodes within this event. Though we don't require HTML tags to
|
|
1902
1813
|
// have a parent as they are typically the root.
|
|
1903
1814
|
retryEvent.data.push(node);
|
|
1904
|
-
|
|
1815
|
+
continue;
|
|
1905
1816
|
}
|
|
1906
1817
|
switch (tag) {
|
|
1907
1818
|
case "*D" /* Layout.Constant.DocumentTag */:
|
|
1908
|
-
|
|
1819
|
+
let tagDoc = tag !== node.tag ? (parent ? parent.contentDocument : null) : doc;
|
|
1909
1820
|
if (tagDoc && tagDoc === doc && type === 5 /* Data.Event.Discover */) {
|
|
1910
|
-
|
|
1821
|
+
this.reset();
|
|
1911
1822
|
}
|
|
1912
1823
|
if (typeof XMLSerializer !== "undefined" && tagDoc) {
|
|
1913
1824
|
tagDoc.open();
|
|
@@ -1918,49 +1829,49 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
1918
1829
|
case "*P" /* Layout.Constant.PolyfillShadowDomTag */:
|
|
1919
1830
|
// In case of polyfill, map shadow dom to it's parent for rendering purposes
|
|
1920
1831
|
// All its children should be inserted as regular children to the parent node.
|
|
1921
|
-
|
|
1922
|
-
|
|
1832
|
+
this.nodes[node.id] = parent;
|
|
1833
|
+
this.addToHashMap(node, parent);
|
|
1923
1834
|
break;
|
|
1924
1835
|
case "*S" /* Layout.Constant.ShadowDomTag */:
|
|
1925
|
-
if (
|
|
1926
|
-
|
|
1927
|
-
shadowRoot = shadowRoot ? shadowRoot :
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1836
|
+
if (parent) {
|
|
1837
|
+
let shadowRoot = this.element(node.id);
|
|
1838
|
+
shadowRoot = shadowRoot ? shadowRoot : parent.attachShadow({ mode: "open" });
|
|
1839
|
+
this.nodes[node.id] = shadowRoot;
|
|
1840
|
+
this.addToHashMap(node, shadowRoot);
|
|
1841
|
+
this.addStyles(node.id);
|
|
1931
1842
|
}
|
|
1932
1843
|
break;
|
|
1933
1844
|
case "*T" /* Layout.Constant.TextTag */:
|
|
1934
|
-
|
|
1845
|
+
let textElement = this.element(node.id);
|
|
1935
1846
|
textElement = textElement ? textElement : doc.createTextNode(null);
|
|
1936
1847
|
textElement.nodeValue = node.value;
|
|
1937
|
-
insert(node,
|
|
1848
|
+
insert(node, parent, textElement, pivot);
|
|
1938
1849
|
break;
|
|
1939
1850
|
case "*M" /* Layout.Constant.SuspendMutationTag */:
|
|
1940
|
-
|
|
1851
|
+
let suspendedElement = this.element(node.id);
|
|
1941
1852
|
if (suspendedElement && suspendedElement.nodeType === Node.ELEMENT_NODE) {
|
|
1942
1853
|
suspendedElement.setAttribute("data-clarity-suspend" /* Constant.Suspend */, "" /* Layout.Constant.Empty */);
|
|
1943
1854
|
}
|
|
1944
1855
|
break;
|
|
1945
1856
|
case "HTML":
|
|
1946
|
-
if (
|
|
1947
|
-
|
|
1857
|
+
if (this.primaryHtmlNodeId === null) {
|
|
1858
|
+
this.primaryHtmlNodeId = node.id;
|
|
1948
1859
|
}
|
|
1949
|
-
|
|
1860
|
+
let isIframe = tag !== node.tag;
|
|
1950
1861
|
// when we see multiple HTML nodes in the same document we should treat subsequent ones as child elements
|
|
1951
1862
|
// rather than redefining our visualization base on them. It's technically illegal HTML but enough sites have
|
|
1952
1863
|
// this structure that we are robust against it.
|
|
1953
|
-
if (
|
|
1954
|
-
|
|
1864
|
+
if (this.primaryHtmlNodeId !== node.id && !isIframe) {
|
|
1865
|
+
this.insertDefaultElement(node, parent, pivot, doc, insert);
|
|
1955
1866
|
break;
|
|
1956
1867
|
}
|
|
1957
|
-
|
|
1868
|
+
let htmlDoc = isIframe ? (parent ? parent.contentDocument : null) : doc;
|
|
1958
1869
|
if (htmlDoc !== null) {
|
|
1959
|
-
|
|
1870
|
+
let docElement = this.element(node.id);
|
|
1960
1871
|
if (docElement === null) {
|
|
1961
|
-
|
|
1872
|
+
let newDoc = htmlDoc.implementation.createHTMLDocument("" /* Layout.Constant.Empty */);
|
|
1962
1873
|
docElement = newDoc.documentElement;
|
|
1963
|
-
|
|
1874
|
+
let p = htmlDoc.importNode(docElement, true);
|
|
1964
1875
|
htmlDoc.replaceChild(p, htmlDoc.documentElement);
|
|
1965
1876
|
if (htmlDoc.head) {
|
|
1966
1877
|
htmlDoc.head.parentNode.removeChild(htmlDoc.head);
|
|
@@ -1969,164 +1880,159 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
1969
1880
|
htmlDoc.body.parentNode.removeChild(htmlDoc.body);
|
|
1970
1881
|
}
|
|
1971
1882
|
}
|
|
1972
|
-
|
|
1883
|
+
this.setAttributes(htmlDoc.documentElement, node);
|
|
1973
1884
|
// If we are still processing discover events, keep the markup hidden until we are done
|
|
1974
|
-
if (type === 5 /* Data.Event.Discover */ && !
|
|
1885
|
+
if (type === 5 /* Data.Event.Discover */ && !parent) {
|
|
1975
1886
|
htmlDoc.documentElement.style.visibility = "hidden" /* Constant.Hidden */;
|
|
1976
1887
|
}
|
|
1977
|
-
|
|
1978
|
-
|
|
1888
|
+
this.nodes[node.id] = htmlDoc.documentElement;
|
|
1889
|
+
this.addToHashMap(node, htmlDoc.documentElement);
|
|
1979
1890
|
}
|
|
1980
1891
|
break;
|
|
1981
1892
|
case "HEAD":
|
|
1982
|
-
|
|
1893
|
+
let headElement = this.element(node.id);
|
|
1983
1894
|
if (headElement === null) {
|
|
1984
1895
|
headElement = doc.createElement(node.tag);
|
|
1985
1896
|
if (node.attributes && "*B" /* Layout.Constant.Base */ in node.attributes) {
|
|
1986
|
-
|
|
1897
|
+
let base = doc.createElement("base");
|
|
1987
1898
|
base.href = node.attributes["*B" /* Layout.Constant.Base */];
|
|
1988
1899
|
headElement.appendChild(base);
|
|
1989
1900
|
}
|
|
1990
1901
|
// Add custom styles to assist with visualization
|
|
1991
|
-
|
|
1902
|
+
let custom = doc.createElement("style");
|
|
1992
1903
|
custom.setAttribute("clarity-custom-styles" /* Constant.CustomStyleTag */, "true");
|
|
1993
|
-
custom.innerText =
|
|
1904
|
+
custom.innerText = this.getCustomStyle();
|
|
1994
1905
|
headElement.appendChild(custom);
|
|
1995
1906
|
}
|
|
1996
|
-
|
|
1997
|
-
insert(node,
|
|
1907
|
+
this.setAttributes(headElement, node);
|
|
1908
|
+
insert(node, parent, headElement, pivot);
|
|
1998
1909
|
break;
|
|
1999
1910
|
case "LINK":
|
|
2000
|
-
|
|
2001
|
-
|
|
1911
|
+
let linkElement = this.element(node.id);
|
|
1912
|
+
linkElement = linkElement ? linkElement : this.createElement(doc, node.tag);
|
|
2002
1913
|
if (!node.attributes) {
|
|
2003
1914
|
node.attributes = {};
|
|
2004
1915
|
}
|
|
2005
|
-
|
|
1916
|
+
this.setAttributes(linkElement, node);
|
|
2006
1917
|
if ("rel" in node.attributes) {
|
|
2007
1918
|
if (node.attributes["rel"] === "stylesheet" /* Constant.StyleSheet */) {
|
|
2008
|
-
|
|
2009
|
-
|
|
1919
|
+
this.stylesheets.push(new Promise((resolve) => {
|
|
1920
|
+
const proxy = useproxy !== null && useproxy !== void 0 ? useproxy : this.state.options.useproxy;
|
|
2010
1921
|
if (proxy) {
|
|
2011
|
-
if (
|
|
2012
|
-
|
|
1922
|
+
if (linkElement.integrity) {
|
|
1923
|
+
linkElement.removeAttribute('integrity');
|
|
2013
1924
|
}
|
|
2014
|
-
|
|
1925
|
+
linkElement.href = proxy(linkElement.href, linkElement.id, "stylesheet" /* Constant.StyleSheet */);
|
|
2015
1926
|
}
|
|
2016
|
-
|
|
1927
|
+
linkElement.onload = linkElement.onerror = this.style.bind(this, linkElement, resolve);
|
|
2017
1928
|
setTimeout(resolve, LayoutHelper.TIMEOUT);
|
|
2018
1929
|
}));
|
|
2019
1930
|
}
|
|
2020
1931
|
else if ((node.attributes["rel"].includes("preload") || node.attributes["rel"].includes("preconnect"))
|
|
2021
1932
|
&& (((_a = node.attributes) === null || _a === void 0 ? void 0 : _a.as) === "style" || ((_b = node.attributes) === null || _b === void 0 ? void 0 : _b.as) === "font")) {
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
1933
|
+
this.fonts.push(new Promise((resolve) => {
|
|
1934
|
+
const proxy = useproxy !== null && useproxy !== void 0 ? useproxy : this.state.options.useproxy;
|
|
1935
|
+
linkElement.href = proxy ? proxy(linkElement.href, linkElement.id, node.attributes.as) : linkElement.href;
|
|
1936
|
+
linkElement.onload = linkElement.onerror = this.style.bind(this, linkElement, resolve);
|
|
2026
1937
|
setTimeout(resolve, LayoutHelper.TIMEOUT);
|
|
2027
1938
|
}));
|
|
2028
1939
|
}
|
|
2029
1940
|
}
|
|
2030
|
-
insert(node,
|
|
1941
|
+
insert(node, parent, linkElement, pivot);
|
|
2031
1942
|
break;
|
|
2032
1943
|
case "IMG" /* Layout.Constant.ImageTag */:
|
|
2033
|
-
|
|
2034
|
-
|
|
1944
|
+
let imgElement = (_c = this.element(node.id)) !== null && _c !== void 0 ? _c : this.createElement(doc, node.tag);
|
|
1945
|
+
const proxy = useproxy !== null && useproxy !== void 0 ? useproxy : this.state.options.useproxy;
|
|
2035
1946
|
if (proxy && !!((_d = node.attributes) === null || _d === void 0 ? void 0 : _d.src)) {
|
|
2036
1947
|
node.attributes.src = proxy(node.attributes.src, node.attributes.id, "IMG" /* Layout.Constant.ImageTag */);
|
|
2037
1948
|
}
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
insert(node,
|
|
1949
|
+
this.setAttributes(imgElement, node);
|
|
1950
|
+
this.resize(imgElement, node.width, node.height);
|
|
1951
|
+
insert(node, parent, imgElement, pivot);
|
|
2041
1952
|
break;
|
|
2042
1953
|
case "STYLE":
|
|
2043
|
-
|
|
2044
|
-
|
|
1954
|
+
let styleElement = (_e = this.element(node.id)) !== null && _e !== void 0 ? _e : doc.createElement(node.tag);
|
|
1955
|
+
this.setAttributes(styleElement, node);
|
|
2045
1956
|
styleElement.textContent = node.value;
|
|
2046
|
-
insert(node,
|
|
2047
|
-
|
|
1957
|
+
insert(node, parent, styleElement, pivot);
|
|
1958
|
+
this.style(styleElement);
|
|
2048
1959
|
break;
|
|
2049
1960
|
case "IFRAME":
|
|
2050
|
-
|
|
2051
|
-
iframeElement = iframeElement ? iframeElement :
|
|
1961
|
+
let iframeElement = this.element(node.id);
|
|
1962
|
+
iframeElement = iframeElement ? iframeElement : this.createElement(doc, node.tag);
|
|
2052
1963
|
if (!node.attributes) {
|
|
2053
1964
|
node.attributes = {};
|
|
2054
1965
|
}
|
|
2055
|
-
|
|
2056
|
-
insert(node,
|
|
1966
|
+
this.setAttributes(iframeElement, node);
|
|
1967
|
+
insert(node, parent, iframeElement, pivot);
|
|
2057
1968
|
break;
|
|
2058
1969
|
case "SCRIPT":
|
|
2059
1970
|
{
|
|
2060
1971
|
node.id = -1; // We want to ensure children of script tags are not processed
|
|
2061
1972
|
node.value = null; // We don't want to set any potential script content
|
|
2062
|
-
|
|
1973
|
+
this.insertDefaultElement(node, parent, pivot, doc, insert);
|
|
2063
1974
|
break;
|
|
2064
1975
|
}
|
|
2065
1976
|
case "DIALOG":
|
|
2066
1977
|
{
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
renderDialog(domElement, renderOptions,
|
|
1978
|
+
this.insertDefaultElement(node, parent, pivot, doc, insert);
|
|
1979
|
+
const domElement = this.element(node.id);
|
|
1980
|
+
const renderOptions = getDialogRenderOptions(node.attributes, domElement);
|
|
1981
|
+
renderDialog(domElement, renderOptions, this.state.options.logerror);
|
|
2071
1982
|
break;
|
|
2072
1983
|
}
|
|
2073
1984
|
default:
|
|
2074
|
-
|
|
1985
|
+
this.insertDefaultElement(node, parent, pivot, doc, insert);
|
|
2075
1986
|
break;
|
|
2076
1987
|
}
|
|
2077
1988
|
// Track state for this node
|
|
2078
1989
|
if (node.id) {
|
|
2079
|
-
|
|
1990
|
+
this.events[node.id] = node;
|
|
2080
1991
|
}
|
|
2081
|
-
};
|
|
2082
|
-
for (var _i = 0, data_1 = data; _i < data_1.length; _i++) {
|
|
2083
|
-
var node = data_1[_i];
|
|
2084
|
-
_loop_1(node);
|
|
2085
1992
|
}
|
|
2086
1993
|
// only retry failed nodes if we are still making positive progress. If we have the same number of
|
|
2087
1994
|
// nodes we started with, then we would just be spinning on an orphaned subtree.
|
|
2088
1995
|
if (retryEvent.data.length > 0 && retryEvent.data.length !== event.data.length) {
|
|
2089
|
-
|
|
1996
|
+
this.markup(retryEvent, useproxy);
|
|
2090
1997
|
}
|
|
2091
1998
|
};
|
|
2092
|
-
this.insertDefaultElement =
|
|
2093
|
-
|
|
2094
|
-
domElement = domElement ? domElement :
|
|
2095
|
-
|
|
2096
|
-
|
|
1999
|
+
this.insertDefaultElement = (node, parent, pivot, doc, insert) => {
|
|
2000
|
+
let domElement = this.element(node.id);
|
|
2001
|
+
domElement = domElement ? domElement : this.createElement(doc, node.tag);
|
|
2002
|
+
this.setAttributes(domElement, node);
|
|
2003
|
+
this.resize(domElement, node.width, node.height);
|
|
2097
2004
|
insert(node, parent, domElement, pivot);
|
|
2098
2005
|
};
|
|
2099
|
-
this.style =
|
|
2100
|
-
if (resolve === void 0) { resolve = null; }
|
|
2006
|
+
this.style = (node, resolve = null) => {
|
|
2101
2007
|
// Firefox throws a SecurityError when trying to access cssRules of a stylesheet from a different domain
|
|
2102
2008
|
try {
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
for (
|
|
2009
|
+
const sheet = node.sheet;
|
|
2010
|
+
let cssRules = sheet ? sheet.cssRules : [];
|
|
2011
|
+
for (let i = 0; i < cssRules.length; i++) {
|
|
2106
2012
|
if (cssRules[i].cssText.indexOf(":hover" /* Constant.Hover */) >= 0) {
|
|
2107
|
-
|
|
2013
|
+
let css = cssRules[i].cssText.replace(/:hover/g, `[${"clarity-hover" /* Constant.CustomHover */}]`);
|
|
2108
2014
|
sheet.removeRule(i);
|
|
2109
2015
|
sheet.insertRule(css, i);
|
|
2110
2016
|
}
|
|
2111
2017
|
}
|
|
2112
2018
|
}
|
|
2113
2019
|
catch (e) {
|
|
2114
|
-
if (
|
|
2115
|
-
|
|
2020
|
+
if (this.state.options.logerror) {
|
|
2021
|
+
this.state.options.logerror(e);
|
|
2116
2022
|
}
|
|
2117
2023
|
}
|
|
2118
2024
|
if (resolve) {
|
|
2119
2025
|
resolve();
|
|
2120
2026
|
}
|
|
2121
2027
|
};
|
|
2122
|
-
this.addStyles =
|
|
2123
|
-
|
|
2028
|
+
this.addStyles = (id) => {
|
|
2029
|
+
let adoptedStylesToAdd = this.stylesToApply[id];
|
|
2124
2030
|
if (adoptedStylesToAdd && adoptedStylesToAdd.length > 0) {
|
|
2125
|
-
|
|
2126
|
-
delete
|
|
2031
|
+
this.setDocumentStyles(id, this.stylesToApply[id]);
|
|
2032
|
+
delete this.stylesToApply[id];
|
|
2127
2033
|
}
|
|
2128
2034
|
};
|
|
2129
|
-
this.createElement =
|
|
2035
|
+
this.createElement = (doc, tag) => {
|
|
2130
2036
|
if (tag && tag.indexOf("svg:" /* Layout.Constant.SvgPrefix */) === 0) {
|
|
2131
2037
|
return doc.createElementNS("http://www.w3.org/2000/svg" /* Layout.Constant.SvgNamespace */, tag.substr("svg:" /* Layout.Constant.SvgPrefix */.length));
|
|
2132
2038
|
}
|
|
@@ -2135,24 +2041,24 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
2135
2041
|
}
|
|
2136
2042
|
catch (ex) {
|
|
2137
2043
|
// We log the warning on non-standard markup but continue with the visualization
|
|
2138
|
-
console.warn(
|
|
2044
|
+
console.warn(`Exception encountered while creating element ${tag}: ${ex}`);
|
|
2139
2045
|
return doc.createElement("clarity-unknown" /* Constant.UnknownTag */);
|
|
2140
2046
|
}
|
|
2141
2047
|
};
|
|
2142
|
-
this.insertAfter =
|
|
2048
|
+
this.insertAfter = (data, parent, node, previous) => {
|
|
2143
2049
|
// Skip over no-op changes where parent and previous element is still the same
|
|
2144
2050
|
// In case of IFRAME, re-adding DOM at the exact same place will lead to loss of state and the markup inside will be destroyed
|
|
2145
|
-
if (
|
|
2051
|
+
if (this.events[data.id] && this.events[data.id].parent === data.parent && this.events[data.id].previous === data.previous) {
|
|
2146
2052
|
return;
|
|
2147
2053
|
}
|
|
2148
2054
|
// In case parent is a Shadow DOM, previous.parentElement will return null but previous.parentNode will return a valid node
|
|
2149
|
-
|
|
2150
|
-
next = previous === null && parent ?
|
|
2151
|
-
|
|
2055
|
+
let next = previous && (previous.parentElement === parent || previous.parentNode === parent) ? previous.nextSibling : null;
|
|
2056
|
+
next = previous === null && parent ? this.firstChild(parent) : next;
|
|
2057
|
+
this.insertBefore(data, parent, node, next);
|
|
2152
2058
|
};
|
|
2153
|
-
this.firstChild =
|
|
2059
|
+
this.firstChild = (node) => {
|
|
2154
2060
|
var _a;
|
|
2155
|
-
|
|
2061
|
+
let child = node.firstChild;
|
|
2156
2062
|
// BASE tag should always be the first child to ensure resources with relative URLs are loaded correctly
|
|
2157
2063
|
if (child && child.nodeType === 1 /* NodeType.ELEMENT_NODE */ && child.tagName === "BASE" /* Layout.Constant.BaseTag */) {
|
|
2158
2064
|
if ((_a = child.nextSibling) === null || _a === void 0 ? void 0 : _a.hasAttribute('clarity-custom-styles')) {
|
|
@@ -2164,25 +2070,25 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
2164
2070
|
return child;
|
|
2165
2071
|
};
|
|
2166
2072
|
// Mask images within a masked ancestor element in the node has a background image.
|
|
2167
|
-
this.mask =
|
|
2073
|
+
this.mask = (node) => {
|
|
2168
2074
|
var _a, _b, _c;
|
|
2169
|
-
if (node &&
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2075
|
+
if (node && this.BackgroundImageEligibleElements.includes(node.nodeName) && 'getComputedStyle' in window && 'closest' in node) {
|
|
2076
|
+
const urlPattern = /url\(['"]?([^'")]+)['"]?\)/;
|
|
2077
|
+
const computedStyles = window.getComputedStyle(node);
|
|
2078
|
+
const hasBackgroundImage = ((_a = computedStyles.backgroundImage) === null || _a === void 0 ? void 0 : _a.match(urlPattern)) || ((_b = computedStyles.background) === null || _b === void 0 ? void 0 : _b.match(urlPattern));
|
|
2079
|
+
const masked = (_c = node.closest) === null || _c === void 0 ? void 0 : _c.call(node, `[${"data-clarity-mask" /* LayoutConstants.MaskData */}]`);
|
|
2174
2080
|
if (hasBackgroundImage && masked) {
|
|
2175
|
-
node.style.background =
|
|
2081
|
+
node.style.background = this.MaskedBackgroundImageStyle;
|
|
2176
2082
|
}
|
|
2177
2083
|
}
|
|
2178
2084
|
};
|
|
2179
|
-
this.insertBefore =
|
|
2085
|
+
this.insertBefore = (data, parent, node, next) => {
|
|
2180
2086
|
if (parent !== null) {
|
|
2181
2087
|
// Compare against both parentNode and parentElement to ensure visualization works correctly for shadow DOMs
|
|
2182
2088
|
next = next && (next.parentElement !== parent && next.parentNode !== parent) ? null : next;
|
|
2183
2089
|
try {
|
|
2184
2090
|
parent.insertBefore(node, next);
|
|
2185
|
-
|
|
2091
|
+
this.mask(node);
|
|
2186
2092
|
}
|
|
2187
2093
|
catch (ex) {
|
|
2188
2094
|
console.warn("Node: " + node + " | Parent: " + parent + " | Data: " + JSON.stringify(data));
|
|
@@ -2195,34 +2101,34 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
2195
2101
|
else if (parent === null && node.parentNode !== null) {
|
|
2196
2102
|
node.parentNode.removeChild(node);
|
|
2197
2103
|
}
|
|
2198
|
-
|
|
2199
|
-
|
|
2104
|
+
this.nodes[data.id] = node;
|
|
2105
|
+
this.addToHashMap(data, node);
|
|
2200
2106
|
};
|
|
2201
|
-
this.setAttributes =
|
|
2202
|
-
|
|
2203
|
-
|
|
2107
|
+
this.setAttributes = (node, data) => {
|
|
2108
|
+
let attributes = data.attributes || {};
|
|
2109
|
+
let sameorigin = false;
|
|
2204
2110
|
// Clarity attributes
|
|
2205
|
-
attributes["data-clarity-id" /* Constant.Id */] =
|
|
2206
|
-
attributes["data-clarity-hashalpha" /* Constant.HashAlpha */] =
|
|
2207
|
-
attributes["data-clarity-hashbeta" /* Constant.HashBeta */] =
|
|
2208
|
-
|
|
2111
|
+
attributes["data-clarity-id" /* Constant.Id */] = `${data.id}`;
|
|
2112
|
+
attributes["data-clarity-hashalpha" /* Constant.HashAlpha */] = `${data.hashAlpha}`;
|
|
2113
|
+
attributes["data-clarity-hashbeta" /* Constant.HashBeta */] = `${data.hashBeta}`;
|
|
2114
|
+
let tag = node.nodeType === 1 /* NodeType.ELEMENT_NODE */ ? node.tagName.toLowerCase() : null;
|
|
2209
2115
|
// First remove all its existing attributes
|
|
2210
2116
|
if (node.attributes) {
|
|
2211
|
-
|
|
2212
|
-
while (node.attributes &&
|
|
2117
|
+
let length = node.attributes.length;
|
|
2118
|
+
while (node.attributes && length > 0) {
|
|
2213
2119
|
// Do not remove "clarity-hover" attribute and let it be managed by interaction module
|
|
2214
2120
|
// This helps avoid flickers during visualization
|
|
2215
2121
|
if (node.attributes[0].name !== "clarity-hover" /* Constant.HoverAttribute */) {
|
|
2216
2122
|
node.removeAttribute(node.attributes[0].name);
|
|
2217
2123
|
}
|
|
2218
|
-
|
|
2124
|
+
length--;
|
|
2219
2125
|
}
|
|
2220
2126
|
}
|
|
2221
2127
|
// Add new attributes
|
|
2222
|
-
for (
|
|
2128
|
+
for (let attribute in attributes) {
|
|
2223
2129
|
if (attributes[attribute] !== undefined) {
|
|
2224
2130
|
try {
|
|
2225
|
-
|
|
2131
|
+
let v = attributes[attribute];
|
|
2226
2132
|
if (attribute.indexOf("xlink:") === 0) {
|
|
2227
2133
|
node.setAttributeNS("http://www.w3.org/1999/xlink", attribute, v);
|
|
2228
2134
|
}
|
|
@@ -2233,30 +2139,30 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
2233
2139
|
// Do nothing if we encounter internal Clarity attributes
|
|
2234
2140
|
}
|
|
2235
2141
|
else if (tag === "iframe" /* Constant.IFrameTag */ && (attribute.indexOf("src") === 0 || attribute.indexOf("allow") === 0) || attribute === "sandbox") {
|
|
2236
|
-
node.setAttribute(
|
|
2142
|
+
node.setAttribute(`data-clarity-${attribute}`, v);
|
|
2237
2143
|
}
|
|
2238
2144
|
else if (tag === "img" /* Constant.ImageTag */ && attribute.indexOf("src") === 0 && ((v === null || v.length === 0 || (v === null || v === void 0 ? void 0 : v.startsWith('blob:'))))) {
|
|
2239
|
-
if (
|
|
2145
|
+
if (this.vNext) {
|
|
2240
2146
|
if (v.startsWith('blob:')) {
|
|
2241
2147
|
if (data.width >= 132 /* Setting.LargeSvg */ && data.height >= 132 /* Setting.LargeSvg */) {
|
|
2242
|
-
node.setAttribute("data-clarity-blob-hide" /* Constant.BlobUnavailable */, "
|
|
2148
|
+
node.setAttribute("data-clarity-blob-hide" /* Constant.BlobUnavailable */, `${"l" /* Constant.Large */}${"b" /* Constant.Beta */}`);
|
|
2243
2149
|
}
|
|
2244
2150
|
else {
|
|
2245
|
-
node.setAttribute("data-clarity-blob-hide" /* Constant.BlobUnavailable */, "
|
|
2151
|
+
node.setAttribute("data-clarity-blob-hide" /* Constant.BlobUnavailable */, `${"s" /* Constant.Small */}${"b" /* Constant.Beta */}`);
|
|
2246
2152
|
}
|
|
2247
2153
|
}
|
|
2248
2154
|
else {
|
|
2249
2155
|
if (data.width >= 132 /* Setting.LargeSvg */ && data.height >= 132 /* Setting.LargeSvg */) {
|
|
2250
|
-
node.setAttribute("data-clarity-hide" /* Constant.Hide */, "
|
|
2156
|
+
node.setAttribute("data-clarity-hide" /* Constant.Hide */, `${"l" /* Constant.Large */}${"b" /* Constant.Beta */}`);
|
|
2251
2157
|
}
|
|
2252
2158
|
else {
|
|
2253
|
-
node.setAttribute("data-clarity-hide" /* Constant.Hide */, "
|
|
2159
|
+
node.setAttribute("data-clarity-hide" /* Constant.Hide */, `${"s" /* Constant.Small */}${"b" /* Constant.Beta */}`);
|
|
2254
2160
|
}
|
|
2255
2161
|
}
|
|
2256
2162
|
}
|
|
2257
2163
|
else {
|
|
2258
2164
|
node.setAttribute(attribute, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" /* Asset.Transparent */);
|
|
2259
|
-
|
|
2165
|
+
let size = "l" /* Constant.Large */;
|
|
2260
2166
|
if (data.width) {
|
|
2261
2167
|
size = data.width <= 200 /* Setting.Medium */ ? "m" /* Constant.Medium */ : (data.width <= 75 /* Setting.Small */ ? "s" /* Constant.Small */ : size);
|
|
2262
2168
|
}
|
|
@@ -2264,7 +2170,7 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
2264
2170
|
}
|
|
2265
2171
|
}
|
|
2266
2172
|
else {
|
|
2267
|
-
node.setAttribute(attribute,
|
|
2173
|
+
node.setAttribute(attribute, this.isSuspiciousAttribute(attribute, v) ? "" /* Constant.Empty */ : v);
|
|
2268
2174
|
}
|
|
2269
2175
|
}
|
|
2270
2176
|
catch (ex) {
|
|
@@ -2274,7 +2180,7 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
2274
2180
|
}
|
|
2275
2181
|
}
|
|
2276
2182
|
if (sameorigin === false && tag === "iframe" /* Constant.IFrameTag */ && typeof node.setAttribute === "function" /* Constant.Function */) {
|
|
2277
|
-
if (
|
|
2183
|
+
if (this.svgFitsText(node)) {
|
|
2278
2184
|
node.setAttribute("data-clarity-unavailable" /* Constant.Unavailable */, "" /* Layout.Constant.Empty */);
|
|
2279
2185
|
}
|
|
2280
2186
|
else {
|
|
@@ -2293,57 +2199,58 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
2293
2199
|
node.setAttribute("autocomplete" /* Constant.AutoComplete */, "new-password" /* Constant.NewPassword */);
|
|
2294
2200
|
}
|
|
2295
2201
|
};
|
|
2296
|
-
this.getMobileCustomStyle =
|
|
2297
|
-
if (
|
|
2298
|
-
return
|
|
2202
|
+
this.getMobileCustomStyle = () => {
|
|
2203
|
+
if (this.isMobile) {
|
|
2204
|
+
return `*{scrollbar-width: none; scrollbar-gutter: unset;};`;
|
|
2299
2205
|
}
|
|
2300
2206
|
return '';
|
|
2301
2207
|
};
|
|
2302
|
-
this.getCustomStyle =
|
|
2303
|
-
return
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2208
|
+
this.getCustomStyle = () => {
|
|
2209
|
+
return this.getImageHiddenCss() +
|
|
2210
|
+
this.getIframeUnavailableCss() +
|
|
2211
|
+
this.getBlobUnavailableCss() +
|
|
2212
|
+
this.getBackgroundCss() +
|
|
2213
|
+
`*[${"data-clarity-suspend" /* Constant.Suspend */}] { filter: grayscale(100%); }` +
|
|
2214
|
+
`body { font-size: initial; }
|
|
2215
|
+
${this.getMobileCustomStyle()}`;
|
|
2309
2216
|
};
|
|
2310
|
-
this.svgFitsText =
|
|
2217
|
+
this.svgFitsText = (inputElement) => {
|
|
2311
2218
|
var dimensions = inputElement.getBoundingClientRect();
|
|
2312
2219
|
if (dimensions.width >= 132 /* Setting.LargeSvg */ && dimensions.height >= 132 /* Setting.LargeSvg */) {
|
|
2313
2220
|
return true;
|
|
2314
2221
|
}
|
|
2315
2222
|
return false;
|
|
2316
2223
|
};
|
|
2317
|
-
this.getIframeUnavailableCss =
|
|
2318
|
-
if (
|
|
2319
|
-
return "
|
|
2320
|
-
"
|
|
2224
|
+
this.getIframeUnavailableCss = () => {
|
|
2225
|
+
if (this.vNext) {
|
|
2226
|
+
return `${"iframe" /* Constant.IFrameTag */}[${"data-clarity-unavailable-small" /* Constant.UnavailableSmall */}] { ${iframeUnavailableSvgSmall} }` +
|
|
2227
|
+
`${"iframe" /* Constant.IFrameTag */}[${"data-clarity-unavailable" /* Constant.Unavailable */}] { ${iframeUnavailableSvg[this.locale]} }`;
|
|
2321
2228
|
}
|
|
2322
2229
|
else {
|
|
2323
|
-
return "
|
|
2230
|
+
return `${"iframe" /* Constant.IFrameTag */}[${"data-clarity-unavailable" /* Constant.Unavailable */}] { background: url(${"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAiCAYAAAAge+tMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAU6SURBVHgBzVg7TyNJEG6bh5AIjpOQeCXj7LL18pDIdpztRYuzy7CjCzG/ADu8CO8vwEQXrgkvws6QeNiEFzEk4GznIFnxvO/zVntrhx6/kLxb0mh6uqurvq6urqqehHklra+ve3d3dx8SiUT6+fk5ja4ZtGf4tjzoD9AXoBmiXUsmk+cnJyc18wpKmCFodXXVx8t/enraBCDPDEchniqeg9PT06oZkAYCTsCw2A6afjc+8IQCjGR3oBtxR/bHx8crR0dHgemD+gIugPfQ9OJ4BGwF72qj0ajrsTQI7rEFcDnTndoLeHh4KDebzdAMC5z+e39/T8B+Nz6AbcJtslAWdOMDfg8LONTuJf7vRVgDPEW40H6crLG4AVi58Pj4+Deav0WUFIjBfDt8NYD+HaBbpge1Wq1wbm5uH+DXjewe5IXQ85buxAMurJS9sbi46IG/jnlforKS0Q7f92dWVlYOAXLXgqMb4CmcnZ2l8E5YpVwIlGZ7basm8nIO50qXNzY29g6y8+hP0RCKPYexBne+K3Ay3N7eNoxyDViziicFwR+la8uOwULFQUBr8LB6XgOU/gDukcGittUY3bUBY25oGR0fX1tbSwPgoVFWxquoAFufv5DxgDvgAsZdu7m52WR7cnLyIC5SAMxnqw+6PRzqSzvmOg9coPX7ZAzoAN9vNWgSQKfVpzP2yq5dQGGZD61F+S5e6KnYNkD6eozWBwZav6m6K1hs2yBJB2hGiIwrQmDsjfp8MS6L2zMqa7INebvGTedKthcdtODN90Yi+I2kCO0owsq3e4U1EqOBq98FwNWnxgKCgd66a5znAe6RjYDfGsdJzmtfgqBPWFE+Jg2HSmFcNuS8QqSv5mLkwQewiumDBKcn87JJ5UuB8BDQJ8TxYnQyFnep2ukYMCXzvXUY57ddvIOGUeIUNw47UQWneEYsrwFVJiYmSjYqkAdx9bOMMR6n4pSTF7J+0ZHCRVKwfaA7SXUZ0g3xNJn+j4+Pm655L1L+8vLyrmRHS4FR6ZfJyUichyKGy5IZgvot2EA1GC8fDanOWgXgCwBPodqPqxCwjQKIljmUPiaSTJxVuoAuCui+CXhKqOGLne84xpgEQKqoSwMpwIIy/ZajUdBytspSVV6KblaT79AsaP0afM+yFtbP4bXT48LAWqYEtymbHrIgZy/SnYurAsV4O7ocRjvD21Nf9bgIYMbK9VgAq8f2rYYHbHp6OqjVau3DK+UCXcw1P9ethI2cO9YzqYFuQLIA3/TegTYxpbPqE+UdazM7o82suWn6AC8Rr2F10upjZgBiPX19fd3E83F+fr5mviakKQiad/FDWfHq6upftlFbM0N7AvwP1kHoY5Fmzwrr7wCyzx16vywsLBDwe9s31GU5ShKz30gOmLGWQZwv2fIBYfRZ2JnCf7Vz0V8xyvIsaV1nReeQ9oXGjIDoYlB6IZ811tx6PAo+Gvoswd0urFGS5icgLCSHV8e/GS5dJYemUQHXxZnnYugFXtzRzg1HApz1jC3iqFzqkxfUDTxcTc9pDhRVXkOICrSYb78RPQ5cfOivRqKNv7S0lMAi/lTRqziSw0mSqMADauufbLdfb45ir032rjsyi0ssnlJWfw/Ltlxxm4T+fyR2+7qfi+GckQEXMHWA9c3XRDRl5KcPXOE/JKrA8vEvwezsLH8a5YwqEWDtMqz9F9sjcxVL4jJM/RuRoVB+iZjob2qSgO7cpEYO3BJrfry2etU8XAx4XtyBfxhwki3aAGyT9b39HS3/KJsoGSr4rLuuh/8DlPszm7LNbUUAAAAASUVORK5CYII=" /* Asset.Unavailable */}) no-repeat center center, url('${"data:image/svg+xml,<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"100%\" height=\"100%\"><rect width=\"100%\" height=\"100%\" style=\"fill:rgb(204,204,204)\"/><line stroke-dasharray=\"5, 5\" x1=\"0\" y1=\"100%\" x2=\"100%\" y2=\"0\" style=\"stroke:rgb(119,119,119);stroke-width:1\"/><line stroke-dasharray=\"5, 5\" x1=\"0\" y1=\"0\" x2=\"100%\" y2=\"100%\" style=\"stroke:rgb(119,119,119);stroke-width:1\"/><circle cx=\"50%\" cy=\"50%\" r=\"40\" fill=\"rgb(204,204,204)\"/></svg>" /* Asset.Cross */}'); }`;
|
|
2324
2231
|
}
|
|
2325
2232
|
};
|
|
2326
|
-
this.getBlobUnavailableCss =
|
|
2327
|
-
if (
|
|
2328
|
-
return "
|
|
2329
|
-
"
|
|
2233
|
+
this.getBlobUnavailableCss = () => {
|
|
2234
|
+
if (this.vNext) {
|
|
2235
|
+
return `${"img" /* Constant.ImageTag */}[${"data-clarity-blob-hide" /* Constant.BlobUnavailable */}=${"s" /* Constant.Small */}${"b" /* Constant.Beta */}] { ${blobUnavailableSvgSmall} }` +
|
|
2236
|
+
`${"img" /* Constant.ImageTag */}[${"data-clarity-blob-hide" /* Constant.BlobUnavailable */}=${"l" /* Constant.Large */}${"b" /* Constant.Beta */}] { ${blobUnavailableSvg[this.locale]} }`;
|
|
2330
2237
|
}
|
|
2331
2238
|
return '';
|
|
2332
2239
|
};
|
|
2333
|
-
this.getImageHiddenCss =
|
|
2334
|
-
if (
|
|
2335
|
-
return "
|
|
2336
|
-
"
|
|
2240
|
+
this.getImageHiddenCss = () => {
|
|
2241
|
+
if (this.vNext) {
|
|
2242
|
+
return `${"img" /* Constant.ImageTag */}[${"data-clarity-hide" /* Constant.Hide */}=${"s" /* Constant.Small */}${"b" /* Constant.Beta */}] { ${imageMaskedSvgSmall} }` +
|
|
2243
|
+
`${"img" /* Constant.ImageTag */}[${"data-clarity-hide" /* Constant.Hide */}=${"l" /* Constant.Large */}${"b" /* Constant.Beta */}] { ${imageMaskedSvg[this.locale]} }`;
|
|
2337
2244
|
}
|
|
2338
2245
|
else {
|
|
2339
|
-
return "
|
|
2340
|
-
"
|
|
2341
|
-
"
|
|
2342
|
-
"
|
|
2246
|
+
return `${"img" /* Constant.ImageTag */}[${"data-clarity-hide" /* Constant.Hide */}] { background-color: #CCC; background-image: url(${"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANvSURBVHgB7Ve9VhpREJ5dU6BNVqt0wS6dpEuX9QmiTyA+gfgE4BOgZSrJE4hlKvEJxDKVa2caoaSSfB87F4Z7dtmFhFTMOfcMe52Z+935u6PIhjb0dxTIihRFUQ2M6z0/dXuI9ay8PwTJklQaEADw0JMgCI4USFSkMx6Pe2BdrFtgS6QEFQICjirYGYDUc0AMcXCCvw8XAVVwHQD7IasAokfCMGzB0NmCA1o44N7T+wpwlwouT+80z2NbOWAaMHqDn7FuJcorapRATkej0bOvyz2s7zs7O2L0GbYXrCrscjUqlUoAuZ6vH3hAIr3diW4xHC3wW+w/KZhLgDmXEgRzbR6udvbBD/DdITB3UewfWm+FRpnIHwyYLo1A+Aq/vzkDWFdSni4krTjm1RnDOxgM9nFOS//OM++0YmeAFMydQw4gDSgeu7LVyprE3489je3u7t5waQFMifrQ6ehn7PZfX18v6BkFOwcq9MDQQKxeseRu0PXARJprBHxED2t7sPSol6p5YHs467OkXo8cqBA/rmXmmVO/atzZzk4G0Kond+DJJJLmStc3Sm+rpxLVbYcEoRu8xbWNp9U1B1rqyzzIRNQj5tAe84ZVKVmGZ6BoK5Vh2JADT1hjLny3rBL27nS/7RtUXZdDmb1H5Ug1rDgjrFMKrGGb2CzPt7e3C95gb2+vqeU/1Mor/UZpg21og50CsfYzATllsLY+E6TE60OTPoUqOV8EQNKKmuTTgifHAmO4GOokyDFah2BTTAOTNFcmIQFI3qyVoxurp+dIL3ZF72bYdzL1zKcDLb2P1n4rqUfcg/nB3Cre3t6uQeY3ZBOri72q87B7ULHY035CdmTs85H9BVlR23yWumVf+6YJo0/MK7qcI8al9RCqq9R4w4ICq9JDYZEwk44ly2TWFtGT+VKnF2PwB6cis8sUzkw+vSsrqNXQ0eUmxo+S5gEPfvQBSTpNLjU1rjzCLiKEYAAWMQRFA5m2GzdJxIUhW5H6yutFguhRToapcb8WQGwL5MwtDnt5cvQOZJuq0yHfkjUQWwHbAn5+AqgvKHGW/IsPRquR+ZdgcQIdrStkYh5tN1ocZYCpSto2Dqezl6yRMga/yQSpXToyYFzOrReQAcUhzp8E+E4eWzD/lTgxuPFGR5Wlm+Y/J3qL/7fJhja0RvoDR4Tn4Lo/zi8AAAAASUVORK5CYII=" /* Asset.Hide */}); background-repeat:no-repeat; background-position: center; }` +
|
|
2247
|
+
`${"img" /* Constant.ImageTag */}[${"data-clarity-hide" /* Constant.Hide */}=${"s" /* Constant.Small */}] { background-size: 18px 18px; }` +
|
|
2248
|
+
`${"img" /* Constant.ImageTag */}[${"data-clarity-hide" /* Constant.Hide */}=${"m" /* Constant.Medium */}] { background-size: 24px 24px; }` +
|
|
2249
|
+
`${"img" /* Constant.ImageTag */}[${"data-clarity-hide" /* Constant.Hide */}=${"l" /* Constant.Large */}] { background-size: 36px 36px; }`;
|
|
2343
2250
|
}
|
|
2344
2251
|
};
|
|
2345
|
-
this.getBackgroundCss =
|
|
2346
|
-
if (
|
|
2252
|
+
this.getBackgroundCss = () => {
|
|
2253
|
+
if (this.vNext) {
|
|
2347
2254
|
return sharedStyle;
|
|
2348
2255
|
}
|
|
2349
2256
|
return '';
|
|
@@ -2353,8 +2260,8 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
2353
2260
|
this.vNext = vNext;
|
|
2354
2261
|
this.locale = locale;
|
|
2355
2262
|
}
|
|
2356
|
-
|
|
2357
|
-
|
|
2263
|
+
setDocumentStyles(documentId, styleIds) {
|
|
2264
|
+
let targetDocument = documentId === -1 ? this.state.window.document : this.element(documentId);
|
|
2358
2265
|
if (!targetDocument) {
|
|
2359
2266
|
if (!this.stylesToApply[documentId]) {
|
|
2360
2267
|
this.stylesToApply[documentId] = [];
|
|
@@ -2362,70 +2269,59 @@ var LayoutHelper = /** @class */ (function () {
|
|
|
2362
2269
|
this.stylesToApply[documentId] = styleIds;
|
|
2363
2270
|
return;
|
|
2364
2271
|
}
|
|
2365
|
-
|
|
2366
|
-
for (var
|
|
2367
|
-
|
|
2368
|
-
var styleSheet = this.adoptedStyleSheets[styleId];
|
|
2272
|
+
let newSheets = [];
|
|
2273
|
+
for (var styleId of styleIds) {
|
|
2274
|
+
let styleSheet = this.adoptedStyleSheets[styleId];
|
|
2369
2275
|
if (styleSheet) {
|
|
2370
2276
|
newSheets.push(styleSheet);
|
|
2371
2277
|
}
|
|
2372
2278
|
}
|
|
2373
2279
|
targetDocument.adoptedStyleSheets = newSheets;
|
|
2374
|
-
}
|
|
2375
|
-
|
|
2280
|
+
}
|
|
2281
|
+
isSuspiciousAttribute(name, value) {
|
|
2376
2282
|
// Block event handlers entirely
|
|
2377
2283
|
if (name.startsWith('on')) {
|
|
2378
2284
|
return true;
|
|
2379
2285
|
}
|
|
2380
2286
|
// Check for JavaScript protocols and dangerous patterns
|
|
2381
|
-
|
|
2287
|
+
const dangerous = [
|
|
2382
2288
|
/^\s*javascript:/i,
|
|
2383
2289
|
/^\s*data:text\/html/i,
|
|
2384
2290
|
/^\s*vbscript:/i
|
|
2385
2291
|
];
|
|
2386
|
-
return dangerous.some(
|
|
2387
|
-
}
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
}());
|
|
2292
|
+
return dangerous.some(pattern => pattern.test(value));
|
|
2293
|
+
}
|
|
2294
|
+
}
|
|
2295
|
+
LayoutHelper.TIMEOUT = 7000;
|
|
2391
2296
|
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
var _this = this;
|
|
2297
|
+
class Visualizer {
|
|
2298
|
+
constructor() {
|
|
2395
2299
|
this._state = null;
|
|
2396
2300
|
this.renderTime = 0;
|
|
2397
2301
|
this.hashFoundTime = -1;
|
|
2398
2302
|
this._excludeClassNames = [];
|
|
2399
|
-
this.configure =
|
|
2400
|
-
|
|
2401
|
-
helper.selector.config(
|
|
2402
|
-
};
|
|
2403
|
-
this.dom =
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
|
|
2407
|
-
case 1:
|
|
2408
|
-
_a.sent();
|
|
2409
|
-
return [2 /*return*/];
|
|
2410
|
-
}
|
|
2411
|
-
});
|
|
2412
|
-
}); };
|
|
2413
|
-
this.get = function (hash) {
|
|
2303
|
+
this.configure = (opts) => {
|
|
2304
|
+
this._excludeClassNames = opts.excludeClassNames || [];
|
|
2305
|
+
helper.selector.config(this._excludeClassNames);
|
|
2306
|
+
};
|
|
2307
|
+
this.dom = (event) => __awaiter(this, void 0, void 0, function* () {
|
|
2308
|
+
yield this.layout.dom(event);
|
|
2309
|
+
});
|
|
2310
|
+
this.get = (hash) => {
|
|
2414
2311
|
var _a;
|
|
2415
|
-
return (_a =
|
|
2312
|
+
return (_a = this.layout) === null || _a === void 0 ? void 0 : _a.get(hash);
|
|
2416
2313
|
};
|
|
2417
|
-
this.shortCircuitRendering =
|
|
2314
|
+
this.shortCircuitRendering = (strategy, domEvent, hash) => {
|
|
2418
2315
|
switch (strategy) {
|
|
2419
2316
|
case 1 /* ShortCircuitStrategy.HashFirstTimestamp */:
|
|
2420
|
-
return
|
|
2317
|
+
return this.layout.exists(hash);
|
|
2421
2318
|
case 2 /* ShortCircuitStrategy.HashFirstTimestampPlusBuffer */:
|
|
2422
|
-
if (
|
|
2423
|
-
|
|
2319
|
+
if (this.hashFoundTime === -1 && this.layout.exists(hash)) {
|
|
2320
|
+
this.hashFoundTime = domEvent.time;
|
|
2424
2321
|
}
|
|
2425
|
-
return (
|
|
2322
|
+
return (this.hashFoundTime > -1) && (domEvent.time > this.hashFoundTime + 100 /* Setting.VisualizationSettleBuffer */);
|
|
2426
2323
|
case 3 /* ShortCircuitStrategy.HashBeforeDeleted */:
|
|
2427
|
-
for (
|
|
2428
|
-
var node = _a[_i];
|
|
2324
|
+
for (let node of domEvent.data) {
|
|
2429
2325
|
if ((node.hashAlpha === hash || node.hashBeta === hash) && node.parent === null) {
|
|
2430
2326
|
return true;
|
|
2431
2327
|
}
|
|
@@ -2436,106 +2332,82 @@ var Visualizer = /** @class */ (function () {
|
|
|
2436
2332
|
return false;
|
|
2437
2333
|
}
|
|
2438
2334
|
};
|
|
2439
|
-
this.html =
|
|
2440
|
-
if (
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
}
|
|
2466
|
-
return [3 /*break*/, 8];
|
|
2467
|
-
case 4:
|
|
2468
|
-
this.layout.styleChange(entry);
|
|
2469
|
-
return [3 /*break*/, 8];
|
|
2470
|
-
case 5:
|
|
2471
|
-
this.layout.customElement(entry);
|
|
2472
|
-
return [3 /*break*/, 8];
|
|
2473
|
-
case 6:
|
|
2474
|
-
domEvent = entry;
|
|
2475
|
-
this.renderTime = domEvent.time;
|
|
2476
|
-
if (this.shortCircuitRendering(shortCircuitStrategy, domEvent, hash)) {
|
|
2477
|
-
return [3 /*break*/, 8];
|
|
2478
|
-
}
|
|
2479
|
-
return [4 /*yield*/, this.layout.markup(domEvent, useproxy)];
|
|
2480
|
-
case 7:
|
|
2481
|
-
_b.sent();
|
|
2482
|
-
return [3 /*break*/, 8];
|
|
2483
|
-
case 8: return [3 /*break*/, 3];
|
|
2484
|
-
case 9: return [3 /*break*/, 11];
|
|
2485
|
-
case 10:
|
|
2486
|
-
e_1 = _b.sent();
|
|
2487
|
-
if (logerror) {
|
|
2488
|
-
logerror(e_1);
|
|
2489
|
-
}
|
|
2490
|
-
return [3 /*break*/, 11];
|
|
2491
|
-
case 11: return [2 /*return*/, this];
|
|
2335
|
+
this.html = (decoded, target, portalCanvasId, hash = null, useproxy, logerror, shortCircuitStrategy = 0 /* ShortCircuitStrategy.None */) => __awaiter(this, void 0, void 0, function* () {
|
|
2336
|
+
if (decoded && decoded.length > 0 && target) {
|
|
2337
|
+
try {
|
|
2338
|
+
// Flatten the payload and parse all events out of them, sorted by time
|
|
2339
|
+
let merged = this.merge(decoded);
|
|
2340
|
+
yield this.setup(target, { version: decoded[0].envelope.version, dom: merged.dom, useproxy, portalCanvasId });
|
|
2341
|
+
// Render all mutations on top of the initial markup
|
|
2342
|
+
while (merged.events.length > 0) {
|
|
2343
|
+
let entry = merged.events.shift();
|
|
2344
|
+
switch (entry.event) {
|
|
2345
|
+
case 45 /* Data.Event.StyleSheetAdoption */:
|
|
2346
|
+
case 46 /* Data.Event.StyleSheetUpdate */:
|
|
2347
|
+
this.layout.styleChange(entry);
|
|
2348
|
+
break;
|
|
2349
|
+
case 51 /* Data.Event.CustomElement */:
|
|
2350
|
+
this.layout.customElement(entry);
|
|
2351
|
+
break;
|
|
2352
|
+
case 6 /* Data.Event.Mutation */:
|
|
2353
|
+
let domEvent = entry;
|
|
2354
|
+
this.renderTime = domEvent.time;
|
|
2355
|
+
if (this.shortCircuitRendering(shortCircuitStrategy, domEvent, hash)) {
|
|
2356
|
+
break;
|
|
2357
|
+
}
|
|
2358
|
+
yield this.layout.markup(domEvent, useproxy);
|
|
2359
|
+
break;
|
|
2360
|
+
}
|
|
2492
2361
|
}
|
|
2493
|
-
}
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2362
|
+
}
|
|
2363
|
+
catch (e) {
|
|
2364
|
+
if (logerror) {
|
|
2365
|
+
logerror(e);
|
|
2366
|
+
}
|
|
2367
|
+
}
|
|
2368
|
+
}
|
|
2369
|
+
return this;
|
|
2370
|
+
});
|
|
2371
|
+
this.time = () => {
|
|
2372
|
+
return this.renderTime;
|
|
2498
2373
|
};
|
|
2499
|
-
this.clickmap =
|
|
2500
|
-
if (
|
|
2501
|
-
throw new Error(
|
|
2374
|
+
this.clickmap = (activity) => {
|
|
2375
|
+
if (this.state === null) {
|
|
2376
|
+
throw new Error(`Initialize heatmap by calling "html" or "setup" prior to making this call.`);
|
|
2502
2377
|
}
|
|
2503
|
-
|
|
2378
|
+
this.heatmap.click(activity);
|
|
2504
2379
|
};
|
|
2505
|
-
this.clearmap =
|
|
2506
|
-
if (
|
|
2507
|
-
throw new Error(
|
|
2380
|
+
this.clearmap = () => {
|
|
2381
|
+
if (this.state === null) {
|
|
2382
|
+
throw new Error(`Initialize heatmap by calling "html" or "setup" prior to making this call.`);
|
|
2508
2383
|
}
|
|
2509
|
-
|
|
2384
|
+
this.heatmap.clear();
|
|
2510
2385
|
};
|
|
2511
|
-
this.scrollmap =
|
|
2512
|
-
if (
|
|
2513
|
-
throw new Error(
|
|
2386
|
+
this.scrollmap = (scrollData, avgFold, addMarkers) => {
|
|
2387
|
+
if (this.state === null) {
|
|
2388
|
+
throw new Error(`Initialize heatmap by calling "html" or "setup" prior to making this call.`);
|
|
2514
2389
|
}
|
|
2515
|
-
|
|
2390
|
+
this.heatmap.scroll(scrollData, avgFold, addMarkers);
|
|
2516
2391
|
};
|
|
2517
|
-
this.merge =
|
|
2518
|
-
|
|
2392
|
+
this.merge = (decoded) => {
|
|
2393
|
+
let merged = { timestamp: null, envelope: null, dom: null, events: [] };
|
|
2519
2394
|
// Re-arrange decoded payloads in the order of their start time
|
|
2520
|
-
decoded = decoded.sort(
|
|
2395
|
+
decoded = decoded.sort(this.sortPayloads);
|
|
2521
2396
|
// Re-initialize enrich class if someone ends up calling merge function directly
|
|
2522
|
-
|
|
2523
|
-
helper.selector.config(
|
|
2524
|
-
|
|
2397
|
+
this.enrich = this.enrich || new EnrichHelper();
|
|
2398
|
+
helper.selector.config(this._excludeClassNames);
|
|
2399
|
+
this.enrich.reset();
|
|
2525
2400
|
// Walk through payloads and generate merged payload from an array of decoded payloads
|
|
2526
|
-
for (
|
|
2527
|
-
var payload = decoded_1[_i];
|
|
2401
|
+
for (let payload of decoded) {
|
|
2528
2402
|
merged.timestamp = merged.timestamp ? merged.timestamp : payload.timestamp;
|
|
2529
2403
|
merged.envelope = payload.envelope;
|
|
2530
|
-
for (
|
|
2531
|
-
|
|
2532
|
-
var p = payload[key];
|
|
2404
|
+
for (let key of Object.keys(payload)) {
|
|
2405
|
+
let p = payload[key];
|
|
2533
2406
|
if (Array.isArray(p)) {
|
|
2534
|
-
for (
|
|
2535
|
-
var entry = p_1[_c];
|
|
2407
|
+
for (let entry of p) {
|
|
2536
2408
|
switch (key) {
|
|
2537
2409
|
case "dom" /* Constant.Dom */:
|
|
2538
|
-
|
|
2410
|
+
let dom = this.enrich.selectors(entry);
|
|
2539
2411
|
if (entry.event === 5 /* Data.Event.Discover */) {
|
|
2540
2412
|
merged.dom = dom;
|
|
2541
2413
|
}
|
|
@@ -2551,65 +2423,58 @@ var Visualizer = /** @class */ (function () {
|
|
|
2551
2423
|
}
|
|
2552
2424
|
}
|
|
2553
2425
|
}
|
|
2554
|
-
merged.events = merged.events.sort(
|
|
2426
|
+
merged.events = merged.events.sort(this.sortEvents);
|
|
2555
2427
|
return merged;
|
|
2556
2428
|
};
|
|
2557
|
-
this.setup =
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
|
|
2581
|
-
|
|
2582
|
-
_a.label = 2;
|
|
2583
|
-
case 2: return [2 /*return*/, this];
|
|
2584
|
-
}
|
|
2585
|
-
});
|
|
2586
|
-
}); };
|
|
2587
|
-
this.render = function (events) {
|
|
2429
|
+
this.setup = (target, options) => __awaiter(this, void 0, void 0, function* () {
|
|
2430
|
+
this.reset();
|
|
2431
|
+
if (options.excludeClassNames) {
|
|
2432
|
+
this._excludeClassNames = options.excludeClassNames;
|
|
2433
|
+
helper.selector.config(options.excludeClassNames);
|
|
2434
|
+
}
|
|
2435
|
+
// Infer options
|
|
2436
|
+
options.pointer = "pointer" in options ? options.pointer : true;
|
|
2437
|
+
options.canvas = "canvas" in options ? options.canvas : true;
|
|
2438
|
+
options.keyframes = "keyframes" in options ? options.keyframes : false;
|
|
2439
|
+
// Set visualization state
|
|
2440
|
+
this._state = { window: target, options };
|
|
2441
|
+
// Initialize helpers
|
|
2442
|
+
this.enrich = new EnrichHelper();
|
|
2443
|
+
this.data = new DataHelper(this.state);
|
|
2444
|
+
this.layout = new LayoutHelper(this.state, options.mobile, options.vNext, options.locale);
|
|
2445
|
+
this.heatmap = new HeatmapHelper(this.state, this.layout);
|
|
2446
|
+
this.interaction = new InteractionHelper(this.state, this.layout, options.vNext);
|
|
2447
|
+
// If discover event was passed, render it now
|
|
2448
|
+
if (options.dom) {
|
|
2449
|
+
yield this.layout.dom(options.dom, options.useproxy);
|
|
2450
|
+
}
|
|
2451
|
+
return this;
|
|
2452
|
+
});
|
|
2453
|
+
this.render = (events) => {
|
|
2588
2454
|
var _a, _b;
|
|
2589
|
-
if (
|
|
2590
|
-
throw new Error(
|
|
2455
|
+
if (this.state === null) {
|
|
2456
|
+
throw new Error(`Initialize visualization by calling "setup" prior to making this call.`);
|
|
2591
2457
|
}
|
|
2592
|
-
|
|
2593
|
-
for (
|
|
2594
|
-
var entry = events_1[_i];
|
|
2458
|
+
let time = 0;
|
|
2459
|
+
for (const entry of events) {
|
|
2595
2460
|
try {
|
|
2596
2461
|
time = entry.time;
|
|
2597
|
-
|
|
2462
|
+
this.interaction.clearOldClickVisualizations(time);
|
|
2598
2463
|
switch (entry.event) {
|
|
2599
2464
|
case 0 /* Data.Event.Metric */:
|
|
2600
|
-
|
|
2465
|
+
this.data.metric(entry);
|
|
2601
2466
|
break;
|
|
2602
2467
|
case 1 /* Data.Event.Dimension */:
|
|
2603
2468
|
if (entry.data[37 /* Dimension.InteractionNextPaint */]) {
|
|
2604
|
-
|
|
2469
|
+
this.data.metric(entry);
|
|
2605
2470
|
}
|
|
2606
2471
|
break;
|
|
2607
2472
|
case 7 /* Data.Event.Region */:
|
|
2608
|
-
|
|
2473
|
+
this.data.region(entry);
|
|
2609
2474
|
break;
|
|
2610
2475
|
case 6 /* Data.Event.Mutation */:
|
|
2611
2476
|
case 43 /* Data.Event.Snapshot */:
|
|
2612
|
-
|
|
2477
|
+
this.layout.markup(entry);
|
|
2613
2478
|
break;
|
|
2614
2479
|
case 13 /* Data.Event.MouseDown */:
|
|
2615
2480
|
case 14 /* Data.Event.MouseUp */:
|
|
@@ -2621,73 +2486,67 @@ var Visualizer = /** @class */ (function () {
|
|
|
2621
2486
|
case 20 /* Data.Event.TouchCancel */:
|
|
2622
2487
|
case 18 /* Data.Event.TouchEnd */:
|
|
2623
2488
|
case 19 /* Data.Event.TouchMove */:
|
|
2624
|
-
|
|
2489
|
+
this.interaction.pointer(entry);
|
|
2625
2490
|
break;
|
|
2626
2491
|
case 28 /* Data.Event.Visibility */:
|
|
2627
|
-
|
|
2492
|
+
this.interaction.visibility(entry);
|
|
2628
2493
|
break;
|
|
2629
2494
|
case 27 /* Data.Event.Input */:
|
|
2630
|
-
|
|
2495
|
+
this.interaction.input(entry);
|
|
2631
2496
|
break;
|
|
2632
2497
|
case 21 /* Data.Event.Selection */:
|
|
2633
|
-
|
|
2498
|
+
this.interaction.selection(entry);
|
|
2634
2499
|
break;
|
|
2635
2500
|
case 11 /* Data.Event.Resize */:
|
|
2636
|
-
|
|
2501
|
+
this.interaction.resize(entry);
|
|
2637
2502
|
break;
|
|
2638
2503
|
case 10 /* Data.Event.Scroll */:
|
|
2639
|
-
|
|
2504
|
+
this.interaction.scroll(entry);
|
|
2640
2505
|
break;
|
|
2641
2506
|
case 45 /* Data.Event.StyleSheetAdoption */:
|
|
2642
2507
|
case 46 /* Data.Event.StyleSheetUpdate */:
|
|
2643
|
-
|
|
2508
|
+
this.layout.styleChange(entry);
|
|
2644
2509
|
break;
|
|
2645
2510
|
case 44 /* Data.Event.Animation */:
|
|
2646
|
-
|
|
2511
|
+
this.layout.animateChange(entry);
|
|
2647
2512
|
break;
|
|
2648
2513
|
case 51 /* Data.Event.CustomElement */:
|
|
2649
|
-
|
|
2514
|
+
this.layout.customElement(entry);
|
|
2650
2515
|
break;
|
|
2651
2516
|
}
|
|
2652
2517
|
}
|
|
2653
2518
|
catch (e) {
|
|
2654
|
-
(_b = (_a =
|
|
2519
|
+
(_b = (_a = this._state.options).logerror) === null || _b === void 0 ? void 0 : _b.call(_a, e);
|
|
2655
2520
|
}
|
|
2656
2521
|
}
|
|
2657
2522
|
if (events.length > 0) {
|
|
2658
2523
|
// Update pointer trail at the end of every frame
|
|
2659
|
-
|
|
2524
|
+
this.interaction.trail(time);
|
|
2660
2525
|
}
|
|
2661
2526
|
};
|
|
2662
|
-
this.reset =
|
|
2527
|
+
this.reset = () => {
|
|
2663
2528
|
var _a, _b, _c, _d, _e;
|
|
2664
|
-
(_a =
|
|
2665
|
-
(_b =
|
|
2666
|
-
(_c =
|
|
2667
|
-
(_d =
|
|
2668
|
-
(_e =
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
};
|
|
2672
|
-
this.sortEvents =
|
|
2529
|
+
(_a = this.data) === null || _a === void 0 ? void 0 : _a.reset();
|
|
2530
|
+
(_b = this.interaction) === null || _b === void 0 ? void 0 : _b.reset();
|
|
2531
|
+
(_c = this.layout) === null || _c === void 0 ? void 0 : _c.reset();
|
|
2532
|
+
(_d = this.heatmap) === null || _d === void 0 ? void 0 : _d.reset();
|
|
2533
|
+
(_e = this.enrich) === null || _e === void 0 ? void 0 : _e.reset();
|
|
2534
|
+
this._state = null;
|
|
2535
|
+
this.renderTime = 0;
|
|
2536
|
+
};
|
|
2537
|
+
this.sortEvents = (a, b) => {
|
|
2673
2538
|
return a.time - b.time;
|
|
2674
2539
|
};
|
|
2675
|
-
this.sortPayloads =
|
|
2540
|
+
this.sortPayloads = (a, b) => {
|
|
2676
2541
|
return a.envelope.sequence - b.envelope.sequence;
|
|
2677
2542
|
};
|
|
2678
2543
|
}
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
enumerable: false,
|
|
2684
|
-
configurable: true
|
|
2685
|
-
});
|
|
2686
|
-
return Visualizer;
|
|
2687
|
-
}());
|
|
2544
|
+
get state() {
|
|
2545
|
+
return this._state;
|
|
2546
|
+
}
|
|
2547
|
+
}
|
|
2688
2548
|
|
|
2689
|
-
|
|
2690
|
-
var state = (_a = new Visualizer(), _a.state), dom = _a.dom, get = _a.get, html = _a.html, time = _a.time, clickmap = _a.clickmap, clearmap = _a.clearmap, scrollmap = _a.scrollmap, merge = _a.merge, setup = _a.setup, render = _a.render;
|
|
2549
|
+
const { state, dom, get, html, time, clickmap, clearmap, scrollmap, merge, setup, render } = new Visualizer();
|
|
2691
2550
|
|
|
2692
2551
|
var clarity = /*#__PURE__*/Object.freeze({
|
|
2693
2552
|
__proto__: null,
|