@swetrix/captcha 1.0.3 → 2.0.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/.prettierrc.js ADDED
@@ -0,0 +1,13 @@
1
+ module.exports = {
2
+ printWidth: 120, // max 120 chars in line, code is easy to read
3
+ useTabs: false, // use spaces instead of tabs
4
+ tabWidth: 2, // "visual width" of of the "tab"
5
+ trailingComma: 'all', // add trailing commas in objects, arrays, etc.
6
+ semi: false, // Only add semicolons at the beginning of lines that may introduce ASI failures
7
+ singleQuote: true, // '' for stings instead of ""
8
+ bracketSpacing: true, // import { some } ... instead of import {some} ...
9
+ arrowParens: 'always', // braces even for single param in arrow functions (a) => { }
10
+ jsxSingleQuote: true, // '' for react props
11
+ bracketSameLine: false, // pretty JSX
12
+ endOfLine: 'lf', // 'lf' for linux, 'crlf' for windows, we need to use 'lf' for git
13
+ }
@@ -1 +1,2 @@
1
- !function(e){"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";function r(e,t){var n=Object.keys(t).map(function(e){return"".concat(encodeURIComponent(e),"=").concat(encodeURIComponent(t[e]))}).join("&");return"".concat(e,"?").concat(n)}function c(e){var t=e.data;if(t){var e=t.type,n=t.cid,r=t.event;if(e===l&&n&&v.includes(n)){var a,i=document.getElementById(n),o=null!==i;switch(r){case"success":var c=t.token;if(!o)return void w(d.error,"[PM -> success] Input element does not exist.");i.value=c;break;case"failure":case"tokenExpired":if(!o)return void w(d.error,"[PM -> failure] Input element does not exist.");i.value="";break;case"manualStarted":if(!(a=document.getElementById(f(n))))return void w(d.error,"[PM -> manualStarted] Frame does not exist.");a.style.height=h.manual;break;case"manualFinished":(a=document.getElementById(f(n)))?a.style.height=h.default:w(d.error,"[PM -> manualFinished] Frame does not exist.")}}}}function e(e){!(e=void 0===e?!1:e)&&"swecaptcha"in window&&w(d.warn,"Captcha is already loaded."),window.swecaptcha=!0,window.addEventListener("message",c);for(var t,n,r=0,a=Array.from(document.querySelectorAll(".swecaptcha"));r<a.length;r++){var i=a[r],o={pid:(o=i).getAttribute("data-project-id"),respName:o.getAttribute("data-response-input-name")||s,theme:o.getAttribute("data-theme")};if(n=void 0,n=(t=o).theme,t=t.pid,!(n&&!p.includes(n)?(w(d.error,"Invalid data-theme parameter: ".concat(n)),!1):!(!t||!m(t))||(w(d.error,"Invalid data-project-id parameter: ".concat(t)),!1)))return void w(d.error,"Aborting captcha rendering due to invalid parameters.");n=i,t=o,i=void 0,i=g(),t=u(u({},t),{cid:i}),i=y(t),t=x(t),n.appendChild(i),n.appendChild(t)}}var d,u=function(){return(u=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var a in t=arguments[n])Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e}).apply(this,arguments)},t=window.__SWETRIX_CAPTCHA_DEV||!1,a=t?"./light.html":"https://cap.swetrix.com/pages/light",i=t?"./dark.html":"https://cap.swetrix.com/pages/dark",s="swetrix-captcha-response",l="swetrix-captcha",p=["light","dark"],n=/^(?!.*--)[a-zA-Z0-9-]{12}$/,o=((t=d=d||{}).log="log",t.error="error",t.warn="warn",t.info="info",["AP00000000000","MP00000000000","FAIL000000000"]),m=function(e){return o.includes(e)||n.test(e)},h={default:"66px",manual:"200px"},f=function(e){return"".concat(e,"-frame")},v=[],w=function(e,t){console[e]("[Swetrix Captcha] ".concat(t))},g=function(){var e="swetrix-captcha-"+Math.random().toString(36).substr(2,6);return v.includes(e)?g():(v.push(e),e)},y=function(e){var t=e.theme,n=document.createElement("iframe");return n.id=f(e.cid),n.src=r("dark"===t?i:a,e),n.style.height=h.default,n.title="Swetrix Captcha",n.style.border="none",n.style.width="302px",n.style.overflow="visible",n},x=function(e){var t=e.cid,n=document.createElement("input");return n.type="hidden",n.name=e.respName,n.value="",n.id=t,n};window.swetrixCaptchaForceLoad=function(){return e(!0)},document.addEventListener("DOMContentLoaded",function(){return e()})});
1
+ !function(e){"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";const e=window.__SWETRIX_CAPTCHA_DEV||!1,t=e?"./light.html":"https://cap.swetrix.com/pages/light",n=e?"./dark.html":"https://cap.swetrix.com/pages/dark",r=["light","dark"],a=/^(?!.*--)[a-zA-Z0-9-]{12}$/;var i;!function(e){e.log="log",e.error="error",e.warn="warn",e.info="info"}(i||(i={}));const o=["AP00000000000","FAIL000000000"],c=[],d=(e,t)=>{console[e](`[Swetrix Captcha] ${t}`)},s=(e,t)=>`${e}?${Object.keys(t).map(e=>`${encodeURIComponent(e)}=${encodeURIComponent(t[e])}`).join("&")}`,p=(e,t)=>{const n={...t,cid:u()},r=m(n),a=h(n);e.appendChild(r),e.appendChild(a)},u=()=>{const e="swetrix-captcha-"+Math.random().toString(36).substr(2,6);return c.includes(e)?u():(c.push(e),e)},l=e=>{const{data:t}=e;if(!t)return;const{type:n,cid:r,event:a}=t;if("swetrix-captcha"!==n)return;if(!r||!c.includes(r))return;const o=document.getElementById(r),s=null!==o;switch(a){case"success":{const{token:e}=t;if(!s)return void d(i.error,"[PM -> success] Input element does not exist.");o.value=e;break}case"failure":case"tokenExpired":if(!s)return void d(i.error,"[PM -> failure] Input element does not exist.");o.value=""}},m=e=>{const{theme:r}=e,a=document.createElement("iframe");return a.id=`${e.cid}-frame`,a.src=s("dark"===r?n:t,e),a.style.height="66px",a.title="Swetrix Captcha",a.style.border="none",a.style.width="302px",a.style.overflow="visible",a},h=e=>{const{cid:t}=e,n=document.createElement("input");return n.type="hidden",n.name=e.respName,n.value="",n.id=t,n},w=e=>{const{theme:t,pid:n}=e;return t&&!r.includes(t)?(d(i.error,`Invalid data-theme parameter: ${t}`),!1):!(!n||!(e=>o.includes(e)||a.test(e))(n))||(d(i.error,`Invalid data-project-id parameter: ${n}`),!1)},f=e=>({pid:e.getAttribute("data-project-id"),respName:e.getAttribute("data-response-input-name")||"swetrix-captcha-response",theme:e.getAttribute("data-theme")}),g=(e=!1)=>{!e&&"swecaptcha"in window&&d(i.warn,"Captcha is already loaded."),window.swecaptcha=!0,window.addEventListener("message",l);const t=Array.from(document.querySelectorAll(".swecaptcha"));for(const e of t){const t=f(e);if(!w(t))return void d(i.error,"Aborting captcha rendering due to invalid parameters.");p(e,t)}};window.swetrixCaptchaForceLoad=()=>g(!0),document.addEventListener("DOMContentLoaded",()=>g())});
2
+ //# sourceMappingURL=captcha-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captcha-loader.js","sources":["../src/captcha-loader.ts"],"sourcesContent":[null],"names":["isDevelopment","window","__SWETRIX_CAPTCHA_DEV","LIGHT_CAPTCHA_IFRAME_URL","DARK_CAPTCHA_IFRAME_URL","THEMES","PID_REGEX","LOG_ACTIONS","DUMMY_PIDS","ids","log","status","text","console","appendParamsToURL","url","params","Object","keys","map","key","encodeURIComponent","join","renderCaptcha","container","cParams","cid","generateRandomID","frame","generateCaptchaFrame","input","generateHiddenInput","appendChild","randomID","Math","random","toString","substr","includes","push","postMessageCallback","pmEvent","data","type","event","document","getElementById","inputExists","token","error","value","theme","captchaFrame","createElement","id","src","style","height","title","border","width","overflow","name","respName","validateParams","pid","test","isValidPID","parseParams","getAttribute","main","forced","warn","swecaptcha","addEventListener","containers","Array","from","querySelectorAll","swetrixCaptchaForceLoad"],"mappings":"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"}
package/dist/captcha.js CHANGED
@@ -1 +1,2 @@
1
- !function(e){"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";function i(e,t){void 0===t&&(t={}),window.parent.postMessage(n({event:e,type:r,cid:window.__SWETRIX_CAPTCHA_ID},t),"*")}function u(e){w=e;var t,n=document.querySelector("#status-default"),r=document.querySelector("#status-failure"),c={checkbox:document.querySelector("#checkbox"),failure:document.querySelector("#failure"),completed:document.querySelector("#completed"),loading:document.querySelector("#loading")};null!=(t=c.checkbox)&&t.classList.add("hidden"),null!=(t=c.failure)&&t.classList.add("hidden"),null!=(t=c.completed)&&t.classList.add("hidden"),null!=(t=c.loading)&&t.classList.add("hidden"),"failure"===e?(null!=n&&n.classList.add("hidden"),null!=r&&r.classList.remove("hidden")):(null!=n&&n.classList.remove("hidden"),null!=r&&r.classList.add("hidden")),null!=(t=c[e])&&t.classList.remove("hidden")}function l(){setTimeout(function(){i(d.TOKEN_EXPIRED),u(f.checkbox)},3e5)}function s(){var e=document.querySelector("#manual-challenge"),t=document.querySelector("#svg-captcha");t&&(i(d.MANUAL_FINISHED),t.innerHTML="",null!=e)&&e.classList.add("hidden")}var d,f,e,n=function(){return(n=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var c in t=arguments[n])Object.prototype.hasOwnProperty.call(t,c)&&(e[c]=t[c]);return e}).apply(this,arguments)},h=function(e,a,i,u){return new(i=i||Promise)(function(n,t){function r(e){try{o(u.next(e))}catch(e){t(e)}}function c(e){try{o(u.throw(e))}catch(e){t(e)}}function o(e){var t;e.done?n(e.value):((t=e.value)instanceof i?t:new i(function(e){e(t)})).then(r,c)}o((u=u.apply(e,a||[])).next())})},p=function(r,c){var o,a,i,u={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},l={next:e(0),throw:e(1),return:e(2)};return"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function e(n){return function(e){var t=[n,e];if(o)throw new TypeError("Generator is already executing.");for(;u=l&&t[l=0]?0:u;)try{if(o=1,a&&(i=2&t[0]?a.return:t[0]?a.throw||((i=a.return)&&i.call(a),0):a.next)&&!(i=i.call(a,t[1])).done)return i;switch(a=0,(t=i?[2&t[0],i.value]:t)[0]){case 0:case 1:i=t;break;case 4:return u.label++,{value:t[1],done:!1};case 5:u.label++,a=t[1],t=[0];continue;case 7:t=u.ops.pop(),u.trys.pop();continue;default:if(!(i=0<(i=u.trys).length&&i[i.length-1])&&(6===t[0]||2===t[0])){u=0;continue}if(3===t[0]&&(!i||t[1]>i[0]&&t[1]<i[3]))u.label=t[1];else if(6===t[0]&&u.label<i[1])u.label=i[1],i=t;else{if(!(i&&u.label<i[2])){i[2]&&u.ops.pop(),u.trys.pop();continue}u.label=i[2],u.ops.push(t)}}t=c.call(r,u)}catch(e){t=[6,e],a=0}finally{o=i=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}}},v=window.__SWETRIX_CAPTCHA_DEV||!1?"http://localhost:5005/v1/captcha":"https://api.swetrix.com/v1/captcha",r="swetrix-captcha",y="",m="/verify",S="/generate",E="/verify-manual",w=((e=d=d||{}).SUCCESS="success",e.FAILURE="failure",e.TOKEN_EXPIRED="tokenExpired",e.MANUAL_STARTED="manualStarted",e.MANUAL_FINISHED="manualFinished",(e=f=f||{}).checkbox="checkbox",e.failure="failure",e.completed="completed",e.loading="loading",f.checkbox);document.addEventListener("DOMContentLoaded",function(){var e=document.querySelector("#swetrix-captcha"),t=document.querySelector("#branding"),a=document.querySelector("#svg-captcha-input"),n=document.querySelector("#manual-submit-btn");null!=t&&t.addEventListener("click",function(e){e.stopPropagation()}),null!=n&&n.addEventListener("click",function(o){return h(void 0,void 0,void 0,function(){var t,n,r,c;return p(this,function(e){switch(e.label){case 0:if(o.stopPropagation(),!a)return[2];if(!(t=a.value))return[2];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,fetch("".concat(v).concat(E),{method:"POST",body:JSON.stringify({hash:y,code:t,pid:window.__SWETRIX_PROJECT_ID}),headers:{"Content-Type":"application/json"}})];case 2:return n=e.sent(),[3,4];case 3:return e.sent(),s(),i(d.FAILURE),u(f.failure),a.value="",[2];case 4:return n.ok?[4,n.json()]:(s(),i(d.FAILURE),u(f.failure),a.value="",[2]);case 5:return c=e.sent(),r=c.success,c=c.token,r?(a.value="",i(d.SUCCESS,{token:c}),l(),u(f.completed),s()):(s(),i(d.FAILURE),u(f.failure),a.value=""),[2]}})})}),null!=e&&e.addEventListener("click",function(){return h(void 0,void 0,void 0,function(){var c,o,a;return p(this,function(e){switch(e.label){case 0:if(w===f.loading||w===f.completed)return[2];if(w===f.failure)return u(f.checkbox),[2];u(f.loading),e.label=1;case 1:return e.trys.push([1,3,,5]),[4,h(void 0,void 0,void 0,function(){var t;return p(this,function(e){switch(e.label){case 0:return e.trys.push([0,3,,4]),[4,fetch("".concat(v).concat(m),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({pid:window.__SWETRIX_PROJECT_ID})})];case 1:return(t=e.sent()).ok?[4,t.json()]:[2,{}];case 2:return[2,e.sent()];case 3:return e.sent(),i(d.FAILURE),u(f.failure),[2,{}];case 4:return[2]}})})];case 2:if(c=e.sent().token)return i(d.SUCCESS,{token:c}),l(),u(f.completed),[2];throw"";case 3:return e.sent(),[4,h(void 0,void 0,void 0,function(){var t;return p(this,function(e){switch(e.label){case 0:return e.trys.push([0,3,,4]),[4,fetch("".concat(v).concat(S),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({theme:window.__SWETRIX_CAPTCHA_THEME||"light",pid:window.__SWETRIX_PROJECT_ID})})];case 1:if((t=e.sent()).ok)return[4,t.json()];throw"";case 2:return[2,e.sent()];case 3:return e.sent(),i(d.FAILURE),u(f.failure),[2,{}];case 4:return[2]}})})];case 4:return c=e.sent(),o=c.data,a=c.hash,y=a,t=o,n=document.querySelector("#manual-challenge"),(r=document.querySelector("#svg-captcha"))&&(t?r.innerHTML=t:((t=document.createElement("p")).innerText="Error loading captcha",t.style.color="#d6292a",null!=r&&r.appendChild(t)),i(d.MANUAL_STARTED),null!=n)&&n.classList.remove("hidden"),[2];case 5:return[2]}var t,n,r})})})})});
1
+ !function(e){"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";const e="http://localhost:5005/v1/captcha",t=1e8,o=3e5,n="/generate",r="/verify";var a,i;!function(e){e.SUCCESS="success",e.FAILURE="failure",e.TOKEN_EXPIRED="tokenExpired"}(a||(a={})),function(e){e.checkbox="checkbox",e.failure="failure",e.completed="completed",e.loading="loading"}(i||(i={}));let c=i.checkbox,l=null;const s=(e,t={})=>{window.parent.postMessage({event:e,type:"swetrix-captcha",cid:window.__SWETRIX_CAPTCHA_ID,...t},"*")},d=e=>{var t,o,n,r,a;c=e;const l=document.querySelector("#status-default"),s=document.querySelector("#status-failure"),d=document.querySelector("#status-computing"),u={checkbox:document.querySelector("#checkbox"),failure:document.querySelector("#failure"),completed:document.querySelector("#completed"),loading:document.querySelector("#loading")};e!==i.checkbox?null===(t=u.checkbox)||void 0===t||t.classList.add("fade-out"):null===(o=u.checkbox)||void 0===o||o.classList.remove("fade-out"),null===(n=u.loading)||void 0===n||n.classList.remove("show"),null===(r=u.failure)||void 0===r||r.classList.remove("show"),null===(a=u.completed)||void 0===a||a.classList.remove("show"),null==l||l.classList.add("hidden"),null==s||s.classList.add("hidden"),null==d||d.classList.add("hidden"),"failure"===e?null==s||s.classList.remove("hidden"):"loading"===e?null==d||d.classList.remove("hidden"):null==l||l.classList.remove("hidden"),e!==i.checkbox&&requestAnimationFrame(()=>{var t;null===(t=u[e])||void 0===t||t.classList.add("show")})},u=()=>{setTimeout(()=>{s(a.TOKEN_EXPIRED),d(i.checkbox)},3e5)},f=async(t,o,n)=>{try{const a=await fetch(`${e}${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({challenge:t,nonce:o,solution:n,pid:window.__SWETRIX_PROJECT_ID})});if(!a.ok)throw new Error("Verification failed");const i=await a.json();if(!i.success)throw new Error("Verification failed");return i.token}catch(e){return s(a.FAILURE),d(i.failure),null}},m=async e=>{const{challenge:n,difficulty:r}=e;let c=0;const l=Date.now(),m=async e=>{const t=(new TextEncoder).encode(e),o=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(o)).map(e=>e.toString(16).padStart(2,"0")).join("")},h=(e,t)=>{for(let o=0;o<t;o++)if("0"!==e[o])return!1;return!0};for(;c<t;){if(Date.now()-l>=o)return console.error(`PoW main-thread timeout: 300000ms elapsed after ${c} attempts`),s(a.FAILURE),void d(i.failure);const e=`${n}:${c}`,t=await m(e);if(h(t,r)){const e=await f(n,c,t);return void(e&&(s(a.SUCCESS,{token:e}),u(),d(i.completed)))}c++}console.error("PoW main-thread max iterations reached: 100000000 attempts"),s(a.FAILURE),d(i.failure)};document.addEventListener("DOMContentLoaded",()=>{const t=document.querySelector("#swetrix-captcha"),o=document.querySelector("#branding");null==o||o.addEventListener("click",e=>{e.stopPropagation()}),null==t||t.addEventListener("click",async()=>{if(c===i.loading||c===i.completed)return;if(c===i.failure)return void d(i.checkbox);d(i.loading);const t=await(async()=>{try{const t=await fetch(`${e}${n}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({pid:window.__SWETRIX_PROJECT_ID})});if(!t.ok)throw new Error("Failed to generate challenge");return await t.json()}catch(e){return s(a.FAILURE),d(i.failure),null}})();t&&await(async e=>new Promise((t,o)=>{l&&l.terminate();try{l=new Worker("./pow-worker.js")}catch(n){return void m(e).then(t).catch(o)}l.onmessage=async o=>{const n=o.data;if("progress"!==n.type){if("timeout"===n.type)return console.error("PoW worker timeout:",n.reason),s(a.FAILURE),d(i.failure),null==l||l.terminate(),l=null,void t();if("result"===n.type){const o=await f(e.challenge,n.nonce,n.solution);return o&&(s(a.SUCCESS,{token:o}),u(),d(i.completed)),null==l||l.terminate(),l=null,void t()}if("error"===n.type){const e=n;return console.error("PoW worker error message:",e.message||"Unknown error"),s(a.FAILURE),d(i.failure),null==l||l.terminate(),l=null,void t()}console.warn("PoW worker received unexpected message type:",n.type,"Raw data:",n),s(a.FAILURE),d(i.failure),null==l||l.terminate(),l=null,t()}},l.onerror=n=>{console.error("PoW worker error:",n),null==l||l.terminate(),l=null,m(e).then(t).catch(o)},l.postMessage({challenge:e.challenge,difficulty:e.difficulty})}))(t)})})});
2
+ //# sourceMappingURL=captcha.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captcha.js","sources":["../src/captcha.ts"],"sourcesContent":[null],"names":["API_URL","MAX_ITERATIONS","TIMEOUT_MS","ENDPOINTS","IFRAME_MESSAGE_TYPES","ACTION","activeAction","checkbox","powWorker","sendMessageToLoader","event","data","window","parent","postMessage","type","cid","__SWETRIX_CAPTCHA_ID","activateAction","action","statusDefault","document","querySelector","statusFailure","statusComputing","actions","failure","completed","loading","_a","classList","add","_b","remove","_c","_d","_e","requestAnimationFrame","setLifetimeTimeout","setTimeout","TOKEN_EXPIRED","CAPTCHA_TOKEN_LIFETIME","verifySolution","async","challenge","nonce","solution","response","fetch","method","headers","body","JSON","stringify","pid","__SWETRIX_PROJECT_ID","ok","Error","json","success","token","e","FAILURE","solveInMainThread","challengeStr","difficulty","startTime","Date","now","sha256","message","TextEncoder","encode","hashBuffer","crypto","subtle","digest","Array","from","Uint8Array","map","b","toString","padStart","join","hasValidPrefix","hash","diff","i","console","error","input","SUCCESS","addEventListener","captchaComponent","branding","stopPropagation","generateChallenge","Promise","resolve","reject","terminate","Worker","then","catch","onmessage","reason","errorData","warn","onerror","solveChallenge"],"mappings":"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"}
@@ -24,13 +24,14 @@
24
24
  display: flex;
