💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows - #1419

Merged
tiangolo merged 7 commits into
masterfrom
font
Nov 23, 2025
Merged

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows#1419
tiangolo merged 7 commits into
masterfrom
font

Conversation

@tiangolo

@tiangolotiangolo commented Nov 21, 2025

Copy link
Copy Markdown
Member

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows

To fix this (detected/reported by @svlandeg):

image

Description

The issue comes from the fact that Material for MkDocs uses the font "Roboto Mono" by default for code, and the termynal.css styles used the same.

But "Roboto Mono" doesn't include the "glyph" (the visual thing to represent a Unicode character) for the panels: horizontal lines, the corners, and the character .

So, the browser tries to use the next font in the font family. In Linux, it ends up in one that has the glyphs and they are indeed monospace so, it looks mostly good.

In Windows, the next font it finds that has the glyphs is not monospace or doesn't have the glyphs properly monospace (having the exact same width as all the other glyphs in the font), so it looks like unaligned.

Change the font

Changing the font to one that has the glyphs, like Fira Code, fixes most of the issues.

With Fira Code, it's the closest (Chrome on Windows):

image

Funny enough, on Chrome on Ubuntu (Linux), the same font, looks good:

image

So there's still something funky going on.

heavy right-pointing angle bracket ornament ()

After trying a lot of fonts, my conclusion is that almost no font manages to perfectly render the character in exactly monospace (with the exact same width as any other character). 😅 ...but it seems to only happen on Windows. 🤯

More strange yet is that running the same script in PowerShell shows the lines perfectly aligned, so there's a potential way for it to properly work, but when trying the theoretical default font of PowerShell, it still looked funky on the browser.

And it also looks funky in other places in Windows.

For example, copying the example in VS Code on Windows:

╭──────────────── Traceback (mostrecentcalllast) ────────────────╮
│ /home/user/code/superapp/main.py:5inmain │
│ │
│ 2 │
│ 3 │
│ 4defmain(name: str="morty"): │
│ ❱ 5print(name+3) │
│ 6 │
│ 7 │
│ 8if__name__=="__main__": │
│ │
│ ╭──── locals ────╮ │
│ │ name='morty' │ │
│ ╰────────────────╯ │
╰───────────────────────────────────────────────────────────────────╯
TypeError: canonlyconcatenatestr (not"int") tostr

...it also renders it a little smaller, so the last bar is also a little moved:

image

...and here on GitHub, showing that same snippet, on Windows it shows unaligned, on Ubuntu it shows fine.

So, there seems to be an issue with the glyph on Windows. Not even sure. (?) But for now this should at least make it look better.

2025-11-22 Update: Google Fonts missing glyphs

I discovered I can see the actual font used to render in the developer tools, in the "Computed" section, at the end:

image

So, it's rendering the with "Segoe UI Symbol" instead of Roboto Mono, or Fira Code.

This allowed me to keep debugging.

One weird thing is, in the web explorer for Google Fonts, Fira Code and other fonts show up as including that glyph most of the time, but from time to time they show up as not including it, that was strange.

It led me to this issue: google/fonts#4820

It seems the font files and glyphs shown on the web are not necessarily the same ones delivered through the CDN.

So, I went and tried downloading and using Fire Code directly, in regular and bold, downloading the files and serving them locally, and that worked. 🎉 (finally)

Each file is 100 KB. I didn't want to commit that to git if it was not fully necessary. I figured there was a way to load them from a different CDN, from the Fira Code GitHub repo. I used that.

And that finally did it. 🎉

💄 Use font 'Fira Code' to fix display of Rich panels
@github-actions

github-actionsBot commented Nov 21, 2025

Copy link
Copy Markdown
Contributor

@github-actionsgithub-actionsBot added the docs Improvements or additions to documentation label Nov 21, 2025

@svlandegsvlandeg left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use > instead of ?

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Yep, I tried that, and it works, but the problem is that these commands are copied as is from the terminal as HTML, so changing it manually wouldn't be sustainable for the long term. 🤔

@tiangolotiangolo changed the title 💄 Use font 'Fira Code' to fix display of Rich panels💄 Use font 'Fira Code' to fix display of Rich panels in docs in WindowsNov 22, 2025
@willmcgugan

Copy link
Copy Markdown

IIRC we had issues with Fira Code, but had more success with Roboto Mono. Windows in particular as it would break the monospace grid.

Textual serve renders terminals in a similar way, and we used "Roboto Mono", menlo, monospace;

There are also a bunch of CSS rules the impact font rendering. You might want to experiment with text-rendering. Setting that to "geometryPrecission" might help.

You may also want to self host your fonts, if you aren't already. We found that some browsers refused to load fonts from a CDN, which resulted in garbled terminals.

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Thanks Will!

I was able to figure it out, I added more details in the main description. In short, Google Fonts was not delivering font files with all the glyphs, even if they were shown on the web explorer. Changing the source seems to fix it. 🎉

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docsImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tiangolo@willmcgugan@svlandeg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows - #1419

