@prosopo/client-bundle-example 2.5.5 → 2.8.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.
Files changed (137) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/assets/ProcaptchaWidget-DrBDhP6X.js +636 -0
  3. package/dist/assets/ProcaptchaWidget-rAM-9Rap.js +360 -0
  4. package/dist/assets/Signer-DP9drQ55.js +23 -0
  5. package/dist/assets/_commonjsHelpers-DaMA6jEr.js +8 -0
  6. package/dist/assets/asU8a-CJdNkNEq.js +9 -0
  7. package/dist/assets/bip39-Du2cANEV.js +365 -0
  8. package/dist/assets/browser-ponyfill-Dy1JBTMg.js +339 -0
  9. package/dist/assets/captcha-BhkVCEXM.css +1 -0
  10. package/dist/assets/captchaComponentProvider-DmV1WTrT.js +1242 -0
  11. package/dist/assets/captchaRenderer-RIsSZXCC.js +70 -0
  12. package/dist/assets/components.d.ts +5 -0
  13. package/dist/assets/components.d.ts.map +1 -0
  14. package/dist/assets/emotion-element-5486c51c.browser.esm-C3u8NMUC.js +1807 -0
  15. package/dist/assets/fp.esm-DYWeNGcH.js +1654 -0
  16. package/dist/assets/frictionless-explicit-Dq_sNGRK.js +1 -0
  17. package/dist/assets/frictionless-implicit-Dq_sNGRK.js +1 -0
  18. package/dist/assets/hash-_rWungeW.js +1268 -0
  19. package/dist/assets/i18nFrontend-CsPT71ro.js +2273 -0
  20. package/dist/assets/image-explicit-DQvfVB7-.js +4 -0
  21. package/dist/assets/image-implicit-Bwa9QJO5.js +1 -0
  22. package/dist/assets/index-BVr9fC_3.js +4386 -0
  23. package/dist/assets/index-BjRdPnnE.js +1198 -0
  24. package/dist/assets/index-Cu5oL_7b.js +81 -0
  25. package/dist/assets/index-Dpt_5E72.js +1 -0
  26. package/dist/assets/index-DxIFpl6U.js +5416 -0
  27. package/dist/assets/index-QVME9Prx.js +32 -0
  28. package/dist/assets/index-Wgw2GQWq.js +596 -0
  29. package/dist/assets/index.d.ts +16 -0
  30. package/dist/assets/index.d.ts.map +1 -0
  31. package/dist/assets/invisible-frictionless-explicit-DugBtRe4.js +4 -0
  32. package/dist/assets/invisible-frictionless-implicit-DYYos8W9.js +1 -0
  33. package/dist/assets/invisible-image-explicit-C5Z4gSb1.js +4 -0
  34. package/dist/assets/invisible-image-implicit-DfNFNlFj.js +1 -0
  35. package/dist/assets/invisible-pow-explicit-DjqGWFUb.js +4 -0
  36. package/dist/assets/invisible-pow-implicit-BRXL14FH.js +4 -0
  37. package/dist/assets/locales/ar/translation.json +56 -0
  38. package/dist/assets/locales/az/translation.json +56 -0
  39. package/dist/assets/locales/cs/translation.json +56 -0
  40. package/dist/assets/locales/de/translation.json +56 -0
  41. package/dist/assets/locales/el/translation.json +56 -0
  42. package/dist/assets/locales/en/translation.json +56 -0
  43. package/dist/assets/locales/es/translation.json +56 -0
  44. package/dist/assets/locales/fi/translation.json +56 -0
  45. package/dist/assets/locales/fr/translation.json +56 -0
  46. package/dist/assets/locales/hi/translation.json +56 -0
  47. package/dist/assets/locales/hu/translation.json +56 -0
  48. package/dist/assets/locales/id/translation.json +56 -0
  49. package/dist/assets/locales/it/translation.json +56 -0
  50. package/dist/assets/locales/ja/translation.json +56 -0
  51. package/dist/assets/locales/jv/translation.json +56 -0
  52. package/dist/assets/locales/ko/translation.json +56 -0
  53. package/dist/assets/locales/ml/translation.json +56 -0
  54. package/dist/assets/locales/ms/translation.json +56 -0
  55. package/dist/assets/locales/nl/translation.json +56 -0
  56. package/dist/assets/locales/no/translation.json +56 -0
  57. package/dist/assets/locales/pl/translation.json +56 -0
  58. package/dist/assets/locales/pt/translation.json +56 -0
  59. package/dist/assets/locales/pt-br/translation.json +56 -0
  60. package/dist/assets/locales/ro/translation.json +56 -0
  61. package/dist/assets/locales/ru/translation.json +56 -0
  62. package/dist/assets/locales/sr/translation.json +56 -0
  63. package/dist/assets/locales/sv/translation.json +56 -0
  64. package/dist/assets/locales/th/translation.json +56 -0
  65. package/dist/assets/locales/tr/translation.json +56 -0
  66. package/dist/assets/locales/uk/translation.json +56 -0
  67. package/dist/assets/locales/vi/translation.json +56 -0
  68. package/dist/assets/locales/zh-cn/translation.json +56 -0
  69. package/dist/assets/pow-explicit-BexxbnHM.js +4 -0
  70. package/dist/assets/pow-implicit-Dpt_5E72.js +1 -0
  71. package/dist/assets/procaptcha.bundle.js +7 -0
  72. package/dist/assets/spread-DEmVz7RJ.js +15 -0
  73. package/dist/assets/tests/util/captchaType.test.d.ts +2 -0
  74. package/dist/assets/tests/util/captchaType.test.d.ts.map +1 -0
  75. package/dist/assets/tests/util/config.test.d.ts +2 -0
  76. package/dist/assets/tests/util/config.test.d.ts.map +1 -0
  77. package/dist/assets/tests/util/renderLogic.test.d.ts +2 -0
  78. package/dist/assets/tests/util/renderLogic.test.d.ts.map +1 -0
  79. package/dist/assets/toU8a-C68WUzs_.js +24 -0
  80. package/dist/assets/translations-DEL070wJ.js +2918 -0
  81. package/dist/assets/useTranslation-CJplXtqb.js +158 -0
  82. package/dist/assets/util/captcha/captchaComponentProvider.d.ts +8 -0
  83. package/dist/assets/util/captcha/captchaComponentProvider.d.ts.map +1 -0
  84. package/dist/assets/util/captcha/captchaComponentsList.d.ts +6 -0
  85. package/dist/assets/util/captcha/captchaComponentsList.d.ts.map +1 -0
  86. package/dist/assets/util/captcha/captchaProps.d.ts +9 -0
  87. package/dist/assets/util/captcha/captchaProps.d.ts.map +1 -0
  88. package/dist/assets/util/captcha/captchaRenderer.d.ts +24 -0
  89. package/dist/assets/util/captcha/captchaRenderer.d.ts.map +1 -0
  90. package/dist/assets/util/captcha/captchaType.d.ts +2 -0
  91. package/dist/assets/util/captcha/captchaType.d.ts.map +1 -0
  92. package/dist/assets/util/captcha/components/frictionlessCaptcha.d.ts +4 -0
  93. package/dist/assets/util/captcha/components/frictionlessCaptcha.d.ts.map +1 -0
  94. package/dist/assets/util/captcha/components/imageCaptcha.d.ts +4 -0
  95. package/dist/assets/util/captcha/components/imageCaptcha.d.ts.map +1 -0
  96. package/dist/assets/util/captcha/components/powCaptcha.d.ts +4 -0
  97. package/dist/assets/util/captcha/components/powCaptcha.d.ts.map +1 -0
  98. package/dist/assets/util/config.d.ts +6 -0
  99. package/dist/assets/util/config.d.ts.map +1 -0
  100. package/dist/assets/util/configCreator.d.ts +5 -0
  101. package/dist/assets/util/configCreator.d.ts.map +1 -0
  102. package/dist/assets/util/language.d.ts +3 -0
  103. package/dist/assets/util/language.d.ts.map +1 -0
  104. package/dist/assets/util/timeout.d.ts +3 -0
  105. package/dist/assets/util/timeout.d.ts.map +1 -0
  106. package/dist/assets/util/widgetFactory.d.ts +18 -0
  107. package/dist/assets/util/widgetFactory.d.ts.map +1 -0
  108. package/dist/assets/util/widgetThemeResolver.d.ts +9 -0
  109. package/dist/assets/util/widgetThemeResolver.d.ts.map +1 -0
  110. package/dist/frictionless-explicit.html +881 -0
  111. package/dist/frictionless-implicit.html +874 -0
  112. package/dist/image-explicit.html +877 -0
  113. package/dist/index.html +575 -74
  114. package/dist/invisible-frictionless-explicit.html +626 -283
  115. package/dist/invisible-frictionless-implicit.html +631 -173
  116. package/dist/invisible-image-explicit.html +627 -284
  117. package/dist/invisible-image-implicit.html +631 -173
  118. package/dist/invisible-pow-explicit.html +627 -284
  119. package/dist/invisible-pow-implicit.html +629 -177
  120. package/dist/plugins/explanation-injector.ts +250 -0
  121. package/dist/plugins/form-filler-injector.ts +233 -0
  122. package/dist/plugins/navigation-injector.ts +237 -89
  123. package/dist/plugins/status-log-injector.ts +199 -0
  124. package/dist/pow-explicit.html +877 -0
  125. package/dist/pow-implicit.html +881 -0
  126. package/package.json +7 -2
  127. package/vite.config.ts +32 -3
  128. package/dist/assets/captchaType-CYBmmAZe.js +0 -1
  129. package/dist/assets/frictionless-BVSPLzWe.js +0 -1
  130. package/dist/assets/index-BWsu-rGU.js +0 -1
  131. package/dist/assets/invisible-frictionless-explicit-DgCaJtPg.js +0 -1
  132. package/dist/assets/invisible-image-explicit-DgCaJtPg.js +0 -1
  133. package/dist/assets/invisible-pow-explicit-DgCaJtPg.js +0 -1
  134. package/dist/assets/pow-O0V5Dqo9.js +0 -1
  135. package/dist/frictionless.html +0 -344
  136. package/dist/pow.html +0 -324
  137. /package/dist/assets/{modulepreload-polyfill-B5Qt9EMX.js → captcha-ByKnSsbG.js} +0 -0
