Skip to content

Commit 0cc21dd

Browse files
authored
优化设置页
1 parent 9b115e2 commit 0cc21dd

File tree

7 files changed

+118
-148
lines changed

7 files changed

+118
-148
lines changed

_data/settings.yaml

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,19 @@ appearance_color:
55
- light
66
- dark
77
- auto
8-
appearance_skin_light:
8+
appearance_color_switcher:
99
type: radio
10-
default: default
10+
default: enable
1111
options:
12-
- default
13-
- air
14-
- aqua
15-
- contrast
16-
- dark
17-
- dirt
18-
- neon
19-
- mint
20-
- plum
21-
- sunrise
22-
- catppuccin_latte
23-
- catppuccin_mocha
24-
appearance_skin_dark:
25-
type: radio
26-
default: dark
12+
- enable
13+
- disable
14+
appearance_skin:
15+
type: multi-radio
16+
children:
17+
light:
18+
default: default
19+
dark:
20+
default: dark
2721
options:
2822
- default
2923
- air

_layouts/default.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
<body class="layout--{{ page.layout | default: layout.layout }}{% if page.classes or layout.classes %}{{ page.classes | default: layout.classes | join: ' ' | prepend: ' ' }}{% endif %}" dir="{% if site.rtl %}rtl{% else %}ltr{% endif %}">
1515
{% if site.preview and site.preview.pr-number %}
16-
<div class="notice--warning text-center m0" style="position: sticky; top: 0; z-index: 999; padding: 0.4em;">当前站点为预览构建而非官方文档。如需反馈问题,请前往 <a href="https://github.com/HMCL-dev/HMCL-docs/pull/{{ site.preview.pr-number }}">#{{ site.preview.pr-number }}</a> 留言。</div>
16+
<div class="notice--warning text-center preview">当前站点为预览构建而非官方文档。如需反馈问题,请前往 <a href="https://github.com/HMCL-dev/HMCL-docs/pull/{{ site.preview.pr-number }}">#{{ site.preview.pr-number }}</a> 留言。</div>
1717
{% endif %}
1818

1919
{% include_cached skip-links.html locale=locale %}

_layouts/settings.html

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,55 @@
11
---
2-
layout: document
2+
layout: single
33
---
44

5-
{% for group in page.data %}
6-
7-
{% capture notice %}
8-
9-
## {{ group.title }}
10-
5+
{%- for group in page.data %}
6+
<h2 id="{{ group.title }}">{{ group.title }}</h2>
117
{% for pair in group.settings %}
128
{% assign name = pair[0] %}
139
{% assign value = pair[1] %}
1410
{% assign setting = site.data.settings[name] %}
15-
16-
{% if setting.type == 'radio' %}
1711
<div class="notice">
18-
<ul class="task-list">
19-
<li><strong>{{ value.title }}</strong></li>
20-
<li>{{ value.description }}</li>
21-
{% for option in setting.options %}
22-
<li class="task-list-item">
23-
<input type="radio" class="task-list-item-checkbox" name="{{ name }}" value="{{ option }}" id="{{ name }}_{{ option }}"{% if setting.default == option %} checked{% endif %}><label for="{{ name }}_{{ option }}">{{ value.options[option] }}</label>
24-
</li>
25-
{% endfor %}
26-
</ul>
12+
<h3 id="{{ group.title }}-{{ value.name }}">{{ value.title }}</h3>
13+
{% if value.description %}<p>{{ value.description }}</p>{% endif %}
14+
{% if setting.type == 'radio' %}
15+
{% for option in setting.options %}
16+
<label>
17+
<input type="radio"{% if setting.default == option %} checked{% endif %} class="setting-item" name="{{ name }}" value="{{ option }}">
18+
{{ value.options[option] }}
19+
</label>
20+
{% endfor %}
21+
{% elsif setting.type == 'multi-radio' %}
22+
<table class="setting-multi-radio">
23+
<thead>
24+
<tr>
25+
<th>{{ value.title }}</th>
26+
{% for item in setting.children %}
27+
{% capture item_name %}{{ item[0] }}{% endcapture %}
28+
<th>{{ value.children[item_name] }}</th>
29+
{% endfor %}
30+
</tr>
31+
</thead>
32+
<tbody>
33+
{% for option in setting.options %}
34+
<tr>
35+
<th>{{ value.options[option] }}</th>
36+
{% for item in setting.children %}
37+
<td><input class="setting-item"{% if item[1].default == option %} checked{% endif %} type="radio" name="{{ name }}.{{ item[0] }}" value="{{ option }}"></td>
38+
{% endfor %}
39+
</tr>
40+
{% endfor %}
41+
</tbody>
42+
</table>
43+
{% endif %}
2744
</div>
45+
{% endfor %}
46+
{% endfor %}
2847

2948
<script>
30-
settings.onChange("{{ name }}", function (newValue, oldValue) {
31-
var list = document.getElementsByName("{{ name }}");
32-
for (var i = 0; i < list.length; i++) {
33-
list[i].checked = list[i].value === newValue;
34-
list[i].onchange = function () {
35-
if (this.checked) {
36-
settings.set(this.name, this.value);
37-
}
38-
}
39-
}
40-
});
49+
for (const settingItem of document.getElementsByClassName("setting-item")) {
50+
settingItem.addEventListener("change", ({ target }) => settings.set(target.name, target.value));
51+
settings.onChange(settingItem.name, (value) => settingItem.type === "radio" && (settingItem.checked = settingItem.value === value));
52+
}
4153
</script>
42-
{% endif %}
43-
{% endfor %}
44-
{% endcapture %}
45-
{{ notice | markdownify }}
46-
{% endfor %}
54+
55+
<style>.notice label input { display: inline }</style>

_sass/minimal-mistakes-plus.scss

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,16 @@ blockquote {
1111
word-break: break-word;
1212
}
1313

14-
.task-list-item label {
15-
display: inline
14+
.preview {
15+
top: 0;
16+
z-index: 999;
17+
padding: 0.4em;
18+
position: sticky;
19+
margin: 0 !important;
1620
}
1721

18-
.m0 {
19-
margin: 0 !important;
22+
table.setting-multi-radio td {
23+
border: 0;
24+
text-align: center;
25+
border-left: 1px solid mix(#000, $border-color, 25%);
2026
}

assets/js/settings.js

Lines changed: 28 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,36 @@
11
---
22
layout: null
33
---
4-
(function (global) {
5-
var PREFIX = "HMCL_DOCS_SETTINGS_";
6-
var data = {};
7-
var events = {};
8-
var config = /*{%comment%}*/{}/*{%endcomment%}*//**{{'/'}}{{ site.data.settings | jsonify }}/**/;
9-
10-
global.addEventListener("storage", function (event) {
11-
if (!event.key) return;
12-
if (event.key.indexOf(PREFIX) !== 0) return;
13-
14-
var handlers = events[event.key];
15-
if (!handlers) return;
16-
17-
var newValue = event.newValue;
18-
var oldValue = event.oldValue;
19-
if (oldValue === newValue) return;
20-
21-
data[event.key] = newValue;
22-
for (var i = 0; i < handlers.length; i++) {
23-
if (typeof handlers[i] === "function") {
24-
handlers[i](newValue, oldValue);
25-
}
4+
(function () {
5+
const PREFIX = "HMCL_DOCS_SETTINGS_", data = {}, bus = new EventTarget(), configs = /*{%comment%}*/{}/*{%endcomment%}*/ /**{{'/'}}{{ site.data.settings | jsonify }}/**/;
6+
window.addEventListener("storage", ({ key, newValue }) => key !== null && key.startsWith(PREFIX) && newValue !== data[key] && bus.dispatchEvent(new CustomEvent(key, { detail: (data[key] = newValue) })));
7+
for (const [key, config] of Object.entries(configs)) {
8+
if (config.children === undefined) continue;
9+
for (const [childKey, child] of Object.entries(config.children)) {
10+
configs[`${key}.${childKey}`] = { ...config, ...child };
2611
}
27-
});
28-
29-
var settings = {
30-
set: function (key, value) {
31-
if (config[key] === undefined) return;
32-
var strKey = (PREFIX + key).toUpperCase();
33-
var newValue = value + "";
34-
data[strKey] = newValue;
35-
localStorage.setItem(strKey, newValue);
36-
var handlers = events[strKey];
37-
if (!handlers) return;
38-
39-
for (var i = 0; i < handlers.length; i++) {
40-
if (typeof handlers[i] === "function") {
41-
handlers[i](newValue);
42-
}
43-
}
12+
}
13+
const formatKey = (key) => PREFIX + key.toUpperCase().replaceAll(".", "_");
14+
window.settings = {
15+
set(key, value) {
16+
const name = formatKey(key);
17+
localStorage.setItem(name, (data[name] = String(value)));
18+
bus.dispatchEvent(new CustomEvent(name, { detail: data[name] }));
4419
},
45-
46-
get: function (key, defaultValue) {
47-
if (config[key] === undefined) return;
48-
var strKey = (PREFIX + key).toUpperCase();
49-
data.hasOwnProperty(strKey) || (data[strKey] = localStorage.getItem(strKey));
50-
if (typeof defaultValue === "string" && data[strKey] === null) {
51-
return defaultValue;
52-
}
53-
return data[strKey];
20+
get(key) {
21+
const name = formatKey(key);
22+
if (data[name] !== undefined) return data[name];
23+
const value = localStorage.getItem(name);
24+
if (value !== null) return data[name] = value;
25+
const config = configs[key];
26+
if (config === undefined || typeof config.default !== "string") return null;
27+
return config.default;
5428
},
55-
56-
refresh: function (key) {
57-
if (config[key] === undefined) return;
58-
settings.set(key, settings.get(key, config[key].default));
29+
onChange(key, handler) {
30+
const value = this.get(key);
31+
if (value === null) return;
32+
handler(value);
33+
bus.addEventListener(formatKey(key), (event) => handler(event.detail));
5934
},
60-
61-
onChange: function (key, handler) {
62-
if (config[key] === undefined) return;
63-
if (typeof handler !== "function") return;
64-
var strKey = (PREFIX + key).toUpperCase();
65-
if (config[key].type === "radio") {
66-
handler(settings.get(key, config[key].default));
67-
}
68-
if (!events[strKey]) {
69-
events[strKey] = [handler];
70-
} else {
71-
events[strKey].push(handler);
72-
}
73-
}
7435
};
75-
global.settings = settings;
76-
})(window);
36+
})();

assets/js/theme.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@ layout: null
44
window.addEventListener("DOMContentLoaded", function () {
55
var skinLink = document.getElementById("skin");
66
var darkModeQuery = window.matchMedia("(prefers-color-scheme: dark)");
7+
function applySkin(skin) {
8+
skinLink.href = "{{ '/assets/css/skins/' | relative_url }}" + skin + ".css";
9+
}
710
function applyDarkSkin() {
8-
skinLink.href = "{{ '/assets/css/skins/' | relative_url }}" + settings.get("appearance_skin_dark", "dark") + ".css";
11+
applySkin(settings.get("appearance_skin.dark"));
912
}
1013
function applyLightSkin() {
11-
skinLink.href = "{{ '/assets/css/skins/' | relative_url }}" + settings.get("appearance_skin_light", "default") + ".css";
14+
applySkin(settings.get("appearance_skin.light"));
1215
}
1316
function autoSchemeHandler() {
1417
if (darkModeQuery.matches) {
@@ -61,10 +64,15 @@ window.addEventListener("DOMContentLoaded", function () {
6164
}
6265
}
6366
settings.onChange("appearance_color", applyTheme);
64-
settings.onChange("appearance_skin_dark", function () {
65-
settings.refresh("appearance_color");
67+
settings.onChange("appearance_skin.dark", function () {
68+
applyTheme(settings.get("appearance_color"));
69+
});
70+
settings.onChange("appearance_skin.light", function () {
71+
applyTheme(settings.get("appearance_color"));
6672
});
67-
settings.onChange("appearance_skin_light", function () {
68-
settings.refresh("appearance_color");
73+
settings.onChange("appearance_color_switcher", function (value) {
74+
if (modeSwitcher !== null) {
75+
modeSwitcher.style.display = value === "enable" ? "" : "none";
76+
}
6977
});
7078
});

settings.yaml

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,18 @@ data:
1212
light: 亮色
1313
dark: 暗色
1414
auto: 自动
15-
appearance_skin_light:
16-
title: 亮色皮肤
17-
description: 亮色模式下应用的皮肤
15+
appearance_color_switcher:
16+
title: 颜色模式快捷开关
17+
description: 用于快捷切换站点主题颜色模式的开关,位于页面右上角
1818
options:
19-
default: 默认 (Default)
20-
air: 天空 (Air)
21-
aqua: 水蓝 (Aque)
22-
contrast: 高对比 (Contrast)
23-
dark: 暗色 (Dark)
24-
dirt: 泥土 (Dirt)
25-
neon: 霓虹 (Neno)
26-
mint: 薄荷 (Mint)
27-
plum: 梅紫 (Plum)
28-
sunrise: 日出 (Sunrise)
29-
catppuccin_latte: Catppuccin Latte
30-
catppuccin_mocha: Catppuccin Mocha
31-
appearance_skin_dark:
32-
title: 暗色皮肤
33-
description: 暗色模式下应用的皮肤。
19+
enable: 启用
20+
disable: 禁用
21+
appearance_skin:
22+
title: 皮肤
23+
description: 各颜色模式下应用的皮肤。
24+
children:
25+
light: 亮色
26+
dark: 暗色
3427
options:
3528
default: 默认 (Default)
3629
air: 天空 (Air)

0 commit comments

Comments
 (0)