import type { Request, Response } from "express"; import optionService from "../../services/options.js"; import type { OptionMap } from "../../services/options_interface.js"; const SYSTEM_SANS_SERIF = [ "system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "Cantarell", "Ubuntu", "Noto Sans", "Helvetica", "Arial", "sans-serif", "Apple Color Emoji", "Segoe UI Emoji" ].join(","); const SYSTEM_MONOSPACE = ["ui-monospace", "SFMono-Regular", "SF Mono", "Consolas", "Source Code Pro", "Ubuntu Mono", "Menlo", "Liberation Mono", "monospace"].join(","); function getFontCss(req: Request, res: Response) { res.setHeader("Content-Type", "text/css"); if (!optionService.getOptionBool("overrideThemeFonts")) { res.send(""); return; } const optionsMap = optionService.getOptionMap(); // using body to be more specific than themes' :root let style = "body {"; style += getFontFamily(optionsMap); style += getFontSize(optionsMap); style += "}"; res.send(style); } function getFontFamily({ mainFontFamily, treeFontFamily, detailFontFamily, monospaceFontFamily }: OptionMap) { let style = ""; // System override if (mainFontFamily === "system") { mainFontFamily = SYSTEM_SANS_SERIF; } if (treeFontFamily === "system") { treeFontFamily = SYSTEM_SANS_SERIF; } if (detailFontFamily === "system") { detailFontFamily = SYSTEM_SANS_SERIF; } if (monospaceFontFamily === "system") { monospaceFontFamily = SYSTEM_MONOSPACE; } // Apply the font override if not using theme fonts. if (mainFontFamily !== "theme") { style += `--main-font-family: ${mainFontFamily};`; } if (treeFontFamily !== "theme") { style += `--tree-font-family: ${treeFontFamily};`; } if (detailFontFamily !== "theme") { style += `--detail-font-family: ${detailFontFamily};`; } if (monospaceFontFamily !== "theme") { style += `--monospace-font-family: ${monospaceFontFamily};`; } return style; } function getFontSize(optionsMap: OptionMap) { let style = ""; style += `--main-font-size: ${optionsMap.mainFontSize}%;`; style += `--tree-font-size: ${optionsMap.treeFontSize}%;`; style += `--detail-font-size: ${optionsMap.detailFontSize}%;`; style += `--monospace-font-size: ${optionsMap.monospaceFontSize}%;`; return style; } export default { getFontCss };