-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathdialog-reader.js
More file actions
121 lines (109 loc) · 3.27 KB
/
Copy pathdialog-reader.js
File metadata and controls
121 lines (109 loc) · 3.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
(function() {
// detect <dialog> feature
if (typeof HTMLDialogElement === 'function') {
// TODO: handle existing <base> tags or add target="" to ToC links
let head = `
<base target="content-frame" />
<style>
dialog {
width: 90vw;
height: 90vh;
padding: 0;
}
dialog iframe {
width: 100%;
height: 100%;
border: none;
}
dialog::backdrop {
background: rgba(185,207,255,0.5);
}
#reader {
text-align: center;
}
#reader .nav {
position: absolute;
left: 25%;
width: 50%;
height: 1.5em;
text-align: center;
background: white;
border: 1px solid black;
border-radius: 0 0 25px 25px;
border-top: none;
}
#reader .nav a {
cursor: pointer;
text-decoration: underline;
}
#reader .nav a:first-child {
float: left;
margin-left: 1em;
}
#reader .nav a:last-child {
float: right;
margin-right: 1em;
}
</style>
`;
let dialog = `
<dialog id="reader">
<div class="nav">
<a accesskey="p">previous</a>
<a accesskey="t" class="toc" title="Table of Contents">close</a>
<a accesskey="n">next</a>
</div>
<iframe name="content-frame"></iframe>
</dialog>
`;
// add HTML
document.head.insertAdjacentHTML('beforeend', head);
document.body.insertAdjacentHTML('afterbegin', dialog);
// TODO: web components...maybe?
let reader = document.getElementById('reader');
// reader nav
let toc = reader.querySelector('a.toc');
toc.addEventListener('click', (ev) => {
ev.stopPropagation();
reader.close();
});
let prev = reader.querySelector('a:first-child');
let next = reader.querySelector('a:last-child');
function setPrevNext(target) {
prev.href = target.parentElement.previousElementSibling.querySelector('a').href;
next.href = target.parentElement.nextElementSibling.querySelector('a').href;
}
let readingOrder = document.querySelectorAll('nav[role=doc-toc] a');
let current = 0; // index in readingOrder
// TODO: NodeList.forEach isn't yet supported in Edge; polyfill?
readingOrder.forEach((a, i) => {
a.addEventListener('click', (ev) => {
current = i;
setPrevNext(ev.target);
reader.showModal();
document.body.style.overflow = 'hidden';
})
});
prev.addEventListener('click', (ev) => {
setPrevNext(readingOrder.item(current));
current--;
});
next.addEventListener('click', (ev) => {
setPrevNext(readingOrder.item(current));
current++;
});
// click outside handler; from https://stackoverflow.com/a/40028441
reader.addEventListener('click', (e) => {
var rect = e.target.getBoundingClientRect();
var minX = rect.left + e.target.clientLeft;
var minY = rect.top + e.target.clientTop;
if ((e.clientX < minX || e.clientX >= minX + e.target.clientWidth) ||
(e.clientY < minY || e.clientY >= minY + e.target.clientHeight)) {
e.target.close();
}
});
reader.addEventListener('close', () => {
document.body.style.overflow = 'auto';
});
}
})();