mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-11-02 20:04:30 +01:00
Compare commits
1 Commits
persist_fi
...
fix_wysiwy
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3439da164d |
@@ -2,8 +2,5 @@
|
||||
"firestore": {
|
||||
"rules": "firestore.rules",
|
||||
"indexes": "firestore.indexes.json"
|
||||
},
|
||||
"storage": {
|
||||
"rules": "storage.rules"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
rules_version = '2';
|
||||
service firebase.storage {
|
||||
match /b/{bucket}/o {
|
||||
match /{migrations} {
|
||||
match /{scenes}/{scene} {
|
||||
allow get, write: if true;
|
||||
// redundant, but let's be explicit'
|
||||
allow list: if false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,6 @@
|
||||
"clsx": "1.1.1",
|
||||
"firebase": "8.3.3",
|
||||
"i18next-browser-languagedetector": "6.1.0",
|
||||
"idb-keyval": "5.0.6",
|
||||
"lodash.throttle": "4.1.1",
|
||||
"nanoid": "3.1.22",
|
||||
"open-color": "1.8.0",
|
||||
|
||||
Binary file not shown.
@@ -117,7 +117,6 @@
|
||||
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.visually-hidden {
|
||||
|
||||
@@ -38,7 +38,6 @@ const crowdinMap = {
|
||||
"zh-CN": "en-zhcn",
|
||||
"zh-TW": "en-zhtw",
|
||||
"lv-LV": "en-lv",
|
||||
"cs-CZ": "cs-cz",
|
||||
};
|
||||
|
||||
const flags = {
|
||||
@@ -77,7 +76,6 @@ const flags = {
|
||||
"zh-CN": "🇨🇳",
|
||||
"zh-TW": "🇹🇼",
|
||||
"lv-LV": "🇱🇻",
|
||||
"cs-CZ": "🇨🇿",
|
||||
};
|
||||
|
||||
const languages = {
|
||||
@@ -116,7 +114,6 @@ const languages = {
|
||||
"zh-CN": "简体中文",
|
||||
"zh-TW": "繁體中文",
|
||||
"lv-LV": "Latviešu",
|
||||
"cs-CZ": "Česky",
|
||||
};
|
||||
|
||||
const percentages = fs.readFileSync(
|
||||
|
||||
@@ -22,8 +22,8 @@ export const actionChangeViewBackgroundColor = register({
|
||||
name: "changeViewBackgroundColor",
|
||||
perform: (_, appState, value) => {
|
||||
return {
|
||||
appState: { ...appState, ...value },
|
||||
commitToHistory: !!value.viewBackgroundColor,
|
||||
appState: { ...appState, viewBackgroundColor: value },
|
||||
commitToHistory: true,
|
||||
};
|
||||
},
|
||||
PanelComponent: ({ appState, updateData }) => {
|
||||
@@ -33,11 +33,7 @@ export const actionChangeViewBackgroundColor = register({
|
||||
label={t("labels.canvasBackground")}
|
||||
type="canvasBackground"
|
||||
color={appState.viewBackgroundColor}
|
||||
onChange={(color) => updateData({ viewBackgroundColor: color })}
|
||||
isActive={appState.openPopup === "canvasColorPicker"}
|
||||
setActive={(active) =>
|
||||
updateData({ openPopup: active ? "canvasColorPicker" : null })
|
||||
}
|
||||
onChange={(color) => updateData(color)}
|
||||
data-testid="canvas-background-picker"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import React from "react";
|
||||
import { trackEvent } from "../analytics";
|
||||
import { load, questionCircle, saveAs } from "../components/icons";
|
||||
import { load, questionCircle, save, saveAs } from "../components/icons";
|
||||
import { ProjectName } from "../components/ProjectName";
|
||||
import { ToolButton } from "../components/ToolButton";
|
||||
import "../components/ToolIcon.scss";
|
||||
@@ -13,12 +13,6 @@ import { KEYS } from "../keys";
|
||||
import { register } from "./register";
|
||||
import { supported as fsSupported } from "browser-fs-access";
|
||||
import { CheckboxItem } from "../components/CheckboxItem";
|
||||
import { getExportSize } from "../scene/export";
|
||||
import { DEFAULT_EXPORT_PADDING, EXPORT_SCALES, IDB_KEYS } from "../constants";
|
||||
import { getSelectedElements, isSomeElementSelected } from "../scene";
|
||||
import { getNonDeletedElements } from "../element";
|
||||
import { ActiveFile } from "../components/ActiveFile";
|
||||
import * as idb from "idb-keyval";
|
||||
|
||||
export const actionChangeProjectName = register({
|
||||
name: "changeProjectName",
|
||||
@@ -38,54 +32,6 @@ export const actionChangeProjectName = register({
|
||||
),
|
||||
});
|
||||
|
||||
export const actionChangeExportScale = register({
|
||||
name: "changeExportScale",
|
||||
perform: (_elements, appState, value) => {
|
||||
return {
|
||||
appState: { ...appState, exportScale: value },
|
||||
commitToHistory: false,
|
||||
};
|
||||
},
|
||||
PanelComponent: ({ elements: allElements, appState, updateData }) => {
|
||||
const elements = getNonDeletedElements(allElements);
|
||||
const exportSelected = isSomeElementSelected(elements, appState);
|
||||
const exportedElements = exportSelected
|
||||
? getSelectedElements(elements, appState)
|
||||
: elements;
|
||||
|
||||
return (
|
||||
<>
|
||||
{EXPORT_SCALES.map((s) => {
|
||||
const [width, height] = getExportSize(
|
||||
exportedElements,
|
||||
DEFAULT_EXPORT_PADDING,
|
||||
s,
|
||||
);
|
||||
|
||||
const scaleButtonTitle = `${t(
|
||||
"buttons.scale",
|
||||
)} ${s}x (${width}x${height})`;
|
||||
|
||||
return (
|
||||
<ToolButton
|
||||
key={s}
|
||||
size="s"
|
||||
type="radio"
|
||||
icon={`${s}x`}
|
||||
name="export-canvas-scale"
|
||||
title={scaleButtonTitle}
|
||||
aria-label={scaleButtonTitle}
|
||||
id="export-canvas-scale"
|
||||
checked={s === appState.exportScale}
|
||||
onChange={() => updateData(s)}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</>
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
export const actionChangeExportBackground = register({
|
||||
name: "changeExportBackground",
|
||||
perform: (_elements, appState, value) => {
|
||||
@@ -125,8 +71,8 @@ export const actionChangeExportEmbedScene = register({
|
||||
),
|
||||
});
|
||||
|
||||
export const actionSaveToActiveFile = register({
|
||||
name: "saveToActiveFile",
|
||||
export const actionSaveScene = register({
|
||||
name: "saveScene",
|
||||
perform: async (elements, appState, value) => {
|
||||
const fileHandleExists = !!appState.fileHandle;
|
||||
try {
|
||||
@@ -150,49 +96,31 @@ export const actionSaveToActiveFile = register({
|
||||
if (error?.name !== "AbortError") {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
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,
|
||||
};
|
||||
return { commitToHistory: false };
|
||||
}
|
||||
},
|
||||
keyTest: (event) =>
|
||||
event.key === KEYS.S && event[KEYS.CTRL_OR_CMD] && !event.shiftKey,
|
||||
PanelComponent: ({ updateData, appState }) => (
|
||||
<ActiveFile
|
||||
onSave={() => updateData(null)}
|
||||
fileName={appState.fileHandle?.name}
|
||||
PanelComponent: ({ updateData }) => (
|
||||
<ToolButton
|
||||
type="icon"
|
||||
icon={save}
|
||||
title={t("buttons.save")}
|
||||
aria-label={t("buttons.save")}
|
||||
onClick={() => updateData(null)}
|
||||
data-testid="save-button"
|
||||
/>
|
||||
),
|
||||
});
|
||||
|
||||
export const actionSaveFileToDisk = register({
|
||||
name: "saveFileToDisk",
|
||||
export const actionSaveAsScene = register({
|
||||
name: "saveAsScene",
|
||||
perform: async (elements, appState, value) => {
|
||||
try {
|
||||
const { fileHandle } = await saveAsJSON(elements, {
|
||||
...appState,
|
||||
fileHandle: null,
|
||||
});
|
||||
try {
|
||||
if (fileHandle) {
|
||||
await idb.set(IDB_KEYS.fileHandle, fileHandle);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
return { commitToHistory: false, appState: { ...appState, fileHandle } };
|
||||
} catch (error) {
|
||||
if (error?.name !== "AbortError") {
|
||||
|
||||
@@ -13,13 +13,6 @@ import {
|
||||
FillCrossHatchIcon,
|
||||
FillHachureIcon,
|
||||
FillSolidIcon,
|
||||
FontFamilyCodeIcon,
|
||||
FontFamilyHandDrawnIcon,
|
||||
FontFamilyNormalIcon,
|
||||
FontSizeExtraLargeIcon,
|
||||
FontSizeLargeIcon,
|
||||
FontSizeMediumIcon,
|
||||
FontSizeSmallIcon,
|
||||
SloppinessArchitectIcon,
|
||||
SloppinessArtistIcon,
|
||||
SloppinessCartoonistIcon,
|
||||
@@ -27,15 +20,18 @@ import {
|
||||
StrokeStyleDottedIcon,
|
||||
StrokeStyleSolidIcon,
|
||||
StrokeWidthIcon,
|
||||
TextAlignCenterIcon,
|
||||
FontSizeSmallIcon,
|
||||
FontSizeMediumIcon,
|
||||
FontSizeLargeIcon,
|
||||
FontSizeExtraLargeIcon,
|
||||
FontFamilyHandDrawnIcon,
|
||||
FontFamilyNormalIcon,
|
||||
FontFamilyCodeIcon,
|
||||
TextAlignLeftIcon,
|
||||
TextAlignCenterIcon,
|
||||
TextAlignRightIcon,
|
||||
} from "../components/icons";
|
||||
import {
|
||||
DEFAULT_FONT_FAMILY,
|
||||
DEFAULT_FONT_SIZE,
|
||||
FONT_FAMILY,
|
||||
} from "../constants";
|
||||
import { DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE } from "../constants";
|
||||
import {
|
||||
getNonDeletedElements,
|
||||
isTextElement,
|
||||
@@ -48,7 +44,7 @@ import {
|
||||
ExcalidrawElement,
|
||||
ExcalidrawLinearElement,
|
||||
ExcalidrawTextElement,
|
||||
FontFamilyValues,
|
||||
FontFamily,
|
||||
TextAlign,
|
||||
} from "../element/types";
|
||||
import { getLanguage, t } from "../i18n";
|
||||
@@ -103,18 +99,13 @@ export const actionChangeStrokeColor = register({
|
||||
name: "changeStrokeColor",
|
||||
perform: (elements, appState, value) => {
|
||||
return {
|
||||
...(value.currentItemStrokeColor && {
|
||||
elements: changeProperty(elements, appState, (el) =>
|
||||
newElementWith(el, {
|
||||
strokeColor: value.currentItemStrokeColor,
|
||||
}),
|
||||
),
|
||||
}),
|
||||
appState: {
|
||||
...appState,
|
||||
...value,
|
||||
},
|
||||
commitToHistory: !!value.currentItemStrokeColor,
|
||||
elements: changeProperty(elements, appState, (el) =>
|
||||
newElementWith(el, {
|
||||
strokeColor: value,
|
||||
}),
|
||||
),
|
||||
appState: { ...appState, currentItemStrokeColor: value },
|
||||
commitToHistory: true,
|
||||
};
|
||||
},
|
||||
PanelComponent: ({ elements, appState, updateData }) => (
|
||||
@@ -129,11 +120,7 @@ export const actionChangeStrokeColor = register({
|
||||
(element) => element.strokeColor,
|
||||
appState.currentItemStrokeColor,
|
||||
)}
|
||||
onChange={(color) => updateData({ currentItemStrokeColor: color })}
|
||||
isActive={appState.openPopup === "strokeColorPicker"}
|
||||
setActive={(active) =>
|
||||
updateData({ openPopup: active ? "strokeColorPicker" : null })
|
||||
}
|
||||
onChange={updateData}
|
||||
/>
|
||||
</>
|
||||
),
|
||||
@@ -143,18 +130,13 @@ export const actionChangeBackgroundColor = register({
|
||||
name: "changeBackgroundColor",
|
||||
perform: (elements, appState, value) => {
|
||||
return {
|
||||
...(value.currentItemBackgroundColor && {
|
||||
elements: changeProperty(elements, appState, (el) =>
|
||||
newElementWith(el, {
|
||||
backgroundColor: value.currentItemBackgroundColor,
|
||||
}),
|
||||
),
|
||||
}),
|
||||
appState: {
|
||||
...appState,
|
||||
...value,
|
||||
},
|
||||
commitToHistory: !!value.currentItemBackgroundColor,
|
||||
elements: changeProperty(elements, appState, (el) =>
|
||||
newElementWith(el, {
|
||||
backgroundColor: value,
|
||||
}),
|
||||
),
|
||||
appState: { ...appState, currentItemBackgroundColor: value },
|
||||
commitToHistory: true,
|
||||
};
|
||||
},
|
||||
PanelComponent: ({ elements, appState, updateData }) => (
|
||||
@@ -169,11 +151,7 @@ export const actionChangeBackgroundColor = register({
|
||||
(element) => element.backgroundColor,
|
||||
appState.currentItemBackgroundColor,
|
||||
)}
|
||||
onChange={(color) => updateData({ currentItemBackgroundColor: color })}
|
||||
isActive={appState.openPopup === "backgroundColorPicker"}
|
||||
setActive={(active) =>
|
||||
updateData({ openPopup: active ? "backgroundColorPicker" : null })
|
||||
}
|
||||
onChange={updateData}
|
||||
/>
|
||||
</>
|
||||
),
|
||||
@@ -503,23 +481,19 @@ export const actionChangeFontFamily = register({
|
||||
};
|
||||
},
|
||||
PanelComponent: ({ elements, appState, updateData }) => {
|
||||
const options: {
|
||||
value: FontFamilyValues;
|
||||
text: string;
|
||||
icon: JSX.Element;
|
||||
}[] = [
|
||||
const options: { value: FontFamily; text: string; icon: JSX.Element }[] = [
|
||||
{
|
||||
value: FONT_FAMILY.Virgil,
|
||||
value: 1,
|
||||
text: t("labels.handDrawn"),
|
||||
icon: <FontFamilyHandDrawnIcon theme={appState.theme} />,
|
||||
},
|
||||
{
|
||||
value: FONT_FAMILY.Helvetica,
|
||||
value: 2,
|
||||
text: t("labels.normal"),
|
||||
icon: <FontFamilyNormalIcon theme={appState.theme} />,
|
||||
},
|
||||
{
|
||||
value: FONT_FAMILY.Cascadia,
|
||||
value: 3,
|
||||
text: t("labels.code"),
|
||||
icon: <FontFamilyCodeIcon theme={appState.theme} />,
|
||||
},
|
||||
@@ -528,7 +502,7 @@ export const actionChangeFontFamily = register({
|
||||
return (
|
||||
<fieldset>
|
||||
<legend>{t("labels.fontFamily")}</legend>
|
||||
<ButtonIconSelect<FontFamilyValues | false>
|
||||
<ButtonIconSelect<FontFamily | false>
|
||||
group="font-family"
|
||||
options={options}
|
||||
value={getFormValue(
|
||||
|
||||
@@ -34,8 +34,8 @@ export { actionFinalize } from "./actionFinalize";
|
||||
export {
|
||||
actionChangeProjectName,
|
||||
actionChangeExportBackground,
|
||||
actionSaveToActiveFile,
|
||||
actionSaveFileToDisk,
|
||||
actionSaveScene,
|
||||
actionSaveAsScene,
|
||||
actionLoadScene,
|
||||
} from "./actionExport";
|
||||
|
||||
|
||||
@@ -66,9 +66,8 @@ export type ActionName =
|
||||
| "changeProjectName"
|
||||
| "changeExportBackground"
|
||||
| "changeExportEmbedScene"
|
||||
| "changeExportScale"
|
||||
| "saveToActiveFile"
|
||||
| "saveFileToDisk"
|
||||
| "saveScene"
|
||||
| "saveAsScene"
|
||||
| "loadScene"
|
||||
| "duplicateSelection"
|
||||
| "deleteSelectedElements"
|
||||
|
||||
@@ -3,16 +3,11 @@ import {
|
||||
DEFAULT_FONT_FAMILY,
|
||||
DEFAULT_FONT_SIZE,
|
||||
DEFAULT_TEXT_ALIGN,
|
||||
EXPORT_SCALES,
|
||||
} from "./constants";
|
||||
import { t } from "./i18n";
|
||||
import { AppState, NormalizedZoomValue } from "./types";
|
||||
import { getDateTime } from "./utils";
|
||||
|
||||
const defaultExportScale = EXPORT_SCALES.includes(devicePixelRatio)
|
||||
? devicePixelRatio
|
||||
: 1;
|
||||
|
||||
export const getDefaultAppState = (): Omit<
|
||||
AppState,
|
||||
"offsetTop" | "offsetLeft" | "width" | "height"
|
||||
@@ -44,7 +39,6 @@ export const getDefaultAppState = (): Omit<
|
||||
elementType: "selection",
|
||||
errorMessage: null,
|
||||
exportBackground: true,
|
||||
exportScale: defaultExportScale,
|
||||
exportEmbedScene: false,
|
||||
exportWithDarkMode: false,
|
||||
fileHandle: null,
|
||||
@@ -58,7 +52,6 @@ export const getDefaultAppState = (): Omit<
|
||||
multiElement: null,
|
||||
name: `${t("labels.untitled")}-${getDateTime()}`,
|
||||
openMenu: null,
|
||||
openPopup: null,
|
||||
pasteDialog: { shown: false, data: null },
|
||||
previousSelectedElementIds: {},
|
||||
resizingElement: null,
|
||||
@@ -123,7 +116,6 @@ const APP_STATE_STORAGE_CONF = (<
|
||||
errorMessage: { browser: false, export: false },
|
||||
exportBackground: { browser: true, export: false },
|
||||
exportEmbedScene: { browser: true, export: false },
|
||||
exportScale: { browser: true, export: false },
|
||||
exportWithDarkMode: { browser: true, export: false },
|
||||
fileHandle: { browser: false, export: false },
|
||||
gridSize: { browser: true, export: true },
|
||||
@@ -139,7 +131,6 @@ const APP_STATE_STORAGE_CONF = (<
|
||||
offsetLeft: { browser: false, export: false },
|
||||
offsetTop: { browser: false, export: false },
|
||||
openMenu: { browser: true, export: false },
|
||||
openPopup: { browser: false, export: false },
|
||||
pasteDialog: { browser: false, export: false },
|
||||
previousSelectedElementIds: { browser: true, export: false },
|
||||
resizingElement: { browser: false, export: false },
|
||||
|
||||
@@ -151,14 +151,23 @@ export const SelectedShapeActions = ({
|
||||
);
|
||||
};
|
||||
|
||||
const LIBRARY_ICON = (
|
||||
// fa-th-large
|
||||
<svg viewBox="0 0 512 512">
|
||||
<path d="M296 32h192c13.255 0 24 10.745 24 24v160c0 13.255-10.745 24-24 24H296c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24zm-80 0H24C10.745 32 0 42.745 0 56v160c0 13.255 10.745 24 24 24h192c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24zM0 296v160c0 13.255 10.745 24 24 24h192c13.255 0 24-10.745 24-24V296c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zm296 184h192c13.255 0 24-10.745 24-24V296c0-13.255-10.745-24-24-24H296c-13.255 0-24 10.745-24 24v160c0 13.255 10.745 24 24 24z" />
|
||||
</svg>
|
||||
);
|
||||
|
||||
export const ShapesSwitcher = ({
|
||||
canvas,
|
||||
elementType,
|
||||
setAppState,
|
||||
isLibraryOpen,
|
||||
}: {
|
||||
canvas: HTMLCanvasElement | null;
|
||||
elementType: ExcalidrawElement["type"];
|
||||
setAppState: React.Component<any, AppState>["setState"];
|
||||
isLibraryOpen: boolean;
|
||||
}) => (
|
||||
<>
|
||||
{SHAPES.map(({ value, icon, key }, index) => {
|
||||
@@ -192,6 +201,19 @@ export const ShapesSwitcher = ({
|
||||
/>
|
||||
);
|
||||
})}
|
||||
<ToolButton
|
||||
className="Shape ToolIcon_type_button__library"
|
||||
type="button"
|
||||
icon={LIBRARY_ICON}
|
||||
name="editor-library"
|
||||
keyBindingLabel="9"
|
||||
aria-keyshortcuts="9"
|
||||
title={`${capitalizeString(t("toolBar.library"))} — 9`}
|
||||
aria-label={capitalizeString(t("toolBar.library"))}
|
||||
onClick={() => {
|
||||
setAppState({ isLibraryOpen: !isLibraryOpen });
|
||||
}}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
.excalidraw {
|
||||
.ActiveFile {
|
||||
.ActiveFile__fileName {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
span {
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
width: 9.3em;
|
||||
}
|
||||
|
||||
svg {
|
||||
width: 1.15em;
|
||||
margin-inline-end: 0.3em;
|
||||
transform: scaleY(0.9);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
import React from "react";
|
||||
import Stack from "../components/Stack";
|
||||
import { ToolButton } from "../components/ToolButton";
|
||||
import { save, file } from "../components/icons";
|
||||
import { t } from "../i18n";
|
||||
|
||||
import "./ActiveFile.scss";
|
||||
|
||||
type ActiveFileProps = {
|
||||
fileName?: string;
|
||||
onSave: () => void;
|
||||
};
|
||||
|
||||
export const ActiveFile = ({ fileName, onSave }: ActiveFileProps) => (
|
||||
<Stack.Row className="ActiveFile" gap={1} align="center">
|
||||
<span className="ActiveFile__fileName">
|
||||
{file}
|
||||
<span>{fileName}</span>
|
||||
</span>
|
||||
<ToolButton
|
||||
type="icon"
|
||||
icon={save}
|
||||
title={t("buttons.save")}
|
||||
aria-label={t("buttons.save")}
|
||||
onClick={onSave}
|
||||
data-testid="save-button"
|
||||
/>
|
||||
</Stack.Row>
|
||||
);
|
||||
@@ -52,7 +52,6 @@ import {
|
||||
ENV,
|
||||
EVENT,
|
||||
GRID_SIZE,
|
||||
IDB_KEYS,
|
||||
LINE_CONFIRM_THRESHOLD,
|
||||
MIME_TYPES,
|
||||
MQ_MAX_HEIGHT_LANDSCAPE,
|
||||
@@ -112,6 +111,7 @@ import {
|
||||
import { LinearElementEditor } from "../element/linearElementEditor";
|
||||
import { mutateElement } from "../element/mutateElement";
|
||||
import { deepCopyElement, newFreeDrawElement } from "../element/newElement";
|
||||
import { MaybeTransformHandleType } from "../element/transformHandles";
|
||||
import {
|
||||
isBindingElement,
|
||||
isBindingElementType,
|
||||
@@ -167,11 +167,9 @@ import { findShapeByKey } from "../shapes";
|
||||
import {
|
||||
AppProps,
|
||||
AppState,
|
||||
ExcalidrawImperativeAPI,
|
||||
Gesture,
|
||||
GestureEvent,
|
||||
LibraryItems,
|
||||
PointerDownState,
|
||||
SceneData,
|
||||
} from "../types";
|
||||
import {
|
||||
@@ -182,6 +180,7 @@ import {
|
||||
isToolIcon,
|
||||
isWritableElement,
|
||||
resetCursor,
|
||||
ResolvablePromise,
|
||||
resolvablePromise,
|
||||
sceneCoordsToViewportCoords,
|
||||
setCursor,
|
||||
@@ -195,14 +194,12 @@ import LayerUI from "./LayerUI";
|
||||
import { Stats } from "./Stats";
|
||||
import { Toast } from "./Toast";
|
||||
import { actionToggleViewMode } from "../actions/actionToggleViewMode";
|
||||
import * as idb from "idb-keyval";
|
||||
|
||||
const IsMobileContext = React.createContext(false);
|
||||
export const useIsMobile = () => useContext(IsMobileContext);
|
||||
const ExcalidrawContainerContext = React.createContext<{
|
||||
container: HTMLDivElement | null;
|
||||
id: string | null;
|
||||
}>({ container: null, id: null });
|
||||
const ExcalidrawContainerContext = React.createContext<HTMLDivElement | null>(
|
||||
null,
|
||||
);
|
||||
export const useExcalidrawContainer = () =>
|
||||
useContext(ExcalidrawContainerContext);
|
||||
|
||||
@@ -225,6 +222,83 @@ const gesture: Gesture = {
|
||||
initialScale: null,
|
||||
};
|
||||
|
||||
export type PointerDownState = Readonly<{
|
||||
// The first position at which pointerDown happened
|
||||
origin: Readonly<{ x: number; y: number }>;
|
||||
// Same as "origin" but snapped to the grid, if grid is on
|
||||
originInGrid: Readonly<{ x: number; y: number }>;
|
||||
// Scrollbar checks
|
||||
scrollbars: ReturnType<typeof isOverScrollBars>;
|
||||
// The previous pointer position
|
||||
lastCoords: { x: number; y: number };
|
||||
// map of original elements data
|
||||
originalElements: Map<string, NonDeleted<ExcalidrawElement>>;
|
||||
resize: {
|
||||
// Handle when resizing, might change during the pointer interaction
|
||||
handleType: MaybeTransformHandleType;
|
||||
// This is determined on the initial pointer down event
|
||||
isResizing: boolean;
|
||||
// This is determined on the initial pointer down event
|
||||
offset: { x: number; y: number };
|
||||
// This is determined on the initial pointer down event
|
||||
arrowDirection: "origin" | "end";
|
||||
// This is a center point of selected elements determined on the initial pointer down event (for rotation only)
|
||||
center: { x: number; y: number };
|
||||
};
|
||||
hit: {
|
||||
// The element the pointer is "hitting", is determined on the initial
|
||||
// pointer down event
|
||||
element: NonDeleted<ExcalidrawElement> | null;
|
||||
// The elements the pointer is "hitting", is determined on the initial
|
||||
// pointer down event
|
||||
allHitElements: NonDeleted<ExcalidrawElement>[];
|
||||
// This is determined on the initial pointer down event
|
||||
wasAddedToSelection: boolean;
|
||||
// Whether selected element(s) were duplicated, might change during the
|
||||
// pointer interaction
|
||||
hasBeenDuplicated: boolean;
|
||||
hasHitCommonBoundingBoxOfSelectedElements: boolean;
|
||||
};
|
||||
withCmdOrCtrl: boolean;
|
||||
drag: {
|
||||
// Might change during the pointer interation
|
||||
hasOccurred: boolean;
|
||||
// Might change during the pointer interation
|
||||
offset: { x: number; y: number } | null;
|
||||
};
|
||||
// We need to have these in the state so that we can unsubscribe them
|
||||
eventListeners: {
|
||||
// It's defined on the initial pointer down event
|
||||
onMove: null | ((event: PointerEvent) => void);
|
||||
// It's defined on the initial pointer down event
|
||||
onUp: null | ((event: PointerEvent) => void);
|
||||
// It's defined on the initial pointer down event
|
||||
onKeyDown: null | ((event: KeyboardEvent) => void);
|
||||
// It's defined on the initial pointer down event
|
||||
onKeyUp: null | ((event: KeyboardEvent) => void);
|
||||
};
|
||||
}>;
|
||||
|
||||
export type ExcalidrawImperativeAPI = {
|
||||
updateScene: InstanceType<typeof App>["updateScene"];
|
||||
resetScene: InstanceType<typeof App>["resetScene"];
|
||||
getSceneElementsIncludingDeleted: InstanceType<
|
||||
typeof App
|
||||
>["getSceneElementsIncludingDeleted"];
|
||||
history: {
|
||||
clear: InstanceType<typeof App>["resetHistory"];
|
||||
};
|
||||
scrollToContent: InstanceType<typeof App>["scrollToContent"];
|
||||
getSceneElements: InstanceType<typeof App>["getSceneElements"];
|
||||
getAppState: () => InstanceType<typeof App>["state"];
|
||||
refresh: InstanceType<typeof App>["refresh"];
|
||||
importLibrary: InstanceType<typeof App>["importLibraryFromUrl"];
|
||||
setToastMessage: InstanceType<typeof App>["setToastMessage"];
|
||||
readyPromise: ResolvablePromise<ExcalidrawImperativeAPI>;
|
||||
ready: true;
|
||||
id: string;
|
||||
};
|
||||
|
||||
class App extends React.Component<AppProps, AppState> {
|
||||
canvas: HTMLCanvasElement | null = null;
|
||||
rc: RoughCanvas | null = null;
|
||||
@@ -247,10 +321,8 @@ class App extends React.Component<AppProps, AppState> {
|
||||
public libraryItemsFromStorage: LibraryItems | undefined;
|
||||
private id: string;
|
||||
private history: History;
|
||||
private excalidrawContainerValue: {
|
||||
container: HTMLDivElement | null;
|
||||
id: string;
|
||||
};
|
||||
|
||||
private activeWysiwyg: null | { handleSubmit: () => void } = null;
|
||||
|
||||
constructor(props: AppProps) {
|
||||
super(props);
|
||||
@@ -307,12 +379,6 @@ class App extends React.Component<AppProps, AppState> {
|
||||
}
|
||||
readyPromise.resolve(api);
|
||||
}
|
||||
|
||||
this.excalidrawContainerValue = {
|
||||
container: this.excalidrawContainerRef.current,
|
||||
id: this.id,
|
||||
};
|
||||
|
||||
this.scene = new Scene();
|
||||
this.library = new Library(this);
|
||||
this.history = new History();
|
||||
@@ -340,7 +406,7 @@ class App extends React.Component<AppProps, AppState> {
|
||||
if (viewModeEnabled) {
|
||||
return (
|
||||
<canvas
|
||||
className="excalidraw__canvas"
|
||||
id="canvas"
|
||||
style={{
|
||||
width: canvasDOMWidth,
|
||||
height: canvasDOMHeight,
|
||||
@@ -362,7 +428,7 @@ class App extends React.Component<AppProps, AppState> {
|
||||
}
|
||||
return (
|
||||
<canvas
|
||||
className="excalidraw__canvas"
|
||||
id="canvas"
|
||||
style={{
|
||||
width: canvasDOMWidth,
|
||||
height: canvasDOMHeight,
|
||||
@@ -388,6 +454,7 @@ class App extends React.Component<AppProps, AppState> {
|
||||
|
||||
const {
|
||||
onCollabButtonClick,
|
||||
onExportToBackend,
|
||||
renderTopRightUI,
|
||||
renderFooter,
|
||||
renderCustomStats,
|
||||
@@ -407,7 +474,7 @@ class App extends React.Component<AppProps, AppState> {
|
||||
}
|
||||
>
|
||||
<ExcalidrawContainerContext.Provider
|
||||
value={this.excalidrawContainerValue}
|
||||
value={this.excalidrawContainerRef.current}
|
||||
>
|
||||
<IsMobileContext.Provider value={this.isMobile}>
|
||||
<LayerUI
|
||||
@@ -428,6 +495,7 @@ class App extends React.Component<AppProps, AppState> {
|
||||
toggleZenMode={this.toggleZenMode}
|
||||
langCode={getLanguage().code}
|
||||
isCollaborating={this.props.isCollaborating || false}
|
||||
onExportToBackend={onExportToBackend}
|
||||
renderTopRightUI={renderTopRightUI}
|
||||
renderCustomFooter={renderFooter}
|
||||
viewModeEnabled={viewModeEnabled}
|
||||
@@ -470,9 +538,7 @@ class App extends React.Component<AppProps, AppState> {
|
||||
}
|
||||
|
||||
public focusContainer = () => {
|
||||
if (this.props.autoFocus) {
|
||||
this.excalidrawContainerRef.current?.focus();
|
||||
}
|
||||
this.excalidrawContainerRef.current?.focus();
|
||||
};
|
||||
|
||||
public getSceneElementsIncludingDeleted = () => {
|
||||
@@ -738,8 +804,6 @@ class App extends React.Component<AppProps, AppState> {
|
||||
};
|
||||
|
||||
public async componentDidMount() {
|
||||
this.excalidrawContainerValue.container = this.excalidrawContainerRef.current;
|
||||
|
||||
if (
|
||||
process.env.NODE_ENV === ENV.TEST ||
|
||||
process.env.NODE_ENV === ENV.DEVELOPMENT
|
||||
@@ -809,15 +873,6 @@ class App extends React.Component<AppProps, AppState> {
|
||||
} else {
|
||||
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() {
|
||||
@@ -1592,21 +1647,6 @@ class App extends React.Component<AppProps, AppState> {
|
||||
isHoldingSpace = true;
|
||||
setCursor(this.canvas, CURSOR_TYPE.GRABBING);
|
||||
}
|
||||
|
||||
if (event.key === KEYS.G || event.key === KEYS.S) {
|
||||
const selectedElements = getSelectedElements(
|
||||
this.scene.getElements(),
|
||||
this.state,
|
||||
);
|
||||
if (selectedElements.length) {
|
||||
if (event.key === KEYS.G) {
|
||||
this.setState({ openPopup: "backgroundColorPicker" });
|
||||
}
|
||||
if (event.key === KEYS.S) {
|
||||
this.setState({ openPopup: "strokeColorPicker" });
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
@@ -1725,7 +1765,7 @@ class App extends React.Component<AppProps, AppState> {
|
||||
]);
|
||||
};
|
||||
|
||||
textWysiwyg({
|
||||
const { handleSubmit } = textWysiwyg({
|
||||
id: element.id,
|
||||
appState: this.state,
|
||||
canvas: this.canvas,
|
||||
@@ -1749,6 +1789,7 @@ class App extends React.Component<AppProps, AppState> {
|
||||
}
|
||||
}),
|
||||
onSubmit: withBatchedUpdates(({ text, viaKeyboard }) => {
|
||||
this.activeWysiwyg = null;
|
||||
const isDeleted = !text.trim();
|
||||
updateElement(text, isDeleted);
|
||||
// select the created text element only if submitting via keyboard
|
||||
@@ -1790,6 +1831,8 @@ class App extends React.Component<AppProps, AppState> {
|
||||
// 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);
|
||||
|
||||
this.activeWysiwyg = { handleSubmit };
|
||||
}
|
||||
|
||||
private getTextElementAtPosition(
|
||||
@@ -1807,21 +1850,9 @@ class App extends React.Component<AppProps, AppState> {
|
||||
private getElementAtPosition(
|
||||
x: number,
|
||||
y: number,
|
||||
opts?: {
|
||||
/** if true, returns the first selected element (with highest z-index)
|
||||
of all hit elements */
|
||||
preferSelected?: boolean;
|
||||
},
|
||||
): NonDeleted<ExcalidrawElement> | null {
|
||||
const allHitElements = this.getElementsAtPosition(x, y);
|
||||
if (allHitElements.length > 1) {
|
||||
if (opts?.preferSelected) {
|
||||
for (let index = allHitElements.length - 1; index > -1; index--) {
|
||||
if (this.state.selectedElementIds[allHitElements[index].id]) {
|
||||
return allHitElements[index];
|
||||
}
|
||||
}
|
||||
}
|
||||
const elementWithHighestZIndex =
|
||||
allHitElements[allHitElements.length - 1];
|
||||
// If we're hitting element with highest z-index only on its bounding box
|
||||
@@ -2257,6 +2288,12 @@ class App extends React.Component<AppProps, AppState> {
|
||||
private handleCanvasPointerDown = (
|
||||
event: React.PointerEvent<HTMLCanvasElement>,
|
||||
) => {
|
||||
event.persist();
|
||||
|
||||
if (this.activeWysiwyg) {
|
||||
this.activeWysiwyg.handleSubmit();
|
||||
}
|
||||
|
||||
// remove any active selection when we start to interact with canvas
|
||||
// (mainly, we care about removing selection outside the component which
|
||||
// would prevent our copy handling otherwise)
|
||||
@@ -3894,7 +3931,7 @@ class App extends React.Component<AppProps, AppState> {
|
||||
event.preventDefault();
|
||||
|
||||
const { x, y } = viewportCoordsToSceneCoords(event, this.state);
|
||||
const element = this.getElementAtPosition(x, y, { preferSelected: true });
|
||||
const element = this.getElementAtPosition(x, y);
|
||||
|
||||
const type = element ? "element" : "canvas";
|
||||
|
||||
|
||||
@@ -16,5 +16,10 @@ export const BackgroundPickerAndDarkModeToggle = ({
|
||||
<div style={{ display: "flex" }}>
|
||||
{actionManager.renderAction("changeViewBackgroundColor")}
|
||||
{showThemeBtn && actionManager.renderAction("toggleTheme")}
|
||||
{appState.fileHandle && (
|
||||
<div style={{ marginInlineStart: "0.25rem" }}>
|
||||
{actionManager.renderAction("saveScene")}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -238,16 +238,13 @@ export const ColorPicker = ({
|
||||
color,
|
||||
onChange,
|
||||
label,
|
||||
isActive,
|
||||
setActive,
|
||||
}: {
|
||||
type: "canvasBackground" | "elementBackground" | "elementStroke";
|
||||
color: string | null;
|
||||
onChange: (color: string) => void;
|
||||
label: string;
|
||||
isActive: boolean;
|
||||
setActive: (active: boolean) => void;
|
||||
}) => {
|
||||
const [isActive, setActive] = React.useState(false);
|
||||
const pickerButton = React.useRef<HTMLButtonElement>(null);
|
||||
|
||||
return (
|
||||
|
||||
@@ -2,7 +2,7 @@ import clsx from "clsx";
|
||||
import React, { useEffect, useState } from "react";
|
||||
import { useCallbackRefState } from "../hooks/useCallbackRefState";
|
||||
import { t } from "../i18n";
|
||||
import { useExcalidrawContainer, useIsMobile } from "../components/App";
|
||||
import { useIsMobile } from "../components/App";
|
||||
import { KEYS } from "../keys";
|
||||
import "./Dialog.scss";
|
||||
import { back, close } from "./icons";
|
||||
@@ -21,7 +21,6 @@ export const Dialog = (props: {
|
||||
}) => {
|
||||
const [islandNode, setIslandNode] = useCallbackRefState<HTMLDivElement>();
|
||||
const [lastActiveElement] = useState(document.activeElement);
|
||||
const { id } = useExcalidrawContainer();
|
||||
|
||||
useEffect(() => {
|
||||
if (!islandNode) {
|
||||
@@ -83,7 +82,7 @@ export const Dialog = (props: {
|
||||
theme={props.theme}
|
||||
>
|
||||
<Island ref={setIslandNode}>
|
||||
<h2 id={`${id}-dialog-title`} className="Dialog__title">
|
||||
<h2 id="dialog-title" className="Dialog__title">
|
||||
<span className="Dialog__titleContent">{props.title}</span>
|
||||
<button
|
||||
className="Modal__close"
|
||||
|
||||
@@ -12,7 +12,7 @@ export const ErrorDialog = ({
|
||||
onClose?: () => void;
|
||||
}) => {
|
||||
const [modalIsShown, setModalIsShown] = useState(!!message);
|
||||
const { container: excalidrawContainer } = useExcalidrawContainer();
|
||||
const excalidrawContainer = useExcalidrawContainer();
|
||||
|
||||
const handleClose = React.useCallback(() => {
|
||||
setModalIsShown(false);
|
||||
|
||||
@@ -97,8 +97,7 @@
|
||||
|
||||
border-radius: 1rem;
|
||||
background-color: var(--button-color);
|
||||
box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.28),
|
||||
0 6px 10px 0 rgba(0, 0, 0, 0.14);
|
||||
box-shadow: 0 3px 5px -1px rgb(0 0 0 / 28%), 0 6px 10px 0 rgb(0 0 0 / 14%);
|
||||
|
||||
font-family: Cascadia;
|
||||
font-size: 1.8em;
|
||||
|
||||
@@ -157,13 +157,6 @@ export const HelpDialog = ({ onClose }: { onClose?: () => void }) => {
|
||||
shortcuts={["Shift+P", "7"]}
|
||||
/>
|
||||
<Shortcut label={t("toolBar.text")} shortcuts={["T", "8"]} />
|
||||
<Shortcut
|
||||
label={t("helpDialog.editSelectedShape")}
|
||||
shortcuts={[
|
||||
getShortcutKey("Enter"),
|
||||
t("helpDialog.doubleClick"),
|
||||
]}
|
||||
/>
|
||||
<Shortcut
|
||||
label={t("helpDialog.textNewLine")}
|
||||
shortcuts={[
|
||||
@@ -372,14 +365,6 @@ export const HelpDialog = ({ onClose }: { onClose?: () => void }) => {
|
||||
label={t("labels.flipVertical")}
|
||||
shortcuts={[getShortcutKey("Shift+V")]}
|
||||
/>
|
||||
<Shortcut
|
||||
label={t("labels.showStroke")}
|
||||
shortcuts={[getShortcutKey("S")]}
|
||||
/>
|
||||
<Shortcut
|
||||
label={t("labels.showBackground")}
|
||||
shortcuts={[getShortcutKey("G")]}
|
||||
/>
|
||||
</ShortcutIsland>
|
||||
</Column>
|
||||
</Columns>
|
||||
|
||||
@@ -5,7 +5,7 @@ import { getSelectedElements } from "../scene";
|
||||
|
||||
import "./HintViewer.scss";
|
||||
import { AppState } from "../types";
|
||||
import { isLinearElement, isTextElement } from "../element/typeChecks";
|
||||
import { isLinearElement } from "../element/typeChecks";
|
||||
import { getShortcutKey } from "../utils";
|
||||
|
||||
interface Hint {
|
||||
@@ -57,14 +57,6 @@ const getHints = ({ appState, elements }: Hint) => {
|
||||
return t("hints.lineEditor_info");
|
||||
}
|
||||
|
||||
if (selectedElements.length === 1 && isTextElement(selectedElements[0])) {
|
||||
return t("hints.text_selected");
|
||||
}
|
||||
|
||||
if (appState.editingElement && isTextElement(appState.editingElement)) {
|
||||
return t("hints.text_editing");
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
|
||||
@@ -8,17 +8,20 @@ import { CanvasError } from "../errors";
|
||||
import { t } from "../i18n";
|
||||
import { useIsMobile } from "./App";
|
||||
import { getSelectedElements, isSomeElementSelected } from "../scene";
|
||||
import { exportToCanvas } from "../scene/export";
|
||||
import { exportToCanvas, getExportSize } from "../scene/export";
|
||||
import { AppState } from "../types";
|
||||
import { Dialog } from "./Dialog";
|
||||
import { clipboard, exportImage } from "./icons";
|
||||
import Stack from "./Stack";
|
||||
import { ToolButton } from "./ToolButton";
|
||||
|
||||
import "./ExportDialog.scss";
|
||||
import { supported as fsSupported } from "browser-fs-access";
|
||||
import OpenColor from "open-color";
|
||||
import { CheckboxItem } from "./CheckboxItem";
|
||||
import { DEFAULT_EXPORT_PADDING } from "../constants";
|
||||
|
||||
const scales = [1, 2, 3];
|
||||
const defaultScale = scales.includes(devicePixelRatio) ? devicePixelRatio : 1;
|
||||
|
||||
const supportsContextFilters =
|
||||
"filter" in document.createElement("canvas").getContext("2d")!;
|
||||
@@ -79,7 +82,7 @@ const ExportButton: React.FC<{
|
||||
const ImageExportModal = ({
|
||||
elements,
|
||||
appState,
|
||||
exportPadding = DEFAULT_EXPORT_PADDING,
|
||||
exportPadding = 10,
|
||||
actionManager,
|
||||
onExportToPng,
|
||||
onExportToSvg,
|
||||
@@ -95,6 +98,7 @@ const ImageExportModal = ({
|
||||
onCloseRequest: () => void;
|
||||
}) => {
|
||||
const someElementIsSelected = isSomeElementSelected(elements, appState);
|
||||
const [scale, setScale] = useState(defaultScale);
|
||||
const [exportSelected, setExportSelected] = useState(someElementIsSelected);
|
||||
const previewRef = useRef<HTMLDivElement>(null);
|
||||
const { exportBackground, viewBackgroundColor } = appState;
|
||||
@@ -117,6 +121,7 @@ const ImageExportModal = ({
|
||||
exportBackground,
|
||||
viewBackgroundColor,
|
||||
exportPadding,
|
||||
scale,
|
||||
});
|
||||
|
||||
// if converting to blob fails, there's some problem that will
|
||||
@@ -139,6 +144,7 @@ const ImageExportModal = ({
|
||||
exportBackground,
|
||||
exportPadding,
|
||||
viewBackgroundColor,
|
||||
scale,
|
||||
]);
|
||||
|
||||
return (
|
||||
@@ -169,8 +175,33 @@ const ImageExportModal = ({
|
||||
</div>
|
||||
</div>
|
||||
<div style={{ display: "flex", alignItems: "center", marginTop: ".6em" }}>
|
||||
<Stack.Row gap={2}>
|
||||
{actionManager.renderAction("changeExportScale")}
|
||||
<Stack.Row gap={2} justifyContent={"center"}>
|
||||
{scales.map((_scale) => {
|
||||
const [width, height] = getExportSize(
|
||||
exportedElements,
|
||||
exportPadding,
|
||||
_scale,
|
||||
);
|
||||
|
||||
const scaleButtonTitle = `${t(
|
||||
"buttons.scale",
|
||||
)} ${_scale}x (${width}x${height})`;
|
||||
|
||||
return (
|
||||
<ToolButton
|
||||
key={_scale}
|
||||
size="s"
|
||||
type="radio"
|
||||
icon={`${_scale}x`}
|
||||
name="export-canvas-scale"
|
||||
title={scaleButtonTitle}
|
||||
aria-label={scaleButtonTitle}
|
||||
id="export-canvas-scale"
|
||||
checked={_scale === scale}
|
||||
onChange={() => setScale(_scale)}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</Stack.Row>
|
||||
<p style={{ marginLeft: "1em", userSelect: "none" }}>Scale</p>
|
||||
</div>
|
||||
@@ -189,7 +220,7 @@ const ImageExportModal = ({
|
||||
color="indigo"
|
||||
title={t("buttons.exportToPng")}
|
||||
aria-label={t("buttons.exportToPng")}
|
||||
onClick={() => onExportToPng(exportedElements)}
|
||||
onClick={() => onExportToPng(exportedElements, scale)}
|
||||
>
|
||||
PNG
|
||||
</ExportButton>
|
||||
@@ -197,14 +228,14 @@ const ImageExportModal = ({
|
||||
color="red"
|
||||
title={t("buttons.exportToSvg")}
|
||||
aria-label={t("buttons.exportToSvg")}
|
||||
onClick={() => onExportToSvg(exportedElements)}
|
||||
onClick={() => onExportToSvg(exportedElements, scale)}
|
||||
>
|
||||
SVG
|
||||
</ExportButton>
|
||||
{probablySupportsClipboardBlob && (
|
||||
<ExportButton
|
||||
title={t("buttons.copyPngToClipboard")}
|
||||
onClick={() => onExportToClipboard(exportedElements)}
|
||||
onClick={() => onExportToClipboard(exportedElements, scale)}
|
||||
color="gray"
|
||||
shade={7}
|
||||
>
|
||||
@@ -219,7 +250,7 @@ const ImageExportModal = ({
|
||||
export const ImageExportDialog = ({
|
||||
elements,
|
||||
appState,
|
||||
exportPadding = DEFAULT_EXPORT_PADDING,
|
||||
exportPadding = 10,
|
||||
actionManager,
|
||||
onExportToPng,
|
||||
onExportToSvg,
|
||||
|
||||
@@ -3,11 +3,11 @@ import { ActionsManagerInterface } from "../actions/types";
|
||||
import { NonDeletedExcalidrawElement } from "../element/types";
|
||||
import { t } from "../i18n";
|
||||
import { useIsMobile } from "./App";
|
||||
import { AppState, ExportOpts } from "../types";
|
||||
import { AppState } from "../types";
|
||||
import { Dialog } from "./Dialog";
|
||||
import { exportFile, exportToFileIcon, link } from "./icons";
|
||||
import { ToolButton } from "./ToolButton";
|
||||
import { actionSaveFileToDisk } from "../actions/actionExport";
|
||||
import { actionSaveAsScene } from "../actions/actionExport";
|
||||
import { Card } from "./Card";
|
||||
|
||||
import "./ExportDialog.scss";
|
||||
@@ -22,40 +22,35 @@ const JSONExportModal = ({
|
||||
elements,
|
||||
appState,
|
||||
actionManager,
|
||||
exportOpts,
|
||||
canvas,
|
||||
onExportToBackend,
|
||||
}: {
|
||||
appState: AppState;
|
||||
elements: readonly NonDeletedExcalidrawElement[];
|
||||
actionManager: ActionsManagerInterface;
|
||||
onExportToBackend?: ExportCB;
|
||||
onCloseRequest: () => void;
|
||||
exportOpts: ExportOpts;
|
||||
canvas: HTMLCanvasElement | null;
|
||||
}) => {
|
||||
const { onExportToBackend } = exportOpts;
|
||||
return (
|
||||
<div className="ExportDialog ExportDialog--json">
|
||||
<div className="ExportDialog-cards">
|
||||
{exportOpts.saveFileToDisk && (
|
||||
<Card color="lime">
|
||||
<div className="Card-icon">{exportToFileIcon}</div>
|
||||
<h2>{t("exportDialog.disk_title")}</h2>
|
||||
<div className="Card-details">
|
||||
{t("exportDialog.disk_details")}
|
||||
{!fsSupported && actionManager.renderAction("changeProjectName")}
|
||||
</div>
|
||||
<ToolButton
|
||||
className="Card-button"
|
||||
type="button"
|
||||
title={t("exportDialog.disk_button")}
|
||||
aria-label={t("exportDialog.disk_button")}
|
||||
showAriaLabel={true}
|
||||
onClick={() => {
|
||||
actionManager.executeAction(actionSaveFileToDisk);
|
||||
}}
|
||||
/>
|
||||
</Card>
|
||||
)}
|
||||
<Card color="lime">
|
||||
<div className="Card-icon">{exportToFileIcon}</div>
|
||||
<h2>{t("exportDialog.disk_title")}</h2>
|
||||
<div className="Card-details">
|
||||
{t("exportDialog.disk_details")}
|
||||
{!fsSupported && actionManager.renderAction("changeProjectName")}
|
||||
</div>
|
||||
<ToolButton
|
||||
className="Card-button"
|
||||
type="button"
|
||||
title={t("exportDialog.disk_button")}
|
||||
aria-label={t("exportDialog.disk_button")}
|
||||
showAriaLabel={true}
|
||||
onClick={() => {
|
||||
actionManager.executeAction(actionSaveAsScene);
|
||||
}}
|
||||
/>
|
||||
</Card>
|
||||
{onExportToBackend && (
|
||||
<Card color="pink">
|
||||
<div className="Card-icon">{link}</div>
|
||||
@@ -67,12 +62,10 @@ const JSONExportModal = ({
|
||||
title={t("exportDialog.link_button")}
|
||||
aria-label={t("exportDialog.link_button")}
|
||||
showAriaLabel={true}
|
||||
onClick={() => onExportToBackend(elements, appState, canvas)}
|
||||
onClick={() => onExportToBackend(elements)}
|
||||
/>
|
||||
</Card>
|
||||
)}
|
||||
{exportOpts.renderCustomUI &&
|
||||
exportOpts.renderCustomUI(elements, appState, canvas)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
@@ -82,14 +75,12 @@ export const JSONExportDialog = ({
|
||||
elements,
|
||||
appState,
|
||||
actionManager,
|
||||
exportOpts,
|
||||
canvas,
|
||||
onExportToBackend,
|
||||
}: {
|
||||
appState: AppState;
|
||||
elements: readonly NonDeletedExcalidrawElement[];
|
||||
actionManager: ActionsManagerInterface;
|
||||
exportOpts: ExportOpts;
|
||||
canvas: HTMLCanvasElement | null;
|
||||
onExportToBackend?: ExportCB;
|
||||
}) => {
|
||||
const [modalIsShown, setModalIsShown] = useState(false);
|
||||
|
||||
@@ -116,9 +107,8 @@ export const JSONExportDialog = ({
|
||||
elements={elements}
|
||||
appState={appState}
|
||||
actionManager={actionManager}
|
||||
onExportToBackend={onExportToBackend}
|
||||
onCloseRequest={handleClose}
|
||||
exportOpts={exportOpts}
|
||||
canvas={canvas}
|
||||
/>
|
||||
</Dialog>
|
||||
)}
|
||||
|
||||
@@ -36,7 +36,7 @@ import { Island } from "./Island";
|
||||
import "./LayerUI.scss";
|
||||
import { LibraryUnit } from "./LibraryUnit";
|
||||
import { LoadingMessage } from "./LoadingMessage";
|
||||
import { LockButton } from "./LockButton";
|
||||
import { LockIcon } from "./LockIcon";
|
||||
import { MobileMenu } from "./MobileMenu";
|
||||
import { PasteChartDialog } from "./PasteChartDialog";
|
||||
import { Section } from "./Section";
|
||||
@@ -47,7 +47,6 @@ import { Tooltip } from "./Tooltip";
|
||||
import { UserList } from "./UserList";
|
||||
import Library from "../data/library";
|
||||
import { JSONExportDialog } from "./JSONExportDialog";
|
||||
import { LibraryButton } from "./LibraryButton";
|
||||
|
||||
interface LayerUIProps {
|
||||
actionManager: ActionManager;
|
||||
@@ -64,6 +63,11 @@ interface LayerUIProps {
|
||||
toggleZenMode: () => void;
|
||||
langCode: Language["code"];
|
||||
isCollaborating: boolean;
|
||||
onExportToBackend?: (
|
||||
exportedElements: readonly NonDeletedExcalidrawElement[],
|
||||
appState: AppState,
|
||||
canvas: HTMLCanvasElement | null,
|
||||
) => void;
|
||||
renderTopRightUI?: (isMobile: boolean, appState: AppState) => JSX.Element;
|
||||
renderCustomFooter?: (isMobile: boolean, appState: AppState) => JSX.Element;
|
||||
viewModeEnabled: boolean;
|
||||
@@ -108,7 +112,6 @@ const LibraryMenuItems = ({
|
||||
onAddToLibrary,
|
||||
onInsertShape,
|
||||
pendingElements,
|
||||
theme,
|
||||
setAppState,
|
||||
setLibraryItems,
|
||||
libraryReturnUrl,
|
||||
@@ -121,7 +124,6 @@ const LibraryMenuItems = ({
|
||||
onRemoveFromLibrary: (index: number) => void;
|
||||
onInsertShape: (elements: LibraryItem) => void;
|
||||
onAddToLibrary: (elements: LibraryItem) => void;
|
||||
theme: AppState["theme"];
|
||||
setAppState: React.Component<any, AppState>["setState"];
|
||||
setLibraryItems: (library: LibraryItems) => void;
|
||||
libraryReturnUrl: ExcalidrawProps["libraryReturnUrl"];
|
||||
@@ -195,7 +197,7 @@ const LibraryMenuItems = ({
|
||||
<a
|
||||
href={`https://libraries.excalidraw.com?target=${
|
||||
window.name || "_blank"
|
||||
}&referrer=${referrer}&useHash=true&token=${id}&theme=${theme}`}
|
||||
}&referrer=${referrer}&useHash=true&token=${id}`}
|
||||
target="_excalidraw_libraries"
|
||||
>
|
||||
{t("labels.libraries")}
|
||||
@@ -249,7 +251,6 @@ const LibraryMenu = ({
|
||||
onInsertShape,
|
||||
pendingElements,
|
||||
onAddToLibrary,
|
||||
theme,
|
||||
setAppState,
|
||||
libraryReturnUrl,
|
||||
focusContainer,
|
||||
@@ -260,7 +261,6 @@ const LibraryMenu = ({
|
||||
onClickOutside: (event: MouseEvent) => void;
|
||||
onInsertShape: (elements: LibraryItem) => void;
|
||||
onAddToLibrary: () => void;
|
||||
theme: AppState["theme"];
|
||||
setAppState: React.Component<any, AppState>["setState"];
|
||||
libraryReturnUrl: ExcalidrawProps["libraryReturnUrl"];
|
||||
focusContainer: () => void;
|
||||
@@ -350,7 +350,6 @@ const LibraryMenu = ({
|
||||
libraryReturnUrl={libraryReturnUrl}
|
||||
focusContainer={focusContainer}
|
||||
library={library}
|
||||
theme={theme}
|
||||
id={id}
|
||||
/>
|
||||
)}
|
||||
@@ -372,6 +371,7 @@ const LayerUI = ({
|
||||
showThemeBtn,
|
||||
toggleZenMode,
|
||||
isCollaborating,
|
||||
onExportToBackend,
|
||||
renderTopRightUI,
|
||||
renderCustomFooter,
|
||||
viewModeEnabled,
|
||||
@@ -393,24 +393,32 @@ const LayerUI = ({
|
||||
elements={elements}
|
||||
appState={appState}
|
||||
actionManager={actionManager}
|
||||
exportOpts={UIOptions.canvasActions.export}
|
||||
canvas={canvas}
|
||||
onExportToBackend={
|
||||
onExportToBackend
|
||||
? (elements) => {
|
||||
onExportToBackend &&
|
||||
onExportToBackend(elements, appState, canvas);
|
||||
}
|
||||
: undefined
|
||||
}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
const renderImageExportDialog = () => {
|
||||
if (!UIOptions.canvasActions.saveAsImage) {
|
||||
if (!UIOptions.canvasActions.export) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const createExporter = (type: ExportType): ExportCB => async (
|
||||
exportedElements,
|
||||
scale,
|
||||
) => {
|
||||
await exportCanvas(type, exportedElements, appState, {
|
||||
exportBackground: appState.exportBackground,
|
||||
name: appState.name,
|
||||
viewBackgroundColor: appState.viewBackgroundColor,
|
||||
scale,
|
||||
})
|
||||
.catch(muteFSAbortError)
|
||||
.catch((error) => {
|
||||
@@ -488,9 +496,6 @@ const LayerUI = ({
|
||||
setAppState={setAppState}
|
||||
showThemeBtn={showThemeBtn}
|
||||
/>
|
||||
{appState.fileHandle && (
|
||||
<>{actionManager.renderAction("saveToActiveFile")}</>
|
||||
)}
|
||||
</Stack.Col>
|
||||
</Island>
|
||||
</Section>
|
||||
@@ -509,8 +514,7 @@ const LayerUI = ({
|
||||
style={{
|
||||
// we want to make sure this doesn't overflow so substracting 200
|
||||
// which is approximately height of zoom footer and top left menu items with some buffer
|
||||
// if active file name is displayed, subtracting 248 to account for its height
|
||||
maxHeight: `${appState.height - (appState.fileHandle ? 248 : 200)}px`,
|
||||
maxHeight: `${appState.height - 200}px`,
|
||||
}}
|
||||
>
|
||||
<SelectedShapeActions
|
||||
@@ -547,7 +551,6 @@ const LayerUI = ({
|
||||
libraryReturnUrl={libraryReturnUrl}
|
||||
focusContainer={focusContainer}
|
||||
library={library}
|
||||
theme={appState.theme}
|
||||
id={id}
|
||||
/>
|
||||
) : null;
|
||||
@@ -575,12 +578,6 @@ const LayerUI = ({
|
||||
{(heading) => (
|
||||
<Stack.Col gap={4} align="start">
|
||||
<Stack.Row gap={1}>
|
||||
<LockButton
|
||||
zenModeEnabled={zenModeEnabled}
|
||||
checked={appState.elementLocked}
|
||||
onChange={onLockToggle}
|
||||
title={t("toolBar.lock")}
|
||||
/>
|
||||
<Island
|
||||
padding={1}
|
||||
className={clsx({ "zen-mode": zenModeEnabled })}
|
||||
@@ -592,12 +589,15 @@ const LayerUI = ({
|
||||
canvas={canvas}
|
||||
elementType={appState.elementType}
|
||||
setAppState={setAppState}
|
||||
isLibraryOpen={appState.isLibraryOpen}
|
||||
/>
|
||||
</Stack.Row>
|
||||
</Island>
|
||||
<LibraryButton
|
||||
appState={appState}
|
||||
setAppState={setAppState}
|
||||
<LockIcon
|
||||
zenModeEnabled={zenModeEnabled}
|
||||
checked={appState.elementLocked}
|
||||
onChange={onLockToggle}
|
||||
title={t("toolBar.lock")}
|
||||
/>
|
||||
</Stack.Row>
|
||||
{libraryMenu}
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
import clsx from "clsx";
|
||||
import { t } from "../i18n";
|
||||
import { AppState } from "../types";
|
||||
import { capitalizeString } from "../utils";
|
||||
|
||||
const LIBRARY_ICON = (
|
||||
<svg viewBox="0 0 576 512">
|
||||
<path
|
||||
fill="currentColor"
|
||||
d="M542.22 32.05c-54.8 3.11-163.72 14.43-230.96 55.59-4.64 2.84-7.27 7.89-7.27 13.17v363.87c0 11.55 12.63 18.85 23.28 13.49 69.18-34.82 169.23-44.32 218.7-46.92 16.89-.89 30.02-14.43 30.02-30.66V62.75c.01-17.71-15.35-31.74-33.77-30.7zM264.73 87.64C197.5 46.48 88.58 35.17 33.78 32.05 15.36 31.01 0 45.04 0 62.75V400.6c0 16.24 13.13 29.78 30.02 30.66 49.49 2.6 149.59 12.11 218.77 46.95 10.62 5.35 23.21-1.94 23.21-13.46V100.63c0-5.29-2.62-10.14-7.27-12.99z"
|
||||
></path>
|
||||
</svg>
|
||||
);
|
||||
|
||||
export const LibraryButton: React.FC<{
|
||||
appState: AppState;
|
||||
setAppState: React.Component<any, AppState>["setState"];
|
||||
}> = ({ appState, setAppState }) => {
|
||||
return (
|
||||
<label
|
||||
className={clsx(
|
||||
"ToolIcon ToolIcon_type_floating ToolIcon__library zen-mode-visibility",
|
||||
`ToolIcon_size_m`,
|
||||
{
|
||||
"zen-mode-visibility--hidden": appState.zenModeEnabled,
|
||||
},
|
||||
)}
|
||||
title={`${capitalizeString(t("toolBar.library"))} — 9`}
|
||||
style={{ marginInlineStart: "var(--space-factor)" }}
|
||||
>
|
||||
<input
|
||||
className="ToolIcon_type_checkbox"
|
||||
type="checkbox"
|
||||
name="editor-library"
|
||||
onChange={(event) => {
|
||||
setAppState({ isLibraryOpen: event.target.checked });
|
||||
}}
|
||||
checked={appState.isLibraryOpen}
|
||||
aria-label={capitalizeString(t("toolBar.library"))}
|
||||
aria-keyshortcuts="9"
|
||||
/>
|
||||
<div className="ToolIcon__icon">{LIBRARY_ICON}</div>
|
||||
</label>
|
||||
);
|
||||
};
|
||||
@@ -8,8 +8,10 @@ type LockIconSize = "s" | "m";
|
||||
type LockIconProps = {
|
||||
title?: string;
|
||||
name?: string;
|
||||
id?: string;
|
||||
checked: boolean;
|
||||
onChange?(): void;
|
||||
size?: LockIconSize;
|
||||
zenModeEnabled?: boolean;
|
||||
};
|
||||
|
||||
@@ -39,12 +41,12 @@ const ICONS = {
|
||||
),
|
||||
};
|
||||
|
||||
export const LockButton = (props: LockIconProps) => {
|
||||
export const LockIcon = (props: LockIconProps) => {
|
||||
return (
|
||||
<label
|
||||
className={clsx(
|
||||
"ToolIcon ToolIcon__lock ToolIcon_type_floating zen-mode-visibility",
|
||||
`ToolIcon_size_${DEFAULT_SIZE}`,
|
||||
`ToolIcon_size_${props.size || DEFAULT_SIZE}`,
|
||||
{
|
||||
"zen-mode-visibility--hidden": props.zenModeEnabled,
|
||||
},
|
||||
@@ -55,6 +57,7 @@ export const LockButton = (props: LockIconProps) => {
|
||||
className="ToolIcon_type_checkbox"
|
||||
type="checkbox"
|
||||
name={props.name}
|
||||
id={props.id}
|
||||
onChange={props.onChange}
|
||||
checked={props.checked}
|
||||
aria-label={props.title}
|
||||
@@ -13,10 +13,9 @@ import { SelectedShapeActions, ShapesSwitcher } from "./Actions";
|
||||
import { Section } from "./Section";
|
||||
import CollabButton from "./CollabButton";
|
||||
import { SCROLLBAR_WIDTH, SCROLLBAR_MARGIN } from "../scene/scrollbars";
|
||||
import { LockButton } from "./LockButton";
|
||||
import { LockIcon } from "./LockIcon";
|
||||
import { UserList } from "./UserList";
|
||||
import { BackgroundPickerAndDarkModeToggle } from "./BackgroundPickerAndDarkModeToggle";
|
||||
import { LibraryButton } from "./LibraryButton";
|
||||
|
||||
type MobileMenuProps = {
|
||||
appState: AppState;
|
||||
@@ -65,15 +64,15 @@ export const MobileMenu = ({
|
||||
canvas={canvas}
|
||||
elementType={appState.elementType}
|
||||
setAppState={setAppState}
|
||||
isLibraryOpen={appState.isLibraryOpen}
|
||||
/>
|
||||
</Stack.Row>
|
||||
</Island>
|
||||
<LockButton
|
||||
<LockIcon
|
||||
checked={appState.elementLocked}
|
||||
onChange={onLockToggle}
|
||||
title={t("toolBar.lock")}
|
||||
/>
|
||||
<LibraryButton appState={appState} setAppState={setAppState} />
|
||||
</Stack.Row>
|
||||
{libraryMenu}
|
||||
</Stack.Col>
|
||||
|
||||
@@ -58,7 +58,7 @@ const useBodyRoot = (theme: AppState["theme"]) => {
|
||||
const isMobileRef = useRef(isMobile);
|
||||
isMobileRef.current = isMobile;
|
||||
|
||||
const { container: excalidrawContainer } = useExcalidrawContainer();
|
||||
const excalidrawContainer = useExcalidrawContainer();
|
||||
|
||||
useLayoutEffect(() => {
|
||||
if (div) {
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
import "./TextInput.scss";
|
||||
|
||||
import React, { useState } from "react";
|
||||
import React, { Component } from "react";
|
||||
import { focusNearestParent } from "../utils";
|
||||
|
||||
import "./ProjectName.scss";
|
||||
import { useExcalidrawContainer } from "./App";
|
||||
|
||||
type Props = {
|
||||
value: string;
|
||||
@@ -13,19 +12,22 @@ type Props = {
|
||||
isNameEditable: boolean;
|
||||
};
|
||||
|
||||
export const ProjectName = (props: Props) => {
|
||||
const { id } = useExcalidrawContainer();
|
||||
const [fileName, setFileName] = useState<string>(props.value);
|
||||
|
||||
const handleBlur = (event: any) => {
|
||||
type State = {
|
||||
fileName: string;
|
||||
};
|
||||
export class ProjectName extends Component<Props, State> {
|
||||
state = {
|
||||
fileName: this.props.value,
|
||||
};
|
||||
private handleBlur = (event: any) => {
|
||||
focusNearestParent(event.target);
|
||||
const value = event.target.value;
|
||||
if (value !== props.value) {
|
||||
props.onChange(value);
|
||||
if (value !== this.props.value) {
|
||||
this.props.onChange(value);
|
||||
}
|
||||
};
|
||||
|
||||
const handleKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {
|
||||
private handleKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {
|
||||
if (event.key === "Enter") {
|
||||
event.preventDefault();
|
||||
if (event.nativeEvent.isComposing || event.keyCode === 229) {
|
||||
@@ -35,25 +37,29 @@ export const ProjectName = (props: Props) => {
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="ProjectName">
|
||||
<label className="ProjectName-label" htmlFor="filename">
|
||||
{`${props.label}${props.isNameEditable ? "" : ":"}`}
|
||||
</label>
|
||||
{props.isNameEditable ? (
|
||||
<input
|
||||
className="TextInput"
|
||||
onBlur={handleBlur}
|
||||
onKeyDown={handleKeyDown}
|
||||
id={`${id}-filename`}
|
||||
value={fileName}
|
||||
onChange={(event) => setFileName(event.target.value)}
|
||||
/>
|
||||
) : (
|
||||
<span className="TextInput TextInput--readonly" id={`${id}-filename`}>
|
||||
{props.value}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
public render() {
|
||||
return (
|
||||
<div className="ProjectName">
|
||||
<label className="ProjectName-label" htmlFor="filename">
|
||||
{`${this.props.label}${this.props.isNameEditable ? "" : ":"}`}
|
||||
</label>
|
||||
{this.props.isNameEditable ? (
|
||||
<input
|
||||
className="TextInput"
|
||||
onBlur={this.handleBlur}
|
||||
onKeyDown={this.handleKeyDown}
|
||||
id="filename"
|
||||
value={this.state.fileName}
|
||||
onChange={(event) =>
|
||||
this.setState({ fileName: event.target.value })
|
||||
}
|
||||
/>
|
||||
) : (
|
||||
<span className="TextInput TextInput--readonly" id="filename">
|
||||
{this.props.value}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import React from "react";
|
||||
import { t } from "../i18n";
|
||||
import { useExcalidrawContainer } from "./App";
|
||||
|
||||
interface SectionProps extends React.HTMLProps<HTMLElement> {
|
||||
heading: string;
|
||||
@@ -8,14 +7,13 @@ interface SectionProps extends React.HTMLProps<HTMLElement> {
|
||||
}
|
||||
|
||||
export const Section = ({ heading, children, ...props }: SectionProps) => {
|
||||
const { id } = useExcalidrawContainer();
|
||||
const header = (
|
||||
<h2 className="visually-hidden" id={`${id}-${heading}-title`}>
|
||||
<h2 className="visually-hidden" id={`${heading}-title`}>
|
||||
{t(`headings.${heading}`)}
|
||||
</h2>
|
||||
);
|
||||
return (
|
||||
<section {...props} aria-labelledby={`${id}-${heading}-title`}>
|
||||
<section {...props} aria-labelledby={`${heading}-title`}>
|
||||
{typeof children === "function" ? (
|
||||
children(header)
|
||||
) : (
|
||||
|
||||
@@ -2,7 +2,6 @@ import "./ToolIcon.scss";
|
||||
|
||||
import React from "react";
|
||||
import clsx from "clsx";
|
||||
import { useExcalidrawContainer } from "./App";
|
||||
|
||||
type ToolIconSize = "s" | "m";
|
||||
|
||||
@@ -44,7 +43,6 @@ type ToolButtonProps =
|
||||
const DEFAULT_SIZE: ToolIconSize = "m";
|
||||
|
||||
export const ToolButton = React.forwardRef((props: ToolButtonProps, ref) => {
|
||||
const { id: excalId } = useExcalidrawContainer();
|
||||
const innerRef = React.useRef(null);
|
||||
React.useImperativeHandle(ref, () => innerRef.current);
|
||||
const sizeCn = `ToolIcon_size_${props.size || DEFAULT_SIZE}`;
|
||||
@@ -100,7 +98,7 @@ export const ToolButton = React.forwardRef((props: ToolButtonProps, ref) => {
|
||||
aria-label={props["aria-label"]}
|
||||
aria-keyshortcuts={props["aria-keyshortcuts"]}
|
||||
data-testid={props["data-testid"]}
|
||||
id={`${excalId}-${props.id}`}
|
||||
id={props.id}
|
||||
onChange={props.onChange}
|
||||
checked={props.checked}
|
||||
ref={innerRef}
|
||||
|
||||
@@ -8,18 +8,10 @@
|
||||
position: relative;
|
||||
font-family: Cascadia;
|
||||
cursor: pointer;
|
||||
background-color: var(--button-gray-1);
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
border-radius: var(--space-factor);
|
||||
user-select: none;
|
||||
|
||||
background-color: var(--button-gray-1);
|
||||
|
||||
&:hover {
|
||||
background-color: var(--button-gray-2);
|
||||
}
|
||||
&:active {
|
||||
background-color: var(--button-gray-3);
|
||||
}
|
||||
}
|
||||
|
||||
.ToolIcon--plain {
|
||||
@@ -74,6 +66,14 @@
|
||||
margin: 0;
|
||||
font-size: inherit;
|
||||
|
||||
&:hover {
|
||||
background-color: var(--button-gray-1);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: var(--button-gray-2);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
box-shadow: 0 0 0 2px var(--focus-highlight-color);
|
||||
}
|
||||
@@ -86,14 +86,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: var(--button-gray-2);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: var(--button-gray-3);
|
||||
}
|
||||
|
||||
&--show {
|
||||
visibility: visible;
|
||||
}
|
||||
@@ -111,9 +103,6 @@
|
||||
|
||||
&:not(.ToolIcon_toggle_opaque):checked + .ToolIcon__icon {
|
||||
background-color: var(--button-gray-2);
|
||||
&:active {
|
||||
background-color: var(--button-gray-3);
|
||||
}
|
||||
}
|
||||
|
||||
&:focus + .ToolIcon__icon {
|
||||
@@ -141,21 +130,12 @@
|
||||
}
|
||||
|
||||
.ToolIcon__icon {
|
||||
background-color: var(--button-gray-1);
|
||||
&:hover {
|
||||
background-color: var(--button-gray-2);
|
||||
}
|
||||
&:active {
|
||||
background-color: var(--button-gray-3);
|
||||
}
|
||||
|
||||
width: 2rem;
|
||||
height: 2em;
|
||||
}
|
||||
}
|
||||
|
||||
.ToolIcon.ToolIcon__lock {
|
||||
margin-inline-end: var(--space-factor);
|
||||
&.ToolIcon_type_floating {
|
||||
margin-left: 0.1rem;
|
||||
}
|
||||
@@ -186,9 +166,10 @@
|
||||
// move the lock button out of the way on small viewports
|
||||
// it begins to collide with the GitHub icon before we switch to mobile mode
|
||||
@media (max-width: 760px) {
|
||||
.ToolIcon.ToolIcon_type_floating {
|
||||
.ToolIcon.ToolIcon__lock {
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
top: 60px;
|
||||
right: -8px;
|
||||
|
||||
margin-left: 0;
|
||||
@@ -213,14 +194,6 @@
|
||||
position: static;
|
||||
}
|
||||
}
|
||||
.ToolIcon.ToolIcon__library {
|
||||
top: 100px;
|
||||
}
|
||||
|
||||
.ToolIcon.ToolIcon__lock {
|
||||
margin-inline-end: 0;
|
||||
top: 60px;
|
||||
}
|
||||
}
|
||||
|
||||
.unlocked-icon {
|
||||
|
||||
@@ -24,10 +24,7 @@ type Opts = {
|
||||
mirror?: true;
|
||||
} & React.SVGProps<SVGSVGElement>;
|
||||
|
||||
export const createIcon = (
|
||||
d: string | React.ReactNode,
|
||||
opts: number | Opts = 512,
|
||||
) => {
|
||||
const createIcon = (d: string | React.ReactNode, opts: number | Opts = 512) => {
|
||||
const { width = 512, height = width, mirror, style } =
|
||||
typeof opts === "number" ? ({ width: opts } as Opts) : opts;
|
||||
return (
|
||||
@@ -477,11 +474,6 @@ export const shield = createIcon(
|
||||
{ width: 24 },
|
||||
);
|
||||
|
||||
export const file = createIcon(
|
||||
"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm32-48h224V288l-23.5-23.5c-4.7-4.7-12.3-4.7-17 0L176 352l-39.5-39.5c-4.7-4.7-12.3-4.7-17 0L80 352v64zm48-240c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48z",
|
||||
{ width: 384, height: 512 },
|
||||
);
|
||||
|
||||
export const GroupIcon = React.memo(({ theme }: { theme: "light" | "dark" }) =>
|
||||
createIcon(
|
||||
<>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { FontFamily } from "./element/types";
|
||||
import cssVariables from "./css/variables.module.scss";
|
||||
import { AppProps } from "./types";
|
||||
import { FontFamilyValues } from "./element/types";
|
||||
|
||||
export const APP_NAME = "Excalidraw";
|
||||
|
||||
@@ -63,15 +63,15 @@ export const CLASSES = {
|
||||
|
||||
// 1-based in case we ever do `if(element.fontFamily)`
|
||||
export const FONT_FAMILY = {
|
||||
Virgil: 1,
|
||||
Helvetica: 2,
|
||||
Cascadia: 3,
|
||||
};
|
||||
1: "Virgil",
|
||||
2: "Helvetica",
|
||||
3: "Cascadia",
|
||||
} as const;
|
||||
|
||||
export const WINDOWS_EMOJI_FALLBACK_FONT = "Segoe UI Emoji";
|
||||
|
||||
export const DEFAULT_FONT_SIZE = 20;
|
||||
export const DEFAULT_FONT_FAMILY: FontFamilyValues = FONT_FAMILY.Virgil;
|
||||
export const DEFAULT_FONT_FAMILY: FontFamily = 1;
|
||||
export const DEFAULT_TEXT_ALIGN = "left";
|
||||
export const DEFAULT_VERTICAL_ALIGN = "top";
|
||||
export const DEFAULT_VERSION = "{version}";
|
||||
@@ -97,10 +97,6 @@ export const STORAGE_KEYS = {
|
||||
LOCAL_STORAGE_LIBRARY: "excalidraw-library",
|
||||
} as const;
|
||||
|
||||
export const IDB_KEYS = {
|
||||
fileHandle: "fileHandle",
|
||||
} as const;
|
||||
|
||||
// time in milliseconds
|
||||
export const TAP_TWICE_TIMEOUT = 300;
|
||||
export const TOUCH_CTX_MENU_TIMEOUT = 500;
|
||||
@@ -135,11 +131,11 @@ export const DEFAULT_UI_OPTIONS: AppProps["UIOptions"] = {
|
||||
canvasActions: {
|
||||
changeViewBackgroundColor: true,
|
||||
clearCanvas: true,
|
||||
export: { saveFileToDisk: true },
|
||||
export: true,
|
||||
loadScene: true,
|
||||
saveToActiveFile: true,
|
||||
saveAsScene: true,
|
||||
saveScene: true,
|
||||
theme: true,
|
||||
saveAsImage: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -148,6 +144,3 @@ export const MQ_MAX_WIDTH_LANDSCAPE = 1000;
|
||||
export const MQ_MAX_HEIGHT_LANDSCAPE = 500;
|
||||
|
||||
export const MAX_DECIMALS_FOR_SVG_EXPORT = 2;
|
||||
|
||||
export const EXPORT_SCALES = [1, 2, 3];
|
||||
export const DEFAULT_EXPORT_PADDING = 10; // px
|
||||
|
||||
@@ -51,12 +51,11 @@
|
||||
image-rendering: -moz-crisp-edges; // FF
|
||||
|
||||
z-index: var(--zIndex-canvas);
|
||||
|
||||
// Remove the main canvas from document flow to avoid resizeObserver
|
||||
// feedback loop (see https://github.com/excalidraw/excalidraw/pull/3379)
|
||||
}
|
||||
|
||||
&__canvas {
|
||||
#canvas {
|
||||
// Remove the main canvas from document flow to avoid resizeObserver
|
||||
// feedback loop (see https://github.com/excalidraw/excalidraw/pull/3379)
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ import {
|
||||
copyBlobToClipboardAsPng,
|
||||
copyTextToSystemClipboard,
|
||||
} from "../clipboard";
|
||||
import { DEFAULT_EXPORT_PADDING } from "../constants";
|
||||
import { NonDeletedExcalidrawElement } from "../element/types";
|
||||
import { t } from "../i18n";
|
||||
import { exportToCanvas, exportToSvg } from "../scene/export";
|
||||
@@ -21,14 +20,16 @@ export const exportCanvas = async (
|
||||
appState: AppState,
|
||||
{
|
||||
exportBackground,
|
||||
exportPadding = DEFAULT_EXPORT_PADDING,
|
||||
exportPadding = 10,
|
||||
viewBackgroundColor,
|
||||
name,
|
||||
scale = 1,
|
||||
}: {
|
||||
exportBackground: boolean;
|
||||
exportPadding?: number;
|
||||
viewBackgroundColor: string;
|
||||
name: string;
|
||||
scale?: number;
|
||||
},
|
||||
) => {
|
||||
if (elements.length === 0) {
|
||||
@@ -40,7 +41,7 @@ export const exportCanvas = async (
|
||||
exportWithDarkMode: appState.exportWithDarkMode,
|
||||
viewBackgroundColor,
|
||||
exportPadding,
|
||||
exportScale: appState.exportScale,
|
||||
scale,
|
||||
metadata:
|
||||
appState.exportEmbedScene && type === "svg"
|
||||
? await (
|
||||
@@ -66,6 +67,7 @@ export const exportCanvas = async (
|
||||
exportBackground,
|
||||
viewBackgroundColor,
|
||||
exportPadding,
|
||||
scale,
|
||||
});
|
||||
tempCanvas.style.display = "none";
|
||||
document.body.appendChild(tempCanvas);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { fileOpen, fileSave, FileSystemHandle } from "browser-fs-access";
|
||||
import { fileOpen, fileSave } from "browser-fs-access";
|
||||
import { cleanAppStateForExport } from "../appState";
|
||||
import { EXPORT_DATA_TYPES, EXPORT_SOURCE, MIME_TYPES } from "../constants";
|
||||
import { clearElementsForExport } from "../element";
|
||||
@@ -12,7 +12,6 @@ import {
|
||||
ExportedLibraryData,
|
||||
} from "./types";
|
||||
import Library from "./library";
|
||||
import { AbortError } from "../errors";
|
||||
|
||||
export const serializeAsJSON = (
|
||||
elements: readonly ExcalidrawElement[],
|
||||
@@ -29,26 +28,6 @@ export const serializeAsJSON = (
|
||||
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 (
|
||||
elements: readonly ExcalidrawElement[],
|
||||
appState: AppState,
|
||||
@@ -58,12 +37,6 @@ export const saveAsJSON = async (
|
||||
type: MIME_TYPES.excalidraw,
|
||||
});
|
||||
|
||||
if (appState.fileHandle) {
|
||||
if (!(await verifyPermission(appState.fileHandle))) {
|
||||
throw new AbortError();
|
||||
}
|
||||
}
|
||||
|
||||
const fileHandle = await fileSave(
|
||||
blob,
|
||||
{
|
||||
|
||||
@@ -2,7 +2,7 @@ import { loadLibraryFromBlob } from "./blob";
|
||||
import { LibraryItems, LibraryItem } from "../types";
|
||||
import { restoreElements } from "./restore";
|
||||
import { getNonDeletedElements } from "../element";
|
||||
import type App from "../components/App";
|
||||
import App from "../components/App";
|
||||
|
||||
class Library {
|
||||
private libraryCache: LibraryItems | null = null;
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
import {
|
||||
ExcalidrawElement,
|
||||
FontFamily,
|
||||
ExcalidrawSelectionElement,
|
||||
FontFamilyValues,
|
||||
} from "../element/types";
|
||||
import { AppState, NormalizedZoomValue } from "../types";
|
||||
import { ImportedDataState } from "./types";
|
||||
import { getNormalizedDimensions, isInvisiblySmallElement } from "../element";
|
||||
import { isInvisiblySmallElement, getNormalizedDimensions } from "../element";
|
||||
import { isLinearElementType } from "../element/typeChecks";
|
||||
import { randomId } from "../random";
|
||||
import {
|
||||
FONT_FAMILY,
|
||||
DEFAULT_FONT_FAMILY,
|
||||
DEFAULT_TEXT_ALIGN,
|
||||
DEFAULT_VERTICAL_ALIGN,
|
||||
FONT_FAMILY,
|
||||
} from "../constants";
|
||||
import { getDefaultAppState } from "../appState";
|
||||
import { LinearElementEditor } from "../element/linearElementEditor";
|
||||
@@ -41,11 +41,11 @@ export type RestoredDataState = {
|
||||
appState: RestoredAppState;
|
||||
};
|
||||
|
||||
const getFontFamilyByName = (fontFamilyName: string): FontFamilyValues => {
|
||||
if (Object.keys(FONT_FAMILY).includes(fontFamilyName)) {
|
||||
return FONT_FAMILY[
|
||||
fontFamilyName as keyof typeof FONT_FAMILY
|
||||
] as FontFamilyValues;
|
||||
const getFontFamilyByName = (fontFamilyName: string): FontFamily => {
|
||||
for (const [id, fontFamilyString] of Object.entries(FONT_FAMILY)) {
|
||||
if (fontFamilyString.includes(fontFamilyName)) {
|
||||
return parseInt(id) as FontFamily;
|
||||
}
|
||||
}
|
||||
return DEFAULT_FONT_FAMILY;
|
||||
};
|
||||
|
||||
@@ -5,7 +5,7 @@ import { mutateElement } from "./mutateElement";
|
||||
import { getPerfectElementSize } from "./sizeHelpers";
|
||||
import Scene from "../scene/Scene";
|
||||
import { NonDeletedExcalidrawElement } from "./types";
|
||||
import { PointerDownState } from "../types";
|
||||
import { PointerDownState } from "../components/App";
|
||||
|
||||
export const dragSelectedElements = (
|
||||
pointerDownState: PointerDownState,
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { duplicateElement } from "./newElement";
|
||||
import { mutateElement } from "./mutateElement";
|
||||
import { API } from "../tests/helpers/api";
|
||||
import { FONT_FAMILY } from "../constants";
|
||||
|
||||
const isPrimitive = (val: any) => {
|
||||
const type = typeof val;
|
||||
@@ -80,7 +79,7 @@ it("clones text element", () => {
|
||||
opacity: 100,
|
||||
text: "hello",
|
||||
fontSize: 20,
|
||||
fontFamily: FONT_FAMILY.Virgil,
|
||||
fontFamily: 1,
|
||||
textAlign: "left",
|
||||
verticalAlign: "top",
|
||||
});
|
||||
|
||||
@@ -5,11 +5,11 @@ import {
|
||||
ExcalidrawGenericElement,
|
||||
NonDeleted,
|
||||
TextAlign,
|
||||
FontFamily,
|
||||
GroupId,
|
||||
VerticalAlign,
|
||||
Arrowhead,
|
||||
ExcalidrawFreeDrawElement,
|
||||
FontFamilyValues,
|
||||
} from "../element/types";
|
||||
import { measureText, getFontString } from "../utils";
|
||||
import { randomInteger, randomId } from "../random";
|
||||
@@ -109,7 +109,7 @@ export const newTextElement = (
|
||||
opts: {
|
||||
text: string;
|
||||
fontSize: number;
|
||||
fontFamily: FontFamilyValues;
|
||||
fontFamily: FontFamily;
|
||||
textAlign: TextAlign;
|
||||
verticalAlign: VerticalAlign;
|
||||
} & ElementConstructorOpts,
|
||||
@@ -307,19 +307,7 @@ export const duplicateElement = <TElement extends Mutable<ExcalidrawElement>>(
|
||||
overrides?: Partial<TElement>,
|
||||
): TElement => {
|
||||
let copy: TElement = deepCopyElement(element);
|
||||
if (process.env.NODE_ENV === "test") {
|
||||
copy.id = `${copy.id}_copy`;
|
||||
// `window.h` may not be defined in some unit tests
|
||||
if (
|
||||
window.h?.app
|
||||
?.getSceneElementsIncludingDeleted()
|
||||
.find((el) => el.id === copy.id)
|
||||
) {
|
||||
copy.id += "_copy";
|
||||
}
|
||||
} else {
|
||||
copy.id = randomId();
|
||||
}
|
||||
copy.id = process.env.NODE_ENV === "test" ? `${copy.id}_copy` : randomId();
|
||||
copy.seed = randomInteger();
|
||||
copy.groupIds = getNewGroupIdsForDuplication(
|
||||
copy.groupIds,
|
||||
|
||||
@@ -32,7 +32,8 @@ import {
|
||||
MaybeTransformHandleType,
|
||||
TransformHandleDirection,
|
||||
} from "./transformHandles";
|
||||
import { Point, PointerDownState } from "../types";
|
||||
import { PointerDownState } from "../components/App";
|
||||
import { Point } from "../types";
|
||||
|
||||
export const normalizeAngle = (angle: number): number => {
|
||||
if (angle >= 2 * Math.PI) {
|
||||
|
||||
@@ -16,7 +16,7 @@ describe("textWysiwyg", () => {
|
||||
|
||||
const element = UI.createElement("text");
|
||||
|
||||
new Pointer("mouse").clickOn(element);
|
||||
new Pointer("mouse").doubleClickOn(element);
|
||||
textarea = document.querySelector(
|
||||
".excalidraw-textEditorContainer > textarea",
|
||||
)!;
|
||||
|
||||
@@ -368,4 +368,6 @@ export const textWysiwyg = ({
|
||||
excalidrawContainer
|
||||
?.querySelector(".excalidraw-textEditorContainer")!
|
||||
.appendChild(editable);
|
||||
|
||||
return { handleSubmit };
|
||||
};
|
||||
|
||||
@@ -3,8 +3,7 @@ import { FONT_FAMILY } from "../constants";
|
||||
|
||||
export type ChartType = "bar" | "line";
|
||||
export type FillStyle = "hachure" | "cross-hatch" | "solid";
|
||||
export type FontFamilyKeys = keyof typeof FONT_FAMILY;
|
||||
export type FontFamilyValues = typeof FONT_FAMILY[FontFamilyKeys];
|
||||
export type FontFamily = keyof typeof FONT_FAMILY;
|
||||
export type FontString = string & { _brand: "fontString" };
|
||||
export type GroupId = string;
|
||||
export type PointerType = "mouse" | "pen" | "touch";
|
||||
@@ -92,7 +91,7 @@ export type ExcalidrawTextElement = _ExcalidrawElementBase &
|
||||
Readonly<{
|
||||
type: "text";
|
||||
fontSize: number;
|
||||
fontFamily: FontFamilyValues;
|
||||
fontFamily: FontFamily;
|
||||
text: string;
|
||||
baseline: number;
|
||||
textAlign: TextAlign;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
type CANVAS_ERROR_NAMES = "CANVAS_ERROR" | "CANVAS_POSSIBLY_TOO_BIG";
|
||||
|
||||
export class CanvasError extends Error {
|
||||
constructor(
|
||||
message: string = "Couldn't export canvas.",
|
||||
@@ -10,11 +9,3 @@ export class CanvasError extends Error {
|
||||
this.message = message;
|
||||
}
|
||||
}
|
||||
|
||||
export class AbortError extends Error {
|
||||
constructor(message: string = "Request aborted") {
|
||||
super();
|
||||
this.name = "AbortError";
|
||||
this.message = message;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import throttle from "lodash.throttle";
|
||||
import React, { PureComponent } from "react";
|
||||
import { ExcalidrawImperativeAPI } from "../../types";
|
||||
import { ExcalidrawImperativeAPI } from "../../components/App";
|
||||
import { ErrorDialog } from "../../components/ErrorDialog";
|
||||
import { APP_NAME, ENV, EVENT } from "../../constants";
|
||||
import { ImportedDataState } from "../../data/types";
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
import React from "react";
|
||||
import { Card } from "../../components/Card";
|
||||
import { ToolButton } from "../../components/ToolButton";
|
||||
import { serializeAsJSON } from "../../data/json";
|
||||
import { getImportedKey, createIV, generateEncryptionKey } from "../data";
|
||||
import { loadFirebaseStorage } from "../data/firebase";
|
||||
import { NonDeletedExcalidrawElement } from "../../element/types";
|
||||
import { AppState } from "../../types";
|
||||
import { nanoid } from "nanoid";
|
||||
import { t } from "../../i18n";
|
||||
import { excalidrawPlusIcon } from "./icons";
|
||||
|
||||
const encryptData = async (
|
||||
key: string,
|
||||
json: string,
|
||||
): Promise<{ blob: Blob; iv: Uint8Array }> => {
|
||||
const importedKey = await getImportedKey(key, "encrypt");
|
||||
const iv = createIV();
|
||||
const encoded = new TextEncoder().encode(json);
|
||||
const ciphertext = await window.crypto.subtle.encrypt(
|
||||
{
|
||||
name: "AES-GCM",
|
||||
iv,
|
||||
},
|
||||
importedKey,
|
||||
encoded,
|
||||
);
|
||||
|
||||
return { blob: new Blob([new Uint8Array(ciphertext)]), iv };
|
||||
};
|
||||
|
||||
const exportToExcalidrawPlus = async (
|
||||
elements: readonly NonDeletedExcalidrawElement[],
|
||||
appState: AppState,
|
||||
) => {
|
||||
const firebase = await loadFirebaseStorage();
|
||||
|
||||
const id = `${nanoid(12)}`;
|
||||
|
||||
const key = (await generateEncryptionKey())!;
|
||||
const encryptedData = await encryptData(
|
||||
key,
|
||||
serializeAsJSON(elements, appState),
|
||||
);
|
||||
|
||||
const blob = new Blob([encryptedData.iv, encryptedData.blob], {
|
||||
type: "application/octet-stream",
|
||||
});
|
||||
|
||||
await firebase
|
||||
.storage()
|
||||
.ref(`/migrations/scenes/${id}`)
|
||||
.put(blob, {
|
||||
customMetadata: {
|
||||
data: JSON.stringify({ version: 1, name: appState.name }),
|
||||
created: Date.now().toString(),
|
||||
},
|
||||
});
|
||||
|
||||
window.open(`https://plus.excalidraw.com/import?excalidraw=${id},${key}`);
|
||||
};
|
||||
|
||||
export const ExportToExcalidrawPlus: React.FC<{
|
||||
elements: readonly NonDeletedExcalidrawElement[];
|
||||
appState: AppState;
|
||||
onError: (error: Error) => void;
|
||||
}> = ({ elements, appState, onError }) => {
|
||||
return (
|
||||
<Card color="indigo">
|
||||
<div className="Card-icon">{excalidrawPlusIcon}</div>
|
||||
<h2>Excalidraw+</h2>
|
||||
<div className="Card-details">
|
||||
{t("exportDialog.excalidrawplus_description")}
|
||||
</div>
|
||||
<ToolButton
|
||||
className="Card-button"
|
||||
type="button"
|
||||
title={t("exportDialog.excalidrawplus_button")}
|
||||
aria-label={t("exportDialog.excalidrawplus_button")}
|
||||
showAriaLabel={true}
|
||||
onClick={async () => {
|
||||
try {
|
||||
await exportToExcalidrawPlus(elements, appState);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
onError(new Error(t("exportDialog.excalidrawplus_exportError")));
|
||||
}
|
||||
}}
|
||||
/>
|
||||
</Card>
|
||||
);
|
||||
};
|
||||
File diff suppressed because one or more lines are too long
@@ -5,19 +5,15 @@ import { getSceneVersion } from "../../element";
|
||||
import Portal from "../collab/Portal";
|
||||
import { restoreElements } from "../../data/restore";
|
||||
|
||||
// private
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
let firebasePromise: Promise<
|
||||
typeof import("firebase/app").default
|
||||
> | null = null;
|
||||
let firestorePromise: Promise<any> | null = null;
|
||||
let firebseStoragePromise: Promise<any> | null = null;
|
||||
|
||||
const _loadFirebase = async () => {
|
||||
const loadFirebase = async () => {
|
||||
const firebase = (
|
||||
await import(/* webpackChunkName: "firebase" */ "firebase/app")
|
||||
).default;
|
||||
await import(/* webpackChunkName: "firestore" */ "firebase/firestore");
|
||||
|
||||
const firebaseConfig = JSON.parse(process.env.REACT_APP_FIREBASE_CONFIG);
|
||||
firebase.initializeApp(firebaseConfig);
|
||||
@@ -25,37 +21,13 @@ const _loadFirebase = async () => {
|
||||
return firebase;
|
||||
};
|
||||
|
||||
const _getFirebase = async (): Promise<
|
||||
const getFirebase = async (): Promise<
|
||||
typeof import("firebase/app").default
|
||||
> => {
|
||||
if (!firebasePromise) {
|
||||
firebasePromise = _loadFirebase();
|
||||
firebasePromise = loadFirebase();
|
||||
}
|
||||
return firebasePromise;
|
||||
};
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
const loadFirestore = async () => {
|
||||
const firebase = await _getFirebase();
|
||||
if (!firestorePromise) {
|
||||
firestorePromise = import(
|
||||
/* webpackChunkName: "firestore" */ "firebase/firestore"
|
||||
);
|
||||
await firestorePromise;
|
||||
}
|
||||
return firebase;
|
||||
};
|
||||
|
||||
export const loadFirebaseStorage = async () => {
|
||||
const firebase = await _getFirebase();
|
||||
if (!firebseStoragePromise) {
|
||||
firebseStoragePromise = import(
|
||||
/* webpackChunkName: "storage" */ "firebase/storage"
|
||||
);
|
||||
await firebseStoragePromise;
|
||||
}
|
||||
return firebase;
|
||||
return await firebasePromise!;
|
||||
};
|
||||
|
||||
interface FirebaseStoredScene {
|
||||
@@ -136,7 +108,7 @@ export const saveToFirebase = async (
|
||||
return true;
|
||||
}
|
||||
|
||||
const firebase = await loadFirestore();
|
||||
const firebase = await getFirebase();
|
||||
const sceneVersion = getSceneVersion(elements);
|
||||
const { ciphertext, iv } = await encryptElements(roomKey, elements);
|
||||
|
||||
@@ -178,7 +150,7 @@ export const loadFromFirebase = async (
|
||||
roomKey: string,
|
||||
socket: SocketIOClient.Socket | null,
|
||||
): Promise<readonly ExcalidrawElement[] | null> => {
|
||||
const firebase = await loadFirestore();
|
||||
const firebase = await getFirebase();
|
||||
const db = firebase.firestore();
|
||||
|
||||
const docRef = db.collection("scenes").doc(roomId);
|
||||
|
||||
@@ -17,7 +17,7 @@ const generateRandomID = async () => {
|
||||
return Array.from(arr, byteToHex).join("");
|
||||
};
|
||||
|
||||
export const generateEncryptionKey = async () => {
|
||||
const generateEncryptionKey = async () => {
|
||||
const key = await window.crypto.subtle.generateKey(
|
||||
{
|
||||
name: "AES-GCM",
|
||||
@@ -176,7 +176,7 @@ export const getImportedKey = (key: string, usage: KeyUsage) =>
|
||||
[usage],
|
||||
);
|
||||
|
||||
export const decryptImported = async (
|
||||
const decryptImported = async (
|
||||
iv: ArrayBuffer,
|
||||
encrypted: ArrayBuffer,
|
||||
privateKey: string,
|
||||
|
||||
@@ -8,6 +8,7 @@ import React, {
|
||||
} from "react";
|
||||
import { trackEvent } from "../analytics";
|
||||
import { getDefaultAppState } from "../appState";
|
||||
import { ExcalidrawImperativeAPI } from "../components/App";
|
||||
import { ErrorDialog } from "../components/ErrorDialog";
|
||||
import { TopErrorBoundary } from "../components/TopErrorBoundary";
|
||||
import {
|
||||
@@ -30,7 +31,7 @@ import Excalidraw, {
|
||||
defaultLang,
|
||||
languages,
|
||||
} from "../packages/excalidraw/index";
|
||||
import { AppState, LibraryItems, ExcalidrawImperativeAPI } from "../types";
|
||||
import { AppState, LibraryItems } from "../types";
|
||||
import {
|
||||
debounce,
|
||||
getVersion,
|
||||
@@ -55,7 +56,6 @@ import { Tooltip } from "../components/Tooltip";
|
||||
import { shield } from "../components/icons";
|
||||
|
||||
import "./index.scss";
|
||||
import { ExportToExcalidrawPlus } from "./components/ExportToExcalidrawPlus";
|
||||
|
||||
const languageDetector = new LanguageDetector();
|
||||
languageDetector.init({
|
||||
@@ -424,28 +424,7 @@ const ExcalidrawWrapper = () => {
|
||||
onCollabButtonClick={collabAPI?.onCollabButtonClick}
|
||||
isCollaborating={collabAPI?.isCollaborating()}
|
||||
onPointerUpdate={collabAPI?.onPointerUpdate}
|
||||
UIOptions={{
|
||||
canvasActions: {
|
||||
export: {
|
||||
onExportToBackend,
|
||||
renderCustomUI: (elements, appState) => {
|
||||
return (
|
||||
<ExportToExcalidrawPlus
|
||||
elements={elements}
|
||||
appState={appState}
|
||||
onError={(error) => {
|
||||
excalidrawAPI?.updateScene({
|
||||
appState: {
|
||||
errorMessage: error.message,
|
||||
},
|
||||
});
|
||||
}}
|
||||
/>
|
||||
);
|
||||
},
|
||||
},
|
||||
},
|
||||
}}
|
||||
onExportToBackend={onExportToBackend}
|
||||
renderTopRightUI={renderTopRightUI}
|
||||
renderFooter={renderFooter}
|
||||
langCode={langCode}
|
||||
@@ -453,7 +432,6 @@ const ExcalidrawWrapper = () => {
|
||||
detectScroll={false}
|
||||
handleKeyboardGlobally={true}
|
||||
onLibraryChange={onLibraryChange}
|
||||
autoFocus={true}
|
||||
/>
|
||||
{excalidrawAPI && <CollabWrapper excalidrawAPI={excalidrawAPI} />}
|
||||
{errorMessage && (
|
||||
|
||||
@@ -21,7 +21,6 @@ interface DehydratedHistoryEntry {
|
||||
const clearAppStatePropertiesForHistory = (appState: AppState) => {
|
||||
return {
|
||||
selectedElementIds: appState.selectedElementIds,
|
||||
selectedGroupIds: appState.selectedGroupIds,
|
||||
viewBackgroundColor: appState.viewBackgroundColor,
|
||||
editingLinearElement: appState.editingLinearElement,
|
||||
editingGroupId: appState.editingGroupId,
|
||||
@@ -170,7 +169,7 @@ class History {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (key === "selectedElementIds" || key === "selectedGroupIds") {
|
||||
if (key === "selectedElementIds") {
|
||||
continue;
|
||||
}
|
||||
if (nextEntry.appState[key] !== lastEntry.appState[key]) {
|
||||
|
||||
@@ -48,7 +48,6 @@ const allLanguages: Language[] = [
|
||||
{ code: "zh-CN", label: "简体中文" },
|
||||
{ code: "zh-TW", label: "繁體中文" },
|
||||
{ code: "lv-LV", label: "Latviešu" },
|
||||
{ code: "cs-CZ", label: "Česky" },
|
||||
].concat([defaultLang]);
|
||||
|
||||
export const languages: Language[] = allLanguages
|
||||
|
||||
@@ -69,6 +69,7 @@ const canvas = exportToCanvas(
|
||||
{
|
||||
exportBackground: true,
|
||||
viewBackgroundColor: "#ffffff",
|
||||
scale: 1,
|
||||
},
|
||||
createCanvas,
|
||||
);
|
||||
|
||||
@@ -44,7 +44,6 @@ export const KEYS = {
|
||||
A: "a",
|
||||
D: "d",
|
||||
E: "e",
|
||||
G: "g",
|
||||
L: "l",
|
||||
O: "o",
|
||||
P: "p",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "الخلفية",
|
||||
"fill": "التعبئة",
|
||||
"strokeWidth": "حجم الحدود",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "نمط الحدود",
|
||||
"strokeStyle_solid": "صلبة",
|
||||
"strokeStyle_dashed": "متقطع",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "حجم الخط",
|
||||
"fontFamily": "نوع الخط",
|
||||
"onlySelected": "المحدد فقط",
|
||||
"withBackground": "الخلفية",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "مع الخلفية",
|
||||
"exportEmbedScene": "تضمين المشهد في ملف التصدير",
|
||||
"exportEmbedScene_details": "سيتم حفظ بيانات المشهد في ملف PNG/SVG المصدّر بحيث يمكن استعادة المشهد منه.\nسيزيد حجم الملف المصدر.",
|
||||
"addWatermark": "إضافة \"مصنوعة بواسطة Excalidraw\"",
|
||||
"handDrawn": "رسم باليد",
|
||||
@@ -65,7 +61,7 @@
|
||||
"architect": "معماري",
|
||||
"artist": "رسام",
|
||||
"cartoonist": "كرتوني",
|
||||
"fileTitle": "إسم الملف",
|
||||
"fileTitle": "",
|
||||
"colorPicker": "اختيار الألوان",
|
||||
"canvasBackground": "خلفية اللوحة",
|
||||
"drawingCanvas": "لوحة الرسم",
|
||||
@@ -96,26 +92,21 @@
|
||||
"centerHorizontally": "توسيط أفقي",
|
||||
"distributeHorizontally": "التوزيع الأفقي",
|
||||
"distributeVertically": "التوزيع عمودياً",
|
||||
"flipHorizontal": "قلب عامودي",
|
||||
"flipVertical": "قلب أفقي",
|
||||
"flipHorizontal": "",
|
||||
"flipVertical": "",
|
||||
"viewMode": "نمط العرض",
|
||||
"toggleExportColorScheme": "",
|
||||
"share": "مشاركة",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": "غير النمط"
|
||||
"share": "مشاركة"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "إعادة تعيين اللوحة",
|
||||
"exportJSON": "صدر الملف",
|
||||
"exportImage": "إحفظ كصورة",
|
||||
"export": "تصدير",
|
||||
"exportToPng": "تصدير بصيغة PNG",
|
||||
"exportToSvg": "تصدير بصيغة SVG",
|
||||
"copyToClipboard": "نسخ إلى الحافظة",
|
||||
"copyPngToClipboard": "نسخ الـ PNG إلى الحافظة",
|
||||
"scale": "مقاس",
|
||||
"save": "احفظ للملف الحالي",
|
||||
"save": "حفظ",
|
||||
"saveAs": "حفظ كـ",
|
||||
"load": "تحميل",
|
||||
"getShareableLink": "احصل على رابط المشاركة",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "تحديد",
|
||||
"freedraw": "الكتابة الحرة",
|
||||
"rectangle": "مستطيل",
|
||||
"diamond": "مضلع",
|
||||
"ellipse": "دائرة",
|
||||
"arrow": "سهم",
|
||||
"line": "خط",
|
||||
"freedraw": "",
|
||||
"text": "نص",
|
||||
"library": "مكتبة",
|
||||
"lock": "الحفاظ على أداة التحديد نشطة بعد الرسم"
|
||||
@@ -219,41 +210,30 @@
|
||||
"errorDialog": {
|
||||
"title": "خطأ"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "حفظ الملف للجهاز",
|
||||
"disk_details": "",
|
||||
"disk_button": "إحفظ لملف",
|
||||
"link_title": "رابط قابل للمشاركة",
|
||||
"link_details": "صدر الملف للمشاهدة فقط.",
|
||||
"link_button": "التصدير كرابط",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "اقرأ مدونتنا",
|
||||
"click": "انقر",
|
||||
"curvedArrow": "سهم مائل",
|
||||
"curvedLine": "خط مائل",
|
||||
"documentation": "دليل الاستخدام",
|
||||
"blog": "",
|
||||
"click": "",
|
||||
"curvedArrow": "",
|
||||
"curvedLine": "",
|
||||
"documentation": "",
|
||||
"drag": "اسحب",
|
||||
"editor": "المحرر",
|
||||
"github": "عثرت على مشكلة؟ إرسال",
|
||||
"howto": "اتبع التعليمات",
|
||||
"or": "أو",
|
||||
"preventBinding": "منع ارتبط السهم",
|
||||
"shapes": "أشكال",
|
||||
"shortcuts": "اختصارات لوحة المفاتيح",
|
||||
"textFinish": "الانتهاء من التحرير (نص)",
|
||||
"textNewLine": "اضف سطر جديد (نص)",
|
||||
"title": "المساعدة",
|
||||
"view": "عرض",
|
||||
"zoomToFit": "تكبير للملائمة",
|
||||
"zoomToSelection": "تكبير للعنصر المحدد"
|
||||
"howto": "",
|
||||
"or": "",
|
||||
"preventBinding": "",
|
||||
"shapes": "",
|
||||
"shortcuts": "",
|
||||
"textFinish": "",
|
||||
"textNewLine": "",
|
||||
"title": "",
|
||||
"view": "",
|
||||
"zoomToFit": "",
|
||||
"zoomToSelection": ""
|
||||
},
|
||||
"encrypted": {
|
||||
"tooltip": "رسوماتك مشفرة من النهاية إلى النهاية حتى أن خوادم Excalidraw لن تراها أبدا.",
|
||||
"link": "مشاركة المدونة في التشفير من النهاية إلى النهاية في Excalidraw"
|
||||
"link": ""
|
||||
},
|
||||
"stats": {
|
||||
"angle": "الزاوية",
|
||||
@@ -265,18 +245,18 @@
|
||||
"storage": "التخزين",
|
||||
"title": "إحصائيات للمهووسين",
|
||||
"total": "المجموع",
|
||||
"version": "الإصدار",
|
||||
"versionCopy": "انقر للنسخ",
|
||||
"versionNotAvailable": "الإصدار غير متوفر",
|
||||
"version": "",
|
||||
"versionCopy": "",
|
||||
"versionNotAvailable": "",
|
||||
"width": "العرض"
|
||||
},
|
||||
"toast": {
|
||||
"copyStyles": "نسخ النمط.",
|
||||
"copyToClipboard": "نسخ إلى الحافظة.",
|
||||
"copyToClipboardAsPng": "تم نسخ {{exportSelection}} إلى الحافظة بصيغةPNG\n({{exportColorScheme}})",
|
||||
"fileSaved": "تم حفظ الملف.",
|
||||
"fileSavedToFilename": "حفظ باسم {filename}",
|
||||
"canvas": "لوحة الرسم",
|
||||
"selection": "العنصر المحدد"
|
||||
"copyStyles": "",
|
||||
"copyToClipboard": "",
|
||||
"copyToClipboardAsPng": "",
|
||||
"fileSaved": "",
|
||||
"fileSavedToFilename": "",
|
||||
"canvas": "",
|
||||
"selection": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Фон",
|
||||
"fill": "Наситеност",
|
||||
"strokeWidth": "Ширина на щриха",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "Стил на линия",
|
||||
"strokeStyle_solid": "Плътен",
|
||||
"strokeStyle_dashed": "Пунктир",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Размер на шрифта",
|
||||
"fontFamily": "Семейство шрифтове",
|
||||
"onlySelected": "Само избраното",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "С фон",
|
||||
"exportEmbedScene": "Вгради сцената във файл",
|
||||
"exportEmbedScene_details": "Данните от сцената ще бъдат екпортирани в PNG/SVG файл, за да може сцената да бъде възстановена от него.\nТова ще увеличи размера на файла.",
|
||||
"addWatermark": "Добави \"Направено с Excalidraw\"",
|
||||
"handDrawn": "Нарисувано на ръка",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "",
|
||||
"viewMode": "Изглед",
|
||||
"toggleExportColorScheme": "",
|
||||
"share": "",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": ""
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Нулиране на платно",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "Експортиране",
|
||||
"exportToPng": "Изнасяне в PNG",
|
||||
"exportToSvg": "Изнасяне в SVG",
|
||||
"copyToClipboard": "Копиране в клипборда",
|
||||
"copyPngToClipboard": "Копирай PNG в клипборда",
|
||||
"scale": "Мащаб",
|
||||
"save": "",
|
||||
"save": "Запази",
|
||||
"saveAs": "Запиши като",
|
||||
"load": "Зареждане",
|
||||
"getShareableLink": "Получаване на връзка за споделяне",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Селекция",
|
||||
"freedraw": "Рисуване",
|
||||
"rectangle": "Правоъгълник",
|
||||
"diamond": "Диамант",
|
||||
"ellipse": "Елипс",
|
||||
"arrow": "Стрелка",
|
||||
"line": "Линия",
|
||||
"freedraw": "",
|
||||
"text": "Текст",
|
||||
"library": "Библиотека",
|
||||
"lock": "Поддържайте избрания инструмент активен след рисуване"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Грешка"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Прочетете нашия блог",
|
||||
"click": "клик",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Color del fons",
|
||||
"fill": "Estil del fons",
|
||||
"strokeWidth": "Amplada del traç",
|
||||
"strokeShape": "Estil del traç",
|
||||
"strokeShape_gel": "Bolígraf de gel",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "Estil del traç",
|
||||
"strokeStyle_solid": "Sòlid",
|
||||
"strokeStyle_dashed": "Guions",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Mida de lletra",
|
||||
"fontFamily": "Tipus de lletra",
|
||||
"onlySelected": "Només seleccionats",
|
||||
"withBackground": "Fons",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "Amb fons",
|
||||
"exportEmbedScene": "Incrustar escena al fitxer exportat",
|
||||
"exportEmbedScene_details": "Les dades de l’escena es desaran al fitxer PNG/SVG de manera que es pugui restaurar l’escena.\nAugmentarà la mida del fitxer exportat.",
|
||||
"addWatermark": "Afegir \"Fet amb Excalidraw\"",
|
||||
"handDrawn": "Dibuixat a mà",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Capgira verticalment",
|
||||
"viewMode": "Mode de visualització",
|
||||
"toggleExportColorScheme": "Canvia l'esquema de colors de l'exportació",
|
||||
"share": "Compartir",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": "Compartir"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Netejar el llenç",
|
||||
"exportJSON": "Exporta a un fitxer",
|
||||
"exportImage": "Desa com a imatge",
|
||||
"export": "Exportar",
|
||||
"exportToPng": "Exportar a PNG",
|
||||
"exportToSvg": "Exportar a SNG",
|
||||
"copyToClipboard": "Copiar al porta-retalls",
|
||||
"copyPngToClipboard": "Copiar PNG al porta-retalls",
|
||||
"scale": "Escala",
|
||||
"save": "Desa al fitxer actual",
|
||||
"save": "Desar",
|
||||
"saveAs": "Desar com",
|
||||
"load": "Carregar",
|
||||
"getShareableLink": "Obtenir enllaç per compartir",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Selecció",
|
||||
"freedraw": "Dibuix lliure",
|
||||
"rectangle": "Rectangle",
|
||||
"diamond": "Rombe",
|
||||
"ellipse": "El·lipse",
|
||||
"arrow": "Fletxa",
|
||||
"line": "Línia",
|
||||
"freedraw": "Dibuix",
|
||||
"text": "Text",
|
||||
"library": "Biblioteca",
|
||||
"lock": "Mantenir activa l'eina seleccionada desprès de dibuixar"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Error"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Desa la disc",
|
||||
"disk_details": "",
|
||||
"disk_button": "Desa en un fitxer",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "Exporta",
|
||||
"excalidrawplus_exportError": "No és possible exportar a Excalidraw+ ara mateix..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Llegiu el nostre blog",
|
||||
"click": "clic",
|
||||
|
||||
@@ -1,282 +0,0 @@
|
||||
{
|
||||
"labels": {
|
||||
"paste": "Vložit",
|
||||
"pasteCharts": "Vložit grafy",
|
||||
"selectAll": "Vybrat vše",
|
||||
"multiSelect": "Přidat prvek do výběru",
|
||||
"moveCanvas": "Posunout plátno",
|
||||
"cut": "Vyjmout",
|
||||
"copy": "Kopírovat",
|
||||
"copyAsPng": "Zkopírovat do schránky jako PNG",
|
||||
"copyAsSvg": "Zkopírovat do schránky jako SVG",
|
||||
"bringForward": "Přenést blíž",
|
||||
"sendToBack": "Přenést do pozadí",
|
||||
"bringToFront": "Přenést do popředí",
|
||||
"sendBackward": "Přenést dál",
|
||||
"delete": "Smazat",
|
||||
"copyStyles": "Kopírovat styly",
|
||||
"pasteStyles": "Vložit styly",
|
||||
"stroke": "Obrys",
|
||||
"background": "Pozadí",
|
||||
"fill": "Výplň",
|
||||
"strokeWidth": "Šířka obrysu",
|
||||
"strokeShape": "Tvar tahu",
|
||||
"strokeShape_gel": "Gelové pero",
|
||||
"strokeShape_fountain": "Plnicí pero",
|
||||
"strokeShape_brush": "Fixa",
|
||||
"strokeStyle": "Styl tahu",
|
||||
"strokeStyle_solid": "Plný",
|
||||
"strokeStyle_dashed": "Čárkovaný",
|
||||
"strokeStyle_dotted": "Tečkovaný",
|
||||
"sloppiness": "Stylizace",
|
||||
"opacity": "Průhlednost",
|
||||
"textAlign": "Zarovnání textu",
|
||||
"edges": "Hrany",
|
||||
"sharp": "Ostré",
|
||||
"round": "Zaoblené",
|
||||
"arrowheads": "Styl šipky",
|
||||
"arrowhead_none": "Žádný",
|
||||
"arrowhead_arrow": "Šipka",
|
||||
"arrowhead_bar": "Kóta",
|
||||
"arrowhead_dot": "Tečka",
|
||||
"fontSize": "Velikost písma",
|
||||
"fontFamily": "Písmo",
|
||||
"onlySelected": "Pouze vybrané",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"exportEmbedScene_details": "",
|
||||
"addWatermark": "",
|
||||
"handDrawn": "Od ruky",
|
||||
"normal": "Normální",
|
||||
"code": "Kód",
|
||||
"small": "Malé",
|
||||
"medium": "Střední",
|
||||
"large": "Velké",
|
||||
"veryLarge": "Velmi velké",
|
||||
"solid": "",
|
||||
"hachure": "",
|
||||
"crossHatch": "",
|
||||
"thin": "",
|
||||
"bold": "",
|
||||
"left": "",
|
||||
"center": "",
|
||||
"right": "",
|
||||
"extraBold": "",
|
||||
"architect": "",
|
||||
"artist": "",
|
||||
"cartoonist": "",
|
||||
"fileTitle": "",
|
||||
"colorPicker": "",
|
||||
"canvasBackground": "Pozadí plátna",
|
||||
"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": "Náhled",
|
||||
"toggleExportColorScheme": "",
|
||||
"share": "Sdílet",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": "Přepnout tmavý řežim"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "Exportovat",
|
||||
"exportToPng": "Exportovat do PNG",
|
||||
"exportToSvg": "Exportovat do SVG",
|
||||
"copyToClipboard": "Kopírovat do schránky",
|
||||
"copyPngToClipboard": "Kopírovat PNG do schránky",
|
||||
"scale": "Měřítko",
|
||||
"save": "",
|
||||
"saveAs": "Uložit jako",
|
||||
"load": "Nahrát",
|
||||
"getShareableLink": "Získat odkaz pro sdílení",
|
||||
"close": "Zavřít",
|
||||
"selectLanguage": "Zvolit jazyk",
|
||||
"scrollBackToContent": "",
|
||||
"zoomIn": "Přiblížit",
|
||||
"zoomOut": "Oddálit",
|
||||
"resetZoom": "Resetovat přiblížení",
|
||||
"menu": "Menu",
|
||||
"done": "Hotovo",
|
||||
"edit": "Upravit",
|
||||
"undo": "Zpět",
|
||||
"redo": "Znovu",
|
||||
"resetLibrary": "",
|
||||
"createNewRoom": "Vytvořit novou místnost",
|
||||
"fullScreen": "Celá obrazovka",
|
||||
"darkMode": "Tmavý režim",
|
||||
"lightMode": "Světlý režim",
|
||||
"zenMode": "Zen mód",
|
||||
"exitZenMode": "Opustit zen mód"
|
||||
},
|
||||
"alerts": {
|
||||
"clearReset": "",
|
||||
"couldNotCreateShareableLink": "",
|
||||
"couldNotCreateShareableLinkTooBig": "",
|
||||
"couldNotLoadInvalidFile": "",
|
||||
"importBackendFailed": "",
|
||||
"cannotExportEmptyCanvas": "",
|
||||
"couldNotCopyToClipboard": "",
|
||||
"decryptFailed": "",
|
||||
"uploadedSecurly": "",
|
||||
"loadSceneOverridePrompt": "",
|
||||
"collabStopOverridePrompt": "",
|
||||
"errorLoadingLibrary": "",
|
||||
"errorAddingToLibrary": "",
|
||||
"errorRemovingFromLibrary": "",
|
||||
"confirmAddLibrary": "",
|
||||
"imageDoesNotContainScene": "",
|
||||
"cannotRestoreFromImage": "",
|
||||
"invalidSceneUrl": "",
|
||||
"resetLibrary": ""
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Výběr",
|
||||
"rectangle": "Obdélník",
|
||||
"diamond": "Diamant",
|
||||
"ellipse": "Elipsa",
|
||||
"arrow": "Šipka",
|
||||
"line": "Čára",
|
||||
"freedraw": "Kreslení",
|
||||
"text": "Text",
|
||||
"library": "",
|
||||
"lock": ""
|
||||
},
|
||||
"headings": {
|
||||
"canvasActions": "",
|
||||
"selectedShapeActions": "",
|
||||
"shapes": "Tvary"
|
||||
},
|
||||
"hints": {
|
||||
"linearElement": "",
|
||||
"freeDraw": "",
|
||||
"text": "",
|
||||
"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": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "",
|
||||
"click": "kliknutí",
|
||||
"curvedArrow": "",
|
||||
"curvedLine": "",
|
||||
"documentation": "",
|
||||
"drag": "tažení",
|
||||
"editor": "",
|
||||
"github": "",
|
||||
"howto": "",
|
||||
"or": "nebo",
|
||||
"preventBinding": "",
|
||||
"shapes": "",
|
||||
"shortcuts": "",
|
||||
"textFinish": "",
|
||||
"textNewLine": "",
|
||||
"title": "",
|
||||
"view": "",
|
||||
"zoomToFit": "",
|
||||
"zoomToSelection": ""
|
||||
},
|
||||
"encrypted": {
|
||||
"tooltip": "",
|
||||
"link": ""
|
||||
},
|
||||
"stats": {
|
||||
"angle": "",
|
||||
"element": "",
|
||||
"elements": "",
|
||||
"height": "",
|
||||
"scene": "",
|
||||
"selected": "",
|
||||
"storage": "",
|
||||
"title": "",
|
||||
"total": "",
|
||||
"version": "",
|
||||
"versionCopy": "",
|
||||
"versionNotAvailable": "",
|
||||
"width": ""
|
||||
},
|
||||
"toast": {
|
||||
"copyStyles": "",
|
||||
"copyToClipboard": "",
|
||||
"copyToClipboardAsPng": "",
|
||||
"fileSaved": "",
|
||||
"fileSavedToFilename": "",
|
||||
"canvas": "plátno",
|
||||
"selection": "výběr"
|
||||
}
|
||||
}
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Hintergrund",
|
||||
"fill": "Füllung",
|
||||
"strokeWidth": "Strichstärke",
|
||||
"strokeShape": "Strichform",
|
||||
"strokeShape_gel": "Gelschreiber",
|
||||
"strokeShape_fountain": "Füllfederhalter",
|
||||
"strokeShape_brush": "Pinselstift",
|
||||
"strokeStyle": "Konturstil",
|
||||
"strokeStyle_solid": "Durchgezogen",
|
||||
"strokeStyle_dashed": "Gestrichelt",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Schriftgröße",
|
||||
"fontFamily": "Schriftfamilie",
|
||||
"onlySelected": "Nur ausgewählte",
|
||||
"withBackground": "Hintergrund",
|
||||
"exportEmbedScene": "Szene einbetten",
|
||||
"withBackground": "Mit Hintergrund",
|
||||
"exportEmbedScene": "Zeichnung in exportierte Datei einbetten",
|
||||
"exportEmbedScene_details": "Die Zeichnungsdaten werden in der exportierten PNG/SVG-Datei gespeichert, sodass das Dokument später weiter bearbeitet werden kann. \nDieses wird die exportierte Datei vergrößern.",
|
||||
"addWatermark": "\"Made with Excalidraw\" hinzufügen",
|
||||
"handDrawn": "Handgezeichnet",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Vertikal spiegeln",
|
||||
"viewMode": "Ansichtsmodus",
|
||||
"toggleExportColorScheme": "Exportfarbschema umschalten",
|
||||
"share": "Teilen",
|
||||
"showStroke": "Auswahl für Strichfarbe anzeigen",
|
||||
"showBackground": "Auswahl für Hintergrundfarbe anzeigen",
|
||||
"toggleTheme": "Design umschalten"
|
||||
"share": "Teilen"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Zeichenfläche löschen & Hintergrundfarbe zurücksetzen",
|
||||
"exportJSON": "In Datei exportieren",
|
||||
"exportImage": "Als Bild speichern",
|
||||
"export": "Exportieren",
|
||||
"exportToPng": "Als PNG exportieren",
|
||||
"exportToSvg": "Als SVG exportieren",
|
||||
"copyToClipboard": "In Zwischenablage kopieren",
|
||||
"copyPngToClipboard": "PNG in die Zwischenablage kopieren",
|
||||
"scale": "Skalierung",
|
||||
"save": "In aktueller Datei speichern",
|
||||
"save": "Speichern",
|
||||
"saveAs": "Speichern unter",
|
||||
"load": "Laden",
|
||||
"getShareableLink": "Teilbaren Link erhalten",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Auswahl",
|
||||
"freedraw": "Freies Zeichnen",
|
||||
"rectangle": "Rechteck",
|
||||
"diamond": "Raute",
|
||||
"ellipse": "Ellipse",
|
||||
"arrow": "Pfeil",
|
||||
"line": "Linie",
|
||||
"freedraw": "Zeichnen",
|
||||
"text": "Text",
|
||||
"library": "Bibliothek",
|
||||
"lock": "Ausgewähltes Werkzeug nach Zeichnen aktiv lassen"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Fehler"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Auf Festplatte speichern",
|
||||
"disk_details": "Exportiere die Zeichnungsdaten in eine Datei, die Du später importieren kannst.",
|
||||
"disk_button": "In Datei speichern",
|
||||
"link_title": "Teilbarer Link",
|
||||
"link_details": "Als schreibgeschützten Link exportieren.",
|
||||
"link_button": "Als Link exportieren",
|
||||
"excalidrawplus_description": "Speichere die Szene in deinem Excalidraw+ Arbeitsbereich.",
|
||||
"excalidrawplus_button": "Exportieren",
|
||||
"excalidrawplus_exportError": "Konnte nicht nach Excalidraw+ exportieren..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Lies unseren Blog",
|
||||
"click": "klicken",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Φόντο",
|
||||
"fill": "Γέμισμα",
|
||||
"strokeWidth": "Πάχος μολυβιάς",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "Στυλ περιγράμματος",
|
||||
"strokeStyle_solid": "Συμπαγής",
|
||||
"strokeStyle_dashed": "Διακεκομμένη με παύλες",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Μέγεθος γραμματοσειράς",
|
||||
"fontFamily": "Γραμματοσειρά",
|
||||
"onlySelected": "Μόνο τα Επιλεγμένα",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "Με φόντο",
|
||||
"exportEmbedScene": "Ενσωμάτωση της σκηνής στο αρχείο προς εξαγωγή",
|
||||
"exportEmbedScene_details": "Τα δεδομένα σκηνής θα αποθηκευτούν στο αρχείο PNG/SVG προς εξαγωγή ώστε η σκηνή να είναι δυνατό να αποκατασταθεί από αυτό.\nΘα αυξήσει το μέγεθος του αρχείου προς εξαγωγή.",
|
||||
"addWatermark": "Προσθήκη \"Φτιαγμένο με Excalidraw\"",
|
||||
"handDrawn": "Σχεδιασμένο στο χέρι",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Κατακόρυφη αναστροφή",
|
||||
"viewMode": "Λειτουργία προβολής",
|
||||
"toggleExportColorScheme": "Εναλλαγή εξαγωγής θέματος χρωμάτων",
|
||||
"share": "Κοινοποίηση",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": "Κοινοποίηση"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Επαναφορά του καμβά",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "Εξαγωγή",
|
||||
"exportToPng": "Εξαγωγή σε PNG",
|
||||
"exportToSvg": "Εξαγωγή σε SVG",
|
||||
"copyToClipboard": "Αντιγραφή στο πρόχειρο",
|
||||
"copyPngToClipboard": "Αντιγραφή PNG στο πρόχειρο",
|
||||
"scale": "Κλίμακα",
|
||||
"save": "",
|
||||
"save": "Αποθήκευση",
|
||||
"saveAs": "Αποθήκευση ως",
|
||||
"load": "Άνοιγμα",
|
||||
"getShareableLink": "Δημόσιος σύνδεσμος",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Επιλογή",
|
||||
"freedraw": "Ελεύθερο σχέδιο",
|
||||
"rectangle": "Ορθογώνιο",
|
||||
"diamond": "Ρόμβος",
|
||||
"ellipse": "Έλλειψη",
|
||||
"arrow": "Βέλος",
|
||||
"line": "Γραμμή",
|
||||
"freedraw": "",
|
||||
"text": "Κείμενο",
|
||||
"library": "Βιβλιοθήκη",
|
||||
"lock": "Κράτησε επιλεγμένο το εργαλείο μετά το σχέδιο"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Σφάλμα"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Διαβάστε το Blog μας",
|
||||
"click": "κλικ",
|
||||
|
||||
@@ -101,8 +101,6 @@
|
||||
"viewMode": "View mode",
|
||||
"toggleExportColorScheme": "Toggle export color scheme",
|
||||
"share": "Share",
|
||||
"showStroke": "Show stroke color picker",
|
||||
"showBackground": "Show background color picker",
|
||||
"toggleTheme": "Toggle theme"
|
||||
},
|
||||
"buttons": {
|
||||
@@ -180,8 +178,6 @@
|
||||
"linearElement": "Click to start multiple points, drag for single line",
|
||||
"freeDraw": "Click and drag, release when you're finished",
|
||||
"text": "Tip: you can also add text by double-clicking anywhere with the selection tool",
|
||||
"text_selected": "Double-click or press ENTER to edit text",
|
||||
"text_editing": "Press Escape or CtrlOrCmd+ENTER to finish editing",
|
||||
"linearElementMulti": "Click on last point or press Escape or Enter to finish",
|
||||
"lockAngle": "You can constrain angle by holding SHIFT",
|
||||
"resize": "You can constrain proportions by holding SHIFT while resizing,\nhold ALT to resize from the center",
|
||||
@@ -227,10 +223,7 @@
|
||||
"disk_button": "Save to file",
|
||||
"link_title": "Shareable link",
|
||||
"link_details": "Export as a read-only link.",
|
||||
"link_button": "Export to Link",
|
||||
"excalidrawplus_description": "Save the scene to your Excalidraw+ workspace.",
|
||||
"excalidrawplus_button": "Export",
|
||||
"excalidrawplus_exportError": "Couldn't export to Excalidraw+ at this moment..."
|
||||
"link_button": "Export to Link"
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Read our blog",
|
||||
@@ -238,18 +231,16 @@
|
||||
"curvedArrow": "Curved arrow",
|
||||
"curvedLine": "Curved line",
|
||||
"documentation": "Documentation",
|
||||
"doubleClick": "double-click",
|
||||
"drag": "drag",
|
||||
"editor": "Editor",
|
||||
"editSelectedShape": "Edit selected shape (text/arrow/line)",
|
||||
"github": "Found an issue? Submit",
|
||||
"howto": "Follow our guides",
|
||||
"or": "or",
|
||||
"preventBinding": "Prevent arrow binding",
|
||||
"shapes": "Shapes",
|
||||
"shortcuts": "Keyboard shortcuts",
|
||||
"textFinish": "Finish editing (text editor)",
|
||||
"textNewLine": "Add new line (text editor)",
|
||||
"textFinish": "Finish editing (text)",
|
||||
"textNewLine": "Add new line (text)",
|
||||
"title": "Help",
|
||||
"view": "View",
|
||||
"zoomToFit": "Zoom to fit all elements",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Fondo",
|
||||
"fill": "Rellenar",
|
||||
"strokeWidth": "Grosor del trazo",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "Estilo del trazo",
|
||||
"strokeStyle_solid": "Sólido",
|
||||
"strokeStyle_dashed": "Discontinua",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Tamaño de la fuente",
|
||||
"fontFamily": "Tipo de fuente",
|
||||
"onlySelected": "Sólo seleccionados",
|
||||
"withBackground": "Fondo",
|
||||
"exportEmbedScene": "Embeber escena",
|
||||
"withBackground": "Con fondo",
|
||||
"exportEmbedScene": "Insertar escena en el archivo exportado",
|
||||
"exportEmbedScene_details": "Los datos de escena se guardarán en el archivo PNG/SVG exportado, así la escena puede ser restaurada de la misma.\nEsto aumentará el tamaño del archivo exportado.",
|
||||
"addWatermark": "Agregar \"Hecho con Excalidraw\"",
|
||||
"handDrawn": "Dibujado a mano",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Girar verticalmente",
|
||||
"viewMode": "Modo presentación",
|
||||
"toggleExportColorScheme": "Cambiar el esquema de colores de exportación",
|
||||
"share": "Compartir",
|
||||
"showStroke": "Mostrar el selector de color del trazo",
|
||||
"showBackground": "Mostrar el selector de color de fondo",
|
||||
"toggleTheme": "Alternar tema"
|
||||
"share": "Compartir"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Limpiar lienzo y reiniciar el color de fondo",
|
||||
"exportJSON": "Exportar como archivo",
|
||||
"exportImage": "Guardar como imagen",
|
||||
"export": "Exportar",
|
||||
"exportToPng": "Exportar a PNG",
|
||||
"exportToSvg": "Exportar a SVG",
|
||||
"copyToClipboard": "Copiar al portapapeles",
|
||||
"copyPngToClipboard": "Copiar PNG al portapapeles",
|
||||
"scale": "Escalar",
|
||||
"save": "Guardal al archivo actual",
|
||||
"save": "Guardar",
|
||||
"saveAs": "Guardar como",
|
||||
"load": "Cargar",
|
||||
"getShareableLink": "Obtener enlace para compartir",
|
||||
@@ -124,7 +115,7 @@
|
||||
"scrollBackToContent": "Volver al contenido",
|
||||
"zoomIn": "Acercarse",
|
||||
"zoomOut": "Alejarse",
|
||||
"resetZoom": "Restablecer zoom",
|
||||
"resetZoom": "Restablecer acercamiento",
|
||||
"menu": "Menú",
|
||||
"done": "Hecho",
|
||||
"edit": "Editar",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Selección",
|
||||
"freedraw": "Dibujo libre",
|
||||
"rectangle": "Rectángulo",
|
||||
"diamond": "Diamante",
|
||||
"ellipse": "Elipse",
|
||||
"arrow": "Flecha",
|
||||
"line": "Línea",
|
||||
"freedraw": "Dibujar",
|
||||
"text": "Texto",
|
||||
"library": "Biblioteca",
|
||||
"lock": "Mantener la herramienta seleccionada activa después de dibujar"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Error"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Guardar en el disco",
|
||||
"disk_details": "Exportar los datos de la escena a un archivo desde el cual se puede importar más tarde.",
|
||||
"disk_button": "Guardar en el archivo",
|
||||
"link_title": "Enlace para compartir",
|
||||
"link_details": "Exportar como enlace de sólo lectura.",
|
||||
"link_button": "Exportar al link",
|
||||
"excalidrawplus_description": "Guarda la escena en tu espacio de trabajo de Excalidraw+.",
|
||||
"excalidrawplus_button": "Exportar",
|
||||
"excalidrawplus_exportError": "No se pudo exportar a Excalidraw+ en este momento..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Lee nuestro blog",
|
||||
"click": "click",
|
||||
@@ -253,7 +233,7 @@
|
||||
},
|
||||
"encrypted": {
|
||||
"tooltip": "Tus dibujos están cifrados de punto a punto, por lo que los servidores de Excalidraw nunca los verán.",
|
||||
"link": "Entrada en el blog sobre cifrado de extremo a extremo"
|
||||
"link": ""
|
||||
},
|
||||
"stats": {
|
||||
"angle": "Ángulo",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "پس زمینه",
|
||||
"fill": "رنگ آمیزی",
|
||||
"strokeWidth": "ضخامت خط",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "استایل خط",
|
||||
"strokeStyle_solid": "یکدست",
|
||||
"strokeStyle_dashed": "خط چین",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "اندازه قلم",
|
||||
"fontFamily": "نوع قلم",
|
||||
"onlySelected": "فقط انتخاب شده ها",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "با پس زمینه",
|
||||
"exportEmbedScene": "قرار دادن صحنه در فایل خروجی",
|
||||
"exportEmbedScene_details": "متحوای صحنه به فایل خروجی SVG/PNG اضافه خواهد شد برای بازیابی صحنه به آن اضافه خواهد شد.\nباعث افزایش حجم فایل خروجی میشود.",
|
||||
"addWatermark": "\"ساخته شده با Excalidraw\" را اضافه کن",
|
||||
"handDrawn": "دست نویس",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "",
|
||||
"viewMode": "",
|
||||
"toggleExportColorScheme": "",
|
||||
"share": "",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": ""
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "پاکسازی بوم نقاشی",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "تبدیل",
|
||||
"exportToPng": "تبدیل به PNG",
|
||||
"exportToSvg": "تبدیل به SVG",
|
||||
"copyToClipboard": "کپی در حافظه موقت",
|
||||
"copyPngToClipboard": "کپی PNG در حافظه موقت",
|
||||
"scale": "مقیاس",
|
||||
"save": "",
|
||||
"save": "ذخیره",
|
||||
"saveAs": "ذخیره با نام",
|
||||
"load": "بارگذاری",
|
||||
"getShareableLink": "دریافت لینک قابل اشتراک",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "گزینش",
|
||||
"freedraw": "طراحی آزاد",
|
||||
"rectangle": "مستطیل",
|
||||
"diamond": "لوزی",
|
||||
"ellipse": "بیضی",
|
||||
"arrow": "پیکان",
|
||||
"line": "خط",
|
||||
"freedraw": "",
|
||||
"text": "متن",
|
||||
"library": "کتابخانه",
|
||||
"lock": "ابزار انتخاب شده را بعد از کشیدن نگه دار"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "خطا"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "بلاگ ما را بخوانید",
|
||||
"click": "",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Tausta",
|
||||
"fill": "Täyttö",
|
||||
"strokeWidth": "Viivan leveys",
|
||||
"strokeShape": "Viivan muoto",
|
||||
"strokeShape_gel": "Geelikynä",
|
||||
"strokeShape_fountain": "Sulkakynä",
|
||||
"strokeShape_brush": "Sivellinkynä",
|
||||
"strokeStyle": "Viivan tyyli",
|
||||
"strokeStyle_solid": "Yhtenäinen",
|
||||
"strokeStyle_dashed": "Katkoviiva",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Kirjasinkoko",
|
||||
"fontFamily": "Kirjasintyyppi",
|
||||
"onlySelected": "Vain valitut",
|
||||
"withBackground": "Taustalla",
|
||||
"exportEmbedScene": "Upota työ",
|
||||
"withBackground": "Sisällytä tausta",
|
||||
"exportEmbedScene": "Upota teos tiedostoon",
|
||||
"exportEmbedScene_details": "Teoksen tiedot tallennetaan PNG/SVG-tiedostoon, jolloin teoksen voi palauttaa siitä. Kasvattaa tallennetun tiedoston kokoa.",
|
||||
"addWatermark": "Lisää \"Tehty Excalidrawilla\"",
|
||||
"handDrawn": "Käsinkirjoitettu",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Käännä pystysuunnassa",
|
||||
"viewMode": "Katselutila",
|
||||
"toggleExportColorScheme": "Vaihda viennin väriteema",
|
||||
"share": "Jaa",
|
||||
"showStroke": "Näytä viivan värin valitsin",
|
||||
"showBackground": "Näytä taustavärin valitsin",
|
||||
"toggleTheme": "Vaihda teema"
|
||||
"share": "Jaa"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Tyhjennä piirtoalue",
|
||||
"exportJSON": "Vie tiedostoon",
|
||||
"exportImage": "Tallenna kuvana",
|
||||
"export": "Vie",
|
||||
"exportToPng": "Vie PNG-tiedostona",
|
||||
"exportToSvg": "Vie SVG-tiedostona",
|
||||
"copyToClipboard": "Kopioi leikepöydälle",
|
||||
"copyPngToClipboard": "Kopioi PNG-tiedosto leikepöydälle",
|
||||
"scale": "Koko",
|
||||
"save": "Tallenna nykyiseen tiedostoon",
|
||||
"save": "Tallenna",
|
||||
"saveAs": "Tallenna nimellä",
|
||||
"load": "Avaa",
|
||||
"getShareableLink": "Hae jaettava linkki",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Valinta",
|
||||
"freedraw": "Vapaa piirto",
|
||||
"rectangle": "Suorakulmio",
|
||||
"diamond": "Vinoneliö",
|
||||
"ellipse": "Soikio",
|
||||
"arrow": "Nuoli",
|
||||
"line": "Viiva",
|
||||
"freedraw": "Piirrä",
|
||||
"text": "Teksti",
|
||||
"library": "Kirjasto",
|
||||
"lock": "Pidä valittu työkalu aktiivisena piirron jälkeen"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Virhe"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Tallenna levylle",
|
||||
"disk_details": "Vie työn tiedot tiedostoon, josta sen voi tuoda myöhemmin.",
|
||||
"disk_button": "Tallenna tiedostoon",
|
||||
"link_title": "Jaettava linkki",
|
||||
"link_details": "Vie vain luku -linkkinä.",
|
||||
"link_button": "Vie linkkinä",
|
||||
"excalidrawplus_description": "Tallenna teos Excalidraw+ tilaan.",
|
||||
"excalidrawplus_button": "Vie",
|
||||
"excalidrawplus_exportError": "Ei voitu viedä Excalidraw+-palveluun tällä hetkellä..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Lue blogiamme",
|
||||
"click": "klikkaa",
|
||||
|
||||
@@ -16,14 +16,10 @@
|
||||
"delete": "Supprimer",
|
||||
"copyStyles": "Copier les styles",
|
||||
"pasteStyles": "Coller les styles",
|
||||
"stroke": "Trait",
|
||||
"stroke": "Contour",
|
||||
"background": "Arrière-plan",
|
||||
"fill": "Remplissage",
|
||||
"strokeWidth": "Largeur du trait",
|
||||
"strokeShape": "Forme du trait",
|
||||
"strokeShape_gel": "Stylo à bille",
|
||||
"strokeShape_fountain": "Stylo-plume",
|
||||
"strokeShape_brush": "Pinceau",
|
||||
"strokeStyle": "Style du trait",
|
||||
"strokeStyle_solid": "Plein",
|
||||
"strokeStyle_dashed": "Tirets",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Taille de la police",
|
||||
"fontFamily": "Police",
|
||||
"onlySelected": "Uniquement la sélection",
|
||||
"withBackground": "Arrière-plan",
|
||||
"exportEmbedScene": "Intégrer la scène",
|
||||
"withBackground": "Avec arrière-plan",
|
||||
"exportEmbedScene": "Intégrer la scène au fichier exporté",
|
||||
"exportEmbedScene_details": "Les données de scène seront enregistrées dans le fichier PNG/SVG exporté, afin que la scène puisse être restaurée à partir de celui-ci.\nCela augmentera la taille du fichier exporté.",
|
||||
"addWatermark": "Ajouter \"Fait avec Excalidraw\"",
|
||||
"handDrawn": "À main levée",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Retourner verticalement",
|
||||
"viewMode": "Mode présentation",
|
||||
"toggleExportColorScheme": "Activer/Désactiver l'export du thème de couleur",
|
||||
"share": "Partager",
|
||||
"showStroke": "Afficher le sélecteur de couleur de trait",
|
||||
"showBackground": "Afficher le sélecteur de couleur d'arrière-plan",
|
||||
"toggleTheme": "Changer le thème"
|
||||
"share": "Partager"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Réinitialiser le canevas",
|
||||
"exportJSON": "Exporter comme fichier",
|
||||
"exportImage": "Enregistrer comme image",
|
||||
"export": "Exporter",
|
||||
"exportToPng": "Enregistrer en PNG",
|
||||
"exportToSvg": "Enregistrer en SVG",
|
||||
"exportToPng": "Exporter en PNG",
|
||||
"exportToSvg": "Exporter en SVG",
|
||||
"copyToClipboard": "Copier dans le presse-papier",
|
||||
"copyPngToClipboard": "Copier le PNG dans le presse-papier",
|
||||
"copyPngToClipboard": "Copier le PNG vers le presse-papier",
|
||||
"scale": "Échelle",
|
||||
"save": "Enregistrer dans le fichier actuel",
|
||||
"save": "Sauvegarder",
|
||||
"saveAs": "Enregistrer sous",
|
||||
"load": "Ouvrir",
|
||||
"getShareableLink": "Obtenir un lien de partage",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Sélection",
|
||||
"freedraw": "Dessin libre",
|
||||
"rectangle": "Rectangle",
|
||||
"diamond": "Losange",
|
||||
"ellipse": "Ellipse",
|
||||
"arrow": "Flèche",
|
||||
"line": "Ligne",
|
||||
"freedraw": "Dessiner",
|
||||
"text": "Texte",
|
||||
"library": "Bibliothèque",
|
||||
"lock": "Garder l'outil sélectionné actif après le dessin"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Erreur"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Enregistrer sur le disque",
|
||||
"disk_details": "Exporter les données de la scène comme un fichier que vous pourrez importer ultérieurement.",
|
||||
"disk_button": "Enregistrer comme fichier",
|
||||
"link_title": "Lien partageable",
|
||||
"link_details": "Exporter comme un lien en lecture seule.",
|
||||
"link_button": "Exporter comme lien",
|
||||
"excalidrawplus_description": "Enregistrer la scène dans votre espace de travail Excalidraw+.",
|
||||
"excalidrawplus_button": "Exporter",
|
||||
"excalidrawplus_exportError": "Impossible d'exporter vers Excalidraw+ pour le moment..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Lire notre blog",
|
||||
"click": "clic",
|
||||
@@ -272,8 +252,8 @@
|
||||
},
|
||||
"toast": {
|
||||
"copyStyles": "Styles copiés.",
|
||||
"copyToClipboard": "Copié dans le presse-papier.",
|
||||
"copyToClipboardAsPng": "{{exportSelection}} copié dans le presse-papier en PNG\n({{exportColorScheme}})",
|
||||
"copyToClipboard": "Copié vers le presse-papiers.",
|
||||
"copyToClipboardAsPng": "{{exportSelection}} copié dans le presse-papiers en PNG\n({{exportColorScheme}})",
|
||||
"fileSaved": "Fichier enregistré.",
|
||||
"fileSavedToFilename": "Enregistré sous {filename}",
|
||||
"canvas": "canevas",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "רקע",
|
||||
"fill": "מילוי",
|
||||
"strokeWidth": "עובי קו מתאר",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "סגנון קו המתאר",
|
||||
"strokeStyle_solid": "מלא",
|
||||
"strokeStyle_dashed": "מקווקו",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "גודל גופן",
|
||||
"fontFamily": "סוג הגופן",
|
||||
"onlySelected": "רק מה שנבחר",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "עם רקע",
|
||||
"exportEmbedScene": "שלב את התצוגה בקובץ המיוצא",
|
||||
"exportEmbedScene_details": "מידע התצוגה יישמר לקובץ המיוצא מסוג PNG/SVG כך שיהיה ניתן לשחזרה ממנו.\nהפעולה תגדיל את גודל הקובץ המיוצא.",
|
||||
"addWatermark": "הוסף \"נוצר באמצעות Excalidraw\"",
|
||||
"handDrawn": "כתב יד",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "",
|
||||
"viewMode": "מצב תצוגה",
|
||||
"toggleExportColorScheme": "",
|
||||
"share": "",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": ""
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "אפס את הלוח",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "ייצא",
|
||||
"exportToPng": "יצא ל PNG",
|
||||
"exportToSvg": "יצא ל SVG",
|
||||
"copyToClipboard": "העתק ללוח",
|
||||
"copyPngToClipboard": "העתק PNG ללוח",
|
||||
"scale": "קנה מידה",
|
||||
"save": "",
|
||||
"save": "שמור",
|
||||
"saveAs": "שמירה בשם",
|
||||
"load": "טען",
|
||||
"getShareableLink": "קבל קישור לשיתוף",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "בחירה",
|
||||
"freedraw": "ציור חופשי",
|
||||
"rectangle": "מרובע",
|
||||
"diamond": "מעוין",
|
||||
"ellipse": "אליפסה",
|
||||
"arrow": "חץ",
|
||||
"line": "קו",
|
||||
"freedraw": "",
|
||||
"text": "טקסט",
|
||||
"library": "ספריה",
|
||||
"lock": "השאר את הכלי הנבחר פעיל גם לאחר סיום הציור"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "שגיאה"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "קרא את הבלוג שלנו",
|
||||
"click": "קליק",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "पृष्ठभूमि",
|
||||
"fill": "भरें",
|
||||
"strokeWidth": "रेखा की चौड़ाई",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "स्ट्रोक का आकार",
|
||||
"strokeStyle_solid": "ठोस",
|
||||
"strokeStyle_dashed": "डैश",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "फ़ॉन्ट का आकार",
|
||||
"fontFamily": "फ़ॉन्ट का परिवार",
|
||||
"onlySelected": "केवल चयनित",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "बैकग्राउंड के साथ",
|
||||
"exportEmbedScene": "निर्यात एम्बेड दृश्य",
|
||||
"exportEmbedScene_details": "निर्यात एम्बेड दृश्य विवरण",
|
||||
"addWatermark": "ऐड \"मेड विथ एक्सकैलिडराव\"",
|
||||
"handDrawn": "हाथ से बनाया हुआ",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "",
|
||||
"viewMode": "",
|
||||
"toggleExportColorScheme": "",
|
||||
"share": "",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": ""
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "कैनवास रीसेट करें",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "निर्यात",
|
||||
"exportToPng": "पीएनजी के रूप में निर्यात करे",
|
||||
"exportToSvg": "Svg के रूप में निर्यात करे",
|
||||
"copyToClipboard": "क्लिपबोर्ड पर प्रतिलिपि बनाएँ",
|
||||
"copyPngToClipboard": "क्लिपबोर्ड पर कॉपी करें,पीएनजी के रूप में",
|
||||
"scale": "पैमाना",
|
||||
"save": "",
|
||||
"save": "सहेजें",
|
||||
"saveAs": "सेव करे इस तरह",
|
||||
"load": "लोड करें",
|
||||
"getShareableLink": "साझा करने योग्य लिंक प्राप्त करें",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "चयन",
|
||||
"freedraw": "मुफ्त ड्रा",
|
||||
"rectangle": "आयात",
|
||||
"diamond": "तिर्यग्वर्ग",
|
||||
"ellipse": "दीर्घवृत्त",
|
||||
"arrow": "तीर",
|
||||
"line": "रेखा",
|
||||
"freedraw": "",
|
||||
"text": "पाठ",
|
||||
"library": "लाइब्रेरी",
|
||||
"lock": "ड्राइंग के बाद चयनित टूल को सक्रिय रखें"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "गलती"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "हमारा ब्लॉग पढे",
|
||||
"click": "क्लिक करें",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Háttér",
|
||||
"fill": "Kitöltés",
|
||||
"strokeWidth": "Körvonal vastagsága",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "Körvonal stílusa",
|
||||
"strokeStyle_solid": "Kitöltött",
|
||||
"strokeStyle_dashed": "Szaggatott",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Betűméret",
|
||||
"fontFamily": "Betűkészlet család",
|
||||
"onlySelected": "Csak a kijelölt",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "Háttérrel",
|
||||
"exportEmbedScene": "Jelenet beágyazása az exportált fájlba",
|
||||
"exportEmbedScene_details": "A jelenetet leíró adatok hozzá lesznek adva a PNG/SVG fájlhoz, így a jelenetet vissza lehet majd tölteni belőle. Ez megnöveli a fájl méretét.",
|
||||
"addWatermark": "Add hozzá, hogy \"Excalidraw-val készült\"",
|
||||
"handDrawn": "Kézzel rajzolt",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "",
|
||||
"viewMode": "",
|
||||
"toggleExportColorScheme": "",
|
||||
"share": "",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": ""
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Vászon törlése",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "Exportálás",
|
||||
"exportToPng": "Exportálás PNG-be",
|
||||
"exportToSvg": "Exportálás SVG-be",
|
||||
"copyToClipboard": "Vágólapra másolás",
|
||||
"copyPngToClipboard": "PNG másolása a vágólapra",
|
||||
"scale": "Nagyítás",
|
||||
"save": "",
|
||||
"save": "Mentés",
|
||||
"saveAs": "Mentés másként",
|
||||
"load": "Betöltés",
|
||||
"getShareableLink": "Megosztható link létrehozása",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Kijelölés",
|
||||
"freedraw": "Szabadkézi rajz",
|
||||
"rectangle": "Téglalap",
|
||||
"diamond": "Rombusz",
|
||||
"ellipse": "Ellipszis",
|
||||
"arrow": "Nyíl",
|
||||
"line": "Vonal",
|
||||
"freedraw": "",
|
||||
"text": "Szöveg",
|
||||
"library": "Könyvtár",
|
||||
"lock": "Rajzolás után az aktív eszközt tartsa kijelölve"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Hiba"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "",
|
||||
"click": "",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Latar",
|
||||
"fill": "Isian",
|
||||
"strokeWidth": "Lebar guratan",
|
||||
"strokeShape": "Bentuk guratan",
|
||||
"strokeShape_gel": "Pena gel",
|
||||
"strokeShape_fountain": "Pena gunung",
|
||||
"strokeShape_brush": "Kuas",
|
||||
"strokeStyle": "Gaya guratan",
|
||||
"strokeStyle_solid": "Padat",
|
||||
"strokeStyle_dashed": "Putus-putus",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Ukuran font",
|
||||
"fontFamily": "Jenis font",
|
||||
"onlySelected": "Hanya yang Dipilih",
|
||||
"withBackground": "Latar",
|
||||
"exportEmbedScene": "Sematkan pemandangan",
|
||||
"withBackground": "Dengan latar",
|
||||
"exportEmbedScene": "Sematkan pemandangan ke dalam file yang diekspor",
|
||||
"exportEmbedScene_details": "Data pemandangan akan disimpan dalam file PNG/SVG yang diekspor, sehingga pemandangan itu dapat dipulihkan darinya.\nAkan membesarkan ukuran file yang diekspor.",
|
||||
"addWatermark": "Tambahkan \"Dibuat dengan Excalidraw\"",
|
||||
"handDrawn": "Tulisan tangan",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Balikkan vertikal",
|
||||
"viewMode": "Mode tampilan",
|
||||
"toggleExportColorScheme": "Ubah skema warna ekspor",
|
||||
"share": "Bagikan",
|
||||
"showStroke": "Tampilkan garis pengambil warna",
|
||||
"showBackground": "Tampilkan latar pengambil warna",
|
||||
"toggleTheme": "Ubah tema"
|
||||
"share": "Bagikan"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Setel Ulang Kanvas",
|
||||
"exportJSON": "Ekspor ke file",
|
||||
"exportImage": "Simpan gambar",
|
||||
"export": "Ekspor",
|
||||
"exportToPng": "Ekspor ke PNG",
|
||||
"exportToSvg": "Ekspor ke SVG",
|
||||
"copyToClipboard": "Salin ke Papan Klip",
|
||||
"copyPngToClipboard": "Salin PNG ke papan klip",
|
||||
"scale": "Skala",
|
||||
"save": "Simpan ke file sekarang",
|
||||
"save": "Simpan",
|
||||
"saveAs": "Simpan sebagai",
|
||||
"load": "Muat",
|
||||
"getShareableLink": "Buat Tautan yang Bisa Dibagian",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Pilihan",
|
||||
"freedraw": "Menggambar bebas",
|
||||
"rectangle": "Persegi",
|
||||
"diamond": "Berlian",
|
||||
"ellipse": "Elips",
|
||||
"arrow": "Panah",
|
||||
"line": "Garis",
|
||||
"freedraw": "Gambar",
|
||||
"text": "Teks",
|
||||
"library": "Pustaka",
|
||||
"lock": "Biarkan alat yang dipilih aktif setelah menggambar"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Kesalahan"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Simpan ke disk",
|
||||
"disk_details": "Ekspor data pemandangan ke file yang mana Anda dapat impor nanti.",
|
||||
"disk_button": "Simpan ke file",
|
||||
"link_title": "Tautan",
|
||||
"link_details": "Ekspor sebagai tautan yang hanya dibaca.",
|
||||
"link_button": "Ekspor ke tautan",
|
||||
"excalidrawplus_description": "Simpan pemandangan ke ruang kerja Excalidraw+ Anda.",
|
||||
"excalidrawplus_button": "Ekspor",
|
||||
"excalidrawplus_exportError": "Tidak dapat ekspor ke Excalidraw+ saat ini..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Baca blog kami",
|
||||
"click": "klik",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Sfondo",
|
||||
"fill": "Riempimento",
|
||||
"strokeWidth": "Spessore del tratto",
|
||||
"strokeShape": "Forma del tratto",
|
||||
"strokeShape_gel": "Penna gel",
|
||||
"strokeShape_fountain": "Penna stilografica",
|
||||
"strokeShape_brush": "Pennello",
|
||||
"strokeStyle": "Stile del tratto",
|
||||
"strokeStyle_solid": "Pieno",
|
||||
"strokeStyle_dashed": "Tratteggiato",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Dimensione carattere",
|
||||
"fontFamily": "Carattere",
|
||||
"onlySelected": "Solo selezionati",
|
||||
"withBackground": "Sfondo",
|
||||
"exportEmbedScene": "Includi scena",
|
||||
"withBackground": "Con sfondo",
|
||||
"exportEmbedScene": "Incorpora la scena nel file esportato",
|
||||
"exportEmbedScene_details": "I dati della scena saranno salvati nel file PNG/SVG esportato in modo che la scena possa essere ripristinata da esso.\nQuesto aumenterà la dimensione del file esportato.",
|
||||
"addWatermark": "Aggiungi \"Creato con Excalidraw\"",
|
||||
"handDrawn": "A mano libera",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Capovolgi verticalmente",
|
||||
"viewMode": "Modalità visualizzazione",
|
||||
"toggleExportColorScheme": "Cambia lo schema di colori in esportazione",
|
||||
"share": "Condividi",
|
||||
"showStroke": "Mostra selettore colore del tratto",
|
||||
"showBackground": "Mostra selettore colore di sfondo",
|
||||
"toggleTheme": "Cambia tema"
|
||||
"share": "Condividi"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Svuota la tela",
|
||||
"exportJSON": "Esporta su file",
|
||||
"exportImage": "Salva come immagine",
|
||||
"export": "Esporta",
|
||||
"exportToPng": "Esporta come PNG",
|
||||
"exportToSvg": "Esporta come SVG",
|
||||
"copyToClipboard": "Copia negli appunti",
|
||||
"copyPngToClipboard": "Copia PNG negli appunti",
|
||||
"scale": "Scala",
|
||||
"save": "Salva sul file corrente",
|
||||
"save": "Salva",
|
||||
"saveAs": "Salva con nome",
|
||||
"load": "Carica",
|
||||
"getShareableLink": "Ottieni link condivisibile",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Selezione",
|
||||
"freedraw": "Disegno libero",
|
||||
"rectangle": "Rettangolo",
|
||||
"diamond": "Rombo",
|
||||
"ellipse": "Ellisse",
|
||||
"arrow": "Freccia",
|
||||
"line": "Linea",
|
||||
"freedraw": "",
|
||||
"text": "Testo",
|
||||
"library": "Libreria",
|
||||
"lock": "Mantieni lo strumento selezionato attivo dopo aver disegnato"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Errore"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Salva su disco",
|
||||
"disk_details": "Esporta i dati della scena su file, dal quale potrai importare in seguito.",
|
||||
"disk_button": "Salva su file",
|
||||
"link_title": "Link condivisibile",
|
||||
"link_details": "Esporta come link di sola lettura.",
|
||||
"link_button": "Esporta come Link",
|
||||
"excalidrawplus_description": "Salva la scena nel tuo spazio di lavoro Excalidraw+.",
|
||||
"excalidrawplus_button": "Esporta",
|
||||
"excalidrawplus_exportError": "Non è stato possibile esportare su Excalidraw+ al questo momento..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Leggi il nostro blog",
|
||||
"click": "click",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "背景の色",
|
||||
"fill": "塗りつぶし",
|
||||
"strokeWidth": "線の幅",
|
||||
"strokeShape": "ストロークの形状",
|
||||
"strokeShape_gel": "ジェルペン",
|
||||
"strokeShape_fountain": "噴水ペン",
|
||||
"strokeShape_brush": "ブラシペン",
|
||||
"strokeStyle": "線の種類",
|
||||
"strokeStyle_solid": "実線",
|
||||
"strokeStyle_dashed": "破線",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "フォントの大きさ",
|
||||
"fontFamily": "フォントの種類",
|
||||
"onlySelected": "選択中のみ",
|
||||
"withBackground": "背景",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "背景を含める",
|
||||
"exportEmbedScene": "エクスポートされたファイルにシーンを埋め込みます",
|
||||
"exportEmbedScene_details": "シーンデータはエクスポートされたPNG/SVGファイルに保存され、シーンを復元することができます。\nエクスポートされたファイルのサイズは増加します。",
|
||||
"addWatermark": "\"Made with Excalidraw\"と表示",
|
||||
"handDrawn": "手描き風",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "垂直方向に反転",
|
||||
"viewMode": "閲覧モード",
|
||||
"toggleExportColorScheme": "",
|
||||
"share": "共有",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": "テーマの切り替え"
|
||||
"share": ""
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "キャンバスのリセット",
|
||||
"exportJSON": "ファイルへエクスポート",
|
||||
"exportImage": "画像として保存",
|
||||
"export": "エクスポート",
|
||||
"exportToPng": "PNG にエクスポート",
|
||||
"exportToSvg": "SVG にエクスポート",
|
||||
"copyToClipboard": "クリップボードにコピー",
|
||||
"copyPngToClipboard": "クリップボードにPNGをコピー",
|
||||
"scale": "スケール",
|
||||
"save": "現在のファイルに保存",
|
||||
"save": "保存",
|
||||
"saveAs": "名前を付けて保存",
|
||||
"load": "読み込み...",
|
||||
"getShareableLink": "共有URLの取得",
|
||||
@@ -151,22 +142,22 @@
|
||||
"loadSceneOverridePrompt": "外部図面を読み込むと、既存のコンテンツが置き換わります。続行しますか?",
|
||||
"collabStopOverridePrompt": "セッションを停止すると、ローカルに保存されている図が上書きされます。 本当によろしいですか?\n\n(ローカルの図を保持したい場合は、セッションを停止せずにブラウザタブを閉じてください。)",
|
||||
"errorLoadingLibrary": "サードパーティライブラリの読み込み中にエラーが発生しました。",
|
||||
"errorAddingToLibrary": "アイテムをライブラリに追加できませんでした",
|
||||
"errorRemovingFromLibrary": "ライブラリからアイテムを削除できませんでした",
|
||||
"errorAddingToLibrary": "",
|
||||
"errorRemovingFromLibrary": "",
|
||||
"confirmAddLibrary": "{{numShapes}} 個の図形をライブラリに追加します。よろしいですか?",
|
||||
"imageDoesNotContainScene": "現在、画像のインポートはサポートされていません。\n\nシーンをインポートしようとしましたか?この画像にはシーンデータが含まれていないようです。エクスポート中に有効にしていましたか?",
|
||||
"cannotRestoreFromImage": "このイメージファイルからシーンを復元できませんでした",
|
||||
"invalidSceneUrl": "指定された URL からシーンをインポートできませんでした。不正な形式であるか、有効な Excalidraw JSON データが含まれていません。",
|
||||
"invalidSceneUrl": "",
|
||||
"resetLibrary": "ライブラリを消去します。本当によろしいですか?"
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "選択",
|
||||
"freedraw": "手書き",
|
||||
"rectangle": "矩形",
|
||||
"diamond": "ひし形",
|
||||
"ellipse": "楕円",
|
||||
"arrow": "矢印",
|
||||
"line": "直線",
|
||||
"freedraw": "描画",
|
||||
"text": "テキスト",
|
||||
"library": "ライブラリ",
|
||||
"lock": "描画後も使用中のツールを選択したままにする"
|
||||
@@ -219,17 +210,6 @@
|
||||
"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": "クリック",
|
||||
@@ -273,10 +253,10 @@
|
||||
"toast": {
|
||||
"copyStyles": "スタイルをコピー",
|
||||
"copyToClipboard": "クリップボードにコピー",
|
||||
"copyToClipboardAsPng": "{{exportSelection}} を PNG 形式でクリップボードにコピーしました\n({{exportColorScheme}})",
|
||||
"copyToClipboardAsPng": "",
|
||||
"fileSaved": "ファイルを保存しました",
|
||||
"fileSavedToFilename": "{filename} に保存しました",
|
||||
"canvas": "キャンバス",
|
||||
"selection": "選択"
|
||||
"selection": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Agilal",
|
||||
"fill": "Taččart",
|
||||
"strokeWidth": "Tehri n yizirig",
|
||||
"strokeShape": "Talɣa n yizirig",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "Amfezzu",
|
||||
"strokeStyle": "Aɣanib n tizirig",
|
||||
"strokeStyle_solid": "Aččuran",
|
||||
"strokeStyle_dashed": "S tjerriḍin",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Tiddi n tsefsit",
|
||||
"fontFamily": "Tawacult n tsefsiyin",
|
||||
"onlySelected": "Tafrayt kan",
|
||||
"withBackground": "Agilal",
|
||||
"exportEmbedScene": "Sleɣ asayes",
|
||||
"withBackground": "S ugilal",
|
||||
"exportEmbedScene": "Seddu asayes deg ufaylu yettwasifḍen",
|
||||
"exportEmbedScene_details": "Asayes ad yettwasekles deg ufaylu n usifeḍ PNG/SVG akken akken ad yili wamek ara d-yettwarr seg-s usayes. Ayagi ad isimɣur tiddi n ufaylu n usifeḍ.",
|
||||
"addWatermark": "Seddu \"Yettwaxdem s Excalidraw\"",
|
||||
"handDrawn": "Asuneɣ s ufus",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Tuttya tubdidt",
|
||||
"viewMode": "Askar n tmuɣli",
|
||||
"toggleExportColorScheme": "Sermed/sens asifeḍ usentel n yini",
|
||||
"share": "Bḍu",
|
||||
"showStroke": "Beqqeḍ amelqaḍ n yini n yizirig",
|
||||
"showBackground": "Beqqeḍ amelqaḍ n yini n ugilal",
|
||||
"toggleTheme": "Snifel asentel"
|
||||
"share": "Bḍu"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Ales awennez n teɣzut n usuneɣ",
|
||||
"exportJSON": "Sifeḍ afaylu",
|
||||
"exportImage": "Sekles am tugna",
|
||||
"export": "Sifeḍ",
|
||||
"exportToPng": "Sifeḍ ɣer PNG",
|
||||
"exportToSvg": "Sifeḍ ɣer SVG",
|
||||
"copyToClipboard": "Nɣel ɣer tecfawit",
|
||||
"copyPngToClipboard": "Nɣel PNG ɣer tecfawit",
|
||||
"scale": "Taskala",
|
||||
"save": "Sekles deg ufaylu amiran",
|
||||
"save": "Sekles",
|
||||
"saveAs": "Sekles am",
|
||||
"load": "Sali-d",
|
||||
"getShareableLink": "Awi-d aseɣwen n beṭṭu",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Tafrayt",
|
||||
"freedraw": "Unuɣ ilelli",
|
||||
"rectangle": "Asrem",
|
||||
"diamond": "Ameɣṛun",
|
||||
"ellipse": "Taglayt",
|
||||
"arrow": "Taneccabt",
|
||||
"line": "Izirig",
|
||||
"freedraw": "Suneɣ",
|
||||
"text": "Aḍris",
|
||||
"library": "Tamkarḍit",
|
||||
"lock": "Eǧǧ afecku n tefrayt yermed mbaɛd asuneɣ"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Tuccḍa"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Sekles deg uḍebsi",
|
||||
"disk_details": "Sekles isefka n usayes deg ufaylu ansi ara tizmireḍ ad d-tketreḍ areḍqal.",
|
||||
"disk_button": "Sekles deg ufaylu",
|
||||
"link_title": "Aseɣwen n beṭṭu",
|
||||
"link_details": "Sifeḍ am useɣwen n tɣuri kan.",
|
||||
"link_button": "Sifeḍ deg useɣwen",
|
||||
"excalidrawplus_description": "Sekles asayes-inek•inem di tallunt n umahil Excalidraw+.",
|
||||
"excalidrawplus_button": "Sifeḍ",
|
||||
"excalidrawplus_exportError": "Ulamek asifeḍ ɣer Excalidraw+ akka tura..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Ɣeṛ ablug-nneɣ",
|
||||
"click": "ssit",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "배경색",
|
||||
"fill": "채우기",
|
||||
"strokeWidth": "선 굵기",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "선",
|
||||
"strokeStyle_solid": "실선",
|
||||
"strokeStyle_dashed": "파선",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "글자 크기",
|
||||
"fontFamily": "글꼴",
|
||||
"onlySelected": "선택한 항목만",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "배경 포함",
|
||||
"exportEmbedScene": "화면을 내보낸 파일에 담기",
|
||||
"exportEmbedScene_details": "화면 정보가 내보내는 PNG/SVG 파일에 저장되어 이후에 파일에서 화면을 복구할 수 있습니다. 파일 크기가 증가합니다.",
|
||||
"addWatermark": "\"Made with Excalidraw\" 추가",
|
||||
"handDrawn": "손글씨",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "",
|
||||
"viewMode": "보기 모드",
|
||||
"toggleExportColorScheme": "",
|
||||
"share": "",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": ""
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "캔버스 초기화",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "내보내기",
|
||||
"exportToPng": "PNG로 내보내기",
|
||||
"exportToSvg": "SVG로 내보내기",
|
||||
"copyToClipboard": "클립보드로 복사",
|
||||
"copyPngToClipboard": "클립보드로 PNG 이미지 복사",
|
||||
"scale": "크기",
|
||||
"save": "",
|
||||
"save": "저장",
|
||||
"saveAs": "다른 이름으로 저장",
|
||||
"load": "불러오기",
|
||||
"getShareableLink": "공유 가능한 링크 생성",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "선택",
|
||||
"freedraw": "자유롭게 그리기",
|
||||
"rectangle": "사각형",
|
||||
"diamond": "다이아몬드",
|
||||
"ellipse": "타원",
|
||||
"arrow": "화살표",
|
||||
"line": "선",
|
||||
"freedraw": "",
|
||||
"text": "텍스트",
|
||||
"library": "라이브러리",
|
||||
"lock": "선택된 도구 유지하기"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "오류"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "블로그 읽어보기",
|
||||
"click": "클릭",
|
||||
|
||||
@@ -1,47 +1,43 @@
|
||||
{
|
||||
"labels": {
|
||||
"paste": "Ielīmēt",
|
||||
"pasteCharts": "Ielīmēt grafikus",
|
||||
"selectAll": "Iezīmēt visu",
|
||||
"multiSelect": "Pievienot elementu iezīmētajam",
|
||||
"moveCanvas": "Pārvietot darba laukumu",
|
||||
"cut": "Izgriezt",
|
||||
"copy": "Kopēt",
|
||||
"copyAsPng": "Kopēt starpliktuvē kā PNG",
|
||||
"copyAsSvg": "Kopēt starpliktuvē kā SVG",
|
||||
"bringForward": "Pārvietot vienu slāni augstāk",
|
||||
"sendToBack": "Pārvietot uz zemāko slāni",
|
||||
"bringToFront": "Pārvietot uz virsējo slāni",
|
||||
"sendBackward": "Pārvietot par vienu slāni zemāk",
|
||||
"delete": "Dzēst",
|
||||
"copyStyles": "Kopēt stilus",
|
||||
"pasteStyles": "Ielīmēt stilus",
|
||||
"stroke": "Līnija",
|
||||
"background": "Fons",
|
||||
"fill": "Aizpildījums",
|
||||
"strokeWidth": "Līnijas platums",
|
||||
"strokeShape": "Līnijas forma",
|
||||
"strokeShape_gel": "Gēla pildspalva",
|
||||
"strokeShape_fountain": "Lodīšu pildspalva",
|
||||
"strokeShape_brush": "Flomāsters - ota",
|
||||
"strokeStyle": "Līnijas forma",
|
||||
"strokeStyle_solid": "Vienlaidu",
|
||||
"strokeStyle_dashed": "Raustīta līnija",
|
||||
"strokeStyle_dotted": "Punktota līnija",
|
||||
"sloppiness": "Precizitāte",
|
||||
"opacity": "Necaurspīdīgums",
|
||||
"textAlign": "Teksta izkārtojums",
|
||||
"edges": "Malas",
|
||||
"sharp": "Asas",
|
||||
"round": "Apaļas",
|
||||
"arrowheads": "Bultas",
|
||||
"arrowhead_none": "Nekādas",
|
||||
"arrowhead_arrow": "Bulta",
|
||||
"arrowhead_bar": "Svītra",
|
||||
"arrowhead_dot": "Punkts",
|
||||
"fontSize": "Teksta lielums",
|
||||
"fontFamily": "Fontu saime",
|
||||
"onlySelected": "Tikai iezīmētais",
|
||||
"paste": "",
|
||||
"pasteCharts": "",
|
||||
"selectAll": "",
|
||||
"multiSelect": "",
|
||||
"moveCanvas": "",
|
||||
"cut": "",
|
||||
"copy": "",
|
||||
"copyAsPng": "",
|
||||
"copyAsSvg": "",
|
||||
"bringForward": "",
|
||||
"sendToBack": "",
|
||||
"bringToFront": "",
|
||||
"sendBackward": "",
|
||||
"delete": "",
|
||||
"copyStyles": "",
|
||||
"pasteStyles": "",
|
||||
"stroke": "",
|
||||
"background": "",
|
||||
"fill": "",
|
||||
"strokeWidth": "",
|
||||
"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": "",
|
||||
@@ -100,15 +96,10 @@
|
||||
"flipVertical": "",
|
||||
"viewMode": "",
|
||||
"toggleExportColorScheme": "",
|
||||
"share": "",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": ""
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "",
|
||||
"exportToPng": "",
|
||||
"exportToSvg": "",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "",
|
||||
"draw": "",
|
||||
"rectangle": "",
|
||||
"diamond": "",
|
||||
"ellipse": "",
|
||||
"arrow": "",
|
||||
"line": "",
|
||||
"freedraw": "",
|
||||
"text": "",
|
||||
"library": "",
|
||||
"lock": ""
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": ""
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "",
|
||||
"click": "",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "နောက်ခံ",
|
||||
"fill": "ဖြည့်",
|
||||
"strokeWidth": "မျဉ်းအထူ",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "မျဉ်းပုံစံ",
|
||||
"strokeStyle_solid": "အပြည့်",
|
||||
"strokeStyle_dashed": "မျဉ်းပြတ်",
|
||||
@@ -43,7 +39,7 @@
|
||||
"fontFamily": "စာလုံးပုံစံ",
|
||||
"onlySelected": "ရွေးထားသလောက်",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"exportEmbedScene": "မြင်ကွင်းပါမြှုပ်နှံ၍ထုတ်ပါ",
|
||||
"exportEmbedScene_details": "ထုတ်ယူလိုက်သော PNG/SVG ထဲမြင်ကွင်းအချက်အလက်များပါဝင်သဖြင့် ပြန်လည်ရယူနိုင်သော်လည်း ဖိုင်အရွယ်အစားကြီးပါမည်။",
|
||||
"addWatermark": "\"Excalidraw ဖြင့်ဖန်တီးသည်။\" စာသားထည့်",
|
||||
"handDrawn": "လက်ရေး",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "",
|
||||
"viewMode": "",
|
||||
"toggleExportColorScheme": "",
|
||||
"share": "",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": ""
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "ကားချပ်ရှင်းလင်း",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "ထုတ်",
|
||||
"exportToPng": "PNG ထုတ်",
|
||||
"exportToSvg": "SVG ထုတ်",
|
||||
"copyToClipboard": "ကူးယူ",
|
||||
"copyPngToClipboard": "PNG ကူးယူ",
|
||||
"scale": "စကေး",
|
||||
"save": "",
|
||||
"save": "သိမ်း",
|
||||
"saveAs": "ပြောင်းသိမ်း",
|
||||
"load": "တင်သွင်း",
|
||||
"getShareableLink": "မျှဝေရန် လင့်ခ်ရယူ",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "ရွေးချယ်",
|
||||
"freedraw": "အလွတ်ရေးဆွဲ",
|
||||
"rectangle": "စတုဂံ",
|
||||
"diamond": "စိန်",
|
||||
"ellipse": "အဝိုင်း",
|
||||
"arrow": "မြှား",
|
||||
"line": "မျဉ်း",
|
||||
"freedraw": "",
|
||||
"text": "စာသား",
|
||||
"library": "မှတ်တမ်း",
|
||||
"lock": "ရွေးချယ်ထားသောကိရိယာကိုသာဆက်သုံး"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "ချို့ယွင်းချက်"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "",
|
||||
"click": "",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Bakgrunn",
|
||||
"fill": "Fyll",
|
||||
"strokeWidth": "Strektykkelse",
|
||||
"strokeShape": "Strekstil",
|
||||
"strokeShape_gel": "Gelepenn",
|
||||
"strokeShape_fountain": "Fyllepenn",
|
||||
"strokeShape_brush": "Pensel",
|
||||
"strokeStyle": "Strekstil",
|
||||
"strokeStyle_solid": "Heltrukket",
|
||||
"strokeStyle_dashed": "Stiplet",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Skriftstørrelse",
|
||||
"fontFamily": "Fontfamilie",
|
||||
"onlySelected": "Kun valgte",
|
||||
"withBackground": "Bakgrunn",
|
||||
"exportEmbedScene": "Bygg inn scene",
|
||||
"withBackground": "Med bakgrunn",
|
||||
"exportEmbedScene": "Bygg inn scenen i den eksporterte filen",
|
||||
"exportEmbedScene_details": "Scenedata vil bli lagret i den eksporterte PNG/SVG-filen, slik at scenen kan gjenopprettes fra den.\nDet vil øke den eksporterte filstørrelsen.",
|
||||
"addWatermark": "Legg til \"Laget med Excalidraw\"",
|
||||
"handDrawn": "Håndtegnet",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Snu vertikalt",
|
||||
"viewMode": "Visningsmodus",
|
||||
"toggleExportColorScheme": "Veksle eksport av fargepalett",
|
||||
"share": "Del",
|
||||
"showStroke": "Vis fargevelger for kantfarge",
|
||||
"showBackground": "Vis fargevelger for bakgrunnsfarge",
|
||||
"toggleTheme": "Veksle tema"
|
||||
"share": "Del"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Tøm lerretet og tilbakestill bakgrunnsfargen",
|
||||
"exportJSON": "Eksporter til fil",
|
||||
"exportImage": "Lagre som bilde",
|
||||
"export": "Eksporter",
|
||||
"exportToPng": "Eksporter til PNG",
|
||||
"exportToSvg": "Eksporter til SVG",
|
||||
"copyToClipboard": "Kopier til utklippstavle",
|
||||
"copyPngToClipboard": "Kopier PNG til utklippstavlen",
|
||||
"scale": "Skalering",
|
||||
"save": "Lagre til aktiv fil",
|
||||
"save": "Lagre",
|
||||
"saveAs": "Lagre som",
|
||||
"load": "Åpne",
|
||||
"getShareableLink": "Få delingslenke",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Velg",
|
||||
"freedraw": "Frihåndstegning",
|
||||
"rectangle": "Rektangel",
|
||||
"diamond": "Diamant",
|
||||
"ellipse": "Ellipse",
|
||||
"arrow": "Pil",
|
||||
"line": "Linje",
|
||||
"freedraw": "Tegn",
|
||||
"text": "Tekst",
|
||||
"library": "Bibliotek",
|
||||
"lock": "Behold merket verktøy som aktivt"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Feil"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Lagre til disk",
|
||||
"disk_details": "Eksporter scene-dataene til en fil som du kan importere fra senere.",
|
||||
"disk_button": "Lagre til fil",
|
||||
"link_title": "Delbar lenke",
|
||||
"link_details": "Eksporter som en skrivebeskyttet lenke.",
|
||||
"link_button": "Eksporter til lenke",
|
||||
"excalidrawplus_description": "Lagre scenen til ditt Excalidraw+ arbeidsområde.",
|
||||
"excalidrawplus_button": "Eksporter",
|
||||
"excalidrawplus_exportError": "Kunne ikke eksportere til Excalidraw+ for øyeblikket..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Les bloggen vår",
|
||||
"click": "klikk",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Achtergrond",
|
||||
"fill": "Invulling",
|
||||
"strokeWidth": "Lijnbreedte",
|
||||
"strokeShape": "Lijnstijl",
|
||||
"strokeShape_gel": "Gel pen",
|
||||
"strokeShape_fountain": "Vulpen",
|
||||
"strokeShape_brush": "Penseel",
|
||||
"strokeStyle": "Lijnstijl",
|
||||
"strokeStyle_solid": "Ononderbroken",
|
||||
"strokeStyle_dashed": "Gestreept",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Tekstgrootte",
|
||||
"fontFamily": "Lettertype",
|
||||
"onlySelected": "Enkel geselecteerde",
|
||||
"withBackground": "Achtergrond",
|
||||
"exportEmbedScene": "Scène insluiten",
|
||||
"withBackground": "Met achtergrond",
|
||||
"exportEmbedScene": "Scène in geëxporteerd bestand invoegen",
|
||||
"exportEmbedScene_details": "Scènegegevens worden in het geëxporteerde PNG/SVG-bestand opgeslagen zodat de scène kan worden hersteld.\nDe grootte van de geëxporteerde bestanden zal toenemen.",
|
||||
"addWatermark": "Voeg \"Gemaakt met Excalidraw\" toe",
|
||||
"handDrawn": "Handgetekend",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Verticaal spiegelen",
|
||||
"viewMode": "Weergavemodus",
|
||||
"toggleExportColorScheme": "Kleurenschema exporteren aan/uit",
|
||||
"share": "Deel",
|
||||
"showStroke": "Toon lijn kleur kiezer",
|
||||
"showBackground": "Toon achtergrondkleur kiezer",
|
||||
"toggleTheme": "Thema aan/uit"
|
||||
"share": "Deel"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Canvas opnieuw instellen",
|
||||
"exportJSON": "Exporteren naar bestand",
|
||||
"exportImage": "Als afbeelding opslaan",
|
||||
"export": "Exporteren",
|
||||
"exportToPng": "Exporteren naar PNG",
|
||||
"exportToSvg": "Exporteren naar SVG",
|
||||
"copyToClipboard": "Kopieer",
|
||||
"copyPngToClipboard": "Kopieer als PNG",
|
||||
"scale": "Schaal",
|
||||
"save": "Opslaan naar huidige bestand",
|
||||
"save": "Opslaan",
|
||||
"saveAs": "Opslaan als",
|
||||
"load": "Open",
|
||||
"getShareableLink": "Maak een deelbare link",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Selectie",
|
||||
"freedraw": "Vrij tekenen",
|
||||
"rectangle": "Rechthoek",
|
||||
"diamond": "Ruit",
|
||||
"ellipse": "Ovaal",
|
||||
"arrow": "Pijl",
|
||||
"line": "Lijn",
|
||||
"freedraw": "Tekenen",
|
||||
"text": "Tekst",
|
||||
"library": "Bibliotheek",
|
||||
"lock": "Geselecteerde tool actief houden na tekenen"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Fout"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Opslaan op schijf",
|
||||
"disk_details": "De scènegegevens exporteren naar een bestand waaruit u later kunt importeren.",
|
||||
"disk_button": "Opslaan naar bestand",
|
||||
"link_title": "Deelbare link",
|
||||
"link_details": "Exporteren als een alleen-lezen link.",
|
||||
"link_button": "Exporteer naar link",
|
||||
"excalidrawplus_description": "Sla de scène op in je Excalidraw+ werkruimte.",
|
||||
"excalidrawplus_button": "Exporteren",
|
||||
"excalidrawplus_exportError": "Kan op dit moment niet exporteren naar Excalidraw+..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Lees onze blog",
|
||||
"click": "klik",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Bakgrunn",
|
||||
"fill": "Fyll",
|
||||
"strokeWidth": "Strekbreidd",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "Strekstil",
|
||||
"strokeStyle_solid": "Solid",
|
||||
"strokeStyle_dashed": "Stipla",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Skriftstorleik",
|
||||
"fontFamily": "Skrifttype",
|
||||
"onlySelected": "Kun valde",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "Med bakgrunn",
|
||||
"exportEmbedScene": "Bygg scena inn i eksportert fil",
|
||||
"exportEmbedScene_details": "Scenedata vert lagra i den eksporterte PNG- eller SVG-fila slik at scena kan bli gjenopprettast frå den. Dette vil auke eksportert filstorleik.",
|
||||
"addWatermark": "Legg til «Laga med Excalidraw»",
|
||||
"handDrawn": "Handteikna",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Vipp loddrett",
|
||||
"viewMode": "Visningsmodus",
|
||||
"toggleExportColorScheme": "Veksle eksport av fargepalett",
|
||||
"share": "Del",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": "Del"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Tilbakestill lerretet",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "Eksporter",
|
||||
"exportToPng": "Eksporter til PNG",
|
||||
"exportToSvg": "Eksporter til SVG",
|
||||
"copyToClipboard": "Kopier til utklippstavla",
|
||||
"copyPngToClipboard": "Kopier PNG til utklippstavla",
|
||||
"scale": "Skaler",
|
||||
"save": "",
|
||||
"save": "Lagre",
|
||||
"saveAs": "Lagre som",
|
||||
"load": "Opne",
|
||||
"getShareableLink": "Hent delingslenke",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Vel",
|
||||
"freedraw": "Frihandsteikning",
|
||||
"rectangle": "Rektangel",
|
||||
"diamond": "Diamant",
|
||||
"ellipse": "Ellipse",
|
||||
"arrow": "Pil",
|
||||
"line": "Linje",
|
||||
"freedraw": "",
|
||||
"text": "Tekst",
|
||||
"library": "Bibliotek",
|
||||
"lock": "Hald fram med valt verktøy"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Feil"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Les bloggen vår",
|
||||
"click": "klikk",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Rèireplan",
|
||||
"fill": "Empliment",
|
||||
"strokeWidth": "Largor de contorn",
|
||||
"strokeShape": "Fòrma del trach",
|
||||
"strokeShape_gel": "Estilo gèl",
|
||||
"strokeShape_fountain": "Calam",
|
||||
"strokeShape_brush": "Pincèl",
|
||||
"strokeStyle": "Estil de contorn",
|
||||
"strokeStyle_solid": "Solide",
|
||||
"strokeStyle_dashed": "Tiret",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Talha poliça",
|
||||
"fontFamily": "Familha de poliça",
|
||||
"onlySelected": "Seleccion sonque",
|
||||
"withBackground": "Rèireplan",
|
||||
"exportEmbedScene": "Scèna embarcada",
|
||||
"withBackground": "Inclure lo rèireplan",
|
||||
"exportEmbedScene": "Integrar la scèna al fichièr d’expo",
|
||||
"exportEmbedScene_details": "Las donadas de scèna seràn enregistradas dins lo fichièr PNG/SVG exportat, per que la scèna pòsca èsser restaurada a partir d’aqueste fichièr.\nAumentarà la talha del fichièr exportat.",
|
||||
"addWatermark": "Apondre « Fabricat amb Excalidraw »",
|
||||
"handDrawn": "A la man levada",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Virar verticalament",
|
||||
"viewMode": "Mòde de vista",
|
||||
"toggleExportColorScheme": "Alternar l’esquèma de color d’expòrt",
|
||||
"share": "Partejar",
|
||||
"showStroke": "Mostrar lo selector de color de contorn",
|
||||
"showBackground": "Mostrar lo selector de color de fons",
|
||||
"toggleTheme": "Alternar tèma"
|
||||
"share": "Partejar"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Reïnicializar lo canabàs",
|
||||
"exportJSON": "Exportar en fichièr",
|
||||
"exportImage": "Salvar coma imatge",
|
||||
"export": "Exportar",
|
||||
"exportToPng": "Exportar en PNG",
|
||||
"exportToSvg": "Exportar en SVG",
|
||||
"copyToClipboard": "Copiar al quichapapièrs",
|
||||
"copyPngToClipboard": "Copiar PNG al quichapapièrs",
|
||||
"scale": "Escala",
|
||||
"save": "Salvar al fichièr actual",
|
||||
"save": "Enregistrar",
|
||||
"saveAs": "Enregistrar jos",
|
||||
"load": "Cargar",
|
||||
"getShareableLink": "Obténer lo ligam de partatge",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Seleccion",
|
||||
"freedraw": "Dessenh liure",
|
||||
"rectangle": "Rectangle",
|
||||
"diamond": "Lausange",
|
||||
"ellipse": "Ellipsa",
|
||||
"arrow": "Sageta",
|
||||
"line": "Linha",
|
||||
"freedraw": "Dessenhar",
|
||||
"text": "Tèxt",
|
||||
"library": "Bibliotèca",
|
||||
"lock": "Mantenir activa l’aisina aprèp dessenhar"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Error"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Salvar al disc",
|
||||
"disk_details": "Exportar las donadas de la scèna cap a un fichièr que podètz importar mai tard.",
|
||||
"disk_button": "Salvar al fichièr",
|
||||
"link_title": "Ligam de partejar",
|
||||
"link_details": "Exportar coma un ligam de lectura sola.",
|
||||
"link_button": "Exportar en ligam",
|
||||
"excalidrawplus_description": "Enregistrar la scèna dins vòstre espaci de trabalh Excalidraw+.",
|
||||
"excalidrawplus_button": "Exportar",
|
||||
"excalidrawplus_exportError": "Export impossibla cap a Excalidraw+ pel moment..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Legir nòstre blog",
|
||||
"click": "clic",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "ਬੈਕਗਰਾਉਂਡ",
|
||||
"fill": "ਭਰਨਾ",
|
||||
"strokeWidth": "ਰੇਖਾ ਦੀ ਚੌੜਾਈ",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "ਜੈੱਲ ਪੈੱਨ",
|
||||
"strokeShape_fountain": "ਫਾਉਨਟੇਨ ਪੈੱਨ",
|
||||
"strokeShape_brush": "ਬੁਰਸ਼ ਪੈੱਨ",
|
||||
"strokeStyle": "ਰੇਖਾ ਦਾ ਸਟਾਇਲ",
|
||||
"strokeStyle_solid": "ਠੋਸ",
|
||||
"strokeStyle_dashed": "ਡੈਸ਼ ਵਾਲੀ",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "ਫੌਂਟ ਅਕਾਰ",
|
||||
"fontFamily": "ਫੌਂਟ ਪਰਿਵਾਰ",
|
||||
"onlySelected": "ਸਿਰਫ ਚੁਣੇ ਹੋਏ ਹੀ",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "ਬੈਕਗਰਾਉਂਂਡ ਨਾਲ",
|
||||
"exportEmbedScene": "ਦ੍ਰਿਸ਼ ਨੂੰ ਨਿਰਯਾਤ ਕੀਤੀ ਫਾਈਲ ਵਿੱਚ ਮੜ੍ਹੋ",
|
||||
"exportEmbedScene_details": "ਦ੍ਰਿਸ਼ ਦਾ ਡਾਟਾ ਨਿਰਯਾਤ ਕੀਤੀ PNG/SVG ਫਾਈਲ ਵਿੱਚ ਸਾਂਭ ਦਿੱਤਾ ਜਾਵੇਗਾ ਤਾਂ ਜੋ ਇਸ ਵਿੱਚੋਂ ਦ੍ਰਿਸ਼ ਨੂੰ ਬਹਾਲ ਕੀਤਾ ਜਾ ਸਕੇ। ਇਹ ਨਿਰਯਾਤ ਕੀਤੀ ਜਾਣ ਵਾਲੀ ਫਾਈਲ ਦਾ ਅਕਾਰ ਵਧਾ ਦੇਵੇਗਾ।",
|
||||
"addWatermark": "\"Excalidraw ਨਾਲ ਬਣਾਇਆ\" ਜੋੜੋ",
|
||||
"handDrawn": "ਹੱਥਲਿਖਤ",
|
||||
@@ -65,14 +61,14 @@
|
||||
"architect": "ਭਵਨ ਨਿਰਮਾਣਕਾਰੀ",
|
||||
"artist": "ਕਲਾਕਾਰ",
|
||||
"cartoonist": "ਕਾਰਟੂਨਿਸਟ",
|
||||
"fileTitle": "ਫਾਈਲ ਦਾ ਨਾਂ",
|
||||
"fileTitle": "",
|
||||
"colorPicker": "ਰੰਗ ਚੋਣਕਾਰ",
|
||||
"canvasBackground": "ਕੈਨਵਸ ਦਾ ਬੈਕਗਰਾਉਂਡ",
|
||||
"drawingCanvas": "ਡਰਾਇੰਗ ਕੈਨਵਸ",
|
||||
"layers": "ਪਰਤਾਂ",
|
||||
"actions": "ਕਾਰਵਾਈਆਂ",
|
||||
"language": "ਭਾਸ਼ਾ",
|
||||
"liveCollaboration": "ਲਾਇਵ ਸਹਿਯੋਗ",
|
||||
"liveCollaboration": "",
|
||||
"duplicateSelection": "ਡੁਪਲੀਕੇਟ ਬਣਾਓ",
|
||||
"untitled": "ਬੇ-ਸਿਰਨਾਵਾਂ",
|
||||
"name": "ਨਾਂ",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "",
|
||||
"viewMode": "ਦੇਖੋ ਮੋਡ",
|
||||
"toggleExportColorScheme": "",
|
||||
"share": "ਸਾਂਝਾ ਕਰੋ",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": "ਥੀਮ ਬਦਲੋ"
|
||||
"share": ""
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "ਕੈਨਵਸ ਰੀਸੈੱਟ ਕਰੋ",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "ਨਿਰਯਾਤ",
|
||||
"exportToPng": "PNG ਵਿੱਚ ਨਿਰਯਾਤ ਕਰੋ",
|
||||
"exportToSvg": "SVG ਵਿੱਚ ਨਿਰਯਾਤ ਕਰੋ",
|
||||
"copyToClipboard": "ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰੋ",
|
||||
"copyPngToClipboard": "PNG ਨੂੰ ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰੋ",
|
||||
"scale": "ਪੈਮਾਇਸ਼",
|
||||
"save": "",
|
||||
"save": "ਸਾਂਭੋ",
|
||||
"saveAs": "ਇਸ ਵਜੋਂ ਸਾਂਭੋ",
|
||||
"load": "ਲੋਡ ਕਰੋ",
|
||||
"getShareableLink": "ਸਾਂਝੀ ਕਰਨ ਵਾਲੀ ਲਿੰਕ ਲਵੋ",
|
||||
@@ -130,7 +121,7 @@
|
||||
"edit": "ਸੋਧੋ",
|
||||
"undo": "ਅਣਕੀਤਾ ਕਰੋ",
|
||||
"redo": "ਮੁੜ-ਕਰੋ",
|
||||
"resetLibrary": "ਲਾਇਬ੍ਰੇਰੀ ਰੀਸੈੱਟ ਕਰੋ",
|
||||
"resetLibrary": "",
|
||||
"createNewRoom": "ਨਵਾਂ ਕਮਰਾ ਬਣਾਓ",
|
||||
"fullScreen": "ਪੂਰੀ ਸਕਰੀਨ",
|
||||
"darkMode": "ਡਾਰਕ ਮੋਡ",
|
||||
@@ -151,22 +142,22 @@
|
||||
"loadSceneOverridePrompt": "ਬਾਹਰੀ ਡਰਾਇੰਗ ਨੂੰ ਲੋਡ ਕਰਨਾ ਤੁਹਾਡੀ ਮੌਜੂਦਾ ਸਮੱਗਰੀ ਦੀ ਥਾਂ ਲੈ ਲਵੇਗਾ। ਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?",
|
||||
"collabStopOverridePrompt": "ਇਜਲਾਸ ਨੂੰ ਰੋਕਣਾ ਪਿਛਲੀ ਲੋਕਲ ਸਾਂਭੀ ਡਰਾਇੰਗ ਦੀ ਥਾਂ ਲੈ ਲਵੇਗਾ। ਪੱਕਾ ਇੰਝ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?\n\n(ਜੇ ਤੁਸੀਂ ਆਪਣੀ ਲੋਕਲ ਡਰਾਇੰਗ ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਇਹ ਕਰਨ ਦੀ ਬਜਾਏ ਬੱਸ ਆਪਣਾ ਟੈਬ ਬੰਦ ਕਰ ਦਿਉ।)",
|
||||
"errorLoadingLibrary": "ਤੀਜੀ ਧਿਰ ਦੀ ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ ਲੋਡ ਕਰਨ ਵਿੱਚ ਗਲਤੀ ਹੋਈ ਸੀ।",
|
||||
"errorAddingToLibrary": "ਲਾਇਬ੍ਰੇਰੀ ਵਿੱਚ ਸਮੱਗਰੀ ਨਹੀਂ ਜੋੜ ਸਕੇ",
|
||||
"errorRemovingFromLibrary": "ਲਾਇਬ੍ਰੇਰੀ ਵਿੱਚੋਂ ਸਮੱਗਰੀ ਨਹੀਂ ਹਟਾ ਸਕੇ",
|
||||
"errorAddingToLibrary": "",
|
||||
"errorRemovingFromLibrary": "",
|
||||
"confirmAddLibrary": "ਇਹ ਤੁਹਾਡੀ ਲਾਇਬ੍ਰੇਰੀ ਵਿੱਚ {{numShapes}} ਆਕ੍ਰਿਤੀ(ਆਂ) ਨੂੰ ਜੋੜ ਦੇਵੇਗਾ। ਕੀ ਤੁਸੀਂ ਪੱਕਾ ਇੰਝ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?",
|
||||
"imageDoesNotContainScene": "ਫਿਲਹਾਲ ਤਸਵੀਰਾਂ ਨੂੰ ਆਯਾਤ ਕਰਨ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ।\n\nਕੀ ਤੁਸੀਂ ਦ੍ਰਿਸ਼ ਨੂੰ ਆਯਾਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਸੀ? ਇਸ ਤਸਵੀਰ ਵਿੱਚ ਦ੍ਰਿਸ਼ ਦਾ ਕੋਈ ਵੀ ਡਾਟਾ ਨਜ਼ਰ ਨਹੀਂ ਆ ਰਿਹਾ। ਕੀ ਨਿਰਯਾਤ ਦੌਰਾਨ ਤੁਸੀਂ ਇਹ ਸਮਰੱਥ ਕੀਤਾ ਸੀ?",
|
||||
"cannotRestoreFromImage": "ਇਸ ਤਸਵੀਰ ਫਾਈਲ ਤੋਂ ਦ੍ਰਿਸ਼ ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ",
|
||||
"invalidSceneUrl": "",
|
||||
"resetLibrary": "ਇਹ ਤੁਹਾਡੀ ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ ਸਾਫ ਕਰ ਦੇਵੇਗਾ। ਕੀ ਤੁਸੀਂ ਪੱਕਾ ਇੰਝ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"
|
||||
"resetLibrary": ""
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "ਚੋਣਕਾਰ",
|
||||
"freedraw": "ਖੁੱਲ੍ਹੀ ਵਾਹੀ",
|
||||
"rectangle": "ਆਇਤ",
|
||||
"diamond": "ਹੀਰਾ",
|
||||
"ellipse": "ਅੰਡਾਕਾਰ",
|
||||
"arrow": "ਤੀਰ",
|
||||
"line": "ਲਕੀਰ",
|
||||
"freedraw": "",
|
||||
"text": "ਪਾਠ",
|
||||
"library": "ਲਾਇਬ੍ਰੇਰੀ",
|
||||
"lock": "ਡਰਾਇੰਗ ਤੋਂ ਬਾਅਦ ਵੀ ਚੁਣੇ ਹੋਏ ਸੰਦ ਨੂੰ ਸਰਗਰਮ ਰੱਖੋ "
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "ਗਲਤੀ"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "ਸਾਡਾ ਬਲੌਗ ਪੜ੍ਹੋ",
|
||||
"click": "ਕਲਿੱਕ",
|
||||
@@ -276,7 +256,7 @@
|
||||
"copyToClipboardAsPng": "",
|
||||
"fileSaved": "ਫਾਈਲ ਸਾਂਭੀ ਗਈ।",
|
||||
"fileSavedToFilename": "{filename} ਵਿੱਚ ਸਾਂਭੀ",
|
||||
"canvas": "ਕੈਨਵਸ",
|
||||
"selection": "ਚੋਣ"
|
||||
"canvas": "",
|
||||
"selection": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,39 +1,38 @@
|
||||
{
|
||||
"ar-SA": 92,
|
||||
"bg-BG": 83,
|
||||
"ca-ES": 94,
|
||||
"cs-CZ": 36,
|
||||
"ar-SA": 84,
|
||||
"bg-BG": 92,
|
||||
"ca-ES": 99,
|
||||
"de-DE": 100,
|
||||
"el-GR": 88,
|
||||
"el-GR": 97,
|
||||
"en": 100,
|
||||
"es-ES": 98,
|
||||
"fa-IR": 79,
|
||||
"es-ES": 99,
|
||||
"fa-IR": 87,
|
||||
"fi-FI": 99,
|
||||
"fr-FR": 100,
|
||||
"he-IL": 80,
|
||||
"hi-IN": 82,
|
||||
"hu-HU": 73,
|
||||
"he-IL": 88,
|
||||
"hi-IN": 91,
|
||||
"hu-HU": 80,
|
||||
"id-ID": 100,
|
||||
"it-IT": 99,
|
||||
"ja-JP": 98,
|
||||
"kab-KAB": 98,
|
||||
"ko-KR": 83,
|
||||
"lv-LV": 17,
|
||||
"my-MM": 68,
|
||||
"it-IT": 100,
|
||||
"ja-JP": 96,
|
||||
"kab-KAB": 99,
|
||||
"ko-KR": 91,
|
||||
"lv-LV": 0,
|
||||
"my-MM": 75,
|
||||
"nb-NO": 100,
|
||||
"nl-NL": 100,
|
||||
"nn-NO": 90,
|
||||
"nn-NO": 100,
|
||||
"oc-FR": 100,
|
||||
"pa-IN": 89,
|
||||
"pl-PL": 85,
|
||||
"pt-BR": 90,
|
||||
"pt-PT": 92,
|
||||
"pa-IN": 93,
|
||||
"pl-PL": 94,
|
||||
"pt-BR": 100,
|
||||
"pt-PT": 99,
|
||||
"ro-RO": 100,
|
||||
"ru-RU": 97,
|
||||
"sk-SK": 100,
|
||||
"sv-SE": 100,
|
||||
"tr-TR": 91,
|
||||
"uk-UA": 97,
|
||||
"zh-CN": 98,
|
||||
"tr-TR": 100,
|
||||
"uk-UA": 100,
|
||||
"zh-CN": 100,
|
||||
"zh-TW": 99
|
||||
}
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Kolor wypełnienia",
|
||||
"fill": "Wypełnienie",
|
||||
"strokeWidth": "Grubość obramowania",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "Styl obrysu",
|
||||
"strokeStyle_solid": "Pełny",
|
||||
"strokeStyle_dashed": "Kreskowany",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Rozmiar tekstu",
|
||||
"fontFamily": "Krój pisma",
|
||||
"onlySelected": "Tylko wybrane",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "Z tłem",
|
||||
"exportEmbedScene": "Osadź scenę w eksportowanym pliku",
|
||||
"exportEmbedScene_details": "Dane sceny zostaną zapisane w eksportowanym pliku PNG/SVG tak, aby scena mogła zostać z niego przywrócona.\nZwiększy to rozmiar eksportowanego pliku.",
|
||||
"addWatermark": "Dodaj \"Zrobione w Excalidraw\"",
|
||||
"handDrawn": "Odręczny",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "",
|
||||
"viewMode": "Tryb widoku",
|
||||
"toggleExportColorScheme": "",
|
||||
"share": "",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": ""
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Wyczyść dokument i zresetuj kolor dokumentu",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "Zapisz jako",
|
||||
"exportToPng": "Zapisz jako PNG",
|
||||
"exportToSvg": "Zapisz jako SVG",
|
||||
"copyToClipboard": "Skopiuj do schowka",
|
||||
"copyPngToClipboard": "Skopiuj do schowka jako plik PNG",
|
||||
"scale": "Skala",
|
||||
"save": "",
|
||||
"save": "Zapisz",
|
||||
"saveAs": "Zapisz jako",
|
||||
"load": "Otwórz",
|
||||
"getShareableLink": "Udostępnij",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Zaznaczenie",
|
||||
"freedraw": "Swobodne rysowanie",
|
||||
"rectangle": "Prostokąt",
|
||||
"diamond": "Romb",
|
||||
"ellipse": "Elipsa",
|
||||
"arrow": "Strzałka",
|
||||
"line": "Linia",
|
||||
"freedraw": "",
|
||||
"text": "Tekst",
|
||||
"library": "Biblioteka",
|
||||
"lock": "Zablokuj wybrane narzędzie"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Wystąpił błąd"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Przeczytaj na naszym blogu",
|
||||
"click": "kliknięcie",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Fundo",
|
||||
"fill": "Preenchimento",
|
||||
"strokeWidth": "Espessura do traço",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "Estilo de traço",
|
||||
"strokeStyle_solid": "Sólido",
|
||||
"strokeStyle_dashed": "Tracejado",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Tamanho da fonte",
|
||||
"fontFamily": "Família da fonte",
|
||||
"onlySelected": "Somente a seleção",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "Com fundo",
|
||||
"exportEmbedScene": "Incorporar a cena no arquivo 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\"",
|
||||
"handDrawn": "Manuscrito",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Inverter verticalmente",
|
||||
"viewMode": "Modo de visualização",
|
||||
"toggleExportColorScheme": "Alternar esquema de cores de exportação",
|
||||
"share": "Compartilhar",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": "Compartilhar"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Limpar o canvas e redefinir a cor de fundo",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "Exportar",
|
||||
"exportToPng": "Exportar em PNG",
|
||||
"exportToSvg": "Exportar em SVG",
|
||||
"copyToClipboard": "Copiar para o clipboard",
|
||||
"copyPngToClipboard": "Copiar PNG para área de transferência",
|
||||
"scale": "Escala",
|
||||
"save": "",
|
||||
"save": "Salvar",
|
||||
"saveAs": "Salvar como",
|
||||
"load": "Carregar",
|
||||
"getShareableLink": "Obter um link de compartilhamento",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Seleção",
|
||||
"freedraw": "Desenho livre",
|
||||
"rectangle": "Retângulo",
|
||||
"diamond": "Losango",
|
||||
"ellipse": "Elipse",
|
||||
"arrow": "Flecha",
|
||||
"line": "Linha",
|
||||
"freedraw": "",
|
||||
"text": "Texto",
|
||||
"library": "Biblioteca",
|
||||
"lock": "Manter ativa a ferramenta selecionada após desenhar"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Erro"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Leia o nosso blog",
|
||||
"click": "clicar",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Fundo",
|
||||
"fill": "Preenchimento",
|
||||
"strokeWidth": "Espessura do traço",
|
||||
"strokeShape": "Forma do traço",
|
||||
"strokeShape_gel": "Caneta de gel",
|
||||
"strokeShape_fountain": "Caneta de fonte",
|
||||
"strokeShape_brush": "Caneta de pincel",
|
||||
"strokeStyle": "Estilo de traço",
|
||||
"strokeStyle_solid": "Sólido",
|
||||
"strokeStyle_dashed": "Tracejado",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Tamanho da fonte",
|
||||
"fontFamily": "Família da fontes",
|
||||
"onlySelected": "Somente a seleção",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "Com fundo",
|
||||
"exportEmbedScene": "Incorporar a cena no arquivo 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\"",
|
||||
"handDrawn": "Manuscrito",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Inverter verticalmente",
|
||||
"viewMode": "Modo de visualização",
|
||||
"toggleExportColorScheme": "Alternar esquema de cores de exportação",
|
||||
"share": "Partilhar",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": "Alternar tema"
|
||||
"share": "Partilhar"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Limpar o canvas e redefinir a cor de fundo",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "Exportar",
|
||||
"exportToPng": "Exportar em PNG",
|
||||
"exportToSvg": "Exportar em SVG",
|
||||
"copyToClipboard": "Copiar para o clipboard",
|
||||
"copyPngToClipboard": "Copiar PNG para área de transferência",
|
||||
"scale": "Escala",
|
||||
"save": "",
|
||||
"save": "Guardar",
|
||||
"saveAs": "Salvar como",
|
||||
"load": "Carregar",
|
||||
"getShareableLink": "Obter um link de partilha",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Seleção",
|
||||
"freedraw": "Desenho livre",
|
||||
"rectangle": "Retângulo",
|
||||
"diamond": "Losango",
|
||||
"ellipse": "Elipse",
|
||||
"arrow": "Flecha",
|
||||
"line": "Linha",
|
||||
"freedraw": "Desenhar",
|
||||
"text": "Texto",
|
||||
"library": "Biblioteca",
|
||||
"lock": "Manter a ferramenta selecionada ativa após desenhar"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Erro"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Leia o nosso blog",
|
||||
"click": "clicar",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Fundal",
|
||||
"fill": "Umplere",
|
||||
"strokeWidth": "Lățimea conturului",
|
||||
"strokeShape": "Forma conturului",
|
||||
"strokeShape_gel": "Pix cu gel",
|
||||
"strokeShape_fountain": "Stilou",
|
||||
"strokeShape_brush": "Pensulă tip stilou",
|
||||
"strokeStyle": "Stilul conturului",
|
||||
"strokeStyle_solid": "Neîntrerupt",
|
||||
"strokeStyle_dashed": "Liniuțe",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Dimensiune font",
|
||||
"fontFamily": "Familia de fonturi",
|
||||
"onlySelected": "Numai selecția",
|
||||
"withBackground": "Fundal",
|
||||
"exportEmbedScene": "Încorporare scenă",
|
||||
"withBackground": "Cu fundal",
|
||||
"exportEmbedScene": "Încorporează scena în fișierul exportat",
|
||||
"exportEmbedScene_details": "Datele scenei vor fi salvate în fișierul PNG/SVG exportat, astfel că scena va putea fi restaurată din acesta.\nVa crește dimensiunea fișierului exportat.",
|
||||
"addWatermark": "Adaugă „Realizat cu Excalidraw”",
|
||||
"handDrawn": "Scris de mână",
|
||||
@@ -100,25 +96,20 @@
|
||||
"flipVertical": "Răsturnare verticală",
|
||||
"viewMode": "Mod de vizualizare",
|
||||
"toggleExportColorScheme": "Comutare schemă de culori de export",
|
||||
"share": "Distribuie",
|
||||
"showStroke": "Afișare selector culoare contur",
|
||||
"showBackground": "Afișare selector culoare fundal",
|
||||
"toggleTheme": "Comutare temă"
|
||||
"share": "Distribuie"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Resetare pânză",
|
||||
"exportJSON": "Exportare la fișiere",
|
||||
"exportImage": "Salvare ca imagine",
|
||||
"export": "Exportare",
|
||||
"exportToPng": "Exportare ca PNG",
|
||||
"exportToSvg": "Exportare ca SVG",
|
||||
"copyToClipboard": "Copiere în memoria temporară",
|
||||
"copyPngToClipboard": "Copiere PNG în memoria temporară",
|
||||
"scale": "Scală",
|
||||
"save": "Salvare în fișierul curent",
|
||||
"save": "Salvare",
|
||||
"saveAs": "Salvare ca",
|
||||
"load": "Încărcare",
|
||||
"getShareableLink": "Obține URL partajabil",
|
||||
"getShareableLink": "Legătură partajabilă",
|
||||
"close": "Închidere",
|
||||
"selectLanguage": "Selectare limbă",
|
||||
"scrollBackToContent": "Derulare înapoi la conținut",
|
||||
@@ -140,8 +131,8 @@
|
||||
},
|
||||
"alerts": {
|
||||
"clearReset": "Această opțiune va șterge întreaga pânză. Confirmi?",
|
||||
"couldNotCreateShareableLink": "Nu s-a putut crea un URL partajabil.",
|
||||
"couldNotCreateShareableLinkTooBig": "Nu s-a putut crea un URL partajabil: scena este prea mare",
|
||||
"couldNotCreateShareableLink": "Legătura partajabilă nu a putut fi creată.",
|
||||
"couldNotCreateShareableLinkTooBig": "Nu s-a putut crea o legătură partajabilă: scena este prea mare",
|
||||
"couldNotLoadInvalidFile": "Fișierul invalid nu a putut fi încărcat",
|
||||
"importBackendFailed": "Importarea de la nivel de server a eșuat.",
|
||||
"cannotExportEmptyCanvas": "Nu se poate exporta pânza goală.",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Selecție",
|
||||
"freedraw": "Desenare liberă",
|
||||
"rectangle": "Dreptunghi",
|
||||
"diamond": "Romb",
|
||||
"ellipse": "Elipsă",
|
||||
"arrow": "Săgeată",
|
||||
"line": "Linie",
|
||||
"freedraw": "Desenare",
|
||||
"text": "Text",
|
||||
"library": "Bibliotecă",
|
||||
"lock": "Menține activ instrumentul selectat după desenare"
|
||||
@@ -212,24 +203,13 @@
|
||||
"button_startSession": "Pornire sesiune",
|
||||
"button_stopSession": "Oprire sesiune",
|
||||
"desc_inProgressIntro": "Sesiunea de colaborare în direct este în curs de desfășurare.",
|
||||
"desc_shareLink": "Distribuie acest URL persoanelor cu care dorești să colaborezi:",
|
||||
"desc_shareLink": "Distribuie această legătură persoanelor cu care dorești să colaborezi:",
|
||||
"desc_exitSession": "Oprirea sesiunii te va deconecta de la sală, însă vei putea lucra în continuare, pe plan local, cu scena. Reține că această opțiune nu va afecta alte persoane, iar acestea vor putea să colaboreze în continuare pe versiunea lor.",
|
||||
"shareTitle": "Alătură-te unei sesiuni de colaborare în direct pe Excalidraw"
|
||||
},
|
||||
"errorDialog": {
|
||||
"title": "Eroare"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Salvare pe disc",
|
||||
"disk_details": "Exportă datele scenei pe un fișier din care poți importa mai târziu.",
|
||||
"disk_button": "Salvare în fișier",
|
||||
"link_title": "URL partajabil",
|
||||
"link_details": "Exportă ca URL doar în citire.",
|
||||
"link_button": "Exportare în URL",
|
||||
"excalidrawplus_description": "Salvează scena în spațiul de lucru Excalidraw+.",
|
||||
"excalidrawplus_button": "Exportare",
|
||||
"excalidrawplus_exportError": "Excalidraw+ nu a putut fi exportat în acest moment..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Citește blogul nostru",
|
||||
"click": "clic",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Фон",
|
||||
"fill": "Заливка",
|
||||
"strokeWidth": "Толщина штриха",
|
||||
"strokeShape": "Стиль обводки",
|
||||
"strokeShape_gel": "Гелевая ручка",
|
||||
"strokeShape_fountain": "Фонтанная ручка",
|
||||
"strokeShape_brush": "Кисть",
|
||||
"strokeStyle": "Стиль обводки",
|
||||
"strokeStyle_solid": "Сплошная",
|
||||
"strokeStyle_dashed": "Пунктирная",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Размер шрифта",
|
||||
"fontFamily": "Семейство шрифтов",
|
||||
"onlySelected": "Только выбранные",
|
||||
"withBackground": "Фон",
|
||||
"exportEmbedScene": "Встроить сцену",
|
||||
"withBackground": "С фоном",
|
||||
"exportEmbedScene": "Встроить информацию о сцене в экспортируемый файл",
|
||||
"exportEmbedScene_details": "Сцена будет сохранена в PNG/SVG файл так, чтобы всю сцену можно будет восстановить из этого файла. Это увеличит размер файла.",
|
||||
"addWatermark": "Добавить «Создано в Excalidraw»",
|
||||
"handDrawn": "От руки",
|
||||
@@ -96,26 +92,21 @@
|
||||
"centerHorizontally": "Центрировать по горизонтали",
|
||||
"distributeHorizontally": "Распределить по горизонтали",
|
||||
"distributeVertically": "Распределить по вертикали",
|
||||
"flipHorizontal": "Переворот по горизонтали",
|
||||
"flipVertical": "Переворот по вертикали",
|
||||
"flipHorizontal": "",
|
||||
"flipVertical": "",
|
||||
"viewMode": "Вид",
|
||||
"toggleExportColorScheme": "Экспортировать цветовую схему",
|
||||
"share": "Поделиться",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": ""
|
||||
"share": "Поделиться"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Очистить холст и сбросить цвет фона",
|
||||
"exportJSON": "Сохранить в",
|
||||
"exportImage": "Сохранить как изображение",
|
||||
"export": "Экспортировать",
|
||||
"exportToPng": "Экспорт в PNG",
|
||||
"exportToSvg": "Экспорт в SVG",
|
||||
"copyToClipboard": "Скопировать в буфер обмена",
|
||||
"copyPngToClipboard": "Скопировать PNG в буфер обмена",
|
||||
"scale": "Масштаб",
|
||||
"save": "Сохранить в текущий файл",
|
||||
"save": "Сохранить",
|
||||
"saveAs": "Сохранить как",
|
||||
"load": "Загрузить",
|
||||
"getShareableLink": "Получить доступ по ссылке",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Выделение области",
|
||||
"freedraw": "Свободное рисование",
|
||||
"rectangle": "Прямоугольник",
|
||||
"diamond": "Ромб",
|
||||
"ellipse": "Эллипс",
|
||||
"arrow": "Cтрелка",
|
||||
"line": "Линия",
|
||||
"freedraw": "",
|
||||
"text": "Текст",
|
||||
"library": "Библиотека",
|
||||
"lock": "Сохранять выбранный инструмент активным после рисования"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Ошибка"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Сохранить на диск",
|
||||
"disk_details": "Экспортировать данные сцены в файл, из которого можно импортировать позже.",
|
||||
"disk_button": "Сохранить в файл",
|
||||
"link_title": "Поделитесь ссылкой",
|
||||
"link_details": "Экспорт ссылки только для чтения.",
|
||||
"link_button": "Экспорт в ссылку",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "Экспорт",
|
||||
"excalidrawplus_exportError": "Не удалось экспортировать в Excalidraw+ на данный момент..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Прочитайте наш блог",
|
||||
"click": "нажать",
|
||||
@@ -253,7 +233,7 @@
|
||||
},
|
||||
"encrypted": {
|
||||
"tooltip": "Ваши данные защищены сквозным (End-to-end) шифрованием. Серверы Excalidraw никогда не получат доступ к ним.",
|
||||
"link": "Запись блога о сквозном шифровании в Excalidraw"
|
||||
"link": ""
|
||||
},
|
||||
"stats": {
|
||||
"angle": "Угол",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Pozadie",
|
||||
"fill": "Výplň",
|
||||
"strokeWidth": "Hrúbka obrysu",
|
||||
"strokeShape": "Tvar obrysu",
|
||||
"strokeShape_gel": "Gélové pero",
|
||||
"strokeShape_fountain": "Plniace pero",
|
||||
"strokeShape_brush": "Fixka",
|
||||
"strokeStyle": "Štýl obrysu",
|
||||
"strokeStyle_solid": "Plný",
|
||||
"strokeStyle_dashed": "Čiarkovaný",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Veľkosť písma",
|
||||
"fontFamily": "Písmo",
|
||||
"onlySelected": "Iba vybrané",
|
||||
"withBackground": "Pozadie",
|
||||
"exportEmbedScene": "Zahrnúť scénu",
|
||||
"withBackground": "S pozadím",
|
||||
"exportEmbedScene": "Uložiť scénu do exportovaného súboru",
|
||||
"exportEmbedScene_details": "Údaje scény budú uložené do exportovaného PNG/SVG súboru, takže scéna z neho môže byť opäť obnovená.\nBude to mať za následok zvýšenie veľkosti súboru.",
|
||||
"addWatermark": "Pridať \"Vytvorené s Excalidraw\"",
|
||||
"handDrawn": "Ručne písané",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Prevrátiť zvislo",
|
||||
"viewMode": "Režim zobrazenia",
|
||||
"toggleExportColorScheme": "Prepnúť exportovanie farebnej schémy",
|
||||
"share": "Zdieľať",
|
||||
"showStroke": "Zobraziť výber farby pre obrys",
|
||||
"showBackground": "Zobraziť výber farby pre pozadie",
|
||||
"toggleTheme": "Prepnúť tému"
|
||||
"share": "Zdieľať"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Obnoviť plátno",
|
||||
"exportJSON": "Exportovať do súboru",
|
||||
"exportImage": "Uložiť ako obrázok",
|
||||
"export": "Exportovať",
|
||||
"exportToPng": "Exportovať do PNG",
|
||||
"exportToSvg": "Exportovať do SVG",
|
||||
"copyToClipboard": "Kopírovať do schránky",
|
||||
"copyPngToClipboard": "Kopírovať PNG do schránky",
|
||||
"scale": "Mierka",
|
||||
"save": "Uložiť do aktuálneho súboru",
|
||||
"save": "Uložiť",
|
||||
"saveAs": "Uložiť ako",
|
||||
"load": "Nahrať",
|
||||
"getShareableLink": "Získať odkaz na zdieľanie",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Výber",
|
||||
"freedraw": "Voľné kreslenie",
|
||||
"rectangle": "Obdĺžnik",
|
||||
"diamond": "Diamant",
|
||||
"ellipse": "Elipsa",
|
||||
"arrow": "Šípka",
|
||||
"line": "Čiara",
|
||||
"freedraw": "Kresliť",
|
||||
"text": "Text",
|
||||
"library": "Knižnica",
|
||||
"lock": "Nechať zvolený nástroj aktívny po skončení kreslenia"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Chyba"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Uložiť na disk",
|
||||
"disk_details": "Exportovať údaje scény do súboru, z ktorého môžu byť neskôr importované.",
|
||||
"disk_button": "Uložiť do súboru",
|
||||
"link_title": "Odkaz na zdieľanie",
|
||||
"link_details": "Exportovať ako odkaz iba na čítanie.",
|
||||
"link_button": "Exportovať ako odkaz",
|
||||
"excalidrawplus_description": "Uložiť scénu do vášho Excalidraw+ pracovného priestoru.",
|
||||
"excalidrawplus_button": "Exportovať",
|
||||
"excalidrawplus_exportError": "Nepodarilo sa vykonať export do Excalidraw+..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Prečítajte si náš blog",
|
||||
"click": "kliknutie",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Bakgrund",
|
||||
"fill": "Fyllnad",
|
||||
"strokeWidth": "Linjebredd",
|
||||
"strokeShape": "Linjeform",
|
||||
"strokeShape_gel": "Gelépenna",
|
||||
"strokeShape_fountain": "Reservoarpenna",
|
||||
"strokeShape_brush": "Penselpenna",
|
||||
"strokeStyle": "Linjestil",
|
||||
"strokeStyle_solid": "Solid",
|
||||
"strokeStyle_dashed": "Streckad",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Teckenstorlek",
|
||||
"fontFamily": "Teckensnitt",
|
||||
"onlySelected": "Endast markering",
|
||||
"withBackground": "Bakgrund",
|
||||
"exportEmbedScene": "Bädda in skiss",
|
||||
"withBackground": "Med bakgrund",
|
||||
"exportEmbedScene": "Bädda in skiss i exporterad fil",
|
||||
"exportEmbedScene_details": "Skissdata kommer att sparas i den exporterade PNG/SVG-filen så att skissen kan återställas från den.\nKommer att öka exporterad filstorlek.",
|
||||
"addWatermark": "Lägg till \"Skapad med Excalidraw\"",
|
||||
"handDrawn": "Handritad",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Vänd vertikalt",
|
||||
"viewMode": "Visningsläge",
|
||||
"toggleExportColorScheme": "Växla färgschema för export",
|
||||
"share": "Dela",
|
||||
"showStroke": "Visa färgväljare för linjefärg",
|
||||
"showBackground": "Visa färgväljare för bakgrundsfärg",
|
||||
"toggleTheme": "Växla tema"
|
||||
"share": "Dela"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Återställ canvasen",
|
||||
"exportJSON": "Exportera till fil",
|
||||
"exportImage": "Spara som bild",
|
||||
"export": "Exportera",
|
||||
"exportToPng": "Exportera till PNG",
|
||||
"exportToSvg": "Exportera till SVG",
|
||||
"copyToClipboard": "Kopiera till urklipp",
|
||||
"copyPngToClipboard": "Kopiera PNG till urklipp",
|
||||
"scale": "Skala",
|
||||
"save": "Spara till aktuell fil",
|
||||
"save": "Spara",
|
||||
"saveAs": "Spara som",
|
||||
"load": "Öppna",
|
||||
"getShareableLink": "Hämta delbar länk",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Markering",
|
||||
"freedraw": "Frihand",
|
||||
"rectangle": "Rektangel",
|
||||
"diamond": "Diamant",
|
||||
"ellipse": "Ellips",
|
||||
"arrow": "Pil",
|
||||
"line": "Linje",
|
||||
"freedraw": "Rita",
|
||||
"text": "Text",
|
||||
"library": "Bibliotek",
|
||||
"lock": "Håll valt verktyg aktivt efter ritande"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Fel"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Spara till disk",
|
||||
"disk_details": "Exportera skissdata till en fil som du kan importera från senare.",
|
||||
"disk_button": "Spara till fil",
|
||||
"link_title": "Delbar länk",
|
||||
"link_details": "Exportera som en skrivskyddad länk.",
|
||||
"link_button": "Exportera till länk",
|
||||
"excalidrawplus_description": "Spara skissen till din Excalidraw+ arbetsyta.",
|
||||
"excalidrawplus_button": "Exportera",
|
||||
"excalidrawplus_exportError": "Det gick inte att exportera till Excalidraw+ just nu..."
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Läs vår blogg",
|
||||
"click": "klicka",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Arka plan",
|
||||
"fill": "Doldur",
|
||||
"strokeWidth": "Kontur genişliği",
|
||||
"strokeShape": "",
|
||||
"strokeShape_gel": "",
|
||||
"strokeShape_fountain": "",
|
||||
"strokeShape_brush": "",
|
||||
"strokeStyle": "Kontur stili",
|
||||
"strokeStyle_solid": "Dolu",
|
||||
"strokeStyle_dashed": "Kesik çizgili",
|
||||
@@ -34,7 +30,7 @@
|
||||
"edges": "Kenarlar",
|
||||
"sharp": "Keskin",
|
||||
"round": "Yuvarlak",
|
||||
"arrowheads": "Ok uçları",
|
||||
"arrowheads": "Ok başları",
|
||||
"arrowhead_none": "Yok",
|
||||
"arrowhead_arrow": "Ok",
|
||||
"arrowhead_bar": "Çizgi",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Yazı tipi boyutu",
|
||||
"fontFamily": "Yazı tipi ailesi",
|
||||
"onlySelected": "Sadece seçilen",
|
||||
"withBackground": "",
|
||||
"exportEmbedScene": "",
|
||||
"withBackground": "Arka planla beraber",
|
||||
"exportEmbedScene": "Sahneyi çıktı dosyasına dahil et",
|
||||
"exportEmbedScene_details": "Sahne datası, daha sonra geri kullanılabilmesi için çıktı alınan PNG/SVG dosyasına dahil edicelek. Bu işlem dosya boyutunu arttıracaktır.",
|
||||
"addWatermark": "\"Excalidraw ile yapıldı\" yazısını ekle",
|
||||
"handDrawn": "El-yazısı",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Dikey döndür",
|
||||
"viewMode": "Görünüm modu",
|
||||
"toggleExportColorScheme": "Renk şemasını dışa aktar/aktarma",
|
||||
"share": "Paylaş",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": "Temayı etkinleştir/devre dışı bırak"
|
||||
"share": "Paylaş"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Tuvali sıfırla",
|
||||
"exportJSON": "",
|
||||
"exportImage": "",
|
||||
"export": "Dışa aktar",
|
||||
"exportToPng": "PNG olarak dışa aktar",
|
||||
"exportToSvg": "SVG olarak dışa aktar",
|
||||
"copyToClipboard": "Panoya kopyala",
|
||||
"copyPngToClipboard": "PNG'yi panoya kopyala",
|
||||
"scale": "Ölçek",
|
||||
"save": "",
|
||||
"save": "Kaydet",
|
||||
"saveAs": "Farklı kaydet",
|
||||
"load": "Yükle",
|
||||
"getShareableLink": "Paylaşılabilir bağlantı al",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Seçme",
|
||||
"freedraw": "Serbest çizim",
|
||||
"rectangle": "Dikdörtgen",
|
||||
"diamond": "Elmas",
|
||||
"ellipse": "Elips",
|
||||
"arrow": "Ok",
|
||||
"line": "Çizgi",
|
||||
"freedraw": "Çiz",
|
||||
"text": "Yazı",
|
||||
"library": "Kütüphane",
|
||||
"lock": "Seçilen aracı çizimden sonra aktif tut"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Hata"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "",
|
||||
"disk_details": "",
|
||||
"disk_button": "",
|
||||
"link_title": "",
|
||||
"link_details": "",
|
||||
"link_button": "",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Blog'umuzu okuyun",
|
||||
"click": "tıkla",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "Тло",
|
||||
"fill": "Заповнити",
|
||||
"strokeWidth": "Товщина контуру",
|
||||
"strokeShape": "Форма обведення",
|
||||
"strokeShape_gel": "Гельручка",
|
||||
"strokeShape_fountain": "Перо",
|
||||
"strokeShape_brush": "Пензель",
|
||||
"strokeStyle": "Стиль контуру",
|
||||
"strokeStyle_solid": "Суцільний",
|
||||
"strokeStyle_dashed": "Пунктир",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "Розмір шрифту",
|
||||
"fontFamily": "Шрифт",
|
||||
"onlySelected": "Тільки вибране",
|
||||
"withBackground": "Фон",
|
||||
"exportEmbedScene": "Вбудована сцена",
|
||||
"withBackground": "З фоном",
|
||||
"exportEmbedScene": "Вставити сцену в експортований файл",
|
||||
"exportEmbedScene_details": "Дані сцени будуть збережені в експортований файл PNG/SVG. Ця сцена може бути відновленна з нього, однак це збільшить розмір експортованого файлу.",
|
||||
"addWatermark": "Додати «Накреслене в Excalidraw»",
|
||||
"handDrawn": "Рукописний",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "Віддзеркалити вертикально",
|
||||
"viewMode": "Режим перегляду",
|
||||
"toggleExportColorScheme": "Переключити колірну схему експорту",
|
||||
"share": "Поділитися",
|
||||
"showStroke": "",
|
||||
"showBackground": "",
|
||||
"toggleTheme": "Перемкнути тему"
|
||||
"share": "Поділитися"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "Очистити полотно",
|
||||
"exportJSON": "Експорт у файл",
|
||||
"exportImage": "Зберегти як зображення",
|
||||
"export": "Експортувати",
|
||||
"exportToPng": "Експортувати в PNG",
|
||||
"exportToSvg": "Експортувати в SVG",
|
||||
"copyToClipboard": "Скопіювати до буферу обміну",
|
||||
"copyPngToClipboard": "Скопіювати PNG до буферу обміну",
|
||||
"scale": "Масштаб",
|
||||
"save": "Зберегти до поточного файлу",
|
||||
"save": "Зберегти",
|
||||
"saveAs": "Зберегти як",
|
||||
"load": "Завантажити",
|
||||
"getShareableLink": "Отримати посилання",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "Виділення",
|
||||
"freedraw": "Вільне креслення",
|
||||
"rectangle": "Прямокутник",
|
||||
"diamond": "Ромб",
|
||||
"ellipse": "Еліпс",
|
||||
"arrow": "Стрілка",
|
||||
"line": "Лінія",
|
||||
"freedraw": "Малювати",
|
||||
"text": "Текст",
|
||||
"library": "Бібліотека",
|
||||
"lock": "Залишити обраний інструмент після креслення"
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "Помилка"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "Зберегти на диск",
|
||||
"disk_details": "Експорт даних сцени в файл, з якого можна імпортувати пізніше.",
|
||||
"disk_button": "Зберегти до файлу",
|
||||
"link_title": "Доступ за посиланням",
|
||||
"link_details": "Експортувати як посилання тільки для читання.",
|
||||
"link_button": "Експортувати у посилання",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "Наш блог",
|
||||
"click": "натиснути",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "背景",
|
||||
"fill": "填充",
|
||||
"strokeWidth": "描边宽度",
|
||||
"strokeShape": "描边形状",
|
||||
"strokeShape_gel": "中性笔",
|
||||
"strokeShape_fountain": "钢笔",
|
||||
"strokeShape_brush": "墨笔",
|
||||
"strokeStyle": "描边 (样式)",
|
||||
"strokeStyle_solid": "实线",
|
||||
"strokeStyle_dashed": "虚线",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "字体大小",
|
||||
"fontFamily": "字体",
|
||||
"onlySelected": "仅被选中",
|
||||
"withBackground": "背景",
|
||||
"exportEmbedScene": "包含画布数据",
|
||||
"withBackground": "包括背景",
|
||||
"exportEmbedScene": "将画布数据嵌入到导出的文件",
|
||||
"exportEmbedScene_details": "画布数据将被保存到导出的 PNG/SVG 文件,以便恢复。\n将会增加导出的文件大小。",
|
||||
"addWatermark": "添加 “使用 Excalidraw 创建” 水印",
|
||||
"handDrawn": "手写",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "垂直翻转",
|
||||
"viewMode": "查看模式",
|
||||
"toggleExportColorScheme": "切换导出配色方案",
|
||||
"share": "分享",
|
||||
"showStroke": "显示描边颜色选择器",
|
||||
"showBackground": "显示背景颜色选择器",
|
||||
"toggleTheme": "切换主题"
|
||||
"share": "分享"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "重置画布",
|
||||
"exportJSON": "导出为文件",
|
||||
"exportImage": "保存为图像",
|
||||
"export": "导出",
|
||||
"exportToPng": "导出为 PNG",
|
||||
"exportToSvg": "导出为 SVG",
|
||||
"copyToClipboard": "复制到剪贴板",
|
||||
"copyPngToClipboard": "复制 PNG 到剪切板",
|
||||
"scale": "缩放",
|
||||
"save": "保存至当前文件",
|
||||
"save": "保存",
|
||||
"saveAs": "保存为",
|
||||
"load": "载入文件",
|
||||
"getShareableLink": "获取共享链接",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "选择",
|
||||
"freedraw": "自由书写",
|
||||
"rectangle": "矩形",
|
||||
"diamond": "菱形",
|
||||
"ellipse": "椭圆",
|
||||
"arrow": "箭头",
|
||||
"line": "线条",
|
||||
"freedraw": "自由书写",
|
||||
"text": "文字",
|
||||
"library": "库",
|
||||
"lock": "绘制后保持所选的工具栏状态"
|
||||
@@ -178,7 +169,7 @@
|
||||
},
|
||||
"hints": {
|
||||
"linearElement": "点击创建多个点 拖动创建直线",
|
||||
"freeDraw": "点击并拖动,完成时松开",
|
||||
"freeDraw": "点击并拖动,完成后发布",
|
||||
"text": "提示:您也可以使用选择工具双击任意位置来添加文字",
|
||||
"linearElementMulti": "点击最后一个点或按下 Esc/Enter 来完成",
|
||||
"lockAngle": "可以按住 Shift 来约束角度",
|
||||
@@ -219,17 +210,6 @@
|
||||
"errorDialog": {
|
||||
"title": "错误"
|
||||
},
|
||||
"exportDialog": {
|
||||
"disk_title": "保存到本地",
|
||||
"disk_details": "将画布数据导出为文件,以便以后导入",
|
||||
"disk_button": "保存为文件",
|
||||
"link_title": "分享链接",
|
||||
"link_details": "导出为只读链接。",
|
||||
"link_button": "导出链接",
|
||||
"excalidrawplus_description": "",
|
||||
"excalidrawplus_button": "",
|
||||
"excalidrawplus_exportError": ""
|
||||
},
|
||||
"helpDialog": {
|
||||
"blog": "浏览我们的博客",
|
||||
"click": "单击",
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
"background": "背景",
|
||||
"fill": "填充",
|
||||
"strokeWidth": "筆劃寬度",
|
||||
"strokeShape": "筆畫形狀",
|
||||
"strokeShape_gel": "中性筆",
|
||||
"strokeShape_fountain": "鋼筆",
|
||||
"strokeShape_brush": "毛筆",
|
||||
"strokeStyle": "筆畫樣式",
|
||||
"strokeStyle_solid": "實線",
|
||||
"strokeStyle_dashed": "虛線",
|
||||
@@ -42,8 +38,8 @@
|
||||
"fontSize": "字型大小",
|
||||
"fontFamily": "字體",
|
||||
"onlySelected": "僅選取物件",
|
||||
"withBackground": "背景",
|
||||
"exportEmbedScene": "嵌入場景",
|
||||
"withBackground": "包含背景",
|
||||
"exportEmbedScene": "在輸出的檔案中嵌入場景",
|
||||
"exportEmbedScene_details": "用於回復場景的場景資料會被包含在輸出的 PNG/SVG 檔案中。\n會增加輸出的檔案大小。",
|
||||
"addWatermark": "加上 \"Made with Excalidraw\"",
|
||||
"handDrawn": "手寫",
|
||||
@@ -100,22 +96,17 @@
|
||||
"flipVertical": "垂直翻轉",
|
||||
"viewMode": "檢視模式",
|
||||
"toggleExportColorScheme": "切換輸出配色",
|
||||
"share": "共享",
|
||||
"showStroke": "顯示線條檢色器",
|
||||
"showBackground": "顯示背景檢色器",
|
||||
"toggleTheme": "切換主題"
|
||||
"share": "共享"
|
||||
},
|
||||
"buttons": {
|
||||
"clearReset": "重置 canvas",
|
||||
"exportJSON": "匯出至檔案",
|
||||
"exportImage": "另存為圖片",
|
||||
"export": "輸出",
|
||||
"exportToPng": "輸出成 PNG",
|
||||
"exportToSvg": "輸出成 SVG",
|
||||
"copyToClipboard": "複製至剪貼簿",
|
||||
"copyPngToClipboard": "複製 PNG 至剪貼簿",
|
||||
"scale": "縮放比例",
|
||||
"save": "儲存目前檔案",
|
||||
"save": "儲存",
|
||||
"saveAs": "儲存為",
|
||||
"load": "載入",
|
||||
"getShareableLink": "取得共享連結",
|
||||
@@ -161,12 +152,12 @@
|
||||
},
|
||||
"toolBar": {
|
||||
"selection": "選取",
|
||||
"freedraw": "繪圖",
|
||||
"rectangle": "長方形",
|
||||
"diamond": "菱形",
|
||||
"ellipse": "橢圓",
|
||||
"arrow": "箭頭",
|
||||
"line": "線條",
|
||||
"freedraw": "繪圖",
|
||||
"text": "文字",
|
||||
"library": "資料庫",
|
||||
"lock": "可連續使用選取的工具"
|
||||
@@ -219,17 +210,6 @@
|
||||
"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": "點擊",
|
||||
|
||||
@@ -13,42 +13,14 @@ Please add the latest change on the top under the correct section.
|
||||
|
||||
## 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
|
||||
|
||||
### Features
|
||||
|
||||
- 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`.
|
||||
|
||||
- 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).
|
||||
|
||||
Note: Earlier Excalidraw component was focussed by default on page load, you need to enable `autoFocus` prop to retain the same behaviour.
|
||||
|
||||
- Added prop `UIOptions.canvasActions.export.renderCustomUI` to support Custom UI rendering inside export dialog [#3666](https://github.com/excalidraw/excalidraw/pull/3666).
|
||||
- Added prop `UIOptions.canvasActions.saveAsImage` to show/hide the **Save as image** button in the canvas actions. Defauls to `true` hence the **Save as Image** button is rendered [#3662](https://github.com/excalidraw/excalidraw/pull/3662).
|
||||
|
||||
- Export dialog can be customised with [`UiOptions.canvasActions.export`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#exportOpts) [#3658](https://github.com/excalidraw/excalidraw/pull/3658).
|
||||
|
||||
Also, [`UIOptions`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#UIOptions) is now memoized to avoid unnecessary rerenders.
|
||||
|
||||
#### 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.
|
||||
- `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
|
||||
|
||||
- Use excalidraw Id in elements so every element has unique id [#3696](https://github.com/excalidraw/excalidraw/pull/3696).
|
||||
|
||||
### Refactor
|
||||
|
||||
- #### BREAKING CHANGE
|
||||
- Rename `UIOptions.canvasActions.saveScene` to `UIOptions.canvasActions.saveToActiveFile`[#3657](https://github.com/excalidraw/excalidraw/pull/3657).
|
||||
- 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.
|
||||
#### BREAKING CHANGE
|
||||
|
||||
---
|
||||
- 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.
|
||||
|
||||
## 0.8.0 (2021-05-15)
|
||||
|
||||
|
||||
@@ -153,7 +153,7 @@ To view the full example visit :point_down:
|
||||
|
||||
</details>
|
||||
|
||||
Since Excalidraw doesn't support server side rendering yet, you should render the component once the host is mounted.
|
||||
Since Excalidraw doesn't support server side rendering yet so you will have to make sure the component is rendered once host is mounted.
|
||||
|
||||
```js
|
||||
import { useState, useEffect } from "react";
|
||||
@@ -161,7 +161,7 @@ export default function IndexPage() {
|
||||
const [Comp, setComp] = useState(null);
|
||||
useEffect(() => {
|
||||
import("@excalidraw/excalidraw").then((comp) => setComp(comp.default));
|
||||
}, []);
|
||||
});
|
||||
return <>{Comp && <Comp />}</>;
|
||||
}
|
||||
```
|
||||
|
||||
@@ -159,7 +159,7 @@ To view the full example visit :point_down:
|
||||
|
||||
</details>
|
||||
|
||||
Since Excalidraw doesn't support server side rendering yet, you should render the component once the host is mounted.
|
||||
Since Excalidraw doesn't support server side rendering yet so you will have to make sure the component is rendered once host is mounted.
|
||||
|
||||
```js
|
||||
import { useState, useEffect } from "react";
|
||||
@@ -167,7 +167,7 @@ export default function IndexPage() {
|
||||
const [Comp, setComp] = useState(null);
|
||||
useEffect(() => {
|
||||
import("@excalidraw/excalidraw-next").then((comp) => setComp(comp.default));
|
||||
}, []);
|
||||
});
|
||||
return <>{Comp && <Comp />}</>;
|
||||
}
|
||||
```
|
||||
@@ -363,6 +363,7 @@ To view the full example visit :point_down:
|
||||
| [`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 |
|
||||
| [`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 |
|
||||
| [`renderTopRightUI`](#renderTopRightUI) | Function | | Function that renders custom UI in top right corner |
|
||||
| [`renderFooter `](#renderFooter) | Function | | Function that renders custom UI footer |
|
||||
@@ -378,7 +379,6 @@ To view the full example visit :point_down:
|
||||
| [`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. |
|
||||
| [`onLibraryChange`](#onLibraryChange) | <pre>(items: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L200">LibraryItems</a>) => void | Promise<any> </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
|
||||
|
||||
@@ -488,6 +488,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
|
||||
|
||||
#### `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
|
||||
(exportedElements, appState, canvas) => void
|
||||
```
|
||||
@@ -567,21 +571,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` |
|
||||
| `clearCanvas` | boolean | true | Implies whether to show `Clear canvas button` |
|
||||
| `export` | false | [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` |
|
||||
| `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` |
|
||||
| `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 | 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 | null) => void </pre> | | This callback should be supplied if you want to render custom UI in the export dialog. |
|
||||
|
||||
#### `onPaste`
|
||||
|
||||
@@ -645,10 +639,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).
|
||||
|
||||
### autoFocus
|
||||
|
||||
This prop implies whether to focus the Excalidraw component on page load. Defaults to false.
|
||||
|
||||
### Extra API's
|
||||
|
||||
#### `getSceneVersion`
|
||||
@@ -840,21 +830,3 @@ This function returns a svg with the exported elements.
|
||||
| exportBackground | boolean | true | Indicates whether background should be exported |
|
||||
| viewBackgroundColor | string | #fff | The default background color |
|
||||
| exportWithDarkMode | boolean | false | Indicates whether to export with dark mode |
|
||||
|
||||
### FONT_FAMILY
|
||||
|
||||
**_Signature_**
|
||||
|
||||
```js
|
||||
import { FONT_FAMILY } from "./constants";
|
||||
```
|
||||
|
||||
`FONT_FAMILY` contains all the font families used in `Excalidraw` as explained below
|
||||
|
||||
| Font Family | Description |
|
||||
| ----------- | -------------------- |
|
||||
| Virgil | The handwritten font |
|
||||
| Helvetica | The Normal Font |
|
||||
| Cacadia | The Code Font |
|
||||
|
||||
Defaults to `FONT_FAMILY.Virgil` unless passed in `initialData.appState.currentItemFontFamily`.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user