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

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 (158) hide show
  1. package/.claude/CLAUDE.md +1 -0
  2. package/README.md +20 -0
  3. package/design/TRACKING.md +278 -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 +47 -0
  93. package/dist/tracking/ui/ExperimentCard.d.ts.map +1 -0
  94. package/dist/tracking/ui/ExperimentCard.js +305 -0
  95. package/dist/tracking/ui/ExperimentCard.js.map +1 -0
  96. package/dist/tracking/ui/ExperimentsOverlay.d.ts +53 -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 +87 -0
  105. package/dist/tracking/ui/card.d.ts.map +1 -0
  106. package/dist/tracking/ui/card.js +287 -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 +54 -0
  115. package/dist/tracking/ui/index.js.map +1 -0
  116. package/dist/tracking/ui/types.d.ts +111 -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 +197 -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.stories.tsx +174 -0
  144. package/src/tracking/react/Experiment.tsx +44 -0
  145. package/src/tracking/react/TrackingProvider.tsx +56 -0
  146. package/src/tracking/react/hooks.ts +106 -0
  147. package/src/tracking/react/index.ts +13 -0
  148. package/src/tracking/testing.ts +108 -0
  149. package/src/tracking/ui/ExperimentCard.stories.tsx +236 -0
  150. package/src/tracking/ui/ExperimentCard.tsx +491 -0
  151. package/src/tracking/ui/ExperimentsOverlay.stories.tsx +148 -0
  152. package/src/tracking/ui/ExperimentsOverlay.tsx +423 -0
  153. package/src/tracking/ui/anchor.ts +180 -0
  154. package/src/tracking/ui/card.ts +323 -0
  155. package/src/tracking/ui/client.ts +117 -0
  156. package/src/tracking/ui/index.ts +71 -0
  157. package/src/tracking/ui/types.ts +104 -0
  158. package/src/tracking/ui/useExperimentsAdmin.ts +103 -0
