@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,87 @@
1
+ /**
2
+ * What the A/B test card shows, as plain functions of the qorus-api objects: the version rows,
3
+ * the verdict, the numbers line, the bars, the status tag, which actions a status allows, and
4
+ * the words of the confirm step and of the outcome. No React, no DOM (unit-tested in
5
+ * `__tests__/tracking/card.test.ts`).
6
+ */
7
+ import type { IExperimentEntry, IExperimentResults, TExperimentActionResult, TExperimentStatus, TLifecycleAction, TVersionAction } from './types';
8
+ export declare const canAccept: (status: TExperimentStatus) => boolean;
9
+ /** Start a draft, or resume a paused test. */
10
+ export declare const canStart: (status: TExperimentStatus) => boolean;
11
+ export declare const canPause: (status: TExperimentStatus) => boolean;
12
+ export declare const canStop: (status: TExperimentStatus) => boolean;
13
+ export declare const canRemove: (status: TExperimentStatus, versions: number) => boolean;
14
+ export interface IVersionRow {
15
+ key: string;
16
+ name: string;
17
+ control: boolean;
18
+ /** Visitors exposed in the current phase (null: no numbers yet). */
19
+ visitors: number | null;
20
+ /** Conversion on the primary metric, 0..1. */
21
+ conversion: number | null;
22
+ /** Chance to beat the original on the primary metric, 0..1 (null for the original). */
23
+ chance: number | null;
24
+ /** The page's code renders it (false: the server has a version the code does not, so it cannot be shown). */
25
+ inCode: boolean;
26
+ }
27
+ export declare const primaryMetric: (results: IExperimentResults | null | undefined) => import("./types").IResultsMetric;
28
+ export declare const versionName: (key: string) => string;
29
+ /**
30
+ * One row per version. Keys come from the server's experiment when there is one, otherwise from
31
+ * the page's code (`codeVariants`, the `data-variants` of `<Experiment>`): a test that exists
32
+ * only in code can still be switched.
33
+ */
34
+ export declare const versionRows: (entry: IExperimentEntry | undefined, codeVariants?: string[]) => IVersionRow[];
35
+ /** The verdict in plain words: the server's sentence when it sends one. */
36
+ export declare const verdictLine: (entry: IExperimentEntry | undefined) => string;
37
+ export declare const percent: (n: number | null | undefined, digits?: number) => string;
38
+ export declare const count: (n: number | null | undefined) => string;
39
+ /**
40
+ * One line of numbers under a version: visitors, conversion, chance to beat the original. In
41
+ * words when there is nothing to count yet, never a row of dashes.
42
+ */
43
+ export declare const numbersLine: (row: IVersionRow, metricName?: string, status?: TExperimentStatus) => string;
44
+ /** Each version's bar: its conversion as a share of the best one (0..100; 0 with no numbers). */
45
+ export declare const barValues: (rows: IVersionRow[]) => number[];
46
+ /** The verdict's colour: green for a likely winner, amber for likely losers, neutral otherwise. */
47
+ export declare const verdictIntent: (entry: IExperimentEntry | undefined) => 'success' | 'warning' | 'info' | 'muted';
48
+ export declare const STATUS_LABEL: Record<TExperimentStatus, string>;
49
+ export type TStatusIntent = 'success' | 'warning' | 'danger' | 'muted';
50
+ /** The status tag: its words (with the phase after a removal), its icon and its colour. */
51
+ export declare const statusTag: (entry: IExperimentEntry | undefined) => {
52
+ label: string;
53
+ icon: string;
54
+ intent: TStatusIntent;
55
+ };
56
+ export interface IConfirmCopy {
57
+ title: string;
58
+ description: string;
59
+ confirmLabel: string;
60
+ }
61
+ /** What the confirm step says before Accept / Remove. */
62
+ export declare const confirmCopy: (action: TVersionAction, entry: IExperimentEntry, variant: string) => IConfirmCopy;
63
+ /** What the confirm step says before Start / Pause / Stop. */
64
+ export declare const lifecycleCopy: (action: TLifecycleAction, entry: IExperimentEntry) => IConfirmCopy;
65
+ /** The notification after Accept / Remove. */
66
+ export declare const actionOutcome: (action: TVersionAction, result: TExperimentActionResult | null | undefined, variant: string) => string;
67
+ /**
68
+ * Why the numbers restarted: the current phase began when a version was removed. Null in the
69
+ * first phase. `actorLabels` names who removed it (`{ 'landing-editor': 'in the editor' }`).
70
+ */
71
+ export declare const phaseNote: (entry: IExperimentEntry | undefined, actorLabels?: Record<string, string>) => string | null;
72
+ /** The note on an element whose test has ended. */
73
+ export declare const winnerNote: (entry: IExperimentEntry | undefined, shown: string) => string;
74
+ /** Versions visible before the list scrolls: three and a half, so the half row says "there is more". */
75
+ export declare const VISIBLE_VERSIONS = 3.5;
76
+ /**
77
+ * The versions list's height cap (px): 3.5 rows, or less when the card has less room
78
+ * (`available`, what is left after the header, verdict and footer), never under one row.
79
+ * Null when every row fits (no cap, no scrolling).
80
+ */
81
+ export declare const versionsMaxHeight: ({ rows, rowHeight, gap, available, }: {
82
+ rows: number;
83
+ rowHeight: number;
84
+ gap: number;
85
+ available?: number;
86
+ }) => number | null;
87
+ //# sourceMappingURL=card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../../src/tracking/ui/card.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,287 @@
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.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.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
+ var verdictLine = function (entry) {
66
+ var _a;
67
+ if (!entry)
68
+ return 'This test is not set up on the server yet: you can switch versions here, but there are no numbers.';
69
+ var e = entry.experiment, results = entry.results;
70
+ if (results === null || results === void 0 ? void 0 : results.verdict_text)
71
+ return results.verdict_text;
72
+ if (e.status === 'concluded')
73
+ return "Finished: ".concat(nameOf(entry, e.winner), " won, and every visitor now sees it.");
74
+ if (e.status === 'draft')
75
+ return 'Not started yet: press Start test to split visitors between the versions.';
76
+ if (!results)
77
+ return 'No numbers yet.';
78
+ var control = (_a = e.variants.find(function (v) { return v.control; })) === null || _a === void 0 ? void 0 : _a.key;
79
+ switch (results.verdict) {
80
+ case 'likely-winner':
81
+ return "".concat(nameOf(entry, results.winner_variant), " is likely better than ").concat(nameOf(entry, control), ".");
82
+ case 'likely-loser':
83
+ return "The new versions are likely worse than ".concat(nameOf(entry, control), ".");
84
+ case 'no-clear-difference':
85
+ return 'No clear difference between the versions yet.';
86
+ default:
87
+ return 'Too early to tell.';
88
+ }
89
+ };
90
+ exports.verdictLine = verdictLine;
91
+ var percent = function (n, digits) {
92
+ if (digits === void 0) { digits = 1; }
93
+ return n == null || !Number.isFinite(n) ? '–' : "".concat((n * 100).toFixed(digits).replace(/\.0$/, ''), "%");
94
+ };
95
+ exports.percent = percent;
96
+ var count = function (n) {
97
+ return n == null ? '–' : n.toLocaleString('en-US');
98
+ };
99
+ exports.count = count;
100
+ /**
101
+ * One line of numbers under a version: visitors, conversion, chance to beat the original. In
102
+ * words when there is nothing to count yet, never a row of dashes.
103
+ */
104
+ var numbersLine = function (row, metricName, status) {
105
+ if (!row.visitors) {
106
+ if (status === 'draft')
107
+ return 'Not started: no visitors yet';
108
+ return row.visitors === 0 ? 'No visitors yet' : 'No numbers yet';
109
+ }
110
+ var parts = [
111
+ "".concat((0, exports.count)(row.visitors), " visitors"),
112
+ "".concat((0, exports.percent)(row.conversion), " ").concat(metricName ? "\u201C".concat(metricName, "\u201D") : 'conversion'),
113
+ ];
114
+ if (!row.control && row.chance != null)
115
+ parts.push("".concat((0, exports.percent)(row.chance, 0), " chance to beat the original"));
116
+ return parts.join(' · ');
117
+ };
118
+ exports.numbersLine = numbersLine;
119
+ /** Each version's bar: its conversion as a share of the best one (0..100; 0 with no numbers). */
120
+ var barValues = function (rows) {
121
+ 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));
122
+ return rows.map(function (r) { return (best > 0 && r.conversion ? Math.round((r.conversion / best) * 100) : 0); });
123
+ };
124
+ exports.barValues = barValues;
125
+ /** The verdict's colour: green for a likely winner, amber for likely losers, neutral otherwise. */
126
+ var verdictIntent = function (entry) {
127
+ var _a;
128
+ if (!entry)
129
+ return 'muted';
130
+ if (entry.experiment.status === 'concluded')
131
+ return 'success';
132
+ var v = (_a = entry.results) === null || _a === void 0 ? void 0 : _a.verdict;
133
+ return (v === 'likely-winner' ? 'success'
134
+ : v === 'likely-loser' ? 'warning'
135
+ : 'info');
136
+ };
137
+ exports.verdictIntent = verdictIntent;
138
+ exports.STATUS_LABEL = {
139
+ draft: 'Draft',
140
+ running: 'Running',
141
+ paused: 'Paused',
142
+ stopped: 'Stopped',
143
+ concluded: 'Ended',
144
+ archived: 'Archived',
145
+ };
146
+ /** The status tag: its words (with the phase after a removal), its icon and its colour. */
147
+ var statusTag = function (entry) {
148
+ var _a;
149
+ if (!entry)
150
+ return { label: 'Not on the server', icon: 'QuestionLine', intent: 'muted' };
151
+ var _b = entry.experiment, status = _b.status, phase = _b.phase;
152
+ var label = "".concat((_a = exports.STATUS_LABEL[status]) !== null && _a !== void 0 ? _a : status).concat(phase && phase > 1 ? " \u00B7 phase ".concat(phase) : '');
153
+ switch (status) {
154
+ case 'running':
155
+ return { label: label, icon: 'PlayCircleLine', intent: 'success' };
156
+ case 'paused':
157
+ return { label: label, icon: 'PauseCircleLine', intent: 'warning' };
158
+ case 'draft':
159
+ return { label: label, icon: 'PencilRulerLine', intent: 'muted' };
160
+ case 'stopped':
161
+ return { label: label, icon: 'StopCircleLine', intent: 'danger' };
162
+ default:
163
+ return { label: label, icon: 'TrophyLine', intent: 'success' };
164
+ }
165
+ };
166
+ exports.statusTag = statusTag;
167
+ /** What the confirm step says before Accept / Remove. */
168
+ var confirmCopy = function (action, entry, variant) {
169
+ var name = nameOf(entry, variant);
170
+ if (action === 'accept') {
171
+ return {
172
+ title: "Make \u201C".concat(name, "\u201D the winner?"),
173
+ description: "This ends the test. From then on every visitor sees \u201C".concat(name, "\u201D. A developer removes the other versions' code later."),
174
+ confirmLabel: "Accept ".concat(name),
175
+ };
176
+ }
177
+ var rest = entry.experiment.variants.filter(function (v) { return v.key !== variant; });
178
+ // The server concludes the test with the last version, a draft included.
179
+ if (rest.length === 1) {
180
+ var last = nameOf(entry, rest[0].key);
181
+ return {
182
+ title: "Remove \u201C".concat(name, "\u201D?"),
183
+ 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."),
184
+ confirmLabel: "Remove and accept ".concat(last),
185
+ };
186
+ }
187
+ return {
188
+ title: "Remove \u201C".concat(name, "\u201D from the test?"),
189
+ description: entry.experiment.status === 'draft' ?
190
+ "The test will start without \u201C".concat(name, "\u201D.")
191
+ : "Nobody sees \u201C".concat(name, "\u201D any more. The test starts counting again with the remaining versions, so the numbers start from zero."),
192
+ confirmLabel: "Remove ".concat(name),
193
+ };
194
+ };
195
+ exports.confirmCopy = confirmCopy;
196
+ /** What the confirm step says before Start / Pause / Stop. */
197
+ var lifecycleCopy = function (action, entry) {
198
+ var _a;
199
+ var e = entry.experiment;
200
+ var name = e.name || e.key;
201
+ var versions = e.variants.map(function (v) { return "\u201C".concat(v.name || v.key, "\u201D"); }).join(' and ');
202
+ switch (action) {
203
+ case 'start':
204
+ return e.status === 'paused' ?
205
+ {
206
+ title: "Resume \u201C".concat(name, "\u201D?"),
207
+ description: "Visitors are split between ".concat(versions, " again and counted."),
208
+ confirmLabel: 'Resume the test',
209
+ }
210
+ : {
211
+ title: "Start \u201C".concat(name, "\u201D?"),
212
+ 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."),
213
+ confirmLabel: 'Start the test',
214
+ };
215
+ case 'pause':
216
+ return {
217
+ title: "Pause \u201C".concat(name, "\u201D?"),
218
+ 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."),
219
+ confirmLabel: 'Pause the test',
220
+ };
221
+ case 'stop':
222
+ default:
223
+ return {
224
+ title: "Stop \u201C".concat(name, "\u201D?"),
225
+ 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.',
226
+ confirmLabel: 'Stop the test',
227
+ };
228
+ }
229
+ };
230
+ exports.lifecycleCopy = lifecycleCopy;
231
+ /** The notification after Accept / Remove. */
232
+ var actionOutcome = function (action, result, variant) {
233
+ var _a, _b;
234
+ 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;
235
+ if (action === 'accept' || (result === null || result === void 0 ? void 0 : result.auto_accepted))
236
+ return "The test has ended: every visitor now sees \u201C".concat(winner, "\u201D.");
237
+ return 'The version is removed; the test goes on with the others.';
238
+ };
239
+ exports.actionOutcome = actionOutcome;
240
+ /**
241
+ * Why the numbers restarted: the current phase began when a version was removed. Null in the
242
+ * first phase. `actorLabels` names who removed it (`{ 'landing-editor': 'in the editor' }`).
243
+ */
244
+ var phaseNote = function (entry, actorLabels) {
245
+ var _a, _b, _c, _d;
246
+ if (actorLabels === void 0) { actorLabels = {}; }
247
+ var e = entry === null || entry === void 0 ? void 0 : entry.experiment;
248
+ if (!e || !e.phase || e.phase < 2)
249
+ return null;
250
+ var current = (_a = e.phases) === null || _a === void 0 ? void 0 : _a.find(function (p) { return p.phase === e.phase; });
251
+ var removed = __spreadArray([], ((_b = e.history) !== null && _b !== void 0 ? _b : []), true).reverse().find(function (h) { return h.action === 'remove-variant'; });
252
+ var who = (removed === null || removed === void 0 ? void 0 : removed.actor) && actorLabels[removed.actor] ? " ".concat(actorLabels[removed.actor]) : '';
253
+ var since = (current === null || current === void 0 ? void 0 : current.started_at) ?
254
+ new Date(current.started_at).toLocaleDateString('en-GB', {
255
+ day: 'numeric',
256
+ month: 'short',
257
+ timeZone: 'UTC',
258
+ })
259
+ : null;
260
+ var name = (removed === null || removed === void 0 ? void 0 : removed.variant) ?
261
+ (_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
262
+ : undefined;
263
+ 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, ".");
264
+ };
265
+ exports.phaseNote = phaseNote;
266
+ /** The note on an element whose test has ended. */
267
+ 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"); };
268
+ exports.winnerNote = winnerNote;
269
+ // ── how many versions fit ───────────────────────────────────────────────────────
270
+ /** Versions visible before the list scrolls: three and a half, so the half row says "there is more". */
271
+ exports.VISIBLE_VERSIONS = 3.5;
272
+ /**
273
+ * The versions list's height cap (px): 3.5 rows, or less when the card has less room
274
+ * (`available`, what is left after the header, verdict and footer), never under one row.
275
+ * Null when every row fits (no cap, no scrolling).
276
+ */
277
+ var versionsMaxHeight = function (_a) {
278
+ var rows = _a.rows, rowHeight = _a.rowHeight, gap = _a.gap, _b = _a.available, available = _b === void 0 ? Infinity : _b;
279
+ if (rows <= 0 || rowHeight <= 0)
280
+ return null;
281
+ var all = rows * rowHeight + (rows - 1) * gap;
282
+ var threeAndHalf = exports.VISIBLE_VERSIONS * rowHeight + Math.floor(exports.VISIBLE_VERSIONS) * gap;
283
+ var cap = Math.max(rowHeight, Math.min(threeAndHalf, available));
284
+ return all <= cap ? null : Math.round(cap);
285
+ };
286
+ exports.versionsMaxHeight = versionsMaxHeight;
287
+ //# 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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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The A/B test UI: `<ExperimentCard>` (one test, driven by props), `<ExperimentsOverlay>` (every
3
+ * `<Experiment>` on the page outlined, with its card anchored to it), and the optional
4
+ * `useExperimentsAdmin` / `createExperimentsAdminClient` for the qorus-api routes. Built on Reqore;
5
+ * the engine (`../index`) does not import this layer. How to embed it: design/TRACKING.md, §8.
6
+ */
7
+ export { ExperimentCard } from './ExperimentCard';
8
+ export type { IExperimentCardProps } from './ExperimentCard';
9
+ export { boxOf, ExperimentsOverlay, OVERLAY_ATTRIBUTE } from './ExperimentsOverlay';
10
+ export type { IExperimentsOverlayProps } from './ExperimentsOverlay';
11
+ export { useExperimentsAdmin } from './useExperimentsAdmin';
12
+ export type { IUseExperimentsAdmin, IUseExperimentsAdminOptions } from './useExperimentsAdmin';
13
+ export { createExperimentsAdminClient, ExperimentsAdminError } from './client';
14
+ export type { IExperimentsAdminClient, IExperimentsAdminOptions, TExperimentsFetch, } from './client';
15
+ export { activatesRow, CARD_MAX_WIDTH, CARD_MIN_HEIGHT, cardReducer, CLOSED, openCard, OUTSIDE_IGNORE, placeCard, } from './anchor';
16
+ export type { IBox, ICardState, IPlaceInput, IPlacement, TCardEvent } from './anchor';
17
+ export { actionOutcome, barValues, canAccept, canPause, canRemove, canStart, canStop, confirmCopy, count, lifecycleCopy, numbersLine, percent, phaseNote, primaryMetric, STATUS_LABEL, statusTag, verdictIntent, verdictLine, versionName, versionRows, versionsMaxHeight, VISIBLE_VERSIONS, winnerNote, } from './card';
18
+ export type { IConfirmCopy, IVersionRow, TStatusIntent } from './card';
19
+ export type { IAdminExperiment, IAdminExperimentEvent, IAdminExperimentPhase, IAdminVariant, IExperimentEntry, IExperimentResults, INewExperiment, IResultsMetric, IResultsVariant, TExperimentAction, TExperimentActionResult, TExperimentStatus, TLifecycleAction, TVersionAction, } from './types';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tracking/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACpF,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC/E,YAAY,EACV,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,eAAe,EACf,WAAW,EACX,MAAM,EACN,QAAQ,EACR,cAAc,EACd,SAAS,GACV,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtF,OAAO,EACL,aAAa,EACb,SAAS,EACT,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,OAAO,EACP,WAAW,EACX,KAAK,EACL,aAAa,EACb,WAAW,EACX,OAAO,EACP,SAAS,EACT,aAAa,EACb,YAAY,EACZ,SAAS,EACT,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,GACX,MAAM,QAAQ,CAAC;AAChB,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvE,YAAY,EACV,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,GACf,MAAM,SAAS,CAAC"}