macOS 26 / iOS 26 ship the PingFang that web content gets as a reduced
font: some 1,400 glyphs (U+FF5C |, ①, ★, ※, kana, ...) moved to a
hidden ".CJK Symbols Fallback" font that only CoreText's language-aware
system fallback knows about. The full font is an on-demand asset flagged
as user-installed, which Safari keeps away from web content, while Orion
and Chrome still see it.
WebKit expands -apple-system into the system font plus CoreText's cascade
list and walks that list with each font's full character map, so those
characters were drawn by Apple Symbols or the Japanese UI font at a
single weight before the system fallback ever ran. Drop -apple-system
from the CJK stacks and add two empty 'Inter Core' faces backed by
local(-apple-system): WebKit performs system fallback relative to the
first face of the first family, so the system font becomes that base
without rendering anything (U+10FFFF), and the missing symbols now come
from the same fonts native apps use, at the requested weight. Other
engines never load the faces, and the primary font used for metrics is
still the face covering U+0020.
Follow-up to #5428.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Safari shapes "↩︎" (U+21A9 U+FE0E) only with a font that also has a
glyph for U+FE0E. Inter has none, so the arrow came from the system
font. Map the selector to Inter's empty zero-width-space glyph in
every subset.
fixes#5428
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Reserve the navbar title column only when a sidebar is present.
Add browser coverage for home, sidebar-free, 404, and sidebar pages.
Fixesvuejs/vitepress#5426
Assisted-by: OpenAI Codex
Functions in the site config (e.g. a custom miniSearch tokenize) were
embedded in the client's JSON payload as source strings and rebuilt at
runtime with new Function, which strict CSP blocks unless unsafe-eval
is allowed. Emit them as plain function expressions in the generated
script instead, with only an index marker left in the JSON, so the
deserializer just looks them up.
This also stops data strings that merely start with "_vp-fn_" from
being evaluated as code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
axe's label-content-name-mismatch rule flags the search button
(#5401): its visible text is "Search ⌘ K" while its accessible name
is "Search". aria-hidden on the keys does not help — the rule counts
visually rendered text, since WCAG 2.5.3 is about what sighted
speech-input users see and say.
The button was arguably conformant as it was: 2.5.3 constrains the
label, and the keycaps are a shortcut hint, not the label. Nobody
says "click Search command K". The glyphs move to CSS anyway because
it costs nothing visible and layers things right: the DOM text now
contains exactly the label, so speech software gets no stray "K"
target, strict audits pass without a human ruling them false
positives, and the decorative hint lives in the presentation layer
where decorative content belongs. Screen readers are unaffected — the
keys were already aria-hidden — and aria-keyshortcuts keeps carrying
the shortcut semantics.
Also folds the two display-toggled kbd elements into one whose
content switches per platform.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Safari composites the sticky local nav above the bar's negative-z
rule in their overlapping row, regardless of z-index, hiding the
divider below 60rem (#5399). Promoting the rule to its own layer
restores the order. Flyout panels still cover it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The icon is a masked background on an inline box whose height follows
font metrics per engine. The fixed centered mask left an unmasked
sliver of the background visible below the arrow on iOS. A full-size
mask can only stretch the arrow slightly, never leak.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The nav menu is the bar's only growing element, so without `nav`
configured everything packed to the right edge. Search now carries an
auto right margin. A present menu's flex-grow still wins, so nothing
moves in that case.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The local nav's bottom rule reads its own token instead of a
hardcoded gutter color. It follows --vp-nav-divider-color by default,
like the surface color follows the navbar's.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>