hematite 0.0.7 → 0.0.10
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/README.md +3 -1
- data/_config.yml +2 -1
- data/_includes/footer.html +6 -0
- data/_includes/nav/header.html +5 -0
- data/_includes/nav/page_navigation.html +1 -1
- data/_includes/nav/sidebar.html +16 -2
- data/_layouts/default.html +2 -0
- data/_sass/_colors.scss +49 -38
- data/_sass/_elements.scss +58 -4
- data/_sass/_layout.scss +3 -3
- data/_sass/_nav.scss +3 -0
- data/_sass/_sizes.scss +3 -2
- data/_sass/hematite.scss +5 -1
- data/assets/html/settings.html +94 -0
- data/assets/js/Settings.mjs +137 -0
- data/assets/js/layout/calendar.mjs +9 -2
- data/assets/js/main.mjs +4 -0
- data/assets/js/sidebar.mjs +12 -0
- data/assets/string_data/en.mjs +21 -0
- data/assets/string_data/es.mjs +18 -0
- data/assets/style.scss +2 -6
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c347dece80da3456bf6c8cd42bc6daafc81212dd102ab9fffb664b4c49799e4
|
4
|
+
data.tar.gz: 6218c2a7ee4243942111a7a3e7dce23bfe1be5c96304a1fc671e044f16ab4906
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cdadf907f31e447adbf62dcd7dd849d56418de2a7ba975d9460d5248494065ff4ab5ad12355c60f4858928e9a7e1099434140e14e970a471bf2aa25664cf4aca
|
7
|
+
data.tar.gz: '093443b534ad09677b988852815e543e027060407de67399ca46b1006e28b174ecaaaf3181d52e87750bbcadf20ed928d2bc71fb77a01f3d32276ac0a1f51f61'
|
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# Hematite
|
2
|
+
[](https://badge.fury.io/rb/hematite)
|
2
3
|
|
3
4
|

|
4
5
|
|
@@ -50,7 +51,8 @@ Your theme is setup just like a normal Jekyll site! To test your theme, run `bun
|
|
50
51
|
When your theme is released, only the files in `_layouts`, `_includes`, `_sass` and `assets` tracked with Git will be bundled.
|
51
52
|
To add a custom directory to your theme-gem, please edit the regexp in `Hematite.gemspec` accordingly.
|
52
53
|
|
53
|
-
**Note:** All user-facing strings
|
54
|
+
**Note:** All user-facing strings that are distributed with the theme should go in
|
55
|
+
[assets/string_data](https://github.com/personalizedrefrigerator/jekyll-hematite-theme/tree/main/assets/string_data) to permit future localization.
|
54
56
|
|
55
57
|
## License
|
56
58
|
|
data/_config.yml
CHANGED
@@ -33,6 +33,7 @@ hematite:
|
|
33
33
|
month_first: true
|
34
34
|
|
35
35
|
sidebar:
|
36
|
-
footer_html: 'This page was made with the Hematite Theme. <a href="https://github.com/personalizedrefrigerator/jekyll-hematite-theme">Contribute on GitHub
|
36
|
+
footer_html: 'This page was made with the Hematite Theme. <a href="https://github.com/personalizedrefrigerator/jekyll-hematite-theme">Contribute on GitHub.</a>'
|
37
|
+
show_settings_btn: true
|
37
38
|
|
38
39
|
|
data/_includes/nav/sidebar.html
CHANGED
@@ -18,8 +18,22 @@
|
|
18
18
|
</ul>
|
19
19
|
|
20
20
|
<footer>
|
21
|
-
|
22
|
-
{
|
21
|
+
<div>
|
22
|
+
{% if site.hematite.sidebar.footer_html %}
|
23
|
+
{{ site.hematite.sidebar.footer_html }}
|
24
|
+
{% endif %}
|
25
|
+
</div>
|
26
|
+
{% if site.hematite.sidebar.show_settings_btn %}
|
27
|
+
<center>
|
28
|
+
<!-- Localized by JS -->
|
29
|
+
<a id="sidebar_settings_btn" class="settings-btn"
|
30
|
+
{% if site.permalink == 'pretty' %}
|
31
|
+
href="{{ 'assets/html/settings' | relative_url }}"
|
32
|
+
{% else %}
|
33
|
+
href="{{ 'assets/html/settings.html' | relative_url }}"
|
34
|
+
{% endif %}
|
35
|
+
></a>
|
36
|
+
</center>
|
23
37
|
{% endif %}
|
24
38
|
</footer>
|
25
39
|
</nav>
|
data/_layouts/default.html
CHANGED
data/_sass/_colors.scss
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
:root {
|
1
|
+
:root:not(.darkTheme), :root.lightTheme {
|
2
2
|
--primary-text-color: black;
|
3
3
|
--secondary-text-color: black;
|
4
4
|
--text-color-faint: #444;
|
@@ -16,16 +16,10 @@
|
|
16
16
|
|
17
17
|
--shadow-color-light: rgba(0, 0, 0, 0.6);
|
18
18
|
--line-color-light: #eee;
|
19
|
+
--line-color-normal: #888;
|
19
20
|
--code-background-color: #fafafa;
|
20
|
-
}
|
21
21
|
|
22
|
-
@media screen {
|
23
|
-
:root {
|
24
|
-
--code-background-color: #f9f5f5;
|
25
|
-
}
|
26
|
-
}
|
27
22
|
|
28
|
-
:root {
|
29
23
|
// Syntax highlighting
|
30
24
|
--syntax-keyword-fg: #d00;
|
31
25
|
--syntax-string-fg: #c07;
|
@@ -37,37 +31,54 @@
|
|
37
31
|
--syntax-normal-fg: black;
|
38
32
|
}
|
39
33
|
|
34
|
+
@media screen {
|
35
|
+
:root:not(.darkTheme), :root.lightTheme {
|
36
|
+
--code-background-color: #f9f5f5;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
@mixin dark-theme-colors {
|
41
|
+
--primary-text-color: white;
|
42
|
+
--secondary-text-color: white;
|
43
|
+
--text-color-faint: #ccc;
|
44
|
+
--link-color: #fa0;
|
45
|
+
--visited-link-color: #f0a;
|
46
|
+
|
47
|
+
--selected-item-fg-color: white;
|
48
|
+
--selected-item-bg-color: #530033;
|
49
|
+
|
50
|
+
--primary-background-color: black;
|
51
|
+
--secondary-background-color: #111;
|
52
|
+
--code-background-color: #222;
|
53
|
+
--line-color-light: #222;
|
54
|
+
--line-color-normal: #aaa;
|
55
|
+
|
56
|
+
--color-alert-background: #300;
|
57
|
+
--color-alert-foreground: white;
|
58
|
+
|
59
|
+
--shadow-color-light: rgba(200, 200, 200, 0.5);
|
60
|
+
|
61
|
+
|
62
|
+
// Syntax highlighting
|
63
|
+
--syntax-keyword-fg: pink;
|
64
|
+
--syntax-string-fg: #cfc;
|
65
|
+
--syntax-number-fg: #eef;
|
66
|
+
--syntax-bracket-fg: #faf;
|
67
|
+
--syntax-operator-fg: #aff;
|
68
|
+
--syntax-comment-fg: #aef;
|
69
|
+
--syntax-name-fg: #edf;
|
70
|
+
--syntax-normal-fg: white;
|
71
|
+
}
|
72
|
+
|
40
73
|
@media screen and (prefers-color-scheme: dark) {
|
41
|
-
:root {
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
--selected-item-bg-color: #530033;
|
50
|
-
|
51
|
-
--primary-background-color: black;
|
52
|
-
--secondary-background-color: #111;
|
53
|
-
--code-background-color: #222;
|
54
|
-
--line-color-light: #222;
|
55
|
-
|
56
|
-
--color-alert-background: #300;
|
57
|
-
--color-alert-foreground: white;
|
58
|
-
|
59
|
-
--shadow-color-light: rgba(200, 200, 200, 0.5);
|
60
|
-
|
61
|
-
|
62
|
-
// Syntax highlighting
|
63
|
-
--syntax-keyword-fg: pink;
|
64
|
-
--syntax-string-fg: #cfc;
|
65
|
-
--syntax-number-fg: #eef;
|
66
|
-
--syntax-bracket-fg: #faf;
|
67
|
-
--syntax-operator-fg: #aff;
|
68
|
-
--syntax-comment-fg: #aef;
|
69
|
-
--syntax-name-fg: #edf;
|
70
|
-
--syntax-normal-fg: white;
|
74
|
+
:root:not(.lightTheme) {
|
75
|
+
@include dark-theme-colors;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
@media screen {
|
80
|
+
:root.darkTheme {
|
81
|
+
@include dark-theme-colors;
|
71
82
|
}
|
72
83
|
}
|
73
84
|
|
data/_sass/_elements.scss
CHANGED
@@ -33,15 +33,19 @@ button[disabled] {
|
|
33
33
|
cursor: not-allowed;
|
34
34
|
}
|
35
35
|
|
36
|
-
input {
|
36
|
+
input, select, textarea {
|
37
37
|
color: var(--secondary-text-color);
|
38
38
|
background-color: var(--secondary-background-color);
|
39
|
-
border: 1px solid var(--line-color-
|
39
|
+
border: 1px solid var(--line-color-normal);
|
40
40
|
border-radius: 4px;
|
41
41
|
padding: 5px;
|
42
42
|
|
43
|
-
font-family:
|
44
|
-
font-size:
|
43
|
+
font-family: var(--main-font-family);
|
44
|
+
font-size: var(--main-font-size);
|
45
|
+
}
|
46
|
+
|
47
|
+
select {
|
48
|
+
cursor: pointer;
|
45
49
|
}
|
46
50
|
|
47
51
|
input::placeholder {
|
@@ -112,6 +116,15 @@ input::placeholder {
|
|
112
116
|
box-shadow: inset -1px -1px 4px var(--shadow-color-light);
|
113
117
|
}
|
114
118
|
}
|
119
|
+
|
120
|
+
table td {
|
121
|
+
border: 1px solid var(--line-color-light);
|
122
|
+
}
|
123
|
+
|
124
|
+
fieldset {
|
125
|
+
border-color: var(--line-color-normal);
|
126
|
+
margin-bottom: 30px;
|
127
|
+
}
|
115
128
|
}
|
116
129
|
|
117
130
|
// Markdown parsers may put `code` elements inside of `pre`
|
@@ -123,3 +136,44 @@ input::placeholder {
|
|
123
136
|
// Let the `pre` handle the padding
|
124
137
|
padding: 0;
|
125
138
|
}
|
139
|
+
|
140
|
+
a.settings-btn {
|
141
|
+
color: var(--text-color-faint);
|
142
|
+
border-radius: 4px;
|
143
|
+
padding: 3px;
|
144
|
+
transition: box-shadow 0.5s ease, border 0.5s ease;
|
145
|
+
border: 1px solid transparent;
|
146
|
+
|
147
|
+
&:hover {
|
148
|
+
box-shadow: 0 0 4px var(--shadow-color-light);
|
149
|
+
border: 1px solid var(--line-color-light);
|
150
|
+
}
|
151
|
+
}
|
152
|
+
|
153
|
+
// Invert while trying to preserve color hue.
|
154
|
+
@mixin img-invert {
|
155
|
+
filter: invert(1) hue-rotate(180deg);
|
156
|
+
}
|
157
|
+
|
158
|
+
@media (prefers-color-scheme: dark) {
|
159
|
+
:root:not(.lightTheme) main img.auto-invert {
|
160
|
+
@include img-invert;
|
161
|
+
}
|
162
|
+
}
|
163
|
+
|
164
|
+
:root.darkTheme main img.auto-invert {
|
165
|
+
@include img-invert;
|
166
|
+
}
|
167
|
+
|
168
|
+
// Users can `include' this to invert images automatically in dark mode.
|
169
|
+
@mixin auto-invert-images {
|
170
|
+
@media (prefers-color-scheme: dark) {
|
171
|
+
:root:not(.lightTheme) main img:not(.no-invert) {
|
172
|
+
@include img-invert;
|
173
|
+
}
|
174
|
+
}
|
175
|
+
|
176
|
+
:root.darkTheme main img:not(.no-invert) {
|
177
|
+
@include img-invert;
|
178
|
+
}
|
179
|
+
}
|
data/_sass/_layout.scss
CHANGED
@@ -34,8 +34,8 @@ body {
|
|
34
34
|
padding-bottom: 140px;
|
35
35
|
margin: 0;
|
36
36
|
|
37
|
-
font-size:
|
38
|
-
font-family:
|
37
|
+
font-size: var(--main-font-size);
|
38
|
+
font-family: var(--main-font-family);
|
39
39
|
color: var(--primary-text-color);
|
40
40
|
}
|
41
41
|
|
@@ -109,7 +109,7 @@ nav#post_next_prev {
|
|
109
109
|
background-color: var(--color-alert-background);
|
110
110
|
color: var(--color-alert-foreground);
|
111
111
|
|
112
|
-
font-family:
|
112
|
+
font-family: var(--main-font-family);
|
113
113
|
font-size: 14pt;
|
114
114
|
|
115
115
|
padding: 20px;
|
data/_sass/_nav.scss
CHANGED
data/_sass/_sizes.scss
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
|
2
|
-
// Macro-like variables
|
3
2
|
$site-content-preferred-width: 700px;
|
4
|
-
$font-size-main: 12pt;
|
5
3
|
$content-main-padding: 30px;
|
6
4
|
|
7
5
|
// CSS variables
|
8
6
|
:root {
|
7
|
+
// We want these variables to be changable dynamically,
|
8
|
+
// so they're CSS variables.
|
9
|
+
--main-font-size: 12pt;
|
9
10
|
--nav-font-size: 22pt;
|
10
11
|
--header-height: 30pt;
|
11
12
|
--nav-width: 300px;
|
data/_sass/hematite.scss
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
@charset "utf-8";
|
2
2
|
|
3
|
-
|
3
|
+
:root {
|
4
|
+
--serif-font-family: 'FoulisGreek', 'EB Garamond', 'TeX Gyre Bonum', serif;
|
5
|
+
--sans-font-family: 'URW Gothic, Book', 'TeX Gyre Adventor', 'Ubuntu', sans-serif;
|
6
|
+
--main-font-family: var(--serif-font-family);
|
7
|
+
}
|
4
8
|
|
5
9
|
@import "_colors";
|
6
10
|
@import "_sizes";
|
@@ -0,0 +1,94 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
title: Settings
|
4
|
+
noindex: true
|
5
|
+
---
|
6
|
+
|
7
|
+
<noscript>JavaScript is required to view this page's content!</noscript>
|
8
|
+
|
9
|
+
<!-- So they can be localized, much of this page is filled by JavaScript -->
|
10
|
+
<h1 id="settings_header">page_settings_header</h1>
|
11
|
+
<p id="settings_description">page_settings_description</p>
|
12
|
+
|
13
|
+
<!-- Organization inspired by https://www.w3.org/WAI/tutorials/forms/grouping/ -->
|
14
|
+
<fieldset>
|
15
|
+
<legend id="font_legend">settings_font_legend</legend>
|
16
|
+
<div>
|
17
|
+
<label id="font_family_lbl" for="font_family">settings_font_family_label</label>
|
18
|
+
<select id="font_family"></select>
|
19
|
+
</div>
|
20
|
+
<div>
|
21
|
+
<label id="font_size_lbl" for="font_size">settings_font_size_label</label>
|
22
|
+
<select id="font_size">
|
23
|
+
</select>
|
24
|
+
</div>
|
25
|
+
</fieldset>
|
26
|
+
|
27
|
+
<fieldset>
|
28
|
+
<legend id="theme_legend">page_theme_legend</legend>
|
29
|
+
<div>
|
30
|
+
<label id="page_theme_lbl" for="page_theme">settings_theme_label</label>
|
31
|
+
<select id="page_theme"></select>
|
32
|
+
</div>
|
33
|
+
</fieldset>
|
34
|
+
|
35
|
+
<script type="module">
|
36
|
+
import Settings from "{{ 'assets/js/Settings.mjs' | relative_url }}";
|
37
|
+
import { stringLookup } from "{{ 'assets/js/strings.mjs' | relative_url }}";
|
38
|
+
|
39
|
+
let settingsTextElemIDs = [
|
40
|
+
`settings_header`, `settings_description`, `font_legend`,
|
41
|
+
`font_family_lbl`, `font_size_lbl`, `theme_legend`,
|
42
|
+
`page_theme_lbl`,
|
43
|
+
];
|
44
|
+
|
45
|
+
// Localize all descriptive settings elements (each should contian the
|
46
|
+
// name of its localization key).
|
47
|
+
for (const id of settingsTextElemIDs) {
|
48
|
+
let elem = document.querySelector(`#${id}`);
|
49
|
+
elem.innerText = stringLookup(elem.innerText);
|
50
|
+
}
|
51
|
+
|
52
|
+
let fontSizeSelect = document.querySelector("#font_size");
|
53
|
+
let fontFamilySelect = document.querySelector("#font_family");
|
54
|
+
let pageThemeSelect = document.querySelector("#page_theme");
|
55
|
+
|
56
|
+
pageThemeSelect.innerHTML =
|
57
|
+
`
|
58
|
+
<option value='${Settings.THEME_AUTO}'>${stringLookup('page_theme_auto')}</option>
|
59
|
+
<option value='${Settings.THEME_DARK}'>${stringLookup('page_theme_dark')}</option>
|
60
|
+
<option value='${Settings.THEME_LIGHT}'>${stringLookup('page_theme_light')}</option>
|
61
|
+
`;
|
62
|
+
|
63
|
+
fontFamilySelect.innerHTML =
|
64
|
+
`
|
65
|
+
<option value='${Settings.FONT_DEFAULT}'>${stringLookup('page_font_default')}</option>
|
66
|
+
<option value='${Settings.FONT_SERIF}'>${stringLookup('page_font_serif')}</option>
|
67
|
+
<option value='${Settings.FONT_SANS}'>${stringLookup('page_font_sans')}</option>
|
68
|
+
`;
|
69
|
+
|
70
|
+
fontSizeSelect.innerHTML =
|
71
|
+
`
|
72
|
+
<option value='${Settings.FONT_SIZE_DEFAULT}'>${stringLookup('page_font_default')}</option>
|
73
|
+
<option value='${Settings.FONT_SIZE_SMALL}'>${stringLookup('page_font_small')}</option>
|
74
|
+
<option value='${Settings.FONT_SIZE_MEDIUM}'>${stringLookup('page_font_medium')}</option>
|
75
|
+
<option value='${Settings.FONT_SIZE_LARGE}'>${stringLookup('page_font_large')}</option>
|
76
|
+
`;
|
77
|
+
|
78
|
+
fontSizeSelect.oninput = () => {
|
79
|
+
Settings.setFontSize(fontSizeSelect.value);
|
80
|
+
};
|
81
|
+
|
82
|
+
fontFamilySelect.oninput = () => {
|
83
|
+
Settings.setFontFamily(fontFamilySelect.value);
|
84
|
+
};
|
85
|
+
|
86
|
+
pageThemeSelect.oninput = () => {
|
87
|
+
Settings.setTheme(pageThemeSelect.value);
|
88
|
+
};
|
89
|
+
|
90
|
+
pageThemeSelect.value = Settings.getTheme();
|
91
|
+
fontFamilySelect.value = Settings.getFontFamily();
|
92
|
+
fontSizeSelect.value = Settings.getFontSize();
|
93
|
+
|
94
|
+
</script>
|
@@ -0,0 +1,137 @@
|
|
1
|
+
---
|
2
|
+
---
|
3
|
+
|
4
|
+
class Settings {
|
5
|
+
THEME_AUTO = 'auto';
|
6
|
+
THEME_DARK = 'dark';
|
7
|
+
THEME_LIGHT = 'light';
|
8
|
+
|
9
|
+
FONT_DEFAULT = 'default';
|
10
|
+
FONT_SANS = 'sans';
|
11
|
+
FONT_SERIF = 'serif';
|
12
|
+
|
13
|
+
FONT_SIZE_SMALL = 'small';
|
14
|
+
FONT_SIZE_MEDIUM = 'medium';
|
15
|
+
FONT_SIZE_LARGE = 'large';
|
16
|
+
FONT_SIZE_DEFAULT = 'default';
|
17
|
+
|
18
|
+
FONT_SIZE_KEY_ = 'hematite-setting-font-size';
|
19
|
+
FONT_FAMILY_KEY_ = 'hematite-setting-font-family';
|
20
|
+
THEME_KEY_ = 'hematite-setting-theme';
|
21
|
+
|
22
|
+
constructor() {
|
23
|
+
}
|
24
|
+
|
25
|
+
getSetting_(key) {
|
26
|
+
return localStorage.getItem(key);
|
27
|
+
}
|
28
|
+
|
29
|
+
setSetting_(key, val) {
|
30
|
+
localStorage.setItem(key, val);
|
31
|
+
this.applySettings();
|
32
|
+
}
|
33
|
+
|
34
|
+
getTheme() {
|
35
|
+
return this.getSetting_(this.THEME_KEY_) ?? this.THEME_AUTO;
|
36
|
+
}
|
37
|
+
|
38
|
+
getFontFamily() {
|
39
|
+
return this.getSetting_(this.FONT_FAMILY_KEY_) ?? this.FONT_DEFAULT;
|
40
|
+
}
|
41
|
+
|
42
|
+
getFontSize() {
|
43
|
+
return this.getSetting_(this.FONT_SIZE_KEY_) ?? this.FONT_SIZE_DEFAULT;
|
44
|
+
}
|
45
|
+
|
46
|
+
setFontSize(sizeOption) {
|
47
|
+
this.setSetting_(this.FONT_SIZE_KEY_, sizeOption);
|
48
|
+
}
|
49
|
+
|
50
|
+
setFontFamily(familyOption) {
|
51
|
+
this.setSetting_(this.FONT_FAMILY_KEY_, familyOption);
|
52
|
+
}
|
53
|
+
|
54
|
+
setTheme(themeOption) {
|
55
|
+
this.setSetting_(this.THEME_KEY_, themeOption);
|
56
|
+
}
|
57
|
+
|
58
|
+
getFontSizePt_() {
|
59
|
+
let fontSizeOption = this.getFontSize();
|
60
|
+
|
61
|
+
if (fontSizeOption == this.FONT_SIZE_SMALL) {
|
62
|
+
return {{ site.hematite.user_config.font_size_small | default: "9" }};
|
63
|
+
}
|
64
|
+
|
65
|
+
if (fontSizeOption == this.FONT_SIZE_MEDIUM) {
|
66
|
+
return {{ site.hematite.user_config.font_size_medium | default: "13" }};
|
67
|
+
}
|
68
|
+
|
69
|
+
if (fontSizeOption == this.FONT_SIZE_LARGE) {
|
70
|
+
return {{ site.hematite.user_config.font_size_large | default: "16" }};
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
usingNonDefaultFontFamily_() {
|
75
|
+
return this.getFontFamily() != this.FONT_DEFAULT;
|
76
|
+
}
|
77
|
+
|
78
|
+
usingNonDefaultFontSize_() {
|
79
|
+
return this.getFontSize() != this.FONT_SIZE_DEFAULT;
|
80
|
+
}
|
81
|
+
|
82
|
+
forcingDarkTheme_() {
|
83
|
+
return this.getTheme() == this.THEME_DARK;
|
84
|
+
}
|
85
|
+
|
86
|
+
forcingLightTheme_() {
|
87
|
+
return this.getTheme() == this.THEME_LIGHT;
|
88
|
+
}
|
89
|
+
|
90
|
+
applySettings() {
|
91
|
+
// Clean up previous changes. We might be re-applying styles.
|
92
|
+
document.documentElement.classList.remove("lightTheme");
|
93
|
+
document.documentElement.classList.remove("darkTheme");
|
94
|
+
|
95
|
+
if (!this.style_) {
|
96
|
+
this.style_ = document.createElement("style");
|
97
|
+
} else {
|
98
|
+
this.style_.remove();
|
99
|
+
}
|
100
|
+
|
101
|
+
|
102
|
+
let styleHTML = '';
|
103
|
+
|
104
|
+
// Font family
|
105
|
+
if (this.usingNonDefaultFontFamily_()) {
|
106
|
+
styleHTML +=
|
107
|
+
`
|
108
|
+
:root {
|
109
|
+
--main-font-family: var(--${this.getFontFamily()}-font-family);
|
110
|
+
}
|
111
|
+
`;
|
112
|
+
}
|
113
|
+
|
114
|
+
// Font size
|
115
|
+
if (this.usingNonDefaultFontSize_()) {
|
116
|
+
styleHTML +=
|
117
|
+
`
|
118
|
+
:root {
|
119
|
+
--main-font-size: ${this.getFontSizePt_()}pt;
|
120
|
+
}
|
121
|
+
`;
|
122
|
+
}
|
123
|
+
|
124
|
+
// Theme
|
125
|
+
if (this.forcingDarkTheme_()) {
|
126
|
+
document.documentElement.classList.add("darkTheme");
|
127
|
+
}
|
128
|
+
else if (this.forcingLightTheme_()) {
|
129
|
+
document.documentElement.classList.add("lightTheme");
|
130
|
+
}
|
131
|
+
|
132
|
+
this.style_.innerHTML = styleHTML;
|
133
|
+
document.documentElement.appendChild(this.style_);
|
134
|
+
}
|
135
|
+
}
|
136
|
+
|
137
|
+
export default (new Settings());
|
@@ -91,8 +91,7 @@ function getCalendarData(elem, formatElemLabels, dateHeaderTag) {
|
|
91
91
|
}
|
92
92
|
|
93
93
|
result.sort(AgendaItem.compare);
|
94
|
-
|
95
|
-
return result;
|
94
|
+
return joinDuplicateData(result);
|
96
95
|
}
|
97
96
|
|
98
97
|
/// Adds post data to the given calendar data item.
|
@@ -127,6 +126,14 @@ function addPostData(data) {
|
|
127
126
|
|
128
127
|
data.sort(AgendaItem.compare);
|
129
128
|
|
129
|
+
|
130
|
+
return joinDuplicateData(data);
|
131
|
+
}
|
132
|
+
|
133
|
+
/// Ensures that there is only one entry per date (at most),
|
134
|
+
/// returns an updated version with agenda items moved such that
|
135
|
+
/// this is so.
|
136
|
+
function joinDuplicateData(data) {
|
130
137
|
let newData = [];
|
131
138
|
let currentItem;
|
132
139
|
|
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 Settings from "./Settings.mjs";
|
6
7
|
|
7
8
|
// After loading elements, images, css, etc.
|
8
9
|
addEventListener("load", () => {
|
@@ -16,4 +17,7 @@ addEventListener("load", () => {
|
|
16
17
|
// After loading elements, but before loading elements like images.
|
17
18
|
addEventListener("DOMContentLoaded", () => {
|
18
19
|
handleSidebar();
|
20
|
+
|
21
|
+
// Apply user-specified settings
|
22
|
+
Settings.applySettings();
|
19
23
|
});
|
data/assets/js/sidebar.mjs
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import { stringLookup } from "./strings.mjs";
|
2
2
|
import { announceForAccessibility } from "./PageAlert.mjs";
|
3
3
|
|
4
|
+
|
4
5
|
function handleSidebar() {
|
5
6
|
const toggleBtn = document.querySelector(`button#toggle_sidebar_btn`);
|
6
7
|
const sidebar = document.querySelector(`nav#sidebar`);
|
@@ -91,6 +92,17 @@ function handleSidebar() {
|
|
91
92
|
}
|
92
93
|
});
|
93
94
|
}
|
95
|
+
|
96
|
+
localizeSettingsBtn();
|
97
|
+
}
|
98
|
+
|
99
|
+
// Localize the text in the sidebar's settings button, if it exists.
|
100
|
+
function localizeSettingsBtn() {
|
101
|
+
let sidebarBtn = document.querySelector("#sidebar_settings_btn");
|
102
|
+
|
103
|
+
if (sidebarBtn) {
|
104
|
+
sidebarBtn.innerText = stringLookup(`open_settings_btn`);
|
105
|
+
}
|
94
106
|
}
|
95
107
|
|
96
108
|
export { handleSidebar };
|
data/assets/string_data/en.mjs
CHANGED
@@ -30,4 +30,25 @@ export default {
|
|
30
30
|
all_tags_header: 'All Tags',
|
31
31
|
prev_post: '← {0}',
|
32
32
|
next_post: '{0} →',
|
33
|
+
|
34
|
+
open_settings_btn: 'Site Settings',
|
35
|
+
page_settings_header: 'Settings',
|
36
|
+
page_settings_description:
|
37
|
+
'Here, you can change settings that affect how this page looks. Changes'
|
38
|
+
+ ' save automatically.',
|
39
|
+
settings_font_legend: 'Font Options',
|
40
|
+
settings_font_family_label: 'Font Family: ',
|
41
|
+
settings_font_size_label: 'Font Size: ',
|
42
|
+
settings_theme_label: 'Page Theme: ',
|
43
|
+
page_theme_legend: 'Theme Options',
|
44
|
+
|
45
|
+
page_font_sans: 'Sans',
|
46
|
+
page_font_serif: 'Serif',
|
47
|
+
page_font_default: 'Default',
|
48
|
+
page_font_small: 'Small',
|
49
|
+
page_font_medium: 'Medium',
|
50
|
+
page_font_large: 'Large',
|
51
|
+
page_theme_auto: 'Automatic',
|
52
|
+
page_theme_dark: 'Dark Theme',
|
53
|
+
page_theme_light: 'Light Theme',
|
33
54
|
};
|
data/assets/string_data/es.mjs
CHANGED
@@ -31,4 +31,22 @@ export default {
|
|
31
31
|
all_tags_header: 'Todas las etiquetas',
|
32
32
|
prev_post: '← {0}',
|
33
33
|
next_post: '{0} →',
|
34
|
+
|
35
|
+
open_settings_btn: 'Ajustes de este sitio',
|
36
|
+
page_settings_header: 'Ajustes',
|
37
|
+
page_settings_description: 'Aquí, puede cambiar algunos aspectos de este sitio.'
|
38
|
+
+ ' Cuando una ajuste cambia, lo debe estar guardado.',
|
39
|
+
settings_font_legend: 'Ajustes de fuente',
|
40
|
+
settings_font_family_label: 'Familia de fuente: ',
|
41
|
+
settings_font_size_label: 'Tamoño de fuente: ',
|
42
|
+
settings_theme_label: 'Color de la pagina: ',
|
43
|
+
page_theme_legend: 'Ajustes de tema',
|
44
|
+
|
45
|
+
page_font_default: 'Inicial',
|
46
|
+
page_font_small: 'Pequeño',
|
47
|
+
page_font_medium: 'Media',
|
48
|
+
page_font_large: 'Grande',
|
49
|
+
page_theme_auto: 'Automático',
|
50
|
+
page_theme_dark: 'Oscuro',
|
51
|
+
page_theme_light: 'Brillante',
|
34
52
|
};
|
data/assets/style.scss
CHANGED
@@ -6,10 +6,6 @@ styles: true
|
|
6
6
|
@import "hematite";
|
7
7
|
|
8
8
|
{% if site.hematite.auto_invert_imgs %}
|
9
|
-
//
|
10
|
-
@
|
11
|
-
main img:not(.no-invert) {
|
12
|
-
filter: invert(1) hue-rotate(180deg);
|
13
|
-
}
|
14
|
-
}
|
9
|
+
// In dark mode, invert the brightness of images
|
10
|
+
@include auto-invert-images;
|
15
11
|
{% endif %}
|
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.0.
|
4
|
+
version: 0.0.10
|
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-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -34,9 +34,11 @@ files:
|
|
34
34
|
- LICENSE.txt
|
35
35
|
- README.md
|
36
36
|
- _config.yml
|
37
|
+
- _includes/footer.html
|
37
38
|
- _includes/img/hamburger_menu.svg
|
38
39
|
- _includes/img/search_icon.svg
|
39
40
|
- _includes/katex_includes.html
|
41
|
+
- _includes/nav/header.html
|
40
42
|
- _includes/nav/page_navigation.html
|
41
43
|
- _includes/nav/pages_list.html
|
42
44
|
- _includes/nav/pinned_page.html
|
@@ -56,11 +58,13 @@ files:
|
|
56
58
|
- _sass/_sizes.scss
|
57
59
|
- _sass/hematite.scss
|
58
60
|
- assets/html/all_tags.html
|
61
|
+
- assets/html/settings.html
|
59
62
|
- assets/img/favicon.svg
|
60
63
|
- assets/js/AnimationUtil.mjs
|
61
64
|
- assets/js/AsyncUtil.mjs
|
62
65
|
- assets/js/DateUtil.mjs
|
63
66
|
- assets/js/PageAlert.mjs
|
67
|
+
- assets/js/Settings.mjs
|
64
68
|
- assets/js/UrlHelper.mjs
|
65
69
|
- assets/js/assertions.mjs
|
66
70
|
- assets/js/dropdownExpander.mjs
|