Skip to content

Type: font menu search, and the faces of families macOS doesn't list - #207

Open
MyronKoch wants to merge 2 commits into
robbietilton:mainfrom
MyronKoch:feat/font-menu-search
Open

MyronKoch wants to merge 2 commits into
robbietilton:mainfrom
MyronKoch:feat/font-menu-search

Conversation

@MyronKoch

@MyronKoch MyronKoch commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Two commits, so either can be taken alone.

Faces of families macOS leaves out of the font list

macOS keeps some of the families it installs out of NSFontManager.availableFonts. On macOS 27 that's 116 of them, among them Rockwell, Athelas, Iowan Old Style, Seravek, Superclarendon and Marion. Their faces still draw when named, so text in Rockwell-Regular (here from a Photoshop file) showed that one face in the font menu, because the menu adds the face in use, and there was no way to reach Rockwell-Bold. Font Book doesn't list them either.

The menu now also lists the family of the face in use, through availableMembers(ofFontFamily:), which still answers for these families. It rebuilds only when that family isn't listed yet.

A search box at the top of the font menu

With around 720 faces on a typical Mac, finding one meant scrolling or type-select on the first letters. A search box now sits at the top of the menu and takes the keys as soon as it opens:

  • Typing keeps the faces whose names hold every word, in any case: "rock bold" finds Rockwell-Bold.
  • Return chooses the first face left. Closing the menu clears the search.
  • Typing the name of a family macOS leaves out ("seravek", "iowan old style") lists its faces too.
  • A window keeps its bottom edge when it shrinks, so the cut-down list fell to wherever the full list ended, often the foot of the screen. Once the menu resizes, its top is put level with the font control.

The font menu with 'rockwell' typed in its search box, listing Rockwell-Bold, -BoldItalic, -Italic and -Regular

Testing

  • FontMenuFacesTests: the family of a face in use is listed, a hidden family (Rockwell, skipped where it isn't installed) offers all four faces, search words match in any case, and a family is found by its typed name.
  • The full CompositorTests suite: 593 tests pass on macOS 27 (TEST SUCCEEDED, none failed).
  • In a Release build of the branch: text set in Rockwell-Regular, the menu listing all four Rockwell faces, typing "rockwell" and "rockwell-b" with the menu open filtering the list as typed, and the filtered list staying at the control. My first try had it falling to the bottom of the screen, which is the last fix above.

I'm using Compositor for my event's banners, and this came up with text imported from Photoshop in Rockwell.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WC9aF7W8inTF7p9LZbNXRe

macOS keeps some families it installs out of NSFontManager.availableFonts:
Rockwell, Athelas, Iowan Old Style, Seravek, Superclarendon, Marion and
others (116 families on macOS 27). Their faces still draw when named, so
text imported from Photoshop in Rockwell-Regular showed that one face in
the menu and no way to reach Rockwell-Bold.

The menu now adds the family of the face in use, found through
availableMembers(ofFontFamily:), which still answers for these families.
It rebuilds only when that family is missing from the list.
The font menu lists every installed face, around 720 on a typical Mac,
with no way to narrow it. A search box now sits at its top and takes the
keys as soon as the menu opens: typing keeps the faces whose names hold
every word ("rock bold" finds Rockwell-Bold), Return chooses the first
one left, and closing the menu clears it.

Typing the name of a family macOS leaves out of the list ("seravek",
"iowan old style") lists its faces too.

A window keeps its bottom edge when it shrinks, so a cut-down list fell
to wherever the full list ended, often the foot of the screen. Once the
menu resizes, its top is put level with the font control.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant