@prosopo/procaptcha-common 2.13.3 → 2.14.1
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/.turbo/turbo-build$colon$cjs.log +6 -6
- package/.turbo/turbo-build$colon$tsc.log +18 -18
- package/.turbo/turbo-build.log +7 -7
- package/CHANGELOG.md +74 -0
- package/dist/callbacks/defaultCallbacks.d.ts.map +1 -1
- package/dist/callbacks/defaultCallbacks.js +1 -4
- package/dist/callbacks/defaultCallbacks.js.map +1 -1
- package/dist/cjs/callbacks/defaultCallbacks.cjs +1 -4
- package/dist/cjs/elements/window.cjs +5 -2
- package/dist/cjs/reactComponents/ChallengeSurface.cjs +44 -1
- package/dist/cjs/reactComponents/Checkbox.cjs +29 -3
- package/dist/elements/window.d.ts +3 -1
- package/dist/elements/window.d.ts.map +1 -1
- package/dist/elements/window.js +5 -2
- package/dist/elements/window.js.map +1 -1
- package/dist/reactComponents/ChallengeSurface.d.ts +1 -0
- package/dist/reactComponents/ChallengeSurface.d.ts.map +1 -1
- package/dist/reactComponents/ChallengeSurface.js +44 -1
- package/dist/reactComponents/ChallengeSurface.js.map +1 -1
- package/dist/reactComponents/Checkbox.d.ts +1 -0
- package/dist/reactComponents/Checkbox.d.ts.map +1 -1
- package/dist/reactComponents/Checkbox.js +30 -4
- package/dist/reactComponents/Checkbox.js.map +1 -1
- package/dist/tests/challengeSurfaceRender.unit.test.js +71 -3
- package/dist/tests/challengeSurfaceRender.unit.test.js.map +1 -1
- package/package.json +9 -9
- package/src/callbacks/defaultCallbacks.ts +5 -7
- package/src/elements/window.ts +13 -4
- package/src/reactComponents/ChallengeSurface.tsx +74 -0
- package/src/reactComponents/Checkbox.tsx +51 -2
- package/src/tests/challengeSurfaceRender.unit.test.tsx +111 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/procaptcha-common@2.
|
|
2
|
+
> @prosopo/procaptcha-common@2.14.1 build:cjs
|
|
3
3
|
> NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV
|
|
4
4
|
|
|
5
5
|
ViteCommonJSConfig: .
|
|
@@ -48,16 +48,16 @@ dist/cjs/elements/form.cjs 0.62 kB │ gzip: 0.31 kB
|
|
|
48
48
|
dist/cjs/simdReadings.cjs 0.79 kB │ gzip: 0.36 kB
|
|
49
49
|
dist/cjs/clientMetaData.cjs 0.83 kB │ gzip: 0.47 kB
|
|
50
50
|
dist/cjs/events/trust.cjs 0.91 kB │ gzip: 0.53 kB
|
|
51
|
-
dist/cjs/elements/window.cjs 0.96 kB │ gzip: 0.54 kB
|
|
52
51
|
dist/cjs/_virtual/_rolldown/runtime.cjs 1.00 kB │ gzip: 0.50 kB
|
|
52
|
+
dist/cjs/elements/window.cjs 1.12 kB │ gzip: 0.60 kB
|
|
53
53
|
dist/cjs/reactComponents/TestModeBanner.cjs 1.36 kB │ gzip: 0.75 kB
|
|
54
54
|
dist/cjs/providers.cjs 1.54 kB │ gzip: 0.64 kB
|
|
55
55
|
dist/cjs/reactComponents/Honeypot.cjs 2.03 kB │ gzip: 0.91 kB
|
|
56
56
|
dist/cjs/index.cjs 2.45 kB │ gzip: 0.63 kB
|
|
57
57
|
dist/cjs/reactComponents/Reload.cjs 2.94 kB │ gzip: 1.30 kB
|
|
58
58
|
dist/cjs/state/builder.cjs 3.13 kB │ gzip: 0.84 kB
|
|
59
|
-
dist/cjs/callbacks/defaultCallbacks.cjs 3.
|
|
60
|
-
dist/cjs/reactComponents/
|
|
61
|
-
dist/cjs/reactComponents/
|
|
59
|
+
dist/cjs/callbacks/defaultCallbacks.cjs 3.78 kB │ gzip: 1.01 kB
|
|
60
|
+
dist/cjs/reactComponents/Checkbox.cjs 6.21 kB │ gzip: 2.42 kB
|
|
61
|
+
dist/cjs/reactComponents/ChallengeSurface.cjs 6.72 kB │ gzip: 2.29 kB
|
|
62
62
|
|
|
63
|
-
[32m✓ built in
|
|
63
|
+
[32m✓ built in 86ms[39m
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/procaptcha-common@2.
|
|
2
|
+
> @prosopo/procaptcha-common@2.14.1 build:tsc
|
|
3
3
|
> tsc --build --verbose
|
|
4
4
|
|
|
5
|
-
1:
|
|
5
|
+
1:04:33 PM - Projects in this build:
|
|
6
6
|
* ../../dev/config/tsconfig.json
|
|
7
7
|
* ../locale/tsconfig.json
|
|
8
8
|
* ../util/tsconfig.json
|
|
@@ -18,35 +18,35 @@
|
|
|
18
18
|
* ../account/tsconfig.json
|
|
19
19
|
* tsconfig.json
|
|
20
20
|
|
|
21
|
-
1:
|
|
21
|
+
1:04:34 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'
|
|
22
22
|
|
|
23
|
-
1:
|
|
23
|
+
1:04:34 PM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
|
|
24
24
|
|
|
25
|
-
1:
|
|
25
|
+
1:04:34 PM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
|
|
26
26
|
|
|
27
|
-
1:
|
|
27
|
+
1:04:34 PM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/logger.ts' is older than output '../logger/tsconfig.tsbuildinfo'
|
|
28
28
|
|
|
29
|
-
1:
|
|
29
|
+
1:04:34 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
|
-
1:
|
|
31
|
+
1:04:34 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
|
-
1:
|
|
33
|
+
1:04:34 PM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/tests/utils/batches.unit.test.ts' is older than output '../common/tsconfig.tsbuildinfo'
|
|
34
34
|
|
|
35
|
-
1:
|
|
35
|
+
1:04:34 PM - Project '../load-balancer/tsconfig.json' is up to date because newest input '../load-balancer/src/tests/productionProviderList.unit.test.ts' is older than output '../load-balancer/tsconfig.tsbuildinfo'
|
|
36
36
|
|
|
37
|
-
1:
|
|
37
|
+
1:04:34 PM - Project '../widget-skeleton/tsconfig.json' is up to date because newest input '../widget-skeleton/src/webComponent/createWidget.ts' is older than output '../widget-skeleton/tsconfig.tsbuildinfo'
|
|
38
38
|
|
|
39
|
-
1:
|
|
39
|
+
1:04:34 PM - Project '../fingerprintjs/tsconfig.json' is up to date because newest input '../fingerprintjs/src/utils/browser.ts' is older than output '../fingerprintjs/tsconfig.tsbuildinfo'
|
|
40
40
|
|
|
41
|
-
1:
|
|
41
|
+
1:04:34 PM - Project '../fingerprint/tsconfig.json' is up to date because newest input '../fingerprint/src/index.ts' is older than output '../fingerprint/tsconfig.tsbuildinfo'
|
|
42
42
|
|
|
43
|
-
1:
|
|
43
|
+
1:04:34 PM - Project '../keyring/tsconfig.json' is up to date because newest input '../keyring/src/pair/decode.ts' is older than output '../keyring/tsconfig.tsbuildinfo'
|
|
44
44
|
|
|
45
|
-
1:
|
|
45
|
+
1:04:34 PM - Project '../account/tsconfig.json' is out of date because output file '../account/tsconfig.tsbuildinfo' does not exist
|
|
46
46
|
|
|
47
|
-
1:
|
|
47
|
+
1:04:34 PM - Building project '/home/runner/work/captcha/captcha/packages/account/tsconfig.json'...
|
|
48
48
|
|
|
49
|
-
1:
|
|
49
|
+
1:04:37 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
|
|
50
50
|
|
|
51
|
-
1:
|
|
51
|
+
1:04:37 PM - Building project '/home/runner/work/captcha/captcha/packages/procaptcha-common/tsconfig.json'...
|
|
52
52
|
|
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/procaptcha-common@2.
|
|
2
|
+
> @prosopo/procaptcha-common@2.14.1 build
|
|
3
3
|
> npm run build:cross-env -- --mode ${NODE_ENV:-development}
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> @prosopo/procaptcha-common@2.
|
|
6
|
+
> @prosopo/procaptcha-common@2.14.1 build:cross-env
|
|
7
7
|
> vite build --config vite.esm.config.ts --mode production
|
|
8
8
|
|
|
9
9
|
ViteEsmConfig: .
|
|
@@ -53,15 +53,15 @@ dist/elements/form.js 0.56 kB │ gzip: 0.30 kB
|
|
|
53
53
|
dist/simdReadings.js 0.72 kB │ gzip: 0.35 kB
|
|
54
54
|
dist/clientMetaData.js 0.81 kB │ gzip: 0.47 kB
|
|
55
55
|
dist/events/trust.js 0.89 kB │ gzip: 0.52 kB
|
|
56
|
-
dist/elements/window.js
|
|
56
|
+
dist/elements/window.js 1.07 kB │ gzip: 0.60 kB
|
|
57
57
|
dist/reactComponents/TestModeBanner.js 1.23 kB │ gzip: 0.71 kB
|
|
58
58
|
dist/providers.js 1.41 kB │ gzip: 0.62 kB
|
|
59
59
|
dist/index.js 1.49 kB │ gzip: 0.50 kB
|
|
60
60
|
dist/reactComponents/Honeypot.js 1.86 kB │ gzip: 0.89 kB
|
|
61
61
|
dist/reactComponents/Reload.js 2.69 kB │ gzip: 1.26 kB
|
|
62
62
|
dist/state/builder.js 3.09 kB │ gzip: 0.84 kB
|
|
63
|
-
dist/callbacks/defaultCallbacks.js 3.
|
|
64
|
-
dist/reactComponents/
|
|
65
|
-
dist/reactComponents/
|
|
63
|
+
dist/callbacks/defaultCallbacks.js 3.58 kB │ gzip: 0.98 kB
|
|
64
|
+
dist/reactComponents/Checkbox.js 5.66 kB │ gzip: 2.34 kB
|
|
65
|
+
dist/reactComponents/ChallengeSurface.js 6.39 kB │ gzip: 2.21 kB
|
|
66
66
|
|
|
67
|
-
[32m✓ built in
|
|
67
|
+
[32m✓ built in 89ms[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,79 @@
|
|
|
1
1
|
# @prosopo/procaptcha-common
|
|
2
2
|
|
|
3
|
+
## 2.14.1
|
|
4
|
+
### Patch Changes
|
|
5
|
+
|
|
6
|
+
- f4e4a83: chore(deps): roll up the open dependabot bumps (react 19.3, mongoose 9.10, @polkadot/util 14, redis 6, cron-parser 5, react-i18next 17 with i18next 26, @scure/base 2, cypress 16, rollup/babel plugin majors, vitest 4.1.11, angular 20.3.28, js-yaml)
|
|
7
|
+
- 0be8838: Look up user callbacks on `window` without `any`, so each callback is type-checked against the arguments it is actually called with. Only a leading `window.` is now stripped from a callback name. The `error-callback` render option type now accepts the `Error` it is called with.
|
|
8
|
+
- Updated dependencies [f4e4a83]
|
|
9
|
+
- Updated dependencies [c386199]
|
|
10
|
+
- Updated dependencies [d4e9425]
|
|
11
|
+
- Updated dependencies [0be8838]
|
|
12
|
+
- @prosopo/account@2.8.93
|
|
13
|
+
- @prosopo/types@5.8.4
|
|
14
|
+
- @prosopo/load-balancer@2.10.45
|
|
15
|
+
|
|
16
|
+
## 2.14.0
|
|
17
|
+
### Minor Changes
|
|
18
|
+
|
|
19
|
+
- 864ddde: Make the challenges usable with a keyboard and a screen reader.
|
|
20
|
+
|
|
21
|
+
The puzzle could only be solved by dragging with a mouse or a finger. The piece
|
|
22
|
+
was a plain `div`, so it could not be tabbed to, had no name or role, and a
|
|
23
|
+
screen reader announced nothing at all — a user on assistive tech could tick "I
|
|
24
|
+
am human", get a silent overlay, and have no way forward. The image captcha had
|
|
25
|
+
the same problem in its tiles.
|
|
26
|
+
|
|
27
|
+
What changed:
|
|
28
|
+
|
|
29
|
+
- The puzzle piece can now be focused and moved with the arrow keys (hold shift
|
|
30
|
+
for smaller steps, Home to start over, Enter or Space to submit). It has a
|
|
31
|
+
name, a role, and a visible focus ring.
|
|
32
|
+
- The puzzle announces its state as you go: where the piece is, as a percentage
|
|
33
|
+
across and down the board; that an answer is being checked; and that a failed
|
|
34
|
+
go has been replaced by a fresh puzzle.
|
|
35
|
+
- The image captcha tiles are now buttons rather than clickable `div`s, so they
|
|
36
|
+
can be tabbed to and activated with Enter or Space, and they report whether
|
|
37
|
+
they are selected instead of only looking selected.
|
|
38
|
+
- Both challenges now open as a proper dialog: it takes focus when it opens,
|
|
39
|
+
keeps Tab inside itself, and gives focus back to the checkbox on close.
|
|
40
|
+
- The spinner that replaces the checkbox while a check runs used to drop focus
|
|
41
|
+
to the top of the page without saying why. It now takes focus in the
|
|
42
|
+
checkbox's place, names itself, and hands focus back when the check finishes.
|
|
43
|
+
This affects the pow, image and puzzle flows.
|
|
44
|
+
- The puzzle's on-screen text was hardcoded English. It now goes through the
|
|
45
|
+
locale package, and the new strings are translated into all 32 locales.
|
|
46
|
+
|
|
47
|
+
A visual puzzle still cannot be solved by someone who cannot see it — the widget
|
|
48
|
+
is never told where the target is, so there is nothing it could describe. Sites
|
|
49
|
+
that need a challenge a blind user can complete should use the pow captcha type,
|
|
50
|
+
which needs no interaction beyond the checkbox.
|
|
51
|
+
|
|
52
|
+
### Patch Changes
|
|
53
|
+
|
|
54
|
+
- 028a158: Stop the widget taking focus off the form the user is filling in.
|
|
55
|
+
|
|
56
|
+
While the widget checks a user, its checkbox is replaced by a spinner, and the
|
|
57
|
+
box takes focus back when the check finishes so a keyboard user is not left
|
|
58
|
+
stranded at the top of the page. It did that unconditionally, so if the user
|
|
59
|
+
spent the wait typing into the page's own form, the box grabbed focus off
|
|
60
|
+
whatever field they were in — and the keystroke that arrived with it went
|
|
61
|
+
nowhere. It now only claims focus back when nothing else holds it, which is
|
|
62
|
+
where removing the spinner leaves it.
|
|
63
|
+
|
|
64
|
+
This is what made the `puzzle` cypress spec flaky: it fills the signup form as
|
|
65
|
+
soon as the puzzle is solved, and lost the race with the widget often enough to
|
|
66
|
+
fail CI.
|
|
67
|
+
|
|
68
|
+
Covered by a new unit test in `procaptcha-react` that focuses an element outside
|
|
69
|
+
the widget mid-check and asserts focus is still there afterwards.
|
|
70
|
+
- Updated dependencies [028a158]
|
|
71
|
+
- Updated dependencies [3958046]
|
|
72
|
+
- Updated dependencies [028a158]
|
|
73
|
+
- @prosopo/types@5.8.3
|
|
74
|
+
- @prosopo/account@2.8.92
|
|
75
|
+
- @prosopo/load-balancer@2.10.44
|
|
76
|
+
|
|
3
77
|
## 2.13.3
|
|
4
78
|
### Patch Changes
|
|
5
79
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultCallbacks.d.ts","sourceRoot":"","sources":["../../src/callbacks/defaultCallbacks.ts"],"names":[],"mappings":"AAaA,OAAO,EAEN,KAAK,SAAS,EACd,KAAK,uBAAuB,EAE5B,MAAM,gBAAgB,CAAC;AAIxB,eAAO,MAAM,mBAAmB,aAAc,OAAO,KAAG,SAiCtD,CAAC;
|
|
1
|
+
{"version":3,"file":"defaultCallbacks.d.ts","sourceRoot":"","sources":["../../src/callbacks/defaultCallbacks.ts"],"names":[],"mappings":"AAaA,OAAO,EAEN,KAAK,SAAS,EACd,KAAK,uBAAuB,EAE5B,MAAM,gBAAgB,CAAC;AAIxB,eAAO,MAAM,mBAAmB,aAAc,OAAO,KAAG,SAiCtD,CAAC;AAuBH,wBAAgB,gBAAgB,CAC/B,aAAa,EAAE,uBAAuB,GAAG,SAAS,EAClD,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,QA+FhB"}
|
|
@@ -41,10 +41,7 @@ var getDefaultCallbacks = (element) => ({
|
|
|
41
41
|
*/
|
|
42
42
|
var getUserCallback = (callback, element, callbackFnOrName) => {
|
|
43
43
|
const callbackFnName = element.getAttribute(`data-${callback}`);
|
|
44
|
-
if (callbackFnName)
|
|
45
|
-
const callbackFn = getWindowCallback(callbackFnName);
|
|
46
|
-
if (callbackFn) return callbackFn;
|
|
47
|
-
}
|
|
44
|
+
if (callbackFnName) return getWindowCallback(callbackFnName);
|
|
48
45
|
if (typeof callbackFnOrName === "function") return callbackFnOrName;
|
|
49
46
|
if (typeof callbackFnOrName === "string") return getWindowCallback(callbackFnOrName);
|
|
50
47
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultCallbacks.js","sourceRoot":"","sources":["../../src/callbacks/defaultCallbacks.ts"],"names":[],"mappings":"AAaA,OAAO,EACN,SAAS,GAIT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAiB,EAAa,EAAE,CAAC,CAAC;IACrE,OAAO,EAAE,CAAC,KAAsB,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC;IAClE,kBAAkB,EAAE,GAAG,EAAE;QACxB,wBAAwB,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAClC,CAAC;IACD,mBAAmB,EAAE,GAAG,EAAE;QACzB,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACtC,CAAC;IACD,SAAS,EAAE,GAAG,EAAE;QACf,wBAAwB,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;QACzB,wBAAwB,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,EAAE,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,EAAE,GAAG,EAAE;QACZ,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACjC,CAAC;IACD,QAAQ,EAAE,GAAG,EAAE;QACd,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,EAAE,GAAG,EAAE;QACb,wBAAwB,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACrC,CAAC;IACD,QAAQ,EAAE,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACnC,CAAC;CACD,CAAC,CAAC;AAKH,MAAM,eAAe,GAAG,CACvB,QAAgB,EAChB,OAAgB,EAChB,gBAAgE,
|
|
1
|
+
{"version":3,"file":"defaultCallbacks.js","sourceRoot":"","sources":["../../src/callbacks/defaultCallbacks.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,10 +41,7 @@ var getDefaultCallbacks = (element) => ({
|
|
|
41
41
|
*/
|
|
42
42
|
var getUserCallback = (callback, element, callbackFnOrName) => {
|
|
43
43
|
const callbackFnName = element.getAttribute(`data-${callback}`);
|
|
44
|
-
if (callbackFnName)
|
|
45
|
-
const callbackFn = require_window.getWindowCallback(callbackFnName);
|
|
46
|
-
if (callbackFn) return callbackFn;
|
|
47
|
-
}
|
|
44
|
+
if (callbackFnName) return require_window.getWindowCallback(callbackFnName);
|
|
48
45
|
if (typeof callbackFnOrName === "function") return callbackFnOrName;
|
|
49
46
|
if (typeof callbackFnOrName === "string") return require_window.getWindowCallback(callbackFnOrName);
|
|
50
47
|
};
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
//#region src/elements/window.ts
|
|
2
|
+
var WINDOW_PREFIX = "window.";
|
|
3
|
+
var isWindowCallback = (value) => typeof value === "function";
|
|
2
4
|
var getWindowCallback = (callbackName) => {
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
+
const name = callbackName.startsWith(WINDOW_PREFIX) ? callbackName.slice(7) : callbackName;
|
|
6
|
+
const fn = Reflect.get(window, name);
|
|
7
|
+
if (!isWindowCallback(fn)) throw new Error(`Callback ${callbackName} is not defined on the window object`);
|
|
5
8
|
return fn;
|
|
6
9
|
};
|
|
7
10
|
/**
|
|
@@ -5,6 +5,15 @@ react = require_runtime.__toESM(react, 1);
|
|
|
5
5
|
let _emotion_react_jsx_runtime = require("@emotion/react/jsx-runtime");
|
|
6
6
|
let react_dom = require("react-dom");
|
|
7
7
|
//#region src/reactComponents/ChallengeSurface.tsx
|
|
8
|
+
var FOCUSABLE_SELECTOR = [
|
|
9
|
+
"a[href]",
|
|
10
|
+
"button:not([disabled])",
|
|
11
|
+
"input:not([disabled])",
|
|
12
|
+
"select:not([disabled])",
|
|
13
|
+
"textarea:not([disabled])",
|
|
14
|
+
"[tabindex]:not([tabindex=\"-1\"])"
|
|
15
|
+
].join(",");
|
|
16
|
+
var focusableWithin = (root) => Array.from(root.querySelectorAll(FOCUSABLE_SELECTOR));
|
|
8
17
|
var SURFACE_Z_INDEX = 2147483646;
|
|
9
18
|
var CONTENT_Z_INDEX = 2147483647;
|
|
10
19
|
var POPUP_EDGE_GAP_PX = 8;
|
|
@@ -24,7 +33,7 @@ var computeFloatPosition = (anchorRect, panelHeight, scrollX, scrollY) => ({
|
|
|
24
33
|
left: anchorRect.left + scrollX
|
|
25
34
|
});
|
|
26
35
|
var ChallengeSurface = react.default.memo((props) => {
|
|
27
|
-
const { show, children, placement = _prosopo_types.PlacementEnum.popup, anchor, scrim = "none", onDismiss, className } = props;
|
|
36
|
+
const { show, children, placement = _prosopo_types.PlacementEnum.popup, anchor, scrim = "none", onDismiss, className, dialogLabel } = props;
|
|
28
37
|
const contentRef = (0, react.useRef)(null);
|
|
29
38
|
const [floatPosition, setFloatPosition] = (0, react.useState)(null);
|
|
30
39
|
const isFloating = placement === _prosopo_types.PlacementEnum.float && !!anchor;
|
|
@@ -69,6 +78,36 @@ var ChallengeSurface = react.default.memo((props) => {
|
|
|
69
78
|
document.addEventListener("keydown", onKeyDown);
|
|
70
79
|
return () => document.removeEventListener("keydown", onKeyDown);
|
|
71
80
|
}, [show, onDismiss]);
|
|
81
|
+
(0, react.useEffect)(() => {
|
|
82
|
+
if (!show || !dialogLabel) return;
|
|
83
|
+
const content = contentRef.current;
|
|
84
|
+
if (!content) return;
|
|
85
|
+
const opener = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
86
|
+
(focusableWithin(content)[0] ?? content).focus();
|
|
87
|
+
return () => opener?.focus();
|
|
88
|
+
}, [show, dialogLabel]);
|
|
89
|
+
(0, react.useEffect)(() => {
|
|
90
|
+
if (!show || !dialogLabel) return;
|
|
91
|
+
const onKeyDown = (event) => {
|
|
92
|
+
if (event.key !== "Tab") return;
|
|
93
|
+
const content = contentRef.current;
|
|
94
|
+
if (!content) return;
|
|
95
|
+
const focusable = focusableWithin(content);
|
|
96
|
+
const first = focusable[0] ?? content;
|
|
97
|
+
const last = focusable[focusable.length - 1] ?? content;
|
|
98
|
+
const active = document.activeElement;
|
|
99
|
+
const outside = !content.contains(active);
|
|
100
|
+
if (event.shiftKey && (outside || active === first)) {
|
|
101
|
+
event.preventDefault();
|
|
102
|
+
last.focus();
|
|
103
|
+
} else if (!event.shiftKey && (outside || active === last)) {
|
|
104
|
+
event.preventDefault();
|
|
105
|
+
first.focus();
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
document.addEventListener("keydown", onKeyDown);
|
|
109
|
+
return () => document.removeEventListener("keydown", onKeyDown);
|
|
110
|
+
}, [show, dialogLabel]);
|
|
72
111
|
(0, react.useEffect)(() => {
|
|
73
112
|
if (!show || !isFloating || !onDismiss) return;
|
|
74
113
|
const onPointerDown = (event) => {
|
|
@@ -136,6 +175,10 @@ var ChallengeSurface = react.default.memo((props) => {
|
|
|
136
175
|
ref: contentRef,
|
|
137
176
|
className: "prosopo-challenge-content",
|
|
138
177
|
style: contentStyle,
|
|
178
|
+
role: dialogLabel ? "dialog" : void 0,
|
|
179
|
+
"aria-modal": dialogLabel ? true : void 0,
|
|
180
|
+
"aria-label": dialogLabel,
|
|
181
|
+
tabIndex: dialogLabel ? -1 : void 0,
|
|
139
182
|
children
|
|
140
183
|
})
|
|
141
184
|
}), document.body);
|
|
@@ -37,12 +37,29 @@ var baseStyle = {
|
|
|
37
37
|
borderWidth: "2px"
|
|
38
38
|
};
|
|
39
39
|
var ID_LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
40
|
+
/**
|
|
41
|
+
* Whether nothing on the page holds focus, which is where the browser leaves it
|
|
42
|
+
* when the focused element is removed.
|
|
43
|
+
*/
|
|
44
|
+
var focusIsStranded = (element) => {
|
|
45
|
+
const { activeElement, body } = element.ownerDocument;
|
|
46
|
+
return activeElement === null || activeElement === body;
|
|
47
|
+
};
|
|
40
48
|
var FAQ_LINK = process.env.PROSOPO_DOCS_URL ? `${new URL(`${process.env.PROSOPO_DOCS_URL}/en/basics/faq/`).href}/` : "https://docs.prosopo.io/en/basics/faq/";
|
|
41
49
|
var generateRandomId = () => {
|
|
42
50
|
return Array.from({ length: 8 }, () => ID_LETTERS[Math.floor(Math.random() * ID_LETTERS.length)]).join("");
|
|
43
51
|
};
|
|
44
|
-
var Checkbox = ({ theme, onChange, checked, labelText, error, loading }) => {
|
|
52
|
+
var Checkbox = ({ theme, onChange, checked, labelText, error, loading, loadingText = "Checking that you are human" }) => {
|
|
45
53
|
const [hover, setHover] = (0, react.useState)(false);
|
|
54
|
+
const inputRef = (0, react.useRef)(null);
|
|
55
|
+
const spinnerRef = (0, react.useRef)(null);
|
|
56
|
+
const hadFocus = (0, react.useRef)(false);
|
|
57
|
+
(0, react.useEffect)(() => {
|
|
58
|
+
if (!hadFocus.current) return;
|
|
59
|
+
const target = loading ? spinnerRef.current : inputRef.current;
|
|
60
|
+
if (!target || !focusIsStranded(target)) return;
|
|
61
|
+
target.focus();
|
|
62
|
+
}, [loading]);
|
|
46
63
|
const checkboxFocus = (0, react.useMemo)(() => _emotion_react.css`
|
|
47
64
|
&:focus-visible {
|
|
48
65
|
outline: 3px solid ${theme.palette.primary.main};
|
|
@@ -104,20 +121,29 @@ var Checkbox = ({ theme, onChange, checked, labelText, error, loading }) => {
|
|
|
104
121
|
minHeight: "58px"
|
|
105
122
|
},
|
|
106
123
|
children: [loading ? /* @__PURE__ */ (0, _emotion_react_jsx_runtime.jsx)("div", {
|
|
124
|
+
ref: spinnerRef,
|
|
107
125
|
className: _prosopo_widget_skeleton.WIDGET_CHECKBOX_SPINNER_CSS_CLASS,
|
|
108
|
-
|
|
126
|
+
role: "status",
|
|
127
|
+
tabIndex: -1,
|
|
128
|
+
"aria-label": loadingText
|
|
109
129
|
}) : /* @__PURE__ */ (0, _emotion_react_jsx_runtime.jsx)("input", {
|
|
130
|
+
ref: inputRef,
|
|
110
131
|
name: id,
|
|
111
132
|
id,
|
|
112
133
|
onMouseEnter: () => setHover(true),
|
|
113
134
|
onMouseLeave: () => setHover(false),
|
|
135
|
+
onFocus: () => {
|
|
136
|
+
hadFocus.current = true;
|
|
137
|
+
},
|
|
138
|
+
onBlur: () => {
|
|
139
|
+
hadFocus.current = false;
|
|
140
|
+
},
|
|
114
141
|
css: [
|
|
115
142
|
checkboxBefore,
|
|
116
143
|
checkboxForcedColors,
|
|
117
144
|
checkboxFocus
|
|
118
145
|
],
|
|
119
146
|
type: "checkbox",
|
|
120
|
-
"aria-live": "assertive",
|
|
121
147
|
"aria-label": labelText,
|
|
122
148
|
onKeyDown: (e) => {
|
|
123
149
|
if (!require_trust.isEventTrusted(e)) return;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
type WindowCallback = (...args: unknown[]) => unknown;
|
|
2
|
+
export declare const getWindowCallback: (callbackName: string) => WindowCallback;
|
|
2
3
|
export declare const isSecureBrowserContext: () => boolean;
|
|
4
|
+
export {};
|
|
3
5
|
//# sourceMappingURL=window.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../src/elements/window.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,iBAAiB,iBAAkB,MAAM,
|
|
1
|
+
{"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../src/elements/window.ts"],"names":[],"mappings":"AAcA,KAAK,cAAc,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAOtD,eAAO,MAAM,iBAAiB,iBAAkB,MAAM,KAAG,cAWxD,CAAC;AAUF,eAAO,MAAM,sBAAsB,QAAO,OAKzC,CAAC"}
|
package/dist/elements/window.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
//#region src/elements/window.ts
|
|
2
|
+
var WINDOW_PREFIX = "window.";
|
|
3
|
+
var isWindowCallback = (value) => typeof value === "function";
|
|
2
4
|
var getWindowCallback = (callbackName) => {
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
+
const name = callbackName.startsWith(WINDOW_PREFIX) ? callbackName.slice(7) : callbackName;
|
|
6
|
+
const fn = Reflect.get(window, name);
|
|
7
|
+
if (!isWindowCallback(fn)) throw new Error(`Callback ${callbackName} is not defined on the window object`);
|
|
5
8
|
return fn;
|
|
6
9
|
};
|
|
7
10
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"window.js","sourceRoot":"","sources":["../../src/elements/window.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"window.js","sourceRoot":"","sources":["../../src/elements/window.ts"],"names":[],"mappings":"AAgBA,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAA2B,EAAE,CACpE,OAAO,KAAK,KAAK,UAAU,CAAC;AAE7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,YAAoB,EAAkB,EAAE;IACzE,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,aAAa,CAAC;QAClD,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;QAC1C,CAAC,CAAC,YAAY,CAAC;IAChB,MAAM,EAAE,GAAY,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACd,YAAY,YAAY,sCAAsC,CAC9D,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC,CAAC;AAUF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAY,EAAE;IACnD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,MAAM,CAAC,eAAe,KAAK,IAAI,CAAC;AACxC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChallengeSurface.d.ts","sourceRoot":"","sources":["../../src/reactComponents/ChallengeSurface.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,EAEb,KAAK,SAAS,EAMd,MAAM,OAAO,CAAC;AAUf,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,CAAC;AAE1C,UAAU,qBAAqB;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,aAAa,CAAC;IAE1B,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,YAAY,CAAC;IAErB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ChallengeSurface.d.ts","sourceRoot":"","sources":["../../src/reactComponents/ChallengeSurface.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,EAEb,KAAK,SAAS,EAMd,MAAM,OAAO,CAAC;AAUf,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,CAAC;AAE1C,UAAU,qBAAqB;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,aAAa,CAAC;IAE1B,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,YAAY,CAAC;IAErB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IAOnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAwBD,UAAU,aAAa;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACb;AAWD,QAAA,MAAM,oBAAoB,eACb,OAAO,eACN,MAAM,WACV,MAAM,WACN,MAAM,KACb,aAKD,CAAC;AAEH,QAAA,MAAM,gBAAgB,oCAAsB,qBAAqB,8BAoO/D,CAAC;AAIH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -3,6 +3,15 @@ import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from
|
|
|
3
3
|
import { jsx } from "@emotion/react/jsx-runtime";
|
|
4
4
|
import { createPortal } from "react-dom";
|
|
5
5
|
//#region src/reactComponents/ChallengeSurface.tsx
|
|
6
|
+
var FOCUSABLE_SELECTOR = [
|
|
7
|
+
"a[href]",
|
|
8
|
+
"button:not([disabled])",
|
|
9
|
+
"input:not([disabled])",
|
|
10
|
+
"select:not([disabled])",
|
|
11
|
+
"textarea:not([disabled])",
|
|
12
|
+
"[tabindex]:not([tabindex=\"-1\"])"
|
|
13
|
+
].join(",");
|
|
14
|
+
var focusableWithin = (root) => Array.from(root.querySelectorAll(FOCUSABLE_SELECTOR));
|
|
6
15
|
var SURFACE_Z_INDEX = 2147483646;
|
|
7
16
|
var CONTENT_Z_INDEX = 2147483647;
|
|
8
17
|
var POPUP_EDGE_GAP_PX = 8;
|
|
@@ -22,7 +31,7 @@ var computeFloatPosition = (anchorRect, panelHeight, scrollX, scrollY) => ({
|
|
|
22
31
|
left: anchorRect.left + scrollX
|
|
23
32
|
});
|
|
24
33
|
var ChallengeSurface = React.memo((props) => {
|
|
25
|
-
const { show, children, placement = PlacementEnum.popup, anchor, scrim = "none", onDismiss, className } = props;
|
|
34
|
+
const { show, children, placement = PlacementEnum.popup, anchor, scrim = "none", onDismiss, className, dialogLabel } = props;
|
|
26
35
|
const contentRef = useRef(null);
|
|
27
36
|
const [floatPosition, setFloatPosition] = useState(null);
|
|
28
37
|
const isFloating = placement === PlacementEnum.float && !!anchor;
|
|
@@ -67,6 +76,36 @@ var ChallengeSurface = React.memo((props) => {
|
|
|
67
76
|
document.addEventListener("keydown", onKeyDown);
|
|
68
77
|
return () => document.removeEventListener("keydown", onKeyDown);
|
|
69
78
|
}, [show, onDismiss]);
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (!show || !dialogLabel) return;
|
|
81
|
+
const content = contentRef.current;
|
|
82
|
+
if (!content) return;
|
|
83
|
+
const opener = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
84
|
+
(focusableWithin(content)[0] ?? content).focus();
|
|
85
|
+
return () => opener?.focus();
|
|
86
|
+
}, [show, dialogLabel]);
|
|
87
|
+
useEffect(() => {
|
|
88
|
+
if (!show || !dialogLabel) return;
|
|
89
|
+
const onKeyDown = (event) => {
|
|
90
|
+
if (event.key !== "Tab") return;
|
|
91
|
+
const content = contentRef.current;
|
|
92
|
+
if (!content) return;
|
|
93
|
+
const focusable = focusableWithin(content);
|
|
94
|
+
const first = focusable[0] ?? content;
|
|
95
|
+
const last = focusable[focusable.length - 1] ?? content;
|
|
96
|
+
const active = document.activeElement;
|
|
97
|
+
const outside = !content.contains(active);
|
|
98
|
+
if (event.shiftKey && (outside || active === first)) {
|
|
99
|
+
event.preventDefault();
|
|
100
|
+
last.focus();
|
|
101
|
+
} else if (!event.shiftKey && (outside || active === last)) {
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
first.focus();
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
document.addEventListener("keydown", onKeyDown);
|
|
107
|
+
return () => document.removeEventListener("keydown", onKeyDown);
|
|
108
|
+
}, [show, dialogLabel]);
|
|
70
109
|
useEffect(() => {
|
|
71
110
|
if (!show || !isFloating || !onDismiss) return;
|
|
72
111
|
const onPointerDown = (event) => {
|
|
@@ -134,6 +173,10 @@ var ChallengeSurface = React.memo((props) => {
|
|
|
134
173
|
ref: contentRef,
|
|
135
174
|
className: "prosopo-challenge-content",
|
|
136
175
|
style: contentStyle,
|
|
176
|
+
role: dialogLabel ? "dialog" : void 0,
|
|
177
|
+
"aria-modal": dialogLabel ? true : void 0,
|
|
178
|
+
"aria-label": dialogLabel,
|
|
179
|
+
tabIndex: dialogLabel ? -1 : void 0,
|
|
137
180
|
children
|
|
138
181
|
})
|
|
139
182
|
}), document.body);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChallengeSurface.js","sourceRoot":"","sources":["../../src/reactComponents/ChallengeSurface.tsx"],"names":[],"mappings":";AAcA,OAAO,EAAE,aAAa,EAAsB,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,EAGb,WAAW,EACX,SAAS,EACT,eAAe,EACf,MAAM,EACN,QAAQ,GACR,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ChallengeSurface.js","sourceRoot":"","sources":["../../src/reactComponents/ChallengeSurface.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../../src/reactComponents/Checkbox.tsx"],"names":[],"mappings":"AAgBA,OAAO,EACN,KAAK,KAAK,EAGV,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACN,KAAK,oBAAoB,EAEzB,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../../src/reactComponents/Checkbox.tsx"],"names":[],"mappings":"AAgBA,OAAO,EACN,KAAK,KAAK,EAGV,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACN,KAAK,oBAAoB,EAEzB,KAAK,EAAE,EAKP,MAAM,OAAO,CAAC;AAGf,UAAU,aAAc,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IACtE,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IAEjB,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IAEjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAmED,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,CA8LtC,CAAC;AACF,eAAe,QAAQ,CAAC"}
|