diff --git a/README.zh-CN.md b/README.zh-CN.md
index b4198508d..ad02dd060 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -13,7 +13,7 @@
-VRender,不只是一个功能丰富的可视化渲染引可视化渲染擎,更是一支得心应手的生花妙笔。
+VRender,不只是一个功能丰富的可视化渲染引擎,更是一支得心应手的生花妙笔。
简介 •
diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml
index 5ca07ce2f..97cf695f3 100644
--- a/common/config/rush/pnpm-lock.yaml
+++ b/common/config/rush/pnpm-lock.yaml
@@ -22,7 +22,7 @@ importers:
specifier: ~0.5.7
version: 0.5.7
'@visactor/vrender':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../packages/vrender
'@visactor/vutils':
specifier: ~1.0.12
@@ -95,7 +95,7 @@ importers:
../../packages/react-vrender:
dependencies:
'@visactor/vrender':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../vrender
'@visactor/vutils':
specifier: ~1.0.12
@@ -168,10 +168,10 @@ importers:
../../packages/react-vrender-utils:
dependencies:
'@visactor/react-vrender':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../react-vrender
'@visactor/vrender':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../vrender
'@visactor/vutils':
specifier: ~1.0.12
@@ -241,16 +241,16 @@ importers:
../../packages/vrender:
dependencies:
'@visactor/vrender-animate':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../vrender-animate
'@visactor/vrender-components':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../vrender-components
'@visactor/vrender-core':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../vrender-core
'@visactor/vrender-kits':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../vrender-kits
devDependencies:
'@internal/bundler':
@@ -320,7 +320,7 @@ importers:
../../packages/vrender-animate:
dependencies:
'@visactor/vrender-core':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../vrender-core
'@visactor/vutils':
specifier: ~1.0.12
@@ -393,13 +393,13 @@ importers:
../../packages/vrender-components:
dependencies:
'@visactor/vrender-animate':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../vrender-animate
'@visactor/vrender-core':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../vrender-core
'@visactor/vrender-kits':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../vrender-kits
'@visactor/vscale':
specifier: ~1.0.12
@@ -518,7 +518,7 @@ importers:
specifier: 2.4.1
version: 2.4.1
'@visactor/vrender-core':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../vrender-core
'@visactor/vutils':
specifier: ~1.0.12
@@ -649,19 +649,19 @@ importers:
../../tools/bugserver-trigger:
dependencies:
'@visactor/vrender':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../../packages/vrender
'@visactor/vrender-animate':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../../packages/vrender-animate
'@visactor/vrender-components':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../../packages/vrender-components
'@visactor/vrender-core':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../../packages/vrender-core
'@visactor/vrender-kits':
- specifier: workspace:1.1.8
+ specifier: workspace:1.1.9
version: link:../../packages/vrender-kits
devDependencies:
'@internal/bundler':
diff --git a/common/config/rush/version-policies.json b/common/config/rush/version-policies.json
index 2eacbf861..5db9bb35c 100644
--- a/common/config/rush/version-policies.json
+++ b/common/config/rush/version-policies.json
@@ -1 +1 @@
-[{"definitionName":"lockStepVersion","policyName":"vrenderMain","version":"1.1.8","nextBump":"patch"}]
+[{"definitionName":"lockStepVersion","policyName":"vrenderMain","version":"1.1.9","nextBump":"patch"}]
diff --git a/docs/package.json b/docs/package.json
index 978165dbe..d8810c0c6 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -13,7 +13,7 @@
"@visactor/vchart": "1.3.0",
"@visactor/vutils": "~1.0.12",
"@visactor/vgrammar": "~0.5.7",
- "@visactor/vrender": "workspace:1.1.8",
+ "@visactor/vrender": "workspace:1.1.9",
"markdown-it": "^13.0.0",
"highlight.js": "^11.8.0",
"axios": "^1.4.0",
diff --git a/multi-platform/lynx-vrender/README.md b/multi-platform/lynx-vrender/README.md
index 772ebf22a..f61597e3f 100644
--- a/multi-platform/lynx-vrender/README.md
+++ b/multi-platform/lynx-vrender/README.md
@@ -23,274 +23,82 @@ rush build -t @visactor/vrender
pnpm run sync:local
```
-当前 Lynx smoke 已切到内部标准 `create-rspeedy` 模板同形态工具链:
+工具链版本以 `package.json` 和 `pnpm-lock.yaml` 为准。公开 Lynx 项目的初始化、Explorer 安装和预览方式请参考 [Lynx 官方快速上手](https://lynxjs.org/zh/guide/start/quick-start.html)。
-- `@byted-lynx/react@0.109.3`
-- `@byted-lynx/rspeedy@0.9.9`
-- `@byted-lynx/hdt-rsbuild-plugin@0.3.6`
-- `@byted-lynx/type-lynx@3.3.0`
-
-如果需要调整 Lynx 工具链版本,应整体升级或降级这些 `@byted-lynx/*` 包,避免只升级其中一个导致 ReactLynx transform / runtime / template encoder 不匹配。
-
-标准构建入口是:
+构建产物入口是:
```text
dist/main/template.js
```
-本地静态服务示例:
-
-```text
-http://10.3.134.196:3002/main/template.js
-```
-
-不要再使用旧的 `dist/main.lynx.bundle` / `http://.../main.lynx.bundle` 入口;标准内部模板和 HDT 预览都使用 `main/template.js`。
-
-启动 dev server 后,使用 HDT/宿主扫描终端二维码,或在模拟器中输入 template URL。Rspeedy 的 host 配置在 `lynx.config.ts` 的 `server.host` 中维护,不使用 `rspeedy dev --host` CLI 参数。
-
-Canvas 不是 Lynx 默认内置 UI 能力。当前已验证的宿主会默认暴露 Canvas/Krypton bridge,因此优先直接打开 template URL:
-
-```text
-http://10.3.134.196:3002/main/template.js
-```
-
-部分宿主仍需要在 schema 中显式开启 Canvas。Polaris/sslocal 入口建议使用未转义的 `surl`,与 oncall 给出的格式保持一致:
-
-```text
-sslocal://polaris/lynx?surl={template_url}&enable_canvas=1&enable_canvas_optimize=1
-```
-
-示例:
-
-```text
-sslocal://polaris/lynx?surl=http://10.3.134.196:3002/main/template.js&enable_canvas=1&enable_canvas_optimize=1
-```
-
-其中 `enable_canvas=1` 打开 Canvas UI,`enable_canvas_optimize=1` 使用 Krypton Canvas。Lynx 2.9+ 理论上只保留 Krypton 实现。是否需要这两个参数取决于宿主入口;当前测试宿主直接打开 template URL 即可。
-
-如果使用 Lynx Explorer/Rspeedy 的普通预览入口,不要输入 `sslocal://...`,而是直接输入 template URL:
-
-```text
-http://10.3.134.196:3002/main/template.js
-```
-
-这只能验证 template 加载链路;Canvas 是否可用仍取决于 Explorer/宿主是否默认开启 Canvas,或是否提供等价的开关入口。如果 raw `sslocal://...` 仍不能进入页面,需要确认宿主是否允许加载局域网 HTTP template;必要时把 `dist/main/template.js` 放到宿主可访问的 HTTPS 地址后再作为 `surl`。
-
-### iOS 模拟器 URL-only 入口
-
-如果 iOS 模拟器只能填写 template URL,无法使用 `sslocal://...` schema,优先直接输入:
-
-```text
-http://10.3.134.196:3002/main/template.js
-```
-
-当前宿主已验证不需要把 `enable_canvas=1&enable_canvas_optimize=1` 作为 template URL query 追加。如果页面仍显示 `Canvas disabled`,并且 diagnostics 中 `lynx.krypton keys` / `lynx keys` 仍没有 `createCanvasNG`、`CanvasElement` 或 `createCanvas`,则说明该宿主入口没有暴露 Canvas/Krypton。这种情况下已经不属于 VRender 创建 canvas 的问题,需要换成支持 schema 参数的入口,或使用默认接入 Krypton Canvas 的宿主/模拟器包。
-
-### iPhone 真机入口
-
-真机更适合确认宿主 Canvas 能力,因为它能排除 iOS 模拟器 URL-only 入口的限制。前提是 iPhone 与本机在同一网络,且手机能访问 dev server:
-
-```text
-http://10.3.134.196:3002/main/template.js
-```
-
-如果真机宿主支持打开完整 schema,优先使用:
-
-```text
-sslocal://polaris/lynx?surl=http://10.3.134.196:3002/main/template.js&enable_canvas=1&enable_canvas_optimize=1
-```
-
-如果真机入口也只能填写 template URL,当前已验证直接使用 template URL 即可:
-
-```text
-http://10.3.134.196:3002/main/template.js
-```
-
-判定标准与模拟器一致:只要页面 diagnostics 中能看到 `lynx.krypton.createCanvasNG`、`lynx.krypton.CanvasElement`、`lynx.createCanvasNG` 或 `lynx.createCanvas`,就可以继续验证 VRender 渲染、动画和事件;如果仍然没有这些 key,说明该真机宿主入口没有开启 Canvas/Krypton,需要换宿主包或让宿主侧打开 Canvas 开关。
-
-### 可用宿主 App 候选
-
-按优先级尝试:
-
-1. 内部 Polaris / Lynx 宿主
- - oncall 给出的 `sslocal://polaris/lynx?...&enable_canvas=1&enable_canvas_optimize=1` schema 明确对应这一类宿主。
- - 这是最可能验证 Krypton Canvas 的入口,但需要内部 iOS 真机包,并确认宿主已接入 Krypton。
-2. App Store 社区版 Lynx Go - Dev Explorer
- - App Store 地址:https://apps.apple.com/us/app/lynx-go-dev-explorer/id6743227790
- - 官方 Lynx Quick Start 提到 App Store 上有社区贡献版本,但也说明它不是 Lynx 团队审查和维护的版本。
- - 可用于快速验证 bundle 加载;是否支持 Canvas/Krypton 需要以本 smoke 页面 diagnostics 为准。
-3. 官方 Lynx Explorer 源码构建
- - 官方文档说明 iOS 真机没有官方预构建包,需要从源码构建。
- - 源码入口:https://github.com/lynx-family/lynx/tree/develop/explorer/darwin/ios
- - 构建要求较重,文档要求 Xcode 15+、Python/Ruby 等环境,并提示需要较大磁盘空间。适合作为长期稳定的真机宿主方案。
-
-### LynxDesktop 注意事项
-
-如果用 LynxDesktop 打开 `main.lynx.bundle` 出现:
-
-```text
-code: 10204
-message: Decode error: unknown Decode Error
-```
-
-优先按入口问题处理,而不是按 VRender 渲染问题处理:
+启动开发服务器后,使用终端输出的二维码或 bundle URL 在 Lynx Explorer 中打开页面。不要在文档中固化本机地址;Rspeedy 的服务配置统一维护在 `lynx.config.ts` 中。
-- 当前 smoke 默认产物是标准 Rspeedy template,路径是 `dist/main/template.js`,不是旧的 `main.lynx.bundle`。
-- 如果旧的 `main.lynx.bundle` 在 LynxDesktop 里报 `10204`,优先确认入口是否应改成 `main/template.js`。只有标准模板仍报 `10204` 时,才继续排查 LynxDesktop 对当前 Rspeedy template 协议的支持。
-- 这类情况需要向 LynxDesktop owner 确认它要求的 app bundle 生成方式、URL 协议或项目打包入口。继续调整 VRender smoke 的 Lynx 版本无法证明 VRender 端能力。
-- 当前 VRender Lynx smoke 依赖 `lynx.krypton` / `createCanvasNG` 这类宿主 Canvas bridge。即使 LynxDesktop 能成功打开页面,也仍需看 diagnostics 是否暴露 Canvas bridge,才能继续验证 VRender Canvas 渲染。
+运行环境需要提供 VRender 所需的原生渲染适配。能力缺失时只能验证构建与页面加载,不能据此判断图形渲染是否正常。
-页面显示 `Canvas disabled` 时,说明当前 JS runtime 没有暴露 VRender 可用的 Canvas bridge。页面会同时输出 runtime diagnostics;重点看:
+## 页面操作
-- `scope lynx` 是否为 `present`。ReactLynx/Rspeedy 的 background runtime 可能把 `lynx` 作为模块作用域变量注入,而不是挂在 `globalThis.lynx` 上。
-- `lynx.krypton keys` 是否包含 `createCanvas`
-- `lynx.krypton keys` 是否包含 `createCanvasNG` 或 `CanvasElement`
-- `lynx keys` 是否包含 `createCanvasNG` 或 `createCanvas`
-- 如果这些 key 都是 `none`,则当前打开入口没有真正启用 Canvas/Krypton,或宿主没有接入 Krypton。
+页面顶部按钮用于切换场景。普通切换会复用同一个 VRender app/stage,清理旧场景的动画、定时器和节点后再重绘;完整 release 只发生在 React unmount 或生命周期测试边界。
-## 当前覆盖
-
-Lynx smoke 已从单页 demo 整理为多场景测试页。页面顶部场景按钮会切换场景;普通切页会复用同一个 VRender app/stage,在 controller 内执行 `clearScene()`、停止动画/定时器并重绘目标场景,避免频繁创建和释放 Lynx Canvas/native 资源导致模拟器卡顿。完整 stage/app release 只发生在 React unmount 或测试生命周期边界。底部按钮含义:
+底部按钮含义:
-- `更新`:执行当前场景的主要属性/资源/批量更新。
+- `更新`:执行当前场景的主要属性、资源或批量更新。
- `状态/控制`:执行当前场景的状态或动画控制动作。
- `重绘`:重新创建当前场景。
-已覆盖场景:
-
-- `图元`:rect、circle、symbol、line、area、arc、path、polygon;覆盖 fill/stroke/lineWidth/cornerRadius/opacity/lineDash/linear gradient/radial gradient/shadow,点击 rect 验证状态与拾取。
-- `文本`:普通 text、多行文本、wrap text、rich text、underline、lineThrough。
-- `资源`:探测 `lynx.createImage` 与 `lynx.createOffscreenCanvas`;有 offscreen canvas 时用 canvas object 作为 image 资源,覆盖 contain/cover/fill、圆角、透明度、资源替换和拾取;无能力时页面内明确 fallback。
-- `动画`:from/to/wait/loop/bounce,覆盖颜色、位置、尺寸、透明度动画;按钮覆盖 pause/resume 与 stop(end)。
-- `状态`:setStates、addState、removeState、toggleState、同状态 patch 刷新。
-- `变换`:嵌套 group、clip、opacity、zIndex、旋转/缩放/位移和 transform 后拾取。
-- `组件`:首屏挂载 Tag、Segment、ArcSegment、LineAxis、CircleAxis、DiscreteLegend、Slider、DataZoom、CheckBox、Radio、Switch、ScrollBar、Title、Indicator、Tooltip。Tag 点击会切换 selected 状态。DataZoom 会在底部状态文案和 console 记录内部 hit target 的 `pointerdown`,再通过 `dataZoomChange` 验证组件原生拖拽更新链路;同时提供 Lynx smoke adapter 路径和透明 fallback hit area,用 VRender public API `setStartAndEnd()` 驱动区域变化,避免宿主 touch drag 差异导致无法继续人工验收其他组件能力。组件创建失败时在画布内显示失败标签,不阻断其他场景。
-- `事件`:touchstart/touchmove/touchend/touchcancel 转发到 `stage.window.dispatchEvent()`,覆盖重叠图元、zIndex、旋转分组、clip group 内节点拾取。
-- `批量`:48 个批量节点,覆盖批量创建、批量 setAttribute、透明度/描边样式和节点拾取。
-- `几何`:line/area/polygon/path/arc/symbol 的几何属性更新、bounds 和重绘。
-- `生命周期`:removeAllChild(true)、节点重建、场景切换清理旧节点/动画/定时器、React unmount 时 release stage/app。
-
-### 人工验收清单
-
-打开当前可用 URL:
-
-```text
-http://10.3.134.196:3002/main/template.js
-```
-
-逐项验收:
+## 当前覆盖
-1. 页面状态从 `waiting/mounting` 变为 `rendered`,画布内能看到当前场景标题。
-2. 顶部每个场景按钮都能切换,切换后旧动画不继续影响新场景。
-3. `图元`:点击左上矩形,状态在 selected/normal 间切换;点 `更新` 后渐变、阴影、圆角和 symbol 类型变化。
-4. `文本`:普通文本、多行、wrap、rich text 和文字装饰均可见,无明显重叠。
-5. `资源`:先看桥接能力文案。若 offscreen 可用,应显示 3 个 image 图元,点击图片可变透明,点 `更新` 可替换资源;若不可用,应显示红色 fallback 文案。
-6. `动画`:pulse、mover、star、bar 动画持续推进;点 `更新` 暂停/恢复 mover;点 `状态/控制` 让 stop rect 到达终态。
-7. `状态`:点 `更新` 刷新 rect 同状态 patch;点 `状态/控制` 切换 circle active;点击 diamond 走 toggleState。
-8. `变换`:裁剪区域正常裁剪;点 group 能命中;点 `更新` 后旋转、缩放、透明度和 zIndex 变化。
-9. `组件`:首屏组件可见且切换耗时会显示在底部状态文案;点击 Tag 后蓝色背景应切到绿色 selected,再次点击恢复;Slider/Legend/输入控件能尝试点击或拖动。DataZoom 首屏应可见;点击或拖动 DataZoom 背景、选中区域、左右手柄或中间手柄时,底部状态和 console 应先出现 `DataZoom ... pointerdown`。拖动时如果出现 `touch/global-touch/mouse/global-mouse touchmove ... dispatch=true`,说明 Lynx 入口 move 已送进 VRender;如果随后出现 `DataZoom dataZoomChange (start=... end=...)`,说明组件原生拖拽链路生效;如果出现 `DataZoom lynx drag (...) start=... end=...` 且区域可见变化,说明 Lynx smoke adapter 已用 `setStartAndEnd()` 驱动区域变化,组件内部原生拖拽链路仍需继续排查;如果只出现 `DataZoom smoke-hit-area pointerdown`,说明透明 fallback hit area 接住了事件,DataZoom 内部图元拾取仍异常;如果连该日志都没有,说明事件没有到达组件区域或 canvas 坐标映射仍异常。失败组件会显示 `failed`,需要记录 console 调用链。
-10. `事件`:点击重叠区域、旋转 group、clip 内圆点,底部状态文案应显示对应命中目标。
-11. `批量`:点击任意节点能命中,点 `更新` 后 48 个节点批量变色/变透明。
-12. `几何`:点 `更新` 后 line/area/polygon/arc/path/symbol 几何变化并正确重绘。
-13. `生命周期`:点 `更新` 后组内节点重建;反复切换场景后无旧节点残留、无旧动画串场,底部/console 的切换耗时不应随着点击次数持续劣化。
+- `图元`:rect、circle、symbol、line、area、arc、path、polygon,以及常用填充、描边、渐变、阴影和拾取行为。
+- `文本`:普通文本、多行文本、自动换行、富文本和文字装饰。
+- `资源`:图片资源创建、更新、适配模式、透明度和拾取;能力不可用时显示降级提示。
+- `动画`:from/to/wait/loop/bounce,以及 pause/resume 和 stop(end)。
+- `状态`:setStates、addState、removeState、toggleState 和同状态 patch 刷新。
+- `变换`:嵌套 group、clip、opacity、zIndex、旋转、缩放、位移和变换后拾取。
+- `组件`:Tag、Segment、坐标轴、图例、Slider、DataZoom、表单控件、ScrollBar、Title、Indicator 和 Tooltip。
+- `事件`:触摸与鼠标事件转发、重叠图元、zIndex、旋转分组和 clip group 内节点拾取。
+- `批量`:批量创建、属性更新、样式更新和节点拾取。
+- `几何`:line、area、polygon、path、arc、symbol 的几何属性更新、bounds 和重绘。
+- `生命周期`:节点清理与重建、场景切换清理,以及 React unmount 时释放 stage/app。
+
+## 人工验收
+
+使用 `pnpm run dev` 输出的 bundle URL 打开页面后,逐项确认:
+
+1. 页面状态从 `waiting/mounting` 变为 `rendered`。
+2. 所有场景均可切换,旧动画和定时器不会影响新场景。
+3. 每个场景的 `更新`、`状态/控制` 和 `重绘` 行为符合页面说明。
+4. 图元、文本、资源、动画、状态、变换和几何更新可见且无明显重叠或残留。
+5. 组件可见,基础点击或拖动能更新页面状态;失败项会显示 `failed`,需记录 console 调用链。
+6. 事件场景能命中重叠图元、变换分组和裁剪区域内节点。
+7. 反复切换场景后无旧节点残留、无动画串场,切换耗时不随次数持续劣化。
+8. 生命周期场景完成节点重建,并在页面卸载时释放资源。
## Lynx 接入注意事项
-- 使用 `createLynxVRenderApp` 创建 app,避免污染全局 VRender application;同一页面存在多个 VRender 使用者时,推荐上层通过 `acquireSharedVRenderApp({ env: 'lynx', key })` 共享同一个 app。
-- smoke 页应区分普通 scene switch 和完整生命周期测试:普通场景按钮复用同一个 app/stage,只清理并重绘 scenegraph;不要把每次切页都实现成 `createLynxVRenderApp()` / `createStage()` / `release()` 循环,否则 Lynx 模拟器容易因为 native Canvas 资源反复创建释放而快速卡顿。
-- 宿主客户端需要接入 Krypton。部分宿主的页面 schema 需要带 `enable_canvas=1&enable_canvas_optimize=1`;当前测试宿主直接打开 template URL 已可用。如果宿主缺少 Canvas 配置,Lynx 会在创建 `