25
25
  justify-content: center;
26
26
  align-items: center;
27
+ position: relative;
27
28
 
28
29
  /* 300 - 20px (padding) */
29
30
  width: 280px;
30
31
 
31
32
  background-color: #0f172a;
32
33
  border: 1px solid #1e293b;
33
- height: 65px;
34
+ height: 64px;
34
35
  -webkit-user-select: none;
35
36
  user-select: none;
36
37
  padding-left: 10px;
@@ -47,57 +48,80 @@
47
48
  display: flex;
48
49
  align-items: center;
49
50
  cursor: pointer;
50
-
51
- /* divide the space between #challenge and #branding as a proportion of 5 to 1 using flex */
52
- flex: 5;
51
+ flex: 1;
53
52
  }
54
53
 
55
54
  #action {
56
55
  margin-right: 10px;
56
+ position: relative;
57
+ width: 28px;
58
+ height: 28px;
57
59
  }
58
60
 
59
61
  #checkbox {
60
62
  background-color: #111827;
61
- border: 1px solid #1e293b;
63
+ border: 1px solid #374151;
62
64
  height: 25px;
63
65
  width: 25px;
64
66
  border-radius: 3px;
67
+ position: absolute;
68
+ top: 50%;
69
+ left: 50%;
70
+ transform: translate(-50%, -50%);
71
+ transition: opacity 0.25s ease, transform 0.25s ease;
72
+ }
73
+
74
+ #checkbox:hover {
75
+ border-color: #4b5563;
65
76
  }