Merged
tiangolo merged 7 commits into
masterfrom
font
Nov 23, 2025
Merged

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows#1419
tiangolo merged 7 commits into
masterfrom
font

Conversation

@tiangolo

@tiangolotiangolo commented Nov 21, 2025

Copy link
Copy Markdown
Member

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows

To fix this (detected/reported by @svlandeg):

image

Description

The issue comes from the fact that Material for MkDocs uses the font "Roboto Mono" by default for code, and the termynal.css styles used the same.

But "Roboto Mono" doesn't include the "glyph" (the visual thing to represent a Unicode character) for the panels: horizontal lines, the corners, and the character .

So, the browser tries to use the next font in the font family. In Linux, it ends up in one that has the glyphs and they are indeed monospace so, it looks mostly good.

In Windows, the next font it finds that has the glyphs is not monospace or doesn't have the glyphs properly monospace (having the exact same width as all the other glyphs in the font), so it looks like unaligned.

Change the font

Changing the font to one that has the glyphs, like Fira Code, fixes most of the issues.

With Fira Code, it's the closest (Chrome on Windows):

image

Funny enough, on Chrome on Ubuntu (Linux), the same font, looks good:

image

So there's still something funky going on.

heavy right-pointing angle bracket ornament ()

After trying a lot of fonts, my conclusion is that almost no font manages to perfectly render the character in exactly monospace (with the exact same width as any other character). 😅 ...but it seems to only happen on Windows. 🤯

More strange yet is that running the same script in PowerShell shows the lines perfectly aligned, so there's a potential way for it to properly work, but when trying the theoretical default font of PowerShell, it still looked funky on the browser.

And it also looks funky in other places in Windows.

For example, copying the example in VS Code on Windows:

╭──────────────── Traceback (mostrecentcalllast) ────────────────╮
│ /home/user/code/superapp/main.py:5inmain │
│ │
│ 2 │
│ 3 │
│ 4defmain(name: str="morty"): │
│ ❱ 5print(name+3) │
│ 6 │
│ 7 │
│ 8if__name__=="__main__": │
│ │
│ ╭──── locals ────╮ │
│ │ name='morty' │ │
│ ╰────────────────╯ │
╰───────────────────────────────────────────────────────────────────╯
TypeError: canonlyconcatenatestr (not"int") tostr

...it also renders it a little smaller, so the last bar is also a little moved:

image

...and here on GitHub, showing that same snippet, on Windows it shows unaligned, on Ubuntu it shows fine.

So, there seems to be an issue with the glyph on Windows. Not even sure. (?) But for now this should at least make it look better.

2025-11-22 Update: Google Fonts missing glyphs

I discovered I can see the actual font used to render in the developer tools, in the "Computed" section, at the end:

image

So, it's rendering the with "Segoe UI Symbol" instead of Roboto Mono, or Fira Code.

This allowed me to keep debugging.

One weird thing is, in the web explorer for Google Fonts, Fira Code and other fonts show up as including that glyph most of the time, but from time to time they show up as not including it, that was strange.

It led me to this issue: google/fonts#4820

It seems the font files and glyphs shown on the web are not necessarily the same ones delivered through the CDN.

So, I went and tried downloading and using Fire Code directly, in regular and bold, downloading the files and serving them locally, and that worked. 🎉 (finally)

Each file is 100 KB. I didn't want to commit that to git if it was not fully necessary. I figured there was a way to load them from a different CDN, from the Fira Code GitHub repo. I used that.

And that finally did it. 🎉

💄 Use font 'Fira Code' to fix display of Rich panels
@github-actions

github-actionsBot commented Nov 21, 2025

Copy link
Copy Markdown
Contributor

@github-actionsgithub-actionsBot added the docs Improvements or additions to documentation label Nov 21, 2025

@svlandegsvlandeg left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use > instead of ?

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Yep, I tried that, and it works, but the problem is that these commands are copied as is from the terminal as HTML, so changing it manually wouldn't be sustainable for the long term. 🤔

@tiangolotiangolo changed the title 💄 Use font 'Fira Code' to fix display of Rich panels💄 Use font 'Fira Code' to fix display of Rich panels in docs in WindowsNov 22, 2025
@willmcgugan

Copy link
Copy Markdown

IIRC we had issues with Fira Code, but had more success with Roboto Mono. Windows in particular as it would break the monospace grid.

Textual serve renders terminals in a similar way, and we used "Roboto Mono", menlo, monospace;

There are also a bunch of CSS rules the impact font rendering. You might want to experiment with text-rendering. Setting that to "geometryPrecission" might help.

You may also want to self host your fonts, if you aren't already. We found that some browsers refused to load fonts from a CDN, which resulted in garbled terminals.

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Thanks Will!

I was able to figure it out, I added more details in the main description. In short, Google Fonts was not delivering font files with all the glyphs, even if they were shown on the web explorer. Changing the source seems to fix it. 🎉

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docsImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tiangolo@willmcgugan@svlandeg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows - #1419

