@prosopo/procaptcha-common 2.12.5 → 2.13.0

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.
@@ -0,0 +1,161 @@
1
+ import { PlacementEnum } from "@prosopo/types";
2
+ import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
3
+ import { jsx } from "@emotion/react/jsx-runtime";
4
+ import { createPortal } from "react-dom";
5
+ //#region src/reactComponents/ChallengeSurface.tsx
6
+ var SURFACE_Z_INDEX = 2147483646;
7
+ var CONTENT_Z_INDEX = 2147483647;
8
+ var IOS_LIFT_STYLE_ID = "prosopo-challenge-surface-ios-lift";
9
+ var IOS_LIFT_CSS = `
10
+ .prosopo-challenge-content--ios-lift {
11
+ transform: translate(-50%, -50%);
12
+ }
13
+ @supports (-webkit-touch-callout: none) {
14
+ .prosopo-challenge-content--ios-lift {
15
+ transform: translate(-50%, -100%);
16
+ }
17
+ }
18
+ `;
19
+ var ensureIosLiftStyles = () => {
20
+ if (typeof document === "undefined") return;
21
+ if (document.getElementById(IOS_LIFT_STYLE_ID)) return;
22
+ const style = document.createElement("style");
23
+ style.id = IOS_LIFT_STYLE_ID;
24
+ style.textContent = IOS_LIFT_CSS;
25
+ document.head.appendChild(style);
26
+ };
27
+ var FLOAT_GAP_PX = 8;
28
+ var useIsomorphicLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
29
+ /**
30
+ * Places the panel directly above the anchor, in document coordinates.
31
+ *
32
+ * Document coordinates rather than viewport ones, because the panel is
33
+ * `position: absolute`: the page carries it while scrolling instead of the
34
+ * panel being recomputed against a moving viewport, which is what made it
35
+ * drift. Always above, never flipped, so the challenge does not jump to the
36
+ * other side of the widget as the page moves.
37
+ */
38
+ var computeFloatPosition = (anchorRect, panelHeight, scrollX, scrollY) => ({
39
+ top: Math.max(0, anchorRect.top + scrollY - panelHeight - FLOAT_GAP_PX),
40
+ left: anchorRect.left + scrollX
41
+ });
42
+ var ChallengeSurface = React.memo((props) => {
43
+ const { show, children, placement = PlacementEnum.popup, anchor, scrim = "none", onDismiss, popupIosLift = false, className } = props;
44
+ const contentRef = useRef(null);
45
+ const [floatPosition, setFloatPosition] = useState(null);
46
+ const isFloating = placement === PlacementEnum.float && !!anchor;
47
+ const reposition = useCallback(() => {
48
+ if (!isFloating || !anchor || !contentRef.current) return;
49
+ const panel = contentRef.current.getBoundingClientRect();
50
+ const next = computeFloatPosition(anchor.getBoundingClientRect(), panel.height, window.scrollX, window.scrollY);
51
+ setFloatPosition((current) => current && current.top === next.top && current.left === next.left ? current : next);
52
+ }, [isFloating, anchor]);
53
+ useIsomorphicLayoutEffect(() => {
54
+ if (!show || !isFloating) {
55
+ setFloatPosition(null);
56
+ return;
57
+ }
58
+ reposition();
59
+ }, [
60
+ show,
61
+ isFloating,
62
+ reposition
63
+ ]);
64
+ useEffect(() => {
65
+ if (!show || !isFloating) return;
66
+ window.addEventListener("resize", reposition);
67
+ const observer = typeof ResizeObserver === "function" ? new ResizeObserver(reposition) : null;
68
+ if (observer && contentRef.current) observer.observe(contentRef.current);
69
+ if (observer && anchor) observer.observe(anchor);
70
+ return () => {
71
+ window.removeEventListener("resize", reposition);
72
+ observer?.disconnect();
73
+ };
74
+ }, [
75
+ show,
76
+ isFloating,
77
+ anchor,
78
+ reposition
79
+ ]);
80
+ useEffect(() => {
81
+ if (!show || !onDismiss) return;
82
+ const onKeyDown = (event) => {
83
+ if (event.key === "Escape") onDismiss();
84
+ };
85
+ document.addEventListener("keydown", onKeyDown);
86
+ return () => document.removeEventListener("keydown", onKeyDown);
87
+ }, [show, onDismiss]);
88
+ useEffect(() => {
89
+ if (!show || !isFloating || !onDismiss) return;
90
+ const onPointerDown = (event) => {
91
+ const target = event.target;
92
+ if (!(target instanceof Node)) return;
93
+ if (contentRef.current?.contains(target)) return;
94
+ if (anchor?.contains(target)) return;
95
+ onDismiss();
96
+ };
97
+ document.addEventListener("pointerdown", onPointerDown);
98
+ return () => document.removeEventListener("pointerdown", onPointerDown);
99
+ }, [
100
+ show,
101
+ isFloating,
102
+ anchor,
103
+ onDismiss
104
+ ]);
105
+ useEffect(() => {
106
+ if (popupIosLift && !isFloating) ensureIosLiftStyles();
107
+ }, [popupIosLift, isFloating]);
108
+ if (typeof document === "undefined") return null;
109
+ const layerStyle = isFloating ? {
110
+ position: "absolute",
111
+ top: 0,
112
+ left: 0,
113
+ width: 0,
114
+ height: 0,
115
+ zIndex: SURFACE_Z_INDEX,
116
+ display: show ? "block" : "none",
117
+ pointerEvents: "none"
118
+ } : {
119
+ position: "fixed",
120
+ inset: 0,
121
+ zIndex: SURFACE_Z_INDEX,
122
+ display: show ? "flex" : "none",
123
+ alignItems: "center",
124
+ justifyContent: "center",
125
+ minHeight: "100vh",
126
+ backgroundColor: scrim === "dim" && show ? "rgba(0, 0, 0, 0.4)" : "transparent",
127
+ transition: "background-color 0.3s ease"
128
+ };
129
+ const contentStyle = isFloating ? {
130
+ position: "absolute",
131
+ zIndex: CONTENT_Z_INDEX,
132
+ pointerEvents: "auto",
133
+ top: `${floatPosition?.top ?? 0}px`,
134
+ left: `${floatPosition?.left ?? 0}px`,
135
+ visibility: floatPosition ? "visible" : "hidden"
136
+ } : {
137
+ position: "absolute",
138
+ top: "50%",
139
+ left: "50%",
140
+ transform: popupIosLift ? void 0 : "translate(-50%, -50%)",
141
+ zIndex: CONTENT_Z_INDEX,
142
+ boxSizing: "border-box"
143
+ };
144
+ return createPortal(/* @__PURE__ */ jsx("div", {
145
+ className: [
146
+ "prosopo-challenge-surface",
147
+ `prosopo-challenge-surface--${isFloating ? "float" : "popup"}`,
148
+ className
149
+ ].filter(Boolean).join(" "),
150
+ style: layerStyle,
151
+ children: /* @__PURE__ */ jsx("div", {
152
+ ref: contentRef,
153
+ className: popupIosLift && !isFloating ? "prosopo-challenge-content prosopo-challenge-content--ios-lift" : "prosopo-challenge-content",
154
+ style: contentStyle,
155
+ children
156
+ })
157
+ }), document.body);
158
+ });
159
+ ChallengeSurface.displayName = "ChallengeSurface";
160
+ //#endregion
161
+ export { ChallengeSurface, computeFloatPosition };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChallengeSurface.js","sourceRoot":"","sources":["../../src/reactComponents/ChallengeSurface.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=challengeSurface.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challengeSurface.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/challengeSurface.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,54 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { computeFloatPosition } from "../reactComponents/ChallengeSurface.js";
3
+ const VIEWPORT_WIDTH = 1000;
4
+ const VIEWPORT_HEIGHT = 800;
5
+ const rect = (left, top, width, height) => ({
6
+ left,
7
+ top,
8
+ width,
9
+ height,
10
+ right: left + width,
11
+ bottom: top + height,
12
+ x: left,
13
+ y: top,
14
+ toJSON: () => ({}),
15
+ });
16
+ const PANEL_HEIGHT = 250;
17
+ const place = (anchor, panelHeight = PANEL_HEIGHT, scrollX = 0, scrollY = 0) => computeFloatPosition(anchor, panelHeight, scrollX, scrollY);
18
+ describe("computeFloatPosition", () => {
19
+ it("sits directly above the anchor", () => {
20
+ const anchor = rect(100, 300, 300, 78);
21
+ const { top, left } = place(anchor);
22
+ expect(top).toBe(anchor.top - PANEL_HEIGHT - 8);
23
+ expect(left).toBe(anchor.left);
24
+ });
25
+ it("stays above the anchor even when the space below is larger", () => {
26
+ const anchor = rect(100, 400, 300, 50);
27
+ const { top } = place(anchor);
28
+ expect(top).toBe(anchor.top - PANEL_HEIGHT - 8);
29
+ expect(top + PANEL_HEIGHT).toBeLessThan(anchor.top);
30
+ });
31
+ it("converts the viewport rect into document coordinates", () => {
32
+ const anchor = rect(100, 300, 300, 78);
33
+ const { top, left } = place(anchor, PANEL_HEIGHT, 40, 500);
34
+ expect(top).toBe(anchor.top + 500 - PANEL_HEIGHT - 8);
35
+ expect(left).toBe(anchor.left + 40);
36
+ });
37
+ it("does not move when only the scroll offset changes", () => {
38
+ const unscrolled = place(rect(100, 300, 300, 78), PANEL_HEIGHT, 0, 0);
39
+ const scrolled = place(rect(100, 100, 300, 78), PANEL_HEIGHT, 0, 200);
40
+ expect(scrolled).toEqual(unscrolled);
41
+ });
42
+ it("tracks a taller panel so its bottom edge stays on the anchor", () => {
43
+ const anchor = rect(100, 600, 300, 78);
44
+ const short = place(anchor, 100);
45
+ const tall = place(anchor, 400);
46
+ expect(short.top + 100).toBe(tall.top + 400);
47
+ });
48
+ it("clamps to the top of the document rather than going out of reach", () => {
49
+ const anchor = rect(100, 20, 300, 78);
50
+ const { top } = place(anchor, PANEL_HEIGHT);
51
+ expect(top).toBe(0);
52
+ });
53
+ });
54
+ //# sourceMappingURL=challengeSurface.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challengeSurface.unit.test.js","sourceRoot":"","sources":["../../src/tests/challengeSurface.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=challengeSurfaceRender.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challengeSurfaceRender.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/challengeSurfaceRender.unit.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,123 @@
1
+ import { jsx as _jsx } from "@emotion/react/jsx-runtime";
2
+ import { PlacementEnum } from "@prosopo/types";
3
+ import { createRoot } from "react-dom/client";
4
+ import { act } from "react-dom/test-utils";
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
+ import { ChallengeSurface } from "../reactComponents/ChallengeSurface.js";
7
+ let container;
8
+ let root;
9
+ let anchor;
10
+ const layer = () => document.querySelector(".prosopo-challenge-surface");
11
+ const content = () => document.querySelector(".prosopo-challenge-content");
12
+ const render = ({ placement, withAnchor = true, onDismiss, show = true, }) => {
13
+ act(() => {
14
+ root.render(_jsx(ChallengeSurface, { show: show, placement: placement, anchor: withAnchor ? anchor : null, onDismiss: onDismiss, children: _jsx("div", { "data-testid": "challenge", children: "challenge" }) }));
15
+ });
16
+ };
17
+ beforeEach(() => {
18
+ container = document.createElement("div");
19
+ anchor = document.createElement("div");
20
+ document.body.append(container, anchor);
21
+ root = createRoot(container);
22
+ });
23
+ afterEach(() => {
24
+ act(() => root.unmount());
25
+ container.remove();
26
+ anchor.remove();
27
+ });
28
+ describe("where the surface renders", () => {
29
+ it("portals out of the mount container to the body", () => {
30
+ render({});
31
+ expect(container.querySelector(".prosopo-challenge-surface")).toBeNull();
32
+ expect(layer()?.parentElement).toBe(document.body);
33
+ });
34
+ it("hides rather than unmounts when not shown", () => {
35
+ render({ show: false });
36
+ expect(layer()?.style.display).toBe("none");
37
+ expect(layer()?.textContent).toContain("challenge");
38
+ });
39
+ });
40
+ describe("popup", () => {
41
+ it("is the default placement", () => {
42
+ render({});
43
+ expect(layer()?.className).toContain("prosopo-challenge-surface--popup");
44
+ });
45
+ it("covers the page, so nothing behind it is reachable", () => {
46
+ render({ placement: PlacementEnum.popup });
47
+ expect(layer()?.style.display).toBe("flex");
48
+ expect(layer()?.style.pointerEvents).toBe("");
49
+ });
50
+ it("ignores an outside click", () => {
51
+ const onDismiss = vi.fn();
52
+ render({ placement: PlacementEnum.popup, onDismiss });
53
+ act(() => {
54
+ document.body.dispatchEvent(new Event("pointerdown", { bubbles: true }));
55
+ });
56
+ expect(onDismiss).not.toHaveBeenCalled();
57
+ });
58
+ });
59
+ describe("float", () => {
60
+ it("leaves the page usable behind it", () => {
61
+ render({ placement: PlacementEnum.float });
62
+ expect(layer()?.className).toContain("prosopo-challenge-surface--float");
63
+ expect(layer()?.style.pointerEvents).toBe("none");
64
+ expect(content()?.style.pointerEvents).toBe("auto");
65
+ });
66
+ it("positions the panel absolutely so the page scrolls it", () => {
67
+ render({ placement: PlacementEnum.float });
68
+ expect(content()?.style.position).toBe("absolute");
69
+ expect(layer()?.style.position).toBe("absolute");
70
+ expect(layer()?.style.width).toBe("0px");
71
+ expect(layer()?.style.height).toBe("0px");
72
+ });
73
+ it("dismisses on a click outside the panel", () => {
74
+ const onDismiss = vi.fn();
75
+ render({ placement: PlacementEnum.float, onDismiss });
76
+ act(() => {
77
+ document.body.dispatchEvent(new Event("pointerdown", { bubbles: true }));
78
+ });
79
+ expect(onDismiss).toHaveBeenCalledTimes(1);
80
+ });
81
+ it("does not dismiss on a click inside the panel", () => {
82
+ const onDismiss = vi.fn();
83
+ render({ placement: PlacementEnum.float, onDismiss });
84
+ act(() => {
85
+ content()?.dispatchEvent(new Event("pointerdown", { bubbles: true }));
86
+ });
87
+ expect(onDismiss).not.toHaveBeenCalled();
88
+ });
89
+ it("does not dismiss on a click on the anchor", () => {
90
+ const onDismiss = vi.fn();
91
+ render({ placement: PlacementEnum.float, onDismiss });
92
+ act(() => {
93
+ anchor.dispatchEvent(new Event("pointerdown", { bubbles: true }));
94
+ });
95
+ expect(onDismiss).not.toHaveBeenCalled();
96
+ });
97
+ it("falls back to popup with no anchor to attach to", () => {
98
+ render({ placement: PlacementEnum.float, withAnchor: false });
99
+ expect(layer()?.className).toContain("prosopo-challenge-surface--popup");
100
+ expect(layer()?.style.pointerEvents).toBe("");
101
+ });
102
+ });
103
+ describe("dismissing with the keyboard", () => {
104
+ it("closes on Escape in either placement", () => {
105
+ for (const placement of [PlacementEnum.popup, PlacementEnum.float]) {
106
+ const onDismiss = vi.fn();
107
+ render({ placement, onDismiss });
108
+ act(() => {
109
+ document.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape", bubbles: true }));
110
+ });
111
+ expect(onDismiss, `${placement} should close on Escape`).toHaveBeenCalled();
112
+ }
113
+ });
114
+ it("ignores other keys", () => {
115
+ const onDismiss = vi.fn();
116
+ render({ placement: PlacementEnum.float, onDismiss });
117
+ act(() => {
118
+ document.dispatchEvent(new KeyboardEvent("keydown", { key: "Enter", bubbles: true }));
119
+ });
120
+ expect(onDismiss).not.toHaveBeenCalled();
121
+ });
122
+ });
123
+ //# sourceMappingURL=challengeSurfaceRender.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challengeSurfaceRender.unit.test.js","sourceRoot":"","sources":["../../src/tests/challengeSurfaceRender.unit.test.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prosopo/procaptcha-common",
3
- "version": "2.12.5",
3
+ "version": "2.13.0",
4
4
  "author": "PROSOPO LIMITED <info@prosopo.io>",