66
77
 
67
78
  #status {
68
- font-size: 16px;
79
+ font-size: 14px;
69
80
  color: #f9fafb;
70
81
  }
71
82
 
72
- .hidden {
73
- display: none !important;
83
+ #status span {
84
+ transition: opacity 0.2s ease;
74
85
  }
75
86
 
76
- #branding {
87
+ #status-computing {
77
88
  display: flex;
78
89
  flex-direction: column;
79
- align-items: flex-end;
80
- flex: 1;
81
90
  }
82
91
 
83
- #legal {
84
- font-size: 10px;
92
+ .hidden {
93
+ display: none !important;
85
94
  }
86
95
 
87
- #legal>a {
88
- color: #f9fafb;
89
- text-decoration: none;
90
- cursor: pointer;
96
+ /* Fade out animation for hiding elements */
97
+ .fade-out {
98
+ opacity: 0 !important;
99
+ transform: translate(-50%, -50%) scale(0.8) !important;
100
+ pointer-events: none;
91
101
  }
92
102
 
93
- #legal>a:hover {
94
- text-decoration: underline;
103
+ /* Fade in animation for showing elements */
104
+ .fade-in {
105
+ opacity: 1;
106
+ transform: translate(-50%, -50%) scale(1);
95
107
  }
96
108
 