Merged
tiangolo merged 7 commits into
masterfrom
font
Nov 23, 2025
Merged

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows#1419
tiangolo merged 7 commits into
masterfrom
font

Conversation

@tiangolo

@tiangolotiangolo commented Nov 21, 2025

Copy link
Copy Markdown
Member

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows

To fix this (detected/reported by @svlandeg):

image

Description

The issue comes from the fact that Material for MkDocs uses the font "Roboto Mono" by default for code, and the termynal.css styles used the same.

But "Roboto Mono" doesn't include the "glyph" (the visual thing to represent a Unicode character) for the panels: horizontal lines, the corners, and the character .

So, the browser tries to use the next font in the font family. In Linux, it ends up in one that has the glyphs and they are indeed monospace so, it looks mostly good.

In Windows, the next font it finds that has the glyphs is not monospace or doesn't have the glyphs properly monospace (having the exact same width as all the other glyphs in the font), so it looks like unaligned.

Change the font

Changing the font to one that has the glyphs, like Fira Code, fixes most of the issues.

With Fira Code, it's the closest (Chrome on Windows):

image

Funny enough, on Chrome on Ubuntu (Linux), the same font, looks good:

image

So there's still something funky going on.

heavy right-pointing angle bracket ornament ()

After trying a lot of fonts, my conclusion is that almost no font manages to perfectly render the character in exactly monospace (with the exact same width as any other character). 😅 ...but it seems to only happen on Windows. 🤯

More strange yet is that running the same script in PowerShell shows the lines perfectly aligned, so there's a potential way for it to properly work, but when trying the theoretical default font of PowerShell, it still looked funky on the browser.

And it also looks funky in other places in Windows.

For example, copying the example in VS Code on Windows:

╭──────────────── Traceback (mostrecentcalllast) ────────────────╮
│ /home/user/code/superapp/main.py:5inmain │
│ │
│ 2 │
│ 3 │
│ 4defmain(name: str="morty"): │
│ ❱ 5print(name+3) │
│ 6 │
│ 7 │
│ 8if__name__=="__main__": │
│ │
│ ╭──── locals ────╮ │
│ │ name='morty' │ │
│ ╰────────────────╯ │
╰───────────────────────────────────────────────────────────────────╯
TypeError: canonlyconcatenatestr (not"int") tostr

...it also renders it a little smaller, so the last bar is also a little moved:

image

...and here on GitHub, showing that same snippet, on Windows it shows unaligned, on Ubuntu it shows fine.

So, there seems to be an issue with the glyph on Windows. Not even sure. (?) But for now this should at least make it look better.

2025-11-22 Update: Google Fonts missing glyphs

I discovered I can see the actual font used to render in the developer tools, in the "Computed" section, at the end:

image

So, it's rendering the with "Segoe UI Symbol" instead of Roboto Mono, or Fira Code.

This allowed me to keep debugging.

One weird thing is, in the web explorer for Google Fonts, Fira Code and other fonts show up as including that glyph most of the time, but from time to time they show up as not including it, that was strange.

It led me to this issue: google/fonts#4820

It seems the font files and glyphs shown on the web are not necessarily the same ones delivered through the CDN.

So, I went and tried downloading and using Fire Code directly, in regular and bold, downloading the files and serving them locally, and that worked. 🎉 (finally)

Each file is 100 KB. I didn't want to commit that to git if it was not fully necessary. I figured there was a way to load them from a different CDN, from the Fira Code GitHub repo. I used that.

And that finally did it. 🎉

💄 Use font 'Fira Code' to fix display of Rich panels
@github-actions

github-actionsBot commented Nov 21, 2025

Copy link
Copy Markdown
Contributor

@github-actionsgithub-actionsBot added the docs Improvements or additions to documentation label Nov 21, 2025

@svlandegsvlandeg left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use > instead of ?

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Yep, I tried that, and it works, but the problem is that these commands are copied as is from the terminal as HTML, so changing it manually wouldn't be sustainable for the long term. 🤔

@tiangolotiangolo changed the title 💄 Use font 'Fira Code' to fix display of Rich panels💄 Use font 'Fira Code' to fix display of Rich panels in docs in WindowsNov 22, 2025
@willmcgugan

Copy link
Copy Markdown

IIRC we had issues with Fira Code, but had more success with Roboto Mono. Windows in particular as it would break the monospace grid.

Textual serve renders terminals in a similar way, and we used "Roboto Mono", menlo, monospace;

There are also a bunch of CSS rules the impact font rendering. You might want to experiment with text-rendering. Setting that to "geometryPrecission" might help.

You may also want to self host your fonts, if you aren't already. We found that some browsers refused to load fonts from a CDN, which resulted in garbled terminals.

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Thanks Will!

I was able to figure it out, I added more details in the main description. In short, Google Fonts was not delivering font files with all the glyphs, even if they were shown on the web explorer. Changing the source seems to fix it. 🎉

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docsImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tiangolo@willmcgugan@svlandeg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows - #1419

