startpage

Simple text centric startpage
Log | Files | Refs | README

index.html (27262B)


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