fix: align svg frame bg with canvas
This commit is contained in:
@@ -24,6 +24,7 @@ import { getBoundTextElement, getContainerElement } from "@excalidraw/element";
|
|||||||
import { getLineHeightInPx } from "@excalidraw/element";
|
import { getLineHeightInPx } from "@excalidraw/element";
|
||||||
import {
|
import {
|
||||||
isArrowElement,
|
isArrowElement,
|
||||||
|
isFrameElement,
|
||||||
isFrameLikeElement,
|
isFrameLikeElement,
|
||||||
isIframeLikeElement,
|
isIframeLikeElement,
|
||||||
isInitializedImageElement,
|
isInitializedImageElement,
|
||||||
@@ -40,6 +41,7 @@ import { getElementAbsoluteCoords } from "@excalidraw/element";
|
|||||||
|
|
||||||
import type {
|
import type {
|
||||||
ExcalidrawElement,
|
ExcalidrawElement,
|
||||||
|
ExcalidrawFrameElement,
|
||||||
ExcalidrawFrameLikeElement,
|
ExcalidrawFrameLikeElement,
|
||||||
ExcalidrawTextElementWithContainer,
|
ExcalidrawTextElementWithContainer,
|
||||||
NonDeletedExcalidrawElement,
|
NonDeletedExcalidrawElement,
|
||||||
@@ -723,10 +725,10 @@ export const renderSceneToSvg = (
|
|||||||
const nonIframeElements = elements.filter((el) => !isIframeLikeElement(el));
|
const nonIframeElements = elements.filter((el) => !isIframeLikeElement(el));
|
||||||
const frameBackgroundByElementId = new Map<
|
const frameBackgroundByElementId = new Map<
|
||||||
ExcalidrawElement["id"],
|
ExcalidrawElement["id"],
|
||||||
ExcalidrawFrameLikeElement
|
ExcalidrawFrameElement
|
||||||
>();
|
>();
|
||||||
|
|
||||||
const renderFrameBackgroundNode = (frame: ExcalidrawFrameLikeElement) => {
|
const renderFrameBackgroundNode = (frame: ExcalidrawFrameElement) => {
|
||||||
if (
|
if (
|
||||||
!frame ||
|
!frame ||
|
||||||
!frame.backgroundColor ||
|
!frame.backgroundColor ||
|
||||||
@@ -773,7 +775,10 @@ export const renderSceneToSvg = (
|
|||||||
(renderConfig.frameRendering.outline || renderConfig.exportingFrame)
|
(renderConfig.frameRendering.outline || renderConfig.exportingFrame)
|
||||||
) {
|
) {
|
||||||
const renderedFrameBackgrounds = new Set<string>();
|
const renderedFrameBackgrounds = new Set<string>();
|
||||||
if (renderConfig.exportingFrame) {
|
if (
|
||||||
|
renderConfig.exportingFrame &&
|
||||||
|
isFrameElement(renderConfig.exportingFrame)
|
||||||
|
) {
|
||||||
renderFrameBackgroundNode(renderConfig.exportingFrame);
|
renderFrameBackgroundNode(renderConfig.exportingFrame);
|
||||||
renderedFrameBackgrounds.add(renderConfig.exportingFrame.id);
|
renderedFrameBackgrounds.add(renderConfig.exportingFrame.id);
|
||||||
}
|
}
|
||||||
@@ -786,7 +791,7 @@ export const renderSceneToSvg = (
|
|||||||
: getContainingFrame(element, elementsMap);
|
: getContainingFrame(element, elementsMap);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!frame ||
|
!isFrameElement(frame) ||
|
||||||
renderedFrameBackgrounds.has(frame.id) ||
|
renderedFrameBackgrounds.has(frame.id) ||
|
||||||
!frame.backgroundColor ||
|
!frame.backgroundColor ||
|
||||||
isTransparent(frame.backgroundColor)
|
isTransparent(frame.backgroundColor)
|
||||||
|
|||||||
@@ -577,6 +577,43 @@ describe("exporting frames", () => {
|
|||||||
).toBeTruthy();
|
).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should not render magicframe background", async () => {
|
||||||
|
const magicframe = API.createElement({
|
||||||
|
type: "magicframe",
|
||||||
|
width: 100,
|
||||||
|
height: 100,
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
backgroundColor: "#ffc9c9",
|
||||||
|
});
|
||||||
|
const frameChild = API.createElement({
|
||||||
|
type: "rectangle",
|
||||||
|
width: 50,
|
||||||
|
height: 50,
|
||||||
|
x: 10,
|
||||||
|
y: 10,
|
||||||
|
frameId: magicframe.id,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { exportedElements, exportingFrame } = prepareElementsForExport(
|
||||||
|
[frameChild, magicframe],
|
||||||
|
{
|
||||||
|
selectedElementIds: {},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
|
||||||
|
const svg = await exportToSvg({
|
||||||
|
elements: exportedElements,
|
||||||
|
files: null,
|
||||||
|
exportPadding: 0,
|
||||||
|
exportingFrame,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(svg.querySelector(`[data-id="${magicframe.id}"]`)).not.toBeNull();
|
||||||
|
expect(svg.querySelector('rect[fill="#ffc9c9"]')).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
it("should not export frame-overlapping elements belonging to different frame", async () => {
|
it("should not export frame-overlapping elements belonging to different frame", async () => {
|
||||||
const frame1 = API.createElement({
|
const frame1 = API.createElement({
|
||||||
type: "frame",
|
type: "frame",
|
||||||
|
|||||||
Reference in New Issue
Block a user