Password generator written with Astro
at main 3.4 kB view raw
1--- 2import "../styles/global.css" 3--- 4 5<html lang="en"> 6 <head> 7 <meta charset="utf-8" /> 8 <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 9 <meta name="viewport" content="width=device-width" /> 10 <title>Password Generator</title> 11 </head> 12 <script> 13 const display = document.getElementById("password"); 14 const wrapper = document.getElementById("box") 15 const wordsResponse = await fetch("/words.txt"); 16 if (!wordsResponse.ok) { 17 throw new Error(`Error!: ${wordsResponse.status}`); 18 } 19 const wordsFile = await wordsResponse.text(); 20 const words = wordsFile 21 .split("\n") 22 .filter((word) => word.trim() !== ""); 23 24 const charsResponse = await fetch("/chars.txt"); 25 if (!charsResponse.ok) { 26 throw new Error(`Error!: ${charsResponse.status}`); 27 } 28 const charsFile = await charsResponse.text(); 29 const chars = charsFile 30 .split("\n") 31 .filter((char) => char.trim() !== ""); 32 33 let password = "" 34 for (let i = 0; i < 6; i++) { 35 const randomWord = Math.floor(Math.random() * words.length); 36 password += words[randomWord] + " " 37 } 38 for (let i = 0; i < 6; i++) { 39 const randomChar = Math.floor(Math.random() * chars.length); 40 password += chars[randomChar] 41 } 42 43 display.textContent = "•".repeat(password.length) 44 display.style.setProperty("color", "#ffffff") 45 wrapper.style.setProperty("border-color", "oklch(20.8% 0.042 265.755)") 46 wrapper?.addEventListener("mouseenter", () => { 47 display.textContent = password 48 }) 49 wrapper?.addEventListener("mouseleave", () => { 50 display.textContent = "•".repeat(password.length) 51 }) 52 wrapper?.addEventListener("mousedown", () => { 53 navigator.clipboard.writeText(password) 54 display.style.setProperty("color", "#83c472") 55 wrapper.style.setProperty("border-color", "#83c472") 56 display.textContent = "Copied to clipboard..." 57 setTimeout(() => { 58 display.style.setProperty("color", "#ffffff") 59 wrapper.style.setProperty("border-color", "oklch(20.8% 0.042 265.755)") 60 if (wrapper.matches(":hover")) { 61 display.textContent = password 62 } else { 63 display.textContent = "•".repeat(password.length) 64 } 65 }, 1000) 66 }) 67 document.addEventListener("keydown", (event) => { 68 if (event.code == "Space") { 69 display.style.setProperty("color", "#8672c4") 70 wrapper.style.setProperty("border-color", "#8672c4") 71 display.textContent = "Reloading..." 72 setTimeout(() => { 73 location.reload() 74 }, 500) 75 } 76 }) 77 </script> 78 <body class="bg-black flex justify-center align-middle min-h-svh font-display font-bold"> 79 <div id="box" class="m-auto pt-[4rem] pb-[4rem] min-w-[50%] max-w-[90%] pl-[6rem] pr-[6rem] border-2 border-[#7289c4] flex flex-col 80 hover:cursor-pointer hover:scale-105 active:scale-95 transition-transform duration-150 ease-in hover:ease-out 81 "> 82 <span id="password" class="text-[#7289c4] text-3xl text-center transition-colors duration-150 ease-in hover:ease-out overflow-clip">Generating...</span> 83 <span class="text-slate-700 text-md w-full text-center mt-[1rem]">[click] to copy | [hover] to view | [space] to reload</span> 84 </div> 85 </body> 86</html>