97
- #legal>.separator::before {
98
- content: "-";
99
- margin: 0 2px;
100
- color: #f9fafb;
109
+ #branding {
110
+ position: absolute;
111
+ bottom: 4px;
112
+ right: 10px;
113
+ }
114
+
115
+ #branding a {
116
+ font-size: 9px;
117
+ color: #6b7280;
118
+ text-decoration: none;
119
+ transition: color 0.2s ease;
120
+ }
121
+
122
+ #branding a:hover {
123
+ color: #9ca3af;
124
+ text-decoration: underline;
101
125
  }
102
126
 
103
127
  #action svg {
@@ -105,87 +129,106 @@
105
129
  height: 28px;
106
130
  }
107
131
 
108
- #failure>svg {
132
+ #failure > svg {
109
133
  /* bg-red-500 */
110
134
  color: #d6292a;
111
135
  }
112
136
 
113
- #completed>svg {
137
+ #completed > svg {
114
138
  /* bg-green-600 */
115
139
  color: #16a24c;
116
140
  }
117
141
 
118
- #completed, #failure {
142
+ #completed,
143
+ #failure {
119
144
  display: flex;
120
145
  align-items: center;
121
146
  justify-content: center;
147
+ position: absolute;
148
+ top: 50%;
149
+ left: 50%;
150
+ transform: translate(-50%, -50%) scale(0.8);
151
+ opacity: 0;
152
+ transition: opacity 0.3s ease, transform 0.3s ease;
122
153
  }