@@ -0,0 +1,359 @@
1
+ "use strict";
2
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
+ return cooked;
5
+ };
6
+ var __assign = (this && this.__assign) || function () {
7
+ __assign = Object.assign || function(t) {
8
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
9
+ s = arguments[i];
10
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
11
+ t[p] = s[p];
12
+ }
13
+ return t;
14
+ };
15
+ return __assign.apply(this, arguments);
16
+ };
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ var __generator = (this && this.__generator) || function (thisArg, body) {
27
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
28
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
+ function verb(n) { return function (v) { return step([n, v]); }; }
30
+ function step(op) {
31
+ if (f) throw new TypeError("Generator is already executing.");
32
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
33
+ 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;
34
+ if (y = 0, t) op = [op[0] & 2, t.value];
35
+ switch (op[0]) {
36
+ case 0: case 1: t = op; break;
37
+ case 4: _.label++; return { value: op[1], done: false };
38
+ case 5: _.label++; y = op[1]; op = [0]; continue;
39
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
+ default:
41
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
+ if (t[2]) _.ops.pop();
46
+ _.trys.pop(); continue;
47
+ }
48
+ op = body.call(thisArg, _);
49
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
+ }
52
+ };
53
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
54
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
55
+ if (ar || !(i in from)) {
56
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
57
+ ar[i] = from[i];
58
+ }
59
+ }
60
+ return to.concat(ar || Array.prototype.slice.call(from));
61
+ };
62
+ var __importDefault = (this && this.__importDefault) || function (mod) {
63
+ return (mod && mod.__esModule) ? mod : { "default": mod };
64
+ };
65
+ Object.defineProperty(exports, "__esModule", { value: true });
66
+ exports.ExperimentsOverlay = exports.boxOf = exports.OVERLAY_ATTRIBUTE = void 0;
67
+ var jsx_runtime_1 = require("react/jsx-runtime");
68
+ var reqore_1 = require("@qoretechnologies/reqore");
69
+ var react_1 = require("react");
70
+ var react_dom_1 = require("react-dom");
71
+ var styled_components_1 = __importDefault(require("styled-components"));
72
+ var TrackingProvider_1 = require("../react/TrackingProvider");
73
+ var anchor_1 = require("./anchor");
74
+ var card_1 = require("./card");
75
+ var ExperimentCard_1 = require("./ExperimentCard");
76
+ // Overlay chrome only: the outline around a tested element, never taking the pointer.
77
+ var StyledOutline = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n position: absolute;\n pointer-events: none;\n z-index: 880;\n border-radius: 10px;\n outline-width: 2px;\n outline-style: dashed;\n outline-offset: -3px;\n"], ["\n position: absolute;\n pointer-events: none;\n z-index: 880;\n border-radius: 10px;\n outline-width: 2px;\n outline-style: dashed;\n outline-offset: -3px;\n"])));
78
+ // Layout only: the handle and the card, in page coordinates so they scroll with the element.
79
+ var StyledFloat = styled_components_1.default.div(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n position: absolute;\n z-index: ", ";\n filter: drop-shadow(0 12px 28px rgba(0, 0, 0, 0.35));\n"], ["\n position: absolute;\n z-index: ", ";\n filter: drop-shadow(0 12px 28px rgba(0, 0, 0, 0.35));\n"])), function (_a) {
80
+ var $card = _a.$card;
81
+ return ($card ? 956 : 955);
82
+ });
83
+ /** The overlay's own root; markers inside it are never outlined. */
84
+ exports.OVERLAY_ATTRIBUTE = 'data-experiments-overlay';
85
+ /** One box around the elements (viewport coordinates); tiny elements are ignored. */
86
+ var boxOf = function (els) {
87
+ var box = null;
88
+ for (var _i = 0, els_1 = els; _i < els_1.length; _i++) {
89
+ var el = els_1[_i];
90
+ var r = el.getBoundingClientRect();
91
+ if (r.width < 8 || r.height < 8)
92
+ continue;
93
+ box =
94
+ box ?
95
+ {
96
+ l: Math.min(box.l, r.left),
97
+ t: Math.min(box.t, r.top),
98
+ r: Math.max(box.r, r.right),
99
+ b: Math.max(box.b, r.bottom),
100
+ }
101
+ : { l: r.left, t: r.top, r: r.right, b: r.bottom };
102
+ }
103
+ return box ? new DOMRect(box.l, box.t, box.r - box.l, box.b - box.t) : null;
104
+ };
105
+ exports.boxOf = boxOf;
106
+ var markedOnPage = function (exclude) {
107
+ return Array.from(document.querySelectorAll('[data-experiment]'))
108
+ .filter(function (el) { return !el.closest("[".concat(exports.OVERLAY_ATTRIBUTE, "]")) && !(exclude && el.closest(exclude)); })
109
+ .map(function (el) {
110
+ var _a, _b, _c, _d;
111
+ var box = (0, exports.boxOf)(Array.from(el.children));
112
+ return box ?
113
+ {
114
+ key: (_a = el.dataset.experiment) !== null && _a !== void 0 ? _a : '',
115
+ shown: (_b = el.dataset.variant) !== null && _b !== void 0 ? _b : '',
116
+ variants: ((_c = el.dataset.variants) !== null && _c !== void 0 ? _c : '').split(',').filter(Boolean),
117
+ reason: (_d = el.dataset.experimentReason) !== null && _d !== void 0 ? _d : '',
118
+ box: box,
119
+ }
120
+ : null;
121
+ })
122
+ .filter(function (m) { return !!m && !!m.key; });
123
+ };
124
+ var inside = function (r, x, y) { return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom; };
125
+ /** Re-renders the caller on scroll, resize and every 700 ms (content arriving), while `active`. */
126
+ var useFollowPage = function (active) {
127
+ var _a = (0, react_1.useState)(0), setTick = _a[1];
128
+ (0, react_1.useEffect)(function () {
129
+ if (!active)
130
+ return undefined;
131
+ var raf = 0;
132
+ var bump = function () {
133
+ cancelAnimationFrame(raf);
134
+ raf = requestAnimationFrame(function () { return setTick(function (t) { return t + 1; }); });
135
+ };
136
+ window.addEventListener('scroll', bump, { passive: true, capture: true });
137
+ window.addEventListener('resize', bump);
138
+ var id = window.setInterval(bump, 700);
139
+ return function () {
140
+ window.removeEventListener('scroll', bump, { capture: true });
141
+ window.removeEventListener('resize', bump);
142
+ window.clearInterval(id);
143
+ cancelAnimationFrame(raf);
144
+ };
145
+ }, [active]);
146
+ };
147
+ var HANDLE_ESTIMATE = { width: 240, height: 30 };
148
+ /**
149
+ * Every `<Experiment>` on the page (its `data-experiment` marker) gets a dashed outline and a
150
+ * handle, "A/B test · <name>", at its top-left corner. Hovering the element, focusing the handle,
151
+ * or clicking / tapping it opens the test's `<ExperimentCard>`, anchored to the element: it moves
152
+ * and resizes with it and flips above or below the handle to stay in view. ✕, Esc and a click
153
+ * outside close it. An ended test shows "Winner live" instead. Data and actions come in as props
154
+ * (`useExperimentsAdmin` provides them from the qorus-api routes).
155
+ */
156
+ var ExperimentsOverlay = function (_a) {
157
+ var _b;
158
+ var _c = _a.visible, visible = _c === void 0 ? true : _c, tests = _a.tests, loadError = _a.loadError, onShow = _a.onShow, onAccept = _a.onAccept, onRemove = _a.onRemove, onStart = _a.onStart, onPause = _a.onPause, onStop = _a.onStop, onSettled = _a.onSettled, detailsUrl = _a.detailsUrl, detailsLabel = _a.detailsLabel, actorLabels = _a.actorLabels, _d = _a.topInset, topInset = _d === void 0 ? 0 : _d, exclude = _a.exclude, _e = _a.handleLabel, handleLabel = _e === void 0 ? function (name) { return "A/B test \u00B7 ".concat(name); } : _e;
159
+ var tracker = (0, TrackingProvider_1.useTracker)();
160
+ var theme = (0, reqore_1.useReqoreTheme)();
161
+ var hoverCapable = (0, reqore_1.useReqoreProperty)('isHoverCapable') !== false;
162
+ var _f = (0, react_1.useReducer)(anchor_1.cardReducer, anchor_1.CLOSED), cards = _f[0], dispatch = _f[1];
163
+ var _g = (0, react_1.useState)({}), sizes = _g[0], setSizes = _g[1];
164
+ var boxes = (0, react_1.useRef)(new Map());
165
+ var floats = (0, react_1.useRef)(new Map());
166
+ var sides = (0, react_1.useRef)(new Map());
167
+ var open = visible ? (0, anchor_1.openCard)(cards) : null;
168
+ var marked = visible && typeof document !== 'undefined' ? markedOnPage(exclude) : [];
169
+ useFollowPage(visible);
170
+ // A version switch, an accept or a removal re-renders the tested element; a resize moves it.
171
+ var _h = (0, react_1.useState)(0), setSeen = _h[1];
172
+ var markedKeys = marked.map(function (m) { return m.key; }).join(',');
173
+ (0, react_1.useEffect)(function () {
174
+ if (!visible)
175
+ return undefined;
176
+ var bump = function () { return setSeen(function (n) { return n + 1; }); };
177
+ var mo = new MutationObserver(bump);
178
+ mo.observe(document.body, {
179
+ subtree: true,
180
+ attributes: true,
181
+ attributeFilter: ['data-variant', 'data-experiment-reason'],
182
+ });
183
+ var ro = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(bump);
184
+ document.querySelectorAll('[data-experiment] > *').forEach(function (el) { return ro === null || ro === void 0 ? void 0 : ro.observe(el); });
185
+ return function () {
186
+ mo.disconnect();
187
+ ro === null || ro === void 0 ? void 0 : ro.disconnect();
188
+ };
189
+ }, [markedKeys, visible]);
190
+ // Hover: the pointer over a tested element, its handle or its card. Leaving waits a moment,
191
+ // so the pointer can cross the gap between the handle and the card.
192
+ (0, react_1.useEffect)(function () {
193
+ if (!hoverCapable || !visible)
194
+ return undefined;
195
+ var leave = 0;
196
+ var onMove = function (e) {
197
+ var hit = null;
198
+ boxes.current.forEach(function (box, key) {
199
+ if (!hit && inside(box, e.clientX, e.clientY))
200
+ hit = key;
201
+ });
202
+ floats.current.forEach(function (el, id) {
203
+ if (!hit && inside(el.getBoundingClientRect(), e.clientX, e.clientY))
204
+ hit = id.split('|')[0];
205
+ });
206
+ window.clearTimeout(leave);
207
+ if (hit)
208
+ dispatch({ type: 'hover', key: hit });
209
+ else
210
+ leave = window.setTimeout(function () { return dispatch({ type: 'hover', key: null }); }, 220);
211
+ };
212
+ document.addEventListener('pointermove', onMove, { passive: true });
213
+ return function () {
214
+ window.clearTimeout(leave);
215
+ document.removeEventListener('pointermove', onMove);
216
+ };
217
+ }, [hoverCapable, visible]);
218
+ // Esc and a click outside the card close it (a click in the confirm step it opened does not).
219
+ (0, react_1.useEffect)(function () {
220
+ if (!open)
221
+ return undefined;
222
+ var onKey = function (e) {
223
+ if (e.key === 'Escape')
224
+ dispatch({ type: 'close' });
225
+ };
226
+ var onDown = function (e) {
227
+ var _a;
228
+ var target = e.target;
229
+ if ((_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, anchor_1.OUTSIDE_IGNORE))
230
+ return;
231
+ dispatch({ type: 'close' });
232
+ };
233
+ document.addEventListener('keydown', onKey);
234
+ document.addEventListener('pointerdown', onDown, true);
235
+ return function () {
236
+ document.removeEventListener('keydown', onKey);
237
+ document.removeEventListener('pointerdown', onDown, true);
238
+ };
239
+ }, [open]);
240
+ // The handles' and the card's real sizes, for the placement.
241
+ (0, react_1.useLayoutEffect)(function () {
242
+ var next = {};
243
+ floats.current.forEach(function (el, id) {
244
+ next[id] = { width: el.offsetWidth, height: el.offsetHeight };
245
+ });
246
+ var same = Object.keys(next).length === Object.keys(sizes).length &&
247
+ Object.entries(next).every(function (_a) {
248
+ var _b, _c;
249
+ var k = _a[0], v = _a[1];
250
+ return ((_b = sizes[k]) === null || _b === void 0 ? void 0 : _b.width) === v.width && ((_c = sizes[k]) === null || _c === void 0 ? void 0 : _c.height) === v.height;
251
+ });
252
+ if (!same)
253
+ setSizes(next);
254
+ });
255
+ /** After an action the page shows what visitors see now: no switch, fresh definitions, a new decision. */
256
+ var settle = (0, react_1.useCallback)(function (key) { return __awaiter(void 0, void 0, void 0, function () {
257
+ return __generator(this, function (_a) {
258
+ switch (_a.label) {
259
+ case 0:
260
+ if (!onSettled) return [3 /*break*/, 2];
261
+ return [4 /*yield*/, onSettled(key)];
262
+ case 1:
263
+ _a.sent();
264
+ return [2 /*return*/];
265
+ case 2:
266
+ tracker === null || tracker === void 0 ? void 0 : tracker.experiments.setEditorOverride(key, null);
267
+ return [4 /*yield*/, (tracker === null || tracker === void 0 ? void 0 : tracker.experiments.refresh())];
268
+ case 3:
269
+ _a.sent();
270
+ return [2 /*return*/];
271
+ }
272
+ });
273
+ }); }, [onSettled, tracker]);
274
+ var settled = function (key, fn) {
275
+ return fn ?
276
+ function () {
277
+ var args = [];
278
+ for (var _i = 0; _i < arguments.length; _i++) {
279
+ args[_i] = arguments[_i];
280
+ }
281
+ return __awaiter(void 0, void 0, void 0, function () {
282
+ var result;
283
+ return __generator(this, function (_a) {
284
+ switch (_a.label) {
285
+ case 0: return [4 /*yield*/, fn.apply(void 0, __spreadArray([key], args, false))];
286
+ case 1:
287
+ result = _a.sent();
288
+ return [4 /*yield*/, settle(key)];
289
+ case 2:
290
+ _a.sent();
291
+ return [2 /*return*/, result];
292
+ }
293
+ });
294
+ });
295
+ }
296
+ : undefined;
297
+ };
298
+ var show = onShow !== null && onShow !== void 0 ? onShow : (tracker ?
299
+ function (key, variant) { return tracker.experiments.setEditorOverride(key, variant); }
300
+ : undefined);
301
+ if (!visible || typeof document === 'undefined')
302
+ return null;
303
+ boxes.current.clear();
304
+ var viewport = {
305
+ width: document.documentElement.clientWidth || window.innerWidth,
306
+ height: window.innerHeight,
307
+ };
308
+ var scroll = { x: window.scrollX, y: window.scrollY };
309
+ var inset = typeof topInset === 'function' ? topInset() : topInset;
310
+ var setFloat = function (id) { return function (el) {
311
+ if (el)
312
+ floats.current.set(id, el);
313
+ else
314
+ floats.current.delete(id);
315
+ }; };
316
+ return (0, react_dom_1.createPortal)((0, jsx_runtime_1.jsx)("div", (_b = {}, _b[exports.OVERLAY_ATTRIBUTE] = '', _b.children = marked.map(function (m) {
317
+ var _a, _b, _c;
318
+ var entry = tests === null || tests === void 0 ? void 0 : tests.find(function (e) { return e.experiment.key === m.key; });
319
+ var concluded = m.reason === 'concluded' || (entry === null || entry === void 0 ? void 0 : entry.experiment.status) === 'concluded';
320
+ var name = (entry === null || entry === void 0 ? void 0 : entry.experiment.name) || m.key;
321
+ var isOpen = !concluded && open === m.key;
322
+ var place = (0, anchor_1.placeCard)({
323
+ box: m.box,
324
+ viewport: viewport,
325
+ scroll: scroll,
326
+ handle: (_a = sizes["".concat(m.key, "|handle")]) !== null && _a !== void 0 ? _a : HANDLE_ESTIMATE,
327
+ card: isOpen ? ((_b = sizes["".concat(m.key, "|card")]) !== null && _b !== void 0 ? _b : { height: 420 }) : null,
328
+ topInset: inset,
329
+ side: sides.current.get(m.key),
330
+ });
331
+ if (place.card)
332
+ sides.current.set(m.key, place.card.side);
333
+ else
334
+ sides.current.delete(m.key);
335
+ boxes.current.set(m.key, m.box);
336
+ if (!place.visible)
337
+ return null;
338
+ var onBlur = function (e) {
339
+ var _a, _b;
340
+ if (!((_b = (_a = e.relatedTarget) === null || _a === void 0 ? void 0 : _a.closest) === null || _b === void 0 ? void 0 : _b.call(_a, "[data-experiment-float=\"".concat(m.key, "\"]")))) {
341
+ dispatch({ type: 'blur', key: m.key });
342
+ }
343
+ };
344
+ var floatProps = {
345
+ 'data-experiment-float': m.key,
346
+ onFocus: function () { return dispatch({ type: 'focus', key: m.key }); },
347
+ onBlur: onBlur,
348
+ };
349
+ return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(StyledOutline, { style: __assign(__assign({}, place.outline), { outlineColor: (_c = theme.intents) === null || _c === void 0 ? void 0 : _c.info }), "data-experiment-outline": m.key }), (0, jsx_runtime_1.jsx)(StyledFloat, __assign({ ref: setFloat("".concat(m.key, "|handle")), style: place.handle }, floatProps, { children: concluded ?
350
+ (0, jsx_runtime_1.jsx)(reqore_1.ReqoreTag, { icon: 'TrophyLine', label: (0, card_1.winnerNote)(entry, m.shown), tooltip: 'Every visitor sees this version. A developer removes the other versions\u2019 code later.', effect: {
351
+ gradient: { colors: { 0: 'success', 100: 'success:darken:1' } },
352
+ weight: 'bold',
353
+ } })
354
+ : (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { pill: true, size: 'small', icon: 'FlaskLine', intent: 'info', active: isOpen, "aria-expanded": isOpen, tooltip: isOpen ? undefined : 'A/B test: see its versions and numbers', onClick: function () { return dispatch({ type: 'toggle', key: m.key }); }, children: handleLabel(name) }) })), isOpen && place.card && ((0, jsx_runtime_1.jsx)(StyledFloat, __assign({ "$card": true, ref: setFloat("".concat(m.key, "|card")), style: { top: place.card.top, left: place.card.left, width: place.card.width }, "data-side": place.card.side }, floatProps, { children: (0, jsx_runtime_1.jsx)(ExperimentCard_1.ExperimentCard, { experimentKey: m.key, test: entry, name: name, shown: m.shown, codeVariants: m.variants, maxHeight: place.card.maxHeight, loadError: loadError, detailsUrl: detailsUrl === null || detailsUrl === void 0 ? void 0 : detailsUrl(m.key), detailsLabel: detailsLabel, actorLabels: actorLabels, onClose: function () { return dispatch({ type: 'close' }); }, onShow: show ? function (variant) { return show(m.key, variant); } : undefined, onAccept: settled(m.key, onAccept), onRemove: settled(m.key, onRemove), onStart: settled(m.key, onStart), onPause: settled(m.key, onPause), onStop: settled(m.key, onStop) }) })))] }, m.key));
355
+ }), _b)), document.body);
356
+ };
357
+ exports.ExperimentsOverlay = ExperimentsOverlay;
358
+ var templateObject_1, templateObject_2;
359
+ //# sourceMappingURL=ExperimentsOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExperimentsOverlay.js","sourceRoot":"","sources":["../../../src/tracking/ui/ExperimentsOverlay.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * The plain logic behind the A/B test overlay: where the handle and the card go (anchored to the
3
+ * tested element, flipped above or below to stay in view), and which card is open (hover,
4
+ * keyboard focus, a click; closed by ✕, Esc or a click outside). No React, no DOM
5
+ * (unit-tested in `__tests__/tracking/anchor.test.ts`).
6
+ */
7
+ export interface IBox {
8
+ top: number;
9
+ left: number;
10
+ width: number;
11
+ height: number;
12
+ }
13
+ export interface IPlaceInput {
14
+ /** The tested element's box, in viewport coordinates. */
15
+ box: IBox;
16
+ viewport: {
17
+ width: number;
18
+ height: number;
19
+ };
20
+ /** The page's scroll offset: the result is in document coordinates. */
21
+ scroll: {
22
+ x: number;
23
+ y: number;
24
+ };
25
+ /** The handle's measured size. */
26
+ handle: {
27
+ width: number;
28
+ height: number;
29
+ };
30
+ /** The card's measured size, when it is open (its natural height, before any cap). */
31
+ card?: {
32
+ height: number;
33
+ } | null;
34
+ /** The part of the viewport the app's sticky header covers (the handle and the card stay below it). */
35
+ topInset: number;
36
+ /** The smallest distance to a viewport edge. */
37
+ edge?: number;
38
+ /** Between the handle and the card. */
39
+ gap?: number;
40
+ /** The card's widest. */
41
+ maxWidth?: number;
42
+ /** The side the card is on now: it stays there while it still fits, so it does not jump while scrolling. */
43
+ side?: 'below' | 'above';
44
+ }
45
+ export interface IPlacement {
46
+ /** False when no part of the element is on screen: nothing is drawn. */
47
+ visible: boolean;
48
+ /** Document coordinates. */
49
+ outline: IBox;
50
+ handle: {
51
+ top: number;
52
+ left: number;
53
+ };
54
+ card: {
55
+ top: number;
56
+ left: number;
57
+ width: number;
58
+ maxHeight: number;
59
+ side: 'below' | 'above';
60
+ } | null;
61
+ }
62
+ export declare const CARD_MAX_WIDTH = 440;
63
+ /** The card never gets shorter than this; a smaller window scrolls inside it. */
64
+ export declare const CARD_MIN_HEIGHT = 180;
65
+ /**
66
+ * Where the outline, the handle and the card go. The handle sits at the element's top-left
67
+ * corner and, while the element is partly scrolled away, slides down to stay on its visible
68
+ * part. The card hangs under the handle, or above it when there is more room there than
69
+ * below and it does not fit below; its height is capped to that room (it scrolls inside).
70
+ */
71
+ export declare const placeCard: ({ box, viewport, scroll, handle, card, topInset, edge, gap, maxWidth, side: current, }: IPlaceInput) => IPlacement;
72
+ export interface ICardState {
73
+ /** The test whose element (or card) the pointer is over. */
74
+ hovered: string | null;
75
+ /** The test whose handle or card holds the keyboard focus. */
76
+ focused: string | null;
77
+ /** The test opened with a click or a tap: stays open until closed. */
78
+ pinned: string | null;
79
+ /** Closed while the pointer was still over it: hovering it opens it again only after leaving it. */
80
+ dismissed: string | null;
81
+ }
82
+ export type TCardEvent = {
83
+ type: 'hover';
84
+ key: string | null;
85
+ } | {
86
+ type: 'focus';
87
+ key: string;
88
+ } | {
89
+ type: 'blur';
90
+ key: string;
91
+ } | {
92
+ type: 'toggle';
93
+ key: string;
94
+ }
95
+ /** ✕, Esc, a click outside, an action that re-renders the element. */
96
+ | {
97
+ type: 'close';
98
+ };
99
+ export declare const CLOSED: ICardState;
100
+ /** The one open card: a click wins, then the keyboard, then the pointer. */
101
+ export declare const openCard: (s: ICardState) => string | null;
102
+ export declare const cardReducer: (s: ICardState, e: TCardEvent) => ICardState;
103
+ /** Enter or Space on a version's row itself (not on its Accept / Remove buttons) shows that version. */
104
+ export declare const activatesRow: (key: string, onRowItself: boolean) => boolean;
105
+ /** Whether a click lands outside the overlay's cards (and outside Reqore's dialogs and menus they open). */
106
+ export declare const OUTSIDE_IGNORE = "[data-experiment-float], .reqore-modal, .reqore-popover-content, .reqore-drawer, .reqore-notification, [role=\"dialog\"]";
107
+ //# sourceMappingURL=anchor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../../../src/tracking/ui/anchor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ /**
3
+ * The plain logic behind the A/B test overlay: where the handle and the card go (anchored to the
4
+ * tested element, flipped above or below to stay in view), and which card is open (hover,
5
+ * keyboard focus, a click; closed by ✕, Esc or a click outside). No React, no DOM
6
+ * (unit-tested in `__tests__/tracking/anchor.test.ts`).
7
+ */
8
+ var __assign = (this && this.__assign) || function () {
9
+ __assign = Object.assign || function(t) {
10
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
11
+ s = arguments[i];
12
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
13
+ t[p] = s[p];
14
+ }
15
+ return t;
16
+ };
17
+ return __assign.apply(this, arguments);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.OUTSIDE_IGNORE = exports.activatesRow = exports.cardReducer = exports.openCard = exports.CLOSED = exports.placeCard = exports.CARD_MIN_HEIGHT = exports.CARD_MAX_WIDTH = void 0;
21
+ exports.CARD_MAX_WIDTH = 440;
22
+ /** The card never gets shorter than this; a smaller window scrolls inside it. */
23
+ exports.CARD_MIN_HEIGHT = 180;
24
+ var clamp = function (n, lo, hi) { return Math.min(Math.max(n, lo), Math.max(lo, hi)); };
25
+ /**
26
+ * Where the outline, the handle and the card go. The handle sits at the element's top-left
27
+ * corner and, while the element is partly scrolled away, slides down to stay on its visible
28
+ * part. The card hangs under the handle, or above it when there is more room there than
29
+ * below and it does not fit below; its height is capped to that room (it scrolls inside).
30
+ */
31
+ var placeCard = function (_a) {
32
+ var box = _a.box, viewport = _a.viewport, scroll = _a.scroll, handle = _a.handle, card = _a.card, topInset = _a.topInset, _b = _a.edge, edge = _b === void 0 ? 12 : _b, _c = _a.gap, gap = _c === void 0 ? 8 : _c, _d = _a.maxWidth, maxWidth = _d === void 0 ? exports.CARD_MAX_WIDTH : _d, current = _a.side;
33
+ var bottom = box.top + box.height;
34
+ var right = box.left + box.width;
35
+ var outline = {
36
+ top: box.top + scroll.y,
37
+ left: box.left + scroll.x,
38
+ width: box.width,
39
+ height: box.height,
40
+ };
41
+ var visible = bottom > topInset && box.top < viewport.height && right > 0 && box.left < viewport.width;
42
+ // The handle: inside the element, below the header, above the element's bottom edge.
43
+ var hTop = Math.min(Math.max(box.top + edge, topInset + edge), bottom - handle.height - edge);
44
+ var hLeft = clamp(box.left + edge, edge, viewport.width - handle.width - edge);
45
+ var handlePos = { top: Math.max(hTop, box.top) + scroll.y, left: hLeft + scroll.x };
46
+ if (!card)
47
+ return { visible: visible, outline: outline, handle: handlePos, card: null };
48
+ var width = Math.min(maxWidth, viewport.width - 2 * edge);
49
+ var left = clamp(hLeft, edge, viewport.width - width - edge);
50
+ var handleTop = handlePos.top - scroll.y;
51
+ var handleBottom = handleTop + handle.height;
52
+ var below = viewport.height - edge - (handleBottom + gap);
53
+ var above = handleTop - gap - (topInset + edge);
54
+ var fits = { below: card.height <= below, above: card.height <= above };
55
+ var side = current && fits[current] ? current
56
+ : fits.below || below >= above ? 'below'
57
+ : 'above';
58
+ var room = Math.max(side === 'below' ? below : above, exports.CARD_MIN_HEIGHT);
59
+ var height = Math.min(card.height, room);
60
+ var top = side === 'below' ? handleBottom + gap : handleTop - gap - height;
61
+ return {
62
+ visible: visible,
63
+ outline: outline,
64
+ handle: handlePos,
65
+ card: { top: top + scroll.y, left: left + scroll.x, width: width, maxHeight: room, side: side },
66
+ };
67
+ };
68
+ exports.placeCard = placeCard;
69
+ exports.CLOSED = { hovered: null, focused: null, pinned: null, dismissed: null };
70
+ /** The one open card: a click wins, then the keyboard, then the pointer. */
71
+ var openCard = function (s) { var _a, _b; return (_b = (_a = s.pinned) !== null && _a !== void 0 ? _a : s.focused) !== null && _b !== void 0 ? _b : (s.hovered !== s.dismissed ? s.hovered : null); };
72
+ exports.openCard = openCard;
73
+ var cardReducer = function (s, e) {
74
+ var _a;
75
+ switch (e.type) {
76
+ case 'hover':
77
+ if (e.key === s.hovered)
78
+ return s;
79
+ // Leaving the element a card was closed on lets hovering open it again.
80
+ return __assign(__assign({}, s), { hovered: e.key, dismissed: s.dismissed && s.dismissed !== e.key ? null : s.dismissed });
81
+ case 'focus':
82
+ return s.focused === e.key && s.dismissed !== e.key ?
83
+ s
84
+ : __assign(__assign({}, s), { focused: e.key, dismissed: s.dismissed === e.key ? null : s.dismissed });
85
+ case 'blur':
86
+ return s.focused === e.key ? __assign(__assign({}, s), { focused: null }) : s;
87
+ case 'toggle':
88
+ // A click on the handle of an open card pins it (hover or focus opened it); a second click closes it.
89
+ return s.pinned === e.key ?
90
+ (0, exports.cardReducer)(s, { type: 'close' })
91
+ : __assign(__assign({}, s), { pinned: e.key, dismissed: null });
92
+ case 'close': {
93
+ var open_1 = (0, exports.openCard)(s);
94
+ if (!open_1)
95
+ return s;
96
+ return { hovered: s.hovered, focused: null, pinned: null, dismissed: (_a = s.hovered) !== null && _a !== void 0 ? _a : open_1 };
97
+ }
98
+ }
99
+ };
100
+ exports.cardReducer = cardReducer;
101
+ /** Enter or Space on a version's row itself (not on its Accept / Remove buttons) shows that version. */
102
+ var activatesRow = function (key, onRowItself) {
103
+ return onRowItself && (key === 'Enter' || key === ' ');
104
+ };
105
+ exports.activatesRow = activatesRow;
106
+ /** Whether a click lands outside the overlay's cards (and outside Reqore's dialogs and menus they open). */
107
+ exports.OUTSIDE_IGNORE = '[data-experiment-float], .reqore-modal, .reqore-popover-content, .reqore-drawer, .reqore-notification, [role="dialog"]';
108
+ //# sourceMappingURL=anchor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor.js","sourceRoot":"","sources":["../../../src/tracking/ui/anchor.ts"],"names":[],"mappings":"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"}