index.html (3588B)
1 <!doctype html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"/> 6 <link rel="preconnect" href="https://fonts.googleapis.com" crossorigin="anonymous"/> 7 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/> 8 <link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"/> 9 <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" media="print" onload="this.media='all'"/> 10 <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 11 <title>Surf</title> 12 <meta name="description" content="A better default search engine (with bangs!)"/> 13 <link rel="stylesheet" href="/index.css"/> 14 <link rel="icon" href="favicon.png"> 15 </head> 16 17 <body style="background-color: transparent"> 18 <div id="app"> 19 <div style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh;"> 20 <div class="content-container"> 21 <h1>Surf</h1> 22 <p> 23 DuckDuckGo's bang redirects are too slow. 24 Add the following URL as a custom search engine to your browser. 25 Enables 26 <a href="https://duckduckgo.com/bang.html" target="_blank">some of DuckDuckGo's bangs.</a> 27 </p> 28 <div class="url-container"> 29 <input type="text" class="url-input" value="https://surf.sily.dev?q=%s" readonly/> 30 <button class="copy-button"> 31 <img src="/clipboard.svg" alt="Copy"/> 32 </button> 33 </div> 34 </div> 35 <footer class="footer"> 36 <a href="https://sily.dev" target="_blank" title="Me">back</a> 37 • 38 <a href="https://github.com/t3dotgg/unduck" target="_blank" title="Original website">unduck</a> 39 • 40 <a href="" id="set-default" title="Set default bang">default</a> 41 </footer> 42 </div> 43 </div> 44 <script> 45 document.querySelector("#set-default").addEventListener("click", () => { 46 let newBang = prompt("Please input new default bang", LS_DEFAULT_BANG); 47 if (newBang == null || newBang == "") { 48 alert("No bang was set"); 49 return; 50 } 51 52 const foundBang = bangs.find((b) => b.b === newBang); 53 54 if (foundBang == undefined) { 55 alert("Unknown bang"); 56 return; 57 } 58 59 if (confirm(`Found bang for '${ 60 foundBang.d 61 }'`)) { 62 localStorage.setItem("default-bang", newBang); 63 alert("Set new bang to " + newBang); 64 } else { 65 alert("Cancelled"); 66 return; 67 } 68 }); 69 70 function findBang(a) { 71 let d = ""; 72 console.log("---------------------------------------------------"); 73 console.log("Match:"); 74 for (let i of bangs) 75 if (i.b == a) { 76 console.log(i); 77 d = i.d; 78 break; 79 } 80 81 console.log("Similar bangs:"); 82 for (let i of bangs) 83 if (i.d == d) { 84 console.log(i); 85 } 86 87 console.log("---------------------------------------------------"); 88 } 89 90 function filterBangsByCategory(category) { 91 let ret = []; 92 for (let i of bangs) 93 if (i.c == category) 94 ret.push({d: i.d, b: i.t, u: i.u}); 95 96 97 console.log(ret); 98 } 99 100 { 101 const copyButton = app.querySelector(".copy-button"); 102 const copyIcon = copyButton.querySelector("img"); 103 const urlInput = app.querySelector(".url-input"); 104 105 copyButton.addEventListener("click", async () => { 106 await navigator.clipboard.writeText(urlInput.value); 107 copyIcon.src = "/clipboard-check.svg"; 108 109 setTimeout(() => { 110 copyIcon.src = "/clipboard.svg"; 111 }, 2000); 112 }); 113 } 114 </script> 115 </body> 116 117 </html>