merge: allow themes to specify a font (#230)

Closes #225
Closes #25
This commit is contained in:
Marie 2023-12-19 11:35:24 +01:00
commit cf3299312a
3 changed files with 54 additions and 2 deletions

View file

@ -106,8 +106,29 @@
//#region Theme //#region Theme
const theme = localStorage.getItem('theme'); const theme = localStorage.getItem('theme');
const themeFontFaceName = 'sharkey-theme-font-face';
if (theme) { if (theme) {
for (const [k, v] of Object.entries(JSON.parse(theme))) { let existingFontFace;
document.fonts.forEach((v,k,s)=>{if (v.family === themeFontFaceName) existingFontFace=v;});
if (existingFontFace) document.fonts.delete(existingFontFace);
const themeProps = JSON.parse(theme);
const fontFaceSrc = themeProps.fontFaceSrc;
const fontFaceOpts = themeProps.fontFaceOpts || {};
if (fontFaceSrc) {
const fontFace = new FontFace(
themeFontFaceName,
fontFaceSrc, fontFaceOpts || {},
);
document.fonts.add(fontFace);
fontFace.load().catch(
(failure) => {
console.log(failure)
}
);
}
for (const [k, v] of Object.entries(themeProps)) {
if (k.startsWith('font')) continue;
document.documentElement.style.setProperty(`--${k}`, v.toString()); document.documentElement.style.setProperty(`--${k}`, v.toString());
// HTMLの theme-color 適用 // HTMLの theme-color 適用

View file

@ -54,6 +54,8 @@ export const getBuiltinThemesRef = () => {
return builtinThemes; return builtinThemes;
}; };
const themeFontFaceName = 'sharkey-theme-font-face';
let timeout = null; let timeout = null;
export function applyTheme(theme: Theme, persist = true) { export function applyTheme(theme: Theme, persist = true) {
@ -84,7 +86,32 @@ export function applyTheme(theme: Theme, persist = true) {
} }
} }
let existingFontFace;
document.fonts.forEach(
(fontFace) => {
if (fontFace.family === themeFontFaceName) existingFontFace = fontFace;
},
);
if (existingFontFace) document.fonts.delete(existingFontFace);
const fontFaceSrc = props.fontFaceSrc;
const fontFaceOpts = props.fontFaceOpts || {};
if (fontFaceSrc) {
const fontFace = new FontFace(
themeFontFaceName,
fontFaceSrc, fontFaceOpts,
);
document.fonts.add(fontFace);
fontFace.load().catch(
(failure) => {
console.log(failure);
},
);
}
for (const [k, v] of Object.entries(props)) { for (const [k, v] of Object.entries(props)) {
if (k.startsWith('font')) continue;
document.documentElement.style.setProperty(`--${k}`, v.toString()); document.documentElement.style.setProperty(`--${k}`, v.toString());
} }
@ -128,6 +155,10 @@ function compile(theme: Theme): Record<string, string> {
for (const [k, v] of Object.entries(theme.props)) { for (const [k, v] of Object.entries(theme.props)) {
if (k.startsWith('$')) continue; // ignore const if (k.startsWith('$')) continue; // ignore const
if (k.startsWith('font')) { // font specs are different
props[k] = v;
continue;
}
props[k] = v.startsWith('"') ? v.replace(/^"\s*/, '') : genValue(getColor(v)); props[k] = v.startsWith('"') ? v.replace(/^"\s*/, '') : genValue(getColor(v));
} }

View file

@ -62,7 +62,7 @@ html {
accent-color: var(--accent); accent-color: var(--accent);
overflow: auto; overflow: auto;
overflow-wrap: break-word; overflow-wrap: break-word;
font-family: 'Lexend', 'Hiragino Maru Gothic Pro', "BIZ UDGothic", Roboto, HelveticaNeue, Arial, sans-serif; font-family: 'sharkey-theme-font-face', 'Lexend', 'Hiragino Maru Gothic Pro', "BIZ UDGothic", Roboto, HelveticaNeue, Arial, sans-serif;
font-size: 14px; font-size: 14px;
line-height: 1.35; line-height: 1.35;
text-size-adjust: 100%; text-size-adjust: 100%;