@prosopo/procaptcha-puzzle 2.10.39 → 2.10.41

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 (59) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +13 -11
  2. package/.turbo/turbo-build$colon$tsc.log +19 -19
  3. package/.turbo/turbo-build.log +15 -12
  4. package/CHANGELOG.md +41 -0
  5. package/dist/_virtual/_rolldown/runtime.js +3 -0
  6. package/dist/cjs/components/ProcaptchaPuzzle.cjs +6 -9
  7. package/dist/cjs/components/ProcaptchaWidget.cjs +191 -213
  8. package/dist/cjs/components/PuzzleCanvas.cjs +228 -270
  9. package/dist/cjs/index.cjs +2 -4
  10. package/dist/cjs/services/Manager.cjs +209 -289
  11. package/dist/components/ProcaptchaPuzzle.js +6 -8
  12. package/dist/components/ProcaptchaWidget.d.ts.map +1 -1
  13. package/dist/components/ProcaptchaWidget.js +190 -212
  14. package/dist/components/ProcaptchaWidget.js.map +1 -1
  15. package/dist/components/PuzzleCanvas.js +229 -271
  16. package/dist/index.js +2 -4
  17. package/dist/services/Manager.d.ts.map +1 -1
  18. package/dist/services/Manager.js +205 -286
  19. package/dist/services/Manager.js.map +1 -1
  20. package/dist/tests/manager.unit.test.d.ts +2 -0
  21. package/dist/tests/manager.unit.test.d.ts.map +1 -0
  22. package/dist/tests/manager.unit.test.js +506 -0
  23. package/dist/tests/manager.unit.test.js.map +1 -0
  24. package/dist/tests/managerHarness.d.ts +20 -0
  25. package/dist/tests/managerHarness.d.ts.map +1 -0
  26. package/dist/tests/managerHarness.js +86 -0
  27. package/dist/tests/managerHarness.js.map +1 -0
  28. package/dist/tests/procaptchaPuzzle.test-d.d.ts +2 -0
  29. package/dist/tests/procaptchaPuzzle.test-d.d.ts.map +1 -0
  30. package/dist/tests/procaptchaPuzzle.test-d.js +97 -0
  31. package/dist/tests/procaptchaPuzzle.test-d.js.map +1 -0
  32. package/dist/tests/procaptchaPuzzle.unit.test.d.ts +2 -0
  33. package/dist/tests/procaptchaPuzzle.unit.test.d.ts.map +1 -0
  34. package/dist/tests/procaptchaPuzzle.unit.test.js +81 -0
  35. package/dist/tests/procaptchaPuzzle.unit.test.js.map +1 -0
  36. package/dist/tests/procaptchaWidget.unit.test.d.ts +2 -0
  37. package/dist/tests/procaptchaWidget.unit.test.d.ts.map +1 -0
  38. package/dist/tests/procaptchaWidget.unit.test.js +547 -0
  39. package/dist/tests/procaptchaWidget.unit.test.js.map +1 -0
  40. package/dist/tests/puzzleCanvas.unit.test.d.ts +2 -0
  41. package/dist/tests/puzzleCanvas.unit.test.d.ts.map +1 -0
  42. package/dist/tests/puzzleCanvas.unit.test.js +312 -0
  43. package/dist/tests/puzzleCanvas.unit.test.js.map +1 -0
  44. package/dist/tests/setup.d.ts +5 -0
  45. package/dist/tests/setup.d.ts.map +1 -0
  46. package/dist/tests/setup.js +3 -0
  47. package/dist/tests/setup.js.map +1 -0
  48. package/package.json +17 -12
  49. package/src/components/ProcaptchaWidget.tsx +17 -6
  50. package/src/services/Manager.ts +14 -10
  51. package/src/tests/manager.unit.test.ts +763 -0
  52. package/src/tests/managerHarness.ts +169 -0
  53. package/src/tests/procaptchaPuzzle.test-d.ts +191 -0
  54. package/src/tests/procaptchaPuzzle.unit.test.ts +123 -0
  55. package/src/tests/procaptchaWidget.unit.test.ts +789 -0
  56. package/src/tests/puzzleCanvas.unit.test.ts +418 -0
  57. package/src/tests/setup.ts +26 -0
  58. package/tsconfig.tsbuildinfo +1 -1
  59. package/vite.test.config.ts +27 -0
