@prosopo/procaptcha-puzzle 2.10.51 → 2.10.53

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @prosopo/procaptcha-puzzle@2.10.51 build:cjs
2
+ > @prosopo/procaptcha-puzzle@2.10.53 build:cjs
3
3
  > NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV
4
4
 
5
5
  ViteCommonJSConfig: .
@@ -46,10 +46,10 @@ Bundle build started
46
46
  ✓ 6 modules transformed.
47
47
  rendering chunks...
48
48
  computing gzip size...
49
- dist/cjs/index.cjs 0.22 kB │ gzip: 0.15 kB
50
- dist/cjs/components/ProcaptchaPuzzle.cjs 0.52 kB │ gzip: 0.27 kB
51
- dist/cjs/components/ProcaptchaWidget.cjs 7.01 kB │ gzip: 1.95 kB
52
- dist/cjs/components/PuzzleCanvas.cjs 8.22 kB │ gzip: 2.40 kB
53
- dist/cjs/services/Manager.cjs 9.00 kB │ gzip: 2.48 kB
49
+ dist/cjs/index.cjs 0.22 kB │ gzip: 0.15 kB
50
+ dist/cjs/components/ProcaptchaPuzzle.cjs 0.52 kB │ gzip: 0.27 kB
51
+ dist/cjs/components/ProcaptchaWidget.cjs 7.05 kB │ gzip: 1.96 kB
52
+ dist/cjs/services/Manager.cjs 9.00 kB │ gzip: 2.48 kB
53
+ dist/cjs/components/PuzzleCanvas.cjs 10.36 kB │ gzip: 2.95 kB
54
54
 
55
- ✓ built in 43ms
55
+ ✓ built in 75ms
@@ -1,8 +1,8 @@
1
1
 
2
- > @prosopo/procaptcha-puzzle@2.10.51 build:tsc
2
+ > @prosopo/procaptcha-puzzle@2.10.53 build:tsc
3
3
  > tsc --build --verbose
4
4
 
5
- 11:34:03 AM - Projects in this build:
5
+ 12:13:08 PM - Projects in this build:
6
6
  * ../../dev/config/tsconfig.json
7
7
  * ../locale/tsconfig.json
8
8
  * ../util/tsconfig.json
@@ -20,37 +20,37 @@
20
20
  * ../procaptcha-common/tsconfig.json
21
21
  * tsconfig.json
22
22
 
23
- 11:34:03 AM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/vite/NodejsPolarsNativeFilePlugin.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
23
+ 12:13:08 PM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/webpack/webpack.config.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
24
24
 
25
- 11:34:03 AM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
25
+ 12:13:08 PM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
26
26
 
27
- 11:34:03 AM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
27
+ 12:13:08 PM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
28
28
 
29
- 11:34:04 AM - Project '../util-crypto/tsconfig.json' is up to date because newest input '../util-crypto/src/types.ts' is older than output '../util-crypto/tsconfig.tsbuildinfo'
29
+ 12:13:08 PM - Project '../util-crypto/tsconfig.json' is up to date because newest input '../util-crypto/src/types.ts' is older than output '../util-crypto/tsconfig.tsbuildinfo'
30
30
 
31
- 11:34:04 AM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/types.test-d.ts' is older than output '../types/tsconfig.tsbuildinfo'
31
+ 12:13:08 PM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/types.test-d.ts' is older than output '../types/tsconfig.tsbuildinfo'
32
32
 
33
- 11:34:04 AM - Project '../api/tsconfig.json' is up to date because newest input '../api/src/index.ts' is older than output '../api/tsconfig.tsbuildinfo'
33
+ 12:13:08 PM - Project '../api/tsconfig.json' is up to date because newest input '../api/src/index.ts' is older than output '../api/tsconfig.tsbuildinfo'
34
34
 
35
- 11:34:04 AM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/index.ts' is older than output '../logger/tsconfig.tsbuildinfo'
35
+ 12:13:08 PM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/tests/loggerBrowser.unit.test.ts' is older than output '../logger/tsconfig.tsbuildinfo'
36
36
 
37
- 11:34:04 AM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/error.ts' is older than output '../common/tsconfig.tsbuildinfo'
37
+ 12:13:08 PM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/index.ts' is older than output '../common/tsconfig.tsbuildinfo'
38
38
 
