diff --git a/css/main.css b/css/main.css
index 0ac6dc9c19dd36dbc14cf8a8cfa5b5b784c90fbc..a5f149cf054fc94bc50c87b6df3760b6c42acbc0 100644
--- a/css/main.css
+++ b/css/main.css
@@ -12,62 +12,60 @@
 body {
   display: flex;
   flex-flow: column wrap;
-  font-family: ui-sans-serif, sans-serif;
+  font-family: "Space Mono", ui-monospace, monospace, ui-sans-serif, sans-serif;
   -webkit-user-select: none; /* still needed for Safari 16 */
   user-select: none;
 }
 
 menu {
-  display: inline-block;
+  display: inline-flex;
   list-style-type: none;
   padding: 0;
   margin: 0;
 }
 
-header {
-  display: none;
-}
-
-#tailorbirdLogo {
-  --logosize-scalefactor: 1.5;
-  height: calc(102px / var(--logosize-scalefactor));
-  width: calc(334px / var(--logosize-scalefactor));
-}
-
-menu > li {
-  display: inline-block;
-}
-
 menu button {
   border-radius: 0.25rem;
-  background-color: #ccc;
+  background-color: var(--200-color);
   padding: 0.25rem 0.75rem;
   margin: 0 0.5rem;
-  border: 1.5px solid #ccc;
+  border: 1.5px solid var(--300-color);
   transition: 0.3s;
   cursor: pointer;
 }
+menu button.buttonRightFlat {
+  margin-right: 0;
+  border-right: none;
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+menu button.buttonLeftFlat {
+  margin-left: 0;
+  border-left: none;
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
 menu button:hover {
-  background-color: #bbb;
-  border-color: #7a7a7a;
+  background-color: var(--300-color);
+  border-color: var(--400-color);
 }
 menu button:active {
-  background-color: #999;
+  background-color: var(--400-color);
 }
 menu button:disabled {
-  color: #aaa;
+  color: var(--100-color);
 }
 menu.menu-impressum {
   padding-left: 1rem;
   font-size: 0.75rem;
-  vertical-align: bottom;
+  vertical-align: top;
 }
 menu.menu-impressum li:not(:last-child)::after {
   content: "\00B7";
 }
 menu.menu-impressum a {
   text-decoration: none;
-  color: #000;
+  color: black;
 }
 menu.menu-right {
   float: right;
@@ -80,7 +78,7 @@ main {
 }
 
 section {
-  outline: 2px solid black;
+  outline: 2px solid var(--400-color);
   display: flex;
   flex-direction: column;
   height: 100vh;
@@ -91,13 +89,14 @@ section#viewer {
 }
 
 article#viewer-settings {
-  background-color: #eee;
-  padding: 0.5rem 0 0 0.5rem;
-  outline: 2px solid black;
+  background: no-repeat url(img/icon.svg) var(--100-color);
+  margin: 0 1rem;
+  padding: 0.5rem 0 0 3rem;
+  outline: 2px solid var(--400-color);
 }
 
 section#tools {
-  background-color: #eee;
+  background-color: var(--100-color);
   flex: none; /* Equivalent to flex: 0 0 auto; */
 }
 
@@ -131,15 +130,15 @@ article#tools-list {
 }
 
 #list-commands {
-  background-color: #eee;
+  background-color: var(--100-color);
 }
 
 #list-commands > ul {
-  background-color: #bbb;
+  background-color: var(--200-color);
 }
 
 #list-commands > ul > ul {
-  background-color: #999;
+  background-color: var(--400-color);
 }
 
 #list-commands li {
@@ -150,17 +149,16 @@ article#tools-list {
 
 #list-commands li.selected {
   color: white;
-  background-color: darkslategray;
+  background-color: var(--sub-highlight-color);
 }
 
 #list-commands li:hover {
-  color: white;
-  background-color: darkgray;
+  background-color: var(--main-highlight-color);
 }
 
 #list-commands li.selected:hover {
   color: white;
-  background-color: darkslategray;
+  background-color: var(--sub-highlight-color);
 }
 
 article#tools-list-buttons {
diff --git a/index.html b/index.html
index 78d6160c5c68ece2e45843ef57e3badc23dc06c8..e1c70ada8e568a3cf3e52a51226c40c4cfad98f7 100644
--- a/index.html
+++ b/index.html
@@ -1,17 +1,27 @@
-<!DOCTYPE html><html lang="en"><head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>Tailorbird</title>
-  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
-<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
-<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
-<link rel="manifest" href="/site.webmanifest">
-<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5a6b5d">
-<meta name="apple-mobile-web-app-title" content="Tailorbird">
-<meta name="application-name" content="Tailorbird">
-<meta name="msapplication-TileColor" content="#e1e1e1">
-<meta name="theme-color" content="#e1e1e1"></head>
+    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
+    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
+    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
+    <link rel="manifest" href="/site.webmanifest" />
+    <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5a6b5d" />
+    <meta name="apple-mobile-web-app-title" content="Tailorbird" />
+    <meta name="application-name" content="Tailorbird" />
+    <meta name="msapplication-TileColor" content="#e1e1e1" />
+    <meta name="theme-color" content="#e1e1e1" />
+    <link rel="preconnect" href="https://fonts.googleapis.com" />
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
+    <link
+      href="https://fonts.googleapis.com/css2?family=Space+Mono&display=swap"
+      rel="stylesheet"
+    />
+  </head>
   <body>
     <div id="app"></div>
     <script type="module" src="/main.js"></script>