Merged
tiangolo merged 7 commits into
masterfrom
font
Nov 23, 2025
Merged

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows#1419
tiangolo merged 7 commits into
masterfrom
font

Conversation

@tiangolo

@tiangolotiangolo commented Nov 21, 2025

Copy link
Copy Markdown
Member

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows

To fix this (detected/reported by @svlandeg):

image

Description

The issue comes from the fact that Material for MkDocs uses the font "Roboto Mono" by default for code, and the termynal.css styles used the same.

But "Roboto Mono" doesn't include the "glyph" (the visual thing to represent a Unicode character) for the panels: horizontal lines, the corners, and the character .

So, the browser tries to use the next font in the font family. In Linux, it ends up in one that has the glyphs and they are indeed monospace so, it looks mostly good.

In Windows, the next font it finds that has the glyphs is not monospace or doesn't have the glyphs properly monospace (having the exact same width as all the other glyphs in the font), so it looks like unaligned.

Change the font

Changing the font to one that has the glyphs, like Fira Code, fixes most of the issues.

With Fira Code, it's the closest (Chrome on Windows):

image

Funny enough, on Chrome on Ubuntu (Linux), the same font, looks good:

image

So there's still something funky going on.

heavy right-pointing angle bracket ornament ()

After trying a lot of fonts, my conclusion is that almost no font manages to perfectly render the character in exactly monospace (with the exact same width as any other character). 😅 ...but it seems to only happen on Windows. 🤯

More strange yet is that running the same script in PowerShell shows the lines perfectly aligned, so there's a potential way for it to properly work, but when trying the theoretical default font of PowerShell, it still looked funky on the browser.

And it also looks funky in other places in Windows.

For example, copying the example in VS Code on Windows:

╭──────────────── Traceback (mostrecentcalllast) ────────────────╮
│ /home/user/code/superapp/main.py:5inmain │
│ │
│ 2 │
│ 3 │
│ 4defmain(name: str="morty"): │
│ ❱ 5print(name+3) │
│ 6 │
│ 7 │
│ 8if__name__=="__main__": │
│ │
│ ╭──── locals ────╮ │
│ │ name='morty' │ │
│ ╰────────────────╯ │
╰───────────────────────────────────────────────────────────────────╯
TypeError: canonlyconcatenatestr (not"int") tostr

...it also renders it a little smaller, so the last bar is also a little moved:

image

...and here on GitHub, showing that same snippet, on Windows it shows unaligned, on Ubuntu it shows fine.

So, there seems to be an issue with the glyph on Windows. Not even sure. (?) But for now this should at least make it look better.

2025-11-22 Update: Google Fonts missing glyphs

I discovered I can see the actual font used to render in the developer tools, in the "Computed" section, at the end:

image

So, it's rendering the with "Segoe UI Symbol" instead of Roboto Mono, or Fira Code.

This allowed me to keep debugging.

One weird thing is, in the web explorer for Google Fonts, Fira Code and other fonts show up as including that glyph most of the time, but from time to time they show up as not including it, that was strange.

It led me to this issue: google/fonts#4820

It seems the font files and glyphs shown on the web are not necessarily the same ones delivered through the CDN.

So, I went and tried downloading and using Fire Code directly, in regular and bold, downloading the files and serving them locally, and that worked. 🎉 (finally)

Each file is 100 KB. I didn't want to commit that to git if it was not fully necessary. I figured there was a way to load them from a different CDN, from the Fira Code GitHub repo. I used that.

And that finally did it. 🎉

💄 Use font 'Fira Code' to fix display of Rich panels
@github-actions

github-actionsBot commented Nov 21, 2025

Copy link
Copy Markdown
Contributor

@github-actionsgithub-actionsBot added the docs Improvements or additions to documentation label Nov 21, 2025

@svlandegsvlandeg left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use > instead of ?

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Yep, I tried that, and it works, but the problem is that these commands are copied as is from the terminal as HTML, so changing it manually wouldn't be sustainable for the long term. 🤔

@tiangolotiangolo changed the title 💄 Use font 'Fira Code' to fix display of Rich panels💄 Use font 'Fira Code' to fix display of Rich panels in docs in WindowsNov 22, 2025
@willmcgugan

Copy link
Copy Markdown

IIRC we had issues with Fira Code, but had more success with Roboto Mono. Windows in particular as it would break the monospace grid.

Textual serve renders terminals in a similar way, and we used "Roboto Mono", menlo, monospace;

There are also a bunch of CSS rules the impact font rendering. You might want to experiment with text-rendering. Setting that to "geometryPrecission" might help.

You may also want to self host your fonts, if you aren't already. We found that some browsers refused to load fonts from a CDN, which resulted in garbled terminals.

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Thanks Will!

I was able to figure it out, I added more details in the main description. In short, Google Fonts was not delivering font files with all the glyphs, even if they were shown on the web explorer. Changing the source seems to fix it. 🎉

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docsImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tiangolo@willmcgugan@svlandeg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows - #1419

