Summary Files Commits Branches @commit @diff @stats
path: root / src / scripts
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
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
3 files changed, 65 insertions, 49 deletions
-rw-r--r--src/scripts/keyboard.js65
-rw-r--r--src/scripts/presentation.js37
-rw-r--r--src/scripts/theme-changer.js12
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;
+ }
+});
diff --git a/src/scripts/presentation.js b/src/scripts/presentation.js
index 70339e6..425815c 100644
--- a/src/scripts/presentation.js
+++ b/src/scripts/presentation.js
@@ -102,40 +102,3 @@ articleBtn.addEventListener('click', function() {
// Toggle presentation.css
document.styleSheets.item(3).disabled = !document.styleSheets.item(3).disabled;
});
-
-/* Keyboard controls */
-
-document.addEventListener('keydown', function (e) {
- if (e.ctrlKey) return;
-
- switch (e.code) {
- // Previous slide
- case 'Backspace': case 'PageUp':
- case 'KeyK': case 'KeyH':
- case 'ArrowLeft': case 'ArrowUp':
- showSlide(-1);
- break;
- // Next slide
- case 'Space': case 'Enter': case 'PageDown':
- case 'KeyJ': case 'KeyL':
- 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;
- }
-});
diff --git a/src/scripts/theme-changer.js b/src/scripts/theme-changer.js
index 47c5dfe..39eedc9 100644
--- a/src/scripts/theme-changer.js
+++ b/src/scripts/theme-changer.js
@@ -17,15 +17,3 @@ themeBtn.onclick = function() {
localStorage.setItem('theme', 'dark');
}
}
-
-/* Keyboard controls */
-
-document.addEventListener('keydown', function (e) {
- if (e.ctrlKey) return;
-
- switch (e.code) {
- case 'KeyC':
- themeBtn.click();
- break;
- }
-});