/// #if !BROWSER import {ipcRenderer, shell} from "electron"; import * as path from "path"; /// #endif import {Constants} from "../constants"; import {exportLayout} from "../layout/util"; import * as Pickr from "@simonwep/pickr"; import {isBrowser} from "../util/functions"; import {fetchPost} from "../util/fetch"; import {loadAssets} from "../util/assets"; export const appearance = { element: undefined as Element, _genOptions(data: string[] | { label: string, name: string }[], key: string) { let html = ""; data.forEach((item: string | { label: string, name: string }) => { if (typeof item === "string") { html += ``; } else { html += ``; } }); return html; }, genHTML: () => { return `
${window.siyuan.languages.theme}
${window.siyuan.languages.appearance9}
${window.siyuan.languages.theme11}
${window.siyuan.languages.theme12}
${window.siyuan.languages.customEmoji}
${window.siyuan.languages.customEmojiTip}
${window.siyuan.languages.theme13} ${window.siyuan.config.appearance.mode === 0 ? window.siyuan.config.appearance.themeLight : window.siyuan.config.appearance.themeDark}
${window.siyuan.languages.theme14}
`; }, onGetcustomcss: (data: Record>) => { let customHTML = '
'; Object.keys(data).forEach((item) => { customHTML += `
${window.siyuan.languages[item]}
`; Object.keys(data[item]).forEach(subItem => { customHTML += `
${window.siyuan.languages[subItem]}
`; }); }); appearance.element.querySelector("#appearanceCustomPanel").innerHTML = customHTML; const pickrs: Record> = {}; appearance.element.querySelectorAll("#appearanceCustomPanel .colorPicker").forEach((item: HTMLInputElement) => { // @ts-ignore const pickr = Pickr.create({ container: "#appearanceCustomPanel", el: item, theme: "nano", default: item.getAttribute("data-value"), comparison: false, components: { preview: true, opacity: true, hue: true, interaction: { input: true, } } }); pickr.on("hide", () => { appearance._sendCustomcss(pickrs); }); pickr.on("changestop", () => { appearance._sendCustomcss(pickrs); }); const key = item.getAttribute("data-key"); if (!pickrs[key]) { pickrs[key] = {}; } pickrs[key][item.getAttribute("data-subkey")] = pickr; }); }, _sendCustomcss: (pickrs: Record>) => { const css: Record> = {}; Object.keys(pickrs).forEach((item) => { css[item] = {}; Object.keys(pickrs[item]).forEach(subItem => { css[item][subItem] = pickrs[item][subItem].getColor().toRGBA().toString(0); }); }); fetchPost("/api/setting/setCustomCSS", { theme: appearance.element.querySelector("#appearanceCustomName").textContent, css }); }, _send: (mode?: number) => { const themeLight = (appearance.element.querySelector("#themeLight") as HTMLSelectElement).value; const themeDark = (appearance.element.querySelector("#themeDark") as HTMLSelectElement).value; const modeNumber = typeof mode === "number" ? mode : parseInt((appearance.element.querySelector("#mode") as HTMLSelectElement).value); fetchPost("/api/setting/setAppearance", { icon: (appearance.element.querySelector("#icon") as HTMLSelectElement).value, mode: modeNumber, codeBlockThemeDark: (appearance.element.querySelector("#codeBlockThemeDark") as HTMLSelectElement).value, codeBlockThemeLight: (appearance.element.querySelector("#codeBlockThemeLight") as HTMLSelectElement).value, themeDark, themeLight, darkThemes: window.siyuan.config.appearance.darkThemes, lightThemes: window.siyuan.config.appearance.lightThemes, icons: window.siyuan.config.appearance.icons, lang: (appearance.element.querySelector("#lang") as HTMLSelectElement).value, customCSS: window.siyuan.config.appearance.customCSS, closeButtonBehavior: (appearance.element.querySelector("#closeButtonBehavior") as HTMLInputElement).checked ? 1 : 0, nativeEmoji: (appearance.element.querySelector("#nativeEmoji") as HTMLInputElement).checked, hideStatusBar: (appearance.element.querySelector("#hideStatusBar") as HTMLInputElement).checked, }, response => { let needTip = false; if (modeNumber !== window.siyuan.config.appearance.mode || themeLight !== window.siyuan.config.appearance.themeLight || themeDark !== window.siyuan.config.appearance.themeDark) { needTip = true; } if (window.siyuan.config.appearance.themeJS && needTip) { exportLayout(true); return; } appearance.onSetappearance(response.data); }); }, bindEvent: () => { if (window.siyuan.config.appearance.customCSS) { fetchPost("/api/setting/getCustomCSS", { theme: appearance.element.querySelector("#appearanceCustomName").textContent }, response => { appearance.onGetcustomcss(response.data); }); } const appearanceCustomElement = appearance.element.querySelector("#appearanceCustom"); appearanceCustomElement.addEventListener("click", () => { if (window.siyuan.config.appearance.customCSS) { window.siyuan.config.appearance.customCSS = false; appearanceCustomElement.textContent = window.siyuan.languages.open; appearance.element.querySelector("#appearanceCustomPanel").innerHTML = ""; } else { window.siyuan.config.appearance.customCSS = true; fetchPost("/api/setting/getCustomCSS", { theme: appearance.element.querySelector("#appearanceCustomName").textContent }, response => { appearance.onGetcustomcss(response.data); }); appearanceCustomElement.textContent = window.siyuan.languages.close; } appearance._send(); }); appearance.element.querySelector("#resetLayout").addEventListener("click", () => { fetchPost("/api/system/setUILayout", {layout: {}}, () => { window.location.reload(); }); }); /// #if !BROWSER appearance.element.querySelector("#appearanceOpenIcon").addEventListener("click", () => { shell.openPath(path.join(window.siyuan.config.system.confDir, "appearance", "icons")); }); appearance.element.querySelector("#appearanceOpenTheme").addEventListener("click", () => { shell.openPath(path.join(window.siyuan.config.system.confDir, "appearance", "themes")); }); appearance.element.querySelector("#appearanceOpenEmoji").addEventListener("click", () => { shell.openPath(path.join(window.siyuan.config.system.dataDir, "emojis")); }); appearance.element.querySelector("#appearanceRefresh").addEventListener("click", () => { exportLayout(true); }); /// #endif appearance.element.querySelectorAll("select").forEach(item => { item.addEventListener("change", () => { let mode; if (item.id === "themeLight") { mode = 0; } else if (item.id === "themeDark") { mode = 1; } appearance._send(mode); }); }); appearance.element.querySelectorAll(".b3-switch").forEach((item) => { item.addEventListener("change", () => { appearance._send(); }); }); }, onSetappearance(data: IAppearance) { if (data.lang !== window.siyuan.config.appearance.lang || data.nativeEmoji !== window.siyuan.config.appearance.nativeEmoji) { exportLayout(true); return; } window.siyuan.config.appearance = data; if (appearance.element) { const theme = data.mode === 0 ? data.themeLight : data.themeDark; const modeElement = appearance.element.querySelector("#mode"); if (modeElement) { modeElement.innerHTML = ` `; appearance.element.querySelector("#appearanceCustomName").textContent = theme; } const themeLightElement = appearance.element.querySelector("#themeLight") as HTMLSelectElement; if (themeLightElement) { themeLightElement.value = data.themeLight; } const themeDarkElement = appearance.element.querySelector("#themeDark") as HTMLSelectElement; if (themeDarkElement) { themeDarkElement.value = data.themeDark; } const iconElement = appearance.element.querySelector("#icon") as HTMLSelectElement; if (iconElement) { iconElement.value = data.icon; } if (data.customCSS) { fetchPost("/api/setting/getCustomCSS", { theme }, response => { appearance.onGetcustomcss(response.data); }); } } /// #if !BROWSER ipcRenderer.send(Constants.SIYUAN_CONFIG_THEME, data.mode === 1 ? "dark" : "light"); ipcRenderer.send(Constants.SIYUAN_CONFIG_CLOSE, data.closeButtonBehavior); /// #endif loadAssets(data); const modeElement = document.getElementById("barThemeMode"); if (modeElement) { if (data.mode === 1) { modeElement.classList.add("toolbar__item--active"); modeElement.setAttribute("aria-label", window.siyuan.languages.themeLight); } else { modeElement.classList.remove("toolbar__item--active"); modeElement.setAttribute("aria-label", window.siyuan.languages.themeDark); } } } };