Skip to content

Docs: draw the docs with the Vortex design system - #11207

Merged
lwwmanning merged 21 commits into
developfrom
wm/docs-design-system
Nov 4, 2026
Merged

lwwmanning merged 21 commits into
developfrom
wm/docs-design-system

Conversation

@lwwmanning

@lwwmanning lwwmanning commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Summary

This draft PR changes the look of the docs to the Vortex design system that vortex.dev, bench, and the Explorer use. It is a prototype for review. It does not change the content or the URLs of any page.

Changes

  • docs/_theme/vortex/system/ holds copies of the system's CSS (tokens, docs, and focus). vortex_theme.py stops the build if a copy has a hand edit.
  • layout.html writes the system's header, navigation, "On this page" list, and footer. The pages need no JavaScript, except for search.
  • Code blocks use the system's syntax colours, with a label for each language.
  • The Pygments accessibility styles, accessible-pygments, and the Breathe hook are removed.
  • At 390 px, no page is wider than the screen. Today the API page and the index are wider.

The build passes with warnings as errors. After gzip, each page gets 0.9 to 1.9 KB larger, and the CSS goes from 2.7 KB to 5.4 KB.

🤖 Generated with Claude Code

Copy the system's tokens and its docs and focus sections into the
theme, and rewrite the layout around them: a solid header with a search
form, the toctree, the page on surface, and an On this page rail that
folds above narrow pages. The docs follow the OS theme, run no script
outside search, and load no web font.

Signed-off-by: Will Manning <will@willmanning.io>
The theme extension checks each system file's sha256 header before it
minifies the CSS, names each toctree branch for screen readers, and
leaves the page title out of On this page. Remove the Pygments a11y
styles and the Breathe reference hook that the new theme does not use.

Signed-off-by: Will Manning <will@willmanning.io>
Copy the system's CSS again. A code block with no language is labelled
Text, not Python. The mono stack names each platform's monospace face,
so a reader without Geist Mono does not get Courier. The footer link is
underlined. The landing wordmark keeps its 400px width.

Signed-off-by: Will Manning <will@willmanning.io>
Keywords are Blue, functions purple, and types teal (the new syntax-type
token). Strings, numbers, and constants are pink. Pygments' type classes
(.nc, .ne, .nn, .kt) take syntax-type.

Signed-off-by: Will Manning <will@willmanning.io>
@lwwmanning lwwmanning added the changelog/feature A new feature label Nov 4, 2026
@lwwmanning

Copy link
Copy Markdown
Contributor Author

Before and after screenshots. In each image, the left side is docs.vortex.dev now, and the right side is this PR. Search has JavaScript on. The other pages have JavaScript off.

Home, 1440 px, Dark
Home, 1440 px, Dark, before and after

Python user guide, 1440 px, Dark
Python user guide, 1440 px, Dark, before and after

Python user guide, 1440 px, Light
Python user guide, 1440 px, Light, before and after

Arrays concept, 1440 px, Light
Arrays concept, 1440 px, Light, before and after

Python API, 1440 px, Dark
Python API, 1440 px, Dark, before and after

Search, 1440 px, Dark
Search, 1440 px, Dark, before and after

Home, 390 px, Dark
Home, 390 px, Dark, before and after

Python user guide, 390 px, Light
Python user guide, 390 px, Light, before and after

Python API, 390 px, Dark
Python API, 390 px, Dark, before and after

Index, 390 px, Light
Index, 390 px, Light, before and after

Signatures go back to 14px with teal types, field labels are white
14px semibold, and the types in field lists lose their chip.

Signed-off-by: Will Manning <will@willmanning.io>
@lwwmanning

Copy link
Copy Markdown
Contributor Author

API entries are easier to read on small screens again (1d58870). Signatures are 14px with teal types. Field labels such as Parameters are white, 14px, and semibold. Types in field lists have no chip.

The Arrays and Factory Functions entry at 390px. The live site is on the left, this PR on the right:

Full page, 390px and 1440px:

@lwwmanning
lwwmanning marked this pull request as ready for review November 4, 2026 15:52
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-04T18:06:09.889811Z 705c886 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1d58870510

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/_theme/vortex/layout.html Resolved
- A paragraph's line is now about 76 characters (54ch), down from
  about 95 (68ch). The design system's new measure token sets it.
