@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.
- package/.claude/CLAUDE.md +1 -0
- package/README.md +20 -0
- package/design/TRACKING.md +290 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/tracking/browser/attach.d.ts +8 -0
- package/dist/tracking/browser/attach.d.ts.map +1 -0
- package/dist/tracking/browser/attach.js +182 -0
- package/dist/tracking/browser/attach.js.map +1 -0
- package/dist/tracking/browser/env.d.ts +14 -0
- package/dist/tracking/browser/env.d.ts.map +1 -0
- package/dist/tracking/browser/env.js +150 -0
- package/dist/tracking/browser/env.js.map +1 -0
- package/dist/tracking/core/consent.d.ts +21 -0
- package/dist/tracking/core/consent.d.ts.map +1 -0
- package/dist/tracking/core/consent.js +39 -0
- package/dist/tracking/core/consent.js.map +1 -0
- package/dist/tracking/core/engagement.d.ts +20 -0
- package/dist/tracking/core/engagement.d.ts.map +1 -0
- package/dist/tracking/core/engagement.js +52 -0
- package/dist/tracking/core/engagement.js.map +1 -0
- package/dist/tracking/core/experiments.d.ts +109 -0
- package/dist/tracking/core/experiments.d.ts.map +1 -0
- package/dist/tracking/core/experiments.js +294 -0
- package/dist/tracking/core/experiments.js.map +1 -0
- package/dist/tracking/core/hash.d.ts +16 -0
- package/dist/tracking/core/hash.d.ts.map +1 -0
- package/dist/tracking/core/hash.js +31 -0
- package/dist/tracking/core/hash.js.map +1 -0
- package/dist/tracking/core/ids.d.ts +6 -0
- package/dist/tracking/core/ids.d.ts.map +1 -0
- package/dist/tracking/core/ids.js +31 -0
- package/dist/tracking/core/ids.js.map +1 -0
- package/dist/tracking/core/observable.d.ts +12 -0
- package/dist/tracking/core/observable.d.ts.map +1 -0
- package/dist/tracking/core/observable.js +32 -0
- package/dist/tracking/core/observable.js.map +1 -0
- package/dist/tracking/core/queue.d.ts +47 -0
- package/dist/tracking/core/queue.d.ts.map +1 -0
- package/dist/tracking/core/queue.js +205 -0
- package/dist/tracking/core/queue.js.map +1 -0
- package/dist/tracking/core/sections.d.ts +54 -0
- package/dist/tracking/core/sections.d.ts.map +1 -0
- package/dist/tracking/core/sections.js +156 -0
- package/dist/tracking/core/sections.js.map +1 -0
- package/dist/tracking/core/storage.d.ts +15 -0
- package/dist/tracking/core/storage.d.ts.map +1 -0
- package/dist/tracking/core/storage.js +72 -0
- package/dist/tracking/core/storage.js.map +1 -0
- package/dist/tracking/core/tracker.d.ts +122 -0
- package/dist/tracking/core/tracker.d.ts.map +1 -0
- package/dist/tracking/core/tracker.js +390 -0
- package/dist/tracking/core/tracker.js.map +1 -0
- package/dist/tracking/core/types.d.ts +130 -0
- package/dist/tracking/core/types.d.ts.map +1 -0
- package/dist/tracking/core/types.js +69 -0
- package/dist/tracking/core/types.js.map +1 -0
- package/dist/tracking/core/utm.d.ts +6 -0
- package/dist/tracking/core/utm.d.ts.map +1 -0
- package/dist/tracking/core/utm.js +30 -0
- package/dist/tracking/core/utm.js.map +1 -0
- package/dist/tracking/index.d.ts +46 -0
- package/dist/tracking/index.d.ts.map +1 -0
- package/dist/tracking/index.js +91 -0
- package/dist/tracking/index.js.map +1 -0
- package/dist/tracking/markup.d.ts +12 -0
- package/dist/tracking/markup.d.ts.map +1 -0
- package/dist/tracking/markup.js +19 -0
- package/dist/tracking/markup.js.map +1 -0
- package/dist/tracking/react/Experiment.d.ts +23 -0
- package/dist/tracking/react/Experiment.d.ts.map +1 -0
- package/dist/tracking/react/Experiment.js +28 -0
- package/dist/tracking/react/Experiment.js.map +1 -0
- package/dist/tracking/react/TrackingProvider.d.ts +26 -0
- package/dist/tracking/react/TrackingProvider.d.ts.map +1 -0
- package/dist/tracking/react/TrackingProvider.js +45 -0
- package/dist/tracking/react/TrackingProvider.js.map +1 -0
- package/dist/tracking/react/hooks.d.ts +39 -0
- package/dist/tracking/react/hooks.d.ts.map +1 -0
- package/dist/tracking/react/hooks.js +96 -0
- package/dist/tracking/react/hooks.js.map +1 -0
- package/dist/tracking/react/index.d.ts +7 -0
- package/dist/tracking/react/index.d.ts.map +1 -0
- package/dist/tracking/react/index.js +17 -0
- package/dist/tracking/react/index.js.map +1 -0
- package/dist/tracking/testing.d.ts +40 -0
- package/dist/tracking/testing.d.ts.map +1 -0
- package/dist/tracking/testing.js +140 -0
- package/dist/tracking/testing.js.map +1 -0
- package/dist/tracking/ui/ExperimentCard.d.ts +55 -0
- package/dist/tracking/ui/ExperimentCard.d.ts.map +1 -0
- package/dist/tracking/ui/ExperimentCard.js +340 -0
- package/dist/tracking/ui/ExperimentCard.js.map +1 -0
- package/dist/tracking/ui/ExperimentsOverlay.d.ts +59 -0
- package/dist/tracking/ui/ExperimentsOverlay.d.ts.map +1 -0
- package/dist/tracking/ui/ExperimentsOverlay.js +359 -0
- package/dist/tracking/ui/ExperimentsOverlay.js.map +1 -0
- package/dist/tracking/ui/anchor.d.ts +107 -0
- package/dist/tracking/ui/anchor.d.ts.map +1 -0
- package/dist/tracking/ui/anchor.js +108 -0
- package/dist/tracking/ui/anchor.js.map +1 -0
- package/dist/tracking/ui/card.d.ts +121 -0
- package/dist/tracking/ui/card.d.ts.map +1 -0
- package/dist/tracking/ui/card.js +417 -0
- package/dist/tracking/ui/card.js.map +1 -0
- package/dist/tracking/ui/client.d.ts +42 -0
- package/dist/tracking/ui/client.d.ts.map +1 -0
- package/dist/tracking/ui/client.js +123 -0
- package/dist/tracking/ui/client.js.map +1 -0
- package/dist/tracking/ui/index.d.ts +20 -0
- package/dist/tracking/ui/index.d.ts.map +1 -0
- package/dist/tracking/ui/index.js +60 -0
- package/dist/tracking/ui/index.js.map +1 -0
- package/dist/tracking/ui/types.d.ts +120 -0
- package/dist/tracking/ui/types.d.ts.map +1 -0
- package/dist/tracking/ui/types.js +8 -0
- package/dist/tracking/ui/types.js.map +1 -0
- package/dist/tracking/ui/useExperimentsAdmin.d.ts +31 -0
- package/dist/tracking/ui/useExperimentsAdmin.d.ts.map +1 -0
- package/dist/tracking/ui/useExperimentsAdmin.js +136 -0
- package/dist/tracking/ui/useExperimentsAdmin.js.map +1 -0
- package/package.json +1 -1
- package/src/index.tsx +5 -0
- package/src/stories/tracking.tsx +206 -0
- package/src/tracking/browser/attach.ts +186 -0
- package/src/tracking/browser/env.ts +78 -0
- package/src/tracking/core/consent.ts +37 -0
- package/src/tracking/core/engagement.ts +47 -0
- package/src/tracking/core/experiments.ts +258 -0
- package/src/tracking/core/hash.ts +26 -0
- package/src/tracking/core/ids.ts +25 -0
- package/src/tracking/core/observable.ts +23 -0
- package/src/tracking/core/queue.ts +131 -0
- package/src/tracking/core/sections.ts +166 -0
- package/src/tracking/core/storage.ts +69 -0
- package/src/tracking/core/tracker.ts +417 -0
- package/src/tracking/core/types.ts +162 -0
- package/src/tracking/core/utm.ts +23 -0
- package/src/tracking/index.ts +72 -0
- package/src/tracking/markup.ts +17 -0
- package/src/tracking/react/Experiment.tsx +44 -0
- package/src/tracking/react/TrackingProvider.tsx +56 -0
- package/src/tracking/react/hooks.ts +106 -0
- package/src/tracking/react/index.ts +13 -0
- package/src/tracking/testing.ts +108 -0
- package/src/tracking/ui/ExperimentCard.stories.tsx +290 -0
- package/src/tracking/ui/ExperimentCard.tsx +581 -0
- package/src/tracking/ui/ExperimentsOverlay.stories.tsx +155 -0
- package/src/tracking/ui/ExperimentsOverlay.tsx +437 -0
- package/src/tracking/ui/anchor.ts +180 -0
- package/src/tracking/ui/card.ts +464 -0
- package/src/tracking/ui/client.ts +117 -0
- package/src/tracking/ui/index.ts +77 -0
- package/src/tracking/ui/types.ts +110 -0
- package/src/tracking/ui/useExperimentsAdmin.ts +103 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { IExperimentEntry, TExperimentActionResult } from './types';
|
|
3
|
+
type TMaybeAsync<T = unknown> = T | Promise<T>;
|
|
4
|
+
export interface IExperimentsOverlayProps {
|
|
5
|
+
/** Draws nothing while false (an editor's "hide editor elements"). Default true. */
|
|
6
|
+
visible?: boolean;
|
|
7
|
+
/** The server's tests (the editor or admin list); null while loading. A test only in code still gets its versions. */
|
|
8
|
+
tests?: IExperimentEntry[] | null;
|
|
9
|
+
/** Why the list could not be loaded. */
|
|
10
|
+
loadError?: string | null;
|
|
11
|
+
/**
|
|
12
|
+
* Show a version on this page. Default: the tracker's in-app switch
|
|
13
|
+
* (`tracker.experiments.setEditorOverride`, never logged) when a `<TrackingProvider>` is above.
|
|
14
|
+
*/
|
|
15
|
+
onShow?: (key: string, variant: string) => void;
|
|
16
|
+
onAccept?: (key: string, variant: string) => TMaybeAsync<TExperimentActionResult | unknown>;
|
|
17
|
+
onRemove?: (key: string, variant: string) => TMaybeAsync<TExperimentActionResult | unknown>;
|
|
18
|
+
onStart?: (key: string) => TMaybeAsync;
|
|
19
|
+
onPause?: (key: string) => TMaybeAsync;
|
|
20
|
+
onStop?: (key: string) => TMaybeAsync;
|
|
21
|
+
/**
|
|
22
|
+
* After an action succeeded. Default: the page shows what visitors see now (the switch is
|
|
23
|
+
* cleared, the tracker reloads the definitions and mounted experiments decide again).
|
|
24
|
+
*/
|
|
25
|
+
onSettled?: (key: string) => TMaybeAsync;
|
|
26
|
+
/** The test's details page (the card's "Open in …" link); none when it returns nothing. */
|
|
27
|
+
detailsUrl?: (key: string) => string | null | undefined;
|
|
28
|
+
/** The link's label. Default `Open in admin portal`. */
|
|
29
|
+
detailsLabel?: string;
|
|
30
|
+
/** One version's analytics (the rows' "Show analytics"); hidden when absent or it returns nothing. */
|
|
31
|
+
versionDetailsUrl?: (key: string, variant: string) => string | null | undefined;
|
|
32
|
+
/** Where the full analytics live, in the help's words. Default `the admin portal`. */
|
|
33
|
+
analyticsLabel?: string;
|
|
34
|
+
/** The words for a test that is in the page's code but not set up in the analytics service yet. */
|
|
35
|
+
notSetUpText?: string;
|
|
36
|
+
/** Who removed a version, in words, by the history's `actor`. */
|
|
37
|
+
actorLabels?: Record<string, string>;
|
|
38
|
+
/** The part of the viewport a sticky header covers (px, or read on every render). Default 0. */
|
|
39
|
+
topInset?: number | (() => number);
|
|
40
|
+
/** Markers inside elements matching this selector are ignored (e.g. an editor's own UI). */
|
|
41
|
+
exclude?: string;
|
|
42
|
+
/** The handle's words. Default `A/B test · <name>`. */
|
|
43
|
+
handleLabel?: (name: string) => string;
|
|
44
|
+
}
|
|
45
|
+
/** The overlay's own root; markers inside it are never outlined. */
|
|
46
|
+
export declare const OVERLAY_ATTRIBUTE = "data-experiments-overlay";
|
|
47
|
+
/** One box around the elements (viewport coordinates); tiny elements are ignored. */
|
|
48
|
+
export declare const boxOf: (els: Element[]) => DOMRect | null;
|
|
49
|
+
/**
|
|
50
|
+
* Every `<Experiment>` on the page (its `data-experiment` marker) gets a dashed outline and a
|
|
51
|
+
* handle, "A/B test · <name>", at its top-left corner. Hovering the element, focusing the handle,
|
|
52
|
+
* or clicking / tapping it opens the test's `<ExperimentCard>`, anchored to the element: it moves
|
|
53
|
+
* and resizes with it and flips above or below the handle to stay in view. ✕, Esc and a click
|
|
54
|
+
* outside close it. An ended test shows "Winner live" instead. Data and actions come in as props
|
|
55
|
+
* (`useExperimentsAdmin` provides them from the qorus-api routes).
|
|
56
|
+
*/
|
|
57
|
+
export declare const ExperimentsOverlay: ({ visible, tests, loadError, onShow, onAccept, onRemove, onStart, onPause, onStop, onSettled, detailsUrl, detailsLabel, versionDetailsUrl, analyticsLabel, notSetUpText, actorLabels, topInset, exclude, handleLabel, }: IExperimentsOverlayProps) => import("react").ReactPortal;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=ExperimentsOverlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExperimentsOverlay.d.ts","sourceRoot":"","sources":["../../../src/tracking/ui/ExperimentsOverlay.tsx"],"names":[],"mappings":";AA4BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEzE,KAAK,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE/C,MAAM,WAAW,wBAAwB;IACvC,oFAAoF;IACpF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sHAAsH;IACtH,KAAK,CAAC,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;IAClC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC,uBAAuB,GAAG,OAAO,CAAC,CAAC;IAC5F,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC,uBAAuB,GAAG,OAAO,CAAC,CAAC;IAC5F,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,WAAW,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,WAAW,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,WAAW,CAAC;IACtC;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,WAAW,CAAC;IACzC,2FAA2F;IAC3F,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACxD,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sGAAsG;IACtG,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChF,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mGAAmG;IACnG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,gGAAgG;IAChG,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACnC,4FAA4F;IAC5F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACxC;AAoBD,oEAAoE;AACpE,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAU5D,qFAAqF;AACrF,eAAO,MAAM,KAAK,QAAS,OAAO,EAAE,KAAG,OAAO,GAAG,IAgBhD,CAAC;AAiDF;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,4NAoB5B,wBAAwB,gCA+O1B,CAAC"}
|
|
@@ -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, versionDetailsUrl = _a.versionDetailsUrl, analyticsLabel = _a.analyticsLabel, notSetUpText = _a.notSetUpText, 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, versionDetailsUrl: versionDetailsUrl ? function (variant) { return versionDetailsUrl(m.key, variant); } : undefined, analyticsLabel: analyticsLabel, notSetUpText: notSetUpText, 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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"}
|