Single ClipInfo can't faithfully encode `(rrect ∩ rrect)` whenever one rect cuts inside the other's corner. The previous fix collapsed nested clips into one ClipInfo and dropped one side's rounded corner — which meant a rounded modal containing rounded cards would silently lose either the modal's rounding or the card's rounding at paint time. Fix: replace the single `RenderNode.clipRect: ClipInfo | undefined` with `clipStack: ClipInfo[]`. Flatten time accumulates a stack from outer-most ancestor down to the immediate clip-introducing parent. Paint time pushes each entry as its own canvas.save+clipRect/clipRRect — Skia's clip stack intersects them naturally, so each level's rounded corner is enforced independently. Touched: - types.ts: export ClipInfo, replace clipRect with clipStack - document-flattener.ts: thread `clipStack: ClipInfo[]` through recursion; push to a copy when isRootFrame || explicitClip - node-renderer.ts paint: loop over clipStack, push N save+clip ops, pop the same N at the end - renderer.ts (root frame label loop) + skia-engine.ts (root frame label loop) + focus-fit.ts (auto-fit excludes clipped descendants) + global-export.ts (page bounds): all check clipStack.length instead of truthy single field - skia-interaction.ts: drag/resize/rotate snapshots store and restore clipStack arrays (deep-cloned per entry) - Tests updated + 1 new test: rounded modal containing rounded card preserves both rrects on the inner content's clip stack |
||
|---|---|---|
| .. | ||
| cli | ||
| desktop | ||
| web | ||