- Reading text wraps so that a paragraph does not end on one word.
- The compatibility diagram takes the same rounded corners as the
  other two versioning diagrams.
- The landing page's hidden title does not wrap, like the system's
  hidden text, and the theme's header comment says which values
  come from the tokens.
- Re-sync the copies of the system's styles. They still named the
  dropped display face.

Signed-off-by: Will Manning <will@willmanning.io>
@lwwmanning

Copy link
Copy Markdown
Contributor Author

Reading length, before (left) and after (right): the Arrays page in Dark and Light at 1440, the compatibility page in Light, and Arrays in Dark at 390.

  • A paragraph now runs about 76 characters a line (54ch). It ran about 95 (68ch).
  • Code blocks and tables keep the column's full width.
  • On a phone, nothing changes: the screen is narrower than the measure.

Docs reading length before and after

🤖 Generated with Claude Code

The footer's policy sentence left its last word alone on a line at
desktop width. The system now balances the footer's text.

Signed-off-by: Will Manning <will@willmanning.io>
Docutils writes the viewport tag for each page built from a source file. The search page, the index, and the module index have none, so a phone drew them at desktop width. The theme now writes the tag when docutils has not.

Signed-off-by: Will Manning <will@willmanning.io>
Headings take a blog post's mono heading ladder one level up: 28px at
500, then 22px and 18px at 600. The sidebar rows, On this page, and the
pager are Geist Mono, as navigation is on the other Vortex sites.

Signed-off-by: Will Manning <will@willmanning.io>
The docs loaded no web font, so headings, labels, navigation, and code
fell back to each platform's mono. The theme now serves Google Fonts'
Latin subset of Geist Mono (23 KB, every weight) and preloads it. Body
text keeps the platform's sans. The font is OFL-1.1.

Signed-off-by: Will Manning <will@willmanning.io>
@lwwmanning

Copy link
Copy Markdown
Contributor Author

Two changes: the headings and the navigation use Geist Mono, and the docs self-host Geist Mono.

  • Headings use the blog post heading sizes, one level up: h1 is 28px at weight 500, h2 is 22px at weight 600, and h3 is 18px at weight 600.
  • The sidebar rows, "On this page", and the pager use Geist Mono, as navigation does on vortex.dev and bench.
  • The theme serves the Latin subset of Geist Mono from Google Fonts: one file of 23 KB for all weights, preloaded, under OFL-1.1. Body text stays the platform's sans.

The before shots hide a locally installed Geist, so they show what a reader without the font saw.

Frame at 1440, Dark:

Frame

Python API at 390, both themes:

Phone

impeccable 4.7.0 reports no findings at 1440 or 390.

@lwwmanning

Copy link
Copy Markdown
Contributor Author

👍🏼

A warning admonition's icon and title take the system's new warn-ink
token, so a warning no longer reads as a note. Code that links (an API
name in prose) takes the syntax type colour, as in signatures.

Signed-off-by: Will Manning <will@willmanning.io>
A reference page is mostly links, and its reader scans for them, as
the old theme's cyan links let them do. Links in the main column take
accent-ink, with a 40% underline that goes solid on hover. Linked code
and signatures keep the type colour.

Signed-off-by: Will Manning <will@willmanning.io>
@lwwmanning

Copy link
Copy Markdown
Contributor Author