123
154
 
124
- /* Loading indicator */
125
- @keyframes spin {
126
- 0% {
127
- transform: rotate(0deg);
128
- }
155
+ #completed.show,
156
+ #failure.show {
157
+ opacity: 1;
158
+ transform: translate(-50%, -50%) scale(1);
159
+ }
129
160
 
130
- 100% {
131
- transform: rotate(360deg);
161
+ /* Checkmark draw animation */
162
+ #completed.show svg path {
163
+ stroke-dasharray: 24;
164
+ stroke-dashoffset: 24;
165
+ animation: drawCheck 0.4s ease forwards 0.1s;
166
+ }
167
+
168
+ @keyframes drawCheck {
169
+ to {
170
+ stroke-dashoffset: 0;
132
171
  }
133
172
  }
134
173
 
174
+ /* Failure shake animation */
175
+ #failure.show {
176
+ animation: shake 0.4s ease;
177
+ }
178
+
179
+ @keyframes shake {
180
+ 0%, 100% { transform: translate(-50%, -50%) scale(1) rotate(0deg); }
181
+ 25% { transform: translate(-50%, -50%) scale(1) rotate(-5deg); }
182
+ 75% { transform: translate(-50%, -50%) scale(1) rotate(5deg); }
183
+ }
184
+
185
+ /* Loading indicator - Material Design style spinner */
135
186
  #loading {
