First slice of the Effects gap — the property panel's 效果 section was a header-only stub with no data behind it. - `Effect` / `DropShadow` types in `document.rs`; `Node.effects: Vec<Effect>` (offset_x/y + blur + color, doc-px). Both `Node` builders + `deep_clone_with_new_ids` carry it. - `persistence_effects.rs` — `ShadowPayload` + `effects_to_payload` / `effects_from_payload`; `NodePayload.effects` is `#[serde(default)]` so legacy `.op` files still load. Carved into its own module so `persistence.rs` stays under the 800-line cap. - Round-trip tested through the real serde JSON path (2 tests). 858 workspace tests pass. Still pending (own slices): canvas drop-shadow paint (needs a blur primitive on `RenderBackend`), the property-panel 效果 editing rows, and a `set_node_shadow` MCP tool. Shadows currently round-trip through save/load but do not yet render. |
||
|---|---|---|
| .. | ||
| src | ||
| tests | ||
| Cargo.toml | ||