Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.
Revision as of 21:41, 3 December 2025 by SunKeeper (talk | contribs) (Testing single-user-only WASD QE Nav input system)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

/* SK navigation – keyboard controls (WASD + arrows + Q/E for Up/Down) */

mw.loader.using('mediawiki.util', function () {

 'use strict';
 function isTypingTarget(el) {
   if (!el) return false;
   var tag = (el.tagName || ).toLowerCase();
   if (tag === 'input' || tag === 'textarea' || tag === 'select') return true;
   if (el.isContentEditable) return true;
   return false;
 }
 function getNavLink(selector) {
   var btn = document.querySelector(selector);
   if (!btn) return null;
   var a = btn.querySelector('a');
   return a || null;
 }
 function navigate(selector) {
   var link = getNavLink(selector);
   if (link && link.href) {
     window.location.href = link.href;
     return true;
   }
   return false;
 }
 document.addEventListener('keydown', function (e) {
   // don't hijack keys while typing in forms, search, editor, etc.
   if (isTypingTarget(e.target)) return;
   var key = e.key;
   if (!key) return;
   // normalize letters to lowercase
   if (key.length === 1) {
     key = key.toLowerCase();
   }
   var handled = false;
   switch (key) {
     // MOVE NORTH
     case 'w':
     case 'ArrowUp':
       handled = navigate('.nav-link-north');
       break;
     // MOVE SOUTH
     case 's':
     case 'ArrowDown':
       handled = navigate('.nav-link-south');
       break;
     // MOVE WEST
     case 'a':
     case 'ArrowLeft':
       handled = navigate('.nav-link-west');
       break;
     // MOVE EAST
     case 'd':
     case 'ArrowRight':
       handled = navigate('.nav-link-east');
       break;
     // MOVE UP
     case 'q':
     case 'PageUp':
       handled = navigate('.nav-link-up');
       break;
     // MOVE DOWN
     case 'e':
     case 'PageDown':
       handled = navigate('.nav-link-down');
       break;
   }
   if (handled) {
     e.preventDefault();
   }
 });

});