From dff760a7f11afdfec374951c3a0c1b5ce420b5ed Mon Sep 17 00:00:00 2001
From: Johannes Loher <johannes.loher@fg4f.de>
Date: Thu, 8 Jul 2021 23:25:00 +0200
Subject: [PATCH] preload fonts so that when first opening an actor / item
 sheet, they are already available and the sheet is rendered faster

---
 src/module/fonts.ts      | 37 +++++++++++++++++++++++++++++++++++++
 src/module/hooks/init.ts |  2 ++
 2 files changed, 39 insertions(+)
 create mode 100644 src/module/fonts.ts

diff --git a/src/module/fonts.ts b/src/module/fonts.ts
new file mode 100644
index 0000000..a468080
--- /dev/null
+++ b/src/module/fonts.ts
@@ -0,0 +1,37 @@
+type CSSOMString = string;
+type FontFaceLoadStatus = "unloaded" | "loading" | "loaded" | "error";
+type FontFaceSetStatus = "loading" | "loaded";
+
+interface FontFace {
+    family: CSSOMString;
+    style: CSSOMString;
+    weight: CSSOMString;
+    stretch: CSSOMString;
+    unicodeRange: CSSOMString;
+    variant: CSSOMString;
+    featureSettings: CSSOMString;
+    variationSettings: CSSOMString;
+    display: CSSOMString;
+    readonly status: FontFaceLoadStatus;
+    readonly loaded: Promise<FontFace>;
+    load(): Promise<FontFace>;
+}
+
+interface FontFaceSet {
+    readonly status: FontFaceSetStatus;
+    readonly ready: Promise<FontFaceSet>;
+    check(font: string, text?: string): boolean;
+    load(font: string, text?: string): Promise<FontFace[]>;
+}
+
+declare global {
+    interface Document {
+        fonts: FontFaceSet;
+    }
+}
+
+const fonts = ["Lora", "Wood Stamp"];
+
+export async function preloadFonts() {
+    return Promise.all(fonts.map((font) => document.fonts.load(`1rem ${font}`)));
+}
diff --git a/src/module/hooks/init.ts b/src/module/hooks/init.ts
index c7b1edc..8db11fe 100644
--- a/src/module/hooks/init.ts
+++ b/src/module/hooks/init.ts
@@ -8,6 +8,7 @@ import { DS4Actor } from "../actor/actor";
 import { DS4CharacterActorSheet } from "../actor/sheets/character-sheet";
 import { DS4CreatureActorSheet } from "../actor/sheets/creature-sheet";
 import { DS4 } from "../config";
+import { preloadFonts as preloadFonts } from "../fonts";
 import registerHandlebarsHelpers from "../handlebars/handlebars-helpers";
 import registerHandlebarsPartials from "../handlebars/handlebars-partials";
 import { getGame } from "../helpers";
@@ -61,6 +62,7 @@ async function init() {
     Items.unregisterSheet("core", ItemSheet);
     Items.registerSheet("ds4", DS4ItemSheet, { makeDefault: true });
 
+    preloadFonts();
     await registerHandlebarsPartials();
     registerHandlebarsHelpers();
 }