# 06 · 渲染后端

## 原则

渲染层**不承担正确性责任**：能被渲染的文档都已通过（或被人类路线明确
接受为视觉债的）不崩谓词。渲染只消费 `Document + SolvedLayout`。

## 路径

| 后端 | 库 | 状态 | 用途 |
| :--- | :--- | :--- | :--- |
| SVG 字符串 | `core/svg.mbt`（内置） | **已实现** | 管线验收、测试断言、静态导出 |
| SVG 场景图 | `mizchi/svg`（含解析器、CPU 光栅化器） | M1 | 主渲染路径：编辑器画布直接挂 SVG，且可离屏光栅化为 Image |
| 声明式矢量 | `vg`（SVG / PDF / Canvas 三后端，支持渐变与变换） | M3 | 高保真导出与复杂矢量 |
| Canvas 2D | `mizchi/js_browser/canvas` | M2 | 高频交互帧（拖拽中的临时层、吸附辅助线） |

## core/svg.mbt 的职责边界

当前实现把 `Document` 直接走 `solve()` 后输出确定性 SVG：节点按树序输出
`<rect>` / `<text>`，Text 基线按字号近似，Rect 非空 `text` 渲染为居中标签
（按钮/输入框）。**它是管线验收工具，不是最终编辑器渲染器**——确定性输出
让 `moon test` 可以直接断言渲染内容（`contains("登录")`）。

M1 切换到 `mizchi/svg` 时：`render_svg` 改为产出 `SVGNode` 树，字符串序列化
退化为其中一个后端；谓词与布局层零改动。

## 编辑器渲染的分工（kwiver 模式）

- MoonBit 侧：布局求解 + 谓词 + 渲染计划（每个节点的最终几何与层级）；
- 浏览器侧：把渲染计划画出来，处理指针事件、选框、辅助线等**瞬态交互状态**；
- 瞬态状态永不进入文档模型——拖拽中的红色警示框是视图，松手后的
  视觉债记录才是模型。
