diff --git a/src/features/preferences/__snapshots__/navigation-to-terminal-preferences.test.ts.snap b/src/features/preferences/__snapshots__/navigation-to-terminal-preferences.test.ts.snap index 0fe8c4df2c..0c485b5f27 100644 --- a/src/features/preferences/__snapshots__/navigation-to-terminal-preferences.test.ts.snap +++ b/src/features/preferences/__snapshots__/navigation-to-terminal-preferences.test.ts.snap @@ -1141,7 +1141,7 @@ exports[`preferences - navigation to terminal preferences given in preferences, class="Select__single-value css-1dimb5e-singleValue" > RobotoMono diff --git a/src/features/preferences/renderer/preference-items/terminal/terminal-font-family/terminal-font-family.tsx b/src/features/preferences/renderer/preference-items/terminal/terminal-font-family/terminal-font-family.tsx index 14bc5efacd..7ff161862e 100644 --- a/src/features/preferences/renderer/preference-items/terminal/terminal-font-family/terminal-font-family.tsx +++ b/src/features/preferences/renderer/preference-items/terminal/terminal-font-family/terminal-font-family.tsx @@ -13,26 +13,29 @@ import { Select } from "../../../../../../renderer/components/select"; import type { Logger } from "../../../../../../common/logger"; import { action } from "mobx"; import loggerInjectable from "../../../../../../common/logger.injectable"; +import { + terminalFontsInjectable, +} from "../../../../../../renderer/components/dock/terminal/terminal-fonts.injectable"; interface Dependencies { userStore: UserStore; logger: Logger; + terminalFonts: Map; } const NonInjectedTerminalFontFamily = observer( - ({ userStore, logger }: Dependencies) => { - - // fonts must be declared in `fonts.scss` and at `template.html` (if early-preloading required) - const supportedCustomFonts: SelectOption[] = [ - "RobotoMono", "Anonymous Pro", "IBM Plex Mono", "JetBrains Mono", "Red Hat Mono", - "Source Code Pro", "Space Mono", "Ubuntu Mono", - ].map(customFont => { + ({ userStore, logger, terminalFonts }: Dependencies) => { + const bundledFonts: SelectOption[] = Array.from(terminalFonts.keys()).map(font => { const { fontFamily, fontSize } = userStore.terminalConfig; return { - label: {customFont}, - value: customFont, - isSelected: fontFamily === customFont, + label: ( + + {font} + + ), + value: font, + isSelected: fontFamily === font, }; }); @@ -50,7 +53,7 @@ const NonInjectedTerminalFontFamily = observer( themeName="lens" controlShouldRenderValue value={userStore.terminalConfig.fontFamily} - options={supportedCustomFonts} + options={bundledFonts} onChange={onFontFamilyChange as any} /> @@ -58,13 +61,10 @@ const NonInjectedTerminalFontFamily = observer( }, ); -export const TerminalFontFamily = withInjectables( - NonInjectedTerminalFontFamily, - - { - getProps: (di) => ({ - userStore: di.inject(userStoreInjectable), - logger: di.inject(loggerInjectable), - }), - }, -); +export const TerminalFontFamily = withInjectables(NonInjectedTerminalFontFamily, { + getProps: (di) => ({ + userStore: di.inject(userStoreInjectable), + logger: di.inject(loggerInjectable), + terminalFonts: di.inject(terminalFontsInjectable), + }), +}); diff --git a/src/renderer/components/app.scss b/src/renderer/components/app.scss index f44d1ee165..b8dd5007b1 100755 --- a/src/renderer/components/app.scss +++ b/src/renderer/components/app.scss @@ -232,22 +232,6 @@ iframe { } } -#fonts-preloading { - > span { - position: absolute; - visibility: hidden; - height: 0; - - &:before { - width: 0; - display: block; - overflow: hidden; - content: "text-example"; // some text required to start applying/rendering font in document - font-family: inherit; // font-family must be specified via style="" (see: template.html) - } - } -} - // app's common loading indicator, displaying on the route transitions #loading { position: absolute; diff --git a/src/renderer/components/dock/terminal/create-terminal.injectable.ts b/src/renderer/components/dock/terminal/create-terminal.injectable.ts index 27c7c0664a..2ff82e2c17 100644 --- a/src/renderer/components/dock/terminal/create-terminal.injectable.ts +++ b/src/renderer/components/dock/terminal/create-terminal.injectable.ts @@ -9,7 +9,8 @@ import type { TabId } from "../dock/store"; import type { TerminalApi } from "../../../api/terminal-api"; import terminalSpawningPoolInjectable from "./terminal-spawning-pool.injectable"; import terminalConfigInjectable from "../../../../common/user-store/terminal-config.injectable"; -import terminalCopyOnSelectInjectable from "../../../../common/user-store/terminal-copy-on-select.injectable"; +import terminalCopyOnSelectInjectable + from "../../../../common/user-store/terminal-copy-on-select.injectable"; import isMacInjectable from "../../../../common/vars/is-mac.injectable"; import openLinkInBrowserInjectable from "../../../../common/utils/open-link-in-browser.injectable"; import xtermColorThemeInjectable from "../../../themes/terminal-colors.injectable"; diff --git a/src/renderer/components/dock/terminal/terminal-fonts.global-override-for-injectable.ts b/src/renderer/components/dock/terminal/terminal-fonts.global-override-for-injectable.ts new file mode 100644 index 0000000000..eb549af384 --- /dev/null +++ b/src/renderer/components/dock/terminal/terminal-fonts.global-override-for-injectable.ts @@ -0,0 +1,14 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getGlobalOverride } from "../../../../common/test-utils/get-global-override"; +import { preloadAllTerminalFontsInjectable } from "./terminal-fonts.injectable"; + +export default getGlobalOverride(preloadAllTerminalFontsInjectable, () => { + return { + id: "", + async run() { + }, + }; +}); diff --git a/src/renderer/components/dock/terminal/terminal-fonts.injectable.ts b/src/renderer/components/dock/terminal/terminal-fonts.injectable.ts new file mode 100644 index 0000000000..1609f8b411 --- /dev/null +++ b/src/renderer/components/dock/terminal/terminal-fonts.injectable.ts @@ -0,0 +1,78 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getInjectable } from "@ogre-tools/injectable"; +import { beforeFrameStartsFirstInjectionToken } from "../../../before-frame-starts/tokens"; +import RobotoMono from "../../../fonts/Roboto-Mono-nerd.ttf"; // patched font with icons +import AnonymousPro from "../../../fonts/AnonymousPro-Regular.ttf"; +import IBMPlexMono from "../../../fonts/IBMPlexMono-Regular.ttf"; +import JetBrainsMono from "../../../fonts/JetBrainsMono-Regular.ttf"; +import RedHatMono from "../../../fonts/RedHatMono-Regular.ttf"; +import SourceCodePro from "../../../fonts/SourceCodePro-Regular.ttf"; +import SpaceMono from "../../../fonts/SpaceMono-Regular.ttf"; +import UbuntuMono from "../../../fonts/UbuntuMono-Regular.ttf"; + +export const terminalFontsInjectable = getInjectable({ + id: "terminalFontsInjectable", + + instantiate() { + return new Map([ + ["RobotoMono", RobotoMono], + ["Anonymous Pro", AnonymousPro], + ["IBM Plex Mono", IBMPlexMono], + ["JetBrains Mono", JetBrainsMono], + ["Red Hat Mono", RedHatMono], + ["Source Code Pro", SourceCodePro], + ["Space Mono", SpaceMono], + ["Ubuntu Mono", UbuntuMono], + ]); + }, +}); + + +export const preloadTerminalFontInjectable = getInjectable({ + id: "preloadTerminalFontInjectable", + + instantiate(di) { + const terminalFonts = di.inject(terminalFontsInjectable); + + return async function (fontFamily: string): Promise { + const fontBundledPath = terminalFonts.get(fontFamily); + const fontLoaded = document.fonts.check(`10px ${fontFamily}`); + + if (fontLoaded || !fontBundledPath) return; + + const font = new FontFace(fontFamily, `url(${fontBundledPath})`); + + document.fonts.add(font); + await font.load(); + }; + }, + + causesSideEffects: true, +}); + +export const preloadAllTerminalFontsInjectable = getInjectable({ + id: "preloadAllTerminalFontsInjectable", + + instantiate(di) { + const terminalFonts = di.inject(terminalFontsInjectable); + const preloadFont = di.inject(preloadTerminalFontInjectable); + + return { + id: "preload-all-terminal-fonts", + + async run() { + await Promise.allSettled( + Array.from(terminalFonts.keys()).map(preloadFont), + ); + }, + }; + }, + + injectionToken: beforeFrameStartsFirstInjectionToken, + + causesSideEffects: true, +}); diff --git a/src/renderer/components/fonts.scss b/src/renderer/components/fonts.scss index 40f9e9625b..ebbe2894dc 100644 --- a/src/renderer/components/fonts.scss +++ b/src/renderer/components/fonts.scss @@ -44,58 +44,3 @@ font-display: block; src: url("../fonts/MaterialIcons-Regular.ttf") format("truetype"); } - - -// Terminal fonts (monospaced) -// Source: https://fonts.google.com/?category=Monospace -@font-face { - font-family: "Anonymous Pro"; - src: local("Anonymous Pro"), url("../fonts/AnonymousPro-Regular.ttf") format("truetype"); - font-display: block; -} - -@font-face { - font-family: "IBM Plex Mono"; - src: local("IBM Plex Mono"), url("../fonts/IBMPlexMono-Regular.ttf") format("truetype"); - font-display: block; -} - -@font-face { - font-family: "JetBrains Mono"; - src: local("JetBrains Mono"), url("../fonts/JetBrainsMono-Regular.ttf") format("truetype"); - font-display: block; -} - -@font-face { - font-family: "Red Hat Mono"; - src: local("Red Hat Mono"), url("../fonts/RedHatMono-Regular.ttf") format("truetype"); - font-display: block; -} - - -@font-face { - font-family: "Source Code Pro"; - src: local("Source Code Pro"), url("../fonts/SourceCodePro-Regular.ttf") format("truetype"); - font-display: block; -} - -@font-face { - font-family: "Space Mono"; - src: local("Space Mono"), url("../fonts/SpaceMono-Regular.ttf") format("truetype"); - font-display: block; -} - -@font-face { - font-family: "Ubuntu Mono"; - src: local("Ubuntu Mono"), url("../fonts/UbuntuMono-Regular.ttf") format("truetype"); - font-display: block; -} - -// Patched RobotoMono font with icons -// RobotoMono Windows Compatible for using in terminal -// https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/RobotoMono -@font-face { - font-family: "RobotoMono"; - src: local("RobotoMono"), url("../fonts/Roboto-Mono-nerd.ttf") format("truetype"); - font-display: block; -} diff --git a/src/renderer/template.html b/src/renderer/template.html index 5860854d9a..87ea5dca3d 100755 --- a/src/renderer/template.html +++ b/src/renderer/template.html @@ -5,17 +5,6 @@
-
- - - - - - - - - -