hematite 0.1.9 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/_config.yml +1 -0
- data/_includes/img/loading_icon.svg +70 -0
- data/_includes/nav/header.html +6 -1
- data/_includes/scss/_fonts.scss +5 -0
- data/_layouts/remark_slideshow.html +20 -6
- data/_sass/_elements.scss +15 -0
- data/_sass/_layout.scss +3 -0
- data/_sass/_nav.scss +28 -0
- data/assets/fonts/FoulisGreek.ttf +0 -0
- data/assets/fonts/README.txt +8 -0
- data/assets/html/remark_presentation_frame.html +15 -3
- data/assets/js/dropdownExpander.mjs +7 -4
- data/assets/js/layout/post.mjs +5 -0
- data/assets/js/layout/remark_slideshow.mjs +102 -17
- data/assets/js/main.mjs +2 -0
- data/assets/js/scrollables.mjs +29 -0
- data/assets/string_data/en.mjs +1 -0
- data/assets/string_data/es.mjs +1 -0
- data/assets/style.scss +2 -0
- data/assets/style_only_syntax.scss +1 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3bf0eaea458e2c4fba03dbcc759aaa04eb811832e1850b210d5e5a378fab2526
|
4
|
+
data.tar.gz: 80dcbb081d5342365d4f119ffcb6f1dfd2be5b6533e23b0c23a18bde93709b54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23b88d8d1249320f6b4712e19d9a00f0a2bc0de0ef1e191aab371e56e019f38da43b8f26726e0e6d22a9a271bd647dc175bae4d58997222a04a4939700642908
|
7
|
+
data.tar.gz: 916e067da5e530e001003b82f83d3a91241ba268823112662ff87102c16e5800c70b2d909d8e150c9a9c08017d9f6f4d7c5c76ac980f2faf4a8e22caa77bb625
|
data/_config.yml
CHANGED
@@ -0,0 +1,70 @@
|
|
1
|
+
<svg
|
2
|
+
viewBox="0 0 64.0 64.0"
|
3
|
+
version="1.1"
|
4
|
+
class="loading-icon-root"
|
5
|
+
xmlns="http://www.w3.org/2000/svg"
|
6
|
+
xmlns:svg="http://www.w3.org/2000/svg">
|
7
|
+
<style>
|
8
|
+
.loading-icon-root {
|
9
|
+
cursor: pointer;
|
10
|
+
width: 64px;
|
11
|
+
height: 64px;
|
12
|
+
}
|
13
|
+
|
14
|
+
.loading-icon-root .rect {
|
15
|
+
fill: var(--primary-text-color);
|
16
|
+
|
17
|
+
transform: translate(0, 0);
|
18
|
+
transform-origin: 32px 32px;
|
19
|
+
animation: loading-icon-anim 1.5s ease infinite;
|
20
|
+
}
|
21
|
+
|
22
|
+
.loading-icon-root .rect2 {
|
23
|
+
animation-delay: 0.25s;
|
24
|
+
}
|
25
|
+
|
26
|
+
.loading-icon-root .rect3 {
|
27
|
+
animation-delay: 0.5s;
|
28
|
+
}
|
29
|
+
|
30
|
+
.loading-icon-root .rect4 {
|
31
|
+
animation-delay: 0.65s;
|
32
|
+
}
|
33
|
+
|
34
|
+
@keyframes loading-icon-anim {
|
35
|
+
0% { transform: rotate(0); }
|
36
|
+
100% { transform: rotate(-360deg) scale(1, 1); }
|
37
|
+
}
|
38
|
+
</style>
|
39
|
+
<g
|
40
|
+
id="layer1">
|
41
|
+
<rect
|
42
|
+
width="9"
|
43
|
+
height="9"
|
44
|
+
x="10"
|
45
|
+
y="10"
|
46
|
+
ry="4.5"
|
47
|
+
class="rect" />
|
48
|
+
<rect
|
49
|
+
width="9"
|
50
|
+
height="9"
|
51
|
+
x="10"
|
52
|
+
y="10"
|
53
|
+
ry="4.5"
|
54
|
+
class="rect rect2" />
|
55
|
+
<rect
|
56
|
+
width="9"
|
57
|
+
height="9"
|
58
|
+
x="10"
|
59
|
+
y="10"
|
60
|
+
ry="4.5"
|
61
|
+
class="rect rect3" />
|
62
|
+
<rect
|
63
|
+
width="9"
|
64
|
+
height="9"
|
65
|
+
x="10"
|
66
|
+
y="10"
|
67
|
+
ry="4.5"
|
68
|
+
class="rect rect4" />
|
69
|
+
</g>
|
70
|
+
</svg>
|
data/_includes/nav/header.html
CHANGED
@@ -2,4 +2,9 @@
|
|
2
2
|
This is the header that appears in the navigation bar (at the top of the page)!
|
3
3
|
Customize it here.
|
4
4
|
{% endcomment %}
|
5
|
-
<a href="{{ "/" | absolute_url }}">
|
5
|
+
<a id="long_title" href="{{ "/" | absolute_url }}">
|
6
|
+
{{ site.title | default: "Untitled Site" }}
|
7
|
+
</a>
|
8
|
+
<a id="short_title" href="{{ "/" | absolute_url }}">
|
9
|
+
{{ site.short_title | default: site.title | default: "Untitiled" }}
|
10
|
+
</a>
|
@@ -14,6 +14,12 @@ layout: default
|
|
14
14
|
|
15
15
|
{% assign frame_resource_url = 'assets/html/remark_presentation_frame.html' | relative_url %}
|
16
16
|
|
17
|
+
<div class='loading-icon-container'>
|
18
|
+
<center>
|
19
|
+
{% include img/loading_icon.svg %}
|
20
|
+
</center>
|
21
|
+
</div>
|
22
|
+
|
17
23
|
<main class="slideshow-mode">
|
18
24
|
<iframe
|
19
25
|
id="presentation_frame"
|
@@ -35,9 +41,11 @@ layout: default
|
|
35
41
|
const WRAPPING_DIV_EXP = /^\s*[<]div.*[>]((?:.|[\n\r])*)[<]\/div[>]\s*$/;
|
36
42
|
|
37
43
|
import slideshow from "{{ 'assets/js/layout/remark_slideshow.mjs' | relative_url }}";
|
44
|
+
import { stringLookup } from "{{ 'assets/js/strings.mjs' | relative_url }}";
|
38
45
|
|
39
46
|
let presentationFrame = document.querySelector("#presentation_frame");
|
40
47
|
presentationFrame.src = {{ frame_resource_url | jsonify }};
|
48
|
+
presentationFrame.title = stringLookup('presentation_frame_title');
|
41
49
|
window.presentationFrameLoaded = false;
|
42
50
|
|
43
51
|
|
@@ -111,12 +119,18 @@ layout: default
|
|
111
119
|
`);
|
112
120
|
|
113
121
|
presentationWin.initPresentation = (async () => {
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
122
|
+
try {
|
123
|
+
presentationDoc.title = presentationFrame.title;
|
124
|
+
await slideshow.start(presentationFrame.contentWindow, config);
|
125
|
+
|
126
|
+
// Ensure that mermaid has already been run!
|
127
|
+
if (presentationWin.mermaid) {
|
128
|
+
presentationWin.mermaid.init();
|
129
|
+
}
|
130
|
+
}
|
131
|
+
finally {
|
132
|
+
// Hide the loading icon
|
133
|
+
document.querySelector(".loading-icon-container")?.remove();
|
120
134
|
}
|
121
135
|
});
|
122
136
|
|
data/_sass/_elements.scss
CHANGED
@@ -64,6 +64,10 @@ input::placeholder {
|
|
64
64
|
padding: 6px;
|
65
65
|
}
|
66
66
|
|
67
|
+
main pre {
|
68
|
+
overflow-x: auto;
|
69
|
+
}
|
70
|
+
|
67
71
|
.main-container details {
|
68
72
|
summary {
|
69
73
|
cursor: pointer;
|
@@ -142,6 +146,17 @@ input::placeholder {
|
|
142
146
|
padding-left: 20px;
|
143
147
|
color: var(--text-color-faint);
|
144
148
|
}
|
149
|
+
|
150
|
+
main {
|
151
|
+
// Some elements can grow larger than the available space.
|
152
|
+
// Allow scrolling.
|
153
|
+
@media screen {
|
154
|
+
.scrollable-container {
|
155
|
+
overflow-x: auto;
|
156
|
+
display: block;
|
157
|
+
}
|
158
|
+
}
|
159
|
+
}
|
145
160
|
}
|
146
161
|
|
147
162
|
// Markdown parsers may put `code` elements inside of `pre`
|
data/_sass/_layout.scss
CHANGED
data/_sass/_nav.scss
CHANGED
@@ -29,6 +29,10 @@ body > header {
|
|
29
29
|
align-items: center;
|
30
30
|
}
|
31
31
|
|
32
|
+
#short_title {
|
33
|
+
display: none;
|
34
|
+
}
|
35
|
+
|
32
36
|
#toggle_sidebar_btn {
|
33
37
|
margin-right: 10px;
|
34
38
|
background-color: var(--primary-background-color);
|
@@ -38,9 +42,33 @@ body > header {
|
|
38
42
|
#toggle_sidebar_btn {
|
39
43
|
display: none;
|
40
44
|
}
|
45
|
+
|
46
|
+
box-shadow: none;
|
47
|
+
border-bottom: 1px solid var(--line-color-light);
|
41
48
|
}
|
42
49
|
}
|
43
50
|
|
51
|
+
@mixin only-short-title {
|
52
|
+
body > header {
|
53
|
+
#long_title {
|
54
|
+
display: none !important;
|
55
|
+
color: red;
|
56
|
+
}
|
57
|
+
|
58
|
+
#short_title {
|
59
|
+
display: block;
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
:root.minimizedNavHeader {
|
65
|
+
@include only-short-title;
|
66
|
+
}
|
67
|
+
|
68
|
+
@media screen and (max-width: $site-content-preferred-width) {
|
69
|
+
@include only-short-title;
|
70
|
+
}
|
71
|
+
|
44
72
|
:root {
|
45
73
|
--header-effective-height: var(--header-height);
|
46
74
|
}
|
Binary file
|
@@ -0,0 +1,8 @@
|
|
1
|
+
This directory includes fonts under OpenSource licenses. As the Hematite theme is distributed under the MIT, all fonts distributed with it must be free for commercial use.
|
2
|
+
|
3
|
+
This directory includes the following fonts:
|
4
|
+
* FoulisGreek
|
5
|
+
* by the JUnicode project
|
6
|
+
* https://www.fontspace.com/foulis-greek-font-f38341
|
7
|
+
* https://junicode.sourceforge.io/greek.html
|
8
|
+
|
@@ -11,16 +11,23 @@ noindex: true
|
|
11
11
|
<style>
|
12
12
|
/* Stylesheet mostly taken from https://github.com/gnab/remark/wiki#getting-started */
|
13
13
|
@import url(https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz);
|
14
|
-
@import url(https://fonts.googleapis.com/css?family=Droid+
|
14
|
+
@import url(https://fonts.googleapis.com/css?family=Droid+Sans:400,700,400italic);
|
15
15
|
@import url(https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic);
|
16
16
|
|
17
|
-
body { font-family: 'Droid
|
17
|
+
body { font-family: 'Droid Sans', sans-serif; }
|
18
18
|
h1, h2, h3 {
|
19
19
|
font-family: 'Yanone Kaffeesatz';
|
20
20
|
font-weight: normal;
|
21
21
|
}
|
22
22
|
|
23
|
-
.remark-code, .remark-inline-code {
|
23
|
+
.remark-code, .remark-inline-code, body.mdSourceView {
|
24
|
+
font-family: 'Ubuntu Mono', monospace;
|
25
|
+
}
|
26
|
+
|
27
|
+
body.mdSourceView {
|
28
|
+
background: white;
|
29
|
+
color: black;
|
30
|
+
}
|
24
31
|
|
25
32
|
/* Show hidden slides to allow preprocessors (e.g. mermaid) to
|
26
33
|
properly account for container size.
|
@@ -49,6 +56,11 @@ nav:hover, nav:focus-within {
|
|
49
56
|
opacity: 1;
|
50
57
|
}
|
51
58
|
|
59
|
+
/* Fix contrast issue */
|
60
|
+
.remark-slide-number {
|
61
|
+
opacity: 0.8;
|
62
|
+
}
|
63
|
+
|
52
64
|
@media print {
|
53
65
|
nav {
|
54
66
|
display: none;
|
@@ -57,11 +57,14 @@ function expandBasedOnURL() {
|
|
57
57
|
}
|
58
58
|
|
59
59
|
let targetElem = document.querySelector(hash);
|
60
|
-
let currentElem = targetElem;
|
61
60
|
|
62
|
-
|
63
|
-
|
64
|
-
|
61
|
+
if (targetElem) {
|
62
|
+
expandContainingDropdowns(targetElem);
|
63
|
+
targetElem.focus();
|
64
|
+
}
|
65
|
+
else {
|
66
|
+
console.warn(`Hash`, hash, `does not correspond to an element.`);
|
67
|
+
}
|
65
68
|
};
|
66
69
|
|
67
70
|
doExpansion(location.href);
|
data/assets/js/layout/post.mjs
CHANGED
@@ -2,6 +2,8 @@ import { getUrlQuery, Searcher } from "../search.mjs";
|
|
2
2
|
import { stringLookup } from "../strings.mjs";
|
3
3
|
import UrlHelper from "../UrlHelper.mjs";
|
4
4
|
|
5
|
+
const GESTURE_MIN_TOUCH_MOVE_DIST = 40; // px
|
6
|
+
|
5
7
|
function isInPresenterMode(targetDoc) {
|
6
8
|
return targetDoc.body.classList.contains("remark-presenter-mode");
|
7
9
|
}
|
@@ -13,7 +15,6 @@ function focusSearchResult(targetWin, query, targetMatchNo, slideshow, searcher)
|
|
13
15
|
let currentSlideNo = slide.getSlideIndex() + 1;
|
14
16
|
|
15
17
|
matchesFound += searcher.getNumberOfMatches(query, targetText);
|
16
|
-
console.log("Considering ", targetText, " with ", matchesFound, "matches found so far");
|
17
18
|
|
18
19
|
if (matchesFound > targetMatchNo) {
|
19
20
|
slideshow.gotoSlide(currentSlideNo);
|
@@ -22,20 +23,27 @@ function focusSearchResult(targetWin, query, targetMatchNo, slideshow, searcher)
|
|
22
23
|
|
23
24
|
// Now search the notes!
|
24
25
|
if (slide.notes) {
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
try {
|
27
|
+
targetText = (slide.notes.join ?? (() => slide.notes))("\n");
|
28
|
+
matchesFound += searcher.getNumberOfMatches(query, targetText);
|
29
|
+
if (matchesFound > targetMatchNo) {
|
30
|
+
slideshow.gotoSlide(currentSlideNo);
|
31
|
+
|
32
|
+
if (!isInPresenterMode(targetWin.document)) {
|
33
|
+
slideshow.togglePresenterMode();
|
34
|
+
}
|
35
|
+
return;
|
32
36
|
}
|
33
|
-
|
37
|
+
}
|
38
|
+
catch (e) {
|
39
|
+
console.error(`Unable to search through notes for slide`, slide, `Error: `, e);
|
40
|
+
console.log("Continuing...");
|
34
41
|
}
|
35
42
|
}
|
36
43
|
}
|
37
44
|
|
38
|
-
console.log("Found ", matchesFound,
|
45
|
+
console.log("Found ", matchesFound,
|
46
|
+
" matches, which is less than the target of ", targetMatchNo, ". Remaining on last slide.");
|
39
47
|
slideshow.gotoLastSlide();
|
40
48
|
return -1;
|
41
49
|
}
|
@@ -69,7 +77,24 @@ function focusSlideFromHash(slideshow) {
|
|
69
77
|
}
|
70
78
|
}
|
71
79
|
|
80
|
+
/// Returns true iff the slide viewer should only display markdown.
|
81
|
+
function shouldOnlyDisplayMd() {
|
82
|
+
let pageArgs = UrlHelper.getPageArgs();
|
83
|
+
if (!pageArgs) {
|
84
|
+
return false;
|
85
|
+
}
|
86
|
+
|
87
|
+
if (pageArgs.md_only) {
|
88
|
+
return true;
|
89
|
+
}
|
90
|
+
|
91
|
+
return false;
|
92
|
+
}
|
93
|
+
|
72
94
|
async function main(targetWindow, config) {
|
95
|
+
// True if touch navigation is enabled.
|
96
|
+
let usingCustomTouchNav = false;
|
97
|
+
|
73
98
|
if (!targetWindow.remark) {
|
74
99
|
// Wait for page load if remark isn't available yet.
|
75
100
|
await (new Promise(resolve => {
|
@@ -77,22 +102,39 @@ async function main(targetWindow, config) {
|
|
77
102
|
}));
|
78
103
|
}
|
79
104
|
|
105
|
+
// If the user has requested that only the page's markdown be shown,
|
106
|
+
if (shouldOnlyDisplayMd()) {
|
107
|
+
targetWindow.document.body.innerText = config?.source;
|
108
|
+
targetWindow.document.body.classList.add('mdSourceView');
|
109
|
+
return;
|
110
|
+
}
|
111
|
+
|
112
|
+
// Customize touchscreen navigation — the default remark
|
113
|
+
// navigation can break buttons, zooming.
|
114
|
+
if (config?.navigation?.touch === true
|
115
|
+
|| config?.navigation?.touch === undefined) {
|
116
|
+
config ??= {};
|
117
|
+
config.navigation ??= {};
|
118
|
+
config.navigation.touch = false;
|
119
|
+
|
120
|
+
usingCustomTouchNav = true;
|
121
|
+
}
|
122
|
+
|
80
123
|
// See https://remarkjs.com/#8
|
81
124
|
let slideshow = targetWindow.remark.create(config);
|
125
|
+
targetWindow.focus();
|
82
126
|
|
83
127
|
// For debugging
|
84
128
|
window.slideshow_debug = slideshow;
|
85
129
|
|
86
|
-
targetWindow.focus();
|
87
|
-
|
88
130
|
addExtendedControls(targetWindow, slideshow);
|
89
131
|
focusSearchResultFromUrl(targetWindow, slideshow);
|
132
|
+
focusSlideFromHash(slideshow);
|
90
133
|
|
134
|
+
// Create a URL state we can navigate back to/restore to
|
91
135
|
targetWindow.history.replaceState(null, targetWindow.location.href);
|
92
136
|
let targetWinHistory = targetWindow.history.state;
|
93
137
|
|
94
|
-
focusSlideFromHash(slideshow);
|
95
|
-
|
96
138
|
window.addEventListener('hashchange', () => {
|
97
139
|
focusSlideFromHash(slideshow);
|
98
140
|
});
|
@@ -111,6 +153,45 @@ async function main(targetWindow, config) {
|
|
111
153
|
UrlHelper.withReplacedHash(targetWindow.location.href, hashId));
|
112
154
|
window.location.hash = hashId;
|
113
155
|
});
|
156
|
+
|
157
|
+
// Add custom touch events to listen for navigation.
|
158
|
+
if (usingCustomTouchNav) {
|
159
|
+
let elemContainer = targetWindow.document.body;
|
160
|
+
let initialPos = {};
|
161
|
+
let handlingGesture = false;
|
162
|
+
|
163
|
+
elemContainer.addEventListener('pointerdown', evt => {
|
164
|
+
if (evt.pointerType == 'touch') {
|
165
|
+
// Only handle single-touch gestures
|
166
|
+
handlingGesture = evt.isPrimary;
|
167
|
+
initialPos = {
|
168
|
+
x: evt.clientX,
|
169
|
+
y: evt.clientY,
|
170
|
+
};
|
171
|
+
|
172
|
+
if (handlingGesture) {
|
173
|
+
evt.preventDefault();
|
174
|
+
elemContainer.setPointerCapture();
|
175
|
+
}
|
176
|
+
}
|
177
|
+
});
|
178
|
+
|
179
|
+
elemContainer.addEventListener('pointerup', evt => {
|
180
|
+
if (evt.pointerType == 'touch' && handlingGesture) {
|
181
|
+
let dx = evt.clientX - initialPos.x;
|
182
|
+
|
183
|
+
if (Math.abs(dx) < GESTURE_MIN_TOUCH_MOVE_DIST) {
|
184
|
+
return;
|
185
|
+
}
|
186
|
+
|
187
|
+
if (dx < 0) {
|
188
|
+
slideshow.gotoNextSlide();
|
189
|
+
} else {
|
190
|
+
slideshow.gotoPreviousSlide();
|
191
|
+
}
|
192
|
+
}
|
193
|
+
});
|
194
|
+
}
|
114
195
|
}
|
115
196
|
|
116
197
|
/// Apply minor adjustments to the default remark layout
|
@@ -146,16 +227,20 @@ function addExtendedControls(targetWindow, slideshow) {
|
|
146
227
|
targetWindow.print();
|
147
228
|
};
|
148
229
|
|
230
|
+
let updateBtns = (slideIdx) => {
|
231
|
+
prevSlideBtn.disabled = (slideIdx == 0);
|
232
|
+
nextSlideBtn.disabled = (slideIdx + 1 >= slideshow.getSlideCount());
|
233
|
+
};
|
234
|
+
|
149
235
|
slideshow.on('showSlide', function(newSlide) {
|
150
236
|
if (!newSlide) {
|
151
237
|
return;
|
152
238
|
}
|
153
239
|
|
154
|
-
|
155
|
-
nextSlideBtn.disabled = (newSlide.getSlideIndex() + 1 >= slideshow.getSlideCount());
|
240
|
+
updateBtns(newSlide.getSlideIndex());
|
156
241
|
});
|
157
242
|
|
158
|
-
|
243
|
+
updateBtns(0);
|
159
244
|
|
160
245
|
nav.replaceChildren(prevSlideBtn, nextSlideBtn, spacer, printBtn);
|
161
246
|
targetWindow.document.body.appendChild(nav);
|
data/assets/js/main.mjs
CHANGED
@@ -3,6 +3,7 @@ import { generateHeaderLinks } from "./linkButtonGenerator.mjs";
|
|
3
3
|
import handleSidebar from "./sidebar.mjs";
|
4
4
|
import handleSearch from "./search.mjs";
|
5
5
|
import autoExpandDropdowns from "./dropdownExpander.mjs";
|
6
|
+
import makeElemsScrollable from "./scrollables.mjs";
|
6
7
|
import Settings from "./Settings.mjs";
|
7
8
|
|
8
9
|
// After loading elements, images, css, etc.
|
@@ -17,6 +18,7 @@ addEventListener("load", () => {
|
|
17
18
|
// After loading elements, but before loading elements like images.
|
18
19
|
addEventListener("DOMContentLoaded", () => {
|
19
20
|
handleSidebar();
|
21
|
+
makeElemsScrollable();
|
20
22
|
});
|
21
23
|
|
22
24
|
// Apply user-specified settings
|
@@ -0,0 +1,29 @@
|
|
1
|
+
/// Wrap elements that can be too wide in scrollable containers
|
2
|
+
|
3
|
+
const SCROLLABLE_CONTAINER_CLSS = "scrollable-container";
|
4
|
+
|
5
|
+
function makeScrollable() {
|
6
|
+
// Make tables scrollable
|
7
|
+
let elems = document.querySelectorAll("main > table");
|
8
|
+
|
9
|
+
for (const elem of elems) {
|
10
|
+
let container = document.createElement("div");
|
11
|
+
elem.parentElement.insertBefore(container, elem);
|
12
|
+
elem.remove();
|
13
|
+
|
14
|
+
container.classList.add(SCROLLABLE_CONTAINER_CLSS);
|
15
|
+
container.appendChild(elem);
|
16
|
+
}
|
17
|
+
|
18
|
+
// Make display math scrollable
|
19
|
+
elems = document.querySelectorAll("main > span > .katex-display");
|
20
|
+
for (const elem of elems) {
|
21
|
+
let container = elem.parentElement;
|
22
|
+
|
23
|
+
if (container.children.length == 1) {
|
24
|
+
container.classList.add(SCROLLABLE_CONTAINER_CLSS);
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
export default makeScrollable;
|
data/assets/string_data/en.mjs
CHANGED
data/assets/string_data/es.mjs
CHANGED
@@ -51,6 +51,7 @@ export default {
|
|
51
51
|
page_theme_light: 'Brillante',
|
52
52
|
settings_minimize_header: 'Título escondido: ',
|
53
53
|
|
54
|
+
presentation_frame_title: 'Diapositivas de la presentación',
|
54
55
|
btn_next_slide: 'Vaya a la diapositiva proxima',
|
55
56
|
btn_prev_slide: 'Vaya a la diapositiva anterior',
|
56
57
|
btn_print: 'Imprima',
|
data/assets/style.scss
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hematite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henry Heino
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -37,6 +37,7 @@ files:
|
|
37
37
|
- _includes/extern_library_imports.html
|
38
38
|
- _includes/footer.html
|
39
39
|
- _includes/img/hamburger_menu.svg
|
40
|
+
- _includes/img/loading_icon.svg
|
40
41
|
- _includes/img/search_icon.svg
|
41
42
|
- _includes/katex_includes.html
|
42
43
|
- _includes/mermaid_includes.html
|
@@ -45,6 +46,7 @@ files:
|
|
45
46
|
- _includes/nav/pages_list.html
|
46
47
|
- _includes/nav/pinned_page.html
|
47
48
|
- _includes/nav/sidebar.html
|
49
|
+
- _includes/scss/_fonts.scss
|
48
50
|
- _includes/settings.html
|
49
51
|
- _layouts/calendar.html
|
50
52
|
- _layouts/default.html
|
@@ -63,6 +65,8 @@ files:
|
|
63
65
|
- _sass/_rogue.scss
|
64
66
|
- _sass/_sizes.scss
|
65
67
|
- _sass/hematite.scss
|
68
|
+
- assets/fonts/FoulisGreek.ttf
|
69
|
+
- assets/fonts/README.txt
|
66
70
|
- assets/html/all_tags.html
|
67
71
|
- assets/html/remark_presentation_frame.html
|
68
72
|
- assets/html/settings.html
|
@@ -81,6 +85,7 @@ files:
|
|
81
85
|
- assets/js/layout/remark_slideshow.mjs
|
82
86
|
- assets/js/linkButtonGenerator.mjs
|
83
87
|
- assets/js/main.mjs
|
88
|
+
- assets/js/scrollables.mjs
|
84
89
|
- assets/js/search.mjs
|
85
90
|
- assets/js/sidebar.mjs
|
86
91
|
- assets/js/string_data.mjs
|