Summary Files Commits Branches @commit @diff @stats
path: root / src / scripts / keyboard.js
diff options
context:
space:
mode:
Commit25a63dd10cc09f18a8aa07cee74e6591a0c0381f (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-04-28 17:32:45 +0300
Committer
 Syndamia <kamen@syndamia.com>
2023-04-28 17:32:45 +0300
Files67291ec4ec706a0230762b78bd5d5561d9adf7e9 /src/scripts/keyboard.js
syndamia.com-25a63dd10cc09f18a8aa07cee74e6591a0c0381f.tar
syndamia.com-25a63dd10cc09f18a8aa07cee74e6591a0c0381f.tar.gz
syndamia.com-25a63dd10cc09f18a8aa07cee74e6591a0c0381f.zip
Parentc6569f29f38627d553531f85cf5ea71cae23f897 (diff)
[keyboard.js] Moved all keybindings to a separate javascript file and implemented vim-like navigation for headings
1 files changed, 65 insertions, 0 deletions
-rw-r--r--src/scripts/keyboard.js65
diff --git a/src/scripts/keyboard.js b/src/scripts/keyboard.js
new file mode 100644
index 0000000..f618e45
--- /dev/null
+++ b/src/scripts/keyboard.js
@@ -0,0 +1,65 @@
+const headings = document.querySelectorAll('h1, h2, h3, h4, h5, h6');
+var currentHeading = 0;
+
+document.addEventListener('keydown', function (e) {
+ if (e.ctrlKey) return;
+
+ switch (e.code) {
+ case 'KeyG':
+ currentHeading = (e.shiftKey) ? headings.length - 1 : 0;
+ headings[currentHeading].scrollIntoView();
+ break;
+
+ case 'KeyJ': case 'KeyL':
+ if (typeof presenting != 'undefined' && presenting) showSlide(+1);
+ else {
+ currentHeading = (headings.length + currentHeading + 1) % headings.length;
+ headings[currentHeading].scrollIntoView();
+ }
+ break;
+
+ case 'KeyK': case 'KeyH':
+ if (typeof presenting != 'undefined' && presenting) showSlide(-1);
+ else {
+ currentHeading = (headings.length + currentHeading - 1) % headings.length;
+ headings[currentHeading].scrollIntoView();
+ }
+ break;
+
+ /* theme-changer.js */
+
+ case 'KeyC':
+ themeBtn.click();
+ break;
+
+ /* presentation.js */
+
+ // Previous slide
+ case 'Backspace': case 'PageUp':
+ case 'ArrowLeft': case 'ArrowUp':
+ showSlide(-1);
+ break;
+ // Next slide
+ case 'Space': case 'Enter': case 'PageDown':
+
+ case 'ArrowRight': case 'ArrowDown':
+ showSlide(+1);
+ break;
+ // Start (toggle) presenting
+ case 'KeyP': case 'KeyT':
+ presentBtn.click();
+ break;
+ // Exit presentation
+ case 'Escape':
+ if (presenting) presentBtn.click();
+ break;
+ // Go to first slide
+ case 'Home':
+ showSlide(-slideIndex);
+ break;
+ // Go to last slide
+ case 'End':
+ showSlide(-slideIndex -1);
+ break;
+ }
+});