- DatePicker trigger shows the value formatted in the component locale
("Oct 2, 2026 · 9:30 AM", "Jul 15, 2026"); the hidden input still submits
the ISO value.
- Showcase playground code panel: the reactive runtime read "{...}" in the
rewritten code as interpolations and blanked every object in array props.
Braces are now written as their own spans, like the server-rendered code.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Redesign
- Shared field foundation rules (duplicated across 15 form components and
emitted globally) are now identical everywhere, so later copies no longer
silently override earlier redesigns.
- Drawn checkbox and radio controls, white switch thumbs (the thumb was the
text colour, a black blob in light mode), recessed field wells, keycap
actions in Modal, Drawer, Popover, Toaster, Pagination, Stepper, DataTable.
- Menus (Dropdown, ContextMenu, Popover, Select dropdown, Navbar panels) share
one flat raised panel with neutral hover rows and mono section labels.
- Alerts with an accent rail and icon chip; card headers without the grey
band; accordion, collapse, list, list group, timeline, stats, metrics,
chat, skeleton, avatar group, clipboard, splitter, section, sidebar,
navbar and upload progress restyled.
- Chart rebuilt: nice y-axis ticks, gridlines, rounded bars, line and area
modes, hover tooltips, hidden series leave the scale.
Fixes
- Checkbox and radio labels toggle their input again (empty for="" broke it).
- TimePicker kept every clicked time pressed; only the chosen hour and
minute are pressed now, and nothing is pressed before a value exists.
- ColorPicker hex readout now follows the picked colour.
- Disabled FileInput no longer shows the native file-input text.
- Date and time panels float instead of pushing content.
- ContextMenu opened at the pointer closes on scroll.
- Drawer left/top/bottom placements slide from their own edge again.
- Image-only Card no longer renders an empty body strip.
- Timeline supports item.time, current/upcoming states, sizes and
compact/alternate variants; showcase demos use distinct variants.
- ChatBubble: delivery receipts (sending/sent/delivered/read/failed/error)
and meta aligned to its bubble.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
Carries the rollback refusal in db and the matching CLI message, together
with the auth, captcha, csr, dev-server, dev-toolbar, ui and validation
changes that were already in the working tree, since publishing stages
from it and those files would otherwise ship without being recorded here.
@wrnexus/auth 0.8.28 -> 0.8.29
@wrnexus/captcha 0.8.15 -> 0.8.16
@wrnexus/cli 0.8.64 -> 0.8.65
@wrnexus/csr 0.8.37 -> 0.8.38
@wrnexus/db 0.8.20 -> 0.8.21
@wrnexus/dev-server 0.8.60 -> 0.8.61
@wrnexus/dev-toolbar 0.8.17 -> 0.8.18
@wrnexus/ui 0.8.75 -> 0.8.76
@wrnexus/validation 0.8.12 -> 0.8.13
Also declares Event among the browser globals captcha's client asset
already lists, which was the last lint failure, and reformats four files.
typecheck, lint, 1998 tests and format:check all pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
rollback ran a migration's down section when it had one and then deleted
its tracking row either way. A migration that changed the schema without a
`-- +down` section was therefore recorded as rolled back while its change
stayed in the database, and the next migrate replayed statements such as
ALTER TABLE ADD COLUMN that cannot run twice, leaving the database stuck
between the two states with no way forward or back.
It now refuses that case with WRN-DB-MIGRATION-IRREVERSIBLE and leaves the
tracking row alone, so the database stays consistent and the operator
chooses: add a down section, or write a new migration that reverses the
change. The check runs before the lock is taken, so a dry run reports the
same refusal rather than promising a rollback that would fail.
A migration whose up is empty still rolls back by dropping its tracking
row, since there is nothing to undo. That keeps placeholder migrations
working, and `wrnexus db rollback` prints the refusal as a message rather
than a stack trace.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>