@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,140 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ 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;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.createMemoryTracker = void 0;
51
+ var storage_1 = require("./core/storage");
52
+ var tracker_1 = require("./core/tracker");
53
+ var types_1 = require("./core/types");
54
+ var createMemoryTracker = function (options) {
55
+ var _a, _b;
56
+ if (options === void 0) { options = {}; }
57
+ var clock = (_a = options.start) !== null && _a !== void 0 ? _a : Date.UTC(2026, 8, 29, 10, 0, 0);
58
+ var offline = false;
59
+ var timers = new Map();
60
+ var nextTimer = 1;
61
+ var local = (0, storage_1.memoryStorage)();
62
+ var session = (0, storage_1.memoryStorage)();
63
+ var config = (0, types_1.resolveConfig)(__assign({ property: 'test', endpoint: '/collect', experimentsEndpoint: '/experiments' }, options.config));
64
+ var keys = (0, types_1.storageKeys)(config.storagePrefix);
65
+ if (options.consent) {
66
+ local.set(keys.consent, options.consent);
67
+ local.set(keys.consentVersion, String(config.consentVersion));
68
+ }
69
+ if (options.vid)
70
+ local.set(keys.vid, options.vid);
71
+ Object.entries((_b = options.seed) !== null && _b !== void 0 ? _b : {}).forEach(function (_a) {
72
+ var k = _a[0], v = _a[1];
73
+ return local.set(k, v);
74
+ });
75
+ var page = __assign({ origin: 'https://example.com', path: '/', search: '', title: 'Example', referrer: '', lang: 'en-US', viewport: [1440, 900], device: 'desktop' }, options.page);
76
+ var sent = [];
77
+ var tracker = new tracker_1.Tracker(config, {
78
+ local: local,
79
+ session: session,
80
+ now: function () { return clock; },
81
+ setTimer: function (fn, ms) {
82
+ var id = nextTimer++;
83
+ timers.set(id, { at: clock + ms, fn: fn });
84
+ return id;
85
+ },
86
+ clearTimer: function (h) { return void timers.delete(h); },
87
+ page: function () { return page; },
88
+ transport: {
89
+ send: function (body, mode) { return __awaiter(void 0, void 0, void 0, function () {
90
+ return __generator(this, function (_a) {
91
+ if (offline)
92
+ return [2 /*return*/, false];
93
+ sent.push({ batch: JSON.parse(body), mode: mode });
94
+ return [2 /*return*/, true];
95
+ });
96
+ }); },
97
+ },
98
+ fetchJson: function () { return __awaiter(void 0, void 0, void 0, function () {
99
+ return __generator(this, function (_a) {
100
+ if (!options.experiments || options.experiments === 'fail')
101
+ throw new Error('no experiments endpoint');
102
+ return [2 /*return*/, { experiments: typeof options.experiments === 'function' ? options.experiments() : options.experiments }];
103
+ });
104
+ }); },
105
+ });
106
+ var advance = function (ms) { return __awaiter(void 0, void 0, void 0, function () {
107
+ var until, due;
108
+ return __generator(this, function (_a) {
109
+ switch (_a.label) {
110
+ case 0:
111
+ until = clock + ms;
112
+ _a.label = 1;
113
+ case 1:
114
+ due = Array.from(timers.entries()).filter(function (_a) {
115
+ var t = _a[1];
116
+ return t.at <= until;
117
+ }).sort(function (a, b) { return a[1].at - b[1].at; })[0];
118
+ if (!due)
119
+ return [3 /*break*/, 4];
120
+ timers.delete(due[0]);
121
+ clock = Math.max(clock, due[1].at);
122
+ due[1].fn();
123
+ return [4 /*yield*/, Promise.resolve()];
124
+ case 2:
125
+ _a.sent();
126
+ _a.label = 3;
127
+ case 3: return [3 /*break*/, 1];
128
+ case 4:
129
+ clock = until;
130
+ return [4 /*yield*/, new Promise(function (r) { return setTimeout(r, 0); })];
131
+ case 5:
132
+ _a.sent();
133
+ return [2 /*return*/];
134
+ }
135
+ });
136
+ }); };
137
+ return { tracker: tracker, sent: sent, local: local, session: session, keys: keys, page: page, advance: advance, now: function () { return clock; }, setOffline: function (o) { return (offline = o); } };
138
+ };
139
+ exports.createMemoryTracker = createMemoryTracker;
140
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/tracking/testing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { IExperimentEntry, TExperimentActionResult } from './types';
2
+ type TMaybeAsync<T = unknown> = T | Promise<T>;
3
+ export interface IExperimentCardProps {
4
+ /** The experiment key (`data-experiment` of `<Experiment>`). */
5
+ experimentKey: string;
6
+ /** The server's experiment and its results; absent while the test is not on the server. */
7
+ test?: IExperimentEntry | null;
8
+ /** The card's title. Default: the experiment's name, else its key. */
9
+ name?: string;
10
+ /** The version this page shows now: its row takes the info colour (and `aria-current`). */
11
+ shown?: string;
12
+ /** The versions the page's code renders (`data-variants`); a server version outside it cannot be shown. */
13
+ codeVariants?: string[];
14
+ /** The room the card has (px): the versions scroll inside when it is short. */
15
+ maxHeight?: number;
16
+ /** Why the list could not be loaded (the analytics service cannot be reached). */
17
+ loadError?: string | null;
18
+ /** An "Open in …" link at the start of the footer (a new tab). */
19
+ detailsUrl?: string | null;
20
+ /** The link's label. Default `Open in admin portal`. */
21
+ detailsLabel?: string;
22
+ /** One version's analytics (a new tab): a "Show analytics" action on each row; none without it. */
23
+ versionDetailsUrl?: (variant: string) => string | null | undefined;
24
+ /** Where the full analytics live, in the help's words. Default `the admin portal`. */
25
+ analyticsLabel?: string;
26
+ /** Best first (conversion on the primary metric, then visitors). Default true. */
27
+ sort?: boolean;
28
+ /** The words for a test that is in the page's code but not set up in the analytics service yet. */
29
+ notSetUpText?: string;
30
+ /** Who removed a version, in words, by the history's `actor` (`{ 'landing-editor': 'in the editor' }`). */
31
+ actorLabels?: Record<string, string>;
32
+ /** Asks before Accept, Remove, Start, Pause and Stop (Reqore's confirm dialog). Default true. */
33
+ confirm?: boolean;
34
+ /** A notification after each action (what happened, or the server's error). Default true. */
35
+ notify?: boolean;
36
+ /** A click (or Enter / Space) on a version's row: show that version on this page. Rows are not clickable without it. */
37
+ onShow?: (variant: string) => void;
38
+ /** Each action appears only when its callback is given; a returned promise shows the button busy until it settles. */
39
+ onAccept?: (variant: string) => TMaybeAsync<TExperimentActionResult | unknown>;
40
+ onRemove?: (variant: string) => TMaybeAsync<TExperimentActionResult | unknown>;
41
+ onStart?: () => TMaybeAsync;
42
+ onPause?: () => TMaybeAsync;
43
+ onStop?: () => TMaybeAsync;
44
+ /** The ✕ in the header. */
45
+ onClose?: () => void;
46
+ }
47
+ /**
48
+ * One A/B test: its name and status, the verdict in plain words, one row per version (visitors,
49
+ * conversion, chance to beat the original, a bar; click a row to show that version; Accept, and
50
+ * Remove at the far end), and the test's own controls (Start / Resume, Pause, Stop) with an
51
+ * optional link to its details. Driven only by props: no requests of its own.
52
+ */
53
+ export declare const ExperimentCard: ({ experimentKey, test, name, shown, codeVariants, maxHeight, loadError, detailsUrl, detailsLabel, versionDetailsUrl, analyticsLabel, sort, notSetUpText, actorLabels, confirm, notify, onShow, onAccept, onRemove, onStart, onPause, onStop, onClose, }: IExperimentCardProps) => import("react/jsx-runtime").JSX.Element;
54
+ export {};
55
+ //# sourceMappingURL=ExperimentCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExperimentCard.d.ts","sourceRoot":"","sources":["../../../src/tracking/ui/ExperimentCard.tsx"],"names":[],"mappings":"AAkDA,OAAO,KAAK,EAAE,gBAAgB,EAAqB,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAE5F,KAAK,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE/C,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,2FAA2F;IAC3F,IAAI,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2GAA2G;IAC3G,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mGAAmG;IACnG,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACnE,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mGAAmG;IACnG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2GAA2G;IAC3G,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,iGAAiG;IACjG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wHAAwH;IACxH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,sHAAsH;IACtH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC,uBAAuB,GAAG,OAAO,CAAC,CAAC;IAC/E,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC,uBAAuB,GAAG,OAAO,CAAC,CAAC;IAC/E,OAAO,CAAC,EAAE,MAAM,WAAW,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,WAAW,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,WAAW,CAAC;IAC3B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAoCD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,4PAwBxB,oBAAoB,4CAiatB,CAAC"}
@@ -0,0 +1,340 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
54
+ return (mod && mod.__esModule) ? mod : { "default": mod };
55
+ };
56
+ Object.defineProperty(exports, "__esModule", { value: true });
57
+ exports.ExperimentCard = void 0;
58
+ var jsx_runtime_1 = require("react/jsx-runtime");
59
+ var reqore_1 = require("@qoretechnologies/reqore");
60
+ var polished_1 = require("polished");
61
+ var react_1 = require("react");
62
+ var styled_components_1 = __importDefault(require("styled-components"));
63
+ var anchor_1 = require("./anchor");
64
+ var card_1 = require("./card");
65
+ // Solid tags: a badge with only an intent is a minimal tag, unreadable on a light theme.
66
+ var solid = function (intent) { return ({
67
+ gradient: { colors: { 0: intent, 100: "".concat(intent, ":darken:1") } },
68
+ weight: 'bold',
69
+ }); };
70
+ var ROW_GAP = 6;
71
+ // Layout only: the versions scroll inside the card past three and a half rows.
72
+ var StyledVersions = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: flex;\n flex-direction: column;\n gap: ", "px;\n max-height: ", ";\n overflow-y: ", ";\n overflow-x: hidden;\n overscroll-behavior: contain;\n min-width: 0;\n\n /* The rows take the card's width, never their content's, padding included: a host page\n without a global border-box reset would otherwise push each row past the card's edge. */\n > * {\n min-width: 0;\n }\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n"], ["\n display: flex;\n flex-direction: column;\n gap: ", "px;\n max-height: ", ";\n overflow-y: ", ";\n overflow-x: hidden;\n overscroll-behavior: contain;\n min-width: 0;\n\n /* The rows take the card's width, never their content's, padding included: a host page\n without a global border-box reset would otherwise push each row past the card's edge. */\n > * {\n min-width: 0;\n }\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n"])), ROW_GAP, function (_a) {
73
+ var $max = _a.$max;
74
+ return ($max ? "".concat($max, "px") : 'none');
75
+ }, function (_a) {
76
+ var $max = _a.$max;
77
+ return ($max ? 'auto' : 'visible');
78
+ });
79
+ /** Header, verdict and footer take about this much of `maxHeight`; the versions get the rest. */
80
+ var CHROME_HEIGHT = 230;
81
+ /**
82
+ * One A/B test: its name and status, the verdict in plain words, one row per version (visitors,
83
+ * conversion, chance to beat the original, a bar; click a row to show that version; Accept, and
84
+ * Remove at the far end), and the test's own controls (Start / Resume, Pause, Stop) with an
85
+ * optional link to its details. Driven only by props: no requests of its own.
86
+ */
87
+ var ExperimentCard = function (_a) {
88
+ var experimentKey = _a.experimentKey, test = _a.test, name = _a.name, shown = _a.shown, _b = _a.codeVariants, codeVariants = _b === void 0 ? [] : _b, maxHeight = _a.maxHeight, loadError = _a.loadError, detailsUrl = _a.detailsUrl, _c = _a.detailsLabel, detailsLabel = _c === void 0 ? 'Open in admin portal' : _c, versionDetailsUrl = _a.versionDetailsUrl, _d = _a.analyticsLabel, analyticsLabel = _d === void 0 ? 'the admin portal' : _d, _e = _a.sort, sort = _e === void 0 ? true : _e, notSetUpText = _a.notSetUpText, actorLabels = _a.actorLabels, _f = _a.confirm, confirm = _f === void 0 ? true : _f, _g = _a.notify, notify = _g === void 0 ? true : _g, onShow = _a.onShow, onAccept = _a.onAccept, onRemove = _a.onRemove, onStart = _a.onStart, onPause = _a.onPause, onStop = _a.onStop, onClose = _a.onClose;
89
+ var entry = test !== null && test !== void 0 ? test : undefined;
90
+ var confirmAction = (0, reqore_1.useReqoreProperty)('confirmAction');
91
+ var addNotification = (0, reqore_1.useReqoreProperty)('addNotification');
92
+ var theme = (0, reqore_1.useReqoreTheme)();
93
+ var light = (function () {
94
+ try {
95
+ return (0, polished_1.getLuminance)(theme.main) > 0.5;
96
+ }
97
+ catch (_a) {
98
+ return false;
99
+ }
100
+ })();
101
+ var _h = (0, react_1.useState)(null), busy = _h[0], setBusy = _h[1];
102
+ var _j = (0, react_1.useState)(false), helpOpen = _j[0], setHelpOpen = _j[1];
103
+ var _k = (0, react_1.useState)(0), rowHeight = _k[0], setRowHeight = _k[1];
104
+ var firstRow = (0, react_1.useRef)(null);
105
+ var mounted = (0, react_1.useRef)(true);
106
+ (0, react_1.useEffect)(function () { return function () {
107
+ mounted.current = false;
108
+ }; }, []);
109
+ var unreachable = !entry && !!loadError;
110
+ var codeKey = codeVariants.join(',');
111
+ // The order is decided when the data arrives (a refresh), never while the user works in the card.
112
+ var order = (0, react_1.useMemo)(function () {
113
+ var all = (0, card_1.versionRows)(entry, codeVariants);
114
+ return (sort ? (0, card_1.sortVersionRows)(all) : all).map(function (r) { return r.key; });
115
+ // `codeVariants` is followed by its keys, not its identity.
116
+ }, [entry, codeKey, sort]);
117
+ var unsorted = (0, card_1.versionRows)(entry, codeVariants);
118
+ var rows = order
119
+ .map(function (key) { return unsorted.find(function (r) { return r.key === key; }); })
120
+ .filter(Boolean)
121
+ .concat(unsorted.filter(function (r) { return !order.includes(r.key); }));
122
+ var leader = (0, card_1.leadingVersion)(entry, rows);
123
+ var bars = (0, card_1.barValues)(rows);
124
+ var metric = (0, card_1.primaryMetric)(entry === null || entry === void 0 ? void 0 : entry.results);
125
+ var status = entry === null || entry === void 0 ? void 0 : entry.experiment.status;
126
+ var title = name || (entry === null || entry === void 0 ? void 0 : entry.experiment.name) || experimentKey;
127
+ var tag = (0, card_1.statusTag)(entry, unreachable);
128
+ var note = (0, card_1.phaseNote)(entry, actorLabels);
129
+ var busyOn = function (action, variant) {
130
+ if (variant === void 0) { variant = ''; }
131
+ return busy === "".concat(action, ":").concat(variant);
132
+ };
133
+ (0, react_1.useLayoutEffect)(function () {
134
+ var _a, _b;
135
+ var h = (_b = (_a = firstRow.current) === null || _a === void 0 ? void 0 : _a.offsetHeight) !== null && _b !== void 0 ? _b : 0;
136
+ if (h && h !== rowHeight)
137
+ setRowHeight(h);
138
+ });
139
+ // A row's height changes with the card's width (a phone, a resized window): measure it again.
140
+ (0, react_1.useEffect)(function () {
141
+ var el = firstRow.current;
142
+ if (!el || typeof ResizeObserver === 'undefined')
143
+ return undefined;
144
+ var ro = new ResizeObserver(function () { return setRowHeight(el.offsetHeight); });
145
+ ro.observe(el);
146
+ return function () { return ro.disconnect(); };
147
+ }, []);
148
+ // Minimal buttons tint their text from the intent, too pale on a light theme: a deeper shade there.
149
+ var quiet = function (intent) { return (__assign({ minimal: true }, (light && intent ?
150
+ {
151
+ effect: { color: "".concat(intent, ":darken:2"), weight: 'thick' },
152
+ iconColor: "".concat(intent, ":darken:2"),
153
+ }
154
+ : {}))); };
155
+ var act = function (action, variant) {
156
+ if (!entry)
157
+ return;
158
+ var callbacks = {
159
+ accept: onAccept,
160
+ remove: onRemove,
161
+ start: onStart,
162
+ pause: onPause,
163
+ stop: onStop,
164
+ };
165
+ var callback = callbacks[action];
166
+ if (!callback)
167
+ return;
168
+ var isVersion = action === 'accept' || action === 'remove';
169
+ var copy = isVersion ? (0, card_1.confirmCopy)(action, entry, variant) : (0, card_1.lifecycleCopy)(action, entry);
170
+ var titles = {
171
+ accept: ['Winner accepted', 'Could not accept'],
172
+ remove: ['Version removed', 'Could not remove'],
173
+ start: [status === 'paused' ? 'Test resumed' : 'Test started', 'Could not start'],
174
+ pause: ['Test paused', 'Could not pause'],
175
+ stop: ['Test stopped', 'Could not stop'],
176
+ };
177
+ var run = function () { return __awaiter(void 0, void 0, void 0, function () {
178
+ var result, content, err_1;
179
+ var _a;
180
+ return __generator(this, function (_b) {
181
+ switch (_b.label) {
182
+ case 0:
183
+ setBusy("".concat(action, ":").concat(variant !== null && variant !== void 0 ? variant : ''));
184
+ _b.label = 1;
185
+ case 1:
186
+ _b.trys.push([1, 3, 4, 5]);
187
+ return [4 /*yield*/, callback(variant)];
188
+ case 2:
189
+ result = _b.sent();
190
+ if (notify) {
191
+ content = isVersion ?
192
+ (0, card_1.actionOutcome)(action, result, variant)
193
+ : "\u201C".concat(title, "\u201D is ").concat(action === 'start' ? 'running'
194
+ : action === 'pause' ? 'paused'
195
+ : 'stopped', ".");
196
+ addNotification === null || addNotification === void 0 ? void 0 : addNotification({
197
+ intent: 'success',
198
+ title: titles[action][0],
199
+ content: content,
200
+ duration: 8000,
201
+ });
202
+ }
203
+ return [3 /*break*/, 5];
204
+ case 3:
205
+ err_1 = _b.sent();
206
+ if (notify) {
207
+ addNotification === null || addNotification === void 0 ? void 0 : addNotification({
208
+ intent: 'danger',
209
+ title: titles[action][1],
210
+ content: (_a = err_1 === null || err_1 === void 0 ? void 0 : err_1.message) !== null && _a !== void 0 ? _a : String(err_1),
211
+ duration: 10000,
212
+ });
213
+ }
214
+ return [3 /*break*/, 5];
215
+ case 4:
216
+ if (mounted.current)
217
+ setBusy(null);
218
+ return [7 /*endfinally*/];
219
+ case 5: return [2 /*return*/];
220
+ }
221
+ });
222
+ }); };
223
+ if (confirm && confirmAction) {
224
+ confirmAction({
225
+ title: copy.title,
226
+ description: copy.description,
227
+ confirmLabel: copy.confirmLabel,
228
+ confirmButtonIntent: action === 'accept' || action === 'start' ? 'success'
229
+ : action === 'pause' ? 'warning'
230
+ : 'danger',
231
+ onConfirm: function () { return void run(); },
232
+ });
233
+ }
234
+ else {
235
+ void run();
236
+ }
237
+ };
238
+ var footer = [];
239
+ if (detailsUrl) {
240
+ footer.push(__assign(__assign({ position: 'left', icon: 'ExternalLinkLine', label: detailsLabel, responsive: false }, quiet()), { tooltip: 'This test’s details (a new tab)', onClick: function () { return window.open(detailsUrl, '_blank', 'noopener'); } }));
241
+ }
242
+ if (entry && status) {
243
+ // Every button in the card is minimal, except Start test / Resume: the one primary action.
244
+ if (onStart && (0, card_1.canStart)(status)) {
245
+ footer.push({
246
+ position: 'right',
247
+ icon: 'PlayLine',
248
+ intent: 'success',
249
+ label: status === 'paused' ? 'Resume' : 'Start test',
250
+ responsive: false,
251
+ disabled: !!busy,
252
+ loading: busyOn('start'),
253
+ tooltip: status === 'paused' ?
254
+ 'Split visitors between the versions again'
255
+ : 'Start splitting visitors between the versions and counting',
256
+ onClick: function () { return act('start'); },
257
+ });
258
+ }
259
+ if (onPause && (0, card_1.canPause)(status)) {
260
+ footer.push(__assign(__assign({ position: 'right', icon: 'PauseLine', intent: 'warning', label: 'Pause', responsive: false }, quiet('warning')), { disabled: !!busy, loading: busyOn('pause'), tooltip: 'Everybody sees the original until you resume', onClick: function () { return act('pause'); } }));
261
+ }
262
+ if (onStop && (0, card_1.canStop)(status)) {
263
+ footer.push(__assign(__assign({ position: 'right', icon: 'StopLine', intent: 'danger', label: 'Stop', responsive: false }, quiet('danger')), { disabled: !!busy, loading: busyOn('stop'), tooltip: 'End the test without a winner', onClick: function () { return act('stop'); } }));
264
+ }
265
+ }
266
+ var accept = status ? (0, card_1.canAccept)(status) : false;
267
+ var remove = status ? (0, card_1.canRemove)(status, rows.length) : false;
268
+ var listMax = (0, card_1.versionsMaxHeight)({
269
+ rows: rows.length,
270
+ rowHeight: rowHeight,
271
+ gap: ROW_GAP,
272
+ available: maxHeight ? Math.max(rowHeight, maxHeight - CHROME_HEIGHT) : undefined,
273
+ });
274
+ return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqorePanel, { className: 'reqraft-experiment-card', label: title, icon: 'FlaskLine', badge: { label: tag.label, icon: tag.icon, effect: solid(tag.intent) }, size: 'small', rounded: true, flat: false, padded: true, collapsible: false, onClose: onClose, closeTooltip: 'Close (Esc)', closeButtonProps: { 'aria-label': 'Close the test card', minimal: true }, actions: [
275
+ {
276
+ icon: 'QuestionLine',
277
+ minimal: true,
278
+ flat: true,
279
+ tooltip: 'How A/B tests work',
280
+ 'aria-label': 'How A/B tests work',
281
+ onClick: function () { return setHelpOpen(true); },
282
+ },
283
+ ], bottomActions: footer.length ? footer : undefined, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreCallout, { size: 'small', flat: true, icon: 'LineChartLine', intent: unreachable ? 'warning' : (0, card_1.verdictIntent)(entry), effect: { weight: 500 }, children: (0, card_1.verdictLine)(entry, { unreachable: unreachable, notSetUpText: notSetUpText }) }), note && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 6 }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreP, { size: 'small', effect: { opacity: 0.7 }, children: note })] })), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 10 }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreP, { size: 'small', effect: { opacity: 0.75, weight: 500 }, children: "".concat(rows.length, " versions").concat((metric === null || metric === void 0 ? void 0 : metric.name) ? " \u00B7 goal: \u201C".concat(metric.name, "\u201D") : '') }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 6 }), (0, jsx_runtime_1.jsx)(StyledVersions, { "$max": listMax, role: 'list', "aria-label": 'Versions', className: 'reqraft-experiment-versions', children: rows.map(function (r, i) {
284
+ var isShown = r.key === shown;
285
+ var badges = [];
286
+ if ((leader === null || leader === void 0 ? void 0 : leader.key) === r.key) {
287
+ badges.push(leader.kind === 'winner' ?
288
+ { label: 'Winner', icon: 'TrophyLine', effect: solid('success') }
289
+ : { label: 'Leading', icon: 'ArrowUpLine', effect: solid('success') });
290
+ }
291
+ if (r.control)
292
+ badges.push({ label: 'Original', icon: 'HomeLine' });
293
+ if (!r.inCode)
294
+ badges.push({ label: 'Not in the code', icon: 'AlertLine', effect: solid('warning') });
295
+ // The whole row shows its version; Accept and Remove stop the click (Reqore's row actions do).
296
+ var showable = !!onShow && r.inCode && !isShown;
297
+ var actions = [];
298
+ var analytics = entry ? versionDetailsUrl === null || versionDetailsUrl === void 0 ? void 0 : versionDetailsUrl(r.key) : null;
299
+ if (analytics) {
300
+ actions.push(__assign(__assign({ size: 'small', icon: 'BarChartBoxLine', intent: 'info' }, quiet('info')), { tooltip: "Show analytics for \u201C".concat(r.name, "\u201D (a new tab)"), 'aria-label': "Show analytics for ".concat(r.name), onClick: function () { return window.open(analytics, '_blank', 'noopener'); } }));
301
+ }
302
+ if (entry && onAccept) {
303
+ actions.push(__assign(__assign({ size: 'small', icon: 'TrophyLine', intent: 'success', label: 'Accept' }, quiet('success')), { disabled: !accept || !!busy, loading: busyOn('accept', r.key), tooltip: accept ?
304
+ "End the test: every visitor sees \u201C".concat(r.name, "\u201D")
305
+ : 'Only a started test can be accepted', onClick: function () { return act('accept', r.key); } }));
306
+ }
307
+ if (entry && onRemove) {
308
+ actions.push(__assign(__assign({ size: 'small', icon: 'DeleteBinLine', intent: 'danger' }, quiet('danger')), { 'aria-label': "Remove version ".concat(r.name),
309
+ // At the far end of the row, away from Accept, so it is not clicked by accident.
310
+ style: { marginLeft: 'auto' }, disabled: !remove || !!busy, loading: busyOn('remove', r.key), tooltip: remove ?
311
+ "Remove version: drop \u201C".concat(r.name, "\u201D from the test")
312
+ : 'This version cannot be removed now', onClick: function () { return act('remove', r.key); } }));
313
+ }
314
+ return ((0, jsx_runtime_1.jsx)("div", { role: 'listitem', ref: i === 0 ? firstRow : undefined, "data-version": r.key, "aria-current": isShown || undefined, children: (0, jsx_runtime_1.jsx)(reqore_1.ReqoreEntityRow, __assign({ size: 'small', rounded: true, flat: !isShown, intent: isShown ? 'info' : undefined, label: r.name, badge: badges, description: (0, card_1.numbersLine)(r, metric === null || metric === void 0 ? void 0 : metric.name, status), metadata: r.visitors ?
315
+ (0, jsx_runtime_1.jsx)(reqore_1.ReqoreProgress, { value: bars[i], size: 'tiny', rounded: true, flat: true, style: { width: '100%', minWidth: 160 }, intent: isShown ? 'info'
316
+ : r.control ?
317
+ 'muted'
318
+ : 'success', "aria-label": "".concat(r.name, ": conversion compared with the best version") })
319
+ : undefined, iconHasBackground: false, showIcon: false, actions: actions.length ? actions : undefined }, (showable ?
320
+ {
321
+ role: 'button',
322
+ tabIndex: 0,
323
+ 'aria-label': "Show \u201C".concat(r.name, "\u201D on this page"),
324
+ tooltip: "Show \u201C".concat(r.name, "\u201D on this page (only here, never counted)"),
325
+ onClick: function () { return onShow(r.key); },
326
+ onKeyDown: function (e) {
327
+ if (!(0, anchor_1.activatesRow)(e.key, e.target === e.currentTarget))
328
+ return;
329
+ e.preventDefault();
330
+ onShow(r.key);
331
+ },
332
+ }
333
+ : {}))) }, r.key));
334
+ }) }), !entry && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 8 }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreP, { size: 'small', effect: { opacity: 0.7 }, children: unreachable ?
335
+ 'Start, Accept and Remove come back once the analytics service answers.'
336
+ : 'Start, Accept and Remove appear once the test is set up.' })] })), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreModal, { isOpen: helpOpen, onClose: function () { return setHelpOpen(false); }, label: 'How A/B tests work', icon: 'QuestionLine', width: '640px', blur: 2, className: 'reqraft-experiment-help', children: (0, card_1.helpSections)(entry, analyticsLabel).map(function (section) { return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreH4, { children: section.title }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 4 }), section.paragraphs.map(function (text) { return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreP, { size: 'small', effect: { weight: 500 }, children: text }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 6 })] }, text)); }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreVerticalSpacer, { height: 14 })] }, section.title)); }) })] }));
337
+ };
338
+ exports.ExperimentCard = ExperimentCard;
339
+ var templateObject_1;
340
+ //# sourceMappingURL=ExperimentCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExperimentCard.js","sourceRoot":"","sources":["../../../src/tracking/ui/ExperimentCard.tsx"],"names":[],"mappings":"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"}