136
- border-radius: 50%;
137
- width: 17px;
138
- height: 17px;
139
- border: 4px solid #111827;
140
- border-top-color: #4b5563;
141
- animation: spin 2s infinite linear;
187
+ position: absolute;
188
+ top: 50%;
189
+ left: 50%;
190
+ transform: translate(-50%, -50%);
191
+ width: 24px;
192
+ height: 24px;
193
+ opacity: 0;
194
+ transition: opacity 0.25s ease;
142
195
  }
143
196
 
144
- #manual-challenge {
145
- display: flex;
146
- justify-content: center;
147
- align-items: center;
148
- flex-direction: row;
149
- border: 1px solid #1e293b;
150
- /* bg-slate-900 */
151
- background-color: #0f172a;
152
- border-top: none;
153
- height: 130px;
154
- width: 280px;
155
- padding-left: 10px;
156
- padding-right: 10px;
157
- gap: 10px;
197
+ #loading.show {
198
+ opacity: 1;
158
199
  }
159
200
 
160
- #input-n-captcha {
161
- display: flex;
162
- flex-direction: column;
163
- align-items: center;
164
- cursor: pointer;
165
- flex: 5;
201
+ #loading svg {
202
+ width: 24px;
203
+ height: 24px;
204
+ animation: rotate 1.4s linear infinite;
166
205
  }
