Compare commits

..

2 Commits

Author SHA1 Message Date
dwelle
f5f4ec7528 remove fileHandle from IDB if user rejects permission 2021-06-13 17:59:18 +02:00
dwelle
ba705a099a persist fileHandle to IDB across sessions 2021-06-13 17:59:17 +02:00
88 changed files with 1453 additions and 2698 deletions

2
.gitignore vendored
View File

@@ -5,11 +5,9 @@
.env.test.local .env.test.local
.envrc .envrc
.eslintcache .eslintcache
.history
.idea .idea
.vercel .vercel
.vscode .vscode
.yarn
*.log *.log
*.tgz *.tgz
build build

View File

@@ -10,7 +10,7 @@ ARG NODE_ENV=production
COPY . . COPY . .
RUN yarn build:app:docker RUN yarn build:app:docker
FROM nginx:1.21-alpine FROM nginx:1.17-alpine
COPY --from=build /opt/node_app/build /usr/share/nginx/html COPY --from=build /opt/node_app/build /usr/share/nginx/html

View File

@@ -93,7 +93,7 @@ These instructions will get you a copy of the project up and running on your loc
#### Requirements #### Requirements
- [Node.js](https://nodejs.org/en/) - [Node.js](https://nodejs.org/en/)
- [Yarn](https://yarnpkg.com/getting-started/install) (v1 or v2.4.2+) - [Yarn](https://yarnpkg.com/getting-started/install)
- [Git](https://git-scm.com/downloads) - [Git](https://git-scm.com/downloads)
#### Clone the repo #### Clone the repo

View File

@@ -27,10 +27,11 @@
"@types/react": "17.0.3", "@types/react": "17.0.3",
"@types/react-dom": "17.0.3", "@types/react-dom": "17.0.3",
"@types/socket.io-client": "1.4.36", "@types/socket.io-client": "1.4.36",
"browser-fs-access": "0.18.0", "browser-fs-access": "0.16.4",
"clsx": "1.1.1", "clsx": "1.1.1",
"firebase": "8.3.3", "firebase": "8.3.3",
"i18next-browser-languagedetector": "6.1.0", "i18next-browser-languagedetector": "6.1.0",
"idb-keyval": "5.0.6",
"lodash.throttle": "4.1.1", "lodash.throttle": "4.1.1",
"nanoid": "3.1.22", "nanoid": "3.1.22",
"open-color": "1.8.0", "open-color": "1.8.0",

View File

@@ -38,8 +38,7 @@ const crowdinMap = {
"zh-CN": "en-zhcn", "zh-CN": "en-zhcn",
"zh-TW": "en-zhtw", "zh-TW": "en-zhtw",
"lv-LV": "en-lv", "lv-LV": "en-lv",
"cs-CZ": "en-cs", "cs-CZ": "cs-cz",
"kk-KZ": "en-kk",
}; };
const flags = { const flags = {
@@ -79,7 +78,6 @@ const flags = {
"zh-TW": "🇹🇼", "zh-TW": "🇹🇼",
"lv-LV": "🇱🇻", "lv-LV": "🇱🇻",
"cs-CZ": "🇨🇿", "cs-CZ": "🇨🇿",
"kk-KZ": "🇰🇿",
}; };
const languages = { const languages = {
@@ -119,7 +117,6 @@ const languages = {
"zh-TW": "繁體中文", "zh-TW": "繁體中文",
"lv-LV": "Latviešu", "lv-LV": "Latviešu",
"cs-CZ": "Česky", "cs-CZ": "Česky",
"kk-KZ": "Қазақ тілі",
}; };
const percentages = fs.readFileSync( const percentages = fs.readFileSync(

View File

@@ -1,39 +0,0 @@
const fs = require("fs");
const util = require("util");
const exec = util.promisify(require("child_process").exec);
const updateReadme = require("./updateReadme");
const updateChangelog = require("./updateChangelog");
const excalidrawDir = `${__dirname}/../src/packages/excalidraw`;
const excalidrawPackage = `${excalidrawDir}/package.json`;
const updatePackageVersion = (nextVersion) => {
const pkg = require(excalidrawPackage);
pkg.version = nextVersion;
const content = `${JSON.stringify(pkg, null, 2)}\n`;
fs.writeFileSync(excalidrawPackage, content, "utf-8");
};
const release = async (nextVersion) => {
try {
updateReadme();
await updateChangelog(nextVersion);
updatePackageVersion(nextVersion);
await exec(`git add -u`);
await exec(
`git commit -m "docs: release excalidraw@excalidraw@${nextVersion} 🎉"`,
);
/* eslint-disable no-console */
console.log("Done!");
} catch (e) {
console.error(e);
process.exit(1);
}
};
const nextVersion = process.argv.slice(2)[0];
if (!nextVersion) {
console.error("Pass the next version to release!");
process.exit(1);
}
release(nextVersion);

View File

@@ -1,97 +0,0 @@
const fs = require("fs");
const util = require("util");
const exec = util.promisify(require("child_process").exec);
const excalidrawDir = `${__dirname}/../src/packages/excalidraw`;
const excalidrawPackage = `${excalidrawDir}/package.json`;
const pkg = require(excalidrawPackage);
const lastVersion = pkg.version;
const existingChangeLog = fs.readFileSync(
`${excalidrawDir}/CHANGELOG.md`,
"utf8",
);
const supportedTypes = ["feat", "fix", "style", "refactor", "perf", "build"];
const headerForType = {
feat: "Features",
fix: "Fixes",
style: "Styles",
refactor: " Refactor",
perf: "Performance",
build: "Build",
};
const getCommitHashForLastVersion = async () => {
try {
const commitMessage = `"release @excalidraw/excalidraw@${lastVersion}"`;
const { stdout } = await exec(
`git log --format=format:"%H" --grep=${commitMessage}`,
);
return stdout;
} catch (e) {
console.error(e);
}
};
const getLibraryCommitsSinceLastRelease = async () => {
const commitHash = await getCommitHashForLastVersion();
const { stdout } = await exec(
`git log --pretty=format:%s ${commitHash}...master`,
);
const commitsSinceLastRelease = stdout.split("\n");
const commitList = {};
supportedTypes.forEach((type) => {
commitList[type] = [];
});
commitsSinceLastRelease.forEach((commit) => {
const indexOfColon = commit.indexOf(":");
const type = commit.slice(0, indexOfColon);
if (!supportedTypes.includes(type)) {
return;
}
const messageWithoutType = commit.slice(indexOfColon + 1).trim();
const messageWithCapitalizeFirst =
messageWithoutType.charAt(0).toUpperCase() + messageWithoutType.slice(1);
const prNumber = commit.match(/\(#([0-9]*)\)/)[1];
// return if the changelog already contains the pr number which would happen for package updates
if (existingChangeLog.includes(prNumber)) {
return;
}
const prMarkdown = `[#${prNumber}](https://github.com/excalidraw/excalidraw/pull/${prNumber})`;
const messageWithPRLink = messageWithCapitalizeFirst.replace(
/\(#[0-9]*\)/,
prMarkdown,
);
commitList[type].push(messageWithPRLink);
});
return commitList;
};
const updateChangelog = async (nextVersion) => {
const commitList = await getLibraryCommitsSinceLastRelease();
let changelogForLibrary =
"## Excalidraw Library\n\n**_This section lists the updates made to the excalidraw library and will not affect the integration._**\n\n";
supportedTypes.forEach((type) => {
if (commitList[type].length) {
changelogForLibrary += `### ${headerForType[type]}\n\n`;
const commits = commitList[type];
commits.forEach((commit) => {
changelogForLibrary += `- ${commit}\n\n`;
});
}
});
changelogForLibrary += "---\n";
const lastVersionIndex = existingChangeLog.indexOf(`## ${lastVersion}`);
let updatedContent =
existingChangeLog.slice(0, lastVersionIndex) +
changelogForLibrary +
existingChangeLog.slice(lastVersionIndex);
const currentDate = new Date().toISOString().slice(0, 10);
const newVersion = `## ${nextVersion} (${currentDate})`;
updatedContent = updatedContent.replace(`## Unreleased`, newVersion);
fs.writeFileSync(`${excalidrawDir}/CHANGELOG.md`, updatedContent, "utf8");
};
module.exports = updateChangelog;

View File

@@ -1,27 +0,0 @@
const fs = require("fs");
const updateReadme = () => {
const excalidrawDir = `${__dirname}/../src/packages/excalidraw`;
let data = fs.readFileSync(`${excalidrawDir}/README_NEXT.md`, "utf8");
// remove note for unstable release
data = data.replace(
/<!-- unstable-readme-start-->[\s\S]*?<!-- unstable-readme-end-->/,
"",
);
// replace "excalidraw-next" with "excalidraw"
data = data.replace(/excalidraw-next/g, "excalidraw");
data = data.trim();
const demoIndex = data.indexOf("### Demo");
const excalidrawNextNote =
"#### Note\n\n**If you don't want to wait for the next stable release and try out the unreleased changes you can use [@excalidraw/excalidraw-next](https://www.npmjs.com/package/@excalidraw/excalidraw-next).**\n\n";
// Add excalidraw next note to try out for unreleased changes
data = data.slice(0, demoIndex) + excalidrawNextNote + data.slice(demoIndex);
// update readme
fs.writeFileSync(`${excalidrawDir}/README.md`, data, "utf8");
};
module.exports = updateReadme;

View File

@@ -14,10 +14,11 @@ import { register } from "./register";
import { supported as fsSupported } from "browser-fs-access"; import { supported as fsSupported } from "browser-fs-access";
import { CheckboxItem } from "../components/CheckboxItem"; import { CheckboxItem } from "../components/CheckboxItem";
import { getExportSize } from "../scene/export"; import { getExportSize } from "../scene/export";
import { DEFAULT_EXPORT_PADDING, EXPORT_SCALES } from "../constants"; import { DEFAULT_EXPORT_PADDING, EXPORT_SCALES, IDB_KEYS } from "../constants";
import { getSelectedElements, isSomeElementSelected } from "../scene"; import { getSelectedElements, isSomeElementSelected } from "../scene";
import { getNonDeletedElements } from "../element"; import { getNonDeletedElements } from "../element";
import { ActiveFile } from "../components/ActiveFile"; import { ActiveFile } from "../components/ActiveFile";
import * as idb from "idb-keyval";
export const actionChangeProjectName = register({ export const actionChangeProjectName = register({
name: "changeProjectName", name: "changeProjectName",
@@ -149,7 +150,22 @@ export const actionSaveToActiveFile = register({
if (error?.name !== "AbortError") { if (error?.name !== "AbortError") {
console.error(error); console.error(error);
} }
return { commitToHistory: false };
if (fileHandleExists && error.name === "AbortError") {
try {
await idb.del(IDB_KEYS.fileHandle);
} catch (error) {
console.error(error);
}
return {
commitToHistory: false,
appState: { ...appState, fileHandle: null },
};
}
return {
commitToHistory: false,
};
} }
}, },
keyTest: (event) => keyTest: (event) =>
@@ -170,6 +186,13 @@ export const actionSaveFileToDisk = register({
...appState, ...appState,
fileHandle: null, fileHandle: null,
}); });
try {
if (fileHandle) {
await idb.set(IDB_KEYS.fileHandle, fileHandle);
}
} catch (error) {
console.error(error);
}
return { commitToHistory: false, appState: { ...appState, fileHandle } }; return { commitToHistory: false, appState: { ...appState, fileHandle } };
} catch (error) { } catch (error) {
if (error?.name !== "AbortError") { if (error?.name !== "AbortError") {
@@ -201,7 +224,7 @@ export const actionLoadScene = register({
const { const {
elements: loadedElements, elements: loadedElements,
appState: loadedAppState, appState: loadedAppState,
} = await loadFromJSON(appState, elements); } = await loadFromJSON(appState);
return { return {
elements: loadedElements, elements: loadedElements,
appState: loadedAppState, appState: loadedAppState,

View File

@@ -10,6 +10,7 @@ export const actionToggleViewMode = register({
appState: { appState: {
...appState, ...appState,
viewModeEnabled: !this.checked!(appState), viewModeEnabled: !this.checked!(appState),
selectedElementIds: {},
}, },
commitToHistory: false, commitToHistory: false,
}; };

View File

@@ -52,6 +52,7 @@ import {
ENV, ENV,
EVENT, EVENT,
GRID_SIZE, GRID_SIZE,
IDB_KEYS,
LINE_CONFIRM_THRESHOLD, LINE_CONFIRM_THRESHOLD,
MIME_TYPES, MIME_TYPES,
MQ_MAX_HEIGHT_LANDSCAPE, MQ_MAX_HEIGHT_LANDSCAPE,
@@ -156,7 +157,6 @@ import {
getElementsWithinSelection, getElementsWithinSelection,
getNormalizedZoom, getNormalizedZoom,
getSelectedElements, getSelectedElements,
hasBackground,
isOverScrollBars, isOverScrollBars,
isSomeElementSelected, isSomeElementSelected,
} from "../scene"; } from "../scene";
@@ -195,6 +195,7 @@ import LayerUI from "./LayerUI";
import { Stats } from "./Stats"; import { Stats } from "./Stats";
import { Toast } from "./Toast"; import { Toast } from "./Toast";
import { actionToggleViewMode } from "../actions/actionToggleViewMode"; import { actionToggleViewMode } from "../actions/actionToggleViewMode";
import * as idb from "idb-keyval";
const IsMobileContext = React.createContext(false); const IsMobileContext = React.createContext(false);
export const useIsMobile = () => useContext(IsMobileContext); export const useIsMobile = () => useContext(IsMobileContext);
@@ -343,7 +344,7 @@ class App extends React.Component<AppProps, AppState> {
style={{ style={{
width: canvasDOMWidth, width: canvasDOMWidth,
height: canvasDOMHeight, height: canvasDOMHeight,
cursor: CURSOR_TYPE.GRAB, cursor: "grabbing",
}} }}
width={canvasWidth} width={canvasWidth}
height={canvasHeight} height={canvasHeight}
@@ -655,11 +656,7 @@ class App extends React.Component<AppProps, AppState> {
const fileHandle = launchParams.files[0]; const fileHandle = launchParams.files[0];
const blob: Blob = await fileHandle.getFile(); const blob: Blob = await fileHandle.getFile();
blob.handle = fileHandle; blob.handle = fileHandle;
loadFromBlob( loadFromBlob(blob, this.state)
blob,
this.state,
this.scene.getElementsIncludingDeleted(),
)
.then(({ elements, appState }) => .then(({ elements, appState }) =>
this.syncActionResult({ this.syncActionResult({
elements, elements,
@@ -697,7 +694,7 @@ class App extends React.Component<AppProps, AppState> {
}; };
} }
const scene = restore(initialData, null, null); const scene = restore(initialData, null);
scene.appState = { scene.appState = {
...scene.appState, ...scene.appState,
isLoading: false, isLoading: false,
@@ -812,6 +809,15 @@ class App extends React.Component<AppProps, AppState> {
} else { } else {
this.updateDOMRect(this.initializeScene); this.updateDOMRect(this.initializeScene);
} }
try {
const fileHandle = await idb.get(IDB_KEYS.fileHandle);
if (fileHandle) {
this.setState({ fileHandle });
}
} catch (error) {
console.error(error);
}
} }
public componentWillUnmount() { public componentWillUnmount() {
@@ -927,12 +933,14 @@ class App extends React.Component<AppProps, AppState> {
} }
if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) { if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {
this.setState({ viewModeEnabled: !!this.props.viewModeEnabled }); this.setState(
{ viewModeEnabled: !!this.props.viewModeEnabled },
this.addEventListeners,
);
} }
if (prevState.viewModeEnabled !== this.state.viewModeEnabled) { if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {
this.addEventListeners(); this.addEventListeners();
this.deselectElements();
} }
if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) { if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {
@@ -1206,7 +1214,7 @@ class App extends React.Component<AppProps, AppState> {
}); });
} else if (data.elements) { } else if (data.elements) {
this.addElementsFromPasteOrLibrary({ this.addElementsFromPasteOrLibrary({
elements: data.elements, elements: restoreElements(data.elements),
position: "cursor", position: "cursor",
}); });
} else if (data.text) { } else if (data.text) {
@@ -1221,7 +1229,7 @@ class App extends React.Component<AppProps, AppState> {
elements: readonly ExcalidrawElement[]; elements: readonly ExcalidrawElement[];
position: { clientX: number; clientY: number } | "cursor" | "center"; position: { clientX: number; clientY: number } | "cursor" | "center";
}) => { }) => {
const elements = restoreElements(opts.elements, null); const elements = restoreElements(opts.elements);
const [minX, minY, maxX, maxY] = getCommonBounds(elements); const [minX, minY, maxX, maxY] = getCommonBounds(elements);
const elementsCenterX = distance(minX, maxX) / 2; const elementsCenterX = distance(minX, maxX) / 2;
@@ -1287,7 +1295,6 @@ class App extends React.Component<AppProps, AppState> {
this.scene.getElements(), this.scene.getElements(),
), ),
); );
this.selectShapeTool("selection");
}; };
private addTextFromPaste(text: any) { private addTextFromPaste(text: any) {
@@ -1587,22 +1594,17 @@ class App extends React.Component<AppProps, AppState> {
} }
if (event.key === KEYS.G || event.key === KEYS.S) { if (event.key === KEYS.G || event.key === KEYS.S) {
if (this.state.elementType === "selection") { const selectedElements = getSelectedElements(
return; this.scene.getElements(),
} this.state,
);
if ( if (selectedElements.length) {
event.key === KEYS.G && if (event.key === KEYS.G) {
(hasBackground(this.state.elementType) || this.setState({ openPopup: "backgroundColorPicker" });
getSelectedElements( }
this.scene.getElements(), if (event.key === KEYS.S) {
this.state, this.setState({ openPopup: "strokeColorPicker" });
).some((element) => hasBackground(element.type))) }
) {
this.setState({ openPopup: "backgroundColorPicker" });
}
if (event.key === KEYS.S) {
this.setState({ openPopup: "strokeColorPicker" });
} }
} }
}, },
@@ -1610,9 +1612,7 @@ class App extends React.Component<AppProps, AppState> {
private onKeyUp = withBatchedUpdates((event: KeyboardEvent) => { private onKeyUp = withBatchedUpdates((event: KeyboardEvent) => {
if (event.key === KEYS.SPACE) { if (event.key === KEYS.SPACE) {
if (this.state.viewModeEnabled) { if (this.state.elementType === "selection") {
setCursor(this.canvas, CURSOR_TYPE.GRAB);
} else if (this.state.elementType === "selection") {
resetCursor(this.canvas); resetCursor(this.canvas);
} else { } else {
setCursorForShape(this.canvas, this.state.elementType); setCursorForShape(this.canvas, this.state.elementType);
@@ -1760,8 +1760,7 @@ class App extends React.Component<AppProps, AppState> {
[element.id]: true, [element.id]: true,
}, },
})); }));
} } else {
if (isDeleted) {
fixBindingsAfterDeletion(this.scene.getElements(), [element]); fixBindingsAfterDeletion(this.scene.getElements(), [element]);
} }
if (!isDeleted || isExistingElement) { if (!isDeleted || isExistingElement) {
@@ -1782,19 +1781,15 @@ class App extends React.Component<AppProps, AppState> {
excalidrawContainer: this.excalidrawContainerRef.current, excalidrawContainer: this.excalidrawContainerRef.current,
}); });
// deselect all other elements when inserting text // deselect all other elements when inserting text
this.deselectElements();
// do an initial update to re-initialize element position since we were
// modifying element's x/y for sake of editor (case: syncing to remote)
updateElement(element.text);
}
private deselectElements() {
this.setState({ this.setState({
selectedElementIds: {}, selectedElementIds: {},
selectedGroupIds: {}, selectedGroupIds: {},
editingGroupId: null, editingGroupId: null,
}); });
// do an initial update to re-initialize element position since we were
// modifying element's x/y for sake of editor (case: syncing to remote)
updateElement(element.text);
} }
private getTextElementAtPosition( private getTextElementAtPosition(
@@ -2237,8 +2232,6 @@ class App extends React.Component<AppProps, AppState> {
this.canvas, this.canvas,
isTextElement(hitElement) ? CURSOR_TYPE.TEXT : CURSOR_TYPE.CROSSHAIR, isTextElement(hitElement) ? CURSOR_TYPE.TEXT : CURSOR_TYPE.CROSSHAIR,
); );
} else if (this.state.viewModeEnabled) {
setCursor(this.canvas, CURSOR_TYPE.GRAB);
} else if (isOverScrollBar) { } else if (isOverScrollBar) {
setCursor(this.canvas, CURSOR_TYPE.AUTO); setCursor(this.canvas, CURSOR_TYPE.AUTO);
} else if ( } else if (
@@ -2476,11 +2469,7 @@ class App extends React.Component<AppProps, AppState> {
lastPointerUp = null; lastPointerUp = null;
isPanning = false; isPanning = false;
if (!isHoldingSpace) { if (!isHoldingSpace) {
if (this.state.viewModeEnabled) { setCursorForShape(this.canvas, this.state.elementType);
setCursor(this.canvas, CURSOR_TYPE.GRAB);
} else {
setCursorForShape(this.canvas, this.state.elementType);
}
} }
this.setState({ this.setState({
cursorButton: "up", cursorButton: "up",
@@ -3823,11 +3812,7 @@ class App extends React.Component<AppProps, AppState> {
try { try {
const file = event.dataTransfer.files[0]; const file = event.dataTransfer.files[0];
if (file?.type === "image/png" || file?.type === "image/svg+xml") { if (file?.type === "image/png" || file?.type === "image/svg+xml") {
const { elements, appState } = await loadFromBlob( const { elements, appState } = await loadFromBlob(file, this.state);
file,
this.state,
this.scene.getElementsIncludingDeleted(),
);
this.syncActionResult({ this.syncActionResult({
elements, elements,
appState: { appState: {
@@ -3887,7 +3872,7 @@ class App extends React.Component<AppProps, AppState> {
}; };
loadFileToCanvas = (file: Blob) => { loadFileToCanvas = (file: Blob) => {
loadFromBlob(file, this.state, this.scene.getElementsIncludingDeleted()) loadFromBlob(file, this.state)
.then(({ elements, appState }) => .then(({ elements, appState }) =>
this.syncActionResult({ this.syncActionResult({
elements, elements,

View File

@@ -1,4 +1,3 @@
import React from "react";
import clsx from "clsx"; import clsx from "clsx";
import { checkIcon } from "./icons"; import { checkIcon } from "./icons";

View File

@@ -116,8 +116,7 @@
} }
} }
.layer-ui__wrapper__footer-left, .layer-ui__wrapper__footer-left,
.layer-ui__wrapper__footer-right, .layer-ui__wrapper__footer-right {
.disable-zen-mode--visible {
pointer-events: all; pointer-events: all;
} }
} }

View File

@@ -1,4 +1,3 @@
import React from "react";
import clsx from "clsx"; import clsx from "clsx";
import { t } from "../i18n"; import { t } from "../i18n";
import { AppState } from "../types"; import { AppState } from "../types";

View File

@@ -36,27 +36,21 @@ export const LibraryUnit = ({
if (!elementsToRender) { if (!elementsToRender) {
return; return;
} }
let svg: SVGSVGElement; const svg = exportToSvg(elementsToRender, {
exportBackground: false,
viewBackgroundColor: oc.white,
});
for (const child of ref.current!.children) {
if (child.tagName !== "svg") {
continue;
}
ref.current!.removeChild(child);
}
ref.current!.appendChild(svg);
const current = ref.current!; const current = ref.current!;
(async () => {
svg = await exportToSvg(elementsToRender, {
exportBackground: false,
viewBackgroundColor: oc.white,
});
for (const child of ref.current!.children) {
if (child.tagName !== "svg") {
continue;
}
current!.removeChild(child);
}
current!.appendChild(svg);
})();
return () => { return () => {
if (svg) { current.removeChild(svg);
current.removeChild(svg);
}
}; };
}, [elements, pendingElements]); }, [elements, pendingElements]);

View File

@@ -34,21 +34,19 @@ const ChartPreviewBtn = (props: {
0, 0,
); );
setChartElements(elements); setChartElements(elements);
let svg: SVGSVGElement;
const svg = exportToSvg(elements, {
exportBackground: false,
viewBackgroundColor: oc.white,
});
const previewNode = previewRef.current!; const previewNode = previewRef.current!;
(async () => { previewNode.appendChild(svg);
svg = await exportToSvg(elements, {
exportBackground: false,
viewBackgroundColor: oc.white,
});
previewNode.appendChild(svg); if (props.selected) {
(previewNode.parentNode as HTMLDivElement).focus();
if (props.selected) { }
(previewNode.parentNode as HTMLDivElement).focus();
}
})();
return () => { return () => {
previewNode.removeChild(svg); previewNode.removeChild(svg);

View File

@@ -14,7 +14,6 @@ export const CURSOR_TYPE = {
TEXT: "text", TEXT: "text",
CROSSHAIR: "crosshair", CROSSHAIR: "crosshair",
GRABBING: "grabbing", GRABBING: "grabbing",
GRAB: "grab",
POINTER: "pointer", POINTER: "pointer",
MOVE: "move", MOVE: "move",
AUTO: "", AUTO: "",
@@ -98,6 +97,10 @@ export const STORAGE_KEYS = {
LOCAL_STORAGE_LIBRARY: "excalidraw-library", LOCAL_STORAGE_LIBRARY: "excalidraw-library",
} as const; } as const;
export const IDB_KEYS = {
fileHandle: "fileHandle",
} as const;
// time in milliseconds // time in milliseconds
export const TAP_TWICE_TIMEOUT = 300; export const TAP_TWICE_TIMEOUT = 300;
export const TOUCH_CTX_MENU_TIMEOUT = 500; export const TOUCH_CTX_MENU_TIMEOUT = 500;

View File

@@ -1,7 +1,6 @@
import { cleanAppStateForExport } from "../appState"; import { cleanAppStateForExport } from "../appState";
import { EXPORT_DATA_TYPES } from "../constants"; import { EXPORT_DATA_TYPES } from "../constants";
import { clearElementsForExport } from "../element"; import { clearElementsForExport } from "../element";
import { ExcalidrawElement } from "../element/types";
import { CanvasError } from "../errors"; import { CanvasError } from "../errors";
import { t } from "../i18n"; import { t } from "../i18n";
import { calculateScrollCenter } from "../scene"; import { calculateScrollCenter } from "../scene";
@@ -84,7 +83,6 @@ export const loadFromBlob = async (
blob: Blob, blob: Blob,
/** @see restore.localAppState */ /** @see restore.localAppState */
localAppState: AppState | null, localAppState: AppState | null,
localElements: readonly ExcalidrawElement[] | null,
) => { ) => {
const contents = await parseFileContents(blob); const contents = await parseFileContents(blob);
try { try {
@@ -105,7 +103,6 @@ export const loadFromBlob = async (
}, },
}, },
localAppState, localAppState,
localElements,
); );
return result; return result;

View File

@@ -35,13 +35,20 @@ export const exportCanvas = async (
throw new Error(t("alerts.cannotExportEmptyCanvas")); throw new Error(t("alerts.cannotExportEmptyCanvas"));
} }
if (type === "svg" || type === "clipboard-svg") { if (type === "svg" || type === "clipboard-svg") {
const tempSvg = await exportToSvg(elements, { const tempSvg = exportToSvg(elements, {
exportBackground, exportBackground,
exportWithDarkMode: appState.exportWithDarkMode, exportWithDarkMode: appState.exportWithDarkMode,
viewBackgroundColor, viewBackgroundColor,
exportPadding, exportPadding,
exportScale: appState.exportScale, exportScale: appState.exportScale,
exportEmbedScene: appState.exportEmbedScene && type === "svg", metadata:
appState.exportEmbedScene && type === "svg"
? await (
await import(/* webpackChunkName: "image" */ "./image")
).encodeSvgMetadata({
text: serializeAsJSON(elements, appState),
})
: undefined,
}); });
if (type === "svg") { if (type === "svg") {
await fileSave(new Blob([tempSvg.outerHTML], { type: "image/svg+xml" }), { await fileSave(new Blob([tempSvg.outerHTML], { type: "image/svg+xml" }), {
@@ -50,7 +57,7 @@ export const exportCanvas = async (
}); });
return; return;
} else if (type === "clipboard-svg") { } else if (type === "clipboard-svg") {
await copyTextToSystemClipboard(tempSvg.outerHTML); copyTextToSystemClipboard(tempSvg.outerHTML);
return; return;
} }
} }

View File

@@ -1,4 +1,4 @@
import { fileOpen, fileSave } from "browser-fs-access"; import { fileOpen, fileSave, FileSystemHandle } from "browser-fs-access";
import { cleanAppStateForExport } from "../appState"; import { cleanAppStateForExport } from "../appState";
import { EXPORT_DATA_TYPES, EXPORT_SOURCE, MIME_TYPES } from "../constants"; import { EXPORT_DATA_TYPES, EXPORT_SOURCE, MIME_TYPES } from "../constants";
import { clearElementsForExport } from "../element"; import { clearElementsForExport } from "../element";
@@ -12,10 +12,11 @@ import {
ExportedLibraryData, ExportedLibraryData,
} from "./types"; } from "./types";
import Library from "./library"; import Library from "./library";
import { AbortError } from "../errors";
export const serializeAsJSON = ( export const serializeAsJSON = (
elements: readonly ExcalidrawElement[], elements: readonly ExcalidrawElement[],
appState: Partial<AppState>, appState: AppState,
): string => { ): string => {
const data: ExportedDataState = { const data: ExportedDataState = {
type: EXPORT_DATA_TYPES.excalidraw, type: EXPORT_DATA_TYPES.excalidraw,
@@ -28,6 +29,26 @@ export const serializeAsJSON = (
return JSON.stringify(data, null, 2); return JSON.stringify(data, null, 2);
}; };
// adapted from https://web.dev/file-system-access
const verifyPermission = async (fileHandle: FileSystemHandle) => {
try {
const options = { mode: "readwrite" } as any;
// Check if permission was already granted. If so, return true.
if ((await fileHandle.queryPermission(options)) === "granted") {
return true;
}
// Request permission. If the user grants permission, return true.
if ((await fileHandle.requestPermission(options)) === "granted") {
return true;
}
// The user didn't grant permission, so return false.
return false;
} catch (error) {
console.error(error);
return false;
}
};
export const saveAsJSON = async ( export const saveAsJSON = async (
elements: readonly ExcalidrawElement[], elements: readonly ExcalidrawElement[],
appState: AppState, appState: AppState,
@@ -37,6 +58,12 @@ export const saveAsJSON = async (
type: MIME_TYPES.excalidraw, type: MIME_TYPES.excalidraw,
}); });
if (appState.fileHandle) {
if (!(await verifyPermission(appState.fileHandle))) {
throw new AbortError();
}
}
const fileHandle = await fileSave( const fileHandle = await fileSave(
blob, blob,
{ {
@@ -49,10 +76,7 @@ export const saveAsJSON = async (
return { fileHandle }; return { fileHandle };
}; };
export const loadFromJSON = async ( export const loadFromJSON = async (localAppState: AppState) => {
localAppState: AppState,
localElements: readonly ExcalidrawElement[] | null,
) => {
const blob = await fileOpen({ const blob = await fileOpen({
description: "Excalidraw files", description: "Excalidraw files",
// ToDo: Be over-permissive until https://bugs.webkit.org/show_bug.cgi?id=34442 // ToDo: Be over-permissive until https://bugs.webkit.org/show_bug.cgi?id=34442
@@ -67,7 +91,7 @@ export const loadFromJSON = async (
], ],
*/ */
}); });
return loadFromBlob(blob, localAppState, localElements); return loadFromBlob(blob, localAppState);
}; };
export const isValidExcalidrawData = (data?: { export const isValidExcalidrawData = (data?: {

View File

@@ -18,7 +18,7 @@ class Library {
}; };
restoreLibraryItem = (libraryItem: LibraryItem): LibraryItem | null => { restoreLibraryItem = (libraryItem: LibraryItem): LibraryItem | null => {
const elements = getNonDeletedElements(restoreElements(libraryItem, null)); const elements = getNonDeletedElements(restoreElements(libraryItem));
return elements.length ? elements : null; return elements.length ? elements : null;
}; };

View File

@@ -5,11 +5,7 @@ import {
} from "../element/types"; } from "../element/types";
import { AppState, NormalizedZoomValue } from "../types"; import { AppState, NormalizedZoomValue } from "../types";
import { ImportedDataState } from "./types"; import { ImportedDataState } from "./types";
import { import { getNormalizedDimensions, isInvisiblySmallElement } from "../element";
getElementMap,
getNormalizedDimensions,
isInvisiblySmallElement,
} from "../element";
import { isLinearElementType } from "../element/typeChecks"; import { isLinearElementType } from "../element/typeChecks";
import { randomId } from "../random"; import { randomId } from "../random";
import { import {
@@ -20,7 +16,6 @@ import {
} from "../constants"; } from "../constants";
import { getDefaultAppState } from "../appState"; import { getDefaultAppState } from "../appState";
import { LinearElementEditor } from "../element/linearElementEditor"; import { LinearElementEditor } from "../element/linearElementEditor";
import { bumpVersion } from "../element/mutateElement";
type RestoredAppState = Omit< type RestoredAppState = Omit<
AppState, AppState,
@@ -186,20 +181,13 @@ const restoreElement = (
export const restoreElements = ( export const restoreElements = (
elements: ImportedDataState["elements"], elements: ImportedDataState["elements"],
/** NOTE doesn't serve for reconciliation */
localElements: readonly ExcalidrawElement[] | null | undefined,
): ExcalidrawElement[] => { ): ExcalidrawElement[] => {
const localElementsMap = localElements ? getElementMap(localElements) : null;
return (elements || []).reduce((elements, element) => { return (elements || []).reduce((elements, element) => {
// filtering out selection, which is legacy, no longer kept in elements, // filtering out selection, which is legacy, no longer kept in elements,
// and causing issues if retained // and causing issues if retained
if (element.type !== "selection" && !isInvisiblySmallElement(element)) { if (element.type !== "selection" && !isInvisiblySmallElement(element)) {
let migratedElement: ExcalidrawElement = restoreElement(element); const migratedElement = restoreElement(element);
if (migratedElement) { if (migratedElement) {
const localElement = localElementsMap?.[element.id];
if (localElement && localElement.version > migratedElement.version) {
migratedElement = bumpVersion(migratedElement, localElement.version);
}
elements.push(migratedElement); elements.push(migratedElement);
} }
} }
@@ -209,25 +197,25 @@ export const restoreElements = (
export const restoreAppState = ( export const restoreAppState = (
appState: ImportedDataState["appState"], appState: ImportedDataState["appState"],
localAppState: Partial<AppState> | null | undefined, localAppState: Partial<AppState> | null,
): RestoredAppState => { ): RestoredAppState => {
appState = appState || {}; appState = appState || {};
const defaultAppState = getDefaultAppState(); const defaultAppState = getDefaultAppState();
const nextAppState = {} as typeof defaultAppState; const nextAppState = {} as typeof defaultAppState;
for (const [key, defaultValue] of Object.entries(defaultAppState) as [ for (const [key, val] of Object.entries(defaultAppState) as [
keyof typeof defaultAppState, keyof typeof defaultAppState,
any, any,
][]) { ][]) {
const suppliedValue = appState[key]; const restoredValue = appState[key];
const localValue = localAppState ? localAppState[key] : undefined; const localValue = localAppState ? localAppState[key] : undefined;
(nextAppState as any)[key] = (nextAppState as any)[key] =
suppliedValue !== undefined restoredValue !== undefined
? suppliedValue ? restoredValue
: localValue !== undefined : localValue !== undefined
? localValue ? localValue
: defaultValue; : val;
} }
return { return {
@@ -255,10 +243,9 @@ export const restore = (
* Supply `null` if you can't get access to it. * Supply `null` if you can't get access to it.
*/ */
localAppState: Partial<AppState> | null | undefined, localAppState: Partial<AppState> | null | undefined,
localElements: readonly ExcalidrawElement[] | null | undefined,
): RestoredDataState => { ): RestoredDataState => {
return { return {
elements: restoreElements(data?.elements, localElements), elements: restoreElements(data?.elements),
appState: restoreAppState(data?.appState, localAppState || null), appState: restoreAppState(data?.appState, localAppState || null),
}; };
}; };

View File

@@ -120,11 +120,8 @@ export const newElementWith = <TElement extends ExcalidrawElement>(
* *
* NOTE: does not trigger re-render. * NOTE: does not trigger re-render.
*/ */
export const bumpVersion = ( export const bumpVersion = (element: Mutable<ExcalidrawElement>) => {
element: Mutable<ExcalidrawElement>, element.version = element.version + 1;
version?: ExcalidrawElement["version"],
) => {
element.version = (version ?? element.version) + 1;
element.versionNonce = randomInteger(); element.versionNonce = randomInteger();
return element; return element;
}; };

View File

@@ -1,4 +1,5 @@
type CANVAS_ERROR_NAMES = "CANVAS_ERROR" | "CANVAS_POSSIBLY_TOO_BIG"; type CANVAS_ERROR_NAMES = "CANVAS_ERROR" | "CANVAS_POSSIBLY_TOO_BIG";
export class CanvasError extends Error { export class CanvasError extends Error {
constructor( constructor(
message: string = "Couldn't export canvas.", message: string = "Couldn't export canvas.",
@@ -9,3 +10,11 @@ export class CanvasError extends Error {
this.message = message; this.message = message;
} }
} }
export class AbortError extends Error {
constructor(message: string = "Request aborted") {
super();
this.name = "AbortError";
this.message = message;
}
}

View File

@@ -196,5 +196,5 @@ export const loadFromFirebase = async (
firebaseSceneVersionCache.set(socket, getSceneVersion(elements)); firebaseSceneVersionCache.set(socket, getSceneVersion(elements));
} }
return restoreElements(elements, null); return restoreElements(elements);
}; };

View File

@@ -257,10 +257,9 @@ export const loadScene = async (
data = restore( data = restore(
await importFromBackend(id, privateKey), await importFromBackend(id, privateKey),
localDataState?.appState, localDataState?.appState,
localDataState?.elements,
); );
} else { } else {
data = restore(localDataState || null, null, null); data = restore(localDataState || null, null);
} }
return { return {

View File

@@ -141,7 +141,7 @@ const initializeScene = async (opts: {
const url = externalUrlMatch[1]; const url = externalUrlMatch[1];
try { try {
const request = await fetch(window.decodeURIComponent(url)); const request = await fetch(window.decodeURIComponent(url));
const data = await loadFromBlob(await request.blob(), null, null); const data = await loadFromBlob(await request.blob(), null);
if ( if (
!scene.elements.length || !scene.elements.length ||
window.confirm(t("alerts.loadSceneOverridePrompt")) window.confirm(t("alerts.loadSceneOverridePrompt"))

View File

@@ -49,7 +49,6 @@ const allLanguages: Language[] = [
{ code: "zh-TW", label: "繁體中文" }, { code: "zh-TW", label: "繁體中文" },
{ code: "lv-LV", label: "Latviešu" }, { code: "lv-LV", label: "Latviešu" },
{ code: "cs-CZ", label: "Česky" }, { code: "cs-CZ", label: "Česky" },
{ code: "kk-KZ", label: "Қазақ тілі" },
].concat([defaultLang]); ].concat([defaultLang]);
export const languages: Language[] = allLanguages export const languages: Language[] = allLanguages

View File

@@ -180,8 +180,6 @@
"linearElement": "انقر لبدء نقاط متعددة، اسحب لخط واحد", "linearElement": "انقر لبدء نقاط متعددة، اسحب لخط واحد",
"freeDraw": "انقر واسحب، افرج عند الانتهاء", "freeDraw": "انقر واسحب، افرج عند الانتهاء",
"text": "نصيحة: يمكنك أيضًا إضافة نص بالنقر المزدوج في أي مكان بأداة الاختيار", "text": "نصيحة: يمكنك أيضًا إضافة نص بالنقر المزدوج في أي مكان بأداة الاختيار",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "انقر فوق النقطة الأخيرة أو اضغط على Esc أو Enter للإنهاء", "linearElementMulti": "انقر فوق النقطة الأخيرة أو اضغط على Esc أو Enter للإنهاء",
"lockAngle": "يمكنك تقييد الزاوية بالضغط على SHIFT", "lockAngle": "يمكنك تقييد الزاوية بالضغط على SHIFT",
"resize": "يمكنك تقييد النسب بالضغط على SHIFT أثناء تغيير الحجم،\nاضغط على ALT لتغيير الحجم من المركز", "resize": "يمكنك تقييد النسب بالضغط على SHIFT أثناء تغيير الحجم،\nاضغط على ALT لتغيير الحجم من المركز",
@@ -238,18 +236,16 @@
"curvedArrow": "سهم مائل", "curvedArrow": "سهم مائل",
"curvedLine": "خط مائل", "curvedLine": "خط مائل",
"documentation": "دليل الاستخدام", "documentation": "دليل الاستخدام",
"doubleClick": "",
"drag": "اسحب", "drag": "اسحب",
"editor": "المحرر", "editor": "المحرر",
"editSelectedShape": "",
"github": "عثرت على مشكلة؟ إرسال", "github": "عثرت على مشكلة؟ إرسال",
"howto": "اتبع التعليمات", "howto": "اتبع التعليمات",
"or": "أو", "or": "أو",
"preventBinding": "منع ارتبط السهم", "preventBinding": "منع ارتبط السهم",
"shapes": "أشكال", "shapes": "أشكال",
"shortcuts": "اختصارات لوحة المفاتيح", "shortcuts": "اختصارات لوحة المفاتيح",
"textFinish": "", "textFinish": "الانتهاء من التحرير (نص)",
"textNewLine": "", "textNewLine": "اضف سطر جديد (نص)",
"title": "المساعدة", "title": "المساعدة",
"view": "عرض", "view": "عرض",
"zoomToFit": "تكبير للملائمة", "zoomToFit": "تكبير للملائمة",

View File

@@ -180,8 +180,6 @@
"linearElement": "Кликнете, за да стартирате няколко точки, плъзнете за една линия", "linearElement": "Кликнете, за да стартирате няколко точки, плъзнете за една линия",
"freeDraw": "Натиснете и влачете, пуснете като сте готови", "freeDraw": "Натиснете и влачете, пуснете като сте готови",
"text": "Подсказка: Можете също да добавите текст като натиснете някъде два път с инструмента за селекция", "text": "Подсказка: Можете също да добавите текст като натиснете някъде два път с инструмента за селекция",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "Кликнете върху последната точка или натиснете Escape или Enter, за да завършите", "linearElementMulti": "Кликнете върху последната точка или натиснете Escape или Enter, за да завършите",
"lockAngle": "Можете да ограничите ъгъла, като задържите SHIFT", "lockAngle": "Можете да ограничите ъгъла, като задържите SHIFT",
"resize": "Може да ограничите при преоразмеряване като задържите SHIFT,\nзадръжте ALT за преоразмерите през центъра", "resize": "Може да ограничите при преоразмеряване като задържите SHIFT,\nзадръжте ALT за преоразмерите през центъра",
@@ -238,18 +236,16 @@
"curvedArrow": "Извита стрелка", "curvedArrow": "Извита стрелка",
"curvedLine": "Извита линия", "curvedLine": "Извита линия",
"documentation": "Документация", "documentation": "Документация",
"doubleClick": "",
"drag": "плъзнете", "drag": "плъзнете",
"editor": "Редактор", "editor": "Редактор",
"editSelectedShape": "",
"github": "Намерихте проблем? Изпратете", "github": "Намерихте проблем? Изпратете",
"howto": "Следвайте нашите ръководства", "howto": "Следвайте нашите ръководства",
"or": "или", "or": "или",
"preventBinding": "Спри прилепяне на стрелките", "preventBinding": "Спри прилепяне на стрелките",
"shapes": "Фигури", "shapes": "Фигури",
"shortcuts": "Клавиши за бърз достъп", "shortcuts": "Клавиши за бърз достъп",
"textFinish": "", "textFinish": "Завършете редактирането (текст)",
"textNewLine": "", "textNewLine": "Добавяне на нов ред (текст)",
"title": "Помощ", "title": "Помощ",
"view": "Преглед", "view": "Преглед",
"zoomToFit": "Приближи докато се виждат всички елементи", "zoomToFit": "Приближи докато се виждат всички елементи",

View File

@@ -1,29 +1,29 @@
{ {
"labels": { "labels": {
"paste": "Enganxa", "paste": "Enganxar",
"pasteCharts": "Enganxa els diagrames", "pasteCharts": "Enganxar diagrames",
"selectAll": "Selecciona-ho tot", "selectAll": "Seleccionar tot",
"multiSelect": "Afegeix un element a la selecció", "multiSelect": "Afegir element a la selecció",
"moveCanvas": "Mou el llenç", "moveCanvas": "Moure el llenç",
"cut": "Retalla", "cut": "Tallar",
"copy": "Copia", "copy": "Copiar",
"copyAsPng": "Copia al porta-retalls com a PNG", "copyAsPng": "Copiar al porta-retalls com a PNG",
"copyAsSvg": "Copia al porta-retalls com a SVG", "copyAsSvg": "Copiar al porta-retalls com a SVG",
"bringForward": "Porta endavant", "bringForward": "Portar endavant",
"sendToBack": "Envia enrere", "sendToBack": "Enviar endarrere",
"bringToFront": "Porta al davant", "bringToFront": "Portar al capdavant",
"sendBackward": "Envia al fons", "sendBackward": "Enviar al fons",
"delete": "Elimina", "delete": "Eliminar",
"copyStyles": "Copia els estils", "copyStyles": "Copiar estils",
"pasteStyles": "Enganxa els estils", "pasteStyles": "Enganxar estils",
"stroke": "Color del traç", "stroke": "Color del traç",
"background": "Color del fons", "background": "Color del fons",
"fill": "Estil del fons", "fill": "Estil del fons",
"strokeWidth": "Amplada del traç", "strokeWidth": "Amplada del traç",
"strokeShape": "Estil del traç", "strokeShape": "Estil del traç",
"strokeShape_gel": "Bolígraf de gel", "strokeShape_gel": "Bolígraf de gel",
"strokeShape_fountain": "Bolígraf de font", "strokeShape_fountain": "",
"strokeShape_brush": "Bolígraf de raspall", "strokeShape_brush": "",
"strokeStyle": "Estil del traç", "strokeStyle": "Estil del traç",
"strokeStyle_solid": "Sòlid", "strokeStyle_solid": "Sòlid",
"strokeStyle_dashed": "Guions", "strokeStyle_dashed": "Guions",
@@ -43,9 +43,9 @@
"fontFamily": "Tipus de lletra", "fontFamily": "Tipus de lletra",
"onlySelected": "Només seleccionats", "onlySelected": "Només seleccionats",
"withBackground": "Fons", "withBackground": "Fons",
"exportEmbedScene": "Insereix l'escena", "exportEmbedScene": "",
"exportEmbedScene_details": "Les dades de lescena es desaran al fitxer PNG/SVG de manera que es pugui restaurar lescena.\nAugmentarà la mida del fitxer exportat.", "exportEmbedScene_details": "Les dades de lescena es desaran al fitxer PNG/SVG de manera que es pugui restaurar lescena.\nAugmentarà la mida del fitxer exportat.",
"addWatermark": "Afegeix-hi «Fet amb Excalidraw»", "addWatermark": "Afegir \"Fet amb Excalidraw\"",
"handDrawn": "Dibuixat a mà", "handDrawn": "Dibuixat a mà",
"normal": "Normal", "normal": "Normal",
"code": "Codi", "code": "Codi",
@@ -73,75 +73,75 @@
"actions": "Accions", "actions": "Accions",
"language": "Llengua", "language": "Llengua",
"liveCollaboration": "Col·laboració en directe", "liveCollaboration": "Col·laboració en directe",
"duplicateSelection": "Duplica", "duplicateSelection": "Duplicar",
"untitled": "Sense títol", "untitled": "Sense títol",
"name": "Nom", "name": "Nom",
"yourName": "El vostre nom", "yourName": "El teu nom",
"madeWithExcalidraw": "Fet amb Excalidraw", "madeWithExcalidraw": "Fet amb Excalidraw",
"group": "Agrupa la selecció", "group": "Agrupar la selecció",
"ungroup": "Desagrupa la selecció", "ungroup": "Desagrupar la selecció",
"collaborators": "Col·laboradors", "collaborators": "Col·laboradors",
"showGrid": "Mostra la graella", "showGrid": "Mostra la graella",
"addToLibrary": "Afegir a la biblioteca", "addToLibrary": "Afegir a la biblioteca",
"removeFromLibrary": "Eliminar de la biblioteca", "removeFromLibrary": "Eliminar de la biblioteca",
"libraryLoadingMessage": "S'està carregant la biblioteca…", "libraryLoadingMessage": "Carregant la biblioteca…",
"libraries": "Explora les biblioteques", "libraries": "Explorar biblioteques",
"loadingScene": "S'està carregant l'escena…", "loadingScene": "Carregant escena…",
"align": "Alinea", "align": "Alinear",
"alignTop": "Alinea a la part superior", "alignTop": "Alinear a dalt",
"alignBottom": "Alinea a la part inferior", "alignBottom": "Alinear a baix",
"alignLeft": "Alinea a lesquerra", "alignLeft": "Alinear a lesquerra",
"alignRight": "Alinea a la dreta", "alignRight": "Alinear a la dreta",
"centerVertically": "Centra verticalment", "centerVertically": "Centrar verticalment",
"centerHorizontally": "Centra horitzontalment", "centerHorizontally": "Centrar horitzontalment",
"distributeHorizontally": "Distribueix horitzontalment", "distributeHorizontally": "Distribuir horitzontalment",
"distributeVertically": "Distribueix verticalment", "distributeVertically": "Distribuir verticalment",
"flipHorizontal": "Capgira horitzontalment", "flipHorizontal": "Capgira horitzontalment",
"flipVertical": "Capgira verticalment", "flipVertical": "Capgira verticalment",
"viewMode": "Mode de visualització", "viewMode": "Mode de visualització",
"toggleExportColorScheme": "Canvia l'esquema de colors de l'exportació", "toggleExportColorScheme": "Canvia l'esquema de colors de l'exportació",
"share": "Comparteix", "share": "Compartir",
"showStroke": "Mostra el selector de color del traç", "showStroke": "",
"showBackground": "Mostra el selector de color de fons", "showBackground": "",
"toggleTheme": "Activa o desactiva el tema" "toggleTheme": ""
}, },
"buttons": { "buttons": {
"clearReset": "Neteja el llenç", "clearReset": "Netejar el llenç",
"exportJSON": "Exporta a un fitxer", "exportJSON": "Exporta a un fitxer",
"exportImage": "Desa com a imatge", "exportImage": "Desa com a imatge",
"export": "Exporta", "export": "Exportar",
"exportToPng": "Exporta a PNG", "exportToPng": "Exportar a PNG",
"exportToSvg": "Exporta a SNG", "exportToSvg": "Exportar a SNG",
"copyToClipboard": "Copia al porta-retalls", "copyToClipboard": "Copiar al porta-retalls",
"copyPngToClipboard": "Copia el PNG al porta-retalls", "copyPngToClipboard": "Copiar PNG al porta-retalls",
"scale": "Escala", "scale": "Escala",
"save": "Desa al fitxer actual", "save": "Desa al fitxer actual",
"saveAs": "Anomena i desa", "saveAs": "Desar com",
"load": "Carrega", "load": "Carregar",
"getShareableLink": "Obté l'enllaç per a compartir", "getShareableLink": "Obtenir enllaç per compartir",
"close": "Tanca", "close": "Tancar",
"selectLanguage": "Trieu la llengua", "selectLanguage": "Triar idioma",
"scrollBackToContent": "Torna al contingut", "scrollBackToContent": "Tornar al contingut",
"zoomIn": "Apropa't", "zoomIn": "Ampliar",
"zoomOut": "Allunya't", "zoomOut": "Reduir",
"resetZoom": "Restableix el zoom", "resetZoom": "Restablir zoom",
"menu": "Menú", "menu": "Menú",
"done": "Fet", "done": "Fet",
"edit": "Edita", "edit": "Editar",
"undo": "Desfés", "undo": "Desfer",
"redo": "Refés", "redo": "Refer",
"resetLibrary": "Restableix la biblioteca", "resetLibrary": "Restablir biblioteca",
"createNewRoom": "Crea una sala nova", "createNewRoom": "Crear sala nova",
"fullScreen": "Pantalla completa", "fullScreen": "Pantalla completa",
"darkMode": "Mode fosc", "darkMode": "Mode fosc",
"lightMode": "Mode clar", "lightMode": "Mode clar",
"zenMode": "Mode zen", "zenMode": "Mode Zen",
"exitZenMode": "Surt de mode zen" "exitZenMode": "Sortir de modo zen"
}, },
"alerts": { "alerts": {
"clearReset": "S'esborrarà tot el llenç. N'esteu segur?", "clearReset": "Tot el llenç s'esborrarà. Estàs segur?",
"couldNotCreateShareableLink": "No s'ha pogut crear un enllaç per a compartir.", "couldNotCreateShareableLink": "No s'ha pogut crear un enllaç per compartir.",
"couldNotCreateShareableLinkTooBig": "No sha pogut crear un enllaç per a compartir: lescena és massa gran", "couldNotCreateShareableLinkTooBig": "No sha pogut crear un enllaç per compartir: lescena és massa gran",
"couldNotLoadInvalidFile": "No s'ha pogut carregar un fitxer no vàlid", "couldNotLoadInvalidFile": "No s'ha pogut carregar un fitxer no vàlid",
"importBackendFailed": "Importació fallida.", "importBackendFailed": "Importació fallida.",
"cannotExportEmptyCanvas": "No es pot exportar un llenç buit.", "cannotExportEmptyCanvas": "No es pot exportar un llenç buit.",
@@ -151,13 +151,13 @@
"loadSceneOverridePrompt": "Si carregas aquest dibuix extern, substituirá el que tens. Vols continuar?", "loadSceneOverridePrompt": "Si carregas aquest dibuix extern, substituirá el que tens. Vols continuar?",
"collabStopOverridePrompt": "Aturar la sessió provocarà la sobreescriptura del dibuix previ, que hi ha desat en l'emmagatzematge local. N'esteu segur?\n\n(Si voleu conservar el dibuix local, tanqueu la pentanya del navegador en comptes d'aturar la sessió).", "collabStopOverridePrompt": "Aturar la sessió provocarà la sobreescriptura del dibuix previ, que hi ha desat en l'emmagatzematge local. N'esteu segur?\n\n(Si voleu conservar el dibuix local, tanqueu la pentanya del navegador en comptes d'aturar la sessió).",
"errorLoadingLibrary": "S'ha produït un error en carregar la biblioteca de tercers.", "errorLoadingLibrary": "S'ha produït un error en carregar la biblioteca de tercers.",
"errorAddingToLibrary": "No s'ha pogut afegir l'element a la biblioteca", "errorAddingToLibrary": "",
"errorRemovingFromLibrary": "No s'ha pogut eliminar l'element de la biblioteca", "errorRemovingFromLibrary": "",
"confirmAddLibrary": "Això afegirà {{numShapes}} forma(es) a la vostra biblioteca. Estàs segur?", "confirmAddLibrary": "Això afegirà {{numShapes}} forma(es) a la vostra biblioteca. Estàs segur?",
"imageDoesNotContainScene": "En aquest moment no sadmet la importació dimatges.\n\nVolies importar una escena? Sembla que aquesta imatge no conté cap dada descena. Ho has activat durant l'exportació?", "imageDoesNotContainScene": "En aquest moment no sadmet la importació dimatges.\n\nVolies importar una escena? Sembla que aquesta imatge no conté cap dada descena. Ho has activat durant l'exportació?",
"cannotRestoreFromImage": "Lescena no sha pogut restaurar des daquest fitxer dimatge", "cannotRestoreFromImage": "Lescena no sha pogut restaurar des daquest fitxer dimatge",
"invalidSceneUrl": "No s'ha pogut importar l'escena des de l'adreça URL proporcionada. Està malformada o no conté dades Excalidraw JSON vàlides.", "invalidSceneUrl": "No s'ha pogut importar l'escena des de l'adreça URL proporcionada. Està malformada o no conté dades Excalidraw JSON vàlides.",
"resetLibrary": "Això buidarà la biblioteca. N'esteu segur?" "resetLibrary": "Tot el llenç s'esborrarà. Estàs segur?"
}, },
"toolBar": { "toolBar": {
"selection": "Selecció", "selection": "Selecció",
@@ -177,58 +177,56 @@
"shapes": "Formes" "shapes": "Formes"
}, },
"hints": { "hints": {
"linearElement": "Feu clic per a dibuixar múltiples punts; arrossegueu per a una sola línia", "linearElement": "Fer clic per dibuixar múltiples punts; arrossegar per una sola línea",
"freeDraw": "Feu clic i arrossegueu, deixeu anar per a finalitzar", "freeDraw": "Fer clic i arrosegar, deixar anar al punt final",
"text": "Consell: també podeu afegir text fent doble clic en qualsevol lloc amb l'eina de selecció", "text": "Consell: també pots afegir text fent doble clic a qualsevol lloc amb l'eina de selecció",
"text_selected": "Feu doble clic o premeu Retorn per a editar el text", "linearElementMulti": "Fer clic a l'ultim punt, o polsar Escape o Enter per acabar",
"text_editing": "Premeu Escapada o Ctrl+Retorn (o Ordre+Retorn) per a finalitzar l'edició",
"linearElementMulti": "Feu clic a l'ultim punt, o pitgeu Esc o Retorn per a finalitzar",
"lockAngle": "Per restringir els angles, mantenir premut el majúscul (SHIFT)", "lockAngle": "Per restringir els angles, mantenir premut el majúscul (SHIFT)",
"resize": "Per restringir les proporcions mentres es canvia la mida, mantenir premut el majúscul (SHIFT); per canviar la mida des del centre, mantenir premut ALT", "resize": "Per restringir les proporcions mentres es canvia la mida, mantenir premut el majúscul (SHIFT); per canviar la mida des del centre, mantenir premut ALT",
"rotate": "Per restringir els angles mentre gira, mantenir premut el majúscul (SHIFT)", "rotate": "Per restringir els angles mentre gira, mantenir premut el majúscul (SHIFT)",
"lineEditor_info": "Fes doble clic o premi Enter per editar punts", "lineEditor_info": "Fes doble clic o premi Enter per editar punts",
"lineEditor_pointSelected": "Premeu Suprimir per a eliminar el punt, CtrlOrCmd+D per a duplicar-lo, o arrossegueu-lo per a moure'l", "lineEditor_pointSelected": "Premi Suprimir per eliminar el punt, CtrlOrCmd+D per duplicar-lo, o arrosega'l per moure'l",
"lineEditor_nothingSelected": "Selecciona un punt per moure o eliminar, o manté premut Alt i fes clic per afegir punts nous" "lineEditor_nothingSelected": "Selecciona un punt per moure o eliminar, o manté premut Alt i fes clic per afegir punts nous"
}, },
"canvasError": { "canvasError": {
"cannotShowPreview": "No es pot mostrar la previsualització", "cannotShowPreview": "No es pot mostrar la vista prèvia",
"canvasTooBig": "Pot ser que el llenç sigui massa gran.", "canvasTooBig": "Pot ser que el llenç sigui massa gran.",
"canvasTooBigTip": "Consell: proveu dacostar una mica els elements més allunyats." "canvasTooBigTip": "Consell: prova dacostar una mica els elements més allunyats."
}, },
"errorSplash": { "errorSplash": {
"headingMain_pre": "S'ha produït un error. Proveu ", "headingMain_pre": "S'ha produït un error. Intentar ",
"headingMain_button": "recarregar la pàgina.", "headingMain_button": "recarregar la pàgina.",
"clearCanvasMessage": "Si la recàrrega no funciona, proveu ", "clearCanvasMessage": "Si la recarrega no funciona, intentar ",
"clearCanvasMessage_button": "esborrar el llenç.", "clearCanvasMessage_button": "esborrar el llenç.",
"clearCanvasCaveat": " Això resultarà en la pèrdua de feina ", "clearCanvasCaveat": " Això resultarà en pèrdua de feina ",
"trackedToSentry_pre": "L'error amb l'identificador ", "trackedToSentry_pre": "L'error amb l'identificador ",
"trackedToSentry_post": " s'ha rastrejat en el nostre sistema.", "trackedToSentry_post": " s'ha rastrejat en el nostre sistema.",
"openIssueMessage_pre": "Anàvem amb molta cura de no incloure la informació de la vostra escena en l'error. Si l'escena no és privada, podeu fer-ne el seguiment al nostre ", "openIssueMessage_pre": "Estàvem molt amb compte de no incloure la teva informació de l'escena en l'error. Si la teva escena no és privada, pots fer el seguiment al nostre ",
"openIssueMessage_button": "rastrejador d'errors.", "openIssueMessage_button": "rastrejador d'errors.",
"openIssueMessage_post": " Incloeu la informació a continuació copiant i enganxant a GitHub Issues.", "openIssueMessage_post": " Si us plau incloure la informació a continuació copiant i enganxant a GitHub Issues.",
"sceneContent": "Contingut de l'escena:" "sceneContent": "Contingut de l'escena:"
}, },
"roomDialog": { "roomDialog": {
"desc_intro": "Podeu convidar persones a la vostra escena actual a col·laborar amb vós.", "desc_intro": "Pots convidar persones a la teva escena actual a col·laborar amb tu.",
"desc_privacy": "No us preocupeu, la sessió utilitza el xifratge de punta a punta, de manera que qualsevol cosa que dibuixeu romandrà privada. Ni tan sols el nostre servidor podrà veure què feu.", "desc_privacy": "No et preocupis, la sessió utilitza el xifratge de punta a punta, de manera que qualsevol cosa que dibuixis quedarà privada. Ni tan sols el nostre servidor podrà veure el que fas.",
"button_startSession": "Inicia la sessió", "button_startSession": "Iniciar sessió",
"button_stopSession": "Atura la sessió", "button_stopSession": "Aturar sessió",
"desc_inProgressIntro": "La sessió de col·laboració en directe està en marxa.", "desc_inProgressIntro": "La sessió de col·laboració en directe està en marxa.",
"desc_shareLink": "Comparteix aquest enllaç amb qualsevol persona amb qui vulgueu col·laborar:", "desc_shareLink": "Comparteix aquest enllaç amb qualsevol persona amb qui vulguis col·laborar:",
"desc_exitSession": "Si atureu la sessió, us desconectareu de la sala, però podreu continuar treballant amb el dibuix localment. Tingues en compte que això no afectarà a altres persones, i encara podran col·laborar en la seva versió.", "desc_exitSession": "Si aturas la sessió, et desconectarás de la sala, però podrás continuar treballant amb el dibuix localment. Tingues en compte que això no afectarà a altres persones, i encara podran col·laborar en la seva versió.",
"shareTitle": "Uniu-vos a una sessió de col·laboració en directe a Excalidraw" "shareTitle": "Uniu-vos a una sessió de col·laboració en directe a Excalidraw"
}, },
"errorDialog": { "errorDialog": {
"title": "Error" "title": "Error"
}, },
"exportDialog": { "exportDialog": {
"disk_title": "Desa al disc", "disk_title": "Desa la disc",
"disk_details": "Exporta les dades de l'escena a un fitxer que després podreu importar.", "disk_details": "",
"disk_button": "Desa en un fitxer", "disk_button": "Desa en un fitxer",
"link_title": "Enllaç per a compartir", "link_title": "",
"link_details": "Exporta com a un enllaç de només lectura.", "link_details": "",
"link_button": "Exporta a un enllaç", "link_button": "",
"excalidrawplus_description": "Desa l'escena en el vostre espai de treball Excalidraw+.", "excalidrawplus_description": "",
"excalidrawplus_button": "Exporta", "excalidrawplus_button": "Exporta",
"excalidrawplus_exportError": "No és possible exportar a Excalidraw+ ara mateix..." "excalidrawplus_exportError": "No és possible exportar a Excalidraw+ ara mateix..."
}, },
@@ -238,18 +236,16 @@
"curvedArrow": "Fletxa corba", "curvedArrow": "Fletxa corba",
"curvedLine": "Línia corba", "curvedLine": "Línia corba",
"documentation": "Documentació", "documentation": "Documentació",
"doubleClick": "doble clic",
"drag": "arrossega", "drag": "arrossega",
"editor": "Editor", "editor": "Editor",
"editSelectedShape": "Edita la forma seleccionada (text, fletxa o línia)",
"github": "Hi heu trobat un problema? Informeu-ne", "github": "Hi heu trobat un problema? Informeu-ne",
"howto": "Seguiu les nostres guies", "howto": "Seguiu les nostres guies",
"or": "o", "or": "o",
"preventBinding": "Prevenir vinculació de la fletxa", "preventBinding": "Prevenir vinculació de la fletxa",
"shapes": "Formes", "shapes": "Formes",
"shortcuts": "Dreceres de teclat", "shortcuts": "Dreceres de teclat",
"textFinish": "Finalitza l'edició (editor de text)", "textFinish": "Acaba d'editar (text)",
"textNewLine": "Afegeix una línia nova (editor de text)", "textNewLine": "Afegeix línea nova (text)",
"title": "Ajuda", "title": "Ajuda",
"view": "Visualització", "view": "Visualització",
"zoomToFit": "Zoom per veure tots els elements", "zoomToFit": "Zoom per veure tots els elements",

View File

@@ -180,8 +180,6 @@
"linearElement": "", "linearElement": "",
"freeDraw": "", "freeDraw": "",
"text": "", "text": "",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "", "linearElementMulti": "",
"lockAngle": "", "lockAngle": "",
"resize": "", "resize": "",
@@ -238,10 +236,8 @@
"curvedArrow": "", "curvedArrow": "",
"curvedLine": "", "curvedLine": "",
"documentation": "", "documentation": "",
"doubleClick": "",
"drag": "tažení", "drag": "tažení",
"editor": "", "editor": "",
"editSelectedShape": "",
"github": "", "github": "",
"howto": "", "howto": "",
"or": "nebo", "or": "nebo",

View File

@@ -180,8 +180,6 @@
"linearElement": "Klicken für Linie mit mehreren Punkten, Ziehen für einzelne Linie", "linearElement": "Klicken für Linie mit mehreren Punkten, Ziehen für einzelne Linie",
"freeDraw": "Klicke und ziehe. Lass los, wenn du fertig bist", "freeDraw": "Klicke und ziehe. Lass los, wenn du fertig bist",
"text": "Tipp: Du kannst auch Text hinzufügen, indem du mit dem Auswahlwerkzeug auf eine beliebige Stelle doppelklickst", "text": "Tipp: Du kannst auch Text hinzufügen, indem du mit dem Auswahlwerkzeug auf eine beliebige Stelle doppelklickst",
"text_selected": "Doppelklicken oder Eingabetaste drücken, um Text zu bearbeiten",
"text_editing": "Drücke Escape oder Strg/Cmd+Eingabetaste, um die Bearbeitung abzuschließen",
"linearElementMulti": "Zum Beenden auf den letzten Punkt klicken oder Escape oder Eingabe drücken", "linearElementMulti": "Zum Beenden auf den letzten Punkt klicken oder Escape oder Eingabe drücken",
"lockAngle": "Du kannst Winkel einschränken, indem du SHIFT gedrückt hältst", "lockAngle": "Du kannst Winkel einschränken, indem du SHIFT gedrückt hältst",
"resize": "Du kannst die Proportionen einschränken, indem du SHIFT während der Größenänderung gedrückt hältst. Halte ALT gedrückt, um die Größe vom Zentrum aus zu ändern", "resize": "Du kannst die Proportionen einschränken, indem du SHIFT während der Größenänderung gedrückt hältst. Halte ALT gedrückt, um die Größe vom Zentrum aus zu ändern",
@@ -238,18 +236,16 @@
"curvedArrow": "Gebogener Pfeil", "curvedArrow": "Gebogener Pfeil",
"curvedLine": "Gebogene Linie", "curvedLine": "Gebogene Linie",
"documentation": "Dokumentation", "documentation": "Dokumentation",
"doubleClick": "doppelklicken",
"drag": "ziehen", "drag": "ziehen",
"editor": "Editor", "editor": "Editor",
"editSelectedShape": "Ausgewählte Form bearbeiten (Text/Pfeil/Linie)",
"github": "Ein Problem gefunden? Informiere uns", "github": "Ein Problem gefunden? Informiere uns",
"howto": "Folge unseren Anleitungen", "howto": "Folge unseren Anleitungen",
"or": "oder", "or": "oder",
"preventBinding": "Pfeil-Bindung verhindern", "preventBinding": "Pfeil-Bindung verhindern",
"shapes": "Formen", "shapes": "Formen",
"shortcuts": "Tastaturkürzel", "shortcuts": "Tastaturkürzel",
"textFinish": "Bearbeitung beenden (Texteditor)", "textFinish": "Bearbeiten beenden (Text)",
"textNewLine": "Neue Zeile hinzufügen (Texteditor)", "textNewLine": "Neue Zeile hinzufügen (Text)",
"title": "Hilfe", "title": "Hilfe",
"view": "Ansicht", "view": "Ansicht",
"zoomToFit": "Zoomen um alle Elemente einzupassen", "zoomToFit": "Zoomen um alle Elemente einzupassen",

View File

@@ -180,8 +180,6 @@
"linearElement": "Κάνε κλικ για να ξεκινήσεις πολλαπλά σημεία, σύρε για μια γραμμή", "linearElement": "Κάνε κλικ για να ξεκινήσεις πολλαπλά σημεία, σύρε για μια γραμμή",
"freeDraw": "Κάντε κλικ και σύρτε, απελευθερώσατε όταν έχετε τελειώσει", "freeDraw": "Κάντε κλικ και σύρτε, απελευθερώσατε όταν έχετε τελειώσει",
"text": "Tip: μπορείτε επίσης να προσθέστε κείμενο με διπλό-κλικ οπουδήποτε με το εργαλείο επιλογών", "text": "Tip: μπορείτε επίσης να προσθέστε κείμενο με διπλό-κλικ οπουδήποτε με το εργαλείο επιλογών",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "Κάνε κλικ στο τελευταίο σημείο ή πάτησε Escape ή Enter για να τελειώσεις", "linearElementMulti": "Κάνε κλικ στο τελευταίο σημείο ή πάτησε Escape ή Enter για να τελειώσεις",
"lockAngle": "Μπορείτε να περιορίσετε τη γωνία κρατώντας πατημένο το SHIFT", "lockAngle": "Μπορείτε να περιορίσετε τη γωνία κρατώντας πατημένο το SHIFT",
"resize": "Μπορείς να περιορίσεις τις αναλογίες κρατώντας το SHIFT ενώ αλλάζεις μέγεθος,\nκράτησε πατημένο το ALT για αλλαγή μεγέθους από το κέντρο", "resize": "Μπορείς να περιορίσεις τις αναλογίες κρατώντας το SHIFT ενώ αλλάζεις μέγεθος,\nκράτησε πατημένο το ALT για αλλαγή μεγέθους από το κέντρο",
@@ -238,18 +236,16 @@
"curvedArrow": "Κυρτό βέλος", "curvedArrow": "Κυρτό βέλος",
"curvedLine": "Κυρτή γραμμή", "curvedLine": "Κυρτή γραμμή",
"documentation": "Εγχειρίδιο", "documentation": "Εγχειρίδιο",
"doubleClick": "",
"drag": "σύρε", "drag": "σύρε",
"editor": "Επεξεργαστής", "editor": "Επεξεργαστής",
"editSelectedShape": "",
"github": "Βρήκατε πρόβλημα; Υποβάλετε το", "github": "Βρήκατε πρόβλημα; Υποβάλετε το",
"howto": "Ακολουθήστε τους οδηγούς μας", "howto": "Ακολουθήστε τους οδηγούς μας",
"or": "ή", "or": "ή",
"preventBinding": "Αποτροπή δέσμευσης βέλων", "preventBinding": "Αποτροπή δέσμευσης βέλων",
"shapes": "Σχήματα", "shapes": "Σχήματα",
"shortcuts": "Συντομεύσεις πληκτρολογίου", "shortcuts": "Συντομεύσεις πληκτρολογίου",
"textFinish": "", "textFinish": "Ολοκλήρωση επεξεργασίας (κείμενο)",
"textNewLine": "", "textNewLine": "Προσθήκη νέας γραμμής (κείμενο)",
"title": "Βοήθεια", "title": "Βοήθεια",
"view": "Προβολή", "view": "Προβολή",
"zoomToFit": "Zoom ώστε να χωρέσουν όλα τα στοιχεία", "zoomToFit": "Zoom ώστε να χωρέσουν όλα τα στοιχεία",

View File

@@ -180,8 +180,6 @@
"linearElement": "Haz clic para dibujar múltiples puntos, arrastrar para solo una línea", "linearElement": "Haz clic para dibujar múltiples puntos, arrastrar para solo una línea",
"freeDraw": "Haz clic y arrastra, suelta al terminar", "freeDraw": "Haz clic y arrastra, suelta al terminar",
"text": "Consejo: también puedes añadir texto haciendo doble clic en cualquier lugar con la herramienta de selección", "text": "Consejo: también puedes añadir texto haciendo doble clic en cualquier lugar con la herramienta de selección",
"text_selected": "Doble clic o pulse ENTER para editar el texto",
"text_editing": "Pulse Escape o CtrlOrCmd+ENTER para terminar de editar",
"linearElementMulti": "Haz clic en el último punto o presiona Escape o Enter para finalizar", "linearElementMulti": "Haz clic en el último punto o presiona Escape o Enter para finalizar",
"lockAngle": "Puedes restringir el ángulo manteniendo presionado el botón SHIFT", "lockAngle": "Puedes restringir el ángulo manteniendo presionado el botón SHIFT",
"resize": "Para mantener las proporciones mantén SHIFT presionado mientras modificas el tamaño, \nmantén presionado ALT para modificar el tamaño desde el centro", "resize": "Para mantener las proporciones mantén SHIFT presionado mientras modificas el tamaño, \nmantén presionado ALT para modificar el tamaño desde el centro",
@@ -238,18 +236,16 @@
"curvedArrow": "Flecha curvada", "curvedArrow": "Flecha curvada",
"curvedLine": "Línea curva", "curvedLine": "Línea curva",
"documentation": "Documentación", "documentation": "Documentación",
"doubleClick": "doble clic",
"drag": "arrastrar", "drag": "arrastrar",
"editor": "Editor", "editor": "Editor",
"editSelectedShape": "Editar la forma seleccionada (texto/flecha/línea)",
"github": "¿Has encontrado un problema? Envíalo", "github": "¿Has encontrado un problema? Envíalo",
"howto": "Siga nuestras guías", "howto": "Siga nuestras guías",
"or": "o", "or": "o",
"preventBinding": "Evitar yuxtaposición de flechas", "preventBinding": "Evitar yuxtaposición de flechas",
"shapes": "Formas", "shapes": "Formas",
"shortcuts": "Atajos del teclado", "shortcuts": "Atajos del teclado",
"textFinish": "Finalizar edición (editor de texto)", "textFinish": "Finalizar edición (texto)",
"textNewLine": "Añadir nueva linea (editor de texto)", "textNewLine": "Añadir nueva línea (texto)",
"title": "Ayuda", "title": "Ayuda",
"view": "Vista", "view": "Vista",
"zoomToFit": "Ajustar la vista para mostrar todos los elementos", "zoomToFit": "Ajustar la vista para mostrar todos los elementos",

View File

@@ -180,8 +180,6 @@
"linearElement": "برای چند نقطه کلیک و برای یک خط بکشید", "linearElement": "برای چند نقطه کلیک و برای یک خط بکشید",
"freeDraw": "کلیک کنید و بکشید و وقتی کار تمام شد رها کنید", "freeDraw": "کلیک کنید و بکشید و وقتی کار تمام شد رها کنید",
"text": "نکته: با برنامه انتخاب شده شما میتوانید با دوبار کلیک کردن هرکجا میخواید متن اظاف کنید", "text": "نکته: با برنامه انتخاب شده شما میتوانید با دوبار کلیک کردن هرکجا میخواید متن اظاف کنید",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "روی آخرین نقطه کلیک کنید یا کلید ESC را بزنید یا کلید Enter را بزنید برای اتمام کار", "linearElementMulti": "روی آخرین نقطه کلیک کنید یا کلید ESC را بزنید یا کلید Enter را بزنید برای اتمام کار",
"lockAngle": "با نگه داشتن SHIFT هنگام چرخش می توانید زاویه ها را محدود کنید", "lockAngle": "با نگه داشتن SHIFT هنگام چرخش می توانید زاویه ها را محدود کنید",
"resize": "می توانید با نگه داشتن SHIFT در هنگام تغییر اندازه، نسبت ها را محدود کنید،ALT را برای تغییر اندازه از مرکز نگه دارید", "resize": "می توانید با نگه داشتن SHIFT در هنگام تغییر اندازه، نسبت ها را محدود کنید،ALT را برای تغییر اندازه از مرکز نگه دارید",
@@ -238,10 +236,8 @@
"curvedArrow": "فلش خمیده", "curvedArrow": "فلش خمیده",
"curvedLine": "منحنی", "curvedLine": "منحنی",
"documentation": "مستندات", "documentation": "مستندات",
"doubleClick": "",
"drag": "", "drag": "",
"editor": "ویرایشگر", "editor": "ویرایشگر",
"editSelectedShape": "",
"github": "اشکالی می بینید؟ گزارش دهید", "github": "اشکالی می بینید؟ گزارش دهید",
"howto": "راهنمای ما را دنبال کنید", "howto": "راهنمای ما را دنبال کنید",
"or": "یا", "or": "یا",
@@ -249,7 +245,7 @@
"shapes": "شکل‌ها", "shapes": "شکل‌ها",
"shortcuts": "میانبرهای صفحه کلید", "shortcuts": "میانبرهای صفحه کلید",
"textFinish": "", "textFinish": "",
"textNewLine": "", "textNewLine": "یک خط جدید اضافه کنید (متن)",
"title": "راهنما", "title": "راهنما",
"view": "مشاهده", "view": "مشاهده",
"zoomToFit": "بزرگنمایی برای دیدن تمام آیتم ها", "zoomToFit": "بزرگنمایی برای دیدن تمام آیتم ها",

View File

@@ -180,8 +180,6 @@
"linearElement": "Klikkaa piirtääksesi useampi piste, raahaa piirtääksesi yksittäinen viiva", "linearElement": "Klikkaa piirtääksesi useampi piste, raahaa piirtääksesi yksittäinen viiva",
"freeDraw": "Paina ja raahaa, päästä irti kun olet valmis", "freeDraw": "Paina ja raahaa, päästä irti kun olet valmis",
"text": "Vinkki: voit myös lisätä tekstiä kaksoisnapsauttamalla mihin tahansa valintatyökalulla", "text": "Vinkki: voit myös lisätä tekstiä kaksoisnapsauttamalla mihin tahansa valintatyökalulla",
"text_selected": "Kaksoisnapsauta tai paina ENTER muokataksesi tekstiä",
"text_editing": "Paina Escape tai CtrlOrCmd+ENTER lopettaaksesi muokkaamisen",
"linearElementMulti": "Lopeta klikkaamalla viimeistä pistettä, painamalla Escape- tai Enter-näppäintä", "linearElementMulti": "Lopeta klikkaamalla viimeistä pistettä, painamalla Escape- tai Enter-näppäintä",
"lockAngle": "Voit rajoittaa kulmaa pitämällä SHIFT-näppäintä alaspainettuna", "lockAngle": "Voit rajoittaa kulmaa pitämällä SHIFT-näppäintä alaspainettuna",
"resize": "Voit rajoittaa mittasuhteet pitämällä SHIFT-näppäintä alaspainettuna kun muutat kokoa, pidä ALT-näppäintä alaspainettuna muuttaaksesi kokoa keskipisteen suhteen", "resize": "Voit rajoittaa mittasuhteet pitämällä SHIFT-näppäintä alaspainettuna kun muutat kokoa, pidä ALT-näppäintä alaspainettuna muuttaaksesi kokoa keskipisteen suhteen",
@@ -238,18 +236,16 @@
"curvedArrow": "Kaareva nuoli", "curvedArrow": "Kaareva nuoli",
"curvedLine": "Kaareva viiva", "curvedLine": "Kaareva viiva",
"documentation": "Käyttöohjeet", "documentation": "Käyttöohjeet",
"doubleClick": "kaksoisnapsautus",
"drag": "vedä", "drag": "vedä",
"editor": "Muokkausohjelma", "editor": "Muokkausohjelma",
"editSelectedShape": "Muokkaa valittua muotoa (teksti/nuoli/viiva)",
"github": "Löysitkö ongelman? Kerro meille", "github": "Löysitkö ongelman? Kerro meille",
"howto": "Seuraa oppaitamme", "howto": "Seuraa oppaitamme",
"or": "tai", "or": "tai",
"preventBinding": "Estä nuolten kiinnitys", "preventBinding": "Estä nuolten kiinnitys",
"shapes": "Muodot", "shapes": "Muodot",
"shortcuts": "Pikanäppäimet", "shortcuts": "Pikanäppäimet",
"textFinish": "Lopeta muokkaus (tekstieditori)", "textFinish": "Lopeta muokkaus (teksti)",
"textNewLine": "Lisää uusi rivi (tekstieditori)", "textNewLine": "Lisää uusi rivi (teksti)",
"title": "Ohjeet", "title": "Ohjeet",
"view": "Näkymä", "view": "Näkymä",
"zoomToFit": "Näytä kaikki elementit", "zoomToFit": "Näytä kaikki elementit",

View File

@@ -180,8 +180,6 @@
"linearElement": "Cliquez pour démarrer plusieurs points, faites glisser pour une seule ligne", "linearElement": "Cliquez pour démarrer plusieurs points, faites glisser pour une seule ligne",
"freeDraw": "Cliquez et faites glissez, relâchez quand vous avez terminé", "freeDraw": "Cliquez et faites glissez, relâchez quand vous avez terminé",
"text": "Astuce : vous pouvez aussi ajouter du texte en double-cliquant n'importe où avec l'outil de sélection", "text": "Astuce : vous pouvez aussi ajouter du texte en double-cliquant n'importe où avec l'outil de sélection",
"text_selected": "Double-cliquez ou appuyez sur ENTRÉE pour modifier le texte",
"text_editing": "Appuyez sur ÉCHAP ou Ctrl/Cmd+ENTRÉE pour terminer l'édition",
"linearElementMulti": "Cliquez sur le dernier point ou appuyez sur Échap ou Entrée pour terminer", "linearElementMulti": "Cliquez sur le dernier point ou appuyez sur Échap ou Entrée pour terminer",
"lockAngle": "Vous pouvez restreindre l'angle en maintenant MAJ", "lockAngle": "Vous pouvez restreindre l'angle en maintenant MAJ",
"resize": "Vous pouvez conserver les proportions en maintenant la touche MAJ pendant le redimensionnement,\nmaintenez la touche ALT pour redimensionner par rapport au centre", "resize": "Vous pouvez conserver les proportions en maintenant la touche MAJ pendant le redimensionnement,\nmaintenez la touche ALT pour redimensionner par rapport au centre",
@@ -238,18 +236,16 @@
"curvedArrow": "Flèche courbée", "curvedArrow": "Flèche courbée",
"curvedLine": "Ligne courbée", "curvedLine": "Ligne courbée",
"documentation": "Documentation", "documentation": "Documentation",
"doubleClick": "double-clic",
"drag": "glisser", "drag": "glisser",
"editor": "Éditeur", "editor": "Éditeur",
"editSelectedShape": "Modifier la forme sélectionnée (texte/flèche/ligne)",
"github": "Problème trouvé ? Soumettre", "github": "Problème trouvé ? Soumettre",
"howto": "Suivez nos guides", "howto": "Suivez nos guides",
"or": "ou", "or": "ou",
"preventBinding": "Empêcher la liaison de flèche", "preventBinding": "Empêcher la liaison de flèche",
"shapes": "Formes", "shapes": "Formes",
"shortcuts": "Raccourcis clavier", "shortcuts": "Raccourcis clavier",
"textFinish": "Terminer l'édition (éditeur de texte)", "textFinish": "Terminer l'édition (texte)",
"textNewLine": "Ajouter une nouvelle ligne (éditeur de texte)", "textNewLine": "Ajouter une nouvelle ligne (texte)",
"title": "Aide", "title": "Aide",
"view": "Affichage", "view": "Affichage",
"zoomToFit": "Zoomer pour voir tous les éléments", "zoomToFit": "Zoomer pour voir tous les éléments",

View File

@@ -180,8 +180,6 @@
"linearElement": "הקלק בשביל לבחור נקודות מרובות, גרור בשביל קו בודד", "linearElement": "הקלק בשביל לבחור נקודות מרובות, גרור בשביל קו בודד",
"freeDraw": "לחץ וגרור, שחרר כשסיימת", "freeDraw": "לחץ וגרור, שחרר כשסיימת",
"text": "טיפ: אפשר להוסיף טקסט על ידי לחיצה כפולה בכל מקום עם כלי הבחירה", "text": "טיפ: אפשר להוסיף טקסט על ידי לחיצה כפולה בכל מקום עם כלי הבחירה",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "הקלק על הנקודה האחרונה או הקש Escape או Enter לסיום", "linearElementMulti": "הקלק על הנקודה האחרונה או הקש Escape או Enter לסיום",
"lockAngle": "אתה יכול להגביל זווית ע״י לחיצה על SHIFT", "lockAngle": "אתה יכול להגביל זווית ע״י לחיצה על SHIFT",
"resize": "ניתן להגביל פרופורציות על ידי לחיצה על SHIFT תוך כדי שינוי גודל,\nהחזק ALT בשביל לשנות גודל ביחס למרכז", "resize": "ניתן להגביל פרופורציות על ידי לחיצה על SHIFT תוך כדי שינוי גודל,\nהחזק ALT בשביל לשנות גודל ביחס למרכז",
@@ -238,18 +236,16 @@
"curvedArrow": "", "curvedArrow": "",
"curvedLine": "", "curvedLine": "",
"documentation": "תיעוד", "documentation": "תיעוד",
"doubleClick": "",
"drag": "לגרור", "drag": "לגרור",
"editor": "עורך", "editor": "עורך",
"editSelectedShape": "",
"github": "מצאת בעיה? דווח", "github": "מצאת בעיה? דווח",
"howto": "עקוב אחר המדריכים שלנו", "howto": "עקוב אחר המדריכים שלנו",
"or": "או", "or": "או",
"preventBinding": "", "preventBinding": "",
"shapes": "צורות", "shapes": "צורות",
"shortcuts": "קיצורי מקלדת", "shortcuts": "קיצורי מקלדת",
"textFinish": "", "textFinish": "סיים עריכה (טקסט)",
"textNewLine": "", "textNewLine": "הוסף שורה חדשה (טקסט)",
"title": "עזרה", "title": "עזרה",
"view": "תצוגה", "view": "תצוגה",
"zoomToFit": "", "zoomToFit": "",

View File

@@ -180,8 +180,6 @@
"linearElement": "कई बिंदुओं को शुरू करने के लिए क्लिक करें, सिंगल लाइन के लिए खींचें", "linearElement": "कई बिंदुओं को शुरू करने के लिए क्लिक करें, सिंगल लाइन के लिए खींचें",
"freeDraw": "क्लिक करें और खींचें। समाप्त करने के लिए, छोड़ो", "freeDraw": "क्लिक करें और खींचें। समाप्त करने के लिए, छोड़ो",
"text": "आप चयन टूल से कहीं भी डबल-क्लिक करके टेक्स्ट जोड़ सकते हैं", "text": "आप चयन टूल से कहीं भी डबल-क्लिक करके टेक्स्ट जोड़ सकते हैं",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "अंतिम बिंदु पर क्लिक करें या समाप्त होने के लिए एस्केप या एंटर दबाएं", "linearElementMulti": "अंतिम बिंदु पर क्लिक करें या समाप्त होने के लिए एस्केप या एंटर दबाएं",
"lockAngle": "आप घूर्णन करते समय SHIFT पकड़कर कोणों को मोड़ सकते हैं", "lockAngle": "आप घूर्णन करते समय SHIFT पकड़कर कोणों को मोड़ सकते हैं",
"resize": "आकार बदलते समय आप SHIFT को पकड़ कर अनुपात में कमी कर सकते हैं,\nकेंद्र से आकार बदलने के लिए ALT दबाए रखें", "resize": "आकार बदलते समय आप SHIFT को पकड़ कर अनुपात में कमी कर सकते हैं,\nकेंद्र से आकार बदलने के लिए ALT दबाए रखें",
@@ -238,18 +236,16 @@
"curvedArrow": "वक्र तीर", "curvedArrow": "वक्र तीर",
"curvedLine": "वक्र रेखा", "curvedLine": "वक्र रेखा",
"documentation": "", "documentation": "",
"doubleClick": "",
"drag": "खींचें", "drag": "खींचें",
"editor": "संपादक", "editor": "संपादक",
"editSelectedShape": "",
"github": "मुद्दा मिला? प्रस्तुत करें", "github": "मुद्दा मिला? प्रस्तुत करें",
"howto": "हमारे गाइड का पालन करें", "howto": "हमारे गाइड का पालन करें",
"or": "या", "or": "या",
"preventBinding": "तीर बंधन रोकें", "preventBinding": "तीर बंधन रोकें",
"shapes": "आकृतियाँ", "shapes": "आकृतियाँ",
"shortcuts": "कीबोर्ड के शॉर्टकट्स", "shortcuts": "कीबोर्ड के शॉर्टकट्स",
"textFinish": "", "textFinish": "संपादन समाप्त करें (पाठ)",
"textNewLine": "", "textNewLine": "नई पंक्ति जोड़ें (पाठ)",
"title": "मदद", "title": "मदद",
"view": "दृश्य", "view": "दृश्य",
"zoomToFit": "सभी तत्वों को फिट करने के लिए ज़ूम करें", "zoomToFit": "सभी तत्वों को फिट करने के लिए ज़ूम करें",

View File

@@ -180,8 +180,6 @@
"linearElement": "Kattintással görbe, az eger húzásával pedig egyenes nyilat rajzolhatsz", "linearElement": "Kattintással görbe, az eger húzásával pedig egyenes nyilat rajzolhatsz",
"freeDraw": "Kattints és húzd, majd engedd el, amikor végeztél", "freeDraw": "Kattints és húzd, majd engedd el, amikor végeztél",
"text": "Tipp: A kijelölés eszközzel a dupla kattintás új szöveget hoz létre", "text": "Tipp: A kijelölés eszközzel a dupla kattintás új szöveget hoz létre",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "Kattints a következő ív pozíciójára, vagy fejezd be a nyilat az Escape vagy Enter megnyomásával", "linearElementMulti": "Kattints a következő ív pozíciójára, vagy fejezd be a nyilat az Escape vagy Enter megnyomásával",
"lockAngle": "A SHIFT billentyű lenyomva tartásával korlátozhatja forgatás szögét", "lockAngle": "A SHIFT billentyű lenyomva tartásával korlátozhatja forgatás szögét",
"resize": "A SHIFT billentyű lenyomva tartásával az átméretezés megtartja az arányokat,\naz ALT lenyomva tartásával pedig a középpont egy helyben marad", "resize": "A SHIFT billentyű lenyomva tartásával az átméretezés megtartja az arányokat,\naz ALT lenyomva tartásával pedig a középpont egy helyben marad",
@@ -238,10 +236,8 @@
"curvedArrow": "", "curvedArrow": "",
"curvedLine": "", "curvedLine": "",
"documentation": "", "documentation": "",
"doubleClick": "",
"drag": "", "drag": "",
"editor": "", "editor": "",
"editSelectedShape": "",
"github": "", "github": "",
"howto": "", "howto": "",
"or": "", "or": "",

View File

@@ -180,8 +180,6 @@
"linearElement": "Klik untuk memulai banyak poin, seret untuk satu baris", "linearElement": "Klik untuk memulai banyak poin, seret untuk satu baris",
"freeDraw": "Klik dan seret, lepaskan jika Anda selesai", "freeDraw": "Klik dan seret, lepaskan jika Anda selesai",
"text": "Tip: Anda juga dapat menambahkan teks dengan klik ganda di mana saja dengan alat pemilihan", "text": "Tip: Anda juga dapat menambahkan teks dengan klik ganda di mana saja dengan alat pemilihan",
"text_selected": "Klik ganda atau tekan ENTER untuk edit teks",
"text_editing": "Tekan Escape atau CtrlAtauCmd+ENTER untuk selesai mengedit",
"linearElementMulti": "Klik pada titik akhir atau tekan Escape atau Enter untuk menyelesaikan", "linearElementMulti": "Klik pada titik akhir atau tekan Escape atau Enter untuk menyelesaikan",
"lockAngle": "Anda dapat menjaga sudut dengan menahan SHIFT", "lockAngle": "Anda dapat menjaga sudut dengan menahan SHIFT",
"resize": "Anda dapat menjaga proposi dengan menekan SHIFT sambil mengubah ukuran,\ntekan AlT untuk mengubah ukuran dari tengah", "resize": "Anda dapat menjaga proposi dengan menekan SHIFT sambil mengubah ukuran,\ntekan AlT untuk mengubah ukuran dari tengah",
@@ -238,18 +236,16 @@
"curvedArrow": "Panah lengkung", "curvedArrow": "Panah lengkung",
"curvedLine": "Garis lengkung", "curvedLine": "Garis lengkung",
"documentation": "Dokumentasi", "documentation": "Dokumentasi",
"doubleClick": "klik-ganda",
"drag": "seret", "drag": "seret",
"editor": "Editor", "editor": "Editor",
"editSelectedShape": "Edit bentuk yang dipilih (teks/panah/garis)",
"github": "Menemukan masalah? Kirimkan", "github": "Menemukan masalah? Kirimkan",
"howto": "Ikuti panduan kami", "howto": "Ikuti panduan kami",
"or": "atau", "or": "atau",
"preventBinding": "Cegah pengikatan panah", "preventBinding": "Cegah pengikatan panah",
"shapes": "Bentuk", "shapes": "Bentuk",
"shortcuts": "Pintasan keyboard", "shortcuts": "Pintasan keyboard",
"textFinish": "Selesai mengedit (editor teks)", "textFinish": "Selesai mengedit (teks)",
"textNewLine": "Tambahkan garis baru (editor teks)", "textNewLine": "Tambahkan baris baru (teks)",
"title": "Bantuan", "title": "Bantuan",
"view": "Tampilan", "view": "Tampilan",
"zoomToFit": "Perbesar agar sesuai dengan semua elemen", "zoomToFit": "Perbesar agar sesuai dengan semua elemen",

View File

@@ -166,7 +166,7 @@
"ellipse": "Ellisse", "ellipse": "Ellisse",
"arrow": "Freccia", "arrow": "Freccia",
"line": "Linea", "line": "Linea",
"freedraw": "Disegno", "freedraw": "",
"text": "Testo", "text": "Testo",
"library": "Libreria", "library": "Libreria",
"lock": "Mantieni lo strumento selezionato attivo dopo aver disegnato" "lock": "Mantieni lo strumento selezionato attivo dopo aver disegnato"
@@ -180,8 +180,6 @@
"linearElement": "Clicca per iniziare una linea in più punti, trascina per singola linea", "linearElement": "Clicca per iniziare una linea in più punti, trascina per singola linea",
"freeDraw": "Clicca e trascina, rilascia quando avrai finito", "freeDraw": "Clicca e trascina, rilascia quando avrai finito",
"text": "Suggerimento: puoi anche aggiungere del testo facendo doppio clic ovunque con lo strumento di selezione", "text": "Suggerimento: puoi anche aggiungere del testo facendo doppio clic ovunque con lo strumento di selezione",
"text_selected": "Fai doppio click o premi INVIO per modificare il testo",
"text_editing": "Premi ESC o CtrlOCmd+INVIO per completare le modifiche",
"linearElementMulti": "Clicca sull'ultimo punto o premi Esc o Invio per finire", "linearElementMulti": "Clicca sull'ultimo punto o premi Esc o Invio per finire",
"lockAngle": "Puoi limitare l'angolo tenendo premuto SHIFT", "lockAngle": "Puoi limitare l'angolo tenendo premuto SHIFT",
"resize": "Per vincolare le proporzioni, tieni premuto MAIUSC durante il ridimensionamento;\nper ridimensionare dal centro, tieni premuto ALT", "resize": "Per vincolare le proporzioni, tieni premuto MAIUSC durante il ridimensionamento;\nper ridimensionare dal centro, tieni premuto ALT",
@@ -238,18 +236,16 @@
"curvedArrow": "Freccia curva", "curvedArrow": "Freccia curva",
"curvedLine": "Linea curva", "curvedLine": "Linea curva",
"documentation": "Documentazione", "documentation": "Documentazione",
"doubleClick": "doppio-click",
"drag": "trascina", "drag": "trascina",
"editor": "Editor", "editor": "Editor",
"editSelectedShape": "Modifica la forma selezionata (testo/freccia/linea)",
"github": "Trovato un problema? Segnalalo", "github": "Trovato un problema? Segnalalo",
"howto": "Segui le nostre guide", "howto": "Segui le nostre guide",
"or": "oppure", "or": "oppure",
"preventBinding": "Impedisci legame della freccia", "preventBinding": "Impedisci legame della freccia",
"shapes": "Forme", "shapes": "Forme",
"shortcuts": "Scorciatoie da tastiera", "shortcuts": "Scorciatoie da tastiera",
"textFinish": "Completa la modifica (editor di testo)", "textFinish": "Termina la modifica (testo)",
"textNewLine": "Aggiungi nuova riga (editor di testo)", "textNewLine": "Aggiungi nuova riga (testo)",
"title": "Guida", "title": "Guida",
"view": "Vista", "view": "Vista",
"zoomToFit": "Adatta zoom per mostrare tutti gli elementi", "zoomToFit": "Adatta zoom per mostrare tutti gli elementi",

View File

@@ -43,7 +43,7 @@
"fontFamily": "フォントの種類", "fontFamily": "フォントの種類",
"onlySelected": "選択中のみ", "onlySelected": "選択中のみ",
"withBackground": "背景", "withBackground": "背景",
"exportEmbedScene": "埋め込みシーン", "exportEmbedScene": "",
"exportEmbedScene_details": "シーンデータはエクスポートされたPNG/SVGファイルに保存され、シーンを復元することができます。\nエクスポートされたファイルのサイズは増加します。", "exportEmbedScene_details": "シーンデータはエクスポートされたPNG/SVGファイルに保存され、シーンを復元することができます。\nエクスポートされたファイルのサイズは増加します。",
"addWatermark": "\"Made with Excalidraw\"と表示", "addWatermark": "\"Made with Excalidraw\"と表示",
"handDrawn": "手描き風", "handDrawn": "手描き風",
@@ -99,10 +99,10 @@
"flipHorizontal": "水平方向に反転", "flipHorizontal": "水平方向に反転",
"flipVertical": "垂直方向に反転", "flipVertical": "垂直方向に反転",
"viewMode": "閲覧モード", "viewMode": "閲覧モード",
"toggleExportColorScheme": "エクスポートカラースキームの切り替え", "toggleExportColorScheme": "",
"share": "共有", "share": "共有",
"showStroke": "ストロークカラーピッカーを表示", "showStroke": "",
"showBackground": "背景色ピッカーを表示", "showBackground": "",
"toggleTheme": "テーマの切り替え" "toggleTheme": "テーマの切り替え"
}, },
"buttons": { "buttons": {
@@ -177,11 +177,9 @@
"shapes": "図形" "shapes": "図形"
}, },
"hints": { "hints": {
"linearElement": "クリックして複数の点を開始し、ドラッグで直線を引きます。", "linearElement": "クリックして複数の点を開始し、1行にドラッグます。",
"freeDraw": "クリックしてドラッグします。離すと終了します", "freeDraw": "クリックしてドラッグします。離すと終了します",
"text": "ヒント: 選択ツールを使用して任意の場所をダブルクリックしてテキストを追加することもできます", "text": "ヒント: 選択ツールを使用して任意の場所をダブルクリックしてテキストを追加することもできます",
"text_selected": "テキストを編集するには、ダブルクリックまたはEnterキーを押します",
"text_editing": "Esc キーまたは CtrlOrCmd+ENTER キーを押して編集を終了します",
"linearElementMulti": "最後のポイントをクリックするか、エスケープまたはEnterを押して終了します", "linearElementMulti": "最後のポイントをクリックするか、エスケープまたはEnterを押して終了します",
"lockAngle": "SHIFTを押したままにすると、角度を制限することができます", "lockAngle": "SHIFTを押したままにすると、角度を制限することができます",
"resize": "サイズを変更中にSHIFTを押しすと比率を制御できます。Altを押すと中央からサイズを変更できます。", "resize": "サイズを変更中にSHIFTを押しすと比率を制御できます。Altを押すと中央からサイズを変更できます。",
@@ -238,17 +236,15 @@
"curvedArrow": "カーブした矢印", "curvedArrow": "カーブした矢印",
"curvedLine": "曲線", "curvedLine": "曲線",
"documentation": "ドキュメント", "documentation": "ドキュメント",
"doubleClick": "ダブルクリック",
"drag": "ドラッグ", "drag": "ドラッグ",
"editor": "エディタ", "editor": "エディタ",
"editSelectedShape": "選択した図形の編集 (テキスト/矢印/線)",
"github": "不具合報告はこちら", "github": "不具合報告はこちら",
"howto": "ヘルプ・マニュアル", "howto": "ヘルプ・マニュアル",
"or": "または", "or": "または",
"preventBinding": "矢印を結合しない", "preventBinding": "矢印を結合しない",
"shapes": "図形", "shapes": "図形",
"shortcuts": "キーボードショートカット", "shortcuts": "キーボードショートカット",
"textFinish": "編集を終了 (テキストエディタ)", "textFinish": "編集を終了する (テキスト)",
"textNewLine": "新しい行を追加 (テキスト)", "textNewLine": "新しい行を追加 (テキスト)",
"title": "ヘルプ", "title": "ヘルプ",
"view": "表示", "view": "表示",

View File

@@ -180,8 +180,6 @@
"linearElement": "Ssit akken ad tebduḍ aṭas n tenqiḍin, zuɣer i yiwen n yizirig", "linearElement": "Ssit akken ad tebduḍ aṭas n tenqiḍin, zuɣer i yiwen n yizirig",
"freeDraw": "Ssit yerna zuɣer, serreḥ ticki tfukeḍ", "freeDraw": "Ssit yerna zuɣer, serreḥ ticki tfukeḍ",
"text": "Tixidest: tzemreḍ daɣen ad ternuḍ aḍris s usiti snat n tikkal anida tebɣiḍ s ufecku n tefrayt", "text": "Tixidest: tzemreḍ daɣen ad ternuḍ aḍris s usiti snat n tikkal anida tebɣiḍ s ufecku n tefrayt",
"text_selected": "Ssit snat n tikkal neɣ ssed taqeffalt Kcem akken ad tẓergeḍ aḍris",
"text_editing": "Ssit Escape neɣ CtrlOrCmd+ENTER akken ad tfakkeḍ asiẓreg",
"linearElementMulti": "Ssit ɣef tenqiḍt taneggarut neɣ ssed taqeffalt Escape neɣ taqeffalt Kcem akken ad tfakkeḍ", "linearElementMulti": "Ssit ɣef tenqiḍt taneggarut neɣ ssed taqeffalt Escape neɣ taqeffalt Kcem akken ad tfakkeḍ",
"lockAngle": "Tzemreḍ ad tḥettmeḍ tiɣmert s tuṭṭfa n tqeffalt SHIFT", "lockAngle": "Tzemreḍ ad tḥettmeḍ tiɣmert s tuṭṭfa n tqeffalt SHIFT",
"resize": "Tzemreḍ ad tḥettemeḍ assaɣ s tuṭṭfa n tqeffalt SHIFT mi ara tettbeddileḍ tiddi,\nma teṭṭfeḍ ALT abeddel n tiddi ad yili si tlemmast", "resize": "Tzemreḍ ad tḥettemeḍ assaɣ s tuṭṭfa n tqeffalt SHIFT mi ara tettbeddileḍ tiddi,\nma teṭṭfeḍ ALT abeddel n tiddi ad yili si tlemmast",
@@ -238,18 +236,16 @@
"curvedArrow": "Taneccabt izelgen", "curvedArrow": "Taneccabt izelgen",
"curvedLine": "Izirig izelgen", "curvedLine": "Izirig izelgen",
"documentation": "Tasemlit", "documentation": "Tasemlit",
"doubleClick": "ssit snat n tikkal",
"drag": "zuɣer", "drag": "zuɣer",
"editor": "Amaẓrag", "editor": "Amaẓrag",
"editSelectedShape": "Ẓreg talɣa yettwafernen (aḍris/taneccabt/izirig)",
"github": "Tufiḍ-d ugur? Azen-aɣ-d", "github": "Tufiḍ-d ugur? Azen-aɣ-d",
"howto": "Ḍfer imniren-nneɣ", "howto": "Ḍfer imniren-nneɣ",
"or": "neɣ", "or": "neɣ",
"preventBinding": "Seḥbes tuqqna n tneccabin", "preventBinding": "Seḥbes tuqqna n tneccabin",
"shapes": "Talɣiwin", "shapes": "Talɣiwin",
"shortcuts": "Inegzumen n unasiw", "shortcuts": "Inegzumen n unasiw",
"textFinish": "Fak asiẓreg (amaẓrag n uḍris)", "textFinish": "Fak asiẓreg (aḍris)",
"textNewLine": "Rnu ajerriḍ amaynut (amaẓrag n uḍris)", "textNewLine": "Rnu ajerriḍ amaynut (aḍris)",
"title": "Tallelt", "title": "Tallelt",
"view": "Tamuɣli", "view": "Tamuɣli",
"zoomToFit": "Simɣur akken ad twliḍ akk iferdisen", "zoomToFit": "Simɣur akken ad twliḍ akk iferdisen",

View File

@@ -1,286 +0,0 @@
{
"labels": {
"paste": "Қою",
"pasteCharts": "Диаграммаларды қою",
"selectAll": "Бәрін таңдау",
"multiSelect": "",
"moveCanvas": "",
"cut": "Қию",
"copy": "Көшіру",
"copyAsPng": "",
"copyAsSvg": "",
"bringForward": "",
"sendToBack": "",
"bringToFront": "",
"sendBackward": "",
"delete": "Жою",
"copyStyles": "Стильдерді көшіру",
"pasteStyles": "Стильдерді қою",
"stroke": "",
"background": "",
"fill": "",
"strokeWidth": "",
"strokeShape": "",
"strokeShape_gel": "",
"strokeShape_fountain": "",
"strokeShape_brush": "",
"strokeStyle": "",
"strokeStyle_solid": "",
"strokeStyle_dashed": "",
"strokeStyle_dotted": "",
"sloppiness": "",
"opacity": "",
"textAlign": "",
"edges": "",
"sharp": "",
"round": "",
"arrowheads": "Нұсқар ұштары",
"arrowhead_none": "Жоқ",
"arrowhead_arrow": "Нұсқар",
"arrowhead_bar": "Тосқауыл",
"arrowhead_dot": "Нүкте",
"fontSize": "Қаріп өлшемі",
"fontFamily": "Қаріп тобы",
"onlySelected": "",
"withBackground": "",
"exportEmbedScene": "",
"exportEmbedScene_details": "",
"addWatermark": "",
"handDrawn": "",
"normal": "Қалыпты",
"code": "",
"small": "Кіші",
"medium": "Орта",
"large": "Үлкен",
"veryLarge": "Өте үлкен",
"solid": "",
"hachure": "",
"crossHatch": "",
"thin": "",
"bold": "",
"left": "Солға",
"center": "Ортаға",
"right": "Оңға",
"extraBold": "",
"architect": "",
"artist": "",
"cartoonist": "",
"fileTitle": "Файл атауы",
"colorPicker": "",
"canvasBackground": "",
"drawingCanvas": "",
"layers": "",
"actions": "",
"language": "Тіл",
"liveCollaboration": "",
"duplicateSelection": "Көшірме",
"untitled": "Атауысыз",
"name": "",
"yourName": "",
"madeWithExcalidraw": "",
"group": "",
"ungroup": "",
"collaborators": "",
"showGrid": "",
"addToLibrary": "",
"removeFromLibrary": "",
"libraryLoadingMessage": "",
"libraries": "",
"loadingScene": "",
"align": "",
"alignTop": "",
"alignBottom": "",
"alignLeft": "",
"alignRight": "",
"centerVertically": "",
"centerHorizontally": "",
"distributeHorizontally": "",
"distributeVertically": "",
"flipHorizontal": "",
"flipVertical": "",
"viewMode": "",
"toggleExportColorScheme": "",
"share": "",
"showStroke": "",
"showBackground": "",
"toggleTheme": ""
},
"buttons": {
"clearReset": "",
"exportJSON": "",
"exportImage": "",
"export": "Экспорт",
"exportToPng": "",
"exportToSvg": "",
"copyToClipboard": "",
"copyPngToClipboard": "",
"scale": "",
"save": "",
"saveAs": "",
"load": "",
"getShareableLink": "",
"close": "Жабу",
"selectLanguage": "Тілді таңдау",
"scrollBackToContent": "",
"zoomIn": "",
"zoomOut": "",
"resetZoom": "",
"menu": "Mәзір",
"done": "Дайын",
"edit": "",
"undo": "",
"redo": "",
"resetLibrary": "",
"createNewRoom": "",
"fullScreen": "",
"darkMode": "",
"lightMode": "",
"zenMode": "",
"exitZenMode": ""
},
"alerts": {
"clearReset": "",
"couldNotCreateShareableLink": "",
"couldNotCreateShareableLinkTooBig": "",
"couldNotLoadInvalidFile": "",
"importBackendFailed": "",
"cannotExportEmptyCanvas": "",
"couldNotCopyToClipboard": "",
"decryptFailed": "",
"uploadedSecurly": "",
"loadSceneOverridePrompt": "",
"collabStopOverridePrompt": "",
"errorLoadingLibrary": "",
"errorAddingToLibrary": "",
"errorRemovingFromLibrary": "",
"confirmAddLibrary": "",
"imageDoesNotContainScene": "",
"cannotRestoreFromImage": "",
"invalidSceneUrl": "",
"resetLibrary": ""
},
"toolBar": {
"selection": "",
"rectangle": "",
"diamond": "",
"ellipse": "",
"arrow": "Нұсқар",
"line": "",
"freedraw": "",
"text": "Мәтін",
"library": "",
"lock": ""
},
"headings": {
"canvasActions": "",
"selectedShapeActions": "",
"shapes": ""
},
"hints": {
"linearElement": "",
"freeDraw": "",
"text": "",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "",
"lockAngle": "",
"resize": "",
"rotate": "",
"lineEditor_info": "",
"lineEditor_pointSelected": "",
"lineEditor_nothingSelected": ""
},
"canvasError": {
"cannotShowPreview": "",
"canvasTooBig": "",
"canvasTooBigTip": ""
},
"errorSplash": {
"headingMain_pre": "",
"headingMain_button": "",
"clearCanvasMessage": "",
"clearCanvasMessage_button": "",
"clearCanvasCaveat": "",
"trackedToSentry_pre": "",
"trackedToSentry_post": "",
"openIssueMessage_pre": "",
"openIssueMessage_button": "",
"openIssueMessage_post": "",
"sceneContent": ""
},
"roomDialog": {
"desc_intro": "",
"desc_privacy": "",
"button_startSession": "",
"button_stopSession": "",
"desc_inProgressIntro": "",
"desc_shareLink": "",
"desc_exitSession": "",
"shareTitle": ""
},
"errorDialog": {
"title": "Қате"
},
"exportDialog": {
"disk_title": "",
"disk_details": "Сахна деректерін кейін қайта импорттауға болатын файлға экспорттаңыз.",
"disk_button": "Файлға сақтау",
"link_title": "Ортақ сілтеме",
"link_details": "Тек оқуға арналған сілтеме ретінде экспорттау.",
"link_button": "Сілтемеге экспорттау",
"excalidrawplus_description": "Сахнаны өзіңіздің Excalidraw+ жұмыс кеңістігінде сақтаңыз.",
"excalidrawplus_button": "Экспорт",
"excalidrawplus_exportError": "Қазіргі уақытта Excalidraw+ үшін экспорттау мүмкін емес..."
},
"helpDialog": {
"blog": "Біздің блогты оқу",
"click": "шерту",
"curvedArrow": "Майысқан нұсқар",
"curvedLine": "Майысқан сызық",
"documentation": "Құжаттама",
"doubleClick": "қос шерту",
"drag": "апару",
"editor": "Өңдеу",
"editSelectedShape": "Таңдалған пішінді өңдеу (мәтін/нұсқар/сызық)",
"github": "Қате таптыңыз ба? Жолдаңыз",
"howto": "Біздің нұсқаулықтарды орындаңыз",
"or": "немесе",
"preventBinding": "Нұсқарды байланыстыруға жол бермеу",
"shapes": "Пішіндер",
"shortcuts": "Пернетақта пәрмендері",
"textFinish": "Өңдеуді аяқтау (мәтіндік редактор)",
"textNewLine": "Жаңа жолға көшу (мәтіндік редактор)",
"title": "Көмек",
"view": "Көру",
"zoomToFit": "Барлық элементтердің көлеміне сәйкес үлкейту",
"zoomToSelection": "Таңдалғанды үлкейту"
},
"encrypted": {
"tooltip": "Сіздің сызбаларыңыз өтпелі шифрлеу арқылы шифрланған, сондықтан Excalidraw серверлері оларды ешқашан көрмейді.",
"link": "Excalidraw қолданатын өтпелі шифрлеу туралы блог жазбасы"
},
"stats": {
"angle": "Бұрыш",
"element": "Элемент",
"elements": "Элементтер",
"height": "Биіктігі",
"scene": "Сахна",
"selected": "Таңдалды",
"storage": "Сақтау көлемі",
"title": "",
"total": "Барлығы",
"version": "Нұсқа",
"versionCopy": "Көшіру үшін басыңыз",
"versionNotAvailable": "Бұл нұсқа қолжетімсіз",
"width": "Ені"
},
"toast": {
"copyStyles": "Стильдер көшірілді.",
"copyToClipboard": "",
"copyToClipboardAsPng": "",
"fileSaved": "Файл сақталды.",
"fileSavedToFilename": "{filename} сақталды",
"canvas": "",
"selection": "таңдау"
}
}

View File

@@ -180,8 +180,6 @@
"linearElement": "여러 점을 연결하려면 클릭하고, 직선을 그리려면 바로 드래그하세요.", "linearElement": "여러 점을 연결하려면 클릭하고, 직선을 그리려면 바로 드래그하세요.",
"freeDraw": "클릭 후 드래그하세요. 완료되면 놓으세요.", "freeDraw": "클릭 후 드래그하세요. 완료되면 놓으세요.",
"text": "팁: 선택 툴로 아무 곳이나 더블 클릭해 텍스트를 추가할 수도 있습니다.", "text": "팁: 선택 툴로 아무 곳이나 더블 클릭해 텍스트를 추가할 수도 있습니다.",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "마지막 지점을 클릭하거나 Esc 또는 Enter 키를 눌러 완료하세요.", "linearElementMulti": "마지막 지점을 클릭하거나 Esc 또는 Enter 키를 눌러 완료하세요.",
"lockAngle": "SHIFT 키를 누르면서 회전하면 각도를 제한할 수 있습니다.", "lockAngle": "SHIFT 키를 누르면서 회전하면 각도를 제한할 수 있습니다.",
"resize": "SHIFT 키를 누르면서 조정하면 크기의 비율이 제한됩니다.\nALT를 누르면서 조정하면 중앙을 기준으로 크기를 조정합니다.", "resize": "SHIFT 키를 누르면서 조정하면 크기의 비율이 제한됩니다.\nALT를 누르면서 조정하면 중앙을 기준으로 크기를 조정합니다.",
@@ -238,18 +236,16 @@
"curvedArrow": "곡선 화살표", "curvedArrow": "곡선 화살표",
"curvedLine": "곡선", "curvedLine": "곡선",
"documentation": "설명서", "documentation": "설명서",
"doubleClick": "",
"drag": "드래그", "drag": "드래그",
"editor": "에디터", "editor": "에디터",
"editSelectedShape": "",
"github": "문제 제보하기", "github": "문제 제보하기",
"howto": "가이드 참고하기", "howto": "가이드 참고하기",
"or": "또는", "or": "또는",
"preventBinding": "화살표가 붙지 않게 하기", "preventBinding": "화살표가 붙지 않게 하기",
"shapes": "도형", "shapes": "도형",
"shortcuts": "키보드 단축키", "shortcuts": "키보드 단축키",
"textFinish": "", "textFinish": "편집 완료 (텍스트)",
"textNewLine": "", "textNewLine": "줄바꿈 (텍스트)",
"title": "도움말", "title": "도움말",
"view": "보기", "view": "보기",
"zoomToFit": "모든 요소가 보이도록 확대/축소", "zoomToFit": "모든 요소가 보이도록 확대/축소",

View File

@@ -180,8 +180,6 @@
"linearElement": "", "linearElement": "",
"freeDraw": "", "freeDraw": "",
"text": "", "text": "",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "", "linearElementMulti": "",
"lockAngle": "", "lockAngle": "",
"resize": "", "resize": "",
@@ -238,10 +236,8 @@
"curvedArrow": "", "curvedArrow": "",
"curvedLine": "", "curvedLine": "",
"documentation": "", "documentation": "",
"doubleClick": "",
"drag": "", "drag": "",
"editor": "", "editor": "",
"editSelectedShape": "",
"github": "", "github": "",
"howto": "", "howto": "",
"or": "", "or": "",

View File

@@ -180,8 +180,6 @@
"linearElement": "အမှတ်များချမှတ်ရေးဆွဲရန်ကလစ်နှိပ်ပါ၊ မျဉ်းတစ်ကြောင်းတည်းအတွက် တရွတ်ဆွဲပါ။", "linearElement": "အမှတ်များချမှတ်ရေးဆွဲရန်ကလစ်နှိပ်ပါ၊ မျဉ်းတစ်ကြောင်းတည်းအတွက် တရွတ်ဆွဲပါ။",
"freeDraw": "ကလစ်နှိပ်၍ တရွတ်ဆွဲပါ၊ ပြီးလျှင်လွှတ်ပါ။", "freeDraw": "ကလစ်နှိပ်၍ တရွတ်ဆွဲပါ၊ ပြီးလျှင်လွှတ်ပါ။",
"text": "မှတ်ချက်။ ။မည်သည့်ကိရိယာရွေးထားသည်ဖြစ်စေ ကလစ်နှစ်ချက်နှိပ်၍စာသားထည့်နိုင်သည်", "text": "မှတ်ချက်။ ။မည်သည့်ကိရိယာရွေးထားသည်ဖြစ်စေ ကလစ်နှစ်ချက်နှိပ်၍စာသားထည့်နိုင်သည်",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "နောက်ဆုံးအမှတ်ပေါ်တွင်ကလစ်နှိပ်ခြင်း၊ Escape (သို့) Enter နှိပ်ခြင်းတို့ဖြင့်အဆုံးသတ်နိုင်", "linearElementMulti": "နောက်ဆုံးအမှတ်ပေါ်တွင်ကလစ်နှိပ်ခြင်း၊ Escape (သို့) Enter နှိပ်ခြင်းတို့ဖြင့်အဆုံးသတ်နိုင်",
"lockAngle": "", "lockAngle": "",
"resize": "အချိုးအစားကန့်သတ်ရန် Shift နှင့် ဗဟိုမှချိန်ညှိရန် Alt တို့ကိုနှိပ်ထားနိုင်သည်", "resize": "အချိုးအစားကန့်သတ်ရန် Shift နှင့် ဗဟိုမှချိန်ညှိရန် Alt တို့ကိုနှိပ်ထားနိုင်သည်",
@@ -238,10 +236,8 @@
"curvedArrow": "", "curvedArrow": "",
"curvedLine": "", "curvedLine": "",
"documentation": "", "documentation": "",
"doubleClick": "",
"drag": "", "drag": "",
"editor": "", "editor": "",
"editSelectedShape": "",
"github": "", "github": "",
"howto": "", "howto": "",
"or": "", "or": "",

View File

@@ -180,8 +180,6 @@
"linearElement": "Klikk for å starte linje med flere punkter, eller dra for en enkel linje", "linearElement": "Klikk for å starte linje med flere punkter, eller dra for en enkel linje",
"freeDraw": "Klikk og dra, slipp når du er ferdig", "freeDraw": "Klikk og dra, slipp når du er ferdig",
"text": "Tips: du kan også legge til tekst ved å dobbeltklikke hvor som helst med utvalgsverktøyet", "text": "Tips: du kan også legge til tekst ved å dobbeltklikke hvor som helst med utvalgsverktøyet",
"text_selected": "Dobbeltklikk eller trykk ENTER for å redigere tekst",
"text_editing": "Trykk Escape eller Ctrl/Cmd+Enter for å fullføre redigering",
"linearElementMulti": "Klikk på siste punkt eller trykk Escape eller Enter for å fullføre", "linearElementMulti": "Klikk på siste punkt eller trykk Escape eller Enter for å fullføre",
"lockAngle": "Du kan låse vinkelen ved å holde nede SHIFT", "lockAngle": "Du kan låse vinkelen ved å holde nede SHIFT",
"resize": "Du kan beholde forholdet ved å trykke SHIFT mens du endrer størrelse,\ntrykk ALT for å endre størrelsen fra midten", "resize": "Du kan beholde forholdet ved å trykke SHIFT mens du endrer størrelse,\ntrykk ALT for å endre størrelsen fra midten",
@@ -238,18 +236,16 @@
"curvedArrow": "Buet pil", "curvedArrow": "Buet pil",
"curvedLine": "Buet linje", "curvedLine": "Buet linje",
"documentation": "Dokumentasjon", "documentation": "Dokumentasjon",
"doubleClick": "dobbeltklikk",
"drag": "dra", "drag": "dra",
"editor": "Redigeringsvisning", "editor": "Redigeringsvisning",
"editSelectedShape": "Rediger valgt figur (tekst/pil/linje)",
"github": "Funnet et problem? Send inn", "github": "Funnet et problem? Send inn",
"howto": "Følg våre veiledninger", "howto": "Følg våre veiledninger",
"or": "eller", "or": "eller",
"preventBinding": "Forhindre pilbinding", "preventBinding": "Forhindre pilbinding",
"shapes": "Former", "shapes": "Former",
"shortcuts": "Tastatursnarveier", "shortcuts": "Tastatursnarveier",
"textFinish": "Fullfør redigering (teksteditor)", "textFinish": "Fullfør redigering (tekst)",
"textNewLine": "Legg til ny linje (teksteditor)", "textNewLine": "Legg til ny linje (tekst)",
"title": "Hjelp", "title": "Hjelp",
"view": "Vis", "view": "Vis",
"zoomToFit": "Zoom for å se alle elementer", "zoomToFit": "Zoom for å se alle elementer",

View File

@@ -180,8 +180,6 @@
"linearElement": "Klik om meerdere punten te starten, sleep voor één lijn", "linearElement": "Klik om meerdere punten te starten, sleep voor één lijn",
"freeDraw": "Klik en sleep, laat los als je klaar bent", "freeDraw": "Klik en sleep, laat los als je klaar bent",
"text": "Tip: je kunt tekst toevoegen door ergens dubbel te klikken met de selectietool", "text": "Tip: je kunt tekst toevoegen door ergens dubbel te klikken met de selectietool",
"text_selected": "Dubbelklik of druk op ENTER om tekst te bewerken",
"text_editing": "Druk op Escape of CtrlOrCmd+ENTER om het bewerken te voltooien",
"linearElementMulti": "Klik op het laatste punt of druk op Escape of Enter om te stoppen", "linearElementMulti": "Klik op het laatste punt of druk op Escape of Enter om te stoppen",
"lockAngle": "Je kunt de hoek beperken door SHIFT ingedrukt te houden", "lockAngle": "Je kunt de hoek beperken door SHIFT ingedrukt te houden",
"resize": "Houd tijdens het vergroten SHIFT ingedrukt om verhoudingen te behouden,\ngebruik ALT om vanuit het midden te vergroten/verkleinen", "resize": "Houd tijdens het vergroten SHIFT ingedrukt om verhoudingen te behouden,\ngebruik ALT om vanuit het midden te vergroten/verkleinen",
@@ -238,18 +236,16 @@
"curvedArrow": "Gebogen pijl", "curvedArrow": "Gebogen pijl",
"curvedLine": "Kromme lijn", "curvedLine": "Kromme lijn",
"documentation": "Documentatie", "documentation": "Documentatie",
"doubleClick": "dubbelklikken",
"drag": "slepen", "drag": "slepen",
"editor": "Editor", "editor": "Editor",
"editSelectedShape": "Bewerk geselecteerde vorm (tekst/pijl/lijn)",
"github": "Probleem gevonden? Verzenden", "github": "Probleem gevonden? Verzenden",
"howto": "Volg onze handleidingen", "howto": "Volg onze handleidingen",
"or": "of", "or": "of",
"preventBinding": "Pijlbinding voorkomen", "preventBinding": "Pijlbinding voorkomen",
"shapes": "Vormen", "shapes": "Vormen",
"shortcuts": "Sneltoetsen", "shortcuts": "Sneltoetsen",
"textFinish": "Voltooi het bewerken (teksteditor)", "textFinish": "Voltooi bewerken (tekst)",
"textNewLine": "Nieuwe regel toevoegen (teksteditor)", "textNewLine": "Nieuwe regel toevoegen (tekst)",
"title": "Help", "title": "Help",
"view": "Weergave", "view": "Weergave",
"zoomToFit": "Zoom in op alle elementen", "zoomToFit": "Zoom in op alle elementen",

View File

@@ -180,8 +180,6 @@
"linearElement": "Klikk for å starte linje med fleire punkt, eller drag for ei enkel linje", "linearElement": "Klikk for å starte linje med fleire punkt, eller drag for ei enkel linje",
"freeDraw": "Klikk og drag, slepp når du er ferdig", "freeDraw": "Klikk og drag, slepp når du er ferdig",
"text": "Tips: du kan òg leggje til tekst ved å dobbeltklikke kor som helst med utvalgsverktyet", "text": "Tips: du kan òg leggje til tekst ved å dobbeltklikke kor som helst med utvalgsverktyet",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "Klikk på siste punkt eller trykk Escape eller Enter for å fullføre", "linearElementMulti": "Klikk på siste punkt eller trykk Escape eller Enter for å fullføre",
"lockAngle": "Du kan begrense vinkelen ved å holde nede SKIFT", "lockAngle": "Du kan begrense vinkelen ved å holde nede SKIFT",
"resize": "Du kan halde fram med forholdet ved å trykke SHIFT medan du endrar storleik,\ntrykk ALT for å endre storleiken frå midten", "resize": "Du kan halde fram med forholdet ved å trykke SHIFT medan du endrar storleik,\ntrykk ALT for å endre storleiken frå midten",
@@ -238,18 +236,16 @@
"curvedArrow": "Boga pil", "curvedArrow": "Boga pil",
"curvedLine": "Boga linje", "curvedLine": "Boga linje",
"documentation": "Dokumentasjon", "documentation": "Dokumentasjon",
"doubleClick": "",
"drag": "drag", "drag": "drag",
"editor": "Redigering", "editor": "Redigering",
"editSelectedShape": "",
"github": "Funne eit problem? Send inn", "github": "Funne eit problem? Send inn",
"howto": "Følg vegleiinga vår", "howto": "Følg vegleiinga vår",
"or": "eller", "or": "eller",
"preventBinding": "Hindre pilkopling", "preventBinding": "Hindre pilkopling",
"shapes": "Formar", "shapes": "Formar",
"shortcuts": "Tastatursnarvegar", "shortcuts": "Tastatursnarvegar",
"textFinish": "", "textFinish": "Fullfør redigering (tekst)",
"textNewLine": "", "textNewLine": "Legg til ny linje (tekst)",
"title": "Hjelp", "title": "Hjelp",
"view": "Vising", "view": "Vising",
"zoomToFit": "Zoom for å sjå alle elementa", "zoomToFit": "Zoom for å sjå alle elementa",

View File

@@ -180,8 +180,6 @@
"linearElement": "Clicatz per començar mantun punt, lisatz per una sola linha", "linearElement": "Clicatz per començar mantun punt, lisatz per una sola linha",
"freeDraw": "Clicatz e lisatz, relargatz un còp acabat", "freeDraw": "Clicatz e lisatz, relargatz un còp acabat",
"text": "Astúcia: podètz tanben apondre de tèxt en doble clicant ont que siá amb laisina de seleccion", "text": "Astúcia: podètz tanben apondre de tèxt en doble clicant ont que siá amb laisina de seleccion",
"text_selected": "Clicatz dos còps o quichatz ENTRADA per modificar lo tèxt",
"text_editing": "Quichatz ESCAPAR o CtrlOrCmd+ENTRADA per acabar la modificacion",
"linearElementMulti": "Clicatz sul darrièr punt o quichatz Ecap o Entrada per acabar", "linearElementMulti": "Clicatz sul darrièr punt o quichatz Ecap o Entrada per acabar",
"lockAngle": "Podètz restrénger langle en mantenent MAJ", "lockAngle": "Podètz restrénger langle en mantenent MAJ",
"resize": "Podètz servar las proporcions en mantenent la tòca MAJ pendent lo redimensionament,\nmantenètz la tòca ALT per redimensionar a partir del centre", "resize": "Podètz servar las proporcions en mantenent la tòca MAJ pendent lo redimensionament,\nmantenètz la tòca ALT per redimensionar a partir del centre",
@@ -238,18 +236,16 @@
"curvedArrow": "Sageta corba", "curvedArrow": "Sageta corba",
"curvedLine": "Linha corba", "curvedLine": "Linha corba",
"documentation": "Documentacion", "documentation": "Documentacion",
"doubleClick": "doble clic",
"drag": "lisar", "drag": "lisar",
"editor": "Editor", "editor": "Editor",
"editSelectedShape": "Modificar la fòrma seleccionada (tèxt/sageta/linha)",
"github": "Problèma trobat? Senhalatz-lo", "github": "Problèma trobat? Senhalatz-lo",
"howto": "Seguissètz nòstras guidas", "howto": "Seguissètz nòstras guidas",
"or": "o", "or": "o",
"preventBinding": "Empachar la fixacion de sagetas", "preventBinding": "Empachar la fixacion de sagetas",
"shapes": "Formas", "shapes": "Formas",
"shortcuts": "Acorchis clavièr", "shortcuts": "Acorchis clavièr",
"textFinish": "Terminar ledicion (editor de tèxt)", "textFinish": "Terminar ledicion (tèxt)",
"textNewLine": "Apondre linha novèl (editor de tèxt)", "textNewLine": "Apondre linha novèl (tèxt)",
"title": "Ajuda", "title": "Ajuda",
"view": "Vista", "view": "Vista",
"zoomToFit": "Zoomar per veire totes los elements", "zoomToFit": "Zoomar per veire totes los elements",

View File

@@ -20,7 +20,7 @@
"background": "ਬੈਕਗਰਾਉਂਡ", "background": "ਬੈਕਗਰਾਉਂਡ",
"fill": "ਭਰਨਾ", "fill": "ਭਰਨਾ",
"strokeWidth": "ਰੇਖਾ ਦੀ ਚੌੜਾਈ", "strokeWidth": "ਰੇਖਾ ਦੀ ਚੌੜਾਈ",
"strokeShape": "ਰੇਖਾ ਦਾ ਆਕ੍ਰਿਤੀ", "strokeShape": "",
"strokeShape_gel": "ਜੈੱਲ ਪੈੱਨ", "strokeShape_gel": "ਜੈੱਲ ਪੈੱਨ",
"strokeShape_fountain": "ਫਾਉਨਟੇਨ ਪੈੱਨ", "strokeShape_fountain": "ਫਾਉਨਟੇਨ ਪੈੱਨ",
"strokeShape_brush": "ਬੁਰਸ਼ ਪੈੱਨ", "strokeShape_brush": "ਬੁਰਸ਼ ਪੈੱਨ",
@@ -42,8 +42,8 @@
"fontSize": "ਫੌਂਟ ਅਕਾਰ", "fontSize": "ਫੌਂਟ ਅਕਾਰ",
"fontFamily": "ਫੌਂਟ ਪਰਿਵਾਰ", "fontFamily": "ਫੌਂਟ ਪਰਿਵਾਰ",
"onlySelected": "ਸਿਰਫ ਚੁਣੇ ਹੋਏ ਹੀ", "onlySelected": "ਸਿਰਫ ਚੁਣੇ ਹੋਏ ਹੀ",
"withBackground": "ਬੈਕਗਰਾਉਂਡ", "withBackground": "",
"exportEmbedScene": "ਦ੍ਰਿਸ਼ ਮੜ੍ਹੋ", "exportEmbedScene": "",
"exportEmbedScene_details": "ਦ੍ਰਿਸ਼ ਦਾ ਡਾਟਾ ਨਿਰਯਾਤ ਕੀਤੀ PNG/SVG ਫਾਈਲ ਵਿੱਚ ਸਾਂਭ ਦਿੱਤਾ ਜਾਵੇਗਾ ਤਾਂ ਜੋ ਇਸ ਵਿੱਚੋਂ ਦ੍ਰਿਸ਼ ਨੂੰ ਬਹਾਲ ਕੀਤਾ ਜਾ ਸਕੇ। ਇਹ ਨਿਰਯਾਤ ਕੀਤੀ ਜਾਣ ਵਾਲੀ ਫਾਈਲ ਦਾ ਅਕਾਰ ਵਧਾ ਦੇਵੇਗਾ।", "exportEmbedScene_details": "ਦ੍ਰਿਸ਼ ਦਾ ਡਾਟਾ ਨਿਰਯਾਤ ਕੀਤੀ PNG/SVG ਫਾਈਲ ਵਿੱਚ ਸਾਂਭ ਦਿੱਤਾ ਜਾਵੇਗਾ ਤਾਂ ਜੋ ਇਸ ਵਿੱਚੋਂ ਦ੍ਰਿਸ਼ ਨੂੰ ਬਹਾਲ ਕੀਤਾ ਜਾ ਸਕੇ। ਇਹ ਨਿਰਯਾਤ ਕੀਤੀ ਜਾਣ ਵਾਲੀ ਫਾਈਲ ਦਾ ਅਕਾਰ ਵਧਾ ਦੇਵੇਗਾ।",
"addWatermark": "\"Excalidraw ਨਾਲ ਬਣਾਇਆ\" ਜੋੜੋ", "addWatermark": "\"Excalidraw ਨਾਲ ਬਣਾਇਆ\" ਜੋੜੋ",
"handDrawn": "ਹੱਥਲਿਖਤ", "handDrawn": "ਹੱਥਲਿਖਤ",
@@ -96,26 +96,26 @@
"centerHorizontally": "ਖੜ੍ਹਵੇਂ ਵਿਚਕਾਰ ਕਰੋ", "centerHorizontally": "ਖੜ੍ਹਵੇਂ ਵਿਚਕਾਰ ਕਰੋ",
"distributeHorizontally": "ਖੜ੍ਹਵੇਂ ਇਕਸਾਰ ਵੰਡੋ", "distributeHorizontally": "ਖੜ੍ਹਵੇਂ ਇਕਸਾਰ ਵੰਡੋ",
"distributeVertically": "ਲੇਟਵੇਂ ਇਕਸਾਰ ਵੰਡੋ", "distributeVertically": "ਲੇਟਵੇਂ ਇਕਸਾਰ ਵੰਡੋ",
"flipHorizontal": "ਖਿਤਿਜ ਪਲਟੋ", "flipHorizontal": "",
"flipVertical": "ਲੰਬਕਾਰੀ ਪਲਟੋ", "flipVertical": "",
"viewMode": "ਦੇਖੋ ਮੋਡ", "viewMode": "ਦੇਖੋ ਮੋਡ",
"toggleExportColorScheme": "ਨਿਰਯਾਤ ਰੰਗ ਦੀ ਸਕੀਮ ਟਾਗਲ ਕਰੋ", "toggleExportColorScheme": "",
"share": "ਸਾਂਝਾ ਕਰੋ", "share": "ਸਾਂਝਾ ਕਰੋ",
"showStroke": "ਰੇਖਾ ਦਾ ਰੰਗ ਚੋਣਕਾਰ ਦਿਖਾਓ ", "showStroke": "",
"showBackground": "ਬੈਕਗਰਾਉਂਡ ਦਾ ਰੰਗ ਚੋਣਕਾਰ ਦਿਖਾਓ", "showBackground": "",
"toggleTheme": "ਥੀਮ ਬਦਲੋ" "toggleTheme": "ਥੀਮ ਬਦਲੋ"
}, },
"buttons": { "buttons": {
"clearReset": "ਕੈਨਵਸ ਰੀਸੈੱਟ ਕਰੋ", "clearReset": "ਕੈਨਵਸ ਰੀਸੈੱਟ ਕਰੋ",
"exportJSON": "ਫਾਈਲ ਵਿੱਚ ਨਿਰਯਾਤ ਕਰੋ", "exportJSON": "",
"exportImage": "ਤਸਵੀਰ ਵਜੋਂ ਸਾਂਭੋ", "exportImage": "",
"export": "ਨਿਰਯਾਤ", "export": "ਨਿਰਯਾਤ",
"exportToPng": "PNG ਵਿੱਚ ਨਿਰਯਾਤ ਕਰੋ", "exportToPng": "PNG ਵਿੱਚ ਨਿਰਯਾਤ ਕਰੋ",
"exportToSvg": "SVG ਵਿੱਚ ਨਿਰਯਾਤ ਕਰੋ", "exportToSvg": "SVG ਵਿੱਚ ਨਿਰਯਾਤ ਕਰੋ",
"copyToClipboard": "ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰੋ", "copyToClipboard": "ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰੋ",
"copyPngToClipboard": "PNG ਨੂੰ ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰੋ", "copyPngToClipboard": "PNG ਨੂੰ ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰੋ",
"scale": "ਪੈਮਾਇਸ਼", "scale": "ਪੈਮਾਇਸ਼",
"save": "ਮੌਜੂਦਾ ਫਾਈਲ ਵਿੱਚ ਸਾਂਭੋ", "save": "",
"saveAs": "ਇਸ ਵਜੋਂ ਸਾਂਭੋ", "saveAs": "ਇਸ ਵਜੋਂ ਸਾਂਭੋ",
"load": "ਲੋਡ ਕਰੋ", "load": "ਲੋਡ ਕਰੋ",
"getShareableLink": "ਸਾਂਝੀ ਕਰਨ ਵਾਲੀ ਲਿੰਕ ਲਵੋ", "getShareableLink": "ਸਾਂਝੀ ਕਰਨ ਵਾਲੀ ਲਿੰਕ ਲਵੋ",
@@ -166,7 +166,7 @@
"ellipse": "ਅੰਡਾਕਾਰ", "ellipse": "ਅੰਡਾਕਾਰ",
"arrow": "ਤੀਰ", "arrow": "ਤੀਰ",
"line": "ਲਕੀਰ", "line": "ਲਕੀਰ",
"freedraw": "ਵਾਹੋ", "freedraw": "",
"text": "ਪਾਠ", "text": "ਪਾਠ",
"library": "ਲਾਇਬ੍ਰੇਰੀ", "library": "ਲਾਇਬ੍ਰੇਰੀ",
"lock": "ਡਰਾਇੰਗ ਤੋਂ ਬਾਅਦ ਵੀ ਚੁਣੇ ਹੋਏ ਸੰਦ ਨੂੰ ਸਰਗਰਮ ਰੱਖੋ " "lock": "ਡਰਾਇੰਗ ਤੋਂ ਬਾਅਦ ਵੀ ਚੁਣੇ ਹੋਏ ਸੰਦ ਨੂੰ ਸਰਗਰਮ ਰੱਖੋ "
@@ -180,8 +180,6 @@
"linearElement": "ਇੱਕ ਤੋਂ ਜ਼ਿਆਦਾ ਬਿੰਦੂਆਂ ਲਈ ਕਲਿੱਕ ਕਰਕੇ ਸ਼ੁਰੂਆਤ ਕਰੋ, ਇਕਹਿਰੀ ਲਕੀਰ ਲਈ ਘਸੀਟੋ", "linearElement": "ਇੱਕ ਤੋਂ ਜ਼ਿਆਦਾ ਬਿੰਦੂਆਂ ਲਈ ਕਲਿੱਕ ਕਰਕੇ ਸ਼ੁਰੂਆਤ ਕਰੋ, ਇਕਹਿਰੀ ਲਕੀਰ ਲਈ ਘਸੀਟੋ",
"freeDraw": "ਕਲਿੱਕ ਕਰਕੇ ਘਸੀਟੋ, ਪੂਰਾ ਹੋਣ 'ਤੇ ਛੱਡ ਦਿਉ", "freeDraw": "ਕਲਿੱਕ ਕਰਕੇ ਘਸੀਟੋ, ਪੂਰਾ ਹੋਣ 'ਤੇ ਛੱਡ ਦਿਉ",
"text": "ਨੁਸਖਾ: ਤੁਸੀਂ ਚੋਣਕਾਰ ਸੰਦ ਰਾਹੀਂ ਕਿਤੇ ਵੀ ਡਬਲ-ਕਲਿੱਕ ਕਰਕੇ ਵੀ ਪਾਠ ਜੋੜ ਸਕਦੇ ਹੋ", "text": "ਨੁਸਖਾ: ਤੁਸੀਂ ਚੋਣਕਾਰ ਸੰਦ ਰਾਹੀਂ ਕਿਤੇ ਵੀ ਡਬਲ-ਕਲਿੱਕ ਕਰਕੇ ਵੀ ਪਾਠ ਜੋੜ ਸਕਦੇ ਹੋ",
"text_selected": "ਲਿਖਤ ਨੂੰ ਸੋਧਣ ਲਈ ਡਬਲ-ਕਲਿੱਕ ਕਰੋ ਜਾਂ ਐਂਟਰ ਦਬਾਓ",
"text_editing": "",
"linearElementMulti": "ਮੁਕੰਮਲ ਕਰਨ ਲਈ ਆਖਰੀ ਬਿੰਦੂ 'ਤੇ ਕਲਿੱਕ ਕਰੋ ਜਾਂ ਇਸਕੇਪ ਜਾਂ ਐਂਟਰ ਦਬਾਓ", "linearElementMulti": "ਮੁਕੰਮਲ ਕਰਨ ਲਈ ਆਖਰੀ ਬਿੰਦੂ 'ਤੇ ਕਲਿੱਕ ਕਰੋ ਜਾਂ ਇਸਕੇਪ ਜਾਂ ਐਂਟਰ ਦਬਾਓ",
"lockAngle": "ਤੁਸੀਂ SHIFT ਦਬਾਈ ਰੱਖ ਕੇ ਕੋਣਾਂ ਨੂੰ ਕਾਬੂ ਕਰ ਸਕਦੇ ਹੋ", "lockAngle": "ਤੁਸੀਂ SHIFT ਦਬਾਈ ਰੱਖ ਕੇ ਕੋਣਾਂ ਨੂੰ ਕਾਬੂ ਕਰ ਸਕਦੇ ਹੋ",
"resize": "ਤੁਸੀਂ ਅਕਾਰ ਬਦਲਦੇ ਸਮੇਂ SHIFT ਦਬਾਈ ਰੱਖ ਕੇ ਅਨੁਪਾਤ ਨੂੰ ਕਾਬੂ ਕਰ ਸਕਦੇ ਹੋ, ਵਿਚਕਾਰ ਤੋਂ ਅਕਾਰ ਬਦਲਣ ਲਈ ALT ਦਬਾਓ", "resize": "ਤੁਸੀਂ ਅਕਾਰ ਬਦਲਦੇ ਸਮੇਂ SHIFT ਦਬਾਈ ਰੱਖ ਕੇ ਅਨੁਪਾਤ ਨੂੰ ਕਾਬੂ ਕਰ ਸਕਦੇ ਹੋ, ਵਿਚਕਾਰ ਤੋਂ ਅਕਾਰ ਬਦਲਣ ਲਈ ALT ਦਬਾਓ",
@@ -222,14 +220,14 @@
"title": "ਗਲਤੀ" "title": "ਗਲਤੀ"
}, },
"exportDialog": { "exportDialog": {
"disk_title": "ਡਿਸਕ ਵਿੱਚ ਸਾਂਭੋ", "disk_title": "",
"disk_details": "", "disk_details": "",
"disk_button": "ਫਾਈਲ ਵਿੱਚ ਸਾਂਭੋ", "disk_button": "",
"link_title": "ਸਾਂਝੀ ਕਰਨ ਵਾਲੀ ਲਿੰਕ", "link_title": "",
"link_details": "ਸਿਰਫ ਪੜ੍ਹੇ-ਜਾਣ ਵਾਲੀ ਲਿੰਕ ਨਿਰਯਾਤ ਕਰੋ।", "link_details": "",
"link_button": "ਲਿੰਕ ਵਿੱਚ ਨਿਰਯਾਤ ਕਰੋ", "link_button": "",
"excalidrawplus_description": "", "excalidrawplus_description": "",
"excalidrawplus_button": "ਨਿਰਯਾਤ ਕਰੋ", "excalidrawplus_button": "",
"excalidrawplus_exportError": "" "excalidrawplus_exportError": ""
}, },
"helpDialog": { "helpDialog": {
@@ -238,18 +236,16 @@
"curvedArrow": "ਵਿੰਗਾ ਤੀਰ", "curvedArrow": "ਵਿੰਗਾ ਤੀਰ",
"curvedLine": "ਵਿੰਗੀ ਲਕੀਰ", "curvedLine": "ਵਿੰਗੀ ਲਕੀਰ",
"documentation": "ਕਾਗਜ਼ਾਤ", "documentation": "ਕਾਗਜ਼ਾਤ",
"doubleClick": "ਡਬਲ-ਕਲਿੱਕ",
"drag": "ਘਸੀਟੋ", "drag": "ਘਸੀਟੋ",
"editor": "ਸੋਧਕ", "editor": "ਸੋਧਕ",
"editSelectedShape": "ਚੁਣੀ ਆਕ੍ਰਿਤੀ ਸੋਧੋ (ਲਿਖਤ/ਤੀਰ/ਲਾਈਨ)",
"github": "ਕੋਈ ਸਮੱਸਿਆ ਲੱਭੀ? ਜਮ੍ਹਾਂ ਕਰਵਾਓ", "github": "ਕੋਈ ਸਮੱਸਿਆ ਲੱਭੀ? ਜਮ੍ਹਾਂ ਕਰਵਾਓ",
"howto": "ਸਾਡੀਆਂ ਗਾਈਡਾਂ ਦੀ ਪਾਲਣਾ ਕਰੋ", "howto": "ਸਾਡੀਆਂ ਗਾਈਡਾਂ ਦੀ ਪਾਲਣਾ ਕਰੋ",
"or": "ਜਾਂ", "or": "ਜਾਂ",
"preventBinding": "ਤੀਰ ਬੱਝਣਾ ਰੋਕੋ", "preventBinding": "ਤੀਰ ਬੱਝਣਾ ਰੋਕੋ",
"shapes": "ਆਕ੍ਰਿਤੀਆਂ", "shapes": "ਆਕ੍ਰਿਤੀਆਂ",
"shortcuts": "ਕੀਬੋਰਡ ਸ਼ਾਰਟਕੱਟ", "shortcuts": "ਕੀਬੋਰਡ ਸ਼ਾਰਟਕੱਟ",
"textFinish": "ਸੋਧਣਾ ਮੁਕੰਮਲ ਕਰੋ (ਲਿਖਤ ਸੋਧਕ)", "textFinish": "ਸੋਧ ਮੁਕੰਮਲ ਕਰੋ (ਪਾਠ)",
"textNewLine": "", "textNewLine": "ਨਵੀਂ ਪੰਕਤੀ ਜੋੜੋ (ਪਾਠ)",
"title": "ਮਦਦ", "title": "ਮਦਦ",
"view": "ਦਿੱਖ", "view": "ਦਿੱਖ",
"zoomToFit": "ਸਾਰੇ ਐਲੀਮੈਂਟਾਂ ਨੂੰ ਫਿੱਟ ਕਰਨ ਲਈ ਜ਼ੂਮ ਕਰੋ", "zoomToFit": "ਸਾਰੇ ਐਲੀਮੈਂਟਾਂ ਨੂੰ ਫਿੱਟ ਕਰਨ ਲਈ ਜ਼ੂਮ ਕਰੋ",

View File

@@ -1,40 +1,39 @@
{ {
"ar-SA": 90, "ar-SA": 92,
"bg-BG": 81, "bg-BG": 83,
"ca-ES": 100, "ca-ES": 94,
"cs-CZ": 35, "cs-CZ": 36,
"de-DE": 100, "de-DE": 100,
"el-GR": 86, "el-GR": 88,
"en": 100, "en": 100,
"es-ES": 98, "es-ES": 98,
"fa-IR": 77, "fa-IR": 79,
"fi-FI": 99, "fi-FI": 99,
"fr-FR": 100, "fr-FR": 100,
"he-IL": 78, "he-IL": 80,
"hi-IN": 80, "hi-IN": 82,
"hu-HU": 71, "hu-HU": 73,
"id-ID": 100, "id-ID": 100,
"it-IT": 100, "it-IT": 99,
"ja-JP": 100, "ja-JP": 98,
"kab-KAB": 98, "kab-KAB": 98,
"kk-KZ": 31, "ko-KR": 83,
"ko-KR": 81, "lv-LV": 17,
"lv-LV": 16, "my-MM": 68,
"my-MM": 67,
"nb-NO": 100, "nb-NO": 100,
"nl-NL": 100, "nl-NL": 100,
"nn-NO": 88, "nn-NO": 90,
"oc-FR": 100, "oc-FR": 100,
"pa-IN": 96, "pa-IN": 89,
"pl-PL": 83, "pl-PL": 85,
"pt-BR": 88, "pt-BR": 90,
"pt-PT": 100, "pt-PT": 92,
"ro-RO": 100, "ro-RO": 100,
"ru-RU": 100, "ru-RU": 97,
"sk-SK": 100, "sk-SK": 100,
"sv-SE": 100, "sv-SE": 100,
"tr-TR": 89, "tr-TR": 91,
"uk-UA": 95, "uk-UA": 97,
"zh-CN": 98, "zh-CN": 98,
"zh-TW": 99 "zh-TW": 99
} }

View File

@@ -180,8 +180,6 @@
"linearElement": "Naciśnij, aby zrobić punkt, przeciągnij, aby narysować linię", "linearElement": "Naciśnij, aby zrobić punkt, przeciągnij, aby narysować linię",
"freeDraw": "Naciśnij i przeciągnij by rysować, puść kiedy skończysz", "freeDraw": "Naciśnij i przeciągnij by rysować, puść kiedy skończysz",
"text": "Wskazówka: możesz również dodać tekst klikając dwukrotnie gdziekolwiek za pomocą narzędzia zaznaczania", "text": "Wskazówka: możesz również dodać tekst klikając dwukrotnie gdziekolwiek za pomocą narzędzia zaznaczania",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "Aby zakończyć krzywą, ponownie kliknij w ostatni punkt, bądź naciśnij Esc albo Enter", "linearElementMulti": "Aby zakończyć krzywą, ponownie kliknij w ostatni punkt, bądź naciśnij Esc albo Enter",
"lockAngle": "Możesz ograniczyć kąt trzymając SHIFT", "lockAngle": "Możesz ograniczyć kąt trzymając SHIFT",
"resize": "Możesz zachować proporcję trzymająć wcisnięty SHIFT, przytrzymaj ALT by zmienić rozmiar względem środka", "resize": "Możesz zachować proporcję trzymająć wcisnięty SHIFT, przytrzymaj ALT by zmienić rozmiar względem środka",
@@ -238,18 +236,16 @@
"curvedArrow": "Zakrzywiona strzałka", "curvedArrow": "Zakrzywiona strzałka",
"curvedLine": "Zakrzywiona linia", "curvedLine": "Zakrzywiona linia",
"documentation": "Dokumentacja", "documentation": "Dokumentacja",
"doubleClick": "",
"drag": "przeciągnij", "drag": "przeciągnij",
"editor": "Edytor", "editor": "Edytor",
"editSelectedShape": "",
"github": "Znalazłeś problem? Prześlij", "github": "Znalazłeś problem? Prześlij",
"howto": "Skorzystaj z instrukcji", "howto": "Skorzystaj z instrukcji",
"or": "lub", "or": "lub",
"preventBinding": "Zapobiegaj wiązaniu strzałek", "preventBinding": "Zapobiegaj wiązaniu strzałek",
"shapes": "Kształty", "shapes": "Kształty",
"shortcuts": "Skróty klawiszowe", "shortcuts": "Skróty klawiszowe",
"textFinish": "", "textFinish": "Zakończ edycję (tekst)",
"textNewLine": "", "textNewLine": "Dodaj nową linię (tekst)",
"title": "Pomoc", "title": "Pomoc",
"view": "Widok", "view": "Widok",
"zoomToFit": "Powiększ, aby wyświetlić wszystkie elementy", "zoomToFit": "Powiększ, aby wyświetlić wszystkie elementy",

View File

@@ -180,8 +180,6 @@
"linearElement": "Clique para iniciar vários pontos, arraste para uma única linha", "linearElement": "Clique para iniciar vários pontos, arraste para uma única linha",
"freeDraw": "Toque e arraste, solte quando terminar", "freeDraw": "Toque e arraste, solte quando terminar",
"text": "Dica: você também pode adicionar texto clicando duas vezes em qualquer lugar com a ferramenta de seleção", "text": "Dica: você também pode adicionar texto clicando duas vezes em qualquer lugar com a ferramenta de seleção",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "Clique no último ponto ou pressione Escape ou Enter para terminar", "linearElementMulti": "Clique no último ponto ou pressione Escape ou Enter para terminar",
"lockAngle": "Você pode restringir o ângulo segurando o SHIFT", "lockAngle": "Você pode restringir o ângulo segurando o SHIFT",
"resize": "Você pode restringir proporções segurando SHIFT enquanto redimensiona,\nsegure ALT para redimensionar do centro", "resize": "Você pode restringir proporções segurando SHIFT enquanto redimensiona,\nsegure ALT para redimensionar do centro",
@@ -238,18 +236,16 @@
"curvedArrow": "Seta curva", "curvedArrow": "Seta curva",
"curvedLine": "Linha curva", "curvedLine": "Linha curva",
"documentation": "Documentação", "documentation": "Documentação",
"doubleClick": "",
"drag": "arrastar", "drag": "arrastar",
"editor": "Editor", "editor": "Editor",
"editSelectedShape": "",
"github": "Encontrou algum problema? Nos informe", "github": "Encontrou algum problema? Nos informe",
"howto": "Siga nossos guias", "howto": "Siga nossos guias",
"or": "ou", "or": "ou",
"preventBinding": "Evitar fixação de seta", "preventBinding": "Evitar fixação de seta",
"shapes": "Formas", "shapes": "Formas",
"shortcuts": "Atalhos de teclado", "shortcuts": "Atalhos de teclado",
"textFinish": "", "textFinish": "Finalizar edição (texto)",
"textNewLine": "", "textNewLine": "Adicionar nova linha (texto)",
"title": "Ajudar", "title": "Ajudar",
"view": "Visualizar", "view": "Visualizar",
"zoomToFit": "Ampliar para encaixar todos os elementos", "zoomToFit": "Ampliar para encaixar todos os elementos",

View File

@@ -42,9 +42,9 @@
"fontSize": "Tamanho da fonte", "fontSize": "Tamanho da fonte",
"fontFamily": "Família da fontes", "fontFamily": "Família da fontes",
"onlySelected": "Somente a seleção", "onlySelected": "Somente a seleção",
"withBackground": "Fundo", "withBackground": "",
"exportEmbedScene": "Cena embutida", "exportEmbedScene": "",
"exportEmbedScene_details": "Os dados da cena serão guardados no ficheiro PNG/SVG exportado para que a cena possa ser restaurada.\nIrá aumentar o tamanho do ficheiro exportado.", "exportEmbedScene_details": "Os dados da cena serão salvos no arquivo PNG/SVG exportado para que a cena possa ser restaurada.\nIrá aumentar o tamanho do arquivo exportado.",
"addWatermark": "Adicionar \"Feito com Excalidraw\"", "addWatermark": "Adicionar \"Feito com Excalidraw\"",
"handDrawn": "Manuscrito", "handDrawn": "Manuscrito",
"normal": "Normal", "normal": "Normal",
@@ -55,7 +55,7 @@
"veryLarge": "Muito grande", "veryLarge": "Muito grande",
"solid": "Sólido", "solid": "Sólido",
"hachure": "Eclosão", "hachure": "Eclosão",
"crossHatch": "Sombreado", "crossHatch": "Hachurado",
"thin": "Fino", "thin": "Fino",
"bold": "Espesso", "bold": "Espesso",
"left": "Esquerda", "left": "Esquerda",
@@ -67,8 +67,8 @@
"cartoonist": "Caricaturista", "cartoonist": "Caricaturista",
"fileTitle": "Nome do ficheiro", "fileTitle": "Nome do ficheiro",
"colorPicker": "Seletor de cores", "colorPicker": "Seletor de cores",
"canvasBackground": "Fundo da área de desenho", "canvasBackground": "Fundo da tela",
"drawingCanvas": "Área de desenho", "drawingCanvas": "Tela de desenho",
"layers": "Camadas", "layers": "Camadas",
"actions": "Ações", "actions": "Ações",
"language": "Idioma", "language": "Idioma",
@@ -76,7 +76,7 @@
"duplicateSelection": "Duplicar", "duplicateSelection": "Duplicar",
"untitled": "Sem título", "untitled": "Sem título",
"name": "Nome", "name": "Nome",
"yourName": "O seu nome", "yourName": "Seu nome",
"madeWithExcalidraw": "Feito com Excalidraw", "madeWithExcalidraw": "Feito com Excalidraw",
"group": "Agrupar seleção", "group": "Agrupar seleção",
"ungroup": "Desagrupar seleção", "ungroup": "Desagrupar seleção",
@@ -84,16 +84,16 @@
"showGrid": "Mostrar grelha", "showGrid": "Mostrar grelha",
"addToLibrary": "Adicionar à biblioteca", "addToLibrary": "Adicionar à biblioteca",
"removeFromLibrary": "Remover da biblioteca", "removeFromLibrary": "Remover da biblioteca",
"libraryLoadingMessage": "A carregar a biblioteca…", "libraryLoadingMessage": "Carregando biblioteca…",
"libraries": "Procurar bibliotecas", "libraries": "Procurar bibliotecas",
"loadingScene": "A carregar a cena…", "loadingScene": "Carregando cena…",
"align": "Alinhamento", "align": "Alinhamento",
"alignTop": "Alinhar ao topo", "alignTop": "Alinhar ao topo",
"alignBottom": "Alinhar ao fundo", "alignBottom": "Alinhar ao fundo",
"alignLeft": "Alinhar à esquerda", "alignLeft": "Alinhar à esquerda",
"alignRight": "Alinhar à direita", "alignRight": "Alinhar à direita",
"centerVertically": "Centrar verticalmente", "centerVertically": "Centralizar verticalmente",
"centerHorizontally": "Centrar horizontalmente", "centerHorizontally": "Centralizar horizontalmente",
"distributeHorizontally": "Distribuir horizontalmente", "distributeHorizontally": "Distribuir horizontalmente",
"distributeVertically": "Distribuir verticalmente", "distributeVertically": "Distribuir verticalmente",
"flipHorizontal": "Inverter horizontalmente", "flipHorizontal": "Inverter horizontalmente",
@@ -101,22 +101,22 @@
"viewMode": "Modo de visualização", "viewMode": "Modo de visualização",
"toggleExportColorScheme": "Alternar esquema de cores de exportação", "toggleExportColorScheme": "Alternar esquema de cores de exportação",
"share": "Partilhar", "share": "Partilhar",
"showStroke": "Mostrar seletor de cores do traço", "showStroke": "",
"showBackground": "Mostrar seletor de cores do fundo", "showBackground": "",
"toggleTheme": "Alternar tema" "toggleTheme": "Alternar tema"
}, },
"buttons": { "buttons": {
"clearReset": "Limpar a área de desenho e redefinir a cor de fundo", "clearReset": "Limpar o canvas e redefinir a cor de fundo",
"exportJSON": "Exportar para ficheiro", "exportJSON": "",
"exportImage": "Guardar como imagem", "exportImage": "",
"export": "Exportar", "export": "Exportar",
"exportToPng": "Exportar em PNG", "exportToPng": "Exportar em PNG",
"exportToSvg": "Exportar em SVG", "exportToSvg": "Exportar em SVG",
"copyToClipboard": "Copiar para o clipboard", "copyToClipboard": "Copiar para o clipboard",
"copyPngToClipboard": "Copiar PNG para área de transferência", "copyPngToClipboard": "Copiar PNG para área de transferência",
"scale": "Escala", "scale": "Escala",
"save": "Guardar no ficheiro atual", "save": "",
"saveAs": "Guardar como", "saveAs": "Salvar como",
"load": "Carregar", "load": "Carregar",
"getShareableLink": "Obter um link de partilha", "getShareableLink": "Obter um link de partilha",
"close": "Fechar", "close": "Fechar",
@@ -132,31 +132,31 @@
"redo": "Refazer", "redo": "Refazer",
"resetLibrary": "Repor a biblioteca", "resetLibrary": "Repor a biblioteca",
"createNewRoom": "Criar nova sala", "createNewRoom": "Criar nova sala",
"fullScreen": "Ecrã inteiro", "fullScreen": "Tela cheia",
"darkMode": "Modo escuro", "darkMode": "Modo escuro",
"lightMode": "Modo claro", "lightMode": "Modo claro",
"zenMode": "Modo zen", "zenMode": "Modo Zen",
"exitZenMode": "Sair do modo zen" "exitZenMode": "Sair do modo zen"
}, },
"alerts": { "alerts": {
"clearReset": "Isto irá limpar toda a área de desenho. Tem a certeza?", "clearReset": "Isto irá limpar toda a tela. Você tem certeza?",
"couldNotCreateShareableLink": "Não foi possível criar um link partilhável.", "couldNotCreateShareableLink": "Não foi possível criar um link de compartilhamento.",
"couldNotCreateShareableLinkTooBig": "Não foi possível criar um link partilhável: a cena é muito grande", "couldNotCreateShareableLinkTooBig": "Não foi possível criar um link compartilhável: a cena é muito grande",
"couldNotLoadInvalidFile": "Não foi possível carregar o ficheiro inválido", "couldNotLoadInvalidFile": "Não foi possível carregar o arquivo inválido",
"importBackendFailed": "A importação do servidor falhou.", "importBackendFailed": "A importação do servidor falhou.",
"cannotExportEmptyCanvas": "Não é possível exportar uma área de desenho vazia.", "cannotExportEmptyCanvas": "Não é possível exportar um canvas vazío.",
"couldNotCopyToClipboard": "Não foi possível copiar para a área de transferência. Experimente no navegador Chrome.", "couldNotCopyToClipboard": "Não foi possível copiar no clipboard. Experimente no navegador Chrome.",
"decryptFailed": "Não foi possível desencriptar os dados.", "decryptFailed": "Não foi possível descriptografar os dados.",
"uploadedSecurly": "O upload foi protegido com criptografia de ponta a ponta, o que significa que o servidor do Excalidraw e terceiros não podem ler o conteúdo.", "uploadedSecurly": "O upload foi protegido com criptografia de ponta a ponta, o que significa que o servidor do Excalidraw e terceiros não podem ler o conteúdo.",
"loadSceneOverridePrompt": "Se carregar um desenho externo substituirá o conteúdo existente. Quer continuar?", "loadSceneOverridePrompt": "Carregar um desenho externo substituirá o seu conteúdo existente. Deseja continuar?",
"collabStopOverridePrompt": "Ao interromper a sessão irá substituir o último desenho guardado. Tem a certeza?\n\n(Caso queira manter o último desenho, simplesmente feche a janela do navegador.)", "collabStopOverridePrompt": "Ao interromper a sessão irá substituir o último desenho guardado. Tem a certeza?\n\n(Caso queira manter o último desenho, simplesmente feche a janela do navegador.)",
"errorLoadingLibrary": "Houve um erro ao carregar a biblioteca de terceiros.", "errorLoadingLibrary": "Houve um erro ao carregar a biblioteca de terceiros.",
"errorAddingToLibrary": "Não foi possível adicionar o item à biblioteca", "errorAddingToLibrary": "",
"errorRemovingFromLibrary": "Não foi possível remover o item da biblioteca", "errorRemovingFromLibrary": "",
"confirmAddLibrary": "Isso adicionará {{numShapes}} forma(s) à sua biblioteca. Tem a certeza?", "confirmAddLibrary": "Isso adicionará {{numShapes}} forma(s) à sua biblioteca. Tem certeza?",
"imageDoesNotContainScene": "A importação de imagens não é suportada neste momento.\n\nQuer importar uma cena? Esta imagem parece não conter dados de cena. Ativou isto durante a exportação?", "imageDoesNotContainScene": "A importação de imagens não é suportada no momento.\n\nVocê deseja importar uma cena? Esta imagem parece não conter dados de cena. Você ativou isto durante a exportação?",
"cannotRestoreFromImage": "Não foi possível restaurar a cena deste ficheiro de imagem", "cannotRestoreFromImage": "Não foi possível restaurar a cena deste arquivo de imagem",
"invalidSceneUrl": "Não foi possível importar a cena a partir do URL fornecido. Ou está mal formado ou não contém dados JSON do Excalidraw válidos.", "invalidSceneUrl": "Não foi possível importar a cena a partir da URL fornecida. Ela está malformada ou não contém dados JSON de Excalidraw válidos.",
"resetLibrary": "Isto irá limpar a sua biblioteca. Tem a certeza?" "resetLibrary": "Isto irá limpar a sua biblioteca. Tem a certeza?"
}, },
"toolBar": { "toolBar": {
@@ -172,92 +172,88 @@
"lock": "Manter a ferramenta selecionada ativa após desenhar" "lock": "Manter a ferramenta selecionada ativa após desenhar"
}, },
"headings": { "headings": {
"canvasActions": "Ações da área de desenho", "canvasActions": "Ações da tela",
"selectedShapeActions": "Ações das formas selecionadas", "selectedShapeActions": "Ações das formas selecionadas",
"shapes": "Formas" "shapes": "Formas"
}, },
"hints": { "hints": {
"linearElement": "Clique para iniciar vários pontos, arraste para uma única linha", "linearElement": "Clique para iniciar vários pontos, arraste para uma única linha",
"freeDraw": "Clique e arraste, large quando terminar", "freeDraw": "Toque e arraste, solte quando terminar",
"text": "Dica: também pode adicionar texto clicando duas vezes em qualquer lugar com a ferramenta de seleção", "text": "Dica: você também pode adicionar texto clicando duas vezes em qualquer lugar com a ferramenta de seleção",
"text_selected": "Clique duas vezes ou pressione a tecla Enter para editar o texto",
"text_editing": "Pressione a tecla Escape ou CtrlOrCmd+ENTER para terminar a edição",
"linearElementMulti": "Clique no último ponto ou pressione Escape ou Enter para terminar", "linearElementMulti": "Clique no último ponto ou pressione Escape ou Enter para terminar",
"lockAngle": "Pode restringir o ângulo mantendo premida a tecla SHIFT", "lockAngle": "Você pode restringir o ângulo segurando SHIFT",
"resize": "Pode restringir as proporções mantendo a tecla SHIFT premida enquanto redimensiona,\nmantenha a tecla ALT premida para redimensionar a partir do centro", "resize": "Você pode restringir proporções segurando SHIFT enquanto redimensiona,\nsegure ALT para redimensionar do centro",
"rotate": "Pode restringir os ângulos mantendo a tecla SHIFT premida enquanto roda", "rotate": "Você pode restringir os ângulos segurando SHIFT enquanto gira",
"lineEditor_info": "Clique duas vezes ou pressione a tecla Enter para editar os pontos", "lineEditor_info": "Clique duas vezes ou pressione Enter para editar os pontos",
"lineEditor_pointSelected": "Pressione a tecla Delete para remover o ponto, CtrlOuCmd+D para duplicar ou arraste para mover", "lineEditor_pointSelected": "Pressione Deletar para remover ponto, CtrlOuCmd+D para duplicar ou arraste para mover",
"lineEditor_nothingSelected": "Selecione um ponto para mover ou remover, ou mantenha premida a tecla Alt e clique para adicionar novos pontos" "lineEditor_nothingSelected": "Selecione um ponto para mover ou remover, ou segure Alt e clique para adicionar novos pontos"
}, },
"canvasError": { "canvasError": {
"cannotShowPreview": "Não é possível mostrar uma pré-visualização", "cannotShowPreview": "Não é possível mostrar pré-visualização",
"canvasTooBig": "A área de desenho pode ser muito grande.", "canvasTooBig": "A tela pode ser muito grande.",
"canvasTooBigTip": "Dica: tente aproximar um pouco os elementos mais distantes." "canvasTooBigTip": "Dica: tente aproximar um pouco os elementos mais distantes."
}, },
"errorSplash": { "errorSplash": {
"headingMain_pre": "Foi encontrado um erro. Tente ", "headingMain_pre": "Foi encontrado um erro. Tente ",
"headingMain_button": "recarregar a página.", "headingMain_button": "recarregar a página.",
"clearCanvasMessage": "Se a recarga não funcionar, tente ", "clearCanvasMessage": "Se a recarga não funcionar, tente ",
"clearCanvasMessage_button": "a limpar a área de desenho.", "clearCanvasMessage_button": "limpando a tela.",
"clearCanvasCaveat": " Isso resultará em perda de trabalho ", "clearCanvasCaveat": " Isso resultará em perda de trabalho ",
"trackedToSentry_pre": "O erro com o identificador ", "trackedToSentry_pre": "O erro com o identificador ",
"trackedToSentry_post": " foi rastreado no nosso sistema.", "trackedToSentry_post": " foi rastreado no nosso sistema.",
"openIssueMessage_pre": "Fomos muito cautelosos para não incluir suas informações de cena no erro. Se sua cena não for privada, por favor, considere seguir nosso ", "openIssueMessage_pre": "Fomos muito cautelosos para não incluir suas informações de cena no erro. Se sua cena não for privada, por favor, considere seguir nosso ",
"openIssueMessage_button": "rastreador de bugs.", "openIssueMessage_button": "rastreador de bugs.",
"openIssueMessage_post": " Por favor, inclua informações abaixo, copiando e colando no relatório de erros no GitHub.", "openIssueMessage_post": " Por favor, inclua informações abaixo, copiando e colando para a issue do GitHub.",
"sceneContent": "Conteúdo da cena:" "sceneContent": "Conteúdo da cena:"
}, },
"roomDialog": { "roomDialog": {
"desc_intro": "Pode convidar pessoas para colaborarem na sua cena atual.", "desc_intro": "Você pode convidar pessoas para sua cena atual para colaborar com você.",
"desc_privacy": "Não se preocupe, a sessão usa criptografia de ponta-a-ponta, por isso o que desenhar permanecerá privado. Nem mesmo o nosso servidor poderá ver o que cria.", "desc_privacy": "Não se preocupe, a sessão usa criptografia de ponta a ponta; portanto, o que você desenhar permanecerá privado. Nem mesmo nosso servidor poderá ver o que você cria.",
"button_startSession": "Iniciar sessão", "button_startSession": "Iniciar sessão",
"button_stopSession": "Parar sessão", "button_stopSession": "Parar sessão",
"desc_inProgressIntro": "A sessão de colaboração ao vivo está agora em andamento.", "desc_inProgressIntro": "A sessão de colaboração ao vivo está agora em andamento.",
"desc_shareLink": "Partilhe este link com qualquer pessoa com quem queira colaborar:", "desc_shareLink": "Compartilhe este link com qualquer pessoa com quem você queira colaborar:",
"desc_exitSession": "Interrompendo a sessão irá desconectar-se da sala, mas poderá continuar a trabalhar com a cena localmente. Note que isso não afetará outras pessoas e elas ainda poderão colaborar nas versões deles.", "desc_exitSession": "Interrompendo a sessão você irá se desconectar da sala, mas você poderá continuar trabalhando com a cena localmente. Observe que isso não afetará outras pessoas, e elas ainda poderão colaborar em sua versão.",
"shareTitle": "Participe numa sessão de colaboração ao vivo no Excalidraw" "shareTitle": "Participe de uma sessão de colaboração ao vivo na Excalidraw"
}, },
"errorDialog": { "errorDialog": {
"title": "Erro" "title": "Erro"
}, },
"exportDialog": { "exportDialog": {
"disk_title": "Guardar no disco", "disk_title": "",
"disk_details": "Exportar os dados da cena para um ficheiro do qual poderá importar mais tarde.", "disk_details": "",
"disk_button": "Guardar num ficheiro", "disk_button": "",
"link_title": "Link partilhável", "link_title": "",
"link_details": "Exportar como um link de apenas leitura.", "link_details": "",
"link_button": "Exportar para link", "link_button": "",
"excalidrawplus_description": "Guardar a cena no seu espaço de trabalho Excalidraw+", "excalidrawplus_description": "",
"excalidrawplus_button": "Exportar", "excalidrawplus_button": "",
"excalidrawplus_exportError": "Não foi possível exportar para o Excalidraw+ neste momento..." "excalidrawplus_exportError": ""
}, },
"helpDialog": { "helpDialog": {
"blog": "Leia o nosso blogue", "blog": "Leia o nosso blog",
"click": "clicar", "click": "clicar",
"curvedArrow": "Seta curva", "curvedArrow": "Seta curva",
"curvedLine": "Linha curva", "curvedLine": "Linha curva",
"documentation": "Documentação", "documentation": "Documentação",
"doubleClick": "clique duplo",
"drag": "arrastar", "drag": "arrastar",
"editor": "Editor", "editor": "Editor",
"editSelectedShape": "Editar forma selecionada (texto/seta/linha)", "github": "Encontrou algum problema? Nos informe",
"github": "Encontrou algum problema? Informe-nos",
"howto": "Siga os nossos guias", "howto": "Siga os nossos guias",
"or": "ou", "or": "ou",
"preventBinding": "Prevenir fixação de seta", "preventBinding": "Prevenir fixação de seta",
"shapes": "Formas", "shapes": "Formas",
"shortcuts": "Atalhos de teclado", "shortcuts": "Atalhos de teclado",
"textFinish": "Finalizar edição (editor texto)", "textFinish": "Finalizar edição (texto)",
"textNewLine": "Adicionar nova linha (editor de texto)", "textNewLine": "Adicionar nova linha (texto)",
"title": "Ajuda", "title": "Ajuda",
"view": "Visualizar", "view": "Visualizar",
"zoomToFit": "Ajustar para todos os elementos caberem", "zoomToFit": "Ajustar para caber todos os elementos",
"zoomToSelection": "Ampliar a seleção" "zoomToSelection": "Ampliar a seleção"
}, },
"encrypted": { "encrypted": {
"tooltip": "Os seus desenhos são encriptados de ponta-a-ponta, por isso os servidores do Excalidraw nunca os verão.", "tooltip": "Seus desenhos são criptografados de ponta a ponta, então os servidores do Excalidraw nunca os verão.",
"link": "Publicação de blogue na encriptação ponta-a-ponta no Excalidraw" "link": "Publicação de blog na encriptação de ponta a ponta na Excalidraw"
}, },
"stats": { "stats": {
"angle": "Ângulo", "angle": "Ângulo",
@@ -277,7 +273,7 @@
"toast": { "toast": {
"copyStyles": "Estilos copiados.", "copyStyles": "Estilos copiados.",
"copyToClipboard": "Copiado para a área de transferência.", "copyToClipboard": "Copiado para a área de transferência.",
"copyToClipboardAsPng": "{{exportSelection}} copiado para a área de transferência como PNG\n({{exportColorScheme}})", "copyToClipboardAsPng": "Copiado {{exportSelection}} para a área de transferência como PNG\n({{exportColorScheme}})",
"fileSaved": "Ficheiro guardado.", "fileSaved": "Ficheiro guardado.",
"fileSavedToFilename": "Guardado como {filename}", "fileSavedToFilename": "Guardado como {filename}",
"canvas": "área de desenho", "canvas": "área de desenho",

View File

@@ -180,8 +180,6 @@
"linearElement": "Dă clic pentru a crea mai multe puncte, glisează pentru a forma o singură linie", "linearElement": "Dă clic pentru a crea mai multe puncte, glisează pentru a forma o singură linie",
"freeDraw": "Dă clic pe pânză și glisează cursorul, apoi eliberează-l când ai terminat", "freeDraw": "Dă clic pe pânză și glisează cursorul, apoi eliberează-l când ai terminat",
"text": "Sfat: poți adăuga text și dând dublu clic oriunde cu instrumentul de selecție", "text": "Sfat: poți adăuga text și dând dublu clic oriunde cu instrumentul de selecție",
"text_selected": "Dă dublu clic sau apasă tasta Enter pentru a edita textul",
"text_editing": "Apasă tasta Escape sau Ctrl sau Cmd + Enter pentru a finaliza editarea",
"linearElementMulti": "Dă clic pe ultimul punct sau apasă tasta Escape sau tasta Enter pentru a termina", "linearElementMulti": "Dă clic pe ultimul punct sau apasă tasta Escape sau tasta Enter pentru a termina",
"lockAngle": "Poți constrânge unghiul prin ținerea apăsată a tastei SHIFT", "lockAngle": "Poți constrânge unghiul prin ținerea apăsată a tastei SHIFT",
"resize": "Poți constrânge proporțiile, ținând apăsată tasta SHIFT în timp ce redimensionezi,\nține apăsată tasta ALT pentru a redimensiona de la centru", "resize": "Poți constrânge proporțiile, ținând apăsată tasta SHIFT în timp ce redimensionezi,\nține apăsată tasta ALT pentru a redimensiona de la centru",
@@ -238,18 +236,16 @@
"curvedArrow": "Săgeată curbată", "curvedArrow": "Săgeată curbată",
"curvedLine": "Linie curbată", "curvedLine": "Linie curbată",
"documentation": "Documentație", "documentation": "Documentație",
"doubleClick": "dublu clic",
"drag": "glisare", "drag": "glisare",
"editor": "Editor", "editor": "Editor",
"editSelectedShape": "Editează forma selectată (text/săgeată/linie)",
"github": "Ai întâmpinat o problemă? Trimite un raport", "github": "Ai întâmpinat o problemă? Trimite un raport",
"howto": "Urmărește ghidurile noastre", "howto": "Urmărește ghidurile noastre",
"or": "sau", "or": "sau",
"preventBinding": "Împiedică legarea săgeții", "preventBinding": "Împiedică legarea săgeții",
"shapes": "Forme", "shapes": "Forme",
"shortcuts": "Comenzi rapide de la tastatură", "shortcuts": "Comenzi rapide de la tastatură",
"textFinish": "Finalizează editarea (editor de text)", "textFinish": "Finalizează editarea (text)",
"textNewLine": "Adaugă o linie nouă (editor de text)", "textNewLine": "Adaugă o linie nouă (text)",
"title": "Ajutor", "title": "Ajutor",
"view": "Vizualizare", "view": "Vizualizare",
"zoomToFit": "Transfocare pentru a cuprinde totul", "zoomToFit": "Transfocare pentru a cuprinde totul",

View File

@@ -101,9 +101,9 @@
"viewMode": "Вид", "viewMode": "Вид",
"toggleExportColorScheme": "Экспортировать цветовую схему", "toggleExportColorScheme": "Экспортировать цветовую схему",
"share": "Поделиться", "share": "Поделиться",
"showStroke": "Показать выбор цвета обводки", "showStroke": "",
"showBackground": "Показать выбор цвета фона", "showBackground": "",
"toggleTheme": "Переключить тему" "toggleTheme": ""
}, },
"buttons": { "buttons": {
"clearReset": "Очистить холст и сбросить цвет фона", "clearReset": "Очистить холст и сбросить цвет фона",
@@ -151,8 +151,8 @@
"loadSceneOverridePrompt": "Загрузка рисунка приведёт к замене имеющегося содержимого. Вы хотите продолжить?", "loadSceneOverridePrompt": "Загрузка рисунка приведёт к замене имеющегося содержимого. Вы хотите продолжить?",
"collabStopOverridePrompt": "Остановка сессии перезапишет ваш предыдущий, локально сохранённый рисунок. Вы уверены? \n\n(Если вы хотите оставить ваш локальный рисунок, просто закройте вкладку браузера)", "collabStopOverridePrompt": "Остановка сессии перезапишет ваш предыдущий, локально сохранённый рисунок. Вы уверены? \n\n(Если вы хотите оставить ваш локальный рисунок, просто закройте вкладку браузера)",
"errorLoadingLibrary": "Произошла ошибка при загрузке сторонней библиотеки.", "errorLoadingLibrary": "Произошла ошибка при загрузке сторонней библиотеки.",
"errorAddingToLibrary": "Не удалось добавить элемент в библиотеку", "errorAddingToLibrary": "",
"errorRemovingFromLibrary": "Не удалось удалить элемент из библиотеки", "errorRemovingFromLibrary": "",
"confirmAddLibrary": "Будет добавлено {{numShapes}} фигур в вашу библиотеку. Продолжить?", "confirmAddLibrary": "Будет добавлено {{numShapes}} фигур в вашу библиотеку. Продолжить?",
"imageDoesNotContainScene": "Импорт изображений не поддерживается в данный момент.\n\nХотите импортировать сцену? Данное изображение не содержит данных о сцене. Было ли включено это во время экспорта?", "imageDoesNotContainScene": "Импорт изображений не поддерживается в данный момент.\n\nХотите импортировать сцену? Данное изображение не содержит данных о сцене. Было ли включено это во время экспорта?",
"cannotRestoreFromImage": "Сцена не может быть восстановлена из этого изображения", "cannotRestoreFromImage": "Сцена не может быть восстановлена из этого изображения",
@@ -166,7 +166,7 @@
"ellipse": "Эллипс", "ellipse": "Эллипс",
"arrow": "Cтрелка", "arrow": "Cтрелка",
"line": "Линия", "line": "Линия",
"freedraw": "Чертить", "freedraw": "",
"text": "Текст", "text": "Текст",
"library": "Библиотека", "library": "Библиотека",
"lock": "Сохранять выбранный инструмент активным после рисования" "lock": "Сохранять выбранный инструмент активным после рисования"
@@ -180,8 +180,6 @@
"linearElement": "Нажмите, чтобы начать несколько точек, перетащите для одной линии", "linearElement": "Нажмите, чтобы начать несколько точек, перетащите для одной линии",
"freeDraw": "Нажмите и перетаскивайте, отпустите по завершении", "freeDraw": "Нажмите и перетаскивайте, отпустите по завершении",
"text": "Совет: при выбранном инструменте выделения дважды щёлкните в любом месте, чтобы добавить текст", "text": "Совет: при выбранном инструменте выделения дважды щёлкните в любом месте, чтобы добавить текст",
"text_selected": "Дважды щелкните мышью или нажмите ENTER, чтобы редактировать текст",
"text_editing": "Нажмите Escape либо Ctrl или Cmd + ENTER для завершения редактирования",
"linearElementMulti": "Кликните на последней точке или нажмите Escape или Enter чтобы закончить", "linearElementMulti": "Кликните на последней точке или нажмите Escape или Enter чтобы закончить",
"lockAngle": "Вы можете ограничить угол удерживая SHIFT", "lockAngle": "Вы можете ограничить угол удерживая SHIFT",
"resize": "Вы можете ограничить пропорции, удерживая SHIFT во время изменения размеров,\nудерживайте ALT чтобы изменить размер из центра", "resize": "Вы можете ограничить пропорции, удерживая SHIFT во время изменения размеров,\nудерживайте ALT чтобы изменить размер из центра",
@@ -228,7 +226,7 @@
"link_title": "Поделитесь ссылкой", "link_title": "Поделитесь ссылкой",
"link_details": "Экспорт ссылки только для чтения.", "link_details": "Экспорт ссылки только для чтения.",
"link_button": "Экспорт в ссылку", "link_button": "Экспорт в ссылку",
"excalidrawplus_description": "Сохраните сцену в ваше рабочее пространство Excalidraw+.", "excalidrawplus_description": "",
"excalidrawplus_button": "Экспорт", "excalidrawplus_button": "Экспорт",
"excalidrawplus_exportError": "Не удалось экспортировать в Excalidraw+ на данный момент..." "excalidrawplus_exportError": "Не удалось экспортировать в Excalidraw+ на данный момент..."
}, },
@@ -238,18 +236,16 @@
"curvedArrow": "Изогнутая стрелка", "curvedArrow": "Изогнутая стрелка",
"curvedLine": "Изогнутая линия", "curvedLine": "Изогнутая линия",
"documentation": "Документация", "documentation": "Документация",
"doubleClick": "двойной клик",
"drag": "перетащить", "drag": "перетащить",
"editor": "Редактор", "editor": "Редактор",
"editSelectedShape": "Редактировать выбранную фигуру (текст/стрелка/линия)",
"github": "Нашли проблему? Отправьте", "github": "Нашли проблему? Отправьте",
"howto": "Следуйте нашим инструкциям", "howto": "Следуйте нашим инструкциям",
"or": "или", "or": "или",
"preventBinding": "Предотвращать привязку стрелок", "preventBinding": "Предотвращать привязку стрелок",
"shapes": "Фигуры", "shapes": "Фигуры",
"shortcuts": "Горячие клавиши", "shortcuts": "Горячие клавиши",
"textFinish": "Закончить редактирование (текстовый редактор)", "textFinish": "Закончить редактирование (текст)",
"textNewLine": "Добавить новую строку (текстовый редактор)", "textNewLine": "Добавить новую строку (текст)",
"title": "Помощь", "title": "Помощь",
"view": "Просмотр", "view": "Просмотр",
"zoomToFit": "Отмастштабировать, чтобы поместились все элементы", "zoomToFit": "Отмастштабировать, чтобы поместились все элементы",

View File

@@ -180,8 +180,6 @@
"linearElement": "Kliknite na vloženie viacerých bodov, potiahnite na vytvorenie jednej priamky", "linearElement": "Kliknite na vloženie viacerých bodov, potiahnite na vytvorenie jednej priamky",
"freeDraw": "Kliknite a ťahajte, pustite na ukončenie", "freeDraw": "Kliknite a ťahajte, pustite na ukončenie",
"text": "Tip: text môžete pridať aj dvojklikom kdekoľvek, ak je zvolený nástroj výber", "text": "Tip: text môžete pridať aj dvojklikom kdekoľvek, ak je zvolený nástroj výber",
"text_selected": "Použite dvojklik alebo stlačte Enter na editáciu textu",
"text_editing": "Stlačte Escape alebo CtrlOrCmd+ENTER na ukončenie editovania",
"linearElementMulti": "Kliknite na počiatočný bod alebo stlačte Escape alebo Enter na ukončenie", "linearElementMulti": "Kliknite na počiatočný bod alebo stlačte Escape alebo Enter na ukončenie",
"lockAngle": "Počas rotácie obmedzíte uhol podržaním SHIFT", "lockAngle": "Počas rotácie obmedzíte uhol podržaním SHIFT",
"resize": "Počas zmeny veľkosti zachováte proporcie podržaním SHIFT,\\npodržaním ALT meníte veľkosť so zachovaním stredu", "resize": "Počas zmeny veľkosti zachováte proporcie podržaním SHIFT,\\npodržaním ALT meníte veľkosť so zachovaním stredu",
@@ -238,18 +236,16 @@
"curvedArrow": "Zakrivená šípka", "curvedArrow": "Zakrivená šípka",
"curvedLine": "Zakrivená čiara", "curvedLine": "Zakrivená čiara",
"documentation": "Dokumentácia", "documentation": "Dokumentácia",
"doubleClick": "dvojklik",
"drag": "potiahnutie", "drag": "potiahnutie",
"editor": "Editovanie", "editor": "Editovanie",
"editSelectedShape": "Editovať zvolený tvar (text/šípka/čiara)",
"github": "Objavili ste problém? Nahláste ho", "github": "Objavili ste problém? Nahláste ho",
"howto": "Postupujte podľa naších návodov", "howto": "Postupujte podľa naších návodov",
"or": "alebo", "or": "alebo",
"preventBinding": "Zakázať pripájanie šípky", "preventBinding": "Zakázať pripájanie šípky",
"shapes": "Tvary", "shapes": "Tvary",
"shortcuts": "Klávesové skratky", "shortcuts": "Klávesové skratky",
"textFinish": "Ukončenie editovania (text editor)", "textFinish": "Ukončenie editovania (text)",
"textNewLine": "Vložiť nový riadok (text editor)", "textNewLine": "Vložiť nový riadok (text)",
"title": "Pomocník", "title": "Pomocník",
"view": "Zobrazenie", "view": "Zobrazenie",
"zoomToFit": "Priblížiť aby boli zahrnuté všetky prvky", "zoomToFit": "Priblížiť aby boli zahrnuté všetky prvky",

View File

@@ -180,8 +180,6 @@
"linearElement": "Klicka för att starta flera punkter, dra för en linje", "linearElement": "Klicka för att starta flera punkter, dra för en linje",
"freeDraw": "Klicka och dra, släpp när du är klar", "freeDraw": "Klicka och dra, släpp när du är klar",
"text": "Tips: du kan också lägga till text genom att dubbelklicka var som helst med markeringsverktyget", "text": "Tips: du kan också lägga till text genom att dubbelklicka var som helst med markeringsverktyget",
"text_selected": "Dubbelklicka eller tryck ENTER för att redigera text",
"text_editing": "Tryck Escape eller CtrlOrCmd + ENTER för att slutföra redigeringen",
"linearElementMulti": "Klicka på sista punkten eller tryck Escape eller Enter för att avsluta", "linearElementMulti": "Klicka på sista punkten eller tryck Escape eller Enter för att avsluta",
"lockAngle": "Du kan begränsa vinkeln genom att hålla SKIFT", "lockAngle": "Du kan begränsa vinkeln genom att hålla SKIFT",
"resize": "Du kan behålla proportioner genom att hålla SHIFT medan du ändrar storlek,\nhåller du ALT ändras storlek relativt mitten", "resize": "Du kan behålla proportioner genom att hålla SHIFT medan du ändrar storlek,\nhåller du ALT ändras storlek relativt mitten",
@@ -238,10 +236,8 @@
"curvedArrow": "Böjd pil", "curvedArrow": "Böjd pil",
"curvedLine": "Böjd linje", "curvedLine": "Böjd linje",
"documentation": "Dokumentation", "documentation": "Dokumentation",
"doubleClick": "dubbelklicka",
"drag": "dra", "drag": "dra",
"editor": "Redigerare", "editor": "Redigerare",
"editSelectedShape": "Redigera markerad form (text/pil/linje)",
"github": "Hittat ett problem? Rapportera", "github": "Hittat ett problem? Rapportera",
"howto": "Följ våra guider", "howto": "Följ våra guider",
"or": "eller", "or": "eller",

View File

@@ -180,8 +180,6 @@
"linearElement": "Birden fazla nokta için tıklayın, tek çizgi için sürükleyin", "linearElement": "Birden fazla nokta için tıklayın, tek çizgi için sürükleyin",
"freeDraw": "Tıkla ve sürükle, bitirdiğinde serbest bırak", "freeDraw": "Tıkla ve sürükle, bitirdiğinde serbest bırak",
"text": "İpucu: seçme aracıyla herhangi bir yere çift tıklayarak da yazı ekleyebilirsin", "text": "İpucu: seçme aracıyla herhangi bir yere çift tıklayarak da yazı ekleyebilirsin",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "Tamamlamak için son noktayı seçin veya Escape ve Enter'dan birine basın", "linearElementMulti": "Tamamlamak için son noktayı seçin veya Escape ve Enter'dan birine basın",
"lockAngle": "SHIFT tuşuna basılı tutarak açıyı koruyabilirsiniz", "lockAngle": "SHIFT tuşuna basılı tutarak açıyı koruyabilirsiniz",
"resize": "Yeniden boyutlandırırken SHIFT'e basılı tutarak oranları kısıtlayabilirsiniz, merkezden yeniden boyutlandırmak için ALT'a basılı tutun", "resize": "Yeniden boyutlandırırken SHIFT'e basılı tutarak oranları kısıtlayabilirsiniz, merkezden yeniden boyutlandırmak için ALT'a basılı tutun",
@@ -238,18 +236,16 @@
"curvedArrow": "Eğri ok", "curvedArrow": "Eğri ok",
"curvedLine": "Eğri çizgi", "curvedLine": "Eğri çizgi",
"documentation": "Dokümantasyon", "documentation": "Dokümantasyon",
"doubleClick": "",
"drag": "sürükle", "drag": "sürükle",
"editor": "Düzenleyici", "editor": "Düzenleyici",
"editSelectedShape": "",
"github": "Bir hata mı buldun? Bildir", "github": "Bir hata mı buldun? Bildir",
"howto": "Rehberlerimizi takip edin", "howto": "Rehberlerimizi takip edin",
"or": "veya", "or": "veya",
"preventBinding": "Ok bağlamayı önleyin", "preventBinding": "Ok bağlamayı önleyin",
"shapes": "Şekiller", "shapes": "Şekiller",
"shortcuts": "Klavye kısayolları", "shortcuts": "Klavye kısayolları",
"textFinish": "", "textFinish": "(Metin) düzenlemeyi bitir",
"textNewLine": "", "textNewLine": "Yeni satır ekle (metin)",
"title": "Yardım", "title": "Yardım",
"view": "Görünüm", "view": "Görünüm",
"zoomToFit": "Tüm öğeleri sığdırmak için yakınlaştır", "zoomToFit": "Tüm öğeleri sığdırmak için yakınlaştır",

View File

@@ -180,8 +180,6 @@
"linearElement": "Натисніть щоб додати кілька точок, перетягніть щоб намалювати одну лінію", "linearElement": "Натисніть щоб додати кілька точок, перетягніть щоб намалювати одну лінію",
"freeDraw": "Натисніть і потягніть, відпустіть коли завершите", "freeDraw": "Натисніть і потягніть, відпустіть коли завершите",
"text": "Порада: можна також додати текст, двічі клацнувши по будь-якому місці інструментом вибору", "text": "Порада: можна також додати текст, двічі клацнувши по будь-якому місці інструментом вибору",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "Натисніть на останню точку, клацніть Esc або Enter щоб завершити", "linearElementMulti": "Натисніть на останню точку, клацніть Esc або Enter щоб завершити",
"lockAngle": "Ви можете обмежити кут, утримуюючи SHIFT", "lockAngle": "Ви можете обмежити кут, утримуюючи SHIFT",
"resize": "Ви можете зберегти пропорції, утримуючи SHIFT під час зміни розміру,\nутримуйте ALT для змінення розміру від центру", "resize": "Ви можете зберегти пропорції, утримуючи SHIFT під час зміни розміру,\nутримуйте ALT для змінення розміру від центру",
@@ -238,18 +236,16 @@
"curvedArrow": "Крива стрілка", "curvedArrow": "Крива стрілка",
"curvedLine": "Крива лінія", "curvedLine": "Крива лінія",
"documentation": "Документація", "documentation": "Документація",
"doubleClick": "",
"drag": "перетягнути", "drag": "перетягнути",
"editor": "Редактор", "editor": "Редактор",
"editSelectedShape": "",
"github": "Знайшли помилку? Повідомте", "github": "Знайшли помилку? Повідомте",
"howto": "Дотримуйтесь наших інструкцій", "howto": "Дотримуйтесь наших інструкцій",
"or": "або", "or": "або",
"preventBinding": "Запобігти зв'язування зі стрілками", "preventBinding": "Запобігти зв'язування зі стрілками",
"shapes": "Фігури", "shapes": "Фігури",
"shortcuts": "Гарячі клавіші", "shortcuts": "Гарячі клавіші",
"textFinish": "", "textFinish": "Завершити редагування (текст)",
"textNewLine": "", "textNewLine": "Додати новий рядок (текст)",
"title": "Допомога", "title": "Допомога",
"view": "Вигляд", "view": "Вигляд",
"zoomToFit": "Збільшити щоб умістити всі елементи", "zoomToFit": "Збільшити щоб умістити всі елементи",

View File

@@ -180,8 +180,6 @@
"linearElement": "点击创建多个点 拖动创建直线", "linearElement": "点击创建多个点 拖动创建直线",
"freeDraw": "点击并拖动,完成时松开", "freeDraw": "点击并拖动,完成时松开",
"text": "提示:您也可以使用选择工具双击任意位置来添加文字", "text": "提示:您也可以使用选择工具双击任意位置来添加文字",
"text_selected": "双击或按回车键以编辑文本",
"text_editing": "按下 Escape 或 CtrlOrCmd+ENTER 完成编辑",
"linearElementMulti": "点击最后一个点或按下 Esc/Enter 来完成", "linearElementMulti": "点击最后一个点或按下 Esc/Enter 来完成",
"lockAngle": "可以按住 Shift 来约束角度", "lockAngle": "可以按住 Shift 来约束角度",
"resize": "您可以按住SHIFT来限制比例大小\n按住ALT来调整中心大小", "resize": "您可以按住SHIFT来限制比例大小\n按住ALT来调整中心大小",
@@ -229,7 +227,7 @@
"link_details": "导出为只读链接。", "link_details": "导出为只读链接。",
"link_button": "导出链接", "link_button": "导出链接",
"excalidrawplus_description": "", "excalidrawplus_description": "",
"excalidrawplus_button": "导出", "excalidrawplus_button": "",
"excalidrawplus_exportError": "" "excalidrawplus_exportError": ""
}, },
"helpDialog": { "helpDialog": {
@@ -238,18 +236,16 @@
"curvedArrow": "曲线箭头", "curvedArrow": "曲线箭头",
"curvedLine": "曲线", "curvedLine": "曲线",
"documentation": "文档", "documentation": "文档",
"doubleClick": "双击",
"drag": "拖动", "drag": "拖动",
"editor": "编辑器", "editor": "编辑器",
"editSelectedShape": "编辑选中的形状 (文本、箭头或线条)",
"github": "提交问题", "github": "提交问题",
"howto": "帮助文档", "howto": "帮助文档",
"or": "或", "or": "或",
"preventBinding": "禁用箭头吸附", "preventBinding": "禁用箭头吸附",
"shapes": "形状", "shapes": "形状",
"shortcuts": "快捷键列表", "shortcuts": "快捷键列表",
"textFinish": "完成编辑 (文本编辑器)", "textFinish": "完成文本编辑",
"textNewLine": "", "textNewLine": "文本换行",
"title": "帮助", "title": "帮助",
"view": "视图", "view": "视图",
"zoomToFit": "缩放以适应所有元素", "zoomToFit": "缩放以适应所有元素",

View File

@@ -180,8 +180,6 @@
"linearElement": "點擊以繪製多點曲線;或拖曳以繪製直線", "linearElement": "點擊以繪製多點曲線;或拖曳以繪製直線",
"freeDraw": "點擊並拖曳來繪圖,放開即結束", "freeDraw": "點擊並拖曳來繪圖,放開即結束",
"text": "提示:亦可使用選取工具在任何地方雙擊來加入文字", "text": "提示:亦可使用選取工具在任何地方雙擊來加入文字",
"text_selected": "雙擊滑鼠或按 Enter 以編輯文字",
"text_editing": "按跳脫鍵或 Ctrl 或 Cmd + Enter 以結束編輯",
"linearElementMulti": "按下 Escape 或 Enter 以結束繪製", "linearElementMulti": "按下 Escape 或 Enter 以結束繪製",
"lockAngle": "按住 SHIFT 可限制旋轉角度", "lockAngle": "按住 SHIFT 可限制旋轉角度",
"resize": "縮放時按住 Shift 可保持原比例縮放;\\n按住 Alt 可由中心點進行縮放", "resize": "縮放時按住 Shift 可保持原比例縮放;\\n按住 Alt 可由中心點進行縮放",
@@ -238,18 +236,16 @@
"curvedArrow": "曲箭頭", "curvedArrow": "曲箭頭",
"curvedLine": "曲線", "curvedLine": "曲線",
"documentation": "文件", "documentation": "文件",
"doubleClick": "雙擊",
"drag": "拖曳", "drag": "拖曳",
"editor": "編輯器", "editor": "編輯器",
"editSelectedShape": "編輯選定的形狀(文字/箭號/線條)",
"github": "發現異常?回報問題", "github": "發現異常?回報問題",
"howto": "參照我們的說明", "howto": "參照我們的說明",
"or": "或", "or": "或",
"preventBinding": "避免箭號連結", "preventBinding": "避免箭號連結",
"shapes": "形狀", "shapes": "形狀",
"shortcuts": "鍵盤快速鍵", "shortcuts": "鍵盤快速鍵",
"textFinish": "完成編輯(文字編輯器)", "textFinish": "完成編輯 (文字)",
"textNewLine": "換行(文字編輯器)", "textNewLine": "換行 (文字)",
"title": "說明", "title": "說明",
"view": "檢視", "view": "檢視",
"zoomToFit": "放大至填滿畫面", "zoomToFit": "放大至填滿畫面",

View File

@@ -11,28 +11,15 @@ The change should be grouped under one of the below section and must contain PR
Please add the latest change on the top under the correct section. Please add the latest change on the top under the correct section.
--> -->
## 0.9.0 (2021-07-10) ## Unreleased
**This changes are not yet released but you can still try it out in [@excalidraw/excalidraw-next](https://www.npmjs.com/package/@excalidraw/excalidraw-next).**
## Excalidraw API ## Excalidraw API
### Features ### Features
- [`restore(data, localAppState, localElements)`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#restore) and [`restoreElements(elements, localElements)`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#restoreElements) now take `localElements` argument which will be used to ensure existing elements' versions are used and incremented. This fixes an issue where importing the same file would resolve to elements with older versions, potentially causing issues when reconciling [#3797](https://github.com/excalidraw/excalidraw/pull/3797). - Expose [`FONT_FAMILY`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#FONT_FAMILY) so that consumer can use when passing `initialData.appState.currentItemFontFamily`.
#### BREAKING CHANGE
- `localElements` argument is mandatory (can be `null`/`undefined`) if using TypeScript.
- Support `appState.exportEmbedScene` attribute in [`exportToSvg`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#exportToSvg) which allows to embed the scene data [#3777](https://github.com/excalidraw/excalidraw/pull/3777).
#### BREAKING CHANGE
- The attribute `metadata` is now removed as `metadata` was only used to embed scene data which is now supported with the `appState.exportEmbedScene` attribute.
- [`exportToSvg`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#exportToSvg) now resolves to a promise which resolves to `svg` of the exported drawing.
- Expose [`loadLibraryFromBlob`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#loadLibraryFromBlobY), [`loadFromBlob`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#loadFromBlob), and [`getFreeDrawSvgPath`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#getFreeDrawSvgPath) [#3764](https://github.com/excalidraw/excalidraw/pull/3764).
- Expose [`FONT_FAMILY`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#FONT_FAMILY) so that consumer can use when passing `initialData.appState.currentItemFontFamily` [#3710](https://github.com/excalidraw/excalidraw/pull/3710).
- Added prop [`autoFocus`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#autoFocus) to focus the excalidraw component on page load when enabled, defaults to false [#3691](https://github.com/excalidraw/excalidraw/pull/3691). - Added prop [`autoFocus`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#autoFocus) to focus the excalidraw component on page load when enabled, defaults to false [#3691](https://github.com/excalidraw/excalidraw/pull/3691).
@@ -45,10 +32,10 @@ Please add the latest change on the top under the correct section.
Also, [`UIOptions`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#UIOptions) is now memoized to avoid unnecessary rerenders. Also, [`UIOptions`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#UIOptions) is now memoized to avoid unnecessary rerenders.
#### BREAKING CHANGE #### BREAKING CHANGE
- `UIOptions.canvasActions.saveAsScene` is now renamed to `UiOptions.canvasActions.export.saveFileToDisk`. Defaults to `true` hence the **save file to disk** button is rendered inside the export dialog. - `UIOptions.canvasActions.saveAsScene` is now renamed to `UiOptions.canvasActions.export.saveFileToDisk`. Defaults to `true` hence the **save file to disk** button is rendered inside the export dialog.
- `exportToBackend` is now renamed to `UIOptions.canvasActions.export.exportToBackend`. If this prop is not passed, the **shareable-link** button will not be rendered, same as before. - `exportToBackend` is now renamed to `UIOptions.canvasActions.export.exportToBackend`. If this prop is not passed, the **shareable-link** button will not be rendered, same as before.
### Fixes ### Fixes
@@ -61,90 +48,6 @@ Please add the latest change on the top under the correct section.
- Removed `shouldAddWatermark: boolean` attribute from options for [export](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#export-utilities) APIs [#3639](https://github.com/excalidraw/excalidraw/pull/3639). - Removed `shouldAddWatermark: boolean` attribute from options for [export](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#export-utilities) APIs [#3639](https://github.com/excalidraw/excalidraw/pull/3639).
- Removed `appState.shouldAddWatermark` so in case you were passing `shouldAddWatermark` in [initialData.AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42) it will not work anymore. - Removed `appState.shouldAddWatermark` so in case you were passing `shouldAddWatermark` in [initialData.AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42) it will not work anymore.
## Excalidraw Library
**_This section lists the updates made to the excalidraw library and will not affect the integration._**
### Features
- Switch to selection tool on library item insert [#3773](https://github.com/excalidraw/excalidraw/pull/3773)
- Show active file name when saving to current file [#3733](https://github.com/excalidraw/excalidraw/pull/3733)
- Add hint around text editing [#3708](https://github.com/excalidraw/excalidraw/pull/3708)
- Change library icon to be more clear [#3583](https://github.com/excalidraw/excalidraw/pull/3583)
- Pass current `theme` when installing libraries [#3701](https://github.com/excalidraw/excalidraw/pull/3701)
- Update virgil font [#3692](https://github.com/excalidraw/excalidraw/pull/3692)
- Support exporting json to excalidraw plus [#3678](https://github.com/excalidraw/excalidraw/pull/3678)
- Save exportScale in AppState [#3580](https://github.com/excalidraw/excalidraw/pull/3580)
- Add shortcuts for stroke and background color picker [#3318](https://github.com/excalidraw/excalidraw/pull/3318)
- Exporting redesign [#3613](https://github.com/excalidraw/excalidraw/pull/3613)
- Auto-position tooltip and suport overflowing container [#3631](https://github.com/excalidraw/excalidraw/pull/3631)
- Auto release @excalidraw/excalidraw-next on every change [#3614](https://github.com/excalidraw/excalidraw/pull/3614)
- Allow inner-drag-selecting with cmd/ctrl [#3603](https://github.com/excalidraw/excalidraw/pull/3603)
### Fixes
- view mode cursor adjustments [#3809](https://github.com/excalidraw/excalidraw/pull/3809).
- Pass next release to updatePackageVersion & replace ## unreleased with new version [#3806](https://github.com/excalidraw/excalidraw/pull/3806)
- Include deleted elements when passing to restore [#3802](https://github.com/excalidraw/excalidraw/pull/3802)
- Import React before using jsx [#3804](https://github.com/excalidraw/excalidraw/pull/3804)
- Ensure `s` and `g` shortcuts work on no selection [#3800](https://github.com/excalidraw/excalidraw/pull/3800)
- Keep binding for attached arrows after changing text [#3754](https://github.com/excalidraw/excalidraw/pull/3754)
- Deselect elements on viewMode toggle [#3741](https://github.com/excalidraw/excalidraw/pull/3741)
- Allow pointer events for disable zen mode button [#3743](https://github.com/excalidraw/excalidraw/pull/3743)
- Use rgba instead of shorthand alpha [#3688](https://github.com/excalidraw/excalidraw/pull/3688)
- Color pickers not opening on mobile [#3676](https://github.com/excalidraw/excalidraw/pull/3676)
- On contextMenu, use selected element regardless of z-index [#3668](https://github.com/excalidraw/excalidraw/pull/3668)
- SelectedGroupIds not being stored in history [#3630](https://github.com/excalidraw/excalidraw/pull/3630)
- Overscroll on touch devices [#3663](https://github.com/excalidraw/excalidraw/pull/3663)
- Small UI issues around image export dialog [#3642](https://github.com/excalidraw/excalidraw/pull/3642)
- Normalize linear element points on restore [#3633](https://github.com/excalidraw/excalidraw/pull/3633)
- Disable pointer-events on footer-center container [#3629](https://github.com/excalidraw/excalidraw/pull/3629)
### Refactor
- Delete React SyntheticEvent persist [#3700](https://github.com/excalidraw/excalidraw/pull/3700)
- Code clean up [#3681](https://github.com/excalidraw/excalidraw/pull/3681)
### Performance
- Improve arrow head sizing [#3480](https://github.com/excalidraw/excalidraw/pull/3480)
### Build
- Add release script to update relevant files and commit for next release [#3805](https://github.com/excalidraw/excalidraw/pull/3805)
- Add script to update changelog before a stable release [#3784](https://github.com/excalidraw/excalidraw/pull/3784)
- Add script to update readme before stable release [#3781](https://github.com/excalidraw/excalidraw/pull/3781)
--- ---
## 0.8.0 (2021-05-15) ## 0.8.0 (2021-05-15)

View File

@@ -20,7 +20,7 @@ After installation you will see a folder `excalidraw-assets` and `excalidraw-ass
Move the folder `excalidraw-assets` and `excalidraw-assets-dev` to the path where your assets are served. Move the folder `excalidraw-assets` and `excalidraw-assets-dev` to the path where your assets are served.
By default it will try to load the files from `https://unpkg.com/@excalidraw/excalidraw/dist/` By default it will try to load the files from `https://unpkg.com/@excalidraw/excalidraw/{currentVersion}/dist/`
If you want to load assets from a different path you can set a variable `window.EXCALIDRAW_ASSET_PATH` depending on environment (for example if you have different URL's for dev and prod) to the url from where you want to load the assets. If you want to load assets from a different path you can set a variable `window.EXCALIDRAW_ASSET_PATH` depending on environment (for example if you have different URL's for dev and prod) to the url from where you want to load the assets.
@@ -177,7 +177,7 @@ For development use :point_down:
```js ```js
<script <script
type="text/javascript" type="text/javascript"
src="https://unpkg.com/@excalidraw/excalidraw/dist/excalidraw.development.js" src="https://unpkg.com/@excalidraw/excalidraw@0.8.0/dist/excalidraw.development.js"
></script> ></script>
``` ```
@@ -186,7 +186,7 @@ For production use :point_down:
```js ```js
<script <script
type="text/javascript" type="text/javascript"
src="https://unpkg.com/@excalidraw/excalidraw/dist/excalidraw.production.min.js" src="https://unpkg.com/@excalidraw/excalidraw@0.8.0/dist/excalidraw.production.min.js"
></script> ></script>
``` ```
@@ -205,7 +205,7 @@ You will need to make sure `react`, `react-dom` is available as shown in the bel
<script <script
type="text/javascript" type="text/javascript"
src="https://unpkg.com/@excalidraw/excalidraw/dist/excalidraw.development.js" src="https://unpkg.com/@excalidraw/excalidraw@0.8.0/dist/excalidraw.development.js"
></script> ></script>
</head> </head>
@@ -353,10 +353,11 @@ To view the full example visit :point_down:
| --- | --- | --- | --- | | --- | --- | --- | --- |
| [`onChange`](#onChange) | Function | | This callback is triggered whenever the component updates due to any change. This callback will receive the excalidraw elements and the current app state. | | [`onChange`](#onChange) | Function | | This callback is triggered whenever the component updates due to any change. This callback will receive the excalidraw elements and the current app state. |
| [`initialData`](#initialData) | <pre>{elements?: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a>, appState?: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState<a> } </pre> | null | The initial data with which app loads. | | [`initialData`](#initialData) | <pre>{elements?: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a>, appState?: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState<a> } </pre> | null | The initial data with which app loads. |
| [`ref`](#ref) | [`createRef`](https://reactjs.org/docs/refs-and-the-dom.html#creating-refs) &#124; [`useRef`](https://reactjs.org/docs/hooks-reference.html#useref) &#124; [`callbackRef`](https://reactjs.org/docs/refs-and-the-dom.html#callback-refs) &#124; <pre>{ current: { readyPromise: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317">resolvablePromise</a> } }</pre> | | Ref to be passed to Excalidraw | | [`ref`](#ref) | [`createRef`](https://reactjs.org/docs/refs-and-the-dom.html#creating-refs) or [`callbackRef`](https://reactjs.org/docs/refs-and-the-dom.html#callback-refs) or <pre>{ current: { readyPromise: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317">resolvablePromise</a> } }</pre> | | Ref to be passed to Excalidraw |
| [`onCollabButtonClick`](#onCollabButtonClick) | Function | | Callback to be triggered when the collab button is clicked | | [`onCollabButtonClick`](#onCollabButtonClick) | Function | | Callback to be triggered when the collab button is clicked |
| [`isCollaborating`](#isCollaborating) | `boolean` | | This implies if the app is in collaboration mode | | [`isCollaborating`](#isCollaborating) | `boolean` | | This implies if the app is in collaboration mode |
| [`onPointerUpdate`](#onPointerUpdate) | Function | | Callback triggered when mouse pointer is updated. | | [`onPointerUpdate`](#onPointerUpdate) | Function | | Callback triggered when mouse pointer is updated. |
| [`onExportToBackend`](#onExportToBackend) | Function | | Callback triggered when link button is clicked on export dialog |
| [`langCode`](#langCode) | string | `en` | Language code string | | [`langCode`](#langCode) | string | `en` | Language code string |
| [`renderTopRightUI`](#renderTopRightUI) | Function | | Function that renders custom UI in top right corner | | [`renderTopRightUI`](#renderTopRightUI) | Function | | Function that renders custom UI in top right corner |
| [`renderFooter `](#renderFooter) | Function | | Function that renders custom UI footer | | [`renderFooter `](#renderFooter) | Function | | Function that renders custom UI footer |
@@ -372,7 +373,6 @@ To view the full example visit :point_down:
| [`detectScroll`](#detectScroll) | boolean | true | Indicates whether to update the offsets when nearest ancestor is scrolled. | | [`detectScroll`](#detectScroll) | boolean | true | Indicates whether to update the offsets when nearest ancestor is scrolled. |
| [`handleKeyboardGlobally`](#handleKeyboardGlobally) | boolean | false | Indicates whether to bind the keyboard events to document. | | [`handleKeyboardGlobally`](#handleKeyboardGlobally) | boolean | false | Indicates whether to bind the keyboard events to document. |
| [`onLibraryChange`](#onLibraryChange) | <pre>(items: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L200">LibraryItems</a>) => void &#124; Promise&lt;any&gt; </pre> | | The callback if supplied is triggered when the library is updated and receives the library items. | | [`onLibraryChange`](#onLibraryChange) | <pre>(items: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L200">LibraryItems</a>) => void &#124; Promise&lt;any&gt; </pre> | | The callback if supplied is triggered when the library is updated and receives the library items. |
| [`autoFocus`](#autoFocus) | boolean | false | Implies whether to focus the Excalidraw component on page load |
### Dimensions of Excalidraw ### Dimensions of Excalidraw
@@ -442,7 +442,7 @@ You can pass a `ref` when you want to access some excalidraw APIs. We expose the
| --- | --- | --- | | --- | --- | --- |
| ready | `boolean` | This is set to true once Excalidraw is rendered | | ready | `boolean` | This is set to true once Excalidraw is rendered |
| readyPromise | [resolvablePromise](https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317) | This promise will be resolved with the api once excalidraw has rendered. This will be helpful when you want do some action on the host app once this promise resolves. For this to work you will have to pass ref as shown [here](#readyPromise) | | readyPromise | [resolvablePromise](https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317) | This promise will be resolved with the api once excalidraw has rendered. This will be helpful when you want do some action on the host app once this promise resolves. For this to work you will have to pass ref as shown [here](#readyPromise) |
| [updateScene](#updateScene) | <pre>(<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L207">sceneData</a>)) => void </pre> | updates the scene with the sceneData | | updateScene | <pre>(<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L204">sceneData</a>)) => void </pre> | updates the scene with the sceneData |
| resetScene | `({ resetLoadingState: boolean }) => void` | Resets the scene. If `resetLoadingState` is passed as true then it will also force set the loading state to false. | | resetScene | `({ resetLoadingState: boolean }) => void` | Resets the scene. If `resetLoadingState` is passed as true then it will also force set the loading state to false. |
| getSceneElementsIncludingDeleted | <pre> () => <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a></pre> | Returns all the elements including the deleted in the scene | | getSceneElementsIncludingDeleted | <pre> () => <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a></pre> | Returns all the elements including the deleted in the scene |
| getSceneElements | <pre> () => <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a></pre> | Returns all the elements excluding the deleted in the scene | | getSceneElements | <pre> () => <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a></pre> | Returns all the elements excluding the deleted in the scene |
@@ -460,23 +460,6 @@ You can pass a `ref` when you want to access some excalidraw APIs. We expose the
const excalidrawRef = { current: { readyPromise: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317">resolvablePromise</a>}} const excalidrawRef = { current: { readyPromise: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317">resolvablePromise</a>}}
</pre> </pre>
Since plain object is passed as a `ref`, the `readyPromise` is resolved as soon as the component is mounted. Most of the time you will not need this unless you have a specific use case where you can't pass the `ref` in the react way and want to do some action on the host when this promise resolves. You can check the [example](https://codesandbox.io/s/eexcalidraw-resolvable-promise-d0qg3?file=/src/App.js) for the usage.
### `updateScene`
<pre>
(<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L207">sceneData</a>)) => void
</pre>
You can use this function to update the scene with the sceneData. It accepts the below attributes.
| Name | Type | Description |
| --- | --- | --- |
| `elements` | [`ImportedDataState["elements"]`](https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L17) | The `elements` to be updated in the scene |
| `appState` | [`ImportedDataState["appState"]`](https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L18) | The `appState` to be updated in the scene. |
| `collaborators` | <pre>Map<string, <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L29">Collaborator></a></pre> | The list of collaborators to be updated in the scene. |
| `commitToHistory` | `boolean` | Implies if the `history (undo/redo)` should be recorded. Defaults to `false`. |
#### `onCollabButtonClick` #### `onCollabButtonClick`
This callback is triggered when clicked on the collab button in excalidraw. If not supplied, the collab dialog button is not rendered. This callback is triggered when clicked on the collab button in excalidraw. If not supplied, the collab dialog button is not rendered.
@@ -499,6 +482,10 @@ This callback is triggered when mouse pointer is updated.
3.`pointersMap`: [`pointers map`](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L131) of the scene 3.`pointersMap`: [`pointers map`](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L131) of the scene
#### `onExportToBackend`
This callback is triggered when the shareable-link button is clicked in the export dialog. The link button will only be shown if this callback is passed.
```js ```js
(exportedElements, appState, canvas) => void (exportedElements, appState, canvas) => void
``` ```
@@ -578,21 +565,11 @@ This prop can be used to customise UI of Excalidraw. Currently we support custom
| --- | --- | --- | --- | | --- | --- | --- | --- |
| `changeViewBackgroundColor` | boolean | true | Implies whether to show `Background color picker` | | `changeViewBackgroundColor` | boolean | true | Implies whether to show `Background color picker` |
| `clearCanvas` | boolean | true | Implies whether to show `Clear canvas button` | | `clearCanvas` | boolean | true | Implies whether to show `Clear canvas button` |
| `export` | false &#124; [exportOpts](#exportOpts) | <pre>{ saveFileToDisk: true }</pre> | This prop allows to customize the UI inside the export dialog. By default it shows the "saveFileToDisk". If this prop is `false` the export button will not be rendered. For more details visit [`exportOpts`](#exportOpts). | | `export` | boolean | true | Implies whether to show `Export button` |
| `loadScene` | boolean | true | Implies whether to show `Load button` | | `loadScene` | boolean | true | Implies whether to show `Load button` |
| `saveToActiveFile` | boolean | true | Implies whether to show `Save button` to save to current file | | `saveAsScene` | boolean | true | Implies whether to show `Save as button` |
| `saveScene` | boolean | true | Implies whether to show `Save button` |
| `theme` | boolean | true | Implies whether to show `Theme toggle` | | `theme` | boolean | true | Implies whether to show `Theme toggle` |
| `saveAsImage` | boolean | true | Implies whether to show `Save as image button` |
#### `exportOpts`
The below attributes can be set in `UIOptions.canvasActions.export` to customize the export dialog. If `UIOptions.canvasActions.export` is `false` the export button will not be rendered.
| Attribute | Type | Default | Description |
| --- | --- | --- | --- |
| `saveFileToDisk` | boolean | true | Implies if save file to disk button should be shown |
| `exportToBackend` | <pre> (exportedElements: readonly NonDeletedExcalidrawElement[],appState: AppState,canvas: HTMLCanvasElement &#124; null) => void </pre> | | This callback is triggered when the shareable-link button is clicked in the export dialog. The link button will only be shown if this callback is passed. |
| `renderCustomUI` | <pre> (exportedElements: readonly NonDeletedExcalidrawElement[],appState: AppState,canvas: HTMLCanvasElement &#124; null) => void </pre> | | This callback should be supplied if you want to render custom UI in the export dialog. |
#### `onPaste` #### `onPaste`
@@ -608,7 +585,7 @@ In case you want to prevent the excalidraw paste action you must return `true`,
### Does it support collaboration ? ### Does it support collaboration ?
No, Excalidraw package doesn't come with collaboration built in, since the implementation is specific to each host app. We expose APIs which you can use to communicate with Excalidraw which you can use to implement it. You can check our own implementation [here](https://github.com/excalidraw/excalidraw/blob/master/src/excalidraw-app/index.tsx). No Excalidraw package doesn't come with collaboration, since this would have different implementations on the consumer so we expose the API's which you can use to communicate with Excalidraw as mentioned above. If you are interested in understanding how Excalidraw does it you can check it [here](https://github.com/excalidraw/excalidraw/blob/master/src/excalidraw-app/index.tsx).
### importLibrary ### importLibrary
@@ -656,10 +633,6 @@ It is invoked with empty items when user clears the library. You can use this ca
The unique id of the excalidraw component. This can be used to identify the excalidraw component, for example importing the library items to the excalidraw component from where it was initiated when you have multiple excalidraw components rendered on the same page as shown in [multiple excalidraw demo](https://codesandbox.io/s/multiple-excalidraw-k1xx5). The unique id of the excalidraw component. This can be used to identify the excalidraw component, for example importing the library items to the excalidraw component from where it was initiated when you have multiple excalidraw components rendered on the same page as shown in [multiple excalidraw demo](https://codesandbox.io/s/multiple-excalidraw-k1xx5).
### autoFocus
This prop implies whether to focus the Excalidraw component on page load. Defaults to false.
### Extra API's ### Extra API's
#### `getSceneVersion` #### `getSceneVersion`
@@ -712,7 +685,7 @@ This function returns an object where each element is mapped to its id.
**_Signature_** **_Signature_**
<pre> <pre>
restoreAppState(appState: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L17">ImportedDataState["appState"]</a>, localAppState: Partial<<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState</a>> | null): <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState</a> restoreAppState(appState: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L17">ImportedDataState["appState"]</a>, localAppState: Partial<<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState</a>> | null): <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState</a>
</pre> </pre>
**_How to use_** **_How to use_**
@@ -721,16 +694,14 @@ restoreAppState(appState: <a href="https://github.com/excalidraw/excalidraw/blob
import { restoreAppState } from "@excalidraw/excalidraw"; import { restoreAppState } from "@excalidraw/excalidraw";
``` ```
This function will make sure all the keys have appropriate values in [appState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42) and if any key is missing, it will be set to default value. This function will make sure all the keys have appropriate values in [appState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42) and if any key is missing, it will be set to default value. If you pass `localAppState`, `localAppState` value will be preferred over the `appState` passed in params.
When `localAppState` is supplied, it's used in place of values that are missing (`undefined`) in `appState` instead of defaults. Use this as a way to not override user's defaults if you persist them. Required: supply `null`/`undefined` if not applicable.
#### `restoreElements` #### `restoreElements`
**_Signature_** **_Signature_**
<pre> <pre>
restoreElements(elements: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L16">ImportedDataState["elements"]</a>, localElements: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L16">ExcalidrawElement[]</a> | null | undefined): <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a> restoreElements(elements: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L16">ImportedDataState["elements"]</a>): <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a>
</pre> </pre>
**_How to use_** **_How to use_**
@@ -741,25 +712,21 @@ import { restoreElements } from "@excalidraw/excalidraw";
This function will make sure all properties of element is correctly set and if any attribute is missing, it will be set to default value. This function will make sure all properties of element is correctly set and if any attribute is missing, it will be set to default value.
When `localElements` are supplied, they are used to ensure that existing restored elements reuse `version` (and increment it), and regenerate `versionNonce`. Use this when you import elements which may already be present in the scene to ensure that you do not disregard the newly imported elements if you're using element version to detect the updates.
#### `restore` #### `restore`
**_Signature_** **_Signature_**
<pre> <pre>
restoreElements(data: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L12">ImportedDataState</a>, localAppState: Partial<<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState</a>> | null | undefined, localElements: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L16">ExcalidrawElement[]</a> | null | undefined): <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L4">DataState</a> restoreElements(data: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L12">ImportedDataState</a>): <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L4">DataState</a>
</pre> </pre>
See [`restoreAppState()`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#restoreAppState) about `localAppState`, and [`restoreElements()`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#restoreElements) about `localElements`.
**_How to use_** **_How to use_**
```js ```js
import { restore } from "@excalidraw/excalidraw"; import { restore } from "@excalidraw/excalidraw";
``` ```
This function makes sure elements and state is set to appropriate values and set to default value if not present. It is a combination of [restoreElements](#restoreElements) and [restoreAppState](#restoreAppState). This function makes sure elements and state is set to appropriate values and set to default value if not present. It is combination of [restoreElements](#restoreElements) and [restoreAppState](#restoreAppState)
#### `serializeAsJSON` #### `serializeAsJSON`
@@ -846,8 +813,9 @@ exportToSvg({
| elements | [Excalidraw Element []](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78) | | The elements to exported as svg | | elements | [Excalidraw Element []](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78) | | The elements to exported as svg |
| appState | [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42) | [defaultAppState](https://github.com/excalidraw/excalidraw/blob/master/src/appState.ts#L11) | The app state of the scene | | appState | [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42) | [defaultAppState](https://github.com/excalidraw/excalidraw/blob/master/src/appState.ts#L11) | The app state of the scene |
| exportPadding | number | 10 | The padding to be added on canvas | | exportPadding | number | 10 | The padding to be added on canvas |
| metadata | string | '' | The metadata to be embedded in svg |
This function returns a promise which resolves to svg of the exported drawing. This function returns a svg with the exported elements.
##### Additional attributes of appState for `export\*` APIs ##### Additional attributes of appState for `export\*` APIs
@@ -856,72 +824,3 @@ This function returns a promise which resolves to svg of the exported drawing.
| exportBackground | boolean | true | Indicates whether background should be exported | | exportBackground | boolean | true | Indicates whether background should be exported |
| viewBackgroundColor | string | #fff | The default background color | | viewBackgroundColor | string | #fff | The default background color |
| exportWithDarkMode | boolean | false | Indicates whether to export with dark mode | | exportWithDarkMode | boolean | false | Indicates whether to export with dark mode |
| exportEmbedScene | boolean | false | Indicates whether scene data should be embedded in svg. This will increase the svg size. |
### FONT_FAMILY
**How to use**
```js
import { FONT_FAMILY } from "@excalidraw/excalidraw";
```
`FONT_FAMILY` contains all the font families used in `Excalidraw` as explained below
| Font Family | Description |
| ----------- | -------------------- |
| Virgil | The handwritten font |
| Helvetica | The Normal Font |
| Cascadia | The Code Font |
Defaults to `FONT_FAMILY.Virgil` unless passed in `initialData.appState.currentItemFontFamily`.
### loadLibraryFromBlob
```js
import { loadLibraryFromBlob } from "@excalidraw/excalidraw";
```
**_Signature_**
<pre>
loadLibraryFromBlob(blob: <a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob">Blob</a>)
</pre>
This function loads the library from the blob.
### loadFromBlob
**How to use**
```js
import { loadFromBlob } from "@excalidraw/excalidraw";
```
**Signature**
<pre>
loadFromBlob(blob: <a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob">Blob</a>, localAppState: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState</a> | null)
</pre>
This function loads the scene data from the blob. If you pass `localAppState`, `localAppState` value will be preferred over the `appState` derived from `blob`
### getFreeDrawSvgPath
**How to use**
```js
import { getFreeDrawSvgPath } from "@excalidraw/excalidraw";
```
**Signature**
<pre>
getFreeDrawSvgPath(element: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L127">ExcalidrawFreeDrawElement</a>
</pre>
This function returns the free draw svg path for the element.
## Need help?
Check out the existing [Q&A](https://github.com/excalidraw/excalidraw/discussions?discussions_q=label%3Apackage%3Aexcalidraw). If you have any queries or need help, ask us [here](https://github.com/excalidraw/excalidraw/discussions?discussions_q=label%3Apackage%3Aexcalidraw).

View File

@@ -1,4 +1,4 @@
<!-- unstable-readme-start--> <!-- stable-readme-start-->
## Note ## Note
@@ -6,7 +6,7 @@
For stable release please use [@excalidraw/excalidraw](https://www.npmjs.com/package/@excalidraw/excalidraw). For stable release please use [@excalidraw/excalidraw](https://www.npmjs.com/package/@excalidraw/excalidraw).
<!-- unstable-readme-end--> <!-- stable-readme-end-->
### Excalidraw ### Excalidraw
@@ -359,7 +359,7 @@ To view the full example visit :point_down:
| --- | --- | --- | --- | | --- | --- | --- | --- |
| [`onChange`](#onChange) | Function | | This callback is triggered whenever the component updates due to any change. This callback will receive the excalidraw elements and the current app state. | | [`onChange`](#onChange) | Function | | This callback is triggered whenever the component updates due to any change. This callback will receive the excalidraw elements and the current app state. |
| [`initialData`](#initialData) | <pre>{elements?: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a>, appState?: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState<a> } </pre> | null | The initial data with which app loads. | | [`initialData`](#initialData) | <pre>{elements?: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a>, appState?: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState<a> } </pre> | null | The initial data with which app loads. |
| [`ref`](#ref) | [`createRef`](https://reactjs.org/docs/refs-and-the-dom.html#creating-refs) &#124; [`useRef`](https://reactjs.org/docs/hooks-reference.html#useref) &#124; [`callbackRef`](https://reactjs.org/docs/refs-and-the-dom.html#callback-refs) &#124; <pre>{ current: { readyPromise: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317">resolvablePromise</a> } }</pre> | | Ref to be passed to Excalidraw | | [`ref`](#ref) | [`createRef`](https://reactjs.org/docs/refs-and-the-dom.html#creating-refs) or [`callbackRef`](https://reactjs.org/docs/refs-and-the-dom.html#callback-refs) or <pre>{ current: { readyPromise: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317">resolvablePromise</a> } }</pre> | | Ref to be passed to Excalidraw |
| [`onCollabButtonClick`](#onCollabButtonClick) | Function | | Callback to be triggered when the collab button is clicked | | [`onCollabButtonClick`](#onCollabButtonClick) | Function | | Callback to be triggered when the collab button is clicked |
| [`isCollaborating`](#isCollaborating) | `boolean` | | This implies if the app is in collaboration mode | | [`isCollaborating`](#isCollaborating) | `boolean` | | This implies if the app is in collaboration mode |
| [`onPointerUpdate`](#onPointerUpdate) | Function | | Callback triggered when mouse pointer is updated. | | [`onPointerUpdate`](#onPointerUpdate) | Function | | Callback triggered when mouse pointer is updated. |
@@ -448,7 +448,7 @@ You can pass a `ref` when you want to access some excalidraw APIs. We expose the
| --- | --- | --- | | --- | --- | --- |
| ready | `boolean` | This is set to true once Excalidraw is rendered | | ready | `boolean` | This is set to true once Excalidraw is rendered |
| readyPromise | [resolvablePromise](https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317) | This promise will be resolved with the api once excalidraw has rendered. This will be helpful when you want do some action on the host app once this promise resolves. For this to work you will have to pass ref as shown [here](#readyPromise) | | readyPromise | [resolvablePromise](https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317) | This promise will be resolved with the api once excalidraw has rendered. This will be helpful when you want do some action on the host app once this promise resolves. For this to work you will have to pass ref as shown [here](#readyPromise) |
| [updateScene](#updateScene) | <pre>(<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L207">sceneData</a>)) => void </pre> | updates the scene with the sceneData | | updateScene | <pre>(<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L204">sceneData</a>)) => void </pre> | updates the scene with the sceneData |
| resetScene | `({ resetLoadingState: boolean }) => void` | Resets the scene. If `resetLoadingState` is passed as true then it will also force set the loading state to false. | | resetScene | `({ resetLoadingState: boolean }) => void` | Resets the scene. If `resetLoadingState` is passed as true then it will also force set the loading state to false. |
| getSceneElementsIncludingDeleted | <pre> () => <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a></pre> | Returns all the elements including the deleted in the scene | | getSceneElementsIncludingDeleted | <pre> () => <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a></pre> | Returns all the elements including the deleted in the scene |
| getSceneElements | <pre> () => <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a></pre> | Returns all the elements excluding the deleted in the scene | | getSceneElements | <pre> () => <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a></pre> | Returns all the elements excluding the deleted in the scene |
@@ -466,23 +466,6 @@ You can pass a `ref` when you want to access some excalidraw APIs. We expose the
const excalidrawRef = { current: { readyPromise: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317">resolvablePromise</a>}} const excalidrawRef = { current: { readyPromise: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317">resolvablePromise</a>}}
</pre> </pre>
Since plain object is passed as a `ref`, the `readyPromise` is resolved as soon as the component is mounted. Most of the time you will not need this unless you have a specific use case where you can't pass the `ref` in the react way and want to do some action on the host when this promise resolves. You can check the [example](https://codesandbox.io/s/eexcalidraw-resolvable-promise-d0qg3?file=/src/App.js) for the usage.
### `updateScene`
<pre>
(<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L207">sceneData</a>)) => void
</pre>
You can use this function to update the scene with the sceneData. It accepts the below attributes.
| Name | Type | Description |
| --- | --- | --- |
| `elements` | [`ImportedDataState["elements"]`](https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L17) | The `elements` to be updated in the scene |
| `appState` | [`ImportedDataState["appState"]`](https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L18) | The `appState` to be updated in the scene. |
| `collaborators` | <pre>Map<string, <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L29">Collaborator></a></pre> | The list of collaborators to be updated in the scene. |
| `commitToHistory` | `boolean` | Implies if the `history (undo/redo)` should be recorded. Defaults to `false`. |
#### `onCollabButtonClick` #### `onCollabButtonClick`
This callback is triggered when clicked on the collab button in excalidraw. If not supplied, the collab dialog button is not rendered. This callback is triggered when clicked on the collab button in excalidraw. If not supplied, the collab dialog button is not rendered.
@@ -614,7 +597,7 @@ In case you want to prevent the excalidraw paste action you must return `true`,
### Does it support collaboration ? ### Does it support collaboration ?
No, Excalidraw package doesn't come with collaboration built in, since the implementation is specific to each host app. We expose APIs which you can use to communicate with Excalidraw which you can use to implement it. You can check our own implementation [here](https://github.com/excalidraw/excalidraw/blob/master/src/excalidraw-app/index.tsx). No Excalidraw package doesn't come with collaboration, since this would have different implementations on the consumer so we expose the API's which you can use to communicate with Excalidraw as mentioned above. If you are interested in understanding how Excalidraw does it you can check it [here](https://github.com/excalidraw/excalidraw/blob/master/src/excalidraw-app/index.tsx).
### importLibrary ### importLibrary
@@ -718,7 +701,7 @@ This function returns an object where each element is mapped to its id.
**_Signature_** **_Signature_**
<pre> <pre>
restoreAppState(appState: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L17">ImportedDataState["appState"]</a>, localAppState: Partial<<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState</a>> | null): <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState</a> restoreAppState(appState: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L17">ImportedDataState["appState"]</a>, localAppState: Partial<<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState</a>> | null): <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState</a>
</pre> </pre>
**_How to use_** **_How to use_**
@@ -727,16 +710,14 @@ restoreAppState(appState: <a href="https://github.com/excalidraw/excalidraw/blob
import { restoreAppState } from "@excalidraw/excalidraw-next"; import { restoreAppState } from "@excalidraw/excalidraw-next";
``` ```
This function will make sure all the keys have appropriate values in [appState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42) and if any key is missing, it will be set to default value. This function will make sure all the keys have appropriate values in [appState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42) and if any key is missing, it will be set to default value. If you pass `localAppState`, `localAppState` value will be preferred over the `appState` passed in params.
When `localAppState` is supplied, it's used in place of values that are missing (`undefined`) in `appState` instead of defaults. Use this as a way to not override user's defaults if you persist them. Required: supply `null`/`undefined` if not applicable.
#### `restoreElements` #### `restoreElements`
**_Signature_** **_Signature_**
<pre> <pre>
restoreElements(elements: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L16">ImportedDataState["elements"]</a>, localElements: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L16">ExcalidrawElement[]</a> | null | undefined): <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a> restoreElements(elements: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L16">ImportedDataState["elements"]</a>): <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a>
</pre> </pre>
**_How to use_** **_How to use_**
@@ -747,25 +728,21 @@ import { restoreElements } from "@excalidraw/excalidraw-next";
This function will make sure all properties of element is correctly set and if any attribute is missing, it will be set to default value. This function will make sure all properties of element is correctly set and if any attribute is missing, it will be set to default value.
When `localElements` are supplied, they are used to ensure that existing restored elements reuse `version` (and increment it), and regenerate `versionNonce`. Use this when you import elements which may already be present in the scene to ensure that you do not disregard the newly imported elements if you're using element version to detect the updates.
#### `restore` #### `restore`
**_Signature_** **_Signature_**
<pre> <pre>
restoreElements(data: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L12">ImportedDataState</a>, localAppState: Partial<<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState</a>> | null | undefined, localElements: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L16">ExcalidrawElement[]</a> | null | undefined): <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L4">DataState</a> restoreElements(data: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L12">ImportedDataState</a>): <a href="https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L4">DataState</a>
</pre> </pre>
See [`restoreAppState()`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#restoreAppState) about `localAppState`, and [`restoreElements()`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#restoreElements) about `localElements`.
**_How to use_** **_How to use_**
```js ```js
import { restore } from "@excalidraw/excalidraw-next"; import { restore } from "@excalidraw/excalidraw-next";
``` ```
This function makes sure elements and state is set to appropriate values and set to default value if not present. It is a combination of [restoreElements](#restoreElements) and [restoreAppState](#restoreAppState). This function makes sure elements and state is set to appropriate values and set to default value if not present. It is combination of [restoreElements](#restoreElements) and [restoreAppState](#restoreAppState)
#### `serializeAsJSON` #### `serializeAsJSON`
@@ -852,8 +829,9 @@ exportToSvg({
| elements | [Excalidraw Element []](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78) | | The elements to exported as svg | | elements | [Excalidraw Element []](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78) | | The elements to exported as svg |
| appState | [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42) | [defaultAppState](https://github.com/excalidraw/excalidraw/blob/master/src/appState.ts#L11) | The app state of the scene | | appState | [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42) | [defaultAppState](https://github.com/excalidraw/excalidraw/blob/master/src/appState.ts#L11) | The app state of the scene |
| exportPadding | number | 10 | The padding to be added on canvas | | exportPadding | number | 10 | The padding to be added on canvas |
| metadata | string | '' | The metadata to be embedded in svg |
This function returns a promise which resolves to svg of the exported drawing. This function returns a svg with the exported elements.
##### Additional attributes of appState for `export\*` APIs ##### Additional attributes of appState for `export\*` APIs
@@ -862,14 +840,13 @@ This function returns a promise which resolves to svg of the exported drawing.
| exportBackground | boolean | true | Indicates whether background should be exported | | exportBackground | boolean | true | Indicates whether background should be exported |
| viewBackgroundColor | string | #fff | The default background color | | viewBackgroundColor | string | #fff | The default background color |
| exportWithDarkMode | boolean | false | Indicates whether to export with dark mode | | exportWithDarkMode | boolean | false | Indicates whether to export with dark mode |
| exportEmbedScene | boolean | false | Indicates whether scene data should be embedded in svg. This will increase the svg size. |
### FONT_FAMILY ### FONT_FAMILY
**How to use** **_Signature_**
```js ```js
import { FONT_FAMILY } from "@excalidraw/excalidraw-next"; import { FONT_FAMILY } from "./constants";
``` ```
`FONT_FAMILY` contains all the font families used in `Excalidraw` as explained below `FONT_FAMILY` contains all the font families used in `Excalidraw` as explained below
@@ -878,56 +855,6 @@ import { FONT_FAMILY } from "@excalidraw/excalidraw-next";
| ----------- | -------------------- | | ----------- | -------------------- |
| Virgil | The handwritten font | | Virgil | The handwritten font |
| Helvetica | The Normal Font | | Helvetica | The Normal Font |
| Cascadia | The Code Font | | Cacadia | The Code Font |
Defaults to `FONT_FAMILY.Virgil` unless passed in `initialData.appState.currentItemFontFamily`. Defaults to `FONT_FAMILY.Virgil` unless passed in `initialData.appState.currentItemFontFamily`.
### loadLibraryFromBlob
```js
import { loadLibraryFromBlob } from "@excalidraw/excalidraw-next";
```
**_Signature_**
<pre>
loadLibraryFromBlob(blob: <a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob">Blob</a>)
</pre>
This function loads the library from the blob.
### loadFromBlob
**How to use**
```js
import { loadFromBlob } from "@excalidraw/excalidraw-next";
```
**Signature**
<pre>
loadFromBlob(blob: <a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob">Blob</a>, localAppState: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L42">AppState</a> | null)
</pre>
This function loads the scene data from the blob. If you pass `localAppState`, `localAppState` value will be preferred over the `appState` derived from `blob`
### getFreeDrawSvgPath
**How to use**
```js
import { getFreeDrawSvgPath } from "@excalidraw/excalidraw-next";
```
**Signature**
<pre>
getFreeDrawSvgPath(element: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L127">ExcalidrawFreeDrawElement</a>
</pre>
This function returns the free draw svg path for the element.
## Need help?
Check out the existing [Q&A](https://github.com/excalidraw/excalidraw/discussions?discussions_q=label%3Apackage%3Aexcalidraw). If you have any queries or need help, ask us [here](https://github.com/excalidraw/excalidraw/discussions?discussions_q=label%3Apackage%3Aexcalidraw).

View File

@@ -178,9 +178,6 @@ export {
exportToCanvas, exportToCanvas,
exportToBlob, exportToBlob,
exportToSvg, exportToSvg,
serializeAsJSON,
loadLibraryFromBlob,
loadFromBlob,
getFreeDrawSvgPath,
} from "../../packages/utils"; } from "../../packages/utils";
export { serializeAsJSON } from "../../data/json";
export { FONT_FAMILY } from "../../constants"; export { FONT_FAMILY } from "../../constants";

View File

@@ -1,6 +1,6 @@
{ {
"name": "@excalidraw/excalidraw", "name": "@excalidraw/excalidraw",
"version": "0.9.0", "version": "0.8.0",
"main": "main.js", "main": "main.js",
"types": "types/packages/excalidraw/index.d.ts", "types": "types/packages/excalidraw/index.d.ts",
"files": [ "files": [
@@ -11,7 +11,11 @@
"access": "public" "access": "public"
}, },
"description": "Excalidraw as a React component", "description": "Excalidraw as a React component",
"repository": "https://github.com/excalidraw/excalidraw", "repository": {
"type": "git",
"url": "https://github.com/excalidraw/excalidraw.git",
"directory": "src/packages/excalidraw"
},
"license": "MIT", "license": "MIT",
"keywords": [ "keywords": [
"excalidraw", "excalidraw",
@@ -40,35 +44,36 @@
] ]
}, },
"peerDependencies": { "peerDependencies": {
"react": "^17.0.2", "react": "^17.0.1",
"react-dom": "^17.0.2" "react-dom": "^17.0.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.14.6", "@babel/core": "7.14.3",
"@babel/plugin-transform-arrow-functions": "7.14.5", "@babel/plugin-transform-arrow-functions": "7.13.0",
"@babel/plugin-transform-async-to-generator": "7.14.5", "@babel/plugin-transform-async-to-generator": "7.13.0",
"@babel/plugin-transform-runtime": "7.14.5", "@babel/plugin-transform-runtime": "7.13.15",
"@babel/plugin-transform-typescript": "7.14.6", "@babel/plugin-transform-typescript": "7.14.3",
"@babel/preset-env": "7.14.7", "@babel/preset-env": "7.14.2",
"@babel/preset-react": "7.14.5", "@babel/preset-react": "7.13.13",
"@babel/preset-typescript": "7.14.5", "@babel/preset-typescript": "7.13.0",
"autoprefixer": "10.2.6", "autoprefixer": "10.2.6",
"babel-loader": "8.2.2", "babel-loader": "8.2.2",
"babel-plugin-transform-class-properties": "6.24.1", "babel-plugin-transform-class-properties": "6.24.1",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"css-loader": "5.2.6", "css-loader": "5.2.6",
"file-loader": "6.2.0", "file-loader": "6.2.0",
"mini-css-extract-plugin": "1.6.1", "mini-css-extract-plugin": "1.6.0",
"postcss-loader": "6.1.0", "postcss-loader": "5.3.0",
"sass-loader": "12.1.0", "sass-loader": "11.1.1",
"terser-webpack-plugin": "5.1.4", "terser-webpack-plugin": "5.1.2",
"ts-loader": "9.2.3", "ts-loader": "9.2.3",
"typescript": "4.3.4", "typescript": "4.3.2",
"webpack": "5.40.0", "webpack": "5.38.1",
"webpack-bundle-analyzer": "4.4.2", "webpack-bundle-analyzer": "4.4.1",
"webpack-cli": "4.7.2" "webpack-cli": "4.7.0"
}, },
"bugs": "https://github.com/excalidraw/excalidraw/issues", "bugs": "https://github.com/excalidraw/excalidraw/issues",
"repository": "https://github.com/excalidraw/excalidraw",
"homepage": "https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw", "homepage": "https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw",
"scripts": { "scripts": {
"gen:types": "tsc --project ../../../tsconfig-types.json", "gen:types": "tsc --project ../../../tsconfig-types.json",

File diff suppressed because it is too large Load Diff

View File

@@ -25,7 +25,6 @@ export const exportToCanvas = ({
const { elements: restoredElements, appState: restoredAppState } = restore( const { elements: restoredElements, appState: restoredAppState } = restore(
{ elements, appState }, { elements, appState },
null, null,
null,
); );
const { exportBackground, viewBackgroundColor } = restoredAppState; const { exportBackground, viewBackgroundColor } = restoredAppState;
return _exportToCanvas( return _exportToCanvas(
@@ -75,24 +74,24 @@ export const exportToBlob = (
}); });
}; };
export const exportToSvg = async ({ export const exportToSvg = ({
elements, elements,
appState = getDefaultAppState(), appState = getDefaultAppState(),
exportPadding, exportPadding,
metadata,
}: Omit<ExportOpts, "getDimensions"> & { }: Omit<ExportOpts, "getDimensions"> & {
exportPadding?: number; exportPadding?: number;
}): Promise<SVGSVGElement> => { metadata?: string;
}): SVGSVGElement => {
const { elements: restoredElements, appState: restoredAppState } = restore( const { elements: restoredElements, appState: restoredAppState } = restore(
{ elements, appState }, { elements, appState },
null, null,
null,
); );
return _exportToSvg(getNonDeletedElements(restoredElements), { return _exportToSvg(getNonDeletedElements(restoredElements), {
...restoredAppState, ...restoredAppState,
exportPadding, exportPadding,
metadata,
}); });
}; };
export { serializeAsJSON } from "../data/json"; export { serializeAsJSON } from "../data/json";
export { loadFromBlob, loadLibraryFromBlob } from "../data/blob";
export { getFreeDrawSvgPath } from "../renderer/renderElement";

View File

@@ -34,23 +34,23 @@
] ]
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.14.6", "@babel/core": "7.14.3",
"@babel/plugin-transform-arrow-functions": "7.14.5", "@babel/plugin-transform-arrow-functions": "7.13.0",
"@babel/plugin-transform-async-to-generator": "7.14.5", "@babel/plugin-transform-async-to-generator": "7.14.5",
"@babel/plugin-transform-runtime": "^7.14.5", "@babel/plugin-transform-runtime": "^7.12.10",
"@babel/plugin-transform-typescript": "7.14.6", "@babel/plugin-transform-typescript": "7.14.5",
"@babel/preset-env": "7.14.7", "@babel/preset-env": "7.14.5",
"@babel/preset-typescript": "7.14.5", "@babel/preset-typescript": "7.13.0",
"babel-loader": "8.2.2", "babel-loader": "8.2.2",
"babel-plugin-transform-class-properties": "6.24.1", "babel-plugin-transform-class-properties": "6.24.1",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"css-loader": "5.2.6", "css-loader": "5.2.6",
"file-loader": "6.2.0", "file-loader": "6.2.0",
"sass-loader": "12.1.0", "sass-loader": "11.1.1",
"ts-loader": "9.2.3", "ts-loader": "9.2.3",
"webpack": "5.40.0", "webpack": "5.38.1",
"webpack-bundle-analyzer": "4.4.2", "webpack-bundle-analyzer": "4.4.2",
"webpack-cli": "4.7.2" "webpack-cli": "4.7.0"
}, },
"bugs": "https://github.com/excalidraw/excalidraw/issues", "bugs": "https://github.com/excalidraw/excalidraw/issues",
"repository": "https://github.com/excalidraw/excalidraw", "repository": "https://github.com/excalidraw/excalidraw",

View File

@@ -21,25 +21,20 @@
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.5.tgz#8ef4c18e58e801c5c95d3c1c0f2874a2680fadea" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.5.tgz#8ef4c18e58e801c5c95d3c1c0f2874a2680fadea"
integrity sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w== integrity sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w==
"@babel/compat-data@^7.14.7": "@babel/core@7.14.3":
version "7.14.7" version "7.14.3"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38"
integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==
"@babel/core@7.14.6":
version "7.14.6"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab"
integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==
dependencies: dependencies:
"@babel/code-frame" "^7.14.5" "@babel/code-frame" "^7.12.13"
"@babel/generator" "^7.14.5" "@babel/generator" "^7.14.3"
"@babel/helper-compilation-targets" "^7.14.5" "@babel/helper-compilation-targets" "^7.13.16"
"@babel/helper-module-transforms" "^7.14.5" "@babel/helper-module-transforms" "^7.14.2"
"@babel/helpers" "^7.14.6" "@babel/helpers" "^7.14.0"
"@babel/parser" "^7.14.6" "@babel/parser" "^7.14.3"
"@babel/template" "^7.14.5" "@babel/template" "^7.12.13"
"@babel/traverse" "^7.14.5" "@babel/traverse" "^7.14.2"
"@babel/types" "^7.14.5" "@babel/types" "^7.14.2"
convert-source-map "^1.7.0" convert-source-map "^1.7.0"
debug "^4.1.0" debug "^4.1.0"
gensync "^1.0.0-beta.2" gensync "^1.0.0-beta.2"
@@ -47,7 +42,7 @@
semver "^6.3.0" semver "^6.3.0"
source-map "^0.5.0" source-map "^0.5.0"
"@babel/generator@^7.14.2": "@babel/generator@^7.14.2", "@babel/generator@^7.14.3":
version "7.14.3" version "7.14.3"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91"
integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==
@@ -80,7 +75,7 @@
"@babel/helper-explode-assignable-expression" "^7.14.5" "@babel/helper-explode-assignable-expression" "^7.14.5"
"@babel/types" "^7.14.5" "@babel/types" "^7.14.5"
"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5": "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.14.5":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf"
integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==
@@ -102,18 +97,6 @@
"@babel/helper-replace-supers" "^7.14.5" "@babel/helper-replace-supers" "^7.14.5"
"@babel/helper-split-export-declaration" "^7.14.5" "@babel/helper-split-export-declaration" "^7.14.5"
"@babel/helper-create-class-features-plugin@^7.14.6":
version "7.14.6"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542"
integrity sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==
dependencies:
"@babel/helper-annotate-as-pure" "^7.14.5"
"@babel/helper-function-name" "^7.14.5"
"@babel/helper-member-expression-to-functions" "^7.14.5"
"@babel/helper-optimise-call-expression" "^7.14.5"
"@babel/helper-replace-supers" "^7.14.5"
"@babel/helper-split-export-declaration" "^7.14.5"
"@babel/helper-create-regexp-features-plugin@^7.14.5": "@babel/helper-create-regexp-features-plugin@^7.14.5":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4"
@@ -182,6 +165,13 @@
dependencies: dependencies:
"@babel/types" "^7.14.5" "@babel/types" "^7.14.5"
"@babel/helper-member-expression-to-functions@^7.13.12":
version "7.13.12"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72"
integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==
dependencies:
"@babel/types" "^7.13.12"
"@babel/helper-member-expression-to-functions@^7.14.5": "@babel/helper-member-expression-to-functions@^7.14.5":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz#d5c70e4ad13b402c95156c7a53568f504e2fb7b8" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz#d5c70e4ad13b402c95156c7a53568f504e2fb7b8"
@@ -189,13 +179,27 @@
dependencies: dependencies:
"@babel/types" "^7.14.5" "@babel/types" "^7.14.5"
"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12", "@babel/helper-module-imports@^7.14.5":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3"
integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==
dependencies: dependencies:
"@babel/types" "^7.14.5" "@babel/types" "^7.14.5"
"@babel/helper-module-transforms@^7.14.2":
version "7.14.2"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5"
integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==
dependencies:
"@babel/helper-module-imports" "^7.13.12"
"@babel/helper-replace-supers" "^7.13.12"
"@babel/helper-simple-access" "^7.13.12"
"@babel/helper-split-export-declaration" "^7.12.13"
"@babel/helper-validator-identifier" "^7.14.0"
"@babel/template" "^7.12.13"
"@babel/traverse" "^7.14.2"
"@babel/types" "^7.14.2"
"@babel/helper-module-transforms@^7.14.5": "@babel/helper-module-transforms@^7.14.5":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e"
@@ -210,6 +214,13 @@
"@babel/traverse" "^7.14.5" "@babel/traverse" "^7.14.5"
"@babel/types" "^7.14.5" "@babel/types" "^7.14.5"
"@babel/helper-optimise-call-expression@^7.12.13":
version "7.12.13"
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==
dependencies:
"@babel/types" "^7.12.13"
"@babel/helper-optimise-call-expression@^7.14.5": "@babel/helper-optimise-call-expression@^7.14.5":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c"
@@ -231,6 +242,16 @@
"@babel/helper-wrap-function" "^7.14.5" "@babel/helper-wrap-function" "^7.14.5"
"@babel/types" "^7.14.5" "@babel/types" "^7.14.5"
"@babel/helper-replace-supers@^7.13.12":
version "7.13.12"
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804"
integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==
dependencies:
"@babel/helper-member-expression-to-functions" "^7.13.12"
"@babel/helper-optimise-call-expression" "^7.12.13"
"@babel/traverse" "^7.13.0"
"@babel/types" "^7.13.12"
"@babel/helper-replace-supers@^7.14.5": "@babel/helper-replace-supers@^7.14.5":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94"
@@ -241,6 +262,13 @@
"@babel/traverse" "^7.14.5" "@babel/traverse" "^7.14.5"
"@babel/types" "^7.14.5" "@babel/types" "^7.14.5"
"@babel/helper-simple-access@^7.13.12":
version "7.13.12"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6"
integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==
dependencies:
"@babel/types" "^7.13.12"
"@babel/helper-simple-access@^7.14.5": "@babel/helper-simple-access@^7.14.5":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4"
@@ -274,12 +302,17 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
"@babel/helper-validator-identifier@^7.14.0":
version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288"
integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==
"@babel/helper-validator-identifier@^7.14.5": "@babel/helper-validator-identifier@^7.14.5":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8"
integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==
"@babel/helper-validator-option@^7.14.5": "@babel/helper-validator-option@^7.12.17", "@babel/helper-validator-option@^7.14.5":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3"
integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==
@@ -294,14 +327,14 @@
"@babel/traverse" "^7.14.5" "@babel/traverse" "^7.14.5"
"@babel/types" "^7.14.5" "@babel/types" "^7.14.5"
"@babel/helpers@^7.14.6": "@babel/helpers@^7.14.0":
version "7.14.6" version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.6.tgz#5b58306b95f1b47e2a0199434fa8658fa6c21635" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62"
integrity sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA== integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==
dependencies: dependencies:
"@babel/template" "^7.14.5" "@babel/template" "^7.12.13"
"@babel/traverse" "^7.14.5" "@babel/traverse" "^7.14.0"
"@babel/types" "^7.14.5" "@babel/types" "^7.14.0"
"@babel/highlight@^7.12.13": "@babel/highlight@^7.12.13":
version "7.12.13" version "7.12.13"
@@ -321,7 +354,7 @@
chalk "^2.0.0" chalk "^2.0.0"
js-tokens "^4.0.0" js-tokens "^4.0.0"
"@babel/parser@^7.12.13", "@babel/parser@^7.14.2": "@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3":
version "7.14.3" version "7.14.3"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298"
integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ==
@@ -331,11 +364,6 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.5.tgz#4cd2f346261061b2518873ffecdf1612cb032829" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.5.tgz#4cd2f346261061b2518873ffecdf1612cb032829"
integrity sha512-TM8C+xtH/9n1qzX+JNHi7AN2zHMTiPUtspO0ZdHflW8KaskkALhMmuMHb4bCmNdv9VAPzJX3/bXqkVLnAvsPfg== integrity sha512-TM8C+xtH/9n1qzX+JNHi7AN2zHMTiPUtspO0ZdHflW8KaskkALhMmuMHb4bCmNdv9VAPzJX3/bXqkVLnAvsPfg==
"@babel/parser@^7.14.6":
version "7.14.7"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595"
integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e"
@@ -345,10 +373,10 @@
"@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
"@babel/plugin-proposal-optional-chaining" "^7.14.5" "@babel/plugin-proposal-optional-chaining" "^7.14.5"
"@babel/plugin-proposal-async-generator-functions@^7.14.7": "@babel/plugin-proposal-async-generator-functions@^7.14.5":
version "7.14.7" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.5.tgz#4024990e3dd74181f4f426ea657769ff49a2df39"
integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q== integrity sha512-tbD/CG3l43FIXxmu4a7RBe4zH7MLJ+S/lFowPFO7HetS2hyOZ/0nnnznegDuzFzfkyQYTxqdTH/hKmuBngaDAA==
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
"@babel/helper-remap-async-to-generator" "^7.14.5" "@babel/helper-remap-async-to-generator" "^7.14.5"
@@ -419,12 +447,12 @@
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-numeric-separator" "^7.10.4"
"@babel/plugin-proposal-object-rest-spread@^7.14.7": "@babel/plugin-proposal-object-rest-spread@^7.14.5":
version "7.14.7" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.5.tgz#e581d5ccdfa187ea6ed73f56c6a21c1580b90fbf"
integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g== integrity sha512-VzMyY6PWNPPT3pxc5hi9LloKNr4SSrVCg7Yr6aZpW4Ym07r7KqSU/QXYwjXLVxqwSv0t/XSXkFoKBPUkZ8vb2A==
dependencies: dependencies:
"@babel/compat-data" "^7.14.7" "@babel/compat-data" "^7.14.5"
"@babel/helper-compilation-targets" "^7.14.5" "@babel/helper-compilation-targets" "^7.14.5"
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
@@ -578,7 +606,14 @@
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-arrow-functions@7.14.5", "@babel/plugin-transform-arrow-functions@^7.14.5": "@babel/plugin-transform-arrow-functions@7.13.0":
version "7.13.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae"
integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==
dependencies:
"@babel/helper-plugin-utils" "^7.13.0"
"@babel/plugin-transform-arrow-functions@^7.14.5":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a"
integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==
@@ -628,10 +663,10 @@
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-destructuring@^7.14.7": "@babel/plugin-transform-destructuring@^7.14.5":
version "7.14.7" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.5.tgz#d32ad19ff1a6da1e861dc62720d80d9776e3bf35"
integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== integrity sha512-wU9tYisEbRMxqDezKUqC9GleLycCRoUsai9ddlsq54r8QRLaeEhc+d+9DqCG+kV9W2GgQjTZESPTpn5bAFMDww==
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
@@ -725,10 +760,10 @@
"@babel/helper-module-transforms" "^7.14.5" "@babel/helper-module-transforms" "^7.14.5"
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-named-capturing-groups-regex@^7.14.7": "@babel/plugin-transform-named-capturing-groups-regex@^7.14.5":
version "7.14.7" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz#60c06892acf9df231e256c24464bfecb0908fd4e" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.5.tgz#d537e8ee083ee6f6aa4f4eef9d2081d555746e4c"
integrity sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg== integrity sha512-+Xe5+6MWFo311U8SchgeX5c1+lJM+eZDBZgD+tvXu9VVQPXwwVzeManMMjYX6xw2HczngfOSZjoFYKwdeB/Jvw==
dependencies: dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-create-regexp-features-plugin" "^7.14.5"
@@ -775,16 +810,16 @@
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-runtime@^7.14.5": "@babel/plugin-transform-runtime@^7.12.10":
version "7.14.5" version "7.14.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz#30491dad49c6059f8f8fa5ee8896a0089e987523" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.3.tgz#1fd885a2d0de1d3c223795a4e9be72c2db4515cf"
integrity sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg== integrity sha512-t960xbi8wpTFE623ef7sd+UpEC5T6EEguQlTBJDEO05+XwnIWVfuqLw/vdLWY6IdFmtZE+65CZAfByT39zRpkg==
dependencies: dependencies:
"@babel/helper-module-imports" "^7.14.5" "@babel/helper-module-imports" "^7.13.12"
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.13.0"
babel-plugin-polyfill-corejs2 "^0.2.2" babel-plugin-polyfill-corejs2 "^0.2.0"
babel-plugin-polyfill-corejs3 "^0.2.2" babel-plugin-polyfill-corejs3 "^0.2.0"
babel-plugin-polyfill-regenerator "^0.2.2" babel-plugin-polyfill-regenerator "^0.2.0"
semver "^6.3.0" semver "^6.3.0"
"@babel/plugin-transform-shorthand-properties@^7.14.5": "@babel/plugin-transform-shorthand-properties@^7.14.5":
@@ -794,10 +829,10 @@
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-spread@^7.14.6": "@babel/plugin-transform-spread@^7.14.5":
version "7.14.6" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.5.tgz#bd269fb4119754d2ce7f4cc39a96b4f71baae356"
integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== integrity sha512-/3iqoQdiWergnShZYl0xACb4ADeYCJ7X/RgmwtXshn6cIvautRPAFzhd58frQlokLO6Jb4/3JXvmm6WNTPtiTw==
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
"@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
@@ -823,12 +858,12 @@
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-typescript@7.14.6", "@babel/plugin-transform-typescript@^7.14.5": "@babel/plugin-transform-typescript@7.14.5", "@babel/plugin-transform-typescript@^7.13.0":
version "7.14.6" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz#6e9c2d98da2507ebe0a883b100cde3c7279df36c" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.5.tgz#5b41b59072f765bd1ec1d0b694e08c7df0f6f8a0"
integrity sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA== integrity sha512-cFD5PKp4b8/KkwQ7h71FdPXFvz1RgwTFF9akRZwFldb9G0AHf7CgoPx96c4Q/ZVjh6V81tqQwW5YiHws16OzPg==
dependencies: dependencies:
"@babel/helper-create-class-features-plugin" "^7.14.6" "@babel/helper-create-class-features-plugin" "^7.14.5"
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-typescript" "^7.14.5" "@babel/plugin-syntax-typescript" "^7.14.5"
@@ -847,17 +882,17 @@
"@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-create-regexp-features-plugin" "^7.14.5"
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
"@babel/preset-env@7.14.7": "@babel/preset-env@7.14.5":
version "7.14.7" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.7.tgz#5c70b22d4c2d893b03d8c886a5c17422502b932a" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.5.tgz#c0c84e763661fd0e74292c3d511cb33b0c668997"
integrity sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA== integrity sha512-ci6TsS0bjrdPpWGnQ+m4f+JSSzDKlckqKIJJt9UZ/+g7Zz9k0N8lYU8IeLg/01o2h8LyNZDMLGgRLDTxpudLsA==
dependencies: dependencies:
"@babel/compat-data" "^7.14.7" "@babel/compat-data" "^7.14.5"
"@babel/helper-compilation-targets" "^7.14.5" "@babel/helper-compilation-targets" "^7.14.5"
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5"
"@babel/helper-validator-option" "^7.14.5" "@babel/helper-validator-option" "^7.14.5"
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5"
"@babel/plugin-proposal-async-generator-functions" "^7.14.7" "@babel/plugin-proposal-async-generator-functions" "^7.14.5"
"@babel/plugin-proposal-class-properties" "^7.14.5" "@babel/plugin-proposal-class-properties" "^7.14.5"
"@babel/plugin-proposal-class-static-block" "^7.14.5" "@babel/plugin-proposal-class-static-block" "^7.14.5"
"@babel/plugin-proposal-dynamic-import" "^7.14.5" "@babel/plugin-proposal-dynamic-import" "^7.14.5"
@@ -866,7 +901,7 @@
"@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5"
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5"
"@babel/plugin-proposal-numeric-separator" "^7.14.5" "@babel/plugin-proposal-numeric-separator" "^7.14.5"
"@babel/plugin-proposal-object-rest-spread" "^7.14.7" "@babel/plugin-proposal-object-rest-spread" "^7.14.5"
"@babel/plugin-proposal-optional-catch-binding" "^7.14.5" "@babel/plugin-proposal-optional-catch-binding" "^7.14.5"
"@babel/plugin-proposal-optional-chaining" "^7.14.5" "@babel/plugin-proposal-optional-chaining" "^7.14.5"
"@babel/plugin-proposal-private-methods" "^7.14.5" "@babel/plugin-proposal-private-methods" "^7.14.5"
@@ -892,7 +927,7 @@
"@babel/plugin-transform-block-scoping" "^7.14.5" "@babel/plugin-transform-block-scoping" "^7.14.5"
"@babel/plugin-transform-classes" "^7.14.5" "@babel/plugin-transform-classes" "^7.14.5"
"@babel/plugin-transform-computed-properties" "^7.14.5" "@babel/plugin-transform-computed-properties" "^7.14.5"
"@babel/plugin-transform-destructuring" "^7.14.7" "@babel/plugin-transform-destructuring" "^7.14.5"
"@babel/plugin-transform-dotall-regex" "^7.14.5" "@babel/plugin-transform-dotall-regex" "^7.14.5"
"@babel/plugin-transform-duplicate-keys" "^7.14.5" "@babel/plugin-transform-duplicate-keys" "^7.14.5"
"@babel/plugin-transform-exponentiation-operator" "^7.14.5" "@babel/plugin-transform-exponentiation-operator" "^7.14.5"
@@ -904,7 +939,7 @@
"@babel/plugin-transform-modules-commonjs" "^7.14.5" "@babel/plugin-transform-modules-commonjs" "^7.14.5"
"@babel/plugin-transform-modules-systemjs" "^7.14.5" "@babel/plugin-transform-modules-systemjs" "^7.14.5"
"@babel/plugin-transform-modules-umd" "^7.14.5" "@babel/plugin-transform-modules-umd" "^7.14.5"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.14.7" "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.5"
"@babel/plugin-transform-new-target" "^7.14.5" "@babel/plugin-transform-new-target" "^7.14.5"
"@babel/plugin-transform-object-super" "^7.14.5" "@babel/plugin-transform-object-super" "^7.14.5"
"@babel/plugin-transform-parameters" "^7.14.5" "@babel/plugin-transform-parameters" "^7.14.5"
@@ -912,7 +947,7 @@
"@babel/plugin-transform-regenerator" "^7.14.5" "@babel/plugin-transform-regenerator" "^7.14.5"
"@babel/plugin-transform-reserved-words" "^7.14.5" "@babel/plugin-transform-reserved-words" "^7.14.5"
"@babel/plugin-transform-shorthand-properties" "^7.14.5" "@babel/plugin-transform-shorthand-properties" "^7.14.5"
"@babel/plugin-transform-spread" "^7.14.6" "@babel/plugin-transform-spread" "^7.14.5"
"@babel/plugin-transform-sticky-regex" "^7.14.5" "@babel/plugin-transform-sticky-regex" "^7.14.5"
"@babel/plugin-transform-template-literals" "^7.14.5" "@babel/plugin-transform-template-literals" "^7.14.5"
"@babel/plugin-transform-typeof-symbol" "^7.14.5" "@babel/plugin-transform-typeof-symbol" "^7.14.5"
@@ -923,7 +958,7 @@
babel-plugin-polyfill-corejs2 "^0.2.2" babel-plugin-polyfill-corejs2 "^0.2.2"
babel-plugin-polyfill-corejs3 "^0.2.2" babel-plugin-polyfill-corejs3 "^0.2.2"
babel-plugin-polyfill-regenerator "^0.2.2" babel-plugin-polyfill-regenerator "^0.2.2"
core-js-compat "^3.15.0" core-js-compat "^3.14.0"
semver "^6.3.0" semver "^6.3.0"
"@babel/preset-modules@^0.1.4": "@babel/preset-modules@^0.1.4":
@@ -937,14 +972,14 @@
"@babel/types" "^7.4.4" "@babel/types" "^7.4.4"
esutils "^2.0.2" esutils "^2.0.2"
"@babel/preset-typescript@7.14.5": "@babel/preset-typescript@7.13.0":
version "7.14.5" version "7.13.0"
resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz#aa98de119cf9852b79511f19e7f44a2d379bcce0" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz#ab107e5f050609d806fbb039bec553b33462c60a"
integrity sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw== integrity sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw==
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.13.0"
"@babel/helper-validator-option" "^7.14.5" "@babel/helper-validator-option" "^7.12.17"
"@babel/plugin-transform-typescript" "^7.14.5" "@babel/plugin-transform-typescript" "^7.13.0"
"@babel/runtime@^7.8.4": "@babel/runtime@^7.8.4":
version "7.12.13" version "7.12.13"
@@ -971,7 +1006,7 @@
"@babel/parser" "^7.14.5" "@babel/parser" "^7.14.5"
"@babel/types" "^7.14.5" "@babel/types" "^7.14.5"
"@babel/traverse@^7.13.0": "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2":
version "7.14.2" version "7.14.2"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b"
integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==
@@ -1000,7 +1035,7 @@
debug "^4.1.0" debug "^4.1.0"
globals "^11.1.0" globals "^11.1.0"
"@babel/types@^7.12.13", "@babel/types@^7.14.2", "@babel/types@^7.14.5", "@babel/types@^7.4.4": "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.14.5", "@babel/types@^7.4.4":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff"
integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==
@@ -1170,22 +1205,22 @@
"@webassemblyjs/ast" "1.11.0" "@webassemblyjs/ast" "1.11.0"
"@xtuc/long" "4.2.2" "@xtuc/long" "4.2.2"
"@webpack-cli/configtest@^1.0.4": "@webpack-cli/configtest@^1.0.3":
version "1.0.4" version "1.0.3"
resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.4.tgz#f03ce6311c0883a83d04569e2c03c6238316d2aa" resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.3.tgz#204bcff87cda3ea4810881f7ea96e5f5321b87b9"
integrity sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ== integrity sha512-WQs0ep98FXX2XBAfQpRbY0Ma6ADw8JR6xoIkaIiJIzClGOMqVRvPCWqndTxf28DgFopWan0EKtHtg/5W1h0Zkw==
"@webpack-cli/info@^1.3.0": "@webpack-cli/info@^1.2.4":
version "1.3.0" version "1.2.4"
resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.3.0.tgz#9d78a31101a960997a4acd41ffd9b9300627fe2b" resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.2.4.tgz#7381fd41c9577b2d8f6c2594fad397ef49ad5573"
integrity sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w== integrity sha512-ogE2T4+pLhTTPS/8MM3IjHn0IYplKM4HbVNMCWA9N4NrdPzunwenpCsqKEXyejMfRu6K8mhauIPYf8ZxWG5O6g==
dependencies: dependencies:
envinfo "^7.7.3" envinfo "^7.7.3"
"@webpack-cli/serve@^1.5.1": "@webpack-cli/serve@^1.4.0":
version "1.5.1" version "1.4.0"
resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.5.1.tgz#b5fde2f0f79c1e120307c415a4c1d5eb15a6f278" resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.4.0.tgz#f84fd07bcacefe56ce762925798871092f0f228e"
integrity sha512-4vSVUiOPJLmr45S8rMGy7WDvpWxfFxfP/Qx/cxZFCfvoypTYpPPL1X8VIZMe0WTA+Jr7blUxwUSEZNkjoMTgSw== integrity sha512-xgT/HqJ+uLWGX+Mzufusl3cgjAcnqYYskaB7o0vRcwOEfuu6hMzSILQpnIzFMGsTaeaX4Nnekl+6fadLbl1/Vg==
"@xtuc/ieee754@^1.2.0": "@xtuc/ieee754@^1.2.0":
version "1.2.0" version "1.2.0"
@@ -1298,7 +1333,7 @@ babel-plugin-dynamic-import-node@^2.3.3:
dependencies: dependencies:
object.assign "^4.1.0" object.assign "^4.1.0"
babel-plugin-polyfill-corejs2@^0.2.2: babel-plugin-polyfill-corejs2@^0.2.0, babel-plugin-polyfill-corejs2@^0.2.2:
version "0.2.2" version "0.2.2"
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327"
integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==
@@ -1307,7 +1342,7 @@ babel-plugin-polyfill-corejs2@^0.2.2:
"@babel/helper-define-polyfill-provider" "^0.2.2" "@babel/helper-define-polyfill-provider" "^0.2.2"
semver "^6.1.1" semver "^6.1.1"
babel-plugin-polyfill-corejs3@^0.2.2: babel-plugin-polyfill-corejs3@^0.2.0, babel-plugin-polyfill-corejs3@^0.2.2:
version "0.2.2" version "0.2.2"
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz#7424a1682ee44baec817327710b1b094e5f8f7f5" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz#7424a1682ee44baec817327710b1b094e5f8f7f5"
integrity sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A== integrity sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A==
@@ -1315,7 +1350,7 @@ babel-plugin-polyfill-corejs3@^0.2.2:
"@babel/helper-define-polyfill-provider" "^0.2.2" "@babel/helper-define-polyfill-provider" "^0.2.2"
core-js-compat "^3.9.1" core-js-compat "^3.9.1"
babel-plugin-polyfill-regenerator@^0.2.2: babel-plugin-polyfill-regenerator@^0.2.0, babel-plugin-polyfill-regenerator@^0.2.2:
version "0.2.2" version "0.2.2"
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077"
integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==
@@ -1527,15 +1562,7 @@ convert-source-map@^1.7.0:
dependencies: dependencies:
safe-buffer "~5.1.1" safe-buffer "~5.1.1"
core-js-compat@^3.15.0: core-js-compat@^3.14.0, core-js-compat@^3.9.1:
version "3.15.1"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.1.tgz#1afe233716d37ee021956ef097594071b2b585a7"
integrity sha512-xGhzYMX6y7oEGQGAJmP2TmtBLvR4nZmRGEcFa3ubHOq5YEp51gGN9AovVa0AoujGZIq+Wm6dISiYyGNfdflYww==
dependencies:
browserslist "^4.16.6"
semver "7.0.0"
core-js-compat@^3.9.1:
version "3.14.0" version "3.14.0"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.14.0.tgz#b574dabf29184681d5b16357bd33d104df3d29a5" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.14.0.tgz#b574dabf29184681d5b16357bd33d104df3d29a5"
integrity sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A== integrity sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A==
@@ -1634,10 +1661,10 @@ envinfo@^7.7.3:
resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.4.tgz#c6311cdd38a0e86808c1c9343f667e4267c4a320" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.4.tgz#c6311cdd38a0e86808c1c9343f667e4267c4a320"
integrity sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ== integrity sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==
es-module-lexer@^0.6.0: es-module-lexer@^0.4.0:
version "0.6.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.6.0.tgz#e72ab05b7412e62b9be37c37a09bdb6000d706f0" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.4.0.tgz#21f4181cc8b7eee06855f1c59e6087c7bc4f77b0"
integrity sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA== integrity sha512-iuEGihqqhKWFgh72Q/Jtch7V2t/ft8w8IPP2aEN8ArYKO+IWyo6hsi96hCdgyeEDQIV3InhYQ9BlwUFPGXrbEQ==
escalade@^3.1.1: escalade@^3.1.1:
version "3.1.1" version "3.1.1"
@@ -1895,14 +1922,14 @@ isobject@^3.0.1:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
jest-worker@^27.0.2: jest-worker@^26.6.2:
version "27.0.2" version "26.6.2"
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.2.tgz#4ebeb56cef48b3e7514552f80d0d80c0129f0b05" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
integrity sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg== integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
merge-stream "^2.0.0" merge-stream "^2.0.0"
supports-color "^8.0.0" supports-color "^7.0.0"
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0" version "4.0.0"
@@ -2325,10 +2352,10 @@ safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
sass-loader@12.1.0: sass-loader@11.1.1:
version "12.1.0" version "11.1.1"
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.1.0.tgz#b73324622231009da6fba61ab76013256380d201" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-11.1.1.tgz#0db441bbbe197b2af96125bebb7f4be6476b13a7"
integrity sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg== integrity sha512-fOCp/zLmj1V1WHDZbUbPgrZhA7HKXHEqkslzB+05U5K9SbSbcmH91C7QLW31AsXikxUMaxXRhhcqWZAxUMLDyA==
dependencies: dependencies:
klona "^2.0.4" klona "^2.0.4"
neo-async "^2.6.2" neo-async "^2.6.2"
@@ -2465,41 +2492,34 @@ supports-color@^5.3.0:
dependencies: dependencies:
has-flag "^3.0.0" has-flag "^3.0.0"
supports-color@^7.1.0: supports-color@^7.0.0, supports-color@^7.1.0:
version "7.2.0" version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
dependencies: dependencies:
has-flag "^4.0.0" has-flag "^4.0.0"
supports-color@^8.0.0:
version "8.1.1"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
dependencies:
has-flag "^4.0.0"
tapable@^2.1.1, tapable@^2.2.0: tapable@^2.1.1, tapable@^2.2.0:
version "2.2.0" version "2.2.0"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b"
integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==
terser-webpack-plugin@^5.1.3: terser-webpack-plugin@^5.1.1:
version "5.1.3" version "5.1.1"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.3.tgz#30033e955ca28b55664f1e4b30a1347e61aa23af" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz#7effadee06f7ecfa093dbbd3e9ab23f5f3ed8673"
integrity sha512-cxGbMqr6+A2hrIB5ehFIF+F/iST5ZOxvOmy9zih9ySbP1C2oEWQSOUS+2SNBTjzx5xLKO4xnod9eywdfq1Nb9A== integrity sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==
dependencies: dependencies:
jest-worker "^27.0.2" jest-worker "^26.6.2"
p-limit "^3.1.0" p-limit "^3.1.0"
schema-utils "^3.0.0" schema-utils "^3.0.0"
serialize-javascript "^5.0.1" serialize-javascript "^5.0.1"
source-map "^0.6.1" source-map "^0.6.1"
terser "^5.7.0" terser "^5.5.1"
terser@^5.7.0: terser@^5.5.1:
version "5.7.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" resolved "https://registry.yarnpkg.com/terser/-/terser-5.6.0.tgz#138cdf21c5e3100b1b3ddfddf720962f88badcd2"
integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== integrity sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==
dependencies: dependencies:
commander "^2.20.0" commander "^2.20.0"
source-map "~0.7.2" source-map "~0.7.2"
@@ -2610,15 +2630,15 @@ webpack-bundle-analyzer@4.4.2:
sirv "^1.0.7" sirv "^1.0.7"
ws "^7.3.1" ws "^7.3.1"
webpack-cli@4.7.2: webpack-cli@4.7.0:
version "4.7.2" version "4.7.0"
resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.7.2.tgz#a718db600de6d3906a4357e059ae584a89f4c1a5" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.7.0.tgz#3195a777f1f802ecda732f6c95d24c0004bc5a35"
integrity sha512-mEoLmnmOIZQNiRl0ebnjzQ74Hk0iKS5SiEEnpq3dRezoyR3yPaeQZCMCe+db4524pj1Pd5ghZXjT41KLzIhSLw== integrity sha512-7bKr9182/sGfjFm+xdZSwgQuFjgEcy0iCTIBxRUeteJ2Kr8/Wz0qNJX+jw60LU36jApt4nmMkep6+W5AKhok6g==
dependencies: dependencies:
"@discoveryjs/json-ext" "^0.5.0" "@discoveryjs/json-ext" "^0.5.0"
"@webpack-cli/configtest" "^1.0.4" "@webpack-cli/configtest" "^1.0.3"
"@webpack-cli/info" "^1.3.0" "@webpack-cli/info" "^1.2.4"
"@webpack-cli/serve" "^1.5.1" "@webpack-cli/serve" "^1.4.0"
colorette "^1.2.1" colorette "^1.2.1"
commander "^7.0.0" commander "^7.0.0"
execa "^5.0.0" execa "^5.0.0"
@@ -2645,10 +2665,10 @@ webpack-sources@^2.3.0:
source-list-map "^2.0.1" source-list-map "^2.0.1"
source-map "^0.6.1" source-map "^0.6.1"
webpack@5.40.0: webpack@5.38.1:
version "5.40.0" version "5.38.1"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.40.0.tgz#3182cfd324759d715252cf541901a226e57b5061" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.38.1.tgz#5224c7f24c18e729268d3e3bc97240d6e880258e"
integrity sha512-c7f5e/WWrxXWUzQqTBg54vBs5RgcAgpvKE4F4VegVgfo4x660ZxYUF2/hpMkZUnLjgytVTitjeXaN4IPlXCGIw== integrity sha512-OqRmYD1OJbHZph6RUMD93GcCZy4Z4wC0ele4FXyYF0J6AxO1vOSuIlU1hkS/lDlR9CDYBz64MZRmdbdnFFoT2g==
dependencies: dependencies:
"@types/eslint-scope" "^3.7.0" "@types/eslint-scope" "^3.7.0"
"@types/estree" "^0.0.47" "@types/estree" "^0.0.47"
@@ -2659,7 +2679,7 @@ webpack@5.40.0:
browserslist "^4.14.5" browserslist "^4.14.5"
chrome-trace-event "^1.0.2" chrome-trace-event "^1.0.2"
enhanced-resolve "^5.8.0" enhanced-resolve "^5.8.0"
es-module-lexer "^0.6.0" es-module-lexer "^0.4.0"
eslint-scope "5.1.1" eslint-scope "5.1.1"
events "^3.2.0" events "^3.2.0"
glob-to-regexp "^0.4.1" glob-to-regexp "^0.4.1"
@@ -2670,7 +2690,7 @@ webpack@5.40.0:
neo-async "^2.6.2" neo-async "^2.6.2"
schema-utils "^3.0.0" schema-utils "^3.0.0"
tapable "^2.1.1" tapable "^2.1.1"
terser-webpack-plugin "^5.1.3" terser-webpack-plugin "^5.1.1"
watchpack "^2.2.0" watchpack "^2.2.0"
webpack-sources "^2.3.0" webpack-sources "^2.3.0"

View File

@@ -6,7 +6,6 @@ import { distance, SVG_NS } from "../utils";
import { AppState } from "../types"; import { AppState } from "../types";
import { DEFAULT_EXPORT_PADDING, THEME_FILTER } from "../constants"; import { DEFAULT_EXPORT_PADDING, THEME_FILTER } from "../constants";
import { getDefaultAppState } from "../appState"; import { getDefaultAppState } from "../appState";
import { serializeAsJSON } from "../data/json";
export const SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`; export const SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;
@@ -66,35 +65,24 @@ export const exportToCanvas = (
return canvas; return canvas;
}; };
export const exportToSvg = async ( export const exportToSvg = (
elements: readonly NonDeletedExcalidrawElement[], elements: readonly NonDeletedExcalidrawElement[],
appState: { {
exportBackground,
exportPadding = DEFAULT_EXPORT_PADDING,
viewBackgroundColor,
exportWithDarkMode,
exportScale = 1,
metadata = "",
}: {
exportBackground: boolean; exportBackground: boolean;
exportPadding?: number; exportPadding?: number;
exportScale?: number; exportScale?: number;
viewBackgroundColor: string; viewBackgroundColor: string;
exportWithDarkMode?: boolean; exportWithDarkMode?: boolean;
exportEmbedScene?: boolean; metadata?: string;
}, },
): Promise<SVGSVGElement> => { ): SVGSVGElement => {
const {
exportPadding = DEFAULT_EXPORT_PADDING,
viewBackgroundColor,
exportScale = 1,
exportEmbedScene,
} = appState;
let metadata = "";
if (exportEmbedScene) {
try {
metadata = await (
await import(/* webpackChunkName: "image" */ "../../src/data/image")
).encodeSvgMetadata({
text: serializeAsJSON(elements, appState),
});
} catch (err) {
console.error(err);
}
}
const [minX, minY, width, height] = getCanvasSize(elements, exportPadding); const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);
// initialze SVG root // initialze SVG root
@@ -104,7 +92,7 @@ export const exportToSvg = async (
svgRoot.setAttribute("viewBox", `0 0 ${width} ${height}`); svgRoot.setAttribute("viewBox", `0 0 ${width} ${height}`);
svgRoot.setAttribute("width", `${width * exportScale}`); svgRoot.setAttribute("width", `${width * exportScale}`);
svgRoot.setAttribute("height", `${height * exportScale}`); svgRoot.setAttribute("height", `${height * exportScale}`);
if (appState.exportWithDarkMode) { if (exportWithDarkMode) {
svgRoot.setAttribute("filter", THEME_FILTER); svgRoot.setAttribute("filter", THEME_FILTER);
} }
@@ -126,7 +114,7 @@ export const exportToSvg = async (
`; `;
// render background rect // render background rect
if (appState.exportBackground && viewBackgroundColor) { if (exportBackground && viewBackgroundColor) {
const rect = svgRoot.ownerDocument!.createElementNS(SVG_NS, "rect"); const rect = svgRoot.ownerDocument!.createElementNS(SVG_NS, "rect");
rect.setAttribute("x", "0"); rect.setAttribute("x", "0");
rect.setAttribute("y", "0"); rect.setAttribute("y", "0");

View File

@@ -11,7 +11,7 @@ export const SHAPES = [
</svg> </svg>
), ),
value: "selection", value: "selection",
key: KEYS.V, key: [KEYS.V, KEYS.S],
}, },
{ {
icon: ( icon: (

View File

@@ -1,5 +1,5 @@
import React from "react"; import React from "react";
import { fireEvent, render } from "./test-utils"; import { render } from "./test-utils";
import ExcalidrawApp from "../excalidraw-app"; import ExcalidrawApp from "../excalidraw-app";
import { UI, Pointer, Keyboard } from "./helpers/ui"; import { UI, Pointer, Keyboard } from "./helpers/ui";
import { getTransformHandles } from "../element/transformHandles"; import { getTransformHandles } from "../element/transformHandles";
@@ -104,113 +104,4 @@ describe("element binding", () => {
Keyboard.keyPress(KEYS.ARROW_LEFT); Keyboard.keyPress(KEYS.ARROW_LEFT);
expect(arrow.endBinding).toBe(null); expect(arrow.endBinding).toBe(null);
}); });
it("should unbind on bound element deletion", () => {
const rectangle = UI.createElement("rectangle", {
x: 60,
y: 0,
size: 100,
});
const arrow = UI.createElement("arrow", {
x: 0,
y: 0,
size: 50,
});
expect(arrow.endBinding?.elementId).toBe(rectangle.id);
mouse.select(rectangle);
expect(API.getSelectedElement().type).toBe("rectangle");
Keyboard.keyDown(KEYS.DELETE);
expect(arrow.endBinding).toBe(null);
});
it("should unbind on text element deletion by submitting empty text", async () => {
const text = API.createElement({
type: "text",
text: "ola",
x: 60,
y: 0,
width: 100,
height: 100,
});
h.elements = [text];
const arrow = UI.createElement("arrow", {
x: 0,
y: 0,
size: 50,
});
expect(arrow.endBinding?.elementId).toBe(text.id);
// edit text element and submit
// -------------------------------------------------------------------------
UI.clickTool("text");
mouse.clickAt(text.x + 50, text.y + 50);
const editor = document.querySelector(
".excalidraw-textEditorContainer > textarea",
) as HTMLTextAreaElement;
expect(editor).not.toBe(null);
// we defer binding blur event on wysiwyg, hence wait a bit
await new Promise((r) => setTimeout(r, 30));
fireEvent.change(editor, { target: { value: "" } });
editor.blur();
expect(
document.querySelector(".excalidraw-textEditorContainer > textarea"),
).toBe(null);
expect(arrow.endBinding).toBe(null);
});
it("should keep binding on text update", async () => {
const text = API.createElement({
type: "text",
text: "ola",
x: 60,
y: 0,
width: 100,
height: 100,
});
h.elements = [text];
const arrow = UI.createElement("arrow", {
x: 0,
y: 0,
size: 50,
});
expect(arrow.endBinding?.elementId).toBe(text.id);
// delete text element by submitting empty text
// -------------------------------------------------------------------------
UI.clickTool("text");
mouse.clickAt(text.x + 50, text.y + 50);
const editor = document.querySelector(
".excalidraw-textEditorContainer > textarea",
) as HTMLTextAreaElement;
expect(editor).not.toBe(null);
// we defer binding blur event on wysiwyg, hence wait a bit
await new Promise((r) => setTimeout(r, 30));
fireEvent.change(editor, { target: { value: "asdasdasdasdas" } });
editor.blur();
expect(
document.querySelector(".excalidraw-textEditorContainer > textarea"),
).toBe(null);
expect(arrow.endBinding?.elementId).toBe(text.id);
});
}); });

View File

@@ -253,7 +253,7 @@ Object {
"fontFamily": 1, "fontFamily": 1,
"fontSize": 14, "fontSize": 14,
"groupIds": Array [], "groupIds": Array [],
"height": 100, "height": 0,
"id": "id-text01", "id": "id-text01",
"isDeleted": false, "isDeleted": false,
"opacity": 100, "opacity": 100,
@@ -269,7 +269,7 @@ Object {
"version": 1, "version": 1,
"versionNonce": 0, "versionNonce": 0,
"verticalAlign": "middle", "verticalAlign": "middle",
"width": 100, "width": 0,
"x": 0, "x": 0,
"y": 0, "y": 0,
} }
@@ -285,7 +285,7 @@ Object {
"fontFamily": 1, "fontFamily": 1,
"fontSize": 10, "fontSize": 10,
"groupIds": Array [], "groupIds": Array [],
"height": 100, "height": 0,
"id": "id-text01", "id": "id-text01",
"isDeleted": false, "isDeleted": false,
"opacity": 100, "opacity": 100,
@@ -301,7 +301,7 @@ Object {
"version": 1, "version": 1,
"versionNonce": 0, "versionNonce": 0,
"verticalAlign": "top", "verticalAlign": "top",
"width": 100, "width": 0,
"x": 0, "x": 0,
"y": 0, "y": 0,
} }

View File

@@ -11,7 +11,6 @@ import { getDefaultAppState } from "../../appState";
import { ImportedDataState } from "../../data/types"; import { ImportedDataState } from "../../data/types";
import { NormalizedZoomValue } from "../../types"; import { NormalizedZoomValue } from "../../types";
import { FONT_FAMILY } from "../../constants"; import { FONT_FAMILY } from "../../constants";
import { newElementWith } from "../../element/mutateElement";
const mockSizeHelper = jest.spyOn(sizeHelpers, "isInvisiblySmallElement"); const mockSizeHelper = jest.spyOn(sizeHelpers, "isInvisiblySmallElement");
@@ -21,12 +20,12 @@ beforeEach(() => {
describe("restoreElements", () => { describe("restoreElements", () => {
it("should return empty array when element is null", () => { it("should return empty array when element is null", () => {
expect(restore.restoreElements(null, null)).toStrictEqual([]); expect(restore.restoreElements(null)).toStrictEqual([]);
}); });
it("should not call isInvisiblySmallElement when element is a selection element", () => { it("should not call isInvisiblySmallElement when element is a selection element", () => {
const selectionEl = { type: "selection" } as ExcalidrawElement; const selectionEl = { type: "selection" } as ExcalidrawElement;
const restoreElements = restore.restoreElements([selectionEl], null); const restoreElements = restore.restoreElements([selectionEl]);
expect(restoreElements.length).toBe(0); expect(restoreElements.length).toBe(0);
expect(sizeHelpers.isInvisiblySmallElement).toBeCalledTimes(0); expect(sizeHelpers.isInvisiblySmallElement).toBeCalledTimes(0);
}); });
@@ -37,16 +36,14 @@ describe("restoreElements", () => {
}); });
dummyNotSupportedElement.type = "not supported"; dummyNotSupportedElement.type = "not supported";
expect( expect(restore.restoreElements([dummyNotSupportedElement]).length).toBe(0);
restore.restoreElements([dummyNotSupportedElement], null).length,
).toBe(0);
}); });
it("should return empty array when isInvisiblySmallElement is true", () => { it("should return empty array when isInvisiblySmallElement is true", () => {
const rectElement = API.createElement({ type: "rectangle" }); const rectElement = API.createElement({ type: "rectangle" });
mockSizeHelper.mockImplementation(() => true); mockSizeHelper.mockImplementation(() => true);
expect(restore.restoreElements([rectElement], null).length).toBe(0); expect(restore.restoreElements([rectElement]).length).toBe(0);
}); });
it("should restore text element correctly passing value for each attribute", () => { it("should restore text element correctly passing value for each attribute", () => {
@@ -60,10 +57,9 @@ describe("restoreElements", () => {
id: "id-text01", id: "id-text01",
}); });
const restoredText = restore.restoreElements( const restoredText = restore.restoreElements([
[textElement], textElement,
null, ])[0] as ExcalidrawTextElement;
)[0] as ExcalidrawTextElement;
expect(restoredText).toMatchSnapshot({ expect(restoredText).toMatchSnapshot({
seed: expect.any(Number), seed: expect.any(Number),
@@ -81,10 +77,9 @@ describe("restoreElements", () => {
textElement.text = null; textElement.text = null;
textElement.font = "10 unknown"; textElement.font = "10 unknown";
const restoredText = restore.restoreElements( const restoredText = restore.restoreElements([
[textElement], textElement,
null, ])[0] as ExcalidrawTextElement;
)[0] as ExcalidrawTextElement;
expect(restoredText).toMatchSnapshot({ expect(restoredText).toMatchSnapshot({
seed: expect.any(Number), seed: expect.any(Number),
}); });
@@ -96,10 +91,9 @@ describe("restoreElements", () => {
id: "id-freedraw01", id: "id-freedraw01",
}); });
const restoredFreedraw = restore.restoreElements( const restoredFreedraw = restore.restoreElements([
[freedrawElement], freedrawElement,
null, ])[0] as ExcalidrawFreeDrawElement;
)[0] as ExcalidrawFreeDrawElement;
expect(restoredFreedraw).toMatchSnapshot({ seed: expect.any(Number) }); expect(restoredFreedraw).toMatchSnapshot({ seed: expect.any(Number) });
}); });
@@ -113,10 +107,10 @@ describe("restoreElements", () => {
}); });
drawElement.type = "draw"; drawElement.type = "draw";
const restoredElements = restore.restoreElements( const restoredElements = restore.restoreElements([
[lineElement, drawElement], lineElement,
null, drawElement,
); ]);
const restoredLine = restoredElements[0] as ExcalidrawLinearElement; const restoredLine = restoredElements[0] as ExcalidrawLinearElement;
const restoredDraw = restoredElements[1] as ExcalidrawLinearElement; const restoredDraw = restoredElements[1] as ExcalidrawLinearElement;
@@ -128,7 +122,7 @@ describe("restoreElements", () => {
it("should restore arrow element correctly", () => { it("should restore arrow element correctly", () => {
const arrowElement = API.createElement({ type: "arrow", id: "id-arrow01" }); const arrowElement = API.createElement({ type: "arrow", id: "id-arrow01" });
const restoredElements = restore.restoreElements([arrowElement], null); const restoredElements = restore.restoreElements([arrowElement]);
const restoredArrow = restoredElements[0] as ExcalidrawLinearElement; const restoredArrow = restoredElements[0] as ExcalidrawLinearElement;
@@ -138,7 +132,7 @@ describe("restoreElements", () => {
it("when arrow element has defined endArrowHead", () => { it("when arrow element has defined endArrowHead", () => {
const arrowElement = API.createElement({ type: "arrow" }); const arrowElement = API.createElement({ type: "arrow" });
const restoredElements = restore.restoreElements([arrowElement], null); const restoredElements = restore.restoreElements([arrowElement]);
const restoredArrow = restoredElements[0] as ExcalidrawLinearElement; const restoredArrow = restoredElements[0] as ExcalidrawLinearElement;
@@ -151,7 +145,7 @@ describe("restoreElements", () => {
get: jest.fn(() => undefined), get: jest.fn(() => undefined),
}); });
const restoredElements = restore.restoreElements([arrowElement], null); const restoredElements = restore.restoreElements([arrowElement]);
const restoredArrow = restoredElements[0] as ExcalidrawLinearElement; const restoredArrow = restoredElements[0] as ExcalidrawLinearElement;
@@ -172,10 +166,9 @@ describe("restoreElements", () => {
[lineElement.width, lineElement.height], [lineElement.width, lineElement.height],
]; ];
const restoredLine = restore.restoreElements( const restoredLine = restore.restoreElements([
[lineElement], lineElement,
null, ])[0] as ExcalidrawLinearElement;
)[0] as ExcalidrawLinearElement;
expect(restoredLine.points).toMatchObject(expectedLinePoints); expect(restoredLine.points).toMatchObject(expectedLinePoints);
}); });
@@ -212,10 +205,10 @@ describe("restoreElements", () => {
get: jest.fn(() => pointsEl_1), get: jest.fn(() => pointsEl_1),
}); });
const restoredElements = restore.restoreElements( const restoredElements = restore.restoreElements([
[lineElement_0, lineElement_1], lineElement_0,
null, lineElement_1,
); ]);
const restoredLine_0 = restoredElements[0] as ExcalidrawLinearElement; const restoredLine_0 = restoredElements[0] as ExcalidrawLinearElement;
const restoredLine_1 = restoredElements[1] as ExcalidrawLinearElement; const restoredLine_1 = restoredElements[1] as ExcalidrawLinearElement;
@@ -261,37 +254,12 @@ describe("restoreElements", () => {
elements.push(element); elements.push(element);
}); });
const restoredElements = restore.restoreElements(elements, null); const restoredElements = restore.restoreElements(elements);
expect(restoredElements[0]).toMatchSnapshot({ seed: expect.any(Number) }); expect(restoredElements[0]).toMatchSnapshot({ seed: expect.any(Number) });
expect(restoredElements[1]).toMatchSnapshot({ seed: expect.any(Number) }); expect(restoredElements[1]).toMatchSnapshot({ seed: expect.any(Number) });
expect(restoredElements[2]).toMatchSnapshot({ seed: expect.any(Number) }); expect(restoredElements[2]).toMatchSnapshot({ seed: expect.any(Number) });
}); });
it("bump versions of local duplicate elements when supplied", () => {
const rectangle = API.createElement({ type: "rectangle" });
const ellipse = API.createElement({ type: "ellipse" });
const rectangle_modified = newElementWith(rectangle, { isDeleted: true });
const restoredElements = restore.restoreElements(
[rectangle, ellipse],
[rectangle_modified],
);
expect(restoredElements[0].id).toBe(rectangle.id);
expect(restoredElements[0].versionNonce).not.toBe(rectangle.versionNonce);
expect(restoredElements).toEqual([
expect.objectContaining({
id: rectangle.id,
version: rectangle_modified.version + 1,
}),
expect.objectContaining({
id: ellipse.id,
version: ellipse.version,
versionNonce: ellipse.versionNonce,
}),
]);
});
}); });
describe("restoreAppState", () => { describe("restoreAppState", () => {
@@ -461,7 +429,7 @@ describe("restore", () => {
it("when imported data state is null it should return an empty array of elements", () => { it("when imported data state is null it should return an empty array of elements", () => {
const stubLocalAppState = getDefaultAppState(); const stubLocalAppState = getDefaultAppState();
const restoredData = restore.restore(null, stubLocalAppState, null); const restoredData = restore.restore(null, stubLocalAppState);
expect(restoredData.elements.length).toBe(0); expect(restoredData.elements.length).toBe(0);
}); });
@@ -470,7 +438,7 @@ describe("restore", () => {
stubLocalAppState.cursorButton = "down"; stubLocalAppState.cursorButton = "down";
stubLocalAppState.name = "local app state"; stubLocalAppState.name = "local app state";
const restoredData = restore.restore(null, stubLocalAppState, null); const restoredData = restore.restore(null, stubLocalAppState);
expect(restoredData.appState.cursorButton).toBe( expect(restoredData.appState.cursorButton).toBe(
stubLocalAppState.cursorButton, stubLocalAppState.cursorButton,
); );
@@ -487,11 +455,7 @@ describe("restore", () => {
const importedDataState = {} as ImportedDataState; const importedDataState = {} as ImportedDataState;
importedDataState.elements = elements; importedDataState.elements = elements;
const restoredData = restore.restore( const restoredData = restore.restore(importedDataState, stubLocalAppState);
importedDataState,
stubLocalAppState,
null,
);
expect(restoredData.elements.length).toBe(elements.length); expect(restoredData.elements.length).toBe(elements.length);
}); });
@@ -503,36 +467,10 @@ describe("restore", () => {
const importedDataState = {} as ImportedDataState; const importedDataState = {} as ImportedDataState;
importedDataState.appState = stubImportedAppState; importedDataState.appState = stubImportedAppState;
const restoredData = restore.restore(importedDataState, null, null); const restoredData = restore.restore(importedDataState, null);
expect(restoredData.appState.cursorButton).toBe( expect(restoredData.appState.cursorButton).toBe(
stubImportedAppState.cursorButton, stubImportedAppState.cursorButton,
); );
expect(restoredData.appState.name).toBe(stubImportedAppState.name); expect(restoredData.appState.name).toBe(stubImportedAppState.name);
}); });
it("bump versions of local duplicate elements when supplied", () => {
const rectangle = API.createElement({ type: "rectangle" });
const ellipse = API.createElement({ type: "ellipse" });
const rectangle_modified = newElementWith(rectangle, { isDeleted: true });
const restoredData = restore.restore(
{ elements: [rectangle, ellipse] },
null,
[rectangle_modified],
);
expect(restoredData.elements[0].id).toBe(rectangle.id);
expect(restoredData.elements[0].versionNonce).not.toBe(
rectangle.versionNonce,
);
expect(restoredData.elements).toEqual([
expect.objectContaining({ version: rectangle_modified.version + 1 }),
expect.objectContaining({
id: ellipse.id,
version: ellipse.version,
versionNonce: ellipse.versionNonce,
}),
]);
});
}); });

View File

@@ -139,8 +139,6 @@ export class API {
textAlign: rest.textAlign ?? appState.currentItemTextAlign, textAlign: rest.textAlign ?? appState.currentItemTextAlign,
verticalAlign: rest.verticalAlign ?? DEFAULT_VERTICAL_ALIGN, verticalAlign: rest.verticalAlign ?? DEFAULT_VERTICAL_ALIGN,
}); });
element.width = width;
element.height = height;
break; break;
case "freedraw": case "freedraw":
element = newFreeDrawElement({ element = newFreeDrawElement({

View File

@@ -4,7 +4,6 @@ import ExcalidrawApp from "../excalidraw-app";
import { API } from "./helpers/api"; import { API } from "./helpers/api";
import { MIME_TYPES } from "../constants"; import { MIME_TYPES } from "../constants";
import { LibraryItem } from "../types"; import { LibraryItem } from "../types";
import { UI } from "./helpers/ui";
const { h } = window; const { h } = window;
@@ -41,21 +40,4 @@ describe("library", () => {
expect(h.elements).toEqual([expect.objectContaining({ id: "A_copy" })]); expect(h.elements).toEqual([expect.objectContaining({ id: "A_copy" })]);
}); });
}); });
it("inserting library item should revert to selection tool", async () => {
UI.clickTool("rectangle");
expect(h.elements).toEqual([]);
const libraryItems: LibraryItem = JSON.parse(
await API.readFile("./fixtures/fixture_library.excalidrawlib", "utf8"),
).library[0];
await API.drop(
new Blob([JSON.stringify(libraryItems)], {
type: MIME_TYPES.excalidrawlib,
}),
);
await waitFor(() => {
expect(h.elements).toEqual([expect.objectContaining({ id: "A_copy" })]);
});
expect(h.state.elementType).toBe("selection");
});
}); });

View File

@@ -39,6 +39,7 @@ Object {
"isResizing": false, "isResizing": false,
"isRotating": false, "isRotating": false,
"lastPointerDownWith": "mouse", "lastPointerDownWith": "mouse",
"metadata": undefined,
"multiElement": null, "multiElement": null,
"name": "name", "name": "name",
"openMenu": null, "openMenu": null,

View File

@@ -73,10 +73,11 @@ describe("exportToSvg", () => {
const mockedExportUtil = mockedSceneExportUtils.exportToSvg as jest.Mock; const mockedExportUtil = mockedSceneExportUtils.exportToSvg as jest.Mock;
const passedElements = () => mockedExportUtil.mock.calls[0][0]; const passedElements = () => mockedExportUtil.mock.calls[0][0];
const passedOptions = () => mockedExportUtil.mock.calls[0][1]; const passedOptions = () => mockedExportUtil.mock.calls[0][1];
afterEach(jest.resetAllMocks); afterEach(jest.resetAllMocks);
it("with default arguments", async () => { it("with default arguments", () => {
await utils.exportToSvg({ utils.exportToSvg({
...diagramFactory({ ...diagramFactory({
overrides: { appState: void 0 }, overrides: { appState: void 0 },
}), }),
@@ -87,12 +88,13 @@ describe("exportToSvg", () => {
// To avoid varying snapshots // To avoid varying snapshots
name: "name", name: "name",
}; };
expect(passedElements().length).toBe(3); expect(passedElements().length).toBe(3);
expect(passedOptionsWhenDefault).toMatchSnapshot(); expect(passedOptionsWhenDefault).toMatchSnapshot();
}); });
it("with deleted elements", async () => { it("with deleted elements", () => {
await utils.exportToSvg({ utils.exportToSvg({
...diagramFactory({ ...diagramFactory({
overrides: { appState: void 0 }, overrides: { appState: void 0 },
elementOverrides: { isDeleted: true }, elementOverrides: { isDeleted: true },
@@ -102,28 +104,18 @@ describe("exportToSvg", () => {
expect(passedElements().length).toBe(0); expect(passedElements().length).toBe(0);
}); });
it("with exportPadding", async () => { it("with exportPadding and metadata", () => {
await utils.exportToSvg({ const METADATA = "some metada";
utils.exportToSvg({
...diagramFactory({ overrides: { appState: { name: "diagram name" } } }), ...diagramFactory({ overrides: { appState: { name: "diagram name" } } }),
exportPadding: 0, exportPadding: 0,
metadata: METADATA,
}); });
expect(passedElements().length).toBe(3); expect(passedElements().length).toBe(3);
expect(passedOptions()).toEqual( expect(passedOptions()).toEqual(
expect.objectContaining({ exportPadding: 0 }), expect.objectContaining({ exportPadding: 0, metadata: METADATA }),
); );
}); });
it("with exportEmbedScene", async () => {
await utils.exportToSvg({
...diagramFactory({
overrides: {
appState: { name: "diagram name", exportEmbedScene: true },
},
}),
});
expect(passedElements().length).toBe(3);
expect(passedOptions().exportEmbedScene).toBe(true);
});
}); });

File diff suppressed because one or more lines are too long

View File

@@ -15,16 +15,16 @@ describe("exportToSvg", () => {
viewBackgroundColor: "#ffffff", viewBackgroundColor: "#ffffff",
}; };
it("with default arguments", async () => { it("with default arguments", () => {
const svgElement = await exportUtils.exportToSvg(ELEMENTS, DEFAULT_OPTIONS); const svgElement = exportUtils.exportToSvg(ELEMENTS, DEFAULT_OPTIONS);
expect(svgElement).toMatchSnapshot(); expect(svgElement).toMatchSnapshot();
}); });
it("with background color", async () => { it("with background color", () => {
const BACKGROUND_COLOR = "#abcdef"; const BACKGROUND_COLOR = "#abcdef";
const svgElement = await exportUtils.exportToSvg(ELEMENTS, { const svgElement = exportUtils.exportToSvg(ELEMENTS, {
...DEFAULT_OPTIONS, ...DEFAULT_OPTIONS,
exportBackground: true, exportBackground: true,
viewBackgroundColor: BACKGROUND_COLOR, viewBackgroundColor: BACKGROUND_COLOR,
@@ -36,8 +36,8 @@ describe("exportToSvg", () => {
); );
}); });
it("with dark mode", async () => { it("with dark mode", () => {
const svgElement = await exportUtils.exportToSvg(ELEMENTS, { const svgElement = exportUtils.exportToSvg(ELEMENTS, {
...DEFAULT_OPTIONS, ...DEFAULT_OPTIONS,
exportWithDarkMode: true, exportWithDarkMode: true,
}); });
@@ -47,12 +47,14 @@ describe("exportToSvg", () => {
); );
}); });
it("with exportPadding", async () => { it("with exportPadding, metadata", () => {
const svgElement = await exportUtils.exportToSvg(ELEMENTS, { const svgElement = exportUtils.exportToSvg(ELEMENTS, {
...DEFAULT_OPTIONS, ...DEFAULT_OPTIONS,
exportPadding: 0, exportPadding: 0,
metadata: "some metadata",
}); });
expect(svgElement.innerHTML).toMatch(/some metadata/);
expect(svgElement).toHaveAttribute("height", ELEMENT_HEIGHT.toString()); expect(svgElement).toHaveAttribute("height", ELEMENT_HEIGHT.toString());
expect(svgElement).toHaveAttribute("width", ELEMENT_WIDTH.toString()); expect(svgElement).toHaveAttribute("width", ELEMENT_WIDTH.toString());
expect(svgElement).toHaveAttribute( expect(svgElement).toHaveAttribute(
@@ -61,10 +63,10 @@ describe("exportToSvg", () => {
); );
}); });
it("with scale", async () => { it("with scale", () => {
const SCALE = 2; const SCALE = 2;
const svgElement = await exportUtils.exportToSvg(ELEMENTS, { const svgElement = exportUtils.exportToSvg(ELEMENTS, {
...DEFAULT_OPTIONS, ...DEFAULT_OPTIONS,
exportPadding: 0, exportPadding: 0,
exportScale: SCALE, exportScale: SCALE,
@@ -79,12 +81,4 @@ describe("exportToSvg", () => {
(ELEMENT_WIDTH * SCALE).toString(), (ELEMENT_WIDTH * SCALE).toString(),
); );
}); });
it("with exportEmbedScene", async () => {
const svgElement = await exportUtils.exportToSvg(ELEMENTS, {
...DEFAULT_OPTIONS,
exportEmbedScene: true,
});
expect(svgElement.innerHTML).toMatchSnapshot();
});
}); });

View File

@@ -1,58 +0,0 @@
import React from "react";
import { render, GlobalTestState } from "./test-utils";
import ExcalidrawApp from "../excalidraw-app";
import { KEYS } from "../keys";
import { Keyboard, Pointer, UI } from "./helpers/ui";
import { CURSOR_TYPE } from "../constants";
const { h } = window;
const mouse = new Pointer("mouse");
const touch = new Pointer("touch");
const pen = new Pointer("pen");
const pointerTypes = [mouse, touch, pen];
describe("view mode", () => {
beforeEach(async () => {
await render(<ExcalidrawApp />);
});
it("after switching to view mode cursor type should be pointer", async () => {
h.setState({ viewModeEnabled: true });
expect(GlobalTestState.canvas.style.cursor).toBe(CURSOR_TYPE.GRAB);
});
it("after switching to view mode, moving, clicking, and pressing space key cursor type should be pointer", async () => {
h.setState({ viewModeEnabled: true });
pointerTypes.forEach((pointerType) => {
const pointer = pointerType;
pointer.reset();
pointer.move(100, 100);
pointer.click();
Keyboard.keyPress(KEYS.SPACE);
expect(GlobalTestState.canvas.style.cursor).toBe(CURSOR_TYPE.GRAB);
});
});
it("cursor should stay as grabbing type when hovering over canvas elements", async () => {
// create a rectangle, then hover over it cursor should be
// move type for mouse and grab for touch & pen
// then switch to view-mode and cursor should be grabbing type
UI.createElement("rectangle", { size: 100 });
pointerTypes.forEach((pointerType) => {
const pointer = pointerType;
pointer.moveTo(50, 50);
// eslint-disable-next-line dot-notation
if (pointerType["pointerType"] === "mouse") {
expect(GlobalTestState.canvas.style.cursor).toBe(CURSOR_TYPE.MOVE);
} else {
expect(GlobalTestState.canvas.style.cursor).toBe(CURSOR_TYPE.GRAB);
}
h.setState({ viewModeEnabled: true });
expect(GlobalTestState.canvas.style.cursor).toBe(CURSOR_TYPE.GRAB);
});
});
});

View File

@@ -3218,10 +3218,10 @@ brorand@^1.0.1, brorand@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz"
browser-fs-access@0.18.0: browser-fs-access@0.16.4:
version "0.18.0" version "0.16.4"
resolved "https://registry.yarnpkg.com/browser-fs-access/-/browser-fs-access-0.18.0.tgz#d69758ff83ce6a16bb0ece2541742bc3cd86db65" resolved "https://registry.yarnpkg.com/browser-fs-access/-/browser-fs-access-0.16.4.tgz#5dbb85671b1199d74581db98d2975c2fc3a5c708"
integrity sha512-1B6CTTpYl0kP5sP+rJ8osy4Yka8WqnrXHqChMZZVzlw7pQ2VJ+IiLEP7SxonHjtMMSLCnpd24mU08FIExXb2DQ== integrity sha512-c1A9Y3pHJTKPYFjwL5SXX3MZ0BQcK7He7l0csclr80SEADIFOUHUM5oJBdg49XUdlLmIFiWiE3tbr/5KcD5TsQ==
browser-process-hrtime@^1.0.0: browser-process-hrtime@^1.0.0:
version "1.0.0" version "1.0.0"
@@ -3772,18 +3772,17 @@ color-convert@^2.0.1:
dependencies: dependencies:
color-name "~1.1.4" color-name "~1.1.4"
color-name@1.1.3: color-name@1.1.3, color-name@^1.0.0:
version "1.1.3" version "1.1.3"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: color-name@^1.1.4, color-name@~1.1.4:
version "1.1.4" version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
color-string@^1.5.2, color-string@^1.5.4: color-string@^1.5.2, color-string@^1.5.4:
version "1.5.5" version "1.5.4"
resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" resolved "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz"
integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==
dependencies: dependencies:
color-name "^1.0.0" color-name "^1.0.0"
simple-swizzle "^0.2.2" simple-swizzle "^0.2.2"
@@ -5539,8 +5538,7 @@ fecha@^4.2.0:
figgy-pudding@^3.5.1: figgy-pudding@^3.5.1:
version "3.5.2" version "3.5.2"
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz"
integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
figures@^2.0.0: figures@^2.0.0:
version "2.0.0" version "2.0.0"
@@ -6538,6 +6536,11 @@ icss-utils@^4.0.0, icss-utils@^4.1.1:
dependencies: dependencies:
postcss "^7.0.14" postcss "^7.0.14"
idb-keyval@5.0.6:
version "5.0.6"
resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-5.0.6.tgz#62fe4a6703fb5ec86661f41330c94fda65e6d0e6"
integrity sha512-6lJuVbwyo82mKSH6Wq2eHkt9LcbwHAelMIcMe0tP4p20Pod7tTxq9zf0ge2n/YDfMOpDryerfmmYyuQiaFaKOg==
idb@3.0.2: idb@3.0.2:
version "3.0.2" version "3.0.2"
resolved "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz" resolved "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz"
@@ -6766,8 +6769,7 @@ is-arrayish@^0.2.1:
is-arrayish@^0.3.1: is-arrayish@^0.3.1:
version "0.3.2" version "0.3.2"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz"
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
is-bigint@^1.0.1: is-bigint@^1.0.1:
version "1.0.1" version "1.0.1"
@@ -11173,8 +11175,7 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
simple-swizzle@^0.2.2: simple-swizzle@^0.2.2:
version "0.2.2" version "0.2.2"
resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz"
integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
dependencies: dependencies:
is-arrayish "^0.3.1" is-arrayish "^0.3.1"
@@ -11425,9 +11426,8 @@ sshpk@^1.7.0:
tweetnacl "~0.14.0" tweetnacl "~0.14.0"
ssri@^6.0.1: ssri@^6.0.1:
version "6.0.2" version "6.0.1"
resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" resolved "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz"
integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==
dependencies: dependencies:
figgy-pudding "^3.5.1" figgy-pudding "^3.5.1"