From 487a8e7ceb91b3d8c7553b813453aa935139ec76 Mon Sep 17 00:00:00 2001 From: Lukas Moschitz Date: Thu, 12 Mar 2026 13:17:18 +0100 Subject: [PATCH 1/3] Fix visual parity Lit harness broken after merge The Lit harness stopped rendering after the merge because: 1. @a2ui/markdown-it was pinned to ^0.0.1 (npm registry) which has a synchronous renderMarkdown(). After commit b904548 made MarkdownRenderer async, the Lit directive calls .then() on the result, causing "markdownRenderer(...).then is not a function". Fix: switch to file:../../markdown/markdown-it to stay in sync with the local source (now async, v0.0.2). 2. The React Vite dev server lazily discovers @a2ui/web_core subpath imports, triggering "optimized dependencies changed. reloading" mid-page-load which causes blank screenshots in Playwright. Fix: add web_core subpath imports to optimizeDeps.include so Vite pre-bundles them upfront. --- .../react/visual-parity/package-lock.json | 84 +++++++------------ renderers/react/visual-parity/package.json | 2 +- .../react/visual-parity/react/vite.config.ts | 6 ++ 3 files changed, 35 insertions(+), 57 deletions(-) diff --git a/renderers/react/visual-parity/package-lock.json b/renderers/react/visual-parity/package-lock.json index 5ce8c4949..3b197b3ac 100644 --- a/renderers/react/visual-parity/package-lock.json +++ b/renderers/react/visual-parity/package-lock.json @@ -9,7 +9,7 @@ "version": "0.8.0", "dependencies": { "@a2ui/lit": "file:../../lit", - "@a2ui/markdown-it": "^0.0.1", + "@a2ui/markdown-it": "file:../../markdown/markdown-it", "@a2ui/react": "file:..", "@lit/context": "^1.1.0", "lit": "^3.1.0", @@ -51,6 +51,7 @@ "eslint-config-prettier": "^10.0.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^5.0.0", + "gts": "^7.0.0", "jsdom": "^28.0.0", "prettier": "^3.4.0", "react": "^18.3.0", @@ -70,7 +71,7 @@ }, "../../lit": { "name": "@a2ui/lit", - "version": "0.8.1", + "version": "0.8.2", "license": "Apache-2.0", "dependencies": { "@a2ui/web_core": "file:../web_core", @@ -86,6 +87,29 @@ "wireit": "^0.15.0-pre.2" } }, + "../../markdown/markdown-it": { + "name": "@a2ui/markdown-it", + "version": "0.0.2", + "license": "Apache-2.0", + "dependencies": { + "dompurify": "^3.3.1", + "markdown-it": "^14.1.0" + }, + "devDependencies": { + "@a2ui/web_core": "file:../../web_core", + "@types/dompurify": "^3.0.5", + "@types/jsdom": "^28.0.0", + "@types/markdown-it": "^14.1.2", + "@types/node": "^24.10.1", + "jsdom": "^28.1.0", + "prettier": "^3.4.2", + "typescript": "^5.8.3", + "wireit": "^0.15.0-pre.2" + }, + "peerDependencies": { + "@a2ui/web_core": "file:../../web_core" + } + }, "../lit": { "name": "@a2ui/lit", "version": "0.8.1", @@ -141,33 +165,13 @@ "link": true }, "node_modules/@a2ui/markdown-it": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@a2ui/markdown-it/-/markdown-it-0.0.1.tgz", - "integrity": "sha512-SIYNeUvBBO8mCa1n2haeZ3lZ5AVZSmZCpeyIMHDIMGYbGUXLCaSVU3qCdlzX78wR3xPEQ8zo8DvcezBBnVZLuA==", - "license": "Apache-2.0", - "dependencies": { - "dompurify": "^3.3.1", - "markdown-it": "^14.1.0" - }, - "peerDependencies": { - "@a2ui/web_core": "^0.8.0" - } + "resolved": "../../markdown/markdown-it", + "link": true }, "node_modules/@a2ui/react": { "resolved": "..", "link": true }, - "node_modules/@a2ui/web_core": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@a2ui/web_core/-/web_core-0.8.0.tgz", - "integrity": "sha512-UG8IDsiLYuZjnEmqH7129EbN1Ds3DfC8FXPSI/E+0kcZ4VGxo//Kij6ZF2jBXBKyrHYPehoDtffFFIIFvgBp6g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "zod": "^3.25.76", - "zod-to-json-schema": "^3.25.1" - } - }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -1695,18 +1699,6 @@ } } }, - "node_modules/dompurify": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.2.tgz", - "integrity": "sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ==", - "license": "(MPL-2.0 OR Apache-2.0)", - "engines": { - "node": ">=20" - }, - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, "node_modules/electron-to-chromium": { "version": "1.5.267", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", @@ -2552,26 +2544,6 @@ "engines": { "node": ">=12" } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", - "license": "ISC", - "peer": true, - "peerDependencies": { - "zod": "^3.25 || ^4" - } } } } diff --git a/renderers/react/visual-parity/package.json b/renderers/react/visual-parity/package.json index fcdd23d23..8a7a777da 100644 --- a/renderers/react/visual-parity/package.json +++ b/renderers/react/visual-parity/package.json @@ -16,7 +16,7 @@ }, "dependencies": { "@a2ui/lit": "file:../../lit", - "@a2ui/markdown-it": "^0.0.1", + "@a2ui/markdown-it": "file:../../markdown/markdown-it", "@a2ui/react": "file:..", "@lit/context": "^1.1.0", "lit": "^3.1.0", diff --git a/renderers/react/visual-parity/react/vite.config.ts b/renderers/react/visual-parity/react/vite.config.ts index e3cb339d8..cbe0d9b52 100644 --- a/renderers/react/visual-parity/react/vite.config.ts +++ b/renderers/react/visual-parity/react/vite.config.ts @@ -28,6 +28,12 @@ export default defineConfig({ optimizeDeps: { // Always re-optimize on startup so rebuilds of file: deps don't cause 504s force: true, + // Pre-bundle web_core subpath imports so Vite doesn't discover them lazily + // (which causes "optimized dependencies changed. reloading" mid-page-load) + include: [ + '@a2ui/web_core/styles/index', + '@a2ui/web_core/data/model-processor', + ], exclude: [ '@a2ui/react', '@a2ui/lit', From 9e53a1c5511e32d23ea356ba2690074b9ae5d442 Mon Sep 17 00:00:00 2001 From: Lukas Moschitz Date: Thu, 12 Mar 2026 13:58:10 +0100 Subject: [PATCH 2/3] Pin @a2ui/web_core to <0.8.4 to avoid TextField breakage web_core 0.8.4 renames TextField's `type` to `textFieldType` (google/A2UI#806). Pin until the React renderer is updated to match (#810). --- renderers/react/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renderers/react/package.json b/renderers/react/package.json index 921eeca17..023051eb6 100644 --- a/renderers/react/package.json +++ b/renderers/react/package.json @@ -48,7 +48,7 @@ "clean": "rm -rf dist" }, "dependencies": { - "@a2ui/web_core": "^0.8.0", + "@a2ui/web_core": "<0.8.4", "clsx": "^2.1.0", "markdown-it": "^14.0.0" }, From 3d4343f9c5d2896e1fa4acabe0ee2fbffe0ddc15 Mon Sep 17 00:00:00 2001 From: Lukas Moschitz Date: Thu, 12 Mar 2026 14:38:33 +0100 Subject: [PATCH 3/3] Add minimum version floor to @a2ui/web_core dependency --- renderers/react/package-lock.json | 2 +- renderers/react/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/renderers/react/package-lock.json b/renderers/react/package-lock.json index 68d1059ca..81736fb07 100644 --- a/renderers/react/package-lock.json +++ b/renderers/react/package-lock.json @@ -9,7 +9,7 @@ "version": "0.8.0", "license": "Apache-2.0", "dependencies": { - "@a2ui/web_core": "^0.8.0", + "@a2ui/web_core": ">=0.8.0 <0.8.4", "clsx": "^2.1.0", "markdown-it": "^14.0.0" }, diff --git a/renderers/react/package.json b/renderers/react/package.json index 023051eb6..72559c0cb 100644 --- a/renderers/react/package.json +++ b/renderers/react/package.json @@ -48,7 +48,7 @@ "clean": "rm -rf dist" }, "dependencies": { - "@a2ui/web_core": "<0.8.4", + "@a2ui/web_core": ">=0.8.0 <0.8.4", "clsx": "^2.1.0", "markdown-it": "^14.0.0" },