From 32a00be0b3ba61888c0ce53f11ea73d9b694a987 Mon Sep 17 00:00:00 2001 From: OpenClaw Date: Fri, 20 Feb 2026 07:03:48 +0000 Subject: [PATCH] a11y & SEO: aria-labels, focus management, structured data, sitemap update, v0.3.3 --- package.json | 2 +- public/app.min.js | 2 +- public/index.html | 29 ++++++++++++++++------------- public/sitemap.xml | 13 +++++++------ 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 0d59065..86af9de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "docfast-api", - "version": "0.3.2", + "version": "0.3.3", "description": "Markdown/HTML to PDF API with built-in invoice templates", "main": "dist/index.js", "scripts": { diff --git a/public/app.min.js b/public/app.min.js index 258c395..6b5d8f6 100644 --- a/public/app.min.js +++ b/public/app.min.js @@ -1 +1 @@ -var signupEmail="",recoverEmail="";function showState(e){["signupInitial","signupLoading","signupVerify","signupResult"].forEach(function(e){var t=document.getElementById(e);t&&t.classList.remove("active")}),document.getElementById(e).classList.add("active")}function showRecoverState(e){["recoverInitial","recoverLoading","recoverVerify","recoverResult"].forEach(function(e){var t=document.getElementById(e);t&&t.classList.remove("active")}),document.getElementById(e).classList.add("active")}function openSignup(){document.getElementById("signupModal").classList.add("active"),showState("signupInitial"),document.getElementById("signupError").style.display="none",document.getElementById("verifyError").style.display="none",document.getElementById("signupEmail").value="",document.getElementById("verifyCode").value="",signupEmail=""}function closeSignup(){document.getElementById("signupModal").classList.remove("active")}function openRecover(){closeSignup(),document.getElementById("recoverModal").classList.add("active"),showRecoverState("recoverInitial");var e=document.getElementById("recoverError");e&&(e.style.display="none");var t=document.getElementById("recoverVerifyError");t&&(t.style.display="none"),document.getElementById("recoverEmailInput").value="",document.getElementById("recoverCode").value="",recoverEmail=""}function closeRecover(){document.getElementById("recoverModal").classList.remove("active")}async function submitSignup(){var e=document.getElementById("signupError"),t=document.getElementById("signupBtn"),n=document.getElementById("signupEmail").value.trim();if(!n||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(n))return e.textContent="Please enter a valid email address.",void(e.style.display="block");e.style.display="none",t.disabled=!0,showState("signupLoading");try{var a=await fetch("/v1/signup/free",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:n})}),i=await a.json();if(!a.ok)return showState("signupInitial"),e.textContent=i.error||"Something went wrong. Please try again.",e.style.display="block",void(t.disabled=!1);signupEmail=n,document.getElementById("verifyEmailDisplay").textContent=n,showState("signupVerify"),document.getElementById("verifyCode").focus(),t.disabled=!1}catch(n){showState("signupInitial"),e.textContent="Network error. Please try again.",e.style.display="block",t.disabled=!1}}async function submitVerify(){var e=document.getElementById("verifyError"),t=document.getElementById("verifyBtn"),n=document.getElementById("verifyCode").value.trim();if(!n||!/^\d{6}$/.test(n))return e.textContent="Please enter a 6-digit code.",void(e.style.display="block");e.style.display="none",t.disabled=!0;try{var a=await fetch("/v1/signup/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:signupEmail,code:n})}),i=await a.json();if(!a.ok)return e.textContent=i.error||"Verification failed.",e.style.display="block",void(t.disabled=!1);document.getElementById("apiKeyText").textContent=i.apiKey,showState("signupResult")}catch(n){e.textContent="Network error. Please try again.",e.style.display="block",t.disabled=!1}}async function submitRecover(){var e=document.getElementById("recoverError"),t=document.getElementById("recoverBtn"),n=document.getElementById("recoverEmailInput").value.trim();if(!n||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(n))return e.textContent="Please enter a valid email address.",void(e.style.display="block");e.style.display="none",t.disabled=!0,showRecoverState("recoverLoading");try{var a=await fetch("/v1/recover",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:n})}),i=await a.json();if(!a.ok)return showRecoverState("recoverInitial"),e.textContent=i.error||"Something went wrong.",e.style.display="block",void(t.disabled=!1);recoverEmail=n,document.getElementById("recoverEmailDisplay").textContent=n,showRecoverState("recoverVerify"),document.getElementById("recoverCode").focus(),t.disabled=!1}catch(n){showRecoverState("recoverInitial"),e.textContent="Network error. Please try again.",e.style.display="block",t.disabled=!1}}async function submitRecoverVerify(){var e=document.getElementById("recoverVerifyError"),t=document.getElementById("recoverVerifyBtn"),n=document.getElementById("recoverCode").value.trim();if(!n||!/^\d{6}$/.test(n))return e.textContent="Please enter a 6-digit code.",void(e.style.display="block");e.style.display="none",t.disabled=!0;try{var a=await fetch("/v1/recover/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:recoverEmail,code:n})}),i=await a.json();if(!a.ok)return e.textContent=i.error||"Verification failed.",e.style.display="block",void(t.disabled=!1);i.apiKey?(document.getElementById("recoveredKeyText").textContent=i.apiKey,showRecoverState("recoverResult")):(e.textContent=i.message||"No key found for this email.",e.style.display="block",t.disabled=!1)}catch(n){e.textContent="Network error. Please try again.",e.style.display="block",t.disabled=!1}}function copyKey(){doCopy(document.getElementById("apiKeyText").textContent,document.getElementById("copyBtn"))}function copyRecoveredKey(){doCopy(document.getElementById("recoveredKeyText").textContent,document.getElementById("copyRecoveredBtn"))}function doCopy(e,t){function n(){t.textContent="✓ Copied!",setTimeout(function(){t.textContent="Copy"},2e3)}function a(){t.textContent="Failed",setTimeout(function(){t.textContent="Copy"},2e3)}try{if(navigator.clipboard&&window.isSecureContext)navigator.clipboard.writeText(e).then(n).catch(function(){try{var t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",t.style.top="-9999px",t.style.left="-9999px",document.body.appendChild(t),t.focus(),t.select();var i=document.execCommand("copy");document.body.removeChild(t),i?n():a()}catch(e){a()}});else{var i=document.createElement("textarea");i.value=e,i.style.position="fixed",i.style.opacity="0",i.style.top="-9999px",i.style.left="-9999px",document.body.appendChild(i),i.focus(),i.select();var o=document.execCommand("copy");document.body.removeChild(i),o?n():a()}}catch(e){a()}}async function checkout(){try{var e=await fetch("/v1/billing/checkout",{method:"POST"}),t=await e.json();t.url?window.location.href=t.url:alert("Checkout is not available yet. Please try again later.")}catch(e){alert("Something went wrong. Please try again.")}}document.addEventListener("DOMContentLoaded",function(){document.getElementById("btn-signup").addEventListener("click",openSignup),document.getElementById("btn-signup-2").addEventListener("click",openSignup),document.getElementById("btn-checkout").addEventListener("click",checkout),document.getElementById("btn-close-signup").addEventListener("click",closeSignup),document.getElementById("signupBtn").addEventListener("click",submitSignup),document.getElementById("verifyBtn").addEventListener("click",submitVerify),document.getElementById("copyBtn").addEventListener("click",copyKey),document.getElementById("btn-close-recover").addEventListener("click",closeRecover),document.getElementById("recoverBtn").addEventListener("click",submitRecover),document.getElementById("recoverVerifyBtn").addEventListener("click",submitRecoverVerify),document.getElementById("copyRecoveredBtn").addEventListener("click",copyRecoveredKey),document.getElementById("recoverModal").addEventListener("click",function(e){e.target===this&&closeRecover()}),document.querySelectorAll(".open-recover").forEach(function(e){e.addEventListener("click",function(e){e.preventDefault(),openRecover()})}),document.getElementById("signupModal").addEventListener("click",function(e){e.target===this&&closeSignup()}),document.querySelectorAll('a[href^="#"]').forEach(function(e){e.addEventListener("click",function(e){e.preventDefault();var t=document.querySelector(this.getAttribute("href"));t&&t.scrollIntoView({behavior:"smooth"})})})});var emailChangeApiKey="",emailChangeNewEmail="";function showEmailChangeState(e){["emailChangeInitial","emailChangeLoading","emailChangeVerify","emailChangeResult"].forEach(function(e){var t=document.getElementById(e);t&&t.classList.remove("active")}),document.getElementById(e).classList.add("active")}function openEmailChange(){closeSignup(),closeRecover(),document.getElementById("emailChangeModal").classList.add("active"),showEmailChangeState("emailChangeInitial");var e=document.getElementById("emailChangeError");e&&(e.style.display="none");var t=document.getElementById("emailChangeVerifyError");t&&(t.style.display="none"),document.getElementById("emailChangeApiKey").value="",document.getElementById("emailChangeNewEmail").value="",document.getElementById("emailChangeCode").value="",emailChangeApiKey="",emailChangeNewEmail=""}function closeEmailChange(){document.getElementById("emailChangeModal").classList.remove("active")}async function submitEmailChange(){var e=document.getElementById("emailChangeError"),t=document.getElementById("emailChangeBtn"),n=document.getElementById("emailChangeApiKey").value.trim(),a=document.getElementById("emailChangeNewEmail").value.trim();if(!n)return e.textContent="Please enter your API key.",void(e.style.display="block");if(!a||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(a))return e.textContent="Please enter a valid email address.",void(e.style.display="block");e.style.display="none",t.disabled=!0,showEmailChangeState("emailChangeLoading");try{var i=await fetch("/v1/email-change",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:n,newEmail:a})}),o=await i.json();if(!i.ok)return showEmailChangeState("emailChangeInitial"),e.textContent=o.error||"Something went wrong.",e.style.display="block",void(t.disabled=!1);emailChangeApiKey=n,emailChangeNewEmail=a,document.getElementById("emailChangeEmailDisplay").textContent=a,showEmailChangeState("emailChangeVerify"),document.getElementById("emailChangeCode").focus(),t.disabled=!1}catch(n){showEmailChangeState("emailChangeInitial"),e.textContent="Network error. Please try again.",e.style.display="block",t.disabled=!1}}async function submitEmailChangeVerify(){var e=document.getElementById("emailChangeVerifyError"),t=document.getElementById("emailChangeVerifyBtn"),n=document.getElementById("emailChangeCode").value.trim();if(!n||!/^\d{6}$/.test(n))return e.textContent="Please enter a 6-digit code.",void(e.style.display="block");e.style.display="none",t.disabled=!0;try{var a=await fetch("/v1/email-change/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:emailChangeApiKey,newEmail:emailChangeNewEmail,code:n})}),i=await a.json();if(!a.ok)return e.textContent=i.error||"Verification failed.",e.style.display="block",void(t.disabled=!1);document.getElementById("emailChangeNewDisplay").textContent=i.newEmail||emailChangeNewEmail,showEmailChangeState("emailChangeResult")}catch(n){e.textContent="Network error. Please try again.",e.style.display="block",t.disabled=!1}}document.addEventListener("DOMContentLoaded",function(){var e=document.getElementById("btn-close-email-change");e&&e.addEventListener("click",closeEmailChange);var t=document.getElementById("emailChangeBtn");t&&t.addEventListener("click",submitEmailChange);var n=document.getElementById("emailChangeVerifyBtn");n&&n.addEventListener("click",submitEmailChangeVerify);var a=document.getElementById("emailChangeModal");a&&a.addEventListener("click",function(e){e.target===this&&closeEmailChange()}),document.querySelectorAll(".open-email-change").forEach(function(e){e.addEventListener("click",function(e){e.preventDefault(),openEmailChange()})})}),function(){function e(){for(var e=["signupModal","recoverModal","emailChangeModal"],t=0;t - + +