39
- 11:34:04 AM - Project '../load-balancer/tsconfig.json' is up to date because newest input '../load-balancer/src/balancer.ts' is older than output '../load-balancer/tsconfig.tsbuildinfo'
39
+ 12:13:08 PM - Project '../load-balancer/tsconfig.json' is up to date because newest input '../load-balancer/src/balancer.ts' is older than output '../load-balancer/tsconfig.tsbuildinfo'
40
40
 
41
- 11:34:04 AM - Project '../widget-skeleton/tsconfig.json' is up to date because newest input '../widget-skeleton/src/theme.ts' is older than output '../widget-skeleton/tsconfig.tsbuildinfo'
41
+ 12:13:08 PM - Project '../widget-skeleton/tsconfig.json' is up to date because newest input '../widget-skeleton/src/constants.ts' is older than output '../widget-skeleton/tsconfig.tsbuildinfo'
42
42
 
43
- 11:34:04 AM - Project '../fingerprintjs/tsconfig.json' is up to date because newest input '../fingerprintjs/src/utils/browser.ts' is older than output '../fingerprintjs/tsconfig.tsbuildinfo'
43
+ 12:13:08 PM - Project '../fingerprintjs/tsconfig.json' is up to date because newest input '../fingerprintjs/src/utils/browser.ts' is older than output '../fingerprintjs/tsconfig.tsbuildinfo'
44
44
 
45
- 11:34:04 AM - Project '../fingerprint/tsconfig.json' is up to date because newest input '../fingerprint/src/index.ts' is older than output '../fingerprint/tsconfig.tsbuildinfo'
45
+ 12:13:08 PM - Project '../fingerprint/tsconfig.json' is up to date because newest input '../fingerprint/src/index.ts' is older than output '../fingerprint/tsconfig.tsbuildinfo'
46
46
 
47
- 11:34:04 AM - Project '../keyring/tsconfig.json' is up to date because newest input '../keyring/src/pair/decode.ts' is older than output '../keyring/tsconfig.tsbuildinfo'
47
+ 12:13:08 PM - Project '../keyring/tsconfig.json' is up to date because newest input '../keyring/src/pair/decode.ts' is older than output '../keyring/tsconfig.tsbuildinfo'
48
48
 
49
- 11:34:04 AM - Project '../account/tsconfig.json' is up to date because newest input '../account/src/custom.d.ts' is older than output '../account/tsconfig.tsbuildinfo'
49
+ 12:13:08 PM - Project '../account/tsconfig.json' is up to date because newest input '../account/src/index.ts' is older than output '../account/tsconfig.tsbuildinfo'
50
50
 
51
- 11:34:04 AM - Project '../procaptcha-common/tsconfig.json' is up to date because newest input '../procaptcha-common/src/extensionLoader.ts' is older than output '../procaptcha-common/tsconfig.tsbuildinfo'
51
+ 12:13:08 PM - Project '../procaptcha-common/tsconfig.json' is up to date because newest input '../procaptcha-common/src/extensionLoader.ts' is older than output '../procaptcha-common/tsconfig.tsbuildinfo'
52
52
 
53
- 11:34:04 AM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
53
+ 12:13:08 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
54
54
 
55
- 11:34:04 AM - Building project '/home/runner/work/captcha/captcha/packages/procaptcha-puzzle/tsconfig.json'...
55
+ 12:13:08 PM - Building project '/home/runner/work/captcha/captcha/packages/procaptcha-puzzle/tsconfig.json'...
56
56
 
@@ -1,9 +1,9 @@
1
1
 
2
- > @prosopo/procaptcha-puzzle@2.10.51 build
2
+ > @prosopo/procaptcha-puzzle@2.10.53 build
3
3
  > npm run build:cross-env -- --mode ${NODE_ENV:-development}
4
4
 
5
5
 
6
- > @prosopo/procaptcha-puzzle@2.10.51 build:cross-env
6
+ > @prosopo/procaptcha-puzzle@2.10.53 build:cross-env
7
7
  > vite build --config vite.esm.config.ts --mode production
8
8
 
9
9
  ViteEsmConfig: .