5
5
  "license": "Apache-2.0",
6
6
  "main": "dist/index.js",
@@ -34,20 +34,20 @@
34
34
  "dependencies": {
35
35
  "@emotion/react": "11.14.0",
36
36
  "@emotion/styled": "11.14.1",
37
- "@prosopo/account": "2.8.86",
38
- "@prosopo/load-balancer": "2.10.38",
39
- "@prosopo/types": "5.5.3",
40
- "@prosopo/widget-skeleton": "2.8.6",
37
+ "@prosopo/account": "2.8.88",
38
+ "@prosopo/load-balancer": "2.10.40",
39
+ "@prosopo/types": "5.7.0",
40
+ "@prosopo/widget-skeleton": "2.8.7",
41
41
  "react": "19.2.8",
42
42
  "react-dom": "19.2.8"
43
43
  },
44
44
  "devDependencies": {
45
- "@prosopo/config": "3.3.12",
46
- "@types/jsdom": "21.1.7",
45
+ "@prosopo/config": "3.3.14",
46
+ "@types/jsdom": "30.0.0",
47
47
  "@types/node": "22.10.2",
48
48
  "@types/react": "19.2.18",
49
49
  "@types/react-dom": "19.2.5",
50
- "@vitest/coverage-v8": "4.1.10",
50
+ "@vitest/coverage-v8": "4.1.11",
51
51
  "concurrently": "9.0.1",
52
52
  "del-cli": "6.0.0",
53
53
  "dotenv": "16.4.5",
@@ -57,7 +57,7 @@
57
57
  "tsx": "4.20.3",
58
58
  "typescript": "5.6.2",
59
59
  "vite": "8.1.5",
60
- "vitest": "4.1.10"
60
+ "vitest": "4.1.11"
61
61
  },
62
62
  "repository": {
63
63
  "type": "git",
package/src/index.ts CHANGED
@@ -23,5 +23,6 @@ export * from "./simdReadings.js";
23
23
  export * from "./elements/window.js";
24
24
  export * from "./reactComponents/Reload.js";
25
25
  export * from "./reactComponents/Checkbox.js";
26
+ export * from "./reactComponents/ChallengeSurface.js";
26
27
  export * from "./reactComponents/Honeypot.js";
27
28
  export * from "./reactComponents/TestModeBanner.js";