167
206
 
168
- #input-n-captcha > input {
169
- width: 100%;
170
- background-color: #1e293b;
171
- color: #f9fafb;
172
- border: 2px solid #1e293b;
173
- border-radius: 3px;
207
+ #loading svg circle {
208
+ stroke: #60a5fa;
209
+ stroke-linecap: round;
210
+ animation: dash 1.4s ease-in-out infinite;
174
211
  }
175
212
 
176
- #manual-submit-btn {
177
- background-color: #1e293b;
178
- border: 1px solid #1e293b;
179
- color: #f9fafb;
180
- padding-left: 5px;
181
- padding-right: 5px;
182
- border-radius: 3px;
183
- height: 75px;
184
- display: flex;
185
- align-items: center;
186
- justify-content: center;
187
- cursor: pointer;
188
- flex: 1;
213
+ @keyframes rotate {
214
+ 100% {
215
+ transform: rotate(360deg);
216
+ }
217
+ }
218
+
219
+ @keyframes dash {
220
+ 0% {
221
+ stroke-dasharray: 1, 150;
222
+ stroke-dashoffset: 0;
223
+ }
224
+ 50% {
225
+ stroke-dasharray: 90, 150;
226
+ stroke-dashoffset: -35;
227
+ }
228
+ 100% {
229
+ stroke-dasharray: 90, 150;
230
+ stroke-dashoffset: -124;
231
+ }
189
232
  }
