mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-04-14 16:40:58 -04:00
use DOM height only for safari to fix LS
This commit is contained in:
parent
f21a6b587a
commit
d75889238d
3 changed files with 18 additions and 30 deletions
|
@ -289,10 +289,13 @@ export const measureText = (
|
||||||
.map((x) => x || " ")
|
.map((x) => x || " ")
|
||||||
.join("\n");
|
.join("\n");
|
||||||
const fontSize = parseFloat(font);
|
const fontSize = parseFloat(font);
|
||||||
const height = getTextHeight(text, fontSize, lineHeight);
|
let height = getTextHeight(text, fontSize, lineHeight);
|
||||||
const width = getTextWidth(text, font);
|
const width = getTextWidth(text, font);
|
||||||
const { baseline } = getDOMMetrics(text, font, lineHeight);
|
const domMetrics = getDOMMetrics(text, font, lineHeight);
|
||||||
return { width, height, baseline };
|
if (isSafari) {
|
||||||
|
height = domMetrics.height;
|
||||||
|
}
|
||||||
|
return { width, height, baseline: domMetrics.baseline };
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getDOMMetrics = (
|
export const getDOMMetrics = (
|
||||||
|
@ -313,7 +316,6 @@ export const getDOMMetrics = (
|
||||||
}
|
}
|
||||||
|
|
||||||
container.style.lineHeight = String(lineHeight);
|
container.style.lineHeight = String(lineHeight);
|
||||||
const canvasHeight = getTextHeight(text, parseFloat(font), lineHeight);
|
|
||||||
|
|
||||||
container.innerText = text;
|
container.innerText = text;
|
||||||
|
|
||||||
|
@ -326,23 +328,9 @@ export const getDOMMetrics = (
|
||||||
span.style.width = "1px";
|
span.style.width = "1px";
|
||||||
span.style.height = "1px";
|
span.style.height = "1px";
|
||||||
container.appendChild(span);
|
container.appendChild(span);
|
||||||
let baseline = span.offsetTop + span.offsetHeight;
|
const baseline = span.offsetTop + span.offsetHeight;
|
||||||
const height = container.offsetHeight;
|
const height = container.offsetHeight;
|
||||||
|
|
||||||
if (isSafari) {
|
|
||||||
// In Safari sometimes DOM height could be less than canvas height due to
|
|
||||||
// which text could go out of the bounding box hence shifting the baseline
|
|
||||||
// to make sure text is rendered correctly
|
|
||||||
if (canvasHeight > height) {
|
|
||||||
baseline += canvasHeight - height;
|
|
||||||
}
|
|
||||||
// In Safari sometimes DOM height could be more than canvas height due to
|
|
||||||
// which text could go out of the bounding box hence shifting the baseline
|
|
||||||
// to make sure text is rendered correctly
|
|
||||||
if (height > canvasHeight) {
|
|
||||||
baseline -= height - canvasHeight;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
document.body.removeChild(container);
|
document.body.removeChild(container);
|
||||||
return { baseline, height };
|
return { baseline, height };
|
||||||
};
|
};
|
||||||
|
|
|
@ -35,8 +35,6 @@ import {
|
||||||
getMaxContainerHeight,
|
getMaxContainerHeight,
|
||||||
getMaxContainerWidth,
|
getMaxContainerWidth,
|
||||||
computeContainerDimensionForBoundText,
|
computeContainerDimensionForBoundText,
|
||||||
getDOMMetrics,
|
|
||||||
splitIntoLines,
|
|
||||||
} from "./textElement";
|
} from "./textElement";
|
||||||
import {
|
import {
|
||||||
actionDecreaseFontSize,
|
actionDecreaseFontSize,
|
||||||
|
@ -46,6 +44,7 @@ import { actionZoomIn, actionZoomOut } from "../actions/actionCanvas";
|
||||||
import App from "../components/App";
|
import App from "../components/App";
|
||||||
import { LinearElementEditor } from "./linearElementEditor";
|
import { LinearElementEditor } from "./linearElementEditor";
|
||||||
import { parseClipboard } from "../clipboard";
|
import { parseClipboard } from "../clipboard";
|
||||||
|
import { splitIntoLines } from "./textElement";
|
||||||
|
|
||||||
const getTransform = (
|
const getTransform = (
|
||||||
width: number,
|
width: number,
|
||||||
|
@ -273,16 +272,13 @@ export const textWysiwyg = ({
|
||||||
} else {
|
} else {
|
||||||
textElementWidth += 0.5;
|
textElementWidth += 0.5;
|
||||||
}
|
}
|
||||||
const { height: domHeight } = getDOMMetrics(
|
|
||||||
updatedTextElement.text,
|
|
||||||
getFontString(updatedTextElement),
|
|
||||||
updatedTextElement.lineHeight,
|
|
||||||
);
|
|
||||||
|
|
||||||
let lineHeight = element.lineHeight;
|
let lineHeight = element.lineHeight;
|
||||||
if (isSafari && domHeight > textElementHeight) {
|
if (isSafari) {
|
||||||
lineHeight = (Math.floor(element.lineHeight * element.fontSize) /
|
//@ts-ignore
|
||||||
element.fontSize) as ExcalidrawTextElement["lineHeight"];
|
lineHeight = `${
|
||||||
|
element.height / splitIntoLines(element.text).length
|
||||||
|
}px`;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure text editor height doesn't go beyond viewport
|
// Make sure text editor height doesn't go beyond viewport
|
||||||
|
|
|
@ -34,6 +34,7 @@ import { AppState, BinaryFiles, Zoom } from "../types";
|
||||||
import { getDefaultAppState } from "../appState";
|
import { getDefaultAppState } from "../appState";
|
||||||
import {
|
import {
|
||||||
BOUND_TEXT_PADDING,
|
BOUND_TEXT_PADDING,
|
||||||
|
isSafari,
|
||||||
MAX_DECIMALS_FOR_SVG_EXPORT,
|
MAX_DECIMALS_FOR_SVG_EXPORT,
|
||||||
MIME_TYPES,
|
MIME_TYPES,
|
||||||
SVG_NS,
|
SVG_NS,
|
||||||
|
@ -285,10 +286,13 @@ const drawElementOnCanvas = (
|
||||||
: element.textAlign === "right"
|
: element.textAlign === "right"
|
||||||
? element.width
|
? element.width
|
||||||
: 0;
|
: 0;
|
||||||
const lineHeightPx = getLineHeightInPx(
|
let lineHeightPx = getLineHeightInPx(
|
||||||
element.fontSize,
|
element.fontSize,
|
||||||
element.lineHeight,
|
element.lineHeight,
|
||||||
);
|
);
|
||||||
|
if (isSafari) {
|
||||||
|
lineHeightPx = element.height / lines.length;
|
||||||
|
}
|
||||||
const verticalOffset = element.height - element.baseline;
|
const verticalOffset = element.height - element.baseline;
|
||||||
for (let index = 0; index < lines.length; index++) {
|
for (let index = 0; index < lines.length; index++) {
|
||||||
context.fillText(
|
context.fillText(
|
||||||
|
|
Loading…
Add table
Reference in a new issue