chiark / gitweb /
static/tgal.js (keyevent): Discard key events with spurious modifiers.
[tgal] / static / tgal.js
CommitLineData
6ac5dde2
MW
1/* -*-javascript-*-
2 *
3 * Interactive features for Trivial Gallery.
4 *
5 * (c) 2021 Mark Wooding
6 */
7
8/*----- Licensing notice --------------------------------------------------*
9 *
10 * This file is part of Trivial Gallery.
11 *
12 * Trivial Gallery is free software: you can redistribute it and/or modify
13 * it under the terms of the GNU Affero General Public License as
14 * published by the Free Software Foundation; either version 3 of the
15 * License, or (at your option) any later version.
16 *
17 * Trivial Gallery is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Affero General Public License for more details.
21 *
22 * You should have received a copy of the GNU Affero General Public
23 * License along with Trivial Gallery. If not, see
24 * <https://www.gnu.org/licenses/>.
25 */
26
27/* Handle keyboard interaction. */
28addEventListener("keydown", function (ev) {
29 var dir;
8b422909 30 if (ev.altKey || ev.ctrlKey || ev.metaKey) return;
6ac5dde2
MW
31 else if (ev.key === "<") dir = "first";
32 else if (ev.key === ">") dir = "last";
8b422909
MW
33 else if (ev.key === "^") dir = "up";
34 else if (ev.shiftKey) return;
35 else if (ev.key === " " || ev.key === "ArrowRight") dir = "next";
36 else if (ev.key === "Backspace" || ev.key === "ArrowLeft") dir = "prev";
6ac5dde2
MW
37 else return;
38 var elt = document.querySelector("link[rel=" + dir + "]");
39 if (!elt) return;
40 location = elt.getAttribute("href");
41 ev.stopPropagation();
42}, true);
43
44/* Scroll the thumbnail strip so that the current image is in the middle. */
45(function () {
1408b7a2
MW
46 var obs = null;
47
48 var scroll = function(strip) {
49 var focus = strip.querySelector("figure.focusthumb");
50 if (focus) {
51 var stripbox = strip.getBoundingClientRect();
52 var focusbox = focus.getBoundingClientRect();
53 strip.scrollLeft +=
54 (focusbox.x - stripbox.x) -
55 (stripbox.width - focusbox.width)/2;
56 }
57 };
58
59 var strips = document.querySelectorAll("div.thumbstrip");
60 if (window.IntersectionObserver) {
61 obs = new IntersectionObserver(function (ee) {
62 ee.forEach(function (e) {
63 if (e.isIntersecting) {
64 obs.unobserve(e.target);
65 scroll(e.target);
66 }
67 });
68 }, {
69 root: document.querySelector("html")
70 });
71 strips.forEach(function (strip) { obs.observe(strip); });
72 } else {
73 strips.forEach(scroll);
6ac5dde2
MW
74 }
75})();
76
77/*----- That's all, folks -------------------------------------------------*/