@qoretechnologies/reqraft 0.10.56 → 0.10.57-pr.127.g0a792ea

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/.claude/CLAUDE.md +1 -0
  2. package/README.md +20 -0
  3. package/design/TRACKING.md +290 -0
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +5 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/tracking/browser/attach.d.ts +8 -0
  9. package/dist/tracking/browser/attach.d.ts.map +1 -0
  10. package/dist/tracking/browser/attach.js +182 -0
  11. package/dist/tracking/browser/attach.js.map +1 -0
  12. package/dist/tracking/browser/env.d.ts +14 -0
  13. package/dist/tracking/browser/env.d.ts.map +1 -0
  14. package/dist/tracking/browser/env.js +150 -0
  15. package/dist/tracking/browser/env.js.map +1 -0
  16. package/dist/tracking/core/consent.d.ts +21 -0
  17. package/dist/tracking/core/consent.d.ts.map +1 -0
  18. package/dist/tracking/core/consent.js +39 -0
  19. package/dist/tracking/core/consent.js.map +1 -0
  20. package/dist/tracking/core/engagement.d.ts +20 -0
  21. package/dist/tracking/core/engagement.d.ts.map +1 -0
  22. package/dist/tracking/core/engagement.js +52 -0
  23. package/dist/tracking/core/engagement.js.map +1 -0
  24. package/dist/tracking/core/experiments.d.ts +109 -0
  25. package/dist/tracking/core/experiments.d.ts.map +1 -0
  26. package/dist/tracking/core/experiments.js +294 -0
  27. package/dist/tracking/core/experiments.js.map +1 -0
  28. package/dist/tracking/core/hash.d.ts +16 -0
  29. package/dist/tracking/core/hash.d.ts.map +1 -0
  30. package/dist/tracking/core/hash.js +31 -0
  31. package/dist/tracking/core/hash.js.map +1 -0
  32. package/dist/tracking/core/ids.d.ts +6 -0
  33. package/dist/tracking/core/ids.d.ts.map +1 -0
  34. package/dist/tracking/core/ids.js +31 -0
  35. package/dist/tracking/core/ids.js.map +1 -0
  36. package/dist/tracking/core/observable.d.ts +12 -0
  37. package/dist/tracking/core/observable.d.ts.map +1 -0
  38. package/dist/tracking/core/observable.js +32 -0
  39. package/dist/tracking/core/observable.js.map +1 -0
  40. package/dist/tracking/core/queue.d.ts +47 -0
  41. package/dist/tracking/core/queue.d.ts.map +1 -0
  42. package/dist/tracking/core/queue.js +205 -0
  43. package/dist/tracking/core/queue.js.map +1 -0
  44. package/dist/tracking/core/sections.d.ts +54 -0
  45. package/dist/tracking/core/sections.d.ts.map +1 -0
  46. package/dist/tracking/core/sections.js +156 -0
  47. package/dist/tracking/core/sections.js.map +1 -0
  48. package/dist/tracking/core/storage.d.ts +15 -0
  49. package/dist/tracking/core/storage.d.ts.map +1 -0
  50. package/dist/tracking/core/storage.js +72 -0
  51. package/dist/tracking/core/storage.js.map +1 -0
  52. package/dist/tracking/core/tracker.d.ts +122 -0
  53. package/dist/tracking/core/tracker.d.ts.map +1 -0
  54. package/dist/tracking/core/tracker.js +390 -0
  55. package/dist/tracking/core/tracker.js.map +1 -0
  56. package/dist/tracking/core/types.d.ts +130 -0
  57. package/dist/tracking/core/types.d.ts.map +1 -0
  58. package/dist/tracking/core/types.js +69 -0
  59. package/dist/tracking/core/types.js.map +1 -0
  60. package/dist/tracking/core/utm.d.ts +6 -0
  61. package/dist/tracking/core/utm.d.ts.map +1 -0
  62. package/dist/tracking/core/utm.js +30 -0
  63. package/dist/tracking/core/utm.js.map +1 -0
  64. package/dist/tracking/index.d.ts +46 -0
  65. package/dist/tracking/index.d.ts.map +1 -0
  66. package/dist/tracking/index.js +91 -0
  67. package/dist/tracking/index.js.map +1 -0
  68. package/dist/tracking/markup.d.ts +12 -0
  69. package/dist/tracking/markup.d.ts.map +1 -0
  70. package/dist/tracking/markup.js +19 -0
  71. package/dist/tracking/markup.js.map +1 -0
  72. package/dist/tracking/react/Experiment.d.ts +23 -0
  73. package/dist/tracking/react/Experiment.d.ts.map +1 -0
  74. package/dist/tracking/react/Experiment.js +28 -0
  75. package/dist/tracking/react/Experiment.js.map +1 -0
  76. package/dist/tracking/react/TrackingProvider.d.ts +26 -0
  77. package/dist/tracking/react/TrackingProvider.d.ts.map +1 -0
  78. package/dist/tracking/react/TrackingProvider.js +45 -0
  79. package/dist/tracking/react/TrackingProvider.js.map +1 -0
  80. package/dist/tracking/react/hooks.d.ts +39 -0
  81. package/dist/tracking/react/hooks.d.ts.map +1 -0
  82. package/dist/tracking/react/hooks.js +96 -0
  83. package/dist/tracking/react/hooks.js.map +1 -0
  84. package/dist/tracking/react/index.d.ts +7 -0
  85. package/dist/tracking/react/index.d.ts.map +1 -0
  86. package/dist/tracking/react/index.js +17 -0
  87. package/dist/tracking/react/index.js.map +1 -0
  88. package/dist/tracking/testing.d.ts +40 -0
  89. package/dist/tracking/testing.d.ts.map +1 -0
  90. package/dist/tracking/testing.js +140 -0
  91. package/dist/tracking/testing.js.map +1 -0
  92. package/dist/tracking/ui/ExperimentCard.d.ts +55 -0
  93. package/dist/tracking/ui/ExperimentCard.d.ts.map +1 -0
  94. package/dist/tracking/ui/ExperimentCard.js +340 -0
  95. package/dist/tracking/ui/ExperimentCard.js.map +1 -0
  96. package/dist/tracking/ui/ExperimentsOverlay.d.ts +59 -0
  97. package/dist/tracking/ui/ExperimentsOverlay.d.ts.map +1 -0
  98. package/dist/tracking/ui/ExperimentsOverlay.js +359 -0
  99. package/dist/tracking/ui/ExperimentsOverlay.js.map +1 -0
  100. package/dist/tracking/ui/anchor.d.ts +107 -0
  101. package/dist/tracking/ui/anchor.d.ts.map +1 -0
  102. package/dist/tracking/ui/anchor.js +108 -0
  103. package/dist/tracking/ui/anchor.js.map +1 -0
  104. package/dist/tracking/ui/card.d.ts +121 -0
  105. package/dist/tracking/ui/card.d.ts.map +1 -0
  106. package/dist/tracking/ui/card.js +417 -0
  107. package/dist/tracking/ui/card.js.map +1 -0
  108. package/dist/tracking/ui/client.d.ts +42 -0
  109. package/dist/tracking/ui/client.d.ts.map +1 -0
  110. package/dist/tracking/ui/client.js +123 -0
  111. package/dist/tracking/ui/client.js.map +1 -0
  112. package/dist/tracking/ui/index.d.ts +20 -0
  113. package/dist/tracking/ui/index.d.ts.map +1 -0
  114. package/dist/tracking/ui/index.js +60 -0
  115. package/dist/tracking/ui/index.js.map +1 -0
  116. package/dist/tracking/ui/types.d.ts +120 -0
  117. package/dist/tracking/ui/types.d.ts.map +1 -0
  118. package/dist/tracking/ui/types.js +8 -0
  119. package/dist/tracking/ui/types.js.map +1 -0
  120. package/dist/tracking/ui/useExperimentsAdmin.d.ts +31 -0
  121. package/dist/tracking/ui/useExperimentsAdmin.d.ts.map +1 -0
  122. package/dist/tracking/ui/useExperimentsAdmin.js +136 -0
  123. package/dist/tracking/ui/useExperimentsAdmin.js.map +1 -0
  124. package/package.json +1 -1
  125. package/src/index.tsx +5 -0
  126. package/src/stories/tracking.tsx +206 -0
  127. package/src/tracking/browser/attach.ts +186 -0
  128. package/src/tracking/browser/env.ts +78 -0
  129. package/src/tracking/core/consent.ts +37 -0
  130. package/src/tracking/core/engagement.ts +47 -0
  131. package/src/tracking/core/experiments.ts +258 -0
  132. package/src/tracking/core/hash.ts +26 -0
  133. package/src/tracking/core/ids.ts +25 -0
  134. package/src/tracking/core/observable.ts +23 -0
  135. package/src/tracking/core/queue.ts +131 -0
  136. package/src/tracking/core/sections.ts +166 -0
  137. package/src/tracking/core/storage.ts +69 -0
  138. package/src/tracking/core/tracker.ts +417 -0
  139. package/src/tracking/core/types.ts +162 -0
  140. package/src/tracking/core/utm.ts +23 -0
  141. package/src/tracking/index.ts +72 -0
  142. package/src/tracking/markup.ts +17 -0
  143. package/src/tracking/react/Experiment.tsx +44 -0
  144. package/src/tracking/react/TrackingProvider.tsx +56 -0
  145. package/src/tracking/react/hooks.ts +106 -0
  146. package/src/tracking/react/index.ts +13 -0
  147. package/src/tracking/testing.ts +108 -0
  148. package/src/tracking/ui/ExperimentCard.stories.tsx +290 -0
  149. package/src/tracking/ui/ExperimentCard.tsx +581 -0
  150. package/src/tracking/ui/ExperimentsOverlay.stories.tsx +155 -0
  151. package/src/tracking/ui/ExperimentsOverlay.tsx +437 -0
  152. package/src/tracking/ui/anchor.ts +180 -0
  153. package/src/tracking/ui/card.ts +464 -0
  154. package/src/tracking/ui/client.ts +117 -0
  155. package/src/tracking/ui/index.ts +77 -0
  156. package/src/tracking/ui/types.ts +110 -0
  157. package/src/tracking/ui/useExperimentsAdmin.ts +103 -0