Merged
tiangolo merged 7 commits into
masterfrom
font
Nov 23, 2025
Merged

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows#1419
tiangolo merged 7 commits into
masterfrom
font

Conversation

@tiangolo

@tiangolotiangolo commented Nov 21, 2025

Copy link
Copy Markdown
Member

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows

To fix this (detected/reported by @svlandeg):

image

Description

The issue comes from the fact that Material for MkDocs uses the font "Roboto Mono" by default for code, and the termynal.css styles used the same.

But "Roboto Mono" doesn't include the "glyph" (the visual thing to represent a Unicode character) for the panels: horizontal lines, the corners, and the character .

So, the browser tries to use the next font in the font family. In Linux, it ends up in one that has the glyphs and they are indeed monospace so, it looks mostly good.

In Windows, the next font it finds that has the glyphs is not monospace or doesn't have the glyphs properly monospace (having the exact same width as all the other glyphs in the font), so it looks like unaligned.

Change the font

Changing the font to one that has the glyphs, like Fira Code, fixes most of the issues.

With Fira Code, it's the closest (Chrome on Windows):

image

Funny enough, on Chrome on Ubuntu (Linux), the same font, looks good:

image

So there's still something funky going on.

heavy right-pointing angle bracket ornament ()

After trying a lot of fonts, my conclusion is that almost no font manages to perfectly render the character in exactly monospace (with the exact same width as any other character). 😅 ...but it seems to only happen on Windows. 🤯

More strange yet is that running the same script in PowerShell shows the lines perfectly aligned, so there's a potential way for it to properly work, but when trying the theoretical default font of PowerShell, it still looked funky on the browser.

And it also looks funky in other places in Windows.

For example, copying the example in VS Code on Windows:

╭──────────────── Traceback (mostrecentcalllast) ────────────────╮
│ /home/user/code/superapp/main.py:5inmain │
│ │
│ 2 │
│ 3 │
│ 4defmain(name: str="morty"): │
│ ❱ 5print(name+3) │
│ 6 │
│ 7 │
│ 8if__name__=="__main__": │
│ │
│ ╭──── locals ────╮ │
│ │ name='morty' │ │
│ ╰────────────────╯ │
╰───────────────────────────────────────────────────────────────────╯
TypeError: canonlyconcatenatestr (not"int") tostr

...it also renders it a little smaller, so the last bar is also a little moved:

image

...and here on GitHub, showing that same snippet, on Windows it shows unaligned, on Ubuntu it shows fine.

So, there seems to be an issue with the glyph on Windows. Not even sure. (?) But for now this should at least make it look better.

2025-11-22 Update: Google Fonts missing glyphs

I discovered I can see the actual font used to render in the developer tools, in the "Computed" section, at the end:

image

So, it's rendering the with "Segoe UI Symbol" instead of Roboto Mono, or Fira Code.

This allowed me to keep debugging.

One weird thing is, in the web explorer for Google Fonts, Fira Code and other fonts show up as including that glyph most of the time, but from time to time they show up as not including it, that was strange.

It led me to this issue: google/fonts#4820

It seems the font files and glyphs shown on the web are not necessarily the same ones delivered through the CDN.

So, I went and tried downloading and using Fire Code directly, in regular and bold, downloading the files and serving them locally, and that worked. 🎉 (finally)

Each file is 100 KB. I didn't want to commit that to git if it was not fully necessary. I figured there was a way to load them from a different CDN, from the Fira Code GitHub repo. I used that.

And that finally did it. 🎉

💄 Use font 'Fira Code' to fix display of Rich panels
@github-actions

github-actionsBot commented Nov 21, 2025

Copy link
Copy Markdown
Contributor

@github-actionsgithub-actionsBot added the docs Improvements or additions to documentation label Nov 21, 2025

@svlandegsvlandeg left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use > instead of ?

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Yep, I tried that, and it works, but the problem is that these commands are copied as is from the terminal as HTML, so changing it manually wouldn't be sustainable for the long term. 🤔

@tiangolotiangolo changed the title 💄 Use font 'Fira Code' to fix display of Rich panels💄 Use font 'Fira Code' to fix display of Rich panels in docs in WindowsNov 22, 2025
@willmcgugan

Copy link
Copy Markdown

IIRC we had issues with Fira Code, but had more success with Roboto Mono. Windows in particular as it would break the monospace grid.

Textual serve renders terminals in a similar way, and we used "Roboto Mono", menlo, monospace;

There are also a bunch of CSS rules the impact font rendering. You might want to experiment with text-rendering. Setting that to "geometryPrecission" might help.

You may also want to self host your fonts, if you aren't already. We found that some browsers refused to load fonts from a CDN, which resulted in garbled terminals.

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Thanks Will!

I was able to figure it out, I added more details in the main description. In short, Google Fonts was not delivering font files with all the glyphs, even if they were shown on the web explorer. Changing the source seems to fix it. 🎉

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docsImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tiangolo@willmcgugan@svlandeg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows - #1419