package/package.json CHANGED
@@ -13,9 +13,9 @@
13
13
  "start": "vite serve ./src --port 9232 --config vite.config.ts",
14
14
  "clean": "echo 'nothing to clean'"
15
15
  },
16
- "version": "2.5.5",
16
+ "version": "2.8.0",
17
17
  "devDependencies": {
18
- "@prosopo/dotenv": "2.5.5",
18
+ "@prosopo/dotenv": "2.6.0",
19
19
  "@types/node": "22.5.5",
20
20
  "@vitest/coverage-v8": "3.0.9",
21
21
  "concurrently": "9.0.1",
@@ -26,5 +26,10 @@
26
26
  "typescript": "5.6.2",
27
27
  "vite": "6.2.3",
28
28
  "vitest": "3.0.9"
29
+ },
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/prosopo/captcha.git",
33
+ "directory": "demos/client-bundle-example"
29
34
  }
30
35
  }
package/vite.config.ts CHANGED
@@ -16,7 +16,10 @@ import fs from "node:fs";
16
16
  import path from "node:path";
17
17
  import { loadEnv } from "@prosopo/dotenv";
18
18
  import { type UserConfig, defineConfig } from "vite";
19
+ import explanationInjector from "./src/plugins/explanation-injector.js";
20
+ import formFillerInjector from "./src/plugins/form-filler-injector.js";
19
21
  import navigationInjector from "./src/plugins/navigation-injector.js";