@@ -53,8 +53,8 @@ computing gzip size...
53
53
  dist/_virtual/_rolldown/runtime.js 0.04 kB │ gzip: 0.06 kB
54
54
  dist/index.js 0.14 kB │ gzip: 0.11 kB
55
55
  dist/components/ProcaptchaPuzzle.js 0.38 kB │ gzip: 0.24 kB
56
- dist/components/ProcaptchaWidget.js 6.50 kB │ gzip: 1.93 kB
57
- dist/components/PuzzleCanvas.js 7.76 kB │ gzip: 2.37 kB
56
+ dist/components/ProcaptchaWidget.js 6.54 kB │ gzip: 1.94 kB
58
57
  dist/services/Manager.js 8.48 kB │ gzip: 2.44 kB
58
+ dist/components/PuzzleCanvas.js 9.86 kB │ gzip: 2.92 kB
59
59
 
60
- ✓ built in 56ms
60
+ ✓ built in 64ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @prosopo/procaptcha-puzzle
2
2
 
3
+ ## 2.10.53
4
+ ### Patch Changes
5
+
6
+ - Updated dependencies [ae475a5]
7
+ - @prosopo/types@5.2.2
8
+ - @prosopo/api@4.0.10
9
+ - @prosopo/procaptcha-common@2.11.30
10
+
11
+ ## 2.10.52
12
+ ### Patch Changes
13
+
14
+ - 35f640f: Render puzzle captcha imagery on the provider instead of sending the answer to the client.
15
+
16
+ The challenge used to carry `targetX`/`targetY` and the widget drew the target box straight from them, so any HTTP client could echo the coordinates back as its solution and pass without a browser. The provider now synthesises a background procedurally, cuts the notch into the pixels, and returns the background and piece as data URIs; the target and the tolerance never leave the server.
17
+
18
+ Backgrounds come from the new `@prosopo/puzzle-assets` package and are single-use — reusing one across two challenges would let an attacker diff the composites and recover both notch positions.
19
+ - Updated dependencies [35f640f]
20
+ - @prosopo/types@5.2.1
21
+ - @prosopo/api@4.0.9
22
+ - @prosopo/procaptcha-common@2.11.29
23
+
3
24
  ## 2.10.51
4
25
  ### Patch Changes
5
26
 