Merged
tiangolo merged 7 commits into
masterfrom
font
Nov 23, 2025
Merged

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows#1419
tiangolo merged 7 commits into
masterfrom
font

Conversation

@tiangolo

@tiangolotiangolo commented Nov 21, 2025

Copy link
Copy Markdown
Member

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows

To fix this (detected/reported by @svlandeg):

image

Description

The issue comes from the fact that Material for MkDocs uses the font "Roboto Mono" by default for code, and the termynal.css styles used the same.

But "Roboto Mono" doesn't include the "glyph" (the visual thing to represent a Unicode character) for the panels: horizontal lines, the corners, and the character .

So, the browser tries to use the next font in the font family. In Linux, it ends up in one that has the glyphs and they are indeed monospace so, it looks mostly good.

In Windows, the next font it finds that has the glyphs is not monospace or doesn't have the glyphs properly monospace (having the exact same width as all the other glyphs in the font), so it looks like unaligned.

Change the font

Changing the font to one that has the glyphs, like Fira Code, fixes most of the issues.

With Fira Code, it's the closest (Chrome on Windows):

image

Funny enough, on Chrome on Ubuntu (Linux), the same font, looks good:

image

So there's still something funky going on.

heavy right-pointing angle bracket ornament ()

After trying a lot of fonts, my conclusion is that almost no font manages to perfectly render the character in exactly monospace (with the exact same width as any other character). 😅 ...but it seems to only happen on Windows. 🤯

More strange yet is that running the same script in PowerShell shows the lines perfectly aligned, so there's a potential way for it to properly work, but when trying the theoretical default font of PowerShell, it still looked funky on the browser.

And it also looks funky in other places in Windows.

For example, copying the example in VS Code on Windows:

╭──────────────── Traceback (mostrecentcalllast) ────────────────╮
│ /home/user/code/superapp/main.py:5inmain │
│ │
│ 2 │
│ 3 │
│ 4defmain(name: str="morty"): │
│ ❱ 5print(name+3) │
│ 6 │
│ 7 │
│ 8if__name__=="__main__": │
│ │
│ ╭──── locals ────╮ │
│ │ name='morty' │ │
│ ╰────────────────╯ │
╰───────────────────────────────────────────────────────────────────╯
TypeError: canonlyconcatenatestr (not"int") tostr

...it also renders it a little smaller, so the last bar is also a little moved:

image

...and here on GitHub, showing that same snippet, on Windows it shows unaligned, on Ubuntu it shows fine.

So, there seems to be an issue with the glyph on Windows. Not even sure. (?) But for now this should at least make it look better.

2025-11-22 Update: Google Fonts missing glyphs

I discovered I can see the actual font used to render in the developer tools, in the "Computed" section, at the end:

image

So, it's rendering the with "Segoe UI Symbol" instead of Roboto Mono, or Fira Code.

This allowed me to keep debugging.

One weird thing is, in the web explorer for Google Fonts, Fira Code and other fonts show up as including that glyph most of the time, but from time to time they show up as not including it, that was strange.

It led me to this issue: google/fonts#4820

It seems the font files and glyphs shown on the web are not necessarily the same ones delivered through the CDN.

So, I went and tried downloading and using Fire Code directly, in regular and bold, downloading the files and serving them locally, and that worked. 🎉 (finally)

Each file is 100 KB. I didn't want to commit that to git if it was not fully necessary. I figured there was a way to load them from a different CDN, from the Fira Code GitHub repo. I used that.

And that finally did it. 🎉

💄 Use font 'Fira Code' to fix display of Rich panels
@github-actions

github-actionsBot commented Nov 21, 2025

Copy link
Copy Markdown
Contributor

@github-actionsgithub-actionsBot added the docs Improvements or additions to documentation label Nov 21, 2025

@svlandegsvlandeg left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use > instead of ?

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Yep, I tried that, and it works, but the problem is that these commands are copied as is from the terminal as HTML, so changing it manually wouldn't be sustainable for the long term. 🤔

@tiangolotiangolo changed the title 💄 Use font 'Fira Code' to fix display of Rich panels💄 Use font 'Fira Code' to fix display of Rich panels in docs in WindowsNov 22, 2025
@willmcgugan

Copy link
Copy Markdown

IIRC we had issues with Fira Code, but had more success with Roboto Mono. Windows in particular as it would break the monospace grid.

Textual serve renders terminals in a similar way, and we used "Roboto Mono", menlo, monospace;

There are also a bunch of CSS rules the impact font rendering. You might want to experiment with text-rendering. Setting that to "geometryPrecission" might help.

You may also want to self host your fonts, if you aren't already. We found that some browsers refused to load fonts from a CDN, which resulted in garbled terminals.

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Thanks Will!

I was able to figure it out, I added more details in the main description. In short, Google Fonts was not delivering font files with all the glyphs, even if they were shown on the web explorer. Changing the source seems to fix it. 🎉

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docsImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tiangolo@willmcgugan@svlandeg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows - #1419

