Visual-only redesign ("instrument panel"): cool graphite neutrals for light
and dark, layered hairline elevation, larger radii, a mono token for
eyebrows/data, keycap-style solid and secondary buttons, recessed input
wells and tab tracks, a stronger dialog, and a theme-driven focus outline.
No props, outputs or behaviour change.
Also records the already-published csr 0.8.42, styles 0.8.25 and ui 0.8.85
changes (optional chaining/nullish in the reactive runtime, shared
theme/accent cookie sync, BackToTop hidden attribute).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both drew small text in the raw accent, which misses the contrast floor on
a dark surface. They now blend the accent toward the text colour, as the
unselected tab already does.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A Button rendered as a link emitted aria-pressed="", which is not allowed
on a link and fails an accessibility check on every page that uses one
for a secondary action. A link has no pressed state, so the attribute is
gone from that branch; a real button still carries it.
An unselected tab used the muted text colour, which does not reach 4.5:1
against the tab strip at this size. It now blends back toward the text
colour, and the selected tab still reads as selected through its surface,
accent and shadow.
The visual contract manifest is regenerated to match.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Published to the private registry: auth 0.8.32, cli 0.8.70, compiler
0.8.29, core 0.8.15, csr 0.8.40, dev-server 0.8.65, payment 0.8.8, pwa
0.8.11, ssr 0.8.11, styles 0.8.22, test 0.8.15, ui 0.8.80 and viewer
0.8.12.
This records the version bumps and the lockfile. The package sources are
staged from the working tree, so the tarballs also carry source changes
that are still uncommitted here.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The execution tests wrote the generated module to an OS tmpdir and
junctioned @wrnexus/core in beside it. On Windows that tmpdir sits on
another volume, and the junction resolved to a second copy of the
package: the request context lives in an AsyncLocalStorage inside core,
so the module read a store the test could never populate and all six
execution tests failed with "needs a request context".
The module is now written inside the repo, where resolution walks up to
this workspace's node_modules and finds the same instance the test
holds. That identity is the whole point, so the junction is gone.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A component that renders a list, such as FeatureGrid, passes each item
into a child: title={item.title || item.label || "Feature"}. The
compiler decided whether that attribute needed a client binding by
searching the expression for each prop name, so `item.label` matched the
grid's own `label` prop and a binding was emitted.
On hydration the binding is re-evaluated where the loop item is out of
scope, so the expression fell through to its default and replaced the
server's value: every card's title became "Feature". A name after a dot
belongs to whatever precedes it, so it no longer counts as a reference.
Timeline headings follow the same idea: its items were always h4, which
skipped a level and broke the heading order of a page that gives the
timeline no title of its own. They now take h3 in that case.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>