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