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:
1 parent
f4eaf416be
commit
1179fc2810
16 files changed
+322
-108
No files matched your search
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@wrnexus/csr",
|
||||
"version": "0.8.41",
|
||||
"version": "0.8.42",
|
||||
"type": "module",
|
||||
"main": "src/index.ts",
|
||||
"exports": {
|
||||
|
||||
@@ -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 === "!=" ||
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
Reference in new issue
Block a user