Merged
tiangolo merged 7 commits into
masterfrom
font
Nov 23, 2025
Merged

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows#1419
tiangolo merged 7 commits into
masterfrom
font

Conversation

@tiangolo

@tiangolotiangolo commented Nov 21, 2025

Copy link
Copy Markdown
Member

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows

To fix this (detected/reported by @svlandeg):

image

Description

The issue comes from the fact that Material for MkDocs uses the font "Roboto Mono" by default for code, and the termynal.css styles used the same.

But "Roboto Mono" doesn't include the "glyph" (the visual thing to represent a Unicode character) for the panels: horizontal lines, the corners, and the character .

So, the browser tries to use the next font in the font family. In Linux, it ends up in one that has the glyphs and they are indeed monospace so, it looks mostly good.

In Windows, the next font it finds that has the glyphs is not monospace or doesn't have the glyphs properly monospace (having the exact same width as all the other glyphs in the font), so it looks like unaligned.

Change the font

Changing the font to one that has the glyphs, like Fira Code, fixes most of the issues.

With Fira Code, it's the closest (Chrome on Windows):

image

Funny enough, on Chrome on Ubuntu (Linux), the same font, looks good:

image

So there's still something funky going on.

heavy right-pointing angle bracket ornament ()

After trying a lot of fonts, my conclusion is that almost no font manages to perfectly render the character in exactly monospace (with the exact same width as any other character). 😅 ...but it seems to only happen on Windows. 🤯

More strange yet is that running the same script in PowerShell shows the lines perfectly aligned, so there's a potential way for it to properly work, but when trying the theoretical default font of PowerShell, it still looked funky on the browser.

And it also looks funky in other places in Windows.

For example, copying the example in VS Code on Windows:

╭──────────────── Traceback (mostrecentcalllast) ────────────────╮
│ /home/user/code/superapp/main.py:5inmain │
│ │
│ 2 │
│ 3 │
│ 4defmain(name: str="morty"): │
│ ❱ 5print(name+3) │
│ 6 │
│ 7 │
│ 8if__name__=="__main__": │
│ │
│ ╭──── locals ────╮ │
│ │ name='morty' │ │
│ ╰────────────────╯ │
╰───────────────────────────────────────────────────────────────────╯
TypeError: canonlyconcatenatestr (not"int") tostr

...it also renders it a little smaller, so the last bar is also a little moved:

image

...and here on GitHub, showing that same snippet, on Windows it shows unaligned, on Ubuntu it shows fine.

So, there seems to be an issue with the glyph on Windows. Not even sure. (?) But for now this should at least make it look better.

2025-11-22 Update: Google Fonts missing glyphs

I discovered I can see the actual font used to render in the developer tools, in the "Computed" section, at the end:

image

So, it's rendering the with "Segoe UI Symbol" instead of Roboto Mono, or Fira Code.

This allowed me to keep debugging.

One weird thing is, in the web explorer for Google Fonts, Fira Code and other fonts show up as including that glyph most of the time, but from time to time they show up as not including it, that was strange.

It led me to this issue: google/fonts#4820

It seems the font files and glyphs shown on the web are not necessarily the same ones delivered through the CDN.

So, I went and tried downloading and using Fire Code directly, in regular and bold, downloading the files and serving them locally, and that worked. 🎉 (finally)

Each file is 100 KB. I didn't want to commit that to git if it was not fully necessary. I figured there was a way to load them from a different CDN, from the Fira Code GitHub repo. I used that.

And that finally did it. 🎉

💄 Use font 'Fira Code' to fix display of Rich panels
@github-actions

github-actionsBot commented Nov 21, 2025

Copy link
Copy Markdown
Contributor

@github-actionsgithub-actionsBot added the docs Improvements or additions to documentation label Nov 21, 2025

@svlandegsvlandeg left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use > instead of ?

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Yep, I tried that, and it works, but the problem is that these commands are copied as is from the terminal as HTML, so changing it manually wouldn't be sustainable for the long term. 🤔

@tiangolotiangolo changed the title 💄 Use font 'Fira Code' to fix display of Rich panels💄 Use font 'Fira Code' to fix display of Rich panels in docs in WindowsNov 22, 2025
@willmcgugan

Copy link
Copy Markdown

IIRC we had issues with Fira Code, but had more success with Roboto Mono. Windows in particular as it would break the monospace grid.

Textual serve renders terminals in a similar way, and we used "Roboto Mono", menlo, monospace;

There are also a bunch of CSS rules the impact font rendering. You might want to experiment with text-rendering. Setting that to "geometryPrecission" might help.

You may also want to self host your fonts, if you aren't already. We found that some browsers refused to load fonts from a CDN, which resulted in garbled terminals.

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Thanks Will!

I was able to figure it out, I added more details in the main description. In short, Google Fonts was not delivering font files with all the glyphs, even if they were shown on the web explorer. Changing the source seems to fix it. 🎉

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docsImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tiangolo@willmcgugan@svlandeg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows - #1419

Merged
tiangolo merged 7 commits into
masterfrom
font
Nov 23, 2025
Merged

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows#1419
tiangolo merged 7 commits into
masterfrom
font