The docs now use colour where the old theme did. Two commits:

  • A warning admonition has an orange icon and title (the new warn-ink token: orange in Dark, #ad4a00 in Light, 4.5:1 or more on every ground). A note stays ink.
  • Prose links are Blue at rest, with a 40% underline that becomes solid on hover. Linked code, such as array() in prose, uses the syntax type colour, as in signatures.

The sidebar stays without Blue. The current page has a raised row.

Old theme (left) and new theme (right), User Guide > Vortex Python, 1440, Dark and Light:

Guide page, old and new

Python API > Arrays:

API page, old and new

🤖 Generated with Claude Code

Comment thread docs/_theme/vortex/system/vortex.css Resolved
Comment thread docs/_theme/vortex/layout.html Resolved
@myrrc myrrc added changelog/docs A docs change and removed changelog/feature A new feature labels Nov 4, 2026
After the build, the theme extension reads every built page and the
scripts that the pages load. It keeps a CSS rule only if each class, id,
element, and attribute in one of its selectors is in that set, then
drops the custom properties that no kept rule reads. Pseudo-classes and
attribute values are not checked, so hover, focus, the phone menu, the
search results, and both themes keep their rules. The system copies
stay byte-for-byte, so their sha256 checks still pass.

The shipped vortex.css goes from 25.8 KB to 21.9 KB, and from 5.9 KB to
5.2 KB with gzip -9. Screenshots of 9 pages and states at 1280 and 390
px, in Light and Dark, are pixel-identical before and after.

Signed-off-by: Will Manning <will@willmanning.io>
@vercel

vercel Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
vortex-docs Ready Ready Preview Nov 4, 2026 5:49pm UTC
vortex-explorer Ready Ready Preview Nov 4, 2026 5:49pm UTC

Request Review

Copy the design system's v115 docs CSS with tools/site-styles.mjs. v115
removes vx-stat, vx-lede, the content-max token, and the FileMap focus
selector. The pruning step had already dropped all of them, so the
shipped vortex.css and every built page stay byte-identical.

Remove the Jinja comment above the viewport meta in layout.html.

Signed-off-by: Will Manning <will@willmanning.io>
@myrrc

myrrc commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Additional note: this change draws GitHub as an icon but PyPi and crates.io as text, I'd suggest keeping the current state where everything is drawn as text. Text is easier to navigate than icons.

@myrrc

myrrc commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

And another note on my original rationale for rewrite: I wanted to make the page more dense so you'd have more information available. This design reverts this.

Breadcrumbs imo are duplicating the navigation on the left. We don't (and probably shouldn't) have more than two levels of nesting, and in this case the left navigation always provides all information you need.

Signed-off-by: Will Manning <will@willmanning.io>
- Linked code in prose has an underline at rest, 40% of its own colour
  and solid on hover. Before, colour was the only thing that set it
  apart from plain inline code (WCAG 1.4.1).
- Dark --syntax-function is #f4df9a, not #c9a8f5. Under protanopia the
  old value was almost the same as the keyword colour.

Signed-off-by: Will Manning <will@willmanning.io>
The left navigation shows where each page is, and the docs nest no more
than two levels deep.

Signed-off-by: Will Manning <will@willmanning.io>
…ning

Copy design system v117 with site-styles.mjs --reads vortex.css and
layout.html. The tokens copy keeps only the custom properties that the
docs rules and these files read, and drops the type classes that the
docs do not use: 3,222 bytes, down from 7,052. The theme extension no
longer parses the built HTML and CSS after the build.

The shipped vortex.css is 5,313 bytes with gzip -9, against 5,203 with
the removed step. The rest is the breadcrumb rules, Pygments classes
that no page uses, and the focus rule's selectors for other sites.

Signed-off-by: Will Manning <will@willmanning.io>

@myrrc myrrc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM!

Signed-off-by: Will Manning <will@willmanning.io>
@codspeed

codspeed Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Merging this PR will not alter performance

2 warnings

⚠️ Walltime results may be unreliable

Some benchmarks used the Walltime instrument outside CodSpeed Macro Runners, which can make the results inconsistent.

Learn more about Macro Runners

See affected benchmarks

⚠️ 1 benchmark is dominated by system calls

System calls cannot be simulated consistently and are left out of the measure. The reported value understates the real cost. Switch to the Walltime instrument to measure them.

Learn more about system calls

See affected benchmarks

✅ 1770 untouched benchmarks
⏩ 105 skipped benchmarks1


Comparing wm/docs-design-system (705c886) with develop (9d2da79)

Open in CodSpeed

Footnotes

  1. 105 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩

Above 760px, the first column of an API summary table no longer breaks
names such as open_readable one character before the end. Phones keep
the wrap, so no table scrolls sideways.

Signed-off-by: Will Manning <will@willmanning.io>
Body text is 16px at 1.6 line height. Flow gaps, heading margins, page
padding, nav and rail rows, code blocks, and table cells are smaller.
The prose measure does not change. Pages are 8 to 14 percent shorter.

Signed-off-by: Will Manning <will@willmanning.io>
@lwwmanning
lwwmanning merged commit 068d819 into develop Nov 4, 2026
72 checks passed
@lwwmanning
lwwmanning deleted the wm/docs-design-system branch November 4, 2026 19:00

This branch was successfully deployed

1 active deployment
vercel-docs — 705c8862 Deployed Nov 4, 2026 by lwwmanning via Publish preview / Deploy #8311
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changelog/docs A docs change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants