Commit | Line | Data |
---|---|---|
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. */ | |
28 | addEventListener("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 -------------------------------------------------*/ |