-</body></html>
\ No newline at end of file
+  </body>
+</html>
diff --git a/main.js b/main.js
index 44d2fae8789ceb84541bcc81c233fff11cd3c7cb..09a20b2ebb17ab48890ad86cbbb7fe74fb2cabcc 100644
--- a/main.js
+++ b/main.js
@@ -1,6 +1,6 @@
 import "normalize.css";
 import "./css/main.css";
-import tailorbirdLogo from "./img/logo-new.jpg";
+import tailorbirdLogo from "./img/icon.svg";
 
 // Zdog
 import * as Zdog from "zdog";
@@ -26,18 +26,16 @@ if (import.meta.env.VITE_APP_BRANCH == "dev") {
 document.querySelector("#app").innerHTML = `
 <main>
   <section id="viewer">
-    <article id="viewer-main">
-      <canvas class="zdog-canvas"></canvas>
-    </article>
     <article id="viewer-settings">
+      <!-- <img id="tailorbirdLogo" src="${tailorbirdLogo}" /> -->
       <menu>
         <li>
-          <button id="zoomIntoViewButton">
+          <button id="zoomIntoViewButton" class="buttonRightFlat">
             <i class="fa-solid fa-magnifying-glass-plus"></i>
           </button>
         </li>
         <li>
-          <button id="zoomOutViewButton">
+          <button id="zoomOutViewButton" class="buttonLeftFlat">
             <i class="fa-solid fa-magnifying-glass-minus"></i>
           </button>
         </li>
@@ -51,21 +49,15 @@ document.querySelector("#app").innerHTML = `
         <li>
           <a href="#" id="helpLink">About</a>
         </li>
-        <li>
-          <a href="mailto:yanagibashi@kg.rwth-aachen.de">Contact</a>
-        </li>
-        <li>
-          <a href="https://www.kg.rwth-aachen.de/cms/KG/Footer/Service/~vcyq/Impressum/">Impressum</a>
-        </li>
       </menu>
       <menu class="menu-right">
       <li>
-        <button id="saveProjectMenuButton">
+        <button id="saveProjectMenuButton" class="buttonRightFlat">
           <i class="fa-solid fa-floppy-disk"></i> Save
         </button>
       </li>
       <li>
-        <button id="loadProjectMenuButton">
+        <button id="loadProjectMenuButton" class="buttonLeftFlat">
           <i class="fa-solid fa-folder-open"></i> Load
         </button>
       </li>
@@ -81,9 +73,11 @@ document.querySelector("#app").innerHTML = `
         </li>
       </menu>
     </article>
+    <article id="viewer-main">
+      <canvas class="zdog-canvas"></canvas>
+    </article>
   </section>
   <section id="tools">
-    <img id="tailorbirdLogo" src="${tailorbirdLogo}" />
     <article id="tools-edit">
       <menu>
         <li>
@@ -131,11 +125,21 @@ document.querySelector("#app").innerHTML = `
     <li><i class="fa-solid fa-share fa-rotate-90"></i> <span class="helpControlText">Jump to: O</span></li>
    </ul>
   </p>
+  <p>
+  <ul>
+    <li>
+      <a href="mailto:yanagibashi@kg.rwth-aachen.de">Contact</a>
+    </li>
+    <li>
+      <a href="https://www.kg.rwth-aachen.de/cms/KG/Footer/Service/~vcyq/Impressum/">Impressum</a>
+    </li>
+    </ul>
+  </p>
   <form method="dialog">
     <menu>
-      <button value="example1">Load example 1</button>
-      <button value="example2">Load example 2</button>
-      <button value="cancel">Close</button>
+      <li><button value="example1">Load example 1</button></li>
+      <li><button value="example2">Load example 2</button></li>
+      <li><button value="cancel">Close</button></li>
     </menu>
   </form>
 </dialog>
diff --git a/package-lock.json b/package-lock.json
index baccc6fcfc8db32ec63bcd698b60c97142eed173..c9526f393538a6626c025e876a08e0dd057da438 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,7 +15,8 @@
         "zdog": "^1.1.3"
       },
       "devDependencies": {
-        "vite": "^4.0.0"
+        "vite": "^4.0.0",
+        "vite-plugin-webfont-dl": "^3.7.4"
       }
     },
     "node_modules/@esbuild/android-arm": {
@@ -384,6 +385,78 @@
       "resolved": "https://registry.npmjs.org/ajon/-/ajon-2.1.4.tgz",
       "integrity": "sha512-1ps1cw66hwwm3K9OkF+7T6nZX9V3KKAgpzKqqlRXW7G7mheBYjW8eea0T3kc9rleyqcilcvpJwhNwTMkCqN8CA=="
     },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "dev": true
+    },
+    "node_modules/axios": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
+      "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+      "dev": true,
+      "dependencies": {
+        "follow-redirects": "^1.15.0",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/clean-css": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz",
+      "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==",
+      "dev": true,
+      "dependencies": {
+        "source-map": "~0.6.0"
+      },
+      "engines": {
+        "node": ">= 10.0"
+      }
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dev": true,
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/esbuild": {
       "version": "0.17.18",
       "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz",
@@ -421,6 +494,65 @@
         "@esbuild/win32-x64": "0.17.18"
       }
     },
+    "node_modules/flat-cache": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+      "dev": true,
+      "dependencies": {
+        "flatted": "^3.1.0",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/flatted": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+      "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+      "dev": true
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.2",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dev": true,
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "dev": true
+    },
     "node_modules/fsevents": {
       "version": "2.3.2",
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
@@ -435,6 +567,75 @@
         "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
       }
     },
+    "node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "dev": true,
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "dev": true,
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dev": true,
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/nanoid": {
       "version": "3.3.6",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
@@ -458,6 +659,24 @@
       "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz",
       "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg=="
     },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dev": true,
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/picocolors": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@@ -492,6 +711,12 @@
         "node": "^10 || ^12 || >=14"
       }
     },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+      "dev": true
+    },
     "node_modules/rhaboo": {
       "version": "3.2.2",
       "resolved": "https://registry.npmjs.org/rhaboo/-/rhaboo-3.2.2.tgz",
@@ -500,6 +725,21 @@
         "ajon": "^2.0.0"
       }
     },
+    "node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/rollup": {
       "version": "3.21.5",
       "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.5.tgz",
@@ -516,6 +756,15 @@
         "fsevents": "~2.3.2"
       }
     },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/source-map-js": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
@@ -573,6 +822,27 @@
         }
       }
     },
+    "node_modules/vite-plugin-webfont-dl": {
+      "version": "3.7.4",
+      "resolved": "https://registry.npmjs.org/vite-plugin-webfont-dl/-/vite-plugin-webfont-dl-3.7.4.tgz",
+      "integrity": "sha512-cCvP4aMHevcug0KAPd8v0ll8eA7NqWOI7SQ/qKTshpb4Di18zsdo2Z/ECgZSrVd9UpJhCFVso52WgO+zM0sQeQ==",
+      "dev": true,
+      "dependencies": {
+        "axios": "^1.2",
+        "clean-css": "^5.3",
+        "flat-cache": "^3.0",
+        "picocolors": "^1.0"
+      },
+      "peerDependencies": {
+        "vite": "^2 || ^3 || ^4"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "dev": true
+    },
     "node_modules/zdog": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/zdog/-/zdog-1.1.3.tgz",
diff --git a/package.json b/package.json
index 8776bb8fb20360746751c34ee58b8a6a62a47aae..ad288a990ddc7c8eda81cffd8f2011abb9e219ba 100644
--- a/package.json
+++ b/package.json
@@ -30,6 +30,7 @@
     "zdog": "^1.1.3"
   },
   "devDependencies": {
-    "vite": "^4.0.0"
+    "vite": "^4.0.0",
+    "vite-plugin-webfont-dl": "^3.7.4"
   }
 }
diff --git a/vite.config.js b/vite.config.js
index 431d05d09a376068f129faee8109233134d7c4ad..a31b1655b8a6a77d57a84e36e7c114a270397d28 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -1,14 +1,24 @@
-import { defineConfig } from 'vite'
+import { defineConfig } from "vite";
 import * as child from "child_process";
+import webfontDownload from "vite-plugin-webfont-dl";
 
-const commitDate = new Date(child.execSync('git log -1 --format=%cI').toString().trimEnd()).toDateString();
-const branchName = child.execSync('git rev-parse --abbrev-ref HEAD').toString().trimEnd();
-const commitHash = child.execSync('git rev-parse --short HEAD').toString().trimEnd();
+const commitDate = new Date(
+  child.execSync("git log -1 --format=%cI").toString().trimEnd()
+).toDateString();
+const branchName = child
+  .execSync("git rev-parse --abbrev-ref HEAD")
+  .toString()
+  .trimEnd();
+const commitHash = child
+  .execSync("git rev-parse --short HEAD")
+  .toString()
+  .trimEnd();
 
 export default defineConfig({
-    define: {
-        'import.meta.env.VITE_APP_DATE': JSON.stringify(commitDate),
-        'import.meta.env.VITE_APP_BRANCH': JSON.stringify(branchName),
-        'import.meta.env.VITE_APP_HASH': JSON.stringify(commitHash),
-    }
-});
\ No newline at end of file
+  define: {
+    "import.meta.env.VITE_APP_DATE": JSON.stringify(commitDate),
+    "import.meta.env.VITE_APP_BRANCH": JSON.stringify(branchName),
+    "import.meta.env.VITE_APP_HASH": JSON.stringify(commitHash),
+  },
+  plugins: [webfontDownload()],
+});