Conversation

@tiangolo

@tiangolotiangolo commented Nov 21, 2025

Copy link
Copy Markdown
Member

💄 Use font 'Fira Code' to fix display of Rich panels in docs in Windows

To fix this (detected/reported by @svlandeg):

image

Description

The issue comes from the fact that Material for MkDocs uses the font "Roboto Mono" by default for code, and the termynal.css styles used the same.

But "Roboto Mono" doesn't include the "glyph" (the visual thing to represent a Unicode character) for the panels: horizontal lines, the corners, and the character .

So, the browser tries to use the next font in the font family. In Linux, it ends up in one that has the glyphs and they are indeed monospace so, it looks mostly good.

In Windows, the next font it finds that has the glyphs is not monospace or doesn't have the glyphs properly monospace (having the exact same width as all the other glyphs in the font), so it looks like unaligned.

Change the font

Changing the font to one that has the glyphs, like Fira Code, fixes most of the issues.

With Fira Code, it's the closest (Chrome on Windows):

image

Funny enough, on Chrome on Ubuntu (Linux), the same font, looks good:

image

So there's still something funky going on.

heavy right-pointing angle bracket ornament ()

After trying a lot of fonts, my conclusion is that almost no font manages to perfectly render the character in exactly monospace (with the exact same width as any other character). 😅 ...but it seems to only happen on Windows. 🤯

More strange yet is that running the same script in PowerShell shows the lines perfectly aligned, so there's a potential way for it to properly work, but when trying the theoretical default font of PowerShell, it still looked funky on the browser.

And it also looks funky in other places in Windows.

For example, copying the example in VS Code on Windows:

╭──────────────── Traceback (mostrecentcalllast) ────────────────╮
│ /home/user/code/superapp/main.py:5inmain │
│ │
│ 2 │
│ 3 │
│ 4defmain(name: str="morty"): │
│ ❱ 5print(name+3) │
│ 6 │
│ 7 │
│ 8if__name__=="__main__": │
│ │
│ ╭──── locals ────╮ │
│ │ name='morty' │ │
│ ╰────────────────╯ │
╰───────────────────────────────────────────────────────────────────╯
TypeError: canonlyconcatenatestr (not"int") tostr

...it also renders it a little smaller, so the last bar is also a little moved:

image

...and here on GitHub, showing that same snippet, on Windows it shows unaligned, on Ubuntu it shows fine.

So, there seems to be an issue with the glyph on Windows. Not even sure. (?) But for now this should at least make it look better.

2025-11-22 Update: Google Fonts missing glyphs

I discovered I can see the actual font used to render in the developer tools, in the "Computed" section, at the end:

image

So, it's rendering the with "Segoe UI Symbol" instead of Roboto Mono, or Fira Code.

This allowed me to keep debugging.

One weird thing is, in the web explorer for Google Fonts, Fira Code and other fonts show up as including that glyph most of the time, but from time to time they show up as not including it, that was strange.

It led me to this issue: google/fonts#4820

It seems the font files and glyphs shown on the web are not necessarily the same ones delivered through the CDN.

So, I went and tried downloading and using Fire Code directly, in regular and bold, downloading the files and serving them locally, and that worked. 🎉 (finally)

Each file is 100 KB. I didn't want to commit that to git if it was not fully necessary. I figured there was a way to load them from a different CDN, from the Fira Code GitHub repo. I used that.

And that finally did it. 🎉

💄 Use font 'Fira Code' to fix display of Rich panels
@github-actions

github-actionsBot commented Nov 21, 2025

Copy link
Copy Markdown
Contributor

@github-actionsgithub-actionsBot added the docs Improvements or additions to documentation label Nov 21, 2025

@svlandegsvlandeg left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use > instead of ?

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Yep, I tried that, and it works, but the problem is that these commands are copied as is from the terminal as HTML, so changing it manually wouldn't be sustainable for the long term. 🤔

@tiangolotiangolo changed the title 💄 Use font 'Fira Code' to fix display of Rich panels💄 Use font 'Fira Code' to fix display of Rich panels in docs in WindowsNov 22, 2025
@willmcgugan

Copy link
Copy Markdown

IIRC we had issues with Fira Code, but had more success with Roboto Mono. Windows in particular as it would break the monospace grid.

Textual serve renders terminals in a similar way, and we used "Roboto Mono", menlo, monospace;

There are also a bunch of CSS rules the impact font rendering. You might want to experiment with text-rendering. Setting that to "geometryPrecission" might help.

You may also want to self host your fonts, if you aren't already. We found that some browsers refused to load fonts from a CDN, which resulted in garbled terminals.

@tiangolo

Copy link
Copy Markdown
MemberAuthor

Thanks Will!

I was able to figure it out, I added more details in the main description. In short, Google Fonts was not delivering font files with all the glyphs, even if they were shown on the web explorer. Changing the source seems to fix it. 🎉

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docsImprovements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tiangolo@willmcgugan@svlandeg