190
233
  </style>
191
234
  <script>
@@ -206,41 +249,34 @@
206
249
  <div id="action">
207
250
  <!-- Can contain a checkbox itself / a red cross (with a retry action) / a green check mark -->
208
251
  <div id="checkbox"></div>
209
- <div id="failure" class="hidden">
210
- <svg fill="transparent" fill-opacity="0" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
211
- <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
252
+ <div id="failure">
253
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
254
+ <path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/>
255
+ <path d="M12 9v4"/>
256
+ <path d="M12 17h.01"/>
257
+ </svg>
258
+ </div>
259
+ <div id="completed">
260
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
261
+ <path d="M20 6 9 17l-5-5"/>
212
262
  </svg>
213
263
  </div>
214
- <div id="completed" class="hidden">
215
- <svg fill="transparent" fill-opacity="0" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
216
- <path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5" />
264
+ <div id="loading">
265
+ <svg viewBox="0 0 50 50">
266
+ <circle cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle>
217
267
  </svg>
218
268
  </div>
219
- <div id="loading" class="hidden"></div>
220
269
  </div>
221
270
  <div id="status">
222
271
  <span id="status-default">I am human</span>
223
272
  <span id="status-failure" class="hidden">Failure, please retry</span>
273
+ <span id="status-computing" class="hidden">
274
+ <span>Verifying...</span>
275
+ </span>
224
276
  </div>
225
277
  </div>
226
278
  <div id="branding">
227
- <a href="https://swetrix.com" target="_blank" rel="noopener noreferrer">
228
- <img src="../assets/logo_white.png" alt="Swetrix" width="81" height="18" />
229
- </a>
230
- <div id="legal">
231
- <a href="https://swetrix.com/privacy" target="_blank" rel="noopener noreferrer">Privacy</a>
232
- <span class="separator"></span>
233
- <a href="https://swetrix.com/terms" target="_blank" rel="noopener noreferrer">Terms</a>
234
- </div>
235
- </div>
236
- </div>
237
- <div id="manual-challenge" class="hidden">
238
- <div id="input-n-captcha">
239
- <div id="svg-captcha"></div>
240
- <input aria-label="Enter the code from image" type="text" id="svg-captcha-input" autocomplete="off" />
241
- </div>
242
- <div id="manual-submit-btn">
243
- Submit
279
+ <a href="https://swetrix.com/captcha" target="_blank" rel="noopener noreferrer">Swetrix Captcha</a>
244
280
  </div>
245
281
  </div>
246
282
  </body>