|
|
| Line 1: |
Line 1: |
| /* SK navigation – keyboard controls (WASD + arrows + Q/E for Up/Down) */
| |
|
| |
|
| (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) {
| |
| if (isTypingTarget(e.target)) return;
| |
|
| |
| var key = e.key.toLowerCase();
| |
|
| |
| var handled = false;
| |
|
| |
| switch (key) {
| |
| case 'w':
| |
| case 'arrowup':
| |
| handled = navigate('.nav-link-north');
| |
| break;
| |
|
| |
| case 's':
| |
| case 'arrowdown':
| |
| handled = navigate('.nav-link-south');
| |
| break;
| |
|
| |
| case 'a':
| |
| case 'arrowleft':
| |
| handled = navigate('.nav-link-west');
| |
| break;
| |
|
| |
| case 'd':
| |
| case 'arrowright':
| |
| handled = navigate('.nav-link-east');
| |
| break;
| |
|
| |
| case 'q':
| |
| case 'pageup':
| |
| handled = navigate('.nav-link-up');
| |
| break;
| |
|
| |
| case 'e':
| |
| case 'pagedown':
| |
| handled = navigate('.nav-link-down');
| |
| break;
| |
| }
| |
|
| |
| if (handled) {
| |
| e.preventDefault();
| |
| }
| |
| });
| |
| })();
| |