@@ -1,278 +1,236 @@
1
- import { jsxs, jsx } from "@emotion/react/jsx-runtime";
2
- import { useState, useRef, useEffect, useCallback } from "react";
3
- const CONTAINER_WIDTH = 300;
4
- const CONTAINER_HEIGHT = 200;
5
- const TARGET_SIZE = 30;
6
- const PIECE_SIZE = 24;
7
- const SHAKE_KEYFRAMES = `
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import { jsx, jsxs } from "@emotion/react/jsx-runtime";
3
+ //#region src/components/PuzzleCanvas.tsx
4
+ var CONTAINER_WIDTH = 300;
5
+ var CONTAINER_HEIGHT = 200;
6
+ var TARGET_SIZE = 30;
7
+ var PIECE_SIZE = 24;
8
+ var SHAKE_KEYFRAMES = `
8
9
  @keyframes prosopo-puzzle-shake {
9
10
  0%, 100% { transform: translateX(0); }
10
11
  10%, 30%, 50%, 70%, 90% { transform: translateX(-4px); }
11
12
  20%, 40%, 60%, 80% { transform: translateX(4px); }
12
13
  }
13
14
  `;
14
- const PuzzleCanvas = ({
15
- originX,
16
- originY,
17
- targetX,
18
- targetY,
19
- onComplete,
20
- showRetry,
21
- submitting
22
- }) => {
23
- const [posX, setPosX] = useState(originX);
24
- const [posY, setPosY] = useState(originY);
25
- const isDragging = useRef(false);
26
- const puzzleEvents = useRef([]);
27
- const containerRef = useRef(null);
28
- const offsetRef = useRef({ x: 0, y: 0 });
29
- const [visible, setVisible] = useState(false);
30
- const [shaking, setShaking] = useState(false);
31
- useEffect(() => {
32
- setPosX(originX);
33
- setPosY(originY);
34
- }, [originX, originY]);
35
- useEffect(() => {
36
- const frame = requestAnimationFrame(() => setVisible(true));
37
- return () => cancelAnimationFrame(frame);
38
- }, []);
39
- useEffect(() => {
40
- if (showRetry) {
41
- setShaking(true);
42
- const timer = setTimeout(() => setShaking(false), 500);
43
- return () => clearTimeout(timer);
44
- }
45
- return () => {
46
- };
47
- }, [showRetry]);
48
- const clamp = useCallback(
49
- (value, min, max) => {
50
- return Math.max(min, Math.min(max, value));
51
- },
52
- []
53
- );
54
- const getContainerOffset = useCallback(() => {
55
- if (containerRef.current) {
56
- const rect = containerRef.current.getBoundingClientRect();
57
- return { x: rect.left, y: rect.top };
58
- }
59
- return { x: 0, y: 0 };
60
- }, []);
61
- const handleMoveEvent = useCallback(
62
- (clientX, clientY) => {
63
- if (!isDragging.current) {
64
- return;
65
- }
66
- const containerOffset = getContainerOffset();
67
- const newX = clamp(
68
- clientX - containerOffset.x - offsetRef.current.x,
69
- 0,
70
- CONTAINER_WIDTH
71
- );
72
- const newY = clamp(
73
- clientY - containerOffset.y - offsetRef.current.y,
74
- 0,
75
- CONTAINER_HEIGHT
76
- );
77
- setPosX(newX);
78
- setPosY(newY);
79
- puzzleEvents.current.push({ x: newX, y: newY, t: Date.now() });
80
- },
81
- [clamp, getContainerOffset]
82
- );
83
- const handleEndEvent = useCallback(() => {
84
- if (!isDragging.current) {
85
- return;
86
- }
87
- isDragging.current = false;
88
- const currentEvents = [...puzzleEvents.current];
89
- const lastEvent = currentEvents[currentEvents.length - 1];
90
- const finalX = lastEvent ? lastEvent.x : originX;
91
- const finalY = lastEvent ? lastEvent.y : originY;
92
- onComplete(finalX, finalY, currentEvents);
93
- }, [onComplete, originX, originY]);
94
- const handleMouseMove = useCallback(
95
- (event) => {
96
- handleMoveEvent(event.clientX, event.clientY);
97
- },
98
- [handleMoveEvent]
99
- );
100
- const handleTouchMove = useCallback(
101
- (event) => {
102
- const touch = event.touches[0];
103
- if (touch) {
104
- handleMoveEvent(touch.clientX, touch.clientY);
105
- }
106
- },
107
- [handleMoveEvent]
108
- );
109
- const handleMouseUp = useCallback(() => {
110
- handleEndEvent();
111
- }, [handleEndEvent]);
112
- const handleTouchEnd = useCallback(() => {
113
- handleEndEvent();
114
- }, [handleEndEvent]);
115
- useEffect(() => {
116
- document.addEventListener("mousemove", handleMouseMove);
117
- document.addEventListener("mouseup", handleMouseUp);
118
- document.addEventListener("touchmove", handleTouchMove);
119
- document.addEventListener("touchend", handleTouchEnd);
120
- return () => {
121
- document.removeEventListener("mousemove", handleMouseMove);
122
- document.removeEventListener("mouseup", handleMouseUp);
123
- document.removeEventListener("touchmove", handleTouchMove);
124
- document.removeEventListener("touchend", handleTouchEnd);
125
- };
126
- }, [handleMouseMove, handleMouseUp, handleTouchMove, handleTouchEnd]);
127
- const handlePieceMouseDown = useCallback(
128
- (event) => {
129
- if (submitting) return;
130
- isDragging.current = true;
131
- puzzleEvents.current = [];
132
- const containerOffset = getContainerOffset();
133
- offsetRef.current = {
134
- x: event.clientX - containerOffset.x - posX,
135
- y: event.clientY - containerOffset.y - posY
136
- };
137
- },
138
- [getContainerOffset, posX, posY, submitting]
139
- );
140
- const handlePieceTouchStart = useCallback(
141
- (event) => {
142
- if (submitting) return;
143
- const touch = event.touches[0];
144
- if (touch) {
145
- isDragging.current = true;
146
- puzzleEvents.current = [];
147
- const containerOffset = getContainerOffset();
148
- offsetRef.current = {
149
- x: touch.clientX - containerOffset.x - posX,
150
- y: touch.clientY - containerOffset.y - posY
151
- };
152
- }
153
- },
154
- [getContainerOffset, posX, posY, submitting]
155
- );
156
- const instructionText = showRetry ? "Not quite try again" : "Drag the piece to the target";
157
- const headerBorderColor = showRetry ? "rgba(220, 53, 69, 0.4)" : "transparent";
158
- const headerTextColor = showRetry ? "#dc3545" : "#333";
159
- return /* @__PURE__ */ jsxs(
160
- "div",
161
- {
162
- style: {
163
- position: "fixed",
164
- inset: 0,
165
- zIndex: 2147483646,
166
- display: "flex",
167
- alignItems: "center",
168
- justifyContent: "center",
169
- backgroundColor: visible ? "rgba(0, 0, 0, 0.4)" : "rgba(0, 0, 0, 0)",
170
- transition: "background-color 0.3s ease"
171
- },
172
- children: [
173
- /* @__PURE__ */ jsx("style", { children: SHAKE_KEYFRAMES }),
174
- /* @__PURE__ */ jsxs(
175
- "div",
176
- {
177
- style: {
178
- display: "flex",
179
- flexDirection: "column",
180
- alignItems: "center",
181
- gap: "0",
182
- zIndex: 2147483647,
183
- opacity: visible ? 1 : 0,
184
- transform: visible ? "scale(1)" : "scale(0.9)",
185
- transition: "opacity 0.3s ease, transform 0.3s ease",
186
- animation: shaking ? "prosopo-puzzle-shake 0.5s ease" : "none"
187
- },
188
- children: [
189
- /* @__PURE__ */ jsx(
190
- "div",
191
- {
192
- style: {
193
- backgroundColor: "#fff",
194
- borderRadius: "8px 8px 0 0",
195
- padding: "12px 20px",
196
- width: `${CONTAINER_WIDTH}px`,
197
- boxSizing: "border-box",
198
- textAlign: "center",
199
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
200
- fontSize: "14px",
201
- fontWeight: 500,
202
- color: headerTextColor,
203
- borderBottom: `2px solid ${headerBorderColor}`,
204
- boxShadow: "0px 11px 15px -7px rgba(0,0,0,0.2), 0px 24px 38px 3px rgba(0,0,0,0.14), 0px 9px 46px 8px rgba(0,0,0,0.12)",
205
- transition: "color 0.3s ease, border-color 0.3s ease"
206
- },
207
- children: instructionText
208
- }
209
- ),
210
- /* @__PURE__ */ jsxs(
211
- "div",
212
- {
213
- ref: containerRef,
214
- style: {
215
- position: "relative",
216
- width: `${CONTAINER_WIDTH}px`,
217
- height: `${CONTAINER_HEIGHT}px`,
218
- background: "linear-gradient(135deg, #e8eaf6 0%, #c5cae9 50%, #e8eaf6 100%)",
219
- borderRadius: "0 0 8px 8px",
220
- overflow: "hidden",
221
- userSelect: "none",
222
- boxShadow: "0px 11px 15px -7px rgba(0,0,0,0.2), 0px 24px 38px 3px rgba(0,0,0,0.14), 0px 9px 46px 8px rgba(0,0,0,0.12)",
223
- opacity: submitting ? 0.6 : 1,
224
- pointerEvents: submitting ? "none" : "auto",
225
- transition: "opacity 0.2s ease"
226
- },
227
- children: [
228
- /* @__PURE__ */ jsx(
229
- "div",
230
- {
231
- style: {
232
- position: "absolute",
233
- left: `${targetX - TARGET_SIZE / 2}px`,
234
- top: `${targetY - TARGET_SIZE / 2}px`,
235
- width: `${TARGET_SIZE}px`,
236
- height: `${TARGET_SIZE}px`,
237
- borderRadius: "50%",
238
- border: "2px dashed rgba(74, 144, 217, 0.6)",
239
- backgroundColor: "rgba(74, 144, 217, 0.08)",
240
- boxSizing: "border-box"
241
- }
242
- }
243
- ),
244
- /* @__PURE__ */ jsx(
245
- "div",
246
- {
247
- ...process.env.NODE_ENV !== "production" && {
248
- "data-cy": "prosopo-puzzle-piece"
249
- },
250
- onMouseDown: handlePieceMouseDown,
251
- onTouchStart: handlePieceTouchStart,
252
- style: {
253
- position: "absolute",
254
- left: `${posX - PIECE_SIZE / 2}px`,
255
- top: `${posY - PIECE_SIZE / 2}px`,
256
- width: `${PIECE_SIZE}px`,
257
- height: `${PIECE_SIZE}px`,
258
- borderRadius: "50%",
259
- background: "radial-gradient(circle at 40% 40%, #6ab0ff, #4a90d9)",
260
- cursor: submitting ? "default" : isDragging.current ? "grabbing" : "grab",
261
- boxShadow: isDragging.current ? "0 4px 12px rgba(74, 144, 217, 0.5)" : "0 2px 6px rgba(74, 144, 217, 0.3)",
262
- transition: isDragging.current ? "none" : "box-shadow 0.2s ease, left 0.3s ease, top 0.3s ease"
263
- }
264
- }
265
- )
266
- ]
267
- }
268
- )
269
- ]
270
- }
271
- )
272
- ]
273
- }
274
- );
275
- };
276
- export {
277
- PuzzleCanvas
15
+ var PuzzleCanvas = ({ originX, originY, targetX, targetY, onComplete, showRetry, submitting }) => {
16
+ const [posX, setPosX] = useState(originX);
17
+ const [posY, setPosY] = useState(originY);
18
+ const isDragging = useRef(false);
19
+ const puzzleEvents = useRef([]);
20
+ const containerRef = useRef(null);
21
+ const offsetRef = useRef({
22
+ x: 0,
23
+ y: 0
24
+ });
25
+ const [visible, setVisible] = useState(false);
26
+ const [shaking, setShaking] = useState(false);
27
+ useEffect(() => {
28
+ setPosX(originX);
29
+ setPosY(originY);
30
+ }, [originX, originY]);
31
+ useEffect(() => {
32
+ const frame = requestAnimationFrame(() => setVisible(true));
33
+ return () => cancelAnimationFrame(frame);
34
+ }, []);
35
+ useEffect(() => {
36
+ if (showRetry) {
37
+ setShaking(true);
38
+ const timer = setTimeout(() => setShaking(false), 500);
39
+ return () => clearTimeout(timer);
40
+ }
41
+ return () => {};
42
+ }, [showRetry]);
43
+ const clamp = useCallback((value, min, max) => {
44
+ return Math.max(min, Math.min(max, value));
45
+ }, []);
46
+ const getContainerOffset = useCallback(() => {
47
+ if (containerRef.current) {
48
+ const rect = containerRef.current.getBoundingClientRect();
49
+ return {
50
+ x: rect.left,
51
+ y: rect.top
52
+ };
53
+ }
54
+ return {
55
+ x: 0,
56
+ y: 0
57
+ };
58
+ }, []);
59
+ const handleMoveEvent = useCallback((clientX, clientY) => {
60
+ if (!isDragging.current) return;
61
+ const containerOffset = getContainerOffset();
62
+ const newX = clamp(clientX - containerOffset.x - offsetRef.current.x, 0, CONTAINER_WIDTH);
63
+ const newY = clamp(clientY - containerOffset.y - offsetRef.current.y, 0, CONTAINER_HEIGHT);
64
+ setPosX(newX);
65
+ setPosY(newY);
66
+ puzzleEvents.current.push({
67
+ x: newX,
68
+ y: newY,
69
+ t: Date.now()
70
+ });
71
+ }, [clamp, getContainerOffset]);
72
+ const handleEndEvent = useCallback(() => {
73
+ if (!isDragging.current) return;
74
+ isDragging.current = false;
75
+ const currentEvents = [...puzzleEvents.current];
76
+ const lastEvent = currentEvents[currentEvents.length - 1];
77
+ onComplete(lastEvent ? lastEvent.x : originX, lastEvent ? lastEvent.y : originY, currentEvents);
78
+ }, [
79
+ onComplete,
80
+ originX,
81
+ originY
82
+ ]);
83
+ const handleMouseMove = useCallback((event) => {
84
+ handleMoveEvent(event.clientX, event.clientY);
85
+ }, [handleMoveEvent]);
86
+ const handleTouchMove = useCallback((event) => {
87
+ const touch = event.touches[0];
88
+ if (touch) handleMoveEvent(touch.clientX, touch.clientY);
89
+ }, [handleMoveEvent]);
90
+ const handleMouseUp = useCallback(() => {
91
+ handleEndEvent();
92
+ }, [handleEndEvent]);
93
+ const handleTouchEnd = useCallback(() => {
94
+ handleEndEvent();
95
+ }, [handleEndEvent]);
96
+ useEffect(() => {
97
+ document.addEventListener("mousemove", handleMouseMove);
98
+ document.addEventListener("mouseup", handleMouseUp);
99
+ document.addEventListener("touchmove", handleTouchMove);
100
+ document.addEventListener("touchend", handleTouchEnd);
101
+ return () => {
102
+ document.removeEventListener("mousemove", handleMouseMove);
103
+ document.removeEventListener("mouseup", handleMouseUp);
104
+ document.removeEventListener("touchmove", handleTouchMove);
105
+ document.removeEventListener("touchend", handleTouchEnd);
106
+ };
107
+ }, [
108
+ handleMouseMove,
109
+ handleMouseUp,
110
+ handleTouchMove,
111
+ handleTouchEnd
112
+ ]);
113
+ const handlePieceMouseDown = useCallback((event) => {
114
+ if (submitting) return;
115
+ isDragging.current = true;
116
+ puzzleEvents.current = [];
117
+ const containerOffset = getContainerOffset();
118
+ offsetRef.current = {
119
+ x: event.clientX - containerOffset.x - posX,
120
+ y: event.clientY - containerOffset.y - posY
121
+ };
122
+ }, [
123
+ getContainerOffset,
124
+ posX,
125
+ posY,
126
+ submitting
127
+ ]);
128
+ const handlePieceTouchStart = useCallback((event) => {
129
+ if (submitting) return;
130
+ const touch = event.touches[0];
131
+ if (touch) {
132
+ isDragging.current = true;
133
+ puzzleEvents.current = [];
134
+ const containerOffset = getContainerOffset();
135
+ offsetRef.current = {
136
+ x: touch.clientX - containerOffset.x - posX,
137
+ y: touch.clientY - containerOffset.y - posY
138
+ };
139
+ }
140
+ }, [
141
+ getContainerOffset,
142
+ posX,
143
+ posY,
144
+ submitting
145
+ ]);
146
+ const instructionText = showRetry ? "Not quite — try again" : "Drag the piece to the target";
147
+ const headerBorderColor = showRetry ? "rgba(220, 53, 69, 0.4)" : "transparent";
148
+ const headerTextColor = showRetry ? "#dc3545" : "#333";
149
+ return /* @__PURE__ */ jsxs("div", {
150
+ style: {
151
+ position: "fixed",
152
+ inset: 0,
153
+ zIndex: 2147483646,
154
+ display: "flex",
155
+ alignItems: "center",
156
+ justifyContent: "center",
157
+ backgroundColor: visible ? "rgba(0, 0, 0, 0.4)" : "rgba(0, 0, 0, 0)",
158
+ transition: "background-color 0.3s ease"
159
+ },
160
+ children: [/* @__PURE__ */ jsx("style", { children: SHAKE_KEYFRAMES }), /* @__PURE__ */ jsxs("div", {
161
+ style: {
162
+ display: "flex",
163
+ flexDirection: "column",
164
+ alignItems: "center",
165
+ gap: "0",
166
+ zIndex: 2147483647,
167
+ opacity: visible ? 1 : 0,
168
+ transform: visible ? "scale(1)" : "scale(0.9)",
169
+ transition: "opacity 0.3s ease, transform 0.3s ease",
170
+ animation: shaking ? "prosopo-puzzle-shake 0.5s ease" : "none"
171
+ },
172
+ children: [/* @__PURE__ */ jsx("div", {
173
+ style: {
174
+ backgroundColor: "#fff",
175
+ borderRadius: "8px 8px 0 0",
176
+ padding: "12px 20px",
177
+ width: `${CONTAINER_WIDTH}px`,
178
+ boxSizing: "border-box",
179
+ textAlign: "center",
180
+ fontFamily: "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif",
181
+ fontSize: "14px",
182
+ fontWeight: 500,
183
+ color: headerTextColor,
184
+ borderBottom: `2px solid ${headerBorderColor}`,
185
+ boxShadow: "0px 11px 15px -7px rgba(0,0,0,0.2), 0px 24px 38px 3px rgba(0,0,0,0.14), 0px 9px 46px 8px rgba(0,0,0,0.12)",
186
+ transition: "color 0.3s ease, border-color 0.3s ease"
187
+ },
188
+ children: instructionText
189
+ }), /* @__PURE__ */ jsxs("div", {
190
+ ref: containerRef,
191
+ style: {
192
+ position: "relative",
193
+ width: `${CONTAINER_WIDTH}px`,
194
+ height: `${CONTAINER_HEIGHT}px`,
195
+ background: "linear-gradient(135deg, #e8eaf6 0%, #c5cae9 50%, #e8eaf6 100%)",
196
+ borderRadius: "0 0 8px 8px",
197
+ overflow: "hidden",
198
+ userSelect: "none",
199
+ boxShadow: "0px 11px 15px -7px rgba(0,0,0,0.2), 0px 24px 38px 3px rgba(0,0,0,0.14), 0px 9px 46px 8px rgba(0,0,0,0.12)",
200
+ opacity: submitting ? .6 : 1,
201
+ pointerEvents: submitting ? "none" : "auto",
202
+ transition: "opacity 0.2s ease"
203
+ },
204
+ children: [/* @__PURE__ */ jsx("div", { style: {
205
+ position: "absolute",
206
+ left: `${targetX - TARGET_SIZE / 2}px`,
207
+ top: `${targetY - TARGET_SIZE / 2}px`,
208
+ width: `${TARGET_SIZE}px`,
209
+ height: `${TARGET_SIZE}px`,
210
+ borderRadius: "50%",
211
+ border: "2px dashed rgba(74, 144, 217, 0.6)",
212
+ backgroundColor: "rgba(74, 144, 217, 0.08)",
213
+ boxSizing: "border-box"
214
+ } }), /* @__PURE__ */ jsx("div", {
215
+ ...process.env.NODE_ENV !== "production" && { "data-cy": "prosopo-puzzle-piece" },
216
+ onMouseDown: handlePieceMouseDown,
217
+ onTouchStart: handlePieceTouchStart,
218
+ style: {
219
+ position: "absolute",
220
+ left: `${posX - PIECE_SIZE / 2}px`,
221
+ top: `${posY - PIECE_SIZE / 2}px`,
222
+ width: `${PIECE_SIZE}px`,
223
+ height: `${PIECE_SIZE}px`,
224
+ borderRadius: "50%",
225
+ background: "radial-gradient(circle at 40% 40%, #6ab0ff, #4a90d9)",
226
+ cursor: submitting ? "default" : isDragging.current ? "grabbing" : "grab",
227
+ boxShadow: isDragging.current ? "0 4px 12px rgba(74, 144, 217, 0.5)" : "0 2px 6px rgba(74, 144, 217, 0.3)",
228
+ transition: isDragging.current ? "none" : "box-shadow 0.2s ease, left 0.3s ease, top 0.3s ease"
229
+ }
230
+ })]
231
+ })]
232
+ })]
233
+ });
278
234
  };
235
+ //#endregion
236
+ export { PuzzleCanvas };
package/dist/index.js CHANGED
@@ -1,5 +1,3 @@
1
- import "./components/ProcaptchaWidget.js";
1
+ import "./_virtual/_rolldown/runtime.js";
2
2
  import { ProcaptchaPuzzle } from "./components/ProcaptchaPuzzle.js";
3
- export {
4
- ProcaptchaPuzzle
5
- };
3
+ export { ProcaptchaPuzzle };
@@ -1 +1 @@
1
- {"version":3,"file":"Manager.d.ts","sourceRoot":"","sources":["../../src/services/Manager.ts"],"names":[],"mappings":"AAyBA,OAAO,EAIN,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAEhC,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,KAAK,WAAW,EAEhB,MAAM,gBAAgB,CAAC;AAIxB,UAAU,mBAAmB;IAC5B,KAAK,EAAE,CACN,CAAC,CAAC,EAAE,MAAM,EACV,CAAC,CAAC,EAAE,MAAM,KACN,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC;IACnD,cAAc,EAAE,CACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,WAAW,EAAE,KACvB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,UAAU,EAAE,CAAC,mBAAmB,CAAC,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CACvD;AAED,eAAO,MAAM,OAAO,gBACN,2BAA2B,SACjC,eAAe,iBACP,uBAAuB,aAC3B,mBAAmB,sBACV,iBAAiB,qBAGlB,MAAM,MAAM,GAAG,SAAS,KACzC,mBAgZF,CAAC"}
1
+ {"version":3,"file":"Manager.d.ts","sourceRoot":"","sources":["../../src/services/Manager.ts"],"names":[],"mappings":"AA0BA,OAAO,EAIN,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAEhC,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,KAAK,WAAW,EAEhB,MAAM,gBAAgB,CAAC;AAIxB,UAAU,mBAAmB;IAC5B,KAAK,EAAE,CACN,CAAC,CAAC,EAAE,MAAM,EACV,CAAC,CAAC,EAAE,MAAM,KACN,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC;IACnD,cAAc,EAAE,CACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,WAAW,EAAE,KACvB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,UAAU,EAAE,CAAC,mBAAmB,CAAC,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CACvD;AAED,eAAO,MAAM,OAAO,gBACN,2BAA2B,SACjC,eAAe,iBACP,uBAAuB,aAC3B,mBAAmB,sBACV,iBAAiB,qBAGlB,MAAM,MAAM,GAAG,SAAS,KACzC,mBAmZF,CAAC"}