diff --git a/apps/desktop/src/app/right-sidebar/terminal/use-terminal-session.ts b/apps/desktop/src/app/right-sidebar/terminal/use-terminal-session.ts index 1e0b5f93134..7c0f13da5c0 100644 --- a/apps/desktop/src/app/right-sidebar/terminal/use-terminal-session.ts +++ b/apps/desktop/src/app/right-sidebar/terminal/use-terminal-session.ts @@ -315,8 +315,11 @@ export function useTerminalSession({ cwd, onAddSelectionToChat }: UseTerminalSes allowTransparency: true, convertEol: true, cursorBlink: true, - fontFamily: "'SF Mono', 'Menlo', 'Cascadia Code', 'JetBrains Mono', monospace", + fontFamily: "'JetBrains Mono', 'Cascadia Code', 'SF Mono', Menlo, Consolas, monospace", fontSize: 11, + fontWeight: '400', + fontWeightBold: '700', + letterSpacing: 0, lineHeight: 1.12, // Full-screen TUIs (hermes --tui, vim) grab the mouse, so a plain drag // can't select — ⌥-drag (macOS) / Shift-drag (else) forces a native @@ -598,13 +601,13 @@ export function useTerminalSession({ cwd, onAddSelectionToChat }: UseTerminalSes startSession() } - const fonts = typeof document !== 'undefined' ? document.fonts : undefined + // fonts.ready settles only already-requested faces; bold/italic aren't asked + // for until styled output paints (past atlas init), so warm them up front. + const warm = document.fonts?.load + ? Promise.allSettled(['400', '700', 'italic 400'].map(v => document.fonts.load(`${v} 11px 'JetBrains Mono'`))) + : Promise.resolve() - if (fonts?.ready) { - void fonts.ready.then(mount, mount) - } else { - mount() - } + void warm.then(mount, mount) return () => { disposed = true diff --git a/apps/desktop/src/fonts/JetBrainsMono-Bold.woff2 b/apps/desktop/src/fonts/JetBrainsMono-Bold.woff2 new file mode 100644 index 00000000000..81c5a219dca Binary files /dev/null and b/apps/desktop/src/fonts/JetBrainsMono-Bold.woff2 differ diff --git a/apps/desktop/src/fonts/JetBrainsMono-Italic.woff2 b/apps/desktop/src/fonts/JetBrainsMono-Italic.woff2 new file mode 100644 index 00000000000..4103d391055 Binary files /dev/null and b/apps/desktop/src/fonts/JetBrainsMono-Italic.woff2 differ diff --git a/apps/desktop/src/fonts/JetBrainsMono-Regular.woff2 b/apps/desktop/src/fonts/JetBrainsMono-Regular.woff2 new file mode 100644 index 00000000000..66c54672c78 Binary files /dev/null and b/apps/desktop/src/fonts/JetBrainsMono-Regular.woff2 differ diff --git a/apps/desktop/src/styles.css b/apps/desktop/src/styles.css index 76b31331680..a73631d3609 100644 --- a/apps/desktop/src/styles.css +++ b/apps/desktop/src/styles.css @@ -17,6 +17,30 @@ src: url('../../../node_modules/@nous-research/ui/dist/fonts/Collapse-Bold.woff2') format('woff2'); } +/* JetBrains Mono — bundled terminal font (Apache-2.0) so bold/italic share the + regular face's metrics instead of squeezing against a system fallback. */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url('./fonts/JetBrainsMono-Regular.woff2') format('woff2'); +} +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url('./fonts/JetBrainsMono-Bold.woff2') format('woff2'); +} +@font-face { + font-family: 'JetBrains Mono'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url('./fonts/JetBrainsMono-Italic.woff2') format('woff2'); +} + @theme inline { --color-background: var(--dt-background); --color-foreground: var(--dt-foreground);