22
+ import statusLogInjector from "./src/plugins/status-log-injector.js";
20
23
 
21
24
  // Function to copy contents of a directory to another directory
22
25
  function copyDirContents(src: string, dest: string) {
@@ -93,11 +96,24 @@ export default defineConfig(({ command, mode }) => {
93
96
  "import.meta.env.PROSOPO_SITE_KEY": JSON.stringify(
94
97
  process.env.PROSOPO_SITE_KEY,
95
98
  ),
99
+ "import.meta.env.PROSOPO_SITE_KEY_IMAGE": JSON.stringify(
100
+ process.env.PROSOPO_SITE_KEY_IMAGE,
101
+ ),
102
+ "import.meta.env.PROSOPO_SITE_KEY_SLIDER": JSON.stringify(
103
+ process.env.PROSOPO_SITE_KEY_SLIDER,
104
+ ),
105
+ "import.meta.env.PROSOPO_SITE_KEY_POW": JSON.stringify(
106
+ process.env.PROSOPO_SITE_KEY_POW,
107
+ ),
108
+ "import.meta.env.PROSOPO_SITE_KEY_FRICTIONLESS": JSON.stringify(
109
+ process.env.PROSOPO_SITE_KEY_FRICTIONLESS,
110
+ ),
96
111
  "import.meta.env.PROSOPO_SERVER_URL": JSON.stringify(
97
112
  process.env.PROSOPO_SERVER_URL,
98
113
  ),
99
114
  "import.meta.env.VITE_BUNDLE_URL": JSON.stringify(
100
- process.env.VITE_BUNDLE_URL || "./assets/procaptcha.bundle.js",
115
+ process.env.VITE_BUNDLE_URL ||
116
+ "http://localhost:9269/procaptcha.bundle.js",
101
117
  ),
102
118
  },
103
119
  optimizeDeps: {
@@ -110,6 +126,18 @@ export default defineConfig(({ command, mode }) => {
110
126
  rollupOptions: {
111
127
  input: {
112
128
  index: path.resolve(__dirname, "src/index.html"),
129
+ "pow-explicit": path.resolve(__dirname, "src/pow-explicit.html"),
130
+ "image-explicit": path.resolve(__dirname, "src/image-explicit.html"),
131
+ "pow-implicit": path.resolve(__dirname, "src/pow-implicit.html"),
132
+ "image-implicit": path.resolve(__dirname, "src/index.html"),
133
+ "frictionless-implicit": path.resolve(
134
+ __dirname,
135
+ "src/frictionless-implicit.html",
136
+ ),
137
+ "frictionless-explicit": path.resolve(
138
+ __dirname,
139
+ "src/frictionless-explicit.html",
140
+ ),
113
141
  "invisible-pow-explicit": path.resolve(
114
142
  __dirname,
115
143
  "src/invisible-pow-explicit.html",
@@ -126,8 +154,6 @@ export default defineConfig(({ command, mode }) => {
126
154
  __dirname,
127
155
  "src/invisible-image-implicit.html",
128
156
  ),
129
- pow: path.resolve(__dirname, "src/pow.html"),
130
- frictionless: path.resolve(__dirname, "src/frictionless.html"),
131
157
  "invisible-frictionless-implicit": path.resolve(
132
158
  __dirname,
133
159
  "src/invisible-frictionless-implicit.html",
@@ -141,6 +167,9 @@ export default defineConfig(({ command, mode }) => {
141
167
  },
142
168
  plugins: [
143
169
  navigationInjector(),
170
+ formFillerInjector(),
171
+ explanationInjector(),
172
+ statusLogInjector(),
144
173
  {
145
174
  name: "copy-files",
146
175
  closeBundle() {
@@ -1 +0,0 @@
1
- var o;(function(i){i.image="image",i.pow="pow",i.frictionless="frictionless"})(o||(o={}));export{o as C};
@@ -1 +0,0 @@
1
- import"./modulepreload-polyfill-B5Qt9EMX.js";import{render as l}from"https://staging-js.prosopo.io/js/procaptcha.bundle.js";import{C as i}from"./captchaType-CYBmmAZe.js";window.addEventListener("load",()=>{window.setIsError=e=>{const o=document.getElementById("messageContainer");o.style.color=e?"red":"black",o.style.display="block"},window.setMessage=e=>{document.getElementById("message").innerText=e},window.onLoggedIn=e=>{const o=new URL("/private",config.serverUrl).href;console.log("getting private resource with token ",e,"at",o),fetch(o,{method:"GET",headers:{Origin:"http://localhost:9232","Content-Type":"application/json",Authorization:`Bearer ${e}`}}).then(async n=>{try{const s=await n.json();n.status===200&&setMessage(s.message)}catch(s){console.log(s)}}).catch(n=>{console.log(n)})},window.onActionHandler=()=>{const e=document.getElementsByName("procaptcha-response");if(!e.length){alert("Must complete captcha");return}const o=e[0].value,n={email:document.getElementById("email").value,name:document.getElementById("name").value,password:document.getElementById("password").value,"procaptcha-response":o},s=new URL("signup",void 0).href;console.log("posting to",s,"with payload",n),fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n),contentType:"application/json"}).then(t=>new Promise(a=>t.json().then(c=>a({status:t.status,ok:t.ok,json:c})))).then(async({status:t,json:a,ok:c})=>{console.log("status",t,"json",a.message,"ok",c),console.log("json",a);try{t!==200?(setIsError(!0),setMessage(a.message)):(setIsError(!1),setMessage(a.message))}catch(r){console.log(r)}}).catch(t=>{console.log(t),setIsError(!0),setMessage("Error: "+t)})},console.log("here")});function d(e){console.log("Challenge passed")}const g=document.getElementById("procaptcha-container");l(g,{siteKey:void 0,captchaType:i.frictionless,theme:"dark",callback:d,"failed-callback":function(){console.log("Challenge failed")}});
@@ -1 +0,0 @@
1
- import"./modulepreload-polyfill-B5Qt9EMX.js";window.addEventListener("load",()=>{window.setIsError=e=>{const t=document.getElementById("messageContainer");t.style.color=e?"red":"black",t.style.display="block"},window.setMessage=e=>{document.getElementById("message").innerText=e},window.onLoggedIn=e=>{const t=new URL("/private",config.serverUrl).href;console.log("getting private resource with token ",e,"at",t),fetch(t,{method:"GET",headers:{Origin:"http://localhost:9232","Content-Type":"application/json",Authorization:`Bearer ${e}`}}).then(async n=>{try{const s=await n.json();n.status===200&&setMessage(s.message)}catch(s){console.log(s)}}).catch(n=>{console.log(n)})},window.onActionHandler=()=>{const e=document.getElementsByName("procaptcha-response");if(!e.length){alert("Must complete captcha");return}const t=e[0].value,n={email:document.getElementById("email").value,name:document.getElementById("name").value,password:document.getElementById("password").value,"procaptcha-response":t},s=new URL("signup",void 0).href;console.log("posting to",s,"with payload",n),fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n),contentType:"application/json"}).then(o=>new Promise(a=>o.json().then(l=>a({status:o.status,ok:o.ok,json:l})))).then(async({status:o,json:a,ok:l})=>{console.log("status",o,"json",a.message,"ok",l),console.log("json",a);try{o!==200?(setIsError(!0),setMessage(a.message)):(setIsError(!1),setMessage(a.message))}catch(c){console.log(c)}}).catch(o=>{console.log(o),setIsError(!0),setMessage("Error: "+o)})}});window.onCaptchaFailed=function(){console.log("Challenge failed")};window.onCaptchaVerified=e=>{console.log("Challenge passed")};
@@ -1 +0,0 @@
1
- import"./modulepreload-polyfill-B5Qt9EMX.js";import"https://staging-js.prosopo.io/js/procaptcha.bundle.js";document.addEventListener("DOMContentLoaded",function(){if(window.procaptcha&&typeof window.procaptcha.render=="function")onloadCallback();else{const o=document.querySelector('script[src*="procaptcha.bundle.js"]');o&&o.addEventListener("load",onloadCallback)}});
@@ -1 +0,0 @@
1
- import"./modulepreload-polyfill-B5Qt9EMX.js";import"https://staging-js.prosopo.io/js/procaptcha.bundle.js";document.addEventListener("DOMContentLoaded",function(){if(window.procaptcha&&typeof window.procaptcha.render=="function")onloadCallback();else{const o=document.querySelector('script[src*="procaptcha.bundle.js"]');o&&o.addEventListener("load",onloadCallback)}});
@@ -1 +0,0 @@
1
- import"./modulepreload-polyfill-B5Qt9EMX.js";import"https://staging-js.prosopo.io/js/procaptcha.bundle.js";document.addEventListener("DOMContentLoaded",function(){if(window.procaptcha&&typeof window.procaptcha.render=="function")onloadCallback();else{const o=document.querySelector('script[src*="procaptcha.bundle.js"]');o&&o.addEventListener("load",onloadCallback)}});
@@ -1 +0,0 @@
1
- import"./modulepreload-polyfill-B5Qt9EMX.js";import{C as p}from"./captchaType-CYBmmAZe.js";const y="modulepreload",w=function(o){return"/"+o},d={},E=function(i,c,C){let s=Promise.resolve();if(c&&c.length>0){document.getElementsByTagName("link");const e=document.querySelector("meta[property=csp-nonce]"),t=(e==null?void 0:e.nonce)||(e==null?void 0:e.getAttribute("nonce"));s=Promise.allSettled(c.map(n=>{if(n=w(n),n in d)return;d[n]=!0;const a=n.endsWith(".css"),f=a?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${n}"]${f}`))return;const r=document.createElement("link");if(r.rel=a?"stylesheet":y,a||(r.as="script"),r.crossOrigin="",r.href=n,t&&r.setAttribute("nonce",t),document.head.appendChild(r),a)return new Promise((h,m)=>{r.addEventListener("load",h),r.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${n}`)))})}))}function l(e){const t=new Event("vite:preloadError",{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return s.then(e=>{for(const t of e||[])t.status==="rejected"&&l(t.reason);return i().catch(l)})};async function v(){const o=(await E(async()=>{const{render:c}=await import("https://staging-js.prosopo.io/js/procaptcha.bundle.js");return{render:c}},[])).render;console.log("Captcha loaded");const i=document.getElementById("procaptcha-container");o(i,{siteKey:void 0,theme:"dark",callback:u,captchaType:p.pow})}window.captchaLoaded=v;function u(o){console.log("Captcha verified, output: "+JSON.stringify(o))}window.onCaptchaVerified=u;
@@ -1,344 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <link href="https://cdn.muicss.com/mui-0.10.3/css/mui.min.css" rel="stylesheet" type="text/css"/>
5
- <title>Procaptcha demo: Simple page</title>
6
- <script type="text/javascript">
7
- window.onCaptchaFailed = function () {
8
- console.log('Challenge failed')
9
- }
10
- </script>
11
-
12
-
13
- <style>
14
- .nav-topbar {
15
- background-color: #2196F3;
16
- padding: 0;
17
- margin-bottom: 20px;
18
- transition: all 0.3s ease;
19
- overflow: hidden;
20
- max-height: 500px; /* Initial state - visible */
21
- box-shadow: 0 2px 5px rgba(0,0,0,0.2);
22
- }
23
- .nav-topbar.collapsed {
24
- max-height: 50px; /* Collapsed state - only show toggle button and title */
25
- }
26
- .nav-container {
27
- max-width: 1200px;
28
- margin: 0 auto;
29
- padding: 0 15px;
30
- position: relative;
31
- }
32
- .nav-header {
33
- display: flex;
34
- justify-content: space-between;
35
- align-items: center;
36
- padding: 10px 0;
37
- position: relative;
38
- z-index: 20;
39
- }
40
- .nav-title {
41
- color: white;
42
- font-size: 18px;
43
- font-weight: bold;
44
- margin: 0;
45
- display: flex;
46
- align-items: center;
47
- }
48
- .nav-title-text {
49
- margin-right: 10px;
50
- }
51
- .nav-title-hint {
52
- font-size: 14px;
53
- font-weight: normal;
54
- opacity: 0;
55
- transition: opacity 0.3s ease;
56
- }
57
- .collapsed .nav-title-hint {
58
- opacity: 0.8;
59
- }
60
- .nav-toggle {
61
- background-color: rgba(0,0,0,0.1);
62
- color: white;
63
- border: none;
64
- padding: 5px 10px;
65
- cursor: pointer;
66
- border-radius: 4px;
67
- z-index: 10;
68
- display: flex;
69
- align-items: center;
70
- justify-content: center;
71
- }
72
- .nav-toggle:hover {
73
- background-color: rgba(0,0,0,0.2);
74
- }
75
- .nav-toggle-icon {
76
- width: 24px;
77
- height: 24px;
78
- display: inline-block;
79
- position: relative;
80
- }
81
- .nav-toggle-icon svg {
82
- position: absolute;
83
- top: 0;
84
- left: 0;
85
- transition: opacity 0.3s ease;
86
- }
87
- .nav-toggle-icon .icon-collapse {
88
- opacity: 1;
89
- }
90
- .nav-toggle-icon .icon-expand {
91
- opacity: 0;
92
- }
93
- .collapsed .nav-toggle-icon .icon-collapse {
94
- opacity: 0;
95
- }
96
- .collapsed .nav-toggle-icon .icon-expand {
97
- opacity: 1;
98
- }
99
- .nav-content {
100
- padding: 0 0 15px 0;
101
- transition: opacity 0.3s ease;
102
- }
103
- .collapsed .nav-content {
104
- opacity: 0;
105
- }
106
- .nav-row {
107
- display: flex;
108
- flex-wrap: wrap;
109
- margin-bottom: 15px;
110
- }
111
- .nav-group {
112
- flex: 1;
113
- min-width: 250px;
114
- margin-bottom: 10px;
115
- margin-right: 20px;
116
- }
117
- .nav-group-title {
118
- color: rgba(255,255,255,0.8);
119
- font-size: 0.9em;
120
- margin: 0 0 5px 0;
121
- text-transform: uppercase;
122
- font-weight: 500;
123
- }
124
- .nav-group-links {
125
- list-style: none;
126
- margin: 0;
127
- padding: 0;
128
- }
129
- .nav-group-links li {
130
- margin: 5px 0;
131
- }
132
- .nav-group-links a {
133
- color: white;
134
- text-decoration: none;
135
- font-weight: bold;
136
- padding: 5px 0;
137
- display: inline-block;
138
- }
139
- .nav-group-links a:hover {
140
- text-decoration: underline;
141
- }
142
- .nav-group-links .active {
143
- border-bottom: 2px solid white;
144
- }
145
- .nav-group-links .disabled {
146
- color: rgba(255,255,255,0.5);
147
- cursor: not-allowed;
148
- }
149
-
150
- @media (max-width: 768px) {
151
- .nav-row {
152
- flex-direction: column;
153
- }
154
- .nav-title-hint {
155
- display: none;
156
- }
157
- }
158
- </style>
159
- <script type="module" crossorigin src="/assets/frictionless-BVSPLzWe.js"></script>
160
- <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-B5Qt9EMX.js">
161
- <link rel="modulepreload" crossorigin href="/assets/captchaType-CYBmmAZe.js">
162
- </head>
163
- <body>
164
-
165
- <div id="nav-topbar" class="nav-topbar">
166
- <div class="nav-container">
167
- <div id="nav-header" class="nav-header">
168
- <h1 class="nav-title">
169
- <span class="nav-title-text">Procaptcha Demo Playground</span>
170
- <span class="nav-title-hint">(Click anywhere to see more examples)</span>
171
- </h1>
172
- <button id="nav-toggle" class="nav-toggle" aria-label="Toggle navigation">
173
- <span class="nav-toggle-icon">
174
- <svg class="icon-collapse" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
175
- <polyline points="18 15 12 9 6 15"></polyline>
176
- </svg>
177
- <svg class="icon-expand" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
178
- <polyline points="6 9 12 15 18 9"></polyline>
179
- </svg>
180
- </span>
181
- </button>
182
- </div>
183
- <div class="nav-content">
184
- <div class="nav-row">
185
-
186
- <div class="nav-section">
187
- <h3 style="color: white; margin: 0 0 10px 0;">Standard Captchas</h3>
188
- <div class="nav-row">
189
-
190
- <div class="nav-group">
191
- <div class="nav-group-title">Image</div>
192
- <ul class="nav-group-links">
193
- <li><a href="index.html">Implicit</a></li>
194
- <li><span class="disabled" title="Coming Soon">Explicit</span></li>
195
- </ul>
196
- </div>
197
-
198
-
199
- <div class="nav-group">
200
- <div class="nav-group-title">Pow</div>
201
- <ul class="nav-group-links">
202
- <li><span class="disabled" title="Coming Soon">Implicit</span></li>
203
- <li><span class="disabled" title="Coming Soon">Explicit</span></li>
204
- </ul>
205
- </div>
206
-
207
-
208
- <div class="nav-group">
209
- <div class="nav-group-title">Frictionless</div>
210
- <ul class="nav-group-links">
211
- <li><span class="disabled" title="Coming Soon">Implicit</span></li>
212
- <li><a href="frictionless-explicit.html">Explicit</a></li>
213
- </ul>
214
- </div>
215
-
216
- </div>
217
- </div>
218
-
219
-
220
- <div class="nav-section">
221
- <h3 style="color: white; margin: 0 0 10px 0;">Invisible Captchas</h3>
222
- <div class="nav-row">
223
-
224
- <div class="nav-group">
225
- <div class="nav-group-title">Image</div>
226
- <ul class="nav-group-links">
227
- <li><a href="invisible-image-implicit.html">Implicit</a></li>
228
- <li><a href="invisible-image-explicit.html">Explicit</a></li>
229
- </ul>
230
- </div>
231
-
232
-
233
- <div class="nav-group">
234
- <div class="nav-group-title">Pow</div>
235
- <ul class="nav-group-links">
236
- <li><a href="invisible-pow-implicit.html">Implicit</a></li>
237
- <li><a href="invisible-pow-explicit.html">Explicit</a></li>
238
- </ul>
239
- </div>
240
-
241
-
242
- <div class="nav-group">
243
- <div class="nav-group-title">Frictionless</div>
244
- <ul class="nav-group-links">
245
- <li><a href="invisible-frictionless-implicit.html">Implicit</a></li>
246
- <li><a href="invisible-frictionless-explicit.html">Explicit</a></li>
247
- </ul>
248
- </div>
249
-
250
- </div>
251
- </div>
252
-
253
- </div>
254
- </div>
255
- </div>
256
- </div>
257
-
258
-
259
- <div class="mui-container">
260
- <form action="undefined/signup" method="POST" class="mui-form">
261
- <h1>Example Login Form</h1>
262
- <div class="mui-textfield mui-textfield--float-label">
263
- <label for="name">Name</label>
264
- <input id="name" type="text" name="name" required/>
265
- </div>
266
- <div class="mui-textfield mui-textfield--float-label">
267
- <label for="email">Email Address</label>
268
- <input id="email" type="email" name="email" required/>
269
- </div>
270
- <div class="mui-textfield mui-textfield--float-label">
271
- <label for="password">Password</label>
272
- <input id="password" type="password" name="password" required/>
273
- </div>
274
- <div class="mui-textfield mui-textfield--float-label">
275
- <div id="procaptcha-container"></div>
276
- </div>
277
- <div id="messageContainer" style="display: none; color: black;"><span id="message"></span></div>
278
- <button type="button" class="mui-btn mui-btn--raised" onclick="onActionHandler()" data-cy="submit-button">Submit</button>
279
- </form>
280
- </div>
281
-
282
- <script>
283
- document.addEventListener('DOMContentLoaded', function() {
284
- const toggleBtn = document.getElementById('nav-toggle');
285
- const navBar = document.getElementById('nav-topbar');
286
- const navHeader = document.getElementById('nav-header');
287
-
288
- // Check if navigation was previously collapsed
289
- const navCollapsed = localStorage.getItem('navCollapsed') === 'true';
290
- if (navCollapsed) {
291
- navBar.classList.add('collapsed');
292
- }
293
-
294
- // Function to expand the navigation
295
- function expandNav() {
296
- if (navBar.classList.contains('collapsed')) {
297
- navBar.classList.remove('collapsed');
298
- localStorage.setItem('navCollapsed', 'false');
299
- }
300
- }
301
-
302
- // Function to collapse the navigation
303
- function collapseNav() {
304
- if (!navBar.classList.contains('collapsed')) {
305
- navBar.classList.add('collapsed');
306
- localStorage.setItem('navCollapsed', 'true');
307
- }
308
- }
309
-
310
- // Function to toggle the navigation
311
- function toggleNav() {
312
- navBar.classList.toggle('collapsed');
313
- localStorage.setItem('navCollapsed', navBar.classList.contains('collapsed'));
314
- }
315
-
316
- // Toggle on button click
317
- toggleBtn.addEventListener('click', function(e) {
318
- e.stopPropagation(); // Prevent header click from firing
319
- toggleNav();
320
- });
321
-
322
- // Expand on toggle button hover when collapsed
323
- toggleBtn.addEventListener('mouseenter', function() {
324
- if (navBar.classList.contains('collapsed')) {
325
- expandNav();
326
- }
327
- });
328
-
329
- // Toggle on header click
330
- navHeader.addEventListener('click', function(e) {
331
- // Don't toggle if a link within the header was clicked
332
- if (e.target.tagName === 'A') {
333
- return;
334
- }
335
- toggleNav();
336
- });
337
-
338
- // Make the header appear clickable with cursor style
339
- navHeader.style.cursor = 'pointer';
340
- });
341
- </script>
342
-
343
- </body>
344
- </html>