index.html (25558B)
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 body{width:56vw;margin:25vh auto;background-color:#2e3440;color:#d6dce8;font-family:monospace;font-size:1rem;overflow-y:hidden} 11 input{all:unset;width:100%;background-color:#151515;color:#6c99bb;box-shadow:.1rem .1rem .7rem #151515;border-radius:.3rem;padding:1.8rem;margin:2rem auto} 12 li.highlight,li:hover{text-shadow:2px 2px 8px #fff;text-decoration:underline;cursor:pointer} 13 li{width:fit-content;float:left;margin:.3rem 1rem .3rem 0} 14 p,svg{vertical-align:middle} 15 svg{width:1rem;height:1rem;padding-right:.5rem} 16 ul{list-style:none;padding:0;height:30vh;mask-image:linear-gradient(180deg, #000 10%, transparent)} 17 ul:hover{mask-image:unset;height:unset} 18 </style> 19 </head> 20 <body> 21 <p id="datetime"> 22 <svg fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> 23 <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"/> 24 </svg><span id="datetime-text"></span> 25 </p> 26 <input type="text" id="queryInput" placeholder="Enter bookmark or search prefix..." autocomplete="off" autofocus> 27 <p id="prediction"></p> 28 <ul id="bookmarkList"></ul> 29 <script> 30 const bookmarks = [ 31 { name: "/g/ Technology", url: "https://boards.4channel.org/g/" }, 32 { name: "/r/Roms Megathread", url: "https://r-roms.github.io/" }, 33 { name: "Aftenposten", url: "https://www.aftenposten.no/" }, 34 { name: "AuroraWatch", url: "https://aurorawatch.lancs.ac.uk/" }, 35 { name: "BBC News", url: "https://www.bbc.co.uk/news" }, 36 { name: "Beeper", url: "https://chat.beeper.com" }, 37 { name: "BestInvest Funds", url: "https://www.bestinvest.co.uk/v2/investment-search#/" }, 38 { name: "Bitcoin Rainbow", url: "https://www.blockchaincenter.net/bitcoin-rainbow-chart/" }, 39 { name: "BorgBase", url: "https://www.borgbase.com/repositories" }, 40 { name: "ChatGPT", url: "https://chatgpt.com/" }, 41 { name: "Cloudflare", url: "https://dash.cloudflare.com/" }, 42 { name: "Codecademy", url: "https://www.codecademy.com/learn" }, 43 { name: "CoinMarketCap Portfolio", url: "https://coinmarketcap.com/portfolio-tracker/" }, 44 { name: "CryptoVision", url: "https://cryptovision.live/" }, 45 { name: "CSS Minifier", url: "https://www.toptal.com/developers/cssminifier/" }, 46 { name: "DrayTek Firmware", url: "https://fw.draytek.com.tw/" }, 47 { name: "Drive Prices", url: "https://diskprices.com/?locale=uk" }, 48 { name: "Duolingo", url: "https://www.duolingo.com/" }, 49 { name: "Duolinguists", url: "https://duolinguists.wordpress.com/i-speak-english/" }, 50 { name: "eBay Balance", url: "https://www.ebay.co.uk/mes/summary" }, 51 { name: "eBay Dispatch", url: "https://www.ebay.co.uk/sh/ord/?filter=status%3AAWAITING_SHIPMENT" }, 52 { name: "Emulation General Wiki", url: "https://emulation.gametechwiki.com/index.php/Main_Page" }, 53 { name: "Epic Games", url: "https://store.epicgames.com/en-US/free-games" }, 54 { name: "Fanatical", url: "https://www.fanatical.com/en/" }, 55 { name: "Filter Lists", url: "https://filterlists.com/" }, 56 { name: "FitGirl", url: "https://fitgirl-repacks.site/" }, 57 { name: "Flagle", url: "https://www.flagle.io/" }, 58 { name: "Flight Radar 24", url: "https://www.flightradar24.com/" }, 59 { name: "FreshRSS", url: "https://rss.minskio.co.uk/" }, 60 { name: "GitHub", url: "https://github.com/breadcat/" }, 61 { name: "HackerNews", url: "https://news.ycombinator.com/news" }, 62 { name: "Hemnet", url: "https://www.hemnet.se/" }, 63 { name: "Home AP", url: "https://192.168.1.2/" }, 64 { name: "Home Router", url: "https://192.168.1.1/" }, 65 { name: "Hugo Local", url: "http://127.0.0.1:1313/" }, 66 { name: "IMDb Top 250", url: "https://www.imdb.com/chart/top" }, 67 { name: "Japanese Class", url: "https://japaneseclass.jp/" }, 68 { name: "JavaScript Minifier", url: "https://www.toptal.com/developers/javascript-minifier/" }, 69 { name: "Klar Tale", url: "https://www.klartale.no/" }, 70 { name: "Kodi", url: "http://192.168.1.6:8080/" }, 71 { name: "Ladbrokes Promo", url: "https://promo.ladbrokes.com/en/promo/stw" }, 72 { name: "Linode", url: "https://cloud.linode.com/linodes" }, 73 { name: "Logical Increments", url: "https://www.logicalincrements.com/" }, 74 { name: "Marine Traffic", url: "https://www.marinetraffic.com/" }, 75 { name: "Meetup", url: "https://www.meetup.com/your-events/" }, 76 { name: "Met Office Weather", url: "https://www.metoffice.gov.uk/public/weather/forecast/gcw9rrxn7" }, 77 { name: "Minskio", url: "https://minskio.co.uk/" }, 78 { name: "Myrient", url: "https://myrient.erista.me/files/" }, 79 { name: "Nault NANO Wallet", url: "https://nault.cc/" }, 80 { name: "Nexo", url: "https://platform.nexo.io/" }, 81 { name: "Noisli", url: "https://www.noisli.com/" }, 82 { name: "Oracle", url: "https://cloud.oracle.com/compute/instances" }, 83 { name: "Paperspace", url: "https://console.paperspace.com/" }, 84 { name: "PC Part Picker", url: "https://uk.pcpartpicker.com/list/" }, 85 { name: "Postcode Finder", url: "https://www.royalmail.com/find-a-postcode" }, 86 { name: "Power Cut Map", url: "https://www.northernpowergrid.com/power-cuts-map" }, 87 { name: "Prolific", url: "https://app.prolific.co/studies" }, 88 { name: "Qutebrowser Cheat Sheet", url: "https://raw.githubusercontent.com/qutebrowser/qutebrowser/master/doc/img/cheatsheet-big.png" }, 89 { name: "Radiooooo", url: "https://radiooooo.com/" }, 90 { name: "Real Time Lightning Map", url: "https://www.lightningmaps.org/" }, 91 { name: "Redactle", url: "https://redactle.net/" }, 92 { name: "Reddit", url: "https://old.reddit.com/" }, 93 { name: "Rightmove", url: "https://www.rightmove.co.uk/" }, 94 { name: "Showcase", url: "https://www.showcasecinemas.co.uk/showtimes/showcase-cinema-de-lux-leeds" }, 95 { name: "Sliding Puzzle Solver", url: "https://jweilhammer.github.io/sliding-puzzle-solver/" }, 96 { name: "Spotify", url: "https://open.spotify.com/" }, 97 { name: "SQLite Viewer", url: "https://sqliteviewer.app/" }, 98 { name: "Stable Tracker", url: "https://newtrackon.com/list" }, 99 { name: "Stagit", url: "https://git.minskio.co.uk/" }, 100 { name: "Suckless", url: "https://suckless.org/" }, 101 { name: "Syncthing", url: "http://127.0.0.1:8384/" }, 102 { name: "Teleport Map", url: "https://oldschool.runescape.wiki/images/Teleport_map.jpg" }, 103 { name: "Time Zone Map", url: "https://upload.wikimedia.org/wikipedia/commons/e/ec/World_Time_Zones_Map.svg" }, 104 { name: "Tradle", url: "https://tradle.net/" }, 105 { name: "Transmission", url: "https://tor.minskio.co.uk" }, 106 { name: "Traveline Route Planner", url: "https://www.traveline.info/" }, 107 { name: "TTS NaturalReader", url: "https://www.naturalreaders.com/online/" }, 108 { name: "TV ShowRSS", url: "https://showrss.info/timeline" }, 109 { name: "Tynan Portfolio", url: "https://dashboard.m1finance.com/share/H4sIAAAAAAACA53PzwuCMBQH8H9F3jUP05JK6BDYUSXQIiJirMea2RJdiMn-99ah0y6r43t8P-_HCGpoEGKQ2J8bgeCDpPdPoxgkld66rr09UnXF1gtJSCYm0NWCYQfxcQT1gHj8juiQPVuhBhMRF1OXZJfkFY-yqlyB9qHBlqFUlJtwMNO-K39tLb501Lc-LZilp-SH5anFF466DLNkY38euN9eHWxOfuD8_-08ygubz_VJvwFVDPxOMwIAAA?referrerCode=5QM0YPa-0rCz" }, 110 { name: "Unsplash", url: "https://unsplash.com/" }, 111 { name: "VaultWarden", url: "https://pass.minskio.co.uk/" }, 112 { name: "Ventu Sky", url: "https://www.ventusky.com/" }, 113 { name: "Vidyascape Wiki", url: "http://vscape.wikidot.com/" }, 114 { name: "Vidyascape", url: "https://vidyascape.org/" }, 115 { name: "Vikunja", url: "https://todo.minskio.co.uk/" }, 116 { name: "Vuniper", url: "https://vuniper.com/movies" }, 117 { name: "W3C validator", url: "https://validator.w3.org/" }, 118 { name: "Walk Mapper", url: "https://onthegomap.com/" }, 119 { name: "WikiQuote Random", url: "https://en.wikiquote.org/wiki/Special:Random" }, 120 { name: "Wordle", url: "https://www.nytimes.com/games/wordle/index.html" }, 121 { name: "Worldle", url: "https://worldle.teuteuf.fr/" }, 122 { name: "Zoho Mail", url: "https://mail.zoho.eu/zm/#mail" }, 123 { name: "Zoho Sheets", url: "https://sheet.zoho.eu/spreadsheets" }, 124 { name: "Zoopla", url: "https://www.zoopla.co.uk/" } 125 ]; 126 127 const commandMap = { 128 a: {base: "https://www.amazon.co.uk/",query: "https://www.amazon.co.uk/s?k={q}"}, 129 abb: {base: "http://audiobookbay.fi/",query: "http://audiobookbay.fi/?s={q}"}, 130 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}"}, 131 anna: {base: "https://annas-archive.org/",query: "https://annas-archive.org/search?q={q}"}, 132 ans: {base: "https://galaxy.ansible.com/", query: "https://galaxy.ansible.com/search?deprecated=false&keywords={q}"}, 133 ap: {base: "https://www.archlinux.org/packages/", query: "https://www.archlinux.org/packages/?sort=&q={q}"}, 134 archive: {base: "https://web.archive.org/", query: "https://web.archive.org/web/*/{q}"}, 135 aur: {base: "https://aur.archlinux.org/packages/", query: "https://aur.archlinux.org/packages/?O=0&K={q}"}, 136 aw: {base: "https://wiki.archlinux.org/", query: "https://wiki.archlinux.org/index.php?title=Special:Search&search={q}"}, 137 cb: {base: "https://comicvine.gamespot.com/", query: "https://comicvine.gamespot.com/search/?q={q}"}, 138 cg: {base: "https://www.coingecko.com/", query: "https://www.coingecko.com/en/coins/{q}"}, 139 choco: {base: "https://chocolatey.org/packages", query: "https://chocolatey.org/packages?q={q}"}, 140 cron: {base: "https://crontab.guru/", query: "https://crontab.guru/#{q}"}, 141 d: {base: "https://start.duckduckgo.com/", query: "https://start.duckduckgo.com/?q={q}"}, 142 deb: {base: "https://packages.debian.org/", query: "https://packages.debian.org/{q}"}, 143 dock: {base: "https://hub.docker.com/", query: "https://hub.docker.com/search/?pullCount=1&q={q}"}, 144 down: {base: "https://downforeveryoneorjustme.com/", query: "https://downforeveryoneorjustme.com/{q}"}, 145 e: {base: "https://www.ebay.co.uk/", query: "https://www.ebay.co.uk/sch/i.html?_nkw={q}"}, 146 emu: {base: "https://emulation.gametechwiki.com/index.php", query: "https://emulation.gametechwiki.com/index.php?title=Special:Search&search={q}"}, 147 f: {base: "https://f-droid.org/", query: "https://search.f-droid.org/?lang=en&q={q}"}, 148 fast: {base: "https://fast.com/"}, 149 g: {base: "https://www.google.co.uk", query: "https://www.google.co.uk/search?udm=14&q={q}"}, 150 gamma: {base: "https://www.gamma-portal.com/framework/home.jspa", query: "https://www.gamma-portal.com/voip/ipdc/searchInput.jspa#{q}"}, 151 ge: {base: "https://www.ge-tracker.com/",query: "https://www.ge-tracker.com/names/{q}"}, 152 gf: {base: "https://gamefaqs.gamespot.com/", query: "https://gamefaqs.gamespot.com/search?game={q}"}, 153 gist: {base: "https://gist.github.com/", query: "https://gist.github.com/search?utf8=%E2%9C%93&q={q}"}, 154 git: {base: "https://github.com/", query: "https://github.com/search?q={q}"}, 155 gl: {base: "https://www.google.co.uk", query: "https://www.google.co.uk/search?btnI=1&q={q}"}, 156 gm: {base: "https://www.google.co.uk/maps/", query: "https://www.google.co.uk/maps/search/{q}"}, 157 gmt: {base: "https://www.google.co.uk/maps/",query: "https://www.google.co.uk/maps/dir/Brighouse/{q}/Brighouse/"}, 158 gog: {base: "https://www.gog.com/", query: "https://www.gog.com/games?query={q}"}, 159 gogg: {base: "https://gog-games.to/", query: "https://gog-games.to/?search={q}"}, 160 gr: {base: "https://www.goodreads.com/", query: "https://www.goodreads.com/search?utf8=%E2%9C%93&query={q}"}, 161 gum: {base: "https://www.gumtree.com/", query: "https://www.gumtree.com/search?q={q}&search_location=Brighouse&distance=30"}, 162 hm: {base: "https://home-manager-options.extranix.com", query: "https://home-manager-options.extranix.com/?release=release-25.05&query={q}"}, 163 i: {base: "https://images.google.co.uk/", query: "https://www.google.co.uk/search?tbm=isch&q={q}"}, 164 im: {base: "https://imdb.com/", query: "https://www.imdb.com/find?ref_=nv_sr_fn&s=all&q={q}"}, 165 ip: {base: "https://ip.minskio.co.uk/", query: "https://www.ip2location.com/demo/{q}"}, 166 ipl: {base: "https://www.bbc.co.uk/iplayer/", query: "https://www.bbc.co.uk/iplayer/search?q={q}"}, 167 jack: {base: "https://jack.minskio.co.uk", query: "https://jack.minskio.co.uk/UI/Dashboard#search={q}"}, 168 last: {base: "https://www.last.fm/", query: "https://www.last.fm/search?q={q}"}, 169 lut: {base: "https://lutris.net/", query: "https://lutris.net/games?q={q}"}, 170 m: {base: "https://wego.here.com/", query: "https://wego.here.com/search/{q}"}, 171 mac: {base: "https://macvendors.com/", query: "https://api.macvendors.com/{q}"}, 172 man: {base: "https://man.archlinux.org/", query: "https://man.archlinux.org/search?go=Go&q={q}"}, 173 mb: {base: "https://musicbrainz.org/", query: "https://musicbrainz.org/search?type=artist&limit=100&method=indexed&query={q}"}, 174 mx: {base: "https://mxtoolbox.com/SuperTool.aspx", query: "https://mxtoolbox.com/SuperTool.aspx?action={q}"}, 175 nitter: {base: "https://nitter.net/", query: "https://nitter.net/search?f=users&q={q}"}, 176 nix: {base: "https://nixos.org/", query: "https://search.nixos.org/packages?query={q}"}, 177 no: {base: "https://enno.dict.cc/", query: "https://enno.dict.cc/?s={q}"}, 178 nyaa: {base: "https://nyaa.si/", query: "https://nyaa.si/?s=seeders&o=desc&q={q}"}, 179 osm: {base: "https://www.openstreetmap.org/", query: "https://www.openstreetmap.org/search?query={q}"}, 180 osrs: {base: "https://oldschool.runescape.wiki/", query: "https://oldschool.runescape.wiki/?title=Special%3ASearch&search={q}"}, 181 pass: {base: "https://pass.minskio.co.uk/"}, 182 pay: {base: "https://12ft.io/", query: "https://12ft.io/{q}"}, 183 pc: {base: "https://pcgamingwiki.com/w/index.php", query: "https://pcgamingwiki.com/w/index.php?title=Special:Search&search={q}"}, 184 play: {base: "https://play.google.com/store/", query: "https://play.google.com/store/search?c=apps&q={q}"}, 185 proton: {base: "https://protondb.com/explore", query: "https://protondb.com/search?q={q}"}, 186 rfc: {base: "https://datatracker.ietf.org/", query: "https://datatracker.ietf.org/doc/search?rfcs=on&name={q}"}, 187 rs3: {base: "https://runescape.wiki/", query: "https://runescape.wiki/?title=Special%3ASearch&go=Go&search={q}"}, 188 rshs: {base: "https://secure.runescape.com/m=hiscore_oldschool/", query: "https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1={q}"}, 189 rss: {base: "https://rss.minskio.co.uk/"}, 190 rt: {base: "https://www.rottentomatoes.com/", query: "https://www.rottentomatoes.com/search/?search={q}"}, 191 s: {base: "https://store.steampowered.com/", query: "https://store.steampowered.com/search/?term={q}"}, 192 sc: {base: "https://github.com/koalaman/shellcheck/", query: "https://github.com/koalaman/shellcheck/wiki/{q}"}, 193 skey: {base: "https://store.steampowered.com/", query: "https://store.steampowered.com/account/registerkey?key={q}"}, 194 spot: {base: "https://open.spotify.com/", query: "https://open.spotify.com/search/{q}"}, 195 srx: {base: "https://searx.be/", query: "https://searx.be/?q={q}"}, 196 ss: {base: "https://steamspy.com/", query: "https://steamspy.com/search.php?s={q}"}, 197 st: {base: "https://www.startpage.com/", query: "https://www.startpage.com/do/metasearch.pl?query={q}"}, 198 t: {base: "https://tineye.com/", query: "https://tineye.com/parse?url={q}"}, 199 timer: {base: "https://www.google.co.uk/search?q=12.5%20minute%20timer", query: "https://www.google.co.uk/search?q={q}%20timer"}, 200 tm: {base: "https://www.themoviedb.org/", query: "https://www.themoviedb.org/search?query={q}"}, 201 tmc: {base: "https://login.themilesconsultancy.com/Driver/TripSummary.aspx"}, 202 tmt: {base: "https://www.themoviedb.org/", query: "https://www.themoviedb.org/search/tv?query={q}"}, 203 todo: {base: "https://todo.minskio.co.uk/"}, 204 tr: {base: "https://translate.google.com/", query: "https://translate.google.com/?sl=auto&tl=en&text={q}"}, 205 track: {base: "https://www.royalmail.com/track-your-item", query: "https://www.royalmail.com/track-your-item#/tracking-results/{q}"}, 206 tv: {base: "https://www.thetvdb.com/", query: "https://www.thetvdb.com/search?query={q}"}, 207 tvt: {base: "https://tvtropes.org/", query: "https://tvtropes.org/pmwiki/search_result.php?q={q}"}, 208 ud: {base: "https://www.urbandictionary.com/", query: "https://www.urbandictionary.com/define.php?term={q}"}, 209 ujs: {base: "https://greasyfork.org/en/scripts", query: "https://greasyfork.org/en/scripts?q={q}"}, 210 valid: {base: "https://validator.w3.org/nu/", query: "https://validator.w3.org/nu/?doc={q}"}, 211 w: {base: "https://en.wikipedia.org/w/index.php", query: "https://en.wikipedia.org/w/index.php?title=Special:Search&search={q}"}, 212 w3c: {base: "https://validator.w3.org/", query: "https://validator.w3.org/nu/?doc={q}"}, 213 w3w: {base: "https://what3words.com/",query: "https://what3words.com/{q}"}, 214 wa: {base: "https://www.wolframalpha.com/", query: "https://www.wolframalpha.com/input/?i={q}"}, 215 whois: {base: "https://whois.gandi.net/", query: "https://whois.gandi.net/en/results?search={q}"}, 216 wikt: {base: "https://en.wiktionary.org/w/index.php", query: "https://en.wiktionary.org/w/index.php?title=Special:Search&search={q}"}, 217 wiktno: {base: "https://no.wiktionary.org/w/index.php", query: "https://no.wiktionary.org/w/index.php?title=Special:Search&search={q}"}, 218 wine: {base: "https://www.winehq.org/",query: "https://www.winehq.org/search?q={q}"}, 219 wno: {base: "https://no.wikipedia.org/w/index.php",query: "https://no.wikipedia.org/w/index.php?title=Special:Search&search={q}"}, 220 y: {base: "https://www.youtube.com/",query: "https://www.youtube.com/results?search_query={q}"} 221 }; 222 223 const input = document.getElementById("queryInput"); 224 const bookmarkList = document.getElementById("bookmarkList"); 225 const predictionDisplay = document.getElementById("prediction"); 226 227 let filteredBookmarks = [...bookmarks]; 228 let selectedBookmarkIndex = -1; 229 230 function renderBookmarks() { 231 bookmarkList.innerHTML = ""; 232 filteredBookmarks.forEach((bm, index) => { 233 const li = document.createElement("li"); 234 li.textContent = bm.name; 235 if (index === selectedBookmarkIndex) { 236 li.classList.add("highlight"); 237 // Scroll the selected item into view 238 setTimeout(() => li.scrollIntoView({ block: "nearest", behavior: "smooth" }), 0); 239 } 240 li.addEventListener("click", () => { 241 window.open(bm.url, "_self"); 242 }); 243 bookmarkList.appendChild(li); 244 }); 245 246 bookmarkList.style.display = filteredBookmarks.length === 0 ? "none" : "block"; 247 } 248 249 function filterBookmarks(query) { 250 selectedBookmarkIndex = -1; 251 const lower = query.toLowerCase(); 252 filteredBookmarks = lower === "" 253 ? [...bookmarks] 254 : bookmarks.filter(b => b.name.toLowerCase().includes(lower)); 255 renderBookmarks(); 256 } 257 258 function runCommand(prefix, args) { 259 const cmd = commandMap[prefix]; 260 if (!cmd) return; 261 const url = args.length === 0 262 ? cmd.base 263 : cmd.query.replace("{q}", encodeURIComponent(args.join(" "))); 264 window.open(url, "_self"); 265 } 266 267 function hintCommand(prefix, args) { 268 const cmd = commandMap[prefix]; 269 if (!cmd) return ""; 270 return args.length === 0 271 ? cmd.base 272 : cmd.query.replace("{q}", encodeURIComponent(args.join(" "))); 273 } 274 275 function handleCommand(inputValue) { 276 const parts = inputValue.trim().split(" "); 277 const prefix = parts[0].toLowerCase(); 278 const args = parts.slice(1); 279 280 if (commandMap[prefix]) { 281 runCommand(prefix, args); 282 } else { 283 const query = encodeURIComponent(inputValue); 284 window.open(`https://www.google.com/search?q=${query}`, "_self"); 285 } 286 } 287 288 function updatePrediction(inputValue) { 289 const parts = inputValue.trim().split(" "); 290 const prefix = parts[0].toLowerCase(); 291 const args = parts.slice(1); 292 293 if (commandMap[prefix]) { 294 const predicted = hintCommand(prefix, args); 295 predictionDisplay.textContent = `${prefix} ยป ${predicted}`; 296 } else { 297 predictionDisplay.textContent = ""; 298 } 299 } 300 301 input.addEventListener("input", (e) => { 302 filterBookmarks(e.target.value); 303 updatePrediction(e.target.value); 304 }); 305 306 input.addEventListener("keydown", (e) => { 307 if (e.key === "Tab") { 308 e.preventDefault(); 309 if (filteredBookmarks.length > 0) { 310 if (e.shiftKey) { 311 selectedBookmarkIndex = (selectedBookmarkIndex - 1 + filteredBookmarks.length) % filteredBookmarks.length; 312 } else { 313 selectedBookmarkIndex = (selectedBookmarkIndex + 1) % filteredBookmarks.length; 314 } 315 renderBookmarks(); 316 } 317 } 318 else if (e.key === "ArrowDown") { 319 e.preventDefault(); 320 if (filteredBookmarks.length > 0) { 321 selectedBookmarkIndex = (selectedBookmarkIndex + 1) % filteredBookmarks.length; 322 renderBookmarks(); 323 } 324 } else if (e.key === "ArrowUp") { 325 e.preventDefault(); 326 if (filteredBookmarks.length > 0) { 327 selectedBookmarkIndex = (selectedBookmarkIndex - 1 + filteredBookmarks.length) % filteredBookmarks.length; 328 renderBookmarks(); 329 } 330 } else if (e.key === "Enter") { 331 if (selectedBookmarkIndex >= 0) { 332 window.open(filteredBookmarks[selectedBookmarkIndex].url, "_self"); 333 } else { 334 handleCommand(input.value); 335 } 336 } 337 }); 338 339 // Initial load 340 filterBookmarks(""); 341 function formatDateTime(date) { 342 const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; 343 const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; 344 345 const dayName = days[date.getDay()]; 346 const day = date.getDate(); 347 const month = months[date.getMonth()]; 348 const hours = String(date.getHours()).padStart(2, '0'); 349 const minutes = String(date.getMinutes()).padStart(2, '0'); 350 351 const getOrdinal = (n) => { 352 if (n > 3 && n < 21) return "th"; 353 switch (n % 10) { 354 case 1: return "st"; 355 case 2: return "nd"; 356 case 3: return "rd"; 357 default: return "th"; 358 } 359 }; 360 361 return `${dayName} ${day}${getOrdinal(day)} ${month}, ${hours}:${minutes}`; 362 } 363 364 function updateDateTime() { 365 const now = new Date(); 366 document.getElementById("datetime-text").textContent = formatDateTime(now); 367 } 368 369 setInterval(updateDateTime, 1000); 370 updateDateTime(); 371 372 </script> 373 </body> 374 </html>