@@ -142,8 +142,9 @@ var Procaptcha = (props) => {
142
142
  showPuzzleOverlay && /* @__PURE__ */ (0, _emotion_react_jsx_runtime.jsx)(require_PuzzleCanvas.PuzzleCanvas, {
143
143
  originX: challengeData.originX,
144
144
  originY: challengeData.originY,
145
- targetX: challengeData.targetX,
146
- targetY: challengeData.targetY,
145
+ background: challengeData.background,
146
+ piece: challengeData.piece,
147
+ pieceSize: challengeData.pieceSize,
147
148
  onComplete: handlePuzzleComplete,
148
149
  showRetry,
149
150
  submitting: puzzlePhase === "submitting",
@@ -3,8 +3,6 @@ let _emotion_react_jsx_runtime = require("@emotion/react/jsx-runtime");
3
3
  //#region src/components/PuzzleCanvas.tsx
4
4
  var CONTAINER_WIDTH = 300;
5
5
  var CONTAINER_HEIGHT = 200;
6
- var TARGET_SIZE = 30;
7
- var PIECE_SIZE = 24;
8
6
  var SHAKE_KEYFRAMES = `
9
7
  @keyframes prosopo-puzzle-shake {
10
8
  0%, 100% { transform: translateX(0); }
@@ -12,10 +10,11 @@ var SHAKE_KEYFRAMES = `
12
10
  20%, 40%, 60%, 80% { transform: translateX(4px); }
13
11
  }
14
12
  `;
15
- var PuzzleCanvas = ({ originX, originY, targetX, targetY, onComplete, showRetry, submitting, theme }) => {
13
+ var PuzzleCanvas = ({ originX, originY, background, piece, pieceSize, onComplete, showRetry, submitting, theme }) => {
16
14
  const [posX, setPosX] = (0, react.useState)(originX);
17
15
  const [posY, setPosY] = (0, react.useState)(originY);
18
16
  const isDragging = (0, react.useRef)(false);
17
+ const [dragging, setDragging] = (0, react.useState)(false);
19
18
  const puzzleEvents = (0, react.useRef)([]);
20
19
  const containerRef = (0, react.useRef)(null);
21
20
  const offsetRef = (0, react.useRef)({
@@ -72,6 +71,7 @@ var PuzzleCanvas = ({ originX, originY, targetX, targetY, onComplete, showRetry,
72
71
  const handleEndEvent = (0, react.useCallback)(() => {
73
72
  if (!isDragging.current) return;
74
73
  isDragging.current = false;
74
+ setDragging(false);
75
75
  const currentEvents = [...puzzleEvents.current];
76
76
  const lastEvent = currentEvents[currentEvents.length - 1];
77
77
  onComplete(lastEvent ? lastEvent.x : originX, lastEvent ? lastEvent.y : originY, currentEvents);
@@ -113,6 +113,7 @@ var PuzzleCanvas = ({ originX, originY, targetX, targetY, onComplete, showRetry,
113
113
  const handlePieceMouseDown = (0, react.useCallback)((event) => {
114
114
  if (submitting) return;
115
115
  isDragging.current = true;
116
+ setDragging(true);
116
117
  puzzleEvents.current = [];
117
118
  const containerOffset = getContainerOffset();
118
119
  offsetRef.current = {
@@ -130,6 +131,7 @@ var PuzzleCanvas = ({ originX, originY, targetX, targetY, onComplete, showRetry,
130
131
  const touch = event.touches[0];
131
132
  if (touch) {
132
133
  isDragging.current = true;
134
+ setDragging(true);
133
135
  puzzleEvents.current = [];
134
136
  const containerOffset = getContainerOffset();
135
137
  offsetRef.current = {
@@ -147,7 +149,18 @@ var PuzzleCanvas = ({ originX, originY, targetX, targetY, onComplete, showRetry,
147
149
  const headerBorderColor = showRetry ? theme.palette.error.main : "transparent";
148
150
  const headerTextColor = showRetry ? theme.palette.error.main : theme.palette.onSurface;
149
151
  const puzzleAreaBg = `linear-gradient(135deg, ${theme.palette.surface} 0%, ${theme.palette.primaryContainer.main} 50%, ${theme.palette.surface} 100%)`;
150
- const puzzle = theme.palette.puzzle;
152
+ const deltaX = posX - originX;
153
+ const deltaY = posY - originY;
154
+ const dragDistance = Math.hypot(deltaX, deltaY);
155
+ const PARALLAX_FACTOR = .08;
156
+ const bgTranslateX = dragging ? -deltaX * PARALLAX_FACTOR : 0;
157
+ const bgTranslateY = dragging ? -deltaY * PARALLAX_FACTOR : 0;
158
+ const bgScale = dragging ? 1.03 : 1;
159
+ const hueShift = dragging ? Math.max(-18, Math.min(18, deltaX * .12)) : 0;
160
+ const satBoost = dragging ? 1 + Math.min(.25, dragDistance * .0035) : 1;
161
+ const brightness = dragging ? 1 - Math.min(.06, dragDistance * 8e-4) : 1;
162
+ const bgFilter = `hue-rotate(${hueShift.toFixed(2)}deg) saturate(${satBoost.toFixed(3)}) brightness(${brightness.toFixed(3)})`;
163
+ const bgTransform = `translate(${bgTranslateX.toFixed(2)}px, ${bgTranslateY.toFixed(2)}px) scale(${bgScale.toFixed(3)})`;
151
164
  return /* @__PURE__ */ (0, _emotion_react_jsx_runtime.jsxs)("div", {
152
165
  style: {
153
166
  position: "fixed",
@@ -201,33 +214,110 @@ var PuzzleCanvas = ({ originX, originY, targetX, targetY, onComplete, showRetry,
201
214
  pointerEvents: submitting ? "none" : "auto",
202
215
  transition: "opacity 0.2s ease"
203
216
  },
204
- children: [/* @__PURE__ */ (0, _emotion_react_jsx_runtime.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 ${puzzle.targetBorder}`,
212
- backgroundColor: puzzle.targetFill,
213
- boxSizing: "border-box"
214
- } }), /* @__PURE__ */ (0, _emotion_react_jsx_runtime.jsx)("div", {
217
+ children: [/* @__PURE__ */ (0, _emotion_react_jsx_runtime.jsx)("div", {
218
+ style: {
219
+ position: "absolute",
220
+ left: `-${CONTAINER_WIDTH}px`,
221
+ top: `-${CONTAINER_HEIGHT}px`,
222
+ width: `${CONTAINER_WIDTH * 3}px`,
223
+ height: `${CONTAINER_HEIGHT * 3}px`,
224
+ pointerEvents: "none",
225
+ userSelect: "none",
226
+ transform: bgTransform,
227
+ transformOrigin: "center center",
228
+ filter: bgFilter,
229
+ transition: dragging ? "none" : "transform 0.35s cubic-bezier(0.22, 1, 0.36, 1), filter 0.35s ease",
230
+ willChange: "transform, filter"
231
+ },
232
+ children: [
233
+ [
234
+ 0,
235
+ 0,
236
+ -1,
237
+ -1
238
+ ],
239
+ [
240
+ 1,
241
+ 0,
242
+ 1,
243
+ -1
244
+ ],
245
+ [
246
+ 2,
247
+ 0,
248
+ -1,
249
+ -1
250
+ ],
251
+ [
252
+ 0,
253
+ 1,
254
+ -1,
255
+ 1
256
+ ],
257
+ [
258
+ 1,
259
+ 1,
260
+ 1,
261
+ 1
262
+ ],
263
+ [
264
+ 2,
265
+ 1,
266
+ -1,
267
+ 1
268
+ ],
269
+ [
270
+ 0,
271
+ 2,
272
+ -1,
273
+ -1
274
+ ],
275
+ [
276
+ 1,
277
+ 2,
278
+ 1,
279
+ -1
280
+ ],
281
+ [
282
+ 2,
283
+ 2,
284
+ -1,
285
+ -1
286
+ ]
287
+ ].map(([col, row, sx, sy]) => {
288
+ const key = `${col}-${row}`;
289
+ return /* @__PURE__ */ (0, _emotion_react_jsx_runtime.jsx)("img", {
290
+ src: background,
291
+ alt: "",
292
+ draggable: false,
293
+ style: {
294
+ position: "absolute",
295
+ left: `${(col ?? 0) * CONTAINER_WIDTH}px`,
296
+ top: `${(row ?? 0) * CONTAINER_HEIGHT}px`,
297
+ width: `${CONTAINER_WIDTH}px`,
298
+ height: `${CONTAINER_HEIGHT}px`,
299
+ transform: `scale(${sx}, ${sy})`,
300
+ pointerEvents: "none",
301
+ userSelect: "none"
302
+ }
303
+ }, key);
304
+ })
305
+ }), /* @__PURE__ */ (0, _emotion_react_jsx_runtime.jsx)("div", {
215
306
  ...process.env.NODE_ENV !== "production" && { "data-cy": "prosopo-puzzle-piece" },
216
307
  onMouseDown: handlePieceMouseDown,
217
308
  onTouchStart: handlePieceTouchStart,
218
309
  style: {
219
310
  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: puzzle.pieceGradient,
311
+ left: `${posX - pieceSize / 2}px`,
312
+ top: `${posY - pieceSize / 2}px`,
313
+ width: `${pieceSize}px`,
314
+ height: `${pieceSize}px`,
315
+ backgroundImage: `url(${piece})`,
316
+ backgroundSize: "100% 100%",
226
317
  touchAction: "none",
227
318
  cursor: submitting ? "default" : isDragging.current ? "grabbing" : "grab",
228
- outline: isDragging.current ? `3px solid ${puzzle.targetBorder}` : "none",
229
- outlineOffset: "2px",
230
- transition: isDragging.current ? "none" : "outline 0.2s ease, left 0.3s ease, top 0.3s ease"
319
+ filter: isDragging.current ? "drop-shadow(0 4px 10px rgba(0, 0, 0, 0.45))" : "drop-shadow(0 2px 5px rgba(0, 0, 0, 0.35))",
320
+ transition: isDragging.current ? "none" : "filter 0.2s ease, left 0.3s ease, top 0.3s ease"
231
321
  }
232
322
  })]
233
323
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"ProcaptchaWidget.d.ts","sourceRoot":"","sources":["../../src/components/ProcaptchaWidget.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAGN,KAAK,eAAe,EAEpB,MAAM,gBAAgB,CAAC;AAWxB,QAAA,MAAM,UAAU,UAAW,eAAe,qDA2QzC,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"ProcaptchaWidget.d.ts","sourceRoot":"","sources":["../../src/components/ProcaptchaWidget.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAGN,KAAK,eAAe,EAEpB,MAAM,gBAAgB,CAAC;AAWxB,QAAA,MAAM,UAAU,UAAW,eAAe,qDA4QzC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -143,8 +143,9 @@ var Procaptcha = (props) => {
143
143
  showPuzzleOverlay && /* @__PURE__ */ jsx(PuzzleCanvas, {
144
144
  originX: challengeData.originX,
145
145
  originY: challengeData.originY,
146
- targetX: challengeData.targetX,
147
- targetY: challengeData.targetY,
146
+ background: challengeData.background,
147
+ piece: challengeData.piece,
148
+ pieceSize: challengeData.pieceSize,
148
149
  onComplete: handlePuzzleComplete,
149
150
  showRetry,
150
151
  submitting: puzzlePhase === "submitting",
@@ -1 +1 @@
1
- {"version":3,"file":"ProcaptchaWidget.js","sourceRoot":"","sources":["../../src/components/ProcaptchaWidget.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProcaptchaWidget.js","sourceRoot":"","sources":["../../src/components/ProcaptchaWidget.tsx"],"names":[],"mappings":"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"}
@@ -3,13 +3,14 @@ import type { Theme } from "@prosopo/widget-skeleton";
3
3
  interface PuzzleCanvasProps {
4
4
  originX: number;
5
5
  originY: number;
6
- targetX: number;
7
- targetY: number;
6
+ background: string;
7
+ piece: string;
8
+ pieceSize: number;
8
9
  onComplete: (finalX: number, finalY: number, puzzleEvents: PuzzleEvent[]) => void;
9
10
  showRetry: boolean;
10
11
  submitting: boolean;
11
12
  theme: Theme;
12
13
  }
13
- export declare const PuzzleCanvas: ({ originX, originY, targetX, targetY, onComplete, showRetry, submitting, theme, }: PuzzleCanvasProps) => import("@emotion/react/jsx-runtime").JSX.Element;
14
+ export declare const PuzzleCanvas: ({ originX, originY, background, piece, pieceSize, onComplete, showRetry, submitting, theme, }: PuzzleCanvasProps) => import("@emotion/react/jsx-runtime").JSX.Element;
14
15
  export {};
15
16
  //# sourceMappingURL=PuzzleCanvas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PuzzleCanvas.d.ts","sourceRoot":"","sources":["../../src/components/PuzzleCanvas.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAGtD,UAAU,iBAAiB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,WAAW,EAAE,KACvB,IAAI,CAAC;IACV,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;CACb;AAeD,eAAO,MAAM,YAAY,sFAStB,iBAAiB,qDA+SnB,CAAC"}
1
+ {"version":3,"file":"PuzzleCanvas.d.ts","sourceRoot":"","sources":["../../src/components/PuzzleCanvas.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAGtD,UAAU,iBAAiB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAEhB,UAAU,EAAE,MAAM,CAAC;IAEnB,KAAK,EAAE,MAAM,CAAC;IAEd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,WAAW,EAAE,KACvB,IAAI,CAAC;IACV,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;CACb;AAaD,eAAO,MAAM,YAAY,kGAUtB,iBAAiB,qDAwXnB,CAAC"}
@@ -3,8 +3,6 @@ import { jsx, jsxs } from "@emotion/react/jsx-runtime";
3
3
  //#region src/components/PuzzleCanvas.tsx
4
4
  var CONTAINER_WIDTH = 300;
5
5
  var CONTAINER_HEIGHT = 200;
6
- var TARGET_SIZE = 30;
7
- var PIECE_SIZE = 24;
8
6
  var SHAKE_KEYFRAMES = `
9
7
  @keyframes prosopo-puzzle-shake {
10
8
  0%, 100% { transform: translateX(0); }
@@ -12,10 +10,11 @@ var SHAKE_KEYFRAMES = `
12
10
  20%, 40%, 60%, 80% { transform: translateX(4px); }
13
11
  }
14
12
  `;
15
- var PuzzleCanvas = ({ originX, originY, targetX, targetY, onComplete, showRetry, submitting, theme }) => {
13
+ var PuzzleCanvas = ({ originX, originY, background, piece, pieceSize, onComplete, showRetry, submitting, theme }) => {
16
14
  const [posX, setPosX] = useState(originX);
17
15
  const [posY, setPosY] = useState(originY);
18
16
  const isDragging = useRef(false);
17
+ const [dragging, setDragging] = useState(false);
19
18
  const puzzleEvents = useRef([]);
20
19
  const containerRef = useRef(null);
21
20
  const offsetRef = useRef({
@@ -72,6 +71,7 @@ var PuzzleCanvas = ({ originX, originY, targetX, targetY, onComplete, showRetry,
72
71
  const handleEndEvent = useCallback(() => {
73
72
  if (!isDragging.current) return;
74
73
  isDragging.current = false;
74
+ setDragging(false);
75
75
  const currentEvents = [...puzzleEvents.current];
76
76
  const lastEvent = currentEvents[currentEvents.length - 1];
77
77
  onComplete(lastEvent ? lastEvent.x : originX, lastEvent ? lastEvent.y : originY, currentEvents);
@@ -113,6 +113,7 @@ var PuzzleCanvas = ({ originX, originY, targetX, targetY, onComplete, showRetry,
113
113
  const handlePieceMouseDown = useCallback((event) => {
114
114
  if (submitting) return;
115
115
  isDragging.current = true;
116
+ setDragging(true);
116
117
  puzzleEvents.current = [];
117
118
  const containerOffset = getContainerOffset();
118
119
  offsetRef.current = {
@@ -130,6 +131,7 @@ var PuzzleCanvas = ({ originX, originY, targetX, targetY, onComplete, showRetry,
130
131
  const touch = event.touches[0];
131
132
  if (touch) {
132
133
  isDragging.current = true;
134
+ setDragging(true);
133
135
  puzzleEvents.current = [];
134
136
  const containerOffset = getContainerOffset();
135
137
  offsetRef.current = {
@@ -147,7 +149,18 @@ var PuzzleCanvas = ({ originX, originY, targetX, targetY, onComplete, showRetry,
147
149
  const headerBorderColor = showRetry ? theme.palette.error.main : "transparent";
148
150
  const headerTextColor = showRetry ? theme.palette.error.main : theme.palette.onSurface;
149
151
  const puzzleAreaBg = `linear-gradient(135deg, ${theme.palette.surface} 0%, ${theme.palette.primaryContainer.main} 50%, ${theme.palette.surface} 100%)`;
150
- const puzzle = theme.palette.puzzle;
152
+ const deltaX = posX - originX;
153
+ const deltaY = posY - originY;
154
+ const dragDistance = Math.hypot(deltaX, deltaY);
155
+ const PARALLAX_FACTOR = .08;
156
+ const bgTranslateX = dragging ? -deltaX * PARALLAX_FACTOR : 0;
157
+ const bgTranslateY = dragging ? -deltaY * PARALLAX_FACTOR : 0;
158
+ const bgScale = dragging ? 1.03 : 1;
159
+ const hueShift = dragging ? Math.max(-18, Math.min(18, deltaX * .12)) : 0;
160
+ const satBoost = dragging ? 1 + Math.min(.25, dragDistance * .0035) : 1;
161
+ const brightness = dragging ? 1 - Math.min(.06, dragDistance * 8e-4) : 1;
162
+ const bgFilter = `hue-rotate(${hueShift.toFixed(2)}deg) saturate(${satBoost.toFixed(3)}) brightness(${brightness.toFixed(3)})`;
163
+ const bgTransform = `translate(${bgTranslateX.toFixed(2)}px, ${bgTranslateY.toFixed(2)}px) scale(${bgScale.toFixed(3)})`;
151
164
  return /* @__PURE__ */ jsxs("div", {
152
165
  style: {
153
166
  position: "fixed",
@@ -201,33 +214,110 @@ var PuzzleCanvas = ({ originX, originY, targetX, targetY, onComplete, showRetry,
201
214
  pointerEvents: submitting ? "none" : "auto",
202
215
  transition: "opacity 0.2s ease"
203
216
  },
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 ${puzzle.targetBorder}`,
212
- backgroundColor: puzzle.targetFill,
213
- boxSizing: "border-box"
214
- } }), /* @__PURE__ */ jsx("div", {
217
+ children: [/* @__PURE__ */ jsx("div", {
218
+ style: {
219
+ position: "absolute",
220
+ left: `-${CONTAINER_WIDTH}px`,
221
+ top: `-${CONTAINER_HEIGHT}px`,
222
+ width: `${CONTAINER_WIDTH * 3}px`,
223
+ height: `${CONTAINER_HEIGHT * 3}px`,
224
+ pointerEvents: "none",
225
+ userSelect: "none",
226
+ transform: bgTransform,
227
+ transformOrigin: "center center",
228
+ filter: bgFilter,
229
+ transition: dragging ? "none" : "transform 0.35s cubic-bezier(0.22, 1, 0.36, 1), filter 0.35s ease",
230
+ willChange: "transform, filter"
231
+ },
232
+ children: [
233
+ [
234
+ 0,
235
+ 0,
236
+ -1,
237
+ -1
238
+ ],
239
+ [
240
+ 1,
241
+ 0,
242
+ 1,
243
+ -1
244
+ ],
245
+ [
246
+ 2,
247
+ 0,
248
+ -1,
249
+ -1
250
+ ],
251
+ [
252
+ 0,
253
+ 1,
254
+ -1,
255
+ 1
256
+ ],
257
+ [
258
+ 1,
259
+ 1,
260
+ 1,
261
+ 1
262
+ ],
263
+ [
264
+ 2,
265
+ 1,
266
+ -1,
267
+ 1
268
+ ],
269
+ [
270
+ 0,
271
+ 2,
272
+ -1,
273
+ -1
274
+ ],
275
+ [
276
+ 1,
277
+ 2,
278
+ 1,
279
+ -1
280
+ ],
281
+ [
282
+ 2,
283
+ 2,
284
+ -1,
285
+ -1
286
+ ]
287
+ ].map(([col, row, sx, sy]) => {
288
+ const key = `${col}-${row}`;
289
+ return /* @__PURE__ */ jsx("img", {
290
+ src: background,
291
+ alt: "",
292
+ draggable: false,
293
+ style: {
294
+ position: "absolute",
295
+ left: `${(col ?? 0) * CONTAINER_WIDTH}px`,
296
+ top: `${(row ?? 0) * CONTAINER_HEIGHT}px`,
297
+ width: `${CONTAINER_WIDTH}px`,
298
+ height: `${CONTAINER_HEIGHT}px`,
299
+ transform: `scale(${sx}, ${sy})`,
300
+ pointerEvents: "none",
301
+ userSelect: "none"
302
+ }
303
+ }, key);
304
+ })
305
+ }), /* @__PURE__ */ jsx("div", {
215
306
  ...process.env.NODE_ENV !== "production" && { "data-cy": "prosopo-puzzle-piece" },
216
307
  onMouseDown: handlePieceMouseDown,
217
308
  onTouchStart: handlePieceTouchStart,
218
309
  style: {
219
310
  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: puzzle.pieceGradient,
311
+ left: `${posX - pieceSize / 2}px`,
312
+ top: `${posY - pieceSize / 2}px`,
313
+ width: `${pieceSize}px`,
314
+ height: `${pieceSize}px`,
315
+ backgroundImage: `url(${piece})`,
316
+ backgroundSize: "100% 100%",
226
317
  touchAction: "none",
227
318
  cursor: submitting ? "default" : isDragging.current ? "grabbing" : "grab",
228
- outline: isDragging.current ? `3px solid ${puzzle.targetBorder}` : "none",
229
- outlineOffset: "2px",
230
- transition: isDragging.current ? "none" : "outline 0.2s ease, left 0.3s ease, top 0.3s ease"
319
+ filter: isDragging.current ? "drop-shadow(0 4px 10px rgba(0, 0, 0, 0.45))" : "drop-shadow(0 2px 5px rgba(0, 0, 0, 0.35))",
320
+ transition: isDragging.current ? "none" : "filter 0.2s ease, left 0.3s ease, top 0.3s ease"
231
321
  }
232
322
  })]
233
323
  })]