chore(release): redesign UI tokens and publish styles 0.8.26, ui 0.8.86

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>
This commit is contained in:
ClintchizandClaude Opus 5.5 committed 2026-09-30 12:00:27 +05:30
1 parent f4eaf416be
commit 1179fc2810
16 files changed
+322 -108

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/csr",
"version": "0.8.41",
"version": "0.8.42",
"type": "module",
"main": "src/index.ts",
"exports": {
+15 -1
View File
@@ -5542,7 +5542,11 @@ export const REACTIVE_RUNTIME = String.raw`
function parsePostfix() {
var node = parsePrimary();
for (;;) {
if (match(".")) {
var optional = match("?.");
if (optional && !is("[") && !is("(")) {
var optionalProp = next().value;
node = { value: node.value == null ? undefined : node.value[optionalProp], obj: node.value };
} else if (match(".")) {
var prop = next().value;
node = { value: node.value == null ? undefined : node.value[prop], obj: node.value };
} else if (match("[")) {
@@ -5617,6 +5621,10 @@ export const REACTIVE_RUNTIME = String.raw`
}
function parseTernary() {
var c = parseOr();
while (match("??")) {
var fallback = parseOr();
c = c == null ? fallback : c;
}
if (match("?")) { var a = parseTernary(); expect(":"); var b = parseTernary(); return c ? a : b; }
return c;
}
@@ -5782,6 +5790,12 @@ export const REACTIVE_RUNTIME = String.raw`
var two = input.slice(i, i + 2);
if (two === "?." || two === "??") {
tokens.push({ type: "operator", value: two });
i += 2;
continue;
}
if (
two === "==" ||
two === "!=" ||
+8
View File
@@ -37,6 +37,14 @@ function mount(html: string, runtime = REACTIVE_RUNTIME, controllers = ""): Wind
const REPLACED_GLOBALS = ["window", "document", "location", "fetch", "MutationObserver"];
test("optional properties and nullish fallbacks hydrate without crashing", () => {
const win = mount(`<div data-scope="records: null, row: { count: 0 }, items: ['ok']"><b data-text="records?.rows?.length ?? 0"></b><i data-text="row?.count ?? 5"></i><em data-text="items?.[0] ?? 'empty'"></em><u data-text="!records?.rows?.length"></u></div>`);
expect(win.document.querySelector("b")?.textContent).toBe("0");
expect(win.document.querySelector("i")?.textContent).toBe("0");
expect(win.document.querySelector("em")?.textContent).toBe("ok");
expect(win.document.querySelector("u")?.textContent).toBe("true");
});
restoreGlobalsAfterAll(REPLACED_GLOBALS);
beforeEach(() => {