@@ -0,0 +1,417 @@
1
+ "use strict";
2
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4
+ if (ar || !(i in from)) {
5
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6
+ ar[i] = from[i];
7
+ }
8
+ }
9
+ return to.concat(ar || Array.prototype.slice.call(from));
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.helpSections = exports.DEFAULT_MIN_SAMPLE = exports.leadingVersion = exports.sortVersionRows = exports.versionsMaxHeight = exports.VISIBLE_VERSIONS = exports.winnerNote = exports.phaseNote = exports.actionOutcome = exports.lifecycleCopy = exports.confirmCopy = exports.statusTag = exports.STATUS_LABEL = exports.verdictIntent = exports.barValues = exports.numbersLine = exports.count = exports.percent = exports.verdictLine = exports.UNREACHABLE_TEXT = exports.NOT_SET_UP_TEXT = exports.versionRows = exports.versionName = exports.primaryMetric = exports.canRemove = exports.canStop = exports.canPause = exports.canStart = exports.canAccept = void 0;
13
+ var canAccept = function (status) {
14
+ return status === 'running' || status === 'paused' || status === 'stopped';
15
+ };
16
+ exports.canAccept = canAccept;
17
+ /** Start a draft, or resume a paused test. */
18
+ var canStart = function (status) { return status === 'draft' || status === 'paused'; };
19
+ exports.canStart = canStart;
20
+ var canPause = function (status) { return status === 'running'; };
21
+ exports.canPause = canPause;
22
+ var canStop = function (status) { return status === 'running' || status === 'paused'; };
23
+ exports.canStop = canStop;
24
+ var canRemove = function (status, versions) {
25
+ return (status === 'draft' || status === 'running' || status === 'paused') && versions > 1;
26
+ };
27
+ exports.canRemove = canRemove;
28
+ var primaryMetric = function (results) { var _a, _b; return (_b = (_a = results === null || results === void 0 ? void 0 : results.metrics) === null || _a === void 0 ? void 0 : _a.find(function (m) { return m.role === 'primary'; })) !== null && _b !== void 0 ? _b : null; };
29
+ exports.primaryMetric = primaryMetric;
30
+ var versionName = function (key) { return "Version ".concat(key.toUpperCase()); };
31
+ exports.versionName = versionName;
32
+ /**
33
+ * One row per version. Keys come from the server's experiment when there is one, otherwise from
34
+ * the page's code (`codeVariants`, the `data-variants` of `<Experiment>`): a test that exists
35
+ * only in code can still be switched.
36
+ */
37
+ var versionRows = function (entry, codeVariants) {
38
+ var _a;
39
+ if (codeVariants === void 0) { codeVariants = []; }
40
+ var metric = (0, exports.primaryMetric)(entry === null || entry === void 0 ? void 0 : entry.results);
41
+ var variants = ((_a = entry === null || entry === void 0 ? void 0 : entry.experiment.variants) === null || _a === void 0 ? void 0 : _a.length) ?
42
+ entry.experiment.variants
43
+ : codeVariants.map(function (key, i) { return ({ key: key, weight: 1, control: i === 0 }); });
44
+ return variants.map(function (v) {
45
+ var _a, _b;
46
+ var r = metric === null || metric === void 0 ? void 0 : metric.variants.find(function (x) { return x.variant === v.key; });
47
+ return {
48
+ key: v.key,
49
+ name: v.name || (0, exports.versionName)(v.key),
50
+ control: !!v.control,
51
+ visitors: r ? r.exposed : null,
52
+ conversion: (_a = r === null || r === void 0 ? void 0 : r.rate) !== null && _a !== void 0 ? _a : null,
53
+ chance: v.control ? null : ((_b = r === null || r === void 0 ? void 0 : r.chance_to_beat) !== null && _b !== void 0 ? _b : null),
54
+ inCode: codeVariants.length === 0 || codeVariants.includes(v.key),
55
+ };
56
+ });
57
+ };
58
+ exports.versionRows = versionRows;
59
+ var nameOf = function (entry, key) {
60
+ var _a;
61
+ return ((_a = entry.experiment.variants.find(function (v) { return v.key === key; })) === null || _a === void 0 ? void 0 : _a.name) ||
62
+ (key ? (0, exports.versionName)(key) : 'a version');
63
+ };
64
+ /** The verdict in plain words: the server's sentence when it sends one. */
65
+ /** The test is in the page's code, but the analytics service does not know it (or cannot be reached). */
66
+ exports.NOT_SET_UP_TEXT = "This test is in the page's code but isn't set up yet: ask the Designer to set it up. Until then you can switch versions here, but nothing is counted.";
67
+ exports.UNREACHABLE_TEXT = "Can't reach the analytics service right now, so there are no numbers and no test controls. You can still switch versions here; try again in a minute.";
68
+ /**
69
+ * The verdict in plain words: the server's sentence when it sends one. Without a server entry:
70
+ * `unreachable` (the list could not be loaded) or not set up yet (`notSetUpText`).
71
+ */
72
+ var verdictLine = function (entry, _a) {
73
+ var _b;
74
+ var _c = _a === void 0 ? {} : _a, _d = _c.unreachable, unreachable = _d === void 0 ? false : _d, _e = _c.notSetUpText, notSetUpText = _e === void 0 ? exports.NOT_SET_UP_TEXT : _e;
75
+ if (!entry)
76
+ return unreachable ? exports.UNREACHABLE_TEXT : notSetUpText;
77
+ var e = entry.experiment, results = entry.results;
78
+ if (results === null || results === void 0 ? void 0 : results.verdict_text)
79
+ return results.verdict_text;
80
+ if (e.status === 'concluded')
81
+ return "Finished: ".concat(nameOf(entry, e.winner), " won, and every visitor now sees it.");
82
+ if (e.status === 'draft')
83
+ return 'Not started yet: press Start test to split visitors between the versions.';
84
+ if (!results)
85
+ return 'No numbers yet.';
86
+ var control = (_b = e.variants.find(function (v) { return v.control; })) === null || _b === void 0 ? void 0 : _b.key;
87
+ switch (results.verdict) {
88
+ case 'likely-winner':
89
+ return "".concat(nameOf(entry, results.winner_variant), " is likely better than ").concat(nameOf(entry, control), ".");
90
+ case 'likely-loser':
91
+ return "The new versions are likely worse than ".concat(nameOf(entry, control), ".");
92
+ case 'no-clear-difference':
93
+ return 'No clear difference between the versions yet.';
94
+ default:
95
+ return 'Too early to tell.';
96
+ }
97
+ };
98
+ exports.verdictLine = verdictLine;
99
+ var percent = function (n, digits) {
100
+ if (digits === void 0) { digits = 1; }
101
+ return n == null || !Number.isFinite(n) ? '–' : "".concat((n * 100).toFixed(digits).replace(/\.0$/, ''), "%");
102
+ };
103
+ exports.percent = percent;
104
+ var count = function (n) {
105
+ return n == null ? '–' : n.toLocaleString('en-US');
106
+ };
107
+ exports.count = count;
108
+ /**
109
+ * One line of numbers under a version: visitors, conversion, chance to beat the original. In
110
+ * words when there is nothing to count yet, never a row of dashes.
111
+ */
112
+ var numbersLine = function (row, metricName, status) {
113
+ if (!row.visitors) {
114
+ if (status === 'draft')
115
+ return 'Not started: no visitors yet';
116
+ return row.visitors === 0 ? 'No visitors yet' : 'No numbers yet';
117
+ }
118
+ var parts = [
119
+ "".concat((0, exports.count)(row.visitors), " visitors"),
120
+ "".concat((0, exports.percent)(row.conversion), " ").concat(metricName ? "\u201C".concat(metricName, "\u201D") : 'conversion'),
121
+ ];
122
+ if (!row.control && row.chance != null)
123
+ parts.push("".concat((0, exports.percent)(row.chance, 0), " chance to beat the original"));
124
+ return parts.join(' · ');
125
+ };
126
+ exports.numbersLine = numbersLine;
127
+ /** Each version's bar: its conversion as a share of the best one (0..100; 0 with no numbers). */
128
+ var barValues = function (rows) {
129
+ var best = Math.max.apply(Math, __spreadArray([0], rows.map(function (r) { var _a; return (_a = r.conversion) !== null && _a !== void 0 ? _a : 0; }), false));
130
+ return rows.map(function (r) { return (best > 0 && r.conversion ? Math.round((r.conversion / best) * 100) : 0); });
131
+ };
132
+ exports.barValues = barValues;
133
+ /** The verdict's colour: green for a likely winner, amber for likely losers, neutral otherwise. */
134
+ var verdictIntent = function (entry) {
135
+ var _a;
136
+ if (!entry)
137
+ return 'muted';
138
+ if (entry.experiment.status === 'concluded')
139
+ return 'success';
140
+ var v = (_a = entry.results) === null || _a === void 0 ? void 0 : _a.verdict;
141
+ return (v === 'likely-winner' ? 'success'
142
+ : v === 'likely-loser' ? 'warning'
143
+ : 'info');
144
+ };
145
+ exports.verdictIntent = verdictIntent;
146
+ exports.STATUS_LABEL = {
147
+ draft: 'Draft',
148
+ running: 'Running',
149
+ paused: 'Paused',
150
+ stopped: 'Stopped',
151
+ concluded: 'Ended',
152
+ archived: 'Archived',
153
+ };
154
+ /** The status tag: its words (with the phase after a removal), its icon and its colour. */
155
+ var statusTag = function (entry, unreachable) {
156
+ var _a;
157
+ if (unreachable === void 0) { unreachable = false; }
158
+ if (!entry) {
159
+ return unreachable ?
160
+ { label: 'No connection', icon: 'WifiOffLine', intent: 'warning' }
161
+ : { label: 'Not set up', icon: 'QuestionLine', intent: 'muted' };
162
+ }
163
+ var _b = entry.experiment, status = _b.status, phase = _b.phase;
164
+ var label = "".concat((_a = exports.STATUS_LABEL[status]) !== null && _a !== void 0 ? _a : status).concat(phase && phase > 1 ? " \u00B7 phase ".concat(phase) : '');
165
+ switch (status) {
166
+ case 'running':
167
+ return { label: label, icon: 'PlayCircleLine', intent: 'success' };
168
+ case 'paused':
169
+ return { label: label, icon: 'PauseCircleLine', intent: 'warning' };
170
+ case 'draft':
171
+ return { label: label, icon: 'PencilRulerLine', intent: 'muted' };
172
+ case 'stopped':
173
+ return { label: label, icon: 'StopCircleLine', intent: 'danger' };
174
+ default:
175
+ return { label: label, icon: 'TrophyLine', intent: 'success' };
176
+ }
177
+ };
178
+ exports.statusTag = statusTag;
179
+ /** What the confirm step says before Accept / Remove. */
180
+ var confirmCopy = function (action, entry, variant) {
181
+ var name = nameOf(entry, variant);
182
+ if (action === 'accept') {
183
+ return {
184
+ title: "Make \u201C".concat(name, "\u201D the winner?"),
185
+ description: "This ends the test. From then on every visitor sees \u201C".concat(name, "\u201D. A developer removes the other versions' code later."),
186
+ confirmLabel: "Accept ".concat(name),
187
+ };
188
+ }
189
+ var rest = entry.experiment.variants.filter(function (v) { return v.key !== variant; });
190
+ // The server concludes the test with the last version, a draft included.
191
+ if (rest.length === 1) {
192
+ var last = nameOf(entry, rest[0].key);
193
+ return {
194
+ title: "Remove \u201C".concat(name, "\u201D?"),
195
+ description: "Only \u201C".concat(last, "\u201D would be left, so it becomes the winner and the test ends. Every visitor then sees \u201C").concat(last, "\u201D."),
196
+ confirmLabel: "Remove and accept ".concat(last),
197
+ };
198
+ }
199
+ return {
200
+ title: "Remove \u201C".concat(name, "\u201D from the test?"),
201
+ description: entry.experiment.status === 'draft' ?
202
+ "The test will start without \u201C".concat(name, "\u201D.")
203
+ : "Nobody sees \u201C".concat(name, "\u201D any more. The test starts counting again with the remaining versions, so the numbers start from zero."),
204
+ confirmLabel: "Remove ".concat(name),
205
+ };
206
+ };
207
+ exports.confirmCopy = confirmCopy;
208
+ /** What the confirm step says before Start / Pause / Stop. */
209
+ var lifecycleCopy = function (action, entry) {
210
+ var _a;
211
+ var e = entry.experiment;
212
+ var name = e.name || e.key;
213
+ var versions = e.variants.map(function (v) { return "\u201C".concat(v.name || v.key, "\u201D"); }).join(' and ');
214
+ switch (action) {
215
+ case 'start':
216
+ return e.status === 'paused' ?
217
+ {
218
+ title: "Resume \u201C".concat(name, "\u201D?"),
219
+ description: "Visitors are split between ".concat(versions, " again and counted."),
220
+ confirmLabel: 'Resume the test',
221
+ }
222
+ : {
223
+ title: "Start \u201C".concat(name, "\u201D?"),
224
+ description: "From now on, visitors who allow analytics are split between ".concat(versions, ", and each version's numbers are counted. You can pause or stop it at any time."),
225
+ confirmLabel: 'Start the test',
226
+ };
227
+ case 'pause':
228
+ return {
229
+ title: "Pause \u201C".concat(name, "\u201D?"),
230
+ description: "Everybody sees the original, \u201C".concat(nameOf(entry, (_a = e.variants.find(function (v) { return v.control; })) === null || _a === void 0 ? void 0 : _a.key), "\u201D, and nothing is counted until you resume it."),
231
+ confirmLabel: 'Pause the test',
232
+ };
233
+ case 'stop':
234
+ default:
235
+ return {
236
+ title: "Stop \u201C".concat(name, "\u201D?"),
237
+ description: 'The test ends without a winner and cannot be started again; everybody sees the original. To end it with a winner, use Accept instead.',
238
+ confirmLabel: 'Stop the test',
239
+ };
240
+ }
241
+ };
242
+ exports.lifecycleCopy = lifecycleCopy;
243
+ /** The notification after Accept / Remove. */
244
+ var actionOutcome = function (action, result, variant) {
245
+ var _a, _b;
246
+ var winner = ((_b = (_a = result === null || result === void 0 ? void 0 : result.variants) === null || _a === void 0 ? void 0 : _a.find(function (v) { return v.key === result.winner; })) === null || _b === void 0 ? void 0 : _b.name) || (result === null || result === void 0 ? void 0 : result.winner) || variant;
247
+ if (action === 'accept' || (result === null || result === void 0 ? void 0 : result.auto_accepted))
248
+ return "The test has ended: every visitor now sees \u201C".concat(winner, "\u201D.");
249
+ return 'The version is removed; the test goes on with the others.';
250
+ };
251
+ exports.actionOutcome = actionOutcome;
252
+ /**
253
+ * Why the numbers restarted: the current phase began when a version was removed. Null in the
254
+ * first phase. `actorLabels` names who removed it (`{ 'landing-editor': 'in the editor' }`).
255
+ */
256
+ var phaseNote = function (entry, actorLabels) {
257
+ var _a, _b, _c, _d;
258
+ if (actorLabels === void 0) { actorLabels = {}; }
259
+ var e = entry === null || entry === void 0 ? void 0 : entry.experiment;
260
+ if (!e || !e.phase || e.phase < 2)
261
+ return null;
262
+ var current = (_a = e.phases) === null || _a === void 0 ? void 0 : _a.find(function (p) { return p.phase === e.phase; });
263
+ var removed = __spreadArray([], ((_b = e.history) !== null && _b !== void 0 ? _b : []), true).reverse().find(function (h) { return h.action === 'remove-variant'; });
264
+ var who = (removed === null || removed === void 0 ? void 0 : removed.actor) && actorLabels[removed.actor] ? " ".concat(actorLabels[removed.actor]) : '';
265
+ var since = (current === null || current === void 0 ? void 0 : current.started_at) ?
266
+ new Date(current.started_at).toLocaleDateString('en-GB', {
267
+ day: 'numeric',
268
+ month: 'short',
269
+ timeZone: 'UTC',
270
+ })
271
+ : null;
272
+ var name = (removed === null || removed === void 0 ? void 0 : removed.variant) ?
273
+ (_d = (_c = e.phases) === null || _c === void 0 ? void 0 : _c.flatMap(function (p) { return p.variants; }).find(function (v) { return v.key === removed.variant; })) === null || _d === void 0 ? void 0 : _d.name
274
+ : undefined;
275
+ return "Counting since ".concat(since !== null && since !== void 0 ? since : 'the last change', " (phase ").concat(e.phase, "): ").concat(name ? "\u201C".concat(name, "\u201D") : 'a version', " was removed").concat(who, ".");
276
+ };
277
+ exports.phaseNote = phaseNote;
278
+ /** The note on an element whose test has ended. */
279
+ var winnerNote = function (entry, shown) { var _a; return "Winner live: ".concat(entry ? nameOf(entry, (_a = entry.experiment.winner) !== null && _a !== void 0 ? _a : shown) : (0, exports.versionName)(shown), " \u00B7 code clean-up pending"); };
280
+ exports.winnerNote = winnerNote;
281
+ // ── how many versions fit ───────────────────────────────────────────────────────
282
+ /** Versions visible before the list scrolls: three and a half, so the half row says "there is more". */
283
+ exports.VISIBLE_VERSIONS = 3.5;
284
+ /**
285
+ * The versions list's height cap (px): 3.5 rows, or less when the card has less room
286
+ * (`available`, what is left after the header, verdict and footer), never under one row.
287
+ * Null when every row fits (no cap, no scrolling).
288
+ */
289
+ var versionsMaxHeight = function (_a) {
290
+ var rows = _a.rows, rowHeight = _a.rowHeight, gap = _a.gap, _b = _a.available, available = _b === void 0 ? Infinity : _b;
291
+ if (rows <= 0 || rowHeight <= 0)
292
+ return null;
293
+ var all = rows * rowHeight + (rows - 1) * gap;
294
+ var threeAndHalf = exports.VISIBLE_VERSIONS * rowHeight + Math.floor(exports.VISIBLE_VERSIONS) * gap;
295
+ var cap = Math.max(rowHeight, Math.min(threeAndHalf, available));
296
+ return all <= cap ? null : Math.round(cap);
297
+ };
298
+ exports.versionsMaxHeight = versionsMaxHeight;
299
+ // ── order and the leader ─────────────────────────────────────────────────────────
300
+ /**
301
+ * Best first: conversion on the primary metric, then visitors; versions without numbers keep
302
+ * their order at the end. Stable: equal versions keep the server's order.
303
+ */
304
+ var sortVersionRows = function (rows) {
305
+ return rows
306
+ .map(function (row, index) { return ({ row: row, index: index }); })
307
+ .sort(function (a, b) {
308
+ var _a, _b, _c, _d;
309
+ var ca = a.row.visitors ? ((_a = a.row.conversion) !== null && _a !== void 0 ? _a : -1) : -1;
310
+ var cb = b.row.visitors ? ((_b = b.row.conversion) !== null && _b !== void 0 ? _b : -1) : -1;
311
+ if (cb !== ca)
312
+ return cb - ca;
313
+ var va = (_c = a.row.visitors) !== null && _c !== void 0 ? _c : -1;
314
+ var vb = (_d = b.row.visitors) !== null && _d !== void 0 ? _d : -1;
315
+ if (vb !== va)
316
+ return vb - va;
317
+ return a.index - b.index;
318
+ })
319
+ .map(function (_a) {
320
+ var row = _a.row;
321
+ return row;
322
+ });
323
+ };
324
+ exports.sortVersionRows = sortVersionRows;
325
+ /**
326
+ * The version to highlight: the winner when the test ended with one or the verdict is a likely
327
+ * winner, otherwise the one converting best so far ("Leading"). Null while nothing is counted,
328
+ * or when the best conversion is shared.
329
+ */
330
+ var leadingVersion = function (entry, rows) {
331
+ var _a;
332
+ var e = entry === null || entry === void 0 ? void 0 : entry.experiment;
333
+ if ((e === null || e === void 0 ? void 0 : e.status) === 'concluded' && e.winner)
334
+ return { key: e.winner, kind: 'winner' };
335
+ if (((_a = entry === null || entry === void 0 ? void 0 : entry.results) === null || _a === void 0 ? void 0 : _a.verdict) === 'likely-winner' && entry.results.winner_variant) {
336
+ return { key: entry.results.winner_variant, kind: 'winner' };
337
+ }
338
+ var counted = rows.filter(function (r) { return r.visitors && r.conversion != null && r.conversion > 0; });
339
+ if (!counted.length)
340
+ return null;
341
+ var best = Math.max.apply(Math, counted.map(function (r) { return r.conversion; }));
342
+ var top = counted.filter(function (r) { return r.conversion === best; });
343
+ return top.length === 1 ? { key: top[0].key, kind: 'leading' } : null;
344
+ };
345
+ exports.leadingVersion = leadingVersion;
346
+ // ── the help ─────────────────────────────────────────────────────────────────────
347
+ exports.DEFAULT_MIN_SAMPLE = { per_variant: 200, days: 7 };
348
+ /** What the card's "?" explains, in plain words for a marketer. */
349
+ var helpSections = function (entry, analyticsLabel) {
350
+ var _a;
351
+ if (analyticsLabel === void 0) { analyticsLabel = 'the admin portal'; }
352
+ var min = (_a = entry === null || entry === void 0 ? void 0 : entry.experiment.min_sample) !== null && _a !== void 0 ? _a : exports.DEFAULT_MIN_SAMPLE;
353
+ var traffic = entry === null || entry === void 0 ? void 0 : entry.experiment.traffic;
354
+ var share = traffic != null && traffic < 1 ?
355
+ "".concat(Math.round(traffic * 100), "% of the visitors who allow analytics")
356
+ : 'every visitor who allows analytics';
357
+ return [
358
+ {
359
+ title: 'What this is',
360
+ paragraphs: [
361
+ 'An A/B test shows different versions of this part of the page to different visitors and counts which version gets more of them to do what you want (the goal, for example starting a sign-up).',
362
+ 'The "Original" is what the page showed before the test. The others are the new versions being tried.',
363
+ ],
364
+ },
365
+ {
366
+ title: 'The buttons',
367
+ paragraphs: [
368
+ 'Click a version (or press Enter on it) to see it on this page. Only you see it, only in this browser, and it is never counted.',
369
+ "Show analytics (the chart icon) opens that version's numbers in " +
370
+ analyticsLabel +
371
+ '; the link in the footer opens the whole test.',
372
+ "Accept ends the test with that version as the winner: from then on every visitor sees it, and a developer removes the other versions' code later.",
373
+ 'Remove (the bin icon) drops a version from the test. The counting starts again with the remaining versions, so their numbers restart from zero. When only one version would be left, it becomes the winner.',
374
+ 'Start test begins splitting visitors and counting. Pause shows everyone the original and stops counting until you Resume. Stop ends the test without a winner, for good.',
375
+ 'Every one of these asks you to confirm first.',
376
+ ],
377
+ },
378
+ {
379
+ title: 'How visitors are split and counted',
380
+ paragraphs: [
381
+ "While the test runs, ".concat(share, " is put into one version at random and keeps seeing that same version on every visit. Visitors who decline analytics always see the original and are not counted."),
382
+ 'A visitor is counted for a version once they have actually seen this part of the page. A conversion is counted when that visitor later reaches the goal.',
383
+ ],
384
+ },
385
+ {
386
+ title: 'Reading the numbers',
387
+ paragraphs: [
388
+ 'Each version shows its visitors, its conversion (the share of its visitors who reached the goal) and a bar comparing it with the best version. The versions are sorted best first; "Leading" marks the one converting best so far.',
389
+ '"Chance to beat the original" is how likely that version really converts better than the original, given the numbers so far. 50% means we cannot tell them apart; 95% or more is a likely winner, marked "Winner"; 5% or less means it is likely worse.',
390
+ 'The line at the top is the verdict in plain words: too early, a likely winner, likely worse, or no clear difference.',
391
+ ],
392
+ },
393
+ {
394
+ title: 'When you can trust the result',
395
+ paragraphs: [
396
+ "Early numbers jump around. The verdict stays \"too early\" until every version has at least ".concat(min.per_variant, " visitors and ").concat(min.days, " days have passed since the test started; only then is a winner named."),
397
+ 'If visitors are not split between the versions as set up, the verdict says the numbers cannot be trusted: that points to a tracking problem, not to a better version.',
398
+ 'Removing a version starts a new count (a new phase), so only the numbers since then are shown.',
399
+ ],
400
+ },
401
+ {
402
+ title: 'Not set up yet?',
403
+ paragraphs: [
404
+ "A test can exist in the page's code before anyone registers it in the analytics service. Until it is set up (ask the Designer), you can switch its versions here, but nothing is counted and there are no numbers or controls.",
405
+ 'When the analytics service cannot be reached, the card says so; the page itself works as usual and every visitor sees the original.',
406
+ ],
407
+ },
408
+ {
409
+ title: 'The full analytics',
410
+ paragraphs: [
411
+ "Every test and every version has its own page in ".concat(analyticsLabel, ": the numbers over time, the other goals, and how the test changed."),
412
+ ],
413
+ },
414
+ ];
415
+ };
416
+ exports.helpSections = helpSections;
417
+ //# sourceMappingURL=card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.js","sourceRoot":"","sources":["../../../src/tracking/ui/card.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * A small client for the qorus-api experiment routes the A/B test card acts on: the list with
3
+ * results, accept, remove-variant, start, pause, stop, and creating a draft (§9.3, §9.5 of the
4
+ * contract). Optional: the card and the overlay only take data and callbacks, so a product can
5
+ * reach its server any other way.
6
+ */
7
+ import type { IAdminExperiment, IExperimentEntry, INewExperiment, TExperimentActionResult, TLifecycleAction } from './types';
8
+ export declare class ExperimentsAdminError extends Error {
9
+ readonly status: number;
10
+ readonly code?: string;
11
+ constructor(message: string, status: number, code?: string);
12
+ }
13
+ export type TExperimentsFetch = (input: string, init?: RequestInit) => Promise<Response>;
14
+ export interface IExperimentsAdminOptions {
15
+ /**
16
+ * The list route, with any query it needs: `/qorus-cloud/editor/experiments?property=landing`
17
+ * (the editor route) or `/qorus-saas-admin/analytics/experiments?property=ide` (the admin API).
18
+ */
19
+ listUrl: string;
20
+ /**
21
+ * The route of one action. Default: the list route's path, then `/<key>/<action>`
22
+ * (`…/experiments/signup-cta/accept`), without the list's query.
23
+ */
24
+ actionUrl?: (key: string, action: string) => string;
25
+ /** Where a new draft is posted. Default: the list route's path. */
26
+ createUrl?: string;
27
+ /** Sent with every request (e.g. an `Authorization` header). */
28
+ headers?: Record<string, string>;
29
+ /** `same-origin` by default. */
30
+ credentials?: RequestCredentials;
31
+ /** Default: the global `fetch`. */
32
+ fetch?: TExperimentsFetch;
33
+ }
34
+ export interface IExperimentsAdminClient {
35
+ list(): Promise<IExperimentEntry[]>;
36
+ accept(key: string, variant: string): Promise<TExperimentActionResult>;
37
+ remove(key: string, variant: string): Promise<TExperimentActionResult>;
38
+ lifecycle(key: string, action: TLifecycleAction): Promise<IAdminExperiment>;
39
+ create(def: INewExperiment): Promise<IAdminExperiment>;
40
+ }
41
+ export declare const createExperimentsAdminClient: (options: IExperimentsAdminOptions) => IExperimentsAdminClient;
42
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/tracking/ui/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,qBAAa,qBAAsB,SAAQ,KAAK;IAG5C,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;gBAFtB,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM;CAKzB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEzF,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACpD,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gCAAgC;IAChC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,mCAAmC;IACnC,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACvE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACvE,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5E,MAAM,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACxD;AAID,eAAO,MAAM,4BAA4B,YAC9B,wBAAwB,KAChC,uBAwDF,CAAC"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
29
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
30
+ return new (P || (P = Promise))(function (resolve, reject) {
31
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
32
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
33
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
34
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
35
+ });
36
+ };
37
+ var __generator = (this && this.__generator) || function (thisArg, body) {
38
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
39
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
40
+ function verb(n) { return function (v) { return step([n, v]); }; }
41
+ function step(op) {
42
+ if (f) throw new TypeError("Generator is already executing.");
43
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
44
+ 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;
45
+ if (y = 0, t) op = [op[0] & 2, t.value];
46
+ switch (op[0]) {
47
+ case 0: case 1: t = op; break;
48
+ case 4: _.label++; return { value: op[1], done: false };
49
+ case 5: _.label++; y = op[1]; op = [0]; continue;
50
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
51
+ default:
52
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
53
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
54
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
55
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
56
+ if (t[2]) _.ops.pop();
57
+ _.trys.pop(); continue;
58
+ }
59
+ op = body.call(thisArg, _);
60
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
61
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
+ }
63
+ };
64
+ Object.defineProperty(exports, "__esModule", { value: true });
65
+ exports.createExperimentsAdminClient = exports.ExperimentsAdminError = void 0;
66
+ var ExperimentsAdminError = /** @class */ (function (_super) {
67
+ __extends(ExperimentsAdminError, _super);
68
+ function ExperimentsAdminError(message, status, code) {
69
+ var _this = _super.call(this, message) || this;
70
+ _this.status = status;
71
+ _this.code = code;
72
+ _this.name = 'ExperimentsAdminError';
73
+ return _this;
74
+ }
75
+ return ExperimentsAdminError;
76
+ }(Error));
77
+ exports.ExperimentsAdminError = ExperimentsAdminError;
78
+ var pathOf = function (url) { return url.split('?')[0].replace(/\/+$/, ''); };
79
+ var createExperimentsAdminClient = function (options) {
80
+ var _a, _b;
81
+ var base = pathOf(options.listUrl);
82
+ var actionUrl = (_a = options.actionUrl) !== null && _a !== void 0 ? _a : (function (key, action) { return "".concat(base, "/").concat(encodeURIComponent(key), "/").concat(action); });
83
+ var doFetch = (_b = options.fetch) !== null && _b !== void 0 ? _b : (function (input, init) { return fetch(input, init); });
84
+ var call = function (url, body) { return __awaiter(void 0, void 0, void 0, function () {
85
+ var res, parsed, code;
86
+ var _a, _b, _c, _d, _e;
87
+ return __generator(this, function (_f) {
88
+ switch (_f.label) {
89
+ case 0: return [4 /*yield*/, doFetch(url, __assign({ method: body === undefined ? 'GET' : 'POST', credentials: (_a = options.credentials) !== null && _a !== void 0 ? _a : 'same-origin', headers: __assign(__assign({ Accept: 'application/json' }, (body === undefined ? {} : { 'Content-Type': 'application/json' })), options.headers) }, (body === undefined ? {} : { body: JSON.stringify(body) })))];
90
+ case 1:
91
+ res = _f.sent();
92
+ return [4 /*yield*/, res.json().catch(function () { return null; })];
93
+ case 2:
94
+ parsed = (_f.sent());
95
+ if (!res.ok) {
96
+ code = (_b = parsed === null || parsed === void 0 ? void 0 : parsed.err) !== null && _b !== void 0 ? _b : parsed === null || parsed === void 0 ? void 0 : parsed.error;
97
+ if (res.status === 401 || res.status === 403) {
98
+ throw new ExperimentsAdminError('Not allowed to manage A/B tests on this server (the API key is missing or wrong).', res.status, code);
99
+ }
100
+ throw new ExperimentsAdminError((_e = (_d = (_c = parsed === null || parsed === void 0 ? void 0 : parsed.desc) !== null && _c !== void 0 ? _c : parsed === null || parsed === void 0 ? void 0 : parsed.message) !== null && _d !== void 0 ? _d : code) !== null && _e !== void 0 ? _e : "HTTP ".concat(res.status), res.status, code);
101
+ }
102
+ return [2 /*return*/, parsed];
103
+ }
104
+ });
105
+ }); };
106
+ return {
107
+ list: function () {
108
+ return call(options.listUrl).then(function (body) {
109
+ return Array.isArray(body) ? body
110
+ : Array.isArray(body === null || body === void 0 ? void 0 : body.experiments) ? body.experiments
111
+ : [];
112
+ });
113
+ },
114
+ accept: function (key, variant) { return call(actionUrl(key, 'accept'), { variant: variant }); },
115
+ remove: function (key, variant) {
116
+ return call(actionUrl(key, 'remove-variant'), { variant: variant });
117
+ },
118
+ lifecycle: function (key, action) { return call(actionUrl(key, action), {}); },
119
+ create: function (def) { var _a; return call((_a = options.createUrl) !== null && _a !== void 0 ? _a : base, def); },
120
+ };
121
+ };
122
+ exports.createExperimentsAdminClient = createExperimentsAdminClient;
123
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/tracking/ui/client.ts"],"names":[],"mappings":"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"}