diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index a6506e9a0..000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -## 2020-10-13 - -- Added ability to embed scene source into exported PNG/SVG files so you can import the scene from them (open via `Load` button or drag & drop). #2219 diff --git a/dev-docs/docs/codebase/frames.mdx b/dev-docs/docs/codebase/frames.mdx new file mode 100644 index 000000000..45a551f23 --- /dev/null +++ b/dev-docs/docs/codebase/frames.mdx @@ -0,0 +1,22 @@ +# Frames + +## Ordering + +Frames should be ordered where frame children come first, followed by the frame element itself: + +``` +[ + other_element, + frame1_child1, + frame1_child2, + frame1, + other_element, + frame2_child1, + frame2_child2, + frame2, + other_element, + ... +] +``` + +If not oredered correctly, the editor will still function, but the elements may not be rendered and clipped correctly. Further, the renderer relies on this ordering for performance optimizations. diff --git a/dev-docs/sidebars.js b/dev-docs/sidebars.js index 257d16b54..2b4ab8d86 100644 --- a/dev-docs/sidebars.js +++ b/dev-docs/sidebars.js @@ -23,7 +23,11 @@ const sidebars = { }, items: ["introduction/development", "introduction/contributing"], }, - { type: "category", label: "Codebase", items: ["codebase/json-schema"] }, + { + type: "category", + label: "Codebase", + items: ["codebase/json-schema", "codebase/frames"], + }, { type: "category", label: "@excalidraw/excalidraw", diff --git a/dev-docs/yarn.lock b/dev-docs/yarn.lock index f06b9fb24..b22621f31 100644 --- a/dev-docs/yarn.lock +++ b/dev-docs/yarn.lock @@ -145,6 +145,14 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8": version "7.18.8" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" @@ -202,6 +210,16 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -265,6 +283,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" @@ -280,6 +303,14 @@ "@babel/template" "^7.18.6" "@babel/types" "^7.18.9" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -287,6 +318,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" @@ -374,11 +412,28 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + "@babel/helper-validator-identifier@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-option@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" @@ -412,11 +467,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/parser@^7.12.7", "@babel/parser@^7.18.6", "@babel/parser@^7.18.8", "@babel/parser@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -1147,19 +1216,28 @@ "@babel/parser" "^7.18.6" "@babel/types" "^7.18.6" -"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98" - integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.18.9": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" @@ -1171,6 +1249,15 @@ "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -1670,6 +1757,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -1688,6 +1780,19 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": version "0.3.14" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" diff --git a/excalidraw-app/components/ExportToExcalidrawPlus.tsx b/excalidraw-app/components/ExportToExcalidrawPlus.tsx index 0b577ad7d..c0818c966 100644 --- a/excalidraw-app/components/ExportToExcalidrawPlus.tsx +++ b/excalidraw-app/components/ExportToExcalidrawPlus.tsx @@ -80,7 +80,8 @@ export const ExportToExcalidrawPlus: React.FC<{ appState: Partial; files: BinaryFiles; onError: (error: Error) => void; -}> = ({ elements, appState, files, onError }) => { + onSuccess: () => void; +}> = ({ elements, appState, files, onError, onSuccess }) => { const { t } = useI18n(); return ( @@ -107,6 +108,7 @@ export const ExportToExcalidrawPlus: React.FC<{ try { trackEvent("export", "eplus", `ui (${getFrame()})`); await exportToExcalidrawPlus(elements, appState, files); + onSuccess(); } catch (error: any) { console.error(error); if (error.name !== "AbortError") { diff --git a/excalidraw-app/index.tsx b/excalidraw-app/index.tsx index 2db363a5f..0f04c1d73 100644 --- a/excalidraw-app/index.tsx +++ b/excalidraw-app/index.tsx @@ -611,7 +611,7 @@ const ExcalidrawWrapper = () => { canvas: HTMLCanvasElement, ) => { if (exportedElements.length === 0) { - return window.alert(t("alerts.cannotExportEmptyCanvas")); + throw new Error(t("alerts.cannotExportEmptyCanvas")); } if (canvas) { try { @@ -627,7 +627,7 @@ const ExcalidrawWrapper = () => { ); if (errorMessage) { - setErrorMessage(errorMessage); + throw new Error(errorMessage); } if (url) { @@ -637,7 +637,7 @@ const ExcalidrawWrapper = () => { if (error.name !== "AbortError") { const { width, height } = canvas; console.error(error, { width, height }); - setErrorMessage(error.message); + throw new Error(error.message); } } } @@ -717,6 +717,11 @@ const ExcalidrawWrapper = () => { }, }); }} + onSuccess={() => { + excalidrawAPI?.updateScene({ + appState: { openDialog: null }, + }); + }} /> ); }, diff --git a/package.json b/package.json index a2f7f0ad6..044766ce7 100644 --- a/package.json +++ b/package.json @@ -51,12 +51,12 @@ "png-chunk-text": "1.0.0", "png-chunks-encode": "1.0.0", "png-chunks-extract": "1.0.0", - "points-on-curve": "0.2.0", + "points-on-curve": "1.0.1", "postinstall-postinstall": "2.1.0", "pwacompat": "2.0.17", "react": "18.2.0", "react-dom": "18.2.0", - "roughjs": "4.5.2", + "roughjs": "4.6.4", "sass": "1.51.0", "socket.io-client": "2.3.1", "tunnel-rat": "0.1.2" diff --git a/src/actions/actionClipboard.tsx b/src/actions/actionClipboard.tsx index b3794d0c0..03fdc6a4d 100644 --- a/src/actions/actionClipboard.tsx +++ b/src/actions/actionClipboard.tsx @@ -3,33 +3,43 @@ import { register } from "./register"; import { copyTextToSystemClipboard, copyToClipboard, + createPasteEvent, probablySupportsClipboardBlob, probablySupportsClipboardWriteText, + readSystemClipboard, } from "../clipboard"; import { actionDeleteSelected } from "./actionDeleteSelected"; import { exportCanvas } from "../data/index"; import { getNonDeletedElements, isTextElement } from "../element"; import { t } from "../i18n"; +import { isFirefox } from "../constants"; export const actionCopy = register({ name: "copy", trackEvent: { category: "element" }, - perform: (elements, appState, _, app) => { + perform: async (elements, appState, event: ClipboardEvent | null, app) => { const elementsToCopy = app.scene.getSelectedElements({ selectedElementIds: appState.selectedElementIds, includeBoundTextElement: true, includeElementsInFrames: true, }); - copyToClipboard(elementsToCopy, app.files); + try { + await copyToClipboard(elementsToCopy, app.files, event); + } catch (error: any) { + return { + commitToHistory: false, + appState: { + ...appState, + errorMessage: error.message, + }, + }; + } return { commitToHistory: false, }; }, - predicate: (elements, appState, appProps, app) => { - return app.device.isMobile && !!navigator.clipboard; - }, contextItemLabel: "labels.copy", // don't supply a shortcut since we handle this conditionally via onCopy event keyTest: undefined, @@ -38,15 +48,55 @@ export const actionCopy = register({ export const actionPaste = register({ name: "paste", trackEvent: { category: "element" }, - perform: (elements: any, appStates: any, data, app) => { - app.pasteFromClipboard(null); + perform: async (elements, appState, data, app) => { + let types; + try { + types = await readSystemClipboard(); + } catch (error: any) { + if (error.name === "AbortError" || error.name === "NotAllowedError") { + // user probably aborted the action. Though not 100% sure, it's best + // to not annoy them with an error message. + return false; + } + + console.error(`actionPaste ${error.name}: ${error.message}`); + + if (isFirefox) { + return { + commitToHistory: false, + appState: { + ...appState, + errorMessage: t("hints.firefox_clipboard_write"), + }, + }; + } + + return { + commitToHistory: false, + appState: { + ...appState, + errorMessage: t("errors.asyncPasteFailedOnRead"), + }, + }; + } + + try { + app.pasteFromClipboard(createPasteEvent({ types })); + } catch (error: any) { + console.error(error); + return { + commitToHistory: false, + appState: { + ...appState, + errorMessage: t("errors.asyncPasteFailedOnParse"), + }, + }; + } + return { commitToHistory: false, }; }, - predicate: (elements, appState, appProps, app) => { - return app.device.isMobile && !!navigator.clipboard; - }, contextItemLabel: "labels.paste", // don't supply a shortcut since we handle this conditionally via onCopy event keyTest: undefined, @@ -55,13 +105,10 @@ export const actionPaste = register({ export const actionCut = register({ name: "cut", trackEvent: { category: "element" }, - perform: (elements, appState, data, app) => { - actionCopy.perform(elements, appState, data, app); + perform: (elements, appState, event: ClipboardEvent | null, app) => { + actionCopy.perform(elements, appState, event, app); return actionDeleteSelected.perform(elements, appState); }, - predicate: (elements, appState, appProps, app) => { - return app.device.isMobile && !!navigator.clipboard; - }, contextItemLabel: "labels.cut", keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.key === KEYS.X, }); diff --git a/src/actions/actionDeleteSelected.tsx b/src/actions/actionDeleteSelected.tsx index 2520ea83a..4d7ec6a7c 100644 --- a/src/actions/actionDeleteSelected.tsx +++ b/src/actions/actionDeleteSelected.tsx @@ -46,6 +46,7 @@ const deleteSelectedElements = ( appState: { ...appState, selectedElementIds: {}, + selectedGroupIds: {}, }, }; }; diff --git a/src/actions/actionExport.tsx b/src/actions/actionExport.tsx index 2c94a9863..9622023f2 100644 --- a/src/actions/actionExport.tsx +++ b/src/actions/actionExport.tsx @@ -191,7 +191,15 @@ export const actionSaveFileToDisk = register({ }, app.files, ); - return { commitToHistory: false, appState: { ...appState, fileHandle } }; + return { + commitToHistory: false, + appState: { + ...appState, + openDialog: null, + fileHandle, + toast: { message: t("toast.fileSaved") }, + }, + }; } catch (error: any) { if (error?.name !== "AbortError") { console.error(error); diff --git a/src/actions/actionProperties.test.tsx b/src/actions/actionProperties.test.tsx new file mode 100644 index 000000000..3122cd108 --- /dev/null +++ b/src/actions/actionProperties.test.tsx @@ -0,0 +1,167 @@ +import { Excalidraw } from "../packages/excalidraw/index"; +import { queryByTestId } from "@testing-library/react"; +import { render } from "../tests/test-utils"; +import { UI } from "../tests/helpers/ui"; +import { API } from "../tests/helpers/api"; +import { COLOR_PALETTE, DEFAULT_ELEMENT_BACKGROUND_PICKS } from "../colors"; +import { FONT_FAMILY, STROKE_WIDTH } from "../constants"; + +const { h } = window; + +describe("element locking", () => { + beforeEach(async () => { + await render(); + }); + + describe("properties when tool selected", () => { + it("should show active background top picks", () => { + UI.clickTool("rectangle"); + + const color = DEFAULT_ELEMENT_BACKGROUND_PICKS[1]; + + // just in case we change it in the future + expect(color).not.toBe(COLOR_PALETTE.transparent); + + h.setState({ + currentItemBackgroundColor: color, + }); + const activeColor = queryByTestId( + document.body, + `color-top-pick-${color}`, + ); + expect(activeColor).toHaveClass("active"); + }); + + it("should show fill style when background non-transparent", () => { + UI.clickTool("rectangle"); + + const color = DEFAULT_ELEMENT_BACKGROUND_PICKS[1]; + + // just in case we change it in the future + expect(color).not.toBe(COLOR_PALETTE.transparent); + + h.setState({ + currentItemBackgroundColor: color, + currentItemFillStyle: "hachure", + }); + const hachureFillButton = queryByTestId(document.body, `fill-hachure`); + + expect(hachureFillButton).toHaveClass("active"); + h.setState({ + currentItemFillStyle: "solid", + }); + const solidFillStyle = queryByTestId(document.body, `fill-solid`); + expect(solidFillStyle).toHaveClass("active"); + }); + + it("should not show fill style when background transparent", () => { + UI.clickTool("rectangle"); + + h.setState({ + currentItemBackgroundColor: COLOR_PALETTE.transparent, + currentItemFillStyle: "hachure", + }); + const hachureFillButton = queryByTestId(document.body, `fill-hachure`); + + expect(hachureFillButton).toBe(null); + }); + + it("should show horizontal text align for text tool", () => { + UI.clickTool("text"); + + h.setState({ + currentItemTextAlign: "right", + }); + + const centerTextAlign = queryByTestId(document.body, `align-right`); + expect(centerTextAlign).toBeChecked(); + }); + }); + + describe("properties when elements selected", () => { + it("should show active styles when single element selected", () => { + const rect = API.createElement({ + type: "rectangle", + backgroundColor: "red", + fillStyle: "cross-hatch", + }); + h.elements = [rect]; + API.setSelectedElements([rect]); + + const crossHatchButton = queryByTestId(document.body, `fill-cross-hatch`); + expect(crossHatchButton).toHaveClass("active"); + }); + + it("should not show fill style selected element's background is transparent", () => { + const rect = API.createElement({ + type: "rectangle", + backgroundColor: COLOR_PALETTE.transparent, + fillStyle: "cross-hatch", + }); + h.elements = [rect]; + API.setSelectedElements([rect]); + + const crossHatchButton = queryByTestId(document.body, `fill-cross-hatch`); + expect(crossHatchButton).toBe(null); + }); + + it("should highlight common stroke width of selected elements", () => { + const rect1 = API.createElement({ + type: "rectangle", + strokeWidth: STROKE_WIDTH.thin, + }); + const rect2 = API.createElement({ + type: "rectangle", + strokeWidth: STROKE_WIDTH.thin, + }); + h.elements = [rect1, rect2]; + API.setSelectedElements([rect1, rect2]); + + const thinStrokeWidthButton = queryByTestId( + document.body, + `strokeWidth-thin`, + ); + expect(thinStrokeWidthButton).toBeChecked(); + }); + + it("should not highlight any stroke width button if no common style", () => { + const rect1 = API.createElement({ + type: "rectangle", + strokeWidth: STROKE_WIDTH.thin, + }); + const rect2 = API.createElement({ + type: "rectangle", + strokeWidth: STROKE_WIDTH.bold, + }); + h.elements = [rect1, rect2]; + API.setSelectedElements([rect1, rect2]); + + expect(queryByTestId(document.body, `strokeWidth-thin`)).not.toBe(null); + expect( + queryByTestId(document.body, `strokeWidth-thin`), + ).not.toBeChecked(); + expect( + queryByTestId(document.body, `strokeWidth-bold`), + ).not.toBeChecked(); + expect( + queryByTestId(document.body, `strokeWidth-extraBold`), + ).not.toBeChecked(); + }); + + it("should show properties of different element types when selected", () => { + const rect = API.createElement({ + type: "rectangle", + strokeWidth: STROKE_WIDTH.bold, + }); + const text = API.createElement({ + type: "text", + fontFamily: FONT_FAMILY.Cascadia, + }); + h.elements = [rect, text]; + API.setSelectedElements([rect, text]); + + expect(queryByTestId(document.body, `strokeWidth-bold`)).toBeChecked(); + expect(queryByTestId(document.body, `font-family-code`)).toBeChecked(); + }); + }); +}); diff --git a/src/actions/actionProperties.tsx b/src/actions/actionProperties.tsx index 1a05bc7cb..c362b3775 100644 --- a/src/actions/actionProperties.tsx +++ b/src/actions/actionProperties.tsx @@ -1,4 +1,4 @@ -import { AppState } from "../../src/types"; +import { AppState, Primitive } from "../../src/types"; import { DEFAULT_ELEMENT_BACKGROUND_COLOR_PALETTE, DEFAULT_ELEMENT_BACKGROUND_PICKS, @@ -51,6 +51,7 @@ import { DEFAULT_FONT_SIZE, FONT_FAMILY, ROUNDNESS, + STROKE_WIDTH, VERTICAL_ALIGN, } from "../constants"; import { @@ -82,7 +83,6 @@ import { getLanguage, t } from "../i18n"; import { KEYS } from "../keys"; import { randomInteger } from "../random"; import { - canChangeRoundness, canHaveArrowheads, getCommonAttributeOfSelectedElements, getSelectedElements, @@ -118,25 +118,44 @@ export const changeProperty = ( }); }; -export const getFormValue = function ( +export const getFormValue = function ( elements: readonly ExcalidrawElement[], appState: AppState, getAttribute: (element: ExcalidrawElement) => T, - defaultValue: T, + isRelevantElement: true | ((element: ExcalidrawElement) => boolean), + defaultValue: T | ((isSomeElementSelected: boolean) => T), ): T { const editingElement = appState.editingElement; const nonDeletedElements = getNonDeletedElements(elements); - return ( - (editingElement && getAttribute(editingElement)) ?? - (isSomeElementSelected(nonDeletedElements, appState) - ? getCommonAttributeOfSelectedElements( - nonDeletedElements, + + let ret: T | null = null; + + if (editingElement) { + ret = getAttribute(editingElement); + } + + if (!ret) { + const hasSelection = isSomeElementSelected(nonDeletedElements, appState); + + if (hasSelection) { + ret = + getCommonAttributeOfSelectedElements( + isRelevantElement === true + ? nonDeletedElements + : nonDeletedElements.filter((el) => isRelevantElement(el)), appState, getAttribute, - ) - : defaultValue) ?? - defaultValue - ); + ) ?? + (typeof defaultValue === "function" + ? defaultValue(true) + : defaultValue); + } else { + ret = + typeof defaultValue === "function" ? defaultValue(false) : defaultValue; + } + } + + return ret; }; const offsetElementAfterFontResize = ( @@ -247,6 +266,7 @@ export const actionChangeStrokeColor = register({ elements, appState, (element) => element.strokeColor, + true, appState.currentItemStrokeColor, )} onChange={(color) => updateData({ currentItemStrokeColor: color })} @@ -289,6 +309,7 @@ export const actionChangeBackgroundColor = register({ elements, appState, (element) => element.backgroundColor, + true, appState.currentItemBackgroundColor, )} onChange={(color) => updateData({ currentItemBackgroundColor: color })} @@ -338,23 +359,28 @@ export const actionChangeFillStyle = register({ } (${getShortcutKey("Alt-Click")})`, icon: allElementsZigZag ? FillZigZagIcon : FillHachureIcon, active: allElementsZigZag ? true : undefined, + testId: `fill-hachure`, }, { value: "cross-hatch", text: t("labels.crossHatch"), icon: FillCrossHatchIcon, + testId: `fill-cross-hatch`, }, { value: "solid", text: t("labels.solid"), icon: FillSolidIcon, + testId: `fill-solid`, }, ]} value={getFormValue( elements, appState, (element) => element.fillStyle, - appState.currentItemFillStyle, + (element) => element.hasOwnProperty("fillStyle"), + (hasSelection) => + hasSelection ? null : appState.currentItemFillStyle, )} onClick={(value, event) => { const nextValue = @@ -393,26 +419,31 @@ export const actionChangeStrokeWidth = register({ group="stroke-width" options={[ { - value: 1, + value: STROKE_WIDTH.thin, text: t("labels.thin"), icon: StrokeWidthBaseIcon, + testId: "strokeWidth-thin", }, { - value: 2, + value: STROKE_WIDTH.bold, text: t("labels.bold"), icon: StrokeWidthBoldIcon, + testId: "strokeWidth-bold", }, { - value: 4, + value: STROKE_WIDTH.extraBold, text: t("labels.extraBold"), icon: StrokeWidthExtraBoldIcon, + testId: "strokeWidth-extraBold", }, ]} value={getFormValue( elements, appState, (element) => element.strokeWidth, - appState.currentItemStrokeWidth, + (element) => element.hasOwnProperty("strokeWidth"), + (hasSelection) => + hasSelection ? null : appState.currentItemStrokeWidth, )} onChange={(value) => updateData(value)} /> @@ -461,7 +492,9 @@ export const actionChangeSloppiness = register({ elements, appState, (element) => element.roughness, - appState.currentItemRoughness, + (element) => element.hasOwnProperty("roughness"), + (hasSelection) => + hasSelection ? null : appState.currentItemRoughness, )} onChange={(value) => updateData(value)} /> @@ -509,7 +542,9 @@ export const actionChangeStrokeStyle = register({ elements, appState, (element) => element.strokeStyle, - appState.currentItemStrokeStyle, + (element) => element.hasOwnProperty("strokeStyle"), + (hasSelection) => + hasSelection ? null : appState.currentItemStrokeStyle, )} onChange={(value) => updateData(value)} /> @@ -549,6 +584,7 @@ export const actionChangeOpacity = register({ elements, appState, (element) => element.opacity, + true, appState.currentItemOpacity, ) ?? undefined } @@ -607,7 +643,12 @@ export const actionChangeFontSize = register({ } return null; }, - appState.currentItemFontSize || DEFAULT_FONT_SIZE, + (element) => + isTextElement(element) || getBoundTextElement(element) !== null, + (hasSelection) => + hasSelection + ? null + : appState.currentItemFontSize || DEFAULT_FONT_SIZE, )} onChange={(value) => updateData(value)} /> @@ -692,21 +733,25 @@ export const actionChangeFontFamily = register({ value: FontFamilyValues; text: string; icon: JSX.Element; + testId: string; }[] = [ { value: FONT_FAMILY.Virgil, text: t("labels.handDrawn"), icon: FreedrawIcon, + testId: "font-family-virgil", }, { value: FONT_FAMILY.Helvetica, text: t("labels.normal"), icon: FontFamilyNormalIcon, + testId: "font-family-normal", }, { value: FONT_FAMILY.Cascadia, text: t("labels.code"), icon: FontFamilyCodeIcon, + testId: "font-family-code", }, ]; @@ -729,7 +774,12 @@ export const actionChangeFontFamily = register({ } return null; }, - appState.currentItemFontFamily || DEFAULT_FONT_FAMILY, + (element) => + isTextElement(element) || getBoundTextElement(element) !== null, + (hasSelection) => + hasSelection + ? null + : appState.currentItemFontFamily || DEFAULT_FONT_FAMILY, )} onChange={(value) => updateData(value)} /> @@ -806,7 +856,10 @@ export const actionChangeTextAlign = register({ } return null; }, - appState.currentItemTextAlign, + (element) => + isTextElement(element) || getBoundTextElement(element) !== null, + (hasSelection) => + hasSelection ? null : appState.currentItemTextAlign, )} onChange={(value) => updateData(value)} /> @@ -882,7 +935,9 @@ export const actionChangeVerticalAlign = register({ } return null; }, - VERTICAL_ALIGN.MIDDLE, + (element) => + isTextElement(element) || getBoundTextElement(element) !== null, + (hasSelection) => (hasSelection ? null : VERTICAL_ALIGN.MIDDLE), )} onChange={(value) => updateData(value)} /> @@ -947,9 +1002,9 @@ export const actionChangeRoundness = register({ appState, (element) => hasLegacyRoundness ? null : element.roundness ? "round" : "sharp", - (canChangeRoundness(appState.activeTool.type) && - appState.currentItemRoundness) || - null, + (element) => element.hasOwnProperty("roundness"), + (hasSelection) => + hasSelection ? null : appState.currentItemRoundness, )} onChange={(value) => updateData(value)} /> @@ -1043,6 +1098,7 @@ export const actionChangeArrowhead = register({ isLinearElement(element) && canHaveArrowheads(element.type) ? element.startArrowhead : appState.currentItemStartArrowhead, + true, appState.currentItemStartArrowhead, )} onChange={(value) => updateData({ position: "start", type: value })} @@ -1089,6 +1145,7 @@ export const actionChangeArrowhead = register({ isLinearElement(element) && canHaveArrowheads(element.type) ? element.endArrowhead : appState.currentItemEndArrowhead, + true, appState.currentItemEndArrowhead, )} onChange={(value) => updateData({ position: "end", type: value })} diff --git a/src/actions/manager.tsx b/src/actions/manager.tsx index 9918bc2b4..78d115710 100644 --- a/src/actions/manager.tsx +++ b/src/actions/manager.tsx @@ -151,10 +151,10 @@ export class ActionManager { return true; } - executeAction( - action: Action, + executeAction( + action: T, source: ActionSource = "api", - value: any = null, + value: Parameters[2] = null, ) { const elements = this.getElementsIncludingDeleted(); const appState = this.getAppState(); diff --git a/src/clipboard.test.ts b/src/clipboard.test.ts index 142038e8e..770bcc90e 100644 --- a/src/clipboard.test.ts +++ b/src/clipboard.test.ts @@ -1,27 +1,196 @@ -import { parseClipboard } from "./clipboard"; +import { + createPasteEvent, + parseClipboard, + serializeAsClipboardJSON, +} from "./clipboard"; +import { API } from "./tests/helpers/api"; -describe("Test parseClipboard", () => { - it("should parse valid json correctly", async () => { - let text = "123"; - - let clipboardData = await parseClipboard({ - //@ts-ignore - clipboardData: { - getData: () => text, - }, - }); +describe("parseClipboard()", () => { + it("should parse JSON as plaintext if not excalidraw-api/clipboard data", async () => { + let text; + let clipboardData; + // ------------------------------------------------------------------------- + text = "123"; + clipboardData = await parseClipboard( + createPasteEvent({ types: { "text/plain": text } }), + ); expect(clipboardData.text).toBe(text); + // ------------------------------------------------------------------------- + text = "[123]"; + clipboardData = await parseClipboard( + createPasteEvent({ types: { "text/plain": text } }), + ); + expect(clipboardData.text).toBe(text); - clipboardData = await parseClipboard({ - //@ts-ignore - clipboardData: { - getData: () => text, - }, - }); + // ------------------------------------------------------------------------- + text = JSON.stringify({ val: 42 }); + clipboardData = await parseClipboard( + createPasteEvent({ types: { "text/plain": text } }), + ); expect(clipboardData.text).toBe(text); }); + + it("should parse valid excalidraw JSON if inside text/plain", async () => { + const rect = API.createElement({ type: "rectangle" }); + + const json = serializeAsClipboardJSON({ elements: [rect], files: null }); + const clipboardData = await parseClipboard( + createPasteEvent({ + types: { + "text/plain": json, + }, + }), + ); + expect(clipboardData.elements).toEqual([rect]); + }); + + it("should parse valid excalidraw JSON if inside text/html", async () => { + const rect = API.createElement({ type: "rectangle" }); + + let json; + let clipboardData; + // ------------------------------------------------------------------------- + json = serializeAsClipboardJSON({ elements: [rect], files: null }); + clipboardData = await parseClipboard( + createPasteEvent({ + types: { + "text/html": json, + }, + }), + ); + expect(clipboardData.elements).toEqual([rect]); + // ------------------------------------------------------------------------- + json = serializeAsClipboardJSON({ elements: [rect], files: null }); + clipboardData = await parseClipboard( + createPasteEvent({ + types: { + "text/html": `
${json}
`, + }, + }), + ); + expect(clipboardData.elements).toEqual([rect]); + // ------------------------------------------------------------------------- + }); + + it("should parse `src` urls out of text/html", async () => { + let clipboardData; + // ------------------------------------------------------------------------- + clipboardData = await parseClipboard( + createPasteEvent({ + types: { + "text/html": ``, + }, + }), + ); + expect(clipboardData.mixedContent).toEqual([ + { + type: "imageUrl", + value: "https://example.com/image.png", + }, + ]); + // ------------------------------------------------------------------------- + clipboardData = await parseClipboard( + createPasteEvent({ + types: { + "text/html": `
`, + }, + }), + ); + expect(clipboardData.mixedContent).toEqual([ + { + type: "imageUrl", + value: "https://example.com/image.png", + }, + { + type: "imageUrl", + value: "https://example.com/image2.png", + }, + ]); + }); + + it("should parse text content alongside `src` urls out of text/html", async () => { + const clipboardData = await parseClipboard( + createPasteEvent({ + types: { + "text/html": `hello
my friend!`, + }, + }), + ); + expect(clipboardData.mixedContent).toEqual([ + { + type: "text", + // trimmed + value: "hello", + }, + { + type: "imageUrl", + value: "https://example.com/image.png", + }, + { + type: "text", + value: "my friend!", + }, + ]); + }); + + it("should parse spreadsheet from either text/plain and text/html", async () => { + let clipboardData; + // ------------------------------------------------------------------------- + clipboardData = await parseClipboard( + createPasteEvent({ + types: { + "text/plain": `a b + 1 2 + 4 5 + 7 10`, + }, + }), + ); + expect(clipboardData.spreadsheet).toEqual({ + title: "b", + labels: ["1", "4", "7"], + values: [2, 5, 10], + }); + // ------------------------------------------------------------------------- + clipboardData = await parseClipboard( + createPasteEvent({ + types: { + "text/html": `a b + 1 2 + 4 5 + 7 10`, + }, + }), + ); + expect(clipboardData.spreadsheet).toEqual({ + title: "b", + labels: ["1", "4", "7"], + values: [2, 5, 10], + }); + // ------------------------------------------------------------------------- + clipboardData = await parseClipboard( + createPasteEvent({ + types: { + "text/html": ` + +
ab
12
45
710
+ + `, + "text/plain": `a b + 1 2 + 4 5 + 7 10`, + }, + }), + ); + expect(clipboardData.spreadsheet).toEqual({ + title: "b", + labels: ["1", "4", "7"], + values: [2, 5, 10], + }); + }); }); diff --git a/src/clipboard.ts b/src/clipboard.ts index bf6670c22..7934f3891 100644 --- a/src/clipboard.ts +++ b/src/clipboard.ts @@ -3,14 +3,18 @@ import { NonDeletedExcalidrawElement, } from "./element/types"; import { AppState, BinaryFiles } from "./types"; -import { SVG_EXPORT_TAG } from "./scene/export"; import { tryParseSpreadsheet, Spreadsheet, VALID_SPREADSHEET } from "./charts"; -import { EXPORT_DATA_TYPES, MIME_TYPES } from "./constants"; +import { + ALLOWED_PASTE_MIME_TYPES, + EXPORT_DATA_TYPES, + MIME_TYPES, +} from "./constants"; import { isInitializedImageElement } from "./element/typeChecks"; import { deepCopyElement } from "./element/newElement"; import { mutateElement } from "./element/mutateElement"; import { getContainingFrame } from "./frame"; -import { isPromiseLike, isTestEnv } from "./utils"; +import { isMemberOf, isPromiseLike } from "./utils"; +import { t } from "./i18n"; type ElementsClipboard = { type: typeof EXPORT_DATA_TYPES.excalidrawClipboard; @@ -18,17 +22,23 @@ type ElementsClipboard = { files: BinaryFiles | undefined; }; +export type PastedMixedContent = { type: "text" | "imageUrl"; value: string }[]; + export interface ClipboardData { spreadsheet?: Spreadsheet; elements?: readonly ExcalidrawElement[]; files?: BinaryFiles; text?: string; + mixedContent?: PastedMixedContent; errorMessage?: string; programmaticAPI?: boolean; } -let CLIPBOARD = ""; -let PREFER_APP_CLIPBOARD = false; +type AllowedPasteMimeTypes = typeof ALLOWED_PASTE_MIME_TYPES[number]; + +type ParsedClipboardEvent = + | { type: "text"; value: string } + | { type: "mixedContent"; value: PastedMixedContent }; export const probablySupportsClipboardReadText = "clipboard" in navigator && "readText" in navigator.clipboard; @@ -58,10 +68,61 @@ const clipboardContainsElements = ( return false; }; -export const copyToClipboard = async ( - elements: readonly NonDeletedExcalidrawElement[], - files: BinaryFiles | null, -) => { +export const createPasteEvent = ({ + types, + files, +}: { + types?: { [key in AllowedPasteMimeTypes]?: string }; + files?: File[]; +}) => { + if (!types && !files) { + console.warn("createPasteEvent: no types or files provided"); + } + + const event = new ClipboardEvent("paste", { + clipboardData: new DataTransfer(), + }); + + if (types) { + for (const [type, value] of Object.entries(types)) { + try { + event.clipboardData?.setData(type, value); + if (event.clipboardData?.getData(type) !== value) { + throw new Error(`Failed to set "${type}" as clipboardData item`); + } + } catch (error: any) { + throw new Error(error.message); + } + } + } + + if (files) { + let idx = -1; + for (const file of files) { + idx++; + try { + event.clipboardData?.items.add(file); + if (event.clipboardData?.files[idx] !== file) { + throw new Error( + `Failed to set file "${file.name}" as clipboardData item`, + ); + } + } catch (error: any) { + throw new Error(error.message); + } + } + } + + return event; +}; + +export const serializeAsClipboardJSON = ({ + elements, + files, +}: { + elements: readonly NonDeletedExcalidrawElement[]; + files: BinaryFiles | null; +}) => { const framesToCopy = new Set( elements.filter((element) => element.type === "frame"), ); @@ -83,7 +144,7 @@ export const copyToClipboard = async ( ); } - // select binded text elements when copying + // select bound text elements when copying const contents: ElementsClipboard = { type: EXPORT_DATA_TYPES.excalidrawClipboard, elements: elements.map((element) => { @@ -102,34 +163,20 @@ export const copyToClipboard = async ( }), files: files ? _files : undefined, }; - const json = JSON.stringify(contents); - if (isTestEnv()) { - return json; - } - - CLIPBOARD = json; - - try { - PREFER_APP_CLIPBOARD = false; - await copyTextToSystemClipboard(json); - } catch (error: any) { - PREFER_APP_CLIPBOARD = true; - console.error(error); - } + return JSON.stringify(contents); }; -const getAppClipboard = (): Partial => { - if (!CLIPBOARD) { - return {}; - } - - try { - return JSON.parse(CLIPBOARD); - } catch (error: any) { - console.error(error); - return {}; - } +export const copyToClipboard = async ( + elements: readonly NonDeletedExcalidrawElement[], + files: BinaryFiles | null, + /** supply if available to make the operation more certain to succeed */ + clipboardEvent?: ClipboardEvent | null, +) => { + await copyTextToSystemClipboard( + serializeAsClipboardJSON({ elements, files }), + clipboardEvent, + ); }; const parsePotentialSpreadsheet = ( @@ -142,22 +189,137 @@ const parsePotentialSpreadsheet = ( return null; }; -/** - * Retrieves content from system clipboard (either from ClipboardEvent or - * via async clipboard API if supported) - */ -export const getSystemClipboard = async ( - event: ClipboardEvent | null, -): Promise => { - try { - const text = event - ? event.clipboardData?.getData("text/plain") - : probablySupportsClipboardReadText && - (await navigator.clipboard.readText()); +/** internal, specific to parsing paste events. Do not reuse. */ +function parseHTMLTree(el: ChildNode) { + let result: PastedMixedContent = []; + for (const node of el.childNodes) { + if (node.nodeType === 3) { + const text = node.textContent?.trim(); + if (text) { + result.push({ type: "text", value: text }); + } + } else if (node instanceof HTMLImageElement) { + const url = node.getAttribute("src"); + if (url && url.startsWith("http")) { + result.push({ type: "imageUrl", value: url }); + } + } else { + result = result.concat(parseHTMLTree(node)); + } + } + return result; +} - return (text || "").trim(); +const maybeParseHTMLPaste = ( + event: ClipboardEvent, +): { type: "mixedContent"; value: PastedMixedContent } | null => { + const html = event.clipboardData?.getData("text/html"); + + if (!html) { + return null; + } + + try { + const doc = new DOMParser().parseFromString(html, "text/html"); + + const content = parseHTMLTree(doc.body); + + if (content.length) { + return { type: "mixedContent", value: content }; + } + } catch (error: any) { + console.error(`error in parseHTMLFromPaste: ${error.message}`); + } + + return null; +}; + +export const readSystemClipboard = async () => { + const types: { [key in AllowedPasteMimeTypes]?: string } = {}; + + try { + if (navigator.clipboard?.readText) { + return { "text/plain": await navigator.clipboard?.readText() }; + } + } catch (error: any) { + // @ts-ignore + if (navigator.clipboard?.read) { + console.warn( + `navigator.clipboard.readText() failed (${error.message}). Failling back to navigator.clipboard.read()`, + ); + } else { + throw error; + } + } + + let clipboardItems: ClipboardItems; + + try { + clipboardItems = await navigator.clipboard?.read(); + } catch (error: any) { + if (error.name === "DataError") { + console.warn( + `navigator.clipboard.read() error, clipboard is probably empty: ${error.message}`, + ); + return types; + } + throw error; + } + + for (const item of clipboardItems) { + for (const type of item.types) { + if (!isMemberOf(ALLOWED_PASTE_MIME_TYPES, type)) { + continue; + } + try { + types[type] = await (await item.getType(type)).text(); + } catch (error: any) { + console.warn( + `Cannot retrieve ${type} from clipboardItem: ${error.message}`, + ); + } + } + } + + if (Object.keys(types).length === 0) { + console.warn("No clipboard data found from clipboard.read()."); + return types; + } + + return types; +}; + +/** + * Parses "paste" ClipboardEvent. + */ +const parseClipboardEvent = async ( + event: ClipboardEvent, + isPlainPaste = false, +): Promise => { + try { + const mixedContent = !isPlainPaste && event && maybeParseHTMLPaste(event); + + if (mixedContent) { + if (mixedContent.value.every((item) => item.type === "text")) { + return { + type: "text", + value: + event.clipboardData?.getData("text/plain") || + mixedContent.value + .map((item) => item.value) + .join("\n") + .trim(), + }; + } + + return mixedContent; + } + + const text = event.clipboardData?.getData("text/plain"); + + return { type: "text", value: (text || "").trim() }; } catch { - return ""; + return { type: "text", value: "" }; } }; @@ -165,39 +327,37 @@ export const getSystemClipboard = async ( * Attempts to parse clipboard. Prefers system clipboard. */ export const parseClipboard = async ( - event: ClipboardEvent | null, + event: ClipboardEvent, isPlainPaste = false, appState?: AppState, ): Promise => { - const systemClipboard = await getSystemClipboard(event); + const parsedEventData = await parseClipboardEvent(event, isPlainPaste); - // if system clipboard empty, couldn't be resolved, or contains previously - // copied excalidraw scene as SVG, fall back to previously copied excalidraw - // elements - if ( - !systemClipboard || - (!isPlainPaste && systemClipboard.includes(SVG_EXPORT_TAG)) - ) { - return getAppClipboard(); + if (parsedEventData.type === "mixedContent") { + return { + mixedContent: parsedEventData.value, + }; } - // if system clipboard contains spreadsheet, use it even though it's - // technically possible it's staler than in-app clipboard - const spreadsheetResult = - !isPlainPaste && parsePotentialSpreadsheet(systemClipboard); - - if (spreadsheetResult) { - if ("spreadsheet" in spreadsheetResult) { - spreadsheetResult.spreadsheet.activeSubtypes = appState?.activeSubtypes; - spreadsheetResult.spreadsheet.customData = appState?.customData; - } - return spreadsheetResult; - } - - const appClipboardData = getAppClipboard(); - try { - const systemClipboardData = JSON.parse(systemClipboard); + // if system clipboard contains spreadsheet, use it even though it's + // technically possible it's staler than in-app clipboard + const spreadsheetResult = + !isPlainPaste && parsePotentialSpreadsheet(parsedEventData.value); + + if (spreadsheetResult) { + if ("spreadsheet" in spreadsheetResult) { + spreadsheetResult.spreadsheet.activeSubtypes = appState?.activeSubtypes; + spreadsheetResult.spreadsheet.customData = appState?.customData; + } + return spreadsheetResult; + } + } catch (error: any) { + console.error(error); + } + + try { + const systemClipboardData = JSON.parse(parsedEventData.value); const programmaticAPI = systemClipboardData.type === EXPORT_DATA_TYPES.excalidrawClipboardWithAPI; if (clipboardContainsElements(systemClipboardData)) { @@ -210,18 +370,9 @@ export const parseClipboard = async ( programmaticAPI, }; } - } catch (e) {} - // system clipboard doesn't contain excalidraw elements → return plaintext - // unless we set a flag to prefer in-app clipboard because browser didn't - // support storing to system clipboard on copy - return PREFER_APP_CLIPBOARD && appClipboardData.elements - ? { - ...appClipboardData, - text: isPlainPaste - ? JSON.stringify(appClipboardData.elements, null, 2) - : undefined, - } - : { text: systemClipboard }; + } catch {} + + return { text: parsedEventData.value }; }; export const copyBlobToClipboardAsPng = async (blob: Blob | Promise) => { @@ -254,28 +405,49 @@ export const copyBlobToClipboardAsPng = async (blob: Blob | Promise) => { } }; -export const copyTextToSystemClipboard = async (text: string | null) => { - let copied = false; +export const copyTextToSystemClipboard = async ( + text: string | null, + clipboardEvent?: ClipboardEvent | null, +) => { + // (1) first try using Async Clipboard API if (probablySupportsClipboardWriteText) { try { // NOTE: doesn't work on FF on non-HTTPS domains, or when document // not focused await navigator.clipboard.writeText(text || ""); - copied = true; + return; } catch (error: any) { console.error(error); } } - // Note that execCommand doesn't allow copying empty strings, so if we're - // clearing clipboard using this API, we must copy at least an empty char - if (!copied && !copyTextViaExecCommand(text || " ")) { - throw new Error("couldn't copy"); + // (2) if fails and we have access to ClipboardEvent, use plain old setData() + try { + if (clipboardEvent) { + clipboardEvent.clipboardData?.setData("text/plain", text || ""); + if (clipboardEvent.clipboardData?.getData("text/plain") !== text) { + throw new Error("Failed to setData on clipboardEvent"); + } + return; + } + } catch (error: any) { + console.error(error); + } + + // (3) if that fails, use document.execCommand + if (!copyTextViaExecCommand(text)) { + throw new Error(t("errors.copyToSystemClipboardFailed")); } }; // adapted from https://github.com/zenorocha/clipboard.js/blob/ce79f170aa655c408b6aab33c9472e8e4fa52e19/src/clipboard-action.js#L48 -const copyTextViaExecCommand = (text: string) => { +const copyTextViaExecCommand = (text: string | null) => { + // execCommand doesn't allow copying empty strings, so if we're + // clearing clipboard using this API, we must copy at least an empty char + if (!text) { + text = " "; + } + const isRTL = document.documentElement.getAttribute("dir") === "rtl"; const textarea = document.createElement("textarea"); diff --git a/src/components/Actions.scss b/src/components/Actions.scss index 925e918d2..df0d73755 100644 --- a/src/components/Actions.scss +++ b/src/components/Actions.scss @@ -2,13 +2,13 @@ .undo-redo-buttons { background-color: var(--island-bg-color); border-radius: var(--border-radius-lg); + box-shadow: 0 0 0 1px var(--color-surface-lowest); } .zoom-button, .undo-redo-buttons button { - border: 1px solid var(--default-border-color) !important; border-radius: 0 !important; - background-color: transparent !important; + background-color: var(--color-surface-low) !important; font-size: 0.875rem !important; width: var(--lg-button-size); height: var(--lg-button-size); diff --git a/src/components/Actions.tsx b/src/components/Actions.tsx index ae14e34be..97636b325 100644 --- a/src/components/Actions.tsx +++ b/src/components/Actions.tsx @@ -1,7 +1,7 @@ import React, { useState } from "react"; import { ActionManager } from "../actions/manager"; import { getNonDeletedElements } from "../element"; -import { ExcalidrawElement, PointerType } from "../element/types"; +import { ExcalidrawElement } from "../element/types"; import { t } from "../i18n"; import { useDevice } from "../components/App"; import { @@ -11,7 +11,6 @@ import { hasBackground, hasStrokeStyle, hasStrokeWidth, - hasText, } from "../scene"; import { SHAPES } from "../shapes"; import { AppClassProperties, UIAppState, Zoom } from "../types"; @@ -21,7 +20,7 @@ import { ToolButton } from "./ToolButton"; import { SubtypeShapeActions, SubtypeToggles } from "./Subtypes"; import { hasStrokeColor } from "../scene/comparisons"; import { trackEvent } from "../analytics"; -import { hasBoundTextElement } from "../element/typeChecks"; +import { hasBoundTextElement, isTextElement } from "../element/typeChecks"; import clsx from "clsx"; import { actionToggleZenMode } from "../actions"; import { Tooltip } from "./Tooltip"; @@ -67,7 +66,8 @@ export const SelectedShapeActions = ({ const isRTL = document.documentElement.getAttribute("dir") === "rtl"; const showFillIcons = - hasBackground(appState.activeTool.type) || + (hasBackground(appState.activeTool.type) && + !isTransparent(appState.currentItemBackgroundColor)) || targetElements.some( (element) => hasBackground(element.type) && !isTransparent(element.backgroundColor), @@ -125,14 +125,15 @@ export const SelectedShapeActions = ({ <>{renderAction("changeRoundness")} )} - {(hasText(appState.activeTool.type) || - targetElements.some((element) => hasText(element.type))) && ( + {(appState.activeTool.type === "text" || + targetElements.some(isTextElement)) && ( <> {renderAction("changeFontSize")} {renderAction("changeFontFamily")} - {suppportsHorizontalAlign(targetElements) && + {(appState.activeTool.type === "text" || + suppportsHorizontalAlign(targetElements)) && renderAction("changeTextAlign")} )} @@ -215,15 +216,11 @@ export const SelectedShapeActions = ({ }; export const ShapesSwitcher = ({ - interactiveCanvas, activeTool, - onImageAction, appState, app, }: { - interactiveCanvas: HTMLCanvasElement | null; activeTool: UIAppState["activeTool"]; - onImageAction: (data: { pointerType: PointerType | null }) => void; appState: UIAppState; app: AppClassProperties; }) => { @@ -265,9 +262,13 @@ export const ShapesSwitcher = ({ if (appState.activeTool.type !== value) { trackEvent("toolbar", value, "ui"); } - app.setActiveTool({ type: value }); if (value === "image") { - onImageAction({ pointerType }); + app.setActiveTool({ + type: value, + insertOnCanvasDirectly: pointerType !== "mouse", + }); + } else { + app.setActiveTool({ type: value }); } }} /> diff --git a/src/components/App.tsx b/src/components/App.tsx index d43864174..2795f1b4e 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -47,7 +47,7 @@ import { isEraserActive, isHandToolActive, } from "../appState"; -import { parseClipboard } from "../clipboard"; +import { PastedMixedContent, parseClipboard } from "../clipboard"; import { APP_NAME, CURSOR_TYPE, @@ -285,6 +285,7 @@ import { generateIdFromFile, getDataURL, getFileFromEvent, + ImageURLToFile, isImageFileHandle, isSupportedImageFile, loadSceneOrLibraryFromBlob, @@ -383,6 +384,7 @@ import { resetCursor, setCursorForShape, } from "../cursor"; +import { Emitter } from "../emitter"; const AppContext = React.createContext(null!); const AppPropsContext = React.createContext(null!); @@ -514,6 +516,30 @@ class App extends React.Component { laserPathManager: LaserPathManager = new LaserPathManager(this); + onChangeEmitter = new Emitter< + [ + elements: readonly ExcalidrawElement[], + appState: AppState, + files: BinaryFiles, + ] + >(); + + onPointerDownEmitter = new Emitter< + [ + activeTool: AppState["activeTool"], + pointerDownState: PointerDownState, + event: React.PointerEvent, + ] + >(); + + onPointerUpEmitter = new Emitter< + [ + activeTool: AppState["activeTool"], + pointerDownState: PointerDownState, + event: PointerEvent, + ] + >(); + constructor(props: AppProps) { super(props); const defaultAppState = getDefaultAppState(); @@ -585,6 +611,9 @@ class App extends React.Component { resetCursor: this.resetCursor, updateFrameRendering: this.updateFrameRendering, toggleSidebar: this.toggleSidebar, + onChange: (cb) => this.onChangeEmitter.on(cb), + onPointerDown: (cb) => this.onPointerDownEmitter.on(cb), + onPointerUp: (cb) => this.onPointerUpEmitter.on(cb), } as const; if (typeof excalidrawRef === "function") { excalidrawRef(api); @@ -1217,7 +1246,6 @@ class App extends React.Component { > { this.state.zenModeEnabled } UIOptions={this.props.UIOptions} - onImageAction={this.onImageAction} onExportImage={this.onExportImage} renderWelcomeScreen={ !this.state.isLoading && @@ -1277,6 +1304,12 @@ class App extends React.Component { top={this.state.contextMenu.top} left={this.state.contextMenu.left} actionManager={this.actionManager} + onClose={(callback) => { + this.setState({ contextMenu: null }, () => { + this.focusContainer(); + callback?.(); + }); + }} /> )} { this.scene.destroy(); this.library.destroy(); this.laserPathManager.destroy(); + this.onChangeEmitter.destroy(); ShapeCache.destroy(); SnapCache.destroy(); clearTimeout(touchTimeout); @@ -2064,6 +2098,11 @@ class App extends React.Component { this.state, this.files, ); + this.onChangeEmitter.trigger( + this.scene.getElementsIncludingDeleted(), + this.state, + this.files, + ); } } @@ -2106,7 +2145,7 @@ class App extends React.Component { if (!isExcalidrawActive || isWritableElement(event.target)) { return; } - this.cutAll(); + this.actionManager.executeAction(actionCut, "keyboard", event); event.preventDefault(); event.stopPropagation(); }); @@ -2118,19 +2157,11 @@ class App extends React.Component { if (!isExcalidrawActive || isWritableElement(event.target)) { return; } - this.copyAll(); + this.actionManager.executeAction(actionCopy, "keyboard", event); event.preventDefault(); event.stopPropagation(); }); - private cutAll = () => { - this.actionManager.executeAction(actionCut, "keyboard"); - }; - - private copyAll = () => { - this.actionManager.executeAction(actionCopy, "keyboard"); - }; - private static resetTapTwice() { didTapTwice = false; } @@ -2191,8 +2222,8 @@ class App extends React.Component { }; public pasteFromClipboard = withBatchedUpdates( - async (event: ClipboardEvent | null) => { - const isPlainPaste = !!(IS_PLAIN_PASTE && event); + async (event: ClipboardEvent) => { + const isPlainPaste = !!IS_PLAIN_PASTE; // #686 const target = document.activeElement; @@ -2214,21 +2245,6 @@ class App extends React.Component { return; } - // must be called in the same frame (thus before any awaits) as the paste - // event else some browsers (FF...) will clear the clipboardData - // (something something security) - let file = event?.clipboardData?.files[0]; - - const data = await parseClipboard(event, isPlainPaste, this.state); - if (!file && data.text && !isPlainPaste) { - const string = data.text.trim(); - if (string.startsWith("")) { - // ignore SVG validation/normalization which will be done during image - // initialization - file = SVGStringToFile(string); - } - } - const { x: sceneX, y: sceneY } = viewportCoordsToSceneCoords( { clientX: this.lastViewportPosition.x, @@ -2237,6 +2253,29 @@ class App extends React.Component { this.state, ); + // must be called in the same frame (thus before any awaits) as the paste + // event else some browsers (FF...) will clear the clipboardData + // (something something security) + let file = event?.clipboardData?.files[0]; + + const data = await parseClipboard(event, isPlainPaste, this.state); + if (!file && !isPlainPaste) { + if (data.mixedContent) { + return this.addElementsFromMixedContentPaste(data.mixedContent, { + isPlainPaste, + sceneX, + sceneY, + }); + } else if (data.text) { + const string = data.text.trim(); + if (string.startsWith("")) { + // ignore SVG validation/normalization which will be done during image + // initialization + file = SVGStringToFile(string); + } + } + } + // prefer spreadsheet data over image file (MS Office/Libre Office) if (isSupportedImageFile(file) && !data.spreadsheet) { const imageElement = this.createImageElement({ sceneX, sceneY }); @@ -2290,6 +2329,7 @@ class App extends React.Component { }); } else if (data.text) { const maybeUrl = extractSrc(data.text); + if ( !isPlainPaste && embeddableURLValidator(maybeUrl, this.props.validateEmbeddable) && @@ -2424,6 +2464,85 @@ class App extends React.Component { this.setActiveTool({ type: "selection" }); }; + // TODO rewrite this to paste both text & images at the same time if + // pasted data contains both + private async addElementsFromMixedContentPaste( + mixedContent: PastedMixedContent, + { + isPlainPaste, + sceneX, + sceneY, + }: { isPlainPaste: boolean; sceneX: number; sceneY: number }, + ) { + if ( + !isPlainPaste && + mixedContent.some((node) => node.type === "imageUrl") + ) { + const imageURLs = mixedContent + .filter((node) => node.type === "imageUrl") + .map((node) => node.value); + const responses = await Promise.all( + imageURLs.map(async (url) => { + try { + return { file: await ImageURLToFile(url) }; + } catch (error: any) { + return { errorMessage: error.message as string }; + } + }), + ); + let y = sceneY; + let firstImageYOffsetDone = false; + const nextSelectedIds: Record = {}; + for (const response of responses) { + if (response.file) { + const imageElement = this.createImageElement({ + sceneX, + sceneY: y, + }); + + const initializedImageElement = await this.insertImageElement( + imageElement, + response.file, + ); + if (initializedImageElement) { + // vertically center first image in the batch + if (!firstImageYOffsetDone) { + firstImageYOffsetDone = true; + y -= initializedImageElement.height / 2; + } + // hack to reset the `y` coord because we vertically center during + // insertImageElement + mutateElement(initializedImageElement, { y }, false); + + y = imageElement.y + imageElement.height + 25; + + nextSelectedIds[imageElement.id] = true; + } + } + } + + this.setState({ + selectedElementIds: makeNextSelectedElementIds( + nextSelectedIds, + this.state, + ), + }); + + const error = responses.find((response) => !!response.errorMessage); + if (error && error.errorMessage) { + this.setState({ errorMessage: error.errorMessage }); + } + } else { + const textNodes = mixedContent.filter((node) => node.type === "text"); + if (textNodes.length) { + this.addTextFromPaste( + textNodes.map((node) => node.value).join("\n\n"), + isPlainPaste, + ); + } + } + } + private addTextFromPaste(text: string, isPlainPaste = false) { const { x, y } = viewportCoordsToSceneCoords( { @@ -3164,11 +3283,16 @@ class App extends React.Component { }); setActiveTool = ( - tool: - | { - type: ToolType; - } - | { type: "custom"; customType: string }, + tool: ( + | ( + | { type: Exclude } + | { + type: Extract; + insertOnCanvasDirectly?: boolean; + } + ) + | { type: "custom"; customType: string } + ) & { locked?: boolean }, ) => { const nextActiveTool = updateActiveTool(this.state, tool); if (nextActiveTool.type === "hand") { @@ -3183,7 +3307,10 @@ class App extends React.Component { this.setState({ suggestedBindings: [] }); } if (nextActiveTool.type === "image") { - this.onImageAction(); + this.onImageAction({ + insertOnCanvasDirectly: + (tool.type === "image" && tool.insertOnCanvasDirectly) ?? false, + }); } this.setState((prevState) => { @@ -4428,6 +4555,7 @@ class App extends React.Component { setCursor(this.interactiveCanvas, CURSOR_TYPE.AUTO); } } + private handleCanvasPointerDown = ( event: React.PointerEvent, ) => { @@ -4617,7 +4745,7 @@ class App extends React.Component { pointerDownState, ); } else if (this.state.activeTool.type === "custom") { - setCursor(this.interactiveCanvas, CURSOR_TYPE.AUTO); + setCursorForShape(this.interactiveCanvas, this.state); } else if (this.state.activeTool.type === "frame") { this.createFrameElementOnPointerDown(pointerDownState); } else if (this.state.activeTool.type === "laser") { @@ -4636,6 +4764,11 @@ class App extends React.Component { } this.props?.onPointerDown?.(this.state.activeTool, pointerDownState); + this.onPointerDownEmitter.trigger( + this.state.activeTool, + pointerDownState, + event, + ); const onPointerMove = this.onPointerMoveFromPointerDownHandler(pointerDownState); @@ -6491,6 +6624,12 @@ class App extends React.Component { this.setState({ pendingImageElementId: null }); } + this.onPointerUpEmitter.trigger( + this.state.activeTool, + pointerDownState, + childEvent, + ); + if (draggingElement?.type === "freedraw") { const pointerCoords = viewportCoordsToSceneCoords( childEvent, @@ -7332,7 +7471,7 @@ class App extends React.Component { this.scene.addNewElement(imageElement); try { - await this.initializeImage({ + return await this.initializeImage({ imageFile, imageElement, showCursorImagePreview, @@ -7345,6 +7484,7 @@ class App extends React.Component { this.setState({ errorMessage: error.message || t("errors.imageInsertError"), }); + return null; } }; @@ -7387,9 +7527,11 @@ class App extends React.Component { } }; - private onImageAction = async ( - { insertOnCanvasDirectly } = { insertOnCanvasDirectly: false }, - ) => { + private onImageAction = async ({ + insertOnCanvasDirectly, + }: { + insertOnCanvasDirectly: boolean; + }) => { try { const clientX = this.state.width / 2 + this.state.offsetLeft; const clientY = this.state.height / 2 + this.state.offsetTop; diff --git a/src/components/ColorPicker/TopPicks.tsx b/src/components/ColorPicker/TopPicks.tsx index ae420c3fd..34adbdf49 100644 --- a/src/components/ColorPicker/TopPicks.tsx +++ b/src/components/ColorPicker/TopPicks.tsx @@ -55,6 +55,7 @@ export const TopPicks = ({ type="button" title={color} onClick={() => onChange(color)} + data-testid={`color-top-pick-${color}`} >
diff --git a/src/components/ContextMenu.tsx b/src/components/ContextMenu.tsx index 42d654207..ebabae83b 100644 --- a/src/components/ContextMenu.tsx +++ b/src/components/ContextMenu.tsx @@ -9,11 +9,7 @@ import { } from "../actions/shortcuts"; import { Action } from "../actions/types"; import { ActionManager } from "../actions/manager"; -import { - useExcalidrawAppState, - useExcalidrawElements, - useExcalidrawSetAppState, -} from "./App"; +import { useExcalidrawAppState, useExcalidrawElements } from "./App"; import React from "react"; export type ContextMenuItem = typeof CONTEXT_MENU_SEPARATOR | Action; @@ -25,14 +21,14 @@ type ContextMenuProps = { items: ContextMenuItems; top: number; left: number; + onClose: (callback?: () => void) => void; }; export const CONTEXT_MENU_SEPARATOR = "separator"; export const ContextMenu = React.memo( - ({ actionManager, items, top, left }: ContextMenuProps) => { + ({ actionManager, items, top, left, onClose }: ContextMenuProps) => { const appState = useExcalidrawAppState(); - const setAppState = useExcalidrawSetAppState(); const elements = useExcalidrawElements(); const filteredItems = items.reduce((acc: ContextMenuItem[], item) => { @@ -54,7 +50,9 @@ export const ContextMenu = React.memo( return ( setAppState({ contextMenu: null })} + onCloseRequest={() => { + onClose(); + }} top={top} left={left} fitInViewport={true} @@ -102,7 +100,7 @@ export const ContextMenu = React.memo( // we need update state before executing the action in case // the action uses the appState it's being passed (that still // contains a defined contextMenu) to return the next state. - setAppState({ contextMenu: null }, () => { + onClose(() => { actionManager.executeAction(item, "contextMenu"); }); }} diff --git a/src/components/FilledButton.scss b/src/components/FilledButton.scss index e171ff8d0..c0a57f272 100644 --- a/src/components/FilledButton.scss +++ b/src/components/FilledButton.scss @@ -12,32 +12,32 @@ &--color-primary { &.ExcButton--variant-filled { - --text-color: var(--input-bg-color); + --text-color: var(--color-surface-lowest); --back-color: var(--color-primary); &:hover { - --back-color: var(--color-primary-darker); + --back-color: var(--color-brand-hover); } &:active { - --back-color: var(--color-primary-darkest); + --back-color: var(--color-brand-active); } } &.ExcButton--variant-outlined, &.ExcButton--variant-icon { --text-color: var(--color-primary); - --border-color: var(--color-primary); - --back-color: var(--input-bg-color); + --border-color: var(--color-border-outline); + --back-color: transparent; &:hover { - --text-color: var(--color-primary-darker); - --border-color: var(--color-primary-darker); + --text-color: var(--color-brand-hover); + --border-color: var(--color-brand-hover); } &:active { - --text-color: var(--color-primary-darkest); - --border-color: var(--color-primary-darkest); + --text-color: var(--color-brand-active); + --border-color: var(--color-brand-active); } } } diff --git a/src/components/HelpDialog.scss b/src/components/HelpDialog.scss index 8a0a08f3c..0722c9723 100644 --- a/src/components/HelpDialog.scss +++ b/src/components/HelpDialog.scss @@ -19,20 +19,35 @@ } &__btn { + --background: var(--color-surface-mid); + display: flex; column-gap: 0.5rem; align-items: center; - border: 1px solid var(--default-border-color); + background-color: var(--background); padding: 0.625rem 1rem; + border: 1px solid var(--background); border-radius: var(--border-radius-lg); color: var(--text-primary-color); font-weight: 600; font-size: 0.75rem; letter-spacing: 0.4px; + @at-root .excalidraw.theme--dark#{&} { + --background: var(--color-surface-high); + &:hover { + --background: #363541; + } + } + &:hover { + --background: var(--color-surface-high); text-decoration: none; } + + &:active { + border-color: var(--color-primary); + } } &__link-icon { diff --git a/src/components/JSONExportDialog.tsx b/src/components/JSONExportDialog.tsx index e4d51da43..59cffbbae 100644 --- a/src/components/JSONExportDialog.tsx +++ b/src/components/JSONExportDialog.tsx @@ -23,12 +23,15 @@ export type ExportCB = ( const JSONExportModal = ({ elements, appState, + setAppState, files, actionManager, exportOpts, canvas, + onCloseRequest, }: { appState: UIAppState; + setAppState: React.Component["setState"]; files: BinaryFiles; elements: readonly NonDeletedExcalidrawElement[]; actionManager: ActionManager; @@ -72,9 +75,14 @@ const JSONExportModal = ({ title={t("exportDialog.link_button")} aria-label={t("exportDialog.link_button")} showAriaLabel={true} - onClick={() => { - onExportToBackend(elements, appState, files, canvas); - trackEvent("export", "link", `ui (${getFrame()})`); + onClick={async () => { + try { + trackEvent("export", "link", `ui (${getFrame()})`); + await onExportToBackend(elements, appState, files, canvas); + onCloseRequest(); + } catch (error: any) { + setAppState({ errorMessage: error.message }); + } }} /> @@ -114,6 +122,7 @@ export const JSONExportDialog = ({ ["setState"]; elements: readonly NonDeletedExcalidrawElement[]; onLockToggle: () => void; @@ -73,7 +72,6 @@ interface LayerUIProps { renderTopRightUI?: ExcalidrawProps["renderTopRightUI"]; renderCustomStats?: ExcalidrawProps["renderCustomStats"]; UIOptions: AppProps["UIOptions"]; - onImageAction: (data: { insertOnCanvasDirectly: boolean }) => void; onExportImage: AppClassProperties["onExportImage"]; renderWelcomeScreen: boolean; children?: React.ReactNode; @@ -123,7 +121,6 @@ const LayerUI = ({ setAppState, elements, canvas, - interactiveCanvas, onLockToggle, onHandToolToggle, onPenModeToggle, @@ -131,7 +128,6 @@ const LayerUI = ({ renderTopRightUI, renderCustomStats, UIOptions, - onImageAction, onExportImage, renderWelcomeScreen, children, @@ -280,14 +276,8 @@ const LayerUI = ({ { - onImageAction({ - insertOnCanvasDirectly: pointerType !== "mouse", - }); - }} /> @@ -472,8 +462,6 @@ const LayerUI = ({ onLockToggle={onLockToggle} onHandToolToggle={onHandToolToggle} onPenModeToggle={onPenModeToggle} - interactiveCanvas={interactiveCanvas} - onImageAction={onImageAction} renderTopRightUI={renderTopRightUI} renderCustomStats={renderCustomStats} renderSidebars={renderSidebars} @@ -560,18 +548,8 @@ const areEqual = (prevProps: LayerUIProps, nextProps: LayerUIProps) => { return false; } - const { - canvas: _pC, - interactiveCanvas: _pIC, - appState: prevAppState, - ...prev - } = prevProps; - const { - canvas: _nC, - interactiveCanvas: _nIC, - appState: nextAppState, - ...next - } = nextProps; + const { canvas: _pC, appState: prevAppState, ...prev } = prevProps; + const { canvas: _nC, appState: nextAppState, ...next } = nextProps; return ( isShallowEqual( diff --git a/src/components/LibraryMenu.scss b/src/components/LibraryMenu.scss index 16715614a..1de8aee18 100644 --- a/src/components/LibraryMenu.scss +++ b/src/components/LibraryMenu.scss @@ -99,10 +99,10 @@ font-size: 0.75rem; &:hover { - background-color: var(--color-primary-darker); + background-color: var(--color-brand-hover); } &:active { - background-color: var(--color-primary-darkest); + background-color: var(--color-brand-active); } } diff --git a/src/components/MobileMenu.tsx b/src/components/MobileMenu.tsx index b7f0ba333..bb26fe713 100644 --- a/src/components/MobileMenu.tsx +++ b/src/components/MobileMenu.tsx @@ -36,9 +36,7 @@ type MobileMenuProps = { onLockToggle: () => void; onHandToolToggle: () => void; onPenModeToggle: () => void; - interactiveCanvas: HTMLCanvasElement | null; - onImageAction: (data: { insertOnCanvasDirectly: boolean }) => void; renderTopRightUI?: ( isMobile: boolean, appState: UIAppState, @@ -58,8 +56,7 @@ export const MobileMenu = ({ onLockToggle, onHandToolToggle, onPenModeToggle, - interactiveCanvas, - onImageAction, + renderTopRightUI, renderCustomStats, renderSidebars, @@ -85,14 +82,8 @@ export const MobileMenu = ({ { - onImageAction({ - insertOnCanvasDirectly: pointerType !== "mouse", - }); - }} /> diff --git a/src/components/RadioGroup.scss b/src/components/RadioGroup.scss index 860648269..eb70f4a82 100644 --- a/src/components/RadioGroup.scss +++ b/src/components/RadioGroup.scss @@ -1,27 +1,18 @@ @import "../css/variables.module"; .excalidraw { - --RadioGroup-background: #ffffff; - --RadioGroup-border: var(--color-gray-30); + --RadioGroup-background: var(--island-bg-color); + --RadioGroup-border: var(--color-surface-high); --RadioGroup-choice-color-off: var(--color-primary); - --RadioGroup-choice-color-off-hover: var(--color-primary-darkest); - --RadioGroup-choice-background-off: white; - --RadioGroup-choice-background-off-active: var(--color-gray-20); + --RadioGroup-choice-color-off-hover: var(--color-brand-hover); + --RadioGroup-choice-background-off: var(--island-bg-color); + --RadioGroup-choice-background-off-active: var(--color-surface-high); - --RadioGroup-choice-color-on: white; + --RadioGroup-choice-color-on: var(--color-surface-lowest); --RadioGroup-choice-background-on: var(--color-primary); - --RadioGroup-choice-background-on-hover: var(--color-primary-darker); - --RadioGroup-choice-background-on-active: var(--color-primary-darkest); - - &.theme--dark { - --RadioGroup-background: var(--color-gray-85); - --RadioGroup-border: var(--color-gray-70); - - --RadioGroup-choice-background-off: var(--color-gray-85); - --RadioGroup-choice-background-off-active: var(--color-gray-70); - --RadioGroup-choice-color-on: var(--color-gray-85); - } + --RadioGroup-choice-background-on-hover: var(--color-brand-hover); + --RadioGroup-choice-background-on-active: var(--color-brand-active); .RadioGroup { box-sizing: border-box; diff --git a/src/components/Sidebar/SidebarTrigger.scss b/src/components/Sidebar/SidebarTrigger.scss index 7c0669c4d..834df6563 100644 --- a/src/components/Sidebar/SidebarTrigger.scss +++ b/src/components/Sidebar/SidebarTrigger.scss @@ -3,8 +3,7 @@ .excalidraw { .sidebar-trigger { @include outlineButtonStyles; - - background-color: var(--island-bg-color); + @include filledButtonOnCanvas; width: auto; height: var(--lg-button-size); diff --git a/src/components/Switch.scss b/src/components/Switch.scss index ab98bad63..ca3c03718 100644 --- a/src/components/Switch.scss +++ b/src/components/Switch.scss @@ -1,15 +1,13 @@ @import "../css/variables.module"; .excalidraw { - --Switch-disabled-color: #d6d6d6; - --Switch-track-background: white; - --Switch-thumb-background: #3d3d3d; - - &.theme--dark { - --Switch-disabled-color: #5c5c5c; - --Switch-track-background: #242424; - --Switch-thumb-background: #b8b8b8; - } + --Switch-disabled-color: var(--color-border-outline); + --Switch-disabled-toggled-background: var(--color-border-outline-variant); + --Switch-disabled-border: var(--color-border-outline-variant); + --Switch-track-background: var(--island-bg-color); + --Switch-thumb-background: var(--color-on-surface); + --Switch-hover-background: var(--color-brand-hover); + --Switch-active-background: var(--color-brand-active); .Switch { position: relative; @@ -28,7 +26,11 @@ &:hover { background: var(--Switch-track-background); - border: 1px solid #999999; + border: 1px solid var(--Switch-hover-background); + } + + &:active { + border: 1px solid var(--Switch-active-background); } &.toggled { @@ -43,11 +45,11 @@ &.disabled { background: var(--Switch-track-background); - border: 1px solid var(--Switch-disabled-color); + border: 1px solid var(--Switch-disabled-border); &.toggled { - background: var(--Switch-disabled-color); - border: 1px solid var(--Switch-disabled-color); + background: var(--Switch-disabled-toggled-background); + border: 1px solid var(--Switch-disabled-toggled-background); } } @@ -92,7 +94,7 @@ } &.disabled.toggled:before { - background: var(--color-gray-50); + background: var(--Switch-disabled-color); } & input { diff --git a/src/components/TextField.scss b/src/components/TextField.scss index 57093996c..74518d218 100644 --- a/src/components/TextField.scss +++ b/src/components/TextField.scss @@ -1,25 +1,16 @@ @import "../css/variables.module"; .excalidraw { - --ExcTextField--color: var(--color-gray-80); - --ExcTextField--label-color: var(--color-gray-80); - --ExcTextField--background: white; - --ExcTextField--readonly--background: var(--color-gray-10); - --ExcTextField--readonly--color: var(--color-gray-80); - --ExcTextField--border: var(--color-gray-40); - --ExcTextField--border-hover: var(--color-gray-50); - --ExcTextField--placeholder: var(--color-gray-40); - - &.theme--dark { - --ExcTextField--color: var(--color-gray-10); - --ExcTextField--label-color: var(--color-gray-20); - --ExcTextField--background: var(--color-gray-85); - --ExcTextField--readonly--background: var(--color-gray-80); - --ExcTextField--readonly--color: var(--color-gray-40); - --ExcTextField--border: var(--color-gray-70); - --ExcTextField--border-hover: var(--color-gray-60); - --ExcTextField--placeholder: var(--color-gray-80); - } + --ExcTextField--color: var(--color-on-surface); + --ExcTextField--label-color: var(--color-on-surface); + --ExcTextField--background: transparent; + --ExcTextField--readonly--background: var(--color-surface-high); + --ExcTextField--readonly--color: var(--color-on-surface); + --ExcTextField--border: var(--color-border-outline); + --ExcTextField--readonly--border: var(--color-border-outline-variant); + --ExcTextField--border-hover: var(--color-brand-hover); + --ExcTextField--border-active: var(--color-brand-active); + --ExcTextField--placeholder: var(--color-border-outline-variant); .ExcTextField { &--fullWidth { @@ -61,7 +52,7 @@ &:active, &:focus-within { - border-color: var(--color-primary); + border-color: var(--ExcTextField--border-active); } } @@ -107,7 +98,7 @@ &--readonly { background: var(--ExcTextField--readonly--background); - border-color: transparent; + border-color: var(--ExcTextField--readonly--border); & input { color: var(--ExcTextField--readonly--color); diff --git a/src/components/ToolButton.tsx b/src/components/ToolButton.tsx index c77454dc6..ffe9a382c 100644 --- a/src/components/ToolButton.tsx +++ b/src/components/ToolButton.tsx @@ -83,12 +83,12 @@ export const ToolButton = React.forwardRef((props: ToolButtonProps, ref) => { } }; - useEffect( - () => () => { + useEffect(() => { + isMountedRef.current = true; + return () => { isMountedRef.current = false; - }, - [], - ); + }; + }, []); const lastPointerTypeRef = useRef(null); diff --git a/src/components/ToolIcon.scss b/src/components/ToolIcon.scss index 066f26d61..6ebd31cb0 100644 --- a/src/components/ToolIcon.scss +++ b/src/components/ToolIcon.scss @@ -97,10 +97,6 @@ } } - // &:hover { - // background-color: var(--button-gray-2); - // } - &:active { background-color: var(--button-gray-3); } @@ -110,7 +106,6 @@ } &--hide { - // visibility: hidden; display: none !important; } } diff --git a/src/components/Toolbar.scss b/src/components/Toolbar.scss index aee50a144..fa123248d 100644 --- a/src/components/Toolbar.scss +++ b/src/components/Toolbar.scss @@ -22,6 +22,7 @@ .App-toolbar__extra-tools-trigger { box-shadow: none; border: 0; + background-color: transparent; &:active { background-color: var(--button-hover-bg); diff --git a/src/components/dropdownMenu/DropdownMenu.scss b/src/components/dropdownMenu/DropdownMenu.scss index 1df90fd4a..0ab1eb046 100644 --- a/src/components/dropdownMenu/DropdownMenu.scss +++ b/src/components/dropdownMenu/DropdownMenu.scss @@ -16,7 +16,7 @@ .dropdown-menu-container { padding: 8px 8px; box-sizing: border-box; - background-color: var(--island-bg-color); + // background-color: var(--island-bg-color); box-shadow: var(--shadow-island); border-radius: var(--border-radius-lg); position: relative; @@ -29,7 +29,7 @@ } .dropdown-menu-container { - background-color: #fff !important; + background-color: var(--island-bg-color); max-height: calc(100vh - 150px); overflow-y: auto; --gap: 2; @@ -40,7 +40,7 @@ padding: 0 0.625rem; column-gap: 0.625rem; font-size: 0.875rem; - color: var(--color-gray-100); + color: var(--color-on-surface); width: 100%; box-sizing: border-box; font-weight: normal; @@ -49,7 +49,7 @@ .dropdown-menu-item { background-color: transparent; - border: 0; + border: 1px solid transparent; align-items: center; height: 2rem; cursor: pointer; @@ -80,6 +80,11 @@ text-decoration: none; } + &:active { + background-color: var(--button-hover-bg); + border-color: var(--color-brand-active); + } + svg { width: 1rem; height: 1rem; @@ -98,22 +103,33 @@ font-weight: 500; } } - &.theme--dark { - .dropdown-menu-item { - color: var(--color-gray-40); - } - - .dropdown-menu-container { - background-color: var(--color-gray-90) !important; - } - } .dropdown-menu-button { @include outlineButtonStyles; - background-color: var(--island-bg-color); width: var(--lg-button-size); height: var(--lg-button-size); + --background: var(--color-surface-mid); + + background-color: var(--background); + + @at-root .excalidraw.theme--dark#{&} { + --background: var(--color-surface-high); + &:hover { + --background: #363541; + } + } + + &:hover { + --background: var(--color-surface-high); + background-color: var(--background); + text-decoration: none; + } + + &:active { + border-color: var(--color-primary); + } + svg { width: var(--lg-icon-size); height: var(--lg-icon-size); diff --git a/src/components/live-collaboration/LiveCollaborationTrigger.scss b/src/components/live-collaboration/LiveCollaborationTrigger.scss index 138d6459b..763193341 100644 --- a/src/components/live-collaboration/LiveCollaborationTrigger.scss +++ b/src/components/live-collaboration/LiveCollaborationTrigger.scss @@ -14,6 +14,8 @@ --button-active-bg: var(--color-primary-darker); + box-shadow: 0 0 0 1px var(--color-surface-lowest); + flex-shrink: 0; // double .active to force specificity diff --git a/src/components/main-menu/MainMenu.tsx b/src/components/main-menu/MainMenu.tsx index aa2454083..6d6ba5ef1 100644 --- a/src/components/main-menu/MainMenu.tsx +++ b/src/components/main-menu/MainMenu.tsx @@ -43,6 +43,7 @@ const MainMenu = Object.assign( }); }} data-testid="main-menu-trigger" + className="main-menu-trigger" > {HamburgerMenuIcon} diff --git a/src/components/welcome-screen/WelcomeScreen.scss b/src/components/welcome-screen/WelcomeScreen.scss index 8f1a09bf3..ef526aba4 100644 --- a/src/components/welcome-screen/WelcomeScreen.scss +++ b/src/components/welcome-screen/WelcomeScreen.scss @@ -174,7 +174,7 @@ justify-content: space-between; background: none; - border: none; + border: 1px solid transparent; padding: 0.75rem; @@ -204,7 +204,7 @@ .welcome-screen-menu-item:hover { text-decoration: none; - background: var(--color-gray-10); + background: var(--button-hover-bg); .welcome-screen-menu-item__shortcut { color: var(--color-gray-50); @@ -216,7 +216,8 @@ } .welcome-screen-menu-item:active { - background: var(--color-gray-20); + background: var(--button-hover-bg); + border-color: var(--color-brand-active); .welcome-screen-menu-item__shortcut { color: var(--color-gray-50); @@ -247,8 +248,7 @@ } .welcome-screen-menu-item:hover { - background: var(--color-gray-85); - + background-color: var(--color-surface-low); .welcome-screen-menu-item__shortcut { color: var(--color-gray-50); } @@ -259,7 +259,6 @@ } .welcome-screen-menu-item:active { - background-color: var(--color-gray-90); .welcome-screen-menu-item__text { color: var(--color-gray-10); } diff --git a/src/constants.ts b/src/constants.ts index 90fc66758..9c22f71dc 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -148,6 +148,8 @@ export const IMAGE_MIME_TYPES = { jfif: "image/jfif", } as const; +export const ALLOWED_PASTE_MIME_TYPES = ["text/plain", "text/html"] as const; + export const MIME_TYPES = { json: "application/json", // excalidraw data @@ -296,6 +298,18 @@ export const ROUNDNESS = { * collaboration */ export const PRECEDING_ELEMENT_KEY = "__precedingElement__"; +export const ROUGHNESS = { + architect: 0, + artist: 1, + cartoonist: 2, +} as const; + +export const STROKE_WIDTH = { + thin: 1, + bold: 2, + extraBold: 4, +} as const; + export const DEFAULT_ELEMENT_PROPS: { strokeColor: ExcalidrawElement["strokeColor"]; backgroundColor: ExcalidrawElement["backgroundColor"]; @@ -308,10 +322,10 @@ export const DEFAULT_ELEMENT_PROPS: { } = { strokeColor: COLOR_PALETTE.black, backgroundColor: COLOR_PALETTE.transparent, - fillStyle: "hachure", - strokeWidth: 1, + fillStyle: "solid", + strokeWidth: 2, strokeStyle: "solid", - roughness: 1, + roughness: ROUGHNESS.artist, opacity: 100, locked: false, }; diff --git a/src/css/styles.scss b/src/css/styles.scss index 4ca58af4f..d35538717 100644 --- a/src/css/styles.scss +++ b/src/css/styles.scss @@ -444,13 +444,14 @@ } &:active { - border: 1px solid var(--color-primary-darkest); + border: 1px solid var(--button-active-border); } } .help-icon { @include outlineButtonStyles; - background-color: var(--island-bg-color); + @include filledButtonOnCanvas; + width: var(--lg-button-size); height: var(--lg-button-size); @@ -621,6 +622,20 @@ padding: 0; } } + + .main-menu-trigger { + @include filledButtonOnCanvas; + } + + .App-menu__left { + --button-border: transparent; + --button-bg: var(--color-surface-mid); + + @at-root .excalidraw.theme--dark#{&} { + --button-hover-bg: #363541; + --button-bg: var(--color-surface-high); + } + } } .ErrorSplash.excalidraw { diff --git a/src/css/theme.scss b/src/css/theme.scss index 1db22313a..4fb8bf81f 100644 --- a/src/css/theme.scss +++ b/src/css/theme.scss @@ -12,27 +12,30 @@ --dialog-border-color: var(--color-gray-20); --dropdown-icon: url('data:image/svg+xml,'); --focus-highlight-color: #{$oc-blue-2}; - --icon-fill-color: var(--color-gray-80); + --icon-fill-color: var(--color-on-surface); --icon-green-fill-color: #{$oc-green-9}; --default-bg-color: #{$oc-white}; --input-bg-color: #{$oc-white}; --input-border-color: #{$oc-gray-4}; --input-hover-bg-color: #{$oc-gray-1}; --input-label-color: #{$oc-gray-7}; - --island-bg-color: rgba(255, 255, 255, 0.96); + --island-bg-color: #ffffff; --keybinding-color: var(--color-gray-40); --link-color: #{$oc-blue-7}; --overlay-bg-color: #{transparentize($oc-white, 0.12)}; - --popup-bg-color: #{$oc-white}; + --popup-bg-color: var(--island-bg-color); --popup-secondary-bg-color: #{$oc-gray-1}; --popup-text-color: #{$oc-black}; --popup-text-inverted-color: #{$oc-white}; --select-highlight-color: #{$oc-blue-5}; - --shadow-island: 0px 7px 14px rgba(0, 0, 0, 0.05), - 0px 0px 3.12708px rgba(0, 0, 0, 0.0798), - 0px 0px 0.931014px rgba(0, 0, 0, 0.1702); - --button-hover-bg: var(--color-gray-10); - --default-border-color: var(--color-gray-30); + --shadow-island: 0px 0px 0.9310142993927002px 0px rgba(0, 0, 0, 0.17), + 0px 0px 3.1270833015441895px 0px rgba(0, 0, 0, 0.08), + 0px 7px 14px 0px rgba(0, 0, 0, 0.05); + + --button-hover-bg: var(--color-surface-high); + --button-active-bg: var(--color-surface-high); + --button-active-border: var(--color-brand-active); + --default-border-color: var(--color-surface-high); --default-button-size: 2rem; --default-icon-size: 1rem; @@ -63,14 +66,14 @@ 0px 12.5216px 10.0172px rgba(0, 0, 0, 0.035), 0px 6.6501px 5.32008px rgba(0, 0, 0, 0.0282725), 0px 2.76726px 2.21381px rgba(0, 0, 0, 0.0196802); - --sidebar-border-color: var(--color-gray-20); - --sidebar-bg-color: #fff; + --sidebar-border-color: var(--color-surface-high); + --sidebar-bg-color: var(--island-bg-color); --library-dropdown-shadow: 0px 15px 6px rgba(0, 0, 0, 0.01), 0px 8px 5px rgba(0, 0, 0, 0.05), 0px 4px 4px rgba(0, 0, 0, 0.09), 0px 1px 2px rgba(0, 0, 0, 0.1), 0px 0px 0px rgba(0, 0, 0, 0.1); --space-factor: 0.25rem; - --text-primary-color: var(--color-gray-80); + --text-primary-color: var(--color-on-surface); --color-selection: #6965db; @@ -132,6 +135,19 @@ --border-radius-md: 0.375rem; --border-radius-lg: 0.5rem; + --color-surface-high: hsl(244, 100%, 97%); + --color-surface-mid: hsl(240 25% 96%); + --color-surface-low: hsl(240 25% 94%); + --color-surface-lowest: #ffffff; + --color-on-surface: #1b1b1f; + --color-brand-hover: #5753d0; + --color-on-primary-container: #030064; + --color-surface-primary-container: #e0dfff; + --color-brand-active: #4440bf; + --color-border-outline: #767680; + --color-border-outline-variant: #c5c5d0; + --color-surface-primary-container: #e0dfff; + &.theme--dark { &.theme--dark-background-none { background: none; @@ -150,29 +166,24 @@ --dialog-border-color: var(--color-gray-80); --dropdown-icon: url('data:image/svg+xml,'); --focus-highlight-color: #{$oc-blue-6}; - --icon-fill-color: var(--color-gray-40); --icon-green-fill-color: #{$oc-green-4}; --default-bg-color: #121212; --input-bg-color: #121212; --input-border-color: #2e2e2e; --input-hover-bg-color: #181818; --input-label-color: #{$oc-gray-2}; - --island-bg-color: #262627; + --island-bg-color: #232329; --keybinding-color: var(--color-gray-60); --link-color: #{$oc-blue-4}; --overlay-bg-color: #{transparentize($oc-gray-8, 0.88)}; - --popup-bg-color: #2c2c2c; --popup-secondary-bg-color: #222; --popup-text-color: #{$oc-gray-4}; --popup-text-inverted-color: #2c2c2c; --select-highlight-color: #{$oc-blue-4}; - --text-primary-color: var(--color-gray-40); - --button-hover-bg: var(--color-gray-80); - --default-border-color: var(--color-gray-80); - --shadow-island: 0px 13px 33px rgba(0, 0, 0, 0.07), - 0px 4.13px 9.94853px rgba(0, 0, 0, 0.0456112), - 0px 1.13px 4.13211px rgba(0, 0, 0, 0.035), - 0px 0.769896px 1.4945px rgba(0, 0, 0, 0.0243888); + --shadow-island: 0px 0px 0.9310142993927002px 0px rgba(0, 0, 0, 0.17), + 0px 0px 3.1270833015441895px 0px rgba(0, 0, 0, 0.08), + 0px 7px 14px 0px rgba(0, 0, 0, 0.05); + --modal-shadow: 0px 100px 80px rgba(0, 0, 0, 0.07), 0px 41.7776px 33.4221px rgba(0, 0, 0, 0.0503198), 0px 22.3363px 17.869px rgba(0, 0, 0, 0.0417275), @@ -180,8 +191,6 @@ 0px 6.6501px 5.32008px rgba(0, 0, 0, 0.0282725), 0px 2.76726px 2.21381px rgba(0, 0, 0, 0.0196802); --avatar-border-color: var(--color-gray-85); - --sidebar-border-color: var(--color-gray-85); - --sidebar-bg-color: #191919; --scrollbar-thumb: #{$oc-gray-8}; --scrollbar-thumb-hover: #{$oc-gray-7}; @@ -224,5 +233,18 @@ --color-promo: #d297ff; --color-logo-text: #e2dfff; + + --color-surface-high: hsl(245, 10%, 21%); + --color-surface-low: hsl(240, 8%, 15%); + --color-surface-mid: hsl(240 6% 10%); + --color-surface-lowest: hsl(0, 0%, 7%); + --color-on-surface: #e3e3e8; + --color-brand-hover: #bbb8ff; + --color-on-primary-container: #e0dfff; + --color-surface-primary-container: #403e6a; + --color-brand-active: #d0ccff; + --color-border-outline: #8e8d9c; + --color-border-outline-variant: #46464f; + --color-surface-primary-container: #403e6a; } } diff --git a/src/css/variables.module.scss b/src/css/variables.module.scss index 10e42dc72..634752dfa 100644 --- a/src/css/variables.module.scss +++ b/src/css/variables.module.scss @@ -11,7 +11,7 @@ .ToolIcon_type_radio, .ToolIcon_type_checkbox { &:checked + .ToolIcon__icon { - --icon-fill-color: var(--color-primary-darker); + --icon-fill-color: var(--color-on-primary-container); svg { fill: var(--icon-fill-color); @@ -23,11 +23,11 @@ .ToolIcon_type_radio, .ToolIcon_type_checkbox { &:checked + .ToolIcon__icon { - background: var(--color-primary-light); - --keybinding-color: var(--color-gray-60); + background: var(--color-surface-primary-container); + --keybinding-color: var(--color-on-primary-container); svg { - color: var(--color-primary-darker); + color: var(--color-on-primary-container); } } } @@ -44,7 +44,11 @@ &:active { background: var(--button-hover-bg); - border: 1px solid var(--color-primary-darkest); + border: 1px solid var(--button-active-border); + + svg { + color: var(--color-on-primary-container); + } } } } @@ -63,7 +67,7 @@ border-radius: var(--border-radius-lg); cursor: pointer; background-color: var(--button-bg, var(--island-bg-color)); - color: var(--button-color, var(--text-primary-color)); + color: var(--button-color, var(--color-on-surface)); svg { width: var(--button-width, var(--lg-icon-size)); @@ -88,22 +92,38 @@ } &.active { - background-color: var(--button-selected-bg, var(--color-primary-light)); - border-color: var(--button-selected-border, var(--color-primary-light)); + background-color: var( + --button-selected-bg, + var(--color-surface-primary-container) + ); + border-color: var( + --button-selected-border, + var(--color-surface-primary-container) + ); &:hover { background-color: var( --button-selected-hover-bg, - var(--color-primary-light) + var(--color-surface-primary-container) ); } svg { - color: var(--button-color, var(--color-primary-darker)); + color: var(--button-color, var(--color-on-primary-container)); } } } +@mixin filledButtonOnCanvas { + border: none; + box-shadow: 0 0 0 1px var(--color-surface-lowest); + background-color: var(--color-surface-low); + + &:active { + box-shadow: 0 0 0 1px var(--color-brand-active); + } +} + $theme-filter: "invert(93%) hue-rotate(180deg)"; $right-sidebar-width: "302px"; diff --git a/src/cursor.ts b/src/cursor.ts index 364ce155c..c39c2efcf 100644 --- a/src/cursor.ts +++ b/src/cursor.ts @@ -99,5 +99,7 @@ export const setCursorForShape = ( interactiveCanvas.style.cursor = `url(${url}), auto`; } else if (!["image", "custom"].includes(appState.activeTool.type)) { interactiveCanvas.style.cursor = CURSOR_TYPE.CROSSHAIR; + } else { + interactiveCanvas.style.cursor = CURSOR_TYPE.AUTO; } }; diff --git a/src/data/__snapshots__/transform.test.ts.snap b/src/data/__snapshots__/transform.test.ts.snap index 24503a948..ae846bdc9 100644 --- a/src/data/__snapshots__/transform.test.ts.snap +++ b/src/data/__snapshots__/transform.test.ts.snap @@ -5,16 +5,16 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "angle": 0, "backgroundColor": "#d8f5a2", "boundElements": [ - { - "id": "id40", - "type": "arrow", - }, { "id": "id41", "type": "arrow", }, + { + "id": "id42", + "type": "arrow", + }, ], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 300, @@ -28,7 +28,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "seed": Any, "strokeColor": "#66a80f", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 3, @@ -45,11 +45,11 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "backgroundColor": "transparent", "boundElements": [ { - "id": "id41", + "id": "id42", "type": "arrow", }, ], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -63,7 +63,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "seed": Any, "strokeColor": "#9c36b5", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -85,7 +85,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "focus": -0.008153707962747813, "gap": 1, }, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 35, @@ -97,12 +97,12 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "opacity": 100, "points": [ [ - 0, - 0, + 0.5, + 0.5, ], [ - 395, - 35, + 394.5, + 34.5, ], ], "roughness": 1, @@ -110,13 +110,13 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "seed": Any, "startArrowhead": null, "startBinding": { - "elementId": "id42", + "elementId": "id43", "focus": -0.08139534883720931, "gap": 1, }, "strokeColor": "#1864ab", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, @@ -138,7 +138,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "focus": 0.10666666666666667, "gap": 3.834326468444573, }, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -150,11 +150,11 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "opacity": 100, "points": [ [ - 0, + 0.5, 0, ], [ - 400, + 399.5, 0, ], ], @@ -169,7 +169,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s }, "strokeColor": "#e67700", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, @@ -186,11 +186,11 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "backgroundColor": "transparent", "boundElements": [ { - "id": "id40", + "id": "id41", "type": "arrow", }, ], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 300, @@ -204,7 +204,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -222,12 +222,12 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "baseline": 0, "boundElements": [ { - "id": "id43", + "id": "id44", "type": "arrow", }, ], "containerId": null, - "fillStyle": "hachure", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -245,7 +245,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "seed": Any, "strokeColor": "#c2255c", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "HEYYYYY", "textAlign": "left", "type": "text", @@ -266,12 +266,12 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "baseline": 0, "boundElements": [ { - "id": "id43", + "id": "id44", "type": "arrow", }, ], "containerId": null, - "fillStyle": "hachure", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -289,7 +289,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "Whats up ?", "textAlign": "left", "type": "text", @@ -309,7 +309,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "backgroundColor": "transparent", "boundElements": [ { - "id": "id44", + "id": "id45", "type": "text", }, ], @@ -317,9 +317,9 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "endBinding": { "elementId": "text-2", "focus": 0, - "gap": 5, + "gap": 205, }, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -331,11 +331,11 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "opacity": 100, "points": [ [ - 0, + 0.5, 0, ], [ - 300, + 99.5, 0, ], ], @@ -350,12 +350,12 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t }, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, "versionNonce": Any, - "width": 300, + "width": 100, "x": 255, "y": 239, } @@ -367,8 +367,8 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "backgroundColor": "transparent", "baseline": 0, "boundElements": null, - "containerId": "id43", - "fillStyle": "hachure", + "containerId": "id44", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -386,7 +386,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "HELLO WORLD!!", "textAlign": "center", "type": "text", @@ -395,7 +395,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "versionNonce": Any, "verticalAlign": "middle", "width": 130, - "x": 340, + "x": 240, "y": 226.5, } `; @@ -406,17 +406,17 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "backgroundColor": "transparent", "boundElements": [ { - "id": "id33", + "id": "id34", "type": "text", }, ], "endArrowhead": "arrow", "endBinding": { - "elementId": "id35", + "elementId": "id36", "focus": 0, "gap": 1, }, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -428,11 +428,11 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "opacity": 100, "points": [ [ - 0, + 0.5, 0, ], [ - 300, + 99.5, 0, ], ], @@ -441,18 +441,18 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "seed": Any, "startArrowhead": null, "startBinding": { - "elementId": "id34", + "elementId": "id35", "focus": 0, "gap": 1, }, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, "versionNonce": Any, - "width": 300, + "width": 100, "x": 255, "y": 239, } @@ -464,8 +464,8 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "backgroundColor": "transparent", "baseline": 0, "boundElements": null, - "containerId": "id32", - "fillStyle": "hachure", + "containerId": "id33", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -483,7 +483,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "HELLO WORLD!!", "textAlign": "center", "type": "text", @@ -492,7 +492,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "versionNonce": Any, "verticalAlign": "middle", "width": 130, - "x": 340, + "x": 240, "y": 226.5, } `; @@ -503,11 +503,11 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "backgroundColor": "transparent", "boundElements": [ { - "id": "id32", + "id": "id33", "type": "arrow", }, ], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -521,7 +521,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -538,11 +538,11 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "backgroundColor": "transparent", "boundElements": [ { - "id": "id32", + "id": "id33", "type": "arrow", }, ], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -556,13 +556,13 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, "versionNonce": Any, "width": 100, - "x": 555, + "x": 355, "y": 189, } `; @@ -573,17 +573,17 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "backgroundColor": "transparent", "boundElements": [ { - "id": "id37", + "id": "id38", "type": "text", }, ], "endArrowhead": "arrow", "endBinding": { - "elementId": "id39", + "elementId": "id40", "focus": 0, "gap": 1, }, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -595,11 +595,11 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "opacity": 100, "points": [ [ - 0, + 0.5, 0, ], [ - 300, + 99.5, 0, ], ], @@ -608,18 +608,18 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "seed": Any, "startArrowhead": null, "startBinding": { - "elementId": "id38", + "elementId": "id39", "focus": 0, "gap": 1, }, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, "versionNonce": Any, - "width": 300, + "width": 100, "x": 255, "y": 239, } @@ -631,8 +631,8 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "backgroundColor": "transparent", "baseline": 0, "boundElements": null, - "containerId": "id36", - "fillStyle": "hachure", + "containerId": "id37", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -650,7 +650,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "HELLO WORLD!!", "textAlign": "center", "type": "text", @@ -659,7 +659,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "versionNonce": Any, "verticalAlign": "middle", "width": 130, - "x": 340, + "x": 240, "y": 226.5, } `; @@ -671,12 +671,12 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "baseline": 0, "boundElements": [ { - "id": "id36", + "id": "id37", "type": "arrow", }, ], "containerId": null, - "fillStyle": "hachure", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -694,7 +694,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "HEYYYYY", "textAlign": "left", "type": "text", @@ -715,12 +715,12 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "baseline": 0, "boundElements": [ { - "id": "id36", + "id": "id37", "type": "arrow", }, ], "containerId": null, - "fillStyle": "hachure", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -738,7 +738,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "WHATS UP ?", "textAlign": "left", "type": "text", @@ -747,7 +747,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "versionNonce": Any, "verticalAlign": "top", "width": 100, - "x": 555, + "x": 355, "y": 226.5, } `; @@ -757,7 +757,7 @@ exports[`Test Transform > should not allow duplicate ids 1`] = ` "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 200, @@ -771,7 +771,7 @@ exports[`Test Transform > should not allow duplicate ids 1`] = ` "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 1, @@ -789,7 +789,7 @@ exports[`Test Transform > should transform linear elements 1`] = ` "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -801,11 +801,11 @@ exports[`Test Transform > should transform linear elements 1`] = ` "opacity": 100, "points": [ [ - 0, + 0.5, 0, ], [ - 300, + 99.5, 0, ], ], @@ -816,12 +816,12 @@ exports[`Test Transform > should transform linear elements 1`] = ` "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 1, "versionNonce": Any, - "width": 300, + "width": 100, "x": 100, "y": 20, } @@ -834,7 +834,7 @@ exports[`Test Transform > should transform linear elements 2`] = ` "boundElements": null, "endArrowhead": "triangle", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -846,11 +846,11 @@ exports[`Test Transform > should transform linear elements 2`] = ` "opacity": 100, "points": [ [ - 0, + 0.5, 0, ], [ - 300, + 99.5, 0, ], ], @@ -866,7 +866,7 @@ exports[`Test Transform > should transform linear elements 2`] = ` "updated": 1, "version": 1, "versionNonce": Any, - "width": 300, + "width": 100, "x": 450, "y": 20, } @@ -879,7 +879,7 @@ exports[`Test Transform > should transform linear elements 3`] = ` "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -895,7 +895,7 @@ exports[`Test Transform > should transform linear elements 3`] = ` 0, ], [ - 300, + 100, 0, ], ], @@ -906,12 +906,12 @@ exports[`Test Transform > should transform linear elements 3`] = ` "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 1, "versionNonce": Any, - "width": 300, + "width": 100, "x": 100, "y": 60, } @@ -924,7 +924,7 @@ exports[`Test Transform > should transform linear elements 4`] = ` "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -940,7 +940,7 @@ exports[`Test Transform > should transform linear elements 4`] = ` 0, ], [ - 300, + 100, 0, ], ], @@ -956,7 +956,7 @@ exports[`Test Transform > should transform linear elements 4`] = ` "updated": 1, "version": 1, "versionNonce": Any, - "width": 300, + "width": 100, "x": 450, "y": 60, } @@ -967,7 +967,7 @@ exports[`Test Transform > should transform regular shapes 1`] = ` "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -981,7 +981,7 @@ exports[`Test Transform > should transform regular shapes 1`] = ` "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 1, @@ -997,7 +997,7 @@ exports[`Test Transform > should transform regular shapes 2`] = ` "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -1011,7 +1011,7 @@ exports[`Test Transform > should transform regular shapes 2`] = ` "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 1, @@ -1027,7 +1027,7 @@ exports[`Test Transform > should transform regular shapes 3`] = ` "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -1041,7 +1041,7 @@ exports[`Test Transform > should transform regular shapes 3`] = ` "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 1, @@ -1057,7 +1057,7 @@ exports[`Test Transform > should transform regular shapes 4`] = ` "angle": 0, "backgroundColor": "#c0eb75", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -1149,7 +1149,7 @@ exports[`Test Transform > should transform text element 1`] = ` "baseline": 0, "boundElements": null, "containerId": null, - "fillStyle": "hachure", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -1167,7 +1167,7 @@ exports[`Test Transform > should transform text element 1`] = ` "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "HELLO WORLD!", "textAlign": "left", "type": "text", @@ -1188,7 +1188,7 @@ exports[`Test Transform > should transform text element 2`] = ` "baseline": 0, "boundElements": null, "containerId": null, - "fillStyle": "hachure", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -1206,7 +1206,7 @@ exports[`Test Transform > should transform text element 2`] = ` "seed": Any, "strokeColor": "#5f3dc4", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "STYLED HELLO WORLD!", "textAlign": "left", "type": "text", @@ -1226,13 +1226,13 @@ exports[`Test Transform > should transform to labelled arrows when label provide "backgroundColor": "transparent", "boundElements": [ { - "id": "id28", + "id": "id29", "type": "text", }, ], "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -1244,11 +1244,11 @@ exports[`Test Transform > should transform to labelled arrows when label provide "opacity": 100, "points": [ [ - 0, + 0.5, 0, ], [ - 300, + 99.5, 0, ], ], @@ -1259,12 +1259,12 @@ exports[`Test Transform > should transform to labelled arrows when label provide "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 1, "versionNonce": Any, - "width": 300, + "width": 100, "x": 100, "y": 100, } @@ -1276,13 +1276,13 @@ exports[`Test Transform > should transform to labelled arrows when label provide "backgroundColor": "transparent", "boundElements": [ { - "id": "id29", + "id": "id30", "type": "text", }, ], "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -1294,11 +1294,11 @@ exports[`Test Transform > should transform to labelled arrows when label provide "opacity": 100, "points": [ [ - 0, + 0.5, 0, ], [ - 300, + 99.5, 0, ], ], @@ -1309,12 +1309,12 @@ exports[`Test Transform > should transform to labelled arrows when label provide "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 1, "versionNonce": Any, - "width": 300, + "width": 100, "x": 100, "y": 200, } @@ -1326,13 +1326,13 @@ exports[`Test Transform > should transform to labelled arrows when label provide "backgroundColor": "transparent", "boundElements": [ { - "id": "id30", + "id": "id31", "type": "text", }, ], "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 130, @@ -1344,11 +1344,11 @@ exports[`Test Transform > should transform to labelled arrows when label provide "opacity": 100, "points": [ [ - 0, + 0.5, 0, ], [ - 300, + 99.5, 0, ], ], @@ -1364,7 +1364,7 @@ exports[`Test Transform > should transform to labelled arrows when label provide "updated": 1, "version": 2, "versionNonce": Any, - "width": 300, + "width": 100, "x": 100, "y": 300, } @@ -1376,13 +1376,13 @@ exports[`Test Transform > should transform to labelled arrows when label provide "backgroundColor": "transparent", "boundElements": [ { - "id": "id31", + "id": "id32", "type": "text", }, ], "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 130, @@ -1394,11 +1394,11 @@ exports[`Test Transform > should transform to labelled arrows when label provide "opacity": 100, "points": [ [ - 0, + 0.5, 0, ], [ - 300, + 99.5, 0, ], ], @@ -1414,7 +1414,7 @@ exports[`Test Transform > should transform to labelled arrows when label provide "updated": 1, "version": 2, "versionNonce": Any, - "width": 300, + "width": 100, "x": 100, "y": 400, } @@ -1426,8 +1426,8 @@ exports[`Test Transform > should transform to labelled arrows when label provide "backgroundColor": "transparent", "baseline": 0, "boundElements": null, - "containerId": "id24", - "fillStyle": "hachure", + "containerId": "id25", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -1445,7 +1445,7 @@ exports[`Test Transform > should transform to labelled arrows when label provide "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "LABELED ARROW", "textAlign": "center", "type": "text", @@ -1454,7 +1454,7 @@ exports[`Test Transform > should transform to labelled arrows when label provide "versionNonce": Any, "verticalAlign": "middle", "width": 130, - "x": 185, + "x": 85, "y": 87.5, } `; @@ -1465,8 +1465,8 @@ exports[`Test Transform > should transform to labelled arrows when label provide "backgroundColor": "transparent", "baseline": 0, "boundElements": null, - "containerId": "id25", - "fillStyle": "hachure", + "containerId": "id26", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -1484,7 +1484,7 @@ exports[`Test Transform > should transform to labelled arrows when label provide "seed": Any, "strokeColor": "#099268", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "STYLED LABELED ARROW", "textAlign": "center", "type": "text", @@ -1493,7 +1493,7 @@ exports[`Test Transform > should transform to labelled arrows when label provide "versionNonce": Any, "verticalAlign": "middle", "width": 200, - "x": 150, + "x": 50, "y": 187.5, } `; @@ -1504,8 +1504,8 @@ exports[`Test Transform > should transform to labelled arrows when label provide "backgroundColor": "transparent", "baseline": 0, "boundElements": null, - "containerId": "id26", - "fillStyle": "hachure", + "containerId": "id27", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -1523,7 +1523,7 @@ exports[`Test Transform > should transform to labelled arrows when label provide "seed": Any, "strokeColor": "#1098ad", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "ANOTHER STYLED LABELLED ARROW", "textAlign": "center", @@ -1533,7 +1533,7 @@ LABELLED ARROW", "versionNonce": Any, "verticalAlign": "middle", "width": 150, - "x": 175, + "x": 75, "y": 275, } `; @@ -1544,8 +1544,8 @@ exports[`Test Transform > should transform to labelled arrows when label provide "backgroundColor": "transparent", "baseline": 0, "boundElements": null, - "containerId": "id27", - "fillStyle": "hachure", + "containerId": "id28", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -1563,7 +1563,7 @@ exports[`Test Transform > should transform to labelled arrows when label provide "seed": Any, "strokeColor": "#099268", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "ANOTHER STYLED LABELLED ARROW", "textAlign": "center", @@ -1573,7 +1573,7 @@ LABELLED ARROW", "versionNonce": Any, "verticalAlign": "middle", "width": 150, - "x": 175, + "x": 75, "y": 375, } `; @@ -1584,11 +1584,11 @@ exports[`Test Transform > should transform to text containers when label provide "backgroundColor": "transparent", "boundElements": [ { - "id": "id18", + "id": "id19", "type": "text", }, ], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 35, @@ -1602,7 +1602,7 @@ exports[`Test Transform > should transform to text containers when label provide "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1619,11 +1619,11 @@ exports[`Test Transform > should transform to text containers when label provide "backgroundColor": "transparent", "boundElements": [ { - "id": "id19", + "id": "id20", "type": "text", }, ], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 85, @@ -1637,7 +1637,7 @@ exports[`Test Transform > should transform to text containers when label provide "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -1654,11 +1654,11 @@ exports[`Test Transform > should transform to text containers when label provide "backgroundColor": "transparent", "boundElements": [ { - "id": "id20", + "id": "id21", "type": "text", }, ], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 170, @@ -1672,7 +1672,7 @@ exports[`Test Transform > should transform to text containers when label provide "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -1689,11 +1689,11 @@ exports[`Test Transform > should transform to text containers when label provide "backgroundColor": "#fff3bf", "boundElements": [ { - "id": "id21", + "id": "id22", "type": "text", }, ], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 120, @@ -1724,11 +1724,11 @@ exports[`Test Transform > should transform to text containers when label provide "backgroundColor": "transparent", "boundElements": [ { - "id": "id22", + "id": "id23", "type": "text", }, ], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 85, @@ -1742,7 +1742,7 @@ exports[`Test Transform > should transform to text containers when label provide "seed": Any, "strokeColor": "#c2255c", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1759,11 +1759,11 @@ exports[`Test Transform > should transform to text containers when label provide "backgroundColor": "#ffec99", "boundElements": [ { - "id": "id23", + "id": "id24", "type": "text", }, ], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 120, @@ -1777,7 +1777,7 @@ exports[`Test Transform > should transform to text containers when label provide "seed": Any, "strokeColor": "#f08c00", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -1794,8 +1794,8 @@ exports[`Test Transform > should transform to text containers when label provide "backgroundColor": "transparent", "baseline": 0, "boundElements": null, - "containerId": "id12", - "fillStyle": "hachure", + "containerId": "id13", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -1813,7 +1813,7 @@ exports[`Test Transform > should transform to text containers when label provide "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "RECTANGLE TEXT CONTAINER", "textAlign": "center", "type": "text", @@ -1833,8 +1833,8 @@ exports[`Test Transform > should transform to text containers when label provide "backgroundColor": "transparent", "baseline": 0, "boundElements": null, - "containerId": "id13", - "fillStyle": "hachure", + "containerId": "id14", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -1852,7 +1852,7 @@ exports[`Test Transform > should transform to text containers when label provide "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "ELLIPSE TEXT CONTAINER", "textAlign": "center", @@ -1873,8 +1873,8 @@ exports[`Test Transform > should transform to text containers when label provide "backgroundColor": "transparent", "baseline": 0, "boundElements": null, - "containerId": "id14", - "fillStyle": "hachure", + "containerId": "id15", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -1893,7 +1893,7 @@ TEXT CONTAINER", "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "DIAMOND TEXT CONTAINER", @@ -1915,8 +1915,8 @@ exports[`Test Transform > should transform to text containers when label provide "backgroundColor": "transparent", "baseline": 0, "boundElements": null, - "containerId": "id15", - "fillStyle": "hachure", + "containerId": "id16", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -1934,7 +1934,7 @@ exports[`Test Transform > should transform to text containers when label provide "seed": Any, "strokeColor": "#099268", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "STYLED DIAMOND TEXT CONTAINER", "textAlign": "center", @@ -1955,8 +1955,8 @@ exports[`Test Transform > should transform to text containers when label provide "backgroundColor": "transparent", "baseline": 0, "boundElements": null, - "containerId": "id16", - "fillStyle": "hachure", + "containerId": "id17", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -1974,7 +1974,7 @@ exports[`Test Transform > should transform to text containers when label provide "seed": Any, "strokeColor": "#c2255c", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "TOP LEFT ALIGNED RECTANGLE TEXT CONTAINER", @@ -1996,8 +1996,8 @@ exports[`Test Transform > should transform to text containers when label provide "backgroundColor": "transparent", "baseline": 0, "boundElements": null, - "containerId": "id17", - "fillStyle": "hachure", + "containerId": "id18", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 20, "frameId": null, @@ -2015,7 +2015,7 @@ exports[`Test Transform > should transform to text containers when label provide "seed": Any, "strokeColor": "#c2255c", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "STYLED ELLIPSE TEXT CONTAINER", diff --git a/src/data/blob.ts b/src/data/blob.ts index 922400303..81ce340fe 100644 --- a/src/data/blob.ts +++ b/src/data/blob.ts @@ -8,7 +8,7 @@ import { t } from "../i18n"; import { calculateScrollCenter } from "../scene"; import { AppState, DataURL, LibraryItem } from "../types"; import { ValueOf } from "../utility-types"; -import { bytesToHexString } from "../utils"; +import { bytesToHexString, isPromiseLike } from "../utils"; import { FileSystemHandle, nativeFileSystemSupported } from "./filesystem"; import { isValidExcalidrawData, isValidLibrary } from "./json"; import { restore, restoreLibraryItems } from "./restore"; @@ -207,10 +207,13 @@ export const loadLibraryFromBlob = async ( }; export const canvasToBlob = async ( - canvas: HTMLCanvasElement, + canvas: HTMLCanvasElement | Promise, ): Promise => { - return new Promise((resolve, reject) => { + return new Promise(async (resolve, reject) => { try { + if (isPromiseLike(canvas)) { + canvas = await canvas; + } canvas.toBlob((blob) => { if (!blob) { return reject( @@ -324,6 +327,31 @@ export const SVGStringToFile = (SVGString: string, filename: string = "") => { }) as File & { type: typeof MIME_TYPES.svg }; }; +export const ImageURLToFile = async ( + imageUrl: string, + filename: string = "", +): Promise => { + let response; + try { + response = await fetch(imageUrl); + } catch (error: any) { + throw new Error(t("errors.failedToFetchImage")); + } + + if (!response.ok) { + throw new Error(t("errors.failedToFetchImage")); + } + + const blob = await response.blob(); + + if (blob.type && isSupportedImageFile(blob)) { + const name = filename || blob.name || ""; + return new File([blob], name, { type: blob.type }); + } + + throw new Error(t("errors.unsupportedFileType")); +}; + export const getFileFromEvent = async ( event: React.DragEvent, ) => { diff --git a/src/data/index.ts b/src/data/index.ts index 20ba75ebe..29eedb2a7 100644 --- a/src/data/index.ts +++ b/src/data/index.ts @@ -66,17 +66,14 @@ export const exportCanvas = async ( } } - const tempCanvas = await exportToCanvas(elements, appState, files, { + const tempCanvas = exportToCanvas(elements, appState, files, { exportBackground, viewBackgroundColor, exportPadding, }); - tempCanvas.style.display = "none"; - document.body.appendChild(tempCanvas); if (type === "png") { let blob = await canvasToBlob(tempCanvas); - tempCanvas.remove(); if (appState.exportEmbedScene) { blob = await ( await import(/* webpackChunkName: "image" */ "./image") @@ -114,11 +111,8 @@ export const exportCanvas = async ( } else { throw new Error(t("alerts.couldNotCopyToClipboard")); } - } finally { - tempCanvas.remove(); } } else { - tempCanvas.remove(); // shouldn't happen throw new Error("Unsupported export type"); } diff --git a/src/data/restore.ts b/src/data/restore.ts index 1d2feb1a3..3287e4137 100644 --- a/src/data/restore.ts +++ b/src/data/restore.ts @@ -193,7 +193,7 @@ const restoreElement = ( fontSize = parseFloat(fontPx); fontFamily = getFontFamilyByName(_fontFamily); } - const text = element.text ?? ""; + const text = (typeof element.text === "string" && element.text) || ""; // line-height might not be specified either when creating elements // programmatically, or when importing old diagrams. @@ -222,9 +222,17 @@ const restoreElement = ( baseline, }); + // if empty text, mark as deleted. We keep in array + // for data integrity purposes (collab etc.) + if (!text && !element.isDeleted) { + element = { ...element, originalText: text, isDeleted: true }; + element = bumpVersion(element); + } + if (refreshDimensions) { element = { ...element, ...refreshTextDimensions(element) }; } + return element; case "freedraw": { return restoreElementWithProperties(element, { @@ -299,6 +307,7 @@ const restoreElement = ( // We also don't want to throw, but instead return void so we filter // out these unsupported elements from the restored array. } + return null; }; /** diff --git a/src/data/transform.test.ts b/src/data/transform.test.ts index 03d65beaa..b6abfb377 100644 --- a/src/data/transform.test.ts +++ b/src/data/transform.test.ts @@ -5,7 +5,31 @@ import { } from "./transform"; import { ExcalidrawArrowElement } from "../element/types"; +const opts = { regenerateIds: false }; + describe("Test Transform", () => { + it("should generate id unless opts.regenerateIds is set to false explicitly", () => { + const elements = [ + { + type: "rectangle", + x: 100, + y: 100, + id: "rect-1", + }, + ]; + let data = convertToExcalidrawElements( + elements as ExcalidrawElementSkeleton[], + ); + expect(data.length).toBe(1); + expect(data[0].id).toBe("id0"); + + data = convertToExcalidrawElements( + elements as ExcalidrawElementSkeleton[], + opts, + ); + expect(data[0].id).toBe("rect-1"); + }); + it("should transform regular shapes", () => { const elements = [ { @@ -59,6 +83,7 @@ describe("Test Transform", () => { convertToExcalidrawElements( elements as ExcalidrawElementSkeleton[], + opts, ).forEach((ele) => { expect(ele).toMatchSnapshot({ seed: expect.any(Number), @@ -87,6 +112,7 @@ describe("Test Transform", () => { ]; convertToExcalidrawElements( elements as ExcalidrawElementSkeleton[], + opts, ).forEach((ele) => { expect(ele).toMatchSnapshot({ seed: expect.any(Number), @@ -128,6 +154,7 @@ describe("Test Transform", () => { ]; const excaldrawElements = convertToExcalidrawElements( elements as ExcalidrawElementSkeleton[], + opts, ); expect(excaldrawElements.length).toBe(4); @@ -210,6 +237,7 @@ describe("Test Transform", () => { ]; const excaldrawElements = convertToExcalidrawElements( elements as ExcalidrawElementSkeleton[], + opts, ); expect(excaldrawElements.length).toBe(12); @@ -267,6 +295,7 @@ describe("Test Transform", () => { ]; const excaldrawElements = convertToExcalidrawElements( elements as ExcalidrawElementSkeleton[], + opts, ); expect(excaldrawElements.length).toBe(8); @@ -300,6 +329,7 @@ describe("Test Transform", () => { ]; const excaldrawElements = convertToExcalidrawElements( elements as ExcalidrawElementSkeleton[], + opts, ); expect(excaldrawElements.length).toBe(4); @@ -321,7 +351,7 @@ describe("Test Transform", () => { }); expect(text).toMatchObject({ - x: 340, + x: 240, y: 226.5, type: "text", text: "HELLO WORLD!!", @@ -341,7 +371,7 @@ describe("Test Transform", () => { }); expect(ellipse).toMatchObject({ - x: 555, + x: 355, y: 189, type: "ellipse", boundElements: [ @@ -383,10 +413,10 @@ describe("Test Transform", () => { const excaldrawElements = convertToExcalidrawElements( elements as ExcalidrawElementSkeleton[], + opts, ); expect(excaldrawElements.length).toBe(4); - const [arrow, text1, text2, text3] = excaldrawElements; expect(arrow).toMatchObject({ @@ -406,7 +436,7 @@ describe("Test Transform", () => { }); expect(text1).toMatchObject({ - x: 340, + x: 240, y: 226.5, type: "text", text: "HELLO WORLD!!", @@ -426,7 +456,7 @@ describe("Test Transform", () => { }); expect(text3).toMatchObject({ - x: 555, + x: 355, y: 226.5, type: "text", boundElements: [ @@ -499,6 +529,7 @@ describe("Test Transform", () => { const excaldrawElements = convertToExcalidrawElements( elements as ExcalidrawElementSkeleton[], + opts, ); expect(excaldrawElements.length).toBe(5); @@ -547,6 +578,7 @@ describe("Test Transform", () => { const excaldrawElements = convertToExcalidrawElements( elements as ExcalidrawElementSkeleton[], + opts, ); expect(excaldrawElements.length).toBe(4); @@ -600,17 +632,18 @@ describe("Test Transform", () => { const excaldrawElements = convertToExcalidrawElements( elements as ExcalidrawElementSkeleton[], + opts, ); expect(excaldrawElements.length).toBe(4); - const [, , arrow] = excaldrawElements; + const [, , arrow, text] = excaldrawElements; expect(arrow).toMatchObject({ type: "arrow", x: 255, y: 239, boundElements: [ { - id: "id46", + id: text.id, type: "text", }, ], @@ -650,17 +683,18 @@ describe("Test Transform", () => { ]; const excaldrawElements = convertToExcalidrawElements( elements as ExcalidrawElementSkeleton[], + opts, ); expect(excaldrawElements.length).toBe(2); const [arrow, rect] = excaldrawElements; expect((arrow as ExcalidrawArrowElement).endBinding).toStrictEqual({ elementId: "rect-1", focus: 0, - gap: 5, + gap: 205, }); expect(rect.boundElements).toStrictEqual([ { - id: "id47", + id: arrow.id, type: "arrow", }, ]); @@ -692,6 +726,7 @@ describe("Test Transform", () => { ]; const excaldrawElements = convertToExcalidrawElements( elements as ExcalidrawElementSkeleton[], + opts, ); expect(excaldrawElements.length).toBe(1); diff --git a/src/data/transform.ts b/src/data/transform.ts index bf5411951..a34ea1a66 100644 --- a/src/data/transform.ts +++ b/src/data/transform.ts @@ -39,6 +39,8 @@ import { } from "../element/types"; import { MarkOptional } from "../utility-types"; import { assertNever, getFontString } from "../utils"; +import { getSizeFromPoints } from "../points"; +import { randomId } from "../random"; export type ValidLinearElement = { type: "arrow" | "line"; @@ -159,7 +161,7 @@ export type ExcalidrawElementSkeleton = } & Partial); const DEFAULT_LINEAR_ELEMENT_PROPS = { - width: 300, + width: 100, height: 0, }; @@ -357,6 +359,48 @@ const bindLinearElementToElement = ( ); } } + + // Update start/end points by 0.5 so bindings don't overlap with start/end bound element coordinates. + const endPointIndex = linearElement.points.length - 1; + const delta = 0.5; + const newPoints = JSON.parse(JSON.stringify(linearElement.points)); + // left to right so shift the arrow towards right + if ( + linearElement.points[endPointIndex][0] > + linearElement.points[endPointIndex - 1][0] + ) { + newPoints[0][0] = delta; + newPoints[endPointIndex][0] -= delta; + } + + // right to left so shift the arrow towards left + if ( + linearElement.points[endPointIndex][0] < + linearElement.points[endPointIndex - 1][0] + ) { + newPoints[0][0] = -delta; + newPoints[endPointIndex][0] += delta; + } + // top to bottom so shift the arrow towards top + if ( + linearElement.points[endPointIndex][1] > + linearElement.points[endPointIndex - 1][1] + ) { + newPoints[0][1] = delta; + newPoints[endPointIndex][1] -= delta; + } + + // bottom to top so shift the arrow towards bottom + if ( + linearElement.points[endPointIndex][1] < + linearElement.points[endPointIndex - 1][1] + ) { + newPoints[0][1] = -delta; + newPoints[endPointIndex][1] += delta; + } + + Object.assign(linearElement, { points: newPoints }); + return { linearElement, startBoundElement, @@ -384,18 +428,28 @@ class ElementStore { } export const convertToExcalidrawElements = ( - elements: ExcalidrawElementSkeleton[] | null, + elementsSkeleton: ExcalidrawElementSkeleton[] | null, + opts?: { regenerateIds: boolean }, ) => { - if (!elements) { + if (!elementsSkeleton) { return []; } + const elements: ExcalidrawElementSkeleton[] = JSON.parse( + JSON.stringify(elementsSkeleton), + ); const elementStore = new ElementStore(); const elementsWithIds = new Map(); + const oldToNewElementIdMap = new Map(); // Create individual elements for (const element of elements) { let excalidrawElement: ExcalidrawElement; + const originalId = element.id; + if (opts?.regenerateIds !== false) { + Object.assign(element, { id: randomId() }); + } + switch (element.type) { case "rectangle": case "ellipse": @@ -444,6 +498,11 @@ export const convertToExcalidrawElements = ( ], ...element, }); + + Object.assign( + excalidrawElement, + getSizeFromPoints(excalidrawElement.points), + ); break; } case "text": { @@ -499,6 +558,9 @@ export const convertToExcalidrawElements = ( } else { elementStore.add(excalidrawElement); elementsWithIds.set(excalidrawElement.id, element); + if (originalId) { + oldToNewElementIdMap.set(originalId, excalidrawElement.id); + } } } @@ -524,6 +586,18 @@ export const convertToExcalidrawElements = ( element.type === "arrow" ? element?.start : undefined; const originalEnd = element.type === "arrow" ? element?.end : undefined; + if (originalStart && originalStart.id) { + const newStartId = oldToNewElementIdMap.get(originalStart.id); + if (newStartId) { + Object.assign(originalStart, { id: newStartId }); + } + } + if (originalEnd && originalEnd.id) { + const newEndId = oldToNewElementIdMap.get(originalEnd.id); + if (newEndId) { + Object.assign(originalEnd, { id: newEndId }); + } + } const { linearElement, startBoundElement, endBoundElement } = bindLinearElementToElement( container as ExcalidrawArrowElement, @@ -539,13 +613,23 @@ export const convertToExcalidrawElements = ( } else { switch (element.type) { case "arrow": { + const { start, end } = element; + if (start && start.id) { + const newStartId = oldToNewElementIdMap.get(start.id); + Object.assign(start, { id: newStartId }); + } + if (end && end.id) { + const newEndId = oldToNewElementIdMap.get(end.id); + Object.assign(end, { id: newEndId }); + } const { linearElement, startBoundElement, endBoundElement } = bindLinearElementToElement( excalidrawElement as ExcalidrawArrowElement, - element.start, - element.end, + start, + end, elementStore, ); + elementStore.add(linearElement); elementStore.add(startBoundElement); elementStore.add(endBoundElement); diff --git a/src/element/Hyperlink.tsx b/src/element/Hyperlink.tsx index 720f17824..0e20661c3 100644 --- a/src/element/Hyperlink.tsx +++ b/src/element/Hyperlink.tsx @@ -392,7 +392,7 @@ export const getLinkHandleFromCoords = ( [x1, y1, x2, y2]: Bounds, angle: number, appState: Pick, -): [x: number, y: number, width: number, height: number] => { +): Bounds => { const size = DEFAULT_LINK_SIZE; const linkWidth = size / appState.zoom.value; const linkHeight = size / appState.zoom.value; diff --git a/src/element/bounds.ts b/src/element/bounds.ts index a94e1308d..d0d0feba8 100644 --- a/src/element/bounds.ts +++ b/src/element/bounds.ts @@ -34,7 +34,12 @@ export type RectangleBox = { type MaybeQuadraticSolution = [number | null, number | null] | false; // x and y position of top left corner, x and y position of bottom right corner -export type Bounds = readonly [x1: number, y1: number, x2: number, y2: number]; +export type Bounds = readonly [ + minX: number, + minY: number, + maxX: number, + maxY: number, +]; export class ElementBounds { private static boundsCache = new WeakMap< @@ -63,7 +68,7 @@ export class ElementBounds { } private static calculateBounds(element: ExcalidrawElement): Bounds { - let bounds: [number, number, number, number]; + let bounds: Bounds; const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element); @@ -387,7 +392,7 @@ const getCubicBezierCurveBound = ( export const getMinMaxXYFromCurvePathOps = ( ops: Op[], transformXY?: (x: number, y: number) => [number, number], -): [number, number, number, number] => { +): Bounds => { let currentP: Point = [0, 0]; const { minX, minY, maxX, maxY } = ops.reduce( @@ -435,9 +440,9 @@ export const getMinMaxXYFromCurvePathOps = ( return [minX, minY, maxX, maxY]; }; -const getBoundsFromPoints = ( +export const getBoundsFromPoints = ( points: ExcalidrawFreeDrawElement["points"], -): [number, number, number, number] => { +): Bounds => { let minX = Infinity; let minY = Infinity; let maxX = -Infinity; @@ -589,7 +594,7 @@ const getLinearElementRotatedBounds = ( element: ExcalidrawLinearElement, cx: number, cy: number, -): [number, number, number, number] => { +): Bounds => { if (element.points.length < 2) { const [pointX, pointY] = element.points[0]; const [x, y] = rotate( @@ -600,7 +605,7 @@ const getLinearElementRotatedBounds = ( element.angle, ); - let coords: [number, number, number, number] = [x, y, x, y]; + let coords: Bounds = [x, y, x, y]; const boundTextElement = getBoundTextElement(element); if (boundTextElement) { const coordsWithBoundText = LinearElementEditor.getMinMaxXYWithBoundText( @@ -625,12 +630,7 @@ const getLinearElementRotatedBounds = ( const transformXY = (x: number, y: number) => rotate(element.x + x, element.y + y, cx, cy, element.angle); const res = getMinMaxXYFromCurvePathOps(ops, transformXY); - let coords: [number, number, number, number] = [ - res[0], - res[1], - res[2], - res[3], - ]; + let coords: Bounds = [res[0], res[1], res[2], res[3]]; const boundTextElement = getBoundTextElement(element); if (boundTextElement) { const coordsWithBoundText = LinearElementEditor.getMinMaxXYWithBoundText( @@ -692,7 +692,7 @@ export const getResizedElementAbsoluteCoords = ( nextWidth: number, nextHeight: number, normalizePoints: boolean, -): [number, number, number, number] => { +): Bounds => { if (!(isLinearElement(element) || isFreeDrawElement(element))) { return [ element.x, @@ -709,7 +709,7 @@ export const getResizedElementAbsoluteCoords = ( normalizePoints, ); - let bounds: [number, number, number, number]; + let bounds: Bounds; if (isFreeDrawElement(element)) { // Free Draw @@ -740,7 +740,7 @@ export const getResizedElementAbsoluteCoords = ( export const getElementPointsCoords = ( element: ExcalidrawLinearElement, points: readonly (readonly [number, number])[], -): [number, number, number, number] => { +): Bounds => { // This might be computationally heavey const gen = rough.generator(); const curve = diff --git a/src/element/collision.ts b/src/element/collision.ts index d04f1a0ea..b1fdea606 100644 --- a/src/element/collision.ts +++ b/src/element/collision.ts @@ -494,7 +494,9 @@ const hitTestFreeDrawElement = ( // for filled freedraw shapes, support // selecting from inside if (shape && shape.sets.length) { - return hitTestRoughShape(shape, x, y, threshold); + return element.fillStyle === "solid" + ? hitTestCurveInside(shape, x, y, "round") + : hitTestRoughShape(shape, x, y, threshold); } return false; diff --git a/src/element/dragElements.ts b/src/element/dragElements.ts index 866a56c54..89f30bcbc 100644 --- a/src/element/dragElements.ts +++ b/src/element/dragElements.ts @@ -1,5 +1,5 @@ import { updateBoundElements } from "./binding"; -import { getCommonBounds } from "./bounds"; +import { Bounds, getCommonBounds } from "./bounds"; import { mutateElement } from "./mutateElement"; import { getPerfectElementSize } from "./sizeHelpers"; import { NonDeletedExcalidrawElement } from "./types"; @@ -8,7 +8,11 @@ import { getBoundTextElement } from "./textElement"; import { isSelectedViaGroup } from "../groups"; import { getGridPoint } from "../math"; import Scene from "../scene/Scene"; -import { isFrameElement } from "./typeChecks"; +import { + isArrowElement, + isBoundToContainer, + isFrameElement, +} from "./typeChecks"; export const dragSelectedElements = ( pointerDownState: PointerDownState, @@ -35,44 +39,41 @@ export const dragSelectedElements = ( if (frames.length > 0) { const elementsInFrames = scene .getNonDeletedElements() + .filter((e) => !isBoundToContainer(e)) .filter((e) => e.frameId !== null) .filter((e) => frames.includes(e.frameId!)); elementsInFrames.forEach((element) => elementsToUpdate.add(element)); } + const commonBounds = getCommonBounds( + Array.from(elementsToUpdate).map( + (el) => pointerDownState.originalElements.get(el.id) ?? el, + ), + ); + const adjustedOffset = calculateOffset( + commonBounds, + offset, + snapOffset, + gridSize, + ); + elementsToUpdate.forEach((element) => { - updateElementCoords( - pointerDownState, - element, - offset, - snapOffset, - gridSize, - ); + updateElementCoords(pointerDownState, element, adjustedOffset); // update coords of bound text only if we're dragging the container directly // (we don't drag the group that it's part of) if ( + // Don't update coords of arrow label since we calculate its position during render + !isArrowElement(element) && // container isn't part of any group // (perf optim so we don't check `isSelectedViaGroup()` in every case) - !element.groupIds.length || - // container is part of a group, but we're dragging the container directly - (appState.editingGroupId && !isSelectedViaGroup(appState, element)) + (!element.groupIds.length || + // container is part of a group, but we're dragging the container directly + (appState.editingGroupId && !isSelectedViaGroup(appState, element))) ) { const textElement = getBoundTextElement(element); - if ( - textElement && - // when container is added to a frame, so will its bound text - // so the text is already in `elementsToUpdate` and we should avoid - // updating its coords again - (!textElement.frameId || !frames.includes(textElement.frameId)) - ) { - updateElementCoords( - pointerDownState, - textElement, - offset, - snapOffset, - gridSize, - ); + if (textElement) { + updateElementCoords(pointerDownState, textElement, adjustedOffset); } } updateBoundElements(element, { @@ -81,23 +82,20 @@ export const dragSelectedElements = ( }); }; -const updateElementCoords = ( - pointerDownState: PointerDownState, - element: NonDeletedExcalidrawElement, +const calculateOffset = ( + commonBounds: Bounds, dragOffset: { x: number; y: number }, snapOffset: { x: number; y: number }, gridSize: AppState["gridSize"], -) => { - const originalElement = - pointerDownState.originalElements.get(element.id) ?? element; - - let nextX = originalElement.x + dragOffset.x + snapOffset.x; - let nextY = originalElement.y + dragOffset.y + snapOffset.y; +): { x: number; y: number } => { + const [x, y] = commonBounds; + let nextX = x + dragOffset.x + snapOffset.x; + let nextY = y + dragOffset.y + snapOffset.y; if (snapOffset.x === 0 || snapOffset.y === 0) { const [nextGridX, nextGridY] = getGridPoint( - originalElement.x + dragOffset.x, - originalElement.y + dragOffset.y, + x + dragOffset.x, + y + dragOffset.y, gridSize, ); @@ -109,6 +107,22 @@ const updateElementCoords = ( nextY = nextGridY; } } + return { + x: nextX - x, + y: nextY - y, + }; +}; + +const updateElementCoords = ( + pointerDownState: PointerDownState, + element: NonDeletedExcalidrawElement, + dragOffset: { x: number; y: number }, +) => { + const originalElement = + pointerDownState.originalElements.get(element.id) ?? element; + + const nextX = originalElement.x + dragOffset.x; + const nextY = originalElement.y + dragOffset.y; mutateElement(element, { x: nextX, diff --git a/src/element/embeddable.ts b/src/element/embeddable.ts index 4aa6f0fdc..29aac1bcd 100644 --- a/src/element/embeddable.ts +++ b/src/element/embeddable.ts @@ -28,6 +28,7 @@ const embeddedLinkCache = new Map(); const RE_YOUTUBE = /^(?:http(?:s)?:\/\/)?(?:www\.)?youtu(?:be\.com|\.be)\/(embed\/|watch\?v=|shorts\/|playlist\?list=|embed\/videoseries\?list=)?([a-zA-Z0-9_-]+)(?:\?t=|&t=|\?start=|&start=)?([a-zA-Z0-9_-]+)?[^\s]*$/; + const RE_VIMEO = /^(?:http(?:s)?:\/\/)?(?:(?:w){3}.)?(?:player\.)?vimeo\.com\/(?:video\/)?([^?\s]+)(?:\?.*)?$/; const RE_FIGMA = /^https:\/\/(?:www\.)?figma\.com/; @@ -47,6 +48,9 @@ const RE_VALTOWN = const RE_GENERIC_EMBED = /^<(?:iframe|blockquote)[\s\S]*?\s(?:src|href)=["']([^"']*)["'][\s\S]*?>$/i; +const RE_GIPHY = + /giphy.com\/(?:clips|embed|gifs)\/[a-zA-Z0-9]*?-?([a-zA-Z0-9]+)(?:[^a-zA-Z0-9]|$)/; + const ALLOWED_DOMAINS = new Set([ "youtube.com", "youtu.be", @@ -59,6 +63,7 @@ const ALLOWED_DOMAINS = new Set([ "*.simplepdf.eu", "stackblitz.com", "val.town", + "giphy.com", ]); const createSrcDoc = (body: string) => { @@ -308,6 +313,10 @@ export const extractSrc = (htmlString: string): string => { return gistMatch[1]; } + if (RE_GIPHY.test(htmlString)) { + return `https://giphy.com/embed/${RE_GIPHY.exec(htmlString)![1]}`; + } + const match = htmlString.match(RE_GENERIC_EMBED); if (match && match.length === 2) { return match[1]; diff --git a/src/element/linearElementEditor.ts b/src/element/linearElementEditor.ts index adc5aafc4..9ee490b39 100644 --- a/src/element/linearElementEditor.ts +++ b/src/element/linearElementEditor.ts @@ -21,6 +21,7 @@ import { } from "../math"; import { getElementAbsoluteCoords, getLockedLinearCursorAlignSize } from "."; import { + Bounds, getCurvePathOps, getElementPointsCoords, getMinMaxXYFromCurvePathOps, @@ -1316,7 +1317,7 @@ export class LinearElementEditor { static getMinMaxXYWithBoundText = ( element: ExcalidrawLinearElement, - elementBounds: [number, number, number, number], + elementBounds: Bounds, boundTextElement: ExcalidrawTextElementWithContainer, ): [number, number, number, number, number, number] => { let [x1, y1, x2, y2] = elementBounds; diff --git a/src/element/mutateElement.ts b/src/element/mutateElement.ts index 856965613..e780930bb 100644 --- a/src/element/mutateElement.ts +++ b/src/element/mutateElement.ts @@ -163,8 +163,8 @@ export const newElementWith = ( * * NOTE: does not trigger re-render. */ -export const bumpVersion = ( - element: Mutable, +export const bumpVersion = >( + element: T, version?: ExcalidrawElement["version"], ) => { element.version = (version ?? element.version) + 1; diff --git a/src/element/resizeTest.ts b/src/element/resizeTest.ts index a3447208f..9947a6082 100644 --- a/src/element/resizeTest.ts +++ b/src/element/resizeTest.ts @@ -13,6 +13,7 @@ import { MaybeTransformHandleType, } from "./transformHandles"; import { AppState, Zoom } from "../types"; +import { Bounds } from "./bounds"; const isInsideTransformHandle = ( transformHandle: TransformHandle, @@ -87,7 +88,7 @@ export const getElementWithTransformHandleType = ( }; export const getTransformHandleTypeFromCoords = ( - [x1, y1, x2, y2]: readonly [number, number, number, number], + [x1, y1, x2, y2]: Bounds, scenePointerX: number, scenePointerY: number, zoom: Zoom, diff --git a/src/element/subtypes/mathjax/implementation.tsx b/src/element/subtypes/mathjax/implementation.tsx index a3830bc88..feecc58d3 100644 --- a/src/element/subtypes/mathjax/implementation.tsx +++ b/src/element/subtypes/mathjax/implementation.tsx @@ -1493,6 +1493,7 @@ const createMathActions = () => { : element; return isMathElement(el) && el.customData?.mathOnly; }, + true, null, ); if (mathOnly === null) { @@ -1554,6 +1555,7 @@ const createMathActions = () => { ? getMathProps.ensureMathProps(el.customData).mathOnly : null; }, + true, getMathProps.getMathOnly(appState), ); return ( diff --git a/src/element/textWysiwyg.test.tsx b/src/element/textWysiwyg.test.tsx index 9115d0e59..13906d4ad 100644 --- a/src/element/textWysiwyg.test.tsx +++ b/src/element/textWysiwyg.test.tsx @@ -17,8 +17,8 @@ import { } from "./types"; import { API } from "../tests/helpers/api"; import { mutateElement } from "./mutateElement"; -import { resize } from "../tests/utils"; import { getOriginalContainerHeightFromCache } from "./textWysiwyg"; +import { getTextEditor } from "../tests/queries/dom"; // Unmount ReactDOM from root ReactDOM.unmountComponentAtNode(document.getElementById("root")!); @@ -26,12 +26,6 @@ ReactDOM.unmountComponentAtNode(document.getElementById("root")!); const tab = " "; const mouse = new Pointer("mouse"); -const getTextEditor = () => { - return document.querySelector( - ".excalidraw-textEditorContainer > textarea", - ) as HTMLTextAreaElement; -}; - const updateTextEditor = (editor: HTMLTextAreaElement, value: string) => { fireEvent.change(editor, { target: { value } }); editor.dispatchEvent(new Event("input")); @@ -186,7 +180,7 @@ describe("textWysiwyg", () => { expect(h.state.editingElement?.id).toBe(boundText.id); }); - it("should edit text under cursor when clicked with text tool", () => { + it("should edit text under cursor when clicked with text tool", async () => { const text = API.createElement({ type: "text", text: "ola", @@ -201,14 +195,14 @@ describe("textWysiwyg", () => { mouse.clickAt(text.x + 50, text.y + 50); - const editor = getTextEditor(); + const editor = await getTextEditor(false); expect(editor).not.toBe(null); expect(h.state.editingElement?.id).toBe(text.id); expect(h.elements.length).toBe(1); }); - it("should edit text under cursor when double-clicked with selection tool", () => { + it("should edit text under cursor when double-clicked with selection tool", async () => { const text = API.createElement({ type: "text", text: "ola", @@ -223,12 +217,26 @@ describe("textWysiwyg", () => { mouse.doubleClickAt(text.x + 50, text.y + 50); - const editor = getTextEditor(); + const editor = await getTextEditor(false); expect(editor).not.toBe(null); expect(h.state.editingElement?.id).toBe(text.id); expect(h.elements.length).toBe(1); }); + + // FIXME too flaky. No one knows why. + it.skip("should bump the version of a labeled arrow when the label is updated", async () => { + const arrow = UI.createElement("arrow", { + width: 300, + height: 0, + }); + await UI.editText(arrow, "Hello"); + const { version } = arrow; + + await UI.editText(arrow, "Hello\nworld!"); + + expect(arrow.version).toEqual(version + 1); + }); }); describe("Test container-unbound text", () => { @@ -250,7 +258,7 @@ describe("textWysiwyg", () => { textElement = UI.createElement("text"); mouse.clickOn(textElement); - textarea = getTextEditor(); + textarea = await getTextEditor(true); }); afterAll(() => { @@ -460,7 +468,7 @@ describe("textWysiwyg", () => { UI.clickTool("text"); mouse.clickAt(750, 300); - textarea = getTextEditor(); + textarea = await getTextEditor(true); updateTextEditor( textarea, "Excalidraw is an opensource virtual collaborative whiteboard for sketching hand-drawn like diagrams!", @@ -512,7 +520,7 @@ describe("textWysiwyg", () => { { id: text.id, type: "text" }, ]); mouse.down(); - const editor = getTextEditor(); + const editor = await getTextEditor(true); updateTextEditor(editor, "Hello World!"); @@ -540,7 +548,7 @@ describe("textWysiwyg", () => { ]); expect(text.angle).toBe(rectangle.angle); mouse.down(); - const editor = getTextEditor(); + const editor = await getTextEditor(true); updateTextEditor(editor, "Hello World!"); @@ -567,7 +575,7 @@ describe("textWysiwyg", () => { API.setSelectedElements([diamond]); Keyboard.keyPress(KEYS.ENTER); - const editor = getTextEditor(); + const editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); const value = new Array(1000).fill("1").join("\n"); @@ -602,7 +610,7 @@ describe("textWysiwyg", () => { expect(text.type).toBe("text"); expect(text.containerId).toBe(null); mouse.down(); - let editor = getTextEditor(); + let editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); editor.blur(); @@ -617,7 +625,7 @@ describe("textWysiwyg", () => { expect(text.containerId).toBe(rectangle.id); mouse.down(); - editor = getTextEditor(); + editor = await getTextEditor(true); updateTextEditor(editor, "Hello World!"); await new Promise((r) => setTimeout(r, 0)); @@ -639,7 +647,7 @@ describe("textWysiwyg", () => { const text = h.elements[1] as ExcalidrawTextElementWithContainer; expect(text.type).toBe("text"); expect(text.containerId).toBe(rectangle.id); - const editor = getTextEditor(); + const editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); @@ -674,7 +682,7 @@ describe("textWysiwyg", () => { { id: text.id, type: "text" }, ]); mouse.down(); - const editor = getTextEditor(); + const editor = await getTextEditor(true); updateTextEditor(editor, "Hello World!"); await new Promise((r) => setTimeout(r, 0)); @@ -699,7 +707,7 @@ describe("textWysiwyg", () => { freedraw.y + freedraw.height / 2, ); - const editor = getTextEditor(); + const editor = await getTextEditor(true); updateTextEditor(editor, "Hello World!"); fireEvent.keyDown(editor, { key: KEYS.ESCAPE }); @@ -733,7 +741,7 @@ describe("textWysiwyg", () => { expect(text.type).toBe("text"); expect(text.containerId).toBe(null); mouse.down(); - const editor = getTextEditor(); + const editor = await getTextEditor(true); updateTextEditor(editor, "Hello World!"); @@ -748,7 +756,7 @@ describe("textWysiwyg", () => { UI.clickTool("text"); mouse.clickAt(20, 30); - const editor = getTextEditor(); + const editor = await getTextEditor(true); updateTextEditor( editor, @@ -793,7 +801,7 @@ describe("textWysiwyg", () => { mouse.down(); const text = h.elements[1] as ExcalidrawTextElementWithContainer; - let editor = getTextEditor(); + let editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); updateTextEditor(editor, "Hello World!"); @@ -806,7 +814,7 @@ describe("textWysiwyg", () => { rectangle.y + rectangle.height / 2, ); mouse.down(); - editor = getTextEditor(); + editor = await getTextEditor(true); editor.select(); fireEvent.click(screen.getByTitle(/code/i)); @@ -839,7 +847,7 @@ describe("textWysiwyg", () => { Keyboard.keyDown(KEYS.ENTER); let text = h.elements[1] as ExcalidrawTextElementWithContainer; - let editor = getTextEditor(); + let editor = await getTextEditor(true); updateTextEditor(editor, "Hello World!"); @@ -860,7 +868,7 @@ describe("textWysiwyg", () => { mouse.select(rectangle); Keyboard.keyPress(KEYS.ENTER); - editor = getTextEditor(); + editor = await getTextEditor(true); updateTextEditor(editor, "Hello"); await new Promise((r) => setTimeout(r, 0)); @@ -889,7 +897,7 @@ describe("textWysiwyg", () => { const text = h.elements[1] as ExcalidrawTextElementWithContainer; expect(text.containerId).toBe(rectangle.id); - const editor = getTextEditor(); + const editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); @@ -926,7 +934,7 @@ describe("textWysiwyg", () => { // Bind first text const text = h.elements[1] as ExcalidrawTextElementWithContainer; expect(text.containerId).toBe(rectangle.id); - const editor = getTextEditor(); + const editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); updateTextEditor(editor, "Hello World!"); editor.blur(); @@ -947,13 +955,13 @@ describe("textWysiwyg", () => { it("should respect text alignment when resizing", async () => { Keyboard.keyPress(KEYS.ENTER); - let editor = getTextEditor(); + let editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); updateTextEditor(editor, "Hello"); editor.blur(); // should center align horizontally and vertically by default - resize(rectangle, "ne", [rectangle.x + 100, rectangle.y - 100]); + UI.resize(rectangle, "ne", [rectangle.x + 100, rectangle.y - 100]); expect([h.elements[1].x, h.elements[1].y]).toMatchInlineSnapshot(` [ 85, @@ -964,7 +972,7 @@ describe("textWysiwyg", () => { mouse.select(rectangle); Keyboard.keyPress(KEYS.ENTER); - editor = getTextEditor(); + editor = await getTextEditor(true); editor.select(); @@ -977,7 +985,7 @@ describe("textWysiwyg", () => { editor.blur(); // should left align horizontally and bottom vertically after resize - resize(rectangle, "ne", [rectangle.x + 100, rectangle.y - 100]); + UI.resize(rectangle, "ne", [rectangle.x + 100, rectangle.y - 100]); expect([h.elements[1].x, h.elements[1].y]).toMatchInlineSnapshot(` [ 15, @@ -987,7 +995,7 @@ describe("textWysiwyg", () => { mouse.select(rectangle); Keyboard.keyPress(KEYS.ENTER); - editor = getTextEditor(); + editor = await getTextEditor(true); editor.select(); @@ -999,7 +1007,7 @@ describe("textWysiwyg", () => { editor.blur(); // should right align horizontally and top vertically after resize - resize(rectangle, "ne", [rectangle.x + 100, rectangle.y - 100]); + UI.resize(rectangle, "ne", [rectangle.x + 100, rectangle.y - 100]); expect([h.elements[1].x, h.elements[1].y]).toMatchInlineSnapshot(` [ 374.99999999999994, @@ -1025,7 +1033,7 @@ describe("textWysiwyg", () => { expect(text.type).toBe("text"); expect(text.containerId).toBe(rectangle.id); mouse.down(); - const editor = getTextEditor(); + const editor = await getTextEditor(true); updateTextEditor(editor, "Hello World!"); @@ -1040,7 +1048,7 @@ describe("textWysiwyg", () => { it("should scale font size correctly when resizing using shift", async () => { Keyboard.keyPress(KEYS.ENTER); - const editor = getTextEditor(); + const editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); updateTextEditor(editor, "Hello"); editor.blur(); @@ -1049,7 +1057,7 @@ describe("textWysiwyg", () => { expect(rectangle.height).toBe(75); expect(textElement.fontSize).toBe(20); - resize(rectangle, "ne", [rectangle.x + 100, rectangle.y - 50], { + UI.resize(rectangle, "ne", [rectangle.x + 100, rectangle.y - 50], { shift: true, }); expect(rectangle.width).toBe(200); @@ -1060,7 +1068,7 @@ describe("textWysiwyg", () => { it("should bind text correctly when container duplicated with alt-drag", async () => { Keyboard.keyPress(KEYS.ENTER); - const editor = getTextEditor(); + const editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); updateTextEditor(editor, "Hello"); editor.blur(); @@ -1092,7 +1100,7 @@ describe("textWysiwyg", () => { it("undo should work", async () => { Keyboard.keyPress(KEYS.ENTER); - const editor = getTextEditor(); + const editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); updateTextEditor(editor, "Hello"); editor.blur(); @@ -1129,7 +1137,7 @@ describe("textWysiwyg", () => { it("should not allow bound text with only whitespaces", async () => { Keyboard.keyPress(KEYS.ENTER); - const editor = getTextEditor(); + const editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); updateTextEditor(editor, " "); @@ -1184,19 +1192,19 @@ describe("textWysiwyg", () => { it("should reset the container height cache when resizing", async () => { Keyboard.keyPress(KEYS.ENTER); expect(getOriginalContainerHeightFromCache(rectangle.id)).toBe(75); - let editor = getTextEditor(); + let editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); updateTextEditor(editor, "Hello"); editor.blur(); - resize(rectangle, "ne", [rectangle.x + 100, rectangle.y - 100]); + UI.resize(rectangle, "ne", [rectangle.x + 100, rectangle.y - 100]); expect(rectangle.height).toBeCloseTo(155, 8); expect(getOriginalContainerHeightFromCache(rectangle.id)).toBe(null); mouse.select(rectangle); Keyboard.keyPress(KEYS.ENTER); - editor = getTextEditor(); + editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); editor.blur(); @@ -1212,7 +1220,7 @@ describe("textWysiwyg", () => { Keyboard.keyPress(KEYS.ENTER); expect(getOriginalContainerHeightFromCache(rectangle.id)).toBe(75); - const editor = getTextEditor(); + const editor = await getTextEditor(true); updateTextEditor(editor, "Hello World!"); editor.blur(); @@ -1237,7 +1245,7 @@ describe("textWysiwyg", () => { Keyboard.keyPress(KEYS.ENTER); expect(getOriginalContainerHeightFromCache(rectangle.id)).toBe(75); - const editor = getTextEditor(); + const editor = await getTextEditor(true); updateTextEditor(editor, "Hello World!"); editor.blur(); expect( @@ -1269,12 +1277,12 @@ describe("textWysiwyg", () => { beforeEach(async () => { Keyboard.keyPress(KEYS.ENTER); - editor = getTextEditor(); + editor = await getTextEditor(true); updateTextEditor(editor, "Hello"); editor.blur(); mouse.select(rectangle); Keyboard.keyPress(KEYS.ENTER); - editor = getTextEditor(); + editor = await getTextEditor(true); editor.select(); }); @@ -1385,7 +1393,7 @@ describe("textWysiwyg", () => { it("should wrap text in a container when wrap text in container triggered from context menu", async () => { UI.clickTool("text"); mouse.clickAt(20, 30); - const editor = getTextEditor(); + const editor = await getTextEditor(true); updateTextEditor( editor, @@ -1431,7 +1439,7 @@ describe("textWysiwyg", () => { type: "text", }, ], - fillStyle: "hachure", + fillStyle: "solid", groupIds: [], height: 35, isDeleted: false, @@ -1444,7 +1452,7 @@ describe("textWysiwyg", () => { }, strokeColor: "#1e1e1e", strokeStyle: "solid", - strokeWidth: 1, + strokeWidth: 2, type: "rectangle", updated: 1, version: 1, @@ -1473,7 +1481,7 @@ describe("textWysiwyg", () => { // Bind first text let text = h.elements[1] as ExcalidrawTextElementWithContainer; expect(text.containerId).toBe(rectangle.id); - let editor = getTextEditor(); + let editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); updateTextEditor(editor, "Hello!"); expect( @@ -1498,7 +1506,7 @@ describe("textWysiwyg", () => { rectangle.x + rectangle.width / 2, rectangle.y + rectangle.height / 2, ); - editor = getTextEditor(); + editor = await getTextEditor(true); await new Promise((r) => setTimeout(r, 0)); updateTextEditor(editor, "Excalidraw"); editor.blur(); @@ -1512,30 +1520,4 @@ describe("textWysiwyg", () => { expect(text.text).toBe("Excalidraw"); }); }); - - it("should bump the version of labelled arrow when label updated", async () => { - await render(); - const arrow = UI.createElement("arrow", { - width: 300, - height: 0, - }); - - mouse.select(arrow); - Keyboard.keyPress(KEYS.ENTER); - let editor = getTextEditor(); - await new Promise((r) => setTimeout(r, 0)); - updateTextEditor(editor, "Hello"); - editor.blur(); - - const { version } = arrow; - - mouse.select(arrow); - Keyboard.keyPress(KEYS.ENTER); - editor = getTextEditor(); - await new Promise((r) => setTimeout(r, 0)); - updateTextEditor(editor, "Hello\nworld!"); - editor.blur(); - - expect(arrow.version).toEqual(version + 1); - }); }); diff --git a/src/element/textWysiwyg.tsx b/src/element/textWysiwyg.tsx index bb399d132..6a682ec36 100644 --- a/src/element/textWysiwyg.tsx +++ b/src/element/textWysiwyg.tsx @@ -634,7 +634,7 @@ export const textWysiwyg = ({ window.removeEventListener("pointerdown", onPointerDown); window.removeEventListener("pointerup", bindBlurEvent); window.removeEventListener("blur", handleSubmit); - + window.removeEventListener("beforeunload", handleSubmit); unbindUpdate(); editable.remove(); @@ -751,6 +751,7 @@ export const textWysiwyg = ({ passive: false, capture: true, }); + window.addEventListener("beforeunload", handleSubmit); excalidrawContainer ?.querySelector(".excalidraw-textEditorContainer")! .appendChild(editable); diff --git a/src/element/transformHandles.ts b/src/element/transformHandles.ts index 1d2ccdcae..9ad49c5b0 100644 --- a/src/element/transformHandles.ts +++ b/src/element/transformHandles.ts @@ -4,7 +4,7 @@ import { PointerType, } from "./types"; -import { getElementAbsoluteCoords } from "./bounds"; +import { Bounds, getElementAbsoluteCoords } from "./bounds"; import { rotate } from "../math"; import { InteractiveCanvasAppState, Zoom } from "../types"; import { isTextElement } from "."; @@ -23,7 +23,7 @@ export type TransformHandleDirection = export type TransformHandleType = TransformHandleDirection | "rotation"; -export type TransformHandle = [number, number, number, number]; +export type TransformHandle = Bounds; export type TransformHandles = Partial<{ [T in TransformHandleType]: TransformHandle; }>; diff --git a/src/emitter.ts b/src/emitter.ts new file mode 100644 index 000000000..5b1cdd0a7 --- /dev/null +++ b/src/emitter.ts @@ -0,0 +1,47 @@ +type Subscriber = (...payload: T) => void; + +export class Emitter { + public subscribers: Subscriber[] = []; + public value: T | undefined; + private updateOnChangeOnly: boolean; + + constructor(opts?: { initialState?: T; updateOnChangeOnly?: boolean }) { + this.updateOnChangeOnly = opts?.updateOnChangeOnly ?? false; + this.value = opts?.initialState; + } + + /** + * Attaches subscriber + * + * @returns unsubscribe function + */ + on(...handlers: Subscriber[] | Subscriber[][]) { + const _handlers = handlers + .flat() + .filter((item) => typeof item === "function"); + + this.subscribers.push(..._handlers); + + return () => this.off(_handlers); + } + + off(...handlers: Subscriber[] | Subscriber[][]) { + const _handlers = handlers.flat(); + this.subscribers = this.subscribers.filter( + (handler) => !_handlers.includes(handler), + ); + } + + trigger(...payload: T): any[] { + if (this.updateOnChangeOnly && this.value === payload) { + return []; + } + this.value = payload; + return this.subscribers.map((handler) => handler(...payload)); + } + + destroy() { + this.subscribers = []; + this.value = undefined; + } +} diff --git a/src/frame.test.tsx b/src/frame.test.tsx index 75c515d9a..1e882d8d1 100644 --- a/src/frame.test.tsx +++ b/src/frame.test.tsx @@ -123,7 +123,7 @@ describe("adding elements to frames", () => { const commonTestCases = async ( func: typeof resizeFrameOverElement | typeof dragElementIntoFrame, ) => { - describe("when frame is in a layer below", async () => { + describe.skip("when frame is in a layer below", async () => { it("should add an element", async () => { h.elements = [frame, rect2]; @@ -167,7 +167,7 @@ describe("adding elements to frames", () => { }); }); - describe("when frame is in a layer above", async () => { + describe.skip("when frame is in a layer above", async () => { it("should add an element", async () => { h.elements = [rect2, frame]; @@ -177,7 +177,7 @@ describe("adding elements to frames", () => { expectEqualIds([rect2, frame]); }); - it.skip("should add elements", async () => { + it("should add elements", async () => { h.elements = [rect2, rect3, frame]; func(frame, rect2); @@ -188,7 +188,7 @@ describe("adding elements to frames", () => { expectEqualIds([rect3, rect2, frame]); }); - it.skip("should add elements when there are other other elements in between", async () => { + it("should add elements when there are other other elements in between", async () => { h.elements = [rect1, rect2, rect4, rect3, frame]; func(frame, rect2); @@ -199,7 +199,7 @@ describe("adding elements to frames", () => { expectEqualIds([rect1, rect4, rect3, rect2, frame]); }); - it.skip("should add elements when there are other elements in between and the order is reversed", async () => { + it("should add elements when there are other elements in between and the order is reversed", async () => { h.elements = [rect3, rect4, rect2, rect1, frame]; func(frame, rect2); @@ -212,7 +212,7 @@ describe("adding elements to frames", () => { }); describe("when frame is in an inner layer", async () => { - it("should add elements", async () => { + it.skip("should add elements", async () => { h.elements = [rect2, frame, rect3]; func(frame, rect2); @@ -223,7 +223,7 @@ describe("adding elements to frames", () => { expectEqualIds([rect2, rect3, frame]); }); - it("should add elements when there are other other elements in between", async () => { + it.skip("should add elements when there are other other elements in between", async () => { h.elements = [rect2, rect1, frame, rect4, rect3]; func(frame, rect2); @@ -289,7 +289,7 @@ describe("adding elements to frames", () => { describe("resizing frame over elements", async () => { await commonTestCases(resizeFrameOverElement); - it("resizing over text containers and labelled arrows", async () => { + it.skip("resizing over text containers and labelled arrows", async () => { await resizingTest( "rectangle", ["frame", "rectangle", "text"], @@ -339,7 +339,7 @@ describe("adding elements to frames", () => { // ); }); - it("should add arrow bound with text when frame is in a layer below", async () => { + it.skip("should add arrow bound with text when frame is in a layer below", async () => { h.elements = [frame, arrow, text]; resizeFrameOverElement(frame, arrow); @@ -359,7 +359,7 @@ describe("adding elements to frames", () => { expectEqualIds([arrow, text, frame]); }); - it("should add arrow bound with text when frame is in an inner layer", async () => { + it.skip("should add arrow bound with text when frame is in an inner layer", async () => { h.elements = [arrow, frame, text]; resizeFrameOverElement(frame, arrow); @@ -371,7 +371,7 @@ describe("adding elements to frames", () => { }); describe("resizing frame over elements but downwards", async () => { - it("should add elements when frame is in a layer below", async () => { + it.skip("should add elements when frame is in a layer below", async () => { h.elements = [frame, rect1, rect2, rect3, rect4]; resizeFrameOverElement(frame, rect4); @@ -382,7 +382,7 @@ describe("adding elements to frames", () => { expectEqualIds([rect2, rect3, frame, rect4, rect1]); }); - it("should add elements when frame is in a layer above", async () => { + it.skip("should add elements when frame is in a layer above", async () => { h.elements = [rect1, rect2, rect3, rect4, frame]; resizeFrameOverElement(frame, rect4); @@ -393,7 +393,7 @@ describe("adding elements to frames", () => { expectEqualIds([rect1, rect2, rect3, frame, rect4]); }); - it("should add elements when frame is in an inner layer", async () => { + it.skip("should add elements when frame is in an inner layer", async () => { h.elements = [rect1, rect2, frame, rect3, rect4]; resizeFrameOverElement(frame, rect4); @@ -408,7 +408,7 @@ describe("adding elements to frames", () => { describe("dragging elements into the frame", async () => { await commonTestCases(dragElementIntoFrame); - it("should drag element inside, duplicate it and keep it in frame", () => { + it.skip("should drag element inside, duplicate it and keep it in frame", () => { h.elements = [frame, rect2]; dragElementIntoFrame(frame, rect2); @@ -422,7 +422,7 @@ describe("adding elements to frames", () => { expectEqualIds([rect2_copy, rect2, frame]); }); - it("should drag element inside, duplicate it and remove it from frame", () => { + it.skip("should drag element inside, duplicate it and remove it from frame", () => { h.elements = [frame, rect2]; dragElementIntoFrame(frame, rect2); @@ -436,5 +436,121 @@ describe("adding elements to frames", () => { expect(rect2.frameId).toBe(null); expectEqualIds([rect2_copy, frame, rect2]); }); + + it("random order 01", () => { + const frame1 = API.createElement({ + type: "frame", + x: 0, + y: 0, + width: 100, + height: 100, + }); + const frame2 = API.createElement({ + type: "frame", + x: 200, + y: 0, + width: 100, + height: 100, + }); + const frame3 = API.createElement({ + type: "frame", + x: 300, + y: 0, + width: 100, + height: 100, + }); + + const rectangle1 = API.createElement({ + type: "rectangle", + x: 25, + y: 25, + width: 50, + height: 50, + frameId: frame1.id, + }); + const rectangle2 = API.createElement({ + type: "rectangle", + x: 225, + y: 25, + width: 50, + height: 50, + frameId: frame2.id, + }); + const rectangle3 = API.createElement({ + type: "rectangle", + x: 325, + y: 25, + width: 50, + height: 50, + frameId: frame3.id, + }); + const rectangle4 = API.createElement({ + type: "rectangle", + x: 350, + y: 25, + width: 50, + height: 50, + frameId: frame3.id, + }); + + h.elements = [ + frame1, + rectangle4, + rectangle1, + rectangle3, + frame3, + rectangle2, + frame2, + ]; + + API.setSelectedElements([rectangle2]); + + const origSize = h.elements.length; + + expect(h.elements.length).toBe(origSize); + dragElementIntoFrame(frame3, rectangle2); + expect(h.elements.length).toBe(origSize); + }); + + it("random order 02", () => { + const frame1 = API.createElement({ + type: "frame", + x: 0, + y: 0, + width: 100, + height: 100, + }); + const frame2 = API.createElement({ + type: "frame", + x: 200, + y: 0, + width: 100, + height: 100, + }); + const rectangle1 = API.createElement({ + type: "rectangle", + x: 25, + y: 25, + width: 50, + height: 50, + frameId: frame1.id, + }); + const rectangle2 = API.createElement({ + type: "rectangle", + x: 225, + y: 25, + width: 50, + height: 50, + frameId: frame2.id, + }); + + h.elements = [rectangle1, rectangle2, frame1, frame2]; + + API.setSelectedElements([rectangle2]); + + expect(h.elements.length).toBe(4); + dragElementIntoFrame(frame2, rectangle1); + expect(h.elements.length).toBe(4); + }); }); }); diff --git a/src/frame.ts b/src/frame.ts index 1da9cfa10..0e7bc93a0 100644 --- a/src/frame.ts +++ b/src/frame.ts @@ -19,10 +19,10 @@ import { mutateElement } from "./element/mutateElement"; import { AppClassProperties, AppState, StaticCanvasAppState } from "./types"; import { getElementsWithinSelection, getSelectedElements } from "./scene"; import { isFrameElement } from "./element"; -import { moveOneRight } from "./zindex"; import { getElementsInGroup, selectGroupsFromGivenElements } from "./groups"; import Scene, { ExcalidrawElementsIncludingDeleted } from "./scene/Scene"; import { getElementLineSegments } from "./element/bounds"; +import { doLineSegmentsIntersect } from "./packages/utils"; // --------------------------- Frame State ------------------------------------ export const bindElementsToFramesAfterDuplication = ( @@ -56,130 +56,21 @@ export const bindElementsToFramesAfterDuplication = ( } }; -// --------------------------- Frame Geometry --------------------------------- -class Point { - x: number; - y: number; +export function isElementIntersectingFrame( + element: ExcalidrawElement, + frame: ExcalidrawFrameElement, +) { + const frameLineSegments = getElementLineSegments(frame); - constructor(x: number, y: number) { - this.x = x; - this.y = y; - } -} + const elementLineSegments = getElementLineSegments(element); -class LineSegment { - first: Point; - second: Point; + const intersecting = frameLineSegments.some((frameLineSegment) => + elementLineSegments.some((elementLineSegment) => + doLineSegmentsIntersect(frameLineSegment, elementLineSegment), + ), + ); - constructor(pointA: Point, pointB: Point) { - this.first = pointA; - this.second = pointB; - } - - public getBoundingBox(): [Point, Point] { - return [ - new Point( - Math.min(this.first.x, this.second.x), - Math.min(this.first.y, this.second.y), - ), - new Point( - Math.max(this.first.x, this.second.x), - Math.max(this.first.y, this.second.y), - ), - ]; - } -} - -// https://martin-thoma.com/how-to-check-if-two-line-segments-intersect/ -class FrameGeometry { - private static EPSILON = 0.000001; - - private static crossProduct(a: Point, b: Point) { - return a.x * b.y - b.x * a.y; - } - - private static doBoundingBoxesIntersect( - a: [Point, Point], - b: [Point, Point], - ) { - return ( - a[0].x <= b[1].x && - a[1].x >= b[0].x && - a[0].y <= b[1].y && - a[1].y >= b[0].y - ); - } - - private static isPointOnLine(a: LineSegment, b: Point) { - const aTmp = new LineSegment( - new Point(0, 0), - new Point(a.second.x - a.first.x, a.second.y - a.first.y), - ); - const bTmp = new Point(b.x - a.first.x, b.y - a.first.y); - const r = this.crossProduct(aTmp.second, bTmp); - return Math.abs(r) < this.EPSILON; - } - - private static isPointRightOfLine(a: LineSegment, b: Point) { - const aTmp = new LineSegment( - new Point(0, 0), - new Point(a.second.x - a.first.x, a.second.y - a.first.y), - ); - const bTmp = new Point(b.x - a.first.x, b.y - a.first.y); - return this.crossProduct(aTmp.second, bTmp) < 0; - } - - private static lineSegmentTouchesOrCrossesLine( - a: LineSegment, - b: LineSegment, - ) { - return ( - this.isPointOnLine(a, b.first) || - this.isPointOnLine(a, b.second) || - (this.isPointRightOfLine(a, b.first) - ? !this.isPointRightOfLine(a, b.second) - : this.isPointRightOfLine(a, b.second)) - ); - } - - private static doLineSegmentsIntersect( - a: [readonly [number, number], readonly [number, number]], - b: [readonly [number, number], readonly [number, number]], - ) { - const aSegment = new LineSegment( - new Point(a[0][0], a[0][1]), - new Point(a[1][0], a[1][1]), - ); - const bSegment = new LineSegment( - new Point(b[0][0], b[0][1]), - new Point(b[1][0], b[1][1]), - ); - - const box1 = aSegment.getBoundingBox(); - const box2 = bSegment.getBoundingBox(); - return ( - this.doBoundingBoxesIntersect(box1, box2) && - this.lineSegmentTouchesOrCrossesLine(aSegment, bSegment) && - this.lineSegmentTouchesOrCrossesLine(bSegment, aSegment) - ); - } - - public static isElementIntersectingFrame( - element: ExcalidrawElement, - frame: ExcalidrawFrameElement, - ) { - const frameLineSegments = getElementLineSegments(frame); - - const elementLineSegments = getElementLineSegments(element); - - const intersecting = frameLineSegments.some((frameLineSegment) => - elementLineSegments.some((elementLineSegment) => - this.doLineSegmentsIntersect(frameLineSegment, elementLineSegment), - ), - ); - - return intersecting; - } + return intersecting; } export const getElementsCompletelyInFrame = ( @@ -207,10 +98,7 @@ export const isElementContainingFrame = ( export const getElementsIntersectingFrame = ( elements: readonly ExcalidrawElement[], frame: ExcalidrawFrameElement, -) => - elements.filter((element) => - FrameGeometry.isElementIntersectingFrame(element, frame), - ); +) => elements.filter((element) => isElementIntersectingFrame(element, frame)); export const elementsAreInFrameBounds = ( elements: readonly ExcalidrawElement[], @@ -236,7 +124,7 @@ export const elementOverlapsWithFrame = ( ) => { return ( elementsAreInFrameBounds([element], frame) || - FrameGeometry.isElementIntersectingFrame(element, frame) || + isElementIntersectingFrame(element, frame) || isElementContainingFrame([frame], element, frame) ); }; @@ -273,7 +161,7 @@ export const groupsAreAtLeastIntersectingTheFrame = ( return !!elementsInGroup.find( (element) => elementsAreInFrameBounds([element], frame) || - FrameGeometry.isElementIntersectingFrame(element, frame), + isElementIntersectingFrame(element, frame), ); }; @@ -294,7 +182,7 @@ export const groupsAreCompletelyOutOfFrame = ( elementsInGroup.find( (element) => elementsAreInFrameBounds([element], frame) || - FrameGeometry.isElementIntersectingFrame(element, frame), + isElementIntersectingFrame(element, frame), ) === undefined ); }; @@ -354,7 +242,7 @@ export const getElementsInResizingFrame = ( ); for (const element of elementsNotCompletelyInFrame) { - if (!FrameGeometry.isElementIntersectingFrame(element, frame)) { + if (!isElementIntersectingFrame(element, frame)) { if (element.groupIds.length === 0) { nextElementsInFrame.delete(element); } @@ -452,21 +340,27 @@ export const getContainingFrame = ( }; // --------------------------- Frame Operations ------------------------------- + +/** + * Retains (or repairs for target frame) the ordering invriant where children + * elements come right before the parent frame: + * [el, el, child, child, frame, el] + */ export const addElementsToFrame = ( allElements: ExcalidrawElementsIncludingDeleted, elementsToAdd: NonDeletedExcalidrawElement[], frame: ExcalidrawFrameElement, ) => { - const currTargetFrameChildrenMap = new Map( - allElements.reduce( - (acc: [ExcalidrawElement["id"], ExcalidrawElement][], element) => { - if (element.frameId === frame.id) { - acc.push([element.id, element]); - } - return acc; - }, - [], - ), + const { currTargetFrameChildrenMap } = allElements.reduce( + (acc, element, index) => { + if (element.frameId === frame.id) { + acc.currTargetFrameChildrenMap.set(element.id, true); + } + return acc; + }, + { + currTargetFrameChildrenMap: new Map(), + }, ); const suppliedElementsToAddSet = new Set(elementsToAdd.map((el) => el.id)); @@ -493,42 +387,6 @@ export const addElementsToFrame = ( } } - const finalElementsToAddSet = new Set(finalElementsToAdd.map((el) => el.id)); - - const nextElements: ExcalidrawElement[] = []; - - const processedElements = new Set(); - - for (const element of allElements) { - if (processedElements.has(element.id)) { - continue; - } - - processedElements.add(element.id); - - if ( - finalElementsToAddSet.has(element.id) || - (element.frameId && element.frameId === frame.id) - ) { - // will be added in bulk once we process target frame - continue; - } - - // target frame - if (element.id === frame.id) { - const currFrameChildren = getFrameElements(allElements, frame.id); - currFrameChildren.forEach((child) => { - processedElements.add(child.id); - }); - // console.log(currFrameChildren, finalElementsToAdd, element); - nextElements.push(...currFrameChildren, ...finalElementsToAdd, element); - continue; - } - - // console.log("(2)", element.frameId); - nextElements.push(element); - } - for (const element of finalElementsToAdd) { mutateElement( element, @@ -538,8 +396,7 @@ export const addElementsToFrame = ( false, ); } - - return nextElements; + return allElements.slice(); }; export const removeElementsFromFrame = ( @@ -547,20 +404,34 @@ export const removeElementsFromFrame = ( elementsToRemove: NonDeletedExcalidrawElement[], appState: AppState, ) => { - const _elementsToRemove: ExcalidrawElement[] = []; + const _elementsToRemove = new Map< + ExcalidrawElement["id"], + ExcalidrawElement + >(); + + const toRemoveElementsByFrame = new Map< + ExcalidrawFrameElement["id"], + ExcalidrawElement[] + >(); for (const element of elementsToRemove) { if (element.frameId) { - _elementsToRemove.push(element); + _elementsToRemove.set(element.id, element); + + const arr = toRemoveElementsByFrame.get(element.frameId) || []; + arr.push(element); const boundTextElement = getBoundTextElement(element); if (boundTextElement) { - _elementsToRemove.push(boundTextElement); + _elementsToRemove.set(boundTextElement.id, boundTextElement); + arr.push(boundTextElement); } + + toRemoveElementsByFrame.set(element.frameId, arr); } } - for (const element of _elementsToRemove) { + for (const [, element] of _elementsToRemove) { mutateElement( element, { @@ -570,13 +441,7 @@ export const removeElementsFromFrame = ( ); } - const nextElements = moveOneRight( - allElements, - appState, - Array.from(_elementsToRemove), - ); - - return nextElements; + return allElements.slice(); }; export const removeAllElementsFromFrame = ( diff --git a/src/locales/ar-SA.json b/src/locales/ar-SA.json index 6d94f0ad2..18742875f 100644 --- a/src/locales/ar-SA.json +++ b/src/locales/ar-SA.json @@ -50,7 +50,7 @@ "veryLarge": "كبير جدا", "solid": "كامل", "hachure": "خطوط", - "zigzag": "", + "zigzag": "متعرج", "crossHatch": "خطوط متقطعة", "thin": "نحيف", "bold": "داكن", @@ -106,11 +106,15 @@ "increaseFontSize": "تكبير حجم الخط", "unbindText": "فك ربط النص", "bindText": "ربط النص بالحاوية", - "createContainerFromText": "", + "createContainerFromText": "نص مغلف في حاوية", "link": { "edit": "تعديل الرابط", + "editEmbed": "تحرير الرابط وإدراجه", "create": "إنشاء رابط", - "label": "رابط" + "createEmbed": "إنشاء رابط و إدراجه", + "label": "رابط", + "labelEmbed": "رابط و إدراج", + "empty": "لم يتم تعيين رابط" }, "lineEditor": { "edit": "تحرير السطر", @@ -124,9 +128,9 @@ }, "statusPublished": "نُشر", "sidebarLock": "إبقاء الشريط الجانبي مفتوح", - "selectAllElementsInFrame": "", - "removeAllElementsFromFrame": "", - "eyeDropper": "" + "selectAllElementsInFrame": "تحديد جميع العناصر في الإطار", + "removeAllElementsFromFrame": "إزالة جميع العناصر من الإطار", + "eyeDropper": "اختيار اللون من القماش" }, "library": { "noItems": "لا توجد عناصر أضيفت بعد...", @@ -160,13 +164,16 @@ "darkMode": "الوضع المظلم", "lightMode": "الوضع المضيء", "zenMode": "وضع التأمل", + "objectsSnapMode": "التقط إلى العناصر", "exitZenMode": "إلغاء الوضع الليلى", "cancel": "إلغاء", "clear": "مسح", "remove": "إزالة", + "embed": "تبديل الإدراج", "publishLibrary": "انشر", "submit": "أرسل", - "confirm": "تأكيد" + "confirm": "تأكيد", + "embeddableInteractionButton": "اضغط للتفاعل" }, "alerts": { "clearReset": "هذا سيُزيل كامل اللوحة. هل أنت متأكد؟", @@ -189,23 +196,28 @@ "resetLibrary": "هذا سوف يمسح مكتبتك. هل أنت متأكد؟", "removeItemsFromsLibrary": "حذف {{count}} عنصر (عناصر) من المكتبة؟", "invalidEncryptionKey": "مفتاح التشفير يجب أن يكون من 22 حرفاً. التعاون المباشر معطل.", - "collabOfflineWarning": "" + "collabOfflineWarning": "لا يوجد اتصال بالانترنت.\nلن يتم حفظ التغييرات التي قمت بها!" }, "errors": { "unsupportedFileType": "نوع الملف غير مدعوم.", "imageInsertError": "تعذر إدراج الصورة. حاول مرة أخرى لاحقاً...", "fileTooBig": "الملف كبير جداً. الحد الأقصى المسموح به للحجم هو {{maxSize}}.", "svgImageInsertError": "تعذر إدراج صورة SVG. يبدو أن ترميز SVG غير صحيح.", + "failedToFetchImage": "", "invalidSVGString": "SVG غير صالح.", "cannotResolveCollabServer": "تعذر الاتصال بخادم التعاون. الرجاء إعادة تحميل الصفحة والمحاولة مرة أخرى.", "importLibraryError": "تعذر تحميل المكتبة", "collabSaveFailed": "تعذر الحفظ في قاعدة البيانات. إذا استمرت المشاكل، يفضل أن تحفظ ملفك محليا كي لا تفقد عملك.", "collabSaveFailed_sizeExceeded": "تعذر الحفظ في قاعدة البيانات، يبدو أن القماش كبير للغاية، يفضّل حفظ الملف محليا كي لا تفقد عملك.", "brave_measure_text_error": { - "line1": "", - "line2": "", - "line3": "", - "line4": "" + "line1": "يبدو أنك تستخدم متصفح Brave مع إعداد حظر صارم لتتبع البصمة.", + "line2": "قد يؤدي هذا إلى كسر عناصر النص في الرسومات الخاصة بك.", + "line3": "من المستحسن إلغاء تفعيل هذا الإعداد. يمكنك اتباع هذه الخطوات لفعل ذلك.", + "line4": "إذا لم يصلح تعطيل هذا الإعداد طريقة عرض النصوص، الرجاء كتابة بلاغ على حسابنا في GitHub، أو راسلنا على Discord" + }, + "libraryElementTypeError": { + "embeddable": "لا يمكن إضافة العناصر القابلة للتضمين في المكتبة.", + "image": "سوف يتم دعم إضافة صور إلى المكتبة قريباً!" } }, "toolBar": { @@ -223,9 +235,11 @@ "penMode": "وضع القلم - امنع اللمس", "link": "إضافة/تحديث الرابط للشكل المحدد", "eraser": "ممحاة", - "frame": "", - "hand": "", - "extraTools": "" + "frame": "أداة الإطار", + "embeddable": "تضمين ويب", + "laser": "مؤشر ليزر", + "hand": "يد (أداة الإزاحة)", + "extraTools": "المزيد من أﻷدوات" }, "headings": { "canvasActions": "إجراءات اللوحة", @@ -237,6 +251,7 @@ "linearElement": "انقر لبدء نقاط متعددة، اسحب لخط واحد", "freeDraw": "انقر واسحب، افرج عند الانتهاء", "text": "نصيحة: يمكنك أيضًا إضافة نص بالنقر المزدوج في أي مكان بأداة الاختيار", + "embeddable": "اضغط مع السحب لإنشاء موقع ويب مضمّن", "text_selected": "انقر نقراً مزدوجاً أو اضغط ادخال لتعديل النص", "text_editing": "اضغط على Esc أو (Ctrl أو Cmd) + Enter لإنهاء التعديل", "linearElementMulti": "انقر فوق النقطة الأخيرة أو اضغط على Esc أو Enter للإنهاء", @@ -245,14 +260,15 @@ "resizeImage": "يمكنك تغيير الحجم بحرية بالضغط بأستمرار على SHIFT،\nاضغط بأستمرار على ALT أيضا لتغيير الحجم من المركز", "rotate": "يمكنك تقييد الزوايا من خلال الضغط على SHIFT أثناء الدوران", "lineEditor_info": "اضغط على مفتاح (Ctrl أو Cmd) و انقر بشكل مزدوج، أو اضغط على مفتاحي (Ctrl أو Cmd) و (Enter) لتعديل النقاط", - "lineEditor_pointSelected": "", - "lineEditor_nothingSelected": "", - "placeImage": "", + "lineEditor_pointSelected": "اضغط على حذف لإزالة النقطة (النِّقَاط)، Ctrl/Cmd+D للتكرار، أو اسحب للانتقال", + "lineEditor_nothingSelected": "اختر نقطة لتعديلها (اضغط على SHIFT لتحديد عدة نِقَاط),\nأو اضغط على ALT و انقر بالفأرة لإضافة نِقَاط جديدة", + "placeImage": "انقر لوضع الصورة، أو انقر واسحب لتعيين حجمها يدوياً", "publishLibrary": "نشر مكتبتك", - "bindTextToElement": "", - "deepBoxSelect": "", - "eraserRevert": "", - "firefox_clipboard_write": "" + "bindTextToElement": "اضغط على إدخال لإضافة نص", + "deepBoxSelect": "اضغط على Ctrl\\Cmd للاختيار العميق، ولمنع السحب", + "eraserRevert": "اضغط على Alt لاستعادة العناصر المعلَّمة للحذف", + "firefox_clipboard_write": "يمكن على الأرجح تمكين هذه الميزة عن طريق تعيين علم \"dom.events.asyncClipboard.clipboardItem\" إلى \"true\". لتغيير أعلام المتصفح في Firefox، قم بزيارة صفحة \"about:config\".", + "disableSnapping": "اضغط على Ctrl أو Cmd لتعطيل الالتقاط" }, "canvasError": { "cannotShowPreview": "تعذر عرض المعاينة", @@ -260,11 +276,11 @@ "canvasTooBigTip": "نصيحة: حاول تحريك العناصر البعيدة بشكل أقرب قليلاً." }, "errorSplash": { - "headingMain": "", + "headingMain": "حدث خطأ. حاول .", "clearCanvasMessage": "إذا لم تعمل إعادة التحميل، حاول مرة أخرى ", "clearCanvasCaveat": " هذا سيؤدي إلى فقدان العمل ", - "trackedToSentry": "", - "openIssueMessage": "", + "trackedToSentry": "تم تتبع الخطأ في المعرف {{eventId}} على نظامنا.", + "openIssueMessage": "حرصنا على عدم إضافة معلومات المشهد في بلاغ الخطأ. في حال كون مشهدك لا يحمل أي معلومات خاصة نرجو المتابعة على . نرجو إضافة المعلومات أدناه بنسخها ولصقها في محتوى البلاغ على GitHub.", "sceneContent": "محتوى المشهد:" }, "roomDialog": { @@ -294,16 +310,16 @@ "helpDialog": { "blog": "اقرأ مدونتنا", "click": "انقر", - "deepSelect": "", - "deepBoxSelect": "", + "deepSelect": "تحديد عميق", + "deepBoxSelect": "تحديد عميق داخل المربع، ومنع السحب", "curvedArrow": "سهم مائل", "curvedLine": "خط مائل", "documentation": "دليل الاستخدام", "doubleClick": "انقر مرتين", "drag": "اسحب", "editor": "المحرر", - "editLineArrowPoints": "", - "editText": "", + "editLineArrowPoints": "تحرير سطر/نقاط سهم", + "editText": "تعديل النص / إضافة تسمية", "github": "عثرت على مشكلة؟ إرسال", "howto": "اتبع التعليمات", "or": "أو", @@ -316,9 +332,9 @@ "view": "عرض", "zoomToFit": "تكبير للملائمة", "zoomToSelection": "تكبير للعنصر المحدد", - "toggleElementLock": "", - "movePageUpDown": "", - "movePageLeftRight": "" + "toggleElementLock": "إغلاق/فتح المحدد", + "movePageUpDown": "نقل الصفحة أعلى/أسفل", + "movePageLeftRight": "نقل الصفحة يسار/يمين" }, "clearCanvasDialog": { "title": "مسح اللوحة" @@ -336,20 +352,20 @@ "authorName": "اسمك أو اسم المستخدم", "libraryName": "اسم مكتبتك", "libraryDesc": "وصف مكتبتك لمساعدة الناس على فهم استخدامها", - "githubHandle": "", - "twitterHandle": "", - "website": "" + "githubHandle": "معالج GitHub (اختياري)، حتى تتمكن من تحرير المكتبة عند إرسالها للمراجعة", + "twitterHandle": "اسم مستخدم تويتر (اختياري)، حتى نعرف من الذي سيتم الإشارة إليه عند الترويج عبر تويتر", + "website": "رابط إلى موقعك الشخصي أو في مكان آخر (اختياري)" }, "errors": { "required": "مطلوب", "website": "أدخل عنوان URL صالح" }, - "noteDescription": "", - "noteGuidelines": "", - "noteLicense": "", + "noteDescription": "تقديم مكتبتك لتضمينها في مستودع المكتبة العامة لأشخاص آخرين لاستخدامها في رسومهم.", + "noteGuidelines": "تحتاج المكتبة إلى الموافقة أولا. يرجى قراءة المعايير قبل تقديمها. سوف تحتاج إلى حساب GitHub للتواصل وإجراء التغييرات عند الطلب، ولكن ليس مطلوبا بشكل صارم.", + "noteLicense": "تقديمك يعني موافقتك على نشر المكتبة المقدمة تحت MIT ترخيص، ما يعني أن لأي أحد الحق في استخدامها دون قيود.", "noteItems": "يجب أن يكون لكل عنصر مكتبة اسمه الخاص حتى يكون قابلاً للتصفية. سيتم تضمين عناصر المكتبة التالية:", "atleastOneLibItem": "يرجى تحديد عنصر مكتبة واحد على الأقل للبدء", - "republishWarning": "" + "republishWarning": "ملاحظة: بعض العناصر المحددة معينة على أنه نشرها أو تقديمها من قبل. يجب عليك فقط إعادة إرسال العناصر عند تحديث مكتبة موجودة أو إرسالها." }, "publishSuccessDialog": { "title": "تم إرسال المكتبة", @@ -360,27 +376,27 @@ "removeItemsFromLib": "إزالة العناصر المحددة من المكتبة" }, "imageExportDialog": { - "header": "", + "header": "تصدير الصورة", "label": { - "withBackground": "", - "onlySelected": "", - "darkMode": "", - "embedScene": "", - "scale": "", - "padding": "" + "withBackground": "الخلفية", + "onlySelected": "المحدد فقط", + "darkMode": "الوضع الداكن", + "embedScene": "تضمين المشهد", + "scale": "الحجم", + "padding": "الهوامش" }, "tooltip": { - "embedScene": "" + "embedScene": "سيتم حفظ بيانات المشهد في ملف PNG/SVG المصدّر بحيث يمكن استعادة المشهد منه.\nسيزيد حجم الملف المصدر." }, "title": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "تصدير بصيغة PNG", + "exportToSvg": "تصدير بصيغة SVG", + "copyPngToClipboard": "نسخ الـ PNG إلى الحافظة" }, "button": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "PNG", + "exportToSvg": "SVG", + "copyPngToClipboard": "نسخ إلى الحافظة" } }, "encrypted": { @@ -411,43 +427,76 @@ "fileSavedToFilename": "حفظ باسم {filename}", "canvas": "لوحة الرسم", "selection": "العنصر المحدد", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "استخدم {{shortcut}} للصق كعنصر واحد،\nأو لصق في محرر نص موجود", + "unableToEmbed": "تضمين هذا الرابط غير مسموح حاليًا. افتح بلاغاً على GitHub لطلب عنوان Url القائمة البيضاء", + "unrecognizedLinkFormat": "الرابط الذي ضمنته لا يتطابق مع التنسيق المتوقع. الرجاء محاولة لصق النص 'المضمن' المُزوَد من موقع المصدر" }, "colors": { "transparent": "شفاف", - "black": "", - "white": "", - "red": "", - "pink": "", - "grape": "", - "violet": "", - "gray": "", - "blue": "", - "cyan": "", - "teal": "", - "green": "", - "yellow": "", - "orange": "", - "bronze": "" + "black": "أسود", + "white": "أبيض", + "red": "أحمر", + "pink": "وردي", + "grape": "عنبي", + "violet": "بنفسجي", + "gray": "رمادي", + "blue": "أزرق", + "cyan": "سماوي", + "teal": "أزرق مخضر", + "green": "أخضر", + "yellow": "أصفر", + "orange": "برتقالي", + "bronze": "برونزي" }, "welcomeScreen": { "app": { - "center_heading": "", - "center_heading_plus": "", - "menuHint": "" + "center_heading": "جميع بياناتك محفوظة محليا في المتصفح الخاص بك.", + "center_heading_plus": "هل تريد الذهاب إلى Excalidraw+ بدلاً من ذلك؟", + "menuHint": "التصدير والتفضيلات واللغات ..." }, "defaults": { - "menuHint": "", - "center_heading": "", - "toolbarHint": "", - "helpHint": "" + "menuHint": "التصدير والتفضيلات وغيرها...", + "center_heading": "الرسم البياني التصويري. بشكل مبسط.", + "toolbarHint": "اختر أداة و ابدأ الرسم!", + "helpHint": "الاختصارات و المساعدة" } }, "colorPicker": { - "mostUsedCustomColors": "", - "colors": "", - "shades": "", - "hexCode": "", - "noShades": "" + "mostUsedCustomColors": "الألوان المخصصة الأكثر استخداما", + "colors": "الألوان", + "shades": "الدرجات", + "hexCode": "رمز Hex", + "noShades": "لا تتوفر درجات لهذا اللون" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "تصدير كصورة", + "button": "تصدير كصورة", + "description": "تصدير بيانات المشهد إلى ملف يمكنك الاستيراد منه لاحقاً." + }, + "saveToDisk": { + "title": "حفظ الملف للجهاز", + "button": "حفظ الملف للجهاز", + "description": "تصدير بيانات المشهد إلى ملف يمكنك الاستيراد منه لاحقاً." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "تصدير إلى Excalidraw+", + "description": "حفظ المشهد إلى مساحة العمل +Excalidraw الخاصة بك." + } + }, + "modal": { + "loadFromFile": { + "title": "تحميل من ملف", + "button": "تحميل من ملف", + "description": "سيتم التحميل من الملف استبدال المحتوى الموجود.

يمكنك النسخ الاحتياطي لرسمك أولاً باستخدام أحد الخيارات أدناه." + }, + "shareableLink": { + "title": "تحميل من رابط", + "button": "استبدال محتواي", + "description": "سيتسبب تحميل رسمة خارجية باستبدال محتواك الموجود حالياً.

بإمكانك إجراء النسخ الاحتياطي لرسمتك الحالية باستخدام أحد الخيارات أدناه." + } + } } } diff --git a/src/locales/az-AZ.json b/src/locales/az-AZ.json index 2618ccbdc..1ece3cc98 100644 --- a/src/locales/az-AZ.json +++ b/src/locales/az-AZ.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "", + "editEmbed": "", "create": "", - "label": "" + "createEmbed": "", + "label": "", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "", @@ -160,13 +164,16 @@ "darkMode": "", "lightMode": "", "zenMode": "", + "objectsSnapMode": "", "exitZenMode": "", "cancel": "", "clear": "", "remove": "", + "embed": "", "publishLibrary": "", "submit": "", - "confirm": "" + "confirm": "", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "", @@ -196,6 +203,7 @@ "imageInsertError": "", "fileTooBig": "", "svgImageInsertError": "", + "failedToFetchImage": "", "invalidSVGString": "", "cannotResolveCollabServer": "", "importLibraryError": "", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "", "eraser": "", "frame": "", + "embeddable": "", + "laser": "", "hand": "", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "", "freeDraw": "", "text": "", + "embeddable": "", "text_selected": "", "text_editing": "", "linearElementMulti": "", @@ -252,7 +267,8 @@ "bindTextToElement": "", "deepBoxSelect": "", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "", @@ -411,7 +427,9 @@ "fileSavedToFilename": "", "canvas": "", "selection": "", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/bg-BG.json b/src/locales/bg-BG.json index 76bcef574..716c73d54 100644 --- a/src/locales/bg-BG.json +++ b/src/locales/bg-BG.json @@ -1,7 +1,7 @@ { "labels": { "paste": "Постави", - "pasteAsPlaintext": "", + "pasteAsPlaintext": "Постави като обикновен текст", "pasteCharts": "Постави графики", "selectAll": "Маркирай всичко", "multiSelect": "Добави елемент към селекция", @@ -50,7 +50,7 @@ "veryLarge": "Много голям", "solid": "Солиден", "hachure": "Хералдика", - "zigzag": "", + "zigzag": "Зигзаг", "crossHatch": "Двойно-пресечено", "thin": "Тънък", "bold": "Ясно очертан", @@ -63,7 +63,7 @@ "cartoonist": "Карикатурист", "fileTitle": "Име на файл", "colorPicker": "Избор на цвят", - "canvasColors": "", + "canvasColors": "Използван на платно", "canvasBackground": "Фон на платно", "drawingCanvas": "Платно за рисуване", "layers": "Слоеве", @@ -99,37 +99,41 @@ "share": "Сподели", "showStroke": "", "showBackground": "", - "toggleTheme": "", - "personalLib": "", - "excalidrawLib": "", - "decreaseFontSize": "", - "increaseFontSize": "", + "toggleTheme": "Включи тема", + "personalLib": "Лична Библиотека", + "excalidrawLib": "Excalidraw Библиотека", + "decreaseFontSize": "Намали размера на шрифта", + "increaseFontSize": "Увеличи размера на шрифта", "unbindText": "", "bindText": "", "createContainerFromText": "", "link": { - "edit": "", + "edit": "Редактирай линк", + "editEmbed": "", "create": "", - "label": "" + "createEmbed": "", + "label": "Линк", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "", "exit": "" }, "elementLock": { - "lock": "", - "unlock": "", - "lockAll": "", - "unlockAll": "" + "lock": "Заключи", + "unlock": "Отключи", + "lockAll": "Заключи всички", + "unlockAll": "Отключи всички" }, - "statusPublished": "", + "statusPublished": "Публикувани", "sidebarLock": "", "selectAllElementsInFrame": "", "removeAllElementsFromFrame": "", - "eyeDropper": "" + "eyeDropper": "Избери цвят от платното" }, "library": { - "noItems": "", + "noItems": "Няма добавени неща все още...", "hint_emptyLibrary": "", "hint_emptyPrivateLibrary": "" }, @@ -137,11 +141,11 @@ "clearReset": "Нулиране на платно", "exportJSON": "", "exportImage": "", - "export": "", + "export": "Запази на...", "copyToClipboard": "Копиране в клипборда", - "save": "", + "save": "Запази към текущ файл", "saveAs": "Запиши като", - "load": "", + "load": "Отвори", "getShareableLink": "Получаване на връзка за споделяне", "close": "Затвори", "selectLanguage": "Избор на език", @@ -160,13 +164,16 @@ "darkMode": "Тъмен режим", "lightMode": "Светъл режим", "zenMode": "Режим Zen", + "objectsSnapMode": "", "exitZenMode": "Спиране на Zen режим", "cancel": "Отмени", "clear": "Изчисти", "remove": "Премахване", + "embed": "", "publishLibrary": "Публикувай", "submit": "Изпрати", - "confirm": "Потвърждаване" + "confirm": "Потвърждаване", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Това ще изчисти цялото платно. Сигурни ли сте?", @@ -175,37 +182,42 @@ "couldNotLoadInvalidFile": "Невалиден файл не може да се зареди", "importBackendFailed": "Импортирането от бекенд не беше успешно.", "cannotExportEmptyCanvas": "Не може да се експортира празно платно.", - "couldNotCopyToClipboard": "", + "couldNotCopyToClipboard": "Не можем да копираме в клипбоарда.", "decryptFailed": "Данните не можаха да се дешифрират.", "uploadedSecurly": "Качването е защитено с криптиране от край до край, което означава, че сървърът Excalidraw и трети страни не могат да четат съдържанието.", "loadSceneOverridePrompt": "Зареждането на външна рисунка ще презапише настоящото ви съдържание. Желаете ли да продължите?", "collabStopOverridePrompt": "Прекратяването на сесията ще презапише предишната, локално запазена, рисунка. Сигурни ли сте?\n\n(Ако искате да продължите с локалната рисунка, просто затворете таба на браузъра.)", - "errorAddingToLibrary": "", - "errorRemovingFromLibrary": "", + "errorAddingToLibrary": "Не можем да заредим от библиотеката", + "errorRemovingFromLibrary": "Не можем да премахнем елемент от библиотеката", "confirmAddLibrary": "Ще се добавят {{numShapes}} фигура(и) във вашата библиотека. Сигурни ли сте?", "imageDoesNotContainScene": "", "cannotRestoreFromImage": "Не може да бъде възстановена сцена от този файл", "invalidSceneUrl": "", "resetLibrary": "", - "removeItemsFromsLibrary": "", + "removeItemsFromsLibrary": "Изтрий {{count}} елемент(а) от библиотеката?", "invalidEncryptionKey": "", "collabOfflineWarning": "" }, "errors": { "unsupportedFileType": "Този файлов формат не се поддържа.", "imageInsertError": "", - "fileTooBig": "", + "fileTooBig": "Файлът е твърде голям. Максималния допустим размер е {{maxSize}}.", "svgImageInsertError": "", - "invalidSVGString": "", + "failedToFetchImage": "", + "invalidSVGString": "Невалиден SVG.", "cannotResolveCollabServer": "", - "importLibraryError": "", + "importLibraryError": "Не можем да заредим библиотеката", "collabSaveFailed": "", "collabSaveFailed_sizeExceeded": "", "brave_measure_text_error": { "line1": "", "line2": "", - "line3": "", + "line3": "Силно препоръчваме да изключите тази настройка. Можете да следвате тези стъпки за това как да го направите.", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -222,10 +234,12 @@ "lock": "Поддържайте избрания инструмент активен след рисуване", "penMode": "", "link": "", - "eraser": "", + "eraser": "Гума", "frame": "", + "embeddable": "", + "laser": "", "hand": "", - "extraTools": "" + "extraTools": "Още инструменти" }, "headings": { "canvasActions": "Действия по платното", @@ -237,6 +251,7 @@ "linearElement": "Кликнете, за да стартирате няколко точки, плъзнете за една линия", "freeDraw": "Натиснете и влачете, пуснете като сте готови", "text": "Подсказка: Можете също да добавите текст като натиснете някъде два път с инструмента за селекция", + "embeddable": "", "text_selected": "", "text_editing": "", "linearElementMulti": "Кликнете върху последната точка или натиснете Escape или Enter, за да завършите", @@ -252,7 +267,8 @@ "bindTextToElement": "Натиснете Enter, за да добавите", "deepBoxSelect": "", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Невъзможност за показване на preview", @@ -288,7 +304,7 @@ "link_details": "", "link_button": "", "excalidrawplus_description": "", - "excalidrawplus_button": "", + "excalidrawplus_button": "Експорт", "excalidrawplus_exportError": "" }, "helpDialog": { @@ -299,7 +315,7 @@ "curvedArrow": "Извита стрелка", "curvedLine": "Извита линия", "documentation": "Документация", - "doubleClick": "", + "doubleClick": "двойно-щракване", "drag": "плъзнете", "editor": "Редактор", "editLineArrowPoints": "", @@ -308,41 +324,41 @@ "howto": "Следвайте нашите ръководства", "or": "или", "preventBinding": "Спри прилепяне на стрелките", - "tools": "", + "tools": "Инструменти", "shortcuts": "Клавиши за бърз достъп", - "textFinish": "", - "textNewLine": "", + "textFinish": "Завърши редактиране (текстов редактор)", + "textNewLine": "Добави нова линия (текстов редактор)", "title": "Помощ", "view": "Преглед", "zoomToFit": "Приближи докато се виждат всички елементи", "zoomToSelection": "Приближи селекцията", - "toggleElementLock": "", - "movePageUpDown": "", - "movePageLeftRight": "" + "toggleElementLock": "Заключи/Отключи селекция", + "movePageUpDown": "Премести страница нагоре/надолу", + "movePageLeftRight": "Премести страница наляво/надясно" }, "clearCanvasDialog": { - "title": "" + "title": "Изчисти платното" }, "publishDialog": { - "title": "", - "itemName": "", - "authorName": "", - "githubUsername": "", - "twitterUsername": "", - "libraryName": "", - "libraryDesc": "", - "website": "", + "title": "Публикувай библиотека", + "itemName": "Име", + "authorName": "Авторско име", + "githubUsername": "GitHub потребителско име", + "twitterUsername": "Twitter потребителско име", + "libraryName": "Име на библиотеката", + "libraryDesc": "Описание на библиотеката", + "website": "Уебсайт", "placeholder": { - "authorName": "", - "libraryName": "", - "libraryDesc": "", + "authorName": "Името или потребителското Ви име", + "libraryName": "Име на библиотеката Ви", + "libraryDesc": "Описание на библиотеката ви, за да помогнете на хората да разберат приложенията ѝ", "githubHandle": "", "twitterHandle": "", "website": "" }, "errors": { - "required": "", - "website": "" + "required": "Задължително", + "website": "Въведете валиден URL адрес" }, "noteDescription": "", "noteGuidelines": "", @@ -356,15 +372,15 @@ "content": "" }, "confirmDialog": { - "resetLibrary": "", + "resetLibrary": "Нулирай библиотека", "removeItemsFromLib": "" }, "imageExportDialog": { "header": "", "label": { - "withBackground": "", - "onlySelected": "", - "darkMode": "", + "withBackground": "Фон", + "onlySelected": "Само избраното", + "darkMode": "Тъмен режим", "embedScene": "", "scale": "", "padding": "" @@ -373,14 +389,14 @@ "embedScene": "" }, "title": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "Изнасяне в PNG", + "exportToSvg": "Изнасяне в SVG", + "copyPngToClipboard": "Копирай PNG в клипборда" }, "button": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "PNG", + "exportToSvg": "SVG", + "copyPngToClipboard": "Копиране в клипборда" } }, "encrypted": { @@ -403,51 +419,84 @@ "width": "Широчина" }, "toast": { - "addedToLibrary": "", + "addedToLibrary": "Добавена към библиотеката", "copyStyles": "Копирани стилове.", "copyToClipboard": "Копирано в клипборда.", - "copyToClipboardAsPng": "", - "fileSaved": "", - "fileSavedToFilename": "", - "canvas": "", - "selection": "", - "pasteAsSingleElement": "" + "copyToClipboardAsPng": "Копира {{exportSelection}} в клипборда като PNG\n({{exportColorScheme}})", + "fileSaved": "Файлът е запазен.", + "fileSavedToFilename": "Запазен към {filename}", + "canvas": "платно", + "selection": "селекция", + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { - "transparent": "", - "black": "", - "white": "", - "red": "", - "pink": "", - "grape": "", - "violet": "", - "gray": "", - "blue": "", - "cyan": "", - "teal": "", - "green": "", - "yellow": "", - "orange": "", - "bronze": "" + "transparent": "Прозрачен", + "black": "Черен", + "white": "Бял", + "red": "Червен", + "pink": "Розов", + "grape": "Грозде", + "violet": "Виолетово", + "gray": "Сив", + "blue": "Син", + "cyan": "Синьозелено", + "teal": "Тъмно синьо-зелено", + "green": "Зелено", + "yellow": "Жълто", + "orange": "Оранжево", + "bronze": "Бронзово" }, "welcomeScreen": { "app": { - "center_heading": "", + "center_heading": "Всичките Ви данни са запазени локално в браузъра Ви.", "center_heading_plus": "", - "menuHint": "" + "menuHint": "Експорт, предпочитания, езици, ..." }, "defaults": { - "menuHint": "", - "center_heading": "", - "toolbarHint": "", - "helpHint": "" + "menuHint": "Експорт, предпочитания, и още...", + "center_heading": "Диаграми. Направени. Просто.", + "toolbarHint": "Изберете инструмент & Започнете да рисувате!", + "helpHint": "Преки пътища & помощ" } }, "colorPicker": { - "mostUsedCustomColors": "", - "colors": "", - "shades": "", - "hexCode": "", + "mostUsedCustomColors": "Най-често използвани цветове", + "colors": "Цветове", + "shades": "Нюанси", + "hexCode": "Шестнадесетичен код", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Изнеси като изображение", + "button": "Изнеси като изображение", + "description": "" + }, + "saveToDisk": { + "title": "Запази към диск", + "button": "Запази към диск", + "description": "" + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Експортирай към Excalidraw+", + "description": "Запази сцената към Excalidraw+ работното място." + } + }, + "modal": { + "loadFromFile": { + "title": "Зареди от файл", + "button": "Зареди от файл", + "description": "" + }, + "shareableLink": { + "title": "Зареди от линк", + "button": "Замени моето съдържание", + "description": "" + } + } } } diff --git a/src/locales/bn-BD.json b/src/locales/bn-BD.json index 2c5aa7277..a2b926890 100644 --- a/src/locales/bn-BD.json +++ b/src/locales/bn-BD.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "লিঙ্ক সংশোধন", + "editEmbed": "", "create": "লিঙ্ক তৈরী", - "label": "লিঙ্ক নামকরণ" + "createEmbed": "", + "label": "লিঙ্ক নামকরণ", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "", @@ -160,13 +164,16 @@ "darkMode": "ডার্ক মোড", "lightMode": "লাইট মোড", "zenMode": "জেন মোড", + "objectsSnapMode": "", "exitZenMode": "জেন মোড বন্ধ করুন", "cancel": "বাতিল", "clear": "সাফ", "remove": "বিয়োগ", + "embed": "", "publishLibrary": "সংগ্রহ প্রকাশ করুন", "submit": "জমা করুন", - "confirm": "নিশ্চিত করুন" + "confirm": "নিশ্চিত করুন", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "এটি পুরো ক্যানভাস সাফ করবে। আপনি কি নিশ্চিত?", @@ -196,6 +203,7 @@ "imageInsertError": "ছবি সন্নিবেশ করা যায়নি। পরে আবার চেষ্টা করুন...", "fileTooBig": "ফাইলটি খুব বড়। সর্বাধিক অনুমোদিত আকার হল {{maxSize}}৷", "svgImageInsertError": "এসভীজী ছবি সন্নিবেশ করা যায়নি। এসভীজী মার্কআপটি অবৈধ মনে হচ্ছে৷", + "failedToFetchImage": "", "invalidSVGString": "এসভীজী মার্কআপটি অবৈধ মনে হচ্ছে৷", "cannotResolveCollabServer": "কোল্যাব সার্ভারের সাথে সংযোগ করা যায়নি। পৃষ্ঠাটি পুনরায় লোড করে আবার চেষ্টা করুন।", "importLibraryError": "সংগ্রহ লোড করা যায়নি", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "একটি নির্বাচিত আকৃতির জন্য লিঙ্ক যোগ বা আপডেট করুন", "eraser": "ঝাড়ন", "frame": "", + "embeddable": "", + "laser": "", "hand": "", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "একাধিক বিন্দু শুরু করতে ক্লিক করুন, একক লাইনের জন্য টেনে আনুন", "freeDraw": "ক্লিক করুন এবং টেনে আনুন, আপনার কাজ শেষ হলে ছেড়ে দিন", "text": "বিশেষ্য: আপনি নির্বাচন টুলের সাথে যে কোনো জায়গায় ডাবল-ক্লিক করে পাঠ্য যোগ করতে পারেন", + "embeddable": "", "text_selected": "লেখা সম্পাদনা করতে ডাবল-ক্লিক করুন বা এন্টার টিপুন", "text_editing": "লেখা সম্পাদনা শেষ করতে এসকেপ বা কন্ট্রোল/কম্যান্ড যোগে এন্টার টিপুন", "linearElementMulti": "শেষ বিন্দুতে ক্লিক করুন অথবা শেষ করতে এসকেপ বা এন্টার টিপুন", @@ -252,7 +267,8 @@ "bindTextToElement": "লেখা যোগ করতে এন্টার টিপুন", "deepBoxSelect": "", "eraserRevert": "মুছে ফেলার জন্য চিহ্নিত উপাদানগুলিকে ফিরিয়ে আনতে অল্ট ধরে রাখুন", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "প্রিভিউ দেখাতে অপারগ", @@ -411,7 +427,9 @@ "fileSavedToFilename": "", "canvas": "", "selection": "বাছাই", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/ca-ES.json b/src/locales/ca-ES.json index daa9da8c4..1205838c4 100644 --- a/src/locales/ca-ES.json +++ b/src/locales/ca-ES.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "Edita l'enllaç", + "editEmbed": "", "create": "Crea un enllaç", - "label": "Enllaç" + "createEmbed": "", + "label": "Enllaç", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "Editar línia", @@ -160,13 +164,16 @@ "darkMode": "Mode fosc", "lightMode": "Mode clar", "zenMode": "Mode zen", + "objectsSnapMode": "", "exitZenMode": "Surt de mode zen", "cancel": "Cancel·la", "clear": "Neteja", "remove": "Suprimeix", + "embed": "", "publishLibrary": "Publica", "submit": "Envia", - "confirm": "Confirma" + "confirm": "Confirma", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "S'esborrarà tot el llenç. N'esteu segur?", @@ -196,6 +203,7 @@ "imageInsertError": "No s'ha pogut insertar la imatge, torneu-ho a provar més tard...", "fileTooBig": "El fitxer és massa gros. La mida màxima permesa és {{maxSize}}.", "svgImageInsertError": "No ha estat possible inserir la imatge SVG. Les marques SVG semblen invàlides.", + "failedToFetchImage": "", "invalidSVGString": "SVG no vàlid.", "cannotResolveCollabServer": "No ha estat possible connectar amb el servidor collab. Si us plau recarregueu la pàgina i torneu a provar.", "importLibraryError": "No s'ha pogut carregar la biblioteca", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Afegeix / actualitza l'enllaç per a la forma seleccionada", "eraser": "Esborrador", "frame": "", + "embeddable": "", + "laser": "", "hand": "Mà (eina de desplaçament)", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Feu clic per a dibuixar múltiples punts; arrossegueu per a una sola línia", "freeDraw": "Feu clic i arrossegueu, deixeu anar per a finalitzar", "text": "Consell: també podeu afegir text fent doble clic en qualsevol lloc amb l'eina de selecció", + "embeddable": "", "text_selected": "Feu doble clic o premeu Retorn per a editar el text", "text_editing": "Premeu Escapada o Ctrl+Retorn (o Ordre+Retorn) per a finalitzar l'edició", "linearElementMulti": "Feu clic a l'ultim punt, o pitgeu Esc o Retorn per a finalitzar", @@ -252,7 +267,8 @@ "bindTextToElement": "Premeu enter per a afegir-hi text", "deepBoxSelect": "Manteniu CtrlOrCmd per a selecció profunda, i per a evitar l'arrossegament", "eraserRevert": "Mantingueu premuda Alt per a revertir els elements seleccionats per a esborrar", - "firefox_clipboard_write": "És probable que aquesta funció es pugui activar posant la marca \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Per canviar les marques del navegador al Firefox, visiteu la pàgina \"about:config\"." + "firefox_clipboard_write": "És probable que aquesta funció es pugui activar posant la marca \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Per canviar les marques del navegador al Firefox, visiteu la pàgina \"about:config\".", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "No es pot mostrar la previsualització", @@ -411,7 +427,9 @@ "fileSavedToFilename": "S'ha desat a {filename}", "canvas": "el llenç", "selection": "la selecció", - "pasteAsSingleElement": "Fer servir {{shortcut}} per enganxar com un sol element,\no enganxeu-lo en un editor de text existent" + "pasteAsSingleElement": "Fer servir {{shortcut}} per enganxar com un sol element,\no enganxeu-lo en un editor de text existent", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Transparent", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/cs-CZ.json b/src/locales/cs-CZ.json index 528fb1b63..8d758e0da 100644 --- a/src/locales/cs-CZ.json +++ b/src/locales/cs-CZ.json @@ -109,8 +109,12 @@ "createContainerFromText": "Zabalit text do kontejneru", "link": { "edit": "Upravit odkaz", + "editEmbed": "", "create": "Vytvořit odkaz", - "label": "Odkaz" + "createEmbed": "", + "label": "Odkaz", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "Upravit čáru", @@ -160,13 +164,16 @@ "darkMode": "Tmavý režim", "lightMode": "Světlý režim", "zenMode": "Zen mód", + "objectsSnapMode": "", "exitZenMode": "Opustit zen mód", "cancel": "Zrušit", "clear": "Vyčistit", "remove": "Odstranit", + "embed": "", "publishLibrary": "Zveřejnit", "submit": "Odeslat", - "confirm": "Potvrdit" + "confirm": "Potvrdit", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Toto vymaže celé plátno. Jste si jisti?", @@ -196,6 +203,7 @@ "imageInsertError": "Nelze vložit obrázek. Zkuste to později...", "fileTooBig": "Soubor je příliš velký. Maximální povolená velikost je {{maxSize}}.", "svgImageInsertError": "Nelze vložit SVG obrázek. Značení SVG je neplatné.", + "failedToFetchImage": "", "invalidSVGString": "Neplatný SVG.", "cannotResolveCollabServer": "Nelze se připojit ke sdílenému serveru. Prosím obnovte stránku a zkuste to znovu.", "importLibraryError": "Nelze načíst knihovnu", @@ -206,6 +214,10 @@ "line2": "To by mohlo vést k narušení Textových elementů ve vašich výkresech.", "line3": "Důrazně doporučujeme zakázat toto nastavení. Můžete sledovat tyto kroky jak to udělat.", "line4": "Pokud vypnutí tohoto nastavení neopravuje zobrazení textových prvků, prosím, otevřete problém na našem GitHubu, nebo nám napište na Discord" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Přidat/aktualizovat odkaz pro vybraný tvar", "eraser": "Guma", "frame": "", + "embeddable": "", + "laser": "", "hand": "Ruka (nástroj pro posouvání)", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Kliknutím pro více bodů, táhnutím pro jednu čáru", "freeDraw": "Klikněte a táhněte, pro ukončení pusťte", "text": "Tip: Text můžete také přidat dvojitým kliknutím kdekoli pomocí nástroje pro výběr", + "embeddable": "", "text_selected": "Dvojklikem nebo stisknutím klávesy ENTER upravíte text", "text_editing": "Stiskněte Escape nebo Ctrl/Cmd+ENTER pro dokončení úprav", "linearElementMulti": "Klikněte na poslední bod nebo stiskněte Escape anebo Enter pro dokončení", @@ -252,7 +267,8 @@ "bindTextToElement": "Stiskněte Enter pro přidání textu", "deepBoxSelect": "Podržte Ctrl/Cmd pro hluboký výběr a pro zabránění táhnutí", "eraserRevert": "Podržením klávesy Alt vrátíte prvky označené pro smazání", - "firefox_clipboard_write": "Tato funkce může být povolena nastavením vlajky \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Chcete-li změnit vlajky prohlížeče ve Firefoxu, navštivte stránku \"about:config\"." + "firefox_clipboard_write": "Tato funkce může být povolena nastavením vlajky \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Chcete-li změnit vlajky prohlížeče ve Firefoxu, navštivte stránku \"about:config\".", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Náhled nelze zobrazit", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Uloženo do {filename}", "canvas": "plátno", "selection": "výběr", - "pasteAsSingleElement": "Pomocí {{shortcut}} vložte jako jeden prvek,\nnebo vložte do existujícího textového editoru" + "pasteAsSingleElement": "Pomocí {{shortcut}} vložte jako jeden prvek,\nnebo vložte do existujícího textového editoru", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Průhledná", @@ -449,5 +467,36 @@ "shades": "Stíny", "hexCode": "Hex kód", "noShades": "Pro tuto barvu nejsou k dispozici žádné odstíny" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/da-DK.json b/src/locales/da-DK.json index dd2b8c3fa..0cd9c8ce0 100644 --- a/src/locales/da-DK.json +++ b/src/locales/da-DK.json @@ -1,7 +1,7 @@ { "labels": { "paste": "Indsæt", - "pasteAsPlaintext": "", + "pasteAsPlaintext": "Indsæt som klartekst", "pasteCharts": "Indsæt diagrammer", "selectAll": "Marker alle", "multiSelect": "Tilføj element til markering", @@ -50,7 +50,7 @@ "veryLarge": "Meget stor", "solid": "Solid", "hachure": "Skravering", - "zigzag": "", + "zigzag": "Zigzag", "crossHatch": "Krydsskravering", "thin": "Tynd", "bold": "Fed", @@ -69,8 +69,8 @@ "layers": "Lag", "actions": "Handlinger", "language": "Sprog", - "liveCollaboration": "", - "duplicateSelection": "", + "liveCollaboration": "Live samarbejde...", + "duplicateSelection": "Duplikér", "untitled": "Unavngivet", "name": "Navn", "yourName": "Dit navn", @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "", + "editEmbed": "", "create": "", - "label": "" + "createEmbed": "", + "label": "", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "", @@ -160,13 +164,16 @@ "darkMode": "Mørk tilstand", "lightMode": "Lys baggrund", "zenMode": "Zentilstand", + "objectsSnapMode": "", "exitZenMode": "Stop zentilstand", "cancel": "Annuller", "clear": "Ryd", "remove": "Fjern", + "embed": "", "publishLibrary": "Publicér", "submit": "Gem", - "confirm": "Bekræft" + "confirm": "Bekræft", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Dette vil rydde hele lærredet. Er du sikker?", @@ -196,6 +203,7 @@ "imageInsertError": "", "fileTooBig": "", "svgImageInsertError": "", + "failedToFetchImage": "", "invalidSVGString": "", "cannotResolveCollabServer": "", "importLibraryError": "", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "", "eraser": "", "frame": "", + "embeddable": "", + "laser": "", "hand": "", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "", "freeDraw": "Klik og træk, slip når du er færdig", "text": "", + "embeddable": "", "text_selected": "", "text_editing": "", "linearElementMulti": "", @@ -252,7 +267,8 @@ "bindTextToElement": "", "deepBoxSelect": "", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Gemt som {filename}", "canvas": "canvas", "selection": "markering", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/de-DE.json b/src/locales/de-DE.json index 81fe54dd1..c41186ef1 100644 --- a/src/locales/de-DE.json +++ b/src/locales/de-DE.json @@ -109,8 +109,12 @@ "createContainerFromText": "Text in Container einbetten", "link": { "edit": "Link bearbeiten", + "editEmbed": "Link bearbeiten & einbetten", "create": "Link erstellen", - "label": "Link" + "createEmbed": "Link erstellen & einbetten", + "label": "Link", + "labelEmbed": "Verlinken & einbetten", + "empty": "Kein Link festgelegt" }, "lineEditor": { "edit": "Linie bearbeiten", @@ -160,13 +164,16 @@ "darkMode": "Dunkles Design", "lightMode": "Helles Design", "zenMode": "Zen-Modus", + "objectsSnapMode": "Einrasten an Objekten", "exitZenMode": "Zen-Modus verlassen", "cancel": "Abbrechen", "clear": "Löschen", "remove": "Entfernen", + "embed": "Einbettung umschalten", "publishLibrary": "Veröffentlichen", "submit": "Absenden", - "confirm": "Bestätigen" + "confirm": "Bestätigen", + "embeddableInteractionButton": "Klicken, um zu interagieren" }, "alerts": { "clearReset": "Dies wird die ganze Zeichenfläche löschen. Bist du dir sicher?", @@ -196,6 +203,7 @@ "imageInsertError": "Das Bild konnte nicht eingefügt werden. Versuche es später erneut...", "fileTooBig": "Die Datei ist zu groß. Die maximal zulässige Größe ist {{maxSize}}.", "svgImageInsertError": "SVG-Bild konnte nicht eingefügt werden. Das SVG-Markup sieht ungültig aus.", + "failedToFetchImage": "Bild konnte nicht abgerufen werden.", "invalidSVGString": "Ungültige SVG.", "cannotResolveCollabServer": "Konnte keine Verbindung zum Collab-Server herstellen. Bitte lade die Seite neu und versuche es erneut.", "importLibraryError": "Bibliothek konnte nicht geladen werden", @@ -206,6 +214,10 @@ "line2": "Dies könnte dazu führen, dass die Textelemente in Ihren Zeichnungen zerstört werden.", "line3": "Wir empfehlen dringend, diese Einstellung zu deaktivieren. Dazu kannst Du diesen Schritten folgen.", "line4": "Wenn die Deaktivierung dieser Einstellung die fehlerhafte Anzeige von Textelementen nicht behebt, öffne bitte ein Ticket auf unserem GitHub oder schreibe uns auf Discord" + }, + "libraryElementTypeError": { + "embeddable": "Einbettbare Elemente können der Bibliothek nicht hinzugefügt werden.", + "image": "Unterstützung für das Hinzufügen von Bildern in die Bibliothek kommt bald!" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Link für ausgewählte Form hinzufügen / aktualisieren", "eraser": "Radierer", "frame": "Rahmenwerkzeug", + "embeddable": "Web-Einbettung", + "laser": "Laserpointer", "hand": "Hand (Schwenkwerkzeug)", "extraTools": "Weitere Werkzeuge" }, @@ -237,6 +251,7 @@ "linearElement": "Klicken für Linie mit mehreren Punkten, Ziehen für einzelne Linie", "freeDraw": "Klicke und ziehe. Lass los, wenn du fertig bist", "text": "Tipp: Du kannst auch Text hinzufügen, indem du mit dem Auswahlwerkzeug auf eine beliebige Stelle doppelklickst", + "embeddable": "Klicken und ziehen, um eine Webseiten-Einbettung zu erstellen", "text_selected": "Doppelklicken oder Eingabetaste drücken, um Text zu bearbeiten", "text_editing": "Drücke Escape oder CtrlOrCmd+Eingabetaste, um die Bearbeitung abzuschließen", "linearElementMulti": "Zum Beenden auf den letzten Punkt klicken oder Escape oder Eingabe drücken", @@ -252,7 +267,8 @@ "bindTextToElement": "Zum Hinzufügen Eingabetaste drücken", "deepBoxSelect": "Halte CtrlOrCmd gedrückt, um innerhalb der Gruppe auszuwählen, und um Ziehen zu vermeiden", "eraserRevert": "Halte Alt gedrückt, um die zum Löschen markierten Elemente zurückzusetzen", - "firefox_clipboard_write": "Diese Funktion kann wahrscheinlich aktiviert werden, indem die Einstellung \"dom.events.asyncClipboard.clipboardItem\" auf \"true\" gesetzt wird. Um die Browsereinstellungen in Firefox zu ändern, besuche die Seite \"about:config\"." + "firefox_clipboard_write": "Diese Funktion kann wahrscheinlich aktiviert werden, indem die Einstellung \"dom.events.asyncClipboard.clipboardItem\" auf \"true\" gesetzt wird. Um die Browsereinstellungen in Firefox zu ändern, besuche die Seite \"about:config\".", + "disableSnapping": "Halte CtrlOrCmd gedrückt, um das Einrasten zu deaktivieren" }, "canvasError": { "cannotShowPreview": "Vorschau kann nicht angezeigt werden", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Als {filename} gespeichert", "canvas": "Zeichenfläche", "selection": "Auswahl", - "pasteAsSingleElement": "Verwende {{shortcut}} , um als einzelnes Element\neinzufügen oder in einen existierenden Texteditor einzufügen" + "pasteAsSingleElement": "Verwende {{shortcut}} , um als einzelnes Element\neinzufügen oder in einen existierenden Texteditor einzufügen", + "unableToEmbed": "Einbetten dieser URL ist derzeit nicht zulässig. Erstelle einen Issue auf GitHub, um die URL freigeben zu lassen", + "unrecognizedLinkFormat": "Der Link, den Du eingebettet hast, stimmt nicht mit dem erwarteten Format überein. Bitte versuche den 'embed' String einzufügen, der von der Quellseite zur Verfügung gestellt wird" }, "colors": { "transparent": "Transparent", @@ -449,5 +467,36 @@ "shades": "Schattierungen", "hexCode": "Hex-Code", "noShades": "Keine Schattierungen für diese Farbe verfügbar" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Als Bild exportieren", + "button": "Als Bild exportieren", + "description": "Exportiere die Zeichnungsdaten als ein Bild, von dem Du später importieren kannst." + }, + "saveToDisk": { + "title": "Auf Festplatte speichern", + "button": "Auf Festplatte speichern", + "description": "Exportiere die Zeichnungsdaten in eine Datei, von der Du später importieren kannst." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Export nach Excalidraw+", + "description": "Speichere die Szene in deinem Excalidraw+-Arbeitsbereich." + } + }, + "modal": { + "loadFromFile": { + "title": "Aus Datei laden", + "button": "Aus Datei laden", + "description": "Das Laden aus einer Datei wird Deinen vorhandenen Inhalt ersetzen.

Du kannst Deine Zeichnung zuerst mit einer der folgenden Optionen sichern." + }, + "shareableLink": { + "title": "Aus Link laden", + "button": "Meinen Inhalt ersetzen", + "description": "Das Laden einer externen Zeichnung wird Deinen vorhandenen Inhalt ersetzen.

Du kannst Deine Zeichnung zuerst mit einer der folgenden Optionen sichern." + } + } } } diff --git a/src/locales/el-GR.json b/src/locales/el-GR.json index ce52d8281..5a60fbb8b 100644 --- a/src/locales/el-GR.json +++ b/src/locales/el-GR.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "Επεξεργασία συνδέσμου", + "editEmbed": "", "create": "Δημιουργία συνδέσμου", - "label": "Σύνδεσμος" + "createEmbed": "", + "label": "Σύνδεσμος", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "Επεξεργασία γραμμής", @@ -160,13 +164,16 @@ "darkMode": "Σκοτεινή λειτουργία", "lightMode": "Φωτεινή λειτουργία", "zenMode": "Λειτουργία Zεν", + "objectsSnapMode": "", "exitZenMode": "Έξοδος από την λειτουργία Zen", "cancel": "Ακύρωση", "clear": "Καθαρισμός", "remove": "Κατάργηση", + "embed": "", "publishLibrary": "Δημοσίευση", "submit": "Υποβολή", - "confirm": "Επιβεβαίωση" + "confirm": "Επιβεβαίωση", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Αυτό θα σβήσει ολόκληρο τον καμβά. Είσαι σίγουρος;", @@ -196,6 +203,7 @@ "imageInsertError": "Αδυναμία εισαγωγής εικόνας. Προσπαθήστε ξανά αργότερα...", "fileTooBig": "Το αρχείο είναι πολύ μεγάλο. Το μέγιστο επιτρεπόμενο μέγεθος είναι {{maxSize}}.", "svgImageInsertError": "Αδυναμία εισαγωγής εικόνας SVG. Η σήμανση της SVG δεν φαίνεται έγκυρη.", + "failedToFetchImage": "", "invalidSVGString": "Μη έγκυρο SVG.", "cannotResolveCollabServer": "Αδυναμία σύνδεσης με τον διακομιστή συνεργασίας. Παρακαλώ ανανεώστε τη σελίδα και προσπαθήστε ξανά.", "importLibraryError": "Αδυναμία φόρτωσης βιβλιοθήκης", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Προσθήκη/ Ενημέρωση συνδέσμου για ένα επιλεγμένο σχήμα", "eraser": "Γόμα", "frame": "", + "embeddable": "", + "laser": "", "hand": "", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Κάνε κλικ για να ξεκινήσεις πολλαπλά σημεία, σύρε για μια γραμμή", "freeDraw": "Κάντε κλικ και σύρτε, απελευθερώσατε όταν έχετε τελειώσει", "text": "Tip: μπορείτε επίσης να προσθέστε κείμενο με διπλό-κλικ οπουδήποτε με το εργαλείο επιλογών", + "embeddable": "", "text_selected": "Κάντε διπλό κλικ ή πατήστε ENTER για να επεξεργαστείτε το κείμενο", "text_editing": "Πατήστε Escape ή CtrlOrCmd+ENTER για να ολοκληρώσετε την επεξεργασία", "linearElementMulti": "Κάνε κλικ στο τελευταίο σημείο ή πάτησε Escape ή Enter για να τελειώσεις", @@ -252,7 +267,8 @@ "bindTextToElement": "Πατήστε Enter για προσθήκη κειμένου", "deepBoxSelect": "Κρατήστε πατημένο το CtrlOrCmd για να επιλέξετε βαθιά, και να αποτρέψετε τη μεταφορά", "eraserRevert": "Κρατήστε πατημένο το Alt για να επαναφέρετε τα στοιχεία που σημειώθηκαν για διαγραφή", - "firefox_clipboard_write": "Αυτή η επιλογή μπορεί πιθανώς να ενεργοποιηθεί αλλάζοντας την ρύθμιση \"dom.events.asyncClipboard.clipboardItem\" σε \"true\". Για να αλλάξετε τις ρυθμίσεις του προγράμματος περιήγησης στο Firefox, επισκεφθείτε τη σελίδα \"about:config\"." + "firefox_clipboard_write": "Αυτή η επιλογή μπορεί πιθανώς να ενεργοποιηθεί αλλάζοντας την ρύθμιση \"dom.events.asyncClipboard.clipboardItem\" σε \"true\". Για να αλλάξετε τις ρυθμίσεις του προγράμματος περιήγησης στο Firefox, επισκεφθείτε τη σελίδα \"about:config\".", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Αδυναμία εμφάνισης προεπισκόπησης", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Αποθηκεύτηκε στο {filename}", "canvas": "καμβάς", "selection": "επιλογή", - "pasteAsSingleElement": "Χρησιμοποίησε το {{shortcut}} για να επικολλήσεις ως ένα μόνο στοιχείο,\nή να επικολλήσεις σε έναν υπάρχοντα επεξεργαστή κειμένου" + "pasteAsSingleElement": "Χρησιμοποίησε το {{shortcut}} για να επικολλήσεις ως ένα μόνο στοιχείο,\nή να επικολλήσεις σε έναν υπάρχοντα επεξεργαστή κειμένου", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Διαφανές", @@ -449,5 +467,36 @@ "shades": "Αποχρώσεις", "hexCode": "Κωδικός Hex", "noShades": "Δεν υπάρχουν διαθέσιμες αποχρώσεις για αυτό το χρώμα" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/en.json b/src/locales/en.json index f2e6b601a..8a2cc4d6f 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -203,6 +203,7 @@ "imageInsertError": "Couldn't insert image. Try again later...", "fileTooBig": "File is too big. Maximum allowed size is {{maxSize}}.", "svgImageInsertError": "Couldn't insert SVG image. The SVG markup looks invalid.", + "failedToFetchImage": "Failed to fetch image.", "invalidSVGString": "Invalid SVG.", "cannotResolveCollabServer": "Couldn't connect to the collab server. Please reload the page and try again.", "importLibraryError": "Couldn't load library", @@ -217,7 +218,10 @@ "libraryElementTypeError": { "embeddable": "Embeddable elements cannot be added to the library.", "image": "Support for adding images to the library coming soon!" - } + }, + "asyncPasteFailedOnRead": "Couldn't paste (couldn't read from system clipboard).", + "asyncPasteFailedOnParse": "Couldn't paste.", + "copyToSystemClipboardFailed": "Couldn't copy to clipboard." }, "toolBar": { "selection": "Selection", diff --git a/src/locales/es-ES.json b/src/locales/es-ES.json index ae8d30759..d925ab788 100644 --- a/src/locales/es-ES.json +++ b/src/locales/es-ES.json @@ -109,8 +109,12 @@ "createContainerFromText": "Envolver el texto en un contenedor", "link": { "edit": "Editar enlace", + "editEmbed": "Editar enlace e incrustar", "create": "Crear enlace", - "label": "Enlace" + "createEmbed": "Crear enlace e incrustar", + "label": "Enlace", + "labelEmbed": "Enlazar e incrustar", + "empty": "No se ha establecido un enlace" }, "lineEditor": { "edit": "Editar línea", @@ -124,9 +128,9 @@ }, "statusPublished": "Publicado", "sidebarLock": "Mantener barra lateral abierta", - "selectAllElementsInFrame": "", - "removeAllElementsFromFrame": "", - "eyeDropper": "" + "selectAllElementsInFrame": "Seleccionar todos los elementos en el marco", + "removeAllElementsFromFrame": "Eliminar todos los elementos del marco", + "eyeDropper": "Seleccionar un color del lienzo" }, "library": { "noItems": "No hay elementos añadidos todavía...", @@ -160,13 +164,16 @@ "darkMode": "Modo oscuro", "lightMode": "Modo claro", "zenMode": "Modo Zen", + "objectsSnapMode": "Ajustar a los objetos", "exitZenMode": "Salir del modo Zen", "cancel": "Cancelar", "clear": "Borrar", "remove": "Eliminar", + "embed": "", "publishLibrary": "Publicar", "submit": "Enviar", - "confirm": "Confirmar" + "confirm": "Confirmar", + "embeddableInteractionButton": "Pulsa para interactuar" }, "alerts": { "clearReset": "Esto limpiará todo el lienzo. Estás seguro?", @@ -196,16 +203,21 @@ "imageInsertError": "No se pudo insertar la imagen. Inténtelo de nuevo más tarde...", "fileTooBig": "Archivo demasiado grande. El tamaño máximo permitido es {{maxSize}}.", "svgImageInsertError": "No se pudo insertar la imagen SVG. El código SVG parece inválido.", + "failedToFetchImage": "", "invalidSVGString": "SVG no válido.", "cannotResolveCollabServer": "No se pudo conectar al servidor colaborador. Por favor, vuelva a cargar la página y vuelva a intentarlo.", "importLibraryError": "No se pudo cargar la librería", "collabSaveFailed": "No se pudo guardar en la base de datos del backend. Si los problemas persisten, debería guardar su archivo localmente para asegurarse de que no pierde su trabajo.", "collabSaveFailed_sizeExceeded": "No se pudo guardar en la base de datos del backend, el lienzo parece ser demasiado grande. Debería guardar el archivo localmente para asegurarse de que no pierde su trabajo.", "brave_measure_text_error": { - "line1": "", - "line2": "", - "line3": "", + "line1": "Parece que estás usando el navegador Brave con el ajuste Forzar el bloqueo de huellas digitales habilitado.", + "line2": "Esto podría resultar en errores en los Elementos de Texto en tus dibujos.", + "line3": "Recomendamos fuertemente deshabilitar esta configuración. Puedes seguir estos pasos sobre cómo hacerlo.", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,8 +236,10 @@ "link": "Añadir/Actualizar enlace para una forma seleccionada", "eraser": "Borrar", "frame": "", + "embeddable": "Incrustar Web", + "laser": "Puntero láser", "hand": "Mano (herramienta de panoramización)", - "extraTools": "" + "extraTools": "Más herramientas" }, "headings": { "canvasActions": "Acciones del lienzo", @@ -237,6 +251,7 @@ "linearElement": "Haz clic para dibujar múltiples puntos, arrastrar para solo una línea", "freeDraw": "Haz clic y arrastra, suelta al terminar", "text": "Consejo: también puedes añadir texto haciendo doble clic en cualquier lugar con la herramienta de selección", + "embeddable": "Haga clic y arrastre para crear un sitio web incrustado", "text_selected": "Doble clic o pulse ENTER para editar el texto", "text_editing": "Pulse Escape o Ctrl/Cmd + ENTER para terminar de editar", "linearElementMulti": "Haz clic en el último punto o presiona Escape o Enter para finalizar", @@ -252,7 +267,8 @@ "bindTextToElement": "Presione Entrar para agregar", "deepBoxSelect": "Mantén CtrlOrCmd para seleccionar en profundidad, y para evitar arrastrar", "eraserRevert": "Mantenga pulsado Alt para revertir los elementos marcados para su eliminación", - "firefox_clipboard_write": "Esta característica puede ser habilitada estableciendo la bandera \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Para cambiar las banderas del navegador en Firefox, visite la página \"about:config\"." + "firefox_clipboard_write": "Esta característica puede ser habilitada estableciendo la bandera \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Para cambiar las banderas del navegador en Firefox, visite la página \"about:config\".", + "disableSnapping": "Mantén pulsado CtrlOrCmd para desactivar el ajuste" }, "canvasError": { "cannotShowPreview": "No se puede mostrar la vista previa", @@ -360,27 +376,27 @@ "removeItemsFromLib": "Eliminar elementos seleccionados de la biblioteca" }, "imageExportDialog": { - "header": "", + "header": "Exportar imagen", "label": { - "withBackground": "", - "onlySelected": "", - "darkMode": "", - "embedScene": "", - "scale": "", - "padding": "" + "withBackground": "Fondo", + "onlySelected": "Sólo seleccionados", + "darkMode": "Modo oscuro", + "embedScene": "Incrustar escena", + "scale": "Escalar", + "padding": "Espaciado" }, "tooltip": { "embedScene": "" }, "title": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "Exportar a PNG", + "exportToSvg": "Exportar a SVG", + "copyPngToClipboard": "Copiar PNG al portapapeles" }, "button": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "PNG", + "exportToSvg": "SVG", + "copyPngToClipboard": "Copiar al portapapeles" } }, "encrypted": { @@ -411,24 +427,26 @@ "fileSavedToFilename": "Guardado en {filename}", "canvas": "lienzo", "selection": "selección", - "pasteAsSingleElement": "Usa {{shortcut}} para pegar como un solo elemento,\no pegar en un editor de texto existente" + "pasteAsSingleElement": "Usa {{shortcut}} para pegar como un solo elemento,\no pegar en un editor de texto existente", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Transparente", - "black": "", - "white": "", - "red": "", - "pink": "", - "grape": "", - "violet": "", - "gray": "", - "blue": "", - "cyan": "", - "teal": "", - "green": "", - "yellow": "", - "orange": "", - "bronze": "" + "black": "Negro", + "white": "Blanco", + "red": "Rojo", + "pink": "Rosa", + "grape": "Uva", + "violet": "Violeta", + "gray": "Gris", + "blue": "Azul", + "cyan": "Cian", + "teal": "Turquesa", + "green": "Verde", + "yellow": "Amarillo", + "orange": "Naranja", + "bronze": "Bronce" }, "welcomeScreen": { "app": { @@ -444,10 +462,41 @@ } }, "colorPicker": { - "mostUsedCustomColors": "", - "colors": "", + "mostUsedCustomColors": "Colores personalizados más utilizados", + "colors": "Colores", "shades": "", - "hexCode": "", + "hexCode": "Código Hexadecimal", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Exportar como imagen", + "button": "Exportar como imagen", + "description": "" + }, + "saveToDisk": { + "title": "Guardar en el disco", + "button": "Guardar en el disco", + "description": "Exporta los datos de la escena a un archivo desde el cual podrás importar más tarde." + }, + "excalidrawPlus": { + "title": "", + "button": "Exportar a Excalidraw+", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "Cargar desde un archivo", + "button": "Cargar desde un archivo", + "description": "" + }, + "shareableLink": { + "title": "Cargar desde un enlace", + "button": "Reemplazar mi contenido", + "description": "Cargar un dibujo externo reemplazará tu contenido existente.

Puedes primero hacer una copia de seguridad de tu dibujo usando una de las opciones de abajo." + } + } } } diff --git a/src/locales/eu-ES.json b/src/locales/eu-ES.json index e66849dac..5a257f05d 100644 --- a/src/locales/eu-ES.json +++ b/src/locales/eu-ES.json @@ -109,8 +109,12 @@ "createContainerFromText": "Bilatu testua edukiontzi batean", "link": { "edit": "Editatu esteka", + "editEmbed": "Editatu esteka eta kapsulatu", "create": "Sortu esteka", - "label": "Esteka" + "createEmbed": "Sortu esteka eta kapsulatu", + "label": "Esteka", + "labelEmbed": "Esteka eta kapsula", + "empty": "Ez da estekarik ezarri" }, "lineEditor": { "edit": "Editatu lerroa", @@ -160,13 +164,16 @@ "darkMode": "Modu iluna", "lightMode": "Modu argia", "zenMode": "Zen modua", + "objectsSnapMode": "Atxiki objektuei", "exitZenMode": "Irten Zen modutik", "cancel": "Utzi", "clear": "Garbitu", "remove": "Kendu", + "embed": "Aldatu kapsulatzea", "publishLibrary": "Argitaratu", "submit": "Bidali", - "confirm": "Bai" + "confirm": "Bai", + "embeddableInteractionButton": "Egin klik elkar eragiteko" }, "alerts": { "clearReset": "Honek oihal osoa garbituko du. Ziur zaude?", @@ -196,6 +203,7 @@ "imageInsertError": "Ezin izan da irudia txertatu. Saiatu berriro geroago...", "fileTooBig": "Fitxategia handiegia da. Onartutako gehienezko tamaina {{maxSize}} da.", "svgImageInsertError": "Ezin izan da SVG irudia txertatu. SVG markak baliogabea dirudi.", + "failedToFetchImage": "", "invalidSVGString": "SVG baliogabea.", "cannotResolveCollabServer": "Ezin izan da elkarlaneko zerbitzarira konektatu. Mesedez, berriro kargatu orria eta saiatu berriro.", "importLibraryError": "Ezin izan da liburutegia kargatu", @@ -206,6 +214,10 @@ "line2": "Honek zure marrazkietako Testu-elementuak hautsi ditzake.", "line3": "Ezarpen hau desgaitzea gomendatzen dugu. urrats hauek jarrai ditzakezu hori nola egin jakiteko.", "line4": "Ezarpen hau desgaituz gero, testu-elementuen bistaratzea konpontzen ez bada, ireki arazo gure GitHub-en edo idatzi iezaguzu Discord helbidera" + }, + "libraryElementTypeError": { + "embeddable": "Kapsulatutako elementuak ezin dira liburutegira gehitu.", + "image": "Laster egongo da irudiak liburutegian gehitzeko laguntza!" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Gehitu / Eguneratu esteka hautatutako forma baterako", "eraser": "Borragoma", "frame": "Marko tresna", + "embeddable": "Web kapsulatzea", + "laser": "Laser punteroa", "hand": "Eskua (panoratze tresna)", "extraTools": "Tresna gehiago" }, @@ -237,6 +251,7 @@ "linearElement": "Egin klik hainbat puntu hasteko, arrastatu lerro bakarrerako", "freeDraw": "Egin klik eta arrastatu, askatu amaitutakoan", "text": "Aholkua: testua gehitu dezakezu edozein lekutan klik bikoitza eginez hautapen tresnarekin", + "embeddable": "Egin klik eta arrastatu webgunea kapsulatzeko", "text_selected": "Egin klik bikoitza edo sakatu SARTU testua editatzeko", "text_editing": "Sakatu Esc edo Ctrl+SARTU editatzen amaitzeko", "linearElementMulti": "Egin klik azken puntuan edo sakatu Esc edo Sartu amaitzeko", @@ -252,7 +267,8 @@ "bindTextToElement": "Sakatu Sartu testua gehitzeko", "deepBoxSelect": "Eutsi Ctrl edo Cmd sakatuta aukeraketa sakona egiteko eta arrastatzea saihesteko", "eraserRevert": "Eduki Alt sakatuta ezabatzeko markatutako elementuak leheneratzeko", - "firefox_clipboard_write": "Ezaugarri hau \"dom.events.asyncClipboard.clipboardItem\" marka \"true\" gisa ezarrita gaitu daiteke. Firefox-en arakatzailearen banderak aldatzeko, bisitatu \"about:config\" orrialdera." + "firefox_clipboard_write": "Ezaugarri hau \"dom.events.asyncClipboard.clipboardItem\" marka \"true\" gisa ezarrita gaitu daiteke. Firefox-en arakatzailearen banderak aldatzeko, bisitatu \"about:config\" orrialdera.", + "disableSnapping": "Eduki sakatuta Ctrl edo Cmd tekla atxikipena desgaitzeko" }, "canvasError": { "cannotShowPreview": "Ezin da oihala aurreikusi", @@ -411,7 +427,9 @@ "fileSavedToFilename": "{filename}-n gorde da", "canvas": "oihala", "selection": "hautapena", - "pasteAsSingleElement": "Erabili {{shortcut}} elementu bakar gisa itsasteko,\nedo itsatsi lehendik dagoen testu-editore batean" + "pasteAsSingleElement": "Erabili {{shortcut}} elementu bakar gisa itsasteko,\nedo itsatsi lehendik dagoen testu-editore batean", + "unableToEmbed": "Url hau txertatzea ez da une honetan onartzen. Sortu issue bat GitHub-en Urla zerrenda zurian sartzea eskatzeko", + "unrecognizedLinkFormat": "Kapsulatu duzun esteka ez dator bat espero den formatuarekin. Mesedez, saiatu iturburu-guneak emandako 'kapsulatu' katea itsasten" }, "colors": { "transparent": "Gardena", @@ -449,5 +467,36 @@ "shades": "Ñabardurak", "hexCode": "Hez kodea", "noShades": "Kolore honetarako ez dago ñabardurarik eskuragarri" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Esportatu irudi gisa", + "button": "Esportatu irudi gisa", + "description": "Esportatu eszenaren datuak geroago inportatu ahal izango duzun irudi gisa." + }, + "saveToDisk": { + "title": "Gorde diskoan", + "button": "Gorde diskoan", + "description": "Esportatu eszenaren datuak geroago inportatu ahal izango duzun fitxategi batan." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Esportatu Excalidraw+ra", + "description": "Gorde eszena zure Excalidraw+ laneko areara." + } + }, + "modal": { + "loadFromFile": { + "title": "Fitxategitik kargatu", + "button": "Fitxategitik kargatu", + "description": "Fitxategi batetik kargatzeak lehendik duzun edukia ordezkatuko du.

Lehenengo marrazkiaren babeskopia egin dezakezu beheko aukeretako bat erabiliz." + }, + "shareableLink": { + "title": "Estekatik kargatu", + "button": "Ordeztu nire edukia", + "description": "Kanpoko irudi bat kargatzeak lehendik duzun edukia ordezkatuko du.

. Zure marrazkiaren babeskopia egin dezakezu lehenik beheko aukeretako bat erabiliz." + } + } } } diff --git a/src/locales/fa-IR.json b/src/locales/fa-IR.json index 1870a1730..101803258 100644 --- a/src/locales/fa-IR.json +++ b/src/locales/fa-IR.json @@ -109,8 +109,12 @@ "createContainerFromText": "متن را در یک جایگاه بپیچید", "link": { "edit": "ویرایش لینک", + "editEmbed": "", "create": "ایجاد پیوند", - "label": "لینک" + "createEmbed": "", + "label": "لینک", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "ویرایش لینک", @@ -126,7 +130,7 @@ "sidebarLock": "باز نگه داشتن سایدبار", "selectAllElementsInFrame": "", "removeAllElementsFromFrame": "", - "eyeDropper": "" + "eyeDropper": "انتخاب رنگ از کرباس" }, "library": { "noItems": "آیتمی به اینجا اضافه نشده...", @@ -160,13 +164,16 @@ "darkMode": "حالت تیره", "lightMode": "حالت روشن", "zenMode": "حالت ذن", + "objectsSnapMode": "", "exitZenMode": "خروج از حالت تمرکز", "cancel": "لغو", "clear": "پاک کردن", "remove": "پاک کردن", + "embed": "", "publishLibrary": "انتشار", "submit": "ارسال", - "confirm": "تایید" + "confirm": "تایید", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "این کار کل صفحه را پاک میکند. آیا مطمئنید؟", @@ -196,6 +203,7 @@ "imageInsertError": "عکس ارسال نشد. بعداً دوباره تلاش کنید...", "fileTooBig": "فایل خیلی بزرگ است حداکثر اندازه مجاز {{maxSize}}.", "svgImageInsertError": "تصویر SVG وارد نشد. نشانه گذاری SVG نامعتبر به نظر می رسد.", + "failedToFetchImage": "", "invalidSVGString": "SVG نادرست.", "cannotResolveCollabServer": "به سرور collab متصل نشد. لطفا صفحه را مجددا بارگذاری کنید و دوباره تلاش کنید.", "importLibraryError": "داده‌ها بارگذاری نشدند", @@ -206,6 +214,10 @@ "line2": "این می تواند منجر به شکستن عناصر متن در نقاشی های شما شود.", "line3": "اکیداً توصیه می کنیم این تنظیم را غیرفعال کنید. برای نحوه انجام این کار می‌توانید این مراحل را دنبال کنید.", "line4": "اگر غیرفعال کردن این تنظیم نمایش عناصر متنی را برطرف نکرد، لطفاً یک مشکل را در GitHub ما باز کنید یا برای ما در Discord بنویسید." + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,8 +236,10 @@ "link": "افزودن/به‌روزرسانی پیوند برای شکل انتخابی", "eraser": "پاک کن", "frame": "", + "embeddable": "", + "laser": "", "hand": "دست (ابزار پانینگ)", - "extraTools": "" + "extraTools": "ابزارهای بیشتر" }, "headings": { "canvasActions": "عملیات روی بوم", @@ -237,6 +251,7 @@ "linearElement": "برای چند نقطه کلیک و برای یک خط بکشید", "freeDraw": "کلیک کنید و بکشید و وقتی کار تمام شد رها کنید", "text": "نکته: با برنامه انتخاب شده شما میتوانید با دوبار کلیک کردن هرکجا میخواید متن اظاف کنید", + "embeddable": "", "text_selected": "دوبار کلیک کنید یا Enter را فشار دهید تا نقاط را ویرایش کنید", "text_editing": "Escape یا CtrlOrCmd+ENTER را فشار دهید تا ویرایش تمام شود", "linearElementMulti": "روی آخرین نقطه کلیک کنید یا کلید ESC را بزنید یا کلید Enter را بزنید برای اتمام کار", @@ -252,7 +267,8 @@ "bindTextToElement": "برای افزودن اینتر را بزنید", "deepBoxSelect": "CtrlOrCmd را برای انتخاب عمیق و جلوگیری از کشیدن نگه دارید", "eraserRevert": "Alt را نگه دارید تا عناصر علامت گذاری شده برای حذف برگردند", - "firefox_clipboard_write": "احتمالاً می‌توان این ویژگی را با تنظیم پرچم «dom.events.asyncClipboard.clipboardItem» روی «true» فعال کرد. برای تغییر پرچم های مرورگر در فایرفاکس، از صفحه \"about:config\" دیدن کنید." + "firefox_clipboard_write": "احتمالاً می‌توان این ویژگی را با تنظیم پرچم «dom.events.asyncClipboard.clipboardItem» روی «true» فعال کرد. برای تغییر پرچم های مرورگر در فایرفاکس، از صفحه \"about:config\" دیدن کنید.", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "پیش نمایش نشان داده نمی شود", @@ -362,7 +378,7 @@ "imageExportDialog": { "header": "", "label": { - "withBackground": "", + "withBackground": "پس زمینه", "onlySelected": "", "darkMode": "", "embedScene": "", @@ -411,24 +427,26 @@ "fileSavedToFilename": "ذخیره در {filename}", "canvas": "بوم", "selection": "انتخاب", - "pasteAsSingleElement": "از {{shortcut}} برای چسباندن به عنوان یک عنصر استفاده کنید،\nیا در یک ویرایشگر متن موجود جایگذاری کنید" + "pasteAsSingleElement": "از {{shortcut}} برای چسباندن به عنوان یک عنصر استفاده کنید،\nیا در یک ویرایشگر متن موجود جایگذاری کنید", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "شفاف", - "black": "", - "white": "", - "red": "", - "pink": "", - "grape": "", - "violet": "", - "gray": "", - "blue": "", - "cyan": "", - "teal": "", - "green": "", - "yellow": "", - "orange": "", - "bronze": "" + "black": "سیاه", + "white": "سفید", + "red": "قرمز", + "pink": "صورتی", + "grape": "یاقوتی", + "violet": "بنفش", + "gray": "خاکستری", + "blue": "آبی", + "cyan": "فیروزه‌ای", + "teal": "سبزآبی", + "green": "سبز", + "yellow": "زرد", + "orange": "نارنجی", + "bronze": "برنزی" }, "welcomeScreen": { "app": { @@ -445,9 +463,40 @@ }, "colorPicker": { "mostUsedCustomColors": "", - "colors": "", - "shades": "", - "hexCode": "", + "colors": "رنگ‌ها", + "shades": "جلوه‌ها", + "hexCode": "کدِ هگز", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "ذخیره در دیسک", + "button": "ذخیره در دیسک", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "بارگذاری از فایل", + "button": "بارگذاری از فایل", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/fi-FI.json b/src/locales/fi-FI.json index d1c68b12a..0a8963f9a 100644 --- a/src/locales/fi-FI.json +++ b/src/locales/fi-FI.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "Muokkaa linkkiä", + "editEmbed": "", "create": "Luo linkki", - "label": "Linkki" + "createEmbed": "", + "label": "Linkki", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "Muokkaa riviä", @@ -160,13 +164,16 @@ "darkMode": "Tumma tila", "lightMode": "Vaalea tila", "zenMode": "Zen-tila", + "objectsSnapMode": "", "exitZenMode": "Poistu zen-tilasta", "cancel": "Peruuta", "clear": "Pyyhi", "remove": "Poista", + "embed": "", "publishLibrary": "Julkaise", "submit": "Lähetä", - "confirm": "Vahvista" + "confirm": "Vahvista", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Tämä tyhjentää koko piirtoalueen. Jatketaanko?", @@ -196,6 +203,7 @@ "imageInsertError": "Kuvan lisääminen epäonnistui. Yritä myöhemmin uudelleen...", "fileTooBig": "Tiedosto on liian suuri. Suurin sallittu koko on {{maxSize}}.", "svgImageInsertError": "SVG- kuvaa ei voitu lisätä. Tiedoston SVG-sisältö näyttää virheelliseltä.", + "failedToFetchImage": "", "invalidSVGString": "Virheellinen SVG.", "cannotResolveCollabServer": "Yhteyden muodostaminen collab-palvelimeen epäonnistui. Virkistä sivu ja yritä uudelleen.", "importLibraryError": "Kokoelman lataaminen epäonnistui", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Lisää/päivitä linkki valitulle muodolle", "eraser": "Poistotyökalu", "frame": "", + "embeddable": "", + "laser": "", "hand": "Käsi (panning-työkalu)", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Klikkaa piirtääksesi useampi piste, raahaa piirtääksesi yksittäinen viiva", "freeDraw": "Paina ja raahaa, päästä irti kun olet valmis", "text": "Vinkki: voit myös lisätä tekstiä kaksoisnapsauttamalla mihin tahansa valintatyökalulla", + "embeddable": "", "text_selected": "Kaksoisnapsauta tai paina ENTER muokataksesi tekstiä", "text_editing": "Paina Escape tai CtrlOrCmd+ENTER lopettaaksesi muokkaamisen", "linearElementMulti": "Lopeta klikkaamalla viimeistä pistettä, painamalla Escape- tai Enter-näppäintä", @@ -252,7 +267,8 @@ "bindTextToElement": "Lisää tekstiä painamalla enter", "deepBoxSelect": "Käytä syvävalintaa ja estä raahaus painamalla CtrlOrCmd", "eraserRevert": "Pidä Alt alaspainettuna, kumotaksesi merkittyjen elementtien poistamisen", - "firefox_clipboard_write": "Tämä ominaisuus voidaan todennäköisesti ottaa käyttöön asettamalla \"dom.events.asyncClipboard.clipboardItem\" kohta \"true\":ksi. Vaihtaaksesi selaimen kohdan Firefoxissa, käy \"about:config\" sivulla." + "firefox_clipboard_write": "Tämä ominaisuus voidaan todennäköisesti ottaa käyttöön asettamalla \"dom.events.asyncClipboard.clipboardItem\" kohta \"true\":ksi. Vaihtaaksesi selaimen kohdan Firefoxissa, käy \"about:config\" sivulla.", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Esikatselua ei voitu näyttää", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Tallennettiin kohteeseen {filename}", "canvas": "piirtoalue", "selection": "valinta", - "pasteAsSingleElement": "Käytä {{shortcut}} liittääksesi yhtenä elementtinä,\ntai liittääksesi olemassa olevaan tekstieditoriin" + "pasteAsSingleElement": "Käytä {{shortcut}} liittääksesi yhtenä elementtinä,\ntai liittääksesi olemassa olevaan tekstieditoriin", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Läpinäkyvä", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/fr-FR.json b/src/locales/fr-FR.json index e48cf1a85..8dfcc4c05 100644 --- a/src/locales/fr-FR.json +++ b/src/locales/fr-FR.json @@ -50,7 +50,7 @@ "veryLarge": "Très grande", "solid": "Solide", "hachure": "Hachures", - "zigzag": "", + "zigzag": "Zigzag", "crossHatch": "Hachures croisées", "thin": "Fine", "bold": "Épaisse", @@ -109,8 +109,12 @@ "createContainerFromText": "Encadrer le texte dans un conteneur", "link": { "edit": "Modifier le lien", + "editEmbed": "Éditer le lien & intégrer", "create": "Ajouter un lien", - "label": "Lien" + "createEmbed": "Créer un lien & intégrer", + "label": "Lien", + "labelEmbed": "", + "empty": "Aucun lien défini" }, "lineEditor": { "edit": "Modifier la ligne", @@ -124,8 +128,8 @@ }, "statusPublished": "Publié", "sidebarLock": "Maintenir la barre latérale ouverte", - "selectAllElementsInFrame": "", - "removeAllElementsFromFrame": "", + "selectAllElementsInFrame": "Sélectionner tous les éléments du cadre", + "removeAllElementsFromFrame": "Supprimer tous les éléments du cadre", "eyeDropper": "" }, "library": { @@ -160,13 +164,16 @@ "darkMode": "Mode sombre", "lightMode": "Mode clair", "zenMode": "Mode zen", + "objectsSnapMode": "Aimanter aux objets", "exitZenMode": "Quitter le mode zen", "cancel": "Annuler", "clear": "Effacer", "remove": "Supprimer", + "embed": "Activer/Désactiver l'intégration", "publishLibrary": "Publier", "submit": "Envoyer", - "confirm": "Confirmer" + "confirm": "Confirmer", + "embeddableInteractionButton": "Cliquez pour interagir" }, "alerts": { "clearReset": "L'intégralité du canevas va être effacée. Êtes-vous sûr ?", @@ -196,16 +203,21 @@ "imageInsertError": "Impossible d'insérer l'image. Réessayez plus tard...", "fileTooBig": "Le fichier est trop volumineux. La taille maximale autorisée est de {{maxSize}}.", "svgImageInsertError": "Impossible d'insérer l'image SVG. Le balisage SVG semble invalide.", + "failedToFetchImage": "", "invalidSVGString": "SVG invalide.", "cannotResolveCollabServer": "Impossible de se connecter au serveur collaboratif. Veuillez recharger la page et réessayer.", "importLibraryError": "Impossible de charger la bibliothèque", "collabSaveFailed": "Impossible d'enregistrer dans la base de données en arrière-plan. Si des problèmes persistent, vous devriez enregistrer votre fichier localement pour vous assurer de ne pas perdre votre travail.", "collabSaveFailed_sizeExceeded": "Impossible d'enregistrer dans la base de données en arrière-plan, le tableau semble trop grand. Vous devriez enregistrer le fichier localement pour vous assurer de ne pas perdre votre travail.", "brave_measure_text_error": { - "line1": "", - "line2": "", - "line3": "", - "line4": "" + "line1": "On dirait que vous utilisez le navigateur Brave avec l'option Bloquer agressivement le fichage activée.", + "line2": "Cela pourrait entraîner des problèmes avec les Éléments Textuels dans vos dessins.", + "line3": "Nous recommandons fortement de désactiver cette option. Vous pouvez suivre ces instructions pour savoir comment faire.", + "line4": "Si désactiver cette option de résout pas le problème d'affichage des éléments textuels, veuillez ouvrir un ticket sur notre GitHub, ou écrivez-nous sur notre Discord" + }, + "libraryElementTypeError": { + "embeddable": "Les éléments intégrés ne peuvent pas être ajoutés à la librairie.", + "image": "Le support pour l'ajout d'images à la librairie arrive bientôt !" } }, "toolBar": { @@ -223,9 +235,11 @@ "penMode": "Mode stylo - évite le toucher", "link": "Ajouter/mettre à jour le lien pour une forme sélectionnée", "eraser": "Gomme", - "frame": "", + "frame": "Outil de cadre", + "embeddable": "Intégration Web", + "laser": "", "hand": "Mains (outil de déplacement de la vue)", - "extraTools": "" + "extraTools": "Plus d'outils" }, "headings": { "canvasActions": "Actions du canevas", @@ -237,6 +251,7 @@ "linearElement": "Cliquez pour démarrer plusieurs points, faites glisser pour une seule ligne", "freeDraw": "Cliquez et faites glissez, relâchez quand vous avez terminé", "text": "Astuce : vous pouvez aussi ajouter du texte en double-cliquant n'importe où avec l'outil de sélection", + "embeddable": "Cliquez et glissez pour créer une intégration de site web", "text_selected": "Double-cliquez ou appuyez sur ENTRÉE pour modifier le texte", "text_editing": "Appuyez sur ÉCHAP ou Ctrl/Cmd+ENTRÉE pour terminer l'édition", "linearElementMulti": "Cliquez sur le dernier point ou appuyez sur Échap ou Entrée pour terminer", @@ -252,7 +267,8 @@ "bindTextToElement": "Appuyer sur Entrée pour ajouter du texte", "deepBoxSelect": "Maintenir Ctrl ou Cmd pour sélectionner dans les groupes et empêcher le déplacement", "eraserRevert": "Maintenez Alt enfoncé pour annuler les éléments marqués pour suppression", - "firefox_clipboard_write": "Cette fonctionnalité devrait pouvoir être activée en définissant l'option \"dom.events.asyncClipboard.clipboard.clipboardItem\" à \"true\". Pour modifier les paramètres du navigateur dans Firefox, visitez la page \"about:config\"." + "firefox_clipboard_write": "Cette fonctionnalité devrait pouvoir être activée en définissant l'option \"dom.events.asyncClipboard.clipboard.clipboardItem\" à \"true\". Pour modifier les paramètres du navigateur dans Firefox, visitez la page \"about:config\".", + "disableSnapping": "Maintenez CtrlOuCmd pour désactiver l'aimantation" }, "canvasError": { "cannotShowPreview": "Impossible d’afficher l’aperçu", @@ -360,27 +376,27 @@ "removeItemsFromLib": "Enlever les éléments sélectionnés de la bibliothèque" }, "imageExportDialog": { - "header": "", + "header": "Exporter l'image", "label": { - "withBackground": "", - "onlySelected": "", - "darkMode": "", - "embedScene": "", - "scale": "", + "withBackground": "Fond", + "onlySelected": "Uniquement la sélection", + "darkMode": "Mode sombre", + "embedScene": "Intégrer la scène", + "scale": "Échelle", "padding": "" }, "tooltip": { - "embedScene": "" + "embedScene": "Les données de la scène seront sauvegardées dans le fichier PNG/SVG exporté afin que la scène puisse être restaurée depuis celui-ci.\nCela augmentera la taille du fichier exporté." }, "title": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "Exporter en PNG", + "exportToSvg": "Exporter en SVG", + "copyPngToClipboard": "Copier le PNG dans le presse-papier" }, "button": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "PNG", + "exportToSvg": "SVG", + "copyPngToClipboard": "Copier dans le presse-papier" } }, "encrypted": { @@ -411,24 +427,26 @@ "fileSavedToFilename": "Enregistré sous {filename}", "canvas": "canevas", "selection": "sélection", - "pasteAsSingleElement": "Utiliser {{shortcut}} pour coller comme un seul élément,\nou coller dans un éditeur de texte existant" + "pasteAsSingleElement": "Utiliser {{shortcut}} pour coller comme un seul élément,\nou coller dans un éditeur de texte existant", + "unableToEmbed": "Intégrer cet URL n'est actuellement pas autorisé. Ouvrez un ticket sur GitHub pour demander son ajout à la liste blanche", + "unrecognizedLinkFormat": "Le lien que vous avez intégré ne correspond pas au format attendu. Veuillez essayer de coller la chaîne d'intégration fournie par le site source" }, "colors": { "transparent": "Transparent", - "black": "", - "white": "", - "red": "", - "pink": "", - "grape": "", - "violet": "", - "gray": "", - "blue": "", - "cyan": "", - "teal": "", - "green": "", - "yellow": "", - "orange": "", - "bronze": "" + "black": "Noir", + "white": "Blanc", + "red": "Rouge", + "pink": "Rose", + "grape": "Mauve", + "violet": "Violet", + "gray": "Gris", + "blue": "Bleu", + "cyan": "Cyan", + "teal": "Turquoise", + "green": "Vert", + "yellow": "Jaune", + "orange": "Orange", + "bronze": "Bronze" }, "welcomeScreen": { "app": { @@ -444,10 +462,41 @@ } }, "colorPicker": { - "mostUsedCustomColors": "", - "colors": "", - "shades": "", - "hexCode": "", - "noShades": "" + "mostUsedCustomColors": "Couleurs personnalisées les plus fréquemment utilisées", + "colors": "Couleurs", + "shades": "Nuances", + "hexCode": "Code hex", + "noShades": "Aucune nuance disponible pour cette couleur" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Exporter en image", + "button": "Exporter en image", + "description": "Exporter les données de la scène comme une image que vous pourrez importer ultérieurement." + }, + "saveToDisk": { + "title": "Sauvegarder sur le disque", + "button": "Sauvegarder sur le disque", + "description": "Exporter les données de la scène comme un fichier que vous pourrez importer ultérieurement." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Exporter vers Excalidraw+", + "description": "Enregistrer la scène dans votre espace de travail Excalidraw+." + } + }, + "modal": { + "loadFromFile": { + "title": "Charger depuis un fichier", + "button": "Charger depuis un fichier", + "description": "Charger depuis un fichier va remplacer votre contenu existant.

Vous pouvez d'abord sauvegarder votre dessin en utilisant l'une des options ci-dessous." + }, + "shareableLink": { + "title": "Charger depuis un lien", + "button": "Remplacer mon contenu", + "description": "Charger un dessin externe va remplacer votre contenu existant.

Vous pouvez d'abord sauvegarder votre dessin en utilisant l'une des options ci-dessous." + } + } } } diff --git a/src/locales/gl-ES.json b/src/locales/gl-ES.json index 7522860a6..658563548 100644 --- a/src/locales/gl-ES.json +++ b/src/locales/gl-ES.json @@ -50,7 +50,7 @@ "veryLarge": "Moi grande", "solid": "Sólido", "hachure": "Folleto", - "zigzag": "", + "zigzag": "Zigzag", "crossHatch": "Raiado transversal", "thin": "Estreito", "bold": "Groso", @@ -109,8 +109,12 @@ "createContainerFromText": "Envolver o texto nun contedor", "link": { "edit": "Editar ligazón", + "editEmbed": "", "create": "Crear ligazón", - "label": "Ligazón" + "createEmbed": "", + "label": "Ligazón", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "Editar liña", @@ -160,13 +164,16 @@ "darkMode": "Modo escuro", "lightMode": "Modo claro", "zenMode": "Modo zen", + "objectsSnapMode": "", "exitZenMode": "Saír do modo zen", "cancel": "Cancelar", "clear": "Limpar", "remove": "Eliminar", + "embed": "", "publishLibrary": "Publicar", "submit": "Enviar", - "confirm": "Confirmar" + "confirm": "Confirmar", + "embeddableInteractionButton": "Faga clic para interactuar" }, "alerts": { "clearReset": "Isto limpará todo o lenzo. Estás seguro?", @@ -196,6 +203,7 @@ "imageInsertError": "Non se puido inserir a imaxe. Probe de novo máis tarde...", "fileTooBig": "O ficheiro é demasiado grande. O tamaño máximo permitido é {{maxSize}}.", "svgImageInsertError": "Non se puido inserir como imaxe SVG. O marcado SVG semella inválido.", + "failedToFetchImage": "", "invalidSVGString": "SVG inválido.", "cannotResolveCollabServer": "Non se puido conectar ao servidor de colaboración. Por favor recargue a páxina e probe de novo.", "importLibraryError": "Non se puido cargar a biblioteca", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,8 +236,10 @@ "link": "Engadir/ Actualizar ligazón para a forma seleccionada", "eraser": "Goma de borrar", "frame": "", + "embeddable": "Inserir na web", + "laser": "Punteiro láser", "hand": "Man (ferramenta de desprazamento)", - "extraTools": "" + "extraTools": "Máis ferramentas" }, "headings": { "canvasActions": "Accións do lenzo", @@ -237,6 +251,7 @@ "linearElement": "Faga clic para iniciar varios puntos, arrastre para unha sola liña", "freeDraw": "Fai clic e arrastra, solta cando acabes", "text": "Consello: tamén podes engadir texto facendo dobre-clic en calquera lugar coa ferramenta de selección", + "embeddable": "Faga clic e arrastre para crear un sitio web embebido", "text_selected": "Dobre-clic ou prema ENTER para editar o texto", "text_editing": "Prema Escape ou CtrlOrCmd+ENTER para finalizar a edición", "linearElementMulti": "Faga clic no último punto ou prema Escape ou Enter para rematar", @@ -252,7 +267,8 @@ "bindTextToElement": "Prema a tecla enter para engadir texto", "deepBoxSelect": "Manteña pulsado CtrlOrCmd para seleccionar en profundidade e evitar o arrastre", "eraserRevert": "Manteña pulsado Alt para reverter os elementos marcados para a súa eliminación", - "firefox_clipboard_write": "Esta función pódese activar establecendo a opción \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Para cambiar as opcións do navegador en Firefox, visita a páxina \"about:config\"." + "firefox_clipboard_write": "Esta función pódese activar establecendo a opción \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Para cambiar as opcións do navegador en Firefox, visita a páxina \"about:config\".", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Non se pode mostrar a vista previa", @@ -360,11 +376,11 @@ "removeItemsFromLib": "Eliminar os elementos seleccionados da biblioteca" }, "imageExportDialog": { - "header": "", + "header": "Exportar imaxe", "label": { - "withBackground": "", + "withBackground": "Fondo", "onlySelected": "", - "darkMode": "", + "darkMode": "Modo escuro", "embedScene": "", "scale": "", "padding": "" @@ -373,14 +389,14 @@ "embedScene": "" }, "title": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "Exportar a PNG", + "exportToSvg": "Exportar a SVG", + "copyPngToClipboard": "Copiar PNG ao portapapeis" }, "button": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "PNG", + "exportToSvg": "SVG", + "copyPngToClipboard": "Copiar ao portapapeis" } }, "encrypted": { @@ -411,24 +427,26 @@ "fileSavedToFilename": "Gardado en {filename}", "canvas": "lenzo", "selection": "selección", - "pasteAsSingleElement": "Usa {{shortcut}} para pegar como un único elemento\nou pega nun editor de texto existente" + "pasteAsSingleElement": "Usa {{shortcut}} para pegar como un único elemento\nou pega nun editor de texto existente", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Transparente", - "black": "", - "white": "", - "red": "", - "pink": "", - "grape": "", - "violet": "", - "gray": "", - "blue": "", + "black": "Negro", + "white": "Branco", + "red": "Vermello", + "pink": "Rosa", + "grape": "Uva", + "violet": "Violeta", + "gray": "Gris", + "blue": "Azul", "cyan": "", "teal": "", - "green": "", - "yellow": "", - "orange": "", - "bronze": "" + "green": "Verde", + "yellow": "Marelo", + "orange": "Laranxa", + "bronze": "Bronce" }, "welcomeScreen": { "app": { @@ -445,9 +463,40 @@ }, "colorPicker": { "mostUsedCustomColors": "", - "colors": "", + "colors": "Cores", "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Exportar como imaxe", + "button": "Exportar como imaxe", + "description": "" + }, + "saveToDisk": { + "title": "Gardar no disco", + "button": "Gardar no disco", + "description": "" + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Exportar a Excalidraw+", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "Cargar dende arquivo", + "button": "Cargar dende arquivo", + "description": "" + }, + "shareableLink": { + "title": "Cargar dende un enlace", + "button": "Substituír o meu contido", + "description": "" + } + } } } diff --git a/src/locales/he-IL.json b/src/locales/he-IL.json index 8cdc242f0..aec18f955 100644 --- a/src/locales/he-IL.json +++ b/src/locales/he-IL.json @@ -50,7 +50,7 @@ "veryLarge": "גדול מאוד", "solid": "מוצק", "hachure": "קווים מקבילים קצרים להצגת כיוון וחדות שיפוע במפה", - "zigzag": "", + "zigzag": "זיגזג", "crossHatch": "קווים מוצלבים שתי וערב", "thin": "דק", "bold": "מודגש", @@ -109,8 +109,12 @@ "createContainerFromText": "ארוז טקסט במיכל", "link": { "edit": "עריכת קישור", + "editEmbed": "ערוך קישור ושבץ", "create": "יצירת קישור", - "label": "קישור" + "createEmbed": "צור קישור ושבץ", + "label": "קישור", + "labelEmbed": "קשר ושבץ", + "empty": "לא נקבע קישור" }, "lineEditor": { "edit": "ערוך קו", @@ -124,8 +128,8 @@ }, "statusPublished": "פורסם", "sidebarLock": "שמור את סרגל הצד פתוח", - "selectAllElementsInFrame": "", - "removeAllElementsFromFrame": "", + "selectAllElementsInFrame": "בחר את כל האלמנטים במסגרת", + "removeAllElementsFromFrame": "הסר את כל האלמנטים שבמסגרת", "eyeDropper": "" }, "library": { @@ -160,13 +164,16 @@ "darkMode": "מצב כהה", "lightMode": "מצב בהיר", "zenMode": "מצב זן", + "objectsSnapMode": "", "exitZenMode": "צא ממצב זן", "cancel": "ביטול", "clear": "ניקוי", "remove": "הסר", + "embed": "", "publishLibrary": "פרסום", "submit": "שליחה", - "confirm": "אשר" + "confirm": "אשר", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "פעולה זו תנקה את כל הקנבס. אתה בטוח?", @@ -196,6 +203,7 @@ "imageInsertError": "לא ניתן היה להוסיף את התמונה. אנא נסה שוב מאוחר יותר...", "fileTooBig": "הקובץ גדול מדי. הגודל המירבי המותר הינו {{maxSize}}.", "svgImageInsertError": "לא ניתן היה להוסיף את תמונת ה-SVG. הסימונים בתוך קובץ ה-SVG עשויים להיות שגויים.", + "failedToFetchImage": "", "invalidSVGString": "SVG שגוי.", "cannotResolveCollabServer": "לא הצלחתי להתחבר לשרת השיתוף. אנא רענן את הדף ונסה שוב.", "importLibraryError": "לא ניתן היה לטעון את הספריה", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "הוספה/עדכון קישור של הצורה שנבחרה", "eraser": "מחק", "frame": "", + "embeddable": "", + "laser": "", "hand": "יד (כלי הזזה)", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "לחץ להתחלת מספר נקודות, גרור לקו יחיד", "freeDraw": "לחץ וגרור, שחרר כשסיימת", "text": "טיפ: אפשר להוסיף טקסט על ידי לחיצה כפולה בכל מקום עם כלי הבחירה", + "embeddable": "", "text_selected": "לחץ לחיצה כפולה או הקש על אנטר לעריכת הטקסט", "text_editing": "כדי לסיים את העריכה לחץ על מקש Escape או על Ctrl (Cmd במחשבי אפל) ומקש Enter", "linearElementMulti": "הקלק על הנקודה האחרונה או הקש Escape או Enter לסיום", @@ -252,7 +267,8 @@ "bindTextToElement": "הקש Enter כדי להוספת טקסט", "deepBoxSelect": "החזק Ctrl / Cmd לבחירה עמוקה ולמניעת גרירה", "eraserRevert": "החזק Alt להחזרת רכיבים מסומנים למחיקה", - "firefox_clipboard_write": "יכולות זה ניתנת להפעלה על ידי שינוי הדגל של \"dom.events.asyncClipboard.clipboardItem\" למצב \"true\". כדי לשנות את הדגל בדפדפן Firefox, בקר בעמוד ״about:config״." + "firefox_clipboard_write": "יכולות זה ניתנת להפעלה על ידי שינוי הדגל של \"dom.events.asyncClipboard.clipboardItem\" למצב \"true\". כדי לשנות את הדגל בדפדפן Firefox, בקר בעמוד ״about:config״.", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "לא ניתן להראות תצוגה מקדימה", @@ -411,7 +427,9 @@ "fileSavedToFilename": "נשמר לקובץ {filename}", "canvas": "קנבאס", "selection": "בחירה", - "pasteAsSingleElement": "השתמש ב- {{shortcut}} כדי להדביק כפריט יחיד,\nאו הדבק לתוך עורך טקסט קיים" + "pasteAsSingleElement": "השתמש ב- {{shortcut}} כדי להדביק כפריט יחיד,\nאו הדבק לתוך עורך טקסט קיים", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "שקוף", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/hi-IN.json b/src/locales/hi-IN.json index 66b517c0d..0f3d135cb 100644 --- a/src/locales/hi-IN.json +++ b/src/locales/hi-IN.json @@ -109,8 +109,12 @@ "createContainerFromText": "मूलपाठ कंटेनर में मोड के दिखाए", "link": { "edit": "", + "editEmbed": "", "create": "", - "label": "" + "createEmbed": "", + "label": "", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "रेखा संपादित करे", @@ -160,13 +164,16 @@ "darkMode": "डार्क मोड", "lightMode": "लाइट मोड", "zenMode": "ज़ेन मोड", + "objectsSnapMode": "वस्तुओं से पकड़े", "exitZenMode": "जेन मोड से बाहर निकलें", "cancel": "", "clear": "साफ़ करे", "remove": "हटाएं", + "embed": "", "publishLibrary": "प्रकाशित करें", "submit": "प्रस्तुत करे", - "confirm": "पुष्टि करें" + "confirm": "पुष्टि करें", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "इससे पूरा कैनवास साफ हो जाएगा। क्या आपको यकीन है?", @@ -196,6 +203,7 @@ "imageInsertError": "छवि सम्मिलित नहीं की जा सकी. पुनः प्रयत्न करे...", "fileTooBig": "फ़ाइल ज़रूरत से ज़्यादा बड़ी हैं. अधिकतम अनुमित परिमाण {{maxSize}} हैं", "svgImageInsertError": "एसवीजी छवि सम्मिलित नहीं कर सके, एसवीजी रचना अनुचित हैं", + "failedToFetchImage": "", "invalidSVGString": "अनुचित SVG", "cannotResolveCollabServer": "कॉलेब सर्वर से कनेक्शन नहीं हो पा रहा. कृपया पृष्ठ को पुनः लाने का प्रयास करे.", "importLibraryError": "संग्रह प्रतिष्ठापित नहीं किया जा सका", @@ -206,6 +214,10 @@ "line2": "यह आपके चित्रों के पाठ तत्वोंको खंडित कर सकता हैं", "line3": "हमें आपसे ठोस आग्रह है की आप सेट्टिंग में इस विकल्प का चयन ना करे. इस अनुक्रम का पालन करके इसका पता लगा सकते हैं", "line4": "यदि इस सेटिंग्स को अक्षम करने पर भी पृष्ठ ठीक नहीं दिखता हो तो, हमारे GitHub पर एक मुद्दा प्रस्तुत करे, या हमें डिस्कोर्ड पर लिखित सम्पर्क करें" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "", "eraser": "रबड़", "frame": "", + "embeddable": "", + "laser": "लेसर टॉर्च", "hand": "हाथ ( खिसकाने का औज़ार)", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "कई बिंदुओं को शुरू करने के लिए क्लिक करें, सिंगल लाइन के लिए खींचें", "freeDraw": "क्लिक करें और खींचें। समाप्त करने के लिए, छोड़ो", "text": "आप चयन टूल से कहीं भी डबल-क्लिक करके टेक्स्ट जोड़ सकते हैं", + "embeddable": "", "text_selected": "", "text_editing": "", "linearElementMulti": "अंतिम बिंदु पर क्लिक करें या समाप्त होने के लिए एस्केप या एंटर दबाएं", @@ -252,7 +267,8 @@ "bindTextToElement": "", "deepBoxSelect": "", "eraserRevert": "मिटाने के लिए चुने हुए चीजों को ना चुनने के लिए Alt साथ में दबाए", - "firefox_clipboard_write": "\"dom.events.asyncClipboard.clipboardItem\" फ़्लैग को \"true\" पर सेट करके इस सुविधा को संभवतः सक्षम किया जा सकता है। Firefox में ब्राउज़र फ़्लैग बदलने के लिए, \"about:config\" पृष्ठ पर जाएँ।" + "firefox_clipboard_write": "\"dom.events.asyncClipboard.clipboardItem\" फ़्लैग को \"true\" पर सेट करके इस सुविधा को संभवतः सक्षम किया जा सकता है। Firefox में ब्राउज़र फ़्लैग बदलने के लिए, \"about:config\" पृष्ठ पर जाएँ।", + "disableSnapping": "स्नैपिंग को निष्क्रिय करने के लिए CtrlOrCmd दबाए रखें" }, "canvasError": { "cannotShowPreview": "पूर्वावलोकन नहीं दिखा सकते हैं", @@ -411,7 +427,9 @@ "fileSavedToFilename": "", "canvas": "", "selection": "", - "pasteAsSingleElement": "एक अवयव के रूप में चिपकाने के लिए {{shortcut}} का उपयोग करें,\nया किसी मौजूदा पाठ संपादक में चिपकायें" + "pasteAsSingleElement": "एक अवयव के रूप में चिपकाने के लिए {{shortcut}} का उपयोग करें,\nया किसी मौजूदा पाठ संपादक में चिपकायें", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "", @@ -449,5 +467,36 @@ "shades": "छाया", "hexCode": "हेक्स कोड", "noShades": "इस रंग की कोई छाया उपलब्ध नहीं हैं" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "छवि स्वरूप में निर्यात करे", + "button": "छवि स्वरूप निर्यात करे", + "description": "दृष्य डेटा छवि स्वरूप में निर्यात करे, उस स्वरूप से आप उसे पुनः आयात कर सकते हो" + }, + "saveToDisk": { + "title": "डिस्क में सम्हाले", + "button": "डिस्क में सम्हाले", + "description": "दृष्य डेटा बाहरी फ़ाइल में निर्यात करे, जहाँसे आप उसे पुनः आयात कर सकते हो" + }, + "excalidrawPlus": { + "title": "एक्षकालीड्रॉ+", + "button": "एक्षकालीड्रॉ+ में निर्यात करे", + "description": "दृष्य को आपके एक्षकालीड्रॉ+ के कर्यस्थल में सम्हाले" + } + }, + "modal": { + "loadFromFile": { + "title": "फ़ाइल से लोड करें:", + "button": "फ़ाइल से लोड करें:", + "description": "फ़ाइल से लोड करने पर यह आपके कार्य की जगह लेलेगा

आपकी ड्रॉइंग निम्न दर्शित विकल्पो में से एक चुनके और उपयोग करके सम्हाल सकते हैं" + }, + "shareableLink": { + "title": "लिंक से लोड करें:", + "button": "इस जगह प्रतिस्थापित करे", + "description": "बाहर का चित्र लोड करने पर यह आपके कार्य की जगह लेलेगा

आप आपकी ड्रॉइंग पहले निम्न दर्शित विकल्पो में से एक चुनके और उपयोग करके सम्हाल सकते हों." + } + } } } diff --git a/src/locales/hu-HU.json b/src/locales/hu-HU.json index 2e22ee296..130c388c8 100644 --- a/src/locales/hu-HU.json +++ b/src/locales/hu-HU.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "Hivatkozás szerkesztése", + "editEmbed": "", "create": "Hivatkozás létrehozása", - "label": "Hivatkozás" + "createEmbed": "", + "label": "Hivatkozás", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "", @@ -160,13 +164,16 @@ "darkMode": "Sötét mód", "lightMode": "Világos mód", "zenMode": "Letisztult mód", + "objectsSnapMode": "", "exitZenMode": "Kilépés a letisztult módból", "cancel": "Mégsem", "clear": "Kiűrítés", "remove": "Eltávolítás", + "embed": "", "publishLibrary": "Közzététel", "submit": "Elküldés", - "confirm": "Megerősítés" + "confirm": "Megerősítés", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Ez a művelet törli a vászont. Biztos benne?", @@ -196,6 +203,7 @@ "imageInsertError": "Nem sikerült beszúrni a képet. Próbáld újra később...", "fileTooBig": "A fájl túl nagy. A megengedett maximális méret {{maxSize}}.", "svgImageInsertError": "Nem sikerült beszúrni az SVG-képet. Az SVG szintaktika érvénytelennek tűnik.", + "failedToFetchImage": "", "invalidSVGString": "Érvénytelen SVG.", "cannotResolveCollabServer": "", "importLibraryError": "", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Hivatkozás hozzáadása/frissítése a kiválasztott alakzathoz", "eraser": "", "frame": "", + "embeddable": "", + "laser": "", "hand": "", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Kattintással görbe, az eger húzásával pedig egyenes nyilat rajzolhatsz", "freeDraw": "Kattints és húzd, majd engedd el, amikor végeztél", "text": "Tipp: A kijelölés eszközzel a dupla kattintás új szöveget hoz létre", + "embeddable": "", "text_selected": "Kattints duplán, vagy nyomj entert a szöveg szerkesztéséhez", "text_editing": "Nyomjd meg az Escape vagy a Ctrl/Cmd+ENTER billentyűkombinációt a szerkesztés befejezéséhez", "linearElementMulti": "Kattints a következő ív pozíciójára, vagy fejezd be a nyilat az Escape vagy Enter megnyomásával", @@ -252,7 +267,8 @@ "bindTextToElement": "Nyomd meg az Entert szöveg hozzáadáshoz", "deepBoxSelect": "Tartsd lenyomva a Ctrl/Cmd billentyűt a mély kijelöléshez és a húzás megakadályozásához", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Előnézet nem jeleníthető meg", @@ -360,7 +376,7 @@ "removeItemsFromLib": "A kiválasztott elemek eltávolítása a könyvtárból" }, "imageExportDialog": { - "header": "", + "header": "Kép exportálása", "label": { "withBackground": "", "onlySelected": "", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Mentve mint {filename}", "canvas": "rajzvászon", "selection": "kijelölés", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Átlátszó", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/id-ID.json b/src/locales/id-ID.json index 8ce039700..bb0274cf2 100644 --- a/src/locales/id-ID.json +++ b/src/locales/id-ID.json @@ -109,8 +109,12 @@ "createContainerFromText": "Bungkus teks dalam kontainer", "link": { "edit": "Edit tautan", + "editEmbed": "", "create": "Buat tautan", - "label": "Tautan" + "createEmbed": "", + "label": "Tautan", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "Edit tautan", @@ -124,9 +128,9 @@ }, "statusPublished": "Telah terbit", "sidebarLock": "Biarkan sidebar tetap terbuka", - "selectAllElementsInFrame": "", - "removeAllElementsFromFrame": "", - "eyeDropper": "" + "selectAllElementsInFrame": "Pilih semua elemen di bingkai", + "removeAllElementsFromFrame": "Hapus semua elemen dari bingkai", + "eyeDropper": "Ambil warna dari kanvas" }, "library": { "noItems": "Belum ada item yang ditambahkan...", @@ -160,13 +164,16 @@ "darkMode": "Mode gelap", "lightMode": "Mode terang", "zenMode": "Mode zen", + "objectsSnapMode": "", "exitZenMode": "Keluar dari mode zen", "cancel": "Batal", "clear": "Hapus", "remove": "Hapus", + "embed": "", "publishLibrary": "Terbitkan", "submit": "Kirimkan", - "confirm": "Konfirmasi" + "confirm": "Konfirmasi", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Ini akan menghapus semua yang ada dikanvas. Apakah kamu yakin ?", @@ -196,6 +203,7 @@ "imageInsertError": "Tidak dapat menyisipkan gambar. Coba lagi nanti...", "fileTooBig": "File terlalu besar. Ukuran maksimum yang dibolehkan {{maxSize}}.", "svgImageInsertError": "Tidak dapat menyisipkan gambar SVG. Markup SVG sepertinya tidak valid.", + "failedToFetchImage": "", "invalidSVGString": "SVG tidak valid.", "cannotResolveCollabServer": "Tidak dapat terhubung ke server kolab. Muat ulang laman dan coba lagi.", "importLibraryError": "Tidak dapat memuat pustaka", @@ -206,6 +214,10 @@ "line2": "Ini dapat membuat Elemen Teks dalam gambar mu.", "line3": "Kami sangat menyarankan mematikan pengaturan ini. Anda dapat mengikuti langkah-langkah ini untuk melakukannya.", "line4": "Jika mematikan pengaturan ini tidak membenarkan tampilan elemen teks, mohon buka\nisu di GitHub kami, atau chat kami di Discord" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -223,9 +235,11 @@ "penMode": "Mode pena - mencegah sentuhan", "link": "Tambah/Perbarui tautan untuk bentuk yang dipilih", "eraser": "Penghapus", - "frame": "", + "frame": "Alat bingkai", + "embeddable": "", + "laser": "", "hand": "Tangan (alat panning)", - "extraTools": "" + "extraTools": "Alat-alat lain" }, "headings": { "canvasActions": "Opsi Kanvas", @@ -237,6 +251,7 @@ "linearElement": "Klik untuk memulai banyak poin, seret untuk satu baris", "freeDraw": "Klik dan seret, lepaskan jika Anda selesai", "text": "Tip: Anda juga dapat menambahkan teks dengan klik ganda di mana saja dengan alat pemilihan", + "embeddable": "", "text_selected": "Klik ganda atau tekan ENTER untuk edit teks", "text_editing": "Tekan Escape atau CtrlAtauCmd+ENTER untuk selesai mengedit", "linearElementMulti": "Klik pada titik akhir atau tekan Escape atau Enter untuk menyelesaikan", @@ -252,7 +267,8 @@ "bindTextToElement": "Tekan enter untuk tambahkan teks", "deepBoxSelect": "Tekan Ctrl atau Cmd untuk memilih yang di dalam, dan mencegah penggeseran", "eraserRevert": "Tahan Alt untuk mengembalikan elemen yang ditandai untuk dihapus", - "firefox_clipboard_write": "Fitur ini dapat diaktifkan melalui pengaturan flag \"dom.events.asyncClipboard.clipboardItem\" ke \"true\". Untuk mengganti flag di Firefox, pergi ke laman \"about:config\"." + "firefox_clipboard_write": "Fitur ini dapat diaktifkan melalui pengaturan flag \"dom.events.asyncClipboard.clipboardItem\" ke \"true\". Untuk mengganti flag di Firefox, pergi ke laman \"about:config\".", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Tidak dapat menampilkan pratinjau", @@ -360,27 +376,27 @@ "removeItemsFromLib": "Hapus item yang dipilih dari pustaka" }, "imageExportDialog": { - "header": "", + "header": "Ekspor gambar", "label": { - "withBackground": "", - "onlySelected": "", - "darkMode": "", - "embedScene": "", - "scale": "", - "padding": "" + "withBackground": "Latar", + "onlySelected": "Hanya yang dipilih", + "darkMode": "Mode gelap", + "embedScene": "Sematkan pemandangan", + "scale": "Skala", + "padding": "Lapisan" }, "tooltip": { - "embedScene": "" + "embedScene": "Data pemandangan akan disimpan dalam file PNG/SVG yang diekspor sehingga pemandangan itu dapat dipulihkan darinya.\nAkan membesarkan ukuran file yang diekspor." }, "title": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "Ekspor ke PNG", + "exportToSvg": "Ekspor ke SVG", + "copyPngToClipboard": "Salin PNG ke papan klip" }, "button": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "PNG", + "exportToSvg": "SVG", + "copyPngToClipboard": "Salin ke papan klip" } }, "encrypted": { @@ -411,7 +427,9 @@ "fileSavedToFilename": "Disimpan ke {filename}", "canvas": "kanvas", "selection": "pilihan", - "pasteAsSingleElement": "Gunakan {{shortcut}} untuk menempelkan sebagai satu elemen,\natau tempelkan ke teks editor yang ada" + "pasteAsSingleElement": "Gunakan {{shortcut}} untuk menempelkan sebagai satu elemen,\natau tempelkan ke teks editor yang ada", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Transparan", @@ -449,5 +467,36 @@ "shades": "Nuansa", "hexCode": "Kode hexa", "noShades": "Tidak ada nuansa untuk warna ini" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Ekspor sebagai gambar", + "button": "Ekspor sebagai gambar", + "description": "Ekspor data pemandangan sebagai gambar yang dapat anda impor nanti." + }, + "saveToDisk": { + "title": "Simpan ke disk", + "button": "Simpan ke disk", + "description": "Ekspor data pemandangan ke file yang dapat Anda dapat impor nanti." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Ekspor ke Excalidraw+", + "description": "Simpan pemandangan ke ruang kerja Excalidraw+ Anda." + } + }, + "modal": { + "loadFromFile": { + "title": "Muat dari file", + "button": "Muat dari file", + "description": "Memuat dari file yang akan menggantikan konten Anda sekarang.

Anda dapat mencadangkan gambar anda dulu menggunakan opsi-opsi ini." + }, + "shareableLink": { + "title": "Muat dari link", + "button": "Ganti konten saya", + "description": "Memuat dari file yang akan menggantikan konten Anda sekarang.

Anda dapat mencadangkan gambar anda dulu menggunakan opsi-opsi ini." + } + } } } diff --git a/src/locales/it-IT.json b/src/locales/it-IT.json index b1ff02efe..23490ed5e 100644 --- a/src/locales/it-IT.json +++ b/src/locales/it-IT.json @@ -109,8 +109,12 @@ "createContainerFromText": "Avvolgi il testo in un container", "link": { "edit": "Modifica link", + "editEmbed": "Modifica collegamento e incorpora", "create": "Crea link", - "label": "Link" + "createEmbed": "Crea collegamento e incorpora", + "label": "Link", + "labelEmbed": "Collega & incorpora", + "empty": "Nessun collegamento impostato" }, "lineEditor": { "edit": "Modifica linea", @@ -124,9 +128,9 @@ }, "statusPublished": "Pubblicato", "sidebarLock": "Mantieni aperta la barra laterale", - "selectAllElementsInFrame": "", - "removeAllElementsFromFrame": "", - "eyeDropper": "" + "selectAllElementsInFrame": "Seleziona tutti gli elementi nel riquadro", + "removeAllElementsFromFrame": "Rimuovi tutti gli elementi dal riquadro", + "eyeDropper": "Scegli il colore della tela" }, "library": { "noItems": "Nessun elemento ancora aggiunto...", @@ -160,13 +164,16 @@ "darkMode": "Tema scuro", "lightMode": "Tema chiaro", "zenMode": "Modalità Zen", + "objectsSnapMode": "Aggancia agli oggetti", "exitZenMode": "Uscire dalla modalità zen", "cancel": "Annulla", "clear": "Cancella", "remove": "Rimuovi", + "embed": "Attiva/disattiva incorporamento", "publishLibrary": "Pubblica", "submit": "Invia", - "confirm": "Conferma" + "confirm": "Conferma", + "embeddableInteractionButton": "Clicca per interagire" }, "alerts": { "clearReset": "Questa azione cancellerà l'intera tela. Sei sicuro?", @@ -196,6 +203,7 @@ "imageInsertError": "Non è stato possibile inserire l'immagine. Riprova più tardi...", "fileTooBig": "Il file è troppo grande. La dimensione massima consentita è {{maxSize}}.", "svgImageInsertError": "Impossibile inserire l'immagine SVG. Il markup SVG non sembra corretto.", + "failedToFetchImage": "", "invalidSVGString": "SVG non valido.", "cannotResolveCollabServer": "Impossibile connettersi al server di collab. Ricarica la pagina e riprova.", "importLibraryError": "Impossibile caricare la libreria", @@ -206,6 +214,10 @@ "line2": "Ciò potrebbe causare la rottura degli Elementi di testo nei tuoi disegni.", "line3": "Consigliamo vivamente di disabilitare questa impostazione. Puoi seguire questi passaggi su come farlo.", "line4": "Se la disattivazione di questa impostazione non risolve la visualizzazione degli elementi di testo, apri un problema sul nostro GitHub o scrivici su Discord" + }, + "libraryElementTypeError": { + "embeddable": "Gli elementi incorporabili non possono essere aggiunti alla libreria.", + "image": "Il supporto per l'aggiunta d'immagini alla libreria verrà aggiunto a breve!" } }, "toolBar": { @@ -223,7 +235,9 @@ "penMode": "Modalità penna - previene il tocco", "link": "Aggiungi/ aggiorna il link per una forma selezionata", "eraser": "Gomma", - "frame": "", + "frame": "Strumento riquadro", + "embeddable": "Incorporamento Web", + "laser": "Puntatore laser", "hand": "Mano (strumento di panoramica)", "extraTools": "Altri strumenti" }, @@ -237,6 +251,7 @@ "linearElement": "Clicca per iniziare una linea in più punti, trascina per singola linea", "freeDraw": "Clicca e trascina, rilascia quando avrai finito", "text": "Suggerimento: puoi anche aggiungere del testo facendo doppio clic ovunque con lo strumento di selezione", + "embeddable": "Fare click e trascina per creare un incorporamento web", "text_selected": "Fai doppio click o premi INVIO per modificare il testo", "text_editing": "Premi ESC o CtrlOCmd+INVIO per completare le modifiche", "linearElementMulti": "Clicca sull'ultimo punto o premi Esc o Invio per finire", @@ -252,7 +267,8 @@ "bindTextToElement": "Premi invio per aggiungere il testo", "deepBoxSelect": "Tieni premuto CtrlOCmd per selezionare in profondità e per impedire il trascinamento", "eraserRevert": "Tieni premuto Alt per ripristinare gli elementi contrassegnati per l'eliminazione", - "firefox_clipboard_write": "Questa funzione può essere abilitata impostando il flag \"dom.events.asyncClipboard.clipboardItem\" su \"true\". Per modificare i flag del browser in Firefox, visitare la pagina \"about:config\"." + "firefox_clipboard_write": "Questa funzione può essere abilitata impostando il flag \"dom.events.asyncClipboard.clipboardItem\" su \"true\". Per modificare i flag del browser in Firefox, visitare la pagina \"about:config\".", + "disableSnapping": "Tieni premuto Ctrl o Cmd per disabilitare lo snap" }, "canvasError": { "cannotShowPreview": "Impossibile visualizzare l'anteprima", @@ -367,7 +383,7 @@ "darkMode": "Tema scuro", "embedScene": "Includi scena", "scale": "Scala", - "padding": "" + "padding": "Rientro" }, "tooltip": { "embedScene": "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." @@ -411,7 +427,9 @@ "fileSavedToFilename": "Salvato in {filename}", "canvas": "tela", "selection": "selezione", - "pasteAsSingleElement": "Usa {{shortcut}} per incollare come un singolo elemento,\no incollare in un editor di testo esistente" + "pasteAsSingleElement": "Usa {{shortcut}} per incollare come un singolo elemento,\no incollare in un editor di testo esistente", + "unableToEmbed": "Incorporare questo url non è permesso. Crea una issue su GitHub per richiedere che l'url sia autorizzato", + "unrecognizedLinkFormat": "Il link che hai incorporato non corrisponde al formato previsto. Prova a incollare la stringa 'embed' fornita dal sito di origine" }, "colors": { "transparent": "Trasparente", @@ -449,5 +467,36 @@ "shades": "Sfumature", "hexCode": "Codice esadecimale", "noShades": "Nessuna sfumatura disponibile per questo colore" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Esporta come immagine", + "button": "Esporta come immagine", + "description": "Esporta i dati della scena come immagine, che potrai importare in seguito." + }, + "saveToDisk": { + "title": "Salva su disco", + "button": "Salva su disco", + "description": "Esporta i dati della scena su file, che potrai importare in seguito." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Esporta su Excalidraw+", + "description": "Salva la scena sul tuo spazio di lavoro Excalidraw+." + } + }, + "modal": { + "loadFromFile": { + "title": "Carica da file", + "button": "Carica da file", + "description": "Il caricamento da file sostituirà il contenuto esistente.

Puoi salvare il tuo disegno prima usando una delle opzioni qui sotto." + }, + "shareableLink": { + "title": "Carica da link", + "button": "Sostituisci il mio contenuto", + "description": "Il caricamento da file sostituirà il contenuto esistente.

Puoi salvare il tuo disegno prima usando una delle opzioni qui sotto." + } + } } } diff --git a/src/locales/ja-JP.json b/src/locales/ja-JP.json index 018752c23..8951739a6 100644 --- a/src/locales/ja-JP.json +++ b/src/locales/ja-JP.json @@ -50,7 +50,7 @@ "veryLarge": "特大", "solid": "ベタ塗り", "hachure": "斜線", - "zigzag": "", + "zigzag": "ジグザグ", "crossHatch": "網掛け", "thin": "細", "bold": "太字", @@ -106,11 +106,15 @@ "increaseFontSize": "フォントサイズを拡大", "unbindText": "テキストのバインド解除", "bindText": "テキストをコンテナにバインド", - "createContainerFromText": "", + "createContainerFromText": "コンテナ内でテキストを折り返す", "link": { "edit": "リンクを編集", + "editEmbed": "リンクの編集と埋め込み", "create": "リンクを作成", - "label": "リンク" + "createEmbed": "リンクの作成と埋め込み", + "label": "リンク", + "labelEmbed": "リンクと埋め込み", + "empty": "リンクが設定されていません" }, "lineEditor": { "edit": "行を編集", @@ -124,9 +128,9 @@ }, "statusPublished": "公開済み", "sidebarLock": "サイドバーを開いたままにする", - "selectAllElementsInFrame": "", - "removeAllElementsFromFrame": "", - "eyeDropper": "" + "selectAllElementsInFrame": "フレーム内のすべての要素を選択", + "removeAllElementsFromFrame": "フレーム内のすべての要素を削除", + "eyeDropper": "キャンバスから色を選択" }, "library": { "noItems": "まだアイテムが追加されていません…", @@ -160,13 +164,16 @@ "darkMode": "ダークモード", "lightMode": "ライトモード", "zenMode": "Zenモード", + "objectsSnapMode": "", "exitZenMode": "集中モードをやめる", "cancel": "キャンセル", "clear": "消去", "remove": "削除", + "embed": "埋め込みの切り替え", "publishLibrary": "公開", "submit": "送信", - "confirm": "確認" + "confirm": "確認", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "この操作によってキャンバス全体が消えます。よろしいですか?", @@ -196,16 +203,21 @@ "imageInsertError": "画像を挿入できませんでした。後でもう一度お試しください...", "fileTooBig": "ファイルが大きすぎます。許可される最大サイズは {{maxSize}} です。", "svgImageInsertError": "SVGイメージを挿入できませんでした。SVGマークアップは無効に見えます。", + "failedToFetchImage": "", "invalidSVGString": "無効なSVGです。", "cannotResolveCollabServer": "コラボレーションサーバに接続できませんでした。ページを再読み込みして、もう一度お試しください。", "importLibraryError": "ライブラリを読み込めませんでした。", "collabSaveFailed": "バックエンドデータベースに保存できませんでした。問題が解決しない場合は、作業を失わないようにローカルにファイルを保存してください。", "collabSaveFailed_sizeExceeded": "キャンバスが大きすぎるため、バックエンドデータベースに保存できませんでした。問題が解決しない場合は、作業を失わないようにローカルにファイルを保存してください。", "brave_measure_text_error": { - "line1": "", - "line2": "", - "line3": "", - "line4": "" + "line1": "Aggressly Block Fingerprinting の設定が有効なBraveブラウザを使用しているようです。", + "line2": "これにより、図面の テキスト要素 が壊れる可能性があります。", + "line3": "この設定を無効にすることを強く推奨します。 設定手順 をこちらから確認できます。", + "line4": "この設定を無効にすると、テキスト要素の表示が修正されません。 GitHub で Issue を開くか、 Discord にご記入ください" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -223,9 +235,11 @@ "penMode": "ペンモード - タッチ防止", "link": "選択した図形のリンクを追加/更新", "eraser": "消しゴム", - "frame": "", + "frame": "フレームツール", + "embeddable": "Web埋め込み", + "laser": "", "hand": "手 (パンニングツール)", - "extraTools": "" + "extraTools": "その他のツール" }, "headings": { "canvasActions": "キャンバス操作", @@ -237,6 +251,7 @@ "linearElement": "クリックすると複数の頂点からなる曲線を開始、ドラッグすると直線", "freeDraw": "クリックしてドラッグします。離すと終了します", "text": "ヒント: 選択ツールを使用して任意の場所をダブルクリックしてテキストを追加することもできます", + "embeddable": "", "text_selected": "テキストを編集するには、ダブルクリックまたはEnterキーを押します", "text_editing": "Esc キーまたは CtrlOrCmd+ENTER キーを押して編集を終了します", "linearElementMulti": "最後のポイントをクリックするか、エスケープまたはEnterを押して終了します", @@ -252,7 +267,8 @@ "bindTextToElement": "Enterを押してテキストを追加", "deepBoxSelect": "CtrlOrCmd を押し続けることでドラッグを抑止し、深い選択を行います", "eraserRevert": "Alt を押し続けることで削除マークされた要素を元に戻す", - "firefox_clipboard_write": "この機能は、\"dom.events.asyncClipboard.clipboardItem\" フラグを \"true\" に設定することで有効になる可能性があります。Firefox でブラウザーの設定を変更するには、\"about:config\" ページを参照してください。" + "firefox_clipboard_write": "この機能は、\"dom.events.asyncClipboard.clipboardItem\" フラグを \"true\" に設定することで有効になる可能性があります。Firefox でブラウザーの設定を変更するには、\"about:config\" ページを参照してください。", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "プレビューを表示できません", @@ -360,27 +376,27 @@ "removeItemsFromLib": "選択したアイテムをライブラリから削除" }, "imageExportDialog": { - "header": "", + "header": "画像をエクスポート", "label": { - "withBackground": "", + "withBackground": "背景", "onlySelected": "", - "darkMode": "", + "darkMode": "ダークモード", "embedScene": "", - "scale": "", - "padding": "" + "scale": "スケール", + "padding": "余白" }, "tooltip": { "embedScene": "" }, "title": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "PNG にエクスポート", + "exportToSvg": "SVG にエクスポート", + "copyPngToClipboard": "クリップボードにPNGをコピー" }, "button": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "PNG", + "exportToSvg": "SVG", + "copyPngToClipboard": "クリップボードにコピー" } }, "encrypted": { @@ -411,24 +427,26 @@ "fileSavedToFilename": "{filename} に保存しました", "canvas": "キャンバス", "selection": "選択", - "pasteAsSingleElement": "{{shortcut}} を使用して単一の要素として貼り付けるか、\n既存のテキストエディタに貼り付け" + "pasteAsSingleElement": "{{shortcut}} を使用して単一の要素として貼り付けるか、\n既存のテキストエディタに貼り付け", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "透明", - "black": "", - "white": "", - "red": "", - "pink": "", - "grape": "", - "violet": "", - "gray": "", - "blue": "", - "cyan": "", - "teal": "", - "green": "", - "yellow": "", - "orange": "", - "bronze": "" + "black": "黒", + "white": "白", + "red": "赤", + "pink": "ピンク", + "grape": "グレープ", + "violet": "バイオレット", + "gray": "灰色", + "blue": "青", + "cyan": "シアン", + "teal": "ティール", + "green": "緑", + "yellow": "黄", + "orange": "オレンジ", + "bronze": "ブロンズ" }, "welcomeScreen": { "app": { @@ -444,10 +462,41 @@ } }, "colorPicker": { - "mostUsedCustomColors": "", - "colors": "", - "shades": "", - "hexCode": "", + "mostUsedCustomColors": "最も使用されているカスタム色", + "colors": "色", + "shades": "影", + "hexCode": "Hexコード", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "画像としてエクスポート", + "button": "画像としてエクスポート", + "description": "" + }, + "saveToDisk": { + "title": "ディスクに保存", + "button": "ディスクに保存", + "description": "" + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Excalidraw+にエクスポート", + "description": "Excalidraw+ ワークスペースにシーンを保存します。" + } + }, + "modal": { + "loadFromFile": { + "title": "ファイルからロード", + "button": "ファイルからロード", + "description": "" + }, + "shareableLink": { + "title": "リンクからロード", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/kaa.json b/src/locales/kaa.json index 5b83e7d2e..c04589095 100644 --- a/src/locales/kaa.json +++ b/src/locales/kaa.json @@ -1,14 +1,14 @@ { "labels": { - "paste": "", - "pasteAsPlaintext": "", - "pasteCharts": "", + "paste": "Qoyıw", + "pasteAsPlaintext": "Ápiwayı tekst retinde qoyıw", + "pasteCharts": "Diagrammalardı qoyıw", "selectAll": "Barlıǵın tańlaw", "multiSelect": "", "moveCanvas": "", - "cut": "", + "cut": "Qıyıw", "copy": "Kóshirip alıw", - "copyAsPng": "", + "copyAsPng": "Almasıw buferine PNG retinde kóshirip alıw", "copyAsSvg": "", "copyText": "", "bringForward": "", @@ -18,8 +18,8 @@ "delete": "Óshiriw", "copyStyles": "", "pasteStyles": "", - "stroke": "", - "background": "", + "stroke": "Jiyek", + "background": "Fon", "fill": "", "strokeWidth": "", "strokeStyle": "", @@ -29,31 +29,31 @@ "sloppiness": "", "opacity": "", "textAlign": "", - "edges": "", + "edges": "Qırlar", "sharp": "", "round": "", "arrowheads": "", "arrowhead_none": "", - "arrowhead_arrow": "", + "arrowhead_arrow": "Jebe", "arrowhead_bar": "", - "arrowhead_dot": "", + "arrowhead_dot": "Noqat", "arrowhead_triangle": "", "fontSize": "Shrift ólshemi", "fontFamily": "", "addWatermark": "", "handDrawn": "", "normal": "", - "code": "", + "code": "Kod", "small": "", "medium": "", - "large": "", - "veryLarge": "", + "large": "Úlken", + "veryLarge": "Júdá úlken", "solid": "", "hachure": "", - "zigzag": "", + "zigzag": "Zigzag", "crossHatch": "", - "thin": "", - "bold": "", + "thin": "Jińishke", + "bold": "Qalıń", "left": "", "center": "", "right": "", @@ -71,19 +71,19 @@ "language": "Til", "liveCollaboration": "", "duplicateSelection": "Nusqa", - "untitled": "", + "untitled": "Atamasız", "name": "Ataması", "yourName": "Atıńız", - "madeWithExcalidraw": "", + "madeWithExcalidraw": "Excalidraw járdeminde islengen", "group": "", "ungroup": "", - "collaborators": "", + "collaborators": "Qatnasıwshılar", "showGrid": "", "addToLibrary": "Kitapxanaǵa qosıw", "removeFromLibrary": "Kitapxanadan alıp taslaw", "libraryLoadingMessage": "Kitapxana júklenbekte…", "libraries": "Kitapxanalardı kóriw", - "loadingScene": "", + "loadingScene": "Saxna júklenbekte…", "align": "", "alignTop": "", "alignBottom": "", @@ -99,22 +99,26 @@ "share": "Bólisiw", "showStroke": "", "showBackground": "", - "toggleTheme": "", - "personalLib": "", - "excalidrawLib": "", - "decreaseFontSize": "", - "increaseFontSize": "", + "toggleTheme": "Temanı ózgertiw", + "personalLib": "Jeke kitapxana", + "excalidrawLib": "Excalidraw kitapxanası", + "decreaseFontSize": "Shrift ólshemin kishireytiw", + "increaseFontSize": "Shrift ólshemin úlkeytiw", "unbindText": "", "bindText": "", "createContainerFromText": "", "link": { "edit": "Siltemeni ózgertiw", + "editEmbed": "", "create": "Siltemeni jaratıw", - "label": "Silteme" + "createEmbed": "", + "label": "Silteme", + "labelEmbed": "", + "empty": "" }, "lineEditor": { - "edit": "", - "exit": "" + "edit": "Qatardı ózgertiw", + "exit": "Qatardı ózgertiw redaktorınan shıǵıw" }, "elementLock": { "lock": "Qulıplaw", @@ -136,11 +140,11 @@ "buttons": { "clearReset": "", "exportJSON": "", - "exportImage": "", - "export": "", + "exportImage": "Súwretti eksportlaw...", + "export": "Retinde saqlaw...", "copyToClipboard": "Almasıw buferine kóshirip alındı", - "save": "", - "saveAs": "", + "save": "Ámeldegi faylǵa saqlaw", + "saveAs": "Retinde saqlaw", "load": "Ashıw", "getShareableLink": "", "close": "Jabıw", @@ -160,13 +164,16 @@ "darkMode": "Qarańǵı tema", "lightMode": "Jaqtı tema", "zenMode": "", + "objectsSnapMode": "", "exitZenMode": "", "cancel": "Biykarlaw", "clear": "Tazalaw", "remove": "Óshiriw", + "embed": "", "publishLibrary": "", "submit": "Jiberiw", - "confirm": "Tastıyıqlaw" + "confirm": "Tastıyıqlaw", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "", @@ -196,6 +203,7 @@ "imageInsertError": "", "fileTooBig": "", "svgImageInsertError": "", + "failedToFetchImage": "", "invalidSVGString": "Jaramsız SVG.", "cannotResolveCollabServer": "", "importLibraryError": "Kitapxananı júklew ámelge aspadı", @@ -206,12 +214,16 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { "selection": "", "image": "Súwret qoyıw", - "rectangle": "", + "rectangle": "Tórt múyeshlik", "diamond": "", "ellipse": "", "arrow": "", @@ -224,19 +236,22 @@ "link": "", "eraser": "Óshirgish", "frame": "", + "embeddable": "", + "laser": "", "hand": "", "extraTools": "" }, "headings": { "canvasActions": "", "selectedShapeActions": "", - "shapes": "" + "shapes": "Figuralar" }, "hints": { "canvasPanning": "", "linearElement": "", "freeDraw": "", "text": "", + "embeddable": "", "text_selected": "", "text_editing": "", "linearElementMulti": "", @@ -249,10 +264,11 @@ "lineEditor_nothingSelected": "", "placeImage": "", "publishLibrary": "", - "bindTextToElement": "", + "bindTextToElement": "Tekst qosıw ushın Enter túymesin basıń", "deepBoxSelect": "", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "", @@ -281,18 +297,18 @@ "title": "Qátelik" }, "exportDialog": { - "disk_title": "", + "disk_title": "Diskke saqlaw", "disk_details": "", - "disk_button": "", + "disk_button": "Faylǵa saqlaw", "link_title": "", "link_details": "", - "link_button": "", + "link_button": "Siltemege eksportlaw", "excalidrawplus_description": "", "excalidrawplus_button": "Eksportlaw", "excalidrawplus_exportError": "" }, "helpDialog": { - "blog": "", + "blog": "Biziń blogtı oqıń", "click": "basıw", "deepSelect": "", "deepBoxSelect": "", @@ -301,7 +317,7 @@ "documentation": "Hújjetshilik", "doubleClick": "", "drag": "", - "editor": "", + "editor": "Redaktor", "editLineArrowPoints": "", "editText": "", "github": "", @@ -333,7 +349,7 @@ "libraryDesc": "", "website": "Veb-sayt", "placeholder": { - "authorName": "", + "authorName": "Atıńız yamasa paydalanıwshı atı", "libraryName": "", "libraryDesc": "", "githubHandle": "", @@ -356,15 +372,15 @@ "content": "" }, "confirmDialog": { - "resetLibrary": "", + "resetLibrary": "Kitapxananı qayta ornatıw", "removeItemsFromLib": "" }, "imageExportDialog": { - "header": "", + "header": "Súwretti eksportlaw", "label": { - "withBackground": "", + "withBackground": "Fon", "onlySelected": "", - "darkMode": "", + "darkMode": "Qarańǵı tema", "embedScene": "", "scale": "", "padding": "" @@ -378,9 +394,9 @@ "copyPngToClipboard": "" }, "button": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "PNG", + "exportToSvg": "SVG", + "copyPngToClipboard": "Almasıw buferine kóshirip alıw" } }, "encrypted": { @@ -389,8 +405,8 @@ }, "stats": { "angle": "", - "element": "", - "elements": "", + "element": "Element", + "elements": "Elementler", "height": "", "scene": "Saxna", "selected": "Tańlandı", @@ -403,31 +419,33 @@ "width": "" }, "toast": { - "addedToLibrary": "", + "addedToLibrary": "Kitapxanaǵa qosıldı", "copyStyles": "", - "copyToClipboard": "", + "copyToClipboard": "Almasıw buferine kóshirip alındı.", "copyToClipboardAsPng": "", "fileSaved": "Fayl saqlandı.", "fileSavedToFilename": "{filename} saqlandı", "canvas": "", "selection": "", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "", - "black": "", - "white": "", - "red": "", - "pink": "", + "black": "Qara", + "white": "Aq", + "red": "Qızıl", + "pink": "Qızǵılt", "grape": "", - "violet": "", + "violet": "Qızǵılt kók", "gray": "", - "blue": "", - "cyan": "", - "teal": "", - "green": "", - "yellow": "", - "orange": "", + "blue": "Kók", + "cyan": "Kók aspan", + "teal": "Piruza", + "green": "Jasıl", + "yellow": "Sarı", + "orange": "Qızǵılt sarı", "bronze": "" }, "welcomeScreen": { @@ -445,9 +463,40 @@ }, "colorPicker": { "mostUsedCustomColors": "", - "colors": "", + "colors": "Reńler", "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Súwret retinde eksportlaw", + "button": "Súwret retinde eksportlaw", + "description": "" + }, + "saveToDisk": { + "title": "Diskke saqlaw", + "button": "Diskke saqlaw", + "description": "" + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "Fayldan júklew", + "button": "Fayldan júklew", + "description": "" + }, + "shareableLink": { + "title": "Siltemeden júklew", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/kab-KAB.json b/src/locales/kab-KAB.json index a0465c654..ffd3aa079 100644 --- a/src/locales/kab-KAB.json +++ b/src/locales/kab-KAB.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "Ẓreg aseɣwen", + "editEmbed": "", "create": "Snulfu-d aseɣwen", - "label": "Aseɣwen" + "createEmbed": "", + "label": "Aseɣwen", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "Ẓreg izirig", @@ -160,13 +164,16 @@ "darkMode": "Askar imsulles", "lightMode": "Askar afaw", "zenMode": "Askar Zen", + "objectsSnapMode": "", "exitZenMode": "Ffeɣ seg uskar Zen", "cancel": "Sefsex", "clear": "Sfeḍ", "remove": "Kkes", + "embed": "", "publishLibrary": "Ẓreg", "submit": "Azen", - "confirm": "Sentem" + "confirm": "Sentem", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Ayagi ad isfeḍ akk taɣzut n usuneɣ. Tetḥeqqeḍ?", @@ -196,6 +203,7 @@ "imageInsertError": "D awezɣi tugra n tugna. Eɛreḍ tikkelt-nniḍen ardeqqal...", "fileTooBig": "Afaylu meqqer aṭas. Tiddi tafellayt yurgen d {{maxSize}}.", "svgImageInsertError": "D awezɣi tugra n tugna SVG. Acraḍ SVG yettban-d d armeɣtu.", + "failedToFetchImage": "", "invalidSVGString": "SVG armeɣtu.", "cannotResolveCollabServer": "Ulamek tuqqna s aqeddac n umyalel. Ma ulac uɣilif ales asali n usebter sakin eɛreḍ tikkelt-nniḍen.", "importLibraryError": "Ur d-ssalay ara tamkarḍit", @@ -206,6 +214,10 @@ "line2": "Ayagi yezmer ad d-iglu s truẓi nIferdisen n uḍrisdeg wunuɣen-inek.", "line3": "Ad k-nsemter ad tsexsiḍ aɣewwar-agi. Tzemreḍ ad tḍefreḍisurifen-agi ɣef wamek ara txedmeḍ.", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Rnu/leqqem aseɣwen i talɣa yettwafernen", "eraser": "Sfeḍ", "frame": "", + "embeddable": "", + "laser": "", "hand": "Afus (afecku n usmutti n tmuɣli)", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Ssit akken ad tebduḍ aṭas n tenqiḍin, zuɣer i yiwen n yizirig", "freeDraw": "Ssit yerna zuɣer, serreḥ ticki tfukeḍ", "text": "Tixidest: tzemreḍ daɣen ad ternuḍ aḍris s usiti snat n tikkal anida tebɣiḍ s ufecku n tefrayt", + "embeddable": "", "text_selected": "Ssit snat n tikkal neɣ ssed taqeffalt Kcem akken ad tẓergeḍ aḍris", "text_editing": "Ssit Escape neɣ CtrlOrCmd+ENTER akken ad tfakkeḍ asiẓreg", "linearElementMulti": "Ssit ɣef tenqiḍt taneggarut neɣ ssed taqeffalt Escape neɣ taqeffalt Kcem akken ad tfakkeḍ", @@ -252,7 +267,8 @@ "bindTextToElement": "Ssed ɣef kcem akken ad ternuḍ aḍris", "deepBoxSelect": "Ṭṭef CtrlOrCmd akken ad tferneḍ s telqey, yerna ad trewleḍ i uzuɣer", "eraserRevert": "Ssed Alt akken ad tsefsxeḍ iferdisen yettwacerḍen i tukksa", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Ulamek abeqqeḍ n teskant", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Yettwasekles di {filename}", "canvas": "taɣzut n usuneɣ", "selection": "tafrayt", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Afrawan", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/kk-KZ.json b/src/locales/kk-KZ.json index e960a1325..fd86a8ba7 100644 --- a/src/locales/kk-KZ.json +++ b/src/locales/kk-KZ.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "", + "editEmbed": "", "create": "", - "label": "" + "createEmbed": "", + "label": "", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "", @@ -160,13 +164,16 @@ "darkMode": "", "lightMode": "", "zenMode": "", + "objectsSnapMode": "", "exitZenMode": "", "cancel": "", "clear": "", "remove": "", + "embed": "", "publishLibrary": "", "submit": "", - "confirm": "" + "confirm": "", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "", @@ -196,6 +203,7 @@ "imageInsertError": "Суретті жүктеу мүмкін болмады. Кейінірек қайталап көріңіз...", "fileTooBig": "Файл өте үлкен. Максималды рұқсат етілген көлем {{maxSize}}.", "svgImageInsertError": "", + "failedToFetchImage": "", "invalidSVGString": "", "cannotResolveCollabServer": "", "importLibraryError": "", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "", "eraser": "", "frame": "", + "embeddable": "", + "laser": "", "hand": "", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "", "freeDraw": "", "text": "", + "embeddable": "", "text_selected": "", "text_editing": "", "linearElementMulti": "", @@ -252,7 +267,8 @@ "bindTextToElement": "", "deepBoxSelect": "", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "", @@ -411,7 +427,9 @@ "fileSavedToFilename": "{filename} сақталды", "canvas": "", "selection": "таңдау", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/km-KH.json b/src/locales/km-KH.json index ff51abd8d..9ad1ac345 100644 --- a/src/locales/km-KH.json +++ b/src/locales/km-KH.json @@ -109,8 +109,12 @@ "createContainerFromText": "រុំអត្ថបទក្នុងប្រអប់មួយ", "link": { "edit": "កែតំណភ្ជាប់", + "editEmbed": "", "create": "បង្កើតតំណភ្ជាប់", - "label": "តំណ" + "createEmbed": "", + "label": "តំណ", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "កែសម្រួលបន្ទាត់", @@ -160,13 +164,16 @@ "darkMode": "ម៉ូដងងឹត", "lightMode": "ម៉ូដភ្លឺ", "zenMode": "ម៉ូត Zen", + "objectsSnapMode": "", "exitZenMode": "ចេញពី zen​ ម៉ូត", "cancel": "បោះបង់", "clear": "សម្អាត", "remove": "ដកចេញ", + "embed": "", "publishLibrary": "បោះពុម្ពផ្សាយ", "submit": "ដាក់​ស្នើ", - "confirm": "បញ្ជាក់" + "confirm": "បញ្ជាក់", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "វានឹងសម្អាតបាវទាំងមូល។ តើ​អ្នក​ប្រាកដ​ឬ​អត់?", @@ -196,6 +203,7 @@ "imageInsertError": "មិនអាចបញ្ចូលរូបភាពបានទេ។ សូម​ព្យាយាម​ម្តង​ទៀត​នៅ​ពេល​ក្រោយ……", "fileTooBig": "ឯកសារធំពេក។ ទំហំអតិបរមាដែលអនុញ្ញាតគឺ {{maxSize}}។", "svgImageInsertError": "មិនអាចបញ្ចូលរូបភាព SVG បានទេ។ ស្លាក SVG ហាក់ដូចជាមិនត្រឹមត្រូវ។", + "failedToFetchImage": "", "invalidSVGString": "SVG មិន​ត្រឹមត្រូវ។", "cannotResolveCollabServer": "មិនអាចភ្ជាប់ទៅម៉ាស៊ីនមេសហការផ្ទាល់បានទេ។ សូមផ្ទុកទំព័រឡើងវិញ ហើយព្យាយាមម្តងទៀត។", "importLibraryError": "មិនអាចផ្ទុកបណ្ណាល័យបានទេ។", @@ -206,6 +214,10 @@ "line2": "វាអាចបណ្តាលឱ្យមានការបំបែក ធាតុអត្ថបទ នៅក្នុងគំនូររបស់អ្នក។", "line3": "យើងណែនាំយ៉ាងមុតមាំឱ្យបិទការកំណត់នេះ។ អ្នកអាចអនុវត្តតាម ជំហានទាំងនេះ ដើម្បីបិទការកំណត់នេះ។", "line4": "ប្រសិនបើការបិទការកំណត់នេះមិនបានជួសជុលការបង្ហាញធាតុអត្ថបទទេ សូមដាក់ issue នៅលើ GitHub ឬរាយការណ៍នៅលើ Discord របស់យើង" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "បន្ថែម/ធ្វើបច្ចុប្បន្នភាពតំណភ្ជាប់សម្រាប់រូបរាងដែលបានជ្រើសរើស", "eraser": "ជ័រលុប", "frame": "", + "embeddable": "", + "laser": "", "hand": "ដៃ (panning tool)", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "ចុចដើម្បីបង្កើតចំណុចច្រើន អូសដើម្បីបង្កើតបន្ទាត់មួយ", "freeDraw": "ចុច​ហើយ​អូស លែង​ពេល​រួចរាល់", "text": "គន្លឹះ៖ អ្នកក៏អាចបន្ថែមអត្ថបទដោយចុចពីរដងនៅកន្លែងណាមួយដោយប្រើឧបករណ៍ជ្រើសរើស", + "embeddable": "", "text_selected": "ចុចពីរដង ឬចុច ENTER ដើម្បីកែសម្រួលអត្ថបទ", "text_editing": "ចុច Escape ឬ CtrlOrCmd +ENTER ដើម្បីបញ្ចប់ការកែសម្រួល", "linearElementMulti": "ចុចលើចំណុចចុងក្រោយ ឬចុច Esc/Enter ដើម្បីបញ្ចប់", @@ -252,7 +267,8 @@ "bindTextToElement": "ចុច Enter ដើម្បីបន្ថែមអត្ថបទ", "deepBoxSelect": "សង្កត់ CtrlOrCmd ដើម្បីជ្រើសរើសយ៉ាងជ្រៅ និងជៀសវាងការអូស", "eraserRevert": "សង្កត់ Alt ដើម្បីដកការជ្រើសរើសធាតុដែលត្រូវបានសម្គាល់សម្រាប់ការលុប", - "firefox_clipboard_write": "បើកមុខងារនេះដោយកំណត់ទង់ \"dom.events.asyncClipboard.clipboardItem\" ទៅ \"true\" \nដើម្បីផ្លាស់ប្តូរទង់កម្មវិធីរុករកនៅក្នុង Firefox សូមចូលទៅកាន់ទំព័រ \"about:config\"។" + "firefox_clipboard_write": "បើកមុខងារនេះដោយកំណត់ទង់ \"dom.events.asyncClipboard.clipboardItem\" ទៅ \"true\" \nដើម្បីផ្លាស់ប្តូរទង់កម្មវិធីរុករកនៅក្នុង Firefox សូមចូលទៅកាន់ទំព័រ \"about:config\"។", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "មិនអាចបង្ហាញការមើលជាមុនបាន", @@ -411,7 +427,9 @@ "fileSavedToFilename": "បានរក្សាទុកនៅក្នុង {filename}", "canvas": "តំបន់គំនូរ", "selection": "ការជ្រើសរើស", - "pasteAsSingleElement": "ប្រើ {{shortcut}} ដើម្បីបិទភ្ជាប់ជាធាតុតែមួយ,\nឬបិទភ្ជាប់ទៅក្នុងកម្មវិធីនិពន្ធអត្ថបទដែលមានស្រាប់" + "pasteAsSingleElement": "ប្រើ {{shortcut}} ដើម្បីបិទភ្ជាប់ជាធាតុតែមួយ,\nឬបិទភ្ជាប់ទៅក្នុងកម្មវិធីនិពន្ធអត្ថបទដែលមានស្រាប់", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "ថ្លាមើលធ្លុះ", @@ -449,5 +467,36 @@ "shades": "ស្រមោល", "hexCode": "លេខកូដ hex", "noShades": "មិនមានស្រមោលសម្រាប់ពណ៌នេះទេ" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/ko-KR.json b/src/locales/ko-KR.json index c6337bc8d..fb59bea0b 100644 --- a/src/locales/ko-KR.json +++ b/src/locales/ko-KR.json @@ -109,8 +109,12 @@ "createContainerFromText": "텍스트를 컨테이너에 담기", "link": { "edit": "링크 수정하기", + "editEmbed": "링크 & 임베드 수정하기", "create": "링크 만들기", - "label": "링크" + "createEmbed": "링크 & 임베드 만들기", + "label": "링크", + "labelEmbed": "링크 & 임베드", + "empty": "링크를 지정하지 않았습니다" }, "lineEditor": { "edit": "선 수정하기", @@ -160,13 +164,16 @@ "darkMode": "다크 모드", "lightMode": "밝은 모드", "zenMode": "젠 모드", + "objectsSnapMode": "다른 요소들에 정렬시키기", "exitZenMode": "젠 모드 종료하기", "cancel": "취소", "clear": "지우기", "remove": "삭제", + "embed": "임베딩 토글", "publishLibrary": "게시하기", "submit": "제출", - "confirm": "확인" + "confirm": "확인", + "embeddableInteractionButton": "클릭하여 상호작용" }, "alerts": { "clearReset": "모든 작업 내용이 초기화됩니다. 계속하시겠습니까?", @@ -196,6 +203,7 @@ "imageInsertError": "이미지를 삽입할 수 없습니다. 나중에 다시 시도 하십시오", "fileTooBig": "파일이 너무 큽니다. 최대 크기는 {{maxSize}} 입니다.", "svgImageInsertError": "SVG 이미지를 삽입하지 못했습니다. SVG 문법이 유효하지 않은 것 같습니다.", + "failedToFetchImage": "이미지를 가져오는데 실패했습니다.", "invalidSVGString": "유효하지 않은 SVG입니다.", "cannotResolveCollabServer": "협업 서버에 접속하는데 실패했습니다. 페이지를 새로고침하고 다시 시도해보세요.", "importLibraryError": "라이브러리를 불러오지 못했습니다.", @@ -206,6 +214,10 @@ "line2": "이 기능으로 인해 화이트보드의 텍스트 요소들이 손상될 수 있습니다.", "line3": "저희는 해당 기능을 비활성화하는 것을 강력히 권장 드립니다. 비활성화 방법에 대해서는 이 게시글을 참고해주세요.", "line4": "만약 이 설정을 껐음에도 텍스트 요소들이 올바르게 표시되지 않는다면, 저희 Github에 이슈를 올려주시거나 Discord로 알려주세요." + }, + "libraryElementTypeError": { + "embeddable": "임베드 요소들은 라이브러리에 추가할 수 없습니다.", + "image": "라이브러리에 이미지 삽입 기능은 곧 지원될 예정입니다!" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "선택한 도형에 대해서 링크를 추가/업데이트", "eraser": "지우개", "frame": "프레임 도구", + "embeddable": "웹 임베드", + "laser": "레이저 포인터", "hand": "손 (패닝 도구)", "extraTools": "다른 도구" }, @@ -237,6 +251,7 @@ "linearElement": "여러 점을 연결하려면 클릭하고, 직선을 그리려면 바로 드래그하세요.", "freeDraw": "클릭 후 드래그하세요. 완료되면 놓으세요.", "text": "팁: 선택 툴로 아무 곳이나 더블 클릭해 텍스트를 추가할 수도 있습니다.", + "embeddable": "클릭 및 드래그하여 웹사이트 임베드 만들기", "text_selected": "더블 클릭 또는 ENTER를 눌러서 텍스트 수정", "text_editing": "ESC나 CtrlOrCmd+ENTER를 눌러서 수정을 종료하기", "linearElementMulti": "마지막 지점을 클릭하거나 Esc 또는 Enter 키를 눌러 완료하세요.", @@ -252,7 +267,8 @@ "bindTextToElement": "Enter 키를 눌러서 텍스트 추가하기", "deepBoxSelect": "CtrlOrCmd 키를 눌러서 깊게 선택하고, 드래그하지 않도록 하기", "eraserRevert": "Alt를 눌러서 삭제하도록 지정된 요소를 되돌리기", - "firefox_clipboard_write": "이 기능은 설정에서 \"dom.events.asyncClipboard.clipboardItem\" 플래그를 \"true\"로 설정하여 활성화할 수 있습니다. Firefox에서 브라우저 플래그를 수정하려면, \"about:config\" 페이지에 접속하세요." + "firefox_clipboard_write": "이 기능은 설정에서 \"dom.events.asyncClipboard.clipboardItem\" 플래그를 \"true\"로 설정하여 활성화할 수 있습니다. Firefox에서 브라우저 플래그를 수정하려면, \"about:config\" 페이지에 접속하세요.", + "disableSnapping": "CtrlOrCmd 키를 눌러서 다른 요소와의 정렬 무시하기" }, "canvasError": { "cannotShowPreview": "미리보기를 볼 수 없습니다", @@ -411,7 +427,9 @@ "fileSavedToFilename": "{filename} 로 저장되었습니다", "canvas": "캔버스", "selection": "선택한 요소", - "pasteAsSingleElement": "단일 요소로 붙여넣거나, 기존 텍스트 에디터에 붙여넣으려면 {{shortcut}} 을 사용하세요." + "pasteAsSingleElement": "단일 요소로 붙여넣거나, 기존 텍스트 에디터에 붙여넣으려면 {{shortcut}} 을 사용하세요.", + "unableToEmbed": "이 URL의 임베딩이 허용되지 않았습니다. GitHub에 이슈를 남겨서 이 URL이 화이트리스트에 등재될 수 있도록 요청하세요", + "unrecognizedLinkFormat": "임베딩하려는 링크의 형식이 잘못된 것 같습니다. 원본 사이트에서 제공하는 \"임베딩\" 텍스트를 그대로 붙여 넣어 주세요" }, "colors": { "transparent": "투명", @@ -444,10 +462,41 @@ } }, "colorPicker": { - "mostUsedCustomColors": "많이 쓰이는 사용자 색상들", + "mostUsedCustomColors": "가장 많이 사용된 색상들", "colors": "색상", "shades": "색조", "hexCode": "Hex 코드", "noShades": "사용할 수 있는 색조가 없음" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "이미지로 내보내기", + "button": "이미지로 내보내기", + "description": "나중에 다시 불러올 수 있도록 화면 데이터를 이미지로 내보냅니다." + }, + "saveToDisk": { + "title": "디스크에 저장", + "button": "디스크에 저장", + "description": "나중에 다시 불러올 수 있도록 화면 데이터를 내보냅니다." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Excalidraw+로 내보내기", + "description": "화면을 당신의 Excalidraw+ 작업 공간으로 저장합니다." + } + }, + "modal": { + "loadFromFile": { + "title": "파일에서 불러오기", + "button": "파일에서 불러오기", + "description": "파일을 불러오면 현재 작성된 데이터를 덮어쓰게 됩니다.

다음 옵션 중 하나를 선택하여 작업물을 백업해 둘 수 있습니다." + }, + "shareableLink": { + "title": "주소에서 불러오기", + "button": "컨텐츠를 덮어쓰기", + "description": "외부 작업물을 불러오면 현재 작성된 데이터를 덮어쓰게 됩니다.

다음 옵션 중 하나를 선택하여 작업물을 백업해 둘 수 있습니다." + } + } } } diff --git a/src/locales/ku-TR.json b/src/locales/ku-TR.json index 7f83c67cb..b968d0163 100644 --- a/src/locales/ku-TR.json +++ b/src/locales/ku-TR.json @@ -109,8 +109,12 @@ "createContainerFromText": "دەق لە چوارچێوەیەکدا بپێچە", "link": { "edit": "دەستکاریکردنی بەستەر", + "editEmbed": "", "create": "دروستکردنی بەستەر", - "label": "بەستەر" + "createEmbed": "", + "label": "بەستەر", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "دەستکاری کردنی دێڕ", @@ -160,13 +164,16 @@ "darkMode": "دۆخی تاریک", "lightMode": "دۆخی ڕووناک", "zenMode": "دۆخی زێن", + "objectsSnapMode": "", "exitZenMode": "بەجێهێشتنی دۆخی زێن", "cancel": "هەڵوەشاندنەوە", "clear": "خاوێنکردنەوە", "remove": "لابردن", + "embed": "", "publishLibrary": "بڵاوکردنەوە", "submit": "پێشکەشکردن", - "confirm": "دوپاتکردنەوە" + "confirm": "دوپاتکردنەوە", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "ئەمە هەموو تابلۆکە خاوێن دەکاتەوە، دڵنیایت؟", @@ -196,6 +203,7 @@ "imageInsertError": "نەیتوانی وێنە داخڵ بکات. دواتر هەوڵ بدە", "fileTooBig": "فایلەکە زۆر گەورەیە. زۆرترین قەبارەی ڕێگەپێدراو {{maxSize}}}.", "svgImageInsertError": "نەیتوانی وێنەی SVG داخڵ بکات. نیشانەی ئێس ڤی جی نادروست دیارە.", + "failedToFetchImage": "", "invalidSVGString": "ئێس ڤی جی نادروستە.", "cannotResolveCollabServer": "ناتوانێت پەیوەندی بکات بە سێرڤەری کۆلاب. تکایە لاپەڕەکە دووبارە باربکەوە و دووبارە هەوڵ بدەوە.", "importLibraryError": "نەیتوانی کتێبخانە بار بکات", @@ -206,6 +214,10 @@ "line2": "ئەمە ئەکرێ ببێتە هۆی تێکدانی دانە دەقییەکان لە وێنەکێشانەکانتدا.", "line3": "ئێمە بە توندی پێشنیاری لەکارخستنی ئەم ڕێکخستنە دەکەین. بۆ لە کارخستنی دەتوانیت بەم هەنگاوانەدا بڕۆیت.", "line4": "ئەگەر لەکارخستنی ئەم ڕێکخستنە نەبوە هۆی چاککردنەوەی پێشاندانی دانە دەقییەکان، تکایە کێشەیەک بکەرەوە لەسەر گیتهەبەکەمان، یان بۆمان بنوسە لەسەر دیسکۆرد" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "زیادکردن/ نوێکردنەوەی لینک بۆ شێوەی دیاریکراو", "eraser": "سڕەر", "frame": "ئامرازی چوارچێوە", + "embeddable": "", + "laser": "", "hand": "دەست (ئامرازی پانکردن)", "extraTools": "ئامرازی زیاتر" }, @@ -237,6 +251,7 @@ "linearElement": "کرتە بکە بۆ دەستپێکردنی چەند خاڵێک، ڕایبکێشە بۆ یەک هێڵ", "freeDraw": "کرتە بکە و ڕایبکێشە، کاتێک تەواو بوویت دەست هەڵگرە", "text": "زانیاری: هەروەها دەتوانیت دەق زیادبکەیت بە دوو کرتەکردن لە هەر شوێنێک لەگەڵ ئامڕازی دەستنیشانکردن", + "embeddable": "", "text_selected": "دووجار کلیک بکە یان ENTER بکە بۆ دەستکاریکردنی دەق", "text_editing": "بۆ تەواوکردنی دەستکاریکردنەکە Escape یان Ctrl/Cmd+ENTER بکە", "linearElementMulti": "کلیک لەسەر کۆتا خاڵ بکە یان Escape یان Enter بکە بۆ تەواوکردن", @@ -252,7 +267,8 @@ "bindTextToElement": "بۆ زیادکردنی دەق enter بکە", "deepBoxSelect": "CtrlOrCmd ڕابگرە بۆ هەڵبژاردنی قووڵ، و بۆ ڕێگریکردن لە ڕاکێشان", "eraserRevert": "بۆ گەڕاندنەوەی ئەو توخمانەی کە بۆ سڕینەوە نیشانە کراون، Alt ڕابگرە", - "firefox_clipboard_write": "ئەم تایبەتمەندییە بە ئەگەرێکی زۆرەوە دەتوانرێت چالاک بکرێت بە ڕێکخستنی ئاڵای \"dom.events.asyncClipboard.clipboardItem\" بۆ \"true\". بۆ گۆڕینی ئاڵاکانی وێبگەڕ لە فایەرفۆکسدا، سەردانی لاپەڕەی \"about:config\" بکە." + "firefox_clipboard_write": "ئەم تایبەتمەندییە بە ئەگەرێکی زۆرەوە دەتوانرێت چالاک بکرێت بە ڕێکخستنی ئاڵای \"dom.events.asyncClipboard.clipboardItem\" بۆ \"true\". بۆ گۆڕینی ئاڵاکانی وێبگەڕ لە فایەرفۆکسدا، سەردانی لاپەڕەی \"about:config\" بکە.", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "ناتوانرێ پێشبینین پیشان بدرێت", @@ -411,7 +427,9 @@ "fileSavedToFilename": "هەڵگیراوە بۆ {filename}", "canvas": "تابلۆ", "selection": "دەستنیشانکراوەکان", - "pasteAsSingleElement": "بۆ دانانەوە وەکو یەک توخم یان دانانەوە بۆ نێو دەسکاریکەرێکی دەق کە بوونی هەیە {{shortcut}} بەکاربهێنە" + "pasteAsSingleElement": "بۆ دانانەوە وەکو یەک توخم یان دانانەوە بۆ نێو دەسکاریکەرێکی دەق کە بوونی هەیە {{shortcut}} بەکاربهێنە", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "ڕوون", @@ -449,5 +467,36 @@ "shades": "سێبەرەکان", "hexCode": "کۆدی هێکس", "noShades": "هیچ سێبەرێک بۆ ئەم ڕەنگە بەردەست نییە" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/lt-LT.json b/src/locales/lt-LT.json index ee2fc79bc..5dc9b3328 100644 --- a/src/locales/lt-LT.json +++ b/src/locales/lt-LT.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "Redeguoti nuorodą", + "editEmbed": "", "create": "Sukurti nuorodą", - "label": "Nuoroda" + "createEmbed": "", + "label": "Nuoroda", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "", @@ -160,13 +164,16 @@ "darkMode": "Tamsus režimas", "lightMode": "Šviesus režimas", "zenMode": "„Zen“ režimas", + "objectsSnapMode": "", "exitZenMode": "Išeiti iš „Zen“ režimo", "cancel": "Atšaukti", "clear": "Išvalyti", "remove": "Pašalinti", + "embed": "", "publishLibrary": "Paskelbti", "submit": "Pateikti", - "confirm": "Patvirtinti" + "confirm": "Patvirtinti", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "", @@ -196,6 +203,7 @@ "imageInsertError": "Nepyko įkelti paveiksliuko. Pabandyk vėliau...", "fileTooBig": "Per didelis failas. Didžiausias leidžiamas dydis yra {{maxSize}}.", "svgImageInsertError": "Nepavyko įtraukti SVG paveiksliuko. Panašu, jog SVG yra nevalidus.", + "failedToFetchImage": "", "invalidSVGString": "Nevalidus SVG.", "cannotResolveCollabServer": "Nepavyko prisijungti prie serverio bendradarbiavimui. Perkrauk puslapį ir pabandyk prisijungti dar kartą.", "importLibraryError": "Nepavyko įkelti bibliotekos", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Pridėti / Atnaujinti pasirinktos figūros nuorodą", "eraser": "Trintukas", "frame": "", + "embeddable": "", + "laser": "", "hand": "", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Paspaudimai sukurs papildomus taškus, nepertraukiamas tempimas sukurs liniją", "freeDraw": "Spausk ir tempk, paleisk kai norėsi pabaigti", "text": "Užuomina: tekstą taip pat galima pridėti bet kur su dvigubu pelės paspaudimu, kol parinkas žymėjimo įrankis", + "embeddable": "", "text_selected": "", "text_editing": "", "linearElementMulti": "", @@ -252,7 +267,8 @@ "bindTextToElement": "", "deepBoxSelect": "", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Išsaugota į {filename}", "canvas": "drobė", "selection": "", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Permatoma", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/lv-LV.json b/src/locales/lv-LV.json index ec9a7e392..df142b63b 100644 --- a/src/locales/lv-LV.json +++ b/src/locales/lv-LV.json @@ -109,8 +109,12 @@ "createContainerFromText": "Ietilpināt tekstu figurā", "link": { "edit": "Rediģēt saiti", + "editEmbed": "", "create": "Izveidot saiti", - "label": "Saite" + "createEmbed": "", + "label": "Saite", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "Rediģēt līniju", @@ -160,13 +164,16 @@ "darkMode": "Tumšais režīms", "lightMode": "Gaišais režīms", "zenMode": "Zen režīms", + "objectsSnapMode": "", "exitZenMode": "Pamest Zen režīmu", "cancel": "Atcelt", "clear": "Notīrīt", "remove": "Noņemt", + "embed": "", "publishLibrary": "Publicēt", "submit": "Iesniegt", - "confirm": "Apstiprināt" + "confirm": "Apstiprināt", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Šī funkcija notīrīs visu tāfeli. Vai turpināt?", @@ -196,6 +203,7 @@ "imageInsertError": "Nevarēja ievietot attēlu. Mēģiniet vēlāk...", "fileTooBig": "Datne ir par lielu. Lielākais atļautais izmērs ir {{maxSize}}.", "svgImageInsertError": "Nevarēja ievietot SVG attēlu. Šķiet, ka SVG marķējums nav derīgs.", + "failedToFetchImage": "", "invalidSVGString": "Nederīgs SVG.", "cannotResolveCollabServer": "Nevarēja savienoties ar sadarbošanās serveri. Lūdzu, pārlādējiet lapu un mēģiniet vēlreiz.", "importLibraryError": "Nevarēja ielādēt bibliotēku", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Pievienot/rediģēt atlasītās figūras saiti", "eraser": "Dzēšgumija", "frame": "", + "embeddable": "", + "laser": "", "hand": "Roka (panoramēšanas rīks)", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Klikšķiniet, lai sāktu zīmēt vairākus punktus; velciet, lai zīmētu līniju", "freeDraw": "Spiediet un velciet; atlaidiet, kad pabeidzat", "text": "Ieteikums: lai pievienotu tekstu, varat arī jebkur dubultklikšķināt ar atlases rīku", + "embeddable": "", "text_selected": "Dubultklikšķiniet vai spiediet ievades taustiņu, lai rediģētu tekstu", "text_editing": "Spiediet iziešanas taustiņu vai CtrlOrCmd+ENTER, lai beigtu rediģēt", "linearElementMulti": "Klikšķiniet uz pēdējā punkta vai spiediet izejas vai ievades taustiņu, lai pabeigtu", @@ -252,7 +267,8 @@ "bindTextToElement": "Spiediet ievades taustiņu, lai pievienotu tekstu", "deepBoxSelect": "Turient nospiestu Ctrl vai Cmd, lai atlasītu dziļumā un lai nepieļautu objektu pavilkšanu", "eraserRevert": "Turiet Alt, lai noņemtu elementus no dzēsšanas atlases", - "firefox_clipboard_write": "Šis iestatījums var tikt ieslēgts ar \"dom.events.asyncClipboard.clipboardItem\" marķieri pārslēgtu uz \"true\". Lai mainītu pārlūka marķierus Firefox, apmeklē \"about:config\" lapu." + "firefox_clipboard_write": "Šis iestatījums var tikt ieslēgts ar \"dom.events.asyncClipboard.clipboardItem\" marķieri pārslēgtu uz \"true\". Lai mainītu pārlūka marķierus Firefox, apmeklē \"about:config\" lapu.", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Nevar rādīt priekšskatījumu", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Saglabāts kā {filename}", "canvas": "tāfeli", "selection": "atlasi", - "pasteAsSingleElement": "Izmantojiet {{shortcut}}, lai ielīmētu kā jaunu elementu, vai ielīmētu esošā teksta lauciņā" + "pasteAsSingleElement": "Izmantojiet {{shortcut}}, lai ielīmētu kā jaunu elementu, vai ielīmētu esošā teksta lauciņā", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Caurspīdīgs", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/mr-IN.json b/src/locales/mr-IN.json index d98a1c738..114bbe1f2 100644 --- a/src/locales/mr-IN.json +++ b/src/locales/mr-IN.json @@ -109,8 +109,12 @@ "createContainerFromText": "मजकूर कंटेनर मधे मोडून दाखवा", "link": { "edit": "दुवा संपादन", + "editEmbed": "", "create": "दुवा तयार करा", - "label": "दुवा" + "createEmbed": "", + "label": "दुवा", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "रेघ संपादन", @@ -160,13 +164,16 @@ "darkMode": "अंधार स्थिथि", "lightMode": "उजेड स्थिति", "zenMode": "ध्यानग्र स्थिति", + "objectsSnapMode": "वस्तूंपासून पकड़ा", "exitZenMode": "ध्यानग्र स्थितितून बाहेर", "cancel": "रद्द", "clear": "स्वछ", "remove": "हटवा", + "embed": "", "publishLibrary": "प्रकाशित करा", "submit": "जमा करा", - "confirm": "पुष्टि करा" + "confirm": "पुष्टि करा", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "पटल स्वच्छ होणार, तुम्हाला खात्री आहे का?", @@ -196,6 +203,7 @@ "imageInsertError": "प्रतिमा आत घालता येत नाही. नंतर पुन्हा प्रयत्न करा...", "fileTooBig": "फाइल फार मोठी आहे. आकाराची कमाल परवानगी {{maxSize}} आहे.", "svgImageInsertError": "एस-वी-जी प्रतिमा आत घालवू शकलो नाही. एस-वी-जी-मार्क-अप यंत्र अयोग्य आहे.", + "failedToFetchImage": "", "invalidSVGString": "अयोग्य एस-वी-जी.", "cannotResolveCollabServer": "कॉलेब-सर्वर हे पोहोचत नाही आहे. पान परत लोड करायचा प्रयत्न करावे.", "importLibraryError": "संग्रह प्रतिस्थापित नाही करता आला", @@ -206,6 +214,10 @@ "line2": "हे तुमच्या चित्रांच्या पाठ तत्वांनां खंडित करू शकतात.", "line3": "तुम्हाला आमच्या कड़ून खूप आग्रह आहे की हे सेटिंग्स मधले चयन नका करु. हे अनुक्रम हे कसे करावे हे दाखवु शकते.", "line4": "ही सेटिंग अक्षम करूनही पृष्ठ योग्यरित्या प्रदर्शित होत नसल्यास, आमच्या GitHub वर समस्या सबमिट करा, किव्हा डिस्कॉर्ड वर आम्हाला लिहा" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "निवडलेल्या आकारासाठी दुवा जोडा/बदल करा", "eraser": "खोड रबर", "frame": "", + "embeddable": "", + "laser": "लेसर टॉर्च", "hand": "हात ( सरकवण्या चे उपकरण)", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "अनेक बिंदु साठी क्लिक करा, रेघे साठी ड्रैग करा", "freeDraw": "क्लिक आणि ड्रैग करा, झालं तेव्हा सोडा", "text": "टीप: तुम्हीं निवड यंत्रानी कोठेही दुहेरी क्लिक करून टेक्स्ट जोडू शकता", + "embeddable": "", "text_selected": "लेखन संपादन साठी दुहेरी क्लिक करा किव्हा एंटर दाबा", "text_editing": "संपादन संपवायचं असल्यास एस्केप दाबा किव्हा कंट्रोल या कम्मांड बरोबार एंटर दाबा", "linearElementMulti": "शेवटच्या बिंदु वर क्लिक करा किव्हा एस्केप या एंटर दाबा", @@ -252,7 +267,8 @@ "bindTextToElement": "मजकूर जोडण्यासाठी एंटर की दाबा", "deepBoxSelect": "खोल निवड ह्या साठी कंट्रोल किव्हा कमांड दाबून ठेवा, आणि बाहेर खेचणे वाचवण्या साठी पण", "eraserRevert": "खोडण्या साठी घेतलेल्या वस्तु ना घेण्या साठी Alt दाबून ठेवावे", - "firefox_clipboard_write": "हे वैशिष्ट्य \"dom.events.asyncClipboard.clipboardItem\" फ्लॅग \"सत्य\" वर सेट करून शक्यतो सक्षम केले जाऊ शकते. Firefox मध्ये ब्राउझर फ्लॅग बदलण्यासाठी, \"about:config\" पृष्ठावर जा." + "firefox_clipboard_write": "हे वैशिष्ट्य \"dom.events.asyncClipboard.clipboardItem\" फ्लॅग \"सत्य\" वर सेट करून शक्यतो सक्षम केले जाऊ शकते. Firefox मध्ये ब्राउझर फ्लॅग बदलण्यासाठी, \"about:config\" पृष्ठावर जा.", + "disableSnapping": "स्नैपिंग अक्षम करण्या साठी CtrlOrCmd दाबून ठेवा" }, "canvasError": { "cannotShowPreview": "पूर्वावलोकन दाखवू शकत नाही", @@ -411,7 +427,9 @@ "fileSavedToFilename": "{filename} मधे जतन झाली", "canvas": "पटल", "selection": "निवड", - "pasteAsSingleElement": "एक घटक म्हणून चिपकावण्या साठी {{shortcut}} वापरा,\nकिंवा विद्यमान मजकूर संपादकात चिपकवा" + "pasteAsSingleElement": "एक घटक म्हणून चिपकावण्या साठी {{shortcut}} वापरा,\nकिंवा विद्यमान मजकूर संपादकात चिपकवा", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "पारदर्शक", @@ -449,5 +467,36 @@ "shades": "रंगछटा", "hexCode": "हेक्स कोड", "noShades": "ह्या रंगाच्या छटा उपलब्ध नाहित" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "छवि स्वरूपे निर्यात करा", + "button": "छवि स्वरूपे निर्यात करा", + "description": "सीन डेटा बाहेर एक फ़ाइल मधे जतन करा, त्या फ़ाइल मधुन तो डेटा नंतर परत आणु शकता." + }, + "saveToDisk": { + "title": "डिस्क मधे जतन करा", + "button": "डिस्क मधे जतन करा", + "description": "सीन डेटा बाहेर एक फ़ाइल मधे जतन करा, त्या फ़ाइल मधुन तो डेटा नंतर परत आणु शकता." + }, + "excalidrawPlus": { + "title": "एक्षकालीड्रॉ +", + "button": "एक्षकाली ड्रॉ+ मधे निर्यात करा", + "description": "दृष्य तुमच्या एक्षकालीड्रॉ+ चा कार्यस्थल मधे जतन करा." + } + }, + "modal": { + "loadFromFile": { + "title": "फ़ाइल मधुन लोड करा", + "button": "फ़ाइल मधुन लोड करा", + "description": "फ़ाइल मधुन लोड केल्या वर ते तुमचा सध्याचा कामा ठिकाणि एईल

तुम्हीं तुमचं चित्र एकाधं खाली दिलेलं विकल्प निवडुन पहले सुरक्षीत करु शकता." + }, + "shareableLink": { + "title": "लिंक पासून लोड करा", + "button": "माझ सध्याचे कार्य बदला", + "description": "बाहरी चित्र लोड केल्या वर ते तुमचा सध्याचा कामा ठिकाणि एईल

तुम्हीं तुमचं चित्र एकाधं खाली दिलेलं विकल्प निवडुन पहले सुरक्षीत करु शकता." + } + } } } diff --git a/src/locales/my-MM.json b/src/locales/my-MM.json index f5a69f8ca..2a54c0af2 100644 --- a/src/locales/my-MM.json +++ b/src/locales/my-MM.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "", + "editEmbed": "", "create": "", - "label": "" + "createEmbed": "", + "label": "", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "", @@ -160,13 +164,16 @@ "darkMode": "", "lightMode": "", "zenMode": "", + "objectsSnapMode": "", "exitZenMode": "ဇင်မြင်ကွင်းမှထွက်", "cancel": "", "clear": "", "remove": "", + "embed": "", "publishLibrary": "", "submit": "", - "confirm": "" + "confirm": "", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "ကားချပ်တစ်ခုလုံးရှင်းလင်းပါတော့မည်။ အတည်ပြုပါ။", @@ -196,6 +203,7 @@ "imageInsertError": "", "fileTooBig": "", "svgImageInsertError": "", + "failedToFetchImage": "", "invalidSVGString": "", "cannotResolveCollabServer": "", "importLibraryError": "", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "", "eraser": "", "frame": "", + "embeddable": "", + "laser": "", "hand": "", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "အမှတ်များချမှတ်ရေးဆွဲရန်ကလစ်နှိပ်ပါ၊ မျဉ်းတစ်ကြောင်းတည်းအတွက် တရွတ်ဆွဲပါ။", "freeDraw": "ကလစ်နှိပ်၍ တရွတ်ဆွဲပါ၊ ပြီးလျှင်လွှတ်ပါ။", "text": "မှတ်ချက်။ ။မည်သည့်ကိရိယာရွေးထားသည်ဖြစ်စေ ကလစ်နှစ်ချက်နှိပ်၍စာသားထည့်နိုင်သည်", + "embeddable": "", "text_selected": "", "text_editing": "", "linearElementMulti": "နောက်ဆုံးအမှတ်ပေါ်တွင်ကလစ်နှိပ်ခြင်း၊ Escape (သို့) Enter နှိပ်ခြင်းတို့ဖြင့်အဆုံးသတ်နိုင်", @@ -252,7 +267,8 @@ "bindTextToElement": "", "deepBoxSelect": "", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "နမူနာမပြသနိုင်ပါ", @@ -411,7 +427,9 @@ "fileSavedToFilename": "", "canvas": "", "selection": "", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/nb-NO.json b/src/locales/nb-NO.json index 11962b7dc..8ebc986e3 100644 --- a/src/locales/nb-NO.json +++ b/src/locales/nb-NO.json @@ -109,8 +109,12 @@ "createContainerFromText": "La tekst flyte i en beholder", "link": { "edit": "Rediger lenke", + "editEmbed": "Rediger lenke og bygg inn", "create": "Opprett lenke", - "label": "Lenke" + "createEmbed": "Opprett lenke og bygg inn", + "label": "Lenke", + "labelEmbed": "Lenk & bygg inn", + "empty": "Ingen lenke er valgt" }, "lineEditor": { "edit": "Rediger linje", @@ -160,13 +164,16 @@ "darkMode": "Mørk modus", "lightMode": "Lys modus", "zenMode": "Zen-modus", + "objectsSnapMode": "", "exitZenMode": "Avslutt zen-modus", "cancel": "Avbryt", "clear": "Tøm", "remove": "Fjern", + "embed": "Slå av/på innebygging", "publishLibrary": "Publiser", "submit": "Send inn", - "confirm": "Bekreft" + "confirm": "Bekreft", + "embeddableInteractionButton": "Klikk for å samhandle" }, "alerts": { "clearReset": "Dette vil tømme lerretet. Er du sikker?", @@ -196,6 +203,7 @@ "imageInsertError": "Kunne ikke sette inn bildet. Prøv igjen senere...", "fileTooBig": "Filen er for stor. Maksimal tillatt størrelse er {{maxSize}}.", "svgImageInsertError": "Kunne ikke sette inn SVG-bilde. SVG-koden ser ugyldig ut.", + "failedToFetchImage": "", "invalidSVGString": "Ugyldig SVG.", "cannotResolveCollabServer": "Kunne ikke koble til samarbeidsserveren. Vennligst oppdater siden og prøv på nytt.", "importLibraryError": "Kunne ikke laste bibliotek", @@ -206,6 +214,10 @@ "line2": "Dette kan resultere i å bryte tekst-elementene i tegningene.", "line3": "Vi anbefaler på det sterkeste å deaktivere denne innstillingen. Du kan følge disse trinnene om hvordan du gjør det.", "line4": "Hvis deaktivering av denne innstillingen ikke fikser visningen av tekstelementer, vennligst åpne en sak på vår GitHub, eller skriv oss på Discord" + }, + "libraryElementTypeError": { + "embeddable": "Innebygde elementer kan ikke legges til i biblioteket.", + "image": "Støtte for å legge til bilder i biblioteket kommer snart!" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Legg til / oppdater link for en valgt figur", "eraser": "Viskelær", "frame": "Rammeverktøy", + "embeddable": "Nettinnbygging", + "laser": "", "hand": "Hånd (panoreringsverktøy)", "extraTools": "Flere verktøy" }, @@ -237,6 +251,7 @@ "linearElement": "Klikk for å starte linje med flere punkter, eller dra for en enkel linje", "freeDraw": "Klikk og dra, slipp når du er ferdig", "text": "Tips: du kan også legge til tekst ved å dobbeltklikke hvor som helst med utvalgsverktøyet", + "embeddable": "Klikk og dra for å opprette en nettside innebygd", "text_selected": "Dobbeltklikk eller trykk ENTER for å redigere tekst", "text_editing": "Trykk Escape eller Ctrl/Cmd+Enter for å fullføre redigering", "linearElementMulti": "Klikk på siste punkt eller trykk Escape eller Enter for å fullføre", @@ -252,7 +267,8 @@ "bindTextToElement": "Trykk Enter for å legge til tekst", "deepBoxSelect": "Hold CTRL/CMD for å markere dypt og forhindre flytting", "eraserRevert": "Hold Alt for å reversere elementene merket for sletting", - "firefox_clipboard_write": "Denne funksjonen kan sannsynligvis aktiveres ved å sette \"dom.events.asyncClipboard.clipboardItem\" flagget til \"true\". For å endre nettleserens flagg i Firefox, besøk \"about:config\"-siden." + "firefox_clipboard_write": "Denne funksjonen kan sannsynligvis aktiveres ved å sette \"dom.events.asyncClipboard.clipboardItem\" flagget til \"true\". For å endre nettleserens flagg i Firefox, besøk \"about:config\"-siden.", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Kan ikke vise forhåndsvisning", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Lagret til {filename}", "canvas": "lerret", "selection": "utvalg", - "pasteAsSingleElement": "Bruk {{shortcut}} for å lime inn som ett enkelt element,\neller lim inn i en eksisterende tekstbehandler" + "pasteAsSingleElement": "Bruk {{shortcut}} for å lime inn som ett enkelt element,\neller lim inn i en eksisterende tekstbehandler", + "unableToEmbed": "Innbygging av denne nettadressen er ikke tillatt. Oppret en sak på GitHub for å be om url-hvitelisting", + "unrecognizedLinkFormat": "Linken du bygget inn samsvarer ikke med det forventede formatet. Prøv å lime inn \"bygg inn\"-strengen fra kildesiden" }, "colors": { "transparent": "Gjennomsiktig", @@ -449,5 +467,36 @@ "shades": "Toner", "hexCode": "Heksadesimal kode", "noShades": "Ingen toner tilgjengelig for denne fargen" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Eksporter som bilde", + "button": "Eksporter som bilde", + "description": "Eksporter scene-dataene til en fil som du kan importere fra senere." + }, + "saveToDisk": { + "title": "Lagre til disk", + "button": "Lagre til disk", + "description": "Eksporter scene-dataene til en fil som du kan importere fra senere." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Eksporter til Excalidraw+", + "description": "Lagre scenen til ditt Excalidraw+-arbeidsområde." + } + }, + "modal": { + "loadFromFile": { + "title": "Last inn fra fil", + "button": "Last inn fra fil", + "description": "Å laste fra en fil vil erstatte ditt eksisterende innhold.

Du kan sikkerhetskopiere tegningen din først ved å bruke en av valgene under." + }, + "shareableLink": { + "title": "Last inn fra lenke", + "button": "Erstatt innholdet mitt", + "description": "Lasting av ekstern tegning vil erstatte ditt eksisterende innhold.

Du kan sikkerhetskopiere tegningen din først ved å bruke en av valgene nedenfor." + } + } } } diff --git a/src/locales/nl-NL.json b/src/locales/nl-NL.json index 87529aac0..84471044b 100644 --- a/src/locales/nl-NL.json +++ b/src/locales/nl-NL.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "Wijzig link", + "editEmbed": "Link bewerken & insluiten", "create": "Maak link", - "label": "Link" + "createEmbed": "Link maken en insluiten", + "label": "Link", + "labelEmbed": "Link toevoegen & insluiten", + "empty": "Er is geen link ingesteld" }, "lineEditor": { "edit": "Bewerk regel", @@ -160,13 +164,16 @@ "darkMode": "Donkere modus", "lightMode": "Lichte modus", "zenMode": "Zen modus", + "objectsSnapMode": "", "exitZenMode": "Verlaat zen modus", "cancel": "Annuleren", "clear": "Wissen", "remove": "Verwijderen", + "embed": "Insluiten in-/uitschakelen", "publishLibrary": "Publiceren", "submit": "Versturen", - "confirm": "Bevestigen" + "confirm": "Bevestigen", + "embeddableInteractionButton": "Klik voor interactie" }, "alerts": { "clearReset": "Dit zal het hele canvas verwijderen. Weet je het zeker?", @@ -196,6 +203,7 @@ "imageInsertError": "Afbeelding invoegen mislukt. Probeer het later opnieuw...", "fileTooBig": "Bestand is te groot. Maximale grootte is {{maxSize}}.", "svgImageInsertError": "Kon geen SVG-afbeelding invoegen. De SVG-opmaak ziet er niet geldig uit.", + "failedToFetchImage": "", "invalidSVGString": "Ongeldige SVG.", "cannotResolveCollabServer": "Kan geen verbinding maken met de collab server. Herlaad de pagina en probeer het opnieuw.", "importLibraryError": "Kon bibliotheek niet laden", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "Ingesloten elementen kunnen niet worden toegevoegd aan de bibliotheek.", + "image": "Ondersteuning voor het toevoegen van afbeeldingen aan de bibliotheek komt binnenkort!" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Link toevoegen / bijwerken voor een geselecteerde vorm", "eraser": "Gum", "frame": "", + "embeddable": "Web insluiten", + "laser": "", "hand": "", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Klik om meerdere punten te starten, sleep voor één lijn", "freeDraw": "Klik en sleep, laat los als je klaar bent", "text": "Tip: je kunt tekst toevoegen door ergens dubbel te klikken met de selectietool", + "embeddable": "Klink-sleep om een website-insluiting te maken", "text_selected": "Dubbelklik of druk op ENTER om tekst te bewerken", "text_editing": "Druk op Escape of CtrlOrCmd+ENTER om het bewerken te voltooien", "linearElementMulti": "Klik op het laatste punt of druk op Escape of Enter om te stoppen", @@ -252,7 +267,8 @@ "bindTextToElement": "Druk op enter om tekst toe te voegen", "deepBoxSelect": "", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Kan voorbeeld niet tonen", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Opgeslagen als {filename}", "canvas": "canvas", "selection": "selectie", - "pasteAsSingleElement": "Gebruik {{shortcut}} om te plakken als een enkel element,\nof plak in een bestaande teksteditor" + "pasteAsSingleElement": "Gebruik {{shortcut}} om te plakken als een enkel element,\nof plak in een bestaande teksteditor", + "unableToEmbed": "Het insluiten van deze url is momenteel niet toegestaan. Zet een probleem op GitHub om de URL op de whitelist te zetten", + "unrecognizedLinkFormat": "De link die u hebt ingesloten komt niet overeen met het verwachte formaat. Probeer de 'embed' string van de bronsite te plakken" }, "colors": { "transparent": "Transparant", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/nn-NO.json b/src/locales/nn-NO.json index 21ed75d9c..8d110945b 100644 --- a/src/locales/nn-NO.json +++ b/src/locales/nn-NO.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "Rediger lenke", + "editEmbed": "", "create": "Lag lenke", - "label": "Lenke" + "createEmbed": "", + "label": "Lenke", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "", @@ -160,13 +164,16 @@ "darkMode": "Mørk modus", "lightMode": "Lys modus", "zenMode": "Zen-modus", + "objectsSnapMode": "", "exitZenMode": "Avslutt zen-modus", "cancel": "Avbryt", "clear": "Tøm", "remove": "Fjern", + "embed": "", "publishLibrary": "Publiser", "submit": "Send inn", - "confirm": "Stadfest" + "confirm": "Stadfest", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Dette vil tømme lerretet. Er du sikker?", @@ -196,6 +203,7 @@ "imageInsertError": "Kunne ikkje sette inn biletet. Prøv igjen seinare...", "fileTooBig": "Fila er for stor. Maksimal tillate storleik er {{maxSize}}.", "svgImageInsertError": "Kunne ikkje sette inn SVG-biletet. SVG-koden ser ugyldig ut.", + "failedToFetchImage": "", "invalidSVGString": "Ugyldig SVG.", "cannotResolveCollabServer": "Kunne ikkje kople til samarbeidsserveren. Ver vennleg å oppdatere inn sida og prøv på nytt.", "importLibraryError": "", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Legg til/ oppdater lenke til valt figur", "eraser": "Viskelêr", "frame": "", + "embeddable": "", + "laser": "", "hand": "", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Klikk for å starte linje med fleire punkt, eller drag for ei enkel linje", "freeDraw": "Klikk og drag, slepp når du er ferdig", "text": "Tips: du kan òg leggje til tekst ved å dobbeltklikke kor som helst med utvalgsverktyet", + "embeddable": "", "text_selected": "Dobbelklikk eller trykk ENTER for å redigere teksta", "text_editing": "Trykk Escape eller CtrlOrCmd+ENTER for å fullføre redigeringa", "linearElementMulti": "Klikk på siste punkt eller trykk Escape eller Enter for å fullføre", @@ -252,7 +267,8 @@ "bindTextToElement": "Trykk på enter for å legge til tekst", "deepBoxSelect": "Hald inne Ctrl / Cmd for å velje djupt, og forhindre flytting", "eraserRevert": "Hald inne Alt for å reversere markering av element for sletting", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Kan ikkje vise førehandsvising", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Lagra som {filename}", "canvas": "lerret", "selection": "val", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Gjennomsiktig", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/oc-FR.json b/src/locales/oc-FR.json index d549e3a1b..37b9e91d4 100644 --- a/src/locales/oc-FR.json +++ b/src/locales/oc-FR.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "Modificar lo ligam", + "editEmbed": "", "create": "Crear un ligam", - "label": "Ligam" + "createEmbed": "", + "label": "Ligam", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "Modificar la linha", @@ -160,13 +164,16 @@ "darkMode": "Mòde escur", "lightMode": "Mòde clar", "zenMode": "Mòde escur", + "objectsSnapMode": "", "exitZenMode": "Sortir del mòde zen", "cancel": "Anullar", "clear": "Escafar", "remove": "Tirar", + "embed": "", "publishLibrary": "Publicar", "submit": "Enviar", - "confirm": "Confirmar" + "confirm": "Confirmar", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Aquò suprimirà lo canabàs complèt. O volètz vertadièrament ?", @@ -196,6 +203,7 @@ "imageInsertError": "Insercion d’imatge impossibla. Tornatz ensajar mai tard...", "fileTooBig": "Fichièr tròp pesuc. La talha maximala autorizada es {{maxSize}}.", "svgImageInsertError": "Insercion d’imatge SVG impossibla. Las balisas SVG semblan invalidas.", + "failedToFetchImage": "", "invalidSVGString": "SVG invalid.", "cannotResolveCollabServer": "Connexion impossibla al servidor collab. Mercés de recargar la pagina e tornar ensajar.", "importLibraryError": "Impossible de cargar la bibliotèca", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Apondre/Actualizar lo ligam per una fòrma seleccionada", "eraser": "Goma", "frame": "", + "embeddable": "", + "laser": "", "hand": "Man (aisina de desplaçament de la vista)", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Clicatz per començar mantun punt, lisatz per una sola linha", "freeDraw": "Clicatz e lisatz, relargatz un còp acabat", "text": "Astúcia : podètz tanben apondre de tèxt en doble clicant ont que siá amb l’aisina de seleccion", + "embeddable": "", "text_selected": "Clicatz dos còps o quichatz ENTRADA per modificar lo tèxt", "text_editing": "Quichatz ESCAPAR o CtrlOrCmd+ENTRADA per acabar la modificacion", "linearElementMulti": "Clicatz sul darrièr punt o quichatz Ecap o Entrada per acabar", @@ -252,7 +267,8 @@ "bindTextToElement": "Quichatz Entrada per apondre de tèxte", "deepBoxSelect": "Gardar CtrlOCmd per una seleccion gropada e empachar lo desplaçament", "eraserRevert": "Tenètz quichat Alt per anullar los elements marcats per supression", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Afichatge impossible de l’apercebut", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Enregistrat jos {filename}", "canvas": "canabàs", "selection": "seleccion", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Transparéncia", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/pa-IN.json b/src/locales/pa-IN.json index 18fa57b63..5f51d1a2c 100644 --- a/src/locales/pa-IN.json +++ b/src/locales/pa-IN.json @@ -109,8 +109,12 @@ "createContainerFromText": "ਪਾਠ ਨੂੰ ਕੰਟੇਨਰ ਵਿੱਚ ਇਕੱਠਾ ਕਰੋ", "link": { "edit": "ਕੜੀ ਸੋਧੋ", + "editEmbed": "", "create": "ਕੜੀ ਬਣਾਓ", - "label": "ਕੜੀ" + "createEmbed": "", + "label": "ਕੜੀ", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "ਪੰਕਤੀ ਸੋਧੋ", @@ -160,13 +164,16 @@ "darkMode": "ਡਾਰਕ ਮੋਡ", "lightMode": "ਲਾਇਟ ਮੋਡ", "zenMode": "ਜ਼ੈੱਨ ਮੋਡ", + "objectsSnapMode": "", "exitZenMode": "ਜ਼ੈੱਨ ਮੋਡ 'ਚੋਂ ਬਾਹਰ ਨਿਕਲੋ", "cancel": "ਰੱਦ ਕਰੋ", "clear": "ਸਾਫ਼ ਕਰੋ", "remove": "ਹਟਾਓ", + "embed": "", "publishLibrary": "ਪ੍ਰਕਾਸ਼ਤ ਕਰੋ", "submit": "ਜਮ੍ਹਾ ਕਰਵਾਓ", - "confirm": "ਪੁਸ਼ਟੀ ਕਰੋ" + "confirm": "ਪੁਸ਼ਟੀ ਕਰੋ", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "ਇਹ ਸਾਰਾ ਕੈਨਵਸ ਸਾਫ ਕਰ ਦੇਵੇਗਾ। ਕੀ ਤੁਸੀਂ ਪੱਕਾ ਇੰਝ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?", @@ -196,6 +203,7 @@ "imageInsertError": "ਚਿੱਤਰ ਸ਼ਾਮਲ ਨਹੀਂ ਜਾ ਸਕਿਆ, ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ...", "fileTooBig": "ਫਾਈਲ ਬਹੁਤ ਜ਼ਿਆਦਾ ਵੱਡੀ ਹੈ। ਵੱਧ-ਤੋਂ-ਵੱਧ ਪ੍ਰਵਾਨਤ ਅਕਾਰ {{maxSize}} ਹੈ।", "svgImageInsertError": "SVG ਤਸਵੀਰ ਸ਼ਾਮਲ ਨਹੀਂ ਕਰ ਸਕੇ। SVG ਮਾਰਕ-ਅੱਪ ਨਜਾਇਜ਼ ਲੱਗ ਰਿਹਾ ਹੈ।", + "failedToFetchImage": "", "invalidSVGString": "SVG ਨਜਾਇਜ਼ ਹੈ।", "cannotResolveCollabServer": "", "importLibraryError": "ਲਾਇਬ੍ਰੇਰੀ ਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "", "eraser": "ਰਬੜ", "frame": "", + "embeddable": "", + "laser": "", "hand": "", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "ਇੱਕ ਤੋਂ ਜ਼ਿਆਦਾ ਬਿੰਦੂਆਂ ਲਈ ਕਲਿੱਕ ਕਰਕੇ ਸ਼ੁਰੂਆਤ ਕਰੋ, ਇਕਹਿਰੀ ਲਕੀਰ ਲਈ ਘਸੀਟੋ", "freeDraw": "ਕਲਿੱਕ ਕਰਕੇ ਘਸੀਟੋ, ਪੂਰਾ ਹੋਣ 'ਤੇ ਛੱਡ ਦਿਉ", "text": "ਨੁਸਖਾ: ਤੁਸੀਂ ਚੋਣਕਾਰ ਸੰਦ ਰਾਹੀਂ ਕਿਤੇ ਵੀ ਡਬਲ-ਕਲਿੱਕ ਕਰਕੇ ਵੀ ਪਾਠ ਜੋੜ ਸਕਦੇ ਹੋ", + "embeddable": "", "text_selected": "ਪਾਠ ਨੂੰ ਸੋਧਣ ਲਈ ਡਬਲ-ਕਲਿੱਕ ਕਰੋ ਜਾਂ ਐਂਟਰ ਦਬਾਓ", "text_editing": "ਸੋਧ ਮੁਕੰਮਲ ਕਰਨ ਲਈ ਐਸਕੇਪ (Esc) ਜਾਂ Ctrl-ਜਾਂ-Cmd+ਐਂਟਰ (enter) ਦਬਾਓ", "linearElementMulti": "ਮੁਕੰਮਲ ਕਰਨ ਲਈ ਆਖਰੀ ਬਿੰਦੂ 'ਤੇ ਕਲਿੱਕ ਕਰੋ ਜਾਂ ਇਸਕੇਪ ਜਾਂ ਐਂਟਰ ਦਬਾਓ", @@ -252,7 +267,8 @@ "bindTextToElement": "ਪਾਠ ਜੋੜਨ ਲਈ ਐੰਟਰ ਦਬਾਓ", "deepBoxSelect": "", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "ਝਲਕ ਨਹੀਂ ਦਿਖਾ ਸਕਦੇ", @@ -411,7 +427,9 @@ "fileSavedToFilename": "{filename} ਵਿੱਚ ਸਾਂਭੀ", "canvas": "ਕੈਨਵਸ", "selection": "ਚੋਣ", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "ਪਾਰਦਰਸ਼ੀ", @@ -449,5 +467,36 @@ "shades": "ਸ਼ੇਡਾਂ", "hexCode": "ਹੈਕਸ ਕੋਡ", "noShades": "ਇਸ ਰੰਗ ਦੀ ਕੋਈ ਸ਼ੇਡ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/percentages.json b/src/locales/percentages.json index b6b13a863..b73e02126 100644 --- a/src/locales/percentages.json +++ b/src/locales/percentages.json @@ -1,56 +1,56 @@ { - "ar-SA": 79, - "az-AZ": 20, - "bg-BG": 54, - "bn-BD": 59, - "ca-ES": 87, - "cs-CZ": 98, - "da-DK": 33, + "ar-SA": 99, + "az-AZ": 18, + "bg-BG": 75, + "bn-BD": 55, + "ca-ES": 81, + "cs-CZ": 91, + "da-DK": 31, "de-DE": 100, - "el-GR": 92, + "el-GR": 85, "en": 100, - "es-ES": 88, - "eu-ES": 100, - "fa-IR": 88, - "fi-FI": 87, - "fr-FR": 88, - "gl-ES": 88, - "he-IL": 86, - "hi-IN": 77, - "hu-HU": 76, - "id-ID": 94, - "it-IT": 98, - "ja-JP": 88, - "kaa": 18, - "kab-KAB": 87, - "kk-KZ": 21, - "km-KH": 94, + "es-ES": 96, + "eu-ES": 99, + "fa-IR": 87, + "fi-FI": 81, + "fr-FR": 98, + "gl-ES": 90, + "he-IL": 81, + "hi-IN": 75, + "hu-HU": 70, + "id-ID": 96, + "it-IT": 99, + "ja-JP": 95, + "kaa": 34, + "kab-KAB": 80, + "kk-KZ": 20, + "km-KH": 87, "ko-KR": 100, - "ku-TR": 100, - "lt-LT": 55, - "lv-LV": 88, - "mr-IN": 95, - "my-MM": 40, - "nb-NO": 100, - "nl-NL": 83, - "nn-NO": 76, - "oc-FR": 86, - "pa-IN": 89, - "pl-PL": 98, - "pt-BR": 98, - "pt-PT": 94, + "ku-TR": 92, + "lt-LT": 51, + "lv-LV": 82, + "mr-IN": 92, + "my-MM": 37, + "nb-NO": 99, + "nl-NL": 79, + "nn-NO": 71, + "oc-FR": 79, + "pa-IN": 82, + "pl-PL": 100, + "pt-BR": 96, + "pt-PT": 88, "ro-RO": 98, - "ru-RU": 98, - "si-LK": 9, - "sk-SK": 98, + "ru-RU": 94, + "si-LK": 8, + "sk-SK": 99, "sl-SI": 100, "sv-SE": 100, - "ta-IN": 84, - "th-TH": 38, - "tr-TR": 86, - "uk-UA": 96, - "vi-VN": 56, - "zh-CN": 100, - "zh-HK": 25, + "ta-IN": 85, + "th-TH": 46, + "tr-TR": 91, + "uk-UA": 99, + "vi-VN": 51, + "zh-CN": 99, + "zh-HK": 24, "zh-TW": 100 } diff --git a/src/locales/pl-PL.json b/src/locales/pl-PL.json index 8cdd54736..ffe5247ea 100644 --- a/src/locales/pl-PL.json +++ b/src/locales/pl-PL.json @@ -104,13 +104,17 @@ "excalidrawLib": "Biblioteka Excalidraw", "decreaseFontSize": "Zmniejsz rozmiar czcionki", "increaseFontSize": "Zwiększ rozmiar czcionki", - "unbindText": "Rozłącz tekst", + "unbindText": "Odłącz tekst od kontenera", "bindText": "Połącz tekst z kontenerem", "createContainerFromText": "Zawijaj tekst w kontenerze", "link": { "edit": "Edytuj łącze", + "editEmbed": "Edytuj i osadź link", "create": "Utwórz łącze", - "label": "Łącze" + "createEmbed": "Stwórz i osadź link", + "label": "Łącze", + "labelEmbed": "Podlinkuj i osadź", + "empty": "Brakujący link" }, "lineEditor": { "edit": "Edytuj linię", @@ -124,8 +128,8 @@ }, "statusPublished": "Opublikowano", "sidebarLock": "Panel boczny zawsze otwarty", - "selectAllElementsInFrame": "", - "removeAllElementsFromFrame": "", + "selectAllElementsInFrame": "Zaznacz wszystkie elementy w ramce", + "removeAllElementsFromFrame": "Usuń wszystkie elementy z ramki", "eyeDropper": "Wybierz kolor z płótna" }, "library": { @@ -160,13 +164,16 @@ "darkMode": "Ciemny motyw", "lightMode": "Jasny motyw", "zenMode": "Tryb Zen", + "objectsSnapMode": "Przyciąganie do obiektów", "exitZenMode": "Wyjdź z trybu Zen", "cancel": "Anuluj", "clear": "Wyczyść", "remove": "Usuń", + "embed": "Przełącz osadzenie", "publishLibrary": "Opublikuj", "submit": "Prześlij", - "confirm": "Zatwierdź" + "confirm": "Zatwierdź", + "embeddableInteractionButton": "Kliknij, aby wejść w interakcję" }, "alerts": { "clearReset": "To spowoduje usunięcie wszystkiego z dokumentu. Czy chcesz kontynuować?", @@ -196,6 +203,7 @@ "imageInsertError": "Nie udało się wstawić obrazu. Spróbuj ponownie później...", "fileTooBig": "Plik jest zbyt duży. Maksymalny dozwolony rozmiar to {{maxSize}}.", "svgImageInsertError": "Nie udało się wstawić obrazu SVG. Znacznik SVG wygląda na nieprawidłowy.", + "failedToFetchImage": "Nie udało się załadować obrazu.", "invalidSVGString": "Nieprawidłowy SVG.", "cannotResolveCollabServer": "Nie można połączyć się z serwerem współpracy w czasie rzeczywistym. Proszę odświeżyć stronę i spróbować ponownie.", "importLibraryError": "Wystąpił błąd w trakcie ładowania biblioteki", @@ -206,6 +214,10 @@ "line2": "Może to doprowadzić do złamania elementów tekstu na rysunkach.", "line3": "Zdecydowanie zalecamy wyłączenie tego ustawienia. Możesz wykonać te kroki, aby to zrobić.", "line4": "Jeśli wyłączenie tego ustawienia nie naprawia wyświetlania elementów tekstowych, zgłoś problem na naszym GitHubie lub napisz do nas na Discordzie" + }, + "libraryElementTypeError": { + "embeddable": "Elementy osadzone nie mogą zostać dodane do biblioteki.", + "image": "Dodawania obrazów do biblioteki nadejdzie wkrótce!" } }, "toolBar": { @@ -223,9 +235,11 @@ "penMode": "Tryb pióra — zapobiegaj dotknięciom", "link": "Dodaj/aktualizuj link dla wybranego kształtu", "eraser": "Gumka", - "frame": "", + "frame": "Ramka", + "embeddable": "Osadzenie z internetu", + "laser": "Wskaźnik laserowy", "hand": "Ręka (narzędzie do przesuwania)", - "extraTools": "" + "extraTools": "Więcej narzędzi" }, "headings": { "canvasActions": "Narzędzia", @@ -237,6 +251,7 @@ "linearElement": "Naciśnij, aby zrobić punkt, przeciągnij, aby narysować linię", "freeDraw": "Naciśnij i przeciągnij by rysować, puść kiedy skończysz", "text": "Wskazówka: możesz również dodać tekst klikając dwukrotnie gdziekolwiek za pomocą narzędzia zaznaczania", + "embeddable": "Kliknij i przeciągnij, aby stworzyć osadzenie strony", "text_selected": "Kliknij dwukrotnie lub naciśnij ENTER, aby edytować tekst", "text_editing": "Naciśnij Escape lub Ctrl (Cmd w macOS) + ENTER, aby zakończyć edycję", "linearElementMulti": "Aby zakończyć krzywą, ponownie kliknij w ostatni punkt, bądź naciśnij Esc albo Enter", @@ -252,7 +267,8 @@ "bindTextToElement": "Wciśnij enter, aby dodać tekst", "deepBoxSelect": "Przytrzymaj CtrlOrCmd, aby wybrać w obrębie grupy i uniknąć przeciągania", "eraserRevert": "Przytrzymaj Alt, aby przywrócić elementy oznaczone do usunięcia", - "firefox_clipboard_write": "Ta funkcja może być włączona poprzez ustawienie flagi \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Aby zmienić flagi przeglądarki w Firefox, odwiedź stronę \"about:config\"." + "firefox_clipboard_write": "Ta funkcja może być włączona poprzez ustawienie flagi \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Aby zmienić flagi przeglądarki w Firefox, odwiedź stronę \"about:config\".", + "disableSnapping": "Przytrzymaj Ctrl lub Cmd, aby wyłączyć przyciąganie" }, "canvasError": { "cannotShowPreview": "Nie można wyświetlić podglądu", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Zapisano jako {filename}", "canvas": "płótno", "selection": "zaznaczenie", - "pasteAsSingleElement": "Użyj {{shortcut}}, aby wkleić jako pojedynczy element,\nlub wklej do istniejącego edytora tekstu" + "pasteAsSingleElement": "Użyj {{shortcut}}, aby wkleić jako pojedynczy element,\nlub wklej do istniejącego edytora tekstu", + "unableToEmbed": "Osadzenie tego linku jest obecnie niedozwolone. Zgłoś propozycję na portalu GitHub, aby dodać go do listy dozwolonych wyjątków", + "unrecognizedLinkFormat": "Osadzony link ma niewłaściwy format. Spróbuj wkleić całą zawartość pola \"embed\" z oryginalnej strony." }, "colors": { "transparent": "Przezroczysty", @@ -449,5 +467,36 @@ "shades": "Odcienie", "hexCode": "Kod HEX", "noShades": "Brak dostępnych odcieni dla tego koloru" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Eksportuj jako obraz", + "button": "Eksportuj jako obraz", + "description": "Eksportuj zawartość sceny jako obraz z możliwością importowania." + }, + "saveToDisk": { + "title": "Zapisz na dysku", + "button": "Zapisz na dysku", + "description": "Eksportuj zawartość sceny jako plik z możliwością importowania." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Eksportuj do Excalidraw+", + "description": "Zapisz scenę do swojego obszaru roboczego Excalidraw+." + } + }, + "modal": { + "loadFromFile": { + "title": "Wczytaj z pliku", + "button": "Wczytaj z pliku", + "description": "Wczytanie z pliku nadpisze istniejącą zawartość.

Możesz najpierw utworzyć kopię zapasową swojego rysunku, używając jednej z poniższych opcji." + }, + "shareableLink": { + "title": "Wczytaj z linku", + "button": "Nadpisz moją zawartość", + "description": "Wczytanie zewnętrznego pliku nadpisze istniejącą zawartość.

Możesz najpierw utworzyć kopię zapasową swojego rysunku, używając jednej z poniższych opcji." + } + } } } diff --git a/src/locales/pt-BR.json b/src/locales/pt-BR.json index 55fdb5396..68c0059ed 100644 --- a/src/locales/pt-BR.json +++ b/src/locales/pt-BR.json @@ -109,8 +109,12 @@ "createContainerFromText": "Envolver texto em um contêiner", "link": { "edit": "Editar link", + "editEmbed": "", "create": "Criar link", - "label": "Link" + "createEmbed": "", + "label": "Link", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "Editar linha", @@ -124,9 +128,9 @@ }, "statusPublished": "Publicado", "sidebarLock": "Manter barra lateral aberta", - "selectAllElementsInFrame": "", - "removeAllElementsFromFrame": "", - "eyeDropper": "" + "selectAllElementsInFrame": "Selecionar todos os elementos no quadro", + "removeAllElementsFromFrame": "Remover todos os elementos do quadro", + "eyeDropper": "Escolher cor da tela" }, "library": { "noItems": "Nenhum item adicionado ainda...", @@ -160,13 +164,16 @@ "darkMode": "Modo escuro", "lightMode": "Modo claro", "zenMode": "Modo Zen", + "objectsSnapMode": "", "exitZenMode": "Sair do modo zen", "cancel": "Cancelar", "clear": "Limpar", "remove": "Remover", + "embed": "", "publishLibrary": "Publicar", "submit": "Enviar", - "confirm": "Confirmar" + "confirm": "Confirmar", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Isto irá limpar toda a tela. Você tem certeza?", @@ -196,6 +203,7 @@ "imageInsertError": "Não foi possível inserir imagem. Tente novamente mais tarde...", "fileTooBig": "O arquivo é muito grande. O tamanho máximo permitido é {{maxSize}}.", "svgImageInsertError": "Não foi possível inserir a imagem SVG. A marcação SVG parece inválida.", + "failedToFetchImage": "", "invalidSVGString": "SVG Inválido.", "cannotResolveCollabServer": "Não foi possível conectar-se ao servidor colaborativo. Por favor, recarregue a página e tente novamente.", "importLibraryError": "Não foi possível carregar a biblioteca", @@ -206,6 +214,10 @@ "line2": "Isso pode acabar quebrando Elementos de Texto em seus desenhos.", "line3": "Recomendamos fortemente desativar essa configuração. Você pode acessar o passo a passo sobre como fazer isso.", "line4": "Se desativar essa configuração não corrigir a exibição de elementos de texto, por favor abra uma issue em nosso GitHub, ou mande uma mensagem em nosso Discord" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -223,9 +235,11 @@ "penMode": "Modo caneta — impede o toque", "link": "Adicionar/Atualizar link para uma forma selecionada", "eraser": "Borracha", - "frame": "", + "frame": "Ferramenta de quadro", + "embeddable": "", + "laser": "", "hand": "Mão (ferramenta de rolagem)", - "extraTools": "" + "extraTools": "Mais ferramentas" }, "headings": { "canvasActions": "Ações da tela", @@ -237,6 +251,7 @@ "linearElement": "Clique para iniciar vários pontos, arraste para uma única linha", "freeDraw": "Toque e arraste, solte quando terminar", "text": "Dica: você também pode adicionar texto clicando duas vezes em qualquer lugar com a ferramenta de seleção", + "embeddable": "", "text_selected": "Clique duplo ou tecle ENTER para editar o texto", "text_editing": "Pressione Esc ou Ctrl/Cmd+ENTER para encerrar a edição", "linearElementMulti": "Clique no último ponto ou pressione Escape ou Enter para terminar", @@ -252,7 +267,8 @@ "bindTextToElement": "Pressione Enter para adicionar o texto", "deepBoxSelect": "Segure Ctrl/Cmd para seleção profunda e para evitar arrastar", "eraserRevert": "Segure a tecla Alt para inverter os elementos marcados para exclusão", - "firefox_clipboard_write": "Esse recurso pode ser ativado configurando a opção \"dom.events.asyncClipboard.clipboardItem\" como \"true\". Para alterar os sinalizadores do navegador no Firefox, visite a página \"about:config\"." + "firefox_clipboard_write": "Esse recurso pode ser ativado configurando a opção \"dom.events.asyncClipboard.clipboardItem\" como \"true\". Para alterar os sinalizadores do navegador no Firefox, visite a página \"about:config\".", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Não é possível mostrar pré-visualização", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Salvo em {filename}", "canvas": "tela", "selection": "seleção", - "pasteAsSingleElement": "Use {{shortcut}} para colar como um único elemento,\nou cole em um editor de texto já existente" + "pasteAsSingleElement": "Use {{shortcut}} para colar como um único elemento,\nou cole em um editor de texto já existente", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Transparente", @@ -449,5 +467,36 @@ "shades": "Tons", "hexCode": "Código hexadecimal", "noShades": "Sem tons disponíveis para essa cor" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Exportar como imagem", + "button": "Exportar como imagem", + "description": "Exportar os dados da cena para um arquivo que você poderá importar mais tarde." + }, + "saveToDisk": { + "title": "Salvar no computador", + "button": "Salvar no computador", + "description": "Exportar os dados da cena para um arquivo que você poderá importar mais tarde." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Exportar para Excalidraw+", + "description": "Salvar a cena na sua área de trabalho Excalidraw+." + } + }, + "modal": { + "loadFromFile": { + "title": "Carregar de arquivo", + "button": "Carregar de arquivo", + "description": "Carregar de um arquivo irá substituir o conteúdo existente.

Você pode salvar seu desenho primeiro usando uma das opções abaixo." + }, + "shareableLink": { + "title": "Carregar de um link", + "button": "Substituir meu conteúdo", + "description": "Carregar um desenho externo irá substituir seu conteúdo existente.

Você pode salvar seu desenho antes utilizando uma das opções abaixo." + } + } } } diff --git a/src/locales/pt-PT.json b/src/locales/pt-PT.json index 13e6c27b2..401a45ac5 100644 --- a/src/locales/pt-PT.json +++ b/src/locales/pt-PT.json @@ -109,8 +109,12 @@ "createContainerFromText": "Envolver texto num recipiente", "link": { "edit": "Editar ligação", + "editEmbed": "", "create": "Criar ligação", - "label": "Ligação" + "createEmbed": "", + "label": "Ligação", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "Editar linha", @@ -160,13 +164,16 @@ "darkMode": "Modo escuro", "lightMode": "Modo claro", "zenMode": "Modo zen", + "objectsSnapMode": "", "exitZenMode": "Sair do modo zen", "cancel": "Cancelar", "clear": "Limpar", "remove": "Remover", + "embed": "", "publishLibrary": "Publicar", "submit": "Enviar", - "confirm": "Confirmar" + "confirm": "Confirmar", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Isto irá limpar toda a área de desenho. Tem a certeza?", @@ -196,6 +203,7 @@ "imageInsertError": "Não foi possível inserir a imagem, tente novamente mais tarde...", "fileTooBig": "O ficheiro é muito grande. O tamanho máximo permitido é {{maxSize}}.", "svgImageInsertError": "Não foi possível inserir a imagem SVG. A marcação SVG parece inválida.", + "failedToFetchImage": "", "invalidSVGString": "SVG inválido.", "cannotResolveCollabServer": "Não foi possível fazer a ligação ao servidor colaborativo. Por favor, volte a carregar a página e tente novamente.", "importLibraryError": "Não foi possível carregar a biblioteca", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Acrescentar/ Adicionar ligação para uma forma seleccionada", "eraser": "Borracha", "frame": "", + "embeddable": "", + "laser": "", "hand": "Mão (ferramenta de movimento da tela)", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Clique para iniciar vários pontos, arraste para uma única linha", "freeDraw": "Clique e arraste, large quando terminar", "text": "Dica: também pode adicionar texto clicando duas vezes em qualquer lugar com a ferramenta de seleção", + "embeddable": "", "text_selected": "Clique duas vezes ou pressione a tecla Enter para editar o texto", "text_editing": "Pressione a tecla Escape ou CtrlOrCmd+ENTER para terminar a edição", "linearElementMulti": "Clique no último ponto ou pressione Escape ou Enter para terminar", @@ -252,7 +267,8 @@ "bindTextToElement": "Carregue Enter para acrescentar texto", "deepBoxSelect": "Mantenha a tecla CtrlOrCmd carregada para selecção profunda, impedindo o arrastamento", "eraserRevert": "Carregue também em Alt para reverter os elementos marcados para serem apagados", - "firefox_clipboard_write": "Esta função pode provavelmente ser ativada definindo a opção \"dom.events.asyncClipboard.clipboardItem\" como \"true\". Para alterar os sinalizadores do navegador no Firefox, visite a página \"about:config\"." + "firefox_clipboard_write": "Esta função pode provavelmente ser ativada definindo a opção \"dom.events.asyncClipboard.clipboardItem\" como \"true\". Para alterar os sinalizadores do navegador no Firefox, visite a página \"about:config\".", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Não é possível mostrar uma pré-visualização", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Guardado como {filename}", "canvas": "área de desenho", "selection": "seleção", - "pasteAsSingleElement": "Usar {{shortcut}} para colar como um único elemento,\nou colar num editor de texto existente" + "pasteAsSingleElement": "Usar {{shortcut}} para colar como um único elemento,\nou colar num editor de texto existente", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Transparente", @@ -449,5 +467,36 @@ "shades": "Tons", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "Guardar no disco", + "button": "Guardar no disco", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "Carregar a partir de ficheiro", + "button": "Carregar a partir de ficheiro", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/ro-RO.json b/src/locales/ro-RO.json index cc51f74b5..125c28663 100644 --- a/src/locales/ro-RO.json +++ b/src/locales/ro-RO.json @@ -109,8 +109,12 @@ "createContainerFromText": "Încadrare text într-un container", "link": { "edit": "Editare URL", + "editEmbed": "Editare URL și încorporare", "create": "Creare URL", - "label": "URL" + "createEmbed": "Creare URL și încorporare", + "label": "URL", + "labelEmbed": "URL și încorporare", + "empty": "Nu este setat niciun URL" }, "lineEditor": { "edit": "Editare linie", @@ -160,13 +164,16 @@ "darkMode": "Mod întunecat", "lightMode": "Mod luminos", "zenMode": "Mod zen", + "objectsSnapMode": "Ancorare la obiecte", "exitZenMode": "Ieșire din modul zen", "cancel": "Anulare", "clear": "Ștergere", "remove": "Eliminare", + "embed": "Comutare încorporare", "publishLibrary": "Publicare", "submit": "Trimitere", - "confirm": "Confirmare" + "confirm": "Confirmare", + "embeddableInteractionButton": "Clic pentru interacționare" }, "alerts": { "clearReset": "Această opțiune va șterge întreaga pânză. Confirmi?", @@ -196,6 +203,7 @@ "imageInsertError": "Imaginea nu a putut fi introdusă. Reîncearcă mai târziu...", "fileTooBig": "Fișierul este prea mare. Dimensiunea maximă permisă este de {{maxSize}}.", "svgImageInsertError": "Imaginea SVG nu a putut fi introdus. Marcajul SVG pare invalid.", + "failedToFetchImage": "", "invalidSVGString": "SVG invalid.", "cannotResolveCollabServer": "Nu a putut fi realizată conexiunea la serverul de colaborare. Reîncarcă pagina și încearcă din nou.", "importLibraryError": "Biblioteca nu a putut fi încărcată", @@ -206,6 +214,10 @@ "line2": "Acest lucru poate duce la întreruperea elementelor text din desene.", "line3": "Îți recomandăm ferm să dezactivezi această setare. Poți urma acești pași pentru a face acest lucru.", "line4": "Dacă dezactivarea acestei setări nu duce la remedierea afișării elementelor text, deschide un tichet de problemă pe pagina noastră de GitHub sau scrie-ne pe Discord" + }, + "libraryElementTypeError": { + "embeddable": "Elementele încorporabile nu pot fi adăugate la bibliotecă.", + "image": "În curând vor putea fi adăugate imagini în bibliotecă!" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Adăugare/actualizare URL pentru forma selectată", "eraser": "Radieră", "frame": "", + "embeddable": "Încorporare web", + "laser": "Indicator laser", "hand": "Mână (instrument de panoramare)", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Dă clic pentru a crea mai multe puncte, glisează pentru a forma o singură linie", "freeDraw": "Dă clic pe pânză și glisează cursorul, apoi eliberează-l când ai terminat", "text": "Sfat: poți adăuga text și dând dublu clic oriunde cu instrumentul de selecție", + "embeddable": "Dă clic și trage pentru a crea un cod de încorporare de pagină web", "text_selected": "Dă dublu clic sau apasă tasta Enter pentru a edita textul", "text_editing": "Apasă tasta Escape sau Ctrl sau Cmd + Enter pentru a finaliza editarea", "linearElementMulti": "Dă clic pe ultimul punct sau apasă tasta Escape sau tasta Enter pentru a termina", @@ -252,7 +267,8 @@ "bindTextToElement": "Apasă tasta Enter pentru a adăuga text", "deepBoxSelect": "Ține apăsată tasta Ctrl sau Cmd pentru a efectua selectarea de adâncime și pentru a preveni glisarea", "eraserRevert": "Ține apăsată tasta Alt pentru a anula elementele marcate pentru ștergere", - "firefox_clipboard_write": "Această caracteristică poate fi probabil activată prin setarea preferinței „dom.events.asyncClipboard.clipboardItem” ca „true”. Pentru a schimba preferințele navigatorului în Firefox, accesează pagina „about:config”." + "firefox_clipboard_write": "Această caracteristică poate fi probabil activată prin setarea preferinței „dom.events.asyncClipboard.clipboardItem” ca „true”. Pentru a schimba preferințele navigatorului în Firefox, accesează pagina „about:config”.", + "disableSnapping": "Ține apăsat CtrlOrCmd pentru a dezactiva ancorarea" }, "canvasError": { "cannotShowPreview": "Nu se poate afișa previzualizarea", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Salvat în {filename}", "canvas": "pânza", "selection": "selecția", - "pasteAsSingleElement": "Folosește {{shortcut}} pentru a insera ca un singur element\nsau insera într-un editor de text existent" + "pasteAsSingleElement": "Folosește {{shortcut}} pentru a insera ca un singur element\nsau insera într-un editor de text existent", + "unableToEmbed": "Încorporarea acestui URL nu este permisă momentan. Deschideți un tichet cu probleme pe GitHub pentru a solicita adăugarea acestui URL în lista albă", + "unrecognizedLinkFormat": "URL-ul pe care l-ai încorporat nu coincide cu formatul așteptat. Încearcă să lipești șirul „de încorporat” furnizat de pagina sursă" }, "colors": { "transparent": "Transparent", @@ -449,5 +467,36 @@ "shades": "Nuanțe", "hexCode": "Cod hexa", "noShades": "Nu este disponibilă nicio nuanță pentru această culoare" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Exportare ca imagine", + "button": "Exportare ca imagine", + "description": "Exportă datele scenei ca fișier din care poți importa mai târziu." + }, + "saveToDisk": { + "title": "Salvare pe disc", + "button": "Salvare pe disc", + "description": "Exportă datele scenei pe un fișier din care poți importa mai târziu." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Exportare în Excalidraw+", + "description": "Salvează scena în spațiul de lucru Excalidraw+." + } + }, + "modal": { + "loadFromFile": { + "title": "Încărcare din fișier", + "button": "Încărcare din fișier", + "description": "Încărcarea dintr-un fișier va înlocui conținutul existent.

Poți face mai întâi o copie de rezervă a desenului folosind una dintre opțiunile de mai jos." + }, + "shareableLink": { + "title": "Încărcare din lnk", + "button": "Înlocuiește conținutul meu", + "description": "Încărcarea unui desen extern va înlocui conținutul existent.

Poți face mai întâi o copie de rezervă a desenului folosind una dintre opțiunile de mai jos." + } + } } } diff --git a/src/locales/ru-RU.json b/src/locales/ru-RU.json index 00be90c51..7c489022c 100644 --- a/src/locales/ru-RU.json +++ b/src/locales/ru-RU.json @@ -109,8 +109,12 @@ "createContainerFromText": "Поместить текст в контейнер", "link": { "edit": "Редактировать ссылку", + "editEmbed": "", "create": "Создать ссылку", - "label": "Ссылка" + "createEmbed": "", + "label": "Ссылка", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "Редактирование строки", @@ -160,13 +164,16 @@ "darkMode": "Темная тема", "lightMode": "Светлая тема", "zenMode": "Режим Дзен", + "objectsSnapMode": "Привязка к объектам", "exitZenMode": "Выключить режим концентрации внимания", "cancel": "Отменить", "clear": "Очистить", "remove": "Удалить", + "embed": "", "publishLibrary": "Опубликовать", "submit": "Отправить", - "confirm": "Подтвердить" + "confirm": "Подтвердить", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Это очистит весь холст. Вы уверены?", @@ -196,6 +203,7 @@ "imageInsertError": "Не удалось вставить изображение. Попробуйте позже...", "fileTooBig": "Очень большой файл. Максимально разрешенный размер {{maxSize}}.", "svgImageInsertError": "Не удалось вставить изображение SVG. Разметка SVG выглядит недействительной.", + "failedToFetchImage": "Не удалось получить изображение.", "invalidSVGString": "Некорректный SVG.", "cannotResolveCollabServer": "Не удалось подключиться к серверу совместного редактирования. Перезагрузите страницу и повторите попытку.", "importLibraryError": "Не удалось загрузить библиотеку", @@ -206,6 +214,10 @@ "line2": "Это может привести к поломке Текстовых объектов на рисунке.", "line3": "Мы настоятельно рекомендуем отключить эту настройку. Для этого нужно выполнить эти шаги.", "line4": "Если отключение этой настройки не исправит отображение текстовых объектов, создайте issue на нашем GitHub или напишите нам в Discord" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Добавить/обновить ссылку для выбранной фигуры", "eraser": "Ластик", "frame": "", + "embeddable": "", + "laser": "Лазерная указка", "hand": "Рука (перемещение холста)", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Нажмите, чтобы начать несколько точек, перетащите для одной линии", "freeDraw": "Нажмите и перетаскивайте, отпустите по завершении", "text": "Совет: при выбранном инструменте выделения дважды щёлкните в любом месте, чтобы добавить текст", + "embeddable": "", "text_selected": "Дважды щелкните мышью или нажмите ENTER, чтобы редактировать текст", "text_editing": "Нажмите Escape либо Ctrl или Cmd + ENTER для завершения редактирования", "linearElementMulti": "Кликните на последней точке или нажмите Escape или Enter чтобы закончить", @@ -252,7 +267,8 @@ "bindTextToElement": "Нажмите Enter для добавления текста", "deepBoxSelect": "Удерживайте Ctrl или Cmd для глубокого выделения, чтобы предотвратить перетаскивание", "eraserRevert": "Удерживайте Alt, чтобы вернуть элементы, отмеченные для удаления", - "firefox_clipboard_write": "Эта функция может быть включена при изменении значения флага \"dom.events.asyncClipboard.clipboardItem\" на \"true\". Чтобы изменить флаги браузера в Firefox, посетите страницу \"about:config\"." + "firefox_clipboard_write": "Эта функция может быть включена при изменении значения флага \"dom.events.asyncClipboard.clipboardItem\" на \"true\". Чтобы изменить флаги браузера в Firefox, посетите страницу \"about:config\".", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Не удается отобразить предпросмотр", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Сохранено в {filename}", "canvas": "холст", "selection": "выделение", - "pasteAsSingleElement": "Используйте {{shortcut}}, чтобы вставить один объект,\nили вставьте в существующий текстовый редактор" + "pasteAsSingleElement": "Используйте {{shortcut}}, чтобы вставить один объект,\nили вставьте в существующий текстовый редактор", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Прозрачный", @@ -449,5 +467,36 @@ "shades": "Оттенки", "hexCode": "Шестнадцатеричный код", "noShades": "Нет доступных оттенков для этого цвета" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Экспортировать как изображение", + "button": "Экспортировать как изображение", + "description": "" + }, + "saveToDisk": { + "title": "Сохранить на диск", + "button": "Сохранить на диск", + "description": "" + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Экспорт в Excalidraw+", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "Загрузить из файла", + "button": "Загрузить из файла", + "description": "" + }, + "shareableLink": { + "title": "Загрузить по ссылке", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/si-LK.json b/src/locales/si-LK.json index 468beaf47..8cc93b03a 100644 --- a/src/locales/si-LK.json +++ b/src/locales/si-LK.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "", + "editEmbed": "", "create": "", - "label": "" + "createEmbed": "", + "label": "", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "", @@ -160,13 +164,16 @@ "darkMode": "", "lightMode": "", "zenMode": "", + "objectsSnapMode": "", "exitZenMode": "", "cancel": "", "clear": "", "remove": "", + "embed": "", "publishLibrary": "", "submit": "", - "confirm": "" + "confirm": "", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "", @@ -196,6 +203,7 @@ "imageInsertError": "", "fileTooBig": "", "svgImageInsertError": "", + "failedToFetchImage": "", "invalidSVGString": "", "cannotResolveCollabServer": "", "importLibraryError": "", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "", "eraser": "", "frame": "", + "embeddable": "", + "laser": "", "hand": "", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "", "freeDraw": "", "text": "", + "embeddable": "", "text_selected": "", "text_editing": "", "linearElementMulti": "", @@ -252,7 +267,8 @@ "bindTextToElement": "", "deepBoxSelect": "", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "", @@ -411,7 +427,9 @@ "fileSavedToFilename": "", "canvas": "", "selection": "", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/sk-SK.json b/src/locales/sk-SK.json index cfda4f16b..b0d9e4b84 100644 --- a/src/locales/sk-SK.json +++ b/src/locales/sk-SK.json @@ -109,8 +109,12 @@ "createContainerFromText": "Zabaliť text do kontajneru", "link": { "edit": "Upraviť odkaz", + "editEmbed": "Editovať a zapustiť odkaz", "create": "Vytvoriť odkaz", - "label": "Odkaz" + "createEmbed": "Vytvoriť a zapustiť odkaz", + "label": "Odkaz", + "labelEmbed": "Zapustiť odkaz", + "empty": "Nie je nastavený žiaden odkaz" }, "lineEditor": { "edit": "Upraviť čiaru", @@ -124,8 +128,8 @@ }, "statusPublished": "Zverejnené", "sidebarLock": "Nechať bočný panel otvorený", - "selectAllElementsInFrame": "", - "removeAllElementsFromFrame": "", + "selectAllElementsInFrame": "Vybrať všetky prvky v ráme", + "removeAllElementsFromFrame": "Odstrániť všetky prvky z rámu", "eyeDropper": "Vybrať farbu z plátna" }, "library": { @@ -160,13 +164,16 @@ "darkMode": "Tmavý režim", "lightMode": "Svetlý režim", "zenMode": "Režim zen", + "objectsSnapMode": "Prichytiť k objektom", "exitZenMode": "Zrušiť režim zen", "cancel": "Zrušiť", "clear": "Vymazať", "remove": "Odstrániť", + "embed": "Prepnúť zapustenie", "publishLibrary": "Uverejniť", "submit": "Potvrdiť", - "confirm": "Potvrdiť" + "confirm": "Potvrdiť", + "embeddableInteractionButton": "Kliknite pre interakciu" }, "alerts": { "clearReset": "Týmto sa vyčistí celé plátno. Ste si istí?", @@ -196,6 +203,7 @@ "imageInsertError": "Nepodarilo sa vložiť obrázok. Skúste to znova neskôr...", "fileTooBig": "Súbor je príliš veľký. Maximálna povolená veľkosť je {{maxSize}}.", "svgImageInsertError": "Nepodarilo sa vložiť SVG obrázok. SVG formát je pravdepodobne nevalidný.", + "failedToFetchImage": "", "invalidSVGString": "Nevalidné SVG.", "cannotResolveCollabServer": "Nepodarilo sa pripojiť ku kolaboračnému serveru. Prosím obnovte stránku a skúste to znovu.", "importLibraryError": "Nepodarilo sa načítať knižnicu", @@ -206,6 +214,10 @@ "line2": "To môže spôsobiť nesprávne zobrazenie textových prvkov vo vašej kresbe.", "line3": "Dôrazne odporúčame vypnutie toho nastavenia. Môžete tak spraviť vykonaním týchto krokov.", "line4": "Ak vypnutie toho nastavenia nevyrieši problém so zobrazením textových prvkov, prosím ohláste problém na našom GitHub-e alebo nám napíšte na náš Discord" + }, + "libraryElementTypeError": { + "embeddable": "Zapustené prvky nie je možné pridať do knižnice.", + "image": "Podpora pre pridávanie obrázkov do knižnice bude dostupná už čoskoro!" } }, "toolBar": { @@ -223,9 +235,11 @@ "penMode": "Režim pera – zabrániť dotyku", "link": "Pridať/ Upraviť odkaz pre vybraný tvar", "eraser": "Guma", - "frame": "", + "frame": "Nástroj rám", + "embeddable": "Web Embed", + "laser": "", "hand": "Ruka (nástroj pre pohyb plátna)", - "extraTools": "" + "extraTools": "Ďalšie nástroje" }, "headings": { "canvasActions": "Akcie plátna", @@ -237,6 +251,7 @@ "linearElement": "Kliknite na vloženie viacerých bodov, potiahnite na vytvorenie jednej priamky", "freeDraw": "Kliknite a ťahajte, pustite na ukončenie", "text": "Tip: text môžete pridať aj dvojklikom kdekoľvek, ak je zvolený nástroj výber", + "embeddable": "Kliknite a ťahajte pre zapustenie webovej stránky", "text_selected": "Použite dvojklik alebo stlačte Enter na editáciu textu", "text_editing": "Stlačte Escape alebo CtrlOrCmd+ENTER na ukončenie editovania", "linearElementMulti": "Kliknite na počiatočný bod alebo stlačte Escape alebo Enter na ukončenie", @@ -252,7 +267,8 @@ "bindTextToElement": "Stlačte enter na pridanie textu", "deepBoxSelect": "Podržte CtrlOrCmd na výber v skupine alebo zamedzeniu poťiahnutia", "eraserRevert": "Podržte Alt pre prehodenie položiek určených na vymazanie", - "firefox_clipboard_write": "Táto sa funkcionalita sa dá zapnúť nastavením \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Pre zmenu nastavení vo Firefox-e otvorte stránku \"about:config\"." + "firefox_clipboard_write": "Táto sa funkcionalita sa dá zapnúť nastavením \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Pre zmenu nastavení vo Firefox-e otvorte stránku \"about:config\".", + "disableSnapping": "Podržte CtrlOrCmd pre vypnutie prichytávania" }, "canvasError": { "cannotShowPreview": "Nie je možné zobraziť náhľad plátna", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Uložený ako {filename}", "canvas": "plátna", "selection": "výberu", - "pasteAsSingleElement": "Použitím {{shortcut}} vložte ako samostatný prvok alebo vložte do existujúceho editovaného textu" + "pasteAsSingleElement": "Použitím {{shortcut}} vložte ako samostatný prvok alebo vložte do existujúceho editovaného textu", + "unableToEmbed": "Zapustenie tejto URL nie je povolené. Vytvorte issue na GitHub-e a požiadajte povolenie tejto URL", + "unrecognizedLinkFormat": "Odkaz, ktorý sa snažíte zapustiť nie je v očakávanom formáte. Prosím skúste vložiť 'odkaz na zdieľanie' poskytnutý zdrojovou webovou stránkou" }, "colors": { "transparent": "Priehľadná", @@ -449,5 +467,36 @@ "shades": "Odtiene", "hexCode": "Hex kód", "noShades": "Pre túto farbu nie sú dostupné žiadne odtiene" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Exportovať ako obrázok", + "button": "Exportovať ako obrázok", + "description": "Exportovať údaje scény ako obrázok, z ktorého môžu byť neskôr importované." + }, + "saveToDisk": { + "title": "Uložiť na disk", + "button": "Uložiť na disk", + "description": "Exportovať údaje scény do súboru, z ktorého môžu byť neskôr importované." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Exportovať ako Excalidraw+", + "description": "Uložiť scénu do vášho Excalidraw+ pracovného priestoru." + } + }, + "modal": { + "loadFromFile": { + "title": "Načítať zo súboru", + "button": "Načítať zo súboru", + "description": "Načítanie zo súboru nahradí váš existujúci obsah.

Vašu kresbu môžete zálohovať jednou z nižšie uvedených možností." + }, + "shareableLink": { + "title": "Načítať z odkazu", + "button": "Nahradiť môj obsah", + "description": "Načítanie externej kresby nahradí váš existujúci obsah.

Vašu kresbu môžete zálohovať jednou z nižšie uvedených možností." + } + } } } diff --git a/src/locales/sl-SI.json b/src/locales/sl-SI.json index 70945a1f0..5a6ea8c6f 100644 --- a/src/locales/sl-SI.json +++ b/src/locales/sl-SI.json @@ -109,8 +109,12 @@ "createContainerFromText": "Zavij besedilo v vsebnik", "link": { "edit": "Uredi povezavo", + "editEmbed": "Uredi povezavo in vdelaj", "create": "Ustvari povezavo", - "label": "Povezava" + "createEmbed": "Ustvari povezavo in vdelaj", + "label": "Povezava", + "labelEmbed": "Povezava in vdelovanje", + "empty": "Povezava ni nastavljena" }, "lineEditor": { "edit": "Uredi črto", @@ -160,13 +164,16 @@ "darkMode": "Temni način", "lightMode": "Svetli način", "zenMode": "Način Zen", + "objectsSnapMode": "Pripenjanje na predmete", "exitZenMode": "Zapri način Zen", "cancel": "Prekliči", "clear": "Počisti", "remove": "Odstrani", + "embed": "Preklopi vdelavo", "publishLibrary": "Objavi", "submit": "Pošlji", - "confirm": "Potrdi" + "confirm": "Potrdi", + "embeddableInteractionButton": "Kliknite za interakcijo" }, "alerts": { "clearReset": "To bo počistilo celotno platno. Ali ste prepričani?", @@ -196,6 +203,7 @@ "imageInsertError": "Vstavljanje slike ni bilo uspešno. Poskusite ponovno kasneje...", "fileTooBig": "Datoteka je prevelika. Največja dovoljena velikost je {{maxSize}}.", "svgImageInsertError": "Vstavljanje slike SVG ni uspelo. Oznake SVG so videti neveljavne.", + "failedToFetchImage": "Pridobivanje slike ni uspelo.", "invalidSVGString": "Neveljaven SVG.", "cannotResolveCollabServer": "Povezave s strežnikom za sodelovanje ni bilo mogoče vzpostaviti. Ponovno naložite stran in poskusite znova.", "importLibraryError": "Nalaganje knjižnice ni uspelo", @@ -206,6 +214,10 @@ "line2": "To bi lahko povzročilo motnje v obnašanju besedilnih elementov v vaših risbah.", "line3": "Močno priporočamo, da onemogočite to nastavitev. Sledite tem korakom, kako to storiti.", "line4": "Če onemogočanje te nastavitve ne popravi prikaza besedilnih elementov, odprite vprašanje na našem GitHubu ali nam pišite na Discord" + }, + "libraryElementTypeError": { + "embeddable": "Vdelani elementi ne morejo biti dodani v knjižnico.", + "image": "Podpora za dodajanje slik v knjižnico prihaja kmalu!" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Dodaj/posodobi povezavo za izbrano obliko", "eraser": "Radirka", "frame": "Okvir", + "embeddable": "Spletna vdelava", + "laser": "Laserski kazalec", "hand": "Roka (orodje za premikanje)", "extraTools": "Več orodij" }, @@ -237,6 +251,7 @@ "linearElement": "Kliknite za začetek več točk, povlecite za posamezno črto", "freeDraw": "Kliknite in povlecite, spustite, ko končate", "text": "Namig: besedilo lahko dodate tudi z dvoklikom kjer koli z orodjem za izbiro", + "embeddable": "Kliknite in povlecite, da ustvarite spletno vdelavo", "text_selected": "Dvokliknite ali pritisnite tipko Enter, da uredite besedilo", "text_editing": "Pritisnite tipko Escape ali CtrlOrCmd+Enter za zaključek urejanja", "linearElementMulti": "Kliknite zadnjo točko ali pritisnite Escape ali Enter, da končate", @@ -252,7 +267,8 @@ "bindTextToElement": "Pritisnite tipko Enter za dodajanje besedila", "deepBoxSelect": "Držite tipko CtrlOrCmd za globoko izbiro in preprečitev vlečenja", "eraserRevert": "Pridržite tipko Alt, da razveljavite elemente, označene za brisanje", - "firefox_clipboard_write": "To funkcijo lahko verjetno omogočite z nastavitvijo zastavice \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Če želite spremeniti zastavice brskalnika v Firefoxu, obiščite stran \"about:config\"." + "firefox_clipboard_write": "To funkcijo lahko verjetno omogočite z nastavitvijo zastavice \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Če želite spremeniti zastavice brskalnika v Firefoxu, obiščite stran \"about:config\".", + "disableSnapping": "Držite CtrlOrCmd, da onemogočite pripenjanje" }, "canvasError": { "cannotShowPreview": "Predogleda ni bilo mogoče prikazati", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Shranjeno v {filename}", "canvas": "platno", "selection": "izbor", - "pasteAsSingleElement": "Uporabite {{shortcut}}, da prilepite kot en element,\n ali prilepite v obstoječ urejevalnik besedil" + "pasteAsSingleElement": "Uporabite {{shortcut}}, da prilepite kot en element,\n ali prilepite v obstoječ urejevalnik besedil", + "unableToEmbed": "Vdelava tega URL-ja trenutno ni dovoljena. Ustvarite vprašanje na GitHub-u in prosite za vmestitev URL-ja na seznam dovoljenih", + "unrecognizedLinkFormat": "Povezava, ki ste jo vdelali, se ne ujema s pričakovano obliko. Poskusite prilepiti niz za vdelavo, ki ste ga prejeli na izvorni strani" }, "colors": { "transparent": "Prosojno", @@ -449,5 +467,36 @@ "shades": "Odtenki", "hexCode": "Hex koda", "noShades": "Odtenki za to barvo niso na voljo" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Izvozi kot sliko", + "button": "Izvozi kot sliko", + "description": "Izvozite podatke scene kot sliko, iz katere jo lahko pozneje uvozite." + }, + "saveToDisk": { + "title": "Shrani na disk", + "button": "Shrani na disk", + "description": "Izvozite podatke scene v datoteko, iz katere jo lahko pozneje uvozite." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Izvozi v Excalidraw+", + "description": "Shrani sceno v svoj delovni prostor Excalidraw+." + } + }, + "modal": { + "loadFromFile": { + "title": "Naloži iz datoteke", + "button": "Naloži iz datoteke", + "description": "Nalaganje iz datoteke bo prepisalo vašo obstoječo vsebino.

Svojo risbo lahko najprej varnostno kopirate z eno od spodnjih možnosti." + }, + "shareableLink": { + "title": "Naloži iz povezave", + "button": "Zamenjaj mojo vsebino", + "description": "Nalaganje zunanje risbe bo prepisalo vašo obstoječo vsebino.

Svojo risbo lahko najprej varnostno kopirate z eno od spodnjih možnosti." + } + } } } diff --git a/src/locales/sv-SE.json b/src/locales/sv-SE.json index e437e3924..94a09610c 100644 --- a/src/locales/sv-SE.json +++ b/src/locales/sv-SE.json @@ -109,8 +109,12 @@ "createContainerFromText": "Radbryt text i en avgränsad yta", "link": { "edit": "Redigera länk", + "editEmbed": "Redigera länk & bädda in", "create": "Skapa länk", - "label": "Länk" + "createEmbed": "Skapa länk & bädda in", + "label": "Länk", + "labelEmbed": "Länka & bädda in", + "empty": "Ingen länk är angiven" }, "lineEditor": { "edit": "Redigera linje", @@ -160,13 +164,16 @@ "darkMode": "Mörkt läge", "lightMode": "Ljust läge", "zenMode": "Zen-läge", + "objectsSnapMode": "Fäst mot objekt", "exitZenMode": "Gå ur zen-läge", "cancel": "Avbryt", "clear": "Rensa", "remove": "Ta bort", + "embed": "Växla inbäddning", "publishLibrary": "Publicera", "submit": "Skicka", - "confirm": "Bekräfta" + "confirm": "Bekräfta", + "embeddableInteractionButton": "Klicka för att interagera" }, "alerts": { "clearReset": "Detta rensar hela canvasen. Är du säker?", @@ -196,6 +203,7 @@ "imageInsertError": "Kunde inte infoga bild. Försök igen senare...", "fileTooBig": "Filen är för stor. Maximal tillåten storlek är {{maxSize}}.", "svgImageInsertError": "Kunde inte infoga SVG-bild. SVG-koden ser ogiltig ut.", + "failedToFetchImage": "Kunde inte hämta bilden.", "invalidSVGString": "Ogiltig SVG.", "cannotResolveCollabServer": "Det gick inte att ansluta till samarbets-servern. Ladda om sidan och försök igen.", "importLibraryError": "Kunde inte ladda bibliotek", @@ -206,6 +214,10 @@ "line2": "Detta kan resultera i trasiga Textelement i dina ritningar.", "line3": "Vi rekommenderar starkt att du inaktiverar den här inställningen. Du kan följa dessa steg för att inaktivera den.", "line4": "Om inaktivering av denna inställning inte åtgärdar visningen av textelement, öppna ett ärende på vår GitHub, eller skriv till oss på Discord" + }, + "libraryElementTypeError": { + "embeddable": "Inbäddbara element kan inte läggas till i biblioteket.", + "image": "Stöd för att lägga till bilder till biblioteket kommer snart!" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Lägg till / Uppdatera länk för en vald form", "eraser": "Radergummi", "frame": "Rutverktyg", + "embeddable": "Bädda in (web)", + "laser": "Laserpekare", "hand": "Hand (panoreringsverktyg)", "extraTools": "Fler verktyg" }, @@ -237,6 +251,7 @@ "linearElement": "Klicka för att starta flera punkter, dra för en linje", "freeDraw": "Klicka och dra, släpp när du är klar", "text": "Tips: du kan också lägga till text genom att dubbelklicka var som helst med markeringsverktyget", + "embeddable": "Klicka-dra för att skapa en webbplats-inbäddning", "text_selected": "Dubbelklicka eller tryck ENTER för att redigera text", "text_editing": "Tryck Escape eller CtrlOrCmd + ENTER för att slutföra redigeringen", "linearElementMulti": "Klicka på sista punkten eller tryck Escape eller Enter för att avsluta", @@ -252,7 +267,8 @@ "bindTextToElement": "Tryck på Enter för att lägga till text", "deepBoxSelect": "Håll Ctrl eller Cmd för att djupvälja, och för att förhindra att dra", "eraserRevert": "Håll Alt för att återställa de element som är markerade för borttagning", - "firefox_clipboard_write": "Denna funktion kan sannolikt aktiveras genom att ställa in \"dom.events.asyncClipboard.clipboardItem\" flaggan till \"true\". För att ändra webbläsarens flaggor i Firefox, besök \"about:config\" sidan." + "firefox_clipboard_write": "Denna funktion kan sannolikt aktiveras genom att ställa in \"dom.events.asyncClipboard.clipboardItem\" flaggan till \"true\". För att ändra webbläsarens flaggor i Firefox, besök \"about:config\" sidan.", + "disableSnapping": "Håll Ctrl eller Cmd för att inaktivera fästning" }, "canvasError": { "cannotShowPreview": "Kan inte visa förhandsgranskning", @@ -411,7 +427,9 @@ "fileSavedToFilename": "Sparad till {filename}", "canvas": "canvas", "selection": "markering", - "pasteAsSingleElement": "Använd {{shortcut}} för att klistra in som ett enda element,\neller klistra in i en befintlig textredigerare" + "pasteAsSingleElement": "Använd {{shortcut}} för att klistra in som ett enda element,\neller klistra in i en befintlig textredigerare", + "unableToEmbed": "Att bädda in denna webbadress är för närvarande inte tillåtet. Skapa en problemrapport på GitHub för att begära att webbadressen vitlistas.", + "unrecognizedLinkFormat": "Länken du bäddade in matchar inte det förväntade formatet. Försök klistra in 'embed'-strängen som tillhandahålls av källwebbplatsen" }, "colors": { "transparent": "Genomskinlig", @@ -449,5 +467,36 @@ "shades": "Nyanser", "hexCode": "Hex-kod", "noShades": "Inga nyanser tillgängliga för denna färg" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Exportera som bild", + "button": "Exportera som bild", + "description": "Exportera scendata som en bild från vilken du kan importera senare." + }, + "saveToDisk": { + "title": "Spara till disk", + "button": "Spara till disk", + "description": "Exportera scendata till en fil från vilken du kan importera senare." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Exportera till Excalidraw+", + "description": "Spara skissen till din Excalidraw+ arbetsyta." + } + }, + "modal": { + "loadFromFile": { + "title": "Läs in från fil", + "button": "Läs in från fil", + "description": "Laddar från en fil kommer ersätta ditt befintliga innehåll.

Du kan säkerhetskopiera din ritning först med hjälp av ett av alternativen nedan." + }, + "shareableLink": { + "title": "Läs in från länk", + "button": "Ersätt mitt innehåll", + "description": "Inläsning av en extern ritning kommer ersätta ditt befintliga innehåll.

Du kan säkerhetskopiera din ritning först genom att använda ett av alternativen nedan." + } + } } } diff --git a/src/locales/ta-IN.json b/src/locales/ta-IN.json index f7022391f..05d8c3dae 100644 --- a/src/locales/ta-IN.json +++ b/src/locales/ta-IN.json @@ -109,8 +109,12 @@ "createContainerFromText": "உரையைக் கொள்கலனுள் சுருட்டு", "link": { "edit": "தொடுப்பைத் திருத்து", + "editEmbed": "", "create": "தொடுப்பைப் படை", - "label": "தொடுப்பு" + "createEmbed": "", + "label": "தொடுப்பு", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "தொடுப்பைத் திருத்து", @@ -160,13 +164,16 @@ "darkMode": "கருமை பயன்முறை", "lightMode": "வெளிர்ந்த பயன்முறை", "zenMode": "ஜென் பயன்முறை", + "objectsSnapMode": "", "exitZenMode": "ஜென் பயன்முறையை விலகு", "cancel": "ரத்துசெய்", "clear": "துடை", "remove": "நீக்கு", + "embed": "", "publishLibrary": "பிரசுரி", "submit": "சமர்ப்பி", - "confirm": "உறுதிசெய்" + "confirm": "உறுதிசெய்", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "இது முழு கித்தானையும் துடைக்கும். நீங்கள் உறுதியா?", @@ -196,6 +203,7 @@ "imageInsertError": "படத்தைப் புகுத்தவியலா. பிறகு மீண்டும் முயலவும்...", "fileTooBig": "கோப்பு மிகப்பெரிது. அனுமதிக்கப்பட்ட அதிகபட்ச அளவு {{maxSize}}.", "svgImageInsertError": "எஸ்விஜி படத்தைப் புகுத்தவியலா. எஸ்விஜியின் மார்க்அப் செல்லாததாக தெரிகிறது.", + "failedToFetchImage": "", "invalidSVGString": "செல்லாத SVG.", "cannotResolveCollabServer": "கூட்டுப்பணிச் சேவையகத்துடன் இணைக்க முடியவில்லை. பக்கத்தை மீளேற்றி மீண்டும் முயலவும்.", "importLibraryError": "நூலகத்தை ஏற்ற முடியவில்லை", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -220,12 +232,14 @@ "text": "உரை", "library": "நூலகம்", "lock": "தேர்ந்த கருவியை வரைந்த பின்பும் வைத்திரு", - "penMode": "", + "penMode": "பேனா - தடுப்பு தொடுதல்", "link": "தேர்தெடுத்த வடிவத்திற்குத் தொடுப்பைச் சேர்/ புதுப்பி", "eraser": "அழிப்பி", - "frame": "", - "hand": "", - "extraTools": "" + "frame": "சட்டகம் கருவி", + "embeddable": "", + "laser": "", + "hand": "கை (பார்வை நகர்கும் கருவி)", + "extraTools": "மற்ற கருவிகள்" }, "headings": { "canvasActions": "கித்தான் செயல்கள்", @@ -237,6 +251,7 @@ "linearElement": "பல புள்ளிகளைத் துவக்க சொடுக்கு, ஒற்றை வரிக்கு பிடித்திழு", "freeDraw": "சொடுக்கி பிடித்திழு, முடித்ததும் விடுவி", "text": "துணுக்குதவி: தெரிவு கருவி கொண்டு எங்காவது இரு-சொடுக்கி உரையைச் சேர்க்கலாம்", + "embeddable": "", "text_selected": "உரையைத் திருத்த இரு-சொடுக்கு அ ENTERஐ அழுத்து", "text_editing": "திருத்துவதை முடிக்க Escape அ CtrlOrCmd+ENTERஐ அழுத்து", "linearElementMulti": "கடைசி புள்ளியில் சொடுக்கு அ முடிக்க Escape அ Enter அழுத்து", @@ -252,7 +267,8 @@ "bindTextToElement": "உரையைச் சேர்க்க enterஐ அழுத்து", "deepBoxSelect": "ஆழ்ந்துத் தேரவும் பிடித்திழுத்தலைத் தவிர்க்கவும் CtrlOrCmdஐ அழுத்திப்பிடி", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "முன்னோட்டம் காட்ட இயலவில்லை", @@ -317,8 +333,8 @@ "zoomToFit": "அனைத்துறுப்புகளும் பொருந்தும்படி விரிவாக்கு", "zoomToSelection": "தெரிவுக்கு விரிவாக்கு", "toggleElementLock": "தேர்ந்தெடுப்பைப் பூட்டு/பூட்டவிழ்", - "movePageUpDown": "", - "movePageLeftRight": "" + "movePageUpDown": "மேலே/கீழே நகர்த்தவும்", + "movePageLeftRight": "இடது/வலது பக்கம் நகர்த்தவும்" }, "clearCanvasDialog": { "title": "கித்தானைத் துடை" @@ -360,26 +376,26 @@ "removeItemsFromLib": "நூலகத்திலிருந்து தேர்ந்தெடுத்த உருப்படிகளை நீக்கு" }, "imageExportDialog": { - "header": "", + "header": "படத்தை ஏற்றுமதிதல", "label": { - "withBackground": "", - "onlySelected": "", - "darkMode": "", - "embedScene": "", - "scale": "", + "withBackground": "பின்னணி", + "onlySelected": "தேர்ந்ததை மட்டும்", + "darkMode": "இருள் பயன்முறை", + "embedScene": "காட்சியை உட்பொதி", + "scale": "அளவுகோல்", "padding": "" }, "tooltip": { "embedScene": "" }, "title": { - "exportToPng": "", - "exportToSvg": "", + "exportToPng": "PNGக்கு ஏற்றுமதிசெய்", + "exportToSvg": "SVGக்கு ஏற்றுமதிசெய்", "copyPngToClipboard": "" }, "button": { - "exportToPng": "", - "exportToSvg": "", + "exportToPng": "PNG", + "exportToSvg": "SVG", "copyPngToClipboard": "" } }, @@ -411,24 +427,26 @@ "fileSavedToFilename": "{filename}-க்கு சேமிக்கப்பட்டது", "canvas": "கித்தான்", "selection": "தெரிவு", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "ஒளிபுகுத்தன்மை", - "black": "", - "white": "", - "red": "", - "pink": "", - "grape": "", - "violet": "", - "gray": "", - "blue": "", - "cyan": "", - "teal": "", - "green": "", - "yellow": "", - "orange": "", - "bronze": "" + "black": "கருப்பு", + "white": "வெள்ளை", + "red": "சிவப்பு", + "pink": "இளஞ்சிவப்பு", + "grape": "திராட்சை", + "violet": "ஊதா", + "gray": "சாம்பல்", + "blue": "நீலம்", + "cyan": "மயில்நிறம்", + "teal": "டீல்", + "green": "பச்சை", + "yellow": "மஞ்சள்", + "orange": "ஆரஞ்சு", + "bronze": "வெண்கலம்" }, "welcomeScreen": { "app": { @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/th-TH.json b/src/locales/th-TH.json index 9d06b8cbb..57258e2fa 100644 --- a/src/locales/th-TH.json +++ b/src/locales/th-TH.json @@ -22,22 +22,22 @@ "background": "พื้นหลัง", "fill": "เติมสี", "strokeWidth": "น้ำหนักเส้นขอบ", - "strokeStyle": "", - "strokeStyle_solid": "", - "strokeStyle_dashed": "", - "strokeStyle_dotted": "", + "strokeStyle": "รูปแบบเส้น", + "strokeStyle_solid": "เส้นทึบ", + "strokeStyle_dashed": "เส้นประ", + "strokeStyle_dotted": "จุด", "sloppiness": "ความเลอะเทอะ", "opacity": "ความทึบแสง", "textAlign": "จัดข้อความ", "edges": "ขอบ", "sharp": "", "round": "", - "arrowheads": "", - "arrowhead_none": "", - "arrowhead_arrow": "", - "arrowhead_bar": "", - "arrowhead_dot": "", - "arrowhead_triangle": "", + "arrowheads": "หัวลูกศร", + "arrowhead_none": "ไม่มี", + "arrowhead_arrow": "ลูกศร", + "arrowhead_bar": "แถบ", + "arrowhead_dot": "จุด", + "arrowhead_triangle": "สามเหลี่ยม", "fontSize": "ขนาดตัวอักษร", "fontFamily": "แบบตัวอักษร", "addWatermark": "เพิ่มลายน้ำ \"สร้างด้วย Excalidraw\"", @@ -59,7 +59,7 @@ "right": "ขวา", "extraBold": "หนาพิเศษ", "architect": "", - "artist": "", + "artist": "ศิลปิน", "cartoonist": "", "fileTitle": "ชื่อไฟล์", "colorPicker": "เลือกสีที่กำหนดเอง", @@ -104,13 +104,17 @@ "excalidrawLib": "คลังของ Excalidraw", "decreaseFontSize": "ลดขนาดตัวอักษร", "increaseFontSize": "เพิ่มขนาดตัวอักษร", - "unbindText": "", + "unbindText": "ยกเลิกการผูกติด", "bindText": "", "createContainerFromText": "", "link": { "edit": "แก้ไขลิงก์", + "editEmbed": "แก้ไขลิงค์และการฝัง", "create": "สร้างลิงค์", - "label": "ลิงค์" + "createEmbed": "สร้างลิงค์และการฝัง", + "label": "ลิงค์", + "labelEmbed": "ลิงค์และการฝัง", + "empty": "ไม่ได้ใส่ลิงค์" }, "lineEditor": { "edit": "แก้ไขเส้น", @@ -129,18 +133,18 @@ "eyeDropper": "" }, "library": { - "noItems": "", + "noItems": "ยังไม่มีรายการที่เพิ่มเข้าไปได้", "hint_emptyLibrary": "", "hint_emptyPrivateLibrary": "" }, "buttons": { - "clearReset": "", + "clearReset": "รีเซ็ทผืนผ้าใบ", "exportJSON": "ส่งออกไปยังไฟล์", "exportImage": "ส่งออกเป็นรูปภาพ", "export": "บันทึกไปยัง", "copyToClipboard": "คัดลอกไปยังคลิปบอร์ด", - "save": "", - "saveAs": "", + "save": "บันทึกเป็นไฟล์ปัจจุบัน", + "saveAs": "บันทึกเป็น", "load": "เปิด", "getShareableLink": "สร้างลิงค์ที่แชร์ได้", "close": "ปิด", @@ -160,21 +164,24 @@ "darkMode": "โหมดกลางคืน", "lightMode": "โหมดกลางวัน", "zenMode": "โหมด Zen", + "objectsSnapMode": "", "exitZenMode": "ออกจากโหมด Zen", "cancel": "ยกเลิก", "clear": "เคลียร์", "remove": "ลบ", + "embed": "สลับการฝัง", "publishLibrary": "เผยแพร่", "submit": "ตกลง", - "confirm": "ยืนยัน" + "confirm": "ยืนยัน", + "embeddableInteractionButton": "คลิกเพื่อปฏิสัมพันธ์" }, "alerts": { "clearReset": "", - "couldNotCreateShareableLink": "", + "couldNotCreateShareableLink": "ไม่สามารถสร้างลิงค์ได้", "couldNotCreateShareableLinkTooBig": "", "couldNotLoadInvalidFile": "ไม่สามารถโหลดไฟล์ที่ผิดพลาดได้", - "importBackendFailed": "", - "cannotExportEmptyCanvas": "", + "importBackendFailed": "เกิดข้อผิดพลาดจากการนำเข้าจากระบบหลังบ้าน", + "cannotExportEmptyCanvas": "ไม่สามารถนำออกจากผืนผ้าใบที่ว่างเปล่าได้", "couldNotCopyToClipboard": "ไม่สามารถคัดลอกไปยังคลิปบอร์ดได้", "decryptFailed": "ไม่สามารถถอดรหัสข้อมูลได้", "uploadedSecurly": "การอัพโหลดได้ถูกเข้ารหัสแบบ end-to-end หมายความว่าเซิร์ฟเวอร์ของ Excalidraw และบุคคลอื่นไม่สามารถอ่านข้อมูลได้", @@ -196,6 +203,7 @@ "imageInsertError": "ไม่สามารถเพิ่มรูปภาพได้ ลองอีกครั้งในภายหลัง", "fileTooBig": "", "svgImageInsertError": "", + "failedToFetchImage": "", "invalidSVGString": "ไฟล์ SVG ผิดพลาด", "cannotResolveCollabServer": "ไม่สามารถเชื่อต่อกับ collab เซิร์ฟเวอร์ได้ โปรดลองโหลดหน้านี้ใหม่และลองอีกครั้ง", "importLibraryError": "", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "การเพิ่มองค์ประกอบที่ฝังยังไม่สามารถเพิ่มเข้าไปในไลบลารีได้", + "image": "การสนับสนุนสำหรับเพิ่มรูปภาพลงในไลบลารีจะมาในเร็ว ๆ นี้" } }, "toolBar": { @@ -213,8 +225,8 @@ "image": "", "rectangle": "สี่เหลี่ยมผืนผ้า", "diamond": "", - "ellipse": "", - "arrow": "", + "ellipse": "วงรี", + "arrow": "ลูกศร", "line": "", "freedraw": "", "text": "ข้อความ", @@ -224,8 +236,10 @@ "link": "", "eraser": "ยางลบ", "frame": "", + "embeddable": "ฝังเว็บ", + "laser": "", "hand": "", - "extraTools": "" + "extraTools": "เครื่องมืออื่นๆ" }, "headings": { "canvasActions": "", @@ -237,6 +251,7 @@ "linearElement": "", "freeDraw": "", "text": "", + "embeddable": "คลิกและลากเพื่อสร้างการฝังสำหรับเว็บไซต์", "text_selected": "คลิกสองครั้งหรือกด ENTER เพื่อแก้ไขข้อความ", "text_editing": "กดปุ่ม Esc หรือกด Ctrl, Cmd + Enter เพื่อเสร็จการแก้ไข", "linearElementMulti": "คลิกที่จุดสุดท้ายหรือกด Escape หรือ Enter เพื่อเสร็จสิ้น", @@ -252,7 +267,8 @@ "bindTextToElement": "", "deepBoxSelect": "", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "", @@ -303,7 +319,7 @@ "drag": "ลาก", "editor": "", "editLineArrowPoints": "", - "editText": "", + "editText": "แก้ไขข้อความ / เพิ่มข้อความ", "github": "", "howto": "", "or": "", @@ -364,7 +380,7 @@ "label": { "withBackground": "", "onlySelected": "", - "darkMode": "", + "darkMode": "โหมดกลางคืน", "embedScene": "", "scale": "", "padding": "" @@ -373,14 +389,14 @@ "embedScene": "" }, "title": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "ส่งออกไปเป็น SVG", + "exportToSvg": "ส่งออกไปเป็น SVG", + "copyPngToClipboard": "คัดลอก PNG ไปยังคลิปบอร์ด" }, "button": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "PNG", + "exportToSvg": "SVG", + "copyPngToClipboard": "คัดลอกไปยังคลิปบอร์ด" } }, "encrypted": { @@ -411,7 +427,9 @@ "fileSavedToFilename": "", "canvas": "", "selection": "", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "", @@ -424,11 +442,11 @@ "gray": "", "blue": "", "cyan": "", - "teal": "", - "green": "", - "yellow": "", - "orange": "", - "bronze": "" + "teal": "ฟ้าน้ำทะเล", + "green": "เขียว", + "yellow": "เหลือง", + "orange": "ส้ม", + "bronze": "ทองแดง" }, "welcomeScreen": { "app": { @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/tr-TR.json b/src/locales/tr-TR.json index 8130134ef..e9cc463e9 100644 --- a/src/locales/tr-TR.json +++ b/src/locales/tr-TR.json @@ -50,7 +50,7 @@ "veryLarge": "Çok geniş", "solid": "Dolu", "hachure": "Taralı", - "zigzag": "", + "zigzag": "Zikzak", "crossHatch": "Çapraz-taralı", "thin": "İnce", "bold": "Kalın", @@ -106,11 +106,15 @@ "increaseFontSize": "Yazı Tipi Boyutunu Büyült", "unbindText": "Metni çöz", "bindText": "Metni taşıyıcıya bağla", - "createContainerFromText": "", + "createContainerFromText": "Metni bileşen içinde sar", "link": { "edit": "Bağlantıyı düzenle", + "editEmbed": "Bağlantıyı düzenle & yerleştir", "create": "Bağlantı oluştur", - "label": "Bağlantı" + "createEmbed": "Bağlantı oluştur & yerleştir", + "label": "Bağlantı", + "labelEmbed": "Bağlantı & yerleştirme", + "empty": "Herhangi bir bağlantı oluşturulmadı" }, "lineEditor": { "edit": "Çizgiyi düzenle", @@ -124,9 +128,9 @@ }, "statusPublished": "Yayınlandı", "sidebarLock": "Kenar çubuğu açık kalsın", - "selectAllElementsInFrame": "", - "removeAllElementsFromFrame": "", - "eyeDropper": "" + "selectAllElementsInFrame": "Çerçevedeki tüm bileşenleri seç", + "removeAllElementsFromFrame": "Çerçevedeki tüm bileşenleri sil", + "eyeDropper": "Tuvalden renk seç" }, "library": { "noItems": "Öğe eklenmedi...", @@ -160,13 +164,16 @@ "darkMode": "Koyu tema", "lightMode": "Açık tema", "zenMode": "Zen modu", + "objectsSnapMode": "Nesnelere hizala", "exitZenMode": "Zen modundan çık", "cancel": "İptal", "clear": "Temizle", "remove": "Kaldır", + "embed": "", "publishLibrary": "Yayınla", "submit": "Gönder", - "confirm": "Onayla" + "confirm": "Onayla", + "embeddableInteractionButton": "Etkileşime girmek için tıkla" }, "alerts": { "clearReset": "Tuvalin tamamı temizlenecek. Emin misiniz?", @@ -189,13 +196,14 @@ "resetLibrary": "Bu işlem kütüphanenizi sıfırlayacak. Emin misiniz?", "removeItemsFromsLibrary": "{{count}} öğe(ler) kitaplıktan kaldırılsın mı?", "invalidEncryptionKey": "Şifreleme anahtarı 22 karakter olmalı. Canlı işbirliği devre dışı bırakıldı.", - "collabOfflineWarning": "" + "collabOfflineWarning": "İnternet bağlantısı bulunamadı. Değişiklikleriniz kaydedilmeyecek!" }, "errors": { "unsupportedFileType": "Desteklenmeyen dosya türü.", "imageInsertError": "Görsel eklenemedi. Daha sonra tekrar deneyin...", "fileTooBig": "Dosya çok büyük. İzin verilen maksimum boyut {{maxSize}}.", "svgImageInsertError": "SVG resmi eklenemedi. SVG işaretlemesi geçersiz görünüyor.", + "failedToFetchImage": "", "invalidSVGString": "Geçersiz SVG.", "cannotResolveCollabServer": "İş birliği sunucusuna bağlanılamıyor. Lütfen sayfayı yenileyip tekrar deneyin.", "importLibraryError": "Kütüphane yüklenemedi", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "Resimleri kütüphaneye ekleme desteği yakında geliyor!" } }, "toolBar": { @@ -223,9 +235,11 @@ "penMode": "Kalem modu - dokunmayı engelle", "link": "Seçilen şekil için bağlantı Ekle/Güncelle", "eraser": "Silgi", - "frame": "", + "frame": "Çerçeve aracı", + "embeddable": "Web Yerleştirme", + "laser": "Lazer işaretçisi", "hand": "", - "extraTools": "" + "extraTools": "Daha fazla araç" }, "headings": { "canvasActions": "Tuval eylemleri", @@ -237,6 +251,7 @@ "linearElement": "Birden fazla nokta için tıklayın, tek çizgi için sürükleyin", "freeDraw": "Tıkla ve sürükle, bitirdiğinde serbest bırak", "text": "İpucu: seçme aracıyla herhangi bir yere çift tıklayarak da yazı ekleyebilirsin", + "embeddable": "Web sitesi yerleştirmek için sürükle bırak", "text_selected": "Metni düzenlemek için çift tıklayın veya ENTER'a basın", "text_editing": "Düzenlemeyi bitirmek için ESC veya Ctrl/Cmd+ENTER tuşlarına basın", "linearElementMulti": "Bitirmek için son noktaya tıklayın ya da Escape veya Enter tuşuna basın", @@ -252,7 +267,8 @@ "bindTextToElement": "Enter tuşuna basarak metin ekleyin", "deepBoxSelect": "Ctrl/Cmd tuşuna basılı tutarak derin seçim yapın ya da sürüklemeyi engelleyin", "eraserRevert": "Alt tuşuna basılı tutarak silinme için işaretlenmiş ögeleri tersine çevirin", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Önizleme gösterilemiyor", @@ -360,27 +376,27 @@ "removeItemsFromLib": "Seçilen ögeleri kütüphaneden kaldır" }, "imageExportDialog": { - "header": "", + "header": "Resmi dışa aktar", "label": { - "withBackground": "", - "onlySelected": "", - "darkMode": "", - "embedScene": "", - "scale": "", - "padding": "" + "withBackground": "Arka plan", + "onlySelected": "Sadece seçilen", + "darkMode": "Karanlık mod", + "embedScene": "Sahne yerleştir", + "scale": "Ölçeklendir", + "padding": "Dış boşluk" }, "tooltip": { - "embedScene": "" + "embedScene": "Sahne verisi, sahnenin geri yüklenebilmesi için dışarı aktarılan PNG/SVG dosyasına kaydedilecektir. Bu, dışa aktarılan dosya boyutunu arttıracaktır." }, "title": { - "exportToPng": "", - "exportToSvg": "", + "exportToPng": "PNG olarak dışa aktar", + "exportToSvg": "SVG olarak dışa aktar", "copyPngToClipboard": "" }, "button": { - "exportToPng": "", - "exportToSvg": "", - "copyPngToClipboard": "" + "exportToPng": "PNG", + "exportToSvg": "SVG", + "copyPngToClipboard": "Panoya kopyala" } }, "encrypted": { @@ -411,29 +427,31 @@ "fileSavedToFilename": "{filename} kaydedildi", "canvas": "tuval", "selection": "seçim", - "pasteAsSingleElement": "Tekil obje olarak yapıştırmak için veya var olan bir metin editörüne yapıştırmak için {{shortcut}} kullanın" + "pasteAsSingleElement": "Tekil obje olarak yapıştırmak için veya var olan bir metin editörüne yapıştırmak için {{shortcut}} kullanın", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "Şeffaf", - "black": "", - "white": "", - "red": "", - "pink": "", - "grape": "", - "violet": "", - "gray": "", - "blue": "", - "cyan": "", - "teal": "", - "green": "", - "yellow": "", - "orange": "", + "black": "Siyah", + "white": "Beyaz", + "red": "Kırmızı", + "pink": "Pembe", + "grape": "Koyu Mor", + "violet": "Menekşe rengi", + "gray": "Gri", + "blue": "Mavi", + "cyan": "Camgöbeği", + "teal": "Deniz mavisi", + "green": "Yeşil", + "yellow": "Sarı", + "orange": "Turuncu", "bronze": "" }, "welcomeScreen": { "app": { "center_heading": "", - "center_heading_plus": "", + "center_heading_plus": "Ecalidraw+'a mı gitmek istediniz?", "menuHint": "Dışa aktar, seçenekler, diller, ..." }, "defaults": { @@ -444,10 +462,41 @@ } }, "colorPicker": { - "mostUsedCustomColors": "", - "colors": "", + "mostUsedCustomColors": "En çok kullanılan özel renkler", + "colors": "Renkler", "shades": "", - "hexCode": "", + "hexCode": "Hex kodu", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "Diske Kaydet", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/uk-UA.json b/src/locales/uk-UA.json index 36d9fc7af..5e3c4add9 100644 --- a/src/locales/uk-UA.json +++ b/src/locales/uk-UA.json @@ -109,8 +109,12 @@ "createContainerFromText": "Огорнути текст у контейнер", "link": { "edit": "Редагування посилання", + "editEmbed": "Редагування посилання і вкладення", "create": "Створити посилання", - "label": "Посилання" + "createEmbed": "Створити посилання і вкладення", + "label": "Посилання", + "labelEmbed": "Посилання і вкладення", + "empty": "Посилання відсутнє" }, "lineEditor": { "edit": "Редагувати лінію", @@ -124,9 +128,9 @@ }, "statusPublished": "Опубліковано", "sidebarLock": "Не закривати бокове меню", - "selectAllElementsInFrame": "", - "removeAllElementsFromFrame": "", - "eyeDropper": "" + "selectAllElementsInFrame": "Обрати всі елементи у фреймі", + "removeAllElementsFromFrame": "Видалити всі елементи з фрейму", + "eyeDropper": "Вибрати колір з полотна" }, "library": { "noItems": "Тут поки пусто...", @@ -160,13 +164,16 @@ "darkMode": "Темна тема", "lightMode": "Світла тема", "zenMode": "Режим Дзен", + "objectsSnapMode": "", "exitZenMode": "Вийти з дзен-режиму", "cancel": "Скасувати", "clear": "Очистити", "remove": "Видалити", + "embed": "Перемкнути вкладення", "publishLibrary": "Опублікувати", "submit": "Надіслати", - "confirm": "Підтвердити" + "confirm": "Підтвердити", + "embeddableInteractionButton": "Натисніть для взаємодії" }, "alerts": { "clearReset": "Це очистить все полотно. Впевнені?", @@ -196,6 +203,7 @@ "imageInsertError": "Не вдалося вставити зображення. Повторіть спробу пізніше...", "fileTooBig": "Занадто великий розмір файлу, максимальний розмір файлу {{maxSize}}.", "svgImageInsertError": "Не вдалося вставити SVG-зображення. Помилка розмітки SVG.", + "failedToFetchImage": "", "invalidSVGString": "Недійсний SVG.", "cannotResolveCollabServer": "Не вдалося приєднатися до сервера. Перезавантажте сторінку та повторіть спробу.", "importLibraryError": "Не вдалося завантажити бібліотеку", @@ -206,6 +214,10 @@ "line2": "Це може нашкодити текстовим елементам у ваших малюнках.", "line3": "Ми наполегливо рекомендуємо вимкнути це налаштування. Виконайте наступні кроки, щоб виправити це.", "line4": "Якщо вимкнення цього параметра не вирішує показ текстових елементів, тоді створіть, будь ласка, запит на розв'язання проблеми на нашому GitHub або напишіть нам у Discord" + }, + "libraryElementTypeError": { + "embeddable": "Вбудовані елементи не можна додати в бібліотеку.", + "image": "Підтримка додавання зображень в бібліотеку найближчим часом!" } }, "toolBar": { @@ -223,9 +235,11 @@ "penMode": "Режим пера - запобігання дотику", "link": "Додати/Оновити посилання для вибраної форми", "eraser": "Очищувач", - "frame": "", + "frame": "Інструмент фрейму", + "embeddable": "Веб вкладення", + "laser": "", "hand": "Рука (інструмент для панорамування)", - "extraTools": "" + "extraTools": "Інші інструменти" }, "headings": { "canvasActions": "Дії з полотном", @@ -237,6 +251,7 @@ "linearElement": "Натисніть щоб додати кілька точок. Перетягніть щоб намалювати одну лінію", "freeDraw": "Натисніть і потягніть, відпустіть коли завершите", "text": "Порада: можна також додати текст, двічі клацнувши по будь-якому місці інструментом вибору", + "embeddable": "Клікніть та перетягніть для створення вбудованого вебсайту", "text_selected": "Подвійний клік або натисніть клавішу ENTER, щоб редагувати текст", "text_editing": "Натисніть клавішу Escape або Ctrl/Cmd+ENTER, щоб завершити редагування", "linearElementMulti": "Натисніть на останню точку, клацніть Esc або Enter щоб завершити", @@ -252,7 +267,8 @@ "bindTextToElement": "Натисніть Enter, щоб додати текст", "deepBoxSelect": "Втримуйте Ctrl/Cmd для глибокого виділення та щоб попередити перетягування", "eraserRevert": "Втримуйте клавішу Alt, щоб повернути елементи позначені для видалення", - "firefox_clipboard_write": "Цю функцію можна ввімкнути, встановивши значення \"true\" для налаштування \"dom.events.asyncClipboard.clipboardItem\". Перейдіть на сторінку «about:config», щоб змінити налаштування браузера у Firefox." + "firefox_clipboard_write": "Цю функцію можна ввімкнути, встановивши значення \"true\" для налаштування \"dom.events.asyncClipboard.clipboardItem\". Перейдіть на сторінку «about:config», щоб змінити налаштування браузера у Firefox.", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Не вдається показати попередній перегляд", @@ -362,25 +378,25 @@ "imageExportDialog": { "header": "Експортувати зображення", "label": { - "withBackground": "", + "withBackground": "Тло", "onlySelected": "Тільки вибране", "darkMode": "Темний режим", "embedScene": "Вбудована сцена", - "scale": "", - "padding": "" + "scale": "Масштабування", + "padding": "Відступ" }, "tooltip": { - "embedScene": "" + "embedScene": "Дані сцени будуть збережені в експортований файл PNG/SVG. Ця сцена може бути відновлена з нього, однак це збільшить розмір експортованого файлу." }, "title": { "exportToPng": "Експортувати в PNG", "exportToSvg": "Експортувати у SVG", - "copyPngToClipboard": "" + "copyPngToClipboard": "Скопіювати PNG в буфер обміну" }, "button": { "exportToPng": "PNG", "exportToSvg": "SVG", - "copyPngToClipboard": "" + "copyPngToClipboard": "Копіювати в буфер обміну" } }, "encrypted": { @@ -411,7 +427,9 @@ "fileSavedToFilename": "Збережено в {filename}", "canvas": "полотно", "selection": "виділення", - "pasteAsSingleElement": "Використайте {{shortcut}} для вставки самостійного зразка або використайте в текстовому редакторі" + "pasteAsSingleElement": "Використайте {{shortcut}} для вставки самостійного зразка або використайте в текстовому редакторі", + "unableToEmbed": "Вбудування цієї url на даний час не допускається. Підніміть питання на GitHub, щоб попросити внести URL-адресу до білого списку", + "unrecognizedLinkFormat": "Посилання, яке ви вставили, не відповідає очікуваному формату. Будь ласка, спробуйте вставити рядок \"embed\", наданий сайтом-джерелом" }, "colors": { "transparent": "Прозорий", @@ -419,12 +437,12 @@ "white": "Білий", "red": "Червоний", "pink": "Рожевий", - "grape": "", + "grape": "Виноградний", "violet": "Фіолетовий", "gray": "Сірий", "blue": "Синій", "cyan": "Ціан", - "teal": "", + "teal": "Бірюзовий", "green": "Зелений", "yellow": "Жовтий", "orange": "Помаранчевий", @@ -446,8 +464,39 @@ "colorPicker": { "mostUsedCustomColors": "Найбільш використовувані користувацькі кольори", "colors": "Кольори", - "shades": "", + "shades": "Тіні", "hexCode": "Hex-код", - "noShades": "" + "noShades": "Немає доступних відтінків цього кольору" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "Експортувати як зображення", + "button": "Експортувати як зображення", + "description": "Експорт даних сцени у вигляді зображення, з якого можна імпортувати пізніше." + }, + "saveToDisk": { + "title": "Зберегти на диск", + "button": "Зберегти на диск", + "description": "Експорт даних сцени в файл, з якого можна імпортувати пізніше." + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "Експортувати до Excalidraw+", + "description": "Зберегти сцену до робочого простору Excalidraw+." + } + }, + "modal": { + "loadFromFile": { + "title": "Завантажити з файлу", + "button": "Завантажити з файлу", + "description": "Завантаження з файлу замінить наявний вміст.

Ви можете спочатку створити резервну копію малюнка, скориставшись одним із наведених нижче способів." + }, + "shareableLink": { + "title": "Завантажити з посилання", + "button": "Замінити мій контент", + "description": "Завантаження зовнішнього малюнка замінить ваш наявний вміст.

Ви можете спочатку створити резервну копію малюнка, скориставшись одним із наведених нижче способів." + } + } } } diff --git a/src/locales/vi-VN.json b/src/locales/vi-VN.json index e692854a8..2f8381b55 100644 --- a/src/locales/vi-VN.json +++ b/src/locales/vi-VN.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "Sửa liên kết", + "editEmbed": "", "create": "Tạo liên kết", - "label": "Liên kết" + "createEmbed": "", + "label": "Liên kết", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "Điều chỉnh nét", @@ -160,13 +164,16 @@ "darkMode": "Chế độ tối", "lightMode": "Chế độ sáng", "zenMode": "Chế độ zen", + "objectsSnapMode": "", "exitZenMode": "Thoát chể độ zen", "cancel": "Hủy", "clear": "Làm sạch", "remove": "Xóa", + "embed": "", "publishLibrary": "Đăng tải", "submit": "Gửi", - "confirm": "Xác nhận" + "confirm": "Xác nhận", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "Điều này sẽ dọn hết canvas. Bạn có chắc không?", @@ -196,6 +203,7 @@ "imageInsertError": "Không thể thêm ảnh. Hãy thử lại sau...", "fileTooBig": "Tệp tin quá lớn. Dung lượng tối đa cho phép là {{maxSize}}.", "svgImageInsertError": "Không thể thêm ảnh SVG. Mã SVG có vẻ sai.", + "failedToFetchImage": "", "invalidSVGString": "SVG không hợp lệ.", "cannotResolveCollabServer": "Không thể kết nối với máy chủ hợp tác. Hãy tải lại trang và thử lại.", "importLibraryError": "Không thể tải thư viện", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "Thêm/ Chỉnh sửa liên kết cho hình được chọn", "eraser": "Xóa", "frame": "", + "embeddable": "", + "laser": "", "hand": "Tay kéo", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "Ấn để bắt đầu nhiểm điểm vẽ, kéo để vẽ một đường thẳng", "freeDraw": "Ấn bà kéo, thả khi bạn xong", "text": "Mẹo: bạn có thể thêm văn bản tại bất cứ đâu bằng cách ấn hai lần bằng tool lựa chọn", + "embeddable": "", "text_selected": "Ấn 2 lần hoặc nhấn ENTER để chỉnh văn bản", "text_editing": "Nhấn Escape hoặc Ctrl/Cmd+ENTER để hoàn thành chỉnh sửa", "linearElementMulti": "Nhấn vào điểm cuối hoặc nhấn Escape hoặc Enter để kết thúc", @@ -252,7 +267,8 @@ "bindTextToElement": "", "deepBoxSelect": "", "eraserRevert": "", - "firefox_clipboard_write": "Tính năng này có thể được bật bằng cách đặt cờ \"dom.events.asyncClipboard.clipboardItem\" thành \"true\". Để thay đổi cờ trình duyệt trong Firefox, hãy truy cập trang \"about:config\"." + "firefox_clipboard_write": "Tính năng này có thể được bật bằng cách đặt cờ \"dom.events.asyncClipboard.clipboardItem\" thành \"true\". Để thay đổi cờ trình duyệt trong Firefox, hãy truy cập trang \"about:config\".", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "Không thể xem trước", @@ -411,7 +427,9 @@ "fileSavedToFilename": "", "canvas": "canvas", "selection": "", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/zh-CN.json b/src/locales/zh-CN.json index 25d43a46f..04c5b4d40 100644 --- a/src/locales/zh-CN.json +++ b/src/locales/zh-CN.json @@ -109,8 +109,12 @@ "createContainerFromText": "将文本包围在容器中", "link": { "edit": "编辑链接", + "editEmbed": "编辑链接与嵌入", "create": "新建链接", - "label": "链接" + "createEmbed": "创建链接与嵌入", + "label": "链接", + "labelEmbed": "链接与嵌入", + "empty": "未设定链接" }, "lineEditor": { "edit": "编辑线条", @@ -125,7 +129,7 @@ "statusPublished": "已发布", "sidebarLock": "侧边栏常驻", "selectAllElementsInFrame": "选择画框中的所有元素", - "removeAllElementsFromFrame": "删除画框中的所有元素", + "removeAllElementsFromFrame": "分离出画框中的所有元素", "eyeDropper": "从画布上取色" }, "library": { @@ -160,13 +164,16 @@ "darkMode": "深色模式", "lightMode": "浅色模式", "zenMode": "禅模式", + "objectsSnapMode": "吸附至对象", "exitZenMode": "退出禅模式", "cancel": "取消", "clear": "清除", "remove": "删除", + "embed": "切换嵌入", "publishLibrary": "发布", "submit": "提交", - "confirm": "确定" + "confirm": "确定", + "embeddableInteractionButton": "点击以开始交互" }, "alerts": { "clearReset": "这将会清除整个画布。您是否要继续?", @@ -196,6 +203,7 @@ "imageInsertError": "无法插入图像。请稍后再试……", "fileTooBig": "文件过大。最大允许的大小为 {{maxSize}}。", "svgImageInsertError": "无法插入 SVG 图像。该 SVG 标记似乎是无效的。", + "failedToFetchImage": "", "invalidSVGString": "无效的 SVG。", "cannotResolveCollabServer": "无法连接到实时协作服务器。请重新加载页面并重试。", "importLibraryError": "无法加载素材库", @@ -206,6 +214,10 @@ "line2": "这可能会破坏绘图中的 文本元素。", "line3": "我们强烈建议禁用此设置。您可以按照这些步骤来设置。", "line4": "如果禁用此设置无法修复文本元素的显示,请在 GitHub 上提交一个 issue ,或者在 Discord 上反馈" + }, + "libraryElementTypeError": { + "embeddable": "嵌入元素不能添加到素材库。", + "image": "我们不久将支持添加图片到素材库" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "为选中的形状添加/更新链接", "eraser": "橡皮", "frame": "画框工具", + "embeddable": "嵌入网页", + "laser": "激光笔", "hand": "抓手(平移工具)", "extraTools": "更多工具" }, @@ -237,6 +251,7 @@ "linearElement": "点击创建多个点 拖动创建直线", "freeDraw": "点击并拖动,完成时松开", "text": "提示:您也可以使用选择工具双击任意位置来添加文字", + "embeddable": "点击并拖动以创建嵌入网页", "text_selected": "双击或按回车键以编辑文本", "text_editing": "按下 Escape 或 CtrlOrCmd+ENTER 完成编辑", "linearElementMulti": "点击最后一个点或按下 Esc/Enter 来完成", @@ -245,14 +260,15 @@ "resizeImage": "按住SHIFT可以自由缩放,\n按住ALT可以从中间缩放", "rotate": "旋转时可以按住 Shift 来约束角度", "lineEditor_info": "按住 CtrlOrCmd 并双击或按 CtrlOrCmd + Enter 来编辑点", - "lineEditor_pointSelected": "按下 Delete 移除点,Ctrl 或 Cmd+D 以复制,拖动以移动", + "lineEditor_pointSelected": "按下 Delete 移除点,CtrlOrCmd+D 以复制,拖动以移动", "lineEditor_nothingSelected": "选择要编辑的点 (按住 SHIFT 选择多个),\n或按住 Alt 并点击以添加新点", "placeImage": "点击放置图像,或者点击并拖动以手动设置图像大小", "publishLibrary": "发布您自己的素材库", "bindTextToElement": "按下 Enter 以添加文本", "deepBoxSelect": "按住 CtrlOrCmd 以深度选择,并避免拖拽", "eraserRevert": "按住 Alt 以反选被标记删除的元素", - "firefox_clipboard_write": "将高级配置首选项“dom.events.asyncClipboard.clipboardItem”设置为“true”可以启用此功能。要更改 Firefox 的高级配置首选项,请前往“about:config”页面。" + "firefox_clipboard_write": "将高级配置首选项“dom.events.asyncClipboard.clipboardItem”设置为“true”可以启用此功能。要更改 Firefox 的高级配置首选项,请前往“about:config”页面。", + "disableSnapping": "按住 CtrlOrCmd 以禁用吸附" }, "canvasError": { "cannotShowPreview": "无法显示预览", @@ -411,7 +427,9 @@ "fileSavedToFilename": "保存到 {filename}", "canvas": "画布", "selection": "所选项", - "pasteAsSingleElement": "使用 {{shortcut}} 粘贴为单个元素,\n或粘贴到现有的文本编辑器里" + "pasteAsSingleElement": "使用 {{shortcut}} 粘贴为单个元素,\n或粘贴到现有的文本编辑器里", + "unableToEmbed": "目前不允许嵌入此网址。请在 GitHub 上提 issue 请求将此网址加入白名单", + "unrecognizedLinkFormat": "您嵌入的链接不符合格式要求。请尝试粘贴源网站提供的“嵌入 (embed)”字符串" }, "colors": { "transparent": "透明", @@ -449,5 +467,36 @@ "shades": "色调明暗", "hexCode": "十六进制值", "noShades": "此颜色没有可用的明暗变化" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "导出为图片", + "button": "导出为图片", + "description": "将画布数据导出为图片,以便以后导入。" + }, + "saveToDisk": { + "title": "保存到本地", + "button": "保存到本地", + "description": "将画布数据导出为文件,以便以后导入。" + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "导出到 Excalidraw+", + "description": "将画布保存到您的 Excalidraw+ 工作区。" + } + }, + "modal": { + "loadFromFile": { + "title": "从文件加载", + "button": "从文件加载", + "description": "从文件加载将替换您现有的内容

您可以先使用下列方式备份您的绘图。" + }, + "shareableLink": { + "title": "从链接加载", + "button": "替换我的内容", + "description": "加载外部绘图将替换您现有的内容

您可以先使用下列方式备份您的绘图。" + } + } } } diff --git a/src/locales/zh-HK.json b/src/locales/zh-HK.json index 54406cb23..1ecdb0ce3 100644 --- a/src/locales/zh-HK.json +++ b/src/locales/zh-HK.json @@ -109,8 +109,12 @@ "createContainerFromText": "", "link": { "edit": "", + "editEmbed": "", "create": "", - "label": "" + "createEmbed": "", + "label": "", + "labelEmbed": "", + "empty": "" }, "lineEditor": { "edit": "", @@ -160,13 +164,16 @@ "darkMode": "", "lightMode": "", "zenMode": "", + "objectsSnapMode": "", "exitZenMode": "", "cancel": "", "clear": "", "remove": "", + "embed": "", "publishLibrary": "", "submit": "", - "confirm": "" + "confirm": "", + "embeddableInteractionButton": "" }, "alerts": { "clearReset": "【‼️ 警告 ‼️ 無法復原的動作】你確定要清空呢塊畫布嗎?", @@ -196,6 +203,7 @@ "imageInsertError": "", "fileTooBig": "", "svgImageInsertError": "", + "failedToFetchImage": "", "invalidSVGString": "", "cannotResolveCollabServer": "", "importLibraryError": "", @@ -206,6 +214,10 @@ "line2": "", "line3": "", "line4": "" + }, + "libraryElementTypeError": { + "embeddable": "", + "image": "" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "", "eraser": "", "frame": "", + "embeddable": "", + "laser": "", "hand": "", "extraTools": "" }, @@ -237,6 +251,7 @@ "linearElement": "", "freeDraw": "", "text": "", + "embeddable": "", "text_selected": "", "text_editing": "", "linearElementMulti": "", @@ -252,7 +267,8 @@ "bindTextToElement": "", "deepBoxSelect": "", "eraserRevert": "", - "firefox_clipboard_write": "" + "firefox_clipboard_write": "", + "disableSnapping": "" }, "canvasError": { "cannotShowPreview": "無法顯示預覽", @@ -411,7 +427,9 @@ "fileSavedToFilename": "", "canvas": "畫布", "selection": "", - "pasteAsSingleElement": "" + "pasteAsSingleElement": "", + "unableToEmbed": "", + "unrecognizedLinkFormat": "" }, "colors": { "transparent": "", @@ -449,5 +467,36 @@ "shades": "", "hexCode": "", "noShades": "" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "", + "button": "", + "description": "" + }, + "saveToDisk": { + "title": "", + "button": "", + "description": "" + }, + "excalidrawPlus": { + "title": "", + "button": "", + "description": "" + } + }, + "modal": { + "loadFromFile": { + "title": "", + "button": "", + "description": "" + }, + "shareableLink": { + "title": "", + "button": "", + "description": "" + } + } } } diff --git a/src/locales/zh-TW.json b/src/locales/zh-TW.json index 9c706dc28..64826dc60 100644 --- a/src/locales/zh-TW.json +++ b/src/locales/zh-TW.json @@ -109,8 +109,12 @@ "createContainerFromText": "將文字包於容器中", "link": { "edit": "編輯連結", + "editEmbed": "編輯連結&嵌入", "create": "建立連結", - "label": "連結" + "createEmbed": "建立連結&嵌入", + "label": "連結", + "labelEmbed": "連結&嵌入", + "empty": "未設定連結" }, "lineEditor": { "edit": "編輯線條", @@ -160,13 +164,16 @@ "darkMode": "深色模式", "lightMode": "淺色模式", "zenMode": "專注模式", + "objectsSnapMode": "吸附至物件", "exitZenMode": "離開專注模式", "cancel": "取消", "clear": "清除", "remove": "刪除", + "embed": "切換嵌入", "publishLibrary": "發布", "submit": "送出", - "confirm": "確認" + "confirm": "確認", + "embeddableInteractionButton": "點擊以互動" }, "alerts": { "clearReset": "這將會清除整個 canvas。你確定嗎?", @@ -196,6 +203,7 @@ "imageInsertError": "無法插入圖片。請稍後再試…", "fileTooBig": "檔案過大。可接受的最大尺寸為 {{maxSize}} 。", "svgImageInsertError": "無法插入 SVG 圖片。此 SVG 檔案有問題。", + "failedToFetchImage": "無法獲取圖片。", "invalidSVGString": "無效的 SVG。", "cannotResolveCollabServer": "無法連結至 collab 伺服器。請重新整理後再試一次。", "importLibraryError": "無法載入資料庫", @@ -206,6 +214,10 @@ "line2": "這可能造成您畫布中 文字元素 的異常。", "line3": "我們強烈建議您關閉此設定。您可以依照 這些步驟 來進行。", "line4": "若關閉此設定並未修復文字元素的顯示問題,請回報於我們 GitHub 上的 issue,或在 Discord 上告訴我們。" + }, + "libraryElementTypeError": { + "embeddable": "可嵌入元素無法加入資料庫", + "image": "即將支援加入圖片至資料庫!" } }, "toolBar": { @@ -224,6 +236,8 @@ "link": "為所選的形狀增加\b/更新連結", "eraser": "橡皮擦", "frame": "框架工具", + "embeddable": "嵌入網站", + "laser": "雷射筆", "hand": "手形(平移工具)", "extraTools": "更多工具" }, @@ -237,6 +251,7 @@ "linearElement": "點擊以繪製多點曲線;或拖曳以繪製直線", "freeDraw": "點擊並拖曳來繪圖,放開即結束", "text": "提示:亦可使用選取工具在任何地方雙擊來加入文字", + "embeddable": "點擊並拖移以建立嵌入網站", "text_selected": "雙擊滑鼠或按 Enter 以編輯文字", "text_editing": "按跳脫鍵或 Ctrl 或 Cmd + Enter 以結束編輯", "linearElementMulti": "按下 Escape 或 Enter 以結束繪製", @@ -252,7 +267,8 @@ "bindTextToElement": "按下 Enter 以加入文字。", "deepBoxSelect": "按住 Ctrl 或 Cmd 以深度選取並避免拖曳", "eraserRevert": "按住 Alt 以反選取已標記待刪除的元素", - "firefox_clipboard_write": "此功能有機會透過將 \"dom.events.asyncClipboard.clipboardItem\" 設定為 \"true\" 來開啟。\n若要變更 Firefox 瀏覽器的此設定值,請至 \"about:config\" 頁面。" + "firefox_clipboard_write": "此功能有機會透過將 \"dom.events.asyncClipboard.clipboardItem\" 設定為 \"true\" 來開啟。\n若要變更 Firefox 瀏覽器的此設定值,請至 \"about:config\" 頁面。", + "disableSnapping": "按住 Ctrl 或 Cmd 以禁用吸附" }, "canvasError": { "cannotShowPreview": "無法顯示預覽", @@ -411,7 +427,9 @@ "fileSavedToFilename": "儲存為 {filename}", "canvas": "畫布", "selection": "已選項目", - "pasteAsSingleElement": "使用 {{shortcut}} 以做為單一物件貼上,\n或貼上至現有的文字編輯器" + "pasteAsSingleElement": "使用 {{shortcut}} 以做為單一物件貼上,\n或貼上至現有的文字編輯器", + "unableToEmbed": "目前不允許嵌入此網址。您可至 GitHub 提出 issue 以要求將此網址加入合格名單。", + "unrecognizedLinkFormat": "您嵌入的連結格式不符。請嘗試貼入原網站所提供的「嵌入」字串。" }, "colors": { "transparent": "透明", @@ -449,5 +467,36 @@ "shades": "漸變色", "hexCode": "Hex 碼", "noShades": "沒有此顏色的漸變色" + }, + "overwriteConfirm": { + "action": { + "exportToImage": { + "title": "匯出為圖片", + "button": "匯出為圖片", + "description": "將場景匯出為可供匯入的圖片檔案" + }, + "saveToDisk": { + "title": "儲存至硬碟", + "button": "儲存至硬碟", + "description": "將場景匯出為可供匯入的檔案" + }, + "excalidrawPlus": { + "title": "Excalidraw+", + "button": "匯出至 Excalidraw+", + "description": "將此場景儲存至您的 Excalidraw+ 工作區" + } + }, + "modal": { + "loadFromFile": { + "title": "從檔案載入", + "button": "從檔案載入", + "description": "從檔案載入將取代您目前的內容

可先使用下方的選項備份您的繪圖。" + }, + "shareableLink": { + "title": "從連結載入", + "button": "取代我的內容", + "description": "載入外部繪圖將取代您目前的內容

可先使用下方的選項備份您的繪圖。" + } + } } } diff --git a/src/math.ts b/src/math.ts index 376052095..a56b97a72 100644 --- a/src/math.ts +++ b/src/math.ts @@ -505,3 +505,7 @@ export const rangeIntersection = ( return null; }; + +export const isValueInRange = (value: number, min: number, max: number) => { + return value >= min && value <= max; +}; diff --git a/src/packages/bbox.ts b/src/packages/bbox.ts new file mode 100644 index 000000000..91549c24a --- /dev/null +++ b/src/packages/bbox.ts @@ -0,0 +1,65 @@ +import { Bounds } from "../element/bounds"; +import { Point } from "../types"; + +export type LineSegment = [Point, Point]; + +export function getBBox(line: LineSegment): Bounds { + return [ + Math.min(line[0][0], line[1][0]), + Math.min(line[0][1], line[1][1]), + Math.max(line[0][0], line[1][0]), + Math.max(line[0][1], line[1][1]), + ]; +} + +export function crossProduct(a: Point, b: Point) { + return a[0] * b[1] - b[0] * a[1]; +} + +export function doBBoxesIntersect(a: Bounds, b: Bounds) { + return a[0] <= b[2] && a[2] >= b[0] && a[1] <= b[3] && a[3] >= b[1]; +} + +export function translate(a: Point, b: Point): Point { + return [a[0] - b[0], a[1] - b[1]]; +} + +const EPSILON = 0.000001; + +export function isPointOnLine(l: LineSegment, p: Point) { + const p1 = translate(l[1], l[0]); + const p2 = translate(p, l[0]); + + const r = crossProduct(p1, p2); + + return Math.abs(r) < EPSILON; +} + +export function isPointRightOfLine(l: LineSegment, p: Point) { + const p1 = translate(l[1], l[0]); + const p2 = translate(p, l[0]); + + return crossProduct(p1, p2) < 0; +} + +export function isLineSegmentTouchingOrCrossingLine( + a: LineSegment, + b: LineSegment, +) { + return ( + isPointOnLine(a, b[0]) || + isPointOnLine(a, b[1]) || + (isPointRightOfLine(a, b[0]) + ? !isPointRightOfLine(a, b[1]) + : isPointRightOfLine(a, b[1])) + ); +} + +// https://martin-thoma.com/how-to-check-if-two-line-segments-intersect/ +export function doLineSegmentsIntersect(a: LineSegment, b: LineSegment) { + return ( + doBBoxesIntersect(getBBox(a), getBBox(b)) && + isLineSegmentTouchingOrCrossingLine(a, b) && + isLineSegmentTouchingOrCrossingLine(b, a) + ); +} diff --git a/src/packages/excalidraw/.size-limit.json b/src/packages/excalidraw/.size-limit.json index 1b953f30b..76c3be301 100644 --- a/src/packages/excalidraw/.size-limit.json +++ b/src/packages/excalidraw/.size-limit.json @@ -1,12 +1,12 @@ [ { "path": "dist/excalidraw.production.min.js", - "limit": "305 kB" + "limit": "320 kB" }, { "path": "dist/excalidraw-assets/locales", "name": "dist/excalidraw-assets/locales", - "limit": "270 kB" + "limit": "290 kB" }, { "path": "dist/excalidraw-assets/vendor-*.js", diff --git a/src/packages/excalidraw/CHANGELOG.md b/src/packages/excalidraw/CHANGELOG.md index e9e80b21f..dc4a83095 100644 --- a/src/packages/excalidraw/CHANGELOG.md +++ b/src/packages/excalidraw/CHANGELOG.md @@ -15,7 +15,9 @@ Please add the latest change on the top under the correct section. ### Features -- Add `selected` prop for `MainMenu.Item` and `MainMenu.ItemCustom` components to indicate active state. [7078](https://github.com/excalidraw/excalidraw/pull/7078) +- Export `elementsOverlappingBBox`, `isElementInsideBBox`, `elementPartiallyOverlapsWithOrContainsBBox` helpers for filtering/checking if elements within bounds. [#6727](https://github.com/excalidraw/excalidraw/pull/6727) +- Regenerate ids by default when using transform api and also update bindings by 0.5px to avoid possible overlapping [#7195](https://github.com/excalidraw/excalidraw/pull/7195) +- Add `selected` prop for `MainMenu.Item` and `MainMenu.ItemCustom` components to indicate active state. [#7078](https://github.com/excalidraw/excalidraw/pull/7078) ## 0.16.1 (2023-09-21) diff --git a/src/packages/excalidraw/index.tsx b/src/packages/excalidraw/index.tsx index 901785f1c..f0e9adc0b 100644 --- a/src/packages/excalidraw/index.tsx +++ b/src/packages/excalidraw/index.tsx @@ -254,3 +254,9 @@ export { DefaultSidebar } from "../../components/DefaultSidebar"; export { normalizeLink } from "../../data/url"; export { convertToExcalidrawElements } from "../../data/transform"; + +export { + elementsOverlappingBBox, + isElementInsideBBox, + elementPartiallyOverlapsWithOrContainsBBox, +} from "../withinBounds"; diff --git a/src/packages/utils.ts b/src/packages/utils.ts index 8e55a1a05..2d896ed3c 100644 --- a/src/packages/utils.ts +++ b/src/packages/utils.ts @@ -229,6 +229,12 @@ export const exportToClipboard = async ( } }; +export * from "./bbox"; +export { + elementsOverlappingBBox, + isElementInsideBBox, + elementPartiallyOverlapsWithOrContainsBBox, +} from "./withinBounds"; export { serializeAsJSON, serializeLibraryAsJSON } from "../data/json"; export { loadFromBlob, diff --git a/src/packages/withinBounds.test.ts b/src/packages/withinBounds.test.ts new file mode 100644 index 000000000..be301f871 --- /dev/null +++ b/src/packages/withinBounds.test.ts @@ -0,0 +1,262 @@ +import { Bounds } from "../element/bounds"; +import { API } from "../tests/helpers/api"; +import { + elementPartiallyOverlapsWithOrContainsBBox, + elementsOverlappingBBox, + isElementInsideBBox, +} from "./withinBounds"; + +const makeElement = (x: number, y: number, width: number, height: number) => + API.createElement({ + type: "rectangle", + x, + y, + width, + height, + }); + +const makeBBox = ( + minX: number, + minY: number, + maxX: number, + maxY: number, +): Bounds => [minX, minY, maxX, maxY]; + +describe("isElementInsideBBox()", () => { + it("should return true if element is fully inside", () => { + const bbox = makeBBox(0, 0, 100, 100); + + // bbox contains element + expect(isElementInsideBBox(makeElement(0, 0, 100, 100), bbox)).toBe(true); + expect(isElementInsideBBox(makeElement(10, 10, 90, 90), bbox)).toBe(true); + }); + + it("should return false if element is only partially overlapping", () => { + const bbox = makeBBox(0, 0, 100, 100); + + // element contains bbox + expect(isElementInsideBBox(makeElement(-10, -10, 110, 110), bbox)).toBe( + false, + ); + + // element overlaps bbox from top-left + expect(isElementInsideBBox(makeElement(-10, -10, 100, 100), bbox)).toBe( + false, + ); + // element overlaps bbox from top-right + expect(isElementInsideBBox(makeElement(90, -10, 100, 100), bbox)).toBe( + false, + ); + // element overlaps bbox from bottom-left + expect(isElementInsideBBox(makeElement(-10, 90, 100, 100), bbox)).toBe( + false, + ); + // element overlaps bbox from bottom-right + expect(isElementInsideBBox(makeElement(90, 90, 100, 100), bbox)).toBe( + false, + ); + }); + + it("should return false if element outside", () => { + const bbox = makeBBox(0, 0, 100, 100); + + // outside diagonally + expect(isElementInsideBBox(makeElement(110, 110, 100, 100), bbox)).toBe( + false, + ); + + // outside on the left + expect(isElementInsideBBox(makeElement(-110, 10, 50, 50), bbox)).toBe( + false, + ); + // outside on the right + expect(isElementInsideBBox(makeElement(110, 10, 50, 50), bbox)).toBe(false); + // outside on the top + expect(isElementInsideBBox(makeElement(10, -110, 50, 50), bbox)).toBe( + false, + ); + // outside on the bottom + expect(isElementInsideBBox(makeElement(10, 110, 50, 50), bbox)).toBe(false); + }); + + it("should return true if bbox contains element and flag enabled", () => { + const bbox = makeBBox(0, 0, 100, 100); + + // element contains bbox + expect( + isElementInsideBBox(makeElement(-10, -10, 110, 110), bbox, true), + ).toBe(true); + + // bbox contains element + expect(isElementInsideBBox(makeElement(0, 0, 100, 100), bbox)).toBe(true); + expect(isElementInsideBBox(makeElement(10, 10, 90, 90), bbox)).toBe(true); + }); +}); + +describe("elementPartiallyOverlapsWithOrContainsBBox()", () => { + it("should return true if element overlaps, is inside, or contains", () => { + const bbox = makeBBox(0, 0, 100, 100); + + // bbox contains element + expect( + elementPartiallyOverlapsWithOrContainsBBox( + makeElement(0, 0, 100, 100), + bbox, + ), + ).toBe(true); + expect( + elementPartiallyOverlapsWithOrContainsBBox( + makeElement(10, 10, 90, 90), + bbox, + ), + ).toBe(true); + + // element contains bbox + expect( + elementPartiallyOverlapsWithOrContainsBBox( + makeElement(-10, -10, 110, 110), + bbox, + ), + ).toBe(true); + + // element overlaps bbox from top-left + expect( + elementPartiallyOverlapsWithOrContainsBBox( + makeElement(-10, -10, 100, 100), + bbox, + ), + ).toBe(true); + // element overlaps bbox from top-right + expect( + elementPartiallyOverlapsWithOrContainsBBox( + makeElement(90, -10, 100, 100), + bbox, + ), + ).toBe(true); + // element overlaps bbox from bottom-left + expect( + elementPartiallyOverlapsWithOrContainsBBox( + makeElement(-10, 90, 100, 100), + bbox, + ), + ).toBe(true); + // element overlaps bbox from bottom-right + expect( + elementPartiallyOverlapsWithOrContainsBBox( + makeElement(90, 90, 100, 100), + bbox, + ), + ).toBe(true); + }); + + it("should return false if element does not overlap", () => { + const bbox = makeBBox(0, 0, 100, 100); + + // outside diagonally + expect( + elementPartiallyOverlapsWithOrContainsBBox( + makeElement(110, 110, 100, 100), + bbox, + ), + ).toBe(false); + + // outside on the left + expect( + elementPartiallyOverlapsWithOrContainsBBox( + makeElement(-110, 10, 50, 50), + bbox, + ), + ).toBe(false); + // outside on the right + expect( + elementPartiallyOverlapsWithOrContainsBBox( + makeElement(110, 10, 50, 50), + bbox, + ), + ).toBe(false); + // outside on the top + expect( + elementPartiallyOverlapsWithOrContainsBBox( + makeElement(10, -110, 50, 50), + bbox, + ), + ).toBe(false); + // outside on the bottom + expect( + elementPartiallyOverlapsWithOrContainsBBox( + makeElement(10, 110, 50, 50), + bbox, + ), + ).toBe(false); + }); +}); + +describe("elementsOverlappingBBox()", () => { + it("should return elements that overlap bbox", () => { + const bbox = makeBBox(0, 0, 100, 100); + + const rectOutside = makeElement(110, 110, 100, 100); + const rectInside = makeElement(10, 10, 90, 90); + const rectContainingBBox = makeElement(-10, -10, 110, 110); + const rectOverlappingTopLeft = makeElement(-10, -10, 50, 50); + + expect( + elementsOverlappingBBox({ + bounds: bbox, + type: "overlap", + elements: [ + rectOutside, + rectInside, + rectContainingBBox, + rectOverlappingTopLeft, + ], + }), + ).toEqual([rectInside, rectContainingBBox, rectOverlappingTopLeft]); + }); + + it("should return elements inside/containing bbox", () => { + const bbox = makeBBox(0, 0, 100, 100); + + const rectOutside = makeElement(110, 110, 100, 100); + const rectInside = makeElement(10, 10, 90, 90); + const rectContainingBBox = makeElement(-10, -10, 110, 110); + const rectOverlappingTopLeft = makeElement(-10, -10, 50, 50); + + expect( + elementsOverlappingBBox({ + bounds: bbox, + type: "contain", + elements: [ + rectOutside, + rectInside, + rectContainingBBox, + rectOverlappingTopLeft, + ], + }), + ).toEqual([rectInside, rectContainingBBox]); + }); + + it("should return elements inside bbox", () => { + const bbox = makeBBox(0, 0, 100, 100); + + const rectOutside = makeElement(110, 110, 100, 100); + const rectInside = makeElement(10, 10, 90, 90); + const rectContainingBBox = makeElement(-10, -10, 110, 110); + const rectOverlappingTopLeft = makeElement(-10, -10, 50, 50); + + expect( + elementsOverlappingBBox({ + bounds: bbox, + type: "inside", + elements: [ + rectOutside, + rectInside, + rectContainingBBox, + rectOverlappingTopLeft, + ], + }), + ).toEqual([rectInside]); + }); + + // TODO test linear, freedraw, and diamond element types (+rotated) +}); diff --git a/src/packages/withinBounds.ts b/src/packages/withinBounds.ts new file mode 100644 index 000000000..75ea10b72 --- /dev/null +++ b/src/packages/withinBounds.ts @@ -0,0 +1,206 @@ +import type { + ExcalidrawElement, + ExcalidrawFreeDrawElement, + ExcalidrawLinearElement, + NonDeletedExcalidrawElement, +} from "../element/types"; +import { + isArrowElement, + isFreeDrawElement, + isLinearElement, + isTextElement, +} from "../element/typeChecks"; +import { isValueInRange, rotatePoint } from "../math"; +import type { Point } from "../types"; +import { Bounds } from "../element/bounds"; + +type Element = NonDeletedExcalidrawElement; +type Elements = readonly NonDeletedExcalidrawElement[]; + +type Points = readonly Point[]; + +/** @returns vertices relative to element's top-left [0,0] position */ +const getNonLinearElementRelativePoints = ( + element: Exclude< + Element, + ExcalidrawLinearElement | ExcalidrawFreeDrawElement + >, +): [TopLeft: Point, TopRight: Point, BottomRight: Point, BottomLeft: Point] => { + if (element.type === "diamond") { + return [ + [element.width / 2, 0], + [element.width, element.height / 2], + [element.width / 2, element.height], + [0, element.height / 2], + ]; + } + return [ + [0, 0], + [0 + element.width, 0], + [0 + element.width, element.height], + [0, element.height], + ]; +}; + +/** @returns vertices relative to element's top-left [0,0] position */ +const getElementRelativePoints = (element: ExcalidrawElement): Points => { + if (isLinearElement(element) || isFreeDrawElement(element)) { + return element.points; + } + return getNonLinearElementRelativePoints(element); +}; + +const getMinMaxPoints = (points: Points) => { + const ret = points.reduce( + (limits, [x, y]) => { + limits.minY = Math.min(limits.minY, y); + limits.minX = Math.min(limits.minX, x); + + limits.maxX = Math.max(limits.maxX, x); + limits.maxY = Math.max(limits.maxY, y); + + return limits; + }, + { + minX: Infinity, + minY: Infinity, + maxX: -Infinity, + maxY: -Infinity, + cx: 0, + cy: 0, + }, + ); + + ret.cx = (ret.maxX + ret.minX) / 2; + ret.cy = (ret.maxY + ret.minY) / 2; + + return ret; +}; + +const getRotatedBBox = (element: Element): Bounds => { + const points = getElementRelativePoints(element); + + const { cx, cy } = getMinMaxPoints(points); + const centerPoint: Point = [cx, cy]; + + const rotatedPoints = points.map((point) => + rotatePoint([point[0], point[1]], centerPoint, element.angle), + ); + const { minX, minY, maxX, maxY } = getMinMaxPoints(rotatedPoints); + + return [ + minX + element.x, + minY + element.y, + maxX + element.x, + maxY + element.y, + ]; +}; + +export const isElementInsideBBox = ( + element: Element, + bbox: Bounds, + eitherDirection = false, +): boolean => { + const elementBBox = getRotatedBBox(element); + + const elementInsideBbox = + bbox[0] <= elementBBox[0] && + bbox[2] >= elementBBox[2] && + bbox[1] <= elementBBox[1] && + bbox[3] >= elementBBox[3]; + + if (!eitherDirection) { + return elementInsideBbox; + } + + if (elementInsideBbox) { + return true; + } + + return ( + elementBBox[0] <= bbox[0] && + elementBBox[2] >= bbox[2] && + elementBBox[1] <= bbox[1] && + elementBBox[3] >= bbox[3] + ); +}; + +export const elementPartiallyOverlapsWithOrContainsBBox = ( + element: Element, + bbox: Bounds, +): boolean => { + const elementBBox = getRotatedBBox(element); + + return ( + (isValueInRange(elementBBox[0], bbox[0], bbox[2]) || + isValueInRange(bbox[0], elementBBox[0], elementBBox[2])) && + (isValueInRange(elementBBox[1], bbox[1], bbox[3]) || + isValueInRange(bbox[1], elementBBox[1], elementBBox[3])) + ); +}; + +export const elementsOverlappingBBox = ({ + elements, + bounds, + type, + errorMargin = 0, +}: { + elements: Elements; + bounds: Bounds; + /** safety offset. Defaults to 0. */ + errorMargin?: number; + /** + * - overlap: elements overlapping or inside bounds + * - contain: elements inside bounds or bounds inside elements + * - inside: elements inside bounds + **/ + type: "overlap" | "contain" | "inside"; +}) => { + const adjustedBBox: Bounds = [ + bounds[0] - errorMargin, + bounds[1] - errorMargin, + bounds[2] + errorMargin, + bounds[3] + errorMargin, + ]; + + const includedElementSet = new Set(); + + for (const element of elements) { + if (includedElementSet.has(element.id)) { + continue; + } + + const isOverlaping = + type === "overlap" + ? elementPartiallyOverlapsWithOrContainsBBox(element, adjustedBBox) + : type === "inside" + ? isElementInsideBBox(element, adjustedBBox) + : isElementInsideBBox(element, adjustedBBox, true); + + if (isOverlaping) { + includedElementSet.add(element.id); + + if (element.boundElements) { + for (const boundElement of element.boundElements) { + includedElementSet.add(boundElement.id); + } + } + + if (isTextElement(element) && element.containerId) { + includedElementSet.add(element.containerId); + } + + if (isArrowElement(element)) { + if (element.startBinding) { + includedElementSet.add(element.startBinding.elementId); + } + + if (element.endBinding) { + includedElementSet.add(element.endBinding?.elementId); + } + } + } + } + + return elements.filter((element) => includedElementSet.has(element.id)); +}; diff --git a/src/scene/Shape.ts b/src/scene/Shape.ts index f43a1260d..16b6518f8 100644 --- a/src/scene/Shape.ts +++ b/src/scene/Shape.ts @@ -12,11 +12,22 @@ import type { import { isPathALoop, getCornerRadius } from "../math"; import { generateFreeDrawShape } from "../renderer/renderElement"; import { isTransparent, assertNever } from "../utils"; +import { simplify } from "points-on-curve"; +import { ROUGHNESS } from "../constants"; const getDashArrayDashed = (strokeWidth: number) => [8, 8 + strokeWidth]; const getDashArrayDotted = (strokeWidth: number) => [1.5, 6 + strokeWidth]; +function adjustRoughness(size: number, roughness: number): number { + if (size >= 50) { + return roughness; + } + const factor = 2 + (50 - size) / 10; + + return roughness / factor; +} + export const generateRoughOptions = ( element: ExcalidrawElement, continuousPath = false, @@ -43,9 +54,13 @@ export const generateRoughOptions = ( // calculate them (and we don't want the fills to be modified) fillWeight: element.strokeWidth / 2, hachureGap: element.strokeWidth * 4, - roughness: element.roughness, + roughness: adjustRoughness( + Math.min(element.width, element.height), + element.roughness, + ), stroke: element.strokeColor, - preserveVertices: continuousPath, + preserveVertices: + continuousPath || element.roughness < ROUGHNESS.cartoonist, }; switch (element.type) { @@ -334,7 +349,8 @@ export const _generateElementShape = ( if (isPathALoop(element.points)) { // generate rough polygon to fill freedraw shape - shape = generator.polygon(element.points as [number, number][], { + const simplifiedPoints = simplify(element.points, 0.75); + shape = generator.curve(simplifiedPoints as [number, number][], { ...generateRoughOptions(element), stroke: "none", }); diff --git a/src/scene/comparisons.ts b/src/scene/comparisons.ts index b6bdf03b5..a6a230243 100644 --- a/src/scene/comparisons.ts +++ b/src/scene/comparisons.ts @@ -39,8 +39,6 @@ export const canChangeRoundness = (type: string) => type === "line" || type === "diamond"; -export const hasText = (type: string) => type === "text"; - export const canHaveArrowheads = (type: string) => type === "arrow"; export const getElementAtPosition = ( diff --git a/src/scene/export.ts b/src/scene/export.ts index ca838f053..3aa0cec6f 100644 --- a/src/scene/export.ts +++ b/src/scene/export.ts @@ -1,6 +1,10 @@ import rough from "roughjs/bin/rough"; import { NonDeletedExcalidrawElement } from "../element/types"; -import { getCommonBounds, getElementAbsoluteCoords } from "../element/bounds"; +import { + Bounds, + getCommonBounds, + getElementAbsoluteCoords, +} from "../element/bounds"; import { renderSceneToSvg, renderStaticScene } from "../renderer/renderScene"; import { distance, isOnlyExportingSingleFrame } from "../utils"; import { AppState, BinaryFiles } from "../types"; @@ -13,7 +17,7 @@ import { } from "../element/image"; import Scene from "./Scene"; -export const SVG_EXPORT_TAG = ``; +const SVG_EXPORT_TAG = ``; export const exportToCanvas = async ( elements: readonly NonDeletedExcalidrawElement[], @@ -221,7 +225,7 @@ export const exportToSvg = async ( const getCanvasSize = ( elements: readonly NonDeletedExcalidrawElement[], exportPadding: number, -): [number, number, number, number] => { +): Bounds => { // we should decide if we are exporting the whole canvas // if so, we are not clipping elements in the frame // and therefore, we should not do anything special diff --git a/src/scene/index.ts b/src/scene/index.ts index 08568aa41..5a7b9028a 100644 --- a/src/scene/index.ts +++ b/src/scene/index.ts @@ -14,7 +14,6 @@ export { canHaveArrowheads, canChangeRoundness, getElementAtPosition, - hasText, getElementsAtPosition, } from "./comparisons"; export { getNormalizedZoom } from "./zoom"; diff --git a/src/setupTests.ts b/src/setupTests.ts index 342e532d1..3a328ce45 100644 --- a/src/setupTests.ts +++ b/src/setupTests.ts @@ -3,6 +3,9 @@ import "vitest-canvas-mock"; import "@testing-library/jest-dom"; import { vi } from "vitest"; import polyfill from "./polyfill"; +import { testPolyfills } from "./tests/helpers/polyfills"; + +Object.assign(globalThis, testPolyfills); require("fake-indexeddb/auto"); diff --git a/src/tests/__snapshots__/contextmenu.test.tsx.snap b/src/tests/__snapshots__/contextmenu.test.tsx.snap index 0cdd20b25..d8ef5572a 100644 --- a/src/tests/__snapshots__/contextmenu.test.tsx.snap +++ b/src/tests/__snapshots__/contextmenu.test.tsx.snap @@ -17,7 +17,6 @@ exports[`contextMenu element > right-clicking on a group should select whole gro "keyTest": [Function], "name": "cut", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -27,7 +26,6 @@ exports[`contextMenu element > right-clicking on a group should select whole gro "keyTest": undefined, "name": "copy", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -37,7 +35,6 @@ exports[`contextMenu element > right-clicking on a group should select whole gro "keyTest": undefined, "name": "paste", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -290,7 +287,7 @@ exports[`contextMenu element > right-clicking on a group should select whole gro "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -299,7 +296,7 @@ exports[`contextMenu element > right-clicking on a group should select whole gro "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -406,7 +403,7 @@ exports[`contextMenu element > right-clicking on a group should select whole gro "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 1, @@ -440,7 +437,7 @@ exports[`contextMenu element > right-clicking on a group should select whole gro "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 1, @@ -489,7 +486,7 @@ exports[`contextMenu element > selecting 'Add to library' in context menu adds e "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -498,7 +495,7 @@ exports[`contextMenu element > selecting 'Add to library' in context menu adds e "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -583,7 +580,7 @@ exports[`contextMenu element > selecting 'Add to library' in context menu adds e "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -599,7 +596,7 @@ exports[`contextMenu element > selecting 'Add to library' in context menu adds e "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -642,7 +639,7 @@ exports[`contextMenu element > selecting 'Add to library' in context menu adds e "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -658,7 +655,7 @@ exports[`contextMenu element > selecting 'Add to library' in context menu adds e "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -691,7 +688,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -700,7 +697,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -783,7 +780,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -799,7 +796,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -815,7 +812,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -831,7 +828,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -874,7 +871,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -890,7 +887,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -917,7 +914,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -933,7 +930,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -946,7 +943,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -962,7 +959,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -989,7 +986,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1005,7 +1002,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1018,7 +1015,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1034,7 +1031,7 @@ exports[`contextMenu element > selecting 'Bring forward' in context menu brings "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1067,7 +1064,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -1076,7 +1073,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -1159,7 +1156,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1175,7 +1172,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1191,7 +1188,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1207,7 +1204,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1250,7 +1247,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1266,7 +1263,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1293,7 +1290,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1309,7 +1306,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1322,7 +1319,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1338,7 +1335,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1365,7 +1362,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1381,7 +1378,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1394,7 +1391,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1410,7 +1407,7 @@ exports[`contextMenu element > selecting 'Bring to front' in context menu brings "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1443,7 +1440,7 @@ exports[`contextMenu element > selecting 'Copy styles' in context menu copies st "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -1452,7 +1449,7 @@ exports[`contextMenu element > selecting 'Copy styles' in context menu copies st "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -1537,7 +1534,7 @@ exports[`contextMenu element > selecting 'Copy styles' in context menu copies st "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1553,7 +1550,7 @@ exports[`contextMenu element > selecting 'Copy styles' in context menu copies st "seed": 453191, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1596,7 +1593,7 @@ exports[`contextMenu element > selecting 'Copy styles' in context menu copies st "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1612,7 +1609,7 @@ exports[`contextMenu element > selecting 'Copy styles' in context menu copies st "seed": 453191, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1645,7 +1642,7 @@ exports[`contextMenu element > selecting 'Delete' in context menu deletes elemen "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -1654,7 +1651,7 @@ exports[`contextMenu element > selecting 'Delete' in context menu deletes elemen "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -1735,7 +1732,7 @@ exports[`contextMenu element > selecting 'Delete' in context menu deletes elemen "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1751,7 +1748,7 @@ exports[`contextMenu element > selecting 'Delete' in context menu deletes elemen "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1794,7 +1791,7 @@ exports[`contextMenu element > selecting 'Delete' in context menu deletes elemen "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1810,7 +1807,7 @@ exports[`contextMenu element > selecting 'Delete' in context menu deletes elemen "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1835,7 +1832,7 @@ exports[`contextMenu element > selecting 'Delete' in context menu deletes elemen "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1851,7 +1848,7 @@ exports[`contextMenu element > selecting 'Delete' in context menu deletes elemen "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1884,7 +1881,7 @@ exports[`contextMenu element > selecting 'Duplicate' in context menu duplicates "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -1893,7 +1890,7 @@ exports[`contextMenu element > selecting 'Duplicate' in context menu duplicates "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -1976,7 +1973,7 @@ exports[`contextMenu element > selecting 'Duplicate' in context menu duplicates "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -1992,7 +1989,7 @@ exports[`contextMenu element > selecting 'Duplicate' in context menu duplicates "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2008,7 +2005,7 @@ exports[`contextMenu element > selecting 'Duplicate' in context menu duplicates "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2024,7 +2021,7 @@ exports[`contextMenu element > selecting 'Duplicate' in context menu duplicates "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2067,7 +2064,7 @@ exports[`contextMenu element > selecting 'Duplicate' in context menu duplicates "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2083,7 +2080,7 @@ exports[`contextMenu element > selecting 'Duplicate' in context menu duplicates "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2110,7 +2107,7 @@ exports[`contextMenu element > selecting 'Duplicate' in context menu duplicates "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2126,7 +2123,7 @@ exports[`contextMenu element > selecting 'Duplicate' in context menu duplicates "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2139,7 +2136,7 @@ exports[`contextMenu element > selecting 'Duplicate' in context menu duplicates "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2155,7 +2152,7 @@ exports[`contextMenu element > selecting 'Duplicate' in context menu duplicates "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2188,7 +2185,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -2197,7 +2194,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -2285,7 +2282,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -2303,7 +2300,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -2319,7 +2316,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -2337,7 +2334,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -2380,7 +2377,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2396,7 +2393,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2423,7 +2420,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2439,7 +2436,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2452,7 +2449,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2468,7 +2465,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2498,7 +2495,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -2516,7 +2513,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -2529,7 +2526,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -2547,7 +2544,7 @@ exports[`contextMenu element > selecting 'Group selection' in context menu group "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -2694,7 +2691,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "type": "rectangle", "updated": 1, "version": 3, - "versionNonce": 406373543, + "versionNonce": 1898319239, "width": 20, "x": -10, "y": 0, @@ -2719,14 +2716,14 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "roundness": { "type": 3, }, - "seed": 1006504105, + "seed": 1723083209, "strokeColor": "#e03131", "strokeStyle": "dotted", "strokeWidth": 2, "type": "rectangle", "updated": 1, - "version": 9, - "versionNonce": 1898319239, + "version": 8, + "versionNonce": 289600103, "width": 20, "x": 20, "y": 30, @@ -2765,7 +2762,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2781,7 +2778,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2808,7 +2805,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2824,7 +2821,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2837,7 +2834,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2853,7 +2850,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2880,7 +2877,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2896,7 +2893,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2909,7 +2906,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2925,7 +2922,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "seed": 1150084233, "strokeColor": "#e03131", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -2952,7 +2949,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2968,7 +2965,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2981,7 +2978,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "angle": 0, "backgroundColor": "#a5d8ff", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -2997,7 +2994,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "seed": 1150084233, "strokeColor": "#e03131", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -3024,7 +3021,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -3040,7 +3037,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3069,7 +3066,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "seed": 1150084233, "strokeColor": "#e03131", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 5, @@ -3096,7 +3093,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -3112,7 +3109,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3140,7 +3137,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s }, "seed": 1150084233, "strokeColor": "#e03131", - "strokeStyle": "solid", + "strokeStyle": "dotted", "strokeWidth": 2, "type": "rectangle", "updated": 1, @@ -3168,7 +3165,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -3184,81 +3181,9 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "updated": 1, - "version": 2, - "versionNonce": 401146281, - "width": 20, - "x": -10, - "y": 0, - }, - { - "angle": 0, - "backgroundColor": "#a5d8ff", - "boundElements": null, - "fillStyle": "cross-hatch", - "frameId": null, - "groupIds": [], - "height": 20, - "id": "id1", - "isDeleted": false, - "link": null, - "locked": false, - "opacity": 100, - "roughness": 1, - "roundness": { - "type": 3, - }, - "seed": 1150084233, - "strokeColor": "#e03131", - "strokeStyle": "dotted", "strokeWidth": 2, "type": "rectangle", "updated": 1, - "version": 7, - "versionNonce": 1723083209, - "width": 20, - "x": 20, - "y": 30, - }, - ], - }, - { - "appState": { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": { - "id1": true, - }, - "selectedGroupIds": {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": [ - { - "angle": 0, - "backgroundColor": "transparent", - "boundElements": null, - "fillStyle": "hachure", - "frameId": null, - "groupIds": [], - "height": 20, - "id": "id0", - "isDeleted": false, - "link": null, - "locked": false, - "opacity": 100, - "roughness": 1, - "roundness": { - "type": 3, - }, - "seed": 449462985, - "strokeColor": "#1e1e1e", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "updated": 1, "version": 2, "versionNonce": 401146281, "width": 20, @@ -3282,14 +3207,14 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "roundness": { "type": 3, }, - "seed": 1006504105, + "seed": 1723083209, "strokeColor": "#e03131", "strokeStyle": "dotted", "strokeWidth": 2, "type": "rectangle", "updated": 1, - "version": 8, - "versionNonce": 289600103, + "version": 7, + "versionNonce": 760410951, "width": 20, "x": 20, "y": 30, @@ -3312,7 +3237,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -3328,7 +3253,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3354,14 +3279,14 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "roundness": { "type": 3, }, - "seed": 1006504105, + "seed": 1723083209, "strokeColor": "#e03131", "strokeStyle": "dotted", "strokeWidth": 2, "type": "rectangle", "updated": 1, - "version": 9, - "versionNonce": 1898319239, + "version": 8, + "versionNonce": 289600103, "width": 20, "x": 20, "y": 30, @@ -3404,7 +3329,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "type": "rectangle", "updated": 1, "version": 3, - "versionNonce": 406373543, + "versionNonce": 1898319239, "width": 20, "x": -10, "y": 0, @@ -3426,14 +3351,14 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s "roundness": { "type": 3, }, - "seed": 1006504105, + "seed": 1723083209, "strokeColor": "#e03131", "strokeStyle": "dotted", "strokeWidth": 2, "type": "rectangle", "updated": 1, - "version": 9, - "versionNonce": 1898319239, + "version": 8, + "versionNonce": 289600103, "width": 20, "x": 20, "y": 30, @@ -3446,7 +3371,7 @@ exports[`contextMenu element > selecting 'Paste styles' in context menu pastes s exports[`contextMenu element > selecting 'Paste styles' in context menu pastes styles > [end of test] number of elements 1`] = `2`; -exports[`contextMenu element > selecting 'Paste styles' in context menu pastes styles > [end of test] number of renders 1`] = `19`; +exports[`contextMenu element > selecting 'Paste styles' in context menu pastes styles > [end of test] number of renders 1`] = `18`; exports[`contextMenu element > selecting 'Send backward' in context menu sends element backward > [end of test] appState 1`] = ` { @@ -3462,7 +3387,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -3471,7 +3396,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -3554,7 +3479,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -3570,7 +3495,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -3586,7 +3511,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -3602,7 +3527,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3645,7 +3570,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -3661,7 +3586,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3688,7 +3613,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -3704,7 +3629,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3717,7 +3642,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -3733,7 +3658,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3760,7 +3685,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -3776,7 +3701,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -3789,7 +3714,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -3805,7 +3730,7 @@ exports[`contextMenu element > selecting 'Send backward' in context menu sends e "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3838,7 +3763,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -3847,7 +3772,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -3930,7 +3855,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -3946,7 +3871,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -3962,7 +3887,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -3978,7 +3903,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4021,7 +3946,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -4037,7 +3962,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4064,7 +3989,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -4080,7 +4005,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4093,7 +4018,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -4109,7 +4034,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4136,7 +4061,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -4152,7 +4077,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -4165,7 +4090,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -4181,7 +4106,7 @@ exports[`contextMenu element > selecting 'Send to back' in context menu sends el "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4214,7 +4139,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -4223,7 +4148,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -4309,7 +4234,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -4325,7 +4250,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "seed": 453191, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -4341,7 +4266,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -4357,7 +4282,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "seed": 1116226695, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -4400,7 +4325,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -4416,7 +4341,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "seed": 453191, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4443,7 +4368,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -4459,7 +4384,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "seed": 453191, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4472,7 +4397,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -4488,7 +4413,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "seed": 1116226695, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4518,7 +4443,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -4536,7 +4461,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "seed": 453191, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -4549,7 +4474,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -4567,7 +4492,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "seed": 1116226695, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -4595,7 +4520,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -4611,7 +4536,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "seed": 453191, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -4624,7 +4549,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -4640,7 +4565,7 @@ exports[`contextMenu element > selecting 'Ungroup selection' in context menu ung "seed": 1116226695, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -4676,7 +4601,6 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "keyTest": [Function], "name": "cut", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -4686,7 +4610,6 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "keyTest": undefined, "name": "copy", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -4696,7 +4619,6 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "keyTest": undefined, "name": "paste", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -4949,7 +4871,7 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -4958,7 +4880,7 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -5044,7 +4966,7 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5060,7 +4982,7 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -5076,7 +4998,7 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5092,7 +5014,7 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -5135,7 +5057,7 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5151,7 +5073,7 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -5178,7 +5100,7 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5194,7 +5116,7 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -5207,7 +5129,7 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5223,7 +5145,7 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -5259,7 +5181,6 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "keyTest": [Function], "name": "cut", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -5269,7 +5190,6 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "keyTest": undefined, "name": "copy", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -5279,7 +5199,6 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "keyTest": undefined, "name": "paste", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -5532,7 +5451,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -5541,7 +5460,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -5629,7 +5548,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -5647,7 +5566,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "seed": 453191, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -5663,7 +5582,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -5681,7 +5600,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "seed": 1116226695, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -5724,7 +5643,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5740,7 +5659,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "seed": 453191, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -5767,7 +5686,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5783,7 +5702,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "seed": 453191, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -5796,7 +5715,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5812,7 +5731,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "seed": 1116226695, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -5842,7 +5761,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -5860,7 +5779,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "seed": 453191, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -5873,7 +5792,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -5891,7 +5810,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro "seed": 1116226695, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -5927,7 +5846,6 @@ exports[`contextMenu element > shows context menu for canvas > [end of test] app "keyTest": undefined, "name": "paste", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -6052,7 +5970,7 @@ exports[`contextMenu element > shows context menu for canvas > [end of test] app "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -6061,7 +5979,7 @@ exports[`contextMenu element > shows context menu for canvas > [end of test] app "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -6181,7 +6099,6 @@ exports[`contextMenu element > shows context menu for element > [end of test] ap "keyTest": [Function], "name": "cut", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -6191,7 +6108,6 @@ exports[`contextMenu element > shows context menu for element > [end of test] ap "keyTest": undefined, "name": "copy", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -6201,7 +6117,6 @@ exports[`contextMenu element > shows context menu for element > [end of test] ap "keyTest": undefined, "name": "paste", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -6454,7 +6369,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] ap "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -6463,7 +6378,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] ap "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -6558,7 +6473,6 @@ exports[`contextMenu element > shows context menu for element > [end of test] ap "keyTest": [Function], "name": "cut", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -6568,7 +6482,6 @@ exports[`contextMenu element > shows context menu for element > [end of test] ap "keyTest": undefined, "name": "copy", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -6578,7 +6491,6 @@ exports[`contextMenu element > shows context menu for element > [end of test] ap "keyTest": undefined, "name": "paste", "perform": [Function], - "predicate": [Function], "trackEvent": { "category": "element", }, @@ -6831,7 +6743,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] ap "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -6840,7 +6752,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] ap "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -6926,7 +6838,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] el "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -6942,7 +6854,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] el "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -6958,7 +6870,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] el "angle": 0, "backgroundColor": "red", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 200, @@ -6974,7 +6886,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] el "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 1, @@ -6990,7 +6902,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] el "angle": 0, "backgroundColor": "red", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 200, @@ -7006,7 +6918,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] el "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 1, @@ -7049,7 +6961,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] hi "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -7065,7 +6977,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] hi "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, diff --git a/src/tests/__snapshots__/dragCreate.test.tsx.snap b/src/tests/__snapshots__/dragCreate.test.tsx.snap index 34c994da5..5c986f44b 100644 --- a/src/tests/__snapshots__/dragCreate.test.tsx.snap +++ b/src/tests/__snapshots__/dragCreate.test.tsx.snap @@ -9,7 +9,7 @@ exports[`Test dragCreate > add element to the scene when pointer dragging long e "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -38,7 +38,7 @@ exports[`Test dragCreate > add element to the scene when pointer dragging long e "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, @@ -56,7 +56,7 @@ exports[`Test dragCreate > add element to the scene when pointer dragging long e "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -72,7 +72,7 @@ exports[`Test dragCreate > add element to the scene when pointer dragging long e "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -90,7 +90,7 @@ exports[`Test dragCreate > add element to the scene when pointer dragging long e "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -106,7 +106,7 @@ exports[`Test dragCreate > add element to the scene when pointer dragging long e "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -124,7 +124,7 @@ exports[`Test dragCreate > add element to the scene when pointer dragging long e "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -153,7 +153,7 @@ exports[`Test dragCreate > add element to the scene when pointer dragging long e "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 3, @@ -171,7 +171,7 @@ exports[`Test dragCreate > add element to the scene when pointer dragging long e "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -187,7 +187,7 @@ exports[`Test dragCreate > add element to the scene when pointer dragging long e "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, diff --git a/src/tests/__snapshots__/move.test.tsx.snap b/src/tests/__snapshots__/move.test.tsx.snap index 092074ba3..015ff7c4c 100644 --- a/src/tests/__snapshots__/move.test.tsx.snap +++ b/src/tests/__snapshots__/move.test.tsx.snap @@ -5,7 +5,7 @@ exports[`duplicate element on move when ALT is clicked > rectangle 1`] = ` "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -21,7 +21,7 @@ exports[`duplicate element on move when ALT is clicked > rectangle 1`] = ` "seed": 1014066025, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -37,7 +37,7 @@ exports[`duplicate element on move when ALT is clicked > rectangle 2`] = ` "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -53,7 +53,7 @@ exports[`duplicate element on move when ALT is clicked > rectangle 2`] = ` "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -69,7 +69,7 @@ exports[`move element > rectangle 1`] = ` "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -85,7 +85,7 @@ exports[`move element > rectangle 1`] = ` "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -106,7 +106,7 @@ exports[`move element > rectangles with binding arrow 1`] = ` "type": "arrow", }, ], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -122,7 +122,7 @@ exports[`move element > rectangles with binding arrow 1`] = ` "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -143,7 +143,7 @@ exports[`move element > rectangles with binding arrow 2`] = ` "type": "arrow", }, ], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 300, @@ -159,7 +159,7 @@ exports[`move element > rectangles with binding arrow 2`] = ` "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 6, @@ -181,7 +181,7 @@ exports[`move element > rectangles with binding arrow 3`] = ` "focus": -0.46666666666666673, "gap": 10, }, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 81.48231043525051, @@ -214,7 +214,7 @@ exports[`move element > rectangles with binding arrow 3`] = ` }, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 11, diff --git a/src/tests/__snapshots__/multiPointCreate.test.tsx.snap b/src/tests/__snapshots__/multiPointCreate.test.tsx.snap index 1f488b4d1..48ae1f640 100644 --- a/src/tests/__snapshots__/multiPointCreate.test.tsx.snap +++ b/src/tests/__snapshots__/multiPointCreate.test.tsx.snap @@ -7,7 +7,7 @@ exports[`multi point mode in linear elements > arrow 1`] = ` "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 110, @@ -43,7 +43,7 @@ exports[`multi point mode in linear elements > arrow 1`] = ` "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 7, @@ -61,7 +61,7 @@ exports[`multi point mode in linear elements > line 1`] = ` "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 110, @@ -97,7 +97,7 @@ exports[`multi point mode in linear elements > line 1`] = ` "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 7, diff --git a/src/tests/__snapshots__/regressionTests.test.tsx.snap b/src/tests/__snapshots__/regressionTests.test.tsx.snap index c990a6e03..9cf919a9c 100644 --- a/src/tests/__snapshots__/regressionTests.test.tsx.snap +++ b/src/tests/__snapshots__/regressionTests.test.tsx.snap @@ -14,7 +14,7 @@ exports[`given element A and group of elements B and given both are selected whe "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -23,7 +23,7 @@ exports[`given element A and group of elements B and given both are selected whe "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -140,7 +140,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -156,7 +156,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -183,7 +183,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -199,7 +199,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -212,7 +212,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -228,7 +228,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -255,7 +255,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -271,7 +271,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -284,7 +284,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -300,7 +300,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -313,7 +313,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -329,7 +329,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -359,7 +359,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -375,7 +375,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -388,7 +388,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id5", @@ -406,7 +406,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -419,7 +419,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id5", @@ -437,7 +437,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -470,7 +470,7 @@ exports[`given element A and group of elements B and given both are selected whe "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -479,7 +479,7 @@ exports[`given element A and group of elements B and given both are selected whe "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -598,7 +598,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -614,7 +614,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -641,7 +641,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -657,7 +657,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -670,7 +670,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -686,7 +686,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -713,7 +713,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -729,7 +729,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -742,7 +742,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -758,7 +758,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -771,7 +771,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -787,7 +787,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -817,7 +817,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -833,7 +833,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -846,7 +846,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -864,7 +864,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -877,7 +877,7 @@ exports[`given element A and group of elements B and given both are selected whe "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -895,7 +895,7 @@ exports[`given element A and group of elements B and given both are selected whe "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -928,7 +928,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -937,7 +937,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -1047,7 +1047,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -1063,7 +1063,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1090,7 +1090,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -1106,7 +1106,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1119,7 +1119,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -1135,7 +1135,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1165,7 +1165,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -1183,7 +1183,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1196,7 +1196,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -1214,7 +1214,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1241,7 +1241,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -1259,7 +1259,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1272,7 +1272,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -1290,7 +1290,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1317,7 +1317,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -1335,7 +1335,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1348,7 +1348,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -1366,7 +1366,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1379,7 +1379,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -1395,7 +1395,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 81784553, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -1426,7 +1426,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -1445,7 +1445,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -1458,7 +1458,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -1477,7 +1477,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -1490,7 +1490,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id10", @@ -1508,7 +1508,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 81784553, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1535,7 +1535,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -1554,7 +1554,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -1567,7 +1567,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -1586,7 +1586,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -1599,7 +1599,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id10", @@ -1617,7 +1617,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 81784553, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1644,7 +1644,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -1663,7 +1663,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -1676,7 +1676,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -1695,7 +1695,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -1708,7 +1708,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id10", @@ -1726,7 +1726,7 @@ exports[`regression tests > Cmd/Ctrl-click exclusively select element under poin "seed": 81784553, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -1759,7 +1759,7 @@ exports[`regression tests > Drags selected element when hitting only bounding bo "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -1768,7 +1768,7 @@ exports[`regression tests > Drags selected element when hitting only bounding bo "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -1880,7 +1880,7 @@ exports[`regression tests > Drags selected element when hitting only bounding bo "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -1896,7 +1896,7 @@ exports[`regression tests > Drags selected element when hitting only bounding bo "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -1923,7 +1923,7 @@ exports[`regression tests > Drags selected element when hitting only bounding bo "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -1939,7 +1939,7 @@ exports[`regression tests > Drags selected element when hitting only bounding bo "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 3, @@ -1972,7 +1972,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] appSta "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -1981,7 +1981,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] appSta "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -2096,7 +2096,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -2112,7 +2112,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2139,7 +2139,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -2155,7 +2155,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2168,7 +2168,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -2184,7 +2184,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2211,7 +2211,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -2227,7 +2227,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2240,7 +2240,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -2256,7 +2256,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2269,7 +2269,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -2285,7 +2285,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2315,7 +2315,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -2331,7 +2331,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2344,7 +2344,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id5", @@ -2362,7 +2362,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -2375,7 +2375,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id5", @@ -2393,7 +2393,7 @@ exports[`regression tests > adjusts z order when grouping > [end of test] histor "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -2426,7 +2426,7 @@ exports[`regression tests > alt-drag duplicates an element > [end of test] appSt "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -2435,7 +2435,7 @@ exports[`regression tests > alt-drag duplicates an element > [end of test] appSt "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -2547,7 +2547,7 @@ exports[`regression tests > alt-drag duplicates an element > [end of test] histo "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -2563,7 +2563,7 @@ exports[`regression tests > alt-drag duplicates an element > [end of test] histo "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2590,7 +2590,7 @@ exports[`regression tests > alt-drag duplicates an element > [end of test] histo "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -2606,7 +2606,7 @@ exports[`regression tests > alt-drag duplicates an element > [end of test] histo "seed": 1014066025, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -2619,7 +2619,7 @@ exports[`regression tests > alt-drag duplicates an element > [end of test] histo "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -2635,7 +2635,7 @@ exports[`regression tests > alt-drag duplicates an element > [end of test] histo "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -2668,7 +2668,7 @@ exports[`regression tests > arrow keys > [end of test] appState 1`] = ` "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -2677,7 +2677,7 @@ exports[`regression tests > arrow keys > [end of test] appState 1`] = ` "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -2787,7 +2787,7 @@ exports[`regression tests > arrow keys > [end of test] history 1`] = ` "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -2803,7 +2803,7 @@ exports[`regression tests > arrow keys > [end of test] history 1`] = ` "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -2836,7 +2836,7 @@ exports[`regression tests > can drag element that covers another element, while "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -2845,7 +2845,7 @@ exports[`regression tests > can drag element that covers another element, while "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -2957,7 +2957,7 @@ exports[`regression tests > can drag element that covers another element, while "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 200, @@ -2973,7 +2973,7 @@ exports[`regression tests > can drag element that covers another element, while "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3000,7 +3000,7 @@ exports[`regression tests > can drag element that covers another element, while "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 200, @@ -3016,7 +3016,7 @@ exports[`regression tests > can drag element that covers another element, while "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3029,7 +3029,7 @@ exports[`regression tests > can drag element that covers another element, while "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 200, @@ -3045,7 +3045,7 @@ exports[`regression tests > can drag element that covers another element, while "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3072,7 +3072,7 @@ exports[`regression tests > can drag element that covers another element, while "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 200, @@ -3088,7 +3088,7 @@ exports[`regression tests > can drag element that covers another element, while "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3101,7 +3101,7 @@ exports[`regression tests > can drag element that covers another element, while "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 200, @@ -3117,7 +3117,7 @@ exports[`regression tests > can drag element that covers another element, while "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3130,7 +3130,7 @@ exports[`regression tests > can drag element that covers another element, while "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 350, @@ -3146,7 +3146,7 @@ exports[`regression tests > can drag element that covers another element, while "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -3173,7 +3173,7 @@ exports[`regression tests > can drag element that covers another element, while "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 200, @@ -3189,7 +3189,7 @@ exports[`regression tests > can drag element that covers another element, while "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3202,7 +3202,7 @@ exports[`regression tests > can drag element that covers another element, while "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 200, @@ -3218,7 +3218,7 @@ exports[`regression tests > can drag element that covers another element, while "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -3231,7 +3231,7 @@ exports[`regression tests > can drag element that covers another element, while "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 350, @@ -3247,7 +3247,7 @@ exports[`regression tests > can drag element that covers another element, while "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -3280,7 +3280,7 @@ exports[`regression tests > change the properties of a shape > [end of test] app "currentChartType": "bar", "currentItemBackgroundColor": "#ffc9c9", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -3289,7 +3289,7 @@ exports[`regression tests > change the properties of a shape > [end of test] app "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1971c2", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -3399,7 +3399,7 @@ exports[`regression tests > change the properties of a shape > [end of test] his "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -3415,7 +3415,7 @@ exports[`regression tests > change the properties of a shape > [end of test] his "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3442,7 +3442,7 @@ exports[`regression tests > change the properties of a shape > [end of test] his "angle": 0, "backgroundColor": "#ffec99", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -3458,7 +3458,7 @@ exports[`regression tests > change the properties of a shape > [end of test] his "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -3485,7 +3485,7 @@ exports[`regression tests > change the properties of a shape > [end of test] his "angle": 0, "backgroundColor": "#ffc9c9", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -3501,7 +3501,7 @@ exports[`regression tests > change the properties of a shape > [end of test] his "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -3528,7 +3528,7 @@ exports[`regression tests > change the properties of a shape > [end of test] his "angle": 0, "backgroundColor": "#ffc9c9", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -3544,7 +3544,7 @@ exports[`regression tests > change the properties of a shape > [end of test] his "seed": 1278240551, "strokeColor": "#1971c2", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 5, @@ -3577,7 +3577,7 @@ exports[`regression tests > click on an element and drag it > [dragged] appState "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -3586,7 +3586,7 @@ exports[`regression tests > click on an element and drag it > [dragged] appState "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -3671,7 +3671,7 @@ exports[`regression tests > click on an element and drag it > [dragged] element "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -3687,7 +3687,7 @@ exports[`regression tests > click on an element and drag it > [dragged] element "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -3730,7 +3730,7 @@ exports[`regression tests > click on an element and drag it > [dragged] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -3746,7 +3746,7 @@ exports[`regression tests > click on an element and drag it > [dragged] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3773,7 +3773,7 @@ exports[`regression tests > click on an element and drag it > [dragged] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -3789,7 +3789,7 @@ exports[`regression tests > click on an element and drag it > [dragged] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -3822,7 +3822,7 @@ exports[`regression tests > click on an element and drag it > [end of test] appS "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -3831,7 +3831,7 @@ exports[`regression tests > click on an element and drag it > [end of test] appS "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -3943,7 +3943,7 @@ exports[`regression tests > click on an element and drag it > [end of test] hist "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -3959,7 +3959,7 @@ exports[`regression tests > click on an element and drag it > [end of test] hist "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -3986,7 +3986,7 @@ exports[`regression tests > click on an element and drag it > [end of test] hist "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4002,7 +4002,7 @@ exports[`regression tests > click on an element and drag it > [end of test] hist "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -4029,7 +4029,7 @@ exports[`regression tests > click on an element and drag it > [end of test] hist "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4045,7 +4045,7 @@ exports[`regression tests > click on an element and drag it > [end of test] hist "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -4078,7 +4078,7 @@ exports[`regression tests > click to select a shape > [end of test] appState 1`] "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -4087,7 +4087,7 @@ exports[`regression tests > click to select a shape > [end of test] appState 1`] "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -4199,7 +4199,7 @@ exports[`regression tests > click to select a shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4215,7 +4215,7 @@ exports[`regression tests > click to select a shape > [end of test] history 1`] "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4242,7 +4242,7 @@ exports[`regression tests > click to select a shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4258,7 +4258,7 @@ exports[`regression tests > click to select a shape > [end of test] history 1`] "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4271,7 +4271,7 @@ exports[`regression tests > click to select a shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4287,7 +4287,7 @@ exports[`regression tests > click to select a shape > [end of test] history 1`] "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4320,7 +4320,7 @@ exports[`regression tests > click-drag to select a group > [end of test] appStat "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -4329,7 +4329,7 @@ exports[`regression tests > click-drag to select a group > [end of test] appStat "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -4442,7 +4442,7 @@ exports[`regression tests > click-drag to select a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4458,7 +4458,7 @@ exports[`regression tests > click-drag to select a group > [end of test] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4485,7 +4485,7 @@ exports[`regression tests > click-drag to select a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4501,7 +4501,7 @@ exports[`regression tests > click-drag to select a group > [end of test] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4514,7 +4514,7 @@ exports[`regression tests > click-drag to select a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4530,7 +4530,7 @@ exports[`regression tests > click-drag to select a group > [end of test] history "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4557,7 +4557,7 @@ exports[`regression tests > click-drag to select a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4573,7 +4573,7 @@ exports[`regression tests > click-drag to select a group > [end of test] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4586,7 +4586,7 @@ exports[`regression tests > click-drag to select a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4602,7 +4602,7 @@ exports[`regression tests > click-drag to select a group > [end of test] history "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4615,7 +4615,7 @@ exports[`regression tests > click-drag to select a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4631,7 +4631,7 @@ exports[`regression tests > click-drag to select a group > [end of test] history "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4664,7 +4664,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -4673,7 +4673,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -4785,7 +4785,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4801,7 +4801,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4828,7 +4828,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4844,7 +4844,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4857,7 +4857,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -4873,7 +4873,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -4903,7 +4903,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -4921,7 +4921,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -4934,7 +4934,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -4952,7 +4952,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -4979,7 +4979,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -4997,7 +4997,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -5010,7 +5010,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -5028,7 +5028,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -5057,7 +5057,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -5075,7 +5075,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -5088,7 +5088,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -5106,7 +5106,7 @@ exports[`regression tests > deleting last but one element in editing group shoul "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -5139,7 +5139,7 @@ exports[`regression tests > deselects group of selected elements on pointer down "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -5148,7 +5148,7 @@ exports[`regression tests > deselects group of selected elements on pointer down "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "down", "defaultSidebarDockedPreference": false, @@ -5156,7 +5156,7 @@ exports[`regression tests > deselects group of selected elements on pointer down "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -5172,7 +5172,7 @@ exports[`regression tests > deselects group of selected elements on pointer down "seed": 400692809, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "selection", "updated": 1, "version": 1, @@ -5239,7 +5239,7 @@ exports[`regression tests > deselects group of selected elements on pointer down "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -5255,7 +5255,7 @@ exports[`regression tests > deselects group of selected elements on pointer down "seed": 400692809, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "selection", "updated": 1, "version": 1, @@ -5315,7 +5315,7 @@ exports[`regression tests > deselects group of selected elements on pointer down "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5331,7 +5331,7 @@ exports[`regression tests > deselects group of selected elements on pointer down "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -5358,7 +5358,7 @@ exports[`regression tests > deselects group of selected elements on pointer down "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5374,7 +5374,7 @@ exports[`regression tests > deselects group of selected elements on pointer down "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -5387,7 +5387,7 @@ exports[`regression tests > deselects group of selected elements on pointer down "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5403,7 +5403,7 @@ exports[`regression tests > deselects group of selected elements on pointer down "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -5436,7 +5436,7 @@ exports[`regression tests > deselects group of selected elements on pointer up w "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -5445,7 +5445,7 @@ exports[`regression tests > deselects group of selected elements on pointer up w "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -5453,7 +5453,7 @@ exports[`regression tests > deselects group of selected elements on pointer up w "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -5469,7 +5469,7 @@ exports[`regression tests > deselects group of selected elements on pointer up w "seed": 400692809, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "selection", "updated": 1, "version": 1, @@ -5584,7 +5584,7 @@ exports[`regression tests > deselects group of selected elements on pointer up w "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5600,7 +5600,7 @@ exports[`regression tests > deselects group of selected elements on pointer up w "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -5627,7 +5627,7 @@ exports[`regression tests > deselects group of selected elements on pointer up w "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5643,7 +5643,7 @@ exports[`regression tests > deselects group of selected elements on pointer up w "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -5656,7 +5656,7 @@ exports[`regression tests > deselects group of selected elements on pointer up w "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5672,7 +5672,7 @@ exports[`regression tests > deselects group of selected elements on pointer up w "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -5705,7 +5705,7 @@ exports[`regression tests > deselects selected element on pointer down when poin "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -5714,7 +5714,7 @@ exports[`regression tests > deselects selected element on pointer down when poin "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "down", "defaultSidebarDockedPreference": false, @@ -5722,7 +5722,7 @@ exports[`regression tests > deselects selected element on pointer down when poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -5738,7 +5738,7 @@ exports[`regression tests > deselects selected element on pointer down when poin "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "selection", "updated": 1, "version": 1, @@ -5804,7 +5804,7 @@ exports[`regression tests > deselects selected element on pointer down when poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -5820,7 +5820,7 @@ exports[`regression tests > deselects selected element on pointer down when poin "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "selection", "updated": 1, "version": 1, @@ -5880,7 +5880,7 @@ exports[`regression tests > deselects selected element on pointer down when poin "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -5896,7 +5896,7 @@ exports[`regression tests > deselects selected element on pointer down when poin "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -5929,7 +5929,7 @@ exports[`regression tests > deselects selected element, on pointer up, when clic "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -5938,7 +5938,7 @@ exports[`regression tests > deselects selected element, on pointer up, when clic "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -6048,7 +6048,7 @@ exports[`regression tests > deselects selected element, on pointer up, when clic "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -6064,7 +6064,7 @@ exports[`regression tests > deselects selected element, on pointer up, when clic "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -6097,7 +6097,7 @@ exports[`regression tests > double click to edit a group > [end of test] appStat "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -6106,7 +6106,7 @@ exports[`regression tests > double click to edit a group > [end of test] appStat "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -6216,7 +6216,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -6232,7 +6232,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -6259,7 +6259,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -6275,7 +6275,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -6288,7 +6288,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -6304,7 +6304,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -6331,7 +6331,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -6347,7 +6347,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -6360,7 +6360,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -6376,7 +6376,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -6389,7 +6389,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -6405,7 +6405,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -6436,7 +6436,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -6454,7 +6454,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -6467,7 +6467,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -6485,7 +6485,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -6498,7 +6498,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -6516,7 +6516,7 @@ exports[`regression tests > double click to edit a group > [end of test] history "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -6549,7 +6549,7 @@ exports[`regression tests > drags selected elements from point inside common bou "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -6558,7 +6558,7 @@ exports[`regression tests > drags selected elements from point inside common bou "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -6672,7 +6672,7 @@ exports[`regression tests > drags selected elements from point inside common bou "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -6688,7 +6688,7 @@ exports[`regression tests > drags selected elements from point inside common bou "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -6715,7 +6715,7 @@ exports[`regression tests > drags selected elements from point inside common bou "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -6731,7 +6731,7 @@ exports[`regression tests > drags selected elements from point inside common bou "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -6744,7 +6744,7 @@ exports[`regression tests > drags selected elements from point inside common bou "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -6760,7 +6760,7 @@ exports[`regression tests > drags selected elements from point inside common bou "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -6788,7 +6788,7 @@ exports[`regression tests > drags selected elements from point inside common bou "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -6804,7 +6804,7 @@ exports[`regression tests > drags selected elements from point inside common bou "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -6817,7 +6817,7 @@ exports[`regression tests > drags selected elements from point inside common bou "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -6833,7 +6833,7 @@ exports[`regression tests > drags selected elements from point inside common bou "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 3, @@ -6866,7 +6866,7 @@ exports[`regression tests > draw every type of shape > [end of test] appState 1` "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -6875,7 +6875,7 @@ exports[`regression tests > draw every type of shape > [end of test] appState 1` "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -6983,7 +6983,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -6999,7 +6999,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -7026,7 +7026,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7042,7 +7042,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -7055,7 +7055,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7071,7 +7071,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -7098,7 +7098,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7114,7 +7114,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -7127,7 +7127,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7143,7 +7143,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -7156,7 +7156,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7172,7 +7172,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -7199,7 +7199,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7215,7 +7215,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -7228,7 +7228,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7244,7 +7244,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -7257,7 +7257,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7273,7 +7273,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -7288,7 +7288,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7317,7 +7317,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, @@ -7344,7 +7344,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7360,7 +7360,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -7373,7 +7373,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7389,7 +7389,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -7402,7 +7402,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7418,7 +7418,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -7433,7 +7433,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7462,7 +7462,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, @@ -7477,7 +7477,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7506,7 +7506,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 3, @@ -7533,7 +7533,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7549,7 +7549,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -7562,7 +7562,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7578,7 +7578,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -7591,7 +7591,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7607,7 +7607,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -7622,7 +7622,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7651,7 +7651,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, @@ -7666,7 +7666,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7695,7 +7695,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 3, @@ -7710,7 +7710,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7742,7 +7742,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 5, @@ -7769,7 +7769,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7785,7 +7785,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -7798,7 +7798,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7814,7 +7814,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -7827,7 +7827,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7843,7 +7843,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -7858,7 +7858,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7887,7 +7887,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, @@ -7902,7 +7902,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -7931,7 +7931,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 3, @@ -7946,7 +7946,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -7982,7 +7982,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 7, @@ -8009,7 +8009,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8025,7 +8025,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -8038,7 +8038,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8054,7 +8054,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -8067,7 +8067,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8083,7 +8083,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -8098,7 +8098,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8127,7 +8127,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, @@ -8142,7 +8142,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8171,7 +8171,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 3, @@ -8186,7 +8186,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -8222,7 +8222,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 7, @@ -8237,7 +8237,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8269,7 +8269,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 5, @@ -8296,7 +8296,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8312,7 +8312,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -8325,7 +8325,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8341,7 +8341,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -8354,7 +8354,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8370,7 +8370,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -8385,7 +8385,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8414,7 +8414,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, @@ -8429,7 +8429,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8458,7 +8458,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 3, @@ -8473,7 +8473,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -8509,7 +8509,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 7, @@ -8524,7 +8524,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -8560,7 +8560,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 7, @@ -8585,7 +8585,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8601,7 +8601,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -8614,7 +8614,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8630,7 +8630,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -8643,7 +8643,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8659,7 +8659,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -8674,7 +8674,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8703,7 +8703,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, @@ -8718,7 +8718,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8747,7 +8747,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 3, @@ -8762,7 +8762,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -8798,7 +8798,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 7, @@ -8813,7 +8813,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -8849,7 +8849,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 7, @@ -8862,7 +8862,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -8900,7 +8900,7 @@ exports[`regression tests > draw every type of shape > [end of test] history 1`] "simulatePressure": false, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "freedraw", "updated": 1, "version": 4, @@ -8933,7 +8933,7 @@ exports[`regression tests > given a group of selected elements with an element t "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -8942,7 +8942,7 @@ exports[`regression tests > given a group of selected elements with an element t "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -9055,7 +9055,7 @@ exports[`regression tests > given a group of selected elements with an element t "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -9071,7 +9071,7 @@ exports[`regression tests > given a group of selected elements with an element t "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -9098,7 +9098,7 @@ exports[`regression tests > given a group of selected elements with an element t "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -9114,7 +9114,7 @@ exports[`regression tests > given a group of selected elements with an element t "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -9127,7 +9127,7 @@ exports[`regression tests > given a group of selected elements with an element t "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -9143,7 +9143,7 @@ exports[`regression tests > given a group of selected elements with an element t "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -9170,7 +9170,7 @@ exports[`regression tests > given a group of selected elements with an element t "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -9186,7 +9186,7 @@ exports[`regression tests > given a group of selected elements with an element t "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -9199,7 +9199,7 @@ exports[`regression tests > given a group of selected elements with an element t "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -9215,7 +9215,7 @@ exports[`regression tests > given a group of selected elements with an element t "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -9228,7 +9228,7 @@ exports[`regression tests > given a group of selected elements with an element t "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -9244,7 +9244,7 @@ exports[`regression tests > given a group of selected elements with an element t "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -9277,7 +9277,7 @@ exports[`regression tests > given a selected element A and a not selected elemen "currentChartType": "bar", "currentItemBackgroundColor": "#ffc9c9", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -9286,7 +9286,7 @@ exports[`regression tests > given a selected element A and a not selected elemen "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -9399,7 +9399,7 @@ exports[`regression tests > given a selected element A and a not selected elemen "angle": 0, "backgroundColor": "#ffc9c9", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 1000, @@ -9415,7 +9415,7 @@ exports[`regression tests > given a selected element A and a not selected elemen "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -9442,7 +9442,7 @@ exports[`regression tests > given a selected element A and a not selected elemen "angle": 0, "backgroundColor": "#ffc9c9", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 1000, @@ -9458,7 +9458,7 @@ exports[`regression tests > given a selected element A and a not selected elemen "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -9471,7 +9471,7 @@ exports[`regression tests > given a selected element A and a not selected elemen "angle": 0, "backgroundColor": "#ffc9c9", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 1000, @@ -9487,7 +9487,7 @@ exports[`regression tests > given a selected element A and a not selected elemen "seed": 1150084233, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -9520,7 +9520,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -9529,7 +9529,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -9641,7 +9641,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "angle": 0, "backgroundColor": "red", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 1000, @@ -9657,7 +9657,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 1, @@ -9670,7 +9670,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "angle": 0, "backgroundColor": "red", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 500, @@ -9686,7 +9686,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 1, @@ -9719,7 +9719,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -9728,7 +9728,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -9840,7 +9840,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "angle": 0, "backgroundColor": "red", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 1000, @@ -9856,7 +9856,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 1, @@ -9869,7 +9869,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "angle": 0, "backgroundColor": "red", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 500, @@ -9885,7 +9885,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 1, @@ -9912,7 +9912,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "angle": 0, "backgroundColor": "red", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 1000, @@ -9928,7 +9928,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -9941,7 +9941,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "angle": 0, "backgroundColor": "red", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 500, @@ -9957,7 +9957,7 @@ exports[`regression tests > given selected element A with lower z-index than uns "seed": 449462985, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 1, @@ -9990,7 +9990,7 @@ exports[`regression tests > key 2 selects rectangle tool > [end of test] appStat "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -9999,7 +9999,7 @@ exports[`regression tests > key 2 selects rectangle tool > [end of test] appStat "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -10109,7 +10109,7 @@ exports[`regression tests > key 2 selects rectangle tool > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -10125,7 +10125,7 @@ exports[`regression tests > key 2 selects rectangle tool > [end of test] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -10158,7 +10158,7 @@ exports[`regression tests > key 3 selects diamond tool > [end of test] appState "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -10167,7 +10167,7 @@ exports[`regression tests > key 3 selects diamond tool > [end of test] appState "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -10277,7 +10277,7 @@ exports[`regression tests > key 3 selects diamond tool > [end of test] history 1 "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -10293,7 +10293,7 @@ exports[`regression tests > key 3 selects diamond tool > [end of test] history 1 "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -10326,7 +10326,7 @@ exports[`regression tests > key 4 selects ellipse tool > [end of test] appState "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -10335,7 +10335,7 @@ exports[`regression tests > key 4 selects ellipse tool > [end of test] appState "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -10445,7 +10445,7 @@ exports[`regression tests > key 4 selects ellipse tool > [end of test] history 1 "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -10461,7 +10461,7 @@ exports[`regression tests > key 4 selects ellipse tool > [end of test] history 1 "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -10494,7 +10494,7 @@ exports[`regression tests > key 5 selects arrow tool > [end of test] appState 1` "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -10503,7 +10503,7 @@ exports[`regression tests > key 5 selects arrow tool > [end of test] appState 1` "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -10638,7 +10638,7 @@ exports[`regression tests > key 5 selects arrow tool > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -10667,7 +10667,7 @@ exports[`regression tests > key 5 selects arrow tool > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, @@ -10700,7 +10700,7 @@ exports[`regression tests > key 6 selects line tool > [end of test] appState 1`] "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -10709,7 +10709,7 @@ exports[`regression tests > key 6 selects line tool > [end of test] appState 1`] "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -10844,7 +10844,7 @@ exports[`regression tests > key 6 selects line tool > [end of test] history 1`] "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -10873,7 +10873,7 @@ exports[`regression tests > key 6 selects line tool > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 3, @@ -10906,7 +10906,7 @@ exports[`regression tests > key 7 selects freedraw tool > [end of test] appState "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -10915,7 +10915,7 @@ exports[`regression tests > key 7 selects freedraw tool > [end of test] appState "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -11021,7 +11021,7 @@ exports[`regression tests > key 7 selects freedraw tool > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -11059,7 +11059,7 @@ exports[`regression tests > key 7 selects freedraw tool > [end of test] history "simulatePressure": false, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "freedraw", "updated": 1, "version": 4, @@ -11092,7 +11092,7 @@ exports[`regression tests > key a selects arrow tool > [end of test] appState 1` "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -11101,7 +11101,7 @@ exports[`regression tests > key a selects arrow tool > [end of test] appState 1` "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -11236,7 +11236,7 @@ exports[`regression tests > key a selects arrow tool > [end of test] history 1`] "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -11265,7 +11265,7 @@ exports[`regression tests > key a selects arrow tool > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, @@ -11298,7 +11298,7 @@ exports[`regression tests > key d selects diamond tool > [end of test] appState "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -11307,7 +11307,7 @@ exports[`regression tests > key d selects diamond tool > [end of test] appState "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -11417,7 +11417,7 @@ exports[`regression tests > key d selects diamond tool > [end of test] history 1 "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -11433,7 +11433,7 @@ exports[`regression tests > key d selects diamond tool > [end of test] history 1 "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -11466,7 +11466,7 @@ exports[`regression tests > key l selects line tool > [end of test] appState 1`] "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -11475,7 +11475,7 @@ exports[`regression tests > key l selects line tool > [end of test] appState 1`] "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -11610,7 +11610,7 @@ exports[`regression tests > key l selects line tool > [end of test] history 1`] "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -11639,7 +11639,7 @@ exports[`regression tests > key l selects line tool > [end of test] history 1`] "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 3, @@ -11672,7 +11672,7 @@ exports[`regression tests > key o selects ellipse tool > [end of test] appState "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -11681,7 +11681,7 @@ exports[`regression tests > key o selects ellipse tool > [end of test] appState "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -11791,7 +11791,7 @@ exports[`regression tests > key o selects ellipse tool > [end of test] history 1 "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -11807,7 +11807,7 @@ exports[`regression tests > key o selects ellipse tool > [end of test] history 1 "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -11840,7 +11840,7 @@ exports[`regression tests > key p selects freedraw tool > [end of test] appState "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -11849,7 +11849,7 @@ exports[`regression tests > key p selects freedraw tool > [end of test] appState "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -11955,7 +11955,7 @@ exports[`regression tests > key p selects freedraw tool > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -11993,7 +11993,7 @@ exports[`regression tests > key p selects freedraw tool > [end of test] history "simulatePressure": false, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "freedraw", "updated": 1, "version": 4, @@ -12026,7 +12026,7 @@ exports[`regression tests > key r selects rectangle tool > [end of test] appStat "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -12035,7 +12035,7 @@ exports[`regression tests > key r selects rectangle tool > [end of test] appStat "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -12145,7 +12145,7 @@ exports[`regression tests > key r selects rectangle tool > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -12161,7 +12161,7 @@ exports[`regression tests > key r selects rectangle tool > [end of test] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -12194,7 +12194,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] appSta "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -12203,7 +12203,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] appSta "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -12321,7 +12321,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -12337,7 +12337,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -12364,7 +12364,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -12380,7 +12380,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -12393,7 +12393,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -12409,7 +12409,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -12436,7 +12436,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -12452,7 +12452,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -12465,7 +12465,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -12481,7 +12481,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -12494,7 +12494,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -12510,7 +12510,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -12541,7 +12541,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -12559,7 +12559,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -12572,7 +12572,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -12590,7 +12590,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -12603,7 +12603,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -12621,7 +12621,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -12652,7 +12652,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4_copy", @@ -12670,7 +12670,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 941653321, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 5, @@ -12683,7 +12683,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4_copy", @@ -12701,7 +12701,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 1402203177, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 5, @@ -12714,7 +12714,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4_copy", @@ -12732,7 +12732,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 1349943049, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 5, @@ -12745,7 +12745,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -12763,7 +12763,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -12776,7 +12776,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -12794,7 +12794,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -12807,7 +12807,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -12825,7 +12825,7 @@ exports[`regression tests > make a group and duplicate it > [end of test] histor "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -12858,7 +12858,7 @@ exports[`regression tests > noop interaction after undo shouldn't create history "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -12867,7 +12867,7 @@ exports[`regression tests > noop interaction after undo shouldn't create history "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -12979,7 +12979,7 @@ exports[`regression tests > noop interaction after undo shouldn't create history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -12995,7 +12995,7 @@ exports[`regression tests > noop interaction after undo shouldn't create history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -13022,7 +13022,7 @@ exports[`regression tests > noop interaction after undo shouldn't create history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -13038,7 +13038,7 @@ exports[`regression tests > noop interaction after undo shouldn't create history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -13051,7 +13051,7 @@ exports[`regression tests > noop interaction after undo shouldn't create history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -13067,7 +13067,7 @@ exports[`regression tests > noop interaction after undo shouldn't create history "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -13100,7 +13100,7 @@ exports[`regression tests > pinch-to-zoom works > [end of test] appState 1`] = ` "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -13109,7 +13109,7 @@ exports[`regression tests > pinch-to-zoom works > [end of test] appState 1`] = ` "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "down", "defaultSidebarDockedPreference": false, @@ -13223,7 +13223,7 @@ exports[`regression tests > shift click on selected element should deselect it o "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -13232,7 +13232,7 @@ exports[`regression tests > shift click on selected element should deselect it o "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -13342,7 +13342,7 @@ exports[`regression tests > shift click on selected element should deselect it o "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -13358,7 +13358,7 @@ exports[`regression tests > shift click on selected element should deselect it o "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -13391,7 +13391,7 @@ exports[`regression tests > shift-click to multiselect, then drag > [end of test "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -13400,7 +13400,7 @@ exports[`regression tests > shift-click to multiselect, then drag > [end of test "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -13514,7 +13514,7 @@ exports[`regression tests > shift-click to multiselect, then drag > [end of test "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -13530,7 +13530,7 @@ exports[`regression tests > shift-click to multiselect, then drag > [end of test "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -13557,7 +13557,7 @@ exports[`regression tests > shift-click to multiselect, then drag > [end of test "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -13573,7 +13573,7 @@ exports[`regression tests > shift-click to multiselect, then drag > [end of test "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -13586,7 +13586,7 @@ exports[`regression tests > shift-click to multiselect, then drag > [end of test "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -13602,7 +13602,7 @@ exports[`regression tests > shift-click to multiselect, then drag > [end of test "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -13630,7 +13630,7 @@ exports[`regression tests > shift-click to multiselect, then drag > [end of test "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -13646,7 +13646,7 @@ exports[`regression tests > shift-click to multiselect, then drag > [end of test "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -13659,7 +13659,7 @@ exports[`regression tests > shift-click to multiselect, then drag > [end of test "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -13675,7 +13675,7 @@ exports[`regression tests > shift-click to multiselect, then drag > [end of test "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -13708,7 +13708,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -13717,7 +13717,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -13833,7 +13833,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -13849,7 +13849,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -13876,7 +13876,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -13892,7 +13892,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -13905,7 +13905,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -13921,7 +13921,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -13948,7 +13948,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -13964,7 +13964,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -13977,7 +13977,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -13993,7 +13993,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -14006,7 +14006,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -14022,7 +14022,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -14053,7 +14053,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -14071,7 +14071,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -14084,7 +14084,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -14102,7 +14102,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -14115,7 +14115,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -14133,7 +14133,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -14162,7 +14162,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -14178,7 +14178,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -14191,7 +14191,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -14207,7 +14207,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -14220,7 +14220,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -14236,7 +14236,7 @@ exports[`regression tests > should group elements and ungroup them > [end of tes "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -14255,217 +14255,6 @@ exports[`regression tests > should group elements and ungroup them > [end of tes exports[`regression tests > should group elements and ungroup them > [end of test] number of renders 1`] = `21`; -exports[`regression tests > should show fill icons when element has non transparent background > [end of test] appState 1`] = ` -{ - "activeEmbeddable": null, - "activeTool": { - "customType": null, - "lastActiveTool": null, - "locked": false, - "type": "selection", - }, - "collaborators": Map {}, - "contextMenu": null, - "currentChartType": "bar", - "currentItemBackgroundColor": "#ffc9c9", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemRoundness": "round", - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#1e1e1e", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "defaultSidebarDockedPreference": false, - "draggingElement": null, - "editingElement": null, - "editingFrame": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementsToHighlight": null, - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportScale": 1, - "exportWithDarkMode": false, - "fileHandle": null, - "frameRendering": { - "clip": true, - "enabled": true, - "name": true, - "outline": true, - }, - "frameToHighlight": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "objectsSnapModeEnabled": false, - "offsetLeft": 0, - "offsetTop": 0, - "openDialog": null, - "openMenu": null, - "openPopup": "elementBackground", - "openSidebar": null, - "originSnapOffset": null, - "pasteDialog": { - "data": null, - "shown": false, - }, - "penDetected": false, - "penMode": false, - "pendingImageElementId": null, - "previousSelectedElementIds": {}, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": { - "id0": true, - }, - "selectedElementsAreBeingDragged": false, - "selectedGroupIds": {}, - "selectedLinearElement": null, - "selectionElement": null, - "shouldCacheIgnoreZoom": false, - "showHyperlinkPopup": false, - "showStats": false, - "showWelcomeScreen": true, - "snapLines": [], - "startBoundElement": null, - "suggestedBindings": [], - "theme": "light", - "toast": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": { - "value": 1, - }, -} -`; - -exports[`regression tests > should show fill icons when element has non transparent background > [end of test] history 1`] = ` -{ - "recording": false, - "redoStack": [], - "stateHistory": [ - { - "appState": { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": {}, - "selectedGroupIds": {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": [], - }, - { - "appState": { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": { - "id0": true, - }, - "selectedGroupIds": {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": [ - { - "angle": 0, - "backgroundColor": "transparent", - "boundElements": null, - "fillStyle": "hachure", - "frameId": null, - "groupIds": [], - "height": 10, - "id": "id0", - "isDeleted": false, - "link": null, - "locked": false, - "opacity": 100, - "roughness": 1, - "roundness": { - "type": 3, - }, - "seed": 1278240551, - "strokeColor": "#1e1e1e", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "updated": 1, - "version": 2, - "versionNonce": 453191, - "width": 10, - "x": 0, - "y": 0, - }, - ], - }, - { - "appState": { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": { - "id0": true, - }, - "selectedGroupIds": {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": [ - { - "angle": 0, - "backgroundColor": "#ffc9c9", - "boundElements": null, - "fillStyle": "hachure", - "frameId": null, - "groupIds": [], - "height": 10, - "id": "id0", - "isDeleted": false, - "link": null, - "locked": false, - "opacity": 100, - "roughness": 1, - "roundness": { - "type": 3, - }, - "seed": 1278240551, - "strokeColor": "#1e1e1e", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "updated": 1, - "version": 3, - "versionNonce": 2019559783, - "width": 10, - "x": 0, - "y": 0, - }, - ], - }, - ], -} -`; - -exports[`regression tests > should show fill icons when element has non transparent background > [end of test] number of elements 1`] = `0`; - -exports[`regression tests > should show fill icons when element has non transparent background > [end of test] number of renders 1`] = `9`; - exports[`regression tests > single-clicking on a subgroup of a selected group should not alter selection > [end of test] appState 1`] = ` { "activeEmbeddable": null, @@ -14480,7 +14269,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -14489,7 +14278,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -14609,7 +14398,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -14625,7 +14414,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -14652,7 +14441,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -14668,7 +14457,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -14681,7 +14470,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -14697,7 +14486,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -14727,7 +14516,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -14745,7 +14534,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -14758,7 +14547,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -14776,7 +14565,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -14803,7 +14592,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -14821,7 +14610,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -14834,7 +14623,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -14852,7 +14641,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -14865,7 +14654,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -14881,7 +14670,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 493213705, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -14908,7 +14697,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -14926,7 +14715,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -14939,7 +14728,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -14957,7 +14746,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -14970,7 +14759,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -14986,7 +14775,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 493213705, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -14999,7 +14788,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -15015,7 +14804,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 1723083209, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -15045,7 +14834,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -15063,7 +14852,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -15076,7 +14865,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -15094,7 +14883,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -15107,7 +14896,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id9", @@ -15125,7 +14914,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 493213705, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -15138,7 +14927,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id9", @@ -15156,7 +14945,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 1723083209, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -15188,7 +14977,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -15207,7 +14996,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -15220,7 +15009,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id4", @@ -15239,7 +15028,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -15252,7 +15041,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id9", @@ -15271,7 +15060,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 493213705, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -15284,7 +15073,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id9", @@ -15303,7 +15092,7 @@ exports[`regression tests > single-clicking on a subgroup of a selected group sh "seed": 1723083209, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -15336,7 +15125,7 @@ exports[`regression tests > spacebar + drag scrolls the canvas > [end of test] a "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -15345,7 +15134,7 @@ exports[`regression tests > spacebar + drag scrolls the canvas > [end of test] a "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -15462,7 +15251,7 @@ exports[`regression tests > supports nested groups > [end of test] appState 1`] "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -15471,7 +15260,7 @@ exports[`regression tests > supports nested groups > [end of test] appState 1`] "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -15583,7 +15372,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -15599,7 +15388,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -15626,7 +15415,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -15642,7 +15431,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -15655,7 +15444,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -15671,7 +15460,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -15698,7 +15487,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -15714,7 +15503,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -15727,7 +15516,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -15743,7 +15532,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -15756,7 +15545,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -15772,7 +15561,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -15803,7 +15592,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -15821,7 +15610,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -15834,7 +15623,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -15852,7 +15641,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -15865,7 +15654,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -15883,7 +15672,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -15911,7 +15700,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -15929,7 +15718,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -15942,7 +15731,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -15960,7 +15749,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -15973,7 +15762,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -15991,7 +15780,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -16021,7 +15810,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -16039,7 +15828,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -16052,7 +15841,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id5", @@ -16071,7 +15860,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -16084,7 +15873,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id5", @@ -16103,7 +15892,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -16134,7 +15923,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id3", @@ -16152,7 +15941,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 3, @@ -16165,7 +15954,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id5", @@ -16184,7 +15973,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -16197,7 +15986,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [ "id5", @@ -16216,7 +16005,7 @@ exports[`regression tests > supports nested groups > [end of test] history 1`] = "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 4, @@ -16249,7 +16038,7 @@ exports[`regression tests > switches from group of selected elements to another "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -16258,7 +16047,7 @@ exports[`regression tests > switches from group of selected elements to another "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "down", "defaultSidebarDockedPreference": false, @@ -16266,7 +16055,7 @@ exports[`regression tests > switches from group of selected elements to another "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -16282,7 +16071,7 @@ exports[`regression tests > switches from group of selected elements to another "seed": 493213705, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "selection", "updated": 1, "version": 1, @@ -16351,7 +16140,7 @@ exports[`regression tests > switches from group of selected elements to another "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -16367,7 +16156,7 @@ exports[`regression tests > switches from group of selected elements to another "seed": 493213705, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "selection", "updated": 1, "version": 1, @@ -16427,7 +16216,7 @@ exports[`regression tests > switches from group of selected elements to another "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -16443,7 +16232,7 @@ exports[`regression tests > switches from group of selected elements to another "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -16470,7 +16259,7 @@ exports[`regression tests > switches from group of selected elements to another "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -16486,7 +16275,7 @@ exports[`regression tests > switches from group of selected elements to another "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -16499,7 +16288,7 @@ exports[`regression tests > switches from group of selected elements to another "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -16515,7 +16304,7 @@ exports[`regression tests > switches from group of selected elements to another "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -16542,7 +16331,7 @@ exports[`regression tests > switches from group of selected elements to another "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -16558,7 +16347,7 @@ exports[`regression tests > switches from group of selected elements to another "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -16571,7 +16360,7 @@ exports[`regression tests > switches from group of selected elements to another "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -16587,7 +16376,7 @@ exports[`regression tests > switches from group of selected elements to another "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -16600,7 +16389,7 @@ exports[`regression tests > switches from group of selected elements to another "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -16616,7 +16405,7 @@ exports[`regression tests > switches from group of selected elements to another "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -16649,7 +16438,7 @@ exports[`regression tests > switches selected element on pointer down > [end of "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -16658,7 +16447,7 @@ exports[`regression tests > switches selected element on pointer down > [end of "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "down", "defaultSidebarDockedPreference": false, @@ -16666,7 +16455,7 @@ exports[`regression tests > switches selected element on pointer down > [end of "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -16682,7 +16471,7 @@ exports[`regression tests > switches selected element on pointer down > [end of "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "selection", "updated": 1, "version": 1, @@ -16750,7 +16539,7 @@ exports[`regression tests > switches selected element on pointer down > [end of "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -16766,7 +16555,7 @@ exports[`regression tests > switches selected element on pointer down > [end of "seed": 238820263, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "selection", "updated": 1, "version": 1, @@ -16826,7 +16615,7 @@ exports[`regression tests > switches selected element on pointer down > [end of "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -16842,7 +16631,7 @@ exports[`regression tests > switches selected element on pointer down > [end of "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -16869,7 +16658,7 @@ exports[`regression tests > switches selected element on pointer down > [end of "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -16885,7 +16674,7 @@ exports[`regression tests > switches selected element on pointer down > [end of "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -16898,7 +16687,7 @@ exports[`regression tests > switches selected element on pointer down > [end of "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -16914,7 +16703,7 @@ exports[`regression tests > switches selected element on pointer down > [end of "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -16947,7 +16736,7 @@ exports[`regression tests > two-finger scroll works > [end of test] appState 1`] "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -16956,7 +16745,7 @@ exports[`regression tests > two-finger scroll works > [end of test] appState 1`] "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "down", "defaultSidebarDockedPreference": false, @@ -17070,7 +16859,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] appStat "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -17079,7 +16868,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] appStat "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -17177,7 +16966,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -17193,7 +16982,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -17206,7 +16995,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -17222,7 +17011,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -17237,7 +17026,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -17273,7 +17062,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 7, @@ -17300,7 +17089,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -17316,7 +17105,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -17329,7 +17118,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -17345,7 +17134,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -17360,7 +17149,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -17392,7 +17181,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 5, @@ -17432,7 +17221,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -17448,7 +17237,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -17475,7 +17264,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 10, @@ -17491,7 +17280,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -17504,7 +17293,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 20, @@ -17520,7 +17309,7 @@ exports[`regression tests > undo/redo drawing an element > [end of test] history "seed": 2019559783, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, @@ -17553,7 +17342,7 @@ exports[`regression tests > updates fontSize & fontFamily appState > [end of tes "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 3, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -17562,7 +17351,7 @@ exports[`regression tests > updates fontSize & fontFamily appState > [end of tes "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, @@ -17676,7 +17465,7 @@ exports[`regression tests > zoom hotkeys > [end of test] appState 1`] = ` "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", + "currentItemFillStyle": "solid", "currentItemFontFamily": 1, "currentItemFontSize": 20, "currentItemOpacity": 100, @@ -17685,7 +17474,7 @@ exports[`regression tests > zoom hotkeys > [end of test] appState 1`] = ` "currentItemStartArrowhead": null, "currentItemStrokeColor": "#1e1e1e", "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, + "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", "defaultSidebarDockedPreference": false, diff --git a/src/tests/__snapshots__/selection.test.tsx.snap b/src/tests/__snapshots__/selection.test.tsx.snap index 33635bca5..92ebee631 100644 --- a/src/tests/__snapshots__/selection.test.tsx.snap +++ b/src/tests/__snapshots__/selection.test.tsx.snap @@ -7,7 +7,7 @@ exports[`select single element on the scene > arrow 1`] = ` "boundElements": null, "endArrowhead": "arrow", "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -36,7 +36,7 @@ exports[`select single element on the scene > arrow 1`] = ` "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 3, @@ -54,7 +54,7 @@ exports[`select single element on the scene > arrow escape 1`] = ` "boundElements": null, "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -83,7 +83,7 @@ exports[`select single element on the scene > arrow escape 1`] = ` "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 3, @@ -99,7 +99,7 @@ exports[`select single element on the scene > diamond 1`] = ` "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -115,7 +115,7 @@ exports[`select single element on the scene > diamond 1`] = ` "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "diamond", "updated": 1, "version": 2, @@ -131,7 +131,7 @@ exports[`select single element on the scene > ellipse 1`] = ` "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -147,7 +147,7 @@ exports[`select single element on the scene > ellipse 1`] = ` "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "ellipse", "updated": 1, "version": 2, @@ -163,7 +163,7 @@ exports[`select single element on the scene > rectangle 1`] = ` "angle": 0, "backgroundColor": "transparent", "boundElements": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 50, @@ -179,7 +179,7 @@ exports[`select single element on the scene > rectangle 1`] = ` "seed": 1278240551, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "rectangle", "updated": 1, "version": 2, diff --git a/src/tests/clipboard.test.tsx b/src/tests/clipboard.test.tsx index 4a55e0689..52295a123 100644 --- a/src/tests/clipboard.test.tsx +++ b/src/tests/clipboard.test.tsx @@ -1,11 +1,6 @@ import { vi } from "vitest"; import ReactDOM from "react-dom"; -import { - render, - waitFor, - GlobalTestState, - createPasteEvent, -} from "./test-utils"; +import { render, waitFor, GlobalTestState } from "./test-utils"; import { Pointer, Keyboard } from "./helpers/ui"; import { Excalidraw } from "../packages/excalidraw/index"; import { KEYS } from "../keys"; @@ -16,7 +11,7 @@ import { import { getElementBounds } from "../element"; import { NormalizedZoomValue } from "../types"; import { API } from "./helpers/api"; -import { copyToClipboard } from "../clipboard"; +import { createPasteEvent, serializeAsClipboardJSON } from "../clipboard"; const { h } = window; @@ -35,22 +30,16 @@ vi.mock("../keys.ts", async (importOriginal) => { }; }); -const setClipboardText = (text: string) => { - Object.assign(navigator, { - clipboard: { - readText: () => text, +const sendPasteEvent = (text: string) => { + const clipboardEvent = createPasteEvent({ + types: { + "text/plain": text, }, }); -}; - -const sendPasteEvent = (text?: string) => { - const clipboardEvent = createPasteEvent( - text || (() => window.navigator.clipboard.readText()), - ); document.dispatchEvent(clipboardEvent); }; -const pasteWithCtrlCmdShiftV = (text?: string) => { +const pasteWithCtrlCmdShiftV = (text: string) => { Keyboard.withModifierKeys({ ctrl: true, shift: true }, () => { //triggering keydown with an empty clipboard Keyboard.keyPress(KEYS.V); @@ -59,7 +48,7 @@ const pasteWithCtrlCmdShiftV = (text?: string) => { }); }; -const pasteWithCtrlCmdV = (text?: string) => { +const pasteWithCtrlCmdV = (text: string) => { Keyboard.withModifierKeys({ ctrl: true }, () => { //triggering keydown with an empty clipboard Keyboard.keyPress(KEYS.V); @@ -86,7 +75,6 @@ beforeEach(async () => { initialData={{ appState: { zoom: { value: 1 as NormalizedZoomValue } } }} />, ); - setClipboardText(""); Object.assign(document, { elementFromPoint: () => GlobalTestState.canvas, }); @@ -95,7 +83,10 @@ beforeEach(async () => { describe("general paste behavior", () => { it("should randomize seed on paste", async () => { const rectangle = API.createElement({ type: "rectangle" }); - const clipboardJSON = (await copyToClipboard([rectangle], null))!; + const clipboardJSON = await serializeAsClipboardJSON({ + elements: [rectangle], + files: null, + }); pasteWithCtrlCmdV(clipboardJSON); await waitFor(() => { @@ -106,7 +97,10 @@ describe("general paste behavior", () => { it("should retain seed on shift-paste", async () => { const rectangle = API.createElement({ type: "rectangle" }); - const clipboardJSON = (await copyToClipboard([rectangle], null))!; + const clipboardJSON = await serializeAsClipboardJSON({ + elements: [rectangle], + files: null, + }); // assert we don't randomize seed on shift-paste pasteWithCtrlCmdShiftV(clipboardJSON); @@ -120,8 +114,7 @@ describe("general paste behavior", () => { describe("paste text as single lines", () => { it("should create an element for each line when copying with Ctrl/Cmd+V", async () => { const text = "sajgfakfn\naaksfnknas\nakefnkasf"; - setClipboardText(text); - pasteWithCtrlCmdV(); + pasteWithCtrlCmdV(text); await waitFor(() => { expect(h.elements.length).toEqual(text.split("\n").length); }); @@ -129,8 +122,7 @@ describe("paste text as single lines", () => { it("should ignore empty lines when creating an element for each line", async () => { const text = "\n\nsajgfakfn\n\n\naaksfnknas\n\nakefnkasf\n\n\n"; - setClipboardText(text); - pasteWithCtrlCmdV(); + pasteWithCtrlCmdV(text); await waitFor(() => { expect(h.elements.length).toEqual(3); }); @@ -138,8 +130,7 @@ describe("paste text as single lines", () => { it("should not create any element if clipboard has only new lines", async () => { const text = "\n\n\n\n\n"; - setClipboardText(text); - pasteWithCtrlCmdV(); + pasteWithCtrlCmdV(text); await waitFor(async () => { await sleep(50); // elements lenght will always be zero if we don't wait, since paste is async expect(h.elements.length).toEqual(0); @@ -155,8 +146,7 @@ describe("paste text as single lines", () => { ) + 10 / h.app.state.zoom.value; mouse.moveTo(100, 100); - setClipboardText(text); - pasteWithCtrlCmdV(); + pasteWithCtrlCmdV(text); await waitFor(async () => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const [fx, firstElY] = getElementBounds(h.elements[0]); @@ -177,8 +167,7 @@ describe("paste text as single lines", () => { ) + 10 / h.app.state.zoom.value; mouse.moveTo(100, 100); - setClipboardText(text); - pasteWithCtrlCmdV(); + pasteWithCtrlCmdV(text); await waitFor(async () => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const [fx, firstElY] = getElementBounds(h.elements[0]); @@ -192,16 +181,14 @@ describe("paste text as single lines", () => { describe("paste text as a single element", () => { it("should create single text element when copying text with Ctrl/Cmd+Shift+V", async () => { const text = "sajgfakfn\naaksfnknas\nakefnkasf"; - setClipboardText(text); - pasteWithCtrlCmdShiftV(); + pasteWithCtrlCmdShiftV(text); await waitFor(() => { expect(h.elements.length).toEqual(1); }); }); it("should not create any element when only new lines in clipboard", async () => { const text = "\n\n\n\n"; - setClipboardText(text); - pasteWithCtrlCmdShiftV(); + pasteWithCtrlCmdShiftV(text); await waitFor(async () => { await sleep(50); expect(h.elements.length).toEqual(0); @@ -243,8 +230,7 @@ describe("Paste bound text container", () => { type: "excalidraw/clipboard", elements: [container, textElement], }); - setClipboardText(data); - pasteWithCtrlCmdShiftV(); + pasteWithCtrlCmdShiftV(data); await waitFor(async () => { await sleep(1); @@ -266,8 +252,7 @@ describe("Paste bound text container", () => { textElement, ], }); - setClipboardText(data); - pasteWithCtrlCmdShiftV(); + pasteWithCtrlCmdShiftV(data); await waitFor(async () => { await sleep(1); diff --git a/src/tests/contextmenu.test.tsx b/src/tests/contextmenu.test.tsx index 2d556d3ac..673121919 100644 --- a/src/tests/contextmenu.test.tsx +++ b/src/tests/contextmenu.test.tsx @@ -83,6 +83,7 @@ describe("contextMenu element", () => { const contextMenuOptions = contextMenu?.querySelectorAll(".context-menu li"); const expectedShortcutNames: ShortcutName[] = [ + "paste", "selectAll", "gridMode", "zenMode", @@ -114,6 +115,9 @@ describe("contextMenu element", () => { const contextMenuOptions = contextMenu?.querySelectorAll(".context-menu li"); const expectedShortcutNames: ShortcutName[] = [ + "cut", + "copy", + "paste", "copyStyles", "pasteStyles", "deleteSelectedElements", @@ -203,6 +207,9 @@ describe("contextMenu element", () => { const contextMenuOptions = contextMenu?.querySelectorAll(".context-menu li"); const expectedShortcutNames: ShortcutName[] = [ + "cut", + "copy", + "paste", "copyStyles", "pasteStyles", "deleteSelectedElements", @@ -256,6 +263,9 @@ describe("contextMenu element", () => { const contextMenuOptions = contextMenu?.querySelectorAll(".context-menu li"); const expectedShortcutNames: ShortcutName[] = [ + "cut", + "copy", + "paste", "copyStyles", "pasteStyles", "deleteSelectedElements", diff --git a/src/tests/data/__snapshots__/restore.test.ts.snap b/src/tests/data/__snapshots__/restore.test.ts.snap index 881940210..0c06b65f1 100644 --- a/src/tests/data/__snapshots__/restore.test.ts.snap +++ b/src/tests/data/__snapshots__/restore.test.ts.snap @@ -7,7 +7,7 @@ exports[`restoreElements > should restore arrow element correctly 1`] = ` "boundElements": [], "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -36,7 +36,7 @@ exports[`restoreElements > should restore arrow element correctly 1`] = ` "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "arrow", "updated": 1, "version": 1, @@ -160,7 +160,7 @@ exports[`restoreElements > should restore freedraw element correctly 1`] = ` "angle": 0, "backgroundColor": "transparent", "boundElements": [], - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 0, @@ -180,7 +180,7 @@ exports[`restoreElements > should restore freedraw element correctly 1`] = ` "simulatePressure": true, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "freedraw", "updated": 1, "version": 1, @@ -198,7 +198,7 @@ exports[`restoreElements > should restore line and draw elements correctly 1`] = "boundElements": [], "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -227,7 +227,7 @@ exports[`restoreElements > should restore line and draw elements correctly 1`] = "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 1, @@ -245,7 +245,7 @@ exports[`restoreElements > should restore line and draw elements correctly 2`] = "boundElements": [], "endArrowhead": null, "endBinding": null, - "fillStyle": "hachure", + "fillStyle": "solid", "frameId": null, "groupIds": [], "height": 100, @@ -274,7 +274,7 @@ exports[`restoreElements > should restore line and draw elements correctly 2`] = "startBinding": null, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "type": "line", "updated": 1, "version": 1, @@ -292,7 +292,7 @@ exports[`restoreElements > should restore text element correctly passing value f "baseline": 0, "boundElements": [], "containerId": null, - "fillStyle": "hachure", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 14, "frameId": null, @@ -312,7 +312,7 @@ exports[`restoreElements > should restore text element correctly passing value f "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "text", "textAlign": "center", "type": "text", @@ -333,19 +333,19 @@ exports[`restoreElements > should restore text element correctly with unknown fo "baseline": 0, "boundElements": [], "containerId": null, - "fillStyle": "hachure", + "fillStyle": "solid", "fontFamily": 1, "fontSize": 10, "frameId": null, "groupIds": [], "height": 100, "id": "id-text01", - "isDeleted": false, + "isDeleted": true, "lineHeight": 1.25, "link": null, "locked": false, "opacity": 100, - "originalText": "test", + "originalText": "", "roughness": 1, "roundness": { "type": 3, @@ -353,13 +353,13 @@ exports[`restoreElements > should restore text element correctly with unknown fo "seed": Any, "strokeColor": "#1e1e1e", "strokeStyle": "solid", - "strokeWidth": 1, + "strokeWidth": 2, "text": "", "textAlign": "left", "type": "text", "updated": 1, - "version": 1, - "versionNonce": 0, + "version": 2, + "versionNonce": Any, "verticalAlign": "top", "width": 100, "x": 0, diff --git a/src/tests/data/restore.test.ts b/src/tests/data/restore.test.ts index 0019b0e8b..0a0d9b151 100644 --- a/src/tests/data/restore.test.ts +++ b/src/tests/data/restore.test.ts @@ -86,12 +86,15 @@ describe("restoreElements", () => { textElement.text = null; textElement.font = "10 unknown"; + expect(textElement.isDeleted).toBe(false); const restoredText = restore.restoreElements( [textElement], null, )[0] as ExcalidrawTextElement; + expect(restoredText.isDeleted).toBe(true); expect(restoredText).toMatchSnapshot({ seed: expect.any(Number), + versionNonce: expect.any(Number), }); }); diff --git a/src/tests/flip.test.tsx b/src/tests/flip.test.tsx index b80b25f2d..d384f1224 100644 --- a/src/tests/flip.test.tsx +++ b/src/tests/flip.test.tsx @@ -1,6 +1,5 @@ import ReactDOM from "react-dom"; import { - createPasteEvent, fireEvent, GlobalTestState, render, @@ -27,6 +26,7 @@ import { vi } from "vitest"; import * as blob from "../data/blob"; import { KEYS } from "../keys"; import { getBoundTextElementPosition } from "../element/textElement"; +import { createPasteEvent } from "../clipboard"; const { h } = window; const mouse = new Pointer("mouse"); @@ -727,7 +727,7 @@ describe("freedraw", () => { describe("image", () => { const createImage = async () => { const sendPasteEvent = (file?: File) => { - const clipboardEvent = createPasteEvent("", file ? [file] : []); + const clipboardEvent = createPasteEvent({ files: file ? [file] : [] }); document.dispatchEvent(clipboardEvent); }; diff --git a/src/tests/helpers/api.ts b/src/tests/helpers/api.ts index 38a2630bc..3c11ac0f4 100644 --- a/src/tests/helpers/api.ts +++ b/src/tests/helpers/api.ts @@ -124,6 +124,7 @@ export class API { angle?: number; id?: string; isDeleted?: boolean; + frameId?: ExcalidrawElement["id"] | null; groupIds?: string[]; // generic element props strokeColor?: ExcalidrawGenericElement["strokeColor"]; @@ -191,13 +192,13 @@ export class API { | "versionNonce" | "isDeleted" | "groupIds" - | "frameId" | "link" | "updated" > = { ...custom, x, y, + frameId: rest.frameId ?? null, angle: rest.angle ?? 0, strokeColor: rest.strokeColor ?? appState.currentItemStrokeColor, backgroundColor: diff --git a/src/tests/helpers/polyfills.ts b/src/tests/helpers/polyfills.ts new file mode 100644 index 000000000..8b866b6c6 --- /dev/null +++ b/src/tests/helpers/polyfills.ts @@ -0,0 +1,91 @@ +class ClipboardEvent { + constructor( + type: "paste" | "copy", + eventInitDict: { + clipboardData: DataTransfer; + }, + ) { + return Object.assign( + new Event("paste", { + bubbles: true, + cancelable: true, + composed: true, + }), + { + clipboardData: eventInitDict.clipboardData, + }, + ) as any as ClipboardEvent; + } +} + +type DataKind = "string" | "file"; + +class DataTransferItem { + kind: DataKind; + type: string; + data: string | Blob; + + constructor(kind: DataKind, type: string, data: string | Blob) { + this.kind = kind; + this.type = type; + this.data = data; + } + + getAsString(callback: (data: string) => void): void { + if (this.kind === "string") { + callback(this.data as string); + } + } + + getAsFile(): File | null { + if (this.kind === "file" && this.data instanceof File) { + return this.data; + } + return null; + } +} + +class DataTransferList { + items: DataTransferItem[] = []; + + add(data: string | File, type: string = ""): void { + if (typeof data === "string") { + this.items.push(new DataTransferItem("string", type, data)); + } else if (data instanceof File) { + this.items.push(new DataTransferItem("file", type, data)); + } + } + + clear(): void { + this.items = []; + } +} + +class DataTransfer { + public items: DataTransferList = new DataTransferList(); + private _types: Record = {}; + + get files() { + return this.items.items + .filter((item) => item.kind === "file") + .map((item) => item.getAsFile()!); + } + + add(data: string | File, type: string = ""): void { + this.items.add(data, type); + } + + setData(type: string, value: string) { + this._types[type] = value; + } + + getData(type: string) { + return this._types[type] || ""; + } +} + +export const testPolyfills = { + ClipboardEvent, + DataTransfer, + DataTransferItem, +}; diff --git a/src/tests/helpers/ui.ts b/src/tests/helpers/ui.ts index f815b07dc..105d7a394 100644 --- a/src/tests/helpers/ui.ts +++ b/src/tests/helpers/ui.ts @@ -1,13 +1,38 @@ -import { +import type { Point } from "../../types"; +import type { ExcalidrawElement, ExcalidrawLinearElement, ExcalidrawTextElement, + ExcalidrawArrowElement, + ExcalidrawRectangleElement, + ExcalidrawEllipseElement, + ExcalidrawDiamondElement, + ExcalidrawTextContainer, + ExcalidrawTextElementWithContainer, } from "../../element/types"; +import { + getTransformHandles, + getTransformHandlesFromCoords, + OMIT_SIDES_FOR_FRAME, + OMIT_SIDES_FOR_MULTIPLE_ELEMENTS, + TransformHandleType, + type TransformHandle, + type TransformHandleDirection, +} from "../../element/transformHandles"; import { KEYS } from "../../keys"; -import { ToolName } from "../queries/toolQueries"; -import { fireEvent, GlobalTestState } from "../test-utils"; +import { type ToolName } from "../queries/toolQueries"; +import { fireEvent, GlobalTestState, screen } from "../test-utils"; import { mutateElement } from "../../element/mutateElement"; import { API } from "./api"; +import { + isFrameElement, + isLinearElement, + isFreeDrawElement, + isTextElement, +} from "../../element/typeChecks"; +import { getCommonBounds, getElementPointsCoords } from "../../element/bounds"; +import { rotatePoint } from "../../math"; +import { getTextEditor } from "../queries/dom"; const { h } = window; @@ -86,6 +111,29 @@ export class Keyboard { }; } +const getElementPointForSelection = (element: ExcalidrawElement): Point => { + const { x, y, width, height, angle } = element; + const target: Point = [ + x + + (isLinearElement(element) || isFreeDrawElement(element) ? 0 : width / 2), + y, + ]; + let center: Point; + + if (isLinearElement(element)) { + const bounds = getElementPointsCoords(element, element.points); + center = [(bounds[0] + bounds[2]) / 2, (bounds[1] + bounds[3]) / 2]; + } else { + center = [x + width / 2, y + height / 2]; + } + + if (isTextElement(element)) { + return center; + } + + return rotatePoint(target, center, angle); +}; + export class Pointer { public clientX = 0; public clientY = 0; @@ -199,31 +247,120 @@ export class Pointer { elements: ExcalidrawElement | ExcalidrawElement[], ) { API.clearSelection(); + Keyboard.withModifierKeys({ shift: true }, () => { elements = Array.isArray(elements) ? elements : [elements]; elements.forEach((element) => { this.reset(); - this.click(element.x, element.y); + this.click(...getElementPointForSelection(element)); }); }); + this.reset(); } clickOn(element: ExcalidrawElement) { this.reset(); - this.click(element.x, element.y); + this.click(...getElementPointForSelection(element)); this.reset(); } doubleClickOn(element: ExcalidrawElement) { this.reset(); - this.doubleClick(element.x, element.y); + this.doubleClick(...getElementPointForSelection(element)); this.reset(); } } const mouse = new Pointer("mouse"); +const transform = ( + element: ExcalidrawElement | ExcalidrawElement[], + handle: TransformHandleType, + mouseMove: [deltaX: number, deltaY: number], + keyboardModifiers: KeyboardModifiers = {}, +) => { + const elements = Array.isArray(element) ? element : [element]; + mouse.select(elements); + let handleCoords: TransformHandle | undefined; + + if (elements.length === 1) { + handleCoords = getTransformHandles(elements[0], h.state.zoom, "mouse")[ + handle + ]; + } else { + const [x1, y1, x2, y2] = getCommonBounds(elements); + const isFrameSelected = elements.some(isFrameElement); + const transformHandles = getTransformHandlesFromCoords( + [x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2], + 0, + h.state.zoom, + "mouse", + isFrameSelected ? OMIT_SIDES_FOR_FRAME : OMIT_SIDES_FOR_MULTIPLE_ELEMENTS, + ); + handleCoords = transformHandles[handle]; + } + + if (!handleCoords) { + throw new Error(`There is no "${handle}" handle for this selection`); + } + + const clientX = handleCoords[0] + handleCoords[2] / 2; + const clientY = handleCoords[1] + handleCoords[3] / 2; + + Keyboard.withModifierKeys(keyboardModifiers, () => { + mouse.reset(); + mouse.down(clientX, clientY); + mouse.move(mouseMove[0], mouseMove[1]); + mouse.up(); + }); +}; + +const proxy = ( + element: T, +): typeof element & { + /** Returns the actual, current element from the elements array, instead of + the proxy */ + get(): typeof element; +} => { + return new Proxy( + {}, + { + get(target, prop) { + const currentElement = h.elements.find( + ({ id }) => id === element.id, + ) as any; + if (prop === "get") { + if (currentElement.hasOwnProperty("get")) { + throw new Error( + "trying to get `get` test property, but ExcalidrawElement seems to define its own", + ); + } + return () => currentElement; + } + return currentElement[prop]; + }, + }, + ) as any; +}; + +/** Tools that can be used to draw shapes */ +type DrawingToolName = Exclude; + +type Element = T extends "line" | "freedraw" + ? ExcalidrawLinearElement + : T extends "arrow" + ? ExcalidrawArrowElement + : T extends "text" + ? ExcalidrawTextElement + : T extends "rectangle" + ? ExcalidrawRectangleElement + : T extends "ellipse" + ? ExcalidrawEllipseElement + : T extends "diamond" + ? ExcalidrawDiamondElement + : ExcalidrawElement; + export class UI { static clickTool = (toolName: ToolName) => { fireEvent.click(GlobalTestState.renderResult.getByToolName(toolName)); @@ -246,6 +383,10 @@ export class UI { fireEvent.click(element); }; + static clickByTitle = (title: string) => { + fireEvent.click(screen.getByTitle(title)); + }; + /** * Creates an Excalidraw element, and returns a proxy that wraps it so that * accessing props will return the latest ones from the object existing in @@ -255,16 +396,17 @@ export class UI { * If you need to get the actual element, not the proxy, call `get()` method * on the proxy object. */ - static createElement( + static createElement( type: T, { position = 0, x = position, y = position, size = 10, - width = size, - height = width, + width: initialWidth = size, + height: initialHeight = initialWidth, angle = 0, + points: initialPoints, }: { position?: number; x?: number; @@ -273,25 +415,46 @@ export class UI { width?: number; height?: number; angle?: number; + points?: T extends "line" | "arrow" | "freedraw" ? Point[] : never; } = {}, - ): (T extends "arrow" | "line" | "freedraw" - ? ExcalidrawLinearElement - : T extends "text" - ? ExcalidrawTextElement - : ExcalidrawElement) & { + ): Element & { /** Returns the actual, current element from the elements array, instead of the proxy */ - get(): T extends "arrow" | "line" | "freedraw" - ? ExcalidrawLinearElement - : T extends "text" - ? ExcalidrawTextElement - : ExcalidrawElement; + get(): Element; } { + const width = initialWidth ?? initialHeight ?? size; + const height = initialHeight ?? size; + const points: Point[] = initialPoints ?? [ + [0, 0], + [width, height], + ]; + UI.clickTool(type); - mouse.reset(); - mouse.down(x, y); - mouse.reset(); - mouse.up(x + (width ?? height ?? size), y + (height ?? size)); + + if (type === "text") { + mouse.reset(); + mouse.click(x, y); + } else if ((type === "line" || type === "arrow") && points.length > 2) { + points.forEach((point) => { + mouse.reset(); + mouse.click(x + point[0], y + point[1]); + }); + Keyboard.keyPress(KEYS.ESCAPE); + } else if (type === "freedraw" && points.length > 2) { + const firstPoint = points[0]; + mouse.reset(); + mouse.down(x + firstPoint[0], y + firstPoint[1]); + points + .slice(1) + .forEach((point) => mouse.moveTo(x + point[0], y + point[1])); + mouse.upAt(); + Keyboard.keyPress(KEYS.ESCAPE); + } else { + mouse.reset(); + mouse.down(x, y); + mouse.reset(); + mouse.up(x + width, y + height); + } const origElement = h.elements[h.elements.length - 1] as any; @@ -299,25 +462,54 @@ export class UI { mutateElement(origElement, { angle }); } - return new Proxy( - {}, - { - get(target, prop) { - const currentElement = h.elements.find( - (element) => element.id === origElement.id, - ) as any; - if (prop === "get") { - if (currentElement.hasOwnProperty("get")) { - throw new Error( - "trying to get `get` test property, but ExcalidrawElement seems to define its own", - ); - } - return () => currentElement; - } - return currentElement[prop]; - }, - }, - ) as any; + return proxy(origElement); + } + + static async editText< + T extends ExcalidrawTextElement | ExcalidrawTextContainer, + >(element: T, text: string) { + const openedEditor = document.querySelector( + ".excalidraw-textEditorContainer > textarea", + ); + + if (!openedEditor) { + mouse.select(element); + Keyboard.keyPress(KEYS.ENTER); + } + + const editor = await getTextEditor(); + if (!editor) { + throw new Error("Can't find wysiwyg text editor in the dom"); + } + + fireEvent.input(editor, { target: { value: text } }); + await new Promise((resolve) => setTimeout(resolve, 0)); + editor.blur(); + + return isTextElement(element) + ? element + : proxy( + h.elements[ + h.elements.length - 1 + ] as ExcalidrawTextElementWithContainer, + ); + } + + static resize( + element: ExcalidrawElement | ExcalidrawElement[], + handle: TransformHandleDirection, + mouseMove: [deltaX: number, deltaY: number], + keyboardModifiers: KeyboardModifiers = {}, + ) { + return transform(element, handle, mouseMove, keyboardModifiers); + } + + static rotate( + element: ExcalidrawElement | ExcalidrawElement[], + mouseMove: [deltaX: number, deltaY: number], + keyboardModifiers: KeyboardModifiers = {}, + ) { + return transform(element, "rotation", mouseMove, keyboardModifiers); } static group(elements: ExcalidrawElement[]) { diff --git a/src/tests/linearElementEditor.test.tsx b/src/tests/linearElementEditor.test.tsx index a31f6f046..9b11bfbdd 100644 --- a/src/tests/linearElementEditor.test.tsx +++ b/src/tests/linearElementEditor.test.tsx @@ -16,7 +16,6 @@ import { Point } from "../types"; import { KEYS } from "../keys"; import { LinearElementEditor } from "../element/linearElementEditor"; import { queryByTestId, queryByText } from "@testing-library/react"; -import { resize, rotate } from "./utils"; import { getBoundTextElementPosition, wrapText, @@ -939,71 +938,10 @@ describe("Test Linear Elements", () => { expect(line.boundElements).toBeNull(); }); - it("should not rotate the bound text and update position of bound text and bounding box correctly when arrow rotated", () => { - createThreePointerLinearElement("arrow", { - type: ROUNDNESS.PROPORTIONAL_RADIUS, - }); - - const arrow = h.elements[0] as ExcalidrawLinearElement; - - const { textElement, container } = createBoundTextElement( - DEFAULT_TEXT, - arrow, - ); - - expect(container.angle).toBe(0); - expect(textElement.angle).toBe(0); - expect(getBoundTextElementPosition(arrow, textElement)) - .toMatchInlineSnapshot(` - { - "x": 75, - "y": 60, - } - `); - expect(textElement.text).toMatchInlineSnapshot(` - "Online whiteboard - collaboration made - easy" - `); - expect(LinearElementEditor.getElementAbsoluteCoords(container, true)) - .toMatchInlineSnapshot(` - [ - 20, - 20, - 105, - 80, - 55.45893770831013, - 45, - ] - `); - - rotate(container, -35, 55); - expect(container.angle).toMatchInlineSnapshot(`1.3988061968364685`); - expect(textElement.angle).toBe(0); - expect(getBoundTextElementPosition(container, textElement)) - .toMatchInlineSnapshot(` - { - "x": 21.73926141863671, - "y": 73.31003398390868, - } - `); - expect(textElement.text).toMatchInlineSnapshot(` - "Online whiteboard - collaboration made - easy" - `); - expect(LinearElementEditor.getElementAbsoluteCoords(container, true)) - .toMatchInlineSnapshot(` - [ - 20, - 20, - 102.41961302274555, - 86.49012635273976, - 55.45893770831013, - 45, - ] - `); - }); + // TODO fix #7029 and rewrite this test + it.todo( + "should not rotate the bound text and update position of bound text and bounding box correctly when arrow rotated", + ); it("should resize and position the bound text and bounding box correctly when 3 pointer arrow element resized", () => { createThreePointerLinearElement("arrow", { @@ -1042,7 +980,7 @@ describe("Test Linear Elements", () => { ] `); - resize(container, "ne", [300, 200]); + UI.resize(container, "ne", [300, 200]); expect({ width: container.width, height: container.height }) .toMatchInlineSnapshot(` @@ -1264,5 +1202,29 @@ describe("Test Linear Elements", () => { }), ); }); + + it("should not update label position when arrow dragged", () => { + createTwoPointerLinearElement("arrow"); + let arrow = h.elements[0] as ExcalidrawLinearElement; + createBoundTextElement(DEFAULT_TEXT, arrow); + let label = h.elements[1] as ExcalidrawTextElementWithContainer; + expect(arrow.x).toBe(20); + expect(arrow.y).toBe(20); + expect(label.x).toBe(0); + expect(label.y).toBe(0); + mouse.reset(); + mouse.select(arrow); + mouse.select(label); + mouse.downAt(arrow.x, arrow.y); + mouse.moveTo(arrow.x + 20, arrow.y + 30); + mouse.up(arrow.x + 20, arrow.y + 30); + + arrow = h.elements[0] as ExcalidrawLinearElement; + label = h.elements[1] as ExcalidrawTextElementWithContainer; + expect(arrow.x).toBe(80); + expect(arrow.y).toBe(100); + expect(label.x).toBe(0); + expect(label.y).toBe(0); + }); }); }); diff --git a/src/tests/packages/__snapshots__/excalidraw.test.tsx.snap b/src/tests/packages/__snapshots__/excalidraw.test.tsx.snap index a9f6d37a6..39aed3745 100644 --- a/src/tests/packages/__snapshots__/excalidraw.test.tsx.snap +++ b/src/tests/packages/__snapshots__/excalidraw.test.tsx.snap @@ -535,6 +535,7 @@ exports[` > Test UIOptions prop > Test canvasActions > should rende >