mirror of
https://gitee.com/huanghongxun/HMCL-docs.git
synced 2025-12-16 04:52:40 +08:00
添加设置页 (#362)
This commit is contained in:
parent
76862e28a7
commit
5c4d02c89e
@ -139,8 +139,6 @@ defaults:
|
|||||||
|
|
||||||
# Theme Settings
|
# Theme Settings
|
||||||
theme: minimal-mistakes-jekyll
|
theme: minimal-mistakes-jekyll
|
||||||
minimal_mistakes_skin: default # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise"
|
|
||||||
minimal_mistakes_skin_dark: dark
|
|
||||||
|
|
||||||
# Site Settings
|
# Site Settings
|
||||||
locale: zh
|
locale: zh
|
||||||
@ -309,6 +307,7 @@ compress_html:
|
|||||||
envs: development
|
envs: development
|
||||||
|
|
||||||
head_scripts:
|
head_scripts:
|
||||||
|
- /assets/js/settings.js
|
||||||
- /assets/js/theme.js
|
- /assets/js/theme.js
|
||||||
after_footer_scripts:
|
after_footer_scripts:
|
||||||
- /assets/js/plugins/jquery.auto-redirect.js
|
- /assets/js/plugins/jquery.auto-redirect.js
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
main:
|
main:
|
||||||
- title: 常见问题
|
- title: 常见问题
|
||||||
url: /faq.html
|
url: /faq.html
|
||||||
|
- title: 设置
|
||||||
|
url: /settings.html
|
||||||
|
|
||||||
docs:
|
docs:
|
||||||
- title: 问题集合
|
- title: 问题集合
|
||||||
|
|||||||
35
_data/settings.yaml
Normal file
35
_data/settings.yaml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
appearance_color:
|
||||||
|
type: radio
|
||||||
|
default: light
|
||||||
|
options:
|
||||||
|
- light
|
||||||
|
- dark
|
||||||
|
- auto
|
||||||
|
appearance_skin_light:
|
||||||
|
type: radio
|
||||||
|
default: default
|
||||||
|
options:
|
||||||
|
- default
|
||||||
|
- air
|
||||||
|
- aqua
|
||||||
|
- contrast
|
||||||
|
- dark
|
||||||
|
- dirt
|
||||||
|
- neon
|
||||||
|
- mint
|
||||||
|
- plum
|
||||||
|
- sunrise
|
||||||
|
appearance_skin_dark:
|
||||||
|
type: radio
|
||||||
|
default: dark
|
||||||
|
options:
|
||||||
|
- default
|
||||||
|
- air
|
||||||
|
- aqua
|
||||||
|
- contrast
|
||||||
|
- dark
|
||||||
|
- dirt
|
||||||
|
- neon
|
||||||
|
- mint
|
||||||
|
- plum
|
||||||
|
- sunrise
|
||||||
@ -1 +1,2 @@
|
|||||||
<link rel="shortcut icon" href="{{ '/favicon.ico' | relative_url }}">
|
<link rel="shortcut icon" href="{{ '/favicon.ico' | relative_url }}">
|
||||||
|
<link rel="stylesheet" id="skin">
|
||||||
|
|||||||
46
_layouts/settings.html
Normal file
46
_layouts/settings.html
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
layout: document
|
||||||
|
---
|
||||||
|
|
||||||
|
{% for group in page.data %}
|
||||||
|
|
||||||
|
{% capture notice %}
|
||||||
|
|
||||||
|
## {{ group.title }}
|
||||||
|
|
||||||
|
{% for pair in group.settings %}
|
||||||
|
{% assign name = pair[0] %}
|
||||||
|
{% assign value = pair[1] %}
|
||||||
|
{% assign setting = site.data.settings[name] %}
|
||||||
|
|
||||||
|
{% if setting.type == 'radio' %}
|
||||||
|
<div class="notice">
|
||||||
|
<ul class="task-list">
|
||||||
|
<li><strong>{{ value.title }}</strong></li>
|
||||||
|
<li>{{ value.description }}</li>
|
||||||
|
{% for option in setting.options %}
|
||||||
|
<li class="task-list-item">
|
||||||
|
<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>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
settings.onChange("{{ name }}", function (newValue, oldValue) {
|
||||||
|
var list = document.getElementsByName("{{ name }}");
|
||||||
|
for (var i = 0; i < list.length; i++) {
|
||||||
|
list[i].checked = list[i].value === newValue;
|
||||||
|
list[i].onchange = function () {
|
||||||
|
if (this.checked) {
|
||||||
|
settings.set(this.name, this.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endcapture %}
|
||||||
|
{{ notice | markdownify }}
|
||||||
|
{% endfor %}
|
||||||
@ -1,16 +1,24 @@
|
|||||||
@import "minimal-mistakes";
|
@import "minimal-mistakes";
|
||||||
|
|
||||||
blockquote {
|
blockquote {
|
||||||
margin-inline: 0;
|
margin-inline: 0;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
a, span, code, kbd, pre, em, strong, b, i {
|
* {
|
||||||
overflow-wrap: break-word;
|
overflow-wrap: break-word;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
.m0 {
|
.notice ul:first-child {
|
||||||
margin: 0 !important;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.task-list-item label {
|
||||||
|
display: inline
|
||||||
|
}
|
||||||
|
|
||||||
|
.m0 {
|
||||||
|
margin: 0 !important;
|
||||||
|
}
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
---
|
---
|
||||||
|
|
||||||
@charset "utf-8";
|
@charset "utf-8";
|
||||||
|
|
||||||
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||||
@import "minimal-mistakes/skins/{{ site.minimal_mistakes_skin | default: 'default' }}";
|
@import "minimal-mistakes/skins/default";
|
||||||
@import "minimal-mistakes-plus";
|
@import "minimal-mistakes-plus";
|
||||||
|
|||||||
8
assets/css/skins/air.scss
Normal file
8
assets/css/skins/air.scss
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
---
|
||||||
|
|
||||||
|
@charset "utf-8";
|
||||||
|
|
||||||
|
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||||
|
@import "minimal-mistakes/skins/air";
|
||||||
|
@import "minimal-mistakes-plus";
|
||||||
8
assets/css/skins/aqua.scss
Normal file
8
assets/css/skins/aqua.scss
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
---
|
||||||
|
|
||||||
|
@charset "utf-8";
|
||||||
|
|
||||||
|
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||||
|
@import "minimal-mistakes/skins/aqua";
|
||||||
|
@import "minimal-mistakes-plus";
|
||||||
8
assets/css/skins/contrast.scss
Normal file
8
assets/css/skins/contrast.scss
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
---
|
||||||
|
|
||||||
|
@charset "utf-8";
|
||||||
|
|
||||||
|
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||||
|
@import "minimal-mistakes/skins/contrast";
|
||||||
|
@import "minimal-mistakes-plus";
|
||||||
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
---
|
---
|
||||||
|
|
||||||
@charset "utf-8";
|
@charset "utf-8";
|
||||||
|
|
||||||
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||||
@import "minimal-mistakes/skins/{{ site.minimal_mistakes_skin_dark | default: 'dark' }}";
|
@import "minimal-mistakes/skins/dark";
|
||||||
@import "minimal-mistakes-plus";
|
@import "minimal-mistakes-plus";
|
||||||
2
assets/css/skins/default.scss
Normal file
2
assets/css/skins/default.scss
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
---
|
||||||
|
---
|
||||||
8
assets/css/skins/dirt.scss
Normal file
8
assets/css/skins/dirt.scss
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
---
|
||||||
|
|
||||||
|
@charset "utf-8";
|
||||||
|
|
||||||
|
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||||
|
@import "minimal-mistakes/skins/dirt";
|
||||||
|
@import "minimal-mistakes-plus";
|
||||||
8
assets/css/skins/mint.scss
Normal file
8
assets/css/skins/mint.scss
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
---
|
||||||
|
|
||||||
|
@charset "utf-8";
|
||||||
|
|
||||||
|
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||||
|
@import "minimal-mistakes/skins/mint";
|
||||||
|
@import "minimal-mistakes-plus";
|
||||||
8
assets/css/skins/neon.scss
Normal file
8
assets/css/skins/neon.scss
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
---
|
||||||
|
|
||||||
|
@charset "utf-8";
|
||||||
|
|
||||||
|
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||||
|
@import "minimal-mistakes/skins/neon";
|
||||||
|
@import "minimal-mistakes-plus";
|
||||||
8
assets/css/skins/plum.scss
Normal file
8
assets/css/skins/plum.scss
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
---
|
||||||
|
|
||||||
|
@charset "utf-8";
|
||||||
|
|
||||||
|
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||||
|
@import "minimal-mistakes/skins/plum";
|
||||||
|
@import "minimal-mistakes-plus";
|
||||||
8
assets/css/skins/sunrise.scss
Normal file
8
assets/css/skins/sunrise.scss
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
---
|
||||||
|
|
||||||
|
@charset "utf-8";
|
||||||
|
|
||||||
|
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||||
|
@import "minimal-mistakes/skins/sunrise";
|
||||||
|
@import "minimal-mistakes-plus";
|
||||||
76
assets/js/settings.js
Normal file
76
assets/js/settings.js
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
---
|
||||||
|
layout: null
|
||||||
|
---
|
||||||
|
(function (global) {
|
||||||
|
var PREFIX = "HMCL_DOCS_SETTINGS_";
|
||||||
|
var data = {};
|
||||||
|
var events = {};
|
||||||
|
var config = /*{%comment%}*/{}/*{%endcomment%}*//**{{'/'}}{{ site.data.settings | jsonify }}/**/;
|
||||||
|
|
||||||
|
global.addEventListener("storage", function (event) {
|
||||||
|
if (!event.key) return;
|
||||||
|
if (event.key.indexOf(PREFIX) !== 0) return;
|
||||||
|
|
||||||
|
var handlers = events[event.key];
|
||||||
|
if (!handlers) return;
|
||||||
|
|
||||||
|
var newValue = event.newValue;
|
||||||
|
var oldValue = event.oldValue;
|
||||||
|
if (oldValue === newValue) return;
|
||||||
|
|
||||||
|
data[event.key] = newValue;
|
||||||
|
for (var i = 0; i < handlers.length; i++) {
|
||||||
|
if (typeof handlers[i] === "function") {
|
||||||
|
handlers[i](newValue, oldValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var settings = {
|
||||||
|
set: function (key, value) {
|
||||||
|
if (config[key] === undefined) return;
|
||||||
|
var strKey = (PREFIX + key).toUpperCase();
|
||||||
|
var newValue = value + "";
|
||||||
|
data[strKey] = newValue;
|
||||||
|
localStorage.setItem(strKey, newValue);
|
||||||
|
var handlers = events[strKey];
|
||||||
|
if (!handlers) return;
|
||||||
|
|
||||||
|
for (var i = 0; i < handlers.length; i++) {
|
||||||
|
if (typeof handlers[i] === "function") {
|
||||||
|
handlers[i](newValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
get: function (key, defaultValue) {
|
||||||
|
if (config[key] === undefined) return;
|
||||||
|
var strKey = (PREFIX + key).toUpperCase();
|
||||||
|
data.hasOwnProperty(strKey) || (data[strKey] = localStorage.getItem(strKey));
|
||||||
|
if (typeof defaultValue === "string" && data[strKey] === null) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
return data[strKey];
|
||||||
|
},
|
||||||
|
|
||||||
|
refresh: function (key) {
|
||||||
|
if (config[key] === undefined) return;
|
||||||
|
settings.set(key, settings.get(key, config[key].default));
|
||||||
|
},
|
||||||
|
|
||||||
|
onChange: function (key, handler) {
|
||||||
|
if (config[key] === undefined) return;
|
||||||
|
if (typeof handler !== "function") return;
|
||||||
|
var strKey = (PREFIX + key).toUpperCase();
|
||||||
|
if (config[key].type === "radio") {
|
||||||
|
handler(settings.get(key, config[key].default));
|
||||||
|
}
|
||||||
|
if (!events[strKey]) {
|
||||||
|
events[strKey] = [handler];
|
||||||
|
} else {
|
||||||
|
events[strKey].push(handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
global.settings = settings;
|
||||||
|
})(window);
|
||||||
@ -1,45 +1,70 @@
|
|||||||
---
|
---
|
||||||
layout: null
|
layout: null
|
||||||
---
|
---
|
||||||
var darkTheme = document.createElement("link");
|
window.addEventListener("DOMContentLoaded", function () {
|
||||||
darkTheme.rel = "stylesheet alternate";
|
var skinLink = document.getElementById("skin");
|
||||||
darkTheme.href = "{{ '/assets/css/dark.css' | relative_url }}";
|
var darkModeQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
||||||
document.head.appendChild(darkTheme);
|
function applyDarkSkin() {
|
||||||
window.addEventListener("DOMContentLoaded", function () {
|
skinLink.href = "{{ '/assets/css/skins/' | relative_url }}" + settings.get("appearance_skin_dark", "dark") + ".css";
|
||||||
var list = document.querySelector(".masthead .visible-links");
|
}
|
||||||
if (!list) return;
|
function applyLightSkin() {
|
||||||
var mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
skinLink.href = "{{ '/assets/css/skins/' | relative_url }}" + settings.get("appearance_skin_light", "default") + ".css";
|
||||||
function handler() {
|
}
|
||||||
darkTheme.rel = mediaQuery.matches ? "stylesheet" : "stylesheet alternate";
|
function autoSchemeHandler() {
|
||||||
}
|
if (darkModeQuery.matches) {
|
||||||
var current = 0;
|
applyDarkSkin();
|
||||||
var modes = ["light", "dark", "auto"];
|
} else {
|
||||||
var modeNames = ["亮色", "暗色", "自动"];
|
applyLightSkin();
|
||||||
var switcher = document.createElement("a");
|
}
|
||||||
switcher.className = "masthead__menu-item";
|
}
|
||||||
switcher.innerText = modeNames[current];
|
var activeModeIndex = 0;
|
||||||
switcher.href = "javascript:;";
|
var modeKeys = ["light", "dark", "auto"];
|
||||||
switcher.onclick = function () {
|
var modeLabels = ["亮色", "暗色", "自动"];
|
||||||
themeApply(current + 1);
|
|
||||||
}
|
var menuList = document.querySelector(".masthead .visible-links");
|
||||||
list.appendChild(switcher);
|
var modeSwitcher = null;
|
||||||
function themeApply(index) {
|
if (menuList) {
|
||||||
index = (Number(index) || 0) % modes.length;
|
modeSwitcher = document.createElement("a");
|
||||||
if (index === current) return;
|
modeSwitcher.className = "masthead__menu-item";
|
||||||
if (modes[current] === "auto") mediaQuery.removeEventListener("change", handler);
|
modeSwitcher.textContent = modeLabels[activeModeIndex];
|
||||||
current = index;
|
modeSwitcher.href = "javascript:;";
|
||||||
var mode = modes[current];
|
modeSwitcher.onclick = function () {
|
||||||
switcher.innerText = modeNames[current];
|
var nextIndex = (activeModeIndex + 1) % modeKeys.length;
|
||||||
localStorage.setItem("theme", current);
|
settings.set("appearance_color", modeKeys[nextIndex]);
|
||||||
if (mode === "light") darkTheme.rel = "stylesheet alternate";
|
}
|
||||||
else if (mode === "dark") darkTheme.rel = "stylesheet";
|
menuList.appendChild(modeSwitcher);
|
||||||
else {
|
}
|
||||||
mediaQuery.addEventListener("change", handler);
|
function applyTheme(mode) {
|
||||||
handler();
|
var newIndex = modeKeys.indexOf(mode);
|
||||||
}
|
if (newIndex < 0) newIndex = 0;
|
||||||
}
|
|
||||||
themeApply(localStorage.getItem("theme"));
|
if (modeKeys[activeModeIndex] === "auto") {
|
||||||
window.addEventListener("storage", function (event) {
|
darkModeQuery.removeEventListener("change", autoSchemeHandler);
|
||||||
event.key === "theme" && themeApply(event.newValue);
|
}
|
||||||
});
|
|
||||||
});
|
activeModeIndex = newIndex;
|
||||||
|
var resolvedMode = modeKeys[activeModeIndex];
|
||||||
|
|
||||||
|
if (modeSwitcher) {
|
||||||
|
modeSwitcher.textContent = modeLabels[activeModeIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resolvedMode === "light") {
|
||||||
|
applyLightSkin();
|
||||||
|
}
|
||||||
|
else if (resolvedMode === "dark") {
|
||||||
|
applyDarkSkin();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
darkModeQuery.addEventListener("change", autoSchemeHandler);
|
||||||
|
autoSchemeHandler();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
settings.onChange("appearance_color", applyTheme);
|
||||||
|
settings.onChange("appearance_skin_dark", function () {
|
||||||
|
settings.refresh("appearance_color");
|
||||||
|
});
|
||||||
|
settings.onChange("appearance_skin_light", function () {
|
||||||
|
settings.refresh("appearance_color");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
43
settings.yaml
Normal file
43
settings.yaml
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
title: 设置
|
||||||
|
layout: settings
|
||||||
|
permalink: /settings.html
|
||||||
|
data:
|
||||||
|
- title: 外观
|
||||||
|
settings:
|
||||||
|
appearance_color:
|
||||||
|
title: 颜色模式
|
||||||
|
description: 用于切换站点主题颜色模式。
|
||||||
|
options:
|
||||||
|
light: 亮色
|
||||||
|
dark: 暗色
|
||||||
|
auto: 自动
|
||||||
|
appearance_skin_light:
|
||||||
|
title: 亮色皮肤
|
||||||
|
description: 亮色模式下应用的皮肤。
|
||||||
|
options:
|
||||||
|
default: 默认
|
||||||
|
air: 天空
|
||||||
|
aqua: 水蓝
|
||||||
|
contrast: 高对比
|
||||||
|
dark: 暗色
|
||||||
|
dirt: 泥土
|
||||||
|
neon: 霓虹
|
||||||
|
mint: 薄荷
|
||||||
|
plum: 梅紫
|
||||||
|
sunrise: 日出
|
||||||
|
appearance_skin_dark:
|
||||||
|
title: 暗色皮肤
|
||||||
|
description: 暗色模式下应用的皮肤。
|
||||||
|
options:
|
||||||
|
default: 默认
|
||||||
|
air: 天空
|
||||||
|
aqua: 水蓝
|
||||||
|
contrast: 高对比
|
||||||
|
dark: 暗色
|
||||||
|
dirt: 泥土
|
||||||
|
neon: 霓虹
|
||||||
|
mint: 薄荷
|
||||||
|
plum: 梅紫
|
||||||
|
sunrise: 日出
|
||||||
|
---
|
||||||
Loading…
Reference in New Issue
Block a user