index.html (29758B)
1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>New Tab</title> 6 <link rel="icon" type="image/png" sizes="16x16" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQfmBBsMMCnqv3OaAAAAlUlEQVQoz83PIQvCABQE4E+ZQxQGxpnMgvgXxoqoQVxZWTCvrPpjrDYXzBoG/jHDQBFXBe/BC3f3uHv8BxYSvS+2J7GAyEXReVi4iEg9xJ2G2ENK6SrsNISuSiq1wMDoJYwNQKBWsdOIHJwMtZ3OMjDR2BG7WVnKxGZmpnJzsHZv223k6Ns7Olq/onLb98/tbueT/T2ejsYUrwqCFKkAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDktMTRUMTU6MTE6NTQrMDA6MDCEo9THAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE3LTA1LTExVDA4OjUzOjE4KzAwOjAwRp+EjgAAAABJRU5ErkJggg=="> 7 <link rel="icon" type="image/png" sizes="16x16" media="(prefers-color-scheme: light)" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQfmBBsMMCnqv3OaAAAAlUlEQVQoz83PIQvCABQE4E+ZQxQGxpnMgvgXxoqoQVxZWTCvrPpjrDYXzBoG/jHDQBFXBe/BC3f3uHv8BxYSvS+2J7GAyEXReVi4iEg9xJ2G2ENK6SrsNISuSiq1wMDoJYwNQKBWsdOIHJwMtZ3OMjDR2BG7WVnKxGZmpnJzsHZv223k6Ns7Olq/onLb98/tbueT/T2ejsYUrwqCFKkAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDktMTRUMTU6MTE6NTQrMDA6MDCEo9THAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE3LTA1LTExVDA4OjUzOjE4KzAwOjAwRp+EjgAAAABJRU5ErkJggg=="> 8 <link rel="icon" type="image/png" sizes="16x16" media="(prefers-color-scheme: dark)" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAJiS0dEAP+Hj8y/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH6QQbCRUh+wpbcQAAALFJREFUKM+90SFuAlEUheHvvXRCQ8MkBIHBgxk3onVokgaJYDHsobI7qG3SoNgAhuAq2QCIpqpMeBWQMRAcXPufnHPvuSG5PtFdBIWhcEaCoYIoN9NzvmvSM5NHpa7FRfeFrjIa2NleFGztDKJM5SDTrMGTDBxUsmijo2nqzSPIvXsFLR2bB0t7L1Z+tDXw59M3eFZZhsRIy4dorI+1+Slq4tdXSMebE3UXqW4iEW7/rH+3ICa6+mb3XQAAAABJRU5ErkJggg=="> 9 <style> 10 #prediction,body{font-family:monospace;font-size:1rem} 11 #prediction:not(:empty){opacity:1} 12 #prediction{background-color:#1d1d1d;color:#88c0d0cc;box-shadow:.1rem .1rem .7rem #151515;padding: 1rem 1.8rem 1rem 1.8rem;width:100%;margin:auto;opacity:0;border-radius: 0 0 .3rem .3rem;position:relative;z-index:-1} 13 .input-container input{all:unset;background-color:#151515;color:#6c99bb;border-radius:.3rem;box-shadow:.1rem .1rem .7rem #151515;padding:1.8rem;width:100%;margin:2rem auto 0;display:block} 14 .input-container:has(#prediction:not(:empty)) input{border-radius:.3rem .3rem 0 0} 15 .input-container{position:relative;width:100%} 16 body{width:56vw;margin:25vh auto;background-color:#2e3440;color:#d6dce8;overflow-y:hidden} 17 body::before{content:"";position:fixed;inset:0;pointer-events:none;background:radial-gradient(circle, transparent 60%, #15151555 100%);} 18 input{margin:2rem auto} 19 li.highlight,li:hover{text-shadow:2px 2px 8px #fff;text-decoration:underline;cursor:pointer} 20 li{width:fit-content;float:left;margin:.3rem 1rem .3rem 0} 21 p,svg{vertical-align:middle} 22 svg{width:1rem;height:1rem;padding-right:.5rem} 23 ul{list-style:none;padding:0;height:30vh;mask-image:linear-gradient(180deg, #000 10%, transparent)} 24 ul:hover{mask-image:unset;height:unset} 25 </style> 26 </head> 27 <body> 28 <p id="datetime"> 29 <svg fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> 30 <path d="m12 8v4l3 3m6-3c0 4.9706-4.0294 9-9 9-4.97056 0-9-4.0294-9-9 0-4.97056 4.02944-9 9-9 4.9706 0 9 4.02944 9 9z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/> 31 </svg><span id="datetime-text"></span> 32 </p> 33 <div class="input-container"> 34 <input type="text" id="queryInput" placeholder="Enter bookmark or search prefix..." autocomplete="off" autofocus> 35 <p id="prediction"></p> 36 </div> 37 <ul id="bookmarkList"></ul> 38 <script> 39 40 const subreddits = [ 41 "2007scape", 42 "abruptchaos", 43 "anticonsumption", 44 "antiwork", 45 "architecturalrevival", 46 "askreddit", 47 "beermoneyuk", 48 "casualuk", 49 "catastrophicfailure", 50 "childrenfallingover", 51 "chrissimpsonsartist", 52 "collapse", 53 "comics", 54 "commandline", 55 "compoface", 56 "confusing_perspective", 57 "consoom", 58 "cozyplaces", 59 "cryptocurrency", 60 "cyberpunk", 61 "datahoarder", 62 "dataisbeautiful", 63 "designporn", 64 "diyuk", 65 "donthelpjustfilm", 66 "earthporn", 67 "emulation", 68 "etymologymaps", 69 "explainlikeimfive", 70 "factorio", 71 "fpgagaming", 72 "fuckcars", 73 "gametrade", 74 "getnoted", 75 "goodnewsuk", 76 "hardwareswapuk", 77 "holdmyredbull", 78 "homeserver", 79 "idiotsincars", 80 "imaginarysliceoflife", 81 "irleastereggs", 82 "itsaunixsystem", 83 "justrolledintotheshop", 84 "kidsarefuckingstupid", 85 "leopardsatemyface", 86 "linux", 87 "linux_devices", 88 "linux_gaming", 89 "malelivingspace", 90 "mapporn", 91 "maybemaybemaybe", 92 "mechanical_gifs", 93 "minimalism", 94 "moviedetails", 95 "moviesinthemaking", 96 "nixos", 97 "nonononoyes", 98 "norge", 99 "norsk", 100 "oddlyterrifying", 101 "orphancrushingmachine", 102 "outoftheloop", 103 "patientgamers", 104 "piracy", 105 "pizzacrimes", 106 "praisethecameraman", 107 "prepperintel", 108 "printsf", 109 "programmerhumor", 110 "propagandaposters", 111 "scarysigns", 112 "schuylkillnotes", 113 "secondsketch", 114 "seedboxes", 115 "selfhosted", 116 "sffpc", 117 "shitamericanssay", 118 "shittyrobots", 119 "softwaregore", 120 "spottedonrightmove", 121 "stallmanwasright", 122 "startpages", 123 "stupidfood", 124 "suckless", 125 "terraria", 126 "thatsabooklight", 127 "theyknew", 128 "tipofmytongue", 129 "todayilearned", 130 "tombstoning", 131 "trippinthroughtime", 132 "unixporn", 133 "vandwellers", 134 "wellthatsucks", 135 "whatcouldgowrong", 136 "whatisthisthing", 137 "windowsmodding", 138 "worldnews", 139 "youshouldknow" 140 ]; 141 142 const bookmarks = [ 143 { name: "/g/ Technology", url: "https://boards.4channel.org/g/" }, 144 { name: "/r/Roms Megathread", url: "https://r-roms.github.io/" }, 145 { name: "Aftenposten", url: "https://www.aftenposten.no/" }, 146 { name: "AuroraWatch", url: "https://aurorawatch.lancs.ac.uk/" }, 147 { name: "Bank Holidays", url: "https://www.gov.uk/bank-holidays" }, 148 { name: "BBC News", url: "https://www.bbc.co.uk/news" }, 149 { name: "BBC Sport", url: "https://www.bbc.co.uk/sport" }, 150 { name: "BestInvest Funds", url: "https://www.bestinvest.co.uk/v2/investment-search#/" }, 151 { name: "Bitcoin Rainbow", url: "https://www.blockchaincenter.net/bitcoin-rainbow-chart/" }, 152 { name: "BorgBase", url: "https://www.borgbase.com/repositories" }, 153 { name: "ChatGPT", url: "https://chatgpt.com/" }, 154 { name: "Claude", url: "https://claude.ai/" }, 155 { name: "Cloudflare", url: "https://dash.cloudflare.com/" }, 156 { name: "Codecademy", url: "https://www.codecademy.com/learn" }, 157 { name: "CoinMarketCap Portfolio", url: "https://coinmarketcap.com/portfolio-tracker/" }, 158 { name: "CryptoVision", url: "https://cryptovision.live/" }, 159 { name: "CSS Minifier", url: "https://www.toptal.com/developers/cssminifier/" }, 160 { name: "Diff Merge", url: "https://editor.mergely.com/" }, 161 { name: "DrayTek Firmware", url: "https://fw.draytek.com.tw/" }, 162 { name: "Drive Prices", url: "https://diskprices.com/?locale=uk" }, 163 { name: "Duolingo", url: "https://www.duolingo.com/" }, 164 { name: "Duolinguists", url: "https://duolinguists.wordpress.com/i-speak-english/" }, 165 { name: "eBay Balance", url: "https://www.ebay.co.uk/mes/summary" }, 166 { name: "eBay Dispatch", url: "https://www.ebay.co.uk/sh/ord/?filter=status%3AAWAITING_SHIPMENT" }, 167 { name: "eBay Holiday", url: "https://www.ebay.co.uk/vac/timeaway" }, 168 { name: "Emulation General Wiki", url: "https://emulation.gametechwiki.com/index.php/Main_Page" }, 169 { name: "Epic Games", url: "https://store.epicgames.com/en-US/free-games" }, 170 { name: "EpisodeFeed", url: "https://episodefeed.com/my-feed#currently-in-feed" }, 171 { name: "Fanatical", url: "https://www.fanatical.com/en/" }, 172 { name: "Filter Lists", url: "https://filterlists.com/" }, 173 { name: "FitGirl", url: "https://fitgirl-repacks.site/" }, 174 { name: "Flagle", url: "https://www.flagle.io/" }, 175 { name: "Flight Radar 24", url: "https://www.flightradar24.com/" }, 176 { name: "FreshRSS", url: "https://rss.minskio.co.uk/" }, 177 { name: "Geography Quizes", url: "https://worldswire.com/" }, 178 { name: "GitHub", url: "https://github.com/breadcat/" }, 179 { name: "Google Keep", url: "https://keep.google.com/" }, 180 { name: "HackerNews", url: "https://news.ycombinator.com/news" }, 181 { name: "Hemnet", url: "https://www.hemnet.se/" }, 182 { name: "Home AP", url: "https://192.168.1.2/" }, 183 { name: "Home Router", url: "https://192.168.1.1/" }, 184 { name: "Hugo Local", url: "http://127.0.0.1:1313/" }, 185 { name: "IMDb Top 250", url: "https://www.imdb.com/chart/top" }, 186 { name: "Japanese Class", url: "https://japaneseclass.jp/" }, 187 { name: "JavaScript Minifier", url: "https://www.toptal.com/developers/javascript-minifier/" }, 188 { name: "Klar Tale", url: "https://www.klartale.no/" }, 189 { name: "Kodi", url: "http://kodi:kodi@192.168.1.6:8080/" }, 190 { name: "Limoncello", url: "https://drink.home.minskio.co.uk/" }, 191 { name: "Linode", url: "https://cloud.linode.com/linodes" }, 192 { name: "Lobsters", url: "https://lobste.rs/" }, 193 { name: "Logical Increments", url: "https://www.logicalincrements.com/" }, 194 { name: "Marine Traffic", url: "https://www.marinetraffic.com/" }, 195 { name: "Meetup", url: "https://www.meetup.com/your-events/" }, 196 { name: "Met Office Weather", url: "https://www.metoffice.gov.uk/public/weather/forecast/gcw9rrxn7" }, 197 { name: "Minskio", url: "https://minskio.co.uk/" }, 198 { name: "Mistral", url: "https://chat.mistral.ai/chat" }, 199 { name: "Myrient", url: "https://myrient.erista.me/files/" }, 200 { name: "Nault NANO Wallet", url: "https://nault.cc/" }, 201 { name: "Nexo", url: "https://platform.nexo.io/" }, 202 { name: "Noisli", url: "https://www.noisli.com/" }, 203 { name: "Oracle", url: "https://cloud.oracle.com/compute/instances" }, 204 { name: "Outlook", url: "https://outlook.office.com/mail/inbox" }, 205 { name: "Paperspace", url: "https://console.paperspace.com/" }, 206 { name: "PC Part Picker", url: "https://uk.pcpartpicker.com/list/" }, 207 { name: "Postcode Finder", url: "https://www.royalmail.com/find-a-postcode" }, 208 { name: "Power Cut Map", url: "https://www.northernpowergrid.com/power-cuts-map" }, 209 { name: "Prolific", url: "https://app.prolific.com" }, 210 { name: "Public Directory", url: "https://pub.home.minskio.co.uk/" }, 211 { name: "Radiooooo", url: "https://radiooooo.com/" }, 212 { name: "Real Time Lightning Map", url: "https://www.lightningmaps.org/" }, 213 { name: "Redactle", url: "https://redactle.net/" }, 214 { name: "Reddit", url: "https://reddit.com/r/" + subreddits.join("+") + "/" }, 215 { name: "Rightmove", url: "https://www.rightmove.co.uk/" }, 216 { name: "Showcase", url: "https://www.showcasecinemas.co.uk/showtimes/showcase-cinema-de-lux-leeds" }, 217 { name: "Sliding Puzzle Solver", url: "https://jweilhammer.github.io/sliding-puzzle-solver/" }, 218 { name: "Spotify", url: "https://open.spotify.com/" }, 219 { name: "SQLite Viewer", url: "https://sqliteviewer.app/" }, 220 { name: "Stable Tracker", url: "https://newtrackon.com/list" }, 221 { name: "Stagit", url: "https://git.minskio.co.uk/" }, 222 { name: "Stromboli", url: "https://stream.home.minskio.co.uk/" }, 223 { name: "Suckless", url: "https://suckless.org/" }, 224 { name: "Syncthing", url: "http://127.0.0.1:8384/" }, 225 { name: "Telegram", url: "https://web.telegram.org/k/" }, 226 { name: "Teleport Map", url: "https://oldschool.runescape.wiki/images/Teleport_map.jpg" }, 227 { name: "Time Zone Map", url: "https://upload.wikimedia.org/wikipedia/commons/e/ec/World_Time_Zones_Map.svg" }, 228 { name: "Timer", url: "https://pub.minskio.co.uk/.timer/" }, 229 { name: "Tradle", url: "https://tradle.net/" }, 230 { name: "Transmission", url: "https://tor.minskio.co.uk" }, 231 { name: "Traveline Route Planner", url: "https://www.traveline.info/" }, 232 { name: "TTS NaturalReader", url: "https://www.naturalreaders.com/online/" }, 233 { name: "Tynan Portfolio", url: "https://dashboard.m1finance.com/share/H4sIAAAAAAACA53PzwuCMBQH8H9F3jUP05JK6BDYUSXQIiJirMea2RJdiMn-99ah0y6r43t8P-_HCGpoEGKQ2J8bgeCDpPdPoxgkld66rr09UnXF1gtJSCYm0NWCYQfxcQT1gHj8juiQPVuhBhMRF1OXZJfkFY-yqlyB9qHBlqFUlJtwMNO-K39tLb501Lc-LZilp-SH5anFF466DLNkY38euN9eHWxOfuD8_-08ygubz_VJvwFVDPxOMwIAAA?referrerCode=5QM0YPa-0rCz" }, 234 { name: "unRPA", url: "https://im7mortal.github.io/unrpa/" }, 235 { name: "Unsplash", url: "https://unsplash.com/" }, 236 { name: "VaultWarden", url: "https://pass.minskio.co.uk/" }, 237 { name: "Ventu Sky", url: "https://www.ventusky.com/" }, 238 { name: "Vidyaplace Wiki", url: "http://vscape.wikidot.com/" }, 239 { name: "Vidyaplace", url: "https://vidyaplace.org/" }, 240 { name: "Vikunja", url: "https://todo.minskio.co.uk/" }, 241 { name: "Vuniper", url: "https://vuniper.com/movies" }, 242 { name: "W3C validator", url: "https://validator.w3.org/" }, 243 { name: "Walk Mapper", url: "https://onthegomap.com/" }, 244 { name: "Webex Admin", url: "https://admin.webex.com/" }, 245 { name: "Weight Tracker", url: "https://weight.home.minskio.co.uk/" }, 246 { name: "WhatsApp", url: "https://web.whatsapp.com/" }, 247 { name: "WikiQuote Random", url: "https://en.wikiquote.org/wiki/Special:Random" }, 248 { name: "Winget", url: "https://winstall.app/apps/" }, 249 { name: "Wordle", url: "https://www.nytimes.com/games/wordle/index.html" }, 250 { name: "Worldle", url: "https://worldle.teuteuf.fr/" }, 251 { name: "Zoho Mail", url: "https://mail.zoho.eu/zm/#mail" }, 252 { name: "Zoho Sheets", url: "https://sheet.zoho.eu/spreadsheets" }, 253 { name: "Zoopla", url: "https://www.zoopla.co.uk/" } 254 ]; 255 256 const commandMap = { 257 a: {base: "https://www.amazon.co.uk/",query: "https://www.amazon.co.uk/s?k={q}"}, 258 abb: {base: "http://audiobookbay.fi/",query: "http://audiobookbay.fi/?s={q}"}, 259 alp: {base: "https://pkgs.alpinelinux.org/packages?name=&branch=edge&arch=x86_64",query: "https://pkgs.alpinelinux.org/packages?branch=edge&arch=x86_64&name={q}"}, 260 anna: {base: "https://annas-archive.org/",query: "https://annas-archive.org/search?q={q}"}, 261 ans: {base: "https://galaxy.ansible.com/", query: "https://galaxy.ansible.com/search?deprecated=false&keywords={q}"}, 262 ap: {base: "https://www.archlinux.org/packages/", query: "https://www.archlinux.org/packages/?sort=&q={q}"}, 263 archive: {base: "https://web.archive.org/", query: "https://web.archive.org/web/*/{q}"}, 264 aur: {base: "https://aur.archlinux.org/packages/", query: "https://aur.archlinux.org/packages/?O=0&K={q}"}, 265 aw: {base: "https://wiki.archlinux.org/", query: "https://wiki.archlinux.org/index.php?title=Special:Search&search={q}"}, 266 cb: {base: "https://comicvine.gamespot.com/", query: "https://comicvine.gamespot.com/search/?q={q}"}, 267 cg: {base: "https://www.coingecko.com/", query: "https://www.coingecko.com/en/coins/{q}"}, 268 choco: {base: "https://chocolatey.org/packages", query: "https://chocolatey.org/packages?q={q}"}, 269 cron: {base: "https://crontab.guru/", query: "https://crontab.guru/#{q}"}, 270 d: {base: "https://start.duckduckgo.com/", query: "https://start.duckduckgo.com/?q={q}"}, 271 deb: {base: "https://packages.debian.org/", query: "https://packages.debian.org/{q}"}, 272 dock: {base: "https://hub.docker.com/", query: "https://hub.docker.com/search/?pullCount=1&q={q}"}, 273 down: {base: "https://downforeveryoneorjustme.com/", query: "https://downforeveryoneorjustme.com/{q}"}, 274 e: {base: "https://www.ebay.co.uk/", query: "https://www.ebay.co.uk/sch/i.html?_nkw={q}"}, 275 emu: {base: "https://emulation.gametechwiki.com/index.php", query: "https://emulation.gametechwiki.com/index.php?title=Special:Search&search={q}"}, 276 f: {base: "https://f-droid.org/", query: "https://search.f-droid.org/?lang=en&q={q}"}, 277 fast: {base: "https://fast.com/"}, 278 g: {base: "https://www.google.co.uk", query: "https://www.google.co.uk/search?udm=14&q={q}"}, 279 gamma: {base: "https://www.gamma-portal.com/framework/home.jspa", query: "https://www.gamma-portal.com/voip/ipdc/searchInput.jspa#{q}"}, 280 ge: {base: "https://www.ge-tracker.com/",query: "https://www.ge-tracker.com/names/{q}"}, 281 gf: {base: "https://gamefaqs.gamespot.com/", query: "https://gamefaqs.gamespot.com/search?game={q}"}, 282 gist: {base: "https://gist.github.com/", query: "https://gist.github.com/search?utf8=%E2%9C%93&q={q}"}, 283 git: {base: "https://github.com/", query: "https://github.com/search?q={q}"}, 284 gl: {base: "https://www.google.co.uk", query: "https://www.google.co.uk/search?btnI=1&q={q}"}, 285 gm: {base: "https://www.google.co.uk/maps/", query: "https://www.google.co.uk/maps/search/{q}"}, 286 gmt: {base: "https://www.google.co.uk/maps/",query: "https://www.google.co.uk/maps/dir/Brighouse/{q}/Brighouse/"}, 287 gog: {base: "https://www.gog.com/", query: "https://www.gog.com/games?query={q}"}, 288 gogg: {base: "https://gog-games.to/", query: "https://gog-games.to/?search={q}"}, 289 gr: {base: "https://www.goodreads.com/", query: "https://www.goodreads.com/search?utf8=%E2%9C%93&query={q}"}, 290 gum: {base: "https://www.gumtree.com/", query: "https://www.gumtree.com/search?q={q}&search_location=Brighouse&distance=30"}, 291 hm: {base: "https://home-manager-options.extranix.com", query: "https://home-manager-options.extranix.com/?query={q}"}, 292 i: {base: "https://images.google.co.uk/", query: "https://www.google.co.uk/search?tbm=isch&q={q}"}, 293 im: {base: "https://imdb.com/", query: "https://www.imdb.com/find?ref_=nv_sr_fn&s=all&q={q}"}, 294 ip: {base: "https://ip.minskio.co.uk/", query: "https://www.ip2location.com/demo/{q}"}, 295 ipl: {base: "https://www.bbc.co.uk/iplayer/", query: "https://www.bbc.co.uk/iplayer/search?q={q}"}, 296 jack: {base: "https://jack.minskio.co.uk", query: "https://jack.minskio.co.uk/UI/Dashboard#search={q}"}, 297 last: {base: "https://www.last.fm/", query: "https://www.last.fm/search?q={q}"}, 298 lut: {base: "https://lutris.net/", query: "https://lutris.net/games?q={q}"}, 299 m: {base: "https://wego.here.com/", query: "https://wego.here.com/search/{q}"}, 300 mac: {base: "https://macvendors.com/", query: "https://api.macvendors.com/{q}"}, 301 man: {base: "https://man.archlinux.org/", query: "https://man.archlinux.org/search?go=Go&q={q}"}, 302 mb: {base: "https://musicbrainz.org/", query: "https://musicbrainz.org/search?type=artist&limit=100&method=indexed&query={q}"}, 303 mx: {base: "https://mxtoolbox.com/SuperTool.aspx", query: "https://mxtoolbox.com/SuperTool.aspx?action={q}"}, 304 nitter: {base: "https://nitter.net/", query: "https://nitter.net/search?f=users&q={q}"}, 305 nix: {base: "https://nixos.org/", query: "https://search.nixos.org/packages?query={q}"}, 306 no: {base: "https://enno.dict.cc/", query: "https://enno.dict.cc/?s={q}"}, 307 nyaa: {base: "https://nyaa.si/", query: "https://nyaa.si/?s=seeders&o=desc&q={q}"}, 308 osm: {base: "https://www.openstreetmap.org/", query: "https://www.openstreetmap.org/search?query={q}"}, 309 osrs: {base: "https://oldschool.runescape.wiki/", query: "https://oldschool.runescape.wiki/?title=Special%3ASearch&search={q}"}, 310 pass: {base: "https://pass.minskio.co.uk/"}, 311 pay: {base: "https://12ft.io/", query: "https://12ft.io/{q}"}, 312 pc: {base: "https://pcgamingwiki.com/w/index.php", query: "https://pcgamingwiki.com/w/index.php?title=Special:Search&search={q}"}, 313 pix: {base: "https://www.pixnoy.com/", query: "https://www.pixnoy.com/profile/{q}/"}, 314 play: {base: "https://play.google.com/store/", query: "https://play.google.com/store/search?c=apps&q={q}"}, 315 proton: {base: "https://protondb.com/explore", query: "https://protondb.com/search?q={q}"}, 316 rfc: {base: "https://datatracker.ietf.org/", query: "https://datatracker.ietf.org/doc/search?rfcs=on&name={q}"}, 317 rs3: {base: "https://runescape.wiki/", query: "https://runescape.wiki/?title=Special%3ASearch&go=Go&search={q}"}, 318 rshs: {base: "https://secure.runescape.com/m=hiscore_oldschool/", query: "https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1={q}"}, 319 rss: {base: "https://rss.minskio.co.uk/"}, 320 rt: {base: "https://www.rottentomatoes.com/", query: "https://www.rottentomatoes.com/search/?search={q}"}, 321 s: {base: "https://store.steampowered.com/", query: "https://store.steampowered.com/search/?term={q}"}, 322 sc: {base: "https://github.com/koalaman/shellcheck/", query: "https://github.com/koalaman/shellcheck/wiki/{q}"}, 323 skey: {base: "https://store.steampowered.com/", query: "https://store.steampowered.com/account/registerkey?key={q}"}, 324 spot: {base: "https://open.spotify.com/", query: "https://open.spotify.com/search/{q}"}, 325 srx: {base: "https://searx.be/", query: "https://searx.be/?q={q}"}, 326 ss: {base: "https://steamspy.com/", query: "https://steamspy.com/search.php?s={q}"}, 327 st: {base: "https://www.startpage.com/", query: "https://www.startpage.com/do/metasearch.pl?query={q}"}, 328 svg: {base: "https://freesvgicons.com/", query: "https://freesvgicons.com/search?q={q}&collectionId=fluent"}, 329 t: {base: "https://tineye.com/", query: "https://tineye.com/parse?url={q}"}, 330 tm: {base: "https://www.themoviedb.org/", query: "https://www.themoviedb.org/search?query={q}"}, 331 tmc: {base: "https://login.themilesconsultancy.com/Driver/TripSummary.aspx"}, 332 tmt: {base: "https://www.themoviedb.org/", query: "https://www.themoviedb.org/search/tv?query={q}"}, 333 todo: {base: "https://todo.minskio.co.uk/"}, 334 tr: {base: "https://translate.google.com/", query: "https://translate.google.com/?sl=auto&tl=en&text={q}"}, 335 track: {base: "https://www.royalmail.com/track-your-item", query: "https://www.royalmail.com/track-your-item#/tracking-results/{q}"}, 336 tv: {base: "https://www.thetvdb.com/", query: "https://www.thetvdb.com/search?query={q}"}, 337 tvt: {base: "https://tvtropes.org/", query: "https://tvtropes.org/pmwiki/search_result.php?q={q}"}, 338 ud: {base: "https://www.urbandictionary.com/", query: "https://www.urbandictionary.com/define.php?term={q}"}, 339 ujs: {base: "https://greasyfork.org/en/scripts", query: "https://greasyfork.org/en/scripts?q={q}"}, 340 valid: {base: "https://validator.w3.org/nu/", query: "https://validator.w3.org/nu/?doc={q}"}, 341 w3c: {base: "https://validator.w3.org/", query: "https://validator.w3.org/nu/?doc={q}"}, 342 w3w: {base: "https://what3words.com/",query: "https://what3words.com/{q}"}, 343 w: {base: "https://en.wikipedia.org/w/index.php", query: "https://en.wikipedia.org/w/index.php?title=Special:Search&search={q}"}, 344 wa: {base: "https://www.wolframalpha.com/", query: "https://www.wolframalpha.com/input/?i={q}"}, 345 whois: {base: "https://whois.gandi.net/", query: "https://whois.gandi.net/en/results?search={q}"}, 346 wikt: {base: "https://en.wiktionary.org/w/index.php", query: "https://en.wiktionary.org/w/index.php?title=Special:Search&search={q}"}, 347 wiktno: {base: "https://no.wiktionary.org/w/index.php", query: "https://no.wiktionary.org/w/index.php?title=Special:Search&search={q}"}, 348 wine: {base: "https://www.winehq.org/",query: "https://www.winehq.org/search?q={q}"}, 349 wno: {base: "https://no.wikipedia.org/w/index.php",query: "https://no.wikipedia.org/w/index.php?title=Special:Search&search={q}"}, 350 y: {base: "https://www.youtube.com/",query: "https://www.youtube.com/results?search_query={q}"} 351 }; 352 353 const input = document.getElementById("queryInput"); 354 const bookmarkList = document.getElementById("bookmarkList"); 355 const predictionDisplay = document.getElementById("prediction"); 356 357 let filteredBookmarks = [...bookmarks]; 358 let selectedBookmarkIndex = -1; 359 360 function renderBookmarks() { 361 bookmarkList.innerHTML = ""; 362 filteredBookmarks.forEach((bm, index) => { 363 const li = document.createElement("li"); 364 li.textContent = bm.name; 365 if (index === selectedBookmarkIndex) { 366 li.classList.add("highlight"); 367 // Scroll the selected item into view 368 setTimeout(() => li.scrollIntoView({ block: "nearest", behavior: "smooth" }), 0); 369 } 370 li.addEventListener("click", () => { 371 window.open(bm.url, "_self"); 372 }); 373 bookmarkList.appendChild(li); 374 }); 375 376 bookmarkList.style.display = filteredBookmarks.length === 0 ? "none" : "block"; 377 } 378 379 function filterBookmarks(query) { 380 selectedBookmarkIndex = -1; 381 const lower = query.toLowerCase(); 382 filteredBookmarks = lower === "" 383 ? [...bookmarks] 384 : bookmarks.filter(b => b.name.toLowerCase().includes(lower)); 385 renderBookmarks(); 386 } 387 388 function runCommand(prefix, args) { 389 const cmd = commandMap[prefix]; 390 if (!cmd) return; 391 const url = args.length === 0 392 ? cmd.base 393 : cmd.query.replace("{q}", encodeURIComponent(args.join(" "))); 394 window.open(url, "_self"); 395 } 396 397 function hintCommand(prefix, args) { 398 const cmd = commandMap[prefix]; 399 if (!cmd) return ""; 400 return args.length === 0 401 ? cmd.base 402 : cmd.query.replace("{q}", encodeURIComponent(args.join(" "))); 403 } 404 405 function handleCommand(inputValue) { 406 const parts = inputValue.trim().split(" "); 407 const prefix = parts[0].toLowerCase(); 408 const args = parts.slice(1); 409 410 if (commandMap[prefix]) { 411 runCommand(prefix, args); 412 } else { 413 const query = encodeURIComponent(inputValue); 414 window.open(`https://start.duckduckgo.com/?q=${query}`, "_self"); 415 } 416 } 417 418 function updatePrediction(inputValue) { 419 const [prefix, ...args] = inputValue.trim().split(" "); 420 predictionDisplay.textContent = commandMap[prefix?.toLowerCase()] 421 ? hintCommand(prefix.toLowerCase(), args) 422 : ""; 423 } 424 425 function normalizeInput(raw) { 426 const spaceIndex = raw.indexOf(" "); 427 if (spaceIndex === -1) return raw.replace(/'/g, ""); 428 return raw.slice(0, spaceIndex).replace(/'/g, "") + raw.slice(spaceIndex); 429 } 430 431 input.addEventListener("input", (e) => { 432 const value = normalizeInput(e.target.value); 433 filterBookmarks(value); 434 updatePrediction(value); 435 }); 436 437 input.addEventListener("keydown", (e) => { 438 if (e.key === "Tab") { 439 e.preventDefault(); 440 if (filteredBookmarks.length > 0) { 441 if (e.shiftKey) { 442 selectedBookmarkIndex = (selectedBookmarkIndex - 1 + filteredBookmarks.length) % filteredBookmarks.length; 443 } else { 444 selectedBookmarkIndex = (selectedBookmarkIndex + 1) % filteredBookmarks.length; 445 } 446 renderBookmarks(); 447 } 448 } 449 else if (e.key === "ArrowDown") { 450 e.preventDefault(); 451 if (filteredBookmarks.length > 0) { 452 selectedBookmarkIndex = (selectedBookmarkIndex + 1) % filteredBookmarks.length; 453 renderBookmarks(); 454 } 455 } else if (e.key === "ArrowUp") { 456 e.preventDefault(); 457 if (filteredBookmarks.length > 0) { 458 selectedBookmarkIndex = (selectedBookmarkIndex - 1 + filteredBookmarks.length) % filteredBookmarks.length; 459 renderBookmarks(); 460 } 461 } else if (e.key === "Enter") { 462 if (selectedBookmarkIndex >= 0) { 463 window.open(filteredBookmarks[selectedBookmarkIndex].url, "_self"); 464 } else { 465 handleCommand(normalizeInput(input.value)); 466 } 467 } else if (e.key === "Escape") { 468 input.value = ""; 469 predictionDisplay.textContent = ""; 470 filterBookmarks(""); 471 } 472 }); 473 474 // Initial load 475 filterBookmarks(""); 476 function formatDateTime(date) { 477 const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; 478 const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; 479 480 const dayName = days[date.getDay()]; 481 const day = date.getDate(); 482 const month = months[date.getMonth()]; 483 const hours = String(date.getHours()).padStart(2, '0'); 484 const minutes = String(date.getMinutes()).padStart(2, '0'); 485 486 const getOrdinal = (n) => { 487 if (n > 3 && n < 21) return "th"; 488 switch (n % 10) { 489 case 1: return "st"; 490 case 2: return "nd"; 491 case 3: return "rd"; 492 default: return "th"; 493 } 494 }; 495 496 return `${dayName} ${day}${getOrdinal(day)} ${month}, ${hours}:${minutes}`; 497 } 498 499 function updateDateTime() { 500 const now = new Date(); 501 document.getElementById("datetime-text").textContent = formatDateTime(now); 502 } 503 504 setInterval(updateDateTime, 60000); 505 updateDateTime(); 506 507 </